drm: Exynos: Respect framebuffer pitch for FIMD/Mixer
When performing a modeset, use the framebuffer pitch value to set FIMD IMG_SIZE and Mixer SPAN registers. These are both defined as pitch - the distance between contiguous lines (bytes for FIMD, pixels for mixer). Fixes display on Snow (1366x768). Signed-off-by: Daniel Stone <daniels@collabora.com> Tested-by: Javier Martinez Canillas <javier.martinez@collabora.co.uk> Signed-off-by: Inki Dae <inki.dae@samsung.com>
This commit is contained in:
Родитель
91fd89660b
Коммит
adacb228d7
|
@ -147,6 +147,7 @@ struct fimd_win_data {
|
||||||
unsigned int ovl_height;
|
unsigned int ovl_height;
|
||||||
unsigned int fb_width;
|
unsigned int fb_width;
|
||||||
unsigned int fb_height;
|
unsigned int fb_height;
|
||||||
|
unsigned int fb_pitch;
|
||||||
unsigned int bpp;
|
unsigned int bpp;
|
||||||
unsigned int pixel_format;
|
unsigned int pixel_format;
|
||||||
dma_addr_t dma_addr;
|
dma_addr_t dma_addr;
|
||||||
|
@ -532,13 +533,14 @@ static void fimd_win_mode_set(struct exynos_drm_crtc *crtc,
|
||||||
win_data->offset_y = plane->crtc_y;
|
win_data->offset_y = plane->crtc_y;
|
||||||
win_data->ovl_width = plane->crtc_width;
|
win_data->ovl_width = plane->crtc_width;
|
||||||
win_data->ovl_height = plane->crtc_height;
|
win_data->ovl_height = plane->crtc_height;
|
||||||
|
win_data->fb_pitch = plane->pitch;
|
||||||
win_data->fb_width = plane->fb_width;
|
win_data->fb_width = plane->fb_width;
|
||||||
win_data->fb_height = plane->fb_height;
|
win_data->fb_height = plane->fb_height;
|
||||||
win_data->dma_addr = plane->dma_addr[0] + offset;
|
win_data->dma_addr = plane->dma_addr[0] + offset;
|
||||||
win_data->bpp = plane->bpp;
|
win_data->bpp = plane->bpp;
|
||||||
win_data->pixel_format = plane->pixel_format;
|
win_data->pixel_format = plane->pixel_format;
|
||||||
win_data->buf_offsize = (plane->fb_width - plane->crtc_width) *
|
win_data->buf_offsize =
|
||||||
(plane->bpp >> 3);
|
plane->pitch - (plane->crtc_width * (plane->bpp >> 3));
|
||||||
win_data->line_size = plane->crtc_width * (plane->bpp >> 3);
|
win_data->line_size = plane->crtc_width * (plane->bpp >> 3);
|
||||||
|
|
||||||
DRM_DEBUG_KMS("offset_x = %d, offset_y = %d\n",
|
DRM_DEBUG_KMS("offset_x = %d, offset_y = %d\n",
|
||||||
|
@ -704,7 +706,7 @@ static void fimd_win_commit(struct exynos_drm_crtc *crtc, int zpos)
|
||||||
writel(val, ctx->regs + VIDWx_BUF_START(win, 0));
|
writel(val, ctx->regs + VIDWx_BUF_START(win, 0));
|
||||||
|
|
||||||
/* buffer end address */
|
/* buffer end address */
|
||||||
size = win_data->fb_width * win_data->ovl_height * (win_data->bpp >> 3);
|
size = win_data->fb_pitch * win_data->ovl_height * (win_data->bpp >> 3);
|
||||||
val = (unsigned long)(win_data->dma_addr + size);
|
val = (unsigned long)(win_data->dma_addr + size);
|
||||||
writel(val, ctx->regs + VIDWx_BUF_END(win, 0));
|
writel(val, ctx->regs + VIDWx_BUF_END(win, 0));
|
||||||
|
|
||||||
|
|
|
@ -55,6 +55,7 @@ struct hdmi_win_data {
|
||||||
unsigned int fb_x;
|
unsigned int fb_x;
|
||||||
unsigned int fb_y;
|
unsigned int fb_y;
|
||||||
unsigned int fb_width;
|
unsigned int fb_width;
|
||||||
|
unsigned int fb_pitch;
|
||||||
unsigned int fb_height;
|
unsigned int fb_height;
|
||||||
unsigned int src_width;
|
unsigned int src_width;
|
||||||
unsigned int src_height;
|
unsigned int src_height;
|
||||||
|
@ -438,7 +439,7 @@ static void vp_video_buffer(struct mixer_context *ctx, int win)
|
||||||
} else {
|
} else {
|
||||||
luma_addr[0] = win_data->dma_addr;
|
luma_addr[0] = win_data->dma_addr;
|
||||||
chroma_addr[0] = win_data->dma_addr
|
chroma_addr[0] = win_data->dma_addr
|
||||||
+ (win_data->fb_width * win_data->fb_height);
|
+ (win_data->fb_pitch * win_data->fb_height);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (win_data->scan_flags & DRM_MODE_FLAG_INTERLACE) {
|
if (win_data->scan_flags & DRM_MODE_FLAG_INTERLACE) {
|
||||||
|
@ -447,8 +448,8 @@ static void vp_video_buffer(struct mixer_context *ctx, int win)
|
||||||
luma_addr[1] = luma_addr[0] + 0x40;
|
luma_addr[1] = luma_addr[0] + 0x40;
|
||||||
chroma_addr[1] = chroma_addr[0] + 0x40;
|
chroma_addr[1] = chroma_addr[0] + 0x40;
|
||||||
} else {
|
} else {
|
||||||
luma_addr[1] = luma_addr[0] + win_data->fb_width;
|
luma_addr[1] = luma_addr[0] + win_data->fb_pitch;
|
||||||
chroma_addr[1] = chroma_addr[0] + win_data->fb_width;
|
chroma_addr[1] = chroma_addr[0] + win_data->fb_pitch;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ctx->interlace = false;
|
ctx->interlace = false;
|
||||||
|
@ -469,10 +470,10 @@ static void vp_video_buffer(struct mixer_context *ctx, int win)
|
||||||
vp_reg_writemask(res, VP_MODE, val, VP_MODE_FMT_MASK);
|
vp_reg_writemask(res, VP_MODE, val, VP_MODE_FMT_MASK);
|
||||||
|
|
||||||
/* setting size of input image */
|
/* setting size of input image */
|
||||||
vp_reg_write(res, VP_IMG_SIZE_Y, VP_IMG_HSIZE(win_data->fb_width) |
|
vp_reg_write(res, VP_IMG_SIZE_Y, VP_IMG_HSIZE(win_data->fb_pitch) |
|
||||||
VP_IMG_VSIZE(win_data->fb_height));
|
VP_IMG_VSIZE(win_data->fb_height));
|
||||||
/* chroma height has to reduced by 2 to avoid chroma distorions */
|
/* chroma height has to reduced by 2 to avoid chroma distorions */
|
||||||
vp_reg_write(res, VP_IMG_SIZE_C, VP_IMG_HSIZE(win_data->fb_width) |
|
vp_reg_write(res, VP_IMG_SIZE_C, VP_IMG_HSIZE(win_data->fb_pitch) |
|
||||||
VP_IMG_VSIZE(win_data->fb_height / 2));
|
VP_IMG_VSIZE(win_data->fb_height / 2));
|
||||||
|
|
||||||
vp_reg_write(res, VP_SRC_WIDTH, win_data->src_width);
|
vp_reg_write(res, VP_SRC_WIDTH, win_data->src_width);
|
||||||
|
@ -559,7 +560,7 @@ static void mixer_graph_buffer(struct mixer_context *ctx, int win)
|
||||||
/* converting dma address base and source offset */
|
/* converting dma address base and source offset */
|
||||||
dma_addr = win_data->dma_addr
|
dma_addr = win_data->dma_addr
|
||||||
+ (win_data->fb_x * win_data->bpp >> 3)
|
+ (win_data->fb_x * win_data->bpp >> 3)
|
||||||
+ (win_data->fb_y * win_data->fb_width * win_data->bpp >> 3);
|
+ (win_data->fb_y * win_data->fb_pitch);
|
||||||
src_x_offset = 0;
|
src_x_offset = 0;
|
||||||
src_y_offset = 0;
|
src_y_offset = 0;
|
||||||
|
|
||||||
|
@ -576,7 +577,8 @@ static void mixer_graph_buffer(struct mixer_context *ctx, int win)
|
||||||
MXR_GRP_CFG_FORMAT_VAL(fmt), MXR_GRP_CFG_FORMAT_MASK);
|
MXR_GRP_CFG_FORMAT_VAL(fmt), MXR_GRP_CFG_FORMAT_MASK);
|
||||||
|
|
||||||
/* setup geometry */
|
/* setup geometry */
|
||||||
mixer_reg_write(res, MXR_GRAPHIC_SPAN(win), win_data->fb_width);
|
mixer_reg_write(res, MXR_GRAPHIC_SPAN(win),
|
||||||
|
win_data->fb_pitch / (win_data->bpp >> 3));
|
||||||
|
|
||||||
/* setup display size */
|
/* setup display size */
|
||||||
if (ctx->mxr_ver == MXR_VER_128_0_0_184 &&
|
if (ctx->mxr_ver == MXR_VER_128_0_0_184 &&
|
||||||
|
@ -961,6 +963,7 @@ static void mixer_win_mode_set(struct exynos_drm_crtc *crtc,
|
||||||
win_data->fb_y = plane->fb_y;
|
win_data->fb_y = plane->fb_y;
|
||||||
win_data->fb_width = plane->fb_width;
|
win_data->fb_width = plane->fb_width;
|
||||||
win_data->fb_height = plane->fb_height;
|
win_data->fb_height = plane->fb_height;
|
||||||
|
win_data->fb_pitch = plane->pitch;
|
||||||
win_data->src_width = plane->src_width;
|
win_data->src_width = plane->src_width;
|
||||||
win_data->src_height = plane->src_height;
|
win_data->src_height = plane->src_height;
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче