| From 3df4a0800905dc0d50c0d74fbbbd87f357dc5311 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 26 Oct 2017 02:27:51 -0400 |
| Subject: media: vsp1: Fix YCbCr planar formats pitch calculation |
| |
| From: Koji Matsuoka <koji.matsuoka.xm@renesas.com> |
| |
| [ Upstream commit 9b2798d5b71c50f64c41a40f0cbcae47c3fbd067 ] |
| |
| YCbCr planar formats can have different pitch values for the luma and |
| chroma planes. This isn't taken into account in the driver. Fix it. |
| |
| Based on a BSP patch from Koji Matsuoka <koji.matsuoka.xm@renesas.com>. |
| |
| Fixes: 7863ac504bc5 ("drm: rcar-du: Add tri-planar memory formats support") |
| [Updated documentation of the struct vsp1_du_atomic_config pitch field] |
| |
| Signed-off-by: Koji Matsuoka <koji.matsuoka.xm@renesas.com> |
| Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> |
| Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/media/platform/vsp1/vsp1_drm.c | 11 ++++++++++- |
| include/media/vsp1.h | 2 +- |
| 2 files changed, 11 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/media/platform/vsp1/vsp1_drm.c b/drivers/media/platform/vsp1/vsp1_drm.c |
| index b9c0f695d002b..8d86f618ec776 100644 |
| --- a/drivers/media/platform/vsp1/vsp1_drm.c |
| +++ b/drivers/media/platform/vsp1/vsp1_drm.c |
| @@ -770,6 +770,7 @@ int vsp1_du_atomic_update(struct device *dev, unsigned int pipe_index, |
| struct vsp1_device *vsp1 = dev_get_drvdata(dev); |
| struct vsp1_drm_pipeline *drm_pipe = &vsp1->drm->pipe[pipe_index]; |
| const struct vsp1_format_info *fmtinfo; |
| + unsigned int chroma_hsub; |
| struct vsp1_rwpf *rpf; |
| |
| if (rpf_index >= vsp1->info->rpf_count) |
| @@ -810,10 +811,18 @@ int vsp1_du_atomic_update(struct device *dev, unsigned int pipe_index, |
| return -EINVAL; |
| } |
| |
| + /* |
| + * Only formats with three planes can affect the chroma planes pitch. |
| + * All formats with two planes have a horizontal subsampling value of 2, |
| + * but combine U and V in a single chroma plane, which thus results in |
| + * the luma plane and chroma plane having the same pitch. |
| + */ |
| + chroma_hsub = (fmtinfo->planes == 3) ? fmtinfo->hsub : 1; |
| + |
| rpf->fmtinfo = fmtinfo; |
| rpf->format.num_planes = fmtinfo->planes; |
| rpf->format.plane_fmt[0].bytesperline = cfg->pitch; |
| - rpf->format.plane_fmt[1].bytesperline = cfg->pitch; |
| + rpf->format.plane_fmt[1].bytesperline = cfg->pitch / chroma_hsub; |
| rpf->alpha = cfg->alpha; |
| |
| rpf->mem.addr[0] = cfg->mem[0]; |
| diff --git a/include/media/vsp1.h b/include/media/vsp1.h |
| index 3093b9cb9067e..5b383d01c84a0 100644 |
| --- a/include/media/vsp1.h |
| +++ b/include/media/vsp1.h |
| @@ -46,7 +46,7 @@ int vsp1_du_setup_lif(struct device *dev, unsigned int pipe_index, |
| /** |
| * struct vsp1_du_atomic_config - VSP atomic configuration parameters |
| * @pixelformat: plane pixel format (V4L2 4CC) |
| - * @pitch: line pitch in bytes, for all planes |
| + * @pitch: line pitch in bytes for the first plane |
| * @mem: DMA memory address for each plane of the frame buffer |
| * @src: source rectangle in the frame buffer (integer coordinates) |
| * @dst: destination rectangle on the display (integer coordinates) |
| -- |
| 2.20.1 |
| |