RE: [PATCH 2/4] drm/i915/dsb: Plumb dsb into plane scaler functions

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@xxxxxxxxxxxxxxxxxxxxx> On Behalf Of Ville
> Syrjala
> Sent: Wednesday, February 19, 2025 2:29 AM
> To: intel-gfx@xxxxxxxxxxxxxxxxxxxxx
> Cc: intel-xe@xxxxxxxxxxxxxxxxxxxxx
> Subject: [PATCH 2/4] drm/i915/dsb: Plumb dsb into plane scaler functions
> 
> From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx>
> 
> We want to start doing scaler programming (plane scalers only initially) on the
> DSB. To that end plumb the DSB into the relevant places in the scaler code.

Looks Good to me.
Reviewed-by: Uma Shankar <uma.shankar@xxxxxxxxx>

> Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx>
> ---
>  drivers/gpu/drm/i915/display/intel_display.c  |  2 +-
>  drivers/gpu/drm/i915/display/skl_scaler.c     | 60 +++++++++++--------
>  drivers/gpu/drm/i915/display/skl_scaler.h     |  7 ++-
>  .../drm/i915/display/skl_universal_plane.c    |  4 +-
>  4 files changed, 42 insertions(+), 31 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c
> b/drivers/gpu/drm/i915/display/intel_display.c
> index 8d46c092fa4d..826b001a66fa 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -6805,7 +6805,7 @@ static void commit_pipe_post_planes(struct
> intel_atomic_state *state,
>  	 */
>  	if (DISPLAY_VER(dev_priv) >= 9 &&
>  	    !intel_crtc_needs_modeset(new_crtc_state))
> -		skl_detach_scalers(new_crtc_state);
> +		skl_detach_scalers(NULL, new_crtc_state);
> 
>  	if (intel_crtc_vrr_enabling(state, crtc))
>  		intel_vrr_enable(new_crtc_state);
> diff --git a/drivers/gpu/drm/i915/display/skl_scaler.c
> b/drivers/gpu/drm/i915/display/skl_scaler.c
> index 3d24fa773094..ee81220a7c88 100644
> --- a/drivers/gpu/drm/i915/display/skl_scaler.c
> +++ b/drivers/gpu/drm/i915/display/skl_scaler.c
> @@ -666,12 +666,14 @@ static u16 glk_nearest_filter_coef(int t)
>   */
> 
>  static void glk_program_nearest_filter_coefs(struct intel_display *display,
> +					     struct intel_dsb *dsb,
>  					     enum pipe pipe, int id, int set)  {
>  	int i;
> 
> -	intel_de_write_fw(display, GLK_PS_COEF_INDEX_SET(pipe, id, set),
> -			  PS_COEF_INDEX_AUTO_INC);
> +	intel_de_write_dsb(display, dsb,
> +			   GLK_PS_COEF_INDEX_SET(pipe, id, set),
> +			   PS_COEF_INDEX_AUTO_INC);
> 
>  	for (i = 0; i < 17 * 7; i += 2) {
>  		u32 tmp;
> @@ -683,11 +685,12 @@ static void glk_program_nearest_filter_coefs(struct
> intel_display *display,
>  		t = glk_coef_tap(i + 1);
>  		tmp |= glk_nearest_filter_coef(t) << 16;
> 
> -		intel_de_write_fw(display, GLK_PS_COEF_DATA_SET(pipe, id,
> set),
> -				  tmp);
> +		intel_de_write_dsb(display, dsb,
> +				   GLK_PS_COEF_DATA_SET(pipe, id, set), tmp);
>  	}
> 
> -	intel_de_write_fw(display, GLK_PS_COEF_INDEX_SET(pipe, id, set), 0);
> +	intel_de_write_dsb(display, dsb,
> +			   GLK_PS_COEF_INDEX_SET(pipe, id, set), 0);
>  }
> 
>  static u32 skl_scaler_get_filter_select(enum drm_scaling_filter filter, int set) @@
> -703,14 +706,15 @@ static u32 skl_scaler_get_filter_select(enum
> drm_scaling_filter filter, int set)
>  	return PS_FILTER_MEDIUM;
>  }
> 
> -static void skl_scaler_setup_filter(struct intel_display *display, enum pipe pipe,
> +static void skl_scaler_setup_filter(struct intel_display *display,
> +				    struct intel_dsb *dsb, enum pipe pipe,
>  				    int id, int set, enum drm_scaling_filter filter)  {
>  	switch (filter) {
>  	case DRM_SCALING_FILTER_DEFAULT:
>  		break;
>  	case DRM_SCALING_FILTER_NEAREST_NEIGHBOR:
> -		glk_program_nearest_filter_coefs(display, pipe, id, set);
> +		glk_program_nearest_filter_coefs(display, dsb, pipe, id, set);
>  		break;
>  	default:
>  		MISSING_CASE(filter);
> @@ -759,7 +763,7 @@ void skl_pfit_enable(const struct intel_crtc_state
> *crtc_state)
> 
>  	trace_intel_pipe_scaler_update_arm(crtc, id, x, y, width, height);
> 
> -	skl_scaler_setup_filter(display, pipe, id, 0,
> +	skl_scaler_setup_filter(display, NULL, pipe, id, 0,
>  				crtc_state->hw.scaling_filter);
> 
>  	intel_de_write_fw(display, SKL_PS_CTRL(pipe, id), ps_ctrl); @@ -775,7
> +779,8 @@ void skl_pfit_enable(const struct intel_crtc_state *crtc_state)  }
> 
>  void
> -skl_program_plane_scaler(struct intel_plane *plane,
> +skl_program_plane_scaler(struct intel_dsb *dsb,
> +			 struct intel_plane *plane,
>  			 const struct intel_crtc_state *crtc_state,
>  			 const struct intel_plane_state *plane_state)  { @@ -
> 825,35 +830,38 @@ skl_program_plane_scaler(struct intel_plane *plane,
>  	trace_intel_plane_scaler_update_arm(plane, scaler_id,
>  					    crtc_x, crtc_y, crtc_w, crtc_h);
> 
> -	skl_scaler_setup_filter(display, pipe, scaler_id, 0,
> +	skl_scaler_setup_filter(display, dsb, pipe, scaler_id, 0,
>  				plane_state->hw.scaling_filter);
> 
> -	intel_de_write_fw(display, SKL_PS_CTRL(pipe, scaler_id), ps_ctrl);
> -	intel_de_write_fw(display, SKL_PS_VPHASE(pipe, scaler_id),
> -			  PS_Y_PHASE(y_vphase) |
> PS_UV_RGB_PHASE(uv_rgb_vphase));
> -	intel_de_write_fw(display, SKL_PS_HPHASE(pipe, scaler_id),
> -			  PS_Y_PHASE(y_hphase) |
> PS_UV_RGB_PHASE(uv_rgb_hphase));
> -	intel_de_write_fw(display, SKL_PS_WIN_POS(pipe, scaler_id),
> -			  PS_WIN_XPOS(crtc_x) | PS_WIN_YPOS(crtc_y));
> -	intel_de_write_fw(display, SKL_PS_WIN_SZ(pipe, scaler_id),
> -			  PS_WIN_XSIZE(crtc_w) | PS_WIN_YSIZE(crtc_h));
> +	intel_de_write_dsb(display, dsb, SKL_PS_CTRL(pipe, scaler_id),
> +			   ps_ctrl);
> +	intel_de_write_dsb(display, dsb, SKL_PS_VPHASE(pipe, scaler_id),
> +			   PS_Y_PHASE(y_vphase) |
> PS_UV_RGB_PHASE(uv_rgb_vphase));
> +	intel_de_write_dsb(display, dsb, SKL_PS_HPHASE(pipe, scaler_id),
> +			   PS_Y_PHASE(y_hphase) |
> PS_UV_RGB_PHASE(uv_rgb_hphase));
> +	intel_de_write_dsb(display, dsb, SKL_PS_WIN_POS(pipe, scaler_id),
> +			   PS_WIN_XPOS(crtc_x) | PS_WIN_YPOS(crtc_y));
> +	intel_de_write_dsb(display, dsb, SKL_PS_WIN_SZ(pipe, scaler_id),
> +			   PS_WIN_XSIZE(crtc_w) | PS_WIN_YSIZE(crtc_h));
>  }
> 
> -static void skl_detach_scaler(struct intel_crtc *crtc, int id)
> +static void skl_detach_scaler(struct intel_dsb *dsb,
> +			      struct intel_crtc *crtc, int id)
>  {
>  	struct intel_display *display = to_intel_display(crtc);
> 
>  	trace_intel_scaler_disable_arm(crtc, id);
> 
> -	intel_de_write_fw(display, SKL_PS_CTRL(crtc->pipe, id), 0);
> -	intel_de_write_fw(display, SKL_PS_WIN_POS(crtc->pipe, id), 0);
> -	intel_de_write_fw(display, SKL_PS_WIN_SZ(crtc->pipe, id), 0);
> +	intel_de_write_dsb(display, dsb, SKL_PS_CTRL(crtc->pipe, id), 0);
> +	intel_de_write_dsb(display, dsb, SKL_PS_WIN_POS(crtc->pipe, id), 0);
> +	intel_de_write_dsb(display, dsb, SKL_PS_WIN_SZ(crtc->pipe, id), 0);
>  }
> 
>  /*
>   * This function detaches (aka. unbinds) unused scalers in hardware
>   */
> -void skl_detach_scalers(const struct intel_crtc_state *crtc_state)
> +void skl_detach_scalers(struct intel_dsb *dsb,
> +			const struct intel_crtc_state *crtc_state)
>  {
>  	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
>  	const struct intel_crtc_scaler_state *scaler_state = @@ -863,7 +871,7
> @@ void skl_detach_scalers(const struct intel_crtc_state *crtc_state)
>  	/* loop through and disable scalers that aren't in use */
>  	for (i = 0; i < crtc->num_scalers; i++) {
>  		if (!scaler_state->scalers[i].in_use)
> -			skl_detach_scaler(crtc, i);
> +			skl_detach_scaler(dsb, crtc, i);
>  	}
>  }
> 
> @@ -873,7 +881,7 @@ void skl_scaler_disable(const struct intel_crtc_state
> *old_crtc_state)
>  	int i;
> 
>  	for (i = 0; i < crtc->num_scalers; i++)
> -		skl_detach_scaler(crtc, i);
> +		skl_detach_scaler(NULL, crtc, i);
>  }
> 
>  void skl_scaler_get_config(struct intel_crtc_state *crtc_state) diff --git
> a/drivers/gpu/drm/i915/display/skl_scaler.h
> b/drivers/gpu/drm/i915/display/skl_scaler.h
> index 4d2e2dbb1666..355ea15260ca 100644
> --- a/drivers/gpu/drm/i915/display/skl_scaler.h
> +++ b/drivers/gpu/drm/i915/display/skl_scaler.h
> @@ -8,6 +8,7 @@
>  struct intel_atomic_state;
>  struct intel_crtc;
>  struct intel_crtc_state;
> +struct intel_dsb;
>  struct intel_plane;
>  struct intel_plane_state;
> 
> @@ -21,10 +22,12 @@ int intel_atomic_setup_scalers(struct intel_atomic_state
> *state,
> 
>  void skl_pfit_enable(const struct intel_crtc_state *crtc_state);
> 
> -void skl_program_plane_scaler(struct intel_plane *plane,
> +void skl_program_plane_scaler(struct intel_dsb *dsb,
> +			      struct intel_plane *plane,
>  			      const struct intel_crtc_state *crtc_state,
>  			      const struct intel_plane_state *plane_state); -void
> skl_detach_scalers(const struct intel_crtc_state *crtc_state);
> +void skl_detach_scalers(struct intel_dsb *dsb,
> +			const struct intel_crtc_state *crtc_state);
>  void skl_scaler_disable(const struct intel_crtc_state *old_crtc_state);
> 
>  void skl_scaler_get_config(struct intel_crtc_state *crtc_state); diff --git
> a/drivers/gpu/drm/i915/display/skl_universal_plane.c
> b/drivers/gpu/drm/i915/display/skl_universal_plane.c
> index cd9762947f1d..3488c7ae6d8a 100644
> --- a/drivers/gpu/drm/i915/display/skl_universal_plane.c
> +++ b/drivers/gpu/drm/i915/display/skl_universal_plane.c
> @@ -1466,7 +1466,7 @@ skl_plane_update_arm(struct intel_dsb *dsb,
>  	 * TODO: split into noarm+arm pair
>  	 */
>  	if (plane_state->scaler_id >= 0)
> -		skl_program_plane_scaler(plane, crtc_state, plane_state);
> +		skl_program_plane_scaler(dsb, plane, crtc_state, plane_state);
> 
>  	/*
>  	 * The control register self-arms if the plane was previously @@ -1646,7
> +1646,7 @@ icl_plane_update_arm(struct intel_dsb *dsb,
>  	 * TODO: split into noarm+arm pair
>  	 */
>  	if (plane_state->scaler_id >= 0)
> -		skl_program_plane_scaler(plane, crtc_state, plane_state);
> +		skl_program_plane_scaler(dsb, plane, crtc_state, plane_state);
> 
>  	icl_plane_update_sel_fetch_arm(dsb, plane, crtc_state, plane_state);
> 
> --
> 2.45.3





[Index of Archives]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux