Re: [PATCH v3] drm/i915/mtl: Add Wa_14019821291

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> -----Original Message-----
> From: Roper, Matthew D <matthew.d.roper@xxxxxxxxx>
> Sent: Wednesday, October 25, 2023 11:41 PM
> To: Bhadane, Dnyaneshwar <dnyaneshwar.bhadane@xxxxxxxxx>
> Cc: intel-gfx@xxxxxxxxxxxxxxxxxxxxx
> Subject: Re:  [PATCH v3] drm/i915/mtl: Add Wa_14019821291
> 
> On Wed, Oct 25, 2023 at 04:06:46PM +0530, Dnyaneshwar Bhadane wrote:
> > This workaround is primarily implemented by the BIOS.  However if the
> > BIOS applies the workaround it will reserve a small piece of our DSM
> > (which should be at the top, right below the WOPCM); we just need to
> > keep that region reserved so that nothing else attempts to re-use it.
> >
> > v2: Declare regs in intel_gt_regs.h (Matt Roper)
> >
> > v3: Shift WA implementation before calculation of *base (Matt Roper)
> >
> > Signed-off-by: Dnyaneshwar Bhadane <dnyaneshwar.bhadane@xxxxxxxxx>
> > ---
> >  drivers/gpu/drm/i915/gem/i915_gem_stolen.c | 17 +++++++++++++++++
> >  drivers/gpu/drm/i915/gt/intel_gt_regs.h    |  3 +++
> >  2 files changed, 20 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c
> > b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c
> > index 1a766d8e7cce..192c9a333c0a 100644
> > --- a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c
> > +++ b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c
> > @@ -404,6 +404,23 @@ static void icl_get_stolen_reserved(struct
> drm_i915_private *i915,
> >  		MISSING_CASE(reg_val &
> GEN8_STOLEN_RESERVED_SIZE_MASK);
> >  	}
> >
> > +	/* Wa_14019821291 */
> > +	if (MEDIA_VER_FULL(i915) == IP_VER(13, 0)) {
> > +		/*
> > +		 * This workaround is primarily implemented by the BIOS.  We
> > +		 * just need to figure out whether the BIOS has applied the
> > +		 * workaround (meaning the programmed address falls within
> > +		 * the DSM) and, if so, reserve that part of the DSM to
> > +		 * prevent accidental reuse.  The DSM location should be just
> > +		 * below the WOPCM.
> > +		 */
> > +		u64 gscpsmi_base = intel_uncore_read64_2x32(uncore,
> > +
> MTL_GSCPSMI_BASEADDR_LSB,
> > +
> MTL_GSCPSMI_BASEADDR_MSB);
> 
> I overlooked it while reviewing the previous revisions, but I think we're mixing
> up which regions size/base refer to.  Basically the layout of the overall DSM
> stolen memory area is:
> 
>  [[  usable DSM area  ][ GSCPSMI WA area ][ WOPCM ]]
>  ^                                                 ^
>  |                                                 |
>  DSM base                                    DSM end
> 
> In i915 we have a resource tracking the DSM as a whole, and then also
> another resource tracking the "reserved" subregion of the DSM.  Your patch is
> trying to incorporate the gscpsmi workaround area into the reserved
> subregion:
> 
>  [  usable DSM area  ][[ GSCPSMI WA area ][ WOPCM ]]
>                       ^                            ^
>                       |                            |
>                       reserved base     reserved end
> 
> So regarding the first condition here:
> 
> > +		if (gscpsmi_base >= *base && gscpsmi_base < *base + *size)
> 
> I don't think this is checking the right thing.  You want to see whether the
> gscpsmi base address falls somewhere within within the DSM as a whole,
> whereas the base/size you're comparing against above are the preliminary
> bounds for the reserved area.  Assuming the gscpsmi address does fall
> somewhere within the DSM area, then we can pretty much assume that the
> BIOS set things up properly and the GSCPSMI workaround area is immediately
> before the WOPCM.  I.e., the gscpsmi_base should become the new start of
> the reserved region.
> 
> So what you really want is a condition like:
> 
>         if (gscpsmi_base >= i915->dsm.stolen.start &&
>             gscpsmi_base < i915->dsm.stolen.end)
> 
> to see if it falls somewhere within the entire DSM area.  If it does, then
> everything from gscpsmi_base to the end of the DSM can be considered to be
> the reserved area, and we don't even need to look at the value in
> GEN6_STOLEN_RESERVED to find the WOPCM size.
> 
> So maybe the best thing to do is move this condition to the very top of the
> function before we do anything else:
> 
>         if (gscpsmi_base >= i915->dsm.stolen.start &&
>             gscpsmi_base < i915->dsm.stolen.end) {
>                 *base = gscpsmi_base;
>                 *size = i915->dsm.stolen.end - gscpsmi_base;
>                 return;
>         }
> 
> Then if the GSCPSMI workaround is not in effect we fall back to reading the
> WOPCM size from the register and use that to calculate the reserved region
> base.
> 
> This is a bit different from how things work in my Xe patch because Xe isn't
> tracking the reserved region of the DSM, but rather the usable region, so the
> logic is somewhat the inverse of what this i915 function needs.
> 
> 
> Matt

Thank you, Matt, for the wonderful explanation.
 I will address these changes in next(V4) revision. 

Regards Dnyaneshwar

> 
> > +			*size = gscpsmi_base - *base;
> > +	}
> > +
> >  	if (HAS_LMEMBAR_SMEM_STOLEN(i915))
> >  		/* the base is initialized to stolen top so subtract size to get
> base */
> >  		*base -= *size;
> > diff --git a/drivers/gpu/drm/i915/gt/intel_gt_regs.h
> > b/drivers/gpu/drm/i915/gt/intel_gt_regs.h
> > index eecd0a87a647..9de41703fae5 100644
> > --- a/drivers/gpu/drm/i915/gt/intel_gt_regs.h
> > +++ b/drivers/gpu/drm/i915/gt/intel_gt_regs.h
> > @@ -537,6 +537,9 @@
> >  #define XEHP_SQCM				MCR_REG(0x8724)
> >  #define   EN_32B_ACCESS				REG_BIT(30)
> >
> > +#define MTL_GSCPSMI_BASEADDR_LSB		_MMIO(0x880c)
> > +#define MTL_GSCPSMI_BASEADDR_MSB		_MMIO(0x8810)
> > +
> >  #define HSW_IDICR				_MMIO(0x9008)
> >  #define   IDIHASHMSK(x)				(((x) & 0x3f) << 16)
> >
> > --
> > 2.34.1
> >
> 
> --
> Matt Roper
> Graphics Software Engineer
> Linux GPU Platform Enablement
> Intel Corporation




[Index of Archives]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux