Line 1: |
Line 1: |
− | The Switch uses a customized NVIDIA driver.
| |
− |
| |
| = nvdrv, nvdrv:a, nvdrv:s, nvdrv:t = | | = nvdrv, nvdrv:a, nvdrv:s, nvdrv:t = |
| This is "nns::nvdrv::INvDrvServices". | | This is "nns::nvdrv::INvDrvServices". |
− |
| |
− | Main NVIDIA driver service.
| |
| | | |
| Each service is used by: | | Each service is used by: |
| * "nvdrv": Applications. | | * "nvdrv": Applications. |
− | ** [[#Permissions|Permission]] mask is [3.0.0+] 0xA82B ([1.0.0-2.3.0] 0x2B). | + | ** [[#NvDrvPermission|Permission]] mask is [11.0.0+] 0xA83B ([1.0.0-2.3.0] 0x2B, [3.0.0+] 0xA82B). |
| * "nvdrv:a": Applets. | | * "nvdrv:a": Applets. |
− | ** [[#Permissions|Permission]] mask is [3.0.0+] 0x10A9 ([1.0.0-2.3.0] 0xA9). | + | ** [[#NvDrvPermission|Permission]] mask is [3.0.0+] 0x10A9 ([1.0.0-2.3.0] 0xA9). |
| * "nvdrv:s": Sysmodules. | | * "nvdrv:s": Sysmodules. |
− | ** [[#Permissions|Permission]] mask is [3.0.0+] 0x439E ([1.0.0-2.3.0] 0x39E). | + | ** [[#NvDrvPermission|Permission]] mask is [3.0.0+] 0x439E ([1.0.0-2.3.0] 0x39E). |
| * "nvdrv:t": Factory. | | * "nvdrv:t": Factory. |
− | ** [[#Permissions|Permission]] mask is 0xFFFFFFFF. | + | ** [[#NvDrvPermission|Permission]] mask is 0xFFFFFFFF. |
| | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
Line 50: |
Line 46: |
| | | |
| == Open == | | == Open == |
− | Takes a type-0x5 input buffer for the device-path. Returns the output 32bit '''fd''' and the u32 '''error_code'''. | + | Takes a type-0x5 input buffer '''Path'''. Returns two output u32s '''FdOut''' and '''Err'''. |
| | | |
| == Ioctl == | | == Ioctl == |
− | 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'''). | + | Takes two input u32s '''Fd''' and '''Iocode''', a type-0x21 input buffer and a type-0x22 output buffer. Returns an output u32 '''Err'''. |
| | | |
| 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 an output u32 ('''error_code'''). | + | Takes an input u32 '''Fd'''. Returns an output u32 '''Err'''. |
| | | |
| == Initialize == | | == Initialize == |
− | Takes two copy-handles ('''current_process''' and '''transfer_memory''') and an input u32 ('''transfer_memory_size'''). Returns an output u32 ('''error_code'''). | + | Takes an input Process handle, an input TransferMemory handle and an input u32 '''Size'''. Returns an output u32 '''Err'''. |
| | | |
− | Webkit applet creates the transfer-memory with perm = 0 and size 0x300000. | + | Webkit applet creates the TransferMemory 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 ('''error_code''') and a copy-handle ('''event_handle'''). | + | Takes two input u32s '''Fd''' and '''EvtId'''. Returns an output u32 '''Err''' and an output Event handle. |
| | | |
| QueryEvent is only supported on (and implemented differently on): | | QueryEvent is only supported on (and implemented differently on): |
Line 83: |
Line 79: |
| | | |
| == MapSharedMem == | | == MapSharedMem == |
− | Takes a copy-handle ('''transfer_memory''') and two input u32s ('''fd''' and '''nvmap_handle'''). Returns an output u32 ('''error_code'''). | + | Takes an input TransferMemory handle and two input u32s '''Fd''' and '''HMem'''. Returns an output u32 '''Err'''. |
| + | |
| + | '''HMem''' is a [[#/dev/nvmap|/dev/nvmap]] memory handle. |
| | | |
| == GetStatus == | | == GetStatus == |
− | Takes no input. Returns 0x10-bytes and an output u32 ('''error_code'''). | + | Takes no input. Returns an output [[#NvDrvStatus]] and an output u32 '''Err'''. |
| | | |
| == SetAruidWithoutCheck == | | == SetAruidWithoutCheck == |
− | Takes an input u64 which must [[IPC_Marshalling|match]] the user-process PID ([[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]). Returns an output u32 ('''error_code'''). | + | Takes an input u64 '''Aruid'''. Returns an output u32 '''Err'''. |
| + | |
| + | '''Aruid''' must [[IPC_Marshalling|match]] the current [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. |
| | | |
| == SetAruid == | | == SetAruid == |
− | Takes a PID-descriptor and an u64 which must [[IPC_Marshalling|match]] the user-process PID ([[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]). Returns an output u32 ('''error_code'''). | + | Takes a PID-descriptor and an input [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. Returns an output u32 '''Err'''. |
| | | |
| == DumpStatus == | | == DumpStatus == |
− | No input or output. | + | No input/output. |
| | | |
| == InitializeDevtools == | | == InitializeDevtools == |
− | Takes a copy-handle ('''transfer_memory''') and an input u32 ('''transfer_memory_size'''). Returns an output u32 ('''error_code'''). | + | Takes an input TransferMemory handle and an input u32 '''Size'''. Returns an output u32 '''Err'''. |
| | | |
| == Ioctl2 == | | == Ioctl2 == |
− | Takes a type-0x21 buffer, a type-0x22 buffer, a type-0x21 buffer, and two input u32s. Returns an output u32 ('''error_code'''). | + | Takes two input u32s '''Fd''' and '''Iocode''', two type-0x21 input buffers and a type-0x22 output buffer. Returns an output u32 '''Err'''. |
| | | |
| == Ioctl3 == | | == Ioctl3 == |
− | Takes a type-0x21 buffer, a type-0x22 buffer, another type-0x22 buffer, and two input u32s. Returns an output u32 (error_code). | + | Takes two input u32s '''Fd''' and '''Iocode''', a type-0x21 input buffer and two type-0x22 output buffers. Returns an output u32 '''Err'''. |
− | Cmdhdr_word1 is 0x100B instead of 0xC0B.
| |
| | | |
| == SetGraphicsFirmwareMemoryMarginEnabled == | | == SetGraphicsFirmwareMemoryMarginEnabled == |
Line 112: |
Line 111: |
| This sets a boolean value based on the input u64 and the value of the "nv!nv_graphics_firmware_memory_margin" system configuration, but only for "nvdrv" (the other services default to false). | | This sets a boolean value based on the input u64 and the value of the "nv!nv_graphics_firmware_memory_margin" system configuration, but only for "nvdrv" (the other services default to false). |
| | | |
− | Official user-processes starting with 3.0.0 now use this at the end of nvdrv service init with value 0x1.
| + | [3.0.0+] Official user-processes now use this at the end of nvdrv service init with value 0x1. |
| + | |
| + | = nvmemp = |
| + | This is "nv::MemoryProfiler::IMemoryProfiler". |
| | | |
− | = Permissions =
| + | /dev/nvhost-ctrl sends the ioctl NVHOST_IOCTL_CTRL_GET_CONFIG to check the config "nv!NV_MEMORY_PROFILER". If config_str returns "1", the application attempts to use nvmemp. |
− | Each nvdrv service is initialized with a bitfield that controls access to nodes and other operations.
| |
| | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
− | ! Bits
| |
− | ! Name
| |
− | ! Description
| |
| |- | | |- |
− | | 0 | + | ! Cmd || Name |
− | | NvDrvPermission_Gpu | |
− | | Can access [[#Channels|/dev/nvhost-gpu]], [[#/dev/nvhost-ctrl-gpu|/dev/nvhost-ctrl-gpu]] and [[#/dev/nvhost-as-gpu|/dev/nvhost-as-gpu]].
| |
| |- | | |- |
− | | 1 | + | | 0 || [[#Open_2|Open]] |
− | | NvDrvPermission_GpuDebug | |
− | | Can access [[#/dev/nvhost-dbg-gpu|/dev/nvhost-dbg-gpu]] and [[#/dev/nvhost-prof-gpu|/dev/nvhost-prof-gpu]]. | |
| |- | | |- |
− | | 2 | + | | 1 || [[#GetPid|GetPid]] |
− | | NvDrvPermission_GpuSchedule | + | |} |
− | | Can access [[#/dev/nvsched-ctrl|/dev/nvsched-ctrl]]. | + | |
| + | == Open == |
| + | Takes an input TransferMemory handle and an input u32 '''Size'''. No output. |
| + | |
| + | == GetPid == |
| + | No input. Returns an output u32 '''Pid'''. |
| + | |
| + | = nvdrvdbg = |
| + | This is "nns::nvdrv::INvDrvDebugFSServices". |
| + | |
| + | {| class="wikitable" border="1" |
| |- | | |- |
− | | 3 | + | ! Cmd || Name |
− | | NvDrvPermission_VIC | |
− | | Can access [[#Channels|/dev/nvhost-vic]].
| |
| |- | | |- |
− | | 4 | + | | 0 || [[#DebugFSOpen]] |
− | | NvDrvPermission_VideoEncoder | + | |- |
− | | Can access [[#Channels|/dev/nvhost-msenc]]. | + | | 1 || [[#DebugFSClose]] |
| |- | | |- |
− | | 5 | + | | 2 || [[#GetDebugFSKeys]] |
− | | NvDrvPermission_VideoDecoder | |
− | | Can access [[#Channels|/dev/nvhost-nvdec]]. | |
| |- | | |- |
− | | 6 | + | | 3 || [[#GetDebugFSValue]] |
− | | NvDrvPermission_TSEC | |
− | | Can access [[#Channels|/dev/nvhost-tsec]]. | |
| |- | | |- |
− | | 7 | + | | 4 || [[#SetDebugFSValue]] |
− | | NvDrvPermission_JPEG | + | |} |
− | | Can access [[#Channels|/dev/nvhost-nvjpg]]. | + | |
| + | == DebugFSOpen == |
| + | Takes an input Process handle. Returns an output u32 '''Handle'''. |
| + | |
| + | == DebugFSClose == |
| + | Takes an input u32 '''Handle'''. No output. |
| + | |
| + | == GetDebugFSKeys == |
| + | Takes an input u32 '''Handle''' and a type-0x6 output buffer '''OutValueBuf'''. Returns an output u32 '''Err'''. |
| + | |
| + | == GetDebugFSValue == |
| + | Takes an input u32 '''Handle''', a type-0x5 input buffer '''InKeyBuf''' and a type-0x6 output buffer '''OutValueBuf'''. Returns an output u32 '''Err'''. |
| + | |
| + | == SetDebugFSValue == |
| + | Takes an input u32 '''Handle''' and two type-0x5 input buffers '''InKeyBuf''' and '''InValueBuf'''. Returns an output u32 '''Err'''. |
| + | |
| + | = nvgem:c = |
| + | This is "nv::gemcontrol::INvGemControl". |
| + | |
| + | {| class="wikitable" border="1" |
| |- | | |- |
− | | 8 | + | ! Cmd || Name |
− | | NvDrvPermission_Display | |
− | | Can access [[#Channels|/dev/nvhost-display]], [[#/dev/nvcec-ctrl|/dev/nvcec-ctrl]], [[#/dev/nvhdcp_up-ctrl|/dev/nvhdcp_up-ctrl]], [[#/dev/nvdisp-ctrl|/dev/nvdisp-ctrl]], [[#/dev/nvdisp-disp0, /dev/nvdisp-disp1|/dev/nvdisp-disp0]], [[#/dev/nvdisp-disp0, /dev/nvdisp-disp1|/dev/nvdisp-disp1]], [[#/dev/nvdcutil-disp0, /dev/nvdcutil-disp1|/dev/nvdcutil-disp0]] and [[#/dev/nvdcutil-disp0, /dev/nvdcutil-disp1|/dev/nvdcutil-disp1]].
| |
| |- | | |- |
− | | 9 | + | | 0 || [[#Initialize_2|Initialize]] |
− | | NvDrvPermission_ImportMemory | |
− | | Can duplicate [[#/dev/nvmap|nvmap]] handles from other processes with [[#NVMAP_IOC_FROM_ID|NVMAP_IOC_FROM_ID]]. | |
| |- | | |- |
− | | 10 | + | | 1 || [[#GetEventHandle|GetEventHandle]] |
− | | NvDrvPermission_NoCheckedAruid | |
− | | Can use [[#SetAruidWithoutCheck|SetAruidWithoutCheck]]. | |
| |- | | |- |
− | | 11 | + | | 2 || [[#ControlNotification|ControlNotification]] |
− | | | + | |- |
− | | Can use [[#SetGraphicsFirmwareMemoryMarginEnabled|SetGraphicsFirmwareMemoryMarginEnabled]]. | + | | 3 || [[#SetNotificationPerm|SetNotificationPerm]] |
| |- | | |- |
− | | 12 | + | | 4 || [[#SetCoreDumpPerm|SetCoreDumpPerm]] |
− | | | |
− | | Can duplicate exported [[#/dev/nvmap|nvmap]] handles from other processes with [[#NVMAP_IOC_FROM_ID|NVMAP_IOC_FROM_ID]]. | |
| |- | | |- |
− | | 13 | + | | 5 || [1.0.0-4.1.0] [[#GetAruid|GetAruid]] |
− | | | |
− | | | |
| |- | | |- |
− | | 14 | + | | 6 || [[#Reset|Reset]] |
− | | | |
− | | Can use [[#NVMAP_IOC_EXPORT_FOR_ARUID|NVMAP_IOC_EXPORT_FOR_ARUID]] and [[#NVMAP_IOC_REMOVE_EXPORT_FOR_ARUID|NVMAP_IOC_REMOVE_EXPORT_FOR_ARUID]]. | |
| |- | | |- |
− | | 15 | + | | 7 || [3.0.0+] |
− | | | |
− | | | |
| |} | | |} |
| | | |
− | Nodes [[#/dev/nvmap|/dev/nvmap]], [[#/dev/nvhost-ctrl|/dev/nvhost-ctrl]] and [[#/dev/nverpt-ctrl|/dev/nverpt-ctrl]] are always accessible.
| + | == Initialize == |
| + | No input. Returns an output u32 '''Err'''. |
| + | |
| + | == GetEventHandle == |
| + | No input. Returns an output Event handle and an output u32 '''Err'''. |
| + | |
| + | == ControlNotification == |
| + | Takes an input bool '''Enable'''. Returns an output u32 '''Err'''. |
| + | |
| + | == SetNotificationPerm == |
| + | Takes an input u64 '''Aruid''' and an input bool '''Enable'''. Returns an output u32 '''Err'''. |
| + | |
| + | == SetCoreDumpPerm == |
| + | Takes an input u64 '''Aruid''' and an input bool '''Enable'''. Returns an output u32 '''Err'''. |
| | | |
− | = Ioctls = | + | == GetAruid == |
− | The ioctl number is generated with the following primitive (see Linux kernel):
| + | No input. Returns an output u64 '''Aruid''' and an output u32 '''Err'''. |
| | | |
− | #define _IOC(inout, group, num, len) \
| + | == Reset == |
− | (inout | ((len & IOCPARM_MASK) << 16) | ((group) << 8) | (num))
| + | No input. Returns an output u32 '''Err'''. |
| | | |
− | The following table contains known ioctls.
| + | = nvgem:cd = |
| + | This is "nv::gemcoredump::INvGemCoreDump". |
| | | |
− | == /dev/nvhost-ctrl ==
| |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
− | ! Value || Direction || Size || Description | + | |- |
| + | ! Cmd || Name |
| + | |- |
| + | | 0 || [[#Initialize_3|Initialize]] |
| + | |- |
| + | | 1 || [[#GetAruid_2|GetAruid]] |
| + | |- |
| + | | 2 || [1.0.0-8.1.0] [[#ReadNextBlock|ReadNextBlock]] |
| + | |- |
| + | | 3 || [8.0.0+] |
| + | |- |
| + | | 4 || [8.0.0+] |
| + | |} |
| + | |
| + | == Initialize == |
| + | No input. Returns an output u32 '''Err'''. |
| + | |
| + | == GetAruid == |
| + | No input. Returns an output u64 '''Aruid''' and an output u32 '''Err'''. |
| + | |
| + | == ReadNextBlock == |
| + | Takes a type-0x6 output buffer. Returns an output u32 '''Err'''. |
| + | |
| + | = nvdbg:d = |
| + | This is "nns::nvdrv::INvDrvDebugSvcServices". This was added with [10.0.0+]. |
| + | |
| + | This service has no commands. |
| + | |
| + | = 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 all known ioctls. |
| + | |
| + | == /dev/nvhost-ctrl == |
| + | {| class="wikitable" border="1" |
| + | ! Value || Direction || Size || Description |
| |- | | |- |
| | 0xC0080014 || Inout || 8 || [[#NVHOST_IOCTL_CTRL_SYNCPT_READ]] | | | 0xC0080014 || Inout || 8 || [[#NVHOST_IOCTL_CTRL_SYNCPT_READ]] |
Line 1,504: |
Line 1,558: |
| }; | | }; |
| | | |
− | == Channels ==
| + | = Channels = |
− | Channels are a concept for NVIDIA hardware blocks that share a common interface. | + | Channels are a concept for NVIDIA hardware blocks that share a common interface. |
| | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
Line 1,523: |
Line 1,577: |
| |} | | |} |
| | | |
− | == Channel Ioctls == | + | == Ioctls == |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| ! Value || Size || Description | | ! Value || Size || Description |
Line 1,942: |
Line 1,996: |
| }; | | }; |
| | | |
− | = nvmemp = | + | = NvDrvPermission = |
− | This is "nv::MemoryProfiler::IMemoryProfiler". | + | This is "nns::nvdrv::NvDrvPermission". |
− | | + | |
− | /dev/nvhost-ctrl sends the ioctl NVHOST_IOCTL_CTRL_GET_CONFIG to check the config "nv!NV_MEMORY_PROFILER". If config_str returns "1", the application attempts to use nvmemp.
| |
− | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| + | ! Bits |
| + | ! Name |
| + | ! Description |
| |- | | |- |
− | ! Cmd || Name
| + | | 0 |
| + | | Gpu |
| + | | Can access [[#Channels|/dev/nvhost-gpu]], [[#/dev/nvhost-ctrl-gpu|/dev/nvhost-ctrl-gpu]] and [[#/dev/nvhost-as-gpu|/dev/nvhost-as-gpu]]. |
| |- | | |- |
− | | 0 || Open | + | | 1 |
| + | | GpuDebug |
| + | | Can access [[#/dev/nvhost-dbg-gpu|/dev/nvhost-dbg-gpu]] and [[#/dev/nvhost-prof-gpu|/dev/nvhost-prof-gpu]]. |
| |- | | |- |
− | | 1 || GetPid | + | | 2 |
− | |} | + | | GpuSchedule |
− | | + | | Can access [[#/dev/nvsched-ctrl|/dev/nvsched-ctrl]]. |
− | = nvdrvdbg =
| |
− | This is "nns::nvdrv::INvDrvDebugFSServices".
| |
− | | |
− | {| class="wikitable" border="1"
| |
| |- | | |- |
− | ! Cmd || Name
| + | | 3 |
| + | | VIC |
| + | | Can access [[#Channels|/dev/nvhost-vic]]. |
| |- | | |- |
− | | 0 || [[#OpenDebugFS]] | + | | 4 |
| + | | VideoEncoder |
| + | | Can access [[#Channels|/dev/nvhost-msenc]]. |
| |- | | |- |
− | | 1 || [[#CloseDebugFS]] | + | | 5 |
| + | | VideoDecoder |
| + | | Can access [[#Channels|/dev/nvhost-nvdec]]. |
| |- | | |- |
− | | 2 || [[#GetDebugFSKeys]] | + | | 6 |
| + | | TSEC |
| + | | Can access [[#Channels|/dev/nvhost-tsec]]. |
| |- | | |- |
− | | 3 || GetDebugFSValue | + | | 7 |
| + | | JPEG |
| + | | Can access [[#Channels|/dev/nvhost-nvjpg]]. |
| |- | | |- |
− | | 4 || SetDebugFSValue | + | | 8 |
− | |} | + | | Display |
− | | + | | Can access [[#Channels|/dev/nvhost-display]], [[#/dev/nvcec-ctrl|/dev/nvcec-ctrl]], [[#/dev/nvhdcp_up-ctrl|/dev/nvhdcp_up-ctrl]], [[#/dev/nvdisp-ctrl|/dev/nvdisp-ctrl]], [[#/dev/nvdisp-disp0, /dev/nvdisp-disp1|/dev/nvdisp-disp0]], [[#/dev/nvdisp-disp0, /dev/nvdisp-disp1|/dev/nvdisp-disp1]], [[#/dev/nvdcutil-disp0, /dev/nvdcutil-disp1|/dev/nvdcutil-disp0]] and [[#/dev/nvdcutil-disp0, /dev/nvdcutil-disp1|/dev/nvdcutil-disp1]]. |
− | == OpenDebugFS ==
| |
− | Takes a process handle. Returns a u32 '''fd'''.
| |
− | | |
− | == CloseDebugFS ==
| |
− | Takes a u32 '''fd''' and closes it.
| |
− | | |
− | == GetDebugFSKeys ==
| |
− | Takes a u32 '''fd''' and reads debug contents into a type-6 buffer.
| |
− | | |
− | = nvgem:c =
| |
− | This is "nv::gemcontrol::INvGemControl".
| |
− | | |
− | {| class="wikitable" border="1"
| |
| |- | | |- |
− | ! Cmd || Name
| + | | 9 |
| + | | ImportMemory |
| + | | Can duplicate [[#/dev/nvmap|nvmap]] handles from other processes with [[#NVMAP_IOC_FROM_ID|NVMAP_IOC_FROM_ID]]. |
| |- | | |- |
− | | 0 || Initialize | + | | 10 |
| + | | NoCheckedAruid |
| + | | Can use [[#SetAruidWithoutCheck|SetAruidWithoutCheck]]. |
| |- | | |- |
− | | 1 || GetEventHandle | + | | 11 |
| + | | |
| + | | Can use [[#SetGraphicsFirmwareMemoryMarginEnabled|SetGraphicsFirmwareMemoryMarginEnabled]]. |
| |- | | |- |
− | | 2 || ControlNotification | + | | 12 |
| + | | |
| + | | Can duplicate exported [[#/dev/nvmap|nvmap]] handles from other processes with [[#NVMAP_IOC_FROM_ID|NVMAP_IOC_FROM_ID]]. |
| |- | | |- |
− | | 3 || SetNotificationPerm | + | | 13 |
| + | | |
| + | | |
| |- | | |- |
− | | 4 || SetCoreDumpPerm | + | | 14 |
| + | | |
| + | | Can use [[#NVMAP_IOC_EXPORT_FOR_ARUID|NVMAP_IOC_EXPORT_FOR_ARUID]] and [[#NVMAP_IOC_REMOVE_EXPORT_FOR_ARUID|NVMAP_IOC_REMOVE_EXPORT_FOR_ARUID]]. |
| |- | | |- |
− | | 5 || [1.0.0-4.1.0] GetAruid | + | | 15 |
− | |-
| + | | |
− | | 6 || Reset
| + | | |
− | |- | |
− | | 7 || [3.0.0+] | |
| |} | | |} |
| | | |
− | = nvgem:cd = | + | = NvError = |
− | This is "nv::gemcoredump::INvGemCoreDump". | + | This is "nns::nvdrv::NvError". |
| | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
− | ! Cmd || Name | + | ! Value || Name |
| |- | | |- |
− | | 0 || Initialize | + | | 0x0 || Success |
| |- | | |- |
− | | 1 || GetAruid | + | | 0x1 || NotImplemented |
| |- | | |- |
− | | 2 || [1.0.0-8.1.0] ReadNextBlock | + | | 0x2 || NotSupported |
| |- | | |- |
− | | 3 || [8.0.0+] | + | | 0x3 || NotInitialized |
| |- | | |- |
− | | 4 || [8.0.0+] | + | | 0x4 || BadParameter |
− | |}
| |
− | | |
− | = nvdbg:d =
| |
− | This is "nns::nvdrv::INvDrvDebugSvcServices". This was added with [10.0.0+].
| |
− | | |
− | This service has no commands.
| |
− | | |
− | = Errors =
| |
− | Most nvidia driver commands return an error code apart from the normal return code.
| |
− | | |
− | {| class="wikitable" border="1"
| |
| |- | | |- |
− | ! Value || Name
| + | | 0x5 || Timeout |
| |- | | |- |
− | | 0x0 || NvError_Success | + | | 0x6 || InsufficientMemory |
| |- | | |- |
− | | 0x1 || NvError_NotImplemented | + | | 0x7 || ReadOnlyAttribute |
| |- | | |- |
− | | 0x2 || NvError_NotSupported | + | | 0x8 || InvalidState |
| |- | | |- |
− | | 0x3 || NvError_NotInitialized | + | | 0x9 || InvalidAddress |
| |- | | |- |
− | | 0x4 || NvError_BadParameter | + | | 0xA || InvalidSize |
| |- | | |- |
− | | 0x5 || NvError_Timeout | + | | 0xB || BadValue |
| |- | | |- |
− | | 0x6 || NvError_InsufficientMemory | + | | 0xD || AlreadyAllocated |
| |- | | |- |
− | | 0x7 || NvError_ReadOnlyAttribute | + | | 0xE || Busy |
| |- | | |- |
− | | 0x8 || NvError_InvalidState | + | | 0xF || ResourceError |
| |- | | |- |
− | | 0x9 || NvError_InvalidAddress | + | | 0x10 || CountMismatch |
| |- | | |- |
− | | 0xA || NvError_InvalidSize | + | | 0x11 || OverFlow |
| |- | | |- |
− | | 0xB || NvError_BadValue | + | | 0x1000 || InsufficientTransferMemory |
| |- | | |- |
− | | 0xD || NvError_AlreadyAllocated | + | | 0x10000 || InsufficientVideoMemory |
| |- | | |- |
− | | 0xE || NvError_Busy | + | | 0x10001 || BadSurfaceColorScheme |
| |- | | |- |
− | | 0xF || NvError_ResourceError | + | | 0x10002 || InvalidSurface |
| |- | | |- |
− | | 0x10 || NvError_CountMismatch | + | | 0x10003 || SurfaceNotSupported |
| |- | | |- |
− | | 0x11 || NvError_OverFlow | + | | 0x20000 || DispInitFailed |
| |- | | |- |
− | | 0x1000 || NvError_InsufficientTransferMemory | + | | 0x20001 || DispAlreadyAttached |
| |- | | |- |
− | | 0x10000 || NvError_InsufficientVideoMemory | + | | 0x20002 || DispTooManyDisplays |
| |- | | |- |
− | | 0x10001 || NvError_BadSurfaceColorScheme | + | | 0x20003 || DispNoDisplaysAttached |
| |- | | |- |
− | | 0x10002 || NvError_InvalidSurface | + | | 0x20004 || DispModeNotSupported |
| |- | | |- |
− | | 0x10003 || NvError_SurfaceNotSupported | + | | 0x20005 || DispNotFound |
| |- | | |- |
− | | 0x20000 || NvError_DispInitFailed | + | | 0x20006 || DispAttachDissallowed |
| |- | | |- |
− | | 0x20001 || NvError_DispAlreadyAttached | + | | 0x20007 || DispTypeNotSupported |
| |- | | |- |
− | | 0x20002 || NvError_DispTooManyDisplays | + | | 0x20008 || DispAuthenticationFailed |
| |- | | |- |
− | | 0x20003 || NvError_DispNoDisplaysAttached | + | | 0x20009 || DispNotAttached |
| |- | | |- |
− | | 0x20004 || NvError_DispModeNotSupported | + | | 0x2000A || DispSamePwrState |
| |- | | |- |
− | | 0x20005 || NvError_DispNotFound | + | | 0x2000B || DispEdidFailure |
| |- | | |- |
− | | 0x20006 || NvError_DispAttachDissallowed | + | | 0x2000C || DispDsiReadAckError |
| |- | | |- |
− | | 0x20007 || NvError_DispTypeNotSupported | + | | 0x2000D || DispDsiReadInvalidResp |
| |- | | |- |
− | | 0x20008 || NvError_DispAuthenticationFailed | + | | 0x30000 || FileWriteFailed |
| |- | | |- |
− | | 0x20009 || NvError_DispNotAttached | + | | 0x30001 || FileReadFailed |
| |- | | |- |
− | | 0x2000A || NvError_DispSamePwrState | + | | 0x30002 || EndOfFile |
| |- | | |- |
− | | 0x2000B || NvError_DispEdidFailure | + | | 0x30003 || FileOperationFailed |
| |- | | |- |
− | | 0x2000C || NvError_DispDsiReadAckError | + | | 0x30004 || DirOperationFailed |
| |- | | |- |
− | | 0x2000D || NvError_DispDsiReadInvalidResp | + | | 0x30005 || EndOfDirList |
| |- | | |- |
− | | 0x30000 || NvError_FileWriteFailed | + | | 0x30006 || ConfigVarNotFound |
| |- | | |- |
− | | 0x30001 || NvError_FileReadFailed | + | | 0x30007 || InvalidConfigVar |
| |- | | |- |
− | | 0x30002 || NvError_EndOfFile | + | | 0x30008 || LibraryNotFound |
| |- | | |- |
− | | 0x30003 || NvError_FileOperationFailed | + | | 0x30009 || SymbolNotFound |
| |- | | |- |
− | | 0x30004 || NvError_DirOperationFailed | + | | 0x3000A || MemoryMapFailed |
| |- | | |- |
− | | 0x30005 || NvError_EndOfDirList | + | | 0x3000F || IoctlFailed |
| |- | | |- |
− | | 0x30006 || NvError_ConfigVarNotFound | + | | 0x30010 || AccessDenied |
| |- | | |- |
− | | 0x30007 || NvError_InvalidConfigVar | + | | 0x30011 || DeviceNotFound |
| |- | | |- |
− | | 0x30008 || NvError_LibraryNotFound | + | | 0x30012 || KernelDriverNotFound |
| |- | | |- |
− | | 0x30009 || NvError_SymbolNotFound | + | | 0x30013 || FileNotFound |
| |- | | |- |
− | | 0x3000A || NvError_MemoryMapFailed | + | | 0x30014 || PathAlreadyExists |
| |- | | |- |
− | | 0x3000F || NvError_IoctlFailed | + | | 0xA000E || ModuleNotPresent |
| + | |} |
| + | |
| + | = NvDrvStatus = |
| + | This is "nns::nvdrv::NvDrvStatus". |
| + | |
| + | {| class="wikitable" border="1" |
| |- | | |- |
− | | 0x30010 || NvError_AccessDenied
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| |- | | |- |
− | | 0x30011 || NvError_DeviceNotFound | + | | 0x0 |
| + | | 0x4 |
| + | | FreeSize |
| |- | | |- |
− | | 0x30012 || NvError_KernelDriverNotFound | + | | 0x4 |
| + | | 0x4 |
| + | | AllocatableSize |
| |- | | |- |
− | | 0x30013 || NvError_FileNotFound | + | | 0x8 |
| + | | 0x4 |
| + | | MinimumFreeSize |
| |- | | |- |
− | | 0x30014 || NvError_PathAlreadyExists | + | | 0xC |
| + | | 0x4 |
| + | | MinimumAllocatableSize |
| |- | | |- |
− | | 0xA000E || NvError_ModuleNotPresent | + | | 0x10 |
| + | | 0x10 |
| + | | Reserved |
| |} | | |} |
| | | |
− | = Panic = | + | = Notes = |
| In some cases, a panic may occur. NV forces a crash by doing: | | In some cases, a panic may occur. NV forces a crash by doing: |
| (void *)0 = 0xCAFE; | | (void *)0 = 0xCAFE; |
| End result is that the system hangs with a white-screen. | | End result is that the system hangs with a white-screen. |
| | | |
− | == Gpfifo Panic ==
| |
| When the gpfifo data in the gpu_va buffers specified by the submitted gpfifo entries is invalid(?), eventually the user-process will be force-terminated after using the submit-gpfifo ioctl. It's unknown how exactly this is done. | | When the gpfifo data in the gpu_va buffers specified by the submitted gpfifo entries is invalid(?), eventually the user-process will be force-terminated after using the submit-gpfifo ioctl. It's unknown how exactly this is done. |
| | | |
| [[Category:Services]] | | [[Category:Services]] |