i915: Fix handling of breadcrumb counter wraparounds.
authorMichel Dänzer <michel@tungstengraphics.com>
Fri, 15 Jun 2007 15:13:11 +0000 (17:13 +0200)
committerMichel Dänzer <michel@tungstengraphics.com>
Fri, 15 Jun 2007 15:13:11 +0000 (17:13 +0200)
linux-core/i915_drv.c
linux-core/i915_fence.c
shared-core/i915_dma.c
shared-core/i915_drv.h

index 4c35b4c..4943706 100644 (file)
@@ -41,9 +41,9 @@ static struct pci_device_id pciidlist[] = {
 #ifdef I915_HAVE_FENCE
 static drm_fence_driver_t i915_fence_driver = {
        .num_classes = 1,
-       .wrap_diff = (1 << 30),
-       .flush_diff = (1 << 29),
-       .sequence_mask = 0x7fffffffU,
+       .wrap_diff = (1U << (BREADCRUMB_BITS - 1)),
+       .flush_diff = (1U << (BREADCRUMB_BITS - 2)),
+       .sequence_mask = BREADCRUMB_MASK,
        .lazy_capable = 1,
        .emit = i915_fence_emit_sequence,
        .poke_flush = i915_poke_flush,
index 88daa57..0087348 100644 (file)
@@ -61,7 +61,7 @@ static void i915_perform_flush(drm_device_t * dev)
                 * First update fences with the current breadcrumb.
                 */
 
-               diff = sequence - fc->last_exe_flush;
+               diff = (sequence - fc->last_exe_flush) & BREADCRUMB_MASK;
                if (diff < driver->wrap_diff && diff != 0) {
                        drm_fence_handler(dev, 0, sequence, DRM_FENCE_TYPE_EXE);
                }
index ebb184c..dbc5f95 100644 (file)
@@ -445,10 +445,12 @@ void i915_emit_breadcrumb(drm_device_t *dev)
        drm_i915_private_t *dev_priv = dev->dev_private;
        RING_LOCALS;
 
-       dev_priv->sarea_priv->last_enqueue = ++dev_priv->counter;
+       if (++dev_priv->counter > BREADCRUMB_MASK) {
+                dev_priv->counter = 1;
+                DRM_DEBUG("Breadcrumb counter wrapped around\n");
+       }
 
-       if (dev_priv->counter > 0x7FFFFFFFUL)
-                dev_priv->sarea_priv->last_enqueue = dev_priv->counter = 1;
+       dev_priv->sarea_priv->last_enqueue = dev_priv->counter;
 
        BEGIN_LP_RING(4);
        OUT_RING(CMD_STORE_DWORD_IDX);
index 9deee8e..e043299 100644 (file)
@@ -363,6 +363,9 @@ extern int i915_wait_ring(drm_device_t * dev, int n, const char *caller);
 
 #define CMD_OP_DESTBUFFER_INFO  ((0x3<<29)|(0x1d<<24)|(0x8e<<16)|1)
 
+#define BREADCRUMB_BITS 31
+#define BREADCRUMB_MASK ((1U << BREADCRUMB_BITS) - 1)
+
 #define READ_BREADCRUMB(dev_priv)  (((volatile u32*)(dev_priv->hw_status_page))[5])
 #define READ_HWSP(dev_priv, reg)  (((volatile u32*)(dev_priv->hw_status_page))[reg])
 #endif