[Intel-gfx] [PATCH v3] drm/i915/gt: Poison GTT scratch pages

Chris Wilson chris at chris-wilson.co.uk
Thu Jan 23 12:12:03 UTC 2020


Quoting Mika Kuoppala (2020-01-23 11:56:20)
> Chris Wilson <chris at chris-wilson.co.uk> writes:
> 
> > Using a clear page for scratch means that we have relatively benign
> > errors in case it is accidentally used, but that can be rather too
> > benign for debugging. If we poison the scratch, ideally it quickly
> > results in an obvious error.
> >
> > v2: Set each page individually just in case we are using highmem for our
> > scratch page.
> > v3: Pick a new scratch register as MI_STORE_REGISTER_MEM does not work
> > with GPR0 on gen7, unbelievably.
> >
> > Suggested-by: Mika Kuoppala <mika.kuoppala at linux.intel.com>
> 
> I have a faint memory...aeons ago..might have.
> 
> > Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> > Cc: Mika Kuoppala <mika.kuoppala at linux.intel.com>
> > Cc: Matthew Auld <matthew.william.auld at gmail.com>
> > ---
> >  .../drm/i915/gem/selftests/i915_gem_context.c | 51 ++++++++++++++++---
> >  drivers/gpu/drm/i915/gt/intel_gtt.c           | 30 +++++++++++
> >  2 files changed, 75 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
> > index 7fc46861a54d..00a56a8b309a 100644
> > --- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
> > +++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
> > @@ -1575,7 +1575,6 @@ static int read_from_scratch(struct i915_gem_context *ctx,
> >       struct drm_i915_private *i915 = ctx->i915;
> >       struct drm_i915_gem_object *obj;
> >       struct i915_address_space *vm;
> > -     const u32 RCS_GPR0 = 0x2600; /* not all engines have their own GPR! */
> >       const u32 result = 0x100;
> >       struct i915_request *rq;
> >       struct i915_vma *vma;
> > @@ -1596,20 +1595,24 @@ static int read_from_scratch(struct i915_gem_context *ctx,
> >  
> >       memset(cmd, POISON_INUSE, PAGE_SIZE);
> >       if (INTEL_GEN(i915) >= 8) {
> > +             const u32 GPR0 = engine->mmio_base + 0x600;
> > +
> >               *cmd++ = MI_LOAD_REGISTER_MEM_GEN8;
> > -             *cmd++ = RCS_GPR0;
> > +             *cmd++ = GPR0;
> >               *cmd++ = lower_32_bits(offset);
> >               *cmd++ = upper_32_bits(offset);
> >               *cmd++ = MI_STORE_REGISTER_MEM_GEN8;
> > -             *cmd++ = RCS_GPR0;
> > +             *cmd++ = GPR0;
> >               *cmd++ = result;
> >               *cmd++ = 0;
> >       } else {
> > +             const u32 reg = engine->mmio_base + 0x420;
> 
> 3d prim end offset? Well should not matter for this selftest
> but did you check 0xA198?

Forcewake is handled by MI from the engines, if I understood you
correctly. First thought it was indeed just that that !rcs engines
couldn't read from the rcs, so limited it to just rcs and still it
failed.
> 
> How have 0x600 been been working in gen7 previously?

No idea. Tried to use I915_DISPATCH_SECURE (fixing up the batch vma to
be in the GGTT) and it still returned 0. Even after poisoning the GPR
with MI_LOAD_REG_IMM. Ergo it had to be the read of GPR that was being
scrubbed (since we poison the destination to verify the write lands).

But 3DPRIM_END_OFFSET worked (I suspected it might since it's part of
the indirect glDrawArrays), so I assume it's just some more of the
wonderfully askew validation on gen7.
-Chris


More information about the Intel-gfx mailing list