Difference between revisions of "NV services"
Line 3: | Line 3: | ||
= nvdrv, nvdrv:a, nvdrv:s, nvdrv:t = | = nvdrv, nvdrv:a, nvdrv:s, nvdrv:t = | ||
Main NVIDIA driver service. | Main NVIDIA driver service. | ||
+ | |||
+ | Each service is used by: | ||
+ | * "nvdrv": regular applications | ||
+ | * "nvdrv:a": applets | ||
+ | * "nvdrv:s": sysmodules | ||
+ | * "nvdrv:t": Not known to be used by anything on retail. | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" |
Revision as of 15:34, 9 November 2017
The Switch makes use of a customized NVIDIA driver.
nvdrv, nvdrv:a, nvdrv:s, nvdrv:t
Main NVIDIA driver service.
Each service is used by:
- "nvdrv": regular applications
- "nvdrv:a": applets
- "nvdrv:s": sysmodules
- "nvdrv:t": Not known to be used by anything on retail.
Cmd | Name |
---|---|
0 | #Open |
1 | #Ioctl |
2 | #Close |
3 | #Initialize |
4 | QueryEvent |
5 | MapSharedMem |
6 | GetStatus |
7 | ForceSetClientPID |
8 | SetClientPID |
9 | DumpGraphicsMemoryInfo |
10 | [3.0.0+] |
11 | [3.0.0+] Ioctl2 |
12 | [3.0.0+] Ioctl3 |
13 | [3.0.0+] |
Open
Word | Value |
---|---|
0 | 0x00100004 |
1 | 0x00000008 |
2-4 | Type 5 descriptor: Device path |
0-1 | "SFCI" |
2-3 | Cmd id (0) |
Ioctl
Word | Value |
---|---|
0 | 0x11100004 |
1 | 0x00000C0B |
? | Type 0x21 descriptor: Input buffer |
? | Type 0x22 descriptor: Output buffer |
0-1 | "SFCI" |
2-3 | Cmd id (1) |
4 | Device fd |
5 | Ioctl Cmd |
Close
Word | Value |
---|---|
0 | 0x00000004 |
1 | 0x00000009 |
0-1 | "SFCI" |
2-3 | Cmd id (2) |
4 | Device fd |
Initialize
Word | Value |
---|---|
0 | 0x00000004 |
1 | 0x80000009 |
? | Handle descriptor: Current process |
? | Handle descriptor: Shared memory mirror |
0-1 | "SFCI" |
2-3 | Cmd id (3) |
4 | Shared memory size |
Webkit applet creates the shared memory with perm = 0 and size 0x300000.
Ioctls
The ioctl number is generated with the following primitive (see Linux kernel):
#define _IOC(inout, group, num, len) \ (inout | ((len & IOCPARM_MASK) << 16) | ((group) << 8) | (num))
The following table contains known ioctls.
/dev/nvhost-ctrl
Value | Direction | Size | Description | Notes |
---|---|---|---|---|
0xC0080014 | Inout | 8 | #NVHOST_IOCTL_CTRL_SYNCPT_READ | |
0x40040015 | In | 4 | #NVHOST_IOCTL_CTRL_SYNCPT_INCR | |
0xC00C0016 | Inout | 12 | #NVHOST_IOCTL_CTRL_SYNCPT_WAIT | |
0x40080017 | In | 8 | #NVHOST_IOCTL_CTRL_MODULE_MUTEX | |
0xC0180018 | Inout | 24 | #NVHOST_IOCTL_CTRL_MODULE_REGRDWR | |
0xC0100019 | Inout | 16 | #NVHOST_IOCTL_CTRL_SYNCPT_WAITEX | |
0xC008001A | Inout | 8 | #NVHOST_IOCTL_CTRL_SYNCPT_READ_MAX | |
0xC183001B | Inout | 387 | NVHOST_IOCTL_CTRL_GET_CONFIG | |
0xC004001C | Inout | 4 | #NVHOST_IOCTL_CTRL_EVENT_SIGNAL | |
0xC010001D | Inout | 16 | #NVHOST_IOCTL_CTRL_EVENT_WAIT | |
0xC010001E | Inout | 16 | #NVHOST_IOCTL_CTRL_EVENT_WAIT_ASYNC | |
0xC004001F | Inout | 4 | #NVHOST_IOCTL_CTRL_EVENT_REGISTER | |
0xC0040020 | Inout | 4 | #NVHOST_IOCTL_CTRL_EVENT_UNREGISTER | |
0x40080021 | In | 8 | #NVHOST_IOCTL_CTRL_EVENT_KILL |
NVHOST_IOCTL_CTRL_SYNCPT_READ
Identical to Linux driver.
struct { u32 __id; // in u32 __value; // out };
NVHOST_IOCTL_CTRL_SYNCPT_INCR
Identical to Linux driver.
struct { u32 __id; // in };
NVHOST_IOCTL_CTRL_SYNCPT_WAIT
Identical to Linux driver.
struct { u32 __id; // in u32 __thresh; // in s32 __timeout; // in };
NVHOST_IOCTL_CTRL_MODULE_MUTEX
Identical to Linux driver.
struct { u32 __id; // in u32 __lock; // in (0==unlock; 1==lock) };
NVHOST_IOCTL_CTRL_MODULE_REGRDWR
Identical to Linux driver. Uses 32-bit version and doesn't work.
struct { u32 __id; // in u32 __num_offsets; // in u32 __block_size; // in u32 __offsets; // in u32 __values; // in u32 __write; // in };
NVHOST_IOCTL_CTRL_SYNCPT_WAITEX
Identical to Linux driver.
struct { u32 __id; // in u32 __thresh; // in s32 __timeout; // in u32 __value; // out };
NVHOST_IOCTL_CTRL_SYNCPT_READ_MAX
Identical to Linux driver.
struct { u32 __id; // in u32 __value; // out };
NVHOST_IOCTL_CTRL_EVENT_SIGNAL
Signals an event. Exclusive to the Switch.
struct { u32 __event_id; // in (ranges from 0x01 to 0x3F) };
NVHOST_IOCTL_CTRL_EVENT_WAIT
Waits on an event. Exclusive to the Switch.
struct { u32 __unk0; // in u32 __unk1; // in s32 __timeout; // in u32 __event; // inout (in=event_id; out=result) };
NVHOST_IOCTL_CTRL_EVENT_WAIT_ASYNC
Waits on an event (async version). Exclusive to the Switch.
struct { u32 __unk0; // in u32 __unk1; // in s32 __timeout; // in u32 __event; // inout (in=event_id; out=result) };
NVHOST_IOCTL_CTRL_EVENT_REGISTER
Registers an event. Exclusive to the Switch.
struct { u32 __event_id; // in (ranges from 0x01 to 0x3F) };
NVHOST_IOCTL_CTRL_EVENT_UNREGISTER
Unregisters an event. Exclusive to the Switch.
struct { u32 __event_id; // in (ranges from 0x01 to 0x3F) };
NVHOST_IOCTL_CTRL_EVENT_KILL
Kills events. Exclusive to the Switch.
struct { u64 __events; // in (64-bit flag where each bit represents one event) };
/dev/nvmap
Value | Direction | Size | Description | Notes |
---|---|---|---|---|
0xC0080101 | Inout | 8 | #NVMAP_IOC_CREATE | |
0x00000102 | - | 0 | NVMAP_IOC_CLAIM | Returns NotSupported |
0xC0080103 | Inout | 8 | #NVMAP_IOC_FROM_ID | |
0xC0200104 | Inout | 32 | #NVMAP_IOC_ALLOC | |
0xC0180105 | Inout | 24 | #NVMAP_IOC_FREE | |
0xC0280106 | Inout | 40 | NVMAP_IOC_MMAP | Returns NotSupported |
0xC0280107 | Inout | 40 | NVMAP_IOC_WRITE | Returns NotSupported |
0xC0280108 | Inout | 40 | NVMAP_IOC_READ | Returns NotSupported |
0xC00C0109 | Inout | 12 | #NVMAP_IOC_PARAM | |
0xC010010A | Inout | 16 | NVMAP_IOC_PIN_MULT | Returns NotSupported |
0xC010010B | Inout | 16 | NVMAP_IOC_UNPIN_MULT | Returns NotSupported |
0xC008010C | Inout | 8 | NVMAP_IOC_CACHE | Returns NotSupported |
0xC004010D | Inout | 4 | Returns NotSupported | |
0xC008010E | Inout | 8 | #NVMAP_IOC_GET_ID | |
0xC004010F | Inout | 4 | Returns NotSupported | |
0x40040110 | In | 4 | Returns NotSupported | |
0x00000111 | - | 0 | Returns NotSupported |
NVMAP_IOC_CREATE
Creates an nvmap object. Identical to Linux driver.
struct { u32 __size; // in u32 __handle; // out };
NVMAP_IOC_FROM_ID
Get handle to an existing nvmap object. Identical to Linux driver.
struct { u32 __id; // in u32 __handle; // out };
NVMAP_IOC_ALLOC
Allocate memory for the nvmap object. Nintendo extended this one with 16 bytes, and changed it from in to inout.
struct { u32 __handle; // in u32 __heapmask; // in u32 __flags; // in (0=read-only, 1=read-write) u32 __align; // in u8 __kind; // in u8 __pad[7]; u64 __addr; // in };
NVMAP_IOC_FREE
This one is completely custom. Partly because the Linux driver passed the handle as the ioctl "arg-ptr", and HIPC can't handle that voodoo.
struct { u32 __handle; // in u32 __pad; u64 __refcount; // out u32 __size; // out u32 __flags; // out, 1=NOT_FREED_YET };
NVMAP_IOC_PARAM
Returns info about a nvmap object. Identical to Linux driver, but extended with further params.
struct { u32 __handle; // in u32 __param; // in, 1=SIZE, 2=ALIGNMENT, 3=BASE (returns error), 4=HEAP (always 0x40000000), 5=KIND, 6=COMPR (unused) u32 __result; // out };
NVMAP_IOC_GET_ID
Returns an id for a nvmap object. Identical to Linux driver.
struct { u32 __id; // out u32 __handle; // in };
/dev/nvdisp-ctrl
Value | Direction | Size | Description | Notes |
---|---|---|---|---|
0x80040212 | Out | 4 | TEGRA_DC_EXT_CONTROL_GET_NUM_OUTPUTS | |
0xC0140213 | Inout | 20 | TEGRA_DC_EXT_CONTROL_GET_OUTPUT_PROPERTIES | |
0xC1100214 | Inout | 272 | TEGRA_DC_EXT_CONTROL_GET_OUTPUT_EDID | |
0xC0040216 | Inout | 4 | TEGRA_DC_EXT_CONTROL_SET_EVENT0 | |
0xC0040217 | Inout | 4 | TEGRA_DC_EXT_CONTROL_SET_EVENT1 | |
0xC0100218 | Inout | 16 | TEGRA_DC_EXT_CONTROL_SET_EVENT2 | |
0xC0100219 | Inout | 16 | TEGRA_DC_EXT_CONTROL_SET_EVENT3 | |
0xC0040220 | Inout | 4 | TEGRA_DC_EXT_CONTROL_SET_EVENT4 |
/dev/nvdisp-disp0, /dev/nvdisp-disp1
Value | Direction | Size | Description | Notes |
---|---|---|---|---|
0x40040201 | In | 4 | TEGRA_DC_EXT_GET_WINDOW | |
0x40040202 | In | 4 | TEGRA_DC_EXT_PUT_WINDOW | |
0xC4C80203 | In | 1224 | TEGRA_DC_EXT_FLIP | |
0x80380204 | Out | 56 | TEGRA_DC_EXT_GET_MODE | |
0x40380205 | Out | 56 | TEGRA_DC_EXT_SET_MODE | |
0x430C0206 | In | 780 | TEGRA_DC_EXT_SET_LUT | |
0x40010207 | In | 1 | TEGRA_DC_EXT_ENABLE_DISABLE_CRC | |
0x80040208 | Out | 4 | TEGRA_DC_EXT_GET_CRC | |
0x80040209 | Out | 4 | TEGRA_DC_EXT_GET_HEAD_STATUS | |
0xC038020A | Inout | 56 | TEGRA_DC_EXT_VALIDATE_MODE | |
0x4018020B | In | 24 | TEGRA_DC_EXT_SET_CSC | |
0xC004020C | Inout | 4 | TEGRA_DC_EXT_GET_VBLANK_SYNCPT | |
0x8040020D | Out | 64 | TEGRA_DC_EXT_GET_UNDERFLOWS | |
0xC99A020E | Inout | 2458 | TEGRA_DC_EXT_SET_CMU | |
0xC004020F | Inout | 4 | TEGRA_DC_EXT_DPMS | |
0x80600210 | Out | 96 | TEGRA_DC_EXT_GET_AVI_INFOFRAME | |
0x40600211 | In | 96 | TEGRA_DC_EXT_SET_AVI_INFOFRAME | |
0xEBFC0215 | Inout | 11260 | TEGRA_DC_EXT_GET_MODE_DB | |
0xC003021A | Inout | 3 | TEGRA_DC_EXT_PANEL_GET_VENDOR_ID | |
0x803C021B | Out | 60 | TEGRA_DC_EXT_GET_MODE2 | |
0x403C021C | In | 60 | TEGRA_DC_EXT_SET_MODE2 | |
0xC03C021D | Inout | 60 | TEGRA_DC_EXT_VALIDATE_MODE2 | |
0xEF20021E | Inout | 12064 | TEGRA_DC_EXT_GET_MODE_DB2 | |
0xC004021F | Inout | 4 | TEGRA_DC_EXT_GET_WINMASK |
/dev/nvcec-ctrl
Value | Direction | Size | Description | Notes |
---|---|---|---|---|
0x40010300 | In | 1 | ||
0x40010301 | In | 1 | NVCEC_CTRL_ENABLE | |
0x804C0302 | Out | 76 | NVCEC_CTRL_GET_PADDR | |
0x40040303 | In | 4 | NVCEC_CTRL_SET_LADDR | |
0xC04C0304 | Inout | 76 | NVCEC_CTRL_WRITE | |
0xC04C0305 | Inout | 76 | NVCEC_CTRL_READ | |
0x804C0306 | Out | 76 | NVCEC_CTRL_GET_CONNECTION_STATUS | |
0x804C0307 | Out | 76 | NVCEC_CTRL_GET_WRITE_STATUS |
/dev/nvhdcp_up-ctrl
Value | Direction | Size | Description | Notes |
---|---|---|---|---|
0xC4880401 | Inout | 1160 | ||
0xC4880402 | Inout | 1160 | ||
0x40010403 | In | 1 |
/dev/nvdcutil-disp0, /dev/nvdcutil-disp1
Value | Direction | Size | Description | Notes |
---|---|---|---|---|
0x40010501 | In | 1 | ||
0x40010502 | In | 1 | ||
0x42040503 | In | 1056 | ||
0x803C0504 | Out | 60 |
/dev/nvsched-ctrl
Value | Direction | Size | Description | Notes |
---|---|---|---|---|
0x00000601 | - | 0 | ||
0x00000602 | - | 0 | ||
0x40180603 | In | 1056 | ||
0x40180604 | In | 60 | ||
0x40080605 | In | 60 | ||
0x80080606 | Out | 60 | ||
0x80080607 | Out | 60 | ||
0x40180608 | In | 24 | ||
0x40100609 | In | 16 | ||
0x4010060A | In | 16 | ||
0x4008060B | In | 8 | ||
0x8001060C | Out | 1 | ||
0x8010060D | Out | 16 | ||
0x400C060E | In | 12 | ||
0x4008060F | In | 8 | ||
0x40100610 | In | 16 | ||
0x40100611 | In | 16 |
/dev/nvhost-as-gpu
Each fd opened to this device creates an address space. An address space is then later bound with a channel.
Once a nvgpu channel has been bound to an address space it cannot be unbound. There is no support for allowing an nvgpu channel to change from one address space to another (or from one to none).
Value | Direction | Size | Description | Notes |
---|---|---|---|---|
0x40044101 | In | 4 | #NVGPU_AS_IOCTL_BIND_CHANNEL | |
0xC0184102 | Inout | 24 | #NVGPU_AS_IOCTL_ALLOC_SPACE | |
0xC0104103 | Inout | 16 | #NVGPU_AS_IOCTL_FREE_SPACE | |
0xC0184104 | Inout | 24 | #NVGPU_AS_IOCTL_MAP_BUFFER | |
0xC0084105 | Inout | 8 | #NVGPU_AS_IOCTL_UNMAP_BUFFER | |
0xC0284106 | Inout | 40 | #NVGPU_AS_IOCTL_MAP_BUFFER_EX | |
0x40104107 | In | 16 | #NVGPU_AS_IOCTL_INITIALIZE | |
0xC0404108 | Inout | 64 | #NVGPU_AS_IOCTL_GET_VA_REGIONS | |
0x40284109 | In | 40 | #NVGPU_AS_IOCTL_INITIALIZE_EX | |
0xC0144114 | Inout | 20 | NVGPU_AS_IOCTL_REMAP |
NVGPU_AS_IOCTL_BIND_CHANNEL
Identical to Linux driver.
struct { u32 __fd; // in };
NVGPU_AS_IOCTL_ALLOC_SPACE
This one reserves pages in the device address space.
struct { u32 __pages; // in u32 __page_size; // in u32 __flags; // in u32 __pad; union { u64 __offset; // out u64 __align; // in }; };
NVGPU_AS_IOCTL_FREE_SPACE
struct { u64 __offset; // in u32 __pages; // in u32 __page_size; // in };
NVGPU_AS_IOCTL_MAP_BUFFER
Map a memory region in the device address space. Identical to Linux driver pretty much.
On success, the mapped memory region is locked by having SVC#MemoryState bit34 set.
struct { u32 __flags; // in, 4 works u32 __reserved; u32 __nvmap_handle; // in u32 __page_size; // inout, 0 means don't care union { u64 __offset; // out u64 __align; // in }; };
NVGPU_AS_IOCTL_MAP_BUFFER_EX
Map a memory region in the device address space. Identical to Linux driver pretty much.
On success, the mapped memory region is locked by having SVC#MemoryState bit34 set.
struct { u32 __flags; // in, 4 works u32 __kind; // in, -1 is default u32 __nvmap_handle; // in u32 __page_size; // inout, 0 means don't care u64 __buffer_offset; // in u64 __mapping_size; // in u64 __offset; // out };
NVGPU_AS_IOCTL_UNMAP_BUFFER
Doesn't do shit.
NVGPU_AS_IOCTL_INITIALIZE
Nintendo's custom implementation of NVGPU_GPU_IOCTL_ALLOC_AS (unavailable).
struct { u32 __big_page_size; // in (depends on GPU's available_big_page_sizes; 0=default) s32 __as_fd; // in (ignored; passes 0) u32 __flags; // in (ignored; passes 0) u32 __reserved; // in (ignored; passes 0) };
NVGPU_AS_IOCTL_GET_VA_REGIONS
Nintendo modified to get rid of pointer in struct.
struct va_region { u64 __offset; u32 __page_size; u32 __reserved; u64 __pages; }; struct { u64 __not_used; // (contained output user ptr on linux, ignored) u32 __bufsize; // inout, forced to 2*sizeof(struct va_region) u32 __reserved; struct va_region __regions[2]; // out };
NVGPU_AS_IOCTL_INITIALIZE_EX
Nintendo's custom implementation of NVGPU_GPU_IOCTL_ALLOC_AS (unavailable) with extra params.
struct { u32 __big_page_size; // in (depends on GPU's available_big_page_sizes; 0=default) s32 __as_fd; // in (ignored; passes 0) u32 __flags; // in (ignored; passes 0) u32 __reserved; // in (ignored; passes 0) u64 __unk0; // in u64 __unk1; // in u64 __unk2; // in };
/dev/nvhost-dbg-gpu
Not accessible, but there is code to invoke it.
Value | Direction | Size | Description | Notes |
---|---|---|---|---|
0x40084401 | In | 8 | NVGPU_DBG_GPU_IOCTL_BIND_CHANNEL | |
0xC0??4402 | Inout | Variable | NVGPU_DBG_GPU_IOCTL_REG_OPS | |
0x40084403 | In | 8 | NVGPU_DBG_GPU_IOCTL_EVENTS_CTRL | |
0x40044404 | In | 4 | NVGPU_DBG_GPU_IOCTL_POWERGATE | |
0x40044405 | In | 4 | NVGPU_DBG_GPU_IOCTL_SMPC_CTXSW_MODE | |
0xC0184407 | Inout | 24 | NVGPU_DBG_GPU_IOCTL_PERFBUF_MAP | |
0x40084408 | In | 8 | NVGPU_DBG_GPU_IOCTL_PERFBUF_UNMAP | |
0x40084409 | In | 8 | NVGPU_DBG_GPU_IOCTL_PC_SAMPLING | |
0x4008440A | In | 8 | NVGPU_DBG_GPU_IOCTL_TIMEOUT | |
0x8008440B | Out | 8 | NVGPU_DBG_GPU_IOCTL_GET_TIMEOUT | |
0x8004440C | Out | 4 | NVGPU_DBG_GPU_IOCTL_GET_GR_CONTEXT_SIZE | |
0x0000440D | ? | ? | NVGPU_DBG_GPU_IOCTL_GET_GR_CONTEXT (uses Ioctl3) |
/dev/nvhost-ctrl-gpu
This device is for global (context independent) operations on the gpu.
Value | Direction | Size | Description | Notes |
---|---|---|---|---|
0x80044701 | Out | 4 | NVGPU_GPU_IOCTL_ZCULL_GET_CTX_SIZE | |
0x80284702 | Out | 40 | NVGPU_GPU_IOCTL_ZCULL_GET_INFO | |
0x402C4703 | In | 44 | NVGPU_GPU_IOCTL_ZBC_SET_TABLE | |
0xC0344704 | Inout | 52 | NVGPU_GPU_IOCTL_ZBC_QUERY_TABLE | |
0xC0B04705 | Inout | 176 | #NVGPU_GPU_IOCTL_GET_CHARACTERISTICS | |
0xC0184706 | Inout | 24 | NVGPU_GPU_IOCTL_GET_TPC_MASKS | |
0x40084707 | In | 8 | #NVGPU_GPU_IOCTL_FLUSH_L2 | |
0x4008470E | In | 8 | NVGPU_GPU_IOCTL_SET_MMUDEBUG_MODE | |
0x4010470F | In | 16 | NVGPU_GPU_IOCTL_SET_SM_DEBUG_MODE | |
0xC0084710 | Inout | 8 | NVGPU_GPU_IOCTL_WAIT_FOR_PAUSE | |
0x80084711 | Out | 8 | NVGPU_GPU_IOCTL_GET_TPC_EXCEPTION_EN_STATUS | |
0x80084712 | Out | 8 | ||
0xC0044713 | Inout | 4 | ||
0x80084714 | Out | 8 | #NVGPU_GPU_IOCTL_GET_L2_STATE | |
0x80044715 | Out | 4 | ||
0x8018471A | Out | 24 | ||
0xC008471B | Inout | 8 | NVGPU_GPU_IOCTL_GET_ERROR_CHANNEL_USER_DATA | |
0xC010471C | Inout | 16 | NVGPU_GPU_IOCTL_GET_GPU_TIME | |
0xC108471D | Inout | 264 | NVGPU_GPU_IOCTL_GET_CPU_TIME_CORRELATION_INFO |
NVGPU_GPU_IOCTL_GET_CHARACTERISTICS
Returns the GPU characteristics. Modified to return inline data instead of using a pointer.
struct __gpu_characteristics { u32 __arch; // 0x120 (NVGPU_GPU_ARCH_GM200) u32 __impl; // 0xB (NVGPU_GPU_IMPL_GM20B) u32 __rev; // 0xA1 (Revision A1) u32 __num_gpc; // 0x1 u64 __L2_cache_size; // 0x40000 u64 __on_board_video_memory_size; // 0x0 (not used) u32 __num_tpc_per_gpc; // 0x2 u32 __bus_type; // 0x20 (NVGPU_GPU_BUS_TYPE_AXI) u32 __big_page_size; // 0x20000 u32 __compression_page_size; // 0x20000 u32 __pde_coverage_bit_count; // 0x1B u32 __available_big_page_sizes; // 0x30000 u32 __gpc_mask; // 0x1 u32 __sm_arch_sm_version; // 0x503 (Maxwell Generation 5.0.3?) u32 __sm_arch_spa_version; // 0x503 (Maxwell Generation 5.0.3?) u32 __sm_arch_warp_count; // 0x80 u32 __gpu_va_bit_count; // 0x28 u32 __reserved; // NULL u64 __flags; // 0x55 u32 __twod_class; // 0x902D (FERMI_TWOD_A) u32 __threed_class; // 0xB197 (MAXWELL_B) u32 __compute_class; // 0xB1C0 (MAXWELL_COMPUTE_B) u32 __gpfifo_class; // 0xB06F (MAXWELL_CHANNEL_GPFIFO_A) u32 __inline_to_memory_class; // 0xA140 (KEPLER_INLINE_TO_MEMORY_B) u32 __dma_copy_class; // 0xB0B5 (MAXWELL_DMA_COPY_A) u32 __max_fbps_count; // 0x1 u32 __fbp_en_mask; // 0x0 (disabled) u32 __max_ltc_per_fbp; // 0x2 u32 __max_lts_per_ltc; // 0x1 u32 __max_tex_per_tpc; // 0x0 (not supported) u32 __max_gpc_count; // 0x1 u32 __rop_l2_en_mask_0; // 0x21D70 (fuse_status_opt_rop_l2_fbp_r) u32 __rop_l2_en_mask_1; // 0x0 u64 __chipname; // 0x6230326D67 ("gm20b") u64 __gr_compbit_store_base_hw; // 0x0 (not supported) }; struct { u64 __gpu_characteristics_buf_size; // in/out (must not be NULL, but gets overwritten with 0xA0=max_size) u64 __gpu_characteristics_buf_addr; // in (ignored, but must not be NULL) struct __gpu_characteristics gc; // out };
NVGPU_GPU_IOCTL_FLUSH_L2
Flushes the GPU L2 cache.
struct { u32 __flush; // in (l2_flush | l2_invalidate << 1 | fb_flush << 2) u32 __reserved; // in };
NVGPU_GPU_IOCTL_GET_L2_STATE
Returns the GPU L2 cache state.
struct { u32 __mask; // out (always 0x07) u32 __flush; // out (active flush bit field) };
Channels
Channels are a concept for NVIDIA hardware blocks that share a common interface.
Path | Name |
---|---|
/dev/nvhost-gpu | |
/dev/nvhost-vic | Video Image Compositor |
/dev/nvhost-nvdec | Video Decoder |
/dev/nvhost-nvjpg | JPEG Decoder |
Channel Ioctls
Value | Size | Description | Notes |
---|---|---|---|
0xC0??0001 | Variable | NVHOST_IOCTL_CHANNEL_SUBMIT | |
0xC0080002 | 8 | NVHOST_IOCTL_CHANNEL_GET_SYNCPOINT | |
0xC0080003 | 8 | NVHOST_IOCTL_CHANNEL_GET_WAITBASE | |
0xC0080004 | 8 | NVHOST_IOCTL_CHANNEL_SET_TIMEOUT_EX | |
0x40040007 | 4 | ||
0x40080008 | 8 | NVHOST_IOCTL_CHANNEL_SET_CLK_RATE | |
0xC0??0009 | Variable | NVHOST_IOCTL_CHANNEL_MAP_BUFFER | |
0xC0??000A | Variable | NVHOST_IOCTL_CHANNEL_UNMAP_BUFFER | |
0x00000013 | 0 | ||
0x40044801 | 4 | #NVGPU_IOCTL_CHANNEL_SET_NVMAP_FD | |
0x40044803 | 4 | NVGPU_IOCTL_CHANNEL_SET_TIMEOUT | |
0x40084805 | 8 | #NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO | |
0xC0044807 | 4 | NVGPU_IOCTL_CHANNEL_CYCLE_STATS | |
0xC0??4808 | Variable | #NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO | |
0xC0104809 | 16 | #NVGPU_IOCTL_CHANNEL_ALLOC_OBJ_CTX | |
0xC010480B | 16 | NVGPU_IOCTL_CHANNEL_ZCULL_BIND | |
0xC018480C | 24 | #NVGPU_IOCTL_CHANNEL_SET_ERROR_NOTIFIER | |
0x4004480D | 4 | #NVGPU_IOCTL_CHANNEL_SET_PRIORITY | |
0x0000480E | 0 | #NVGPU_IOCTL_CHANNEL_ENABLE | |
0x0000480F | 0 | #NVGPU_IOCTL_CHANNEL_DISABLE | |
0x00004810 | 0 | #NVGPU_IOCTL_CHANNEL_PREEMPT | |
0x00004811 | 0 | #NVGPU_IOCTL_CHANNEL_FORCE_RESET | |
0x40084812 | 8 | #NVGPU_IOCTL_CHANNEL_EVENTS_CTRL | |
0xC0104813 | 16 | NVGPU_IOCTL_CHANNEL_CYCLE_STATS_SNAPSHOT | |
0x80804816 | 128 | NVGPU_IOCTL_CHANNEL_GET_ERROR_INFO | Only works when the channel is busy |
0xC0104817 | 16 | #NVGPU_IOCTL_CHANNEL_GET_ERROR | |
0x40204818 | 32 | #NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO_EX | |
0xC0??4819 | Variable | #NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO_RETRY | |
0xC020481A | 32 | #NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO_EX2 | |
0x40084714 | 8 | NVGPU_IOCTL_CHANNEL_SET_USER_DATA | Sets an unknown user context address |
0x80084715 | 8 | NVGPU_IOCTL_CHANNEL_GET_USER_DATA | Gets an unknown user context address |
NVGPU_IOCTL_CHANNEL_SET_NVMAP_FD
Binds a nvmap object to this channel. Identical to Linux driver.
struct { u32 __nvmap_fd; // in };
NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO
Allocates gpfifo entries. Identical to Linux driver.
struct { u32 __num_entries; // in u32 __flags; // in };
NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO
Submits a gpfifo object. Modified to take inline entry objects instead of a pointer.
struct fence { u32 __id; u32 __value; }; struct gpfifo_entry { u32 __entry0; u32 __entry1; }; struct { u64 __gpfifo; // in (pointer to gpfifo fence structs; ignored) u32 __num_entries; // in (number of fence objects being submitted) u32 __flags; // in struct fence __fence_out; // out (returned new fence object for others to wait on) struct gpfifo_entry __entries[]; // in (depends on __num_entries) };
NVGPU_IOCTL_CHANNEL_ALLOC_OBJ_CTX
Allocates a graphics context object. Modified to ignore object's ID.
struct { u32 __class_num; // in (0x902D=2d, 0xB197=3d, 0xB1C0=compute, 0xA140=kepler, 0xB0B5=DMA, 0xB06F=channel_gpfifo) u32 __flags; // in u64 __obj_id; // out (ignored; used for FREE_OBJ_CTX ioctl, which is not supported) };
NVGPU_IOCTL_CHANNEL_SET_ERROR_NOTIFIER
Initializes the error notifier for this channel. Identical to Linux driver.
struct { u64 __offset; // in u64 __size; // in u32 __mem; // in (nvmap object handle) u32 __padding; // in };
NVGPU_IOCTL_CHANNEL_SET_PRIORITY
Change channel's priority. Identical to Linux driver.
struct { u32 __priority; // in (0x32 is low, 0x64 is medium and 0x96 is high) };
NVGPU_IOCTL_CHANNEL_ENABLE
Enables the current channel. Identical to Linux driver.
NVGPU_IOCTL_CHANNEL_DISABLE
Disables the current channel. Identical to Linux driver.
NVGPU_IOCTL_CHANNEL_PREEMPT
Clears the FIFO pipe for this channel. Identical to Linux driver.
NVGPU_IOCTL_CHANNEL_FORCE_RESET
Forces the channel to reset. Identical to Linux driver.
NVGPU_IOCTL_CHANNEL_EVENTS_CTRL
Controls event notifications. Modified to take an additional argument.
struct { u32 __cmd; // in (0=disable, 1=enable, 2=clear) u32 __unk; // in (accepts 1 or 2) };
NVGPU_IOCTL_CHANNEL_GET_ERROR
Returns the current error notification caught by the error notifier. Exclusive to the Switch.
struct { u64 __timestamp; // out (nanoseconds since Jan. 1, 1970) u32 __info32; // out (error code) u16 __info16; // out (additional error info) u16 __status; // inout (always 0xFFFF) };
NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO_RETRY
Allocates gpfifo entries with additional parameters. Exclusive to the Switch.
struct { u32 __num_entries; // in u32 __flags; // in u32 __unk0; // in (1 works) u32 __unk1; // in u32 __unk2; // in u32 __unk3; // in u32 __unk4; // in u32 __unk5; // in };
NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO_EX
Submits a gpfifo object (async version). Exclusive to the Switch.
struct { u64 __gpfifo; // in (pointer to gpfifo fence structs; ignored) u32 __num_entries; // in (number of fence objects being submitted) u32 __flags; // in struct fence __fence_out; // out (returned new fence object for others to wait on) struct gpfifo_entry __entries[]; // in (depends on __num_entries) };
NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO_EX2
Allocates gpfifo entries with additional parameters and returns a fence. Exclusive to the Switch.
struct { u32 __num_entries; // in u32 __flags; // in u32 __unk0; // in (1 works) struct fence __fence_out; // out u32 __unk1; // in u32 __unk2; // in u32 __unk3; // in };
nvmemp
NVIDIA memory profiler (this service is not available on retail units).
nvdrvdbg
Cmd | Name |
---|---|
0 | #OpenLog |
1 | #CloseLog |
2 | #ReadLog |
OpenLog
Takes process handle. Returns an fd.
CloseLog
Takes fd and closes it.
ReadLog
Takes fd and reads log into a type-6 buffer.
Errors
Most nvidia driver commands return an error code apart from the normal return code.
Cmd | Name |
---|---|
0 | Success |
1 | NotImplemented |
2 | NotSupported |
3 | NotInitialized |
4 | BadParameter |
5 | Timeout |
6 | InsufficientMemory |
7 | ReadOnlyAttribute |
8 | InvalidState |
9 | InvalidAddress |
0xA | InvalidSize |
0xB | BadValue |
0xD | AlreadyAllocated |
0xE | Busy |
0xF | ResourceError |
0x10 | CountMismatch |
0x1000 | SharedMemoryTooSmall |
0x30003 | FileOperationFailed |
0x3000F | IoctlFailed |