Author: rnoland
Date: Tue Jun 23 15:56:10 2009
New Revision: 194727
URL: http://svn.freebsd.org/changeset/base/194727

Log:
  Merge 190400 from HEAD
  
  Intel handled the management of the breadcrumb counter inconsistently.
  Make sure that we always handle it the same way.

Modified:
  stable/7/sys/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)
  stable/7/sys/dev/drm/i915_dma.c
  stable/7/sys/dev/drm/i915_irq.c

Modified: stable/7/sys/dev/drm/i915_dma.c
==============================================================================
--- stable/7/sys/dev/drm/i915_dma.c     Tue Jun 23 15:55:58 2009        
(r194726)
+++ stable/7/sys/dev/drm/i915_dma.c     Tue Jun 23 15:56:10 2009        
(r194727)
@@ -439,8 +439,7 @@ static void i915_emit_breadcrumb(struct 
        drm_i915_private_t *dev_priv = dev->dev_private;
        RING_LOCALS;
 
-       dev_priv->counter++;
-       if (dev_priv->counter > 0x7FFFFFFFUL)
+       if (++dev_priv->counter > 0x7FFFFFFFUL)
                dev_priv->counter = 0;
        if (dev_priv->sarea_priv)
                dev_priv->sarea_priv->last_enqueue = dev_priv->counter;
@@ -574,7 +573,10 @@ static int i915_dispatch_flip(struct drm
        OUT_RING(0);
        ADVANCE_LP_RING();
 
-       dev_priv->sarea_priv->last_enqueue = dev_priv->counter++;
+       if (++dev_priv->counter > 0x7FFFFFFFUL)
+               dev_priv->counter = 0;
+       if (dev_priv->sarea_priv)
+               dev_priv->sarea_priv->last_enqueue = dev_priv->counter;
 
        BEGIN_LP_RING(4);
        OUT_RING(MI_STORE_DWORD_INDEX);

Modified: stable/7/sys/dev/drm/i915_irq.c
==============================================================================
--- stable/7/sys/dev/drm/i915_irq.c     Tue Jun 23 15:55:58 2009        
(r194726)
+++ stable/7/sys/dev/drm/i915_irq.c     Tue Jun 23 15:56:10 2009        
(r194727)
@@ -284,14 +284,13 @@ static int i915_emit_irq(struct drm_devi
 
        i915_kernel_lost_context(dev);
 
-       DRM_DEBUG("\n");
-
-       dev_priv->counter++;
-       if (dev_priv->counter > 0x7FFFFFFFUL)
-               dev_priv->counter = 1;
+       if (++dev_priv->counter > 0x7FFFFFFFUL)
+               dev_priv->counter = 0;
        if (dev_priv->sarea_priv)
                dev_priv->sarea_priv->last_enqueue = dev_priv->counter;
 
+       DRM_DEBUG("emitting: %d\n", dev_priv->counter);
+
        BEGIN_LP_RING(4);
        OUT_RING(MI_STORE_DWORD_INDEX);
        OUT_RING(I915_BREADCRUMB_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
@@ -331,9 +330,6 @@ static int i915_wait_irq(struct drm_devi
        drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
        int ret = 0;
 
-       DRM_DEBUG("irq_nr=%d breadcrumb=%d\n", irq_nr,
-                 READ_BREADCRUMB(dev_priv));
-
        if (READ_BREADCRUMB(dev_priv) >= irq_nr) {
                if (dev_priv->sarea_priv) {
                        dev_priv->sarea_priv->last_dispatch =
@@ -345,6 +341,9 @@ static int i915_wait_irq(struct drm_devi
        if (dev_priv->sarea_priv)
                dev_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT;
 
+       DRM_DEBUG("irq_nr=%d breadcrumb=%d\n", irq_nr,
+                 READ_BREADCRUMB(dev_priv));
+
        i915_user_irq_get(dev);
        DRM_WAIT_ON(ret, dev_priv->irq_queue, 3 * DRM_HZ,
                    READ_BREADCRUMB(dev_priv) >= irq_nr);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to