From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Tomi Valkeinen <tomi.valkeinen@ti.com>
Cc: Jyri Sarha <jsarha@ti.com>, dri-devel@lists.freedesktop.org
Subject: Re: [PATCH 6/7] drm/omap: fix YUV422 rotation with TILER
Date: Wed, 24 May 2017 09:44:39 +0300 [thread overview]
Message-ID: <2936220.1OnK716SNb@avalon> (raw)
In-Reply-To: <1495007804-6133-7-git-send-email-tomi.valkeinen@ti.com>
Hi Tomi,
Thank you for the patch.
On Wednesday 17 May 2017 10:56:43 Tomi Valkeinen wrote:
> TILER rotation with YUV422 pixelformats does not work at the moment. All
> other pixel formats work, because the pixelformat's pixel size is equal
> to tiler unit size (e.g. XR24's pixel size is 32 bits, and the TILER
> unit size that has to be used is 32 bits).
>
> For YUV422 formats this is not the case, as the TILER unit size has to
> be 32 bits, but the pixel size is 16 bits. The end result is OCP errors
> and sync losts.
>
> This patch adds the code to adjust the variables for YUV422 formats.
>
> We could make the code more generic by passing around the pixel format,
> rotation type, angle and the tiler unit size, which would allow us to do
> calculations without special case for YUV422. However, this would make
> the code more complex, and at least for now this is much more easier to
> handle with these two special cases for YUV422.
>
> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
> ---
> drivers/gpu/drm/omapdrm/dss/dispc.c | 20 ++++++++++++++++++--
> drivers/gpu/drm/omapdrm/omap_fb.c | 14 ++++++++++++++
> 2 files changed, 32 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/omapdrm/dss/dispc.c
> b/drivers/gpu/drm/omapdrm/dss/dispc.c index a25db6e25165..80c75e5913cb
> 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dispc.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dispc.c
> @@ -1917,7 +1917,8 @@ static s32 pixinc(int pixels, u8 ps)
> static void calc_offset(u16 screen_width, u16 width,
> u32 fourcc, bool fieldmode,
> unsigned int field_offset, unsigned *offset0, unsigned
*offset1,
> - s32 *row_inc, s32 *pix_inc, int x_predecim, int y_predecim)
> + s32 *row_inc, s32 *pix_inc, int x_predecim, int y_predecim,
> + enum omap_dss_rotation_type rotation_type, u8 rotation)
> {
> u8 ps;
>
> @@ -1925,6 +1926,20 @@ static void calc_offset(u16 screen_width, u16 width,
>
> DSSDBG("scrw %d, width %d\n", screen_width, width);
>
> + if (rotation_type == OMAP_DSS_ROT_TILER &&
> + (fourcc == DRM_FORMAT_UYVY || fourcc == DRM_FORMAT_YUYV) &&
> + drm_rotation_90_or_270(rotation)) {
> + /*
> + * HACK: ROW_INC needs to be calculated with TILER units.
> + * We get such 'screen_width' that multiplying it with the
> + * YUV422 pixel size gives the correct TILER container width.
> + * However, 'width' is in pixels and multiplying it with
YUV422
> + * pixel size gives incorrect result. We thus multiply it here
> + * with 2 to match the 32 bit TILER unit size.
> + */
> + width *= 2;
> + }
> +
> /*
> * field 0 = even field = bottom field
> * field 1 = odd field = top field
> @@ -2473,7 +2488,8 @@ static int dispc_ovl_setup_common(enum omap_plane_id
> plane, calc_offset(screen_width, frame_width,
> fourcc, fieldmode, field_offset,
> &offset0, &offset1, &row_inc, &pix_inc,
> - x_predecim, y_predecim);
> + x_predecim, y_predecim,
> + rotation_type, rotation);
>
> DSSDBG("offset0 %u, offset1 %u, row_inc %d, pix_inc %d\n",
> offset0, offset1, row_inc, pix_inc);
> diff --git a/drivers/gpu/drm/omapdrm/omap_fb.c
> b/drivers/gpu/drm/omapdrm/omap_fb.c index bd05976fc20b..e5cc13799e73 100644
> --- a/drivers/gpu/drm/omapdrm/omap_fb.c
> +++ b/drivers/gpu/drm/omapdrm/omap_fb.c
> @@ -184,16 +184,30 @@ void omap_framebuffer_update_scanout(struct
> drm_framebuffer *fb,
>
> orient = drm_rotation_to_tiler(state->rotation);
>
> + /*
> + * omap_gem_rotated_paddr() wants the x & y in tiler units.
> + * Usually tiler unit size is the same as the pixel size,
except
> + * for YUV422 formats, for which the tiler unit size is 32
bits
> + * and pixel size is 16 bits.
> + */
> + if (fb->format->format == DRM_FORMAT_UYVY ||
> + fb->format->format == DRM_FORMAT_YUYV) {
That's a very peculiar indentation.
> + x /= 2;
> + w /= 2;
> + }
> +
> /* adjust x,y offset for flip/invert: */
> if (orient & MASK_Y_INVERT)
> y += h - 1;
> if (orient & MASK_X_INVERT)
> x += w - 1;
>
> + /* Note: x and y are in TILER units, not pixels */
> omap_gem_rotated_dma_addr(plane->bo, orient, x, y,
> &info->paddr);
> info->rotation_type = OMAP_DSS_ROT_TILER;
> info->rotation = state->rotation ?: DRM_ROTATE_0;
> + /* Note: stride in TILER units, not pixels */
Nitpicking, I would have combined the two comments.
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> info->screen_width = omap_gem_tiled_stride(plane->bo,
orient);
> } else {
> switch (state->rotation & DRM_ROTATE_MASK) {
--
Regards,
Laurent Pinchart
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
next prev parent reply other threads:[~2017-05-24 6:44 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-17 7:56 [PATCH 0/7] drm/omap: rotation fixes and cleanups Tomi Valkeinen
2017-05-17 7:56 ` [PATCH 1/7] drm/omap: add drm_rotation_to_tiler helper() Tomi Valkeinen
2017-05-23 11:19 ` Laurent Pinchart
2017-05-17 7:56 ` [PATCH 2/7] drm/omap: remove omap_drm_win Tomi Valkeinen
2017-05-23 11:41 ` Laurent Pinchart
2017-05-17 7:56 ` [PATCH 3/7] drm/omap: use DRM_ROTATE_* instead of OMAP_DSS_ROT_* Tomi Valkeinen
2017-05-23 13:07 ` Laurent Pinchart
2017-05-23 13:13 ` Tomi Valkeinen
2017-05-17 7:56 ` [PATCH 4/7] drm/omap: DRM_REFLECT_* instead of mirror boolean Tomi Valkeinen
2017-05-23 13:15 ` Laurent Pinchart
2017-05-23 13:21 ` Tomi Valkeinen
2017-05-17 7:56 ` [PATCH 5/7] drm/omap: pass rotation to dispc Tomi Valkeinen
2017-05-23 14:06 ` Laurent Pinchart
2017-05-23 14:36 ` Tomi Valkeinen
2017-05-17 7:56 ` [PATCH 6/7] drm/omap: fix YUV422 rotation with TILER Tomi Valkeinen
2017-05-24 6:44 ` Laurent Pinchart [this message]
2017-05-24 6:50 ` Tomi Valkeinen
2017-05-24 9:10 ` Laurent Pinchart
2017-05-17 7:56 ` [PATCH 7/7] drm/omap: fix YUV422 90/270 rotation with mirroring Tomi Valkeinen
2017-05-24 6:46 ` Laurent Pinchart
2017-05-24 6:55 ` Tomi Valkeinen
2017-05-24 7:02 ` Tomi Valkeinen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2936220.1OnK716SNb@avalon \
--to=laurent.pinchart@ideasonboard.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=jsarha@ti.com \
--cc=tomi.valkeinen@ti.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox