aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_ringbuffer.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2018-09-10 09:08:08 -0400
committerChris Wilson <chris@chris-wilson.co.uk>2018-09-12 06:02:08 -0400
commite2a13d1b24073fe183ebe858ebb4fc827faded56 (patch)
tree504c251b0178756bfea370613debba32580317da /drivers/gpu/drm/i915/intel_ringbuffer.c
parentd3f3e5e438d3ce47505db8b0a63d55629e48167e (diff)
drm/i915/ringbuffer: Reload PDs harder on byt/bcs
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@chris-wilson.co.uk> Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20180910130808.10809-1-chris@chris-wilson.co.uk
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ringbuffer.c')
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.c23
1 files 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)
1677 GEM_BUG_ON(HAS_EXECLISTS(rq->i915)); 1677 GEM_BUG_ON(HAS_EXECLISTS(rq->i915));
1678 1678
1679 if (ppgtt) { 1679 if (ppgtt) {
1680 ret = load_pd_dir(rq, ppgtt); 1680 int loops;
1681 if (ret) 1681
1682 goto err; 1682 /*
1683 * Baytail takes a little more convincing that it really needs
1684 * to reload the PD between contexts. It is not just a little
1685 * longer, as adding more stalls after the load_pd_dir (i.e.
1686 * adding a long loop around flush_pd_dir) is not as effective
1687 * as reloading the PD umpteen times. 32 is derived from
1688 * experimentation (gem_exec_parallel/fds) and has no good
1689 * explanation.
1690 */
1691 loops = 1;
1692 if (engine->id == BCS && IS_VALLEYVIEW(engine->i915))
1693 loops = 32;
1694
1695 do {
1696 ret = load_pd_dir(rq, ppgtt);
1697 if (ret)
1698 goto err;
1699 } while (--loops);
1683 1700
1684 if (intel_engine_flag(engine) & ppgtt->pd_dirty_rings) { 1701 if (intel_engine_flag(engine) & ppgtt->pd_dirty_rings) {
1685 unwind_mm = intel_engine_flag(engine); 1702 unwind_mm = intel_engine_flag(engine);