Quoting Chris Wilson (2018-09-11 14:57:45) > Baytrail takes a little more convincing that it needs to actually reload > its Page Directoy (ppGTT) before the context switch, so repeat it until > it gets the message. Once again the arbitrary values here are > empirically derived. > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107861 > Testcase: igt/gem_exec_parallel/fds > Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/intel_ringbuffer.c | 23 ++++++++++++++++++++--- > 1 file changed, 20 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c > index 472939f5c18f..d0ef50bf930a 100644 > --- a/drivers/gpu/drm/i915/intel_ringbuffer.c > +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c > @@ -1677,9 +1677,26 @@ static int switch_context(struct i915_request *rq) > GEM_BUG_ON(HAS_EXECLISTS(rq->i915)); > > if (ppgtt) { > - ret = load_pd_dir(rq, ppgtt); > - if (ret) > - goto err; > + int loops; > + > + /* > + * Baytail takes a little more convincing that it really needs > + * to reload the PD between contexts. It is not just a little > + * longer, as adding more stalls after the load_pd_dir (i.e. > + * adding a long loop around flush_pd_dir) is not as effective > + * as reloading the PD umpteen times. 32 is derived from > + * experimentation (gem_exec_parallel/fds) and has no good > + * explanation. > + */ > + loops = 1; > + if (engine->id == BCS && IS_VALLEYVIEW(engine->i915)) > + loops = 32; > + > + do { > + ret = load_pd_dir(rq, ppgtt); > + if (ret) > + goto err; > + } while (--loops); This what they call black magic. Reviewed-by: Joonas Lahtinen <joonas.lahtinen@xxxxxxxxxxxxxxx> Regards, Joonas _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx