[PATCH 1/2] drm/xe: Probe for tile count during device info initialization

Gustavo Sousa gustavo.sousa at intel.com
Mon Jul 28 16:32:35 UTC 2025


Quoting Cavitt, Jonathan (2025-07-23 19:01:23-03:00)
>-----Original Message-----
>From: Intel-xe <intel-xe-bounces at lists.freedesktop.org> On Behalf Of Gustavo Sousa
>Sent: Wednesday, July 23, 2025 1:20 PM
>To: intel-xe at lists.freedesktop.org
>Cc: Sousa, Gustavo <gustavo.sousa at intel.com>
>Subject: [PATCH 1/2] drm/xe: Probe for tile count during device info initialization
>> 
>> The function mmio_multi_tile_setup() does not look like the proper
>> location for probing for the number of existing tiles in the hardware.
>> It should not be that function's responsibility and such information
>> should instead be already available when it gets called.
>> 
>> The fact that we need to adjust gt_count is a symptom of that.
>> 
>> Move probing of available tile count to a dedicated function named
>> xe_info_probe_tile_count() and call it from xe_info_init(), which seems
>> like a more appropriate place for that.
>> 
>> With that move, we don't need and should not adjust gt_count anymore,
>> because the function gets called before the original initialization of
>> that field.
>
>I'd maybe reword this sentence to say something like:
>
>"""
>With that move, we no longer need to adjust gt_count as a part of the

It is not only that we no longer need, but also that we should not
either, otherwise we would get the wrong value at the end. I'll try to
use what you suggested with a minor tweak.

Thanks!

--
Gustavo Sousa

>xe_info_probe_tile_count function, as that field will be initialized later
>in xe_info_init anyway.
>"""
>
>But other than that:
>Reviewed-by: Jonathan Cavitt <jonathan.cavitt at intel.com>
>-Jonathan Cavitt
>
>> 
>> Signed-off-by: Gustavo Sousa <gustavo.sousa at intel.com>
>> ---
>>  drivers/gpu/drm/xe/xe_mmio.c | 33 ---------------------------------
>>  drivers/gpu/drm/xe/xe_pci.c  | 32 ++++++++++++++++++++++++++++++++
>>  2 files changed, 32 insertions(+), 33 deletions(-)
>> 
>> diff --git a/drivers/gpu/drm/xe/xe_mmio.c b/drivers/gpu/drm/xe/xe_mmio.c
>> index e4db8d58ea2d..ef6f3ea573a2 100644
>> --- a/drivers/gpu/drm/xe/xe_mmio.c
>> +++ b/drivers/gpu/drm/xe/xe_mmio.c
>> @@ -58,7 +58,6 @@ static void tiles_fini(void *arg)
>>  static void mmio_multi_tile_setup(struct xe_device *xe, size_t tile_mmio_size)
>>  {
>>          struct xe_tile *tile;
>> -        struct xe_gt *gt;
>>          u8 id;
>>  
>>          /*
>> @@ -68,38 +67,6 @@ static void mmio_multi_tile_setup(struct xe_device *xe, size_t tile_mmio_size)
>>          if (xe->info.tile_count == 1)
>>                  return;
>>  
>> -        /* Possibly override number of tile based on configuration register */
>> -        if (!xe->info.skip_mtcfg) {
>> -                struct xe_mmio *mmio = xe_root_tile_mmio(xe);
>> -                u8 tile_count, gt_count;
>> -                u32 mtcfg;
>> -
>> -                /*
>> -                 * Although the per-tile mmio regs are not yet initialized, this
>> -                 * is fine as it's going to the root tile's mmio, that's
>> -                 * guaranteed to be initialized earlier in xe_mmio_probe_early()
>> -                 */
>> -                mtcfg = xe_mmio_read32(mmio, XEHP_MTCFG_ADDR);
>> -                tile_count = REG_FIELD_GET(TILE_COUNT, mtcfg) + 1;
>> -
>> -                if (tile_count < xe->info.tile_count) {
>> -                        drm_info(&xe->drm, "tile_count: %d, reduced_tile_count %d\n",
>> -                                 xe->info.tile_count, tile_count);
>> -                        xe->info.tile_count = tile_count;
>> -
>> -                        /*
>> -                         * We've already setup gt_count according to the full
>> -                         * tile count.  Re-calculate it to only include the GTs
>> -                         * that belong to the remaining tile(s).
>> -                         */
>> -                        gt_count = 0;
>> -                        for_each_gt(gt, xe, id)
>> -                                if (gt->info.id < tile_count * xe->info.max_gt_per_tile)
>> -                                        gt_count++;
>> -                        xe->info.gt_count = gt_count;
>> -                }
>> -        }
>> -
>>          for_each_remote_tile(tile, xe, id)
>>                  xe_mmio_init(&tile->mmio, tile, xe->mmio.regs + id * tile_mmio_size, SZ_4M);
>>  }
>> diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
>> index f4ea13527945..4f5d4f0a8173 100644
>> --- a/drivers/gpu/drm/xe/xe_pci.c
>> +++ b/drivers/gpu/drm/xe/xe_pci.c
>> @@ -17,6 +17,7 @@
>>  
>>  #include "display/xe_display.h"
>>  #include "regs/xe_gt_regs.h"
>> +#include "regs/xe_regs.h"
>>  #include "xe_device.h"
>>  #include "xe_drv.h"
>>  #include "xe_gt.h"
>> @@ -603,6 +604,35 @@ static int xe_info_init_early(struct xe_device *xe,
>>          return 0;
>>  }
>>  
>> +/*
>> + * Possibly override number of tile based on configuration register.
>> + */
>> +static void xe_info_probe_tile_count(struct xe_device *xe)
>> +{
>> +        struct xe_mmio *mmio;
>> +        u8 tile_count;
>> +        u32 mtcfg;
>> +
>> +        if (xe->info.skip_mtcfg)
>> +                return;
>> +
>> +        mmio = xe_root_tile_mmio(xe);
>> +
>> +        /*
>> +         * Although the per-tile mmio regs are not yet initialized, this
>> +         * is fine as it's going to the root tile's mmio, that's
>> +         * guaranteed to be initialized earlier in xe_mmio_probe_early()
>> +         */
>> +        mtcfg = xe_mmio_read32(mmio, XEHP_MTCFG_ADDR);
>> +        tile_count = REG_FIELD_GET(TILE_COUNT, mtcfg) + 1;
>> +
>> +        if (tile_count < xe->info.tile_count) {
>> +                drm_info(&xe->drm, "tile_count: %d, reduced_tile_count %d\n",
>> +                         xe->info.tile_count, tile_count);
>> +                xe->info.tile_count = tile_count;
>> +        }
>> +}
>> +
>>  /*
>>   * Initialize device info content that does require knowledge about
>>   * graphics / media IP version.
>> @@ -677,6 +707,8 @@ static int xe_info_init(struct xe_device *xe,
>>          xe->info.has_usm = graphics_desc->has_usm;
>>          xe->info.has_64bit_timestamp = graphics_desc->has_64bit_timestamp;
>>  
>> +        xe_info_probe_tile_count(xe);
>> +
>>          for_each_remote_tile(tile, xe, id) {
>>                  int err;
>>  
>> 
>> -- 
>> 2.50.1
>> 
>>


More information about the Intel-xe mailing list