nv: Added __nx_nv_service_type. Closes #633.

This commit is contained in:
yellows8 2023-11-20 14:12:52 -05:00
parent a215ae2da2
commit 8d10ef8745
No known key found for this signature in database
GPG Key ID: 0AF90DA3F1E60E43
2 changed files with 48 additions and 15 deletions

View File

@ -9,6 +9,15 @@
#include "../sf/service.h"
#include "../kernel/event.h"
/// NvServiceType, for __nx_nv_service_type.
typedef enum {
NvServiceType_Auto = -1, ///< This is the default. Automatically select the type using \ref appletGetAppletType.
NvServiceType_Application = 0, ///< Initializes nvdrv.
NvServiceType_Applet = 1, ///< Initializes nvdrv:a.
NvServiceType_System = 2, ///< Initializes nvdrv:s.
NvServiceType_Factory = 3, ///< Initializes nvdrv:t.
} NvServiceType;
/// Initialize nvdrv*.
Result nvInitialize(void);

View File

@ -7,6 +7,7 @@
#include "services/nv.h"
#include "nvidia/ioctl.h"
__attribute__((weak)) NvServiceType __nx_nv_service_type = NvServiceType_Auto;
__attribute__((weak)) u32 __nx_nv_transfermem_size = 0x800000;
static Service g_nvSrv;
@ -27,23 +28,46 @@ NX_GENERATE_SERVICE_GUARD(nv);
Result _nvInitialize(void) {
Result rc = MAKERESULT(Module_Libnx, LibnxError_BadInput);
if (__nx_nv_service_type == NvServiceType_Auto) {
switch (appletGetAppletType()) {
case AppletType_None:
rc = smGetService(&g_nvSrv, "nvdrv:s");
__nx_nv_service_type = NvServiceType_System;
break;
case AppletType_Default:
case AppletType_Application:
case AppletType_SystemApplication:
default:
rc = smGetService(&g_nvSrv, "nvdrv");
__nx_nv_service_type = NvServiceType_Application;
break;
case AppletType_SystemApplet:
case AppletType_LibraryApplet:
case AppletType_OverlayApplet:
__nx_nv_service_type = NvServiceType_Applet;
break;
}
}
switch (__nx_nv_service_type) {
case NvServiceType_Application:
rc = smGetService(&g_nvSrv, "nvdrv");
break;
case NvServiceType_Applet:
rc = smGetService(&g_nvSrv, "nvdrv:a");
break;
case NvServiceType_System:
rc = smGetService(&g_nvSrv, "nvdrv:s");
break;
case NvServiceType_Factory:
rc = smGetService(&g_nvSrv, "nvdrv:t");
break;
default:
break; // Leave rc at the error set above.
}
if (R_SUCCEEDED(rc)) {