From: Chris Wilson ickle@x201s.alporthouse.com
After changing the timing between GTT updates and execution on the GPU, we started seeing sporadic failures on Ironlake. These were narrowed down to being an insufficiently strong enough barrier/delay after updating the GTT and scheduling execution on the GPU. By forcing the uncached read, and adding the missing barrier for the singular insert_page (relocation paths), the sporadic failures go away.
Fixes: 983d308cb8f6 ("agp/intel: Serialise after GTT updates") Signed-off-by: Chris Wilson chris@chris-wilson.co.uk Cc: stable@vger.kernel.org # v4.0+ --- drivers/char/agp/intel-gtt.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c index 66a62d17a3f5..3d42fc4290bc 100644 --- a/drivers/char/agp/intel-gtt.c +++ b/drivers/char/agp/intel-gtt.c @@ -846,6 +846,7 @@ void intel_gtt_insert_page(dma_addr_t addr, unsigned int flags) { intel_private.driver->write_entry(addr, pg, flags); + readl(intel_private.gtt + pg); if (intel_private.driver->chipset_flush) intel_private.driver->chipset_flush(); } @@ -871,7 +872,7 @@ void intel_gtt_insert_sg_entries(struct sg_table *st, j++; } } - wmb(); + readl(intel_private.gtt + j - 1); if (intel_private.driver->chipset_flush) intel_private.driver->chipset_flush(); } @@ -1105,6 +1106,7 @@ static void i9xx_cleanup(void)
static void i9xx_chipset_flush(void) { + wmb(); if (intel_private.i9xx_flush_page) writel(1, intel_private.i9xx_flush_page); }
After changing the timing between GTT updates and execution on the GPU, we started seeing sporadic failures on Ironlake. These were narrowed down to being an insufficiently strong enough barrier/delay after updating the GTT and scheduling execution on the GPU. By forcing the uncached read, and adding the missing barrier for the singular insert_page (relocation paths), the sporadic failures go away.
Fixes: 983d308cb8f6 ("agp/intel: Serialise after GTT updates") Signed-off-by: Chris Wilson chris@chris-wilson.co.uk Cc: stable@vger.kernel.org # v4.0+ --- drivers/char/agp/intel-gtt.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c index 66a62d17a3f5..3d42fc4290bc 100644 --- a/drivers/char/agp/intel-gtt.c +++ b/drivers/char/agp/intel-gtt.c @@ -846,6 +846,7 @@ void intel_gtt_insert_page(dma_addr_t addr, unsigned int flags) { intel_private.driver->write_entry(addr, pg, flags); + readl(intel_private.gtt + pg); if (intel_private.driver->chipset_flush) intel_private.driver->chipset_flush(); } @@ -871,7 +872,7 @@ void intel_gtt_insert_sg_entries(struct sg_table *st, j++; } } - wmb(); + readl(intel_private.gtt + j - 1); if (intel_private.driver->chipset_flush) intel_private.driver->chipset_flush(); } @@ -1105,6 +1106,7 @@ static void i9xx_cleanup(void)
static void i9xx_chipset_flush(void) { + wmb(); if (intel_private.i9xx_flush_page) writel(1, intel_private.i9xx_flush_page); }
Hi Chris,
After changing the timing between GTT updates and execution on the GPU, we started seeing sporadic failures on Ironlake. These were narrowed down to being an insufficiently strong enough barrier/delay after updating the GTT and scheduling execution on the GPU. By forcing the uncached read, and adding the missing barrier for the singular insert_page (relocation paths), the sporadic failures go away.
Fixes: 983d308cb8f6 ("agp/intel: Serialise after GTT updates") Signed-off-by: Chris Wilson chris@chris-wilson.co.uk Cc: stable@vger.kernel.org # v4.0+
Acked-by: Andi Shyti andi.shyti@intel.com
Andi
drivers/char/agp/intel-gtt.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c index 66a62d17a3f5..3d42fc4290bc 100644 --- a/drivers/char/agp/intel-gtt.c +++ b/drivers/char/agp/intel-gtt.c @@ -846,6 +846,7 @@ void intel_gtt_insert_page(dma_addr_t addr, unsigned int flags) { intel_private.driver->write_entry(addr, pg, flags);
- readl(intel_private.gtt + pg); if (intel_private.driver->chipset_flush) intel_private.driver->chipset_flush();
} @@ -871,7 +872,7 @@ void intel_gtt_insert_sg_entries(struct sg_table *st, j++; } }
- wmb();
- readl(intel_private.gtt + j - 1); if (intel_private.driver->chipset_flush) intel_private.driver->chipset_flush();
} @@ -1105,6 +1106,7 @@ static void i9xx_cleanup(void) static void i9xx_chipset_flush(void) {
- wmb(); if (intel_private.i9xx_flush_page) writel(1, intel_private.i9xx_flush_page);
}
Hi
[This is an automated email]
This commit has been processed because it contains a "Fixes:" tag fixing commit: 983d308cb8f6 ("agp/intel: Serialise after GTT updates").
The bot has tested the following trees: v5.6.5, v5.5.18, v5.4.33, v4.19.116, v4.14.176, v4.9.219, v4.4.219.
v5.6.5: Build OK! v5.5.18: Build OK! v5.4.33: Build OK! v4.19.116: Build OK! v4.14.176: Build OK! v4.9.219: Build OK! v4.4.219: Failed to apply! Possible dependencies: 09cfcb456941 ("drm/i915: Split out load time HW initialization") 0a9d2bed5557 ("drm/i915/skl: Making DC6 entry is the last call in suspend flow.") 1f814daca43a ("drm/i915: add support for checking if we hold an RPM reference") 2f693e28b8df ("drm/i915: Make turning on/off PW1 and Misc I/O part of the init/fini sequences") 399bb5b6db02 ("drm/i915: Move allocation of various workqueues earlier during init") 414b7999b8be ("drm/i915/gen9: Remove csr.state, csr_lock and related code.") 5bab6f60cb4d ("drm/i915: Serialise updates to GGTT with access through GGTT on Braswell") 62106b4f6b91 ("drm/i915: Rename dev_priv->gtt to dev_priv->ggtt") 73dfc227ff5c ("drm/i915/skl: init/uninit display core as part of the HW power domain state") 9c5308ea1cd4 ("drm/i915/skl: Refuse to load outdated dmc firmware") ad5c3d3ffbb2 ("drm/i915: Move MCHBAR setup earlier during init") b6e7d894c3d2 ("drm/i915/skl: Store and print the DMC firmware version we load") bc87229f323e ("drm/i915/skl: enable PC9/10 power states during suspend-to-idle") c140330b5e6b ("drm/i915: Move Braswell stop_machine GGTT insertion workaround") c73666f394fc ("drm/i915/skl: If needed sanitize bios programmed cdclk") d507d73578ef ("drm/i915/gtt: Clean up GGTT probing code") d6473f566417 ("drm/i915: Add support for mapping an object page by page") ebae38d061df ("drm/i915/gen9: csr_init after runtime pm enable") f4448375467d ("drm/i915/gen9: Use dev_priv in csr functions") f514c2d84285 ("drm/i915/gen9: flush DMC fw loading work during system suspend")
NOTE: The patch will not be queued to stable trees until it is upstream.
How should we proceed with this patch?
linux-stable-mirror@lists.linaro.org