|
@@ -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];
|