[Intel-gfx] [PATCH] drm/i915/icl: Enable DC9 as lowest possible state during screen-off

Srivatsa, Anusha anusha.srivatsa at intel.com
Mon Sep 17 18:45:26 UTC 2018



>-----Original Message-----
>From: Vivi, Rodrigo
>Sent: Thursday, September 13, 2018 1:14 PM
>To: Srivatsa, Anusha <anusha.srivatsa at intel.com>
>Cc: intel-gfx at lists.freedesktop.org; Manna, Animesh
><animesh.manna at intel.com>; Deak, Imre <imre.deak at intel.com>; Ausmus,
>James <james.ausmus at intel.com>
>Subject: Re: [PATCH] drm/i915/icl: Enable DC9 as lowest possible state during
>screen-off
>
>On Thu, Sep 13, 2018 at 12:31:09PM -0700, Anusha Srivatsa wrote:
>> From: Animesh Manna <animesh.manna at intel.com>
>>
>> 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.
>
>First concern with this patch is regarding the tests...
>How is this getting tested? Are you able to see DC6 and DC9?
>
>>
>> Cc: Imre Deak <imre.deak at intel.com>
>> Cc: Rodrigo Vivi <rodrigo.vivi at intel.com>
>> Signed-off-by: Animesh Manna <animesh.manna at intel.com>
>> Signed-off-by: James Ausmus <james.ausmus at intel.com>
>> Signed-off-by: Anusha Srivatsa <anusha.srivatsa at intel.com>
>> ---
>>  drivers/gpu/drm/i915/i915_drv.c         | 20 ++++++++++++++---
>>  drivers/gpu/drm/i915/intel_drv.h        |  3 +++
>>  drivers/gpu/drm/i915/intel_runtime_pm.c | 29
>> +++++++++++++++----------
>>  3 files changed, 37 insertions(+), 15 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/i915_drv.c
>> b/drivers/gpu/drm/i915/i915_drv.c index 2ddf8538cb47..86a83e0a7ef2
>> 100644
>> --- a/drivers/gpu/drm/i915/i915_drv.c
>> +++ b/drivers/gpu/drm/i915/i915_drv.c
>> @@ -1855,7 +1855,7 @@ static int i915_drm_resume_early(struct
>> drm_device *dev)
>>
>>  	intel_uncore_resume_early(dev_priv);
>>
>> -	if (IS_GEN9_LP(dev_priv)) {
>> +	if (INTEL_GEN(dev_priv) >= 11 || IS_GEN9_LP(dev_priv)) {
>>  		gen9_sanitize_dc_state(dev_priv);
>>  		bxt_disable_dc9(dev_priv);
>>  	} else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) { @@
>> -2622,7 +2622,10 @@ static int intel_runtime_suspend(struct device *kdev)
>>  	intel_uncore_suspend(dev_priv);
>>
>>  	ret = 0;
>> -	if (IS_GEN9_LP(dev_priv)) {
>> +	if (IS_ICELAKE(dev_priv)) {
>> +		icl_display_core_uninit(dev_priv);
>> +		bxt_enable_dc9(dev_priv);
>> +	} else if (IS_GEN9_LP(dev_priv)) {
>>  		bxt_display_core_uninit(dev_priv);
>>  		bxt_enable_dc9(dev_priv);
>>  	} else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) { @@
>> -2707,7 +2710,18 @@ static int intel_runtime_resume(struct device *kdev)
>>  	if (intel_uncore_unclaimed_mmio(dev_priv))
>>  		DRM_DEBUG_DRIVER("Unclaimed access during suspend,
>bios?\n");
>>
>> -	if (IS_GEN9_LP(dev_priv)) {
>> +	if (IS_ICELAKE(dev_priv)) {
>
>commit message mention the use of INTEL_GEN instead of ICELAKE, but it seems
>we are missing some replacements here....
Actually double checked with the internal version of this patch, seems like IS_ICELAKE was what was used in the code...

Maybe change the commit log?

>
>> +		bxt_disable_dc9(dev_priv);
>> +		icl_display_core_init(dev_priv, true);
>> +		if (dev_priv->csr.dmc_payload) {
>> +			if (dev_priv->csr.allowed_dc_mask &
>> +			    DC_STATE_EN_UPTO_DC6)
>> +				skl_enable_dc6(dev_priv);
>> +			else if (dev_priv->csr.allowed_dc_mask &
>> +				 DC_STATE_EN_UPTO_DC5)
>> +				gen9_enable_dc5(dev_priv);
>> +		}
>> +	} else if (IS_GEN9_LP(dev_priv)) {
>>  		bxt_disable_dc9(dev_priv);
>>  		bxt_display_core_init(dev_priv, true);
>>  		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 bf1c38728a59..f0385fe5bb15 100644
>> --- a/drivers/gpu/drm/i915/intel_drv.h
>> +++ b/drivers/gpu/drm/i915/intel_drv.h
>> @@ -1627,6 +1627,7 @@ void bxt_enable_dc9(struct drm_i915_private
>> *dev_priv);  void bxt_disable_dc9(struct drm_i915_private *dev_priv);
>> void gen9_enable_dc5(struct drm_i915_private *dev_priv);  unsigned int
>> skl_cdclk_get_vco(unsigned int freq);
>> +void skl_enable_dc6(struct drm_i915_private *dev_priv);
>>  void intel_dp_get_m_n(struct intel_crtc *crtc,
>>  		      struct intel_crtc_state *pipe_config);  void
>> intel_dp_set_m_n(struct intel_crtc *crtc, enum link_m_n_set m_n); @@
>> -1966,6 +1967,8 @@ int intel_power_domains_init(struct
>> drm_i915_private *);  void intel_power_domains_cleanup(struct
>> drm_i915_private *dev_priv);  void intel_power_domains_init_hw(struct
>> drm_i915_private *dev_priv, bool resume);  void
>> intel_power_domains_fini_hw(struct drm_i915_private *dev_priv);
>> +void icl_display_core_init(struct drm_i915_private *dev_priv, bool
>> +resume); void icl_display_core_uninit(struct drm_i915_private
>> +*dev_priv);
>>  void intel_power_domains_enable(struct drm_i915_private *dev_priv);
>> void intel_power_domains_disable(struct drm_i915_private *dev_priv);
>>
>> diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c
>> b/drivers/gpu/drm/i915/intel_runtime_pm.c
>> index 480dadb1047b..3e2c936217f8 100644
>> --- a/drivers/gpu/drm/i915/intel_runtime_pm.c
>> +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
>> @@ -551,7 +551,9 @@ static u32 gen9_dc_mask(struct drm_i915_private
>*dev_priv)
>>  	u32 mask;
>>
>>  	mask = DC_STATE_EN_UPTO_DC5;
>> -	if (IS_GEN9_LP(dev_priv))
>> +	if (INTEL_GEN(dev_priv) >= 11)
>> +		mask |= DC_STATE_EN_UPTO_DC6 | DC_STATE_EN_DC9;
>> +	else if (IS_GEN9_LP(dev_priv))
>>  		mask |= DC_STATE_EN_DC9;
>>  	else
>>  		mask |= DC_STATE_EN_UPTO_DC6;
>> @@ -624,8 +626,8 @@ void bxt_enable_dc9(struct drm_i915_private
>*dev_priv)
>>  	assert_can_enable_dc9(dev_priv);
>>
>>  	DRM_DEBUG_KMS("Enabling DC9\n");
>> -
>> -	intel_power_sequencer_reset(dev_priv);
>> +	if (INTEL_GEN(dev_priv) < 11)
>> +		intel_power_sequencer_reset(dev_priv);
>>  	gen9_set_dc_state(dev_priv, DC_STATE_EN_DC9);  }
>>
>> @@ -707,7 +709,7 @@ static void assert_can_enable_dc6(struct
>drm_i915_private *dev_priv)
>>  	assert_csr_loaded(dev_priv);
>>  }
>>
>> -static void skl_enable_dc6(struct drm_i915_private *dev_priv)
>> +void skl_enable_dc6(struct drm_i915_private *dev_priv)
>>  {
>>  	assert_can_enable_dc6(dev_priv);
>>
>> @@ -2968,17 +2970,20 @@ static uint32_t get_allowed_dc_mask(const struct
>drm_i915_private *dev_priv,
>>  	int requested_dc;
>>  	int max_dc;
>>
>> -	if (IS_GEN9_BC(dev_priv) || INTEL_INFO(dev_priv)->gen >= 10) {
>> -		max_dc = 2;
>> -		mask = 0;
>> -	} else if (IS_GEN9_LP(dev_priv)) {
>> -		max_dc = 1;
>> +	if (INTEL_GEN(dev_priv) >= 11 || IS_GEN9_LP(dev_priv)) {
>> +		if (INTEL_GEN(dev_priv) >= 11)
>> +			max_dc = 2;
>
>This is supper confusing... Could we create a new full block for INTEL_GEN >= 11?
Yes...that sounds good.

Anusha
>
>> +		else
>> +			max_dc = 1;
>>  		/*
>>  		 * DC9 has a separate HW flow from the rest of the DC states,
>>  		 * not depending on the DMC firmware. It's needed by system
>>  		 * suspend/resume, so allow it unconditionally.
>>  		 */
>>  		mask = DC_STATE_EN_DC9;
>> +	} else if (IS_GEN10(dev_priv) || IS_GEN9_BC(dev_priv)) {
>> +		max_dc = 2;
>> +		mask = 0;
>>  	} else {
>>  		max_dc = 0;
>>  		mask = 0;
>> @@ -3513,8 +3518,8 @@ static void cnl_display_core_uninit(struct
>drm_i915_private *dev_priv)
>>  	I915_WRITE(CHICKEN_MISC_2, val);
>>  }
>>
>> -static void icl_display_core_init(struct drm_i915_private *dev_priv,
>> -				  bool resume)
>> +void icl_display_core_init(struct drm_i915_private *dev_priv,
>> +			   bool resume)
>>  {
>>  	struct i915_power_domains *power_domains = &dev_priv-
>>power_domains;
>>  	struct i915_power_well *well;
>> @@ -3565,7 +3570,7 @@ static void icl_display_core_init(struct
>drm_i915_private *dev_priv,
>>  	icl_mbus_init(dev_priv);
>>  }
>>
>> -static void icl_display_core_uninit(struct drm_i915_private
>> *dev_priv)
>> +void icl_display_core_uninit(struct drm_i915_private *dev_priv)
>>  {
>>  	struct i915_power_domains *power_domains = &dev_priv-
>>power_domains;
>>  	struct i915_power_well *well;
>> --
>> 2.17.1
>>


More information about the Intel-gfx mailing list