Skip to content

Commit d4eb4a0

Browse files
committed
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>
1 parent 457123d commit d4eb4a0

1 file changed

Lines changed: 15 additions & 12 deletions

File tree

drivers/gpu/drm/xe/xe_query.c

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,7 @@ static int query_gt_list(struct xe_device *xe, struct drm_xe_device_query *query
368368
struct drm_xe_query_gt_list __user *query_ptr =
369369
u64_to_user_ptr(query->data);
370370
struct drm_xe_query_gt_list *gt_list;
371+
int iter = 0;
371372
u8 id;
372373

373374
if (query->size == 0) {
@@ -385,12 +386,12 @@ static int query_gt_list(struct xe_device *xe, struct drm_xe_device_query *query
385386

386387
for_each_gt(gt, xe, id) {
387388
if (xe_gt_is_media_type(gt))
388-
gt_list->gt_list[id].type = DRM_XE_QUERY_GT_TYPE_MEDIA;
389+
gt_list->gt_list[iter].type = DRM_XE_QUERY_GT_TYPE_MEDIA;
389390
else
390-
gt_list->gt_list[id].type = DRM_XE_QUERY_GT_TYPE_MAIN;
391-
gt_list->gt_list[id].tile_id = gt_to_tile(gt)->id;
392-
gt_list->gt_list[id].gt_id = gt->info.id;
393-
gt_list->gt_list[id].reference_clock = gt->info.reference_clock;
391+
gt_list->gt_list[iter].type = DRM_XE_QUERY_GT_TYPE_MAIN;
392+
gt_list->gt_list[iter].tile_id = gt_to_tile(gt)->id;
393+
gt_list->gt_list[iter].gt_id = gt->info.id;
394+
gt_list->gt_list[iter].reference_clock = gt->info.reference_clock;
394395
/*
395396
* The mem_regions indexes in the mask below need to
396397
* directly identify the struct
@@ -406,19 +407,21 @@ static int query_gt_list(struct xe_device *xe, struct drm_xe_device_query *query
406407
* assumption.
407408
*/
408409
if (!IS_DGFX(xe))
409-
gt_list->gt_list[id].near_mem_regions = 0x1;
410+
gt_list->gt_list[iter].near_mem_regions = 0x1;
410411
else
411-
gt_list->gt_list[id].near_mem_regions =
412+
gt_list->gt_list[iter].near_mem_regions =
412413
BIT(gt_to_tile(gt)->id) << 1;
413-
gt_list->gt_list[id].far_mem_regions = xe->info.mem_region_mask ^
414-
gt_list->gt_list[id].near_mem_regions;
414+
gt_list->gt_list[iter].far_mem_regions = xe->info.mem_region_mask ^
415+
gt_list->gt_list[iter].near_mem_regions;
415416

416-
gt_list->gt_list[id].ip_ver_major =
417+
gt_list->gt_list[iter].ip_ver_major =
417418
REG_FIELD_GET(GMD_ID_ARCH_MASK, gt->info.gmdid);
418-
gt_list->gt_list[id].ip_ver_minor =
419+
gt_list->gt_list[iter].ip_ver_minor =
419420
REG_FIELD_GET(GMD_ID_RELEASE_MASK, gt->info.gmdid);
420-
gt_list->gt_list[id].ip_ver_rev =
421+
gt_list->gt_list[iter].ip_ver_rev =
421422
REG_FIELD_GET(GMD_ID_REVID, gt->info.gmdid);
423+
424+
iter++;
422425
}
423426

424427
if (copy_to_user(query_ptr, gt_list, size)) {

0 commit comments

Comments
 (0)