diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h index 456027acb831..0a9b5b1c31be 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h @@ -531,6 +531,7 @@ struct vop2_win_regs { struct vop_reg global_alpha_val; struct vop_reg color_key; struct vop_reg color_key_en; + struct vop_reg dither_up; }; struct vop2_video_port_regs { diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index 95e4628174e2..72ebfee6c856 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -1298,6 +1298,17 @@ static bool vop2_win_uv_swap(uint32_t format) } } +static bool vop2_win_dither_up(uint32_t format) +{ + switch (format) { + case DRM_FORMAT_BGR565: + case DRM_FORMAT_RGB565: + return true; + default: + return false; + } +} + static bool vop2_output_uv_swap(uint32_t bus_format, uint32_t output_mode) { /* @@ -2991,6 +3002,7 @@ static void vop2_plane_atomic_update(struct drm_plane *plane, struct drm_plane_s uint32_t stride; uint32_t transform_offset; struct drm_format_name_buf format_name; + bool dither_up; #if defined(CONFIG_ROCKCHIP_DRM_DEBUG) bool AFBC_flag = false; @@ -3186,6 +3198,9 @@ static void vop2_plane_atomic_update(struct drm_plane *plane, struct drm_plane_s VOP_WIN_SET(vop2, win, r2y_en, vpstate->r2y_en); VOP_WIN_SET(vop2, win, csc_mode, vpstate->csc_mode); + dither_up = vop2_win_dither_up(fb->format->format); + VOP_WIN_SET(vop2, win, dither_up, dither_up); + VOP_WIN_SET(vop2, win, enable, 1); if (vop2_cluster_window(win)) { lb_mode = vop2_get_cluster_lb_mode(win, vpstate); diff --git a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c index c0ef4b43b5d3..20d58d386504 100644 --- a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c +++ b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c @@ -928,6 +928,7 @@ static const struct vop2_win_regs rk3568_cluster0_win_data = { .enable = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 0), .format = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1f, 1), .rb_swap = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 14), + .dither_up = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 18), .act_info = VOP_REG(RK3568_CLUSTER0_WIN0_ACT_INFO, 0x1fff1fff, 0), .dsp_info = VOP_REG(RK3568_CLUSTER0_WIN0_DSP_INFO, 0x0fff0fff, 0), .dsp_st = VOP_REG(RK3568_CLUSTER0_WIN0_DSP_ST, 0x1fff1fff, 0), @@ -948,6 +949,7 @@ static const struct vop2_win_regs rk3568_cluster1_win_data = { .enable = VOP_REG(RK3568_CLUSTER1_WIN0_CTRL0, 0x1, 0), .format = VOP_REG(RK3568_CLUSTER1_WIN0_CTRL0, 0x1f, 1), .rb_swap = VOP_REG(RK3568_CLUSTER1_WIN0_CTRL0, 0x1, 14), + .dither_up = VOP_REG(RK3568_CLUSTER1_WIN0_CTRL0, 0x1, 18), .act_info = VOP_REG(RK3568_CLUSTER1_WIN0_ACT_INFO, 0x1fff1fff, 0), .dsp_info = VOP_REG(RK3568_CLUSTER1_WIN0_DSP_INFO, 0x0fff0fff, 0), .dsp_st = VOP_REG(RK3568_CLUSTER1_WIN0_DSP_ST, 0x1fff1fff, 0), @@ -965,6 +967,7 @@ static const struct vop2_win_regs rk3568_esmart_win_data = { .scl = &rk3568_esmart_win_scl, .enable = VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x1, 0), .format = VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x1f, 1), + .dither_up = VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x1, 12), .rb_swap = VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x1, 14), .uv_swap = VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x1, 16), .act_info = VOP_REG(RK3568_ESMART0_REGION0_ACT_INFO, 0x1fff1fff, 0),