[Intel-gfx] [PATCH 5/9] drm/i915: Pass intel state to plane functions as well

Ville Syrjälä ville.syrjala at linux.intel.com
Mon Jun 24 16:01:22 UTC 2019


On Thu, Jun 20, 2019 at 11:46:09PM +0200, Maarten Lankhorst wrote:
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
> ---
>  .../gpu/drm/i915/display/intel_atomic_plane.c | 39 +++++++------
>  .../gpu/drm/i915/display/intel_atomic_plane.h |  5 +-
>  drivers/gpu/drm/i915/display/intel_display.c  | 58 +++++++++----------
>  3 files changed, 49 insertions(+), 53 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_atomic_plane.c b/drivers/gpu/drm/i915/display/intel_atomic_plane.c
> index 30bd4e76fff9..025c09461c9a 100644
> --- a/drivers/gpu/drm/i915/display/intel_atomic_plane.c
> +++ b/drivers/gpu/drm/i915/display/intel_atomic_plane.c
> @@ -176,33 +176,36 @@ int intel_plane_atomic_check_with_state(const struct intel_crtc_state *old_crtc_
>  	new_crtc_state->data_rate[plane->id] =
>  		intel_plane_data_rate(new_crtc_state, new_plane_state);
>  
> -	return intel_plane_atomic_calc_changes(old_crtc_state,
> -					       &new_crtc_state->base,
> -					       old_plane_state,
> -					       &new_plane_state->base);
> +	return intel_plane_atomic_calc_changes(old_crtc_state, new_crtc_state,
> +					       old_plane_state, new_plane_state);
>  }
>  
>  static int intel_plane_atomic_check(struct drm_plane *plane,
>  				    struct drm_plane_state *new_plane_state)
>  {
> -	struct drm_atomic_state *state = new_plane_state->state;
> -	const struct drm_plane_state *old_plane_state =
> -		drm_atomic_get_old_plane_state(state, plane);
> -	struct drm_crtc *crtc = new_plane_state->crtc ?: old_plane_state->crtc;
> -	const struct drm_crtc_state *old_crtc_state;
> -	struct drm_crtc_state *new_crtc_state;
> -
> -	new_plane_state->visible = false;
> +	struct intel_atomic_state *state =
> +		to_intel_atomic_state(new_plane_state->state);
> +	const struct intel_plane_state *old_intel_plane_state =
> +		intel_atomic_get_old_plane_state(state, to_intel_plane(plane));
> +	struct intel_plane_state *new_intel_plane_state =
> +		to_intel_plane_state(new_plane_state);

I think we should do the _new_plane_state trick for the function
arguments and then use the non-underscore names for the intel types.

> +	struct drm_crtc *crtc =
> +		new_intel_plane_state->base.crtc ?: old_intel_plane_state->base.crtc;
> +	struct intel_crtc *intel_crtc = crtc ? to_intel_crtc(crtc) : NULL;

?: not needed. I also dislike the crtc vs. intel_crc thing. Maybe
extract this mess into a small function that just returns the
intel_crtc we want?

Reviewed-by: Ville Syrjälä <ville.syrjala at linux.intel.com>

> +	const struct intel_crtc_state *old_crtc_state;
> +	struct intel_crtc_state *new_crtc_state;
> +
> +	new_intel_plane_state->base.visible = false;
>  	if (!crtc)
>  		return 0;
>  
> -	old_crtc_state = drm_atomic_get_old_crtc_state(state, crtc);
> -	new_crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
> +	old_crtc_state = intel_atomic_get_old_crtc_state(state, intel_crtc);
> +	new_crtc_state = intel_atomic_get_new_crtc_state(state, intel_crtc);
>  
> -	return intel_plane_atomic_check_with_state(to_intel_crtc_state(old_crtc_state),
> -						   to_intel_crtc_state(new_crtc_state),
> -						   to_intel_plane_state(old_plane_state),
> -						   to_intel_plane_state(new_plane_state));
> +	return intel_plane_atomic_check_with_state(old_crtc_state,
> +						   new_crtc_state,
> +						   old_intel_plane_state,
> +						   new_intel_plane_state);
>  }
>  
>  static struct intel_plane *
> diff --git a/drivers/gpu/drm/i915/display/intel_atomic_plane.h b/drivers/gpu/drm/i915/display/intel_atomic_plane.h
> index 1437a8797e10..cb7ef4f9eafd 100644
> --- a/drivers/gpu/drm/i915/display/intel_atomic_plane.h
> +++ b/drivers/gpu/drm/i915/display/intel_atomic_plane.h
> @@ -8,7 +8,6 @@
>  
>  #include <linux/types.h>
>  
> -struct drm_crtc_state;
>  struct drm_plane;
>  struct drm_property;
>  struct intel_atomic_state;
> @@ -43,8 +42,8 @@ int intel_plane_atomic_check_with_state(const struct intel_crtc_state *old_crtc_
>  					const struct intel_plane_state *old_plane_state,
>  					struct intel_plane_state *intel_state);
>  int intel_plane_atomic_calc_changes(const struct intel_crtc_state *old_crtc_state,
> -				    struct drm_crtc_state *crtc_state,
> +				    struct intel_crtc_state *crtc_state,
>  				    const struct intel_plane_state *old_plane_state,
> -				    struct drm_plane_state *plane_state);
> +				    struct intel_plane_state *plane_state);
>  
>  #endif /* __INTEL_ATOMIC_PLANE_H__ */
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> index baa0e1957ffe..5c1db1d3d12b 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -11286,7 +11286,7 @@ static void intel_crtc_destroy(struct drm_crtc *crtc)
>   *
>   * Returns true or false.
>   */
> -static bool intel_wm_need_update(struct intel_plane_state *cur,
> +static bool intel_wm_need_update(const struct intel_plane_state *cur,
>  				 struct intel_plane_state *new)
>  {
>  	/* Update watermarks on tiling or size changes. */
> @@ -11318,33 +11318,28 @@ static bool needs_scaling(const struct intel_plane_state *state)
>  }
>  
>  int intel_plane_atomic_calc_changes(const struct intel_crtc_state *old_crtc_state,
> -				    struct drm_crtc_state *crtc_state,
> +				    struct intel_crtc_state *crtc_state,
>  				    const struct intel_plane_state *old_plane_state,
> -				    struct drm_plane_state *plane_state)
> +				    struct intel_plane_state *plane_state)
>  {
> -	struct intel_crtc_state *pipe_config = to_intel_crtc_state(crtc_state);
> -	struct drm_crtc *crtc = crtc_state->crtc;
> -	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> -	struct intel_plane *plane = to_intel_plane(plane_state->plane);
> -	struct drm_device *dev = crtc->dev;
> -	struct drm_i915_private *dev_priv = to_i915(dev);
> -	bool mode_changed = needs_modeset(pipe_config);
> +	struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
> +	struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
> +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> +	bool mode_changed = needs_modeset(crtc_state);
>  	bool was_crtc_enabled = old_crtc_state->base.active;
> -	bool is_crtc_enabled = crtc_state->active;
> +	bool is_crtc_enabled = crtc_state->base.active;
>  	bool turn_off, turn_on, visible, was_visible;
> -	struct drm_framebuffer *fb = plane_state->fb;
> +	struct drm_framebuffer *fb = plane_state->base.fb;
>  	int ret;
>  
>  	if (INTEL_GEN(dev_priv) >= 9 && plane->id != PLANE_CURSOR) {
> -		ret = skl_update_scaler_plane(
> -			to_intel_crtc_state(crtc_state),
> -			to_intel_plane_state(plane_state));
> +		ret = skl_update_scaler_plane(crtc_state, plane_state);
>  		if (ret)
>  			return ret;
>  	}
>  
>  	was_visible = old_plane_state->base.visible;
> -	visible = plane_state->visible;
> +	visible = plane_state->base.visible;
>  
>  	if (!was_crtc_enabled && WARN_ON(was_visible))
>  		was_visible = false;
> @@ -11360,22 +11355,22 @@ int intel_plane_atomic_calc_changes(const struct intel_crtc_state *old_crtc_stat
>  	 * only combine the results from all planes in the current place?
>  	 */
>  	if (!is_crtc_enabled) {
> -		plane_state->visible = visible = false;
> -		to_intel_crtc_state(crtc_state)->active_planes &= ~BIT(plane->id);
> -		to_intel_crtc_state(crtc_state)->data_rate[plane->id] = 0;
> +		plane_state->base.visible = visible = false;
> +		crtc_state->active_planes &= ~BIT(plane->id);
> +		crtc_state->data_rate[plane->id] = 0;
>  	}
>  
>  	if (!was_visible && !visible)
>  		return 0;
>  
>  	if (fb != old_plane_state->base.fb)
> -		pipe_config->fb_changed = true;
> +		crtc_state->fb_changed = true;
>  
>  	turn_off = was_visible && (!visible || mode_changed);
>  	turn_on = visible && (!was_visible || mode_changed);
>  
>  	DRM_DEBUG_ATOMIC("[CRTC:%d:%s] has [PLANE:%d:%s] with fb %i\n",
> -			 intel_crtc->base.base.id, intel_crtc->base.name,
> +			 crtc->base.base.id, crtc->base.name,
>  			 plane->base.base.id, plane->base.name,
>  			 fb ? fb->base.id : -1);
>  
> @@ -11386,29 +11381,28 @@ int intel_plane_atomic_calc_changes(const struct intel_crtc_state *old_crtc_stat
>  
>  	if (turn_on) {
>  		if (INTEL_GEN(dev_priv) < 5 && !IS_G4X(dev_priv))
> -			pipe_config->update_wm_pre = true;
> +			crtc_state->update_wm_pre = true;
>  
>  		/* must disable cxsr around plane enable/disable */
>  		if (plane->id != PLANE_CURSOR)
> -			pipe_config->disable_cxsr = true;
> +			crtc_state->disable_cxsr = true;
>  	} else if (turn_off) {
>  		if (INTEL_GEN(dev_priv) < 5 && !IS_G4X(dev_priv))
> -			pipe_config->update_wm_post = true;
> +			crtc_state->update_wm_post = true;
>  
>  		/* must disable cxsr around plane enable/disable */
>  		if (plane->id != PLANE_CURSOR)
> -			pipe_config->disable_cxsr = true;
> -	} else if (intel_wm_need_update(to_intel_plane_state(plane->base.state),
> -					to_intel_plane_state(plane_state))) {
> +			crtc_state->disable_cxsr = true;
> +	} else if (intel_wm_need_update(old_plane_state, plane_state)) {
>  		if (INTEL_GEN(dev_priv) < 5 && !IS_G4X(dev_priv)) {
>  			/* FIXME bollocks */
> -			pipe_config->update_wm_pre = true;
> -			pipe_config->update_wm_post = true;
> +			crtc_state->update_wm_pre = true;
> +			crtc_state->update_wm_post = true;
>  		}
>  	}
>  
>  	if (visible || was_visible)
> -		pipe_config->fb_bits |= plane->frontbuffer_bit;
> +		crtc_state->fb_bits |= plane->frontbuffer_bit;
>  
>  	/*
>  	 * ILK/SNB DVSACNTR/Sprite Enable
> @@ -11447,8 +11441,8 @@ int intel_plane_atomic_calc_changes(const struct intel_crtc_state *old_crtc_stat
>  	    (IS_GEN_RANGE(dev_priv, 5, 6) ||
>  	     IS_IVYBRIDGE(dev_priv)) &&
>  	    (turn_on || (!needs_scaling(old_plane_state) &&
> -			 needs_scaling(to_intel_plane_state(plane_state)))))
> -		pipe_config->disable_lp_wm = true;
> +			 needs_scaling(plane_state))))
> +		crtc_state->disable_lp_wm = true;
>  
>  	return 0;
>  }
> -- 
> 2.20.1
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Ville Syrjälä
Intel


More information about the Intel-gfx mailing list