]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/msm/dpu: fix UV scanlines calculation for YUV UBWC formats
authorNeil Armstrong <neil.armstrong@linaro.org>
Tue, 14 Apr 2026 15:14:30 +0000 (17:14 +0200)
committerDmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Wed, 13 May 2026 13:15:28 +0000 (16:15 +0300)
The UV scanlines is calculated with (height + 1) / 2 unlike
the Y scanlines, add back the correct scanlines calculation
for UBWC YUV formats.

Fixes: 2f3ff6ab8f5c ("drm/msm/dpu: use standard functions in _dpu_format_populate_plane_sizes_ubwc()")
Fixes: ada4a19ed21c ("drm/msm/dpu: rewrite _dpu_format_populate_plane_sizes_ubwc()")
Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Patchwork: https://patchwork.freedesktop.org/patch/718309/
Link: https://lore.kernel.org/r/20260414-topic-sm8x50-msm-dpu1-formats-qc10c-v1-1-0b62325b9030@linaro.org
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
drivers/gpu/drm/msm/disp/dpu1/dpu_formats.c

index 6e8883dbfad439a3b3f07b6fe9337820048fc2eb..590922c4f69bf9311e7787d2500386788da084bb 100644 (file)
@@ -61,7 +61,7 @@ static int _dpu_format_populate_plane_sizes_ubwc(
        bool meta = MSM_FORMAT_IS_UBWC(fmt);
 
        if (MSM_FORMAT_IS_YUV(fmt)) {
-               unsigned int stride, sclines;
+               unsigned int stride, y_sclines, uv_sclines;
                unsigned int y_tile_width, y_tile_height;
                unsigned int y_meta_stride, y_meta_scanlines;
                unsigned int uv_meta_stride, uv_meta_scanlines;
@@ -77,23 +77,25 @@ static int _dpu_format_populate_plane_sizes_ubwc(
                                y_tile_width = 32;
                        }
 
-                       sclines = round_up(fb->height, 16);
+                       y_sclines = round_up(fb->height, 16);
+                       uv_sclines = round_up((fb->height+1)>>1, 16);
                        y_tile_height = 4;
                } else {
                        stride = round_up(fb->width, 128);
                        y_tile_width = 32;
 
-                       sclines = round_up(fb->height, 32);
+                       y_sclines = round_up(fb->height, 32);
+                       uv_sclines = round_up((fb->height+1)>>1, 32);
                        y_tile_height = 8;
                }
 
                layout->plane_pitch[0] = stride;
                layout->plane_size[0] = round_up(layout->plane_pitch[0] *
-                       sclines, DPU_UBWC_PLANE_SIZE_ALIGNMENT);
+                       y_sclines, DPU_UBWC_PLANE_SIZE_ALIGNMENT);
 
                layout->plane_pitch[1] = stride;
                layout->plane_size[1] = round_up(layout->plane_pitch[1] *
-                       sclines, DPU_UBWC_PLANE_SIZE_ALIGNMENT);
+                       uv_sclines, DPU_UBWC_PLANE_SIZE_ALIGNMENT);
 
                if (!meta)
                        return 0;