dri-devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/5] drm: add support of syncobj timeline point wait v4
@ 2018-11-02  8:25 Chunming Zhou
  2018-11-02  8:25 ` [PATCH 2/5] drm: add timeline syncobj payload query ioctl v2 Chunming Zhou
                   ` (4 more replies)
  0 siblings, 5 replies; 13+ messages in thread
From: Chunming Zhou @ 2018-11-02  8:25 UTC (permalink / raw)
  To: dri-devel; +Cc: Daniel Rakos, Jason Ekstrand, Dave Airlie, Christian König

points array is one-to-one match with syncobjs array.
v2:
add seperate ioctl for timeline point wait, otherwise break uapi.
v3:
userspace can specify two kinds waits::
a. Wait for time point to be completed.
b. and wait for time point to become available
v4:
rebase

Signed-off-by: Chunming Zhou <david1.zhou@amd.com>
Cc: Daniel Rakos <Daniel.Rakos@amd.com>
Cc: Jason Ekstrand <jason@jlekstrand.net>
Cc: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Cc: Dave Airlie <airlied@redhat.com>
Cc: Christian König <christian.koenig@amd.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
---
 drivers/gpu/drm/drm_internal.h |   2 +
 drivers/gpu/drm/drm_ioctl.c    |   2 +
 drivers/gpu/drm/drm_syncobj.c  | 115 ++++++++++++++++++++++++++++-----
 include/uapi/drm/drm.h         |  18 ++++++
 4 files changed, 121 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/drm_internal.h b/drivers/gpu/drm/drm_internal.h
index 0c4eb4a9ab31..566d44e3c782 100644
--- a/drivers/gpu/drm/drm_internal.h
+++ b/drivers/gpu/drm/drm_internal.h
@@ -183,6 +183,8 @@ int drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, void *data,
 				   struct drm_file *file_private);
 int drm_syncobj_wait_ioctl(struct drm_device *dev, void *data,
 			   struct drm_file *file_private);
+int drm_syncobj_timeline_wait_ioctl(struct drm_device *dev, void *data,
+				    struct drm_file *file_private);
 int drm_syncobj_reset_ioctl(struct drm_device *dev, void *data,
 			    struct drm_file *file_private);
 int drm_syncobj_signal_ioctl(struct drm_device *dev, void *data,
diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
index 94bd872d56c4..a9a17ed35cc4 100644
--- a/drivers/gpu/drm/drm_ioctl.c
+++ b/drivers/gpu/drm/drm_ioctl.c
@@ -675,6 +675,8 @@ static const struct drm_ioctl_desc drm_ioctls[] = {
 		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
 	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_WAIT, drm_syncobj_wait_ioctl,
 		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
+	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT, drm_syncobj_timeline_wait_ioctl,
+		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
 	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_RESET, drm_syncobj_reset_ioctl,
 		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
 	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_SIGNAL, drm_syncobj_signal_ioctl,
diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
index 4dca5f7e8c4b..9dc54a345480 100644
--- a/drivers/gpu/drm/drm_syncobj.c
+++ b/drivers/gpu/drm/drm_syncobj.c
@@ -153,11 +153,12 @@ static void drm_syncobj_add_callback_locked(struct drm_syncobj *syncobj,
 }
 
 static void drm_syncobj_fence_get_or_add_callback(struct drm_syncobj *syncobj,
+						  uint64_t point,
 						  struct dma_fence **fence,
 						  struct drm_syncobj_cb *cb,
 						  drm_syncobj_func_t func)
 {
-	u64 pt_value = 0;
+	u64 pt_value = point;
 
 	WARN_ON(*fence);
 
@@ -854,6 +855,7 @@ struct syncobj_wait_entry {
 	struct dma_fence *fence;
 	struct dma_fence_cb fence_cb;
 	struct drm_syncobj_cb syncobj_cb;
+	u64    point;
 };
 
 static void syncobj_wait_fence_func(struct dma_fence *fence,
@@ -871,12 +873,13 @@ static void syncobj_wait_syncobj_func(struct drm_syncobj *syncobj,
 	struct syncobj_wait_entry *wait =
 		container_of(cb, struct syncobj_wait_entry, syncobj_cb);
 
-	drm_syncobj_search_fence(syncobj, 0, 0, &wait->fence);
+	drm_syncobj_search_fence(syncobj, wait->point, 0, &wait->fence);
 
 	wake_up_process(wait->task);
 }
 
 static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs,
+						  void __user *user_points,
 						  uint32_t count,
 						  uint32_t flags,
 						  signed long timeout,
@@ -884,12 +887,37 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs,
 {
 	struct syncobj_wait_entry *entries;
 	struct dma_fence *fence;
+	uint64_t *points;
 	uint32_t signaled_count, i;
 
-	entries = kcalloc(count, sizeof(*entries), GFP_KERNEL);
-	if (!entries)
+	points = kmalloc_array(count, sizeof(*points), GFP_KERNEL);
+	if (points == NULL)
 		return -ENOMEM;
 
+	if (!user_points) {
+		memset(points, 0, count * sizeof(uint64_t));
+	} else if (copy_from_user(points, user_points, sizeof(uint64_t) * count)) {
+		timeout = -EFAULT;
+		goto err_free_points;
+	}
+
+
+	if (flags & DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE) {
+		struct dma_fence *fence;
+		for (i = 0; i < count; ++i) {
+			timeout = drm_syncobj_search_fence(syncobjs[i], points[i],
+							   DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT,
+							   &fence);
+			if (timeout)
+				goto err_free_points;
+		}
+		goto err_free_points;
+	}
+	entries = kcalloc(count, sizeof(*entries), GFP_KERNEL);
+	if (!entries) {
+		timeout = -ENOMEM;
+		goto err_free_points;
+	}
 	/* Walk the list of sync objects and initialize entries.  We do
 	 * this up-front so that we can properly return -EINVAL if there is
 	 * a syncobj with a missing fence and then never have the chance of
@@ -898,7 +926,8 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs,
 	signaled_count = 0;
 	for (i = 0; i < count; ++i) {
 		entries[i].task = current;
-		drm_syncobj_search_fence(syncobjs[i], 0, 0,
+		entries[i].point = points[i];
+		drm_syncobj_search_fence(syncobjs[i], points[i], 0,
 					 &entries[i].fence);
 		if (!entries[i].fence) {
 			if (flags & DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT) {
@@ -934,6 +963,7 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs,
 				continue;
 
 			drm_syncobj_fence_get_or_add_callback(syncobjs[i],
+							      entries[i].point,
 							      &entries[i].fence,
 							      &entries[i].syncobj_cb,
 							      syncobj_wait_syncobj_func);
@@ -996,6 +1026,9 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs,
 	}
 	kfree(entries);
 
+err_free_points:
+	kfree(points);
+
 	return timeout;
 }
 
@@ -1034,19 +1067,33 @@ static signed long drm_timeout_abs_to_jiffies(int64_t timeout_nsec)
 static int drm_syncobj_array_wait(struct drm_device *dev,
 				  struct drm_file *file_private,
 				  struct drm_syncobj_wait *wait,
-				  struct drm_syncobj **syncobjs)
+				  struct drm_syncobj_timeline_wait *timeline_wait,
+				  struct drm_syncobj **syncobjs, bool timeline)
 {
-	signed long timeout = drm_timeout_abs_to_jiffies(wait->timeout_nsec);
+	signed long timeout = 0;
 	uint32_t first = ~0;
 
-	timeout = drm_syncobj_array_wait_timeout(syncobjs,
-						 wait->count_handles,
-						 wait->flags,
-						 timeout, &first);
-	if (timeout < 0)
-		return timeout;
-
-	wait->first_signaled = first;
+	if (!timeline) {
+		timeout = drm_timeout_abs_to_jiffies(wait->timeout_nsec);
+		timeout = drm_syncobj_array_wait_timeout(syncobjs,
+							 NULL,
+							 wait->count_handles,
+							 wait->flags,
+							 timeout, &first);
+		if (timeout < 0)
+			return timeout;
+		wait->first_signaled = first;
+	} else {
+		timeout = drm_timeout_abs_to_jiffies(timeline_wait->timeout_nsec);
+		timeout = drm_syncobj_array_wait_timeout(syncobjs,
+							 u64_to_user_ptr(timeline_wait->points),
+							 timeline_wait->count_handles,
+							 timeline_wait->flags,
+							 timeout, &first);
+		if (timeout < 0)
+			return timeout;
+		timeline_wait->first_signaled = first;
+	}
 	return 0;
 }
 
@@ -1132,13 +1179,49 @@ drm_syncobj_wait_ioctl(struct drm_device *dev, void *data,
 		return ret;
 
 	ret = drm_syncobj_array_wait(dev, file_private,
-				     args, syncobjs);
+				     args, NULL, syncobjs, false);
 
 	drm_syncobj_array_free(syncobjs, args->count_handles);
 
 	return ret;
 }
 
+int
+drm_syncobj_timeline_wait_ioctl(struct drm_device *dev, void *data,
+				struct drm_file *file_private)
+{
+	struct drm_syncobj_timeline_wait *args = data;
+	struct drm_syncobj **syncobjs;
+	int ret = 0;
+
+	if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ))
+		return -ENODEV;
+
+	if (args->flags & ~(DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL |
+			    DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT |
+			    DRM_SYNCOBJ_WAIT_FLAGS_WAIT_COMPLETED |
+			    DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE))
+		return -EINVAL;
+
+	if (args->count_handles == 0)
+		return -EINVAL;
+
+	ret = drm_syncobj_array_find(file_private,
+				     u64_to_user_ptr(args->handles),
+				     args->count_handles,
+				     &syncobjs);
+	if (ret < 0)
+		return ret;
+
+	ret = drm_syncobj_array_wait(dev, file_private,
+				     NULL, args, syncobjs, true);
+
+	drm_syncobj_array_free(syncobjs, args->count_handles);
+
+	return ret;
+}
+
+
 int
 drm_syncobj_reset_ioctl(struct drm_device *dev, void *data,
 			struct drm_file *file_private)
diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h
index cebdb2541eb7..c8bc1414753d 100644
--- a/include/uapi/drm/drm.h
+++ b/include/uapi/drm/drm.h
@@ -738,6 +738,10 @@ struct drm_syncobj_handle {
 
 #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL (1 << 0)
 #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT (1 << 1)
+/* wait for time point to be completed */
+#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_COMPLETED (1 << 2)
+/* wait for time point to become available */
+#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE (1 << 3)
 struct drm_syncobj_wait {
 	__u64 handles;
 	/* absolute timeout */
@@ -748,6 +752,19 @@ struct drm_syncobj_wait {
 	__u32 pad;
 };
 
+struct drm_syncobj_timeline_wait {
+	__u64 handles;
+	/* wait on specific timeline point for every handles*/
+	__u64 points;
+	/* absolute timeout */
+	__s64 timeout_nsec;
+	__u32 count_handles;
+	__u32 flags;
+	__u32 first_signaled; /* only valid when not waiting all */
+	__u32 pad;
+};
+
+
 struct drm_syncobj_array {
 	__u64 handles;
 	__u32 count_handles;
@@ -910,6 +927,7 @@ extern "C" {
 #define DRM_IOCTL_MODE_GET_LEASE	DRM_IOWR(0xC8, struct drm_mode_get_lease)
 #define DRM_IOCTL_MODE_REVOKE_LEASE	DRM_IOWR(0xC9, struct drm_mode_revoke_lease)
 
+#define DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT	DRM_IOWR(0xCA, struct drm_syncobj_timeline_wait)
 /**
  * Device specific ioctls should only be in their respective headers
  * The device specific ioctl range is from 0x40 to 0x9f.
-- 
2.17.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 2/5] drm: add timeline syncobj payload query ioctl v2
  2018-11-02  8:25 [PATCH 1/5] drm: add support of syncobj timeline point wait v4 Chunming Zhou
@ 2018-11-02  8:25 ` Chunming Zhou
  2018-11-02  8:37   ` Christian König
  2018-11-02  8:25 ` [PATCH 3/5] drm: add timeline support for syncobj export/import Chunming Zhou
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 13+ messages in thread
From: Chunming Zhou @ 2018-11-02  8:25 UTC (permalink / raw)
  To: dri-devel; +Cc: Daniel Rakos, Jason Ekstrand, Dave Airlie, Christian König

user mode can query timeline payload.
v2: check return value of copy_to_user

Signed-off-by: Chunming Zhou <david1.zhou@amd.com>
Cc: Daniel Rakos <Daniel.Rakos@amd.com>
Cc: Jason Ekstrand <jason@jlekstrand.net>
Cc: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Cc: Dave Airlie <airlied@redhat.com>
Cc: Christian König <christian.koenig@amd.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
---
 drivers/gpu/drm/drm_internal.h |  2 ++
 drivers/gpu/drm/drm_ioctl.c    |  2 ++
 drivers/gpu/drm/drm_syncobj.c  | 52 ++++++++++++++++++++++++++++++++++
 include/uapi/drm/drm.h         | 11 +++++++
 4 files changed, 67 insertions(+)

diff --git a/drivers/gpu/drm/drm_internal.h b/drivers/gpu/drm/drm_internal.h
index 566d44e3c782..9c4826411a3c 100644
--- a/drivers/gpu/drm/drm_internal.h
+++ b/drivers/gpu/drm/drm_internal.h
@@ -189,6 +189,8 @@ int drm_syncobj_reset_ioctl(struct drm_device *dev, void *data,
 			    struct drm_file *file_private);
 int drm_syncobj_signal_ioctl(struct drm_device *dev, void *data,
 			     struct drm_file *file_private);
+int drm_syncobj_query_ioctl(struct drm_device *dev, void *data,
+			    struct drm_file *file_private);
 
 /* drm_framebuffer.c */
 void drm_framebuffer_print_info(struct drm_printer *p, unsigned int indent,
diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
index a9a17ed35cc4..7578ef6dc1d1 100644
--- a/drivers/gpu/drm/drm_ioctl.c
+++ b/drivers/gpu/drm/drm_ioctl.c
@@ -681,6 +681,8 @@ static const struct drm_ioctl_desc drm_ioctls[] = {
 		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
 	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_SIGNAL, drm_syncobj_signal_ioctl,
 		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
+	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_QUERY, drm_syncobj_query_ioctl,
+		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
 	DRM_IOCTL_DEF(DRM_IOCTL_CRTC_GET_SEQUENCE, drm_crtc_get_sequence_ioctl, DRM_UNLOCKED),
 	DRM_IOCTL_DEF(DRM_IOCTL_CRTC_QUEUE_SEQUENCE, drm_crtc_queue_sequence_ioctl, DRM_UNLOCKED),
 	DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATE_LEASE, drm_mode_create_lease_ioctl, DRM_MASTER|DRM_UNLOCKED),
diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
index 9dc54a345480..9ad58d0d21cd 100644
--- a/drivers/gpu/drm/drm_syncobj.c
+++ b/drivers/gpu/drm/drm_syncobj.c
@@ -1291,3 +1291,55 @@ drm_syncobj_signal_ioctl(struct drm_device *dev, void *data,
 
 	return ret;
 }
+
+static void drm_syncobj_timeline_query_payload(struct drm_syncobj *syncobj,
+					       uint64_t *point)
+{
+	if (syncobj->type != DRM_SYNCOBJ_TYPE_TIMELINE) {
+		DRM_ERROR("Normal syncobj cann't be queried!");
+		*point = 0;
+		return;
+	}
+	*point = syncobj->signal_point;
+}
+
+int drm_syncobj_query_ioctl(struct drm_device *dev, void *data,
+			    struct drm_file *file_private)
+{
+	struct drm_syncobj_timeline_query *args = data;
+	struct drm_syncobj **syncobjs;
+	uint64_t *points;
+	uint32_t i;
+	int ret;
+
+	if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ))
+		return -ENODEV;
+
+	if (args->count_handles == 0)
+		return -EINVAL;
+
+	ret = drm_syncobj_array_find(file_private,
+				     u64_to_user_ptr(args->handles),
+				     args->count_handles,
+				     &syncobjs);
+	if (ret < 0)
+		return ret;
+
+
+	points = kmalloc_array(args->count_handles, sizeof(*points),
+			       GFP_KERNEL);
+	if (points == NULL) {
+		ret = -ENOMEM;
+		goto out;
+	}
+	for (i = 0; i < args->count_handles; i++)
+		drm_syncobj_timeline_query_payload(syncobjs[i], &points[i]);
+	ret = copy_to_user(u64_to_user_ptr(args->points), points,
+			   sizeof(uint64_t) * args->count_handles) ? -EFAULT : 0;
+
+	kfree(points);
+out:
+	drm_syncobj_array_free(syncobjs, args->count_handles);
+
+	return ret;
+}
diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h
index c8bc1414753d..23c4979d8a1c 100644
--- a/include/uapi/drm/drm.h
+++ b/include/uapi/drm/drm.h
@@ -771,6 +771,15 @@ struct drm_syncobj_array {
 	__u32 pad;
 };
 
+struct drm_syncobj_timeline_query {
+	__u64 handles;
+	/* points are timeline syncobjs payloads returned by query ioctl */
+	__u64 points;
+	__u32 count_handles;
+	__u32 pad;
+};
+
+
 /* Query current scanout sequence number */
 struct drm_crtc_get_sequence {
 	__u32 crtc_id;		/* requested crtc_id */
@@ -928,6 +937,8 @@ extern "C" {
 #define DRM_IOCTL_MODE_REVOKE_LEASE	DRM_IOWR(0xC9, struct drm_mode_revoke_lease)
 
 #define DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT	DRM_IOWR(0xCA, struct drm_syncobj_timeline_wait)
+#define DRM_IOCTL_SYNCOBJ_QUERY		DRM_IOWR(0xCB, struct drm_syncobj_timeline_query)
+
 /**
  * Device specific ioctls should only be in their respective headers
  * The device specific ioctl range is from 0x40 to 0x9f.
-- 
2.17.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 3/5] drm: add timeline support for syncobj export/import
  2018-11-02  8:25 [PATCH 1/5] drm: add support of syncobj timeline point wait v4 Chunming Zhou
  2018-11-02  8:25 ` [PATCH 2/5] drm: add timeline syncobj payload query ioctl v2 Chunming Zhou
@ 2018-11-02  8:25 ` Chunming Zhou
  2018-11-02  8:46   ` Christian König
  2018-11-02  8:25 ` [PATCH 4/5] drm/amdgpu: add timeline support in amdgpu CS v2 Chunming Zhou
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 13+ messages in thread
From: Chunming Zhou @ 2018-11-02  8:25 UTC (permalink / raw)
  To: dri-devel; +Cc: Daniel Rakos, Jason Ekstrand, Dave Airlie, Christian König

user space can specify timeline point fence to export/import.

Signed-off-by: Chunming Zhou <david1.zhou@amd.com>
Cc: Daniel Rakos <Daniel.Rakos@amd.com>
Cc: Jason Ekstrand <jason@jlekstrand.net>
Cc: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Cc: Dave Airlie <airlied@redhat.com>
Cc: Christian König <christian.koenig@amd.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
---
 drivers/gpu/drm/drm_internal.h |  4 ++
 drivers/gpu/drm/drm_ioctl.c    |  4 ++
 drivers/gpu/drm/drm_syncobj.c  | 76 ++++++++++++++++++++++++++++++----
 include/uapi/drm/drm.h         | 11 +++++
 4 files changed, 88 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/drm_internal.h b/drivers/gpu/drm/drm_internal.h
index 9c4826411a3c..5ad6cbdb68ab 100644
--- a/drivers/gpu/drm/drm_internal.h
+++ b/drivers/gpu/drm/drm_internal.h
@@ -181,6 +181,10 @@ int drm_syncobj_handle_to_fd_ioctl(struct drm_device *dev, void *data,
 				   struct drm_file *file_private);
 int drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, void *data,
 				   struct drm_file *file_private);
+int drm_syncobj_handle_to_fd_ioctl2(struct drm_device *dev, void *data,
+				    struct drm_file *file_private);
+int drm_syncobj_fd_to_handle_ioctl2(struct drm_device *dev, void *data,
+				    struct drm_file *file_private);
 int drm_syncobj_wait_ioctl(struct drm_device *dev, void *data,
 			   struct drm_file *file_private);
 int drm_syncobj_timeline_wait_ioctl(struct drm_device *dev, void *data,
diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
index 7578ef6dc1d1..364d26e949cf 100644
--- a/drivers/gpu/drm/drm_ioctl.c
+++ b/drivers/gpu/drm/drm_ioctl.c
@@ -673,6 +673,10 @@ static const struct drm_ioctl_desc drm_ioctls[] = {
 		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
 	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE, drm_syncobj_fd_to_handle_ioctl,
 		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
+	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD2, drm_syncobj_handle_to_fd_ioctl2,
+		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
+	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE2, drm_syncobj_fd_to_handle_ioctl2,
+		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
 	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_WAIT, drm_syncobj_wait_ioctl,
 		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
 	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT, drm_syncobj_timeline_wait_ioctl,
diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
index 9ad58d0d21cd..dffc42ba2f91 100644
--- a/drivers/gpu/drm/drm_syncobj.c
+++ b/drivers/gpu/drm/drm_syncobj.c
@@ -677,7 +677,7 @@ static int drm_syncobj_fd_to_handle(struct drm_file *file_private,
 }
 
 static int drm_syncobj_import_sync_file_fence(struct drm_file *file_private,
-					      int fd, int handle)
+					      int fd, int handle, uint64_t point)
 {
 	struct dma_fence *fence = sync_file_get_fence(fd);
 	struct drm_syncobj *syncobj;
@@ -691,14 +691,14 @@ static int drm_syncobj_import_sync_file_fence(struct drm_file *file_private,
 		return -ENOENT;
 	}
 
-	drm_syncobj_replace_fence(syncobj, 0, fence);
+	drm_syncobj_replace_fence(syncobj, point, fence);
 	dma_fence_put(fence);
 	drm_syncobj_put(syncobj);
 	return 0;
 }
 
 static int drm_syncobj_export_sync_file(struct drm_file *file_private,
-					int handle, int *p_fd)
+					int handle, uint64_t point, int *p_fd)
 {
 	int ret;
 	struct dma_fence *fence;
@@ -708,7 +708,7 @@ static int drm_syncobj_export_sync_file(struct drm_file *file_private,
 	if (fd < 0)
 		return fd;
 
-	ret = drm_syncobj_find_fence(file_private, handle, 0, 0, &fence);
+	ret = drm_syncobj_find_fence(file_private, handle, point, 0, &fence);
 	if (ret)
 		goto err_put_fd;
 
@@ -817,9 +817,14 @@ drm_syncobj_handle_to_fd_ioctl(struct drm_device *dev, void *data,
 	    args->flags != DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
 		return -EINVAL;
 
-	if (args->flags & DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
+	if (args->flags & DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE) {
+		struct drm_syncobj *syncobj = drm_syncobj_find(file_private,
+							       args->handle);
+		if (!syncobj || syncobj->type != DRM_SYNCOBJ_TYPE_BINARY)
+			return -EINVAL;
 		return drm_syncobj_export_sync_file(file_private, args->handle,
-						    &args->fd);
+						    0, &args->fd);
+	}
 
 	return drm_syncobj_handle_to_fd(file_private, args->handle,
 					&args->fd);
@@ -841,15 +846,72 @@ drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, void *data,
 	    args->flags != DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE)
 		return -EINVAL;
 
+	if (args->flags & DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE) {
+		struct drm_syncobj *syncobj = drm_syncobj_find(file_private,
+							       args->handle);
+		if (!syncobj || syncobj->type != DRM_SYNCOBJ_TYPE_BINARY)
+			return -EINVAL;
+		return drm_syncobj_import_sync_file_fence(file_private,
+							  args->fd,
+							  args->handle,
+							  0);
+	}
+
+	return drm_syncobj_fd_to_handle(file_private, args->fd,
+					&args->handle);
+}
+
+int
+drm_syncobj_handle_to_fd_ioctl2(struct drm_device *dev, void *data,
+				   struct drm_file *file_private)
+{
+	struct drm_syncobj_handle2 *args = data;
+
+	if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ))
+		return -ENODEV;
+
+	if (args->pad)
+		return -EINVAL;
+
+	if (args->flags != 0 &&
+	    args->flags != DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
+		return -EINVAL;
+
+	if (args->flags & DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
+		return drm_syncobj_export_sync_file(file_private, args->handle,
+						    args->point, &args->fd);
+
+	return drm_syncobj_handle_to_fd(file_private, args->handle,
+					&args->fd);
+}
+
+int
+drm_syncobj_fd_to_handle_ioctl2(struct drm_device *dev, void *data,
+				   struct drm_file *file_private)
+{
+	struct drm_syncobj_handle2 *args = data;
+
+	if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ))
+		return -ENODEV;
+
+	if (args->pad)
+		return -EINVAL;
+
+	if (args->flags != 0 &&
+	    args->flags != DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE)
+		return -EINVAL;
+
 	if (args->flags & DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE)
 		return drm_syncobj_import_sync_file_fence(file_private,
 							  args->fd,
-							  args->handle);
+							  args->handle,
+							  args->point);
 
 	return drm_syncobj_fd_to_handle(file_private, args->fd,
 					&args->handle);
 }
 
+
 struct syncobj_wait_entry {
 	struct task_struct *task;
 	struct dma_fence *fence;
diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h
index 23c4979d8a1c..da5df2a42fc3 100644
--- a/include/uapi/drm/drm.h
+++ b/include/uapi/drm/drm.h
@@ -735,6 +735,15 @@ struct drm_syncobj_handle {
 	__s32 fd;
 	__u32 pad;
 };
+struct drm_syncobj_handle2 {
+	__u32 handle;
+	__u32 flags;
+	__u64 point;
+
+	__s32 fd;
+	__u32 pad;
+};
+
 
 #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL (1 << 0)
 #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT (1 << 1)
@@ -938,6 +947,8 @@ extern "C" {
 
 #define DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT	DRM_IOWR(0xCA, struct drm_syncobj_timeline_wait)
 #define DRM_IOCTL_SYNCOBJ_QUERY		DRM_IOWR(0xCB, struct drm_syncobj_timeline_query)
+#define DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD2	DRM_IOWR(0xCC, struct drm_syncobj_handle2)
+#define DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE2	DRM_IOWR(0xCD, struct drm_syncobj_handle2)
 
 /**
  * Device specific ioctls should only be in their respective headers
-- 
2.17.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 4/5] drm/amdgpu: add timeline support in amdgpu CS v2
  2018-11-02  8:25 [PATCH 1/5] drm: add support of syncobj timeline point wait v4 Chunming Zhou
  2018-11-02  8:25 ` [PATCH 2/5] drm: add timeline syncobj payload query ioctl v2 Chunming Zhou
  2018-11-02  8:25 ` [PATCH 3/5] drm: add timeline support for syncobj export/import Chunming Zhou
@ 2018-11-02  8:25 ` Chunming Zhou
  2018-11-02  8:25 ` [PATCH 5/5] drm/amdgpu: update version for timeline syncobj support in amdgpu Chunming Zhou
  2018-11-02  8:35 ` [PATCH 1/5] drm: add support of syncobj timeline point wait v4 Christian König
  4 siblings, 0 replies; 13+ messages in thread
From: Chunming Zhou @ 2018-11-02  8:25 UTC (permalink / raw)
  To: dri-devel; +Cc: Daniel Rakos, Jason Ekstrand, Dave Airlie, Christian König

syncobj wait/signal operation is appending in command submission.
v2: separate to two kinds in/out_deps functions

Signed-off-by: Chunming Zhou <david1.zhou@amd.com>
Cc: Daniel Rakos <Daniel.Rakos@amd.com>
Cc: Jason Ekstrand <jason@jlekstrand.net>
Cc: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Cc: Dave Airlie <airlied@redhat.com>
Cc: Christian König <christian.koenig@amd.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu.h    |   8 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 111 +++++++++++++++++++++----
 include/uapi/drm/amdgpu_drm.h          |   9 ++
 3 files changed, 112 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index d0102cfc8efb..081e9b973252 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -543,6 +543,11 @@ struct amdgpu_cs_chunk {
 	void			*kdata;
 };
 
+struct amdgpu_cs_syncobj_post_dep {
+	struct drm_syncobj *post_dep_syncobj;
+	u64 point;
+};
+
 struct amdgpu_cs_parser {
 	struct amdgpu_device	*adev;
 	struct drm_file		*filp;
@@ -571,9 +576,8 @@ struct amdgpu_cs_parser {
 
 	/* user fence */
 	struct amdgpu_bo_list_entry	uf_entry;
-
+	struct amdgpu_cs_syncobj_post_dep *post_dep_syncobjs;
 	unsigned num_post_dep_syncobjs;
-	struct drm_syncobj **post_dep_syncobjs;
 };
 
 static inline u32 amdgpu_get_ib_value(struct amdgpu_cs_parser *p,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index 35bc8fc3bc70..6a823b58b3b8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -213,6 +213,8 @@ static int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, union drm_amdgpu_cs
 		case AMDGPU_CHUNK_ID_DEPENDENCIES:
 		case AMDGPU_CHUNK_ID_SYNCOBJ_IN:
 		case AMDGPU_CHUNK_ID_SYNCOBJ_OUT:
+		case AMDGPU_CHUNK_ID_SYNCOBJ_TIMELINE_WAIT:
+		case AMDGPU_CHUNK_ID_SYNCOBJ_TIMELINE_SIGNAL:
 			break;
 
 		default:
@@ -793,7 +795,7 @@ static void amdgpu_cs_parser_fini(struct amdgpu_cs_parser *parser, int error,
 					   &parser->validated);
 
 	for (i = 0; i < parser->num_post_dep_syncobjs; i++)
-		drm_syncobj_put(parser->post_dep_syncobjs[i]);
+		drm_syncobj_put(parser->post_dep_syncobjs[i].post_dep_syncobj);
 	kfree(parser->post_dep_syncobjs);
 
 	dma_fence_put(parser->fence);
@@ -1100,13 +1102,17 @@ static int amdgpu_cs_process_fence_dep(struct amdgpu_cs_parser *p,
 }
 
 static int amdgpu_syncobj_lookup_and_add_to_sync(struct amdgpu_cs_parser *p,
-						 uint32_t handle)
+						 uint32_t handle, u64 point,
+						 u64 flags)
 {
 	int r;
 	struct dma_fence *fence;
-	r = drm_syncobj_find_fence(p->filp, handle, 0, 0, &fence);
-	if (r)
+
+	r = drm_syncobj_find_fence(p->filp, handle, point, flags, &fence);
+	if (r) {
+		DRM_ERROR("syncobj %u failed to find fence!\n", handle);
 		return r;
+	}
 
 	r = amdgpu_sync_fence(p->adev, &p->job->sync, fence, true);
 	dma_fence_put(fence);
@@ -1117,46 +1123,108 @@ static int amdgpu_syncobj_lookup_and_add_to_sync(struct amdgpu_cs_parser *p,
 static int amdgpu_cs_process_syncobj_in_dep(struct amdgpu_cs_parser *p,
 					    struct amdgpu_cs_chunk *chunk)
 {
+	struct drm_amdgpu_cs_chunk_sem *deps;
 	unsigned num_deps;
 	int i, r;
-	struct drm_amdgpu_cs_chunk_sem *deps;
 
 	deps = (struct drm_amdgpu_cs_chunk_sem *)chunk->kdata;
 	num_deps = chunk->length_dw * 4 /
 		sizeof(struct drm_amdgpu_cs_chunk_sem);
+	for (i = 0; i < num_deps; ++i) {
+		r = amdgpu_syncobj_lookup_and_add_to_sync(p, deps[i].handle,
+							  0, 0);
+		if (r)
+			return r;
+	}
+
+	return 0;
+}
+
+
+static int amdgpu_cs_process_syncobj_timeline_in_dep(struct amdgpu_cs_parser *p,
+						     struct amdgpu_cs_chunk *chunk)
+{
+	struct drm_amdgpu_cs_chunk_syncobj *syncobj_deps;
+	unsigned num_deps;
+	int i, r;
 
+	syncobj_deps = (struct drm_amdgpu_cs_chunk_syncobj *)chunk->kdata;
+	num_deps = chunk->length_dw * 4 /
+		sizeof(struct drm_amdgpu_cs_chunk_syncobj);
 	for (i = 0; i < num_deps; ++i) {
-		r = amdgpu_syncobj_lookup_and_add_to_sync(p, deps[i].handle);
+		r = amdgpu_syncobj_lookup_and_add_to_sync(p,
+							  syncobj_deps[i].handle,
+							  syncobj_deps[i].point,
+							  syncobj_deps[i].flags);
 		if (r)
 			return r;
 	}
+
 	return 0;
 }
 
 static int amdgpu_cs_process_syncobj_out_dep(struct amdgpu_cs_parser *p,
 					     struct amdgpu_cs_chunk *chunk)
 {
+	struct drm_amdgpu_cs_chunk_sem *deps;
 	unsigned num_deps;
 	int i;
-	struct drm_amdgpu_cs_chunk_sem *deps;
+
 	deps = (struct drm_amdgpu_cs_chunk_sem *)chunk->kdata;
 	num_deps = chunk->length_dw * 4 /
 		sizeof(struct drm_amdgpu_cs_chunk_sem);
 
 	p->post_dep_syncobjs = kmalloc_array(num_deps,
-					     sizeof(struct drm_syncobj *),
+					     sizeof(struct amdgpu_cs_syncobj_post_dep),
 					     GFP_KERNEL);
 	p->num_post_dep_syncobjs = 0;
 
 	if (!p->post_dep_syncobjs)
 		return -ENOMEM;
 
+
 	for (i = 0; i < num_deps; ++i) {
-		p->post_dep_syncobjs[i] = drm_syncobj_find(p->filp, deps[i].handle);
-		if (!p->post_dep_syncobjs[i])
+		p->post_dep_syncobjs[i].post_dep_syncobj =
+			drm_syncobj_find(p->filp, deps[i].handle);
+		if (!p->post_dep_syncobjs[i].post_dep_syncobj)
 			return -EINVAL;
+		p->post_dep_syncobjs[i].point = 0;
 		p->num_post_dep_syncobjs++;
 	}
+
+	return 0;
+}
+
+
+static int amdgpu_cs_process_syncobj_timeline_out_dep(struct amdgpu_cs_parser *p,
+						      struct amdgpu_cs_chunk
+						      *chunk)
+{
+	struct drm_amdgpu_cs_chunk_syncobj *syncobj_deps;
+	unsigned num_deps;
+	int i;
+
+	syncobj_deps = (struct drm_amdgpu_cs_chunk_syncobj *)chunk->kdata;
+	num_deps = chunk->length_dw * 4 /
+		sizeof(struct drm_amdgpu_cs_chunk_syncobj);
+
+	p->post_dep_syncobjs = kmalloc_array(num_deps,
+					     sizeof(struct amdgpu_cs_syncobj_post_dep),
+					     GFP_KERNEL);
+	p->num_post_dep_syncobjs = 0;
+
+	if (!p->post_dep_syncobjs)
+		return -ENOMEM;
+
+	for (i = 0; i < num_deps; ++i) {
+		p->post_dep_syncobjs[i].post_dep_syncobj =
+			drm_syncobj_find(p->filp, syncobj_deps[i].handle);
+		if (!p->post_dep_syncobjs[i].post_dep_syncobj)
+			return -EINVAL;
+		p->post_dep_syncobjs[i].point = syncobj_deps[i].point;
+		p->num_post_dep_syncobjs++;
+	}
+
 	return 0;
 }
 
@@ -1170,18 +1238,32 @@ static int amdgpu_cs_dependencies(struct amdgpu_device *adev,
 
 		chunk = &p->chunks[i];
 
-		if (chunk->chunk_id == AMDGPU_CHUNK_ID_DEPENDENCIES) {
+		switch (chunk->chunk_id) {
+		case AMDGPU_CHUNK_ID_DEPENDENCIES:
 			r = amdgpu_cs_process_fence_dep(p, chunk);
 			if (r)
 				return r;
-		} else if (chunk->chunk_id == AMDGPU_CHUNK_ID_SYNCOBJ_IN) {
+			break;
+		case AMDGPU_CHUNK_ID_SYNCOBJ_IN:
 			r = amdgpu_cs_process_syncobj_in_dep(p, chunk);
 			if (r)
 				return r;
-		} else if (chunk->chunk_id == AMDGPU_CHUNK_ID_SYNCOBJ_OUT) {
+			break;
+		case AMDGPU_CHUNK_ID_SYNCOBJ_OUT:
 			r = amdgpu_cs_process_syncobj_out_dep(p, chunk);
 			if (r)
 				return r;
+			break;
+		case AMDGPU_CHUNK_ID_SYNCOBJ_TIMELINE_WAIT:
+			r = amdgpu_cs_process_syncobj_timeline_in_dep(p, chunk);
+			if (r)
+				return r;
+			break;
+		case AMDGPU_CHUNK_ID_SYNCOBJ_TIMELINE_SIGNAL:
+			r = amdgpu_cs_process_syncobj_timeline_out_dep(p, chunk);
+			if (r)
+				return r;
+			break;
 		}
 	}
 
@@ -1193,7 +1275,8 @@ static void amdgpu_cs_post_dependencies(struct amdgpu_cs_parser *p)
 	int i;
 
 	for (i = 0; i < p->num_post_dep_syncobjs; ++i)
-		drm_syncobj_replace_fence(p->post_dep_syncobjs[i], 0, p->fence);
+		drm_syncobj_replace_fence(p->post_dep_syncobjs[i].post_dep_syncobj,
+					  p->post_dep_syncobjs[i].point, p->fence);
 }
 
 static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
diff --git a/include/uapi/drm/amdgpu_drm.h b/include/uapi/drm/amdgpu_drm.h
index 370e9a5536ef..57efba7f3197 100644
--- a/include/uapi/drm/amdgpu_drm.h
+++ b/include/uapi/drm/amdgpu_drm.h
@@ -517,6 +517,8 @@ struct drm_amdgpu_gem_va {
 #define AMDGPU_CHUNK_ID_SYNCOBJ_IN      0x04
 #define AMDGPU_CHUNK_ID_SYNCOBJ_OUT     0x05
 #define AMDGPU_CHUNK_ID_BO_HANDLES      0x06
+#define AMDGPU_CHUNK_ID_SYNCOBJ_TIMELINE_WAIT    0x07
+#define AMDGPU_CHUNK_ID_SYNCOBJ_TIMELINE_SIGNAL  0x08
 
 struct drm_amdgpu_cs_chunk {
 	__u32		chunk_id;
@@ -592,6 +594,13 @@ struct drm_amdgpu_cs_chunk_sem {
 	__u32 handle;
 };
 
+struct drm_amdgpu_cs_chunk_syncobj {
+       __u32 handle;
+       __u32 flags;
+       __u64 point;
+};
+
+
 #define AMDGPU_FENCE_TO_HANDLE_GET_SYNCOBJ	0
 #define AMDGPU_FENCE_TO_HANDLE_GET_SYNCOBJ_FD	1
 #define AMDGPU_FENCE_TO_HANDLE_GET_SYNC_FILE_FD	2
-- 
2.17.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 5/5] drm/amdgpu: update version for timeline syncobj support in amdgpu
  2018-11-02  8:25 [PATCH 1/5] drm: add support of syncobj timeline point wait v4 Chunming Zhou
                   ` (2 preceding siblings ...)
  2018-11-02  8:25 ` [PATCH 4/5] drm/amdgpu: add timeline support in amdgpu CS v2 Chunming Zhou
@ 2018-11-02  8:25 ` Chunming Zhou
  2018-11-02  8:35 ` [PATCH 1/5] drm: add support of syncobj timeline point wait v4 Christian König
  4 siblings, 0 replies; 13+ messages in thread
From: Chunming Zhou @ 2018-11-02  8:25 UTC (permalink / raw)
  To: dri-devel

Signed-off-by: Chunming Zhou <david1.zhou@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index 28781414d71c..dba529d65ccd 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -71,9 +71,10 @@
  * - 3.25.0 - Add support for sensor query info (stable pstate sclk/mclk).
  * - 3.26.0 - GFX9: Process AMDGPU_IB_FLAG_TC_WB_NOT_INVALIDATE.
  * - 3.27.0 - Add new chunk to to AMDGPU_CS to enable BO_LIST creation.
+ * - 3.28.0 - Add syncobj timeline support to AMDGPU_CS.
  */
 #define KMS_DRIVER_MAJOR	3
-#define KMS_DRIVER_MINOR	27
+#define KMS_DRIVER_MINOR	28
 #define KMS_DRIVER_PATCHLEVEL	0
 
 int amdgpu_vram_limit = 0;
-- 
2.17.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH 1/5] drm: add support of syncobj timeline point wait v4
  2018-11-02  8:25 [PATCH 1/5] drm: add support of syncobj timeline point wait v4 Chunming Zhou
                   ` (3 preceding siblings ...)
  2018-11-02  8:25 ` [PATCH 5/5] drm/amdgpu: update version for timeline syncobj support in amdgpu Chunming Zhou
@ 2018-11-02  8:35 ` Christian König
  4 siblings, 0 replies; 13+ messages in thread
From: Christian König @ 2018-11-02  8:35 UTC (permalink / raw)
  To: Chunming Zhou, dri-devel
  Cc: Dave Airlie, Daniel Rakos, Christian König, Jason Ekstrand

Am 02.11.18 um 09:25 schrieb Chunming Zhou:
> points array is one-to-one match with syncobjs array.
> v2:
> add seperate ioctl for timeline point wait, otherwise break uapi.
> v3:
> userspace can specify two kinds waits::
> a. Wait for time point to be completed.
> b. and wait for time point to become available
> v4:
> rebase
>
> Signed-off-by: Chunming Zhou <david1.zhou@amd.com>
> Cc: Daniel Rakos <Daniel.Rakos@amd.com>
> Cc: Jason Ekstrand <jason@jlekstrand.net>
> Cc: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
> Cc: Dave Airlie <airlied@redhat.com>
> Cc: Christian König <christian.koenig@amd.com>
> Cc: Chris Wilson <chris@chris-wilson.co.uk>
> ---
>   drivers/gpu/drm/drm_internal.h |   2 +
>   drivers/gpu/drm/drm_ioctl.c    |   2 +
>   drivers/gpu/drm/drm_syncobj.c  | 115 ++++++++++++++++++++++++++++-----
>   include/uapi/drm/drm.h         |  18 ++++++
>   4 files changed, 121 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_internal.h b/drivers/gpu/drm/drm_internal.h
> index 0c4eb4a9ab31..566d44e3c782 100644
> --- a/drivers/gpu/drm/drm_internal.h
> +++ b/drivers/gpu/drm/drm_internal.h
> @@ -183,6 +183,8 @@ int drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, void *data,
>   				   struct drm_file *file_private);
>   int drm_syncobj_wait_ioctl(struct drm_device *dev, void *data,
>   			   struct drm_file *file_private);
> +int drm_syncobj_timeline_wait_ioctl(struct drm_device *dev, void *data,
> +				    struct drm_file *file_private);
>   int drm_syncobj_reset_ioctl(struct drm_device *dev, void *data,
>   			    struct drm_file *file_private);
>   int drm_syncobj_signal_ioctl(struct drm_device *dev, void *data,
> diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
> index 94bd872d56c4..a9a17ed35cc4 100644
> --- a/drivers/gpu/drm/drm_ioctl.c
> +++ b/drivers/gpu/drm/drm_ioctl.c
> @@ -675,6 +675,8 @@ static const struct drm_ioctl_desc drm_ioctls[] = {
>   		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
>   	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_WAIT, drm_syncobj_wait_ioctl,
>   		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
> +	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT, drm_syncobj_timeline_wait_ioctl,
> +		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
>   	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_RESET, drm_syncobj_reset_ioctl,
>   		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
>   	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_SIGNAL, drm_syncobj_signal_ioctl,
> diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
> index 4dca5f7e8c4b..9dc54a345480 100644
> --- a/drivers/gpu/drm/drm_syncobj.c
> +++ b/drivers/gpu/drm/drm_syncobj.c
> @@ -153,11 +153,12 @@ static void drm_syncobj_add_callback_locked(struct drm_syncobj *syncobj,
>   }
>   
>   static void drm_syncobj_fence_get_or_add_callback(struct drm_syncobj *syncobj,
> +						  uint64_t point,
>   						  struct dma_fence **fence,
>   						  struct drm_syncobj_cb *cb,
>   						  drm_syncobj_func_t func)
>   {
> -	u64 pt_value = 0;
> +	u64 pt_value = point;
>   
>   	WARN_ON(*fence);
>   
> @@ -854,6 +855,7 @@ struct syncobj_wait_entry {
>   	struct dma_fence *fence;
>   	struct dma_fence_cb fence_cb;
>   	struct drm_syncobj_cb syncobj_cb;
> +	u64    point;
>   };
>   
>   static void syncobj_wait_fence_func(struct dma_fence *fence,
> @@ -871,12 +873,13 @@ static void syncobj_wait_syncobj_func(struct drm_syncobj *syncobj,
>   	struct syncobj_wait_entry *wait =
>   		container_of(cb, struct syncobj_wait_entry, syncobj_cb);
>   
> -	drm_syncobj_search_fence(syncobj, 0, 0, &wait->fence);
> +	drm_syncobj_search_fence(syncobj, wait->point, 0, &wait->fence);
>   
>   	wake_up_process(wait->task);
>   }
>   
>   static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs,
> +						  void __user *user_points,
>   						  uint32_t count,
>   						  uint32_t flags,
>   						  signed long timeout,
> @@ -884,12 +887,37 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs,
>   {
>   	struct syncobj_wait_entry *entries;
>   	struct dma_fence *fence;
> +	uint64_t *points;
>   	uint32_t signaled_count, i;
>   
> -	entries = kcalloc(count, sizeof(*entries), GFP_KERNEL);
> -	if (!entries)
> +	points = kmalloc_array(count, sizeof(*points), GFP_KERNEL);
> +	if (points == NULL)
>   		return -ENOMEM;
>   
> +	if (!user_points) {
> +		memset(points, 0, count * sizeof(uint64_t));
> +	} else if (copy_from_user(points, user_points, sizeof(uint64_t) * count)) {
> +		timeout = -EFAULT;
> +		goto err_free_points;
> +	}
> +
> +

Double empty line here.

> +	if (flags & DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE) {
> +		struct dma_fence *fence;
> +		for (i = 0; i < count; ++i) {
> +			timeout = drm_syncobj_search_fence(syncobjs[i], points[i],
> +							   DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT,
> +							   &fence);
> +			if (timeout)
> +				goto err_free_points;
> +		}
> +		goto err_free_points;

A comment would be nice here to note that we only wait for the fences to 
become available.

Alternatively it might be a good idea to make this an separate IOCTL.

Apart from those nit picks looks quite good to me,
Christian.

> +	}
> +	entries = kcalloc(count, sizeof(*entries), GFP_KERNEL);
> +	if (!entries) {
> +		timeout = -ENOMEM;
> +		goto err_free_points;
> +	}
>   	/* Walk the list of sync objects and initialize entries.  We do
>   	 * this up-front so that we can properly return -EINVAL if there is
>   	 * a syncobj with a missing fence and then never have the chance of
> @@ -898,7 +926,8 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs,
>   	signaled_count = 0;
>   	for (i = 0; i < count; ++i) {
>   		entries[i].task = current;
> -		drm_syncobj_search_fence(syncobjs[i], 0, 0,
> +		entries[i].point = points[i];
> +		drm_syncobj_search_fence(syncobjs[i], points[i], 0,
>   					 &entries[i].fence);
>   		if (!entries[i].fence) {
>   			if (flags & DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT) {
> @@ -934,6 +963,7 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs,
>   				continue;
>   
>   			drm_syncobj_fence_get_or_add_callback(syncobjs[i],
> +							      entries[i].point,
>   							      &entries[i].fence,
>   							      &entries[i].syncobj_cb,
>   							      syncobj_wait_syncobj_func);
> @@ -996,6 +1026,9 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs,
>   	}
>   	kfree(entries);
>   
> +err_free_points:
> +	kfree(points);
> +
>   	return timeout;
>   }
>   
> @@ -1034,19 +1067,33 @@ static signed long drm_timeout_abs_to_jiffies(int64_t timeout_nsec)
>   static int drm_syncobj_array_wait(struct drm_device *dev,
>   				  struct drm_file *file_private,
>   				  struct drm_syncobj_wait *wait,
> -				  struct drm_syncobj **syncobjs)
> +				  struct drm_syncobj_timeline_wait *timeline_wait,
> +				  struct drm_syncobj **syncobjs, bool timeline)
>   {
> -	signed long timeout = drm_timeout_abs_to_jiffies(wait->timeout_nsec);
> +	signed long timeout = 0;
>   	uint32_t first = ~0;
>   
> -	timeout = drm_syncobj_array_wait_timeout(syncobjs,
> -						 wait->count_handles,
> -						 wait->flags,
> -						 timeout, &first);
> -	if (timeout < 0)
> -		return timeout;
> -
> -	wait->first_signaled = first;
> +	if (!timeline) {
> +		timeout = drm_timeout_abs_to_jiffies(wait->timeout_nsec);
> +		timeout = drm_syncobj_array_wait_timeout(syncobjs,
> +							 NULL,
> +							 wait->count_handles,
> +							 wait->flags,
> +							 timeout, &first);
> +		if (timeout < 0)
> +			return timeout;
> +		wait->first_signaled = first;
> +	} else {
> +		timeout = drm_timeout_abs_to_jiffies(timeline_wait->timeout_nsec);
> +		timeout = drm_syncobj_array_wait_timeout(syncobjs,
> +							 u64_to_user_ptr(timeline_wait->points),
> +							 timeline_wait->count_handles,
> +							 timeline_wait->flags,
> +							 timeout, &first);
> +		if (timeout < 0)
> +			return timeout;
> +		timeline_wait->first_signaled = first;
> +	}
>   	return 0;
>   }
>   
> @@ -1132,13 +1179,49 @@ drm_syncobj_wait_ioctl(struct drm_device *dev, void *data,
>   		return ret;
>   
>   	ret = drm_syncobj_array_wait(dev, file_private,
> -				     args, syncobjs);
> +				     args, NULL, syncobjs, false);
>   
>   	drm_syncobj_array_free(syncobjs, args->count_handles);
>   
>   	return ret;
>   }
>   
> +int
> +drm_syncobj_timeline_wait_ioctl(struct drm_device *dev, void *data,
> +				struct drm_file *file_private)
> +{
> +	struct drm_syncobj_timeline_wait *args = data;
> +	struct drm_syncobj **syncobjs;
> +	int ret = 0;
> +
> +	if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ))
> +		return -ENODEV;
> +
> +	if (args->flags & ~(DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL |
> +			    DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT |
> +			    DRM_SYNCOBJ_WAIT_FLAGS_WAIT_COMPLETED |
> +			    DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE))
> +		return -EINVAL;
> +
> +	if (args->count_handles == 0)
> +		return -EINVAL;
> +
> +	ret = drm_syncobj_array_find(file_private,
> +				     u64_to_user_ptr(args->handles),
> +				     args->count_handles,
> +				     &syncobjs);
> +	if (ret < 0)
> +		return ret;
> +
> +	ret = drm_syncobj_array_wait(dev, file_private,
> +				     NULL, args, syncobjs, true);
> +
> +	drm_syncobj_array_free(syncobjs, args->count_handles);
> +
> +	return ret;
> +}
> +
> +
>   int
>   drm_syncobj_reset_ioctl(struct drm_device *dev, void *data,
>   			struct drm_file *file_private)
> diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h
> index cebdb2541eb7..c8bc1414753d 100644
> --- a/include/uapi/drm/drm.h
> +++ b/include/uapi/drm/drm.h
> @@ -738,6 +738,10 @@ struct drm_syncobj_handle {
>   
>   #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL (1 << 0)
>   #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT (1 << 1)
> +/* wait for time point to be completed */
> +#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_COMPLETED (1 << 2)
> +/* wait for time point to become available */
> +#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE (1 << 3)
>   struct drm_syncobj_wait {
>   	__u64 handles;
>   	/* absolute timeout */
> @@ -748,6 +752,19 @@ struct drm_syncobj_wait {
>   	__u32 pad;
>   };
>   
> +struct drm_syncobj_timeline_wait {
> +	__u64 handles;
> +	/* wait on specific timeline point for every handles*/
> +	__u64 points;
> +	/* absolute timeout */
> +	__s64 timeout_nsec;
> +	__u32 count_handles;
> +	__u32 flags;
> +	__u32 first_signaled; /* only valid when not waiting all */
> +	__u32 pad;
> +};
> +
> +
>   struct drm_syncobj_array {
>   	__u64 handles;
>   	__u32 count_handles;
> @@ -910,6 +927,7 @@ extern "C" {
>   #define DRM_IOCTL_MODE_GET_LEASE	DRM_IOWR(0xC8, struct drm_mode_get_lease)
>   #define DRM_IOCTL_MODE_REVOKE_LEASE	DRM_IOWR(0xC9, struct drm_mode_revoke_lease)
>   
> +#define DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT	DRM_IOWR(0xCA, struct drm_syncobj_timeline_wait)
>   /**
>    * Device specific ioctls should only be in their respective headers
>    * The device specific ioctl range is from 0x40 to 0x9f.

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 2/5] drm: add timeline syncobj payload query ioctl v2
  2018-11-02  8:25 ` [PATCH 2/5] drm: add timeline syncobj payload query ioctl v2 Chunming Zhou
@ 2018-11-02  8:37   ` Christian König
  0 siblings, 0 replies; 13+ messages in thread
From: Christian König @ 2018-11-02  8:37 UTC (permalink / raw)
  To: Chunming Zhou, dri-devel
  Cc: Dave Airlie, Daniel Rakos, Christian König, Jason Ekstrand

Am 02.11.18 um 09:25 schrieb Chunming Zhou:
> user mode can query timeline payload.
> v2: check return value of copy_to_user
>
> Signed-off-by: Chunming Zhou <david1.zhou@amd.com>
> Cc: Daniel Rakos <Daniel.Rakos@amd.com>
> Cc: Jason Ekstrand <jason@jlekstrand.net>
> Cc: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
> Cc: Dave Airlie <airlied@redhat.com>
> Cc: Christian König <christian.koenig@amd.com>
> Cc: Chris Wilson <chris@chris-wilson.co.uk>
> ---
>   drivers/gpu/drm/drm_internal.h |  2 ++
>   drivers/gpu/drm/drm_ioctl.c    |  2 ++
>   drivers/gpu/drm/drm_syncobj.c  | 52 ++++++++++++++++++++++++++++++++++
>   include/uapi/drm/drm.h         | 11 +++++++
>   4 files changed, 67 insertions(+)
>
> diff --git a/drivers/gpu/drm/drm_internal.h b/drivers/gpu/drm/drm_internal.h
> index 566d44e3c782..9c4826411a3c 100644
> --- a/drivers/gpu/drm/drm_internal.h
> +++ b/drivers/gpu/drm/drm_internal.h
> @@ -189,6 +189,8 @@ int drm_syncobj_reset_ioctl(struct drm_device *dev, void *data,
>   			    struct drm_file *file_private);
>   int drm_syncobj_signal_ioctl(struct drm_device *dev, void *data,
>   			     struct drm_file *file_private);
> +int drm_syncobj_query_ioctl(struct drm_device *dev, void *data,
> +			    struct drm_file *file_private);
>   
>   /* drm_framebuffer.c */
>   void drm_framebuffer_print_info(struct drm_printer *p, unsigned int indent,
> diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
> index a9a17ed35cc4..7578ef6dc1d1 100644
> --- a/drivers/gpu/drm/drm_ioctl.c
> +++ b/drivers/gpu/drm/drm_ioctl.c
> @@ -681,6 +681,8 @@ static const struct drm_ioctl_desc drm_ioctls[] = {
>   		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
>   	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_SIGNAL, drm_syncobj_signal_ioctl,
>   		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
> +	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_QUERY, drm_syncobj_query_ioctl,
> +		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
>   	DRM_IOCTL_DEF(DRM_IOCTL_CRTC_GET_SEQUENCE, drm_crtc_get_sequence_ioctl, DRM_UNLOCKED),
>   	DRM_IOCTL_DEF(DRM_IOCTL_CRTC_QUEUE_SEQUENCE, drm_crtc_queue_sequence_ioctl, DRM_UNLOCKED),
>   	DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATE_LEASE, drm_mode_create_lease_ioctl, DRM_MASTER|DRM_UNLOCKED),
> diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
> index 9dc54a345480..9ad58d0d21cd 100644
> --- a/drivers/gpu/drm/drm_syncobj.c
> +++ b/drivers/gpu/drm/drm_syncobj.c
> @@ -1291,3 +1291,55 @@ drm_syncobj_signal_ioctl(struct drm_device *dev, void *data,
>   
>   	return ret;
>   }
> +
> +static void drm_syncobj_timeline_query_payload(struct drm_syncobj *syncobj,
> +					       uint64_t *point)
> +{
> +	if (syncobj->type != DRM_SYNCOBJ_TYPE_TIMELINE) {
> +		DRM_ERROR("Normal syncobj cann't be queried!");
> +		*point = 0;
> +		return;
> +	}
> +	*point = syncobj->signal_point;
> +}
> +
> +int drm_syncobj_query_ioctl(struct drm_device *dev, void *data,
> +			    struct drm_file *file_private)
> +{
> +	struct drm_syncobj_timeline_query *args = data;
> +	struct drm_syncobj **syncobjs;
> +	uint64_t *points;
> +	uint32_t i;
> +	int ret;
> +
> +	if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ))
> +		return -ENODEV;
> +
> +	if (args->count_handles == 0)
> +		return -EINVAL;
> +
> +	ret = drm_syncobj_array_find(file_private,
> +				     u64_to_user_ptr(args->handles),
> +				     args->count_handles,
> +				     &syncobjs);
> +	if (ret < 0)
> +		return ret;
> +
> +
> +	points = kmalloc_array(args->count_handles, sizeof(*points),
> +			       GFP_KERNEL);
> +	if (points == NULL) {
> +		ret = -ENOMEM;
> +		goto out;
> +	}
> +	for (i = 0; i < args->count_handles; i++)
> +		drm_syncobj_timeline_query_payload(syncobjs[i], &points[i]);
> +	ret = copy_to_user(u64_to_user_ptr(args->points), points,
> +			   sizeof(uint64_t) * args->count_handles) ? -EFAULT : 0;

Is it really better to allocate an array for this? Why not just handle 
it entry by entry?

Christian.

> +
> +	kfree(points);
> +out:
> +	drm_syncobj_array_free(syncobjs, args->count_handles);
> +
> +	return ret;
> +}
> diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h
> index c8bc1414753d..23c4979d8a1c 100644
> --- a/include/uapi/drm/drm.h
> +++ b/include/uapi/drm/drm.h
> @@ -771,6 +771,15 @@ struct drm_syncobj_array {
>   	__u32 pad;
>   };
>   
> +struct drm_syncobj_timeline_query {
> +	__u64 handles;
> +	/* points are timeline syncobjs payloads returned by query ioctl */
> +	__u64 points;
> +	__u32 count_handles;
> +	__u32 pad;
> +};
> +
> +
>   /* Query current scanout sequence number */
>   struct drm_crtc_get_sequence {
>   	__u32 crtc_id;		/* requested crtc_id */
> @@ -928,6 +937,8 @@ extern "C" {
>   #define DRM_IOCTL_MODE_REVOKE_LEASE	DRM_IOWR(0xC9, struct drm_mode_revoke_lease)
>   
>   #define DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT	DRM_IOWR(0xCA, struct drm_syncobj_timeline_wait)
> +#define DRM_IOCTL_SYNCOBJ_QUERY		DRM_IOWR(0xCB, struct drm_syncobj_timeline_query)
> +
>   /**
>    * Device specific ioctls should only be in their respective headers
>    * The device specific ioctl range is from 0x40 to 0x9f.

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/5] drm: add timeline support for syncobj export/import
  2018-11-02  8:25 ` [PATCH 3/5] drm: add timeline support for syncobj export/import Chunming Zhou
@ 2018-11-02  8:46   ` Christian König
  2018-11-02  9:42     ` zhoucm1
  0 siblings, 1 reply; 13+ messages in thread
From: Christian König @ 2018-11-02  8:46 UTC (permalink / raw)
  To: Chunming Zhou, dri-devel
  Cc: Dave Airlie, Daniel Rakos, Christian König, Jason Ekstrand

Am 02.11.18 um 09:25 schrieb Chunming Zhou:
> user space can specify timeline point fence to export/import.
>
> Signed-off-by: Chunming Zhou <david1.zhou@amd.com>
> Cc: Daniel Rakos <Daniel.Rakos@amd.com>
> Cc: Jason Ekstrand <jason@jlekstrand.net>
> Cc: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
> Cc: Dave Airlie <airlied@redhat.com>
> Cc: Christian König <christian.koenig@amd.com>
> Cc: Chris Wilson <chris@chris-wilson.co.uk>

 From the coding it looks good to me, but I can't judge if that really 
makes sense to export/import individual points.

I would have rather expected that always the whole timeline is 
exported/imported. Otherwise the whole thing with waiting for sync 
points to appear doesn't really make sense to me.

Christian.

> ---
>   drivers/gpu/drm/drm_internal.h |  4 ++
>   drivers/gpu/drm/drm_ioctl.c    |  4 ++
>   drivers/gpu/drm/drm_syncobj.c  | 76 ++++++++++++++++++++++++++++++----
>   include/uapi/drm/drm.h         | 11 +++++
>   4 files changed, 88 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_internal.h b/drivers/gpu/drm/drm_internal.h
> index 9c4826411a3c..5ad6cbdb68ab 100644
> --- a/drivers/gpu/drm/drm_internal.h
> +++ b/drivers/gpu/drm/drm_internal.h
> @@ -181,6 +181,10 @@ int drm_syncobj_handle_to_fd_ioctl(struct drm_device *dev, void *data,
>   				   struct drm_file *file_private);
>   int drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, void *data,
>   				   struct drm_file *file_private);
> +int drm_syncobj_handle_to_fd_ioctl2(struct drm_device *dev, void *data,
> +				    struct drm_file *file_private);
> +int drm_syncobj_fd_to_handle_ioctl2(struct drm_device *dev, void *data,
> +				    struct drm_file *file_private);
>   int drm_syncobj_wait_ioctl(struct drm_device *dev, void *data,
>   			   struct drm_file *file_private);
>   int drm_syncobj_timeline_wait_ioctl(struct drm_device *dev, void *data,
> diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
> index 7578ef6dc1d1..364d26e949cf 100644
> --- a/drivers/gpu/drm/drm_ioctl.c
> +++ b/drivers/gpu/drm/drm_ioctl.c
> @@ -673,6 +673,10 @@ static const struct drm_ioctl_desc drm_ioctls[] = {
>   		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
>   	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE, drm_syncobj_fd_to_handle_ioctl,
>   		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
> +	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD2, drm_syncobj_handle_to_fd_ioctl2,
> +		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
> +	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE2, drm_syncobj_fd_to_handle_ioctl2,
> +		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
>   	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_WAIT, drm_syncobj_wait_ioctl,
>   		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
>   	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT, drm_syncobj_timeline_wait_ioctl,
> diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
> index 9ad58d0d21cd..dffc42ba2f91 100644
> --- a/drivers/gpu/drm/drm_syncobj.c
> +++ b/drivers/gpu/drm/drm_syncobj.c
> @@ -677,7 +677,7 @@ static int drm_syncobj_fd_to_handle(struct drm_file *file_private,
>   }
>   
>   static int drm_syncobj_import_sync_file_fence(struct drm_file *file_private,
> -					      int fd, int handle)
> +					      int fd, int handle, uint64_t point)
>   {
>   	struct dma_fence *fence = sync_file_get_fence(fd);
>   	struct drm_syncobj *syncobj;
> @@ -691,14 +691,14 @@ static int drm_syncobj_import_sync_file_fence(struct drm_file *file_private,
>   		return -ENOENT;
>   	}
>   
> -	drm_syncobj_replace_fence(syncobj, 0, fence);
> +	drm_syncobj_replace_fence(syncobj, point, fence);
>   	dma_fence_put(fence);
>   	drm_syncobj_put(syncobj);
>   	return 0;
>   }
>   
>   static int drm_syncobj_export_sync_file(struct drm_file *file_private,
> -					int handle, int *p_fd)
> +					int handle, uint64_t point, int *p_fd)
>   {
>   	int ret;
>   	struct dma_fence *fence;
> @@ -708,7 +708,7 @@ static int drm_syncobj_export_sync_file(struct drm_file *file_private,
>   	if (fd < 0)
>   		return fd;
>   
> -	ret = drm_syncobj_find_fence(file_private, handle, 0, 0, &fence);
> +	ret = drm_syncobj_find_fence(file_private, handle, point, 0, &fence);
>   	if (ret)
>   		goto err_put_fd;
>   
> @@ -817,9 +817,14 @@ drm_syncobj_handle_to_fd_ioctl(struct drm_device *dev, void *data,
>   	    args->flags != DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
>   		return -EINVAL;
>   
> -	if (args->flags & DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
> +	if (args->flags & DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE) {
> +		struct drm_syncobj *syncobj = drm_syncobj_find(file_private,
> +							       args->handle);
> +		if (!syncobj || syncobj->type != DRM_SYNCOBJ_TYPE_BINARY)
> +			return -EINVAL;
>   		return drm_syncobj_export_sync_file(file_private, args->handle,
> -						    &args->fd);
> +						    0, &args->fd);
> +	}
>   
>   	return drm_syncobj_handle_to_fd(file_private, args->handle,
>   					&args->fd);
> @@ -841,15 +846,72 @@ drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, void *data,
>   	    args->flags != DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE)
>   		return -EINVAL;
>   
> +	if (args->flags & DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE) {
> +		struct drm_syncobj *syncobj = drm_syncobj_find(file_private,
> +							       args->handle);
> +		if (!syncobj || syncobj->type != DRM_SYNCOBJ_TYPE_BINARY)
> +			return -EINVAL;
> +		return drm_syncobj_import_sync_file_fence(file_private,
> +							  args->fd,
> +							  args->handle,
> +							  0);
> +	}
> +
> +	return drm_syncobj_fd_to_handle(file_private, args->fd,
> +					&args->handle);
> +}
> +
> +int
> +drm_syncobj_handle_to_fd_ioctl2(struct drm_device *dev, void *data,
> +				   struct drm_file *file_private)
> +{
> +	struct drm_syncobj_handle2 *args = data;
> +
> +	if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ))
> +		return -ENODEV;
> +
> +	if (args->pad)
> +		return -EINVAL;
> +
> +	if (args->flags != 0 &&
> +	    args->flags != DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
> +		return -EINVAL;
> +
> +	if (args->flags & DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
> +		return drm_syncobj_export_sync_file(file_private, args->handle,
> +						    args->point, &args->fd);
> +
> +	return drm_syncobj_handle_to_fd(file_private, args->handle,
> +					&args->fd);
> +}
> +
> +int
> +drm_syncobj_fd_to_handle_ioctl2(struct drm_device *dev, void *data,
> +				   struct drm_file *file_private)
> +{
> +	struct drm_syncobj_handle2 *args = data;
> +
> +	if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ))
> +		return -ENODEV;
> +
> +	if (args->pad)
> +		return -EINVAL;
> +
> +	if (args->flags != 0 &&
> +	    args->flags != DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE)
> +		return -EINVAL;
> +
>   	if (args->flags & DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE)
>   		return drm_syncobj_import_sync_file_fence(file_private,
>   							  args->fd,
> -							  args->handle);
> +							  args->handle,
> +							  args->point);
>   
>   	return drm_syncobj_fd_to_handle(file_private, args->fd,
>   					&args->handle);
>   }
>   
> +
>   struct syncobj_wait_entry {
>   	struct task_struct *task;
>   	struct dma_fence *fence;
> diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h
> index 23c4979d8a1c..da5df2a42fc3 100644
> --- a/include/uapi/drm/drm.h
> +++ b/include/uapi/drm/drm.h
> @@ -735,6 +735,15 @@ struct drm_syncobj_handle {
>   	__s32 fd;
>   	__u32 pad;
>   };
> +struct drm_syncobj_handle2 {
> +	__u32 handle;
> +	__u32 flags;
> +	__u64 point;
> +
> +	__s32 fd;
> +	__u32 pad;
> +};
> +
>   
>   #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL (1 << 0)
>   #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT (1 << 1)
> @@ -938,6 +947,8 @@ extern "C" {
>   
>   #define DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT	DRM_IOWR(0xCA, struct drm_syncobj_timeline_wait)
>   #define DRM_IOCTL_SYNCOBJ_QUERY		DRM_IOWR(0xCB, struct drm_syncobj_timeline_query)
> +#define DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD2	DRM_IOWR(0xCC, struct drm_syncobj_handle2)
> +#define DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE2	DRM_IOWR(0xCD, struct drm_syncobj_handle2)
>   
>   /**
>    * Device specific ioctls should only be in their respective headers

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/5] drm: add timeline support for syncobj export/import
  2018-11-02  8:46   ` Christian König
@ 2018-11-02  9:42     ` zhoucm1
  2018-11-02  9:54       ` Koenig, Christian
  0 siblings, 1 reply; 13+ messages in thread
From: zhoucm1 @ 2018-11-02  9:42 UTC (permalink / raw)
  To: christian.koenig, Chunming Zhou, dri-devel
  Cc: Dave Airlie, Daniel Rakos, Jason Ekstrand



On 2018年11月02日 16:46, Christian König wrote:
> Am 02.11.18 um 09:25 schrieb Chunming Zhou:
>> user space can specify timeline point fence to export/import.
>>
>> Signed-off-by: Chunming Zhou <david1.zhou@amd.com>
>> Cc: Daniel Rakos <Daniel.Rakos@amd.com>
>> Cc: Jason Ekstrand <jason@jlekstrand.net>
>> Cc: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
>> Cc: Dave Airlie <airlied@redhat.com>
>> Cc: Christian König <christian.koenig@amd.com>
>> Cc: Chris Wilson <chris@chris-wilson.co.uk>
>
> From the coding it looks good to me, but I can't judge if that really 
> makes sense to export/import individual points.
>
> I would have rather expected that always the whole timeline is 
> exported/imported. Otherwise the whole thing with waiting for sync 
> points to appear doesn't really make sense to me.
We can Cpu wait on individual points, why can not we export/import them?
I confirmed with Daniel before, he said the extension need both them, 
export/import individual points and export/import the whole timeline 
semaphore.
More discussion is 
https://gitlab.khronos.org/vulkan/vulkan/merge_requests/2696

Thanks,
David Zhou
>
> Christian.
>
>> ---
>>   drivers/gpu/drm/drm_internal.h |  4 ++
>>   drivers/gpu/drm/drm_ioctl.c    |  4 ++
>>   drivers/gpu/drm/drm_syncobj.c  | 76 ++++++++++++++++++++++++++++++----
>>   include/uapi/drm/drm.h         | 11 +++++
>>   4 files changed, 88 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/drm_internal.h 
>> b/drivers/gpu/drm/drm_internal.h
>> index 9c4826411a3c..5ad6cbdb68ab 100644
>> --- a/drivers/gpu/drm/drm_internal.h
>> +++ b/drivers/gpu/drm/drm_internal.h
>> @@ -181,6 +181,10 @@ int drm_syncobj_handle_to_fd_ioctl(struct 
>> drm_device *dev, void *data,
>>                      struct drm_file *file_private);
>>   int drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, void *data,
>>                      struct drm_file *file_private);
>> +int drm_syncobj_handle_to_fd_ioctl2(struct drm_device *dev, void *data,
>> +                    struct drm_file *file_private);
>> +int drm_syncobj_fd_to_handle_ioctl2(struct drm_device *dev, void *data,
>> +                    struct drm_file *file_private);
>>   int drm_syncobj_wait_ioctl(struct drm_device *dev, void *data,
>>                  struct drm_file *file_private);
>>   int drm_syncobj_timeline_wait_ioctl(struct drm_device *dev, void 
>> *data,
>> diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
>> index 7578ef6dc1d1..364d26e949cf 100644
>> --- a/drivers/gpu/drm/drm_ioctl.c
>> +++ b/drivers/gpu/drm/drm_ioctl.c
>> @@ -673,6 +673,10 @@ static const struct drm_ioctl_desc drm_ioctls[] = {
>>                 DRM_UNLOCKED|DRM_RENDER_ALLOW),
>>       DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE, 
>> drm_syncobj_fd_to_handle_ioctl,
>>                 DRM_UNLOCKED|DRM_RENDER_ALLOW),
>> +    DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD2, 
>> drm_syncobj_handle_to_fd_ioctl2,
>> +              DRM_UNLOCKED|DRM_RENDER_ALLOW),
>> +    DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE2, 
>> drm_syncobj_fd_to_handle_ioctl2,
>> +              DRM_UNLOCKED|DRM_RENDER_ALLOW),
>>       DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_WAIT, drm_syncobj_wait_ioctl,
>>                 DRM_UNLOCKED|DRM_RENDER_ALLOW),
>>       DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT, 
>> drm_syncobj_timeline_wait_ioctl,
>> diff --git a/drivers/gpu/drm/drm_syncobj.c 
>> b/drivers/gpu/drm/drm_syncobj.c
>> index 9ad58d0d21cd..dffc42ba2f91 100644
>> --- a/drivers/gpu/drm/drm_syncobj.c
>> +++ b/drivers/gpu/drm/drm_syncobj.c
>> @@ -677,7 +677,7 @@ static int drm_syncobj_fd_to_handle(struct 
>> drm_file *file_private,
>>   }
>>     static int drm_syncobj_import_sync_file_fence(struct drm_file 
>> *file_private,
>> -                          int fd, int handle)
>> +                          int fd, int handle, uint64_t point)
>>   {
>>       struct dma_fence *fence = sync_file_get_fence(fd);
>>       struct drm_syncobj *syncobj;
>> @@ -691,14 +691,14 @@ static int 
>> drm_syncobj_import_sync_file_fence(struct drm_file *file_private,
>>           return -ENOENT;
>>       }
>>   -    drm_syncobj_replace_fence(syncobj, 0, fence);
>> +    drm_syncobj_replace_fence(syncobj, point, fence);
>>       dma_fence_put(fence);
>>       drm_syncobj_put(syncobj);
>>       return 0;
>>   }
>>     static int drm_syncobj_export_sync_file(struct drm_file 
>> *file_private,
>> -                    int handle, int *p_fd)
>> +                    int handle, uint64_t point, int *p_fd)
>>   {
>>       int ret;
>>       struct dma_fence *fence;
>> @@ -708,7 +708,7 @@ static int drm_syncobj_export_sync_file(struct 
>> drm_file *file_private,
>>       if (fd < 0)
>>           return fd;
>>   -    ret = drm_syncobj_find_fence(file_private, handle, 0, 0, &fence);
>> +    ret = drm_syncobj_find_fence(file_private, handle, point, 0, 
>> &fence);
>>       if (ret)
>>           goto err_put_fd;
>>   @@ -817,9 +817,14 @@ drm_syncobj_handle_to_fd_ioctl(struct 
>> drm_device *dev, void *data,
>>           args->flags != 
>> DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
>>           return -EINVAL;
>>   -    if (args->flags & 
>> DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
>> +    if (args->flags & 
>> DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE) {
>> +        struct drm_syncobj *syncobj = drm_syncobj_find(file_private,
>> +                                   args->handle);
>> +        if (!syncobj || syncobj->type != DRM_SYNCOBJ_TYPE_BINARY)
>> +            return -EINVAL;
>>           return drm_syncobj_export_sync_file(file_private, 
>> args->handle,
>> -                            &args->fd);
>> +                            0, &args->fd);
>> +    }
>>         return drm_syncobj_handle_to_fd(file_private, args->handle,
>>                       &args->fd);
>> @@ -841,15 +846,72 @@ drm_syncobj_fd_to_handle_ioctl(struct 
>> drm_device *dev, void *data,
>>           args->flags != 
>> DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE)
>>           return -EINVAL;
>>   +    if (args->flags & 
>> DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE) {
>> +        struct drm_syncobj *syncobj = drm_syncobj_find(file_private,
>> +                                   args->handle);
>> +        if (!syncobj || syncobj->type != DRM_SYNCOBJ_TYPE_BINARY)
>> +            return -EINVAL;
>> +        return drm_syncobj_import_sync_file_fence(file_private,
>> +                              args->fd,
>> +                              args->handle,
>> +                              0);
>> +    }
>> +
>> +    return drm_syncobj_fd_to_handle(file_private, args->fd,
>> +                    &args->handle);
>> +}
>> +
>> +int
>> +drm_syncobj_handle_to_fd_ioctl2(struct drm_device *dev, void *data,
>> +                   struct drm_file *file_private)
>> +{
>> +    struct drm_syncobj_handle2 *args = data;
>> +
>> +    if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ))
>> +        return -ENODEV;
>> +
>> +    if (args->pad)
>> +        return -EINVAL;
>> +
>> +    if (args->flags != 0 &&
>> +        args->flags != DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
>> +        return -EINVAL;
>> +
>> +    if (args->flags & DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
>> +        return drm_syncobj_export_sync_file(file_private, args->handle,
>> +                            args->point, &args->fd);
>> +
>> +    return drm_syncobj_handle_to_fd(file_private, args->handle,
>> +                    &args->fd);
>> +}
>> +
>> +int
>> +drm_syncobj_fd_to_handle_ioctl2(struct drm_device *dev, void *data,
>> +                   struct drm_file *file_private)
>> +{
>> +    struct drm_syncobj_handle2 *args = data;
>> +
>> +    if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ))
>> +        return -ENODEV;
>> +
>> +    if (args->pad)
>> +        return -EINVAL;
>> +
>> +    if (args->flags != 0 &&
>> +        args->flags != DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE)
>> +        return -EINVAL;
>> +
>>       if (args->flags & DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE)
>>           return drm_syncobj_import_sync_file_fence(file_private,
>>                                 args->fd,
>> -                              args->handle);
>> +                              args->handle,
>> +                              args->point);
>>         return drm_syncobj_fd_to_handle(file_private, args->fd,
>>                       &args->handle);
>>   }
>>   +
>>   struct syncobj_wait_entry {
>>       struct task_struct *task;
>>       struct dma_fence *fence;
>> diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h
>> index 23c4979d8a1c..da5df2a42fc3 100644
>> --- a/include/uapi/drm/drm.h
>> +++ b/include/uapi/drm/drm.h
>> @@ -735,6 +735,15 @@ struct drm_syncobj_handle {
>>       __s32 fd;
>>       __u32 pad;
>>   };
>> +struct drm_syncobj_handle2 {
>> +    __u32 handle;
>> +    __u32 flags;
>> +    __u64 point;
>> +
>> +    __s32 fd;
>> +    __u32 pad;
>> +};
>> +
>>     #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL (1 << 0)
>>   #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT (1 << 1)
>> @@ -938,6 +947,8 @@ extern "C" {
>>     #define DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT    DRM_IOWR(0xCA, struct 
>> drm_syncobj_timeline_wait)
>>   #define DRM_IOCTL_SYNCOBJ_QUERY        DRM_IOWR(0xCB, struct 
>> drm_syncobj_timeline_query)
>> +#define DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD2    DRM_IOWR(0xCC, struct 
>> drm_syncobj_handle2)
>> +#define DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE2    DRM_IOWR(0xCD, struct 
>> drm_syncobj_handle2)
>>     /**
>>    * Device specific ioctls should only be in their respective headers
>

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/5] drm: add timeline support for syncobj export/import
  2018-11-02  9:42     ` zhoucm1
@ 2018-11-02  9:54       ` Koenig, Christian
  2018-11-02 10:34         ` zhoucm1
  0 siblings, 1 reply; 13+ messages in thread
From: Koenig, Christian @ 2018-11-02  9:54 UTC (permalink / raw)
  To: Zhou, David(ChunMing); +Cc: Dave Airlie, Rakos, Daniel, Jason Ekstrand

Am 02.11.18 um 10:42 schrieb zhoucm1:
>
>
> On 2018年11月02日 16:46, Christian König wrote:
>> Am 02.11.18 um 09:25 schrieb Chunming Zhou:
>>> user space can specify timeline point fence to export/import.
>>>
>>> Signed-off-by: Chunming Zhou <david1.zhou@amd.com>
>>> Cc: Daniel Rakos <Daniel.Rakos@amd.com>
>>> Cc: Jason Ekstrand <jason@jlekstrand.net>
>>> Cc: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
>>> Cc: Dave Airlie <airlied@redhat.com>
>>> Cc: Christian König <christian.koenig@amd.com>
>>> Cc: Chris Wilson <chris@chris-wilson.co.uk>
>>
>> From the coding it looks good to me, but I can't judge if that really 
>> makes sense to export/import individual points.
>>
>> I would have rather expected that always the whole timeline is 
>> exported/imported. Otherwise the whole thing with waiting for sync 
>> points to appear doesn't really make sense to me.
> We can Cpu wait on individual points, why can not we export/import them?
> I confirmed with Daniel before, he said the extension need both them, 
> export/import individual points and export/import the whole timeline 
> semaphore.
> More discussion is 
> https://gitlab.khronos.org/vulkan/vulkan/merge_requests/2696

Ah! It looked initially to me that this was the only way to 
export/import timeline sync objects.

Thinking more about it wouldn't it be better to provide a function to 
signal a sync point from another sync point?

That would provide the same functionality, would be cleaner to implement 
and more flexible on top.

E.g. if you want to export only a specific sync point you first create a 
new syncobj and the move over this sync point into the syncobj.

Otherwise you mix multiple operations into one IOCTL and that is usually 
not a good idea.

Regards,
Christian.

>
> Thanks,
> David Zhou
>>
>> Christian.
>>
>>> ---
>>>   drivers/gpu/drm/drm_internal.h |  4 ++
>>>   drivers/gpu/drm/drm_ioctl.c    |  4 ++
>>>   drivers/gpu/drm/drm_syncobj.c  | 76 
>>> ++++++++++++++++++++++++++++++----
>>>   include/uapi/drm/drm.h         | 11 +++++
>>>   4 files changed, 88 insertions(+), 7 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/drm_internal.h 
>>> b/drivers/gpu/drm/drm_internal.h
>>> index 9c4826411a3c..5ad6cbdb68ab 100644
>>> --- a/drivers/gpu/drm/drm_internal.h
>>> +++ b/drivers/gpu/drm/drm_internal.h
>>> @@ -181,6 +181,10 @@ int drm_syncobj_handle_to_fd_ioctl(struct 
>>> drm_device *dev, void *data,
>>>                      struct drm_file *file_private);
>>>   int drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, void 
>>> *data,
>>>                      struct drm_file *file_private);
>>> +int drm_syncobj_handle_to_fd_ioctl2(struct drm_device *dev, void 
>>> *data,
>>> +                    struct drm_file *file_private);
>>> +int drm_syncobj_fd_to_handle_ioctl2(struct drm_device *dev, void 
>>> *data,
>>> +                    struct drm_file *file_private);
>>>   int drm_syncobj_wait_ioctl(struct drm_device *dev, void *data,
>>>                  struct drm_file *file_private);
>>>   int drm_syncobj_timeline_wait_ioctl(struct drm_device *dev, void 
>>> *data,
>>> diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
>>> index 7578ef6dc1d1..364d26e949cf 100644
>>> --- a/drivers/gpu/drm/drm_ioctl.c
>>> +++ b/drivers/gpu/drm/drm_ioctl.c
>>> @@ -673,6 +673,10 @@ static const struct drm_ioctl_desc drm_ioctls[] 
>>> = {
>>>                 DRM_UNLOCKED|DRM_RENDER_ALLOW),
>>>       DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE, 
>>> drm_syncobj_fd_to_handle_ioctl,
>>>                 DRM_UNLOCKED|DRM_RENDER_ALLOW),
>>> +    DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD2, 
>>> drm_syncobj_handle_to_fd_ioctl2,
>>> +              DRM_UNLOCKED|DRM_RENDER_ALLOW),
>>> +    DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE2, 
>>> drm_syncobj_fd_to_handle_ioctl2,
>>> +              DRM_UNLOCKED|DRM_RENDER_ALLOW),
>>>       DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_WAIT, drm_syncobj_wait_ioctl,
>>>                 DRM_UNLOCKED|DRM_RENDER_ALLOW),
>>>       DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT, 
>>> drm_syncobj_timeline_wait_ioctl,
>>> diff --git a/drivers/gpu/drm/drm_syncobj.c 
>>> b/drivers/gpu/drm/drm_syncobj.c
>>> index 9ad58d0d21cd..dffc42ba2f91 100644
>>> --- a/drivers/gpu/drm/drm_syncobj.c
>>> +++ b/drivers/gpu/drm/drm_syncobj.c
>>> @@ -677,7 +677,7 @@ static int drm_syncobj_fd_to_handle(struct 
>>> drm_file *file_private,
>>>   }
>>>     static int drm_syncobj_import_sync_file_fence(struct drm_file 
>>> *file_private,
>>> -                          int fd, int handle)
>>> +                          int fd, int handle, uint64_t point)
>>>   {
>>>       struct dma_fence *fence = sync_file_get_fence(fd);
>>>       struct drm_syncobj *syncobj;
>>> @@ -691,14 +691,14 @@ static int 
>>> drm_syncobj_import_sync_file_fence(struct drm_file *file_private,
>>>           return -ENOENT;
>>>       }
>>>   -    drm_syncobj_replace_fence(syncobj, 0, fence);
>>> +    drm_syncobj_replace_fence(syncobj, point, fence);
>>>       dma_fence_put(fence);
>>>       drm_syncobj_put(syncobj);
>>>       return 0;
>>>   }
>>>     static int drm_syncobj_export_sync_file(struct drm_file 
>>> *file_private,
>>> -                    int handle, int *p_fd)
>>> +                    int handle, uint64_t point, int *p_fd)
>>>   {
>>>       int ret;
>>>       struct dma_fence *fence;
>>> @@ -708,7 +708,7 @@ static int drm_syncobj_export_sync_file(struct 
>>> drm_file *file_private,
>>>       if (fd < 0)
>>>           return fd;
>>>   -    ret = drm_syncobj_find_fence(file_private, handle, 0, 0, 
>>> &fence);
>>> +    ret = drm_syncobj_find_fence(file_private, handle, point, 0, 
>>> &fence);
>>>       if (ret)
>>>           goto err_put_fd;
>>>   @@ -817,9 +817,14 @@ drm_syncobj_handle_to_fd_ioctl(struct 
>>> drm_device *dev, void *data,
>>>           args->flags != 
>>> DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
>>>           return -EINVAL;
>>>   -    if (args->flags & 
>>> DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
>>> +    if (args->flags & 
>>> DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE) {
>>> +        struct drm_syncobj *syncobj = drm_syncobj_find(file_private,
>>> +                                   args->handle);
>>> +        if (!syncobj || syncobj->type != DRM_SYNCOBJ_TYPE_BINARY)
>>> +            return -EINVAL;
>>>           return drm_syncobj_export_sync_file(file_private, 
>>> args->handle,
>>> -                            &args->fd);
>>> +                            0, &args->fd);
>>> +    }
>>>         return drm_syncobj_handle_to_fd(file_private, args->handle,
>>>                       &args->fd);
>>> @@ -841,15 +846,72 @@ drm_syncobj_fd_to_handle_ioctl(struct 
>>> drm_device *dev, void *data,
>>>           args->flags != 
>>> DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE)
>>>           return -EINVAL;
>>>   +    if (args->flags & 
>>> DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE) {
>>> +        struct drm_syncobj *syncobj = drm_syncobj_find(file_private,
>>> +                                   args->handle);
>>> +        if (!syncobj || syncobj->type != DRM_SYNCOBJ_TYPE_BINARY)
>>> +            return -EINVAL;
>>> +        return drm_syncobj_import_sync_file_fence(file_private,
>>> +                              args->fd,
>>> +                              args->handle,
>>> +                              0);
>>> +    }
>>> +
>>> +    return drm_syncobj_fd_to_handle(file_private, args->fd,
>>> +                    &args->handle);
>>> +}
>>> +
>>> +int
>>> +drm_syncobj_handle_to_fd_ioctl2(struct drm_device *dev, void *data,
>>> +                   struct drm_file *file_private)
>>> +{
>>> +    struct drm_syncobj_handle2 *args = data;
>>> +
>>> +    if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ))
>>> +        return -ENODEV;
>>> +
>>> +    if (args->pad)
>>> +        return -EINVAL;
>>> +
>>> +    if (args->flags != 0 &&
>>> +        args->flags != 
>>> DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
>>> +        return -EINVAL;
>>> +
>>> +    if (args->flags & DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
>>> +        return drm_syncobj_export_sync_file(file_private, 
>>> args->handle,
>>> +                            args->point, &args->fd);
>>> +
>>> +    return drm_syncobj_handle_to_fd(file_private, args->handle,
>>> +                    &args->fd);
>>> +}
>>> +
>>> +int
>>> +drm_syncobj_fd_to_handle_ioctl2(struct drm_device *dev, void *data,
>>> +                   struct drm_file *file_private)
>>> +{
>>> +    struct drm_syncobj_handle2 *args = data;
>>> +
>>> +    if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ))
>>> +        return -ENODEV;
>>> +
>>> +    if (args->pad)
>>> +        return -EINVAL;
>>> +
>>> +    if (args->flags != 0 &&
>>> +        args->flags != 
>>> DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE)
>>> +        return -EINVAL;
>>> +
>>>       if (args->flags & 
>>> DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE)
>>>           return drm_syncobj_import_sync_file_fence(file_private,
>>>                                 args->fd,
>>> -                              args->handle);
>>> +                              args->handle,
>>> +                              args->point);
>>>         return drm_syncobj_fd_to_handle(file_private, args->fd,
>>>                       &args->handle);
>>>   }
>>>   +
>>>   struct syncobj_wait_entry {
>>>       struct task_struct *task;
>>>       struct dma_fence *fence;
>>> diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h
>>> index 23c4979d8a1c..da5df2a42fc3 100644
>>> --- a/include/uapi/drm/drm.h
>>> +++ b/include/uapi/drm/drm.h
>>> @@ -735,6 +735,15 @@ struct drm_syncobj_handle {
>>>       __s32 fd;
>>>       __u32 pad;
>>>   };
>>> +struct drm_syncobj_handle2 {
>>> +    __u32 handle;
>>> +    __u32 flags;
>>> +    __u64 point;
>>> +
>>> +    __s32 fd;
>>> +    __u32 pad;
>>> +};
>>> +
>>>     #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL (1 << 0)
>>>   #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT (1 << 1)
>>> @@ -938,6 +947,8 @@ extern "C" {
>>>     #define DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT    DRM_IOWR(0xCA, struct 
>>> drm_syncobj_timeline_wait)
>>>   #define DRM_IOCTL_SYNCOBJ_QUERY        DRM_IOWR(0xCB, struct 
>>> drm_syncobj_timeline_query)
>>> +#define DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD2    DRM_IOWR(0xCC, struct 
>>> drm_syncobj_handle2)
>>> +#define DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE2    DRM_IOWR(0xCD, struct 
>>> drm_syncobj_handle2)
>>>     /**
>>>    * Device specific ioctls should only be in their respective headers
>>
>

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/5] drm: add timeline support for syncobj export/import
  2018-11-02  9:54       ` Koenig, Christian
@ 2018-11-02 10:34         ` zhoucm1
  2018-11-05 12:13           ` Koenig, Christian
  0 siblings, 1 reply; 13+ messages in thread
From: zhoucm1 @ 2018-11-02 10:34 UTC (permalink / raw)
  To: Koenig, Christian, Zhou, David(ChunMing),
	dri-devel@lists.freedesktop.org
  Cc: Dave Airlie, Rakos, Daniel, Jason Ekstrand


On 2018年11月02日 17:54, Koenig, Christian wrote:
> Am 02.11.18 um 10:42 schrieb zhoucm1:
>>
>> On 2018年11月02日 16:46, Christian König wrote:
>>> Am 02.11.18 um 09:25 schrieb Chunming Zhou:
>>>> user space can specify timeline point fence to export/import.
>>>>
>>>> Signed-off-by: Chunming Zhou <david1.zhou@amd.com>
>>>> Cc: Daniel Rakos <Daniel.Rakos@amd.com>
>>>> Cc: Jason Ekstrand <jason@jlekstrand.net>
>>>> Cc: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
>>>> Cc: Dave Airlie <airlied@redhat.com>
>>>> Cc: Christian König <christian.koenig@amd.com>
>>>> Cc: Chris Wilson <chris@chris-wilson.co.uk>
>>>  From the coding it looks good to me, but I can't judge if that really
>>> makes sense to export/import individual points.
>>>
>>> I would have rather expected that always the whole timeline is
>>> exported/imported. Otherwise the whole thing with waiting for sync
>>> points to appear doesn't really make sense to me.
>> We can Cpu wait on individual points, why can not we export/import them?
>> I confirmed with Daniel before, he said the extension need both them,
>> export/import individual points and export/import the whole timeline
>> semaphore.
>> More discussion is
>> https://gitlab.khronos.org/vulkan/vulkan/merge_requests/2696
> Ah! It looked initially to me that this was the only way to
> export/import timeline sync objects.
>
> Thinking more about it wouldn't it be better to provide a function to
> signal a sync point from another sync point?
>
> That would provide the same functionality, would be cleaner to implement
> and more flexible on top.
>
> E.g. if you want to export only a specific sync point you first create a
> new syncobj and the move over this sync point into the syncobj.
Sorry, I didn't completely get your means. Could you detail a bit?
but I think we need to meet export/import goals:
1. export sepcific sync point or binary syncobj fence to sync file fd or 
handle.
2. import fence from fd/handle to timeline sync point or banory syncobj.
3. export/import the whole timeline seamphore.

I'm still not sure how you mentioned can achieve these.

Thanks,
David
>
> Otherwise you mix multiple operations into one IOCTL and that is usually
> not a good idea.
>
> Regards,
> Christian.
>
>> Thanks,
>> David Zhou
>>> Christian.
>>>
>>>> ---
>>>>    drivers/gpu/drm/drm_internal.h |  4 ++
>>>>    drivers/gpu/drm/drm_ioctl.c    |  4 ++
>>>>    drivers/gpu/drm/drm_syncobj.c  | 76
>>>> ++++++++++++++++++++++++++++++----
>>>>    include/uapi/drm/drm.h         | 11 +++++
>>>>    4 files changed, 88 insertions(+), 7 deletions(-)
>>>>
>>>> diff --git a/drivers/gpu/drm/drm_internal.h
>>>> b/drivers/gpu/drm/drm_internal.h
>>>> index 9c4826411a3c..5ad6cbdb68ab 100644
>>>> --- a/drivers/gpu/drm/drm_internal.h
>>>> +++ b/drivers/gpu/drm/drm_internal.h
>>>> @@ -181,6 +181,10 @@ int drm_syncobj_handle_to_fd_ioctl(struct
>>>> drm_device *dev, void *data,
>>>>                       struct drm_file *file_private);
>>>>    int drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, void
>>>> *data,
>>>>                       struct drm_file *file_private);
>>>> +int drm_syncobj_handle_to_fd_ioctl2(struct drm_device *dev, void
>>>> *data,
>>>> +                    struct drm_file *file_private);
>>>> +int drm_syncobj_fd_to_handle_ioctl2(struct drm_device *dev, void
>>>> *data,
>>>> +                    struct drm_file *file_private);
>>>>    int drm_syncobj_wait_ioctl(struct drm_device *dev, void *data,
>>>>                   struct drm_file *file_private);
>>>>    int drm_syncobj_timeline_wait_ioctl(struct drm_device *dev, void
>>>> *data,
>>>> diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
>>>> index 7578ef6dc1d1..364d26e949cf 100644
>>>> --- a/drivers/gpu/drm/drm_ioctl.c
>>>> +++ b/drivers/gpu/drm/drm_ioctl.c
>>>> @@ -673,6 +673,10 @@ static const struct drm_ioctl_desc drm_ioctls[]
>>>> = {
>>>>                  DRM_UNLOCKED|DRM_RENDER_ALLOW),
>>>>        DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE,
>>>> drm_syncobj_fd_to_handle_ioctl,
>>>>                  DRM_UNLOCKED|DRM_RENDER_ALLOW),
>>>> +    DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD2,
>>>> drm_syncobj_handle_to_fd_ioctl2,
>>>> +              DRM_UNLOCKED|DRM_RENDER_ALLOW),
>>>> +    DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE2,
>>>> drm_syncobj_fd_to_handle_ioctl2,
>>>> +              DRM_UNLOCKED|DRM_RENDER_ALLOW),
>>>>        DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_WAIT, drm_syncobj_wait_ioctl,
>>>>                  DRM_UNLOCKED|DRM_RENDER_ALLOW),
>>>>        DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT,
>>>> drm_syncobj_timeline_wait_ioctl,
>>>> diff --git a/drivers/gpu/drm/drm_syncobj.c
>>>> b/drivers/gpu/drm/drm_syncobj.c
>>>> index 9ad58d0d21cd..dffc42ba2f91 100644
>>>> --- a/drivers/gpu/drm/drm_syncobj.c
>>>> +++ b/drivers/gpu/drm/drm_syncobj.c
>>>> @@ -677,7 +677,7 @@ static int drm_syncobj_fd_to_handle(struct
>>>> drm_file *file_private,
>>>>    }
>>>>      static int drm_syncobj_import_sync_file_fence(struct drm_file
>>>> *file_private,
>>>> -                          int fd, int handle)
>>>> +                          int fd, int handle, uint64_t point)
>>>>    {
>>>>        struct dma_fence *fence = sync_file_get_fence(fd);
>>>>        struct drm_syncobj *syncobj;
>>>> @@ -691,14 +691,14 @@ static int
>>>> drm_syncobj_import_sync_file_fence(struct drm_file *file_private,
>>>>            return -ENOENT;
>>>>        }
>>>>    -    drm_syncobj_replace_fence(syncobj, 0, fence);
>>>> +    drm_syncobj_replace_fence(syncobj, point, fence);
>>>>        dma_fence_put(fence);
>>>>        drm_syncobj_put(syncobj);
>>>>        return 0;
>>>>    }
>>>>      static int drm_syncobj_export_sync_file(struct drm_file
>>>> *file_private,
>>>> -                    int handle, int *p_fd)
>>>> +                    int handle, uint64_t point, int *p_fd)
>>>>    {
>>>>        int ret;
>>>>        struct dma_fence *fence;
>>>> @@ -708,7 +708,7 @@ static int drm_syncobj_export_sync_file(struct
>>>> drm_file *file_private,
>>>>        if (fd < 0)
>>>>            return fd;
>>>>    -    ret = drm_syncobj_find_fence(file_private, handle, 0, 0,
>>>> &fence);
>>>> +    ret = drm_syncobj_find_fence(file_private, handle, point, 0,
>>>> &fence);
>>>>        if (ret)
>>>>            goto err_put_fd;
>>>>    @@ -817,9 +817,14 @@ drm_syncobj_handle_to_fd_ioctl(struct
>>>> drm_device *dev, void *data,
>>>>            args->flags !=
>>>> DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
>>>>            return -EINVAL;
>>>>    -    if (args->flags &
>>>> DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
>>>> +    if (args->flags &
>>>> DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE) {
>>>> +        struct drm_syncobj *syncobj = drm_syncobj_find(file_private,
>>>> +                                   args->handle);
>>>> +        if (!syncobj || syncobj->type != DRM_SYNCOBJ_TYPE_BINARY)
>>>> +            return -EINVAL;
>>>>            return drm_syncobj_export_sync_file(file_private,
>>>> args->handle,
>>>> -                            &args->fd);
>>>> +                            0, &args->fd);
>>>> +    }
>>>>          return drm_syncobj_handle_to_fd(file_private, args->handle,
>>>>                        &args->fd);
>>>> @@ -841,15 +846,72 @@ drm_syncobj_fd_to_handle_ioctl(struct
>>>> drm_device *dev, void *data,
>>>>            args->flags !=
>>>> DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE)
>>>>            return -EINVAL;
>>>>    +    if (args->flags &
>>>> DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE) {
>>>> +        struct drm_syncobj *syncobj = drm_syncobj_find(file_private,
>>>> +                                   args->handle);
>>>> +        if (!syncobj || syncobj->type != DRM_SYNCOBJ_TYPE_BINARY)
>>>> +            return -EINVAL;
>>>> +        return drm_syncobj_import_sync_file_fence(file_private,
>>>> +                              args->fd,
>>>> +                              args->handle,
>>>> +                              0);
>>>> +    }
>>>> +
>>>> +    return drm_syncobj_fd_to_handle(file_private, args->fd,
>>>> +                    &args->handle);
>>>> +}
>>>> +
>>>> +int
>>>> +drm_syncobj_handle_to_fd_ioctl2(struct drm_device *dev, void *data,
>>>> +                   struct drm_file *file_private)
>>>> +{
>>>> +    struct drm_syncobj_handle2 *args = data;
>>>> +
>>>> +    if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ))
>>>> +        return -ENODEV;
>>>> +
>>>> +    if (args->pad)
>>>> +        return -EINVAL;
>>>> +
>>>> +    if (args->flags != 0 &&
>>>> +        args->flags !=
>>>> DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
>>>> +        return -EINVAL;
>>>> +
>>>> +    if (args->flags & DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
>>>> +        return drm_syncobj_export_sync_file(file_private,
>>>> args->handle,
>>>> +                            args->point, &args->fd);
>>>> +
>>>> +    return drm_syncobj_handle_to_fd(file_private, args->handle,
>>>> +                    &args->fd);
>>>> +}
>>>> +
>>>> +int
>>>> +drm_syncobj_fd_to_handle_ioctl2(struct drm_device *dev, void *data,
>>>> +                   struct drm_file *file_private)
>>>> +{
>>>> +    struct drm_syncobj_handle2 *args = data;
>>>> +
>>>> +    if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ))
>>>> +        return -ENODEV;
>>>> +
>>>> +    if (args->pad)
>>>> +        return -EINVAL;
>>>> +
>>>> +    if (args->flags != 0 &&
>>>> +        args->flags !=
>>>> DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE)
>>>> +        return -EINVAL;
>>>> +
>>>>        if (args->flags &
>>>> DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE)
>>>>            return drm_syncobj_import_sync_file_fence(file_private,
>>>>                                  args->fd,
>>>> -                              args->handle);
>>>> +                              args->handle,
>>>> +                              args->point);
>>>>          return drm_syncobj_fd_to_handle(file_private, args->fd,
>>>>                        &args->handle);
>>>>    }
>>>>    +
>>>>    struct syncobj_wait_entry {
>>>>        struct task_struct *task;
>>>>        struct dma_fence *fence;
>>>> diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h
>>>> index 23c4979d8a1c..da5df2a42fc3 100644
>>>> --- a/include/uapi/drm/drm.h
>>>> +++ b/include/uapi/drm/drm.h
>>>> @@ -735,6 +735,15 @@ struct drm_syncobj_handle {
>>>>        __s32 fd;
>>>>        __u32 pad;
>>>>    };
>>>> +struct drm_syncobj_handle2 {
>>>> +    __u32 handle;
>>>> +    __u32 flags;
>>>> +    __u64 point;
>>>> +
>>>> +    __s32 fd;
>>>> +    __u32 pad;
>>>> +};
>>>> +
>>>>      #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL (1 << 0)
>>>>    #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT (1 << 1)
>>>> @@ -938,6 +947,8 @@ extern "C" {
>>>>      #define DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT    DRM_IOWR(0xCA, struct
>>>> drm_syncobj_timeline_wait)
>>>>    #define DRM_IOCTL_SYNCOBJ_QUERY        DRM_IOWR(0xCB, struct
>>>> drm_syncobj_timeline_query)
>>>> +#define DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD2    DRM_IOWR(0xCC, struct
>>>> drm_syncobj_handle2)
>>>> +#define DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE2    DRM_IOWR(0xCD, struct
>>>> drm_syncobj_handle2)
>>>>      /**
>>>>     * Device specific ioctls should only be in their respective headers

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 3/5] drm: add timeline support for syncobj export/import
  2018-11-05  8:07 [PATCH 1/5] drm: add support of syncobj timeline point wait v5 Chunming Zhou
@ 2018-11-05  8:07 ` Chunming Zhou
  0 siblings, 0 replies; 13+ messages in thread
From: Chunming Zhou @ 2018-11-05  8:07 UTC (permalink / raw)
  To: dri-devel; +Cc: Daniel Rakos, Jason Ekstrand, Dave Airlie, Christian König

user space can specify timeline point fence to export/import.

Signed-off-by: Chunming Zhou <david1.zhou@amd.com>
Cc: Daniel Rakos <Daniel.Rakos@amd.com>
Cc: Jason Ekstrand <jason@jlekstrand.net>
Cc: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Cc: Dave Airlie <airlied@redhat.com>
Cc: Christian König <christian.koenig@amd.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
---
 drivers/gpu/drm/drm_internal.h |  4 ++
 drivers/gpu/drm/drm_ioctl.c    |  4 ++
 drivers/gpu/drm/drm_syncobj.c  | 76 ++++++++++++++++++++++++++++++----
 include/uapi/drm/drm.h         | 11 +++++
 4 files changed, 88 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/drm_internal.h b/drivers/gpu/drm/drm_internal.h
index 9c4826411a3c..5ad6cbdb68ab 100644
--- a/drivers/gpu/drm/drm_internal.h
+++ b/drivers/gpu/drm/drm_internal.h
@@ -181,6 +181,10 @@ int drm_syncobj_handle_to_fd_ioctl(struct drm_device *dev, void *data,
 				   struct drm_file *file_private);
 int drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, void *data,
 				   struct drm_file *file_private);
+int drm_syncobj_handle_to_fd_ioctl2(struct drm_device *dev, void *data,
+				    struct drm_file *file_private);
+int drm_syncobj_fd_to_handle_ioctl2(struct drm_device *dev, void *data,
+				    struct drm_file *file_private);
 int drm_syncobj_wait_ioctl(struct drm_device *dev, void *data,
 			   struct drm_file *file_private);
 int drm_syncobj_timeline_wait_ioctl(struct drm_device *dev, void *data,
diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
index 7578ef6dc1d1..364d26e949cf 100644
--- a/drivers/gpu/drm/drm_ioctl.c
+++ b/drivers/gpu/drm/drm_ioctl.c
@@ -673,6 +673,10 @@ static const struct drm_ioctl_desc drm_ioctls[] = {
 		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
 	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE, drm_syncobj_fd_to_handle_ioctl,
 		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
+	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD2, drm_syncobj_handle_to_fd_ioctl2,
+		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
+	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE2, drm_syncobj_fd_to_handle_ioctl2,
+		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
 	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_WAIT, drm_syncobj_wait_ioctl,
 		      DRM_UNLOCKED|DRM_RENDER_ALLOW),
 	DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT, drm_syncobj_timeline_wait_ioctl,
diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
index a01b17992213..176b8fa6eeb9 100644
--- a/drivers/gpu/drm/drm_syncobj.c
+++ b/drivers/gpu/drm/drm_syncobj.c
@@ -677,7 +677,7 @@ static int drm_syncobj_fd_to_handle(struct drm_file *file_private,
 }
 
 static int drm_syncobj_import_sync_file_fence(struct drm_file *file_private,
-					      int fd, int handle)
+					      int fd, int handle, uint64_t point)
 {
 	struct dma_fence *fence = sync_file_get_fence(fd);
 	struct drm_syncobj *syncobj;
@@ -691,14 +691,14 @@ static int drm_syncobj_import_sync_file_fence(struct drm_file *file_private,
 		return -ENOENT;
 	}
 
-	drm_syncobj_replace_fence(syncobj, 0, fence);
+	drm_syncobj_replace_fence(syncobj, point, fence);
 	dma_fence_put(fence);
 	drm_syncobj_put(syncobj);
 	return 0;
 }
 
 static int drm_syncobj_export_sync_file(struct drm_file *file_private,
-					int handle, int *p_fd)
+					int handle, uint64_t point, int *p_fd)
 {
 	int ret;
 	struct dma_fence *fence;
@@ -708,7 +708,7 @@ static int drm_syncobj_export_sync_file(struct drm_file *file_private,
 	if (fd < 0)
 		return fd;
 
-	ret = drm_syncobj_find_fence(file_private, handle, 0, 0, &fence);
+	ret = drm_syncobj_find_fence(file_private, handle, point, 0, &fence);
 	if (ret)
 		goto err_put_fd;
 
@@ -817,9 +817,14 @@ drm_syncobj_handle_to_fd_ioctl(struct drm_device *dev, void *data,
 	    args->flags != DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
 		return -EINVAL;
 
-	if (args->flags & DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
+	if (args->flags & DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE) {
+		struct drm_syncobj *syncobj = drm_syncobj_find(file_private,
+							       args->handle);
+		if (!syncobj || syncobj->type != DRM_SYNCOBJ_TYPE_BINARY)
+			return -EINVAL;
 		return drm_syncobj_export_sync_file(file_private, args->handle,
-						    &args->fd);
+						    0, &args->fd);
+	}
 
 	return drm_syncobj_handle_to_fd(file_private, args->handle,
 					&args->fd);
@@ -841,15 +846,72 @@ drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, void *data,
 	    args->flags != DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE)
 		return -EINVAL;
 
+	if (args->flags & DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE) {
+		struct drm_syncobj *syncobj = drm_syncobj_find(file_private,
+							       args->handle);
+		if (!syncobj || syncobj->type != DRM_SYNCOBJ_TYPE_BINARY)
+			return -EINVAL;
+		return drm_syncobj_import_sync_file_fence(file_private,
+							  args->fd,
+							  args->handle,
+							  0);
+	}
+
+	return drm_syncobj_fd_to_handle(file_private, args->fd,
+					&args->handle);
+}
+
+int
+drm_syncobj_handle_to_fd_ioctl2(struct drm_device *dev, void *data,
+				   struct drm_file *file_private)
+{
+	struct drm_syncobj_handle2 *args = data;
+
+	if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ))
+		return -ENODEV;
+
+	if (args->pad)
+		return -EINVAL;
+
+	if (args->flags != 0 &&
+	    args->flags != DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
+		return -EINVAL;
+
+	if (args->flags & DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
+		return drm_syncobj_export_sync_file(file_private, args->handle,
+						    args->point, &args->fd);
+
+	return drm_syncobj_handle_to_fd(file_private, args->handle,
+					&args->fd);
+}
+
+int
+drm_syncobj_fd_to_handle_ioctl2(struct drm_device *dev, void *data,
+				   struct drm_file *file_private)
+{
+	struct drm_syncobj_handle2 *args = data;
+
+	if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ))
+		return -ENODEV;
+
+	if (args->pad)
+		return -EINVAL;
+
+	if (args->flags != 0 &&
+	    args->flags != DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE)
+		return -EINVAL;
+
 	if (args->flags & DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE)
 		return drm_syncobj_import_sync_file_fence(file_private,
 							  args->fd,
-							  args->handle);
+							  args->handle,
+							  args->point);
 
 	return drm_syncobj_fd_to_handle(file_private, args->fd,
 					&args->handle);
 }
 
+
 struct syncobj_wait_entry {
 	struct task_struct *task;
 	struct dma_fence *fence;
diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h
index 23c4979d8a1c..da5df2a42fc3 100644
--- a/include/uapi/drm/drm.h
+++ b/include/uapi/drm/drm.h
@@ -735,6 +735,15 @@ struct drm_syncobj_handle {
 	__s32 fd;
 	__u32 pad;
 };
+struct drm_syncobj_handle2 {
+	__u32 handle;
+	__u32 flags;
+	__u64 point;
+
+	__s32 fd;
+	__u32 pad;
+};
+
 
 #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL (1 << 0)
 #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT (1 << 1)
@@ -938,6 +947,8 @@ extern "C" {
 
 #define DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT	DRM_IOWR(0xCA, struct drm_syncobj_timeline_wait)
 #define DRM_IOCTL_SYNCOBJ_QUERY		DRM_IOWR(0xCB, struct drm_syncobj_timeline_query)
+#define DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD2	DRM_IOWR(0xCC, struct drm_syncobj_handle2)
+#define DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE2	DRM_IOWR(0xCD, struct drm_syncobj_handle2)
 
 /**
  * Device specific ioctls should only be in their respective headers
-- 
2.17.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/5] drm: add timeline support for syncobj export/import
  2018-11-02 10:34         ` zhoucm1
@ 2018-11-05 12:13           ` Koenig, Christian
  0 siblings, 0 replies; 13+ messages in thread
From: Koenig, Christian @ 2018-11-05 12:13 UTC (permalink / raw)
  To: Zhou, David(ChunMing); +Cc: Dave Airlie, Rakos, Daniel, Jason Ekstrand

Am 02.11.18 um 11:34 schrieb zhoucm1:
>
> On 2018年11月02日 17:54, Koenig, Christian wrote:
>> Am 02.11.18 um 10:42 schrieb zhoucm1:
>>>
>>> On 2018年11月02日 16:46, Christian König wrote:
>>>> Am 02.11.18 um 09:25 schrieb Chunming Zhou:
>>>>> user space can specify timeline point fence to export/import.
>>>>>
>>>>> Signed-off-by: Chunming Zhou <david1.zhou@amd.com>
>>>>> Cc: Daniel Rakos <Daniel.Rakos@amd.com>
>>>>> Cc: Jason Ekstrand <jason@jlekstrand.net>
>>>>> Cc: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
>>>>> Cc: Dave Airlie <airlied@redhat.com>
>>>>> Cc: Christian König <christian.koenig@amd.com>
>>>>> Cc: Chris Wilson <chris@chris-wilson.co.uk>
>>>>  From the coding it looks good to me, but I can't judge if that really
>>>> makes sense to export/import individual points.
>>>>
>>>> I would have rather expected that always the whole timeline is
>>>> exported/imported. Otherwise the whole thing with waiting for sync
>>>> points to appear doesn't really make sense to me.
>>> We can Cpu wait on individual points, why can not we export/import 
>>> them?
>>> I confirmed with Daniel before, he said the extension need both them,
>>> export/import individual points and export/import the whole timeline
>>> semaphore.
>>> More discussion is
>>> https://gitlab.khronos.org/vulkan/vulkan/merge_requests/2696
>> Ah! It looked initially to me that this was the only way to
>> export/import timeline sync objects.
>>
>> Thinking more about it wouldn't it be better to provide a function to
>> signal a sync point from another sync point?
>>
>> That would provide the same functionality, would be cleaner to implement
>> and more flexible on top.
>>
>> E.g. if you want to export only a specific sync point you first create a
>> new syncobj and the move over this sync point into the syncobj.
> Sorry, I didn't completely get your means. Could you detail a bit?
> but I think we need to meet export/import goals:
> 1. export sepcific sync point or binary syncobj fence to sync file fd 
> or handle.

Well that is not an export nor import in the sense of the existing API 
because it creates new objects while the existing export function just 
return a different type of handle for the same object.

> 2. import fence from fd/handle to timeline sync point or banory syncobj.

My idea is to have a "transfer" function which says signal this syncobj 
from this other syncobj (both can either be timeline or binary).

This way you can handle quite a bunch of use cases with just a single 
function.

E.g. export a specific timeline point into an fd: Create a new syncobj, 
transfer your sync pointer from the existing object to that one, export 
it as fd.

Converting a timeline synobj into a binary: Create a new binary syncobj, 
transfer the last sync point from the existing to that new one.

etc etc...

Regards,
Christian.

> 3. export/import the whole timeline seamphore.
>
> I'm still not sure how you mentioned can achieve these.
>
> Thanks,
> David
>>
>> Otherwise you mix multiple operations into one IOCTL and that is usually
>> not a good idea.
>>
>> Regards,
>> Christian.
>>
>>> Thanks,
>>> David Zhou
>>>> Christian.
>>>>
>>>>> ---
>>>>>    drivers/gpu/drm/drm_internal.h |  4 ++
>>>>>    drivers/gpu/drm/drm_ioctl.c    |  4 ++
>>>>>    drivers/gpu/drm/drm_syncobj.c  | 76
>>>>> ++++++++++++++++++++++++++++++----
>>>>>    include/uapi/drm/drm.h         | 11 +++++
>>>>>    4 files changed, 88 insertions(+), 7 deletions(-)
>>>>>
>>>>> diff --git a/drivers/gpu/drm/drm_internal.h
>>>>> b/drivers/gpu/drm/drm_internal.h
>>>>> index 9c4826411a3c..5ad6cbdb68ab 100644
>>>>> --- a/drivers/gpu/drm/drm_internal.h
>>>>> +++ b/drivers/gpu/drm/drm_internal.h
>>>>> @@ -181,6 +181,10 @@ int drm_syncobj_handle_to_fd_ioctl(struct
>>>>> drm_device *dev, void *data,
>>>>>                       struct drm_file *file_private);
>>>>>    int drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, void
>>>>> *data,
>>>>>                       struct drm_file *file_private);
>>>>> +int drm_syncobj_handle_to_fd_ioctl2(struct drm_device *dev, void
>>>>> *data,
>>>>> +                    struct drm_file *file_private);
>>>>> +int drm_syncobj_fd_to_handle_ioctl2(struct drm_device *dev, void
>>>>> *data,
>>>>> +                    struct drm_file *file_private);
>>>>>    int drm_syncobj_wait_ioctl(struct drm_device *dev, void *data,
>>>>>                   struct drm_file *file_private);
>>>>>    int drm_syncobj_timeline_wait_ioctl(struct drm_device *dev, void
>>>>> *data,
>>>>> diff --git a/drivers/gpu/drm/drm_ioctl.c 
>>>>> b/drivers/gpu/drm/drm_ioctl.c
>>>>> index 7578ef6dc1d1..364d26e949cf 100644
>>>>> --- a/drivers/gpu/drm/drm_ioctl.c
>>>>> +++ b/drivers/gpu/drm/drm_ioctl.c
>>>>> @@ -673,6 +673,10 @@ static const struct drm_ioctl_desc drm_ioctls[]
>>>>> = {
>>>>>                  DRM_UNLOCKED|DRM_RENDER_ALLOW),
>>>>>        DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE,
>>>>> drm_syncobj_fd_to_handle_ioctl,
>>>>>                  DRM_UNLOCKED|DRM_RENDER_ALLOW),
>>>>> +    DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD2,
>>>>> drm_syncobj_handle_to_fd_ioctl2,
>>>>> +              DRM_UNLOCKED|DRM_RENDER_ALLOW),
>>>>> +    DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE2,
>>>>> drm_syncobj_fd_to_handle_ioctl2,
>>>>> +              DRM_UNLOCKED|DRM_RENDER_ALLOW),
>>>>>        DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_WAIT, drm_syncobj_wait_ioctl,
>>>>>                  DRM_UNLOCKED|DRM_RENDER_ALLOW),
>>>>>        DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT,
>>>>> drm_syncobj_timeline_wait_ioctl,
>>>>> diff --git a/drivers/gpu/drm/drm_syncobj.c
>>>>> b/drivers/gpu/drm/drm_syncobj.c
>>>>> index 9ad58d0d21cd..dffc42ba2f91 100644
>>>>> --- a/drivers/gpu/drm/drm_syncobj.c
>>>>> +++ b/drivers/gpu/drm/drm_syncobj.c
>>>>> @@ -677,7 +677,7 @@ static int drm_syncobj_fd_to_handle(struct
>>>>> drm_file *file_private,
>>>>>    }
>>>>>      static int drm_syncobj_import_sync_file_fence(struct drm_file
>>>>> *file_private,
>>>>> -                          int fd, int handle)
>>>>> +                          int fd, int handle, uint64_t point)
>>>>>    {
>>>>>        struct dma_fence *fence = sync_file_get_fence(fd);
>>>>>        struct drm_syncobj *syncobj;
>>>>> @@ -691,14 +691,14 @@ static int
>>>>> drm_syncobj_import_sync_file_fence(struct drm_file *file_private,
>>>>>            return -ENOENT;
>>>>>        }
>>>>>    -    drm_syncobj_replace_fence(syncobj, 0, fence);
>>>>> +    drm_syncobj_replace_fence(syncobj, point, fence);
>>>>>        dma_fence_put(fence);
>>>>>        drm_syncobj_put(syncobj);
>>>>>        return 0;
>>>>>    }
>>>>>      static int drm_syncobj_export_sync_file(struct drm_file
>>>>> *file_private,
>>>>> -                    int handle, int *p_fd)
>>>>> +                    int handle, uint64_t point, int *p_fd)
>>>>>    {
>>>>>        int ret;
>>>>>        struct dma_fence *fence;
>>>>> @@ -708,7 +708,7 @@ static int drm_syncobj_export_sync_file(struct
>>>>> drm_file *file_private,
>>>>>        if (fd < 0)
>>>>>            return fd;
>>>>>    -    ret = drm_syncobj_find_fence(file_private, handle, 0, 0,
>>>>> &fence);
>>>>> +    ret = drm_syncobj_find_fence(file_private, handle, point, 0,
>>>>> &fence);
>>>>>        if (ret)
>>>>>            goto err_put_fd;
>>>>>    @@ -817,9 +817,14 @@ drm_syncobj_handle_to_fd_ioctl(struct
>>>>> drm_device *dev, void *data,
>>>>>            args->flags !=
>>>>> DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
>>>>>            return -EINVAL;
>>>>>    -    if (args->flags &
>>>>> DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
>>>>> +    if (args->flags &
>>>>> DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE) {
>>>>> +        struct drm_syncobj *syncobj = drm_syncobj_find(file_private,
>>>>> +                                   args->handle);
>>>>> +        if (!syncobj || syncobj->type != DRM_SYNCOBJ_TYPE_BINARY)
>>>>> +            return -EINVAL;
>>>>>            return drm_syncobj_export_sync_file(file_private,
>>>>> args->handle,
>>>>> -                            &args->fd);
>>>>> +                            0, &args->fd);
>>>>> +    }
>>>>>          return drm_syncobj_handle_to_fd(file_private, args->handle,
>>>>>                        &args->fd);
>>>>> @@ -841,15 +846,72 @@ drm_syncobj_fd_to_handle_ioctl(struct
>>>>> drm_device *dev, void *data,
>>>>>            args->flags !=
>>>>> DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE)
>>>>>            return -EINVAL;
>>>>>    +    if (args->flags &
>>>>> DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE) {
>>>>> +        struct drm_syncobj *syncobj = drm_syncobj_find(file_private,
>>>>> +                                   args->handle);
>>>>> +        if (!syncobj || syncobj->type != DRM_SYNCOBJ_TYPE_BINARY)
>>>>> +            return -EINVAL;
>>>>> +        return drm_syncobj_import_sync_file_fence(file_private,
>>>>> +                              args->fd,
>>>>> +                              args->handle,
>>>>> +                              0);
>>>>> +    }
>>>>> +
>>>>> +    return drm_syncobj_fd_to_handle(file_private, args->fd,
>>>>> +                    &args->handle);
>>>>> +}
>>>>> +
>>>>> +int
>>>>> +drm_syncobj_handle_to_fd_ioctl2(struct drm_device *dev, void *data,
>>>>> +                   struct drm_file *file_private)
>>>>> +{
>>>>> +    struct drm_syncobj_handle2 *args = data;
>>>>> +
>>>>> +    if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ))
>>>>> +        return -ENODEV;
>>>>> +
>>>>> +    if (args->pad)
>>>>> +        return -EINVAL;
>>>>> +
>>>>> +    if (args->flags != 0 &&
>>>>> +        args->flags !=
>>>>> DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
>>>>> +        return -EINVAL;
>>>>> +
>>>>> +    if (args->flags & 
>>>>> DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE)
>>>>> +        return drm_syncobj_export_sync_file(file_private,
>>>>> args->handle,
>>>>> +                            args->point, &args->fd);
>>>>> +
>>>>> +    return drm_syncobj_handle_to_fd(file_private, args->handle,
>>>>> +                    &args->fd);
>>>>> +}
>>>>> +
>>>>> +int
>>>>> +drm_syncobj_fd_to_handle_ioctl2(struct drm_device *dev, void *data,
>>>>> +                   struct drm_file *file_private)
>>>>> +{
>>>>> +    struct drm_syncobj_handle2 *args = data;
>>>>> +
>>>>> +    if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ))
>>>>> +        return -ENODEV;
>>>>> +
>>>>> +    if (args->pad)
>>>>> +        return -EINVAL;
>>>>> +
>>>>> +    if (args->flags != 0 &&
>>>>> +        args->flags !=
>>>>> DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE)
>>>>> +        return -EINVAL;
>>>>> +
>>>>>        if (args->flags &
>>>>> DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE)
>>>>>            return drm_syncobj_import_sync_file_fence(file_private,
>>>>>                                  args->fd,
>>>>> -                              args->handle);
>>>>> +                              args->handle,
>>>>> +                              args->point);
>>>>>          return drm_syncobj_fd_to_handle(file_private, args->fd,
>>>>>                        &args->handle);
>>>>>    }
>>>>>    +
>>>>>    struct syncobj_wait_entry {
>>>>>        struct task_struct *task;
>>>>>        struct dma_fence *fence;
>>>>> diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h
>>>>> index 23c4979d8a1c..da5df2a42fc3 100644
>>>>> --- a/include/uapi/drm/drm.h
>>>>> +++ b/include/uapi/drm/drm.h
>>>>> @@ -735,6 +735,15 @@ struct drm_syncobj_handle {
>>>>>        __s32 fd;
>>>>>        __u32 pad;
>>>>>    };
>>>>> +struct drm_syncobj_handle2 {
>>>>> +    __u32 handle;
>>>>> +    __u32 flags;
>>>>> +    __u64 point;
>>>>> +
>>>>> +    __s32 fd;
>>>>> +    __u32 pad;
>>>>> +};
>>>>> +
>>>>>      #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL (1 << 0)
>>>>>    #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT (1 << 1)
>>>>> @@ -938,6 +947,8 @@ extern "C" {
>>>>>      #define DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT DRM_IOWR(0xCA, struct
>>>>> drm_syncobj_timeline_wait)
>>>>>    #define DRM_IOCTL_SYNCOBJ_QUERY        DRM_IOWR(0xCB, struct
>>>>> drm_syncobj_timeline_query)
>>>>> +#define DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD2    DRM_IOWR(0xCC, struct
>>>>> drm_syncobj_handle2)
>>>>> +#define DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE2    DRM_IOWR(0xCD, struct
>>>>> drm_syncobj_handle2)
>>>>>      /**
>>>>>     * Device specific ioctls should only be in their respective 
>>>>> headers
>

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2018-11-05 12:13 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-11-02  8:25 [PATCH 1/5] drm: add support of syncobj timeline point wait v4 Chunming Zhou
2018-11-02  8:25 ` [PATCH 2/5] drm: add timeline syncobj payload query ioctl v2 Chunming Zhou
2018-11-02  8:37   ` Christian König
2018-11-02  8:25 ` [PATCH 3/5] drm: add timeline support for syncobj export/import Chunming Zhou
2018-11-02  8:46   ` Christian König
2018-11-02  9:42     ` zhoucm1
2018-11-02  9:54       ` Koenig, Christian
2018-11-02 10:34         ` zhoucm1
2018-11-05 12:13           ` Koenig, Christian
2018-11-02  8:25 ` [PATCH 4/5] drm/amdgpu: add timeline support in amdgpu CS v2 Chunming Zhou
2018-11-02  8:25 ` [PATCH 5/5] drm/amdgpu: update version for timeline syncobj support in amdgpu Chunming Zhou
2018-11-02  8:35 ` [PATCH 1/5] drm: add support of syncobj timeline point wait v4 Christian König
  -- strict thread matches above, loose matches on Subject: below --
2018-11-05  8:07 [PATCH 1/5] drm: add support of syncobj timeline point wait v5 Chunming Zhou
2018-11-05  8:07 ` [PATCH 3/5] drm: add timeline support for syncobj export/import Chunming Zhou

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox