Introduce two new UAPI ioctls to allow userspace to bind and unbind
an eventfd to a userspace-defined event_id on the render node.

    DRM_AMDGPU_EVENTFD_BIND
    DRM_AMDGPU_EVENTFD_UNBIND

The bind ioctl associates an eventfd file descriptor with an event_id
within the context of a drm_file (i.e., per-process / per-PASID).
When a matching interrupt or driver event occurs, the kernel can
signal the corresponding eventfd, allowing userspace to use poll/epoll
for event notification.

The unbind ioctl removes the association.

Cc: Harish Kasiviswanathan <[email protected]>
Cc: Felix Kuehling <[email protected]>
Cc: Alex Deucher <[email protected]>
Cc: Christian König <[email protected]>
Signed-off-by: Srinivasan Shanmugam <[email protected]>
Change-Id: I02faa7404c10c40d74c9aa2d4a367c226b8b23fd
---
 include/uapi/drm/amdgpu_drm.h | 35 ++++++++++++++++++++++++++++++++++-
 1 file changed, 34 insertions(+), 1 deletion(-)

diff --git a/include/uapi/drm/amdgpu_drm.h b/include/uapi/drm/amdgpu_drm.h
index 33e8738ce91f..4b367352bebb 100644
--- a/include/uapi/drm/amdgpu_drm.h
+++ b/include/uapi/drm/amdgpu_drm.h
@@ -39,6 +39,8 @@ extern "C" {
 #endif
 
 #define DRM_AMDGPU_GEM_CREATE          0x00
+#define DRM_AMDGPU_EVENTFD_BIND                0x1A   /* render-node eventfd 
bind */
+#define DRM_AMDGPU_EVENTFD_UNBIND      0x1B   /* render-node eventfd unbind */
 #define DRM_AMDGPU_GEM_MMAP            0x01
 #define DRM_AMDGPU_CTX                 0x02
 #define DRM_AMDGPU_BO_LIST             0x03
@@ -79,7 +81,12 @@ extern "C" {
 #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)
 #define DRM_IOCTL_AMDGPU_GEM_LIST_HANDLES DRM_IOWR(DRM_COMMAND_BASE + 
DRM_AMDGPU_GEM_LIST_HANDLES, struct drm_amdgpu_gem_list_handles)
-
+#define DRM_IOCTL_AMDGPU_EVENTFD_BIND \
+       DRM_IOW(DRM_COMMAND_BASE + DRM_AMDGPU_EVENTFD_BIND, \
+               struct drm_amdgpu_eventfd_bind)
+#define DRM_IOCTL_AMDGPU_EVENTFD_UNBIND \
+       DRM_IOW(DRM_COMMAND_BASE + DRM_AMDGPU_EVENTFD_UNBIND, \
+               struct drm_amdgpu_eventfd_unbind)
 /**
  * DOC: memory domains
  *
@@ -204,6 +211,32 @@ union drm_amdgpu_gem_create {
        struct drm_amdgpu_gem_create_out        out;
 };
 
+/**
+ * struct drm_amdgpu_eventfd_bind - bind an eventfd to an event_id
+ * @event_id: userspace-defined event id (e.g., HSA signal event id)
+ * @eventfd:  userspace eventfd file descriptor to signal
+ * @flags:    reserved for future use, must be 0
+ *
+ * Semantics:
+ *  - bind is per drm_file (per process / per PASID context)
+ *  - multiple GPUs: userspace repeats bind on each render node
+ */
+struct drm_amdgpu_eventfd_bind {
+       __u32 event_id;
+       __s32 eventfd;
+       __u32 flags;
+};
+
+/**
+ * struct drm_amdgpu_eventfd_unbind - unbind an eventfd from an event_id
+ * @event_id: event id to unbind
+ * @flags:    reserved for future use, must be 0
+ */
+struct drm_amdgpu_eventfd_unbind {
+       __u32 event_id;
+       __u32 flags;
+};
+
 /** Opcode to create new residency list.  */
 #define AMDGPU_BO_LIST_OP_CREATE       0
 /** Opcode to destroy previously created residency list */
-- 
2.34.1

Reply via email to