diff --git a/nx/include/switch/nvidia/ioctl.h b/nx/include/switch/nvidia/ioctl.h index d9442c00..95d9b5c6 100644 --- a/nx/include/switch/nvidia/ioctl.h +++ b/nx/include/switch/nvidia/ioctl.h @@ -157,7 +157,9 @@ typedef struct { Result nvioctlNvhostCtrl_EventSignal(u32 fd, u32 event_id); Result nvioctlNvhostCtrl_EventWait(u32 fd, u32 syncpt_id, u32 threshold, s32 timeout, u32 event_id, u32 *out); +Result nvioctlNvhostCtrl_EventWaitAsync(u32 fd, u32 syncpt_id, u32 threshold, s32 timeout, u32 event_id); Result nvioctlNvhostCtrl_EventRegister(u32 fd, u32 event_id); +Result nvioctlNvhostCtrl_EventUnregister(u32 fd, u32 event_id); Result nvioctlNvhostCtrlGpu_ZCullGetCtxSize(u32 fd, u32 *out); Result nvioctlNvhostCtrlGpu_ZCullGetInfo(u32 fd, u32 out[40>>2]); diff --git a/nx/source/nvidia/ioctl/nvhost-ctrl.c b/nx/source/nvidia/ioctl/nvhost-ctrl.c index 8f4d7089..f5ec2f58 100644 --- a/nx/source/nvidia/ioctl/nvhost-ctrl.c +++ b/nx/source/nvidia/ioctl/nvhost-ctrl.c @@ -54,7 +54,8 @@ Result nvioctlNvhostCtrl_SyncptWait(u32 fd, u32 id, u32 threshold, u32 timeout) return nvIoctl(fd, _NV_IOWR(0x00, 0x16, data), &data); } -Result nvioctlNvhostCtrl_EventSignal(u32 fd, u32 event_id) { +Result nvioctlNvhostCtrl_EventSignal(u32 fd, u32 event_id) +{ struct { __nv_in u32 event_id; } data; @@ -90,7 +91,26 @@ Result nvioctlNvhostCtrl_EventWait(u32 fd, u32 syncpt_id, u32 threshold, s32 tim return rc; } -Result nvioctlNvhostCtrl_EventRegister(u32 fd, u32 event_id) { +Result nvioctlNvhostCtrl_EventWaitAsync(u32 fd, u32 syncpt_id, u32 threshold, s32 timeout, u32 event_id) +{ + struct { + __nv_in u32 syncpt_id; + __nv_in u32 threshold; + __nv_in s32 timeout; + __nv_in u32 event_id; + } data; + + memset(&data, 0, sizeof(data)); + data.syncpt_id = syncpt_id; + data.threshold = threshold; + data.timeout = timeout; + data.event_id = event_id; + + return nvIoctl(fd, _NV_IOWR(0x00, 0x1E, data), &data); +} + +Result nvioctlNvhostCtrl_EventRegister(u32 fd, u32 event_id) +{ struct { __nv_in u32 event_id; } data; @@ -98,5 +118,17 @@ Result nvioctlNvhostCtrl_EventRegister(u32 fd, u32 event_id) { memset(&data, 0, sizeof(data)); data.event_id = event_id; - return nvIoctl(fd, _NV_IOWR(0x40, 0x1F, data), &data); + return nvIoctl(fd, _NV_IOWR(0x00, 0x1F, data), &data); +} + +Result nvioctlNvhostCtrl_EventUnregister(u32 fd, u32 event_id) +{ + struct { + __nv_in u32 event_id; + } data; + + memset(&data, 0, sizeof(data)); + data.event_id = event_id; + + return nvIoctl(fd, _NV_IOWR(0x00, 0x20, data), &data); }