diff options
author | Animesh Manna <animesh.manna@intel.com> | 2018-10-29 18:14:10 -0400 |
---|---|---|
committer | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2018-10-30 13:55:10 -0400 |
commit | 3e68928b7d4c833726717ced2261f77479d98a47 (patch) | |
tree | ea7a234a6ce04ee245a9f31f986052d0c15013da /drivers/gpu/drm/i915/intel_runtime_pm.c | |
parent | a950adc6c343c918e4728648f7a59ba42d79c1ce (diff) |
drm/i915/icl: Enable DC9 as lowest possible state during screen-off
ICL supports DC5, DC6, and DC9. Enable DC9 during screen-off, and enable
DC5/6 when appropriate.
v2: (James Ausmus)
- Also handle ICL as GEN9_LP in i915_drm_suspend_late and
i915_drm_suspend_early
- Add DC9 to gen9_dc_mask for ICL
- Re-order GEN checks for newest platform first
- Use INTEL_GEN instead of INTEL_INFO->gen
- Use INTEL_GEN >= 11 instead of IS_ICELAKE
- Consolidate GEN checks
v3: (James Ausmus)
- Also allow DC6 for ICL (Imre, Art)
- Simplify !(GEN >= 11) to GEN < 11 (Imre)
v4: (James Ausmus)
- Don't call intel_power_sequencer_reset after DC9 for Gen11+, as the
PPS regs are Always On
- Rebase against upstream changes
v5: (Anusha Srivatsa)
- rebased against the latest upstream changes.
v6: (Anusha Srivatsa)
- rebased.Use INTEL_GEN consistently.
- Simplify the code (Rodrigo)
v7: rebased. Change order according to platforms(Jyoti)
v8: rebased. Change the check from platform specific to
HAS_PCH_SPLIT(). Add comment in code to be more clear.(Rodrigo)
Cc: Imre Deak <imre.deak@intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: Animesh Manna <animesh.manna@intel.com>
Signed-off-by: James Ausmus <james.ausmus@intel.com>
Signed-off-by: Anusha Srivatsa <anusha.srivatsa@intel.com>
Tested-by: Jyoti Yadav <jyoti.r.yadav@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20181029221410.4423-1-anusha.srivatsa@intel.com
Diffstat (limited to 'drivers/gpu/drm/i915/intel_runtime_pm.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_runtime_pm.c | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c index 5f5416eb9644..b1901a6c17be 100644 --- a/drivers/gpu/drm/i915/intel_runtime_pm.c +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c | |||
@@ -560,7 +560,9 @@ static u32 gen9_dc_mask(struct drm_i915_private *dev_priv) | |||
560 | u32 mask; | 560 | u32 mask; |
561 | 561 | ||
562 | mask = DC_STATE_EN_UPTO_DC5; | 562 | mask = DC_STATE_EN_UPTO_DC5; |
563 | if (IS_GEN9_LP(dev_priv)) | 563 | if (INTEL_GEN(dev_priv) >= 11) |
564 | mask |= DC_STATE_EN_UPTO_DC6 | DC_STATE_EN_DC9; | ||
565 | else if (IS_GEN9_LP(dev_priv)) | ||
564 | mask |= DC_STATE_EN_DC9; | 566 | mask |= DC_STATE_EN_DC9; |
565 | else | 567 | else |
566 | mask |= DC_STATE_EN_UPTO_DC6; | 568 | mask |= DC_STATE_EN_UPTO_DC6; |
@@ -633,8 +635,13 @@ void bxt_enable_dc9(struct drm_i915_private *dev_priv) | |||
633 | assert_can_enable_dc9(dev_priv); | 635 | assert_can_enable_dc9(dev_priv); |
634 | 636 | ||
635 | DRM_DEBUG_KMS("Enabling DC9\n"); | 637 | DRM_DEBUG_KMS("Enabling DC9\n"); |
636 | 638 | /* | |
637 | intel_power_sequencer_reset(dev_priv); | 639 | * Power sequencer reset is not needed on |
640 | * platforms with South Display Engine on PCH, | ||
641 | * because PPS registers are always on. | ||
642 | */ | ||
643 | if (!HAS_PCH_SPLIT(dev_priv)) | ||
644 | intel_power_sequencer_reset(dev_priv); | ||
638 | gen9_set_dc_state(dev_priv, DC_STATE_EN_DC9); | 645 | gen9_set_dc_state(dev_priv, DC_STATE_EN_DC9); |
639 | } | 646 | } |
640 | 647 | ||
@@ -716,7 +723,7 @@ static void assert_can_enable_dc6(struct drm_i915_private *dev_priv) | |||
716 | assert_csr_loaded(dev_priv); | 723 | assert_csr_loaded(dev_priv); |
717 | } | 724 | } |
718 | 725 | ||
719 | static void skl_enable_dc6(struct drm_i915_private *dev_priv) | 726 | void skl_enable_dc6(struct drm_i915_private *dev_priv) |
720 | { | 727 | { |
721 | assert_can_enable_dc6(dev_priv); | 728 | assert_can_enable_dc6(dev_priv); |
722 | 729 | ||
@@ -2978,17 +2985,20 @@ static uint32_t get_allowed_dc_mask(const struct drm_i915_private *dev_priv, | |||
2978 | int requested_dc; | 2985 | int requested_dc; |
2979 | int max_dc; | 2986 | int max_dc; |
2980 | 2987 | ||
2981 | if (IS_GEN9_BC(dev_priv) || INTEL_INFO(dev_priv)->gen >= 10) { | 2988 | if (INTEL_GEN(dev_priv) >= 11) { |
2982 | max_dc = 2; | 2989 | max_dc = 2; |
2983 | mask = 0; | ||
2984 | } else if (IS_GEN9_LP(dev_priv)) { | ||
2985 | max_dc = 1; | ||
2986 | /* | 2990 | /* |
2987 | * DC9 has a separate HW flow from the rest of the DC states, | 2991 | * DC9 has a separate HW flow from the rest of the DC states, |
2988 | * not depending on the DMC firmware. It's needed by system | 2992 | * not depending on the DMC firmware. It's needed by system |
2989 | * suspend/resume, so allow it unconditionally. | 2993 | * suspend/resume, so allow it unconditionally. |
2990 | */ | 2994 | */ |
2991 | mask = DC_STATE_EN_DC9; | 2995 | mask = DC_STATE_EN_DC9; |
2996 | } else if (IS_GEN10(dev_priv) || IS_GEN9_BC(dev_priv)) { | ||
2997 | max_dc = 2; | ||
2998 | mask = 0; | ||
2999 | } else if (IS_GEN9_LP(dev_priv)) { | ||
3000 | max_dc = 1; | ||
3001 | mask = DC_STATE_EN_DC9; | ||
2992 | } else { | 3002 | } else { |
2993 | max_dc = 0; | 3003 | max_dc = 0; |
2994 | mask = 0; | 3004 | mask = 0; |
@@ -3539,8 +3549,8 @@ static void cnl_display_core_uninit(struct drm_i915_private *dev_priv) | |||
3539 | I915_WRITE(CHICKEN_MISC_2, val); | 3549 | I915_WRITE(CHICKEN_MISC_2, val); |
3540 | } | 3550 | } |
3541 | 3551 | ||
3542 | static void icl_display_core_init(struct drm_i915_private *dev_priv, | 3552 | void icl_display_core_init(struct drm_i915_private *dev_priv, |
3543 | bool resume) | 3553 | bool resume) |
3544 | { | 3554 | { |
3545 | struct i915_power_domains *power_domains = &dev_priv->power_domains; | 3555 | struct i915_power_domains *power_domains = &dev_priv->power_domains; |
3546 | struct i915_power_well *well; | 3556 | struct i915_power_well *well; |
@@ -3592,7 +3602,7 @@ static void icl_display_core_init(struct drm_i915_private *dev_priv, | |||
3592 | intel_csr_load_program(dev_priv); | 3602 | intel_csr_load_program(dev_priv); |
3593 | } | 3603 | } |
3594 | 3604 | ||
3595 | static void icl_display_core_uninit(struct drm_i915_private *dev_priv) | 3605 | void icl_display_core_uninit(struct drm_i915_private *dev_priv) |
3596 | { | 3606 | { |
3597 | struct i915_power_domains *power_domains = &dev_priv->power_domains; | 3607 | struct i915_power_domains *power_domains = &dev_priv->power_domains; |
3598 | struct i915_power_well *well; | 3608 | struct i915_power_well *well; |