[Intel-gfx] [PATCH 66/66] drm/i915: runtime PM support for DPMS

Daniel Vetter daniel at ffwll.ch
Mon Jun 2 18:09:38 CEST 2014


On Thu, Apr 24, 2014 at 11:55:42PM +0200, Daniel Vetter wrote:
> Keeping track of the power domains is a bit messy since crtc->active
> is currently updated by the platform hooks, but we need to be aware of
> which state transition exactly is going on. Maybe we simply need to
> shovel all the power domain handling down into platform code to
> simplify this. But doing that requires some more auditing since
> currently the ->mode_set callbacks still read some random registers
> (to e.g. figure out the reference clocks).
> 
> Also note that intel_crtc_update_dpms is always call first/last even
> for encoders which have their own dpms functions. Hence we really only
> need to update this place here.
> 
> Being a quick "does it blow up?" run not really tested yet.
> 
> Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

Ok, I've simply gone ahead and merged this with a !HAS_DDI check so that I
can unblock runtime pm for dpms.
-Daniel

> ---
>  drivers/gpu/drm/i915/intel_display.c | 26 ++++++++++++++++++++++----
>  1 file changed, 22 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index e0bd0f94e43e..1b5d6b099b37 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -4478,16 +4478,34 @@ void intel_crtc_update_dpms(struct drm_crtc *crtc)
>  {
>  	struct drm_device *dev = crtc->dev;
>  	struct drm_i915_private *dev_priv = dev->dev_private;
> +	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
>  	struct intel_encoder *intel_encoder;
> +	enum intel_display_power_domain domain;
> +	unsigned long domains;
>  	bool enable = false;
>  
>  	for_each_encoder_on_crtc(dev, crtc, intel_encoder)
>  		enable |= intel_encoder->connectors_active;
>  
> -	if (enable)
> -		dev_priv->display.crtc_enable(crtc);
> -	else
> -		dev_priv->display.crtc_disable(crtc);
> +	if (enable) {
> +		if (!intel_crtc->active) {
> +			domains = get_crtc_power_domains(crtc);
> +			for_each_power_domain(domain, domains)
> +				intel_display_power_get(dev_priv, domain);
> +			intel_crtc->enabled_power_domains = domains;
> +
> +			dev_priv->display.crtc_enable(crtc);
> +		}
> +	} else {
> +		if (intel_crtc->active) {
> +			dev_priv->display.crtc_disable(crtc);
> +
> +			domains = intel_crtc->enabled_power_domains;
> +			for_each_power_domain(domain, domains)
> +				intel_display_power_put(dev_priv, domain);
> +			intel_crtc->enabled_power_domains = 0;
> +		}
> +	}
>  
>  	intel_crtc_update_sarea(crtc, enable);
>  }
> -- 
> 1.8.1.4
> 

-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch



More information about the Intel-gfx mailing list