Difference between revisions of "GSP Services"
m (Add gsp::Gpu and gsp::Lcd anchors) |
|||
(36 intermediate revisions by 8 users not shown) | |||
Line 1: | Line 1: | ||
− | + | __TOC__ | |
+ | {{Anchor|GSPGPU}}{{Anchor|gsp::Gpu}} | ||
= GSP service "gsp::Gpu" = | = GSP service "gsp::Gpu" = | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! Command Header | ! Command Header | ||
+ | ! Available since system version | ||
+ | ! GSP rights required | ||
! Description | ! Description | ||
|- | |- | ||
| 0x00010082 | | 0x00010082 | ||
+ | | | ||
+ | | Yes | ||
| [[GSPGPU:WriteHWRegs|WriteHWRegs]] | | [[GSPGPU:WriteHWRegs|WriteHWRegs]] | ||
|- | |- | ||
| 0x00020084 | | 0x00020084 | ||
+ | | | ||
+ | | Yes | ||
| [[GSPGPU:WriteHWRegsWithMask|WriteHWRegsWithMask]] | | [[GSPGPU:WriteHWRegsWithMask|WriteHWRegsWithMask]] | ||
|- | |- | ||
| 0x00030082 | | 0x00030082 | ||
+ | | | ||
+ | | Yes | ||
| [[GSPGPU:WriteHWRegRepeat|WriteHWRegRepeat]] | | [[GSPGPU:WriteHWRegRepeat|WriteHWRegRepeat]] | ||
|- | |- | ||
| 0x00040080 | | 0x00040080 | ||
+ | | | ||
+ | | Yes | ||
| [[GSPGPU:ReadHWRegs|ReadHWRegs]] | | [[GSPGPU:ReadHWRegs|ReadHWRegs]] | ||
|- | |- | ||
| 0x00050200 | | 0x00050200 | ||
+ | | | ||
+ | | Yes | ||
| [[GSPGPU:SetBufferSwap|SetBufferSwap]] | | [[GSPGPU:SetBufferSwap|SetBufferSwap]] | ||
|- | |- | ||
| 0x00060082 | | 0x00060082 | ||
+ | | | ||
+ | | No | ||
| SetCommandList (Stubbed) | | SetCommandList (Stubbed) | ||
|- | |- | ||
| 0x000700C2 | | 0x000700C2 | ||
+ | | | ||
+ | | No | ||
| RequestDma (Stubbed) | | RequestDma (Stubbed) | ||
|- | |- | ||
| 0x00080082 | | 0x00080082 | ||
+ | | | ||
+ | | No | ||
| [[GSPGPU:FlushDataCache|FlushDataCache]] | | [[GSPGPU:FlushDataCache|FlushDataCache]] | ||
|- | |- | ||
| 0x00090082 | | 0x00090082 | ||
+ | | | ||
+ | | No | ||
| [[GSPGPU:InvalidateDataCache|InvalidateDataCache]] | | [[GSPGPU:InvalidateDataCache|InvalidateDataCache]] | ||
|- | |- | ||
| 0x000A0044 | | 0x000A0044 | ||
− | | RegisterInterruptEvents | + | | |
+ | | No | ||
+ | | RegisterInterruptEvents (Stubbed) | ||
|- | |- | ||
| 0x000B0040 | | 0x000B0040 | ||
+ | | | ||
+ | | See below | ||
| [[GSPGPU:SetLcdForceBlack|SetLcdForceBlack]] | | [[GSPGPU:SetLcdForceBlack|SetLcdForceBlack]] | ||
|- | |- | ||
| 0x000C0000 | | 0x000C0000 | ||
+ | | | ||
+ | | No | ||
| [[GSPGPU:TriggerCmdReqQueue|TriggerCmdReqQueue]] | | [[GSPGPU:TriggerCmdReqQueue|TriggerCmdReqQueue]] | ||
|- | |- | ||
| 0x000D0140 | | 0x000D0140 | ||
+ | | | ||
+ | | No | ||
| SetDisplayTransfer (Stubbed) | | SetDisplayTransfer (Stubbed) | ||
|- | |- | ||
| 0x000E0180 | | 0x000E0180 | ||
+ | | | ||
+ | | No | ||
| SetTextureCopy (Stubbed) | | SetTextureCopy (Stubbed) | ||
|- | |- | ||
| 0x000F0200 | | 0x000F0200 | ||
+ | | | ||
+ | | No | ||
| SetMemoryFill (Stubbed) | | SetMemoryFill (Stubbed) | ||
|- | |- | ||
| 0x00100040 | | 0x00100040 | ||
− | | SetAxiConfigQoSMode | + | | |
+ | | No | ||
+ | | [[GSPGPU:SetAxiConfigQoSMode|SetAxiConfigQoSMode]] | ||
|- | |- | ||
| 0x00110040 | | 0x00110040 | ||
− | | SetPerfLogMode | + | | |
+ | | No | ||
+ | | [[GSPGPU:SetPerfLogMode|SetPerfLogMode]] | ||
|- | |- | ||
| 0x00120000 | | 0x00120000 | ||
− | | GetPerfLog | + | | |
+ | | No | ||
+ | | [[GSPGPU:GetPerfLog|GetPerfLog]] | ||
|- | |- | ||
| 0x00130042 | | 0x00130042 | ||
+ | | | ||
+ | | No | ||
| [[GSPGPU:RegisterInterruptRelayQueue|RegisterInterruptRelayQueue]] | | [[GSPGPU:RegisterInterruptRelayQueue|RegisterInterruptRelayQueue]] | ||
|- | |- | ||
| 0x00140000 | | 0x00140000 | ||
− | | UnregisterInterruptRelayQueue | + | | |
+ | | No | ||
+ | | [[GSPGPU:UnregisterInterruptRelayQueue|UnregisterInterruptRelayQueue]] | ||
|- | |- | ||
| 0x00150002 | | 0x00150002 | ||
− | | TryAcquireRight | + | | |
+ | | No | ||
+ | | [[GSPGPU:TryAcquireRight|TryAcquireRight]] | ||
|- | |- | ||
| 0x00160042 | | 0x00160042 | ||
+ | | | ||
+ | | No | ||
| [[GSPGPU:AcquireRight|AcquireRight]] | | [[GSPGPU:AcquireRight|AcquireRight]] | ||
|- | |- | ||
| 0x00170000 | | 0x00170000 | ||
− | | ReleaseRight | + | | |
+ | | No | ||
+ | | [[GSPGPU:ReleaseRight|ReleaseRight]] | ||
|- | |- | ||
| 0x00180000 | | 0x00180000 | ||
− | | ImportDisplayCaptureInfo | + | | |
+ | | No | ||
+ | | [[GSPGPU:ImportDisplayCaptureInfo|ImportDisplayCaptureInfo]] | ||
|- | |- | ||
| 0x00190000 | | 0x00190000 | ||
− | | SaveVramSysArea | + | | |
+ | | See below | ||
+ | | [[GSPGPU:SaveVramSysArea|SaveVramSysArea]] | ||
|- | |- | ||
| 0x001A0000 | | 0x001A0000 | ||
− | | RestoreVramSysArea | + | | |
+ | | See below | ||
+ | | [[GSPGPU:RestoreVramSysArea|RestoreVramSysArea]] | ||
|- | |- | ||
| 0x001B0000 | | 0x001B0000 | ||
− | | ResetGpuCore | + | | |
+ | | Yes | ||
+ | | [[GSPGPU:ResetGpuCore|ResetGpuCore]] | ||
|- | |- | ||
| 0x001C0040 | | 0x001C0040 | ||
+ | | | ||
+ | | No | ||
| [[GSPGPU:SetLedForceOff|SetLedForceOff]] | | [[GSPGPU:SetLedForceOff|SetLedForceOff]] | ||
|- | |- | ||
| 0x001D0040 | | 0x001D0040 | ||
+ | | | ||
+ | | No | ||
| SetTestCommand (Stubbed) | | SetTestCommand (Stubbed) | ||
|- | |- | ||
| 0x001E0080 | | 0x001E0080 | ||
− | | SetInternalPriorities | + | | |
+ | | No | ||
+ | | [[GSPGPU:SetInternalPriorities|SetInternalPriorities]] | ||
+ | |- | ||
+ | | 0x001F0082 | ||
+ | | [[8.0.0-18]] | ||
+ | | No | ||
+ | | [[GSPGPU:StoreDataCache|StoreDataCache]] | ||
|} | |} | ||
The GSP module starts a thread for handling commands for each service session, a maximum of 4 processes can use this service at once. Official applications have an optional code-path which [[GSPGPU:WriteHWRegs|writes]] to registers during initialization, this is normally not used however. | The GSP module starts a thread for handling commands for each service session, a maximum of 4 processes can use this service at once. Official applications have an optional code-path which [[GSPGPU:WriteHWRegs|writes]] to registers during initialization, this is normally not used however. | ||
+ | If a process has acquired rights, attempting to [[GSPGPU:SetLcdForceBlack|set LCDs to black]] from another process will fail. | ||
+ | Saving/restoring VRAM requires bit0 of process [[GSPGPU:RegisterInterruptRelayQueue|flags]] to be set. | ||
+ | |||
+ | {{Anchor|GSPLCD}}{{Anchor|gsp::Lcd}} | ||
= GSP service "gsp::Lcd" = | = GSP service "gsp::Lcd" = | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! Command Header | ! Command Header | ||
+ | ! Available since system version | ||
! Description | ! Description | ||
|- | |- | ||
− | | | + | | 0x00010040 |
− | | | + | | |
+ | | [[GSPLCD:EnableABL|EnableABL]] | ||
+ | |- | ||
+ | | 0x00020040 | ||
+ | | | ||
+ | | [[GSPLCD:DisableABL|DisableABL]] | ||
+ | |- | ||
+ | | 0x00030080 | ||
+ | | | ||
+ | | [[GSPLCD:SetRSLut|SetRSLut]] | ||
+ | |- | ||
+ | | 0x000400C0 | ||
+ | | | ||
+ | | [[GSPLCD:SetRSParams|SetRSParams]] | ||
|- | |- | ||
− | | | + | | 0x00050140 |
− | | | + | | |
+ | | [[GSPLCD:SetABLArea|SetABLArea]] | ||
|- | |- | ||
− | | | + | | 0x00060140 |
+ | | | ||
| ? | | ? | ||
|- | |- | ||
− | | | + | | 0x00070080 |
− | | | + | | |
+ | | [[GSPLCD:SetInertia|SetInertia]] | ||
|- | |- | ||
− | | | + | | 0x000800C0 |
− | | | + | | |
+ | | [[GSPLCD:SetDitherMode|SetDitherMode]] | ||
|- | |- | ||
− | | | + | | 0x00090140 |
− | | | + | | |
+ | | [[GSPLCD:SetDitherParams|SetDitherParams]] | ||
|- | |- | ||
− | | | + | | 0x000A0080 |
− | | | + | | |
+ | | [[GSPLCD:SetBrightnessRaw|SetBrightnessRaw]] | ||
|- | |- | ||
− | | | + | | 0x000B0080 |
− | | | + | | |
+ | | [[GSPLCD:SetBrightness|SetBrightness]] | ||
|- | |- | ||
− | | | + | | 0x000C0040 |
− | | | + | | |
+ | | [[GSPLCD:ReloadConfig|ReloadConfig]] | ||
|- | |- | ||
− | | | + | | 0x000D0040 |
− | | | + | | |
+ | | [[GSPLCD:RestoreConfig|RestoreConfig]] | ||
|- | |- | ||
− | | | + | | 0x000E0000 |
− | | | + | | |
+ | | [[GSPLCD:GetPowerState|GetPowerState]] | ||
|- | |- | ||
− | | | + | | 0x000F0000 |
− | | | + | | |
+ | | [[GSPLCD:PowerOnAllBacklights|PowerOnAllBacklights]] | ||
|- | |- | ||
− | | | + | | 0x00100000 |
− | | | + | | |
+ | | [[GSPLCD:PowerOffAllBacklights|PowerOffAllBacklights]] | ||
|- | |- | ||
− | | | + | | 0x00110040 |
− | | | + | | |
+ | | [[GSPLCD:PowerOnBacklight|PowerOnBacklight]] | ||
|- | |- | ||
− | | | + | | 0x00120040 |
− | | | + | | |
+ | | [[GSPLCD:PowerOffBacklight|PowerOffBacklight]] | ||
|- | |- | ||
− | | | + | | 0x00130040 |
− | | | + | | |
+ | | [[GSPLCD:SetLedForceOff|SetLedForceOff]] | ||
|- | |- | ||
− | | | + | | 0x00140000 |
− | + | | [[8.0.0-18]] | |
+ | | [[GSPLCD:GetVendor|GetVendor]] New3DS-only, stubbed on Old3DS: This only returns an error. Uninitialized data(not set by this command itself) is also written to u8 cmdreply_word[2]. | ||
|- | |- | ||
− | | | + | | 0x00150040 |
− | + | | [[8.0.0-18]] | |
+ | | [[GSPLCD:GetBrightness|GetBrightness]] New3DS-only, stubbed on Old3DS: This only returns an error. Uninitialized data(not set by this command itself) is also written to u32 cmdreply_word[2]. | ||
|} | |} | ||
Unlike gsp::Gpu, GSP module does not start a separate thread for handling these service commands. | Unlike gsp::Gpu, GSP module does not start a separate thread for handling these service commands. | ||
+ | |||
+ | = Version history = | ||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Version | ||
+ | ! Changes | ||
+ | |- | ||
+ | | [[8.0.0-18|v8196]] | ||
+ | | Support for the new LINEAR memory region was implemented(for cache commands and vaddr->physaddr conversion). Support for the new process-mem 0x1E800000 region(however the GPU can't actually access this memory) was added for vaddr->physaddr conversion. Originally GSP module ignored vaddr->physaddr conversion errors(like with vaddrs outside of the handled ranges) and just wrote physaddr value0 to the GPU registers, however now GSP module returns an error for that instead(see [[GSP_Shared_Memory#Command_Buffer_Header|here]] regarding errors being written to GSP shared-mem). New services commands were added too, see above. | ||
+ | |} | ||
+ | |||
+ | =New3DS= | ||
+ | There's separate GSP-module titles for Old3DS and New3DS. PTM CheckNew3DS is only used by the New3DS title, for copying that flag into a state field. Elsewhere that field is checked for running additional code only on New3DS, for processing various state / using [[QTM_Services|QTM]] commands. | ||
+ | |||
+ | [[Category:Services]] |
Latest revision as of 09:41, 18 September 2024
GSP service "gsp::Gpu"[edit]
Command Header | Available since system version | GSP rights required | Description |
---|---|---|---|
0x00010082 | Yes | WriteHWRegs | |
0x00020084 | Yes | WriteHWRegsWithMask | |
0x00030082 | Yes | WriteHWRegRepeat | |
0x00040080 | Yes | ReadHWRegs | |
0x00050200 | Yes | SetBufferSwap | |
0x00060082 | No | SetCommandList (Stubbed) | |
0x000700C2 | No | RequestDma (Stubbed) | |
0x00080082 | No | FlushDataCache | |
0x00090082 | No | InvalidateDataCache | |
0x000A0044 | No | RegisterInterruptEvents (Stubbed) | |
0x000B0040 | See below | SetLcdForceBlack | |
0x000C0000 | No | TriggerCmdReqQueue | |
0x000D0140 | No | SetDisplayTransfer (Stubbed) | |
0x000E0180 | No | SetTextureCopy (Stubbed) | |
0x000F0200 | No | SetMemoryFill (Stubbed) | |
0x00100040 | No | SetAxiConfigQoSMode | |
0x00110040 | No | SetPerfLogMode | |
0x00120000 | No | GetPerfLog | |
0x00130042 | No | RegisterInterruptRelayQueue | |
0x00140000 | No | UnregisterInterruptRelayQueue | |
0x00150002 | No | TryAcquireRight | |
0x00160042 | No | AcquireRight | |
0x00170000 | No | ReleaseRight | |
0x00180000 | No | ImportDisplayCaptureInfo | |
0x00190000 | See below | SaveVramSysArea | |
0x001A0000 | See below | RestoreVramSysArea | |
0x001B0000 | Yes | ResetGpuCore | |
0x001C0040 | No | SetLedForceOff | |
0x001D0040 | No | SetTestCommand (Stubbed) | |
0x001E0080 | No | SetInternalPriorities | |
0x001F0082 | 8.0.0-18 | No | StoreDataCache |
The GSP module starts a thread for handling commands for each service session, a maximum of 4 processes can use this service at once. Official applications have an optional code-path which writes to registers during initialization, this is normally not used however.
If a process has acquired rights, attempting to set LCDs to black from another process will fail. Saving/restoring VRAM requires bit0 of process flags to be set.
GSP service "gsp::Lcd"[edit]
Command Header | Available since system version | Description |
---|---|---|
0x00010040 | EnableABL | |
0x00020040 | DisableABL | |
0x00030080 | SetRSLut | |
0x000400C0 | SetRSParams | |
0x00050140 | SetABLArea | |
0x00060140 | ? | |
0x00070080 | SetInertia | |
0x000800C0 | SetDitherMode | |
0x00090140 | SetDitherParams | |
0x000A0080 | SetBrightnessRaw | |
0x000B0080 | SetBrightness | |
0x000C0040 | ReloadConfig | |
0x000D0040 | RestoreConfig | |
0x000E0000 | GetPowerState | |
0x000F0000 | PowerOnAllBacklights | |
0x00100000 | PowerOffAllBacklights | |
0x00110040 | PowerOnBacklight | |
0x00120040 | PowerOffBacklight | |
0x00130040 | SetLedForceOff | |
0x00140000 | 8.0.0-18 | GetVendor New3DS-only, stubbed on Old3DS: This only returns an error. Uninitialized data(not set by this command itself) is also written to u8 cmdreply_word[2]. |
0x00150040 | 8.0.0-18 | GetBrightness New3DS-only, stubbed on Old3DS: This only returns an error. Uninitialized data(not set by this command itself) is also written to u32 cmdreply_word[2]. |
Unlike gsp::Gpu, GSP module does not start a separate thread for handling these service commands.
Version history[edit]
Version | Changes |
---|---|
v8196 | Support for the new LINEAR memory region was implemented(for cache commands and vaddr->physaddr conversion). Support for the new process-mem 0x1E800000 region(however the GPU can't actually access this memory) was added for vaddr->physaddr conversion. Originally GSP module ignored vaddr->physaddr conversion errors(like with vaddrs outside of the handled ranges) and just wrote physaddr value0 to the GPU registers, however now GSP module returns an error for that instead(see here regarding errors being written to GSP shared-mem). New services commands were added too, see above. |
New3DS[edit]
There's separate GSP-module titles for Old3DS and New3DS. PTM CheckNew3DS is only used by the New3DS title, for copying that flag into a state field. Elsewhere that field is checked for running additional code only on New3DS, for processing various state / using QTM commands.