i965: Handle URB_FENCE erratum for Broadwater
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 3 Mar 2011 18:15:03 +0000 (18:15 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 4 Mar 2011 09:58:31 +0000 (09:58 +0000)
There is a silicon bug which causes unpredictable behaviour if the
URB_FENCE command should cross a cache-line boundary. Pad before the
command to avoid such occurrences. As this command only applies to
gen4/5, do the fixup unconditionally as the specs do not actually state
for which chip it was fixed (and the cost is negligible)...

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
src/mesa/drivers/dri/i965/brw_urb.c

index dfc1551aca63136f53ea2942fd5e11186381f0c9..b0419d8a420e5b79dab3b7399efa04c6d8f57edf 100644 (file)
@@ -248,5 +248,13 @@ void brw_upload_urb_fence(struct brw_context *brw)
    uf.bits1.sf_fence  = brw->urb.cs_start; 
    uf.bits1.cs_fence  = brw->urb.size;
 
+   /* erratum: URB_FENCE must not cross a 64byte cacheline */
+   if ((brw->intel.batch.used & 15) > 12) {
+      int pad = 16 - (brw->intel.batch.used & 15);
+      do
+        brw->intel.batch.map[brw->intel.batch.used++] = MI_NOOP;
+      while (--pad);
+   }
+
    BRW_BATCH_STRUCT(brw, &uf);
 }