[Intel-gfx] [PATCH 16/23] drm/i915: Program planes in bigjoiner mode.

Ville Syrjälä ville.syrjala at linux.intel.com
Thu Sep 26 13:06:00 UTC 2019


On Fri, Sep 20, 2019 at 01:42:28PM +0200, Maarten Lankhorst wrote:
> Now that we can program planes from the update_slave callback, and
> we have done all fb pinning correctly, it's time to program those
> planes as well.
> 
> We use the update_slave callback as it allows us to use the
> separate states correctly.
> 
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
> ---
>  .../gpu/drm/i915/display/intel_atomic_plane.c | 53 +++++++++++++++++++
>  .../gpu/drm/i915/display/intel_atomic_plane.h |  2 +
>  drivers/gpu/drm/i915/display/intel_display.c  |  4 +-
>  3 files changed, 57 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_atomic_plane.c b/drivers/gpu/drm/i915/display/intel_atomic_plane.c
> index cc088676f0a2..5db091e4ad6a 100644
> --- a/drivers/gpu/drm/i915/display/intel_atomic_plane.c
> +++ b/drivers/gpu/drm/i915/display/intel_atomic_plane.c
> @@ -366,6 +366,59 @@ void skl_update_planes_on_crtc(struct intel_atomic_state *state,
>  	}
>  }
>  
> +void icl_update_bigjoiner_planes_on_crtc(struct intel_atomic_state *state,
> +					 struct intel_crtc *crtc)

This plane stuff is where things go very much off the rails IMO.
Planes should not have to know anything about bigjoiner. They should
just have their appropriate hw state and blindly bash it into the
hardware.

> +{
> +	struct intel_crtc_state *old_crtc_state =
> +		intel_atomic_get_old_crtc_state(state, crtc);
> +	struct intel_crtc_state *new_crtc_state =
> +		intel_atomic_get_new_crtc_state(state, crtc);
> +	struct skl_ddb_entry entries_y[I915_MAX_PLANES];
> +	struct skl_ddb_entry entries_uv[I915_MAX_PLANES];
> +	u32 update_mask = new_crtc_state->update_planes;
> +	struct intel_plane *plane;
> +
> +	memcpy(entries_y, old_crtc_state->wm.skl.plane_ddb_y,
> +	       sizeof(old_crtc_state->wm.skl.plane_ddb_y));
> +	memcpy(entries_uv, old_crtc_state->wm.skl.plane_ddb_uv,
> +	       sizeof(old_crtc_state->wm.skl.plane_ddb_uv));
> +
> +	while ((plane = skl_next_plane_to_commit(state, crtc,
> +						 entries_y, entries_uv,
> +						 &update_mask))) {
> +		struct intel_plane_state *new_plane_state =
> +			intel_atomic_get_new_plane_state(state, plane);
> +		const struct intel_plane_state *master_plane_state;
> +
> +		if (new_plane_state->base.visible) {
> +			master_plane_state =
> +				intel_atomic_get_new_plane_state(state, new_plane_state->bigjoiner_plane);
> +
> +			intel_update_slave(plane, new_crtc_state,
> +					   master_plane_state, new_plane_state);
> +		} else if (new_plane_state->slave) {
> +			/*
> +			 * bigjoiner slave + planar slave.
> +			 * The correct sequence is to get from the planar slave to planar master,
> +			 * then to the master plane state for the master_plane_state.
> +			 */
> +
> +			struct intel_plane *linked = new_plane_state->linked_plane;
> +			const struct intel_plane_state *uv_plane_state =
> +				intel_atomic_get_new_plane_state(state, linked);
> +
> +			linked = uv_plane_state->bigjoiner_plane;
> +			master_plane_state =
> +				intel_atomic_get_new_plane_state(state, linked);
> +
> +			intel_update_slave(plane, new_crtc_state,
> +					   master_plane_state, new_plane_state);
> +		} else {
> +			intel_disable_plane(plane, new_crtc_state);
> +		}
> +	}
> +}
> +
>  void i9xx_update_planes_on_crtc(struct intel_atomic_state *state,
>  				struct intel_crtc *crtc)
>  {
> diff --git a/drivers/gpu/drm/i915/display/intel_atomic_plane.h b/drivers/gpu/drm/i915/display/intel_atomic_plane.h
> index 901a50e6e2d3..1cffda2b50b5 100644
> --- a/drivers/gpu/drm/i915/display/intel_atomic_plane.h
> +++ b/drivers/gpu/drm/i915/display/intel_atomic_plane.h
> @@ -30,6 +30,8 @@ void intel_plane_free(struct intel_plane *plane);
>  struct drm_plane_state *intel_plane_duplicate_state(struct drm_plane *plane);
>  void intel_plane_destroy_state(struct drm_plane *plane,
>  			       struct drm_plane_state *state);
> +void icl_update_bigjoiner_planes_on_crtc(struct intel_atomic_state *state,
> +					 struct intel_crtc *crtc);
>  void skl_update_planes_on_crtc(struct intel_atomic_state *state,
>  			       struct intel_crtc *crtc);
>  void i9xx_update_planes_on_crtc(struct intel_atomic_state *state,
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> index 06ceac4f1436..acb3c5974e99 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -14223,8 +14223,8 @@ static void intel_update_crtc(struct intel_crtc *crtc,
>  
>  	commit_pipe_config(state, old_crtc_state, new_crtc_state);
>  
> -	if (new_crtc_state->bigjoiner)
> -		{/* Not supported yet */}
> +	if (new_crtc_state->bigjoiner_slave)
> +		icl_update_bigjoiner_planes_on_crtc(state, crtc);
>  	else if (INTEL_GEN(dev_priv) >= 9)
>  		skl_update_planes_on_crtc(state, crtc);
>  	else
> -- 
> 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