diff mbox series

[1/1] linux-user: Add drm ioctls for graphics drivers

Message ID 20230927175408.495872-2-tanxiongchuan@isrc.iscas.ac.cn
State New
Headers show
Series linux-user: Add drm ioctls for userland graphics drivers | expand

Commit Message

Xiongchuan Tan Sept. 27, 2023, 5:52 p.m. UTC
This patch adds more drm-related ioctls to support userland OpenGL and
Vulkan drivers.

Signed-off-by: Xiongchuan Tan <tanxiongchuan@isrc.iscas.ac.cn>
---
 linux-user/ioctls.h        | 26 +++++++++++++++
 linux-user/syscall_defs.h  | 15 ++++++++-
 linux-user/syscall_types.h | 68 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 108 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h
index 071f7ca253..e6b946ed26 100644
--- a/linux-user/ioctls.h
+++ b/linux-user/ioctls.h
@@ -685,6 +685,32 @@ 
 #ifdef HAVE_DRM_H
   IOCTL_SPECIAL(DRM_IOCTL_VERSION, IOC_RW, do_ioctl_drm,
                 MK_PTR(MK_STRUCT(STRUCT_drm_version)))
+  IOCTL(DRM_IOCTL_GET_MAGIC, IOC_R,
+        MK_PTR(MK_STRUCT(STRUCT_drm_auth)))
+  IOCTL(DRM_IOCTL_GET_CLIENT, IOC_RW,
+        MK_PTR(MK_STRUCT(STRUCT_drm_client)))
+  IOCTL(DRM_IOCTL_GEM_CLOSE, IOC_W,
+        MK_PTR(MK_STRUCT(STRUCT_drm_gem_close)))
+  IOCTL(DRM_IOCTL_GET_CAP, IOC_RW,
+        MK_PTR(MK_STRUCT(STRUCT_drm_get_cap)))
+  IOCTL(DRM_IOCTL_PRIME_HANDLE_TO_FD, IOC_RW,
+        MK_PTR(MK_STRUCT(STRUCT_drm_prime_handle)))
+  IOCTL(DRM_IOCTL_SYNCOBJ_CREATE, IOC_RW,
+        MK_PTR(MK_STRUCT(STRUCT_drm_syncobj_create)))
+  IOCTL(DRM_IOCTL_SYNCOBJ_DESTROY, IOC_RW,
+        MK_PTR(MK_STRUCT(STRUCT_drm_syncobj_destroy)))
+  IOCTL(DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD, IOC_RW,
+        MK_PTR(MK_STRUCT(STRUCT_drm_syncobj_handle)))
+  IOCTL(DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE, IOC_RW,
+        MK_PTR(MK_STRUCT(STRUCT_drm_syncobj_handle)))
+  IOCTL(DRM_IOCTL_SYNCOBJ_WAIT, IOC_RW,
+        MK_PTR(MK_STRUCT(STRUCT_drm_syncobj_wait)))
+  IOCTL(DRM_IOCTL_SYNCOBJ_RESET, IOC_RW,
+        MK_PTR(MK_STRUCT(STRUCT_drm_syncobj_array)))
+  IOCTL(DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT, IOC_RW,
+        MK_PTR(MK_STRUCT(STRUCT_drm_syncobj_timeline_wait)))
+  IOCTL(DRM_IOCTL_SYNCOBJ_TRANSFER, IOC_RW,
+        MK_PTR(MK_STRUCT(STRUCT_drm_syncobj_transfer)))
 
   IOCTL_SPECIAL(DRM_IOCTL_I915_GETPARAM, IOC_RW, do_ioctl_drm_i915,
                 MK_PTR(MK_STRUCT(STRUCT_drm_i915_getparam)))
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
index 77ba343c85..be92b5fa6f 100644
--- a/linux-user/syscall_defs.h
+++ b/linux-user/syscall_defs.h
@@ -1201,7 +1201,20 @@  struct target_rtc_pll_info {
 #define TARGET_DM_DEV_SET_GEOMETRY    TARGET_IOWRU(0xfd, 0x0f)
 
 /* drm ioctls */
-#define TARGET_DRM_IOCTL_VERSION      TARGET_IOWRU('d', 0x00)
+#define TARGET_DRM_IOCTL_VERSION               TARGET_IOWRU('d', 0x00)
+#define TARGET_DRM_IOCTL_GET_MAGIC             TARGET_IORU('d', 0x02)
+#define TARGET_DRM_IOCTL_GET_CLIENT            TARGET_IOWRU('d', 0x05)
+#define TARGET_DRM_IOCTL_GEM_CLOSE             TARGET_IOWU('d', 0x09)
+#define TARGET_DRM_IOCTL_GET_CAP               TARGET_IOWRU('d', 0x0c)
+#define TARGET_DRM_IOCTL_PRIME_HANDLE_TO_FD    TARGET_IOWRU('d', 0x2d)
+#define TARGET_DRM_IOCTL_SYNCOBJ_CREATE        TARGET_IOWRU('d', 0xbf)
+#define TARGET_DRM_IOCTL_SYNCOBJ_DESTROY       TARGET_IOWRU('d', 0xc0)
+#define TARGET_DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD  TARGET_IOWRU('d', 0xc1)
+#define TARGET_DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE  TARGET_IOWRU('d', 0xc2)
+#define TARGET_DRM_IOCTL_SYNCOBJ_WAIT          TARGET_IOWRU('d', 0xc3)
+#define TARGET_DRM_IOCTL_SYNCOBJ_RESET         TARGET_IOWRU('d', 0xc4)
+#define TARGET_DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT TARGET_IOWRU('d', 0xca)
+#define TARGET_DRM_IOCTL_SYNCOBJ_TRANSFER      TARGET_IOWRU('d', 0xcc)
 
 /* drm i915 ioctls */
 #define TARGET_DRM_IOCTL_I915_GETPARAM              TARGET_IOWRU('d', 0x46)
diff --git a/linux-user/syscall_types.h b/linux-user/syscall_types.h
index c3b43f8022..dcc1f14e11 100644
--- a/linux-user/syscall_types.h
+++ b/linux-user/syscall_types.h
@@ -331,6 +331,74 @@  STRUCT(drm_version,
        TYPE_ULONG, /* desc_len */
        TYPE_PTRVOID) /* desc */
 
+STRUCT(drm_auth,
+       TYPE_INT) /* magic */
+
+STRUCT(drm_client,
+       TYPE_INT, /* idx */
+       TYPE_INT, /* auth */
+       TYPE_ULONG, /* pid */
+       TYPE_ULONG, /* uid */
+       TYPE_ULONG, /* magic */
+       TYPE_ULONG) /* iocs */
+
+STRUCT(drm_gem_close,
+       TYPE_INT, /* handle */
+       TYPE_INT) /* pad */
+
+STRUCT(drm_get_cap,
+       TYPE_ULONGLONG, /* capability */
+       TYPE_ULONGLONG) /* value */
+
+STRUCT(drm_prime_handle,
+       TYPE_INT, /* handle */
+       TYPE_INT, /* flags */
+       TYPE_INT) /* fd */
+
+STRUCT(drm_syncobj_create,
+       TYPE_INT, /* handle */
+       TYPE_INT) /* flags */
+
+STRUCT(drm_syncobj_destroy,
+       TYPE_INT, /* handle */
+       TYPE_INT) /* pad */
+
+STRUCT(drm_syncobj_handle,
+       TYPE_INT, /* handle */
+       TYPE_INT, /* flags */
+       TYPE_INT, /* fd */
+       TYPE_INT) /* pad */
+
+STRUCT(drm_syncobj_transfer,
+       TYPE_INT, /* src_handle */
+       TYPE_INT, /* dst_handle */
+       TYPE_ULONGLONG, /* src_point */
+       TYPE_ULONGLONG, /* dst_point */
+       TYPE_INT, /* flags */
+       TYPE_INT) /* pad */
+
+STRUCT(drm_syncobj_wait,
+       TYPE_ULONGLONG, /* handles */
+       TYPE_LONGLONG, /* timeout_nsec */
+       TYPE_INT, /* count_handles */
+       TYPE_INT, /* flags */
+       TYPE_INT, /* first_signaled */
+       TYPE_INT) /* pad */
+
+STRUCT(drm_syncobj_timeline_wait,
+       TYPE_ULONGLONG, /* handles */
+       TYPE_ULONGLONG, /* points */
+       TYPE_LONGLONG, /* timeout_nsec */
+       TYPE_INT, /* count_handles */
+       TYPE_INT, /* flags */
+       TYPE_INT, /* first_signaled */
+       TYPE_INT) /* pad */
+
+STRUCT(drm_syncobj_array,
+       TYPE_ULONGLONG, /* handles */
+       TYPE_INT, /* count_handles */
+       TYPE_INT) /* pad */
+
 STRUCT(drm_i915_getparam,
        TYPE_INT, /* param */
        TYPE_PTRVOID) /* value */