diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_runtime_pm.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_runtime_pm.c | 76 |
1 files changed, 48 insertions, 28 deletions
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c index e856d49d6dc3..6b78295f53db 100644 --- a/drivers/gpu/drm/i915/intel_runtime_pm.c +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c | |||
@@ -287,7 +287,7 @@ void intel_display_set_init_power(struct drm_i915_private *dev_priv, | |||
287 | */ | 287 | */ |
288 | static void hsw_power_well_post_enable(struct drm_i915_private *dev_priv) | 288 | static void hsw_power_well_post_enable(struct drm_i915_private *dev_priv) |
289 | { | 289 | { |
290 | struct drm_device *dev = dev_priv->dev; | 290 | struct drm_device *dev = &dev_priv->drm; |
291 | 291 | ||
292 | /* | 292 | /* |
293 | * After we re-enable the power well, if we touch VGA register 0x3d5 | 293 | * After we re-enable the power well, if we touch VGA register 0x3d5 |
@@ -318,7 +318,7 @@ static void hsw_power_well_pre_disable(struct drm_i915_private *dev_priv) | |||
318 | static void skl_power_well_post_enable(struct drm_i915_private *dev_priv, | 318 | static void skl_power_well_post_enable(struct drm_i915_private *dev_priv, |
319 | struct i915_power_well *power_well) | 319 | struct i915_power_well *power_well) |
320 | { | 320 | { |
321 | struct drm_device *dev = dev_priv->dev; | 321 | struct drm_device *dev = &dev_priv->drm; |
322 | 322 | ||
323 | /* | 323 | /* |
324 | * After we re-enable the power well, if we touch VGA register 0x3d5 | 324 | * After we re-enable the power well, if we touch VGA register 0x3d5 |
@@ -365,8 +365,11 @@ static void hsw_set_power_well(struct drm_i915_private *dev_priv, | |||
365 | 365 | ||
366 | if (!is_enabled) { | 366 | if (!is_enabled) { |
367 | DRM_DEBUG_KMS("Enabling power well\n"); | 367 | DRM_DEBUG_KMS("Enabling power well\n"); |
368 | if (wait_for((I915_READ(HSW_PWR_WELL_DRIVER) & | 368 | if (intel_wait_for_register(dev_priv, |
369 | HSW_PWR_WELL_STATE_ENABLED), 20)) | 369 | HSW_PWR_WELL_DRIVER, |
370 | HSW_PWR_WELL_STATE_ENABLED, | ||
371 | HSW_PWR_WELL_STATE_ENABLED, | ||
372 | 20)) | ||
370 | DRM_ERROR("Timeout enabling power well\n"); | 373 | DRM_ERROR("Timeout enabling power well\n"); |
371 | hsw_power_well_post_enable(dev_priv); | 374 | hsw_power_well_post_enable(dev_priv); |
372 | } | 375 | } |
@@ -578,6 +581,7 @@ void bxt_enable_dc9(struct drm_i915_private *dev_priv) | |||
578 | 581 | ||
579 | DRM_DEBUG_KMS("Enabling DC9\n"); | 582 | DRM_DEBUG_KMS("Enabling DC9\n"); |
580 | 583 | ||
584 | intel_power_sequencer_reset(dev_priv); | ||
581 | gen9_set_dc_state(dev_priv, DC_STATE_EN_DC9); | 585 | gen9_set_dc_state(dev_priv, DC_STATE_EN_DC9); |
582 | } | 586 | } |
583 | 587 | ||
@@ -699,8 +703,11 @@ static void skl_set_power_well(struct drm_i915_private *dev_priv, | |||
699 | 703 | ||
700 | switch (power_well->data) { | 704 | switch (power_well->data) { |
701 | case SKL_DISP_PW_1: | 705 | case SKL_DISP_PW_1: |
702 | if (wait_for((I915_READ(SKL_FUSE_STATUS) & | 706 | if (intel_wait_for_register(dev_priv, |
703 | SKL_FUSE_PG0_DIST_STATUS), 1)) { | 707 | SKL_FUSE_STATUS, |
708 | SKL_FUSE_PG0_DIST_STATUS, | ||
709 | SKL_FUSE_PG0_DIST_STATUS, | ||
710 | 1)) { | ||
704 | DRM_ERROR("PG0 not enabled\n"); | 711 | DRM_ERROR("PG0 not enabled\n"); |
705 | return; | 712 | return; |
706 | } | 713 | } |
@@ -761,12 +768,18 @@ static void skl_set_power_well(struct drm_i915_private *dev_priv, | |||
761 | 768 | ||
762 | if (check_fuse_status) { | 769 | if (check_fuse_status) { |
763 | if (power_well->data == SKL_DISP_PW_1) { | 770 | if (power_well->data == SKL_DISP_PW_1) { |
764 | if (wait_for((I915_READ(SKL_FUSE_STATUS) & | 771 | if (intel_wait_for_register(dev_priv, |
765 | SKL_FUSE_PG1_DIST_STATUS), 1)) | 772 | SKL_FUSE_STATUS, |
773 | SKL_FUSE_PG1_DIST_STATUS, | ||
774 | SKL_FUSE_PG1_DIST_STATUS, | ||
775 | 1)) | ||
766 | DRM_ERROR("PG1 distributing status timeout\n"); | 776 | DRM_ERROR("PG1 distributing status timeout\n"); |
767 | } else if (power_well->data == SKL_DISP_PW_2) { | 777 | } else if (power_well->data == SKL_DISP_PW_2) { |
768 | if (wait_for((I915_READ(SKL_FUSE_STATUS) & | 778 | if (intel_wait_for_register(dev_priv, |
769 | SKL_FUSE_PG2_DIST_STATUS), 1)) | 779 | SKL_FUSE_STATUS, |
780 | SKL_FUSE_PG2_DIST_STATUS, | ||
781 | SKL_FUSE_PG2_DIST_STATUS, | ||
782 | 1)) | ||
770 | DRM_ERROR("PG2 distributing status timeout\n"); | 783 | DRM_ERROR("PG2 distributing status timeout\n"); |
771 | } | 784 | } |
772 | } | 785 | } |
@@ -917,7 +930,7 @@ static void gen9_dc_off_power_well_enable(struct drm_i915_private *dev_priv, | |||
917 | gen9_set_dc_state(dev_priv, DC_STATE_DISABLE); | 930 | gen9_set_dc_state(dev_priv, DC_STATE_DISABLE); |
918 | 931 | ||
919 | WARN_ON(dev_priv->cdclk_freq != | 932 | WARN_ON(dev_priv->cdclk_freq != |
920 | dev_priv->display.get_display_clock_speed(dev_priv->dev)); | 933 | dev_priv->display.get_display_clock_speed(&dev_priv->drm)); |
921 | 934 | ||
922 | gen9_assert_dbuf_enabled(dev_priv); | 935 | gen9_assert_dbuf_enabled(dev_priv); |
923 | 936 | ||
@@ -1075,7 +1088,7 @@ static void vlv_display_power_well_init(struct drm_i915_private *dev_priv) | |||
1075 | * | 1088 | * |
1076 | * CHV DPLL B/C have some issues if VGA mode is enabled. | 1089 | * CHV DPLL B/C have some issues if VGA mode is enabled. |
1077 | */ | 1090 | */ |
1078 | for_each_pipe(dev_priv->dev, pipe) { | 1091 | for_each_pipe(&dev_priv->drm, pipe) { |
1079 | u32 val = I915_READ(DPLL(pipe)); | 1092 | u32 val = I915_READ(DPLL(pipe)); |
1080 | 1093 | ||
1081 | val |= DPLL_REF_CLK_ENABLE_VLV | DPLL_VGA_MODE_DIS; | 1094 | val |= DPLL_REF_CLK_ENABLE_VLV | DPLL_VGA_MODE_DIS; |
@@ -1100,7 +1113,7 @@ static void vlv_display_power_well_init(struct drm_i915_private *dev_priv) | |||
1100 | 1113 | ||
1101 | intel_hpd_init(dev_priv); | 1114 | intel_hpd_init(dev_priv); |
1102 | 1115 | ||
1103 | i915_redisable_vga_power_on(dev_priv->dev); | 1116 | i915_redisable_vga_power_on(&dev_priv->drm); |
1104 | } | 1117 | } |
1105 | 1118 | ||
1106 | static void vlv_display_power_well_deinit(struct drm_i915_private *dev_priv) | 1119 | static void vlv_display_power_well_deinit(struct drm_i915_private *dev_priv) |
@@ -1110,9 +1123,9 @@ static void vlv_display_power_well_deinit(struct drm_i915_private *dev_priv) | |||
1110 | spin_unlock_irq(&dev_priv->irq_lock); | 1123 | spin_unlock_irq(&dev_priv->irq_lock); |
1111 | 1124 | ||
1112 | /* make sure we're done processing display irqs */ | 1125 | /* make sure we're done processing display irqs */ |
1113 | synchronize_irq(dev_priv->dev->irq); | 1126 | synchronize_irq(dev_priv->drm.irq); |
1114 | 1127 | ||
1115 | vlv_power_sequencer_reset(dev_priv); | 1128 | intel_power_sequencer_reset(dev_priv); |
1116 | } | 1129 | } |
1117 | 1130 | ||
1118 | static void vlv_display_power_well_enable(struct drm_i915_private *dev_priv, | 1131 | static void vlv_display_power_well_enable(struct drm_i915_private *dev_priv, |
@@ -1205,7 +1218,6 @@ static void assert_chv_phy_status(struct drm_i915_private *dev_priv) | |||
1205 | u32 phy_control = dev_priv->chv_phy_control; | 1218 | u32 phy_control = dev_priv->chv_phy_control; |
1206 | u32 phy_status = 0; | 1219 | u32 phy_status = 0; |
1207 | u32 phy_status_mask = 0xffffffff; | 1220 | u32 phy_status_mask = 0xffffffff; |
1208 | u32 tmp; | ||
1209 | 1221 | ||
1210 | /* | 1222 | /* |
1211 | * The BIOS can leave the PHY is some weird state | 1223 | * The BIOS can leave the PHY is some weird state |
@@ -1293,10 +1305,14 @@ static void assert_chv_phy_status(struct drm_i915_private *dev_priv) | |||
1293 | * The PHY may be busy with some initial calibration and whatnot, | 1305 | * The PHY may be busy with some initial calibration and whatnot, |
1294 | * so the power state can take a while to actually change. | 1306 | * so the power state can take a while to actually change. |
1295 | */ | 1307 | */ |
1296 | if (wait_for((tmp = I915_READ(DISPLAY_PHY_STATUS) & phy_status_mask) == phy_status, 10)) | 1308 | if (intel_wait_for_register(dev_priv, |
1297 | WARN(phy_status != tmp, | 1309 | DISPLAY_PHY_STATUS, |
1298 | "Unexpected PHY_STATUS 0x%08x, expected 0x%08x (PHY_CONTROL=0x%08x)\n", | 1310 | phy_status_mask, |
1299 | tmp, phy_status, dev_priv->chv_phy_control); | 1311 | phy_status, |
1312 | 10)) | ||
1313 | DRM_ERROR("Unexpected PHY_STATUS 0x%08x, expected 0x%08x (PHY_CONTROL=0x%08x)\n", | ||
1314 | I915_READ(DISPLAY_PHY_STATUS) & phy_status_mask, | ||
1315 | phy_status, dev_priv->chv_phy_control); | ||
1300 | } | 1316 | } |
1301 | 1317 | ||
1302 | #undef BITS_SET | 1318 | #undef BITS_SET |
@@ -1324,7 +1340,11 @@ static void chv_dpio_cmn_power_well_enable(struct drm_i915_private *dev_priv, | |||
1324 | vlv_set_power_well(dev_priv, power_well, true); | 1340 | vlv_set_power_well(dev_priv, power_well, true); |
1325 | 1341 | ||
1326 | /* Poll for phypwrgood signal */ | 1342 | /* Poll for phypwrgood signal */ |
1327 | if (wait_for(I915_READ(DISPLAY_PHY_STATUS) & PHY_POWERGOOD(phy), 1)) | 1343 | if (intel_wait_for_register(dev_priv, |
1344 | DISPLAY_PHY_STATUS, | ||
1345 | PHY_POWERGOOD(phy), | ||
1346 | PHY_POWERGOOD(phy), | ||
1347 | 1)) | ||
1328 | DRM_ERROR("Display PHY %d is not power up\n", phy); | 1348 | DRM_ERROR("Display PHY %d is not power up\n", phy); |
1329 | 1349 | ||
1330 | mutex_lock(&dev_priv->sb_lock); | 1350 | mutex_lock(&dev_priv->sb_lock); |
@@ -2255,7 +2275,7 @@ int intel_power_domains_init(struct drm_i915_private *dev_priv) | |||
2255 | */ | 2275 | */ |
2256 | void intel_power_domains_fini(struct drm_i915_private *dev_priv) | 2276 | void intel_power_domains_fini(struct drm_i915_private *dev_priv) |
2257 | { | 2277 | { |
2258 | struct device *device = &dev_priv->dev->pdev->dev; | 2278 | struct device *device = &dev_priv->drm.pdev->dev; |
2259 | 2279 | ||
2260 | /* | 2280 | /* |
2261 | * The i915.ko module is still not prepared to be loaded when | 2281 | * The i915.ko module is still not prepared to be loaded when |
@@ -2556,7 +2576,7 @@ static void vlv_cmnlane_wa(struct drm_i915_private *dev_priv) | |||
2556 | */ | 2576 | */ |
2557 | void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume) | 2577 | void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume) |
2558 | { | 2578 | { |
2559 | struct drm_device *dev = dev_priv->dev; | 2579 | struct drm_device *dev = &dev_priv->drm; |
2560 | struct i915_power_domains *power_domains = &dev_priv->power_domains; | 2580 | struct i915_power_domains *power_domains = &dev_priv->power_domains; |
2561 | 2581 | ||
2562 | power_domains->initializing = true; | 2582 | power_domains->initializing = true; |
@@ -2618,7 +2638,7 @@ void intel_power_domains_suspend(struct drm_i915_private *dev_priv) | |||
2618 | */ | 2638 | */ |
2619 | void intel_runtime_pm_get(struct drm_i915_private *dev_priv) | 2639 | void intel_runtime_pm_get(struct drm_i915_private *dev_priv) |
2620 | { | 2640 | { |
2621 | struct drm_device *dev = dev_priv->dev; | 2641 | struct drm_device *dev = &dev_priv->drm; |
2622 | struct device *device = &dev->pdev->dev; | 2642 | struct device *device = &dev->pdev->dev; |
2623 | 2643 | ||
2624 | pm_runtime_get_sync(device); | 2644 | pm_runtime_get_sync(device); |
@@ -2639,7 +2659,7 @@ void intel_runtime_pm_get(struct drm_i915_private *dev_priv) | |||
2639 | */ | 2659 | */ |
2640 | bool intel_runtime_pm_get_if_in_use(struct drm_i915_private *dev_priv) | 2660 | bool intel_runtime_pm_get_if_in_use(struct drm_i915_private *dev_priv) |
2641 | { | 2661 | { |
2642 | struct drm_device *dev = dev_priv->dev; | 2662 | struct drm_device *dev = &dev_priv->drm; |
2643 | struct device *device = &dev->pdev->dev; | 2663 | struct device *device = &dev->pdev->dev; |
2644 | 2664 | ||
2645 | if (IS_ENABLED(CONFIG_PM)) { | 2665 | if (IS_ENABLED(CONFIG_PM)) { |
@@ -2681,7 +2701,7 @@ bool intel_runtime_pm_get_if_in_use(struct drm_i915_private *dev_priv) | |||
2681 | */ | 2701 | */ |
2682 | void intel_runtime_pm_get_noresume(struct drm_i915_private *dev_priv) | 2702 | void intel_runtime_pm_get_noresume(struct drm_i915_private *dev_priv) |
2683 | { | 2703 | { |
2684 | struct drm_device *dev = dev_priv->dev; | 2704 | struct drm_device *dev = &dev_priv->drm; |
2685 | struct device *device = &dev->pdev->dev; | 2705 | struct device *device = &dev->pdev->dev; |
2686 | 2706 | ||
2687 | assert_rpm_wakelock_held(dev_priv); | 2707 | assert_rpm_wakelock_held(dev_priv); |
@@ -2700,7 +2720,7 @@ void intel_runtime_pm_get_noresume(struct drm_i915_private *dev_priv) | |||
2700 | */ | 2720 | */ |
2701 | void intel_runtime_pm_put(struct drm_i915_private *dev_priv) | 2721 | void intel_runtime_pm_put(struct drm_i915_private *dev_priv) |
2702 | { | 2722 | { |
2703 | struct drm_device *dev = dev_priv->dev; | 2723 | struct drm_device *dev = &dev_priv->drm; |
2704 | struct device *device = &dev->pdev->dev; | 2724 | struct device *device = &dev->pdev->dev; |
2705 | 2725 | ||
2706 | assert_rpm_wakelock_held(dev_priv); | 2726 | assert_rpm_wakelock_held(dev_priv); |
@@ -2723,7 +2743,7 @@ void intel_runtime_pm_put(struct drm_i915_private *dev_priv) | |||
2723 | */ | 2743 | */ |
2724 | void intel_runtime_pm_enable(struct drm_i915_private *dev_priv) | 2744 | void intel_runtime_pm_enable(struct drm_i915_private *dev_priv) |
2725 | { | 2745 | { |
2726 | struct drm_device *dev = dev_priv->dev; | 2746 | struct drm_device *dev = &dev_priv->drm; |
2727 | struct device *device = &dev->pdev->dev; | 2747 | struct device *device = &dev->pdev->dev; |
2728 | 2748 | ||
2729 | pm_runtime_set_autosuspend_delay(device, 10000); /* 10s */ | 2749 | pm_runtime_set_autosuspend_delay(device, 10000); /* 10s */ |