[PATCH v4 05/13] drm/msm/dpu: move scaling limitations out of the hw_catalog
Abhinav Kumar
quic_abhinavk at quicinc.com
Fri May 31 01:02:34 UTC 2024
On 3/13/2024 5:02 PM, Dmitry Baryshkov wrote:
> Max upscale / downscale factors are constant between platforms. In
> preparation to adding support for virtual planes and allocating SSPP
> blocks on demand move max scaling factors out of the HW catalog and
> handle them in the dpu_plane directly. If any of the scaling blocks gets
> different limitations, this will have to be handled separately, after
> the plane refactoring.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov at linaro.org>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c | 12 ------------
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h | 4 ----
> drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 16 +++++++++++++---
> 3 files changed, 13 insertions(+), 19 deletions(-)
>
<Snip>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> index 70d6a8989e1a..6360052523b5 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> @@ -785,12 +785,15 @@ static int dpu_plane_atomic_check_pipe(struct dpu_plane *pdpu,
> return 0;
> }
>
> +#define MAX_UPSCALE_RATIO 20
> +#define MAX_DOWNSCALE_RATIO 4
> +
> static int dpu_plane_atomic_check(struct drm_plane *plane,
> struct drm_atomic_state *state)
> {
> struct drm_plane_state *new_plane_state = drm_atomic_get_new_plane_state(state,
> plane);
> - int ret = 0, min_scale;
> + int ret = 0, min_scale, max_scale;
> struct dpu_plane *pdpu = to_dpu_plane(plane);
> struct dpu_kms *kms = _dpu_plane_get_kms(&pdpu->base);
> u64 max_mdp_clk_rate = kms->perf.max_core_clk_rate;
> @@ -822,10 +825,17 @@ static int dpu_plane_atomic_check(struct drm_plane *plane,
> pipe_hw_caps = pipe->sspp->cap;
> sblk = pipe->sspp->cap->sblk;
>
> - min_scale = FRAC_16_16(1, sblk->maxupscale);
> + if (sblk->scaler_blk.len) {
> + min_scale = FRAC_16_16(1, MAX_UPSCALE_RATIO);
> + max_scale = MAX_DOWNSCALE_RATIO << 16;
> + } else {
> + min_scale = 1 << 16;
> + max_scale = 1 << 16;
You can use DRM_PLANE_NO_SCALING instead.
> + }
> +
> ret = drm_atomic_helper_check_plane_state(new_plane_state, crtc_state,
> min_scale,
> - sblk->maxdwnscale << 16,
> + max_scale,
> true, true);
I am missing something here.
As per the documentation of this API, min and max are the scaling limits
of both directions and not max_upscale and max_downscale.
**
837 * drm_atomic_helper_check_plane_state() - Check plane state for
validity
838 * @plane_state: plane state to check
839 * @crtc_state: CRTC state to check
840 * @min_scale: minimum @src:@dest scaling factor in 16.16 fixed point
841 * @max_scale: maximum @src:@dest scaling factor in 16.16 fixed point
842 * @can_position: is it legal to position the plane such that it
But this change is passing max_upscale and max_downscale as the min and
max resp. Isnt that wrong?
> if (ret) {
> DPU_DEBUG_PLANE(pdpu, "Check plane state failed (%d)\n", ret);
More information about the dri-devel
mailing list