aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorAnimesh Manna <animesh.manna@intel.com>2018-10-29 18:14:10 -0400
committerRodrigo Vivi <rodrigo.vivi@intel.com>2018-10-30 13:55:10 -0400
commit3e68928b7d4c833726717ced2261f77479d98a47 (patch)
treeea7a234a6ce04ee245a9f31f986052d0c15013da /drivers/gpu
parenta950adc6c343c918e4728648f7a59ba42d79c1ce (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.c20
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h3
-rw-r--r--drivers/gpu/drm/i915/intel_runtime_pm.c32
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);
1695void bxt_disable_dc9(struct drm_i915_private *dev_priv); 1695void bxt_disable_dc9(struct drm_i915_private *dev_priv);
1696void gen9_enable_dc5(struct drm_i915_private *dev_priv); 1696void gen9_enable_dc5(struct drm_i915_private *dev_priv);
1697unsigned int skl_cdclk_get_vco(unsigned int freq); 1697unsigned int skl_cdclk_get_vco(unsigned int freq);
1698void skl_enable_dc6(struct drm_i915_private *dev_priv);
1698void intel_dp_get_m_n(struct intel_crtc *crtc, 1699void intel_dp_get_m_n(struct intel_crtc *crtc,
1699 struct intel_crtc_state *pipe_config); 1700 struct intel_crtc_state *pipe_config);
1700void intel_dp_set_m_n(const struct intel_crtc_state *crtc_state, 1701void 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 *);
2045void intel_power_domains_cleanup(struct drm_i915_private *dev_priv); 2046void intel_power_domains_cleanup(struct drm_i915_private *dev_priv);
2046void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume); 2047void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume);
2047void intel_power_domains_fini_hw(struct drm_i915_private *dev_priv); 2048void intel_power_domains_fini_hw(struct drm_i915_private *dev_priv);
2049void icl_display_core_init(struct drm_i915_private *dev_priv, bool resume);
2050void icl_display_core_uninit(struct drm_i915_private *dev_priv);
2048void intel_power_domains_enable(struct drm_i915_private *dev_priv); 2051void intel_power_domains_enable(struct drm_i915_private *dev_priv);
2049void intel_power_domains_disable(struct drm_i915_private *dev_priv); 2052void 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
719static void skl_enable_dc6(struct drm_i915_private *dev_priv) 726void 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
3542static void icl_display_core_init(struct drm_i915_private *dev_priv, 3552void 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
3595static void icl_display_core_uninit(struct drm_i915_private *dev_priv) 3605void 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;