]> git.itanic.dy.fi Git - linux-stable/commitdiff
drm/xe: Make DRM_XE_DEVICE_QUERY_ENGINES future proof
authorJosé Roberto de Souza <jose.souza@intel.com>
Wed, 22 Nov 2023 14:38:22 +0000 (14:38 +0000)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Thu, 21 Dec 2023 16:45:12 +0000 (11:45 -0500)
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

v2: Reduce reserved[] to 3 u64 (Matthew Brost)

Cc: Francois Dugast <francois.dugast@intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
[Rodrigo Rebased]
Signed-off-by: Francois Dugast <francois.dugast@intel.com>
Reviewed-by: José Roberto de Souza <jose.souza@intel.com>
drivers/gpu/drm/xe/xe_query.c
include/uapi/drm/xe_drm.h

index 61a7d92b7e886a8758ed7277893b61f187226800..0cbfeaeb1330cf7225e4036693ec2b133c0ee2c7 100644 (file)
@@ -53,7 +53,7 @@ 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);
 }
 
 typedef u64 (*__ktime_func_t)(void);
@@ -186,9 +186,9 @@ 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;
@@ -211,12 +211,13 @@ 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].pad = 0;
+                       hw_engine_info[i].instance.gt_id = gt->info.id;
+                       hw_engine_info[i].instance.pad = 0;
+                       memset(hw_engine_info->reserved, 0, sizeof(hw_engine_info->reserved));
 
                        i++;
                }
index 6edbcd81c1950e015234d34678f3d176d24d1326..dc657ae9db1827118ed2eca9233e355a43d118bc 100644 (file)
@@ -124,7 +124,13 @@ struct xe_user_extension {
 #define DRM_IOCTL_XE_EXEC_QUEUE_GET_PROPERTY   DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_EXEC_QUEUE_GET_PROPERTY, struct drm_xe_exec_queue_get_property)
 #define DRM_IOCTL_XE_WAIT_USER_FENCE           DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_WAIT_USER_FENCE, struct drm_xe_wait_user_fence)
 
-/** struct drm_xe_engine_class_instance - instance of an engine class */
+/**
+ * struct drm_xe_engine_class_instance - instance of an engine class
+ *
+ * It is returned as part of the @drm_xe_query_engine_info, but it also is
+ * used as the input of engine selection for both @drm_xe_exec_queue_create
+ * and @drm_xe_query_engine_cycles
+ */
 struct drm_xe_engine_class_instance {
 #define DRM_XE_ENGINE_CLASS_RENDER             0
 #define DRM_XE_ENGINE_CLASS_COPY               1
@@ -137,14 +143,31 @@ struct drm_xe_engine_class_instance {
         */
 #define DRM_XE_ENGINE_CLASS_VM_BIND_ASYNC      5
 #define DRM_XE_ENGINE_CLASS_VM_BIND_SYNC       6
+       /** @engine_class: engine class id */
        __u16 engine_class;
-
+       /** @engine_instance: engine instance id */
        __u16 engine_instance;
+       /** @gt_id: Unique ID of this GT within the PCI Device */
        __u16 gt_id;
        /** @pad: MBZ */
        __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 {
+       /** @instance: The @drm_xe_engine_class_instance */
+       struct drm_xe_engine_class_instance instance;
+
+       /** @reserved: Reserved */
+       __u64 reserved[3];
+};
+
 /**
  * enum drm_xe_memory_class - Supported memory classes.
  */