Re: [PATCH 02/13] drm/sun4i: vi scaler: Fix coefficient selection

From: Chen-Yu Tsai

Date: Mon Aug 03 2026 - 22:18:13 EST


On Tue, Aug 4, 2026 at 12:11 AM Jernej Skrabec <jernej.skrabec@xxxxxxxxx> wrote:
>
> Currently, vertical coefficients are selected based on horizontal
> scaling, which is wrong. Additionally, chroma coefficients should be
> selected based on format subsampling.
>
> Fix all that.
>
> Fixes: b862a648de3b ("drm/sun4i: Add support for HW scaling to DE2")
> Signed-off-by: Jernej Skrabec <jernej.skrabec@xxxxxxxxx>

Reviewed-by: Chen-Yu Tsai <wens@xxxxxxxxxx>


Somehow having the two fixes together made the diff much harder for me
to understand.

> ---
> drivers/gpu/drm/sun4i/sun8i_vi_scaler.c | 18 ++++++++++++------
> 1 file changed, 12 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/sun4i/sun8i_vi_scaler.c b/drivers/gpu/drm/sun4i/sun8i_vi_scaler.c
> index 3dec4eeb1ba2..d4412a62c2f0 100644
> --- a/drivers/gpu/drm/sun4i/sun8i_vi_scaler.c
> +++ b/drivers/gpu/drm/sun4i/sun8i_vi_scaler.c
> @@ -894,20 +894,26 @@ static void sun8i_vi_scaler_set_coeff(struct regmap *map, u32 base,
> lan3coefftab32_left[offset + i]);
> regmap_write(map, SUN8I_SCALER_VSU_YHCOEFF1(base, i),
> lan3coefftab32_right[offset + i]);
> + }
> + offset = sun8i_vi_scaler_coef_index(vstep) *
> + SUN8I_VI_SCALER_COEFF_COUNT;
> + for (i = 0; i < SUN8I_VI_SCALER_COEFF_COUNT; i++)
> + regmap_write(map, SUN8I_SCALER_VSU_YVCOEFF(base, i),
> + lan2coefftab32[offset + i]);
> +
> + offset = sun8i_vi_scaler_coef_index(hstep / format->hsub) *
> + SUN8I_VI_SCALER_COEFF_COUNT;
> + for (i = 0; i < SUN8I_VI_SCALER_COEFF_COUNT; i++) {
> regmap_write(map, SUN8I_SCALER_VSU_CHCOEFF0(base, i),
> ch_left[offset + i]);
> regmap_write(map, SUN8I_SCALER_VSU_CHCOEFF1(base, i),
> ch_right[offset + i]);
> }
> -
> - offset = sun8i_vi_scaler_coef_index(hstep) *
> + offset = sun8i_vi_scaler_coef_index(vstep / format->vsub) *
> SUN8I_VI_SCALER_COEFF_COUNT;
> - for (i = 0; i < SUN8I_VI_SCALER_COEFF_COUNT; i++) {
> - regmap_write(map, SUN8I_SCALER_VSU_YVCOEFF(base, i),
> - lan2coefftab32[offset + i]);
> + for (i = 0; i < SUN8I_VI_SCALER_COEFF_COUNT; i++)
> regmap_write(map, SUN8I_SCALER_VSU_CVCOEFF(base, i),
> cy[offset + i]);
> - }
> }
>
> void sun8i_vi_scaler_enable(struct sun8i_layer *layer, bool enable)
> --
> 2.43.0
>