Commit 93c7cb6c authored by Suketu Shah's avatar Suketu Shah Committed by Daniel Vetter

drm/i915/skl: Assert the requirements to enter or exit DC6.

Warn if the conditions to enter or exit DC6 are not satisfied such
as support for runtime PM, state of power well, CSR loading etc.

v2: Removed camelcase in functions and variables.

v3: Do some minimal check to assert if CSR program is not loaded.

v4:
1] Correct the check for backlight-disabling in assert_can_enable_dc6().
2] Check csr.loaded = false before disabling DC6 and simplify other checks.

v5:
1] Remove checks for DC5 state from assert_can_enable_dc6 function as DC5 is no
   longer enabled before enabling DC6.
2] Correct the check for CSR-loading in assert_can_disable_dc6 function as CSR must
   be loaded for context restore to happen on DC6 disabling.

v6:
1] It's okay to explicitly disable DC6 during driver-load/resume even though it might
   already be disabled and so don't warn about it.

v7: Rebase to latest.

v8: Sqashed the patch from Imre -
[PATCH] drm/i915/skl: avoid false CSR fw not loaded WARN during driver load/resume

v9: After adding dmc ver 1.0 support rebased on top of nightly. (Animesh)

v10: During initialization added a early return before disabling DC5. (Animesh)

Issue: VIZ-2819
Signed-off-by: default avatarA.Sunil Kamath <sunil.kamath@intel.com>
Signed-off-by: default avatarSuketu Shah <suketu.j.shah@intel.com>
Signed-off-by: default avatarDamien Lespiau <damien.lespiau@intel.com>
Signed-off-by: default avatarAnimesh Manna <animesh.manna@intel.com>
Reviewed-by: default avatarImre Deak <imre.deak@intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 74b4f371
...@@ -459,6 +459,12 @@ static void assert_can_disable_dc5(struct drm_i915_private *dev_priv) ...@@ -459,6 +459,12 @@ static void assert_can_disable_dc5(struct drm_i915_private *dev_priv)
{ {
bool pg2_enabled = intel_display_power_well_is_enabled(dev_priv, bool pg2_enabled = intel_display_power_well_is_enabled(dev_priv,
SKL_DISP_PW_2); SKL_DISP_PW_2);
/*
* During initialization, the firmware may not be loaded yet.
* We still want to make sure that the DC enabling flag is cleared.
*/
if (dev_priv->power_domains.initializing)
return;
WARN(!pg2_enabled, "PG2 not enabled to disable DC5.\n"); WARN(!pg2_enabled, "PG2 not enabled to disable DC5.\n");
WARN(dev_priv->pm.suspended, WARN(dev_priv->pm.suspended,
...@@ -496,12 +502,39 @@ static void gen9_disable_dc5(struct drm_i915_private *dev_priv) ...@@ -496,12 +502,39 @@ static void gen9_disable_dc5(struct drm_i915_private *dev_priv)
POSTING_READ(DC_STATE_EN); POSTING_READ(DC_STATE_EN);
} }
static void skl_enable_dc6(struct drm_i915_private *dev_priv) static void assert_can_enable_dc6(struct drm_i915_private *dev_priv)
{ {
struct drm_device *dev = dev_priv->dev; struct drm_device *dev = dev_priv->dev;
WARN(!IS_SKYLAKE(dev), "Platform doesn't support DC6.\n");
WARN(!HAS_RUNTIME_PM(dev), "Runtime PM not enabled.\n");
WARN(I915_READ(UTIL_PIN_CTL) & UTIL_PIN_ENABLE,
"Backlight is not disabled.\n");
WARN((I915_READ(DC_STATE_EN) & DC_STATE_EN_UPTO_DC6),
"DC6 already programmed to be enabled.\n");
assert_csr_loaded(dev_priv);
}
static void assert_can_disable_dc6(struct drm_i915_private *dev_priv)
{
/*
* During initialization, the firmware may not be loaded yet.
* We still want to make sure that the DC enabling flag is cleared.
*/
if (dev_priv->power_domains.initializing)
return;
assert_csr_loaded(dev_priv);
WARN(!(I915_READ(DC_STATE_EN) & DC_STATE_EN_UPTO_DC6),
"DC6 already programmed to be disabled.\n");
}
static void skl_enable_dc6(struct drm_i915_private *dev_priv)
{
uint32_t val; uint32_t val;
WARN_ON(!IS_SKYLAKE(dev)); assert_can_enable_dc6(dev_priv);
DRM_DEBUG_KMS("Enabling DC6\n"); DRM_DEBUG_KMS("Enabling DC6\n");
...@@ -516,10 +549,9 @@ static void skl_enable_dc6(struct drm_i915_private *dev_priv) ...@@ -516,10 +549,9 @@ static void skl_enable_dc6(struct drm_i915_private *dev_priv)
static void skl_disable_dc6(struct drm_i915_private *dev_priv) static void skl_disable_dc6(struct drm_i915_private *dev_priv)
{ {
struct drm_device *dev = dev_priv->dev;
uint32_t val; uint32_t val;
WARN_ON(!IS_SKYLAKE(dev)); assert_can_disable_dc6(dev_priv);
DRM_DEBUG_KMS("Disabling DC6\n"); DRM_DEBUG_KMS("Disabling DC6\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment