On Thu, Jun 12, 2014 at 08:25:52AM -0700, Ben Widawsky wrote: > On GEN8 the PDPs are saved and restored with context, which means we > must set them after the context switch has occurred. If we do not do > this, we end up saving the new PDPs for the old context. > > Example of a problem > LRI PDPs 1 > MI_SET_CONTEXT bar > LRI_PDPs 2 > MI_SET_CONTEXT foo // save PDPs 2 to bar's context > // load foos PDPs > LRI PDPs 1 > MI_SET_CONTEXT bar // save PDPs 1 to foo's context > > It's all wacky. This should allow full PPGTT on Broadwell to work. Hmm. I had this impression too but now I'm not sure. The PDPs are listed as being in the execlist context. Do we save/restore that in ring buffer mode too? IIRC on ivb/hsw it got skipped. And if the PDPs are really part of the context we shouldn't need to load them at all I think, except when we skip the restore (unitialized or default context). Or am I missing something here? And what about ivb/hsw? Doesn't this reordering risk the context restore accessing the wrong PPGTT. That's assuming the context restore can already chase some pointers. > > Signed-off-by: Ben Widawsky <ben@xxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/i915_gem_context.c | 24 ++++++++++++++++++------ > 1 file changed, 18 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c > index 3ffe308..b2434e0 100644 > --- a/drivers/gpu/drm/i915/i915_gem_context.c > +++ b/drivers/gpu/drm/i915/i915_gem_context.c > @@ -623,13 +623,12 @@ static int do_switch(struct intel_engine_cs *ring, > */ > from = ring->last_context; > > - if (USES_FULL_PPGTT(ring->dev)) { > - ret = ppgtt->switch_mm(ppgtt, ring, false); > - if (ret) > - goto unpin_out; > - } > - > if (ring != &dev_priv->ring[RCS]) { > + if (USES_FULL_PPGTT(ring->dev)) { > + ret = ppgtt->switch_mm(ppgtt, ring, false); > + if (ret) > + goto unpin_out; > + } > if (from) > i915_gem_context_unreference(from); > goto done; > @@ -660,6 +659,19 @@ static int do_switch(struct intel_engine_cs *ring, > if (ret) > goto unpin_out; > > + if (USES_FULL_PPGTT(ring->dev)) { > + ret = ppgtt->switch_mm(ppgtt, ring, false); > + /* The hardware context switch is emitted, but we haven't > + * actually changed the state - so it's probably safe to bail > + * here. Still, let the user know something dangerous has > + * happened. > + */ > + if (ret) { > + DRM_ERROR("Failed to change address space on context switch\n"); > + goto unpin_out; > + } > + } > + > for (i = 0; i < MAX_L3_SLICES; i++) { > if (!(to->remap_slice & (1<<i))) > continue; > -- > 2.0.0 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/intel-gfx -- Ville Syrjälä Intel OTC _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx