diff options
author | Paulo Zanoni <paulo.r.zanoni@intel.com> | 2013-08-06 17:57:13 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-08-23 08:52:26 -0400 |
commit | edbfdb456053d0738e6b06a3827ead4158bfc918 (patch) | |
tree | d694ee51770617896cb1d940672354efdb4ad48d | |
parent | 43eaea131823c5ca13d03364e61bd15f0b22a0f7 (diff) |
drm/i915: wrap GEN6_PMIMR changes
Just like we're doing with the other IMR changes.
One of the functional changes is that not every caller was doing the
POSTING_READ.
Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 47 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 8 |
4 files changed, 46 insertions, 14 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 6bd4508666d2..af5c335a69db 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -132,6 +132,41 @@ void ilk_disable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask) | |||
132 | ilk_update_gt_irq(dev_priv, mask, 0); | 132 | ilk_update_gt_irq(dev_priv, mask, 0); |
133 | } | 133 | } |
134 | 134 | ||
135 | /** | ||
136 | * snb_update_pm_irq - update GEN6_PMIMR | ||
137 | * @dev_priv: driver private | ||
138 | * @interrupt_mask: mask of interrupt bits to update | ||
139 | * @enabled_irq_mask: mask of interrupt bits to enable | ||
140 | */ | ||
141 | static void snb_update_pm_irq(struct drm_i915_private *dev_priv, | ||
142 | uint32_t interrupt_mask, | ||
143 | uint32_t enabled_irq_mask) | ||
144 | { | ||
145 | uint32_t pmimr = I915_READ(GEN6_PMIMR); | ||
146 | pmimr &= ~interrupt_mask; | ||
147 | pmimr |= (~enabled_irq_mask & interrupt_mask); | ||
148 | |||
149 | assert_spin_locked(&dev_priv->irq_lock); | ||
150 | |||
151 | I915_WRITE(GEN6_PMIMR, pmimr); | ||
152 | POSTING_READ(GEN6_PMIMR); | ||
153 | } | ||
154 | |||
155 | void snb_enable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask) | ||
156 | { | ||
157 | snb_update_pm_irq(dev_priv, mask, mask); | ||
158 | } | ||
159 | |||
160 | void snb_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask) | ||
161 | { | ||
162 | snb_update_pm_irq(dev_priv, mask, 0); | ||
163 | } | ||
164 | |||
165 | static void snb_set_pm_irq(struct drm_i915_private *dev_priv, uint32_t val) | ||
166 | { | ||
167 | snb_update_pm_irq(dev_priv, 0xffffffff, ~val); | ||
168 | } | ||
169 | |||
135 | static bool ivb_can_enable_err_int(struct drm_device *dev) | 170 | static bool ivb_can_enable_err_int(struct drm_device *dev) |
136 | { | 171 | { |
137 | struct drm_i915_private *dev_priv = dev->dev_private; | 172 | struct drm_i915_private *dev_priv = dev->dev_private; |
@@ -739,15 +774,14 @@ static void gen6_pm_rps_work(struct work_struct *work) | |||
739 | { | 774 | { |
740 | drm_i915_private_t *dev_priv = container_of(work, drm_i915_private_t, | 775 | drm_i915_private_t *dev_priv = container_of(work, drm_i915_private_t, |
741 | rps.work); | 776 | rps.work); |
742 | u32 pm_iir, pm_imr; | 777 | u32 pm_iir; |
743 | u8 new_delay; | 778 | u8 new_delay; |
744 | 779 | ||
745 | spin_lock_irq(&dev_priv->irq_lock); | 780 | spin_lock_irq(&dev_priv->irq_lock); |
746 | pm_iir = dev_priv->rps.pm_iir; | 781 | pm_iir = dev_priv->rps.pm_iir; |
747 | dev_priv->rps.pm_iir = 0; | 782 | dev_priv->rps.pm_iir = 0; |
748 | pm_imr = I915_READ(GEN6_PMIMR); | ||
749 | /* Make sure not to corrupt PMIMR state used by ringbuffer code */ | 783 | /* Make sure not to corrupt PMIMR state used by ringbuffer code */ |
750 | I915_WRITE(GEN6_PMIMR, pm_imr & ~GEN6_PM_RPS_EVENTS); | 784 | snb_enable_pm_irq(dev_priv, GEN6_PM_RPS_EVENTS); |
751 | spin_unlock_irq(&dev_priv->irq_lock); | 785 | spin_unlock_irq(&dev_priv->irq_lock); |
752 | 786 | ||
753 | if ((pm_iir & GEN6_PM_RPS_EVENTS) == 0) | 787 | if ((pm_iir & GEN6_PM_RPS_EVENTS) == 0) |
@@ -921,8 +955,7 @@ static void gen6_rps_irq_handler(struct drm_i915_private *dev_priv, | |||
921 | 955 | ||
922 | spin_lock(&dev_priv->irq_lock); | 956 | spin_lock(&dev_priv->irq_lock); |
923 | dev_priv->rps.pm_iir |= pm_iir; | 957 | dev_priv->rps.pm_iir |= pm_iir; |
924 | I915_WRITE(GEN6_PMIMR, dev_priv->rps.pm_iir); | 958 | snb_set_pm_irq(dev_priv, dev_priv->rps.pm_iir); |
925 | POSTING_READ(GEN6_PMIMR); | ||
926 | spin_unlock(&dev_priv->irq_lock); | 959 | spin_unlock(&dev_priv->irq_lock); |
927 | 960 | ||
928 | queue_work(dev_priv->wq, &dev_priv->rps.work); | 961 | queue_work(dev_priv->wq, &dev_priv->rps.work); |
@@ -1005,8 +1038,8 @@ static void hsw_pm_irq_handler(struct drm_i915_private *dev_priv, | |||
1005 | if (pm_iir & GEN6_PM_RPS_EVENTS) { | 1038 | if (pm_iir & GEN6_PM_RPS_EVENTS) { |
1006 | spin_lock(&dev_priv->irq_lock); | 1039 | spin_lock(&dev_priv->irq_lock); |
1007 | dev_priv->rps.pm_iir |= pm_iir & GEN6_PM_RPS_EVENTS; | 1040 | dev_priv->rps.pm_iir |= pm_iir & GEN6_PM_RPS_EVENTS; |
1008 | I915_WRITE(GEN6_PMIMR, dev_priv->rps.pm_iir); | 1041 | snb_set_pm_irq(dev_priv, dev_priv->rps.pm_iir); |
1009 | /* never want to mask useful interrupts. (also posting read) */ | 1042 | /* never want to mask useful interrupts. */ |
1010 | WARN_ON(I915_READ_NOTRACE(GEN6_PMIMR) & ~GEN6_PM_RPS_EVENTS); | 1043 | WARN_ON(I915_READ_NOTRACE(GEN6_PMIMR) & ~GEN6_PM_RPS_EVENTS); |
1011 | spin_unlock(&dev_priv->irq_lock); | 1044 | spin_unlock(&dev_priv->irq_lock); |
1012 | 1045 | ||
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index a8462064714c..8222f2426b47 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
@@ -781,5 +781,8 @@ extern void hsw_restore_lcpll(struct drm_i915_private *dev_priv); | |||
781 | extern void ilk_enable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask); | 781 | extern void ilk_enable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask); |
782 | extern void ilk_disable_gt_irq(struct drm_i915_private *dev_priv, | 782 | extern void ilk_disable_gt_irq(struct drm_i915_private *dev_priv, |
783 | uint32_t mask); | 783 | uint32_t mask); |
784 | extern void snb_enable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask); | ||
785 | extern void snb_disable_pm_irq(struct drm_i915_private *dev_priv, | ||
786 | uint32_t mask); | ||
784 | 787 | ||
785 | #endif /* __INTEL_DRV_H__ */ | 788 | #endif /* __INTEL_DRV_H__ */ |
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 7bc3f1783174..4f0857346bfd 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
@@ -3450,7 +3450,7 @@ static void gen6_enable_rps_interrupts(struct drm_device *dev) | |||
3450 | 3450 | ||
3451 | spin_lock_irq(&dev_priv->irq_lock); | 3451 | spin_lock_irq(&dev_priv->irq_lock); |
3452 | WARN_ON(dev_priv->rps.pm_iir); | 3452 | WARN_ON(dev_priv->rps.pm_iir); |
3453 | I915_WRITE(GEN6_PMIMR, I915_READ(GEN6_PMIMR) & ~GEN6_PM_RPS_EVENTS); | 3453 | snb_enable_pm_irq(dev_priv, GEN6_PM_RPS_EVENTS); |
3454 | I915_WRITE(GEN6_PMIIR, GEN6_PM_RPS_EVENTS); | 3454 | I915_WRITE(GEN6_PMIIR, GEN6_PM_RPS_EVENTS); |
3455 | spin_unlock_irq(&dev_priv->irq_lock); | 3455 | spin_unlock_irq(&dev_priv->irq_lock); |
3456 | /* only unmask PM interrupts we need. Mask all others. */ | 3456 | /* only unmask PM interrupts we need. Mask all others. */ |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 2e370804248f..7de29d40d1ad 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
@@ -1062,10 +1062,8 @@ hsw_vebox_get_irq(struct intel_ring_buffer *ring) | |||
1062 | 1062 | ||
1063 | spin_lock_irqsave(&dev_priv->irq_lock, flags); | 1063 | spin_lock_irqsave(&dev_priv->irq_lock, flags); |
1064 | if (ring->irq_refcount++ == 0) { | 1064 | if (ring->irq_refcount++ == 0) { |
1065 | u32 pm_imr = I915_READ(GEN6_PMIMR); | ||
1066 | I915_WRITE_IMR(ring, ~ring->irq_enable_mask); | 1065 | I915_WRITE_IMR(ring, ~ring->irq_enable_mask); |
1067 | I915_WRITE(GEN6_PMIMR, pm_imr & ~ring->irq_enable_mask); | 1066 | snb_enable_pm_irq(dev_priv, ring->irq_enable_mask); |
1068 | POSTING_READ(GEN6_PMIMR); | ||
1069 | } | 1067 | } |
1070 | spin_unlock_irqrestore(&dev_priv->irq_lock, flags); | 1068 | spin_unlock_irqrestore(&dev_priv->irq_lock, flags); |
1071 | 1069 | ||
@@ -1084,10 +1082,8 @@ hsw_vebox_put_irq(struct intel_ring_buffer *ring) | |||
1084 | 1082 | ||
1085 | spin_lock_irqsave(&dev_priv->irq_lock, flags); | 1083 | spin_lock_irqsave(&dev_priv->irq_lock, flags); |
1086 | if (--ring->irq_refcount == 0) { | 1084 | if (--ring->irq_refcount == 0) { |
1087 | u32 pm_imr = I915_READ(GEN6_PMIMR); | ||
1088 | I915_WRITE_IMR(ring, ~0); | 1085 | I915_WRITE_IMR(ring, ~0); |
1089 | I915_WRITE(GEN6_PMIMR, pm_imr | ring->irq_enable_mask); | 1086 | snb_disable_pm_irq(dev_priv, ring->irq_enable_mask); |
1090 | POSTING_READ(GEN6_PMIMR); | ||
1091 | } | 1087 | } |
1092 | spin_unlock_irqrestore(&dev_priv->irq_lock, flags); | 1088 | spin_unlock_irqrestore(&dev_priv->irq_lock, flags); |
1093 | } | 1089 | } |