diff options
author | Ben Widawsky <ben@bwidawsk.net> | 2013-05-28 22:22:30 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-05-31 14:54:19 -0400 |
commit | a19d2933cbc4c7b8e3d72e9fd2d48847c25bb41d (patch) | |
tree | 6692c0ce8f1aaf827447daecead44a3ba1760879 /drivers/gpu/drm | |
parent | cc609d5da5c78c92a2e2565604b2603a0965b494 (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.c | 46 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.h | 5 |
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 | ||
1022 | static bool | ||
1023 | hsw_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 | |||
1044 | static void | ||
1045 | hsw_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 | |||
1022 | static int | 1064 | static int |
1023 | i965_dispatch_execbuffer(struct intel_ring_buffer *ring, | 1065 | i965_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]; |