[PATCH 03/43] drm/xe: Clarify size of MMIO region

Lucas De Marchi lucas.demarchi at intel.com
Thu Sep 5 21:19:56 UTC 2024


On Tue, Sep 03, 2024 at 05:21:04PM GMT, Matt Roper wrote:
>xe_mmio currently has a size parameter that is assigned but never used
>anywhere.  The current values assigned appear to be the size of the BAR
>region assigned for the tile (both for registers and other purposes such
>as the GGTT).  Since the current field isn't being used for anything,
>change the assignments to 4MB (the size of the register region on all
>current platform) and rename the field to 'regs_length' to more clearly
>describe what it represents.  We can use this value in later patches to
>help ensure no register accesses accidentally go past the end of the
>desired register space (which might not be caught easily if they still
>fall within the iomap).
>
>Signed-off-by: Matt Roper <matthew.d.roper at intel.com>
>---
> drivers/gpu/drm/xe/xe_device_types.h | 10 ++++++++--
> drivers/gpu/drm/xe/xe_mmio.c         | 10 ++++++++--
> 2 files changed, 16 insertions(+), 4 deletions(-)
>
>diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h
>index a02e5dfcc6a7..7427f40086e8 100644
>--- a/drivers/gpu/drm/xe/xe_device_types.h
>+++ b/drivers/gpu/drm/xe/xe_device_types.h
>@@ -119,8 +119,14 @@ struct xe_mmio {
> 	/** @regs: Map used to access registers. */
> 	void __iomem *regs;
>
>-	/** @map_size: Size of the map. */
>-	size_t size;
>+	/**
>+	 * @map_size: Length of the register region within the map.

see review on previous patch

>+	 *
>+	 * The size of the map itself it generally larger than the iomap; the

... is generally?

>+	 * map itself is generally shared with other regions, and also includes
>+	 * non-register regions such as the GGTT PTEs.

There's some repeated sentences above... Maybe consider a reword like:

"The size of the iomap set in @regs is generally larger than the register
mmio space since it includes non-register regions such as the GGTT PTEs"

I also wonder if we shouldn't break the map into smaller regions so we
don't risk having bugs in a lower region overwritting things above it.

>+	 */
>+	size_t regs_length;

why not regs_size? It seems more natural than "length".


Reviewed-by: Lucas De Marchi <lucas.demarchi at intel.com>

Lucas De Marchi

> };
>
> /**
>diff --git a/drivers/gpu/drm/xe/xe_mmio.c b/drivers/gpu/drm/xe/xe_mmio.c
>index 3fd462fda625..ad6a7992b00e 100644
>--- a/drivers/gpu/drm/xe/xe_mmio.c
>+++ b/drivers/gpu/drm/xe/xe_mmio.c
>@@ -36,13 +36,19 @@ static void tiles_fini(void *arg)
> /*
>  * On multi-tile devices, partition the BAR space for MMIO on each tile,
>  * possibly accounting for register override on the number of tiles available.
>+ * tile_mmio_size contains both the tile's 4MB register space, as well as
>+ * additional space for the GTT and other (possibly unused) regions).
>  * Resulting memory layout is like below:
>  *
>  * .----------------------. <- tile_count * tile_mmio_size
>  * |         ....         |
>  * |----------------------| <- 2 * tile_mmio_size
>+ * |   tile1 GTT + other  |
>+ * |----------------------| <- 1 * tile_mmio_size + 4MB
>  * |   tile1->mmio.regs   |
>  * |----------------------| <- 1 * tile_mmio_size
>+ * |   tile0 GTT + other  |
>+ * |----------------------| <- 4MB
>  * |   tile0->mmio.regs   |
>  * '----------------------' <- 0MB
>  */
>@@ -90,7 +96,7 @@ static void mmio_multi_tile_setup(struct xe_device *xe, size_t tile_mmio_size)
>
> 	regs = xe->mmio.regs;
> 	for_each_tile(tile, xe, id) {
>-		tile->mmio.size = tile_mmio_size;
>+		tile->mmio.regs_length = SZ_4M;
> 		tile->mmio.regs = regs;
> 		regs += tile_mmio_size;
> 	}
>@@ -172,7 +178,7 @@ int xe_mmio_init(struct xe_device *xe)
> 	}
>
> 	/* Setup first tile; other tiles (if present) will be setup later. */
>-	root_tile->mmio.size = SZ_16M;
>+	root_tile->mmio.regs_length = SZ_4M;
> 	root_tile->mmio.regs = xe->mmio.regs;
>
> 	return devm_add_action_or_reset(xe->drm.dev, mmio_fini, xe);
>-- 
>2.45.2
>


More information about the Intel-xe mailing list