Difference between revisions of "PCIe services"

From Nintendo Switch Brew
Jump to navigation Jump to search
 
(20 intermediate revisions by 2 users not shown)
Line 6: Line 6:
 
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 0 || [[#RegisterClassDriver]]
+
| 0 || [[#RegisterClassDriver|RegisterClassDriver]]
 
|-
 
|-
| 1 || [[#QueryFunctionsUnregistered]]
+
| 1 || [[#QueryFunctions|QueryFunctions]]
 
|}
 
|}
  
 
== RegisterClassDriver ==
 
== RegisterClassDriver ==
Takes the current process handle (0xFFFF8001).
+
Takes an input Process handle and an input [[#ClassDriverConfig]]. Returns an output Event handle and an [[#ISession]].
  
Returns an event handle and session handle to a [[#ISession]].
+
== QueryFunctions ==
 +
Takes a type-0x6 output buffer containing an array of [[#FunctionState]]. Returns an output s32 '''FunctionStateCount'''.
  
== QueryFunctionsUnregistered ==
+
== ISession ==
Takes a type-6 buffer.
+
This is "nn::pcie::detail::ISession".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| 0 || [[#QueryFunctions_2|QueryFunctions]]
 +
|-
 +
| 1 || [[#AcquireFunction|AcquireFunction]]
 +
|-
 +
| 2 || [[#ReleaseFunction|ReleaseFunction]]
 +
|-
 +
| 3 || [[#GetFunctionState|GetFunctionState]]
 +
|-
 +
| 4 || [[#GetBarProfile|GetBarProfile]]
 +
|-
 +
| 5 || [[#ReadConfig|ReadConfig]]
 +
|-
 +
| 6 || [[#WriteConfig|WriteConfig]]
 +
|-
 +
| 7 || [[#ReadBarRegion|ReadBarRegion]]
 +
|-
 +
| 8 || [[#WriteBarRegion|WriteBarRegion]]
 +
|-
 +
| 9 || [[#FindCapability|FindCapability]]
 +
|-
 +
| 10 || [[#FindExtendedCapability|FindExtendedCapability]]
 +
|-
 +
| 11 || [[#MapDma|MapDma]]
 +
|-
 +
| 12 || [[#UnmapDmaByProcVa|UnmapDmaByProcVa]]
 +
|-
 +
| 13 || [[#UnmapDmaByBusAddress|UnmapDmaByBusAddress]]
 +
|-
 +
| 14 || [[#GetDmaBusAddress|GetDmaBusAddress]]
 +
|-
 +
| 15 || [[#GetDmaBusAddressRange|GetDmaBusAddressRange]]
 +
|-
 +
| 16 || [[#SetDmaEnable|SetDmaEnable]]
 +
|-
 +
| 17 || [[#AcquireIrq|AcquireIrq]]
 +
|-
 +
| 18 || [[#ReleaseIrq|ReleaseIrq]]
 +
|-
 +
| 19 || [[#SetIrqEnable|SetIrqEnable]]
 +
|-
 +
| 20 || [7.0.0+] [[#GetIrqEvent|GetIrqEvent]] ([1.0.0-6.2.0] SetAspmEnable)
 +
|-
 +
| 21 || [7.0.0+] [[#SetAspmEnable|SetAspmEnable]] ([3.0.0-6.2.0] SetResetUponResumeEnable)
 +
|-
 +
| 22 || [7.0.0+] [[#SetResetUponResumeEnable]] ([4.0.0-6.2.0] ResetFunction)
 +
|-
 +
| 23 || [7.0.0+] [[#ResetFunction]]
 +
|}
 +
 
 +
=== QueryFunctions ===
 +
Takes a type-0x6 output buffer containing an array of [[#FunctionState]]. Returns an output s32 '''FunctionStateCount'''.
 +
 
 +
=== AcquireFunction ===
 +
Takes an input u32 '''FunctionHandle'''. Returns an output readable Event handle.
 +
 
 +
=== ReleaseFunction ===
 +
Takes an input u32 '''FunctionHandle'''. No output.
 +
 
 +
=== GetFunctionState ===
 +
Takes an input u32 '''FunctionHandle''' and a type-0x6 output buffer containing a [[#FunctionState]]. No output.
 +
 
 +
=== GetBarProfile ===
 +
Takes two input u32s '''FunctionHandle''' and '''Bar'''. Returns an output [[#BarProfile]].
 +
 
 +
=== ReadConfig ===
 +
Takes two input u32s '''FunctionHandle''', '''Offset''' and an input [[#BusAccessWidth]]. Returns an output u32 '''Config'''.
 +
 
 +
=== WriteConfig ===
 +
Takes three input u32s '''FunctionHandle''', '''Offset''', '''Config''' and an input [[#BusAccessWidth]]. No output.
 +
 
 +
=== ReadBarRegion ===
 +
Takes three input u32s '''FunctionHandle''', '''Bar''', '''Offset''', an input [[#BusAccessWidth]] and a type-0x6 output buffer. No output.
 +
 
 +
[5.0.0+] Now takes a type-0x22 output buffer instead.
 +
 
 +
=== WriteBarRegion ===
 +
Takes three input u32s '''FunctionHandle''', '''Bar''', '''Offset''', an input [[#BusAccessWidth]] and a type-0x5 input buffer. No output.
 +
 
 +
[5.0.0+] Now takes a type-0x21 input buffer instead.
 +
 
 +
=== FindCapability ===
 +
Takes an input u32s '''FunctionHandle''' and an input [[#CapabilityId]]. Returns an output u32 '''Capability'''.
 +
 
 +
=== FindExtendedCapability ===
 +
Takes an input u32s '''FunctionHandle''' and an input [[#ExtendedCapabilityId]]. Returns an output u32 '''ExtendedCapability'''.
 +
 
 +
=== MapDma ===
 +
Takes an input u32 '''FunctionHandle''', an input [[#DmaDirection]], an input u64 '''VirtualAddress''' and an input u32 '''Size'''. Returns an output u64 '''PhysicalAddress'''.
 +
 
 +
=== UnmapDmaByProcVa ===
 +
Takes an input u32 '''FunctionHandle''' and an input u64 '''PhysicalAddress'''. No output.
 +
 
 +
=== UnmapDmaByBusAddress ===
 +
Takes an input u32 '''FunctionHandle''' and an input u64 '''BusAddress'''. No output.
 +
 
 +
=== GetDmaBusAddress ===
 +
Takes an input u32 '''FunctionHandle''', an input u64 '''VirtualAddress''' and an input u32 '''Size'''. Returns an output u64 '''BusAddress'''.
 +
 
 +
=== GetDmaBusAddressRange ===
 +
Takes an input u32 '''FunctionHandle'''. Returns two output u64s '''BusAddressRangeStart''' and '''BusAddressRangeEnd'''.
 +
 
 +
=== SetDmaEnable ===
 +
Takes an input u32 '''FunctionHandle''' and an input bool '''Enable'''. No output.
 +
 
 +
=== AcquireIrq ===
 +
Takes an input u32s '''FunctionHandle''', an input [[#IrqType]] and an input s32 '''IrqCount'''. No output.
 +
 
 +
=== ReleaseIrq ===
 +
Takes an input u32 '''FunctionHandle'''. No output.
 +
 
 +
=== SetIrqEnable ===
 +
Takes an input u32s '''FunctionHandle''', an unknown input u32 and an input bool '''Enable'''. No output.
 +
 
 +
=== GetIrqEvent ===
 +
Takes an input u32s '''FunctionHandle''' and an input [[#IrqType]]. Returns an output Event handle.
 +
 
 +
=== SetAspmEnable ===
 +
Takes an input u32 '''FunctionHandle''' and an input bool '''Enable'''. No output.
 +
 
 +
=== SetResetUponResumeEnable ===
 +
Takes an input u32 '''FunctionHandle''' and an input bool '''Enable'''. No output.
 +
 
 +
=== ResetFunction ===
 +
Takes an input u32 '''FunctionHandle''' and an unknown input u32. No output.
  
Returns a list of connected PCIe endpoint devices.
+
= pcie:log =
 +
This is "nn::pcie::detail::ILoggedStateManager".
  
== ISession ==
+
This was added with [6.0.0+].
This is "nn::pcie::detail::ISession".
 
  
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 28: Line 158:
 
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 0 || QueryFunctions
+
| 0 || GetLoggedState
 +
|-
 +
| 1 || GetLoggedStateEvent
 +
|}
 +
 
 +
= ClassDriverConfig =
 +
This is "nn::pcie::ClassDriverConfig".
 +
 
 +
This is a 0x18-byte struct.
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x00
 +
| 0x04
 +
|
 +
|-
 +
| 0x04
 +
| 0x01
 +
|
 +
|-
 +
| 0x05
 +
| 0x03
 +
| Reserved
 +
|-
 +
| 0x08
 +
| 0x04
 +
| [[#ClassCode|ClassCode]]
 +
|-
 +
| 0x0C
 +
| 0x01
 +
| Function
 +
|-
 +
| 0x0D
 +
| 0x01
 +
| Reserved
 +
|-
 +
| 0x0E
 +
| 0x02
 +
| Vid
 +
|-
 +
| 0x10
 +
| 0x02
 +
| DevId
 +
|-
 +
| 0x12
 +
| 0x01
 +
|
 +
|-
 +
| 0x13
 +
| 0x01
 +
| Reserved
 +
|-
 +
| 0x14
 +
| 0x04
 +
|
 +
|}
 +
 
 +
= ClassCode =
 +
This is a 0x4-byte struct.
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x00
 +
| 0x01
 +
| ProgrammingInterface
 +
|-
 +
| 0x01
 +
| 0x01
 +
| SubClass
 +
|-
 +
| 0x02
 +
| 0x01
 +
| BaseClass
 +
|-
 +
| 0x03
 +
| 0x01
 +
| Reserved
 +
|}
 +
 
 +
= FunctionState =
 +
This is "nn::pcie::FunctionState".
 +
 
 +
This is a 0x28-byte struct.
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x00
 +
| 0x04
 +
| Handle
 +
|-
 +
| 0x04
 +
| 0x04
 +
| BusNum
 +
|-
 +
| 0x08
 +
| 0x01
 +
| DevNum
 +
|-
 +
| 0x09
 +
| 0x01
 +
| FuncNum
 +
|-
 +
| 0x0A
 +
| 0x02
 +
| Vid
 +
|-
 +
| 0x0C
 +
| 0x02
 +
| DevId
 +
|-
 +
| 0x0E
 +
| 0x01
 +
| HeaderType
 +
|-
 +
| 0x0F
 +
| 0x01
 +
| Reserved
 +
|-
 +
| 0x10
 +
| 0x04
 +
| [[#ClassCode|ClassCode]]
 +
|-
 +
| 0x14
 +
| 0x01
 +
| RevisionId
 +
|-
 +
| 0x15
 +
| 0x03
 +
| Reserved
 +
|-
 +
| 0x18
 +
| 0x04
 +
|
 +
|-
 +
| 0x1C
 +
| 0x04
 +
|
 +
|-
 +
| 0x20
 +
| 0x04
 +
|
 +
|-
 +
| 0x24
 +
| 0x01
 +
| HasAssignedClient
 
|-
 
|-
| 1 || AcquireFunction
+
| 0x25
 +
| 0x03
 +
| Reserved
 +
|}
 +
 
 +
= BarProfile =
 +
This is "nn::pcie::BarProfile".
 +
 
 +
This is a 0x18-byte struct.
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 2 || ReleaseFunction
+
! Offset
 +
! Size
 +
! Description
 
|-
 
|-
| 3 || GetFunctionState
+
| 0x00
 +
| 0x08
 +
| BaseAddress
 
|-
 
|-
| 4 || GetBarProfile
+
| 0x08
 +
| 0x08
 +
| Size
 
|-
 
|-
| 5 || ReadConfig
+
| 0x10
 +
| 0x04
 +
| Flags
 
|-
 
|-
| 6 || WriteConfig
+
| 0x14
 +
| 0x04
 +
| Reserved
 +
|}
 +
 
 +
[14.0.0+] This is a 0x20-byte struct.
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 7 || ReadBarRegion
+
! Offset
 +
! Size
 +
! Description
 
|-
 
|-
| 8 || WriteBarRegion
+
| 0x00
 +
| 0x08
 +
| BaseAddress
 
|-
 
|-
| 9 || FindCapability
+
| 0x08
 +
| 0x08
 +
|  
 
|-
 
|-
| 10 || FindExtendedCapability
+
| 0x10
 +
| 0x08
 +
| Size
 
|-
 
|-
| 11 || MapDma
+
| 0x18
 +
| 0x04
 +
| Flags
 
|-
 
|-
| 12 || UnmapDma
+
| 0x1C
 +
| 0x04
 +
| Reserved
 +
|}
 +
 
 +
= BusAccessWidth =
 +
This is "nn::pcie::BusAccessWidth".
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 13 || UnmapDmaBusAddress
+
! Value
 +
! Description
 
|-
 
|-
| 14 || GetDmaBusAddress
+
| 0 || 8bits
 
|-
 
|-
| 15 || GetDmaBusAddressRange
+
| 1 || 16bits
 
|-
 
|-
| 16 || SetDmaEnable
+
| 2 || 32bits
 +
|}
 +
 
 +
= CapabilityId =
 +
This is "nn::pcie::CapabilityId".
 +
 
 +
= ExtendedCapabilityId =
 +
This is "nn::pcie::ExtendedCapabilityId".
 +
 
 +
= DmaDirection =
 +
This is "nn::pcie::DmaDirection".
 +
 
 +
This controls the [[SVC#MemoryPermission|MemoryPermission]] passed to [[SVC#MapDeviceAddressSpaceByForce|MapDeviceAddressSpaceByForce]].
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 17 || AcquireIrq
+
! Value
 +
! Description
 
|-
 
|-
| 18 || ReleaseIrq
+
| 0 || ReadWrite
 
|-
 
|-
| 19 || SetIrqEnable
+
| 1 || Write
 
|-
 
|-
| 20 || SetAspmEnable
+
| 2 || Read
 
|}
 
|}
 +
 +
= IrqType =
 +
This is "nn::pcie::IrqType".
  
 
[[Category:Services]]
 
[[Category:Services]]

Latest revision as of 18:51, 5 August 2023

pcie

This is "nn::pcie::detail::IManager".

Cmd Name
0 RegisterClassDriver
1 QueryFunctions

RegisterClassDriver

Takes an input Process handle and an input #ClassDriverConfig. Returns an output Event handle and an #ISession.

QueryFunctions

Takes a type-0x6 output buffer containing an array of #FunctionState. Returns an output s32 FunctionStateCount.

ISession

This is "nn::pcie::detail::ISession".

Cmd Name
0 QueryFunctions
1 AcquireFunction
2 ReleaseFunction
3 GetFunctionState
4 GetBarProfile
5 ReadConfig
6 WriteConfig
7 ReadBarRegion
8 WriteBarRegion
9 FindCapability
10 FindExtendedCapability
11 MapDma
12 UnmapDmaByProcVa
13 UnmapDmaByBusAddress
14 GetDmaBusAddress
15 GetDmaBusAddressRange
16 SetDmaEnable
17 AcquireIrq
18 ReleaseIrq
19 SetIrqEnable
20 [7.0.0+] GetIrqEvent ([1.0.0-6.2.0] SetAspmEnable)
21 [7.0.0+] SetAspmEnable ([3.0.0-6.2.0] SetResetUponResumeEnable)
22 [7.0.0+] #SetResetUponResumeEnable ([4.0.0-6.2.0] ResetFunction)
23 [7.0.0+] #ResetFunction

QueryFunctions

Takes a type-0x6 output buffer containing an array of #FunctionState. Returns an output s32 FunctionStateCount.

AcquireFunction

Takes an input u32 FunctionHandle. Returns an output readable Event handle.

ReleaseFunction

Takes an input u32 FunctionHandle. No output.

GetFunctionState

Takes an input u32 FunctionHandle and a type-0x6 output buffer containing a #FunctionState. No output.

GetBarProfile

Takes two input u32s FunctionHandle and Bar. Returns an output #BarProfile.

ReadConfig

Takes two input u32s FunctionHandle, Offset and an input #BusAccessWidth. Returns an output u32 Config.

WriteConfig

Takes three input u32s FunctionHandle, Offset, Config and an input #BusAccessWidth. No output.

ReadBarRegion

Takes three input u32s FunctionHandle, Bar, Offset, an input #BusAccessWidth and a type-0x6 output buffer. No output.

[5.0.0+] Now takes a type-0x22 output buffer instead.

WriteBarRegion

Takes three input u32s FunctionHandle, Bar, Offset, an input #BusAccessWidth and a type-0x5 input buffer. No output.

[5.0.0+] Now takes a type-0x21 input buffer instead.

FindCapability

Takes an input u32s FunctionHandle and an input #CapabilityId. Returns an output u32 Capability.

FindExtendedCapability

Takes an input u32s FunctionHandle and an input #ExtendedCapabilityId. Returns an output u32 ExtendedCapability.

MapDma

Takes an input u32 FunctionHandle, an input #DmaDirection, an input u64 VirtualAddress and an input u32 Size. Returns an output u64 PhysicalAddress.

UnmapDmaByProcVa

Takes an input u32 FunctionHandle and an input u64 PhysicalAddress. No output.

UnmapDmaByBusAddress

Takes an input u32 FunctionHandle and an input u64 BusAddress. No output.

GetDmaBusAddress

Takes an input u32 FunctionHandle, an input u64 VirtualAddress and an input u32 Size. Returns an output u64 BusAddress.

GetDmaBusAddressRange

Takes an input u32 FunctionHandle. Returns two output u64s BusAddressRangeStart and BusAddressRangeEnd.

SetDmaEnable

Takes an input u32 FunctionHandle and an input bool Enable. No output.

AcquireIrq

Takes an input u32s FunctionHandle, an input #IrqType and an input s32 IrqCount. No output.

ReleaseIrq

Takes an input u32 FunctionHandle. No output.

SetIrqEnable

Takes an input u32s FunctionHandle, an unknown input u32 and an input bool Enable. No output.

GetIrqEvent

Takes an input u32s FunctionHandle and an input #IrqType. Returns an output Event handle.

SetAspmEnable

Takes an input u32 FunctionHandle and an input bool Enable. No output.

SetResetUponResumeEnable

Takes an input u32 FunctionHandle and an input bool Enable. No output.

ResetFunction

Takes an input u32 FunctionHandle and an unknown input u32. No output.

pcie:log

This is "nn::pcie::detail::ILoggedStateManager".

This was added with [6.0.0+].

Cmd Name
0 GetLoggedState
1 GetLoggedStateEvent

ClassDriverConfig

This is "nn::pcie::ClassDriverConfig".

This is a 0x18-byte struct.

Offset Size Description
0x00 0x04
0x04 0x01
0x05 0x03 Reserved
0x08 0x04 ClassCode
0x0C 0x01 Function
0x0D 0x01 Reserved
0x0E 0x02 Vid
0x10 0x02 DevId
0x12 0x01
0x13 0x01 Reserved
0x14 0x04

ClassCode

This is a 0x4-byte struct.

Offset Size Description
0x00 0x01 ProgrammingInterface
0x01 0x01 SubClass
0x02 0x01 BaseClass
0x03 0x01 Reserved

FunctionState

This is "nn::pcie::FunctionState".

This is a 0x28-byte struct.

Offset Size Description
0x00 0x04 Handle
0x04 0x04 BusNum
0x08 0x01 DevNum
0x09 0x01 FuncNum
0x0A 0x02 Vid
0x0C 0x02 DevId
0x0E 0x01 HeaderType
0x0F 0x01 Reserved
0x10 0x04 ClassCode
0x14 0x01 RevisionId
0x15 0x03 Reserved
0x18 0x04
0x1C 0x04
0x20 0x04
0x24 0x01 HasAssignedClient
0x25 0x03 Reserved

BarProfile

This is "nn::pcie::BarProfile".

This is a 0x18-byte struct.

Offset Size Description
0x00 0x08 BaseAddress
0x08 0x08 Size
0x10 0x04 Flags
0x14 0x04 Reserved

[14.0.0+] This is a 0x20-byte struct.

Offset Size Description
0x00 0x08 BaseAddress
0x08 0x08
0x10 0x08 Size
0x18 0x04 Flags
0x1C 0x04 Reserved

BusAccessWidth

This is "nn::pcie::BusAccessWidth".

Value Description
0 8bits
1 16bits
2 32bits

CapabilityId

This is "nn::pcie::CapabilityId".

ExtendedCapabilityId

This is "nn::pcie::ExtendedCapabilityId".

DmaDirection

This is "nn::pcie::DmaDirection".

This controls the MemoryPermission passed to MapDeviceAddressSpaceByForce.

Value Description
0 ReadWrite
1 Write
2 Read

IrqType

This is "nn::pcie::IrqType".