drm/i915: Skip the execlists CSB scan and rewrite if the ring is untouched
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 24 Jan 2017 11:00:06 +0000 (11:00 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Tue, 24 Jan 2017 15:56:18 +0000 (15:56 +0000)
If the CSB head/tail pointers are unchanged, we can skip the update of
the CSB register afterwards.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170124110009.28947-5-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/intel_lrc.c

index f729568e5e544ea7783ea845b6c49014e2013af7..99ab2d70be37584e8583bdd8eadbf5cef757fb49 100644 (file)
@@ -574,9 +574,12 @@ static void intel_lrc_irq_handler(unsigned long data)
                csb = readl(csb_mmio);
                head = GEN8_CSB_READ_PTR(csb);
                tail = GEN8_CSB_WRITE_PTR(csb);
+               if (head == tail)
+                       break;
+
                if (tail < head)
                        tail += GEN8_CSB_ENTRIES;
-               while (head < tail) {
+               do {
                        unsigned int idx = ++head % GEN8_CSB_ENTRIES;
                        unsigned int status = readl(buf + 2 * idx);
 
@@ -601,7 +604,7 @@ static void intel_lrc_irq_handler(unsigned long data)
 
                        GEM_BUG_ON(port[0].count == 0 &&
                                   !(status & GEN8_CTX_STATUS_ACTIVE_IDLE));
-               }
+               } while (head < tail);
 
                writel(_MASKED_FIELD(GEN8_CSB_READ_PTR_MASK,
                                     GEN8_CSB_WRITE_PTR(csb) << 8),