[Intel-xe] [PATCH 3/7] drm/xe: Use media base for GMD_ID access

Rodrigo Vivi rodrigo.vivi at kernel.org
Fri May 5 17:05:18 UTC 2023


On Mon, May 01, 2023 at 08:07:28AM -0700, Lucas De Marchi wrote:
> On Sun, Apr 30, 2023 at 07:47:38PM +0200, Michal Wajdeczko wrote:
> > 
> > 
> > On 29.04.2023 08:23, Lucas De Marchi wrote:
> > > Instead of adding a hardcoded base, define GMD_ID() with a base
> > > argument and use it in all places.
> > > 
> > > Signed-off-by: Lucas De Marchi <lucas.demarchi at intel.com>
> > > ---
> > >  drivers/gpu/drm/xe/regs/xe_gt_regs.h | 4 +++-
> > >  drivers/gpu/drm/xe/xe_pci.c          | 9 +++++----
> > >  2 files changed, 8 insertions(+), 5 deletions(-)
> > > 
> > > diff --git a/drivers/gpu/drm/xe/regs/xe_gt_regs.h b/drivers/gpu/drm/xe/regs/xe_gt_regs.h
> > > index 4d87f1fe010d..da7b6d2c7e01 100644
> > > --- a/drivers/gpu/drm/xe/regs/xe_gt_regs.h
> > > +++ b/drivers/gpu/drm/xe/regs/xe_gt_regs.h
> > > @@ -8,6 +8,8 @@
> > > 
> > >  #include "regs/xe_reg_defs.h"
> > > 
> > > +#define MTL_MEDIA_GT_BASE			0x380000
> > 
> > maybe for completeness (and to avoid using anonymous 0 offset in other
> > places) we should define also:
> > 
> > #define GRAPHICS_GT_BASE			0x0
> 
> there are very vew places in the driver that would care about the base.
> Today the base is automatically applied for anything using xe_mmio_,
> just like we have it automatically applied in intel_uncore for i915.
> So, we really don't want to change each register to receive base as
> param.

I'm with Michal here. I had the same thought when reviewing and just read
his comment afterwards. Although it is rarely used it would be good
to avoid later confusion.

> 
> > 
> > > +
> > >  /* RPM unit config (Gen8+) */
> > >  #define RPM_CONFIG0					XE_REG(0xd00)
> > >  #define   RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_MASK		REG_GENMASK(5, 3)
> > > @@ -21,7 +23,7 @@
> > >  #define FORCEWAKE_ACK_MEDIA_VEBOX(n)		XE_REG(0xd70 + (n) * 4)
> > >  #define FORCEWAKE_ACK_RENDER			XE_REG(0xd84)
> > > 
> > > -#define GMD_ID					XE_REG(0xd8c)
> > > +#define GMD_ID(base)				XE_REG((base) + 0xd8c)
> > 
> > this register is not the only one that's has it's counterpart at this
> > 0x38000 MEDIA offset, and other registers we are treating in automatic
> > way, without the need to explicitly pass the 'base', so I'm not sure we
> > should change that here
> 
> becaues in the other cases the base is applied by xe_mmio
> 
> > 
> > >  #define   GMD_ID_ARCH_MASK			REG_GENMASK(31, 22)
> > >  #define   GMD_ID_RELEASE_MASK			REG_GENMASK(21, 14)
> > >  #define   GMD_ID_STEP				REG_GENMASK(5, 0)
> > 
> > btw, is there a plan to s/REG_GENMASK/XE_REG_GENMASK or something ?
> 
> no. My plan is to eventually submit a patch to have
> GENMASK_U32 and use it throughout the driver

good idea!

> 
> > 
> > > diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
> > > index 35dcb8781f2a..8687e51cb0a4 100644
> > > --- a/drivers/gpu/drm/xe/xe_pci.c
> > > +++ b/drivers/gpu/drm/xe/xe_pci.c
> > > @@ -276,7 +276,7 @@ static const struct xe_gt_desc xelpmp_gts[] = {
> > >  		.type = XE_GT_TYPE_MEDIA,
> > >  		.vram_id = 0,
> > >  		.mmio_adj_limit = 0x40000,
> > > -		.mmio_adj_offset = 0x380000,
> > > +		.mmio_adj_offset = MTL_MEDIA_GT_BASE,
> > >  	},
> > >  };
> > > 
> > > @@ -391,8 +391,9 @@ find_subplatform(const struct xe_device *xe, const struct xe_device_desc *desc)
> > >  	return NULL;
> > >  }
> > > 
> > > -static u32 peek_gmdid(struct xe_device *xe, u32 gmdid_offset)
> > > +static u32 peek_gmdid(struct xe_device *xe, struct xe_reg gmdid_reg)
> > 
> > better to keep u32 but defined as new 'base' for the GMD_ID:
> > 
> > peek_gmdid(xe, GRAPHICS_GT_BASE)
> > peek_gmdid(xe, MTL_MEDIA_GT_BASE)
> > 
> > then since we parse the value according to the GMDID definition we will
> > prevent passing wrong register offset and always refer to the right
> > GMD_ID address inside the function:
> > 
> > static u32 peek_gmdid(struct xe_device *xe, u32 base)
> > {
> > 	xe_reg gmdid = XE_REG(GMD_ID.addr + base);
> 
> we try to minimize those calculations outside the header.
> I don't see a benefit of passing the base here over passing the register
> to be used.
> 
> Lucas De Marchi
> 
> > ...
> > 	WARN_ON(base != GRAPHICS_GT_BASE && base != MTL_MEDIA_GT_BASE);
> > ...
> >  	map = pci_iomap_range(pdev, 0, gmdid.addr, sizeof(u32));
> > ...
> > 	REG_FIELD_GET(GMD_ID_ARCH_MASK, value)
> > 
> > 
> > Michal
> > 
> > >  {
> > > +	u32 gmdid_offset = gmdid_reg.reg;
> > >  	struct pci_dev *pdev = to_pci_dev(xe->drm.dev);
> > >  	void __iomem *map = pci_iomap_range(pdev, 0, gmdid_offset, sizeof(u32));
> > >  	u32 ver;
> > > @@ -441,7 +442,7 @@ static void handle_gmdid(struct xe_device *xe,
> > >  {
> > >  	u32 ver;
> > > 
> > > -	ver = peek_gmdid(xe, GMD_ID.reg);
> > > +	ver = peek_gmdid(xe, GMD_ID(0));
> > >  	for (int i = 0; i < ARRAY_SIZE(graphics_ip_map); i++) {
> > >  		if (ver == graphics_ip_map[i].ver) {
> > >  			xe->info.graphics_verx100 = ver;
> > > @@ -456,7 +457,7 @@ static void handle_gmdid(struct xe_device *xe,
> > >  			ver / 100, ver % 100);
> > >  	}
> > > 
> > > -	ver = peek_gmdid(xe, GMD_ID.reg + 0x380000);
> > > +	ver = peek_gmdid(xe, GMD_ID(MTL_MEDIA_GT_BASE));
> > >  	for (int i = 0; i < ARRAY_SIZE(media_ip_map); i++) {
> > >  		if (ver == media_ip_map[i].ver) {
> > >  			xe->info.media_verx100 = ver;


More information about the Intel-xe mailing list