[PATCH 2/4] drm/i915/dsb: Plumb dsb into plane scaler functions
Shankar, Uma
uma.shankar at intel.com
Mon Feb 24 05:55:33 UTC 2025
> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces at lists.freedesktop.org> On Behalf Of Ville
> Syrjala
> Sent: Wednesday, February 19, 2025 2:29 AM
> To: intel-gfx at lists.freedesktop.org
> Cc: intel-xe at lists.freedesktop.org
> Subject: [PATCH 2/4] drm/i915/dsb: Plumb dsb into plane scaler functions
>
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> 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 at intel.com>
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
> 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
More information about the Intel-gfx
mailing list