All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3] drm/i915: Fixup intel_write_status_page() for old CPUs without clflush
@ 2017-03-24 16:35 Chris Wilson
  2017-03-24 16:35 ` [PATCH 2/3] drm/i915: Remove unused intel_flush_status_page() Chris Wilson
                   ` (5 more replies)
  0 siblings, 6 replies; 13+ messages in thread
From: Chris Wilson @ 2017-03-24 16:35 UTC (permalink / raw)
  To: intel-gfx; +Cc: Mika Kuoppala

Note all of our target platforms have clflush. For those without, just
assume the status page is sufficiently coherent that we do not need our
paranoia.

Reported-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Fixes: 14a6bbf9e535 ("drm/i915: Replace irq_seqno_barrier on hws write with a clflush")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/intel_ringbuffer.h | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
index 2ecb41788fb6..b5ce6692ed8a 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -454,14 +454,22 @@ intel_read_status_page(struct intel_engine_cs *engine, int reg)
 }
 
 static inline void
-intel_write_status_page(struct intel_engine_cs *engine,
-			int reg, u32 value)
+intel_write_status_page(struct intel_engine_cs *engine, int reg, u32 value)
 {
-	mb();
-	clflush(&engine->status_page.page_addr[reg]);
-	engine->status_page.page_addr[reg] = value;
-	clflush(&engine->status_page.page_addr[reg]);
-	mb();
+	/* Writing into the status page should be done sparingly. Since
+	 * we do when we are uncertain of the device state, we take a bit
+	 * if extra paranoia to try and ensure that the HWS takes the value
+	 * we give and that it doesn't end up trapped inside the CPU!
+	 */
+	if (static_cpu_has(X86_FEATURE_CLFLUSH)) {
+		mb();
+		clflush(&engine->status_page.page_addr[reg]);
+		engine->status_page.page_addr[reg] = value;
+		clflush(&engine->status_page.page_addr[reg]);
+		mb();
+	} else {
+		WRITE_ONCE(engine->status_page.page_addr[reg], value);
+	}
 }
 
 /*
-- 
2.11.0

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2017-03-27 12:19 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-03-24 16:35 [PATCH 1/3] drm/i915: Fixup intel_write_status_page() for old CPUs without clflush Chris Wilson
2017-03-24 16:35 ` [PATCH 2/3] drm/i915: Remove unused intel_flush_status_page() Chris Wilson
2017-03-27 10:09   ` Joonas Lahtinen
2017-03-24 16:35 ` [PATCH 3/3] drm/i915: Use BIT() for computing the engine's flag Chris Wilson
2017-03-27 10:08   ` Joonas Lahtinen
2017-03-24 16:46 ` [PATCH 1/3] drm/i915: Fixup intel_write_status_page() for old CPUs without clflush Chris Wilson
2017-03-24 16:53 ` ✓ Fi.CI.BAT: success for series starting with [1/3] " Patchwork
2017-03-27 12:19   ` Chris Wilson
2017-03-24 19:05 ` [PATCH 1/3] " Ville Syrjälä
2017-03-24 20:53   ` Ville Syrjälä
2017-03-24 21:04     ` Chris Wilson
2017-03-24 21:12       ` Ville Syrjälä
2017-03-27 11:50 ` Mika Kuoppala

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.