Re: [PATCH v4 05/13] drm/msm/dpu: move scaling limitations out of the hw_catalog

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

 





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@xxxxxxxxxx>
---
  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);



[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux