Skip to content

Commit f2ee051

Browse files
cristiccchewitt
authored andcommitted
FROMLIST(v3): drm/rockchip: vop2: Support setting custom background color
The Rockchip VOP2 display controller allows configuring the background color of each video output port. Since a previous patch introduced the BACKGROUND_COLOR CRTC property, which defaults to solid black, make use of it when programming the hardware. Note the maximum precision allowed by the display controller is 10bpc, while the alpha component is not supported, hence ignored. Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
1 parent f8e51a3 commit f2ee051

File tree

2 files changed

+16
-1
lines changed

2 files changed

+16
-1
lines changed

drivers/gpu/drm/rockchip/rockchip_drm_vop2.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1592,6 +1592,7 @@ static void vop2_post_config(struct drm_crtc *crtc)
15921592
struct vop2_video_port *vp = to_vop2_video_port(crtc);
15931593
struct vop2 *vop2 = vp->vop2;
15941594
struct drm_display_mode *mode = &crtc->state->adjusted_mode;
1595+
u64 bgcolor = crtc->state->background_color;
15951596
u16 vtotal = mode->crtc_vtotal;
15961597
u16 hdisplay = mode->crtc_hdisplay;
15971598
u16 hact_st = mode->crtc_htotal - mode->crtc_hsync_start;
@@ -1637,7 +1638,11 @@ static void vop2_post_config(struct drm_crtc *crtc)
16371638
vop2_vp_write(vp, RK3568_VP_POST_DSP_VACT_INFO_F1, val);
16381639
}
16391640

1640-
vop2_vp_write(vp, RK3568_VP_DSP_BG, 0);
1641+
/* Background color is programmed with 10 bits of precision */
1642+
val = FIELD_PREP(RK3568_VP_DSP_BG__DSP_BG_RED, DRM_ARGB64_GETR_BPC(bgcolor, 10));
1643+
val |= FIELD_PREP(RK3568_VP_DSP_BG__DSP_BG_GREEN, DRM_ARGB64_GETG_BPC(bgcolor, 10));
1644+
val |= FIELD_PREP(RK3568_VP_DSP_BG__DSP_BG_BLUE, DRM_ARGB64_GETB_BPC(bgcolor, 10));
1645+
vop2_vp_write(vp, RK3568_VP_DSP_BG, val);
16411646

16421647
vop2_bcsh_config(crtc, vp);
16431648
}
@@ -2024,6 +2029,10 @@ static int vop2_crtc_state_dump(struct drm_crtc *crtc, struct seq_file *s)
20242029
drm_get_bus_format_name(vcstate->bus_format));
20252030
seq_printf(s, "\toutput_mode[%x]", vcstate->output_mode);
20262031
seq_printf(s, " color_space[%d]\n", vcstate->color_space);
2032+
seq_printf(s, "\tbackground color (10bpc): r=0x%x g=0x%x b=0x%x\n",
2033+
DRM_ARGB64_GETR_BPC(cstate->background_color, 10),
2034+
DRM_ARGB64_GETG_BPC(cstate->background_color, 10),
2035+
DRM_ARGB64_GETB_BPC(cstate->background_color, 10));
20272036
seq_printf(s, " Display mode: %dx%d%s%d\n",
20282037
mode->hdisplay, mode->vdisplay, interlaced ? "i" : "p",
20292038
drm_mode_vrefresh(mode));
@@ -2513,6 +2522,8 @@ static int vop2_create_crtcs(struct vop2 *vop2)
25132522
return dev_err_probe(drm->dev, ret,
25142523
"crtc init for video_port%d failed\n", i);
25152524

2525+
drm_crtc_attach_background_color_property(&vp->crtc);
2526+
25162527
drm_crtc_helper_add(&vp->crtc, &vop2_crtc_helper_funcs);
25172528
if (vop2->lut_regs) {
25182529
const struct vop2_video_port_data *vp_data = &vop2_data->vp[vp->id];

drivers/gpu/drm/rockchip/rockchip_drm_vop2.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,10 @@ enum dst_factor_mode {
660660
#define RK3588_VP_CLK_CTRL__DCLK_OUT_DIV GENMASK(3, 2)
661661
#define RK3588_VP_CLK_CTRL__DCLK_CORE_DIV GENMASK(1, 0)
662662

663+
#define RK3568_VP_DSP_BG__DSP_BG_RED GENMASK(29, 20)
664+
#define RK3568_VP_DSP_BG__DSP_BG_GREEN GENMASK(19, 10)
665+
#define RK3568_VP_DSP_BG__DSP_BG_BLUE GENMASK(9, 0)
666+
663667
#define RK3568_VP_POST_SCL_CTRL__VSCALEDOWN BIT(1)
664668
#define RK3568_VP_POST_SCL_CTRL__HSCALEDOWN BIT(0)
665669

0 commit comments

Comments
 (0)