NV services: Difference between revisions
m Detail remap_op flags |
No edit summary |
||
Line 1: | Line 1: | ||
= nvdrv, nvdrv:a, nvdrv:s, nvdrv:t = | = nvdrv, nvdrv:a, nvdrv:s, nvdrv:t = | ||
This is "nns::nvdrv::INvDrvServices". | This is "nns::nvdrv::INvDrvServices". | ||
Each service is used by: | Each service is used by: | ||
* "nvdrv": Applications. | * "nvdrv": Applications. | ||
** [[# | ** [[#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. | ||
** [[# | ** [[#NvDrvPermission|Permission]] mask is [3.0.0+] 0x10A9 ([1.0.0-2.3.0] 0xA9). | ||
* "nvdrv:s": Sysmodules. | * "nvdrv:s": Sysmodules. | ||
** [[# | ** [[#NvDrvPermission|Permission]] mask is [3.0.0+] 0x439E ([1.0.0-2.3.0] 0x39E). | ||
* "nvdrv:t": Factory. | * "nvdrv:t": Factory. | ||
** [[# | ** [[#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 | Takes a type-0x5 input buffer '''Path'''. Returns two output u32s '''FdOut''' and '''Err'''. | ||
== Ioctl == | == Ioctl == | ||
Takes | 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 | Takes an input u32 '''Fd'''. Returns an output u32 '''Err'''. | ||
== Initialize == | == Initialize == | ||
Takes | Takes an input Process handle, an input TransferMemory handle and an input u32 '''Size'''. Returns an output u32 '''Err'''. | ||
Webkit applet creates the | Webkit applet creates the TransferMemory with perm == 0 and size == 0x300000. | ||
== QueryEvent == | == QueryEvent == | ||
Takes two input u32s | 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 | 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 | Takes no input. Returns an output [[#NvDrvStatus]] and an output u32 '''Err'''. | ||
== SetAruidWithoutCheck == | == SetAruidWithoutCheck == | ||
Takes an input u64 | 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 | Takes a PID-descriptor and an input [[Applet_Manager_services#AppletResourceUserId|AppletResourceUserId]]. Returns an output u32 '''Err'''. | ||
== DumpStatus == | == DumpStatus == | ||
No input | No input/output. | ||
== InitializeDevtools == | == InitializeDevtools == | ||
Takes | Takes an input TransferMemory handle and an input u32 '''Size'''. Returns an output u32 '''Err'''. | ||
== Ioctl2 == | == Ioctl2 == | ||
Takes | 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 | Takes two input u32s '''Fd''' and '''Iocode''', a type-0x21 input buffer and two type-0x22 output buffers. Returns an output u32 '''Err'''. | ||
== 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). | ||
[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". | |||
/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" | ||
|- | |- | ||
| | ! Cmd || Name | ||
| | |||
|- | |- | ||
| | | 0 || [[#Open_2|Open]] | ||
| | |||
| | |||
|- | |- | ||
| | | 1 || [[#GetPid|GetPid]] | ||
| | |} | ||
| | |||
== 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" | |||
|- | |- | ||
| | ! Cmd || Name | ||
| | |||
|- | |- | ||
| | | 0 || [[#DebugFSOpen]] | ||
| | |- | ||
| | | 1 || [[#DebugFSClose]] | ||
|- | |- | ||
| | | 2 || [[#GetDebugFSKeys]] | ||
| | |||
| | |||
|- | |- | ||
| | | 3 || [[#GetDebugFSValue]] | ||
| | |||
| | |||
|- | |- | ||
| | | 4 || [[#SetDebugFSValue]] | ||
| | |} | ||
| | |||
== 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" | |||
|- | |- | ||
| | ! Cmd || Name | ||
| | |||
|- | |- | ||
| | | 0 || [[#Initialize_2|Initialize]] | ||
| | |||
| | |||
|- | |- | ||
| | | 1 || [[#GetEventHandle|GetEventHandle]] | ||
| | |||
| | |||
|- | |- | ||
| | | 2 || [[#ControlNotification|ControlNotification]] | ||
| | |- | ||
| | | 3 || [[#SetNotificationPerm|SetNotificationPerm]] | ||
|- | |- | ||
| | | 4 || [[#SetCoreDumpPerm|SetCoreDumpPerm]] | ||
| | |||
| | |||
|- | |- | ||
| | | 5 || [1.0.0-4.1.0] [[#GetAruid|GetAruid]] | ||
| | |||
| | |||
|- | |- | ||
| | | 6 || [[#Reset|Reset]] | ||
| | |||
| | |||
|- | |- | ||
| | | 7 || [3.0.0+] | ||
| | |||
| | |||
|} | |} | ||
== 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'''. | |||
= | == GetAruid == | ||
No input. Returns an output u64 '''Aruid''' and an output u32 '''Err'''. | |||
== Reset == | |||
No input. Returns an output u32 '''Err'''. | |||
= nvgem:cd = | |||
This is "nv::gemcoredump::INvGemCoreDump". | |||
{| 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 are a concept for | 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: | ||
|} | |} | ||
== | == Ioctls == | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
! Value || Size || Description | ! Value || Size || Description | ||
Line 1,942: | Line 1,996: | ||
}; | }; | ||
= | = NvDrvPermission = | ||
This is " | This is "nns::nvdrv::NvDrvPermission". | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
! Bits | |||
! Name | |||
! Description | |||
|- | |- | ||
| 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]]. | |||
|- | |- | ||
| | | 1 | ||
| GpuDebug | |||
| Can access [[#/dev/nvhost-dbg-gpu|/dev/nvhost-dbg-gpu]] and [[#/dev/nvhost-prof-gpu|/dev/nvhost-prof-gpu]]. | |||
|- | |- | ||
| | | 2 | ||
| | | GpuSchedule | ||
| Can access [[#/dev/nvsched-ctrl|/dev/nvsched-ctrl]]. | |||
|- | |- | ||
| 3 | |||
| VIC | |||
| Can access [[#Channels|/dev/nvhost-vic]]. | |||
|- | |- | ||
| | | 4 | ||
| VideoEncoder | |||
| Can access [[#Channels|/dev/nvhost-msenc]]. | |||
|- | |- | ||
| | | 5 | ||
| VideoDecoder | |||
| Can access [[#Channels|/dev/nvhost-nvdec]]. | |||
|- | |- | ||
| | | 6 | ||
| TSEC | |||
| Can access [[#Channels|/dev/nvhost-tsec]]. | |||
|- | |- | ||
| | | 7 | ||
| JPEG | |||
| Can access [[#Channels|/dev/nvhost-nvjpg]]. | |||
|- | |- | ||
| | | 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]]. | |||
|- | |- | ||
| 9 | |||
| ImportMemory | |||
| Can duplicate [[#/dev/nvmap|nvmap]] handles from other processes with [[#NVMAP_IOC_FROM_ID|NVMAP_IOC_FROM_ID]]. | |||
|- | |- | ||
| | | 10 | ||
| NoCheckedAruid | |||
| Can use [[#SetAruidWithoutCheck|SetAruidWithoutCheck]]. | |||
|- | |- | ||
| | | 11 | ||
| | |||
| Can use [[#SetGraphicsFirmwareMemoryMarginEnabled|SetGraphicsFirmwareMemoryMarginEnabled]]. | |||
|- | |- | ||
| | | 12 | ||
| | |||
| Can duplicate exported [[#/dev/nvmap|nvmap]] handles from other processes with [[#NVMAP_IOC_FROM_ID|NVMAP_IOC_FROM_ID]]. | |||
|- | |- | ||
| | | 13 | ||
| | |||
| | |||
|- | |- | ||
| | | 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]]. | |||
|- | |- | ||
| | | 15 | ||
| | |||
| | |||
| | |||
| | |||
|} | |} | ||
= | = NvError = | ||
This is " | This is "nns::nvdrv::NvError". | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! | ! Value || Name | ||
|- | |- | ||
| | | 0x0 || Success | ||
|- | |- | ||
| | | 0x1 || NotImplemented | ||
|- | |- | ||
| | | 0x2 || NotSupported | ||
|- | |- | ||
| | | 0x3 || NotInitialized | ||
|- | |- | ||
| | | 0x4 || BadParameter | ||
|- | |- | ||
| 0x5 || Timeout | |||
|- | |- | ||
| | | 0x6 || InsufficientMemory | ||
|- | |- | ||
| | | 0x7 || ReadOnlyAttribute | ||
|- | |- | ||
| | | 0x8 || InvalidState | ||
|- | |- | ||
| | | 0x9 || InvalidAddress | ||
|- | |- | ||
| | | 0xA || InvalidSize | ||
|- | |- | ||
| | | 0xB || BadValue | ||
|- | |- | ||
| | | 0xD || AlreadyAllocated | ||
|- | |- | ||
| | | 0xE || Busy | ||
|- | |- | ||
| | | 0xF || ResourceError | ||
|- | |- | ||
| | | 0x10 || CountMismatch | ||
|- | |- | ||
| | | 0x11 || OverFlow | ||
|- | |- | ||
| | | 0x1000 || InsufficientTransferMemory | ||
|- | |- | ||
| | | 0x10000 || InsufficientVideoMemory | ||
|- | |- | ||
| | | 0x10001 || BadSurfaceColorScheme | ||
|- | |- | ||
| | | 0x10002 || InvalidSurface | ||
|- | |- | ||
| | | 0x10003 || SurfaceNotSupported | ||
|- | |- | ||
| | | 0x20000 || DispInitFailed | ||
|- | |- | ||
| | | 0x20001 || DispAlreadyAttached | ||
|- | |- | ||
| | | 0x20002 || DispTooManyDisplays | ||
|- | |- | ||
| | | 0x20003 || DispNoDisplaysAttached | ||
|- | |- | ||
| | | 0x20004 || DispModeNotSupported | ||
|- | |- | ||
| | | 0x20005 || DispNotFound | ||
|- | |- | ||
| | | 0x20006 || DispAttachDissallowed | ||
|- | |- | ||
| | | 0x20007 || DispTypeNotSupported | ||
|- | |- | ||
| | | 0x20008 || DispAuthenticationFailed | ||
|- | |- | ||
| | | 0x20009 || DispNotAttached | ||
|- | |- | ||
| | | 0x2000A || DispSamePwrState | ||
|- | |- | ||
| | | 0x2000B || DispEdidFailure | ||
|- | |- | ||
| | | 0x2000C || DispDsiReadAckError | ||
|- | |- | ||
| | | 0x2000D || DispDsiReadInvalidResp | ||
|- | |- | ||
| | | 0x30000 || FileWriteFailed | ||
|- | |- | ||
| | | 0x30001 || FileReadFailed | ||
|- | |- | ||
| | | 0x30002 || EndOfFile | ||
|- | |- | ||
| | | 0x30003 || FileOperationFailed | ||
|- | |- | ||
| | | 0x30004 || DirOperationFailed | ||
|- | |- | ||
| | | 0x30005 || EndOfDirList | ||
|- | |- | ||
| | | 0x30006 || ConfigVarNotFound | ||
|- | |- | ||
| | | 0x30007 || InvalidConfigVar | ||
|- | |- | ||
| | | 0x30008 || LibraryNotFound | ||
|- | |- | ||
| | | 0x30009 || SymbolNotFound | ||
|- | |- | ||
| | | 0x3000A || MemoryMapFailed | ||
|- | |- | ||
| | | 0x3000F || IoctlFailed | ||
|- | |- | ||
| | | 0x30010 || AccessDenied | ||
|- | |- | ||
| | | 0x30011 || DeviceNotFound | ||
|- | |- | ||
| | | 0x30012 || KernelDriverNotFound | ||
|- | |- | ||
| | | 0x30013 || FileNotFound | ||
|- | |- | ||
| | | 0x30014 || PathAlreadyExists | ||
|- | |- | ||
| | | 0xA000E || ModuleNotPresent | ||
|} | |||
= NvDrvStatus = | |||
This is "nns::nvdrv::NvDrvStatus". | |||
{| class="wikitable" border="1" | |||
|- | |- | ||
! Offset | |||
! Size | |||
! Description | |||
|- | |- | ||
| | | 0x0 | ||
| 0x4 | |||
| FreeSize | |||
|- | |- | ||
| | | 0x4 | ||
| 0x4 | |||
| AllocatableSize | |||
|- | |- | ||
| | | 0x8 | ||
| 0x4 | |||
| MinimumFreeSize | |||
|- | |- | ||
| | | 0xC | ||
| 0x4 | |||
| MinimumAllocatableSize | |||
|- | |- | ||
| | | 0x10 | ||
| 0x10 | |||
| Reserved | |||
|} | |} | ||
= | = 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. | ||
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]] |