diff options
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/i915/i915_debugfs.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.c | 30 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 8 |
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 | ||
266 | void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv) | 266 | static 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 | ||
282 | void __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 | */ | ||
288 | void 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 | |||
297 | static 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 | */ | ||
306 | void 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 | |||
288 | void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv) | 314 | void __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 | ||
714 | enum i915_cache_level { | 716 | enum 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 | */ |
1332 | void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv); | 1334 | void gen6_gt_force_wake_get(struct drm_i915_private *dev_priv); |
1333 | void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv); | 1335 | void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv); |
1334 | void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv); | 1336 | void __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); | |||
1343 | static inline u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg) { \ | 1345 | static 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 | ||
1557 | static void ironlake_enable_fbc(struct drm_crtc *crtc, unsigned long interval) | 1557 | static 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 | ||
7080 | void intel_enable_clock_gating(struct drm_device *dev) | 7080 | void intel_enable_clock_gating(struct drm_device *dev) |