[PATCH 48/49] set-fence

Chris Wilson chris at chris-wilson.co.uk
Fri Nov 11 20:40:17 UTC 2016


---
 drivers/gpu/drm/i915/i915_gem.c | 39 +++++++++++++++++++++++++++++++++++++++
 include/uapi/drm/i915_drm.h     |  2 ++
 2 files changed, 41 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index f7c6adcaea4e..9fcee91be774 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -3916,6 +3916,45 @@ i915_gem_get_fence_ioctl(struct drm_device *dev, void *data,
 }
 
 int
+i915_gem_set_fence_ioctl(struct drm_device *dev, void *data,
+			 struct drm_file *file)
+{
+	struct drm_i915_gem_fence *arg = data;
+	struct drm_i915_gem_object *obj;
+	struct dma_fence *fence;
+	int err;
+
+	if (arg->flags & ~I915_FENCE_EXCLUSIVE)
+		return -EINVAL;
+
+	obj = i915_gem_object_lookup(file, arg->handle);
+	if (!obj)
+		return -ENOENT;
+
+	fence = sync_file_get_fence(arg->fence);
+	if (!fence) {
+		err = -EINVAL;
+		goto out;
+	}
+
+	err = 0;
+	ww_mutex_lock(&obj->resv->lock, NULL);
+	if (arg->flags & I915_FENCE_EXCLUSIVE) {
+		reservation_object_add_excl_fence(obj->resv, fence);
+	} else {
+		err = reservation_object_reserve_shared(obj->resv);
+		if (err == 0)
+			reservation_object_add_shared_fence(obj->resv, fence);
+	}
+	ww_mutex_unlock(&obj->resv->lock);
+	dma_fence_put(fence);
+
+out:
+	i915_gem_object_put(obj);
+	return err;
+}
+
+int
 i915_gem_throttle_ioctl(struct drm_device *dev, void *data,
 			struct drm_file *file_priv)
 {
diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h
index b8795660b0f8..4eedb785fde7 100644
--- a/include/uapi/drm/i915_drm.h
+++ b/include/uapi/drm/i915_drm.h
@@ -260,6 +260,7 @@ typedef struct _drm_i915_sarea {
 #define DRM_I915_GEM_CONTEXT_GETPARAM	0x34
 #define DRM_I915_GEM_CONTEXT_SETPARAM	0x35
 #define DRM_I915_GEM_GET_FENCE		0x36
+#define DRM_I915_GEM_SET_FENCE		0x37
 
 #define DRM_IOCTL_I915_INIT		DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT, drm_i915_init_t)
 #define DRM_IOCTL_I915_FLUSH		DRM_IO ( DRM_COMMAND_BASE + DRM_I915_FLUSH)
@@ -315,6 +316,7 @@ typedef struct _drm_i915_sarea {
 #define DRM_IOCTL_I915_GEM_CONTEXT_GETPARAM	DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_CONTEXT_GETPARAM, struct drm_i915_gem_context_param)
 #define DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM	DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_CONTEXT_SETPARAM, struct drm_i915_gem_context_param)
 #define DRM_IOCTL_I915_GEM_GET_FENCE		DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_GET_FENCE, struct drm_i915_gem_fence)
+#define DRM_IOCTL_I915_GEM_SET_FENCE		DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_SET_FENCE, struct drm_i915_gem_fence)
 
 /* Allow drivers to submit batchbuffers directly to hardware, relying
  * on the security mechanisms provided by hardware.
-- 
2.10.2



More information about the Intel-gfx-trybot mailing list