Commit 2bec3071 authored by José Roberto de Souza's avatar José Roberto de Souza Committed by Rodrigo Vivi

drm/xe: Make DRM_XE_DEVICE_QUERY_ENGINES future proof

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: default avatarJosé Roberto de Souza <jose.souza@intel.com>
Signed-off-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
[Rodrigo Rebased]
Signed-off-by: default avatarFrancois Dugast <francois.dugast@intel.com>
Reviewed-by: default avatarJosé Roberto de Souza <jose.souza@intel.com>
parent 6b8c1edc
...@@ -53,7 +53,7 @@ static size_t calc_hw_engine_info_size(struct xe_device *xe) ...@@ -53,7 +53,7 @@ static size_t calc_hw_engine_info_size(struct xe_device *xe)
i++; 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); typedef u64 (*__ktime_func_t)(void);
...@@ -186,9 +186,9 @@ static int query_engines(struct xe_device *xe, ...@@ -186,9 +186,9 @@ static int query_engines(struct xe_device *xe,
struct drm_xe_device_query *query) struct drm_xe_device_query *query)
{ {
size_t size = calc_hw_engine_info_size(xe); 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); 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; struct xe_hw_engine *hwe;
enum xe_hw_engine_id id; enum xe_hw_engine_id id;
struct xe_gt *gt; struct xe_gt *gt;
...@@ -211,12 +211,13 @@ static int query_engines(struct xe_device *xe, ...@@ -211,12 +211,13 @@ static int query_engines(struct xe_device *xe,
if (xe_hw_engine_is_reserved(hwe)) if (xe_hw_engine_is_reserved(hwe))
continue; continue;
hw_engine_info[i].engine_class = hw_engine_info[i].instance.engine_class =
xe_to_user_engine_class[hwe->class]; xe_to_user_engine_class[hwe->class];
hw_engine_info[i].engine_instance = hw_engine_info[i].instance.engine_instance =
hwe->logical_instance; hwe->logical_instance;
hw_engine_info[i].gt_id = gt->info.id; hw_engine_info[i].instance.gt_id = gt->info.id;
hw_engine_info[i].pad = 0; hw_engine_info[i].instance.pad = 0;
memset(hw_engine_info->reserved, 0, sizeof(hw_engine_info->reserved));
i++; i++;
} }
......
...@@ -124,7 +124,13 @@ struct xe_user_extension { ...@@ -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_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) #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 { struct drm_xe_engine_class_instance {
#define DRM_XE_ENGINE_CLASS_RENDER 0 #define DRM_XE_ENGINE_CLASS_RENDER 0
#define DRM_XE_ENGINE_CLASS_COPY 1 #define DRM_XE_ENGINE_CLASS_COPY 1
...@@ -137,14 +143,31 @@ struct drm_xe_engine_class_instance { ...@@ -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_ASYNC 5
#define DRM_XE_ENGINE_CLASS_VM_BIND_SYNC 6 #define DRM_XE_ENGINE_CLASS_VM_BIND_SYNC 6
/** @engine_class: engine class id */
__u16 engine_class; __u16 engine_class;
/** @engine_instance: engine instance id */
__u16 engine_instance; __u16 engine_instance;
/** @gt_id: Unique ID of this GT within the PCI Device */
__u16 gt_id; __u16 gt_id;
/** @pad: MBZ */ /** @pad: MBZ */
__u16 pad; __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. * enum drm_xe_memory_class - Supported memory classes.
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment