[Intel-gfx] [PATCH 17/17] drm/i915: Store active_pipes bitmask in cdclk state

Imre Deak imre.deak at intel.com
Mon Jan 27 17:11:24 UTC 2020


On Mon, Jan 20, 2020 at 07:47:28PM +0200, Ville Syrjala wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
> 
> Let's add a copy of the active_pipes bitmask into the cdclk_state.
> While this is duplicating a bit of information we may already
> have elsewhere, I think it's worth it to decopule the cdclk stuff
> from whatever else wants to use that bitmask. Also we want to get
> rid of all the old ad-hoc global state which is what the current
> bitmask is, so this removes one obstacle.
> 
> The one extra thing we have to remember is write locking the cdclk
> state whenever the bitmask changes.
> 
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>

Reviewed-by: Imre Deak <imre.deak at intel.com>

> ---
>  drivers/gpu/drm/i915/display/intel_cdclk.c   | 20 +++++++++++---------
>  drivers/gpu/drm/i915/display/intel_cdclk.h   |  3 +++
>  drivers/gpu/drm/i915/display/intel_display.c |  8 +++++---
>  3 files changed, 19 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_cdclk.c b/drivers/gpu/drm/i915/display/intel_cdclk.c
> index e14bda2bec71..f8e4510f4bd9 100644
> --- a/drivers/gpu/drm/i915/display/intel_cdclk.c
> +++ b/drivers/gpu/drm/i915/display/intel_cdclk.c
> @@ -2125,7 +2125,7 @@ static int vlv_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
>  	cdclk_state->logical.voltage_level =
>  		vlv_calc_voltage_level(dev_priv, cdclk);
>  
> -	if (!state->active_pipes) {
> +	if (!cdclk_state->active_pipes) {
>  		cdclk = vlv_calc_cdclk(dev_priv, cdclk_state->force_min_cdclk);
>  
>  		cdclk_state->actual.cdclk = cdclk;
> @@ -2140,7 +2140,6 @@ static int vlv_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
>  
>  static int bdw_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
>  {
> -	struct intel_atomic_state *state = cdclk_state->base.state;
>  	int min_cdclk, cdclk;
>  
>  	min_cdclk = intel_compute_min_cdclk(cdclk_state);
> @@ -2157,7 +2156,7 @@ static int bdw_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
>  	cdclk_state->logical.voltage_level =
>  		bdw_calc_voltage_level(cdclk);
>  
> -	if (!state->active_pipes) {
> +	if (!cdclk_state->active_pipes) {
>  		cdclk = bdw_calc_cdclk(cdclk_state->force_min_cdclk);
>  
>  		cdclk_state->actual.cdclk = cdclk;
> @@ -2209,7 +2208,6 @@ static int skl_dpll0_vco(struct intel_cdclk_state *cdclk_state)
>  
>  static int skl_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
>  {
> -	struct intel_atomic_state *state = cdclk_state->base.state;
>  	int min_cdclk, cdclk, vco;
>  
>  	min_cdclk = intel_compute_min_cdclk(cdclk_state);
> @@ -2229,7 +2227,7 @@ static int skl_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
>  	cdclk_state->logical.voltage_level =
>  		skl_calc_voltage_level(cdclk);
>  
> -	if (!state->active_pipes) {
> +	if (!cdclk_state->active_pipes) {
>  		cdclk = skl_calc_cdclk(cdclk_state->force_min_cdclk, vco);
>  
>  		cdclk_state->actual.vco = vco;
> @@ -2266,7 +2264,7 @@ static int bxt_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
>  		max_t(int, min_voltage_level,
>  		      dev_priv->display.calc_voltage_level(cdclk));
>  
> -	if (!state->active_pipes) {
> +	if (!cdclk_state->active_pipes) {
>  		cdclk = bxt_calc_cdclk(dev_priv, cdclk_state->force_min_cdclk);
>  		vco = bxt_calc_cdclk_pll_vco(dev_priv, cdclk);
>  
> @@ -2402,6 +2400,9 @@ int intel_modeset_calc_cdclk(struct intel_atomic_state *state)
>  
>  	old_cdclk_state = intel_atomic_get_old_cdclk_state(state);
>  
> +	new_cdclk_state->active_pipes =
> +		intel_calc_active_pipes(state, old_cdclk_state->active_pipes);
> +
>  	ret = dev_priv->display.modeset_calc_cdclk(new_cdclk_state);
>  	if (ret)
>  		return ret;
> @@ -2415,7 +2416,8 @@ int intel_modeset_calc_cdclk(struct intel_atomic_state *state)
>  		ret = intel_atomic_serialize_global_state(&new_cdclk_state->base);
>  		if (ret)
>  			return ret;
> -	} else if (intel_cdclk_changed(&old_cdclk_state->logical,
> +	} else if (old_cdclk_state->active_pipes != new_cdclk_state->active_pipes ||
> +		   intel_cdclk_changed(&old_cdclk_state->logical,
>  				       &new_cdclk_state->logical)) {
>  		ret = intel_atomic_lock_global_state(&new_cdclk_state->base);
>  		if (ret)
> @@ -2424,14 +2426,14 @@ int intel_modeset_calc_cdclk(struct intel_atomic_state *state)
>  		return 0;
>  	}
>  
> -	if (is_power_of_2(state->active_pipes) &&
> +	if (is_power_of_2(new_cdclk_state->active_pipes) &&
>  	    intel_cdclk_can_cd2x_update(dev_priv,
>  					&old_cdclk_state->actual,
>  					&new_cdclk_state->actual)) {
>  		struct intel_crtc *crtc;
>  		struct intel_crtc_state *crtc_state;
>  
> -		pipe = ilog2(state->active_pipes);
> +		pipe = ilog2(new_cdclk_state->active_pipes);
>  		crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
>  
>  		crtc_state = intel_atomic_get_crtc_state(&state->base, crtc);
> diff --git a/drivers/gpu/drm/i915/display/intel_cdclk.h b/drivers/gpu/drm/i915/display/intel_cdclk.h
> index 195fca70bfcb..df21dbdcc575 100644
> --- a/drivers/gpu/drm/i915/display/intel_cdclk.h
> +++ b/drivers/gpu/drm/i915/display/intel_cdclk.h
> @@ -50,6 +50,9 @@ struct intel_cdclk_state {
>  	/* forced minimum cdclk for glk+ audio w/a */
>  	int force_min_cdclk;
>  	bool force_min_cdclk_changed;
> +
> +	/* bitmask of active pipes */
> +	u8 active_pipes;
>  };
>  
>  int intel_crtc_compute_min_cdclk(const struct intel_crtc_state *crtc_state);
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> index dca100546be8..27878c484307 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -7551,6 +7551,7 @@ static void intel_crtc_disable_noatomic(struct intel_crtc *crtc,
>  	dev_priv->active_pipes &= ~BIT(pipe);
>  	cdclk_state->min_cdclk[pipe] = 0;
>  	cdclk_state->min_voltage_level[pipe] = 0;
> +	cdclk_state->active_pipes &= ~BIT(pipe);
>  
>  	bw_state->data_rate[pipe] = 0;
>  	bw_state->num_active_planes[pipe] = 0;
> @@ -18120,10 +18121,9 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev)
>  	struct intel_encoder *encoder;
>  	struct intel_connector *connector;
>  	struct drm_connector_list_iter conn_iter;
> +	u8 active_pipes = 0;
>  	int i;
>  
> -	dev_priv->active_pipes = 0;
> -
>  	for_each_intel_crtc(dev, crtc) {
>  		struct intel_crtc_state *crtc_state =
>  			to_intel_crtc_state(crtc->base.state);
> @@ -18139,13 +18139,15 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev)
>  		crtc->active = crtc_state->hw.active;
>  
>  		if (crtc_state->hw.active)
> -			dev_priv->active_pipes |= BIT(crtc->pipe);
> +			active_pipes |= BIT(crtc->pipe);
>  
>  		DRM_DEBUG_KMS("[CRTC:%d:%s] hw state readout: %s\n",
>  			      crtc->base.base.id, crtc->base.name,
>  			      enableddisabled(crtc_state->hw.active));
>  	}
>  
> +	dev_priv->active_pipes = cdclk_state->active_pipes = active_pipes;
> +
>  	readout_plane_state(dev_priv);
>  
>  	for (i = 0; i < dev_priv->num_shared_dpll; i++) {
> -- 
> 2.24.1
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx


More information about the Intel-gfx mailing list