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 | |
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')
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.c | 20 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_runtime_pm.c | 32 |
3 files changed, 41 insertions, 14 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index f6416b1d3452..198d625f2871 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
@@ -2152,7 +2152,7 @@ static int i915_drm_resume_early(struct drm_device *dev) | |||
2152 | 2152 | ||
2153 | intel_uncore_resume_early(dev_priv); | 2153 | intel_uncore_resume_early(dev_priv); |
2154 | 2154 | ||
2155 | if (IS_GEN9_LP(dev_priv)) { | 2155 | if (INTEL_GEN(dev_priv) >= 11 || IS_GEN9_LP(dev_priv)) { |
2156 | gen9_sanitize_dc_state(dev_priv); | 2156 | gen9_sanitize_dc_state(dev_priv); |
2157 | bxt_disable_dc9(dev_priv); | 2157 | bxt_disable_dc9(dev_priv); |
2158 | } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) { | 2158 | } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) { |
@@ -2919,7 +2919,10 @@ static int intel_runtime_suspend(struct device *kdev) | |||
2919 | intel_uncore_suspend(dev_priv); | 2919 | intel_uncore_suspend(dev_priv); |
2920 | 2920 | ||
2921 | ret = 0; | 2921 | ret = 0; |
2922 | if (IS_GEN9_LP(dev_priv)) { | 2922 | if (INTEL_GEN(dev_priv) >= 11) { |
2923 | icl_display_core_uninit(dev_priv); | ||
2924 | bxt_enable_dc9(dev_priv); | ||
2925 | } else if (IS_GEN9_LP(dev_priv)) { | ||
2923 | bxt_display_core_uninit(dev_priv); | 2926 | bxt_display_core_uninit(dev_priv); |
2924 | bxt_enable_dc9(dev_priv); | 2927 | bxt_enable_dc9(dev_priv); |
2925 | } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) { | 2928 | } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) { |
@@ -3004,7 +3007,18 @@ static int intel_runtime_resume(struct device *kdev) | |||
3004 | if (intel_uncore_unclaimed_mmio(dev_priv)) | 3007 | if (intel_uncore_unclaimed_mmio(dev_priv)) |
3005 | DRM_DEBUG_DRIVER("Unclaimed access during suspend, bios?\n"); | 3008 | DRM_DEBUG_DRIVER("Unclaimed access during suspend, bios?\n"); |
3006 | 3009 | ||
3007 | if (IS_GEN9_LP(dev_priv)) { | 3010 | if (INTEL_GEN(dev_priv) >= 11) { |
3011 | bxt_disable_dc9(dev_priv); | ||
3012 | icl_display_core_init(dev_priv, true); | ||
3013 | if (dev_priv->csr.dmc_payload) { | ||
3014 | if (dev_priv->csr.allowed_dc_mask & | ||
3015 | DC_STATE_EN_UPTO_DC6) | ||
3016 | skl_enable_dc6(dev_priv); | ||
3017 | else if (dev_priv->csr.allowed_dc_mask & | ||
3018 | DC_STATE_EN_UPTO_DC5) | ||
3019 | gen9_enable_dc5(dev_priv); | ||
3020 | } | ||
3021 | } else if (IS_GEN9_LP(dev_priv)) { | ||
3008 | bxt_disable_dc9(dev_priv); | 3022 | bxt_disable_dc9(dev_priv); |
3009 | bxt_display_core_init(dev_priv, true); | 3023 | bxt_display_core_init(dev_priv, true); |
3010 | if (dev_priv->csr.dmc_payload && | 3024 | if (dev_priv->csr.dmc_payload && |
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 268afb6d2746..e4eaa40bd5f1 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
@@ -1695,6 +1695,7 @@ void bxt_enable_dc9(struct drm_i915_private *dev_priv); | |||
1695 | void bxt_disable_dc9(struct drm_i915_private *dev_priv); | 1695 | void bxt_disable_dc9(struct drm_i915_private *dev_priv); |
1696 | void gen9_enable_dc5(struct drm_i915_private *dev_priv); | 1696 | void gen9_enable_dc5(struct drm_i915_private *dev_priv); |
1697 | unsigned int skl_cdclk_get_vco(unsigned int freq); | 1697 | unsigned int skl_cdclk_get_vco(unsigned int freq); |
1698 | void skl_enable_dc6(struct drm_i915_private *dev_priv); | ||
1698 | void intel_dp_get_m_n(struct intel_crtc *crtc, | 1699 | void intel_dp_get_m_n(struct intel_crtc *crtc, |
1699 | struct intel_crtc_state *pipe_config); | 1700 | struct intel_crtc_state *pipe_config); |
1700 | void intel_dp_set_m_n(const struct intel_crtc_state *crtc_state, | 1701 | void intel_dp_set_m_n(const struct intel_crtc_state *crtc_state, |
@@ -2045,6 +2046,8 @@ int intel_power_domains_init(struct drm_i915_private *); | |||
2045 | void intel_power_domains_cleanup(struct drm_i915_private *dev_priv); | 2046 | void intel_power_domains_cleanup(struct drm_i915_private *dev_priv); |
2046 | void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume); | 2047 | void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume); |
2047 | void intel_power_domains_fini_hw(struct drm_i915_private *dev_priv); | 2048 | void intel_power_domains_fini_hw(struct drm_i915_private *dev_priv); |
2049 | void icl_display_core_init(struct drm_i915_private *dev_priv, bool resume); | ||
2050 | void icl_display_core_uninit(struct drm_i915_private *dev_priv); | ||
2048 | void intel_power_domains_enable(struct drm_i915_private *dev_priv); | 2051 | void intel_power_domains_enable(struct drm_i915_private *dev_priv); |
2049 | void intel_power_domains_disable(struct drm_i915_private *dev_priv); | 2052 | void intel_power_domains_disable(struct drm_i915_private *dev_priv); |
2050 | 2053 | ||
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; |