[Intel-xe] [PATCH] drm/xe: Make DRM_XE_DEVICE_QUERY_ENGINES future proof
José Roberto de Souza
jose.souza at intel.com
Tue Oct 10 14:17:43 UTC 2023
We have at least 2 future features(OA and future media engines capabilities)
that will require Xe to provide more information about engines to UMDs.
But this information should not just be added to
drm_xe_engine_class_instance for a couple of reasons:
- drm_xe_engine_class_instance is used as input to other structs/uAPIs
and those uAPIs don't care about any of these future new engine fields
- those new fields are useless information after initialization for
some UMDs, so it should not need to carry that around
So here my proposal is to make DRM_XE_DEVICE_QUERY_ENGINES return an
array of drm_xe_query_engine_info that contain
drm_xe_engine_class_instance and 3 u64s to be used for future features.
Reference OA: https://patchwork.freedesktop.org/patch/558362/?series=121084&rev=6
Cc: Francois Dugast <francois.dugast at intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi at intel.com>
Signed-off-by: José Roberto de Souza <jose.souza at intel.com>
---
drivers/gpu/drm/xe/xe_query.c | 13 ++++-----
include/uapi/drm/xe_drm.h | 50 ++++++++++++++++++++++-------------
2 files changed, 39 insertions(+), 24 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_query.c b/drivers/gpu/drm/xe/xe_query.c
index a951205100fea..b825ee07d760c 100644
--- a/drivers/gpu/drm/xe/xe_query.c
+++ b/drivers/gpu/drm/xe/xe_query.c
@@ -42,16 +42,16 @@ static size_t calc_hw_engine_info_size(struct xe_device *xe)
i++;
}
- return i * sizeof(struct drm_xe_engine_class_instance);
+ return i * sizeof(struct drm_xe_query_engine_info);
}
static int query_engines(struct xe_device *xe,
struct drm_xe_device_query *query)
{
size_t size = calc_hw_engine_info_size(xe);
- struct drm_xe_engine_class_instance __user *query_ptr =
+ struct drm_xe_query_engine_info __user *query_ptr =
u64_to_user_ptr(query->data);
- struct drm_xe_engine_class_instance *hw_engine_info;
+ struct drm_xe_query_engine_info *hw_engine_info;
struct xe_hw_engine *hwe;
enum xe_hw_engine_id id;
struct xe_gt *gt;
@@ -74,11 +74,12 @@ static int query_engines(struct xe_device *xe,
if (xe_hw_engine_is_reserved(hwe))
continue;
- hw_engine_info[i].engine_class =
+ hw_engine_info[i].instance.engine_class =
xe_to_user_engine_class[hwe->class];
- hw_engine_info[i].engine_instance =
+ hw_engine_info[i].instance.engine_instance =
hwe->logical_instance;
- hw_engine_info[i++].gt_id = gt->info.id;
+ hw_engine_info[i].instance.gt_id = gt->info.id;
+ memset(hw_engine_info->rsvd, 0, sizeof(hw_engine_info->rsvd));
}
if (copy_to_user(query_ptr, hw_engine_info, size)) {
diff --git a/include/uapi/drm/xe_drm.h b/include/uapi/drm/xe_drm.h
index d48d8e3c898ce..24be30b67625b 100644
--- a/include/uapi/drm/xe_drm.h
+++ b/include/uapi/drm/xe_drm.h
@@ -346,6 +346,38 @@ struct drm_xe_query_topology_mask {
__u8 mask[];
};
+/** struct drm_xe_engine_class_instance - instance of an engine class */
+struct drm_xe_engine_class_instance {
+#define DRM_XE_ENGINE_CLASS_RENDER 0
+#define DRM_XE_ENGINE_CLASS_COPY 1
+#define DRM_XE_ENGINE_CLASS_VIDEO_DECODE 2
+#define DRM_XE_ENGINE_CLASS_VIDEO_ENHANCE 3
+#define DRM_XE_ENGINE_CLASS_COMPUTE 4
+ /*
+ * Kernel only class (not actual hardware engine class). Used for
+ * creating ordered queues of VM bind operations.
+ */
+#define DRM_XE_ENGINE_CLASS_VM_BIND 5
+ __u16 engine_class;
+
+ __u16 engine_instance;
+ __u16 gt_id;
+
+ __u16 pad;
+};
+
+/**
+ * struct drm_xe_query_engine_info - describe hardware engine
+ *
+ * If a query is made with a struct drm_xe_device_query where .query
+ * is equal to DRM_XE_DEVICE_QUERY_ENGINES, then the reply uses an array of
+ * struct drm_xe_query_engine_info in .data.
+ */
+struct drm_xe_query_engine_info {
+ struct drm_xe_engine_class_instance instance;
+ __u64 rsvd[3];
+};
+
/**
* struct drm_xe_device_query - main structure to query device information
*
@@ -732,24 +764,6 @@ struct drm_xe_exec_queue_set_property {
__u64 reserved[2];
};
-/** struct drm_xe_engine_class_instance - instance of an engine class */
-struct drm_xe_engine_class_instance {
-#define DRM_XE_ENGINE_CLASS_RENDER 0
-#define DRM_XE_ENGINE_CLASS_COPY 1
-#define DRM_XE_ENGINE_CLASS_VIDEO_DECODE 2
-#define DRM_XE_ENGINE_CLASS_VIDEO_ENHANCE 3
-#define DRM_XE_ENGINE_CLASS_COMPUTE 4
- /*
- * Kernel only class (not actual hardware engine class). Used for
- * creating ordered queues of VM bind operations.
- */
-#define DRM_XE_ENGINE_CLASS_VM_BIND 5
- __u16 engine_class;
-
- __u16 engine_instance;
- __u16 gt_id;
-};
-
struct drm_xe_exec_queue_create {
#define XE_EXEC_QUEUE_EXTENSION_SET_PROPERTY 0
/** @extensions: Pointer to the first extension struct, if any */
--
2.42.0
More information about the Intel-xe
mailing list