[PATCH 09/14] drm/kmb : W/A for planar formats
Chrisanthus, Anitha
anitha.chrisanthus at intel.com
Wed Jul 28 22:48:23 UTC 2021
Please ignore this patch. Will combine this with 256B w/a patch.
> -----Original Message-----
> From: Chrisanthus, Anitha <anitha.chrisanthus at intel.com>
> Sent: Tuesday, July 27, 2021 5:31 PM
> To: dri-devel at lists.freedesktop.org; Chrisanthus, Anitha
> <anitha.chrisanthus at intel.com>; Dea, Edmund J <edmund.j.dea at intel.com>
> Subject: [PATCH 09/14] drm/kmb : W/A for planar formats
>
> This is a work around for fully planar formats, where color corruption
> was observed for formats like YU12, YU16 etc. Set the DMA Vstride and
> Line width for U and V planes to the same as the Y plane and not the
> actual pitch. For decoded video frames, continue to use the info from
> metadata.
>
> Fixes: 7f7b96a8a0a1 ("drm/kmb: Add support for KeemBay Display")
> Signed-off-by: Anitha Chrisanthus <anitha.chrisanthus at intel.com>
> ---
> drivers/gpu/drm/kmb/kmb_plane.c | 11 ++++++++---
> 1 file changed, 8 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/kmb/kmb_plane.c
> b/drivers/gpu/drm/kmb/kmb_plane.c
> index dacec5c4266f..4523af949ea1 100644
> --- a/drivers/gpu/drm/kmb/kmb_plane.c
> +++ b/drivers/gpu/drm/kmb/kmb_plane.c
> @@ -333,6 +333,7 @@ static void kmb_plane_atomic_update(struct
> drm_plane *plane,
> struct disp_cfg *init_disp_cfg;
> struct viv_vidmem_metadata *md = NULL;
> struct drm_gem_object *gem_obj;
> + unsigned int cb_stride, cr_stride;
>
> if (!plane || !new_plane_state || !old_plane_state)
> return;
> @@ -397,8 +398,10 @@ static void kmb_plane_atomic_update(struct
> drm_plane *plane,
> val |= get_bits_per_pixel(fb->format);
> /* Program Cb/Cr for planar formats */
> if (num_planes > 1) {
> - kmb_write_lcd(kmb,
> LCD_LAYERn_DMA_CB_LINE_VSTRIDE(plane_id),
> - fb->pitches[1]);
> + cb_stride = md ? fb->pitches[1] : width * fb->format->cpp[0];
> + kmb_write_lcd(kmb,
> + LCD_LAYERn_DMA_CB_LINE_VSTRIDE(plane_id),
> + cb_stride);
> kmb_write_lcd(kmb,
> LCD_LAYERn_DMA_CB_LINE_WIDTH(plane_id),
> (width * fb->format->cpp[0]));
>
> @@ -419,9 +422,11 @@ static void kmb_plane_atomic_update(struct
> drm_plane *plane,
> addr[U_PLANE]);
>
> if (num_planes == 3) {
> + cr_stride = md ? fb->pitches[2] :
> + width * fb->format->cpp[0];
> kmb_write_lcd(kmb,
>
> LCD_LAYERn_DMA_CR_LINE_VSTRIDE(plane_id),
> - fb->pitches[2]);
> + cr_stride);
>
> kmb_write_lcd(kmb,
>
> LCD_LAYERn_DMA_CR_LINE_WIDTH(plane_id),
> --
> 2.25.1
More information about the dri-devel
mailing list