[Intel-gfx] [PATCH 1/3] drm/i915/guc: Fix GuC pin bias and WOPCM initialization order

Bartminski, Jakub jakub.bartminski at intel.com
Tue Jul 17 12:43:08 UTC 2018


On Tue, 2018-07-17 at 14:19 +0200, Michal Wajdeczko wrote:
> On Tue, 17 Jul 2018 13:55:58 +0200, Jakub Bartmiński  
> <jakub.bartminski at intel.com> wrote:
> 
> > It would seem that we are using uninitialized WOPCM variables when
> > setting the GuC pin bias. The pin bias has to be set after the
> > WOPCM,
> > but before the call to i915_gem_contexts_init where the first
> > contexts
> > are pinned so the safest place to set it seems to be right after
> > initializing the relevant variables in intel_wopcm_init.
> > 
> > Signed-off-by: Jakub Bartmiński <jakub.bartminski at intel.com>
> > Cc: Chris Wilson <chris at chris-wilson.co.uk>
> > Cc: Michał Winiarski <michal.winiarski at intel.com>
> > Cc: Michal Wajdeczko <michal.wajdeczko at intel.com>
> > ---
> >  drivers/gpu/drm/i915/intel_guc.c   | 21 ---------------------
> >  drivers/gpu/drm/i915/intel_wopcm.c | 19 +++++++++++++++++++
> >  2 files changed, 19 insertions(+), 21 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/intel_guc.c  
> > b/drivers/gpu/drm/i915/intel_guc.c
> > index e12bd259df17..47cacd59ac32 100644
> > --- a/drivers/gpu/drm/i915/intel_guc.c
> > +++ b/drivers/gpu/drm/i915/intel_guc.c
> > @@ -27,8 +27,6 @@
> >  #include "intel_guc_submission.h"
> >  #include "i915_drv.h"
> > -static void guc_init_ggtt_pin_bias(struct intel_guc *guc);
> > -
> >  static void gen8_guc_raise_irq(struct intel_guc *guc)
> >  {
> >  	struct drm_i915_private *dev_priv = guc_to_i915(guc);
> > @@ -142,8 +140,6 @@ int intel_guc_init_misc(struct intel_guc *guc)
> >  	struct drm_i915_private *i915 = guc_to_i915(guc);
> >  	int ret;
> > -	guc_init_ggtt_pin_bias(guc);
> > -
> >  	ret = guc_init_wq(guc);
> >  	if (ret)
> >  		return ret;
> > @@ -611,23 +607,6 @@ int intel_guc_resume(struct intel_guc *guc)
> >   * actual GuC WOPCM size.
> >   */
> > -/**
> > - * guc_init_ggtt_pin_bias() - Initialize the GuC ggtt_pin_bias
> > value.
> > - * @guc: intel_guc structure.
> > - *
> > - * This function will calculate and initialize the ggtt_pin_bias
> > value  
> > based on
> > - * overall WOPCM size and GuC WOPCM size.
> > - */
> > -static void guc_init_ggtt_pin_bias(struct intel_guc *guc)
> > -{
> > -	struct drm_i915_private *i915 = guc_to_i915(guc);
> > -
> > -	GEM_BUG_ON(!i915->wopcm.size);
> > -	GEM_BUG_ON(i915->wopcm.size < i915->wopcm.guc.base);
> > -
> > -	guc->ggtt_pin_bias = i915->wopcm.size - i915-
> > >wopcm.guc.base;
> > -}
> > -
> >  /**
> >   * intel_guc_allocate_vma() - Allocate a GGTT VMA for GuC usage
> >   * @guc:	the guc
> > diff --git a/drivers/gpu/drm/i915/intel_wopcm.c  
> > b/drivers/gpu/drm/i915/intel_wopcm.c
> > index 74bf76f3fddc..02f602db9548 100644
> > --- a/drivers/gpu/drm/i915/intel_wopcm.c
> > +++ b/drivers/gpu/drm/i915/intel_wopcm.c
> > @@ -140,6 +140,23 @@ static inline int
> > check_hw_restriction(struct  
> > drm_i915_private *i915,
> >  	return err;
> >  }
> > +/**
> > + * wopcm_init_guc_ggtt_pin_bias() - Initialize the GuC
> > ggtt_pin_bias  
> > value.
> > + * @wopcm: pointer to intel_wopcm.
> > + *
> > + * This function will calculate and initialize the GuC
> > ggtt_pin_bias  
> > value based
> > + * on overall WOPCM size and GuC WOPCM size.
> > + */
> > +static void wopcm_init_guc_ggtt_pin_bias(struct intel_wopcm
> > *wopcm)
> > +{
> > +	struct drm_i915_private *i915 = wopcm_to_i915(wopcm);
> > +
> > +	GEM_BUG_ON(!wopcm->size);
> > +	GEM_BUG_ON(wopcm->size < wopcm->guc.base);
> > +
> > +	i915->guc.ggtt_pin_bias = wopcm->size - wopcm->guc.base;
> 
> Hmm, I don't like the idea to modify GuC (or GGTT later on) internals
> directly from WOPCM private functions.
> 
> Maybe you can change your series to first move pin_bias from GuC to
> GGTT and then immediately setup it inside i915_gem_init_ggtt() which
> is called after intel_wopcm_init() and before
> i915_gem_contexts_init()
> 
> Michal
> 
> 
> > +}
> > +
> >  /**
> >   * intel_wopcm_init() - Initialize the WOPCM structure.
> >   * @wopcm: pointer to intel_wopcm.
> > @@ -207,6 +224,8 @@ int intel_wopcm_init(struct intel_wopcm *wopcm)
> >  	wopcm->guc.base = guc_wopcm_base;
> >  	wopcm->guc.size = guc_wopcm_size;
> > +	wopcm_init_guc_ggtt_pin_bias(wopcm);
> > +
> >  	return 0;
> >  }

Indeed, since I don't think that the mock tests use this initialization
path, we should be able to decide on how to set the new ggtt pin_bias
value with the USES_GUC macro inside i915_gem_init_ggtt without raising
any assertion failures.
I will also take into account Chris's suggestions and resend.

-Jakub
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 3278 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/intel-gfx/attachments/20180717/20cedc51/attachment.bin>


More information about the Intel-gfx mailing list