NV services: Difference between revisions
No edit summary |
|||
Line 1: | Line 1: | ||
The Switch | The Switch uses a customized NVIDIA driver. | ||
= nvdrv, nvdrv:a, nvdrv:s, nvdrv:t = | = nvdrv, nvdrv:a, nvdrv:s, nvdrv:t = | ||
Line 8: | Line 8: | ||
* "nvdrv:a": applets | * "nvdrv:a": applets | ||
* "nvdrv:s": sysmodules | * "nvdrv:s": sysmodules | ||
* "nvdrv:t": | * "nvdrv:t": factory titles | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 44: | Line 44: | ||
== Open == | == Open == | ||
Takes a type-0x5 input buffer for the device-path. Returns the output 32bit fd and the u32 | Takes a type-0x5 input buffer for the device-path. Returns the output 32bit '''fd''' and the u32 '''error_code'''. | ||
== Ioctl == | == Ioctl == | ||
Takes a 32bit fd, an u32 | Takes a 32bit '''fd''', an u32 '''ioctl_cmd''', a type-0x21 input buffer, and a type-0x22 output buffer. Returns an output u32 ('''error_code'''). | ||
The addr/size for send/recv buffers are only set when the associated direction bit is set in the ioctl cmd(addr/size = 0 otherwise). | The addr/size for send/recv buffers are only set when the associated direction bit is set in the ioctl cmd (addr/size = 0 otherwise). | ||
== Close == | == Close == | ||
Takes a 32bit fd. Returns | Takes a 32bit '''fd'''. Returns an output u32 ('''error_code'''). | ||
== Initialize == | == Initialize == | ||
Takes two copy-handles ('''current_process''' and '''transfer_memory''') and an input u32 ('''transfer_memory_size'''). Returns an output u32 ('''error_code'''). | |||
Webkit applet creates the transfer-memory with perm = 0 and size 0x300000. | Webkit applet creates the transfer-memory with perm = 0 and size 0x300000. | ||
== QueryEvent == | == QueryEvent == | ||
Takes two input u32s(fd and event_id), with the second word immediately after the first one. Returns an output u32 and a copy-handle. | Takes two input u32s ('''fd''' and '''event_id'''), with the second word immediately after the first one. Returns an output u32 ('''error_code''') and a copy-handle ('''event_handle'''). | ||
== MapSharedMem == | == MapSharedMem == | ||
Takes a copy-handle and two input u32s. Returns an output u32. | Takes a copy-handle ('''transfer_memory''') and two input u32s ('''fd''' and '''nvmap_handle'''). Returns an output u32 ('''error_code'''). | ||
== GetStatus == | == GetStatus == | ||
Takes no input. Returns 0x10-bytes | Takes no input. Returns 0x10-bytes and an output u32 ('''error_code'''). | ||
== ForceSetClientPID == | == ForceSetClientPID == | ||
Takes an input u64. Returns an output u32. | Takes an input u64 which must [[IPC_Marshalling|match]] the user-process PID ([[AM_services|AppletResourceUserId]]). Returns an output u32 ('''error_code'''). | ||
== SetClientPID == | == SetClientPID == | ||
Takes a PID-descriptor and an u64 which must [[IPC_Marshalling|match]] the user-process PID([[AM_services|AppletResourceUserId]]). | Takes a PID-descriptor and an u64 which must [[IPC_Marshalling|match]] the user-process PID ([[AM_services|AppletResourceUserId]]). Returns an output u32 ('''error_code'''). | ||
== DumpGraphicsMemoryInfo == | == DumpGraphicsMemoryInfo == | ||
No input or output. | No input or output. Does nothing. | ||
== Cmd10 == | == Cmd10 == | ||
Takes a copy-handle and an input u32. Returns an output u32. | Takes a copy-handle and an input u32. Returns an output u32 ('''error_code'''). | ||
== Ioctl2 == | == Ioctl2 == | ||
Takes a type-0x21 buffer, a type-0x22 buffer, a type-0x21 buffer, and two input u32s. Returns an output u32. | Takes a type-0x21 buffer, a type-0x22 buffer, a type-0x21 buffer, and two input u32s. Returns an output u32 ('''error_code'''). | ||
== Ioctl3 == | == Ioctl3 == | ||
Line 134: | Line 117: | ||
| 0xC008001A || Inout || 8 || [[#NVHOST_IOCTL_CTRL_SYNCPT_READ_MAX]] || | | 0xC008001A || Inout || 8 || [[#NVHOST_IOCTL_CTRL_SYNCPT_READ_MAX]] || | ||
|- | |- | ||
| 0xC183001B || Inout || 387 || NVHOST_IOCTL_CTRL_GET_CONFIG || | | 0xC183001B || Inout || 387 || [[#NVHOST_IOCTL_CTRL_GET_CONFIG]] || | ||
|- | |- | ||
| 0xC004001C || Inout || 4 || [[#NVHOST_IOCTL_CTRL_EVENT_SIGNAL]] || | | 0xC004001C || Inout || 4 || [[#NVHOST_IOCTL_CTRL_EVENT_SIGNAL]] || | ||
Line 209: | Line 192: | ||
__in u32 id; | __in u32 id; | ||
__out u32 value; | __out u32 value; | ||
}; | |||
=== NVHOST_IOCTL_CTRL_GET_CONFIG === | |||
Gets configured settings. Not available in production mode. | |||
struct { | |||
__in char domain_str[0x41]; // "nv" | |||
__in char param_str[0x41]; | |||
__out char config_str[0x101]; | |||
}; | }; | ||
=== NVHOST_IOCTL_CTRL_EVENT_SIGNAL === | === NVHOST_IOCTL_CTRL_EVENT_SIGNAL === | ||
Signals an event. Exclusive to the Switch. | Signals an user event. Exclusive to the Switch. | ||
struct { | struct { | ||
__in u32 | __in u32 user_event_id; // ranges from 0x00 to 0x3F | ||
}; | }; | ||
=== NVHOST_IOCTL_CTRL_EVENT_WAIT === | === NVHOST_IOCTL_CTRL_EVENT_WAIT === | ||
Waits on an event. | Waits on an event. If waiting fails, returns error code 0x05 (Timeout) and sets '''value''' to (('''syncpt_id''' << 0x10) | 0x10000000). | ||
Depending on '''threshold''', an '''user_event_id''' may be returned for using with other event ioctls. | |||
struct { | struct { | ||
__in u32 | __in u32 syncpt_id; | ||
__in u32 | __in u32 threshold; | ||
__in s32 | __in s32 timeout; | ||
__inout u32 | __inout u32 value; // in=user_event_id (ignored); out=syncpt_value or user_event_id | ||
}; | }; | ||
=== NVHOST_IOCTL_CTRL_EVENT_WAIT_ASYNC === | === NVHOST_IOCTL_CTRL_EVENT_WAIT_ASYNC === | ||
Waits on an event (async version). | Waits on an event (async version). If waiting fails, returns error code 0x0B (BadValue). | ||
Depending on '''threshold''', an '''user_event_id''' may be returned for using with other event ioctls. | |||
struct { | struct { | ||
__in u32 | __in u32 syncpt_id; | ||
__in u32 | __in u32 threshold; | ||
__in | __in u32 timeout; | ||
__inout u32 | __inout u32 value; // in=user_event_id (ignored); out=syncpt_value or user_event_id | ||
}; | }; | ||
=== NVHOST_IOCTL_CTRL_EVENT_REGISTER === | === NVHOST_IOCTL_CTRL_EVENT_REGISTER === | ||
Registers an event. Exclusive to the Switch. | Registers an user event. Exclusive to the Switch. | ||
struct { | struct { | ||
__in u32 | __in u32 user_event_id; // ranges from 0x00 to 0x3F | ||
}; | }; | ||
=== NVHOST_IOCTL_CTRL_EVENT_UNREGISTER === | === NVHOST_IOCTL_CTRL_EVENT_UNREGISTER === | ||
Unregisters an event. Exclusive to the Switch. | Unregisters an user event. Exclusive to the Switch. | ||
struct { | struct { | ||
__in u32 | __in u32 user_event_id; // ranges from 0x00 to 0x3F | ||
}; | }; | ||
=== NVHOST_IOCTL_CTRL_EVENT_KILL === | === NVHOST_IOCTL_CTRL_EVENT_KILL === | ||
Kills events. Exclusive to the Switch. | Kills user events. Exclusive to the Switch. | ||
struct { | struct { | ||
__in u64 | __in u64 user_events; // 64-bit bitfield where each bit represents one event | ||
}; | }; | ||
Line 545: | Line 541: | ||
| 0x40284109 || In || 40 || [[#NVGPU_AS_IOCTL_INITIALIZE_EX]] || | | 0x40284109 || In || 40 || [[#NVGPU_AS_IOCTL_INITIALIZE_EX]] || | ||
|- | |- | ||
| | | 0xC0??4114 || Inout || Variable || [[#NVGPU_AS_IOCTL_REMAP]] || | ||
|} | |} | ||
Line 608: | Line 604: | ||
=== NVGPU_AS_IOCTL_UNMAP_BUFFER === | === NVGPU_AS_IOCTL_UNMAP_BUFFER === | ||
Unmap a memory region from the device address space. | |||
struct { | |||
__in u64 offset; | |||
}; | |||
=== NVGPU_AS_IOCTL_INITIALIZE === | === NVGPU_AS_IOCTL_INITIALIZE === | ||
Line 649: | Line 649: | ||
__in u64 unk2; | __in u64 unk2; | ||
}; | }; | ||
=== NVGPU_AS_IOCTL_REMAP === | |||
Nintendo's custom implementation of adress space remapping. | |||
struct remap_entry { | |||
__in u16 flags; // 0 or 4 | |||
__in u16 kind; | |||
__in u32 unk0; | |||
__in u32 unk1; | |||
__in u32 unk2; | |||
__in u32 unk3; | |||
}; | |||
struct { | |||
__in struct remap_entry entries[]; | |||
}; | |||
== /dev/nvhost-dbg-gpu == | == /dev/nvhost-dbg-gpu == | ||
Line 710: | Line 726: | ||
| 0x80084711 || Out || 8 || NVGPU_GPU_IOCTL_GET_TPC_EXCEPTION_EN_STATUS || | | 0x80084711 || Out || 8 || NVGPU_GPU_IOCTL_GET_TPC_EXCEPTION_EN_STATUS || | ||
|- | |- | ||
| 0x80084712 || Out || 8 || || | | 0x80084712 || Out || 8 || NVGPU_GPU_IOCTL_NUM_VSMS || | ||
|- | |- | ||
| 0xC0044713 || Inout || 4 || || | | 0xC0044713 || Inout || 4 || NVGPU_GPU_IOCTL_VSMS_MAPPING || | ||
|- | |- | ||
| 0x80084714 || Out || 8 || [[# | | 0x80084714 || Out || 8 || [[#NVGPU_GPU_IOCTL_ZBC_GET_ACTIVE_SLOT_MASK]] || | ||
|- | |- | ||
| 0x80044715 || Out || 4 || || | | 0x80044715 || Out || 4 || || | ||
Line 782: | Line 798: | ||
}; | }; | ||
=== | === NVGPU_GPU_IOCTL_ZBC_GET_ACTIVE_SLOT_MASK === | ||
Returns the | Returns the mask value for a ZBC slot. | ||
struct { | struct { | ||
__out u32 | __out u32 slot; // always 0x07 | ||
__out u32 | __out u32 mask; | ||
}; | }; | ||
Line 853: | Line 869: | ||
| 0x00004811 || 0 || [[#NVGPU_IOCTL_CHANNEL_FORCE_RESET]] || | | 0x00004811 || 0 || [[#NVGPU_IOCTL_CHANNEL_FORCE_RESET]] || | ||
|- | |- | ||
| 0x40084812 || 8 || [[# | | 0x40084812 || 8 || [[#NVGPU_IOCTL_CHANNEL_EVENT_ID_CONTROL]] || | ||
|- | |- | ||
| 0xC0104813 || 16 || NVGPU_IOCTL_CHANNEL_CYCLE_STATS_SNAPSHOT || | | 0xC0104813 || 16 || NVGPU_IOCTL_CHANNEL_CYCLE_STATS_SNAPSHOT || | ||
|- | |- | ||
| 0x80804816 || 128 || NVGPU_IOCTL_CHANNEL_GET_ERROR_INFO || | | 0x80804816 || 128 || NVGPU_IOCTL_CHANNEL_GET_ERROR_INFO || | ||
|- | |- | ||
| 0xC0104817 || 16 || [[# | | 0xC0104817 || 16 || [[#NVGPU_IOCTL_CHANNEL_GET_ERROR_NOTIFICATION]] || | ||
|- | |- | ||
| 0x40204818 || 32 || [[#NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO_EX]] || | | 0x40204818 || 32 || [[#NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO_EX]] || | ||
Line 947: | Line 963: | ||
Forces the channel to reset. Identical to Linux driver. | Forces the channel to reset. Identical to Linux driver. | ||
=== | === NVGPU_IOCTL_CHANNEL_EVENT_ID_CONTROL === | ||
Controls event notifications | Controls event notifications. | ||
struct { | struct { | ||
__in u32 cmd; // 0=disable, 1=enable, 2=clear | __in u32 cmd; // 0=disable, 1=enable, 2=clear | ||
__in u32 | __in u32 id; | ||
}; | }; | ||
=== | === NVGPU_IOCTL_CHANNEL_GET_ERROR_NOTIFICATION === | ||
Returns the current error notification caught by the error notifier. Exclusive to the Switch. | Returns the current error notification caught by the error notifier. Exclusive to the Switch. | ||
Line 1,074: | Line 1,090: | ||
= Panic = | = Panic = | ||
In some cases | In some cases, a panic may occur. NV forces a crash by doing: | ||
(void *)0 = 0xCAFE; | |||
End result is that the system hangs with a white-screen. | |||
[[Category:Services]] | [[Category:Services]] |