[Intel-gfx] [PATCH] drm/i915/uapi: Add DRM_I915_QUERY_GEM_CREATE_EXTENSIONS query item

Jordan Justen jordan.l.justen at intel.com
Tue May 2 20:57:44 UTC 2023


Cc: Fei Yang <fei.yang at intel.com>
Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
Cc: Daniel Vetter <daniel.vetter at ffwll.ch>
Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
---
 drivers/gpu/drm/i915/gem/i915_gem_create.c | 30 ++++++++++++++++++
 drivers/gpu/drm/i915/gem/i915_gem_create.h |  2 ++
 drivers/gpu/drm/i915/i915_query.c          | 36 ++++++++++++++++++++++
 include/uapi/drm/i915_drm.h                |  2 ++
 4 files changed, 70 insertions(+)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_create.c b/drivers/gpu/drm/i915/gem/i915_gem_create.c
index bfe1dbda4cb7..56342a352599 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_create.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_create.c
@@ -399,6 +399,36 @@ static const i915_user_extension_fn create_extensions[] = {
 	[I915_GEM_CREATE_EXT_PROTECTED_CONTENT] = ext_set_protected,
 };
 
+/**
+ * Fills buffer will known create_ext extensions
+ * @buffer: buffer to fill with extensions
+ * @buffer_size: size of the buffer in bytes
+ *
+ * If @buffer_size is 0, then @buffer is not accessed, and the
+ * required buffer size is returned.
+ *
+ * If @buffer_size != 0, but not large enough, then -EINVAL is
+ * returned.
+ *
+ * If @buffer_size is large enough, then @buffer will be filled as a
+ * u64 array of extension names.
+ */
+int
+i915_gem_create_ext_get_extensions(void *buffer, size_t buffer_size)
+{
+	unsigned int i;
+
+	if (buffer_size == 0)
+		return ARRAY_SIZE(create_extensions) * sizeof(u64);
+	else if (buffer_size < (ARRAY_SIZE(create_extensions) * sizeof(u64)))
+		return -EINVAL;
+
+	for (i = 0; i < ARRAY_SIZE(create_extensions); i++)
+		((u64*)buffer)[i] = i;
+
+	return ARRAY_SIZE(create_extensions) * sizeof(u64);
+}
+
 /**
  * i915_gem_create_ext_ioctl - Creates a new mm object and returns a handle to it.
  * @dev: drm device pointer
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_create.h b/drivers/gpu/drm/i915/gem/i915_gem_create.h
index 9536aa906001..e7ebef308038 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_create.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_create.h
@@ -14,4 +14,6 @@ int i915_gem_dumb_create(struct drm_file *file_priv,
 			 struct drm_device *dev,
 			 struct drm_mode_create_dumb *args);
 
+int i915_gem_create_ext_get_extensions(void *buffer, size_t buffer_size);
+
 #endif /* __I915_GEM_CREATE_H__ */
diff --git a/drivers/gpu/drm/i915/i915_query.c b/drivers/gpu/drm/i915/i915_query.c
index 00871ef99792..f360f76516de 100644
--- a/drivers/gpu/drm/i915/i915_query.c
+++ b/drivers/gpu/drm/i915/i915_query.c
@@ -9,6 +9,7 @@
 #include "i915_drv.h"
 #include "i915_perf.h"
 #include "i915_query.h"
+#include "gem/i915_gem_create.h"
 #include "gt/intel_engine_user.h"
 #include <uapi/drm/i915_drm.h>
 
@@ -551,6 +552,40 @@ static int query_hwconfig_blob(struct drm_i915_private *i915,
 	return hwconfig->size;
 }
 
+static int query_gem_create_extensions(struct drm_i915_private *i915,
+				       struct drm_i915_query_item *query_item)
+{
+	void *buffer;
+	int buffer_size, fill_size;
+
+	buffer_size = i915_gem_create_ext_get_extensions(NULL, 0);
+
+	if (query_item->length == 0)
+		return buffer_size;
+
+	if (query_item->length < buffer_size)
+		return -EINVAL;
+
+	buffer = kzalloc(buffer_size, GFP_KERNEL);
+	if (!buffer)
+		return -ENOMEM;
+
+	fill_size = i915_gem_create_ext_get_extensions(buffer, buffer_size);
+	if (fill_size != buffer_size) {
+		kfree(buffer);
+		return -EINVAL;
+	}
+
+	if (copy_to_user(u64_to_user_ptr(query_item->data_ptr),
+			 buffer, buffer_size)) {
+		kfree(buffer);
+		return -EFAULT;
+	}
+
+	kfree(buffer);
+	return buffer_size;
+}
+
 static int (* const i915_query_funcs[])(struct drm_i915_private *dev_priv,
 					struct drm_i915_query_item *query_item) = {
 	query_topology_info,
@@ -559,6 +594,7 @@ static int (* const i915_query_funcs[])(struct drm_i915_private *dev_priv,
 	query_memregion_info,
 	query_hwconfig_blob,
 	query_geometry_subslices,
+	query_gem_create_extensions,
 };
 
 int i915_query_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h
index dba7c5a5b25e..46be28ee3795 100644
--- a/include/uapi/drm/i915_drm.h
+++ b/include/uapi/drm/i915_drm.h
@@ -2963,6 +2963,7 @@ struct drm_i915_query_item {
 	 *  - %DRM_I915_QUERY_MEMORY_REGIONS (see struct drm_i915_query_memory_regions)
 	 *  - %DRM_I915_QUERY_HWCONFIG_BLOB (see `GuC HWCONFIG blob uAPI`)
 	 *  - %DRM_I915_QUERY_GEOMETRY_SUBSLICES (see struct drm_i915_query_topology_info)
+	 *  - %DRM_I915_QUERY_GEM_CREATE_EXTENSIONS (u64 array of known DRM_I915_GEM_CREATE_EXT extensions)
 	 */
 	__u64 query_id;
 #define DRM_I915_QUERY_TOPOLOGY_INFO		1
@@ -2971,6 +2972,7 @@ struct drm_i915_query_item {
 #define DRM_I915_QUERY_MEMORY_REGIONS		4
 #define DRM_I915_QUERY_HWCONFIG_BLOB		5
 #define DRM_I915_QUERY_GEOMETRY_SUBSLICES	6
+#define DRM_I915_QUERY_GEM_CREATE_EXTENSIONS	7
 /* Must be kept compact -- no holes and well documented */
 
 	/**
-- 
2.39.2



More information about the Intel-gfx mailing list