Skip to content

Commit 6dfc4a8

Browse files
committed
drm/i915: Verify power domains after enabling them
After commit 2cd9a68 ("drm/i915: Refactor intel_display_set_init_power() logic") it makes more sense to check the power domain/well refcounts after enabling the power domains functionality. Before that it's guaranteed that most power wells (in the INIT domain) will have a reference held, so not an interesting state. While at it also add the check after the init_hw/fini_hw, disable and suspend/resume steps. Make the test optional on a Kconfig option since it may add substantial overhead: on VLV/CHV the corresponding PUNIT reg access for each power well may take up to 20ms. v2: - Add the state check to more spots. (Chris) v3: - During suspend check the state before deiniting display core. Afterwards DC states are disabled (and so the dc_off power well is enabled) even though we don't hold a reference on it. - Do the test conditionally based on a new Kconfig option. (Chris) Cc: Chris Wilson <[email protected]> Reviewed-by: Chris Wilson <[email protected]> [Add DRM_I915_DEBUG_RUNTIME_PM to welcome messages] Signed-off-by: Imre Deak <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent da4468a commit 6dfc4a8

File tree

5 files changed

+44
-9
lines changed

5 files changed

+44
-9
lines changed

drivers/gpu/drm/i915/Kconfig.debug

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ config DRM_I915_DEBUG
3030
select SW_SYNC # signaling validation framework (igt/syncobj*)
3131
select DRM_I915_SW_FENCE_DEBUG_OBJECTS
3232
select DRM_I915_SELFTEST
33+
select DRM_I915_DEBUG_RUNTIME_PM
3334
default n
3435
help
3536
Choose this option to turn on extra driver debugging that may affect
@@ -167,3 +168,14 @@ config DRM_I915_DEBUG_VBLANK_EVADE
167168
the vblank.
168169

169170
If in doubt, say "N".
171+
172+
config DRM_I915_DEBUG_RUNTIME_PM
173+
bool "Enable extra state checking for runtime PM"
174+
depends on DRM_I915
175+
default n
176+
help
177+
Choose this option to turn on extra state checking for the
178+
runtime PM functionality. This may introduce overhead during
179+
driver loading, suspend and resume operations.
180+
181+
If in doubt, say "N"

drivers/gpu/drm/i915/i915_drv.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1331,6 +1331,8 @@ static void i915_welcome_messages(struct drm_i915_private *dev_priv)
13311331
DRM_INFO("DRM_I915_DEBUG enabled\n");
13321332
if (IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM))
13331333
DRM_INFO("DRM_I915_DEBUG_GEM enabled\n");
1334+
if (IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM))
1335+
DRM_INFO("DRM_I915_DEBUG_RUNTIME_PM enabled\n");
13341336
}
13351337

13361338
/**

drivers/gpu/drm/i915/intel_display.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15905,8 +15905,6 @@ intel_modeset_setup_hw_state(struct drm_device *dev,
1590515905

1590615906
intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);
1590715907

15908-
intel_power_domains_verify_state(dev_priv);
15909-
1591015908
intel_fbc_init_pipe_state(dev_priv);
1591115909
}
1591215910

drivers/gpu/drm/i915/intel_drv.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1966,7 +1966,6 @@ enum i915_drm_suspend_mode {
19661966
void intel_power_domains_suspend(struct drm_i915_private *dev_priv,
19671967
enum i915_drm_suspend_mode);
19681968
void intel_power_domains_resume(struct drm_i915_private *dev_priv);
1969-
void intel_power_domains_verify_state(struct drm_i915_private *dev_priv);
19701969
void bxt_display_core_init(struct drm_i915_private *dev_priv, bool resume);
19711970
void bxt_display_core_uninit(struct drm_i915_private *dev_priv);
19721971
void intel_runtime_pm_enable(struct drm_i915_private *dev_priv);

drivers/gpu/drm/i915/intel_runtime_pm.c

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3716,6 +3716,8 @@ static void vlv_cmnlane_wa(struct drm_i915_private *dev_priv)
37163716
cmn->desc->ops->disable(dev_priv, cmn);
37173717
}
37183718

3719+
static void intel_power_domains_verify_state(struct drm_i915_private *dev_priv);
3720+
37193721
/**
37203722
* intel_power_domains_init_hw - initialize hardware power domain state
37213723
* @dev_priv: i915 device instance
@@ -3767,6 +3769,8 @@ void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume)
37673769
intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
37683770
intel_power_domains_sync_hw(dev_priv);
37693771
power_domains->initializing = false;
3772+
3773+
intel_power_domains_verify_state(dev_priv);
37703774
}
37713775

37723776
/**
@@ -3788,6 +3792,8 @@ void intel_power_domains_fini_hw(struct drm_i915_private *dev_priv)
37883792
/* Remove the refcount we took to keep power well support disabled. */
37893793
if (!i915_modparams.disable_power_well)
37903794
intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);
3795+
3796+
intel_power_domains_verify_state(dev_priv);
37913797
}
37923798

37933799
/**
@@ -3805,6 +3811,8 @@ void intel_power_domains_fini_hw(struct drm_i915_private *dev_priv)
38053811
void intel_power_domains_enable(struct drm_i915_private *dev_priv)
38063812
{
38073813
intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);
3814+
3815+
intel_power_domains_verify_state(dev_priv);
38083816
}
38093817

38103818
/**
@@ -3817,6 +3825,8 @@ void intel_power_domains_enable(struct drm_i915_private *dev_priv)
38173825
void intel_power_domains_disable(struct drm_i915_private *dev_priv)
38183826
{
38193827
intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
3828+
3829+
intel_power_domains_verify_state(dev_priv);
38203830
}
38213831

38223832
/**
@@ -3845,15 +3855,19 @@ void intel_power_domains_suspend(struct drm_i915_private *dev_priv,
38453855
* firmware was inactive.
38463856
*/
38473857
if (!IS_GEN9_LP(dev_priv) && suspend_mode == I915_DRM_SUSPEND_IDLE &&
3848-
dev_priv->csr.dmc_payload != NULL)
3858+
dev_priv->csr.dmc_payload != NULL) {
3859+
intel_power_domains_verify_state(dev_priv);
38493860
return;
3861+
}
38503862

38513863
/*
38523864
* Even if power well support was disabled we still want to disable
38533865
* power wells if power domains must be deinitialized for suspend.
38543866
*/
3855-
if (!i915_modparams.disable_power_well)
3867+
if (!i915_modparams.disable_power_well) {
38563868
intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);
3869+
intel_power_domains_verify_state(dev_priv);
3870+
}
38573871

38583872
if (IS_ICELAKE(dev_priv))
38593873
icl_display_core_uninit(dev_priv);
@@ -3884,13 +3898,15 @@ void intel_power_domains_resume(struct drm_i915_private *dev_priv)
38843898
if (power_domains->display_core_suspended) {
38853899
intel_power_domains_init_hw(dev_priv, true);
38863900
power_domains->display_core_suspended = false;
3887-
3888-
return;
3901+
} else {
3902+
intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
38893903
}
38903904

3891-
intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
3905+
intel_power_domains_verify_state(dev_priv);
38923906
}
38933907

3908+
#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM)
3909+
38943910
static void intel_power_domains_dump_info(struct drm_i915_private *dev_priv)
38953911
{
38963912
struct i915_power_domains *power_domains = &dev_priv->power_domains;
@@ -3919,7 +3935,7 @@ static void intel_power_domains_dump_info(struct drm_i915_private *dev_priv)
39193935
* acquiring reference counts for any power wells in use and disabling the
39203936
* ones left on by BIOS but not required by any active output.
39213937
*/
3922-
void intel_power_domains_verify_state(struct drm_i915_private *dev_priv)
3938+
static void intel_power_domains_verify_state(struct drm_i915_private *dev_priv)
39233939
{
39243940
struct i915_power_domains *power_domains = &dev_priv->power_domains;
39253941
struct i915_power_well *power_well;
@@ -3974,6 +3990,14 @@ void intel_power_domains_verify_state(struct drm_i915_private *dev_priv)
39743990
mutex_unlock(&power_domains->lock);
39753991
}
39763992

3993+
#else
3994+
3995+
static void intel_power_domains_verify_state(struct drm_i915_private *dev_priv)
3996+
{
3997+
}
3998+
3999+
#endif
4000+
39774001
/**
39784002
* intel_runtime_pm_get - grab a runtime pm reference
39794003
* @dev_priv: i915 device instance

0 commit comments

Comments
 (0)