{
        /* Workaround to force correct ordering between irq and seqno writes on
         * ivb (and maybe also on snb) by reading from a CS register (like
-        * ACTHD) before reading the status page. */
+        * ACTHD) before reading the status page.
+        *
+        * Note that this effectively stalls the read by the time it takes to
+        * do a memory transaction, which more or less ensures that the write
+        * from the GPU has sufficient time to invalidate the CPU cacheline.
+        * Alternatively we could delay the interrupt from the CS ring to give
+        * the write time to land, but that would incur a delay after every
+        * batch i.e. much more frequent than a delay when waiting for the
+        * interrupt (with the same net latency).
+        */
        if (!lazy_coherency) {
                struct drm_i915_private *dev_priv = engine->dev->dev_private;
-               POSTING_READ(RING_ACTHD(engine->mmio_base));
+               POSTING_READ_FW(RING_ACTHD(engine->mmio_base));
        }
 
        return intel_read_status_page(engine, I915_GEM_HWS_INDEX);