Intel handled the management of the breadcrumb counter inconsistently.
Make sure that we always handle it the same way. MFC after: 3 days
This commit is contained in:
parent
eccb3bb8f6
commit
a13575a303
@ -439,8 +439,7 @@ static void i915_emit_breadcrumb(struct drm_device *dev)
|
|||||||
drm_i915_private_t *dev_priv = dev->dev_private;
|
drm_i915_private_t *dev_priv = dev->dev_private;
|
||||||
RING_LOCALS;
|
RING_LOCALS;
|
||||||
|
|
||||||
dev_priv->counter++;
|
if (++dev_priv->counter > 0x7FFFFFFFUL)
|
||||||
if (dev_priv->counter > 0x7FFFFFFFUL)
|
|
||||||
dev_priv->counter = 0;
|
dev_priv->counter = 0;
|
||||||
if (dev_priv->sarea_priv)
|
if (dev_priv->sarea_priv)
|
||||||
dev_priv->sarea_priv->last_enqueue = dev_priv->counter;
|
dev_priv->sarea_priv->last_enqueue = dev_priv->counter;
|
||||||
@ -574,7 +573,10 @@ static int i915_dispatch_flip(struct drm_device * dev)
|
|||||||
OUT_RING(0);
|
OUT_RING(0);
|
||||||
ADVANCE_LP_RING();
|
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);
|
BEGIN_LP_RING(4);
|
||||||
OUT_RING(MI_STORE_DWORD_INDEX);
|
OUT_RING(MI_STORE_DWORD_INDEX);
|
||||||
|
@ -284,14 +284,13 @@ static int i915_emit_irq(struct drm_device * dev)
|
|||||||
|
|
||||||
i915_kernel_lost_context(dev);
|
i915_kernel_lost_context(dev);
|
||||||
|
|
||||||
DRM_DEBUG("\n");
|
if (++dev_priv->counter > 0x7FFFFFFFUL)
|
||||||
|
dev_priv->counter = 0;
|
||||||
dev_priv->counter++;
|
|
||||||
if (dev_priv->counter > 0x7FFFFFFFUL)
|
|
||||||
dev_priv->counter = 1;
|
|
||||||
if (dev_priv->sarea_priv)
|
if (dev_priv->sarea_priv)
|
||||||
dev_priv->sarea_priv->last_enqueue = dev_priv->counter;
|
dev_priv->sarea_priv->last_enqueue = dev_priv->counter;
|
||||||
|
|
||||||
|
DRM_DEBUG("emitting: %d\n", dev_priv->counter);
|
||||||
|
|
||||||
BEGIN_LP_RING(4);
|
BEGIN_LP_RING(4);
|
||||||
OUT_RING(MI_STORE_DWORD_INDEX);
|
OUT_RING(MI_STORE_DWORD_INDEX);
|
||||||
OUT_RING(I915_BREADCRUMB_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
|
OUT_RING(I915_BREADCRUMB_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
|
||||||
@ -331,9 +330,6 @@ static int i915_wait_irq(struct drm_device * dev, int irq_nr)
|
|||||||
drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
|
drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
|
||||||
int ret = 0;
|
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 (READ_BREADCRUMB(dev_priv) >= irq_nr) {
|
||||||
if (dev_priv->sarea_priv) {
|
if (dev_priv->sarea_priv) {
|
||||||
dev_priv->sarea_priv->last_dispatch =
|
dev_priv->sarea_priv->last_dispatch =
|
||||||
@ -345,6 +341,9 @@ static int i915_wait_irq(struct drm_device * dev, int irq_nr)
|
|||||||
if (dev_priv->sarea_priv)
|
if (dev_priv->sarea_priv)
|
||||||
dev_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT;
|
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);
|
i915_user_irq_get(dev);
|
||||||
DRM_WAIT_ON(ret, dev_priv->irq_queue, 3 * DRM_HZ,
|
DRM_WAIT_ON(ret, dev_priv->irq_queue, 3 * DRM_HZ,
|
||||||
READ_BREADCRUMB(dev_priv) >= irq_nr);
|
READ_BREADCRUMB(dev_priv) >= irq_nr);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user