diff options
author | Imre Deak <imre.deak@intel.com> | 2018-08-16 15:34:14 -0400 |
---|---|---|
committer | Imre Deak <imre.deak@intel.com> | 2018-08-20 05:13:09 -0400 |
commit | 6dfc4a8f134fe0fe4c77dd09906e7305ba7b3edc (patch) | |
tree | 15ad7b440d7063644b8db9b071583182207e7305 /drivers/gpu/drm/i915/intel_runtime_pm.c | |
parent | da4468a1aa75457e6134127b19761b7ba62ce945 (diff) |
drm/i915: Verify power domains after enabling them
After
commit 2cd9a689e97b ("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 <chris@chris-wilson.co.uk>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
[Add DRM_I915_DEBUG_RUNTIME_PM to welcome messages]
Signed-off-by: Imre Deak <imre.deak@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180817145837.26592-1-imre.deak@intel.com
Diffstat (limited to 'drivers/gpu/drm/i915/intel_runtime_pm.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_runtime_pm.c | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c index 6153d5be5cf6..ff3fd8dbd2b4 100644 --- a/drivers/gpu/drm/i915/intel_runtime_pm.c +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c | |||
@@ -3716,6 +3716,8 @@ static void vlv_cmnlane_wa(struct drm_i915_private *dev_priv) | |||
3716 | cmn->desc->ops->disable(dev_priv, cmn); | 3716 | cmn->desc->ops->disable(dev_priv, cmn); |
3717 | } | 3717 | } |
3718 | 3718 | ||
3719 | static void intel_power_domains_verify_state(struct drm_i915_private *dev_priv); | ||
3720 | |||
3719 | /** | 3721 | /** |
3720 | * intel_power_domains_init_hw - initialize hardware power domain state | 3722 | * intel_power_domains_init_hw - initialize hardware power domain state |
3721 | * @dev_priv: i915 device instance | 3723 | * @dev_priv: i915 device instance |
@@ -3767,6 +3769,8 @@ void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume) | |||
3767 | intel_display_power_get(dev_priv, POWER_DOMAIN_INIT); | 3769 | intel_display_power_get(dev_priv, POWER_DOMAIN_INIT); |
3768 | intel_power_domains_sync_hw(dev_priv); | 3770 | intel_power_domains_sync_hw(dev_priv); |
3769 | power_domains->initializing = false; | 3771 | power_domains->initializing = false; |
3772 | |||
3773 | intel_power_domains_verify_state(dev_priv); | ||
3770 | } | 3774 | } |
3771 | 3775 | ||
3772 | /** | 3776 | /** |
@@ -3788,6 +3792,8 @@ void intel_power_domains_fini_hw(struct drm_i915_private *dev_priv) | |||
3788 | /* Remove the refcount we took to keep power well support disabled. */ | 3792 | /* Remove the refcount we took to keep power well support disabled. */ |
3789 | if (!i915_modparams.disable_power_well) | 3793 | if (!i915_modparams.disable_power_well) |
3790 | intel_display_power_put(dev_priv, POWER_DOMAIN_INIT); | 3794 | intel_display_power_put(dev_priv, POWER_DOMAIN_INIT); |
3795 | |||
3796 | intel_power_domains_verify_state(dev_priv); | ||
3791 | } | 3797 | } |
3792 | 3798 | ||
3793 | /** | 3799 | /** |
@@ -3805,6 +3811,8 @@ void intel_power_domains_fini_hw(struct drm_i915_private *dev_priv) | |||
3805 | void intel_power_domains_enable(struct drm_i915_private *dev_priv) | 3811 | void intel_power_domains_enable(struct drm_i915_private *dev_priv) |
3806 | { | 3812 | { |
3807 | intel_display_power_put(dev_priv, POWER_DOMAIN_INIT); | 3813 | intel_display_power_put(dev_priv, POWER_DOMAIN_INIT); |
3814 | |||
3815 | intel_power_domains_verify_state(dev_priv); | ||
3808 | } | 3816 | } |
3809 | 3817 | ||
3810 | /** | 3818 | /** |
@@ -3817,6 +3825,8 @@ void intel_power_domains_enable(struct drm_i915_private *dev_priv) | |||
3817 | void intel_power_domains_disable(struct drm_i915_private *dev_priv) | 3825 | void intel_power_domains_disable(struct drm_i915_private *dev_priv) |
3818 | { | 3826 | { |
3819 | intel_display_power_get(dev_priv, POWER_DOMAIN_INIT); | 3827 | intel_display_power_get(dev_priv, POWER_DOMAIN_INIT); |
3828 | |||
3829 | intel_power_domains_verify_state(dev_priv); | ||
3820 | } | 3830 | } |
3821 | 3831 | ||
3822 | /** | 3832 | /** |
@@ -3845,15 +3855,19 @@ void intel_power_domains_suspend(struct drm_i915_private *dev_priv, | |||
3845 | * firmware was inactive. | 3855 | * firmware was inactive. |
3846 | */ | 3856 | */ |
3847 | if (!IS_GEN9_LP(dev_priv) && suspend_mode == I915_DRM_SUSPEND_IDLE && | 3857 | 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); | ||
3849 | return; | 3860 | return; |
3861 | } | ||
3850 | 3862 | ||
3851 | /* | 3863 | /* |
3852 | * Even if power well support was disabled we still want to disable | 3864 | * Even if power well support was disabled we still want to disable |
3853 | * power wells if power domains must be deinitialized for suspend. | 3865 | * power wells if power domains must be deinitialized for suspend. |
3854 | */ | 3866 | */ |
3855 | if (!i915_modparams.disable_power_well) | 3867 | if (!i915_modparams.disable_power_well) { |
3856 | intel_display_power_put(dev_priv, POWER_DOMAIN_INIT); | 3868 | intel_display_power_put(dev_priv, POWER_DOMAIN_INIT); |
3869 | intel_power_domains_verify_state(dev_priv); | ||
3870 | } | ||
3857 | 3871 | ||
3858 | if (IS_ICELAKE(dev_priv)) | 3872 | if (IS_ICELAKE(dev_priv)) |
3859 | icl_display_core_uninit(dev_priv); | 3873 | icl_display_core_uninit(dev_priv); |
@@ -3884,13 +3898,15 @@ void intel_power_domains_resume(struct drm_i915_private *dev_priv) | |||
3884 | if (power_domains->display_core_suspended) { | 3898 | if (power_domains->display_core_suspended) { |
3885 | intel_power_domains_init_hw(dev_priv, true); | 3899 | intel_power_domains_init_hw(dev_priv, true); |
3886 | power_domains->display_core_suspended = false; | 3900 | power_domains->display_core_suspended = false; |
3887 | 3901 | } else { | |
3888 | return; | 3902 | intel_display_power_get(dev_priv, POWER_DOMAIN_INIT); |
3889 | } | 3903 | } |
3890 | 3904 | ||
3891 | intel_display_power_get(dev_priv, POWER_DOMAIN_INIT); | 3905 | intel_power_domains_verify_state(dev_priv); |
3892 | } | 3906 | } |
3893 | 3907 | ||
3908 | #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM) | ||
3909 | |||
3894 | static void intel_power_domains_dump_info(struct drm_i915_private *dev_priv) | 3910 | static void intel_power_domains_dump_info(struct drm_i915_private *dev_priv) |
3895 | { | 3911 | { |
3896 | struct i915_power_domains *power_domains = &dev_priv->power_domains; | 3912 | 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) | |||
3919 | * acquiring reference counts for any power wells in use and disabling the | 3935 | * acquiring reference counts for any power wells in use and disabling the |
3920 | * ones left on by BIOS but not required by any active output. | 3936 | * ones left on by BIOS but not required by any active output. |
3921 | */ | 3937 | */ |
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) |
3923 | { | 3939 | { |
3924 | struct i915_power_domains *power_domains = &dev_priv->power_domains; | 3940 | struct i915_power_domains *power_domains = &dev_priv->power_domains; |
3925 | struct i915_power_well *power_well; | 3941 | struct i915_power_well *power_well; |
@@ -3974,6 +3990,14 @@ void intel_power_domains_verify_state(struct drm_i915_private *dev_priv) | |||
3974 | mutex_unlock(&power_domains->lock); | 3990 | mutex_unlock(&power_domains->lock); |
3975 | } | 3991 | } |
3976 | 3992 | ||
3993 | #else | ||
3994 | |||
3995 | static void intel_power_domains_verify_state(struct drm_i915_private *dev_priv) | ||
3996 | { | ||
3997 | } | ||
3998 | |||
3999 | #endif | ||
4000 | |||
3977 | /** | 4001 | /** |
3978 | * intel_runtime_pm_get - grab a runtime pm reference | 4002 | * intel_runtime_pm_get - grab a runtime pm reference |
3979 | * @dev_priv: i915 device instance | 4003 | * @dev_priv: i915 device instance |