Commit 8b704d8a authored by Marek Szyprowski's avatar Marek Szyprowski Committed by Inki Dae

drm/exynos: fimd: fix dma burst size setting for small plane size

This patch fixes trashed display of buffers cropped to very small width.
Even if DMA is unstable and causes tearing when changing the burst size,
it is still better than displaying a garbage.
Signed-off-by: default avatarMarek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: default avatarDaniel Stone <daniels@collabora.com>
Signed-off-by: default avatarInki Dae <inki.dae@samsung.com>
parent d16a11a0
...@@ -487,7 +487,7 @@ static void fimd_commit(struct exynos_drm_crtc *crtc) ...@@ -487,7 +487,7 @@ static void fimd_commit(struct exynos_drm_crtc *crtc)
static void fimd_win_set_pixfmt(struct fimd_context *ctx, unsigned int win, static void fimd_win_set_pixfmt(struct fimd_context *ctx, unsigned int win,
struct drm_framebuffer *fb) uint32_t pixel_format, int width)
{ {
unsigned long val; unsigned long val;
...@@ -498,11 +498,11 @@ static void fimd_win_set_pixfmt(struct fimd_context *ctx, unsigned int win, ...@@ -498,11 +498,11 @@ static void fimd_win_set_pixfmt(struct fimd_context *ctx, unsigned int win,
* So the request format is ARGB8888 then change it to XRGB8888. * So the request format is ARGB8888 then change it to XRGB8888.
*/ */
if (ctx->driver_data->has_limited_fmt && !win) { if (ctx->driver_data->has_limited_fmt && !win) {
if (fb->pixel_format == DRM_FORMAT_ARGB8888) if (pixel_format == DRM_FORMAT_ARGB8888)
fb->pixel_format = DRM_FORMAT_XRGB8888; pixel_format = DRM_FORMAT_XRGB8888;
} }
switch (fb->pixel_format) { switch (pixel_format) {
case DRM_FORMAT_C8: case DRM_FORMAT_C8:
val |= WINCON0_BPPMODE_8BPP_PALETTE; val |= WINCON0_BPPMODE_8BPP_PALETTE;
val |= WINCONx_BURSTLEN_8WORD; val |= WINCONx_BURSTLEN_8WORD;
...@@ -538,17 +538,15 @@ static void fimd_win_set_pixfmt(struct fimd_context *ctx, unsigned int win, ...@@ -538,17 +538,15 @@ static void fimd_win_set_pixfmt(struct fimd_context *ctx, unsigned int win,
break; break;
} }
DRM_DEBUG_KMS("bpp = %d\n", fb->bits_per_pixel);
/* /*
* In case of exynos, setting dma-burst to 16Word causes permanent * Setting dma-burst to 16Word causes permanent tearing for very small
* tearing for very small buffers, e.g. cursor buffer. Burst Mode * buffers, e.g. cursor buffer. Burst Mode switching which based on
* switching which is based on plane size is not recommended as * plane size is not recommended as plane size varies alot towards the
* plane size varies alot towards the end of the screen and rapid * end of the screen and rapid movement causes unstable DMA, but it is
* movement causes unstable DMA which results into iommu crash/tear. * still better to change dma-burst than displaying garbage.
*/ */
if (fb->width < MIN_FB_WIDTH_FOR_16WORD_BURST) { if (width < MIN_FB_WIDTH_FOR_16WORD_BURST) {
val &= ~WINCONx_BURSTLEN_MASK; val &= ~WINCONx_BURSTLEN_MASK;
val |= WINCONx_BURSTLEN_4WORD; val |= WINCONx_BURSTLEN_4WORD;
} }
...@@ -723,7 +721,7 @@ static void fimd_update_plane(struct exynos_drm_crtc *crtc, ...@@ -723,7 +721,7 @@ static void fimd_update_plane(struct exynos_drm_crtc *crtc,
DRM_DEBUG_KMS("osd size = 0x%x\n", (unsigned int)val); DRM_DEBUG_KMS("osd size = 0x%x\n", (unsigned int)val);
} }
fimd_win_set_pixfmt(ctx, win, fb); fimd_win_set_pixfmt(ctx, win, fb->pixel_format, state->src.w);
/* hardware window 0 doesn't support color key. */ /* hardware window 0 doesn't support color key. */
if (win != 0) if (win != 0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment