aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/i915/i915_debugfs.c4
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c30
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h11
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c1
-rw-r--r--drivers/gpu/drm/i915/intel_display.c8
5 files changed, 41 insertions, 13 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index 52d2306249cb..3b1147d9023a 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -874,7 +874,7 @@ static int i915_cur_delayinfo(struct seq_file *m, void *unused)
874 int max_freq; 874 int max_freq;
875 875
876 /* RPSTAT1 is in the GT power well */ 876 /* RPSTAT1 is in the GT power well */
877 __gen6_gt_force_wake_get(dev_priv); 877 gen6_gt_force_wake_get(dev_priv);
878 878
879 rpstat = I915_READ(GEN6_RPSTAT1); 879 rpstat = I915_READ(GEN6_RPSTAT1);
880 rpupei = I915_READ(GEN6_RP_CUR_UP_EI); 880 rpupei = I915_READ(GEN6_RP_CUR_UP_EI);
@@ -919,7 +919,7 @@ static int i915_cur_delayinfo(struct seq_file *m, void *unused)
919 seq_printf(m, "Max non-overclocked (RP0) frequency: %dMHz\n", 919 seq_printf(m, "Max non-overclocked (RP0) frequency: %dMHz\n",
920 max_freq * 50); 920 max_freq * 50);
921 921
922 __gen6_gt_force_wake_put(dev_priv); 922 gen6_gt_force_wake_put(dev_priv);
923 } else { 923 } else {
924 seq_printf(m, "no P-state info available\n"); 924 seq_printf(m, "no P-state info available\n");
925 } 925 }
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index c34a8dd31d02..52e52ce067e1 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -263,7 +263,7 @@ void intel_detect_pch (struct drm_device *dev)
263 } 263 }
264} 264}
265 265
266void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv) 266static void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv)
267{ 267{
268 int count; 268 int count;
269 269
@@ -279,12 +279,38 @@ void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv)
279 udelay(10); 279 udelay(10);
280} 280}
281 281
282void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv) 282/*
283 * Generally this is called implicitly by the register read function. However,
284 * if some sequence requires the GT to not power down then this function should
285 * be called at the beginning of the sequence followed by a call to
286 * gen6_gt_force_wake_put() at the end of the sequence.
287 */
288void gen6_gt_force_wake_get(struct drm_i915_private *dev_priv)
289{
290 WARN_ON(!mutex_is_locked(&dev_priv->dev->struct_mutex));
291
292 /* Forcewake is atomic in case we get in here without the lock */
293 if (atomic_add_return(1, &dev_priv->forcewake_count) == 1)
294 __gen6_gt_force_wake_get(dev_priv);
295}
296
297static void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv)
283{ 298{
284 I915_WRITE_NOTRACE(FORCEWAKE, 0); 299 I915_WRITE_NOTRACE(FORCEWAKE, 0);
285 POSTING_READ(FORCEWAKE); 300 POSTING_READ(FORCEWAKE);
286} 301}
287 302
303/*
304 * see gen6_gt_force_wake_get()
305 */
306void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv)
307{
308 WARN_ON(!mutex_is_locked(&dev_priv->dev->struct_mutex));
309
310 if (atomic_dec_and_test(&dev_priv->forcewake_count))
311 __gen6_gt_force_wake_put(dev_priv);
312}
313
288void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv) 314void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv)
289{ 315{
290 int loop = 500; 316 int loop = 500;
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 083644ef8f31..bafb387dd416 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -709,6 +709,8 @@ typedef struct drm_i915_private {
709 struct intel_fbdev *fbdev; 709 struct intel_fbdev *fbdev;
710 710
711 struct drm_property *broadcast_rgb_property; 711 struct drm_property *broadcast_rgb_property;
712
713 atomic_t forcewake_count;
712} drm_i915_private_t; 714} drm_i915_private_t;
713 715
714enum i915_cache_level { 716enum i915_cache_level {
@@ -1329,8 +1331,8 @@ extern void intel_display_print_error_state(struct seq_file *m,
1329 * must be set to prevent GT core from power down and stale values being 1331 * must be set to prevent GT core from power down and stale values being
1330 * returned. 1332 * returned.
1331 */ 1333 */
1332void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv); 1334void gen6_gt_force_wake_get(struct drm_i915_private *dev_priv);
1333void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv); 1335void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv);
1334void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv); 1336void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv);
1335 1337
1336/* We give fast paths for the really cool registers */ 1338/* We give fast paths for the really cool registers */
@@ -1343,15 +1345,16 @@ void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv);
1343static inline u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg) { \ 1345static inline u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg) { \
1344 u##x val = 0; \ 1346 u##x val = 0; \
1345 if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \ 1347 if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \
1346 __gen6_gt_force_wake_get(dev_priv); \ 1348 gen6_gt_force_wake_get(dev_priv); \
1347 val = read##y(dev_priv->regs + reg); \ 1349 val = read##y(dev_priv->regs + reg); \
1348 __gen6_gt_force_wake_put(dev_priv); \ 1350 gen6_gt_force_wake_put(dev_priv); \
1349 } else { \ 1351 } else { \
1350 val = read##y(dev_priv->regs + reg); \ 1352 val = read##y(dev_priv->regs + reg); \
1351 } \ 1353 } \
1352 trace_i915_reg_rw(false, reg, val, sizeof(val)); \ 1354 trace_i915_reg_rw(false, reg, val, sizeof(val)); \
1353 return val; \ 1355 return val; \
1354} 1356}
1357
1355__i915_read(8, b) 1358__i915_read(8, b)
1356__i915_read(16, w) 1359__i915_read(16, w)
1357__i915_read(32, l) 1360__i915_read(32, l)
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 6225c336de30..edd208e47308 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -396,7 +396,6 @@ static void gen6_pm_irq_handler(struct drm_device *dev)
396 I915_WRITE(GEN6_RP_INTERRUPT_LIMITS, 396 I915_WRITE(GEN6_RP_INTERRUPT_LIMITS,
397 I915_READ(GEN6_RP_INTERRUPT_LIMITS) & ~0x3f0000); 397 I915_READ(GEN6_RP_INTERRUPT_LIMITS) & ~0x3f0000);
398 } 398 }
399
400 } 399 }
401 400
402 gen6_set_rps(dev, new_delay); 401 gen6_set_rps(dev, new_delay);
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index a38fb3998ad1..220c3e0ea0a6 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -1540,7 +1540,7 @@ static void sandybridge_blit_fbc_update(struct drm_device *dev)
1540 u32 blt_ecoskpd; 1540 u32 blt_ecoskpd;
1541 1541
1542 /* Make sure blitter notifies FBC of writes */ 1542 /* Make sure blitter notifies FBC of writes */
1543 __gen6_gt_force_wake_get(dev_priv); 1543 gen6_gt_force_wake_get(dev_priv);
1544 blt_ecoskpd = I915_READ(GEN6_BLITTER_ECOSKPD); 1544 blt_ecoskpd = I915_READ(GEN6_BLITTER_ECOSKPD);
1545 blt_ecoskpd |= GEN6_BLITTER_FBC_NOTIFY << 1545 blt_ecoskpd |= GEN6_BLITTER_FBC_NOTIFY <<
1546 GEN6_BLITTER_LOCK_SHIFT; 1546 GEN6_BLITTER_LOCK_SHIFT;
@@ -1551,7 +1551,7 @@ static void sandybridge_blit_fbc_update(struct drm_device *dev)
1551 GEN6_BLITTER_LOCK_SHIFT); 1551 GEN6_BLITTER_LOCK_SHIFT);
1552 I915_WRITE(GEN6_BLITTER_ECOSKPD, blt_ecoskpd); 1552 I915_WRITE(GEN6_BLITTER_ECOSKPD, blt_ecoskpd);
1553 POSTING_READ(GEN6_BLITTER_ECOSKPD); 1553 POSTING_READ(GEN6_BLITTER_ECOSKPD);
1554 __gen6_gt_force_wake_put(dev_priv); 1554 gen6_gt_force_wake_put(dev_priv);
1555} 1555}
1556 1556
1557static void ironlake_enable_fbc(struct drm_crtc *crtc, unsigned long interval) 1557static void ironlake_enable_fbc(struct drm_crtc *crtc, unsigned long interval)
@@ -6973,7 +6973,7 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv)
6973 * userspace... 6973 * userspace...
6974 */ 6974 */
6975 I915_WRITE(GEN6_RC_STATE, 0); 6975 I915_WRITE(GEN6_RC_STATE, 0);
6976 __gen6_gt_force_wake_get(dev_priv); 6976 gen6_gt_force_wake_get(dev_priv);
6977 6977
6978 /* disable the counters and set deterministic thresholds */ 6978 /* disable the counters and set deterministic thresholds */
6979 I915_WRITE(GEN6_RC_CONTROL, 0); 6979 I915_WRITE(GEN6_RC_CONTROL, 0);
@@ -7074,7 +7074,7 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv)
7074 /* enable all PM interrupts */ 7074 /* enable all PM interrupts */
7075 I915_WRITE(GEN6_PMINTRMSK, 0); 7075 I915_WRITE(GEN6_PMINTRMSK, 0);
7076 7076
7077 __gen6_gt_force_wake_put(dev_priv); 7077 gen6_gt_force_wake_put(dev_priv);
7078} 7078}
7079 7079
7080void intel_enable_clock_gating(struct drm_device *dev) 7080void intel_enable_clock_gating(struct drm_device *dev)