Skip to content

Commit

Permalink
nv: Added __nx_nv_service_type. Closes #633.
Browse files Browse the repository at this point in the history
  • Loading branch information
yellows8 committed Nov 20, 2023
1 parent a215ae2 commit 8d10ef8
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 17 deletions.
9 changes: 9 additions & 0 deletions nx/include/switch/services/nv.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
58 changes: 41 additions & 17 deletions nx/source/services/nv.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -27,23 +28,46 @@ NX_GENERATE_SERVICE_GUARD(nv);
Result _nvInitialize(void) {
Result rc = MAKERESULT(Module_Libnx, LibnxError_BadInput);

switch (appletGetAppletType()) {
case AppletType_None:
rc = smGetService(&g_nvSrv, "nvdrv:s");
break;

case AppletType_Default:
case AppletType_Application:
case AppletType_SystemApplication:
default:
rc = smGetService(&g_nvSrv, "nvdrv");
break;

case AppletType_SystemApplet:
case AppletType_LibraryApplet:
case AppletType_OverlayApplet:
rc = smGetService(&g_nvSrv, "nvdrv:a");
break;
if (__nx_nv_service_type == NvServiceType_Auto) {
switch (appletGetAppletType()) {
case AppletType_None:
__nx_nv_service_type = NvServiceType_System;
break;

case AppletType_Default:
case AppletType_Application:
case AppletType_SystemApplication:
default:
__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)) {
Expand Down

0 comments on commit 8d10ef8

Please sign in to comment.