From 6bb5a30b0ed20b9543e7cb234a504256c473a278 Mon Sep 17 00:00:00 2001 From: Icenowy Zheng Date: Thu, 28 Dec 2023 19:41:24 +0800 Subject: [PATCH] drm/verisilicon: bias fb address for dual-head offset Signed-off-by: Icenowy Zheng --- drivers/gpu/drm/verisilicon/vs_dc.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/drivers/gpu/drm/verisilicon/vs_dc.c b/drivers/gpu/drm/verisilicon/vs_dc.c index 0118ed89f..71a52cbf4 100644 --- a/drivers/gpu/drm/verisilicon/vs_dc.c +++ b/drivers/gpu/drm/verisilicon/vs_dc.c @@ -493,18 +493,43 @@ static void update_fb(struct vs_plane *plane, u8 display_id, struct vs_plane_state *plane_state = to_vs_plane_state(state); struct drm_framebuffer *drm_fb = state->fb; struct drm_rect *src = &state->src; + u32 src_x, src_y; + + src_y = src->y1 >> 16; + src_x = src->x1 >> 16; fb->display_id = display_id; fb->y_address = plane->dma_addr[0]; + if (src_y) + fb->y_address += src_y * drm_fb->pitches[0]; + if (src_x) + fb->y_address += src_x * drm_fb->format->cpp[0]; + fb->y_stride = drm_fb->pitches[0]; if (drm_fb->format->format == DRM_FORMAT_YVU420) { fb->u_address = plane->dma_addr[2]; + if (src_y) + fb->u_address += src_y * drm_fb->pitches[2]; + if (src_x) + fb->u_address += src_x * drm_fb->format->cpp[2]; fb->v_address = plane->dma_addr[1]; + if (src_y) + fb->v_address += src_y * drm_fb->pitches[1]; + if (src_x) + fb->v_address += src_x * drm_fb->format->cpp[1]; fb->u_stride = drm_fb->pitches[2]; fb->v_stride = drm_fb->pitches[1]; } else { fb->u_address = plane->dma_addr[1]; + if (src_y) + fb->u_address += src_y * drm_fb->pitches[1]; + if (src_x) + fb->u_address += src_x * drm_fb->format->cpp[1]; fb->v_address = plane->dma_addr[2]; + if (src_y) + fb->v_address += src_y * drm_fb->pitches[2]; + if (src_x) + fb->v_address += src_x * drm_fb->format->cpp[2]; fb->u_stride = drm_fb->pitches[1]; fb->v_stride = drm_fb->pitches[2]; }