PCIe services: Difference between revisions

No edit summary
No edit summary
 
(24 intermediate revisions by 3 users not shown)
Line 1: Line 1:
= pcie =
= pcie =
This is "nn::pcie::detail::IManager".
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || [[#RegisterClassDriver|RegisterClassDriver]]
|-
| 1 || [[#QueryFunctions|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".
{| 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.
= pcie:log =
This is "nn::pcie::detail::ILoggedStateManager".
This was added with [6.0.0+].
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [[#GetISession]]
| 0 || GetLoggedState
|-
|-
| 1 || [[#ListEndpoints]]
| 1 || GetLoggedStateEvent
|}
|}


== Initialize ==
= ClassDriverConfig =
Takes the current process handle (0xFFFF8001).
This is "nn::pcie::ClassDriverConfig".


Returns an event handle and session handle to a [[#ISession]].
This is a 0x18-byte struct.


== ListEndpoints ==
{| class="wikitable" border="1"
Takes a type-6 buffer.
|-
! 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
|
|}


Returns a list of connected PCIe endpoint devices.
= ClassCode =
This is a 0x4-byte struct.


== ISession ==
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Cmd || Name || Notes
! Offset
! Size
! Description
|-
|-
| 0 || || Takes a type-6 buffer. Returns all zeroes.
| 0x00
| 0x01
| ProgrammingInterface
|-
|-
| 1 || || Always returns 0x1278?
| 0x01
| 0x01
| SubClass
|-
|-
| 2 || || Always returns 0x1278?
| 0x02
| 0x01
| BaseClass
|-
|-
| 3 || || Takes a type-6 buffer. Always returns 0x1278?
| 0x03
| 0x01
| Reserved
|}
 
= FunctionState =
This is "nn::pcie::FunctionState".
 
This is a 0x28-byte struct.
 
{| class="wikitable" border="1"
|-
|-
| 4 || ||
! Offset
! Size
! Description
|-
|-
| 5 || ||
| 0x00
| 0x04
| Handle
|-
|-
| 6 || ||
| 0x04
| 0x04
| BusNum
|-
|-
| 7 || ||
| 0x08
| 0x01
| DevNum
|-
|-
| 8 || ||
| 0x09
| 0x01
| FuncNum
|-
|-
| 9 || ||
| 0x0A
| 0x02
| Vid
|-
|-
| 10 || ||
| 0x0C
| 0x02
| DevId
|-
|-
| 11 || ||
| 0x0E
| 0x01
| HeaderType
|-
|-
| 12 || ||
| 0x0F
| 0x01
| Reserved
|-
|-
| 13 || ||
| 0x10
| 0x04
| [[#ClassCode|ClassCode]]
|-
|-
| 14 || ||
| 0x14
| 0x01
| RevisionId
|-
|-
| 15 || ||
| 0x15
| 0x03
| Reserved
|-
|-
| 16 || ||
| 0x18
| 0x04
|  
|-
|-
| 17 || ||
| 0x1C
| 0x04
|  
|-
|-
| 18 || ||
| 0x20
| 0x04
|  
|-
|-
| 19 || ||
| 0x24
| 0x01
| HasAssignedClient
|-
|-
| 20 || ||
| 0x25
| 0x03
| Reserved
|}
|}
= BarProfile =
This is "nn::pcie::BarProfile".
This is a 0x18-byte struct.
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x00
| 0x08
| BaseAddress
|-
| 0x08
| 0x08
| Size
|-
| 0x10
| 0x04
| Flags
|-
| 0x14
| 0x04
| Reserved
|}
[14.0.0+] This is a 0x20-byte struct.
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x00
| 0x08
| BaseAddress
|-
| 0x08
| 0x08
|
|-
| 0x10
| 0x08
| Size
|-
| 0x18
| 0x04
| Flags
|-
| 0x1C
| 0x04
| Reserved
|}
= BusAccessWidth =
This is "nn::pcie::BusAccessWidth".
{| class="wikitable" border="1"
|-
! 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 [[SVC#MemoryPermission|MemoryPermission]] passed to [[SVC#MapDeviceAddressSpaceByForce|MapDeviceAddressSpaceByForce]].
{| class="wikitable" border="1"
|-
! Value
! Description
|-
| 0 || ReadWrite
|-
| 1 || Write
|-
| 2 || Read
|}
= IrqType =
This is "nn::pcie::IrqType".
[[Category:Services]]