mirror of
https://github.com/torvalds/linux.git
synced 2026-05-23 06:31:58 +02:00
drm/xe/xe_query: Use separate iterator while filling GT list
The 'id' value updated by for_each_gt() is the uapi GT ID of the GTs being iterated over, and may skip over values if a GT is not present on the device. Use a separate iterator for GT list array assignments to ensure that the array will be filled properly on future platforms where index in the GT query list may not match the uapi ID. v2: - Include the missing increment of the iterator. (Jonathan) Cc: Jonathan Cavitt <jonathan.cavitt@intel.com> Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com> Link: https://lore.kernel.org/r/20250701201320.2514369-16-matthew.d.roper@intel.com Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
This commit is contained in:
parent
457123d5a0
commit
d4eb4a0102
|
|
@ -368,6 +368,7 @@ static int query_gt_list(struct xe_device *xe, struct drm_xe_device_query *query
|
|||
struct drm_xe_query_gt_list __user *query_ptr =
|
||||
u64_to_user_ptr(query->data);
|
||||
struct drm_xe_query_gt_list *gt_list;
|
||||
int iter = 0;
|
||||
u8 id;
|
||||
|
||||
if (query->size == 0) {
|
||||
|
|
@ -385,12 +386,12 @@ static int query_gt_list(struct xe_device *xe, struct drm_xe_device_query *query
|
|||
|
||||
for_each_gt(gt, xe, id) {
|
||||
if (xe_gt_is_media_type(gt))
|
||||
gt_list->gt_list[id].type = DRM_XE_QUERY_GT_TYPE_MEDIA;
|
||||
gt_list->gt_list[iter].type = DRM_XE_QUERY_GT_TYPE_MEDIA;
|
||||
else
|
||||
gt_list->gt_list[id].type = DRM_XE_QUERY_GT_TYPE_MAIN;
|
||||
gt_list->gt_list[id].tile_id = gt_to_tile(gt)->id;
|
||||
gt_list->gt_list[id].gt_id = gt->info.id;
|
||||
gt_list->gt_list[id].reference_clock = gt->info.reference_clock;
|
||||
gt_list->gt_list[iter].type = DRM_XE_QUERY_GT_TYPE_MAIN;
|
||||
gt_list->gt_list[iter].tile_id = gt_to_tile(gt)->id;
|
||||
gt_list->gt_list[iter].gt_id = gt->info.id;
|
||||
gt_list->gt_list[iter].reference_clock = gt->info.reference_clock;
|
||||
/*
|
||||
* The mem_regions indexes in the mask below need to
|
||||
* directly identify the struct
|
||||
|
|
@ -406,19 +407,21 @@ static int query_gt_list(struct xe_device *xe, struct drm_xe_device_query *query
|
|||
* assumption.
|
||||
*/
|
||||
if (!IS_DGFX(xe))
|
||||
gt_list->gt_list[id].near_mem_regions = 0x1;
|
||||
gt_list->gt_list[iter].near_mem_regions = 0x1;
|
||||
else
|
||||
gt_list->gt_list[id].near_mem_regions =
|
||||
gt_list->gt_list[iter].near_mem_regions =
|
||||
BIT(gt_to_tile(gt)->id) << 1;
|
||||
gt_list->gt_list[id].far_mem_regions = xe->info.mem_region_mask ^
|
||||
gt_list->gt_list[id].near_mem_regions;
|
||||
gt_list->gt_list[iter].far_mem_regions = xe->info.mem_region_mask ^
|
||||
gt_list->gt_list[iter].near_mem_regions;
|
||||
|
||||
gt_list->gt_list[id].ip_ver_major =
|
||||
gt_list->gt_list[iter].ip_ver_major =
|
||||
REG_FIELD_GET(GMD_ID_ARCH_MASK, gt->info.gmdid);
|
||||
gt_list->gt_list[id].ip_ver_minor =
|
||||
gt_list->gt_list[iter].ip_ver_minor =
|
||||
REG_FIELD_GET(GMD_ID_RELEASE_MASK, gt->info.gmdid);
|
||||
gt_list->gt_list[id].ip_ver_rev =
|
||||
gt_list->gt_list[iter].ip_ver_rev =
|
||||
REG_FIELD_GET(GMD_ID_REVID, gt->info.gmdid);
|
||||
|
||||
iter++;
|
||||
}
|
||||
|
||||
if (copy_to_user(query_ptr, gt_list, size)) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user