From 4bd1d3313c06bf76b4e92ea08da52d9b08a231bf Mon Sep 17 00:00:00 2001
From: plutooo <plutooo@users.noreply.github.com>
Date: Mon, 26 Feb 2018 22:16:18 +0100
Subject: [PATCH] Fix nvgfx, add nvinfo

---
 nx/include/switch.h             |  1 +
 nx/include/switch/nvidia/info.h |  6 ++++++
 nx/source/display/gfx.c         |  4 ++--
 nx/source/display/nvgfx.c       | 15 ++++---------
 nx/source/nvidia/info.c         | 38 +++++++++++++++++++++++++++++++++
 5 files changed, 51 insertions(+), 13 deletions(-)
 create mode 100644 nx/include/switch/nvidia/info.h
 create mode 100644 nx/source/nvidia/info.c

diff --git a/nx/include/switch.h b/nx/include/switch.h
index 28a750df..af60b40e 100644
--- a/nx/include/switch.h
+++ b/nx/include/switch.h
@@ -75,6 +75,7 @@ extern "C" {
 #include "switch/nvidia/buffer.h"
 #include "switch/nvidia/address_space.h"
 #include "switch/nvidia/channel.h"
+#include "switch/nvidia/info.h"
 #include "switch/nvidia/gpu/gpu.h"
 
 #include "switch/audio/driver.h"
diff --git a/nx/include/switch/nvidia/info.h b/nx/include/switch/nvidia/info.h
new file mode 100644
index 00000000..4106500d
--- /dev/null
+++ b/nx/include/switch/nvidia/info.h
@@ -0,0 +1,6 @@
+#pragma once
+
+Result nvinfoInit();
+void nvinfoExit();
+
+u32 nvinfoGetZcullCtxSize();
diff --git a/nx/source/display/gfx.c b/nx/source/display/gfx.c
index 2235ad80..77f25011 100644
--- a/nx/source/display/gfx.c
+++ b/nx/source/display/gfx.c
@@ -96,12 +96,12 @@ static BqGraphicBuffer g_gfx_BufferInitData = {
         .unk_x8 = 0x0,
         .unk_xc = 0xdaffcaff,
         .unk_x10 = 0x2a,
-        .unk_x14 = 0x0,
+        .unk_x14 = 0,
         .unk_x18 = 0xb00,
         .unk_x1c = 0x1,
         .unk_x20 = 0x1,
         .unk_x2c = 0x1,
-        .unk_x30 = 0x0,
+        .unk_x30 = 0,
         .flags = 0x532120,
         .unk_x40 = 0x1,
         .unk_x44 = 0x3,
diff --git a/nx/source/display/nvgfx.c b/nx/source/display/nvgfx.c
index 45dcdc48..405f1ca5 100644
--- a/nx/source/display/nvgfx.c
+++ b/nx/source/display/nvgfx.c
@@ -22,11 +22,9 @@ static u32 g_nvgfx_fd_nvhostctrlgpu;
 static u32 g_nvgfx_fd_nvhostasgpu;
 static u32 g_nvgfx_fd_nvmap;
 static u32 g_nvgfx_fd_nvhostgpu;
+static u32 g_nvgfx_fd_nvhostctrl;
 
 static nvioctl_gpu_characteristics g_nvgfx_gpu_characteristics;
-static u64 g_nvgfx_nvhostasgpu_allocspace_offset;
-static u32 g_nvgfx_zcullctxsize;
-static u32 g_nvgfx_zcullinfo[40>>2];
 static nvioctl_fence g_nvgfx_nvhost_fence;
 
 u32 g_nvgfx_totalframebufs = 0;
@@ -106,10 +104,7 @@ Result nvgfxInitialize(void) {
     memset(nvmap_objs, 0, sizeof(nvmap_objs));
 
     memset(&g_nvgfx_gpu_characteristics, 0, sizeof(nvioctl_gpu_characteristics));
-    memset(g_nvgfx_zcullinfo, 0, sizeof(g_nvgfx_zcullinfo));
     memset(&g_nvgfx_nvhost_fence, 0, sizeof(g_nvgfx_nvhost_fence));
-    g_nvgfx_nvhostasgpu_allocspace_offset = 0;
-    g_nvgfx_zcullctxsize = 0;
     nvmap_obj4_mapbuffer_x0_offset = 0;
     nvmap_obj6_mapbuffer_xdb_offset = 0;
 
@@ -123,13 +118,10 @@ Result nvgfxInitialize(void) {
 
     if (R_SUCCEEDED(rc)) rc = nvioctlNvhostCtrlGpu_GetCharacteristics(g_nvgfx_fd_nvhostctrlgpu, &g_nvgfx_gpu_characteristics);
 
-    if (R_SUCCEEDED(rc)) rc = nvioctlNvhostCtrlGpu_ZCullGetCtxSize(g_nvgfx_fd_nvhostctrlgpu, &g_nvgfx_zcullctxsize);
-    if (R_SUCCEEDED(rc)) rc = nvioctlNvhostCtrlGpu_ZCullGetInfo(g_nvgfx_fd_nvhostctrlgpu, g_nvgfx_zcullinfo);
-
     if (R_SUCCEEDED(rc)) rc = nvOpen(&g_nvgfx_fd_nvhostasgpu, "/dev/nvhost-as-gpu");
 
     if (R_SUCCEEDED(rc)) rc = nvioctlNvhostAsGpu_InitializeEx(g_nvgfx_fd_nvhostasgpu, 1, /*0*/0x10000);
-    if (R_SUCCEEDED(rc)) rc = nvioctlNvhostAsGpu_AllocSpace(g_nvgfx_fd_nvhostasgpu, 0x10000, /*0x20000*/0x10000, 0, 0x10000, &g_nvgfx_nvhostasgpu_allocspace_offset);
+    if (R_SUCCEEDED(rc)) rc = nvioctlNvhostAsGpu_AllocSpace(g_nvgfx_fd_nvhostasgpu, 0x10000, /*0x20000*/0x10000, 0, 0x10000, NULL);
     if (R_SUCCEEDED(rc)) rc = nvOpen(&g_nvgfx_fd_nvmap, "/dev/nvmap");
     if (R_SUCCEEDED(rc)) rc = nvOpen(&g_nvgfx_fd_nvhostgpu, "/dev/nvhost-gpu");
 
@@ -151,6 +143,7 @@ Result nvgfxInitialize(void) {
     if (R_SUCCEEDED(rc)) rc = nvioctlNvhostAsGpu_MapBufferEx(g_nvgfx_fd_nvhostasgpu, 4, 0, nvmap_objs[6].handle, 0x10000, 0, 0, 0, NULL);
     if (R_SUCCEEDED(rc)) rc = nvioctlNvhostAsGpu_MapBufferEx(g_nvgfx_fd_nvhostasgpu, 4, 0xfe, nvmap_objs[6].handle, 0x10000, 0, 0, 0, NULL);
     if (R_SUCCEEDED(rc)) rc = nvioctlNvhostAsGpu_MapBufferEx(g_nvgfx_fd_nvhostasgpu, 4, 0xdb, nvmap_objs[6].handle, 0x10000, 0, 0, 0, &nvmap_obj6_mapbuffer_xdb_offset);
+    if (R_SUCCEEDED(rc)) rc = nvOpen(&g_nvgfx_fd_nvhostctrl, "/dev/nvhost-ctrl");
 
     if (R_SUCCEEDED(rc))
     {
@@ -232,7 +225,7 @@ Result nvgfxEventWait(u32 syncpt_id, u32 threshold, s32 timeout)
     Result rc;
 
     do {
-        int event_res;
+        u32 event_res;
         rc = nvioctlNvhostCtrl_EventWait(g_nvgfx_fd_nvhostctrl, syncpt_id, threshold, timeout, 0, &event_res);
     } while (rc == MAKERESULT(Module_LibnxNvidia, LibnxNvidiaError_Timeout)); // todo: Fix timeout error
 
diff --git a/nx/source/nvidia/info.c b/nx/source/nvidia/info.c
new file mode 100644
index 00000000..e721a2f0
--- /dev/null
+++ b/nx/source/nvidia/info.c
@@ -0,0 +1,38 @@
+#include <switch.h>
+
+static u32 g_ctrlgpu_fd = -1;
+static nvioctl_gpu_characteristics g_gpu_characteristics;
+static u32 g_zcull_ctx_size;
+
+Result nvinfoInit()
+{
+    Result rc;
+
+    rc = nvOpen(&g_ctrlgpu_fd, "/dev/nvhost-ctrl-gpu");
+
+    if (R_FAILED(rc))
+        g_ctrlgpu_fd = -1;
+
+    if (R_SUCCEEDED(rc))
+        rc = nvioctlNvhostCtrlGpu_GetCharacteristics(g_ctrlgpu_fd, &g_gpu_characteristics);
+
+    if (R_SUCCEEDED(rc))
+        rc = nvioctlNvhostCtrlGpu_ZCullGetCtxSize(g_ctrlgpu_fd, &g_zcull_ctx_size);
+
+    if (R_FAILED(rc))
+        nvinfoExit();
+
+    return rc;
+}
+
+void nvinfoExit()
+{
+    if (g_ctrlgpu_fd != -1)
+        nvClose(g_ctrlgpu_fd);
+
+    g_ctrlgpu_fd = -1;
+}
+
+u32 nvinfoGetZcullCtxSize() {
+    return g_zcull_ctx_size;
+}