mirror of
https://github.com/LibreELEC/LibreELEC.tv
synced 2025-09-24 19:46:01 +07:00
53 lines
2.1 KiB
Diff
53 lines
2.1 KiB
Diff
From a28c0ccd253ccfe71781c4874be2f82cfb5e1494 Mon Sep 17 00:00:00 2001
|
|
From: Andy Yan <andy.yan@rock-chips.com>
|
|
Date: Fri, 18 Jul 2025 14:41:14 +0800
|
|
Subject: [PATCH 064/113] FROMLIST(v1): drm/rockchip: vop2: Only wait for
|
|
changed layer cfg done when there is pending cfgdone bits
|
|
|
|
The write of cfgdone bits always done at .atomic_flush.
|
|
When userspace makes plane zpos changes of two crtc within one commit,
|
|
at the .atomic_begin stage, crtcN will never receive the "layer change
|
|
cfg done" event of crtcM because crtcM has not yet written "cfgdone".
|
|
So only wait when there is pending cfgdone bits to avoid long timeout.
|
|
|
|
Fixes: 3e89a8c68354 ("drm/rockchip: vop2: Fix the update of LAYER/PORT select registers when there are multi display output on rk3588/rk3568")
|
|
Signed-off-by: Andy Yan <andy.yan@rock-chips.com>
|
|
---
|
|
drivers/gpu/drm/rockchip/rockchip_vop2_reg.c | 13 +++++++++++--
|
|
1 file changed, 11 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
|
|
index 928aff657d8c..f18ddf3240ab 100644
|
|
--- a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
|
|
+++ b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
|
|
@@ -2106,6 +2106,7 @@ static void rk3568_vop2_setup_layer_mixer(struct vop2_video_port *vp)
|
|
u8 layer_sel_id;
|
|
unsigned int ofs;
|
|
u32 ovl_ctrl;
|
|
+ u32 cfg_done;
|
|
int i;
|
|
struct vop2_video_port *vp0 = &vop2->vps[0];
|
|
struct vop2_video_port *vp1 = &vop2->vps[1];
|
|
@@ -2260,8 +2261,16 @@ static void rk3568_vop2_setup_layer_mixer(struct vop2_video_port *vp)
|
|
rk3568_vop2_wait_for_port_mux_done(vop2);
|
|
}
|
|
|
|
- if (layer_sel != old_layer_sel && atv_layer_sel != old_layer_sel)
|
|
- rk3568_vop2_wait_for_layer_cfg_done(vop2, vop2->old_layer_sel);
|
|
+ if (layer_sel != old_layer_sel && atv_layer_sel != old_layer_sel) {
|
|
+ cfg_done = vop2_readl(vop2, RK3568_REG_CFG_DONE);
|
|
+ cfg_done &= (BIT(vop2->data->nr_vps) - 1);
|
|
+ cfg_done &= ~BIT(vp->id);
|
|
+ /*
|
|
+ * Changes of other VPs' overlays have not taken effect
|
|
+ */
|
|
+ if (cfg_done)
|
|
+ rk3568_vop2_wait_for_layer_cfg_done(vop2, vop2->old_layer_sel);
|
|
+ }
|
|
|
|
vop2_writel(vop2, RK3568_OVL_LAYER_SEL, layer_sel);
|
|
mutex_unlock(&vop2->ovl_lock);
|
|
--
|
|
2.34.1
|
|
|