aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaulo Zanoni <paulo.r.zanoni@intel.com>2013-08-06 17:57:13 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-08-23 08:52:26 -0400
commitedbfdb456053d0738e6b06a3827ead4158bfc918 (patch)
treed694ee51770617896cb1d940672354efdb4ad48d
parent43eaea131823c5ca13d03364e61bd15f0b22a0f7 (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.c47
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h3
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c2
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.c8
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 */
141static 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
155void 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
160void 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
165static 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
135static bool ivb_can_enable_err_int(struct drm_device *dev) 170static 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);
781extern void ilk_enable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask); 781extern void ilk_enable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask);
782extern void ilk_disable_gt_irq(struct drm_i915_private *dev_priv, 782extern void ilk_disable_gt_irq(struct drm_i915_private *dev_priv,
783 uint32_t mask); 783 uint32_t mask);
784extern void snb_enable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask);
785extern 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}