<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <p><br>
    </p>
    <div class="moz-cite-prefix">On 2025-03-28 04:23, Sunil Khatri
      wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:20250328082416.1469810-2-sunil.khatri@amd.com">
      <pre class="moz-quote-pre" wrap="">Sync with drm-next commit ("866fc4f7e772c4a397f9459754ed1b1872b3a3c6")

Added support of UAPI for user queue secure semaphore.
The semaphore is used to synchronize between the caller and
the gpu hw and user wait for the semaphore.

Signed-off-by: Sunil Khatri <a class="moz-txt-link-rfc2396E" href="mailto:sunil.khatri@amd.com"><sunil.khatri@amd.com></a>
---
 include/drm-uapi/amdgpu_drm.h | 117 ++++++++++++++++++++++++++++++++++
 1 file changed, 117 insertions(+)

diff --git a/include/drm-uapi/amdgpu_drm.h b/include/drm-uapi/amdgpu_drm.h
index d780e1f2a..fed39c9b4 100644
--- a/include/drm-uapi/amdgpu_drm.h
+++ b/include/drm-uapi/amdgpu_drm.h
@@ -55,6 +55,8 @@ extern "C" {
 #define DRM_AMDGPU_FENCE_TO_HANDLE     0x14
 #define DRM_AMDGPU_SCHED               0x15
 #define DRM_AMDGPU_USERQ               0x16
+#define DRM_AMDGPU_USERQ_SIGNAL                0x17
+#define DRM_AMDGPU_USERQ_WAIT          0x18
 
 #define DRM_IOCTL_AMDGPU_GEM_CREATE    DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_GEM_CREATE, union drm_amdgpu_gem_create)
 #define DRM_IOCTL_AMDGPU_GEM_MMAP      DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_GEM_MMAP, union drm_amdgpu_gem_mmap)
@@ -73,6 +75,8 @@ extern "C" {
 #define DRM_IOCTL_AMDGPU_FENCE_TO_HANDLE DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_FENCE_TO_HANDLE, union drm_amdgpu_fence_to_handle)
 #define DRM_IOCTL_AMDGPU_SCHED         DRM_IOW(DRM_COMMAND_BASE + DRM_AMDGPU_SCHED, union drm_amdgpu_sched)
 #define DRM_IOCTL_AMDGPU_USERQ         DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_USERQ, union drm_amdgpu_userq)
+#define DRM_IOCTL_AMDGPU_USERQ_SIGNAL  DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_USERQ_SIGNAL, struct drm_amdgpu_userq_signal)
+#define DRM_IOCTL_AMDGPU_USERQ_WAIT    DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_USERQ_WAIT, struct drm_amdgpu_userq_wait)
 
 /**
  * DOC: memory domains
@@ -442,6 +446,119 @@ struct drm_amdgpu_userq_mqd_compute_gfx11 {
        __u64   eop_va;
 };
 
+/* userq signal/wait ioctl */
+struct drm_amdgpu_userq_signal {
+       /**
+        * @queue_id: Queue handle used by the userq fence creation function
+        * to retrieve the WPTR.
+        */
+       __u32   queue_id;
+       __u32   pad;
+       /**
+        * @syncobj_handles: The list of syncobj handles submitted by the user queue
+        * job to be signaled.
+        */</pre>
    </blockquote>
    <p>I am not sure about the correctness of the 'list of syncobj
      handles.' If it is a list, the field should be of type <code data-start="165" data-end="176">list_head</code>; if it's an
      array, it should be <code data-start="209" data-end="217">__u64*</code>,
      since the next field declares <code data-start="249" data-end="270">num_syncobj_handles</code>. Could you clarify
      this?</p>
    <p>There are several fields like this ?<br>
    </p>
    <blockquote type="cite" cite="mid:20250328082416.1469810-2-sunil.khatri@amd.com">
      <pre class="moz-quote-pre" wrap="">
+       __u64   syncobj_handles;
+       /**
+        * @num_syncobj_handles: A count that represents the number of syncobj handles in
+        * @syncobj_handles.
+        */
+       __u64   num_syncobj_handles;
+       /**
+        * @bo_read_handles: The list of BO handles that the submitted user queue job
+        * is using for read only. This will update BO fences in the kernel.
+        */
+       __u64   bo_read_handles;
+       /**
+        * @bo_write_handles: The list of BO handles that the submitted user queue job
+        * is using for write only. This will update BO fences in the kernel.
+        */
+       __u64   bo_write_handles;
+       /**
+        * @num_bo_read_handles: A count that represents the number of read BO handles in
+        * @bo_read_handles.
+        */
+       __u32   num_bo_read_handles;
+       /**
+        * @num_bo_write_handles: A count that represents the number of write BO handles in
+        * @bo_write_handles.
+        */
+       __u32   num_bo_write_handles;
+};
+
+struct drm_amdgpu_userq_fence_info {
+       /**
+        * @va: A gpu address allocated for each queue which stores the
+        * read pointer (RPTR) value.
+        */
+       __u64   va;
+       /**
+        * @value: A 64 bit value represents the write pointer (WPTR) of the
+        * queue commands which compared with the RPTR value to signal the
+        * fences.
+        */
+       __u64   value;
+};
+
+struct drm_amdgpu_userq_wait {
+       /**
+        * @syncobj_handles: The list of syncobj handles submitted by the user queue
+        * job to get the va/value pairs.
+        */
+       __u64   syncobj_handles;
+       /**
+        * @syncobj_timeline_handles: The list of timeline syncobj handles submitted by
+        * the user queue job to get the va/value pairs at given @syncobj_timeline_points.
+        */
+       __u64   syncobj_timeline_handles;
+       /**
+        * @syncobj_timeline_points: The list of timeline syncobj points submitted by the
+        * user queue job for the corresponding @syncobj_timeline_handles.
+        */
+       __u64   syncobj_timeline_points;
+       /**
+        * @bo_read_handles: The list of read BO handles submitted by the user queue
+        * job to get the va/value pairs.
+        */
+       __u64   bo_read_handles;
+       /**
+        * @bo_write_handles: The list of write BO handles submitted by the user queue
+        * job to get the va/value pairs.
+        */
+       __u64   bo_write_handles;
+       /**
+        * @num_syncobj_timeline_handles: A count that represents the number of timeline
+        * syncobj handles in @syncobj_timeline_handles.
+        */
+       __u16   num_syncobj_timeline_handles;
+       /**
+        * @num_fences: This field can be used both as input and output. As input it defines
+        * the maximum number of fences that can be returned and as output it will specify
+        * how many fences were actually returned from the ioctl.
+        */
+       __u16   num_fences;
+       /**
+        * @num_syncobj_handles: A count that represents the number of syncobj handles in
+        * @syncobj_handles.
+        */
+       __u32   num_syncobj_handles;
+       /**
+        * @num_bo_read_handles: A count that represents the number of read BO handles in
+        * @bo_read_handles.
+        */
+       __u32   num_bo_read_handles;
+       /**
+        * @num_bo_write_handles: A count that represents the number of write BO handles in
+        * @bo_write_handles.
+        */
+       __u32   num_bo_write_handles;
+       /**
+        * @out_fences: The field is a return value from the ioctl containing the list of
+        * address/value pairs to wait for.
+        */
+       __u64   out_fences;
+};
+
 /* vm ioctl */
 #define AMDGPU_VM_OP_RESERVE_VMID      1
 #define AMDGPU_VM_OP_UNRESERVE_VMID    2
</pre>
    </blockquote>
  </body>
</html>