aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_runtime_pm.c
diff options
context:
space:
mode:
authorSuketu Shah <suketu.j.shah@intel.com>2015-04-16 04:52:13 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2015-05-08 07:03:16 -0400
commit93c7cb6c3a2f8c7204fc8bcf7769059875a54027 (patch)
treebe039e78f1a7af23765bef199ca8e920cf1a317e /drivers/gpu/drm/i915/intel_runtime_pm.c
parent74b4f371f56fc7ca4058041080b30d5b0a7271af (diff)
drm/i915/skl: Assert the requirements to enter or exit DC6.
Warn if the conditions to enter or exit DC6 are not satisfied such as support for runtime PM, state of power well, CSR loading etc. v2: Removed camelcase in functions and variables. v3: Do some minimal check to assert if CSR program is not loaded. v4: 1] Correct the check for backlight-disabling in assert_can_enable_dc6(). 2] Check csr.loaded = false before disabling DC6 and simplify other checks. v5: 1] Remove checks for DC5 state from assert_can_enable_dc6 function as DC5 is no longer enabled before enabling DC6. 2] Correct the check for CSR-loading in assert_can_disable_dc6 function as CSR must be loaded for context restore to happen on DC6 disabling. v6: 1] It's okay to explicitly disable DC6 during driver-load/resume even though it might already be disabled and so don't warn about it. v7: Rebase to latest. v8: Sqashed the patch from Imre - [PATCH] drm/i915/skl: avoid false CSR fw not loaded WARN during driver load/resume v9: After adding dmc ver 1.0 support rebased on top of nightly. (Animesh) v10: During initialization added a early return before disabling DC5. (Animesh) Issue: VIZ-2819 Signed-off-by: A.Sunil Kamath <sunil.kamath@intel.com> Signed-off-by: Suketu Shah <suketu.j.shah@intel.com> Signed-off-by: Damien Lespiau <damien.lespiau@intel.com> Signed-off-by: Animesh Manna <animesh.manna@intel.com> Reviewed-by: Imre Deak <imre.deak@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_runtime_pm.c')
-rw-r--r--drivers/gpu/drm/i915/intel_runtime_pm.c40
1 files changed, 36 insertions, 4 deletions
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
index 39810844a9c9..b393db78e5cb 100644
--- a/drivers/gpu/drm/i915/intel_runtime_pm.c
+++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
@@ -459,6 +459,12 @@ static void assert_can_disable_dc5(struct drm_i915_private *dev_priv)
459{ 459{
460 bool pg2_enabled = intel_display_power_well_is_enabled(dev_priv, 460 bool pg2_enabled = intel_display_power_well_is_enabled(dev_priv,
461 SKL_DISP_PW_2); 461 SKL_DISP_PW_2);
462 /*
463 * During initialization, the firmware may not be loaded yet.
464 * We still want to make sure that the DC enabling flag is cleared.
465 */
466 if (dev_priv->power_domains.initializing)
467 return;
462 468
463 WARN(!pg2_enabled, "PG2 not enabled to disable DC5.\n"); 469 WARN(!pg2_enabled, "PG2 not enabled to disable DC5.\n");
464 WARN(dev_priv->pm.suspended, 470 WARN(dev_priv->pm.suspended,
@@ -496,12 +502,39 @@ static void gen9_disable_dc5(struct drm_i915_private *dev_priv)
496 POSTING_READ(DC_STATE_EN); 502 POSTING_READ(DC_STATE_EN);
497} 503}
498 504
499static void skl_enable_dc6(struct drm_i915_private *dev_priv) 505static void assert_can_enable_dc6(struct drm_i915_private *dev_priv)
500{ 506{
501 struct drm_device *dev = dev_priv->dev; 507 struct drm_device *dev = dev_priv->dev;
508
509 WARN(!IS_SKYLAKE(dev), "Platform doesn't support DC6.\n");
510 WARN(!HAS_RUNTIME_PM(dev), "Runtime PM not enabled.\n");
511 WARN(I915_READ(UTIL_PIN_CTL) & UTIL_PIN_ENABLE,
512 "Backlight is not disabled.\n");
513 WARN((I915_READ(DC_STATE_EN) & DC_STATE_EN_UPTO_DC6),
514 "DC6 already programmed to be enabled.\n");
515
516 assert_csr_loaded(dev_priv);
517}
518
519static void assert_can_disable_dc6(struct drm_i915_private *dev_priv)
520{
521 /*
522 * During initialization, the firmware may not be loaded yet.
523 * We still want to make sure that the DC enabling flag is cleared.
524 */
525 if (dev_priv->power_domains.initializing)
526 return;
527
528 assert_csr_loaded(dev_priv);
529 WARN(!(I915_READ(DC_STATE_EN) & DC_STATE_EN_UPTO_DC6),
530 "DC6 already programmed to be disabled.\n");
531}
532
533static void skl_enable_dc6(struct drm_i915_private *dev_priv)
534{
502 uint32_t val; 535 uint32_t val;
503 536
504 WARN_ON(!IS_SKYLAKE(dev)); 537 assert_can_enable_dc6(dev_priv);
505 538
506 DRM_DEBUG_KMS("Enabling DC6\n"); 539 DRM_DEBUG_KMS("Enabling DC6\n");
507 540
@@ -516,10 +549,9 @@ static void skl_enable_dc6(struct drm_i915_private *dev_priv)
516 549
517static void skl_disable_dc6(struct drm_i915_private *dev_priv) 550static void skl_disable_dc6(struct drm_i915_private *dev_priv)
518{ 551{
519 struct drm_device *dev = dev_priv->dev;
520 uint32_t val; 552 uint32_t val;
521 553
522 WARN_ON(!IS_SKYLAKE(dev)); 554 assert_can_disable_dc6(dev_priv);
523 555
524 DRM_DEBUG_KMS("Disabling DC6\n"); 556 DRM_DEBUG_KMS("Disabling DC6\n");
525 557