[Intel-gfx] [PATCH] drm/i915: Make the ring IMR handling private
Alexey Fisher
bug-track at fisher-privat.net
Wed Jan 5 12:54:23 CET 2011
Tested. It's working.
Thank you.
Am Mittwoch, den 05.01.2011, 10:36 +0000 schrieb Chris Wilson:
> As the IMR for the USER interrupts are not modified elsewhere, we can
> separate the spinlock used for these from that of hpd and pipestats.
> Those two IMR are manipulated under an IRQ and so need heavier locking.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
> drivers/gpu/drm/i915/intel_ringbuffer.c | 26 ++++++++++++++------------
> drivers/gpu/drm/i915/intel_ringbuffer.h | 1 +
> 2 files changed, 15 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
> index 13cad98..03e3370 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.c
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
> @@ -526,7 +526,7 @@ render_ring_get_irq(struct intel_ring_buffer *ring)
> if (!dev->irq_enabled)
> return false;
>
> - spin_lock(&dev_priv->irq_lock);
> + spin_lock(&ring->irq_lock);
> if (ring->irq_refcount++ == 0) {
> if (HAS_PCH_SPLIT(dev))
> ironlake_enable_irq(dev_priv,
> @@ -534,7 +534,7 @@ render_ring_get_irq(struct intel_ring_buffer *ring)
> else
> i915_enable_irq(dev_priv, I915_USER_INTERRUPT);
> }
> - spin_unlock(&dev_priv->irq_lock);
> + spin_unlock(&ring->irq_lock);
>
> return true;
> }
> @@ -545,7 +545,7 @@ render_ring_put_irq(struct intel_ring_buffer *ring)
> struct drm_device *dev = ring->dev;
> drm_i915_private_t *dev_priv = dev->dev_private;
>
> - spin_lock(&dev_priv->irq_lock);
> + spin_lock(&ring->irq_lock);
> if (--ring->irq_refcount == 0) {
> if (HAS_PCH_SPLIT(dev))
> ironlake_disable_irq(dev_priv,
> @@ -554,7 +554,7 @@ render_ring_put_irq(struct intel_ring_buffer *ring)
> else
> i915_disable_irq(dev_priv, I915_USER_INTERRUPT);
> }
> - spin_unlock(&dev_priv->irq_lock);
> + spin_unlock(&ring->irq_lock);
> }
>
> void intel_ring_setup_status_page(struct intel_ring_buffer *ring)
> @@ -620,10 +620,10 @@ ring_get_irq(struct intel_ring_buffer *ring, u32 flag)
> if (!dev->irq_enabled)
> return false;
>
> - spin_lock(&dev_priv->irq_lock);
> + spin_lock(&ring->irq_lock);
> if (ring->irq_refcount++ == 0)
> ironlake_enable_irq(dev_priv, flag);
> - spin_unlock(&dev_priv->irq_lock);
> + spin_unlock(&ring->irq_lock);
>
> return true;
> }
> @@ -634,10 +634,10 @@ ring_put_irq(struct intel_ring_buffer *ring, u32 flag)
> struct drm_device *dev = ring->dev;
> drm_i915_private_t *dev_priv = dev->dev_private;
>
> - spin_lock(&dev_priv->irq_lock);
> + spin_lock(&ring->irq_lock);
> if (--ring->irq_refcount == 0)
> ironlake_disable_irq(dev_priv, flag);
> - spin_unlock(&dev_priv->irq_lock);
> + spin_unlock(&ring->irq_lock);
> }
>
> static bool
> @@ -649,13 +649,13 @@ gen6_ring_get_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag)
> if (!dev->irq_enabled)
> return false;
>
> - spin_lock(&dev_priv->irq_lock);
> + spin_lock(&ring->irq_lock);
> if (ring->irq_refcount++ == 0) {
> ring->irq_mask &= ~rflag;
> I915_WRITE_IMR(ring, ring->irq_mask);
> ironlake_enable_irq(dev_priv, gflag);
> }
> - spin_unlock(&dev_priv->irq_lock);
> + spin_unlock(&ring->irq_lock);
>
> return true;
> }
> @@ -666,13 +666,13 @@ gen6_ring_put_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag)
> struct drm_device *dev = ring->dev;
> drm_i915_private_t *dev_priv = dev->dev_private;
>
> - spin_lock(&dev_priv->irq_lock);
> + spin_lock(&ring->irq_lock);
> if (--ring->irq_refcount == 0) {
> ring->irq_mask |= rflag;
> I915_WRITE_IMR(ring, ring->irq_mask);
> ironlake_disable_irq(dev_priv, gflag);
> }
> - spin_unlock(&dev_priv->irq_lock);
> + spin_unlock(&ring->irq_lock);
> }
>
> static bool
> @@ -814,6 +814,8 @@ int intel_init_ring_buffer(struct drm_device *dev,
> INIT_LIST_HEAD(&ring->active_list);
> INIT_LIST_HEAD(&ring->request_list);
> INIT_LIST_HEAD(&ring->gpu_write_list);
> +
> + spin_lock_init(&ring->irq_lock);
> ring->irq_mask = ~0;
>
> if (I915_NEED_GFX_HWS(dev)) {
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
> index 6b1d9a5..be9087e 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.h
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
> @@ -55,6 +55,7 @@ struct intel_ring_buffer {
> int effective_size;
> struct intel_hw_status_page status_page;
>
> + spinlock_t irq_lock;
> u32 irq_refcount;
> u32 irq_mask;
> u32 irq_seqno; /* last seq seem at irq time */
--
Regards,
Alexey
More information about the Intel-gfx
mailing list