Skip to content

Commit 8e9a649

Browse files
Kwiboogregkh
authored andcommitted
drm/rockchip: vop: Fix color for RGB888/BGR888 format on VOP full
[ Upstream commit bb0a05a ] Use of DRM_FORMAT_RGB888 and DRM_FORMAT_BGR888 on e.g. RK3288, RK3328 and RK3399 result in wrong colors being displayed. The issue can be observed using modetest: modetest -s <connector_id>@<crtc_id>:1920x1080-60@RG24 modetest -s <connector_id>@<crtc_id>:1920x1080-60@BG24 Vendor 4.4 kernel apply an inverted rb swap for these formats on VOP full framework (IP version 3.x) compared to VOP little framework (2.x). Fix colors by applying different rb swap for VOP full framework (3.x) and VOP little framework (2.x) similar to vendor 4.4 kernel. Fixes: 85a359f ("drm/rockchip: Add BGR formats to VOP") Signed-off-by: Jonas Karlman <[email protected]> Tested-by: Diederik de Haas <[email protected]> Reviewed-by: Christopher Obbard <[email protected]> Tested-by: Christopher Obbard <[email protected]> Signed-off-by: Heiko Stuebner <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] Signed-off-by: Sasha Levin <[email protected]>
1 parent 84a6e47 commit 8e9a649

File tree

1 file changed

+11
-3
lines changed

1 file changed

+11
-3
lines changed

drivers/gpu/drm/rockchip/rockchip_drm_vop.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -248,14 +248,22 @@ static inline void vop_cfg_done(struct vop *vop)
248248
VOP_REG_SET(vop, common, cfg_done, 1);
249249
}
250250

251-
static bool has_rb_swapped(uint32_t format)
251+
static bool has_rb_swapped(uint32_t version, uint32_t format)
252252
{
253253
switch (format) {
254254
case DRM_FORMAT_XBGR8888:
255255
case DRM_FORMAT_ABGR8888:
256-
case DRM_FORMAT_BGR888:
257256
case DRM_FORMAT_BGR565:
258257
return true;
258+
/*
259+
* full framework (IP version 3.x) only need rb swapped for RGB888 and
260+
* little framework (IP version 2.x) only need rb swapped for BGR888,
261+
* check for 3.x to also only rb swap BGR888 for unknown vop version
262+
*/
263+
case DRM_FORMAT_RGB888:
264+
return VOP_MAJOR(version) == 3;
265+
case DRM_FORMAT_BGR888:
266+
return VOP_MAJOR(version) != 3;
259267
default:
260268
return false;
261269
}
@@ -1017,7 +1025,7 @@ static void vop_plane_atomic_update(struct drm_plane *plane,
10171025
VOP_WIN_SET(vop, win, dsp_info, dsp_info);
10181026
VOP_WIN_SET(vop, win, dsp_st, dsp_st);
10191027

1020-
rb_swap = has_rb_swapped(fb->format->format);
1028+
rb_swap = has_rb_swapped(vop->data->version, fb->format->format);
10211029
VOP_WIN_SET(vop, win, rb_swap, rb_swap);
10221030

10231031
/*

0 commit comments

Comments
 (0)