Skip to content

Commit 5439c4f

Browse files
Andy Yanmmind
authored andcommitted
drm/rockchip: vop2: Support for different layer select configuration between VPs
In the upcoming VOP for rk3576, every VP has it's own LAYER_SEL register, and the configuration value of each VP for the same window maybe different, so extend the layer_sel_id to array, let it can descption the layer select configuration value for different VP. Signed-off-by: Andy Yan <[email protected]> Tested-by: Michael Riesch <[email protected]> # on RK3568 Tested-by: Detlev Casanova <[email protected]> Signed-off-by: Heiko Stuebner <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 145c9b3 commit 5439c4f

File tree

2 files changed

+22
-20
lines changed

2 files changed

+22
-20
lines changed

drivers/gpu/drm/rockchip/rockchip_drm_vop2.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,9 +166,9 @@ struct vop2_win_data {
166166
const unsigned int supported_rotations;
167167

168168
/**
169-
* @layer_sel_id: defined by register OVERLAY_LAYER_SEL of VOP2
169+
* @layer_sel_id: defined by register OVERLAY_LAYER_SEL or PORTn_LAYER_SEL
170170
*/
171-
unsigned int layer_sel_id;
171+
unsigned int layer_sel_id[ROCKCHIP_MAX_CRTC];
172172
uint64_t feature;
173173

174174
uint8_t axi_bus_id;

drivers/gpu/drm/rockchip/rockchip_vop2_reg.c

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,8 @@ static const struct vop2_win_data rk3568_vop_win_data[] = {
350350
.formats = formats_smart,
351351
.nformats = ARRAY_SIZE(formats_smart),
352352
.format_modifiers = format_modifiers,
353-
.layer_sel_id = 3,
353+
/* 0xf means this layer can't attached to this VP */
354+
.layer_sel_id = { 3, 3, 3, 0xf },
354355
.supported_rotations = DRM_MODE_REFLECT_Y,
355356
.type = DRM_PLANE_TYPE_PRIMARY,
356357
.max_upscale_factor = 8,
@@ -363,7 +364,7 @@ static const struct vop2_win_data rk3568_vop_win_data[] = {
363364
.nformats = ARRAY_SIZE(formats_smart),
364365
.format_modifiers = format_modifiers,
365366
.base = 0x1e00,
366-
.layer_sel_id = 7,
367+
.layer_sel_id = { 7, 7, 7, 0xf },
367368
.supported_rotations = DRM_MODE_REFLECT_Y,
368369
.type = DRM_PLANE_TYPE_PRIMARY,
369370
.max_upscale_factor = 8,
@@ -376,7 +377,7 @@ static const struct vop2_win_data rk3568_vop_win_data[] = {
376377
.nformats = ARRAY_SIZE(formats_rk356x_esmart),
377378
.format_modifiers = format_modifiers,
378379
.base = 0x1a00,
379-
.layer_sel_id = 6,
380+
.layer_sel_id = { 6, 6, 6, 0xf },
380381
.supported_rotations = DRM_MODE_REFLECT_Y,
381382
.type = DRM_PLANE_TYPE_PRIMARY,
382383
.max_upscale_factor = 8,
@@ -389,7 +390,7 @@ static const struct vop2_win_data rk3568_vop_win_data[] = {
389390
.nformats = ARRAY_SIZE(formats_rk356x_esmart),
390391
.format_modifiers = format_modifiers,
391392
.base = 0x1800,
392-
.layer_sel_id = 2,
393+
.layer_sel_id = { 2, 2, 2, 0xf },
393394
.supported_rotations = DRM_MODE_REFLECT_Y,
394395
.type = DRM_PLANE_TYPE_PRIMARY,
395396
.max_upscale_factor = 8,
@@ -402,7 +403,7 @@ static const struct vop2_win_data rk3568_vop_win_data[] = {
402403
.formats = formats_cluster,
403404
.nformats = ARRAY_SIZE(formats_cluster),
404405
.format_modifiers = format_modifiers_afbc,
405-
.layer_sel_id = 0,
406+
.layer_sel_id = { 0, 0, 0, 0xf },
406407
.supported_rotations = DRM_MODE_ROTATE_90 | DRM_MODE_ROTATE_270 |
407408
DRM_MODE_REFLECT_X | DRM_MODE_REFLECT_Y,
408409
.max_upscale_factor = 4,
@@ -417,7 +418,7 @@ static const struct vop2_win_data rk3568_vop_win_data[] = {
417418
.formats = formats_cluster,
418419
.nformats = ARRAY_SIZE(formats_cluster),
419420
.format_modifiers = format_modifiers_afbc,
420-
.layer_sel_id = 1,
421+
.layer_sel_id = { 1, 1, 1, 0xf },
421422
.supported_rotations = DRM_MODE_ROTATE_90 | DRM_MODE_ROTATE_270 |
422423
DRM_MODE_REFLECT_X | DRM_MODE_REFLECT_Y,
423424
.type = DRM_PLANE_TYPE_OVERLAY,
@@ -582,7 +583,7 @@ static const struct vop2_win_data rk3588_vop_win_data[] = {
582583
.formats = formats_cluster,
583584
.nformats = ARRAY_SIZE(formats_cluster),
584585
.format_modifiers = format_modifiers_afbc,
585-
.layer_sel_id = 0,
586+
.layer_sel_id = { 0, 0, 0, 0 },
586587
.supported_rotations = DRM_MODE_ROTATE_90 | DRM_MODE_ROTATE_270 |
587588
DRM_MODE_REFLECT_X | DRM_MODE_REFLECT_Y,
588589
.axi_bus_id = 0,
@@ -600,7 +601,7 @@ static const struct vop2_win_data rk3588_vop_win_data[] = {
600601
.formats = formats_cluster,
601602
.nformats = ARRAY_SIZE(formats_cluster),
602603
.format_modifiers = format_modifiers_afbc,
603-
.layer_sel_id = 1,
604+
.layer_sel_id = { 1, 1, 1, 1 },
604605
.supported_rotations = DRM_MODE_ROTATE_90 | DRM_MODE_ROTATE_270 |
605606
DRM_MODE_REFLECT_X | DRM_MODE_REFLECT_Y,
606607
.type = DRM_PLANE_TYPE_PRIMARY,
@@ -618,7 +619,7 @@ static const struct vop2_win_data rk3588_vop_win_data[] = {
618619
.formats = formats_cluster,
619620
.nformats = ARRAY_SIZE(formats_cluster),
620621
.format_modifiers = format_modifiers_afbc,
621-
.layer_sel_id = 4,
622+
.layer_sel_id = { 4, 4, 4, 4 },
622623
.supported_rotations = DRM_MODE_ROTATE_90 | DRM_MODE_ROTATE_270 |
623624
DRM_MODE_REFLECT_X | DRM_MODE_REFLECT_Y,
624625
.type = DRM_PLANE_TYPE_PRIMARY,
@@ -636,7 +637,7 @@ static const struct vop2_win_data rk3588_vop_win_data[] = {
636637
.formats = formats_cluster,
637638
.nformats = ARRAY_SIZE(formats_cluster),
638639
.format_modifiers = format_modifiers_afbc,
639-
.layer_sel_id = 5,
640+
.layer_sel_id = { 5, 5, 5, 5 },
640641
.supported_rotations = DRM_MODE_ROTATE_90 | DRM_MODE_ROTATE_270 |
641642
DRM_MODE_REFLECT_X | DRM_MODE_REFLECT_Y,
642643
.type = DRM_PLANE_TYPE_PRIMARY,
@@ -654,7 +655,7 @@ static const struct vop2_win_data rk3588_vop_win_data[] = {
654655
.nformats = ARRAY_SIZE(formats_esmart),
655656
.format_modifiers = format_modifiers,
656657
.base = 0x1800,
657-
.layer_sel_id = 2,
658+
.layer_sel_id = { 2, 2, 2, 2 },
658659
.supported_rotations = DRM_MODE_REFLECT_Y,
659660
.type = DRM_PLANE_TYPE_OVERLAY,
660661
.axi_bus_id = 0,
@@ -670,7 +671,7 @@ static const struct vop2_win_data rk3588_vop_win_data[] = {
670671
.nformats = ARRAY_SIZE(formats_esmart),
671672
.format_modifiers = format_modifiers,
672673
.base = 0x1a00,
673-
.layer_sel_id = 3,
674+
.layer_sel_id = { 3, 3, 3, 3 },
674675
.supported_rotations = DRM_MODE_REFLECT_Y,
675676
.type = DRM_PLANE_TYPE_OVERLAY,
676677
.axi_bus_id = 0,
@@ -686,7 +687,7 @@ static const struct vop2_win_data rk3588_vop_win_data[] = {
686687
.formats = formats_esmart,
687688
.nformats = ARRAY_SIZE(formats_esmart),
688689
.format_modifiers = format_modifiers,
689-
.layer_sel_id = 6,
690+
.layer_sel_id = { 6, 6, 6, 6 },
690691
.supported_rotations = DRM_MODE_REFLECT_Y,
691692
.type = DRM_PLANE_TYPE_OVERLAY,
692693
.axi_bus_id = 1,
@@ -702,7 +703,7 @@ static const struct vop2_win_data rk3588_vop_win_data[] = {
702703
.nformats = ARRAY_SIZE(formats_esmart),
703704
.format_modifiers = format_modifiers,
704705
.base = 0x1e00,
705-
.layer_sel_id = 7,
706+
.layer_sel_id = { 7, 7, 7, 7 },
706707
.supported_rotations = DRM_MODE_REFLECT_Y,
707708
.type = DRM_PLANE_TYPE_OVERLAY,
708709
.axi_bus_id = 1,
@@ -1454,7 +1455,7 @@ static void rk3568_vop2_setup_layer_mixer(struct vop2_video_port *vp)
14541455
*/
14551456
for (old_layer_id = 0; old_layer_id < vop2->data->win_size; old_layer_id++) {
14561457
layer_sel_id = (layer_sel >> (4 * old_layer_id)) & 0xf;
1457-
if (layer_sel_id == win->data->layer_sel_id)
1458+
if (layer_sel_id == win->data->layer_sel_id[vp->id])
14581459
break;
14591460
}
14601461

@@ -1464,7 +1465,7 @@ static void rk3568_vop2_setup_layer_mixer(struct vop2_video_port *vp)
14641465
for (i = 0; i < vop2->data->win_size; i++) {
14651466
old_win = &vop2->win[i];
14661467
layer_sel_id = (layer_sel >> (4 * layer_id)) & 0xf;
1467-
if (layer_sel_id == old_win->data->layer_sel_id)
1468+
if (layer_sel_id == old_win->data->layer_sel_id[vp->id])
14681469
break;
14691470
}
14701471

@@ -1512,13 +1513,14 @@ static void rk3568_vop2_setup_layer_mixer(struct vop2_video_port *vp)
15121513
}
15131514

15141515
layer_sel &= ~RK3568_OVL_LAYER_SEL__LAYER(layer_id, 0x7);
1515-
layer_sel |= RK3568_OVL_LAYER_SEL__LAYER(layer_id, win->data->layer_sel_id);
1516+
layer_sel |= RK3568_OVL_LAYER_SEL__LAYER(layer_id, win->data->layer_sel_id[vp->id]);
15161517
/*
15171518
* When we bind a window from layerM to layerN, we also need to move the old
15181519
* window on layerN to layerM to avoid one window selected by two or more layers.
15191520
*/
15201521
layer_sel &= ~RK3568_OVL_LAYER_SEL__LAYER(old_layer_id, 0x7);
1521-
layer_sel |= RK3568_OVL_LAYER_SEL__LAYER(old_layer_id, old_win->data->layer_sel_id);
1522+
layer_sel |= RK3568_OVL_LAYER_SEL__LAYER(old_layer_id,
1523+
old_win->data->layer_sel_id[vp->id]);
15221524
}
15231525

15241526
vop2_writel(vop2, RK3568_OVL_LAYER_SEL, layer_sel);

0 commit comments

Comments
 (0)