aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorBen Widawsky <ben@bwidawsk.net>2013-05-28 22:22:30 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-05-31 14:54:19 -0400
commita19d2933cbc4c7b8e3d72e9fd2d48847c25bb41d (patch)
tree6692c0ce8f1aaf827447daecead44a3ba1760879 /drivers/gpu/drm
parentcc609d5da5c78c92a2e2565604b2603a0965b494 (diff)
drm/i915: vebox interrupt get/put
v2: Use the correct lock to protect PM interrupt regs, this was accidentally lost from earlier (Haihao) Fix return types (Ben) Reviewed-by: Damien Lespiau <damien.lespiau@intel.com> Signed-off-by: Ben Widawsky <ben@bwidawsk.net> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.c46
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.h5
2 files changed, 47 insertions, 4 deletions
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index 5ab8cc2cafe2..8a6a0ee6d350 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -1019,6 +1019,48 @@ gen6_ring_put_irq(struct intel_ring_buffer *ring)
1019 gen6_gt_force_wake_put(dev_priv); 1019 gen6_gt_force_wake_put(dev_priv);
1020} 1020}
1021 1021
1022static bool
1023hsw_vebox_get_irq(struct intel_ring_buffer *ring)
1024{
1025 struct drm_device *dev = ring->dev;
1026 struct drm_i915_private *dev_priv = dev->dev_private;
1027 unsigned long flags;
1028
1029 if (!dev->irq_enabled)
1030 return false;
1031
1032 spin_lock_irqsave(&dev_priv->rps.lock, flags);
1033 if (ring->irq_refcount.pm++ == 0) {
1034 u32 pm_imr = I915_READ(GEN6_PMIMR);
1035 I915_WRITE_IMR(ring, ~ring->irq_enable_mask);
1036 I915_WRITE(GEN6_PMIMR, pm_imr & ~ring->irq_enable_mask);
1037 POSTING_READ(GEN6_PMIMR);
1038 }
1039 spin_unlock_irqrestore(&dev_priv->rps.lock, flags);
1040
1041 return true;
1042}
1043
1044static void
1045hsw_vebox_put_irq(struct intel_ring_buffer *ring)
1046{
1047 struct drm_device *dev = ring->dev;
1048 struct drm_i915_private *dev_priv = dev->dev_private;
1049 unsigned long flags;
1050
1051 if (!dev->irq_enabled)
1052 return;
1053
1054 spin_lock_irqsave(&dev_priv->rps.lock, flags);
1055 if (--ring->irq_refcount.pm == 0) {
1056 u32 pm_imr = I915_READ(GEN6_PMIMR);
1057 I915_WRITE_IMR(ring, ~0);
1058 I915_WRITE(GEN6_PMIMR, pm_imr | ring->irq_enable_mask);
1059 POSTING_READ(GEN6_PMIMR);
1060 }
1061 spin_unlock_irqrestore(&dev_priv->rps.lock, flags);
1062}
1063
1022static int 1064static int
1023i965_dispatch_execbuffer(struct intel_ring_buffer *ring, 1065i965_dispatch_execbuffer(struct intel_ring_buffer *ring,
1024 u32 offset, u32 length, 1066 u32 offset, u32 length,
@@ -1928,8 +1970,8 @@ int intel_init_vebox_ring_buffer(struct drm_device *dev)
1928 ring->get_seqno = gen6_ring_get_seqno; 1970 ring->get_seqno = gen6_ring_get_seqno;
1929 ring->set_seqno = ring_set_seqno; 1971 ring->set_seqno = ring_set_seqno;
1930 ring->irq_enable_mask = 0; 1972 ring->irq_enable_mask = 0;
1931 ring->irq_get = NULL; 1973 ring->irq_get = hsw_vebox_get_irq;
1932 ring->irq_put = NULL; 1974 ring->irq_put = hsw_vebox_put_irq;
1933 ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer; 1975 ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer;
1934 ring->sync_to = gen6_ring_sync; 1976 ring->sync_to = gen6_ring_sync;
1935 ring->semaphore_register[RCS] = MI_SEMAPHORE_SYNC_VER; 1977 ring->semaphore_register[RCS] = MI_SEMAPHORE_SYNC_VER;
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
index 153b87f67aae..022d07e43d12 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -73,8 +73,9 @@ struct intel_ring_buffer {
73 u32 last_retired_head; 73 u32 last_retired_head;
74 74
75 struct { 75 struct {
76 u32 gt; 76 u32 gt; /* protected by dev_priv->irq_lock */
77 } irq_refcount; /* protected by dev_priv->irq_lock */ 77 u32 pm; /* protected by dev_priv->rps.lock (sucks) */
78 } irq_refcount;
78 u32 irq_enable_mask; /* bitmask to enable ring interrupt */ 79 u32 irq_enable_mask; /* bitmask to enable ring interrupt */
79 u32 trace_irq_seqno; 80 u32 trace_irq_seqno;
80 u32 sync_seqno[I915_NUM_RINGS-1]; 81 u32 sync_seqno[I915_NUM_RINGS-1];