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:11 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2015-05-08 07:03:14 -0400
commitf75a1985137f272dff1a361b763a76fb8f68c3b9 (patch)
tree7faba3415c05438a897633cd76e475a9d25f678a /drivers/gpu/drm/i915/intel_runtime_pm.c
parent5aefb2398afad6998d51f90294e02b37b3f19a40 (diff)
drm/i915/skl: Add DC6 Trigger sequence.
Add triggers for DC6 as per details provided in skl_enable_dc6 and skl_disable_dc6 implementations. Also Call POSTING_READ for every write to a register to ensure it is written to immediately v1: Remove POSTING_READ and intel_prepare_ddi calls as they've been added in previous patches. v2: 1] Remove check for backlight disabled as it should be the case by that time. 2] Mark DC5 as disabled when enabling DC6. 3] Return from DC5-disabling function early if DC5 is already be disabled which can happen due to DC6-enabling earlier. 3] Ensure CSR firmware is loaded after resume from DC6 as corresponding memory contents won't be retained after runtime-suspend. 4] Ensure that CSR isn't identified as loaded before CSR-loading program is called during runtime-resume. v3: Rebase to latest Modified as per review comments from Imre and after discussion with Art: 1] DC6 should be preferably enabled when PG2 is disabled by SW as the check for PG1 being disabled is taken of by HW to enter DC6, and disabled when PG2 is enabled respectively. This helps save more power, especially in the case when display is disabled but GT is enabled. Accordingly, replacing DC5 trigger sequence with DC6 for SKL. 2] DC6 could be enabled from intel_runtime_suspend() function, if DC5 is already enabled. 3] Move CSR-load-status setting code from intel_runtime_suspend function to a new function. v4: 1] Enable/disable DC6 only when toggling the power-well using a newly defined macro ENABLE_DC6. v5: 1] Load CSR on system resume too as firmware may be lost on system suspend preventing enabling DC5, DC6. 2] DDI buffers shouldn't be programmed during driver-load/resume as it's already done during modeset initialization then and also that the encoder list is still uninitialized by then. Therefore, call intel_prepare_ddi function right after disabling DC6 but outside skl_disable_dc6 function and not during driver-load/resume. v6: 1] Rebase to latest. 2] Move SKL_ENABLE_DC6 macro definition from intel_display.c to intel_runtime_pm.c. v7: 1) Refactored the code for removing the warning got from checkpatch. 2) After adding dmc ver 1.0 support rebased on top of nightly. (Animesh) v8: - Reverted the changes done in v7. - Removed the condition check in skl_prepare_resune(). (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.c43
1 files changed, 36 insertions, 7 deletions
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
index 2f7f0ab363fb..5bd7f083aa34 100644
--- a/drivers/gpu/drm/i915/intel_runtime_pm.c
+++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
@@ -49,7 +49,8 @@
49 * present for a given platform. 49 * present for a given platform.
50 */ 50 */
51 51
52#define GEN9_ENABLE_DC5(dev) (IS_SKYLAKE(dev)) 52#define GEN9_ENABLE_DC5(dev) 0
53#define SKL_ENABLE_DC6(dev) IS_SKYLAKE(dev)
53 54
54#define for_each_power_well(i, power_well, domain_mask, power_domains) \ 55#define for_each_power_well(i, power_well, domain_mask, power_domains) \
55 for (i = 0; \ 56 for (i = 0; \
@@ -495,6 +496,16 @@ static void gen9_disable_dc5(struct drm_i915_private *dev_priv)
495 POSTING_READ(DC_STATE_EN); 496 POSTING_READ(DC_STATE_EN);
496} 497}
497 498
499static void skl_enable_dc6(struct drm_i915_private *dev_priv)
500{
501 /* TODO: Implementation to be done. */
502}
503
504static void skl_disable_dc6(struct drm_i915_private *dev_priv)
505{
506 /* TODO: Implementation to be done. */
507}
508
498static void skl_set_power_well(struct drm_i915_private *dev_priv, 509static void skl_set_power_well(struct drm_i915_private *dev_priv,
499 struct i915_power_well *power_well, bool enable) 510 struct i915_power_well *power_well, bool enable)
500{ 511{
@@ -542,9 +553,21 @@ static void skl_set_power_well(struct drm_i915_private *dev_priv,
542 !I915_READ(HSW_PWR_WELL_BIOS), 553 !I915_READ(HSW_PWR_WELL_BIOS),
543 "Invalid for power well status to be enabled, unless done by the BIOS, \ 554 "Invalid for power well status to be enabled, unless done by the BIOS, \
544 when request is to disable!\n"); 555 when request is to disable!\n");
545 if (GEN9_ENABLE_DC5(dev) && 556 if ((GEN9_ENABLE_DC5(dev) || SKL_ENABLE_DC6(dev)) &&
546 power_well->data == SKL_DISP_PW_2) 557 power_well->data == SKL_DISP_PW_2) {
547 gen9_disable_dc5(dev_priv); 558 if (SKL_ENABLE_DC6(dev)) {
559 skl_disable_dc6(dev_priv);
560 /*
561 * DDI buffer programming unnecessary during driver-load/resume
562 * as it's already done during modeset initialization then.
563 * It's also invalid here as encoder list is still uninitialized.
564 */
565 if (!dev_priv->power_domains.initializing)
566 intel_prepare_ddi(dev);
567 } else {
568 gen9_disable_dc5(dev_priv);
569 }
570 }
548 I915_WRITE(HSW_PWR_WELL_DRIVER, tmp | req_mask); 571 I915_WRITE(HSW_PWR_WELL_DRIVER, tmp | req_mask);
549 } 572 }
550 573
@@ -562,17 +585,23 @@ static void skl_set_power_well(struct drm_i915_private *dev_priv,
562 POSTING_READ(HSW_PWR_WELL_DRIVER); 585 POSTING_READ(HSW_PWR_WELL_DRIVER);
563 DRM_DEBUG_KMS("Disabling %s\n", power_well->name); 586 DRM_DEBUG_KMS("Disabling %s\n", power_well->name);
564 587
565 if (GEN9_ENABLE_DC5(dev) && 588 if ((GEN9_ENABLE_DC5(dev) || SKL_ENABLE_DC6(dev)) &&
566 power_well->data == SKL_DISP_PW_2) { 589 power_well->data == SKL_DISP_PW_2) {
567 enum csr_state state; 590 enum csr_state state;
568 591 /* TODO: wait for a completion event or
592 * similar here instead of busy
593 * waiting using wait_for function.
594 */
569 wait_for((state = intel_csr_load_status_get(dev_priv)) != 595 wait_for((state = intel_csr_load_status_get(dev_priv)) !=
570 FW_UNINITIALIZED, 1000); 596 FW_UNINITIALIZED, 1000);
571 if (state != FW_LOADED) 597 if (state != FW_LOADED)
572 DRM_ERROR("CSR firmware not ready (%d)\n", 598 DRM_ERROR("CSR firmware not ready (%d)\n",
573 state); 599 state);
574 else 600 else
575 gen9_enable_dc5(dev_priv); 601 if (SKL_ENABLE_DC6(dev))
602 skl_enable_dc6(dev_priv);
603 else
604 gen9_enable_dc5(dev_priv);
576 } 605 }
577 } 606 }
578 } 607 }