diff --git a/nx/include/switch/gfx/nvioctl.h b/nx/include/switch/gfx/nvioctl.h index c31b24db..9e5a9ca2 100644 --- a/nx/include/switch/gfx/nvioctl.h +++ b/nx/include/switch/gfx/nvioctl.h @@ -43,10 +43,16 @@ typedef struct { u64 pages; } nvioctl_va_region; +typedef struct { + u32 mask; // always 0x07 + u32 flush; // active flush bit field +} nvioctl_l2_state; + Result nvioctlNvhostCtrlGpu_ZCullGetCtxSize(u32 fd, u32 *out); Result nvioctlNvhostCtrlGpu_ZCullGetInfo(u32 fd, u32 out[40>>2]); Result nvioctlNvhostCtrlGpu_GetCharacteristics(u32 fd, gpu_characteristics *out); Result nvioctlNvhostCtrlGpu_GetTpcMasks(u32 fd, u32 inval, u32 out[24>>2]); +Result nvioctlNvhostCtrlGpu_GetL2State(u32 fd, nvioctl_l2_state *out); Result nvioctlNvhostAsGpu_AllocSpace(u32 fd, u32 pages, u32 page_size, u32 flags, u64 align, u64 *offset); Result nvioctlNvhostAsGpu_MapBufferEx(u32 fd, u32 flags, u32 kind, u32 nvmap_handle, u32 page_size, u64 buffer_offset, u64 mapping_size, u64 input_offset, u64 *offset); diff --git a/nx/source/gfx/nvgfx.c b/nx/source/gfx/nvgfx.c index c3be2e95..5c835749 100644 --- a/nx/source/gfx/nvgfx.c +++ b/nx/source/gfx/nvgfx.c @@ -14,6 +14,7 @@ static u32 g_nvgfx_tpcmasks[24>>2]; static u32 g_nvgfx_zcullctxsize; static u32 g_nvgfx_zcullinfo[40>>2]; static nvioctl_va_region g_nvgfx_nvhostasgpu_varegions[2]; +static nvioctl_l2_state g_nvgfx_l2state; static u8 *g_nvgfx_nvmap0_mem, *g_nvgfx_nvmap1_mem; size_t g_nvgfx_nvmap0_mem_size, g_nvgfx_nvmap1_mem_size; @@ -34,6 +35,7 @@ Result nvgfxInitialize(void) { memset(g_nvgfx_tpcmasks, 0, sizeof(g_nvgfx_tpcmasks)); memset(g_nvgfx_zcullinfo, 0, sizeof(g_nvgfx_zcullinfo)); memset(g_nvgfx_nvhostasgpu_varegions, 0, sizeof(g_nvgfx_nvhostasgpu_varegions)); + memset(&g_nvgfx_l2state, 0, sizeof(nvioctl_l2_state)); g_nvgfx_nvhostasgpu_allocspace_offset = 0; g_nvgfx_zcullctxsize = 0; @@ -85,9 +87,9 @@ Result nvgfxInitialize(void) { if (R_SUCCEEDED(rc)) rc = nvioctlNvhostAsGpu_MapBufferEx(g_nvgfx_fd_nvhostasgpu, 5, 0, g_nvgfx_nvmapobj1, 0x10000, 0, 0x10000, g_nvgfx_nvhostasgpu_allocspace_offset, NULL); if (R_SUCCEEDED(rc)) rc = nvioctlNvhostAsGpu_MapBufferEx(g_nvgfx_fd_nvhostasgpu, 4, 0xfe, g_nvgfx_nvmapobj1, 0x10000, 0, 0, 0, NULL); - //if (R_SUCCEEDED(rc)) rc = -1; - //Officially NVGPU_GPU_IOCTL_GET_L2_STATE is used here. + if (R_SUCCEEDED(rc)) rc = nvioctlNvhostCtrlGpu_GetL2State(g_nvgfx_fd_nvhostctrlgpu, &g_nvgfx_l2state); + //if (R_SUCCEEDED(rc)) rc = -1; if (R_FAILED(rc)) { nvClose(g_nvgfx_fd_nvmap); diff --git a/nx/source/gfx/nvioctl.c b/nx/source/gfx/nvioctl.c index 4b1557d7..8e5c30a0 100644 --- a/nx/source/gfx/nvioctl.c +++ b/nx/source/gfx/nvioctl.c @@ -75,6 +75,23 @@ Result nvioctlNvhostCtrlGpu_GetTpcMasks(u32 fd, u32 inval, u32 out[24>>2]) { return rc; } +Result nvioctlNvhostCtrlGpu_GetL2State(u32 fd, nvioctl_l2_state *out) { + Result rc = 0; + + struct { + nvioctl_l2_state out; + } data; + + memset(&data, 0, sizeof(data)); + + rc = nvIoctl(fd, _IOR(0x47, 0x14, data), &data); + if (R_FAILED(rc)) return rc; + + memcpy(out, &data.out, sizeof(data.out)); + + return rc; +} + Result nvioctlNvhostAsGpu_AllocSpace(u32 fd, u32 pages, u32 page_size, u32 flags, u64 align, u64 *offset) { Result rc=0;