From 79eeda1e568c0ca8196bf2f6884fa22958fabd61 Mon Sep 17 00:00:00 2001 From: Jianwei Fan Date: Thu, 7 Aug 2025 10:44:48 +0800 Subject: [PATCH 01/10] media: i2c: rk628: fix debugfs NULL parameter Fixes: 84b836571759 ("media: i2c: rk628: fix debugfs "rk628" parent directory") Signed-off-by: Jianwei Fan Change-Id: Ie6e0fd8439c4dcbd9e432f3ec0a47e72bce989ab --- drivers/media/i2c/rk628/rk628.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/media/i2c/rk628/rk628.c b/drivers/media/i2c/rk628/rk628.c index fe43f2ca3c11..ab354f8d015e 100644 --- a/drivers/media/i2c/rk628/rk628.c +++ b/drivers/media/i2c/rk628/rk628.c @@ -512,9 +512,10 @@ void rk628_debugfs_create(struct rk628 *rk628) struct dentry *debugfs, *debugfs_tmp = debugfs_lookup("rk628", NULL); debugfs = debugfs_tmp; - if (!debugfs) + if (IS_ERR_OR_NULL(debugfs)) debugfs = debugfs_create_dir("rk628", NULL); - dput(debugfs_tmp); + if (!IS_ERR_OR_NULL(debugfs_tmp)) + dput(debugfs_tmp); rk628->debug_dir = debugfs_create_dir(dev_name(rk628->dev), debugfs); if (IS_ERR(rk628->debug_dir)) return; From dfe935e67b31a9810fb4ed590146c81b2b7eda44 Mon Sep 17 00:00:00 2001 From: Chujin Zhou Date: Mon, 4 Aug 2025 10:38:38 +0800 Subject: [PATCH 02/10] ARM: configs: add rv1126b-rk628 configuration Signed-off-by: Chujin Zhou Change-Id: If6e0e2119ffaeec38b2536cd63b058039e627cb6 --- arch/arm/configs/rv1126b-rk628.config | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 arch/arm/configs/rv1126b-rk628.config diff --git a/arch/arm/configs/rv1126b-rk628.config b/arch/arm/configs/rv1126b-rk628.config new file mode 100644 index 000000000000..c7da1a8470be --- /dev/null +++ b/arch/arm/configs/rv1126b-rk628.config @@ -0,0 +1,5 @@ +CONFIG_VIDEO_RK628_CSI=y +CONFIG_VIDEO_ROCKCHIP_HDMIRX_CLASS=y +CONFIG_CEC_CORE=y +CONFIG_HDMI=y +CONFIG_VIDEO_RK628=y From ef6778784a50efff8bbba8669ded498949165706 Mon Sep 17 00:00:00 2001 From: LongChang Ma Date: Sat, 2 Aug 2025 10:05:11 +0800 Subject: [PATCH 03/10] arm64: dts: rockchip: add rv1126b-evb1-v11-dual-cam dts Signed-off-by: LongChang Ma Change-Id: I0f95812c3f913be292807b6ed27f2afa86a3feda --- arch/arm64/boot/dts/rockchip/Makefile | 2 ++ .../rockchip/rv1126b-evb1-v11-dual-cam-csi0.dts | 15 +++++++++++++++ .../rockchip/rv1126b-evb1-v11-dual-cam-csi1.dts | 15 +++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 arch/arm64/boot/dts/rockchip/rv1126b-evb1-v11-dual-cam-csi0.dts create mode 100644 arch/arm64/boot/dts/rockchip/rv1126b-evb1-v11-dual-cam-csi1.dts diff --git a/arch/arm64/boot/dts/rockchip/Makefile b/arch/arm64/boot/dts/rockchip/Makefile index c0bcb890132e..b8205753db22 100644 --- a/arch/arm64/boot/dts/rockchip/Makefile +++ b/arch/arm64/boot/dts/rockchip/Makefile @@ -386,6 +386,8 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rv1126b-evb1-v10-fastboot-spi-nand.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rv1126b-evb1-v10-fastboot-spi-nor.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rv1126b-evb1-v10-spi-nor.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rv1126b-evb1-v11.dtb +dtb-$(CONFIG_ARCH_ROCKCHIP) += rv1126b-evb1-v11-dual-cam-csi0.dtb +dtb-$(CONFIG_ARCH_ROCKCHIP) += rv1126b-evb1-v11-dual-cam-csi1.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rv1126b-evb1-v11-dual-4k.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rv1126b-evb1-v11-fastboot-emmc.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rv1126b-evb1-v11-fastboot-emmc-projector.dtb diff --git a/arch/arm64/boot/dts/rockchip/rv1126b-evb1-v11-dual-cam-csi0.dts b/arch/arm64/boot/dts/rockchip/rv1126b-evb1-v11-dual-cam-csi0.dts new file mode 100644 index 000000000000..5428339c81a3 --- /dev/null +++ b/arch/arm64/boot/dts/rockchip/rv1126b-evb1-v11-dual-cam-csi0.dts @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2025 Rockchip Electronics Co., Ltd. + */ + +/dts-v1/; +#include "rv1126b.dtsi" +#include "rv1126b-evb.dtsi" +#include "rv1126b-evb-dual-cam-csi0.dtsi" +#include "rv1126b-evb1-v11.dtsi" + +/ { + model = "Rockchip RV1126B EVB1 V11 DUAL CAM Board"; + compatible = "rockchip,rv1126b-evb1-v11-dual-cam-csi0", "rockchip,rv1126b"; +}; diff --git a/arch/arm64/boot/dts/rockchip/rv1126b-evb1-v11-dual-cam-csi1.dts b/arch/arm64/boot/dts/rockchip/rv1126b-evb1-v11-dual-cam-csi1.dts new file mode 100644 index 000000000000..089968b6d016 --- /dev/null +++ b/arch/arm64/boot/dts/rockchip/rv1126b-evb1-v11-dual-cam-csi1.dts @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2025 Rockchip Electronics Co., Ltd. + */ + +/dts-v1/; +#include "rv1126b.dtsi" +#include "rv1126b-evb.dtsi" +#include "rv1126b-evb-dual-cam-csi1.dtsi" +#include "rv1126b-evb1-v11.dtsi" + +/ { + model = "Rockchip RV1126B EVB1 V11 DUAL CAM Board"; + compatible = "rockchip,rv1126b-evb1-v11-dual-cam-csi1", "rockchip,rv1126b"; +}; From 1f04733d07e30226506900a760027b903e494ce4 Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Fri, 8 Aug 2025 09:06:56 +0800 Subject: [PATCH 04/10] media: rockchip: isp: fix 3a error for multi sensor only vpss output Change-Id: I35a7b8a1838497055c8c9f700173fe8ca25a1e92 Signed-off-by: Cai YiWei --- .../platform/rockchip/isp/isp_stats_v35.c | 21 ++++++++++--------- drivers/media/platform/rockchip/isp/rkisp.c | 3 +++ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v35.c b/drivers/media/platform/rockchip/isp/isp_stats_v35.c index 86e0888cc000..900d16b7ca63 100644 --- a/drivers/media/platform/rockchip/isp/isp_stats_v35.c +++ b/drivers/media/platform/rockchip/isp/isp_stats_v35.c @@ -407,7 +407,7 @@ rkisp_stats_info2ddr(struct rkisp_isp_stats_vdev *stats_vdev, } static void -rkisp_stats_send_meas_fe(struct rkisp_isp_stats_vdev *stats_vdev) +rkisp_stats_send_meas_fe(struct rkisp_isp_stats_vdev *stats_vdev, u32 w3a_ris) { struct rkisp_isp_params_vdev *params_vdev = &stats_vdev->dev->params_vdev; struct rkisp_isp_params_val_v35 *priv = params_vdev->priv_val; @@ -537,14 +537,14 @@ rkisp_stats_send_meas_fe(struct rkisp_isp_stats_vdev *stats_vdev) vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); } v4l2_dbg(4, rkisp_debug, &stats_vdev->dev->v4l2_dev, - "%s seq:%d params_id:%d ris:0x%x buf:0x%x meas_type:0x%x\n", - __func__, cur_frame_id, params_vdev->cur_fe_frame_id, ris, + "%s seq:%d params_id:%d ris:0x%x w3a:0x%x buf:0x%x meas_type:0x%x\n", + __func__, cur_frame_id, params_vdev->cur_fe_frame_id, ris, w3a_ris, !cur_buf ? -1 : cur_buf->buff_addr[0], !stat_buf ? 0 : stat_buf->meas_type); } static void -rkisp_stats_send_meas(struct rkisp_isp_stats_vdev *stats_vdev) +rkisp_stats_send_meas(struct rkisp_isp_stats_vdev *stats_vdev, u32 w3a_ris) { struct rkisp_isp_params_vdev *params_vdev = &stats_vdev->dev->params_vdev; struct rkisp_isp_params_val_v35 *priv = params_vdev->priv_val; @@ -745,8 +745,8 @@ rkisp_stats_send_meas(struct rkisp_isp_stats_vdev *stats_vdev) vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); } v4l2_dbg(4, rkisp_debug, &stats_vdev->dev->v4l2_dev, - "%s seq:%d params_id:%d ris:0x%x buf:0x%x meas_type:0x%x\n", - __func__, cur_frame_id, params_vdev->cur_frame_id, ris, + "%s seq:%d params_id:%d ris:0x%x w3a:0x%x buf:0x%x meas_type:0x%x\n", + __func__, cur_frame_id, params_vdev->cur_frame_id, ris, w3a_ris, !cur_buf ? -1 : cur_buf->buff_addr[0], !cur_stat_buf ? 0 : cur_stat_buf->meas_type); } @@ -760,15 +760,16 @@ rkisp_stats_isr_v35(struct rkisp_isp_stats_vdev *stats_vdev, rkisp_pdaf_isr(stats_vdev->dev); w3a_ris = rkisp_read(stats_vdev->dev, ISP39_W3A_INT_STAT, true); - if (w3a_ris & ISP39_W3A_INT_ERR_MASK) { - v4l2_err(&stats_vdev->dev->v4l2_dev, "w3a error 0x%x\n", w3a_ris); + if (w3a_ris) { rkisp_write(stats_vdev->dev, ISP39_W3A_INT_STAT, w3a_ris, true); + if (w3a_ris & ISP39_W3A_INT_ERR_MASK) + v4l2_err(&stats_vdev->dev->v4l2_dev, "w3a error 0x%x\n", w3a_ris); } if (isp_ris & ISP3X_BAY3D_FRM_END) - rkisp_stats_send_meas_fe(stats_vdev); + rkisp_stats_send_meas_fe(stats_vdev, w3a_ris); if (isp_ris & ISP3X_FRAME) - rkisp_stats_send_meas(stats_vdev); + rkisp_stats_send_meas(stats_vdev, w3a_ris); } static void diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index d2cdd96358b6..25f32da33b6f 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -2569,6 +2569,9 @@ static int rkisp_isp_start(struct rkisp_device *dev) rkisp_unite_write(dev, CIF_ISP_CTRL, val, is_direct); rkisp_clear_reg_cache_bits(dev, CIF_ISP_CTRL, upd); + val = CIF_MI_CTRL_INIT_BASE_EN | CIF_MI_CTRL_INIT_OFFSET_EN; + rkisp_unite_set_bits(dev, CIF_MI_CTRL, 0, val, false); + dev->isp_err_cnt = 0; dev->isp_isr_cnt = 0; dev->irq_ends_mask |= ISP_FRAME_END; From eccbd3d6aae43fafef3c933324ec316e682e63a0 Mon Sep 17 00:00:00 2001 From: Lin Jinhan Date: Mon, 28 Jul 2025 16:44:39 +0800 Subject: [PATCH 05/10] include: rk-camera-module: add cmd RKMODULE_SET_CHANNEL_POWER Change-Id: Ib0e8d9f03544e82bb1ed9f35950556e4021e0abd Signed-off-by: Lin Jinhan --- include/uapi/linux/rk-camera-module.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/include/uapi/linux/rk-camera-module.h b/include/uapi/linux/rk-camera-module.h index 79e5e0526eb9..d804cd139c88 100644 --- a/include/uapi/linux/rk-camera-module.h +++ b/include/uapi/linux/rk-camera-module.h @@ -250,6 +250,9 @@ #define RKMODULE_GET_HDR_COMPR_SINGLE_FRAME_INFO \ _IOR('V', BASE_VIDIOC_PRIVATE + 62, struct rkmodule_hdr_compr_single_frame_info) +#define RKMODULE_SET_CHANNEL_POWER \ + _IOW('V', BASE_VIDIOC_PRIVATE + 63, struct rkmodule_channel_power) + #define RKMODULE_REG_LIST_MAX (16) struct rkmodule_reg_struct { __u32 reg_addr; @@ -1086,4 +1089,9 @@ struct rkmodule_hdr_compr_single_frame_info { __u32 reserved[8]; }; +struct rkmodule_channel_power { + __u32 channel; + __u32 enable; +}; + #endif /* _UAPI_RKMODULE_CAMERA_H */ From 8abb17057bfeb876aba50434b0fd3dabc1ad3ed6 Mon Sep 17 00:00:00 2001 From: Lin Jinhan Date: Mon, 28 Jul 2025 17:13:00 +0800 Subject: [PATCH 06/10] include: rk-camera-module: add cmd RKMODULE_SET_CHANNEL_STREAM Change-Id: I9cebdde65a9da915c30fc08b292fd38ade17a1e4 Signed-off-by: Lin Jinhan --- include/uapi/linux/rk-camera-module.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/include/uapi/linux/rk-camera-module.h b/include/uapi/linux/rk-camera-module.h index d804cd139c88..74dd3529e118 100644 --- a/include/uapi/linux/rk-camera-module.h +++ b/include/uapi/linux/rk-camera-module.h @@ -253,6 +253,9 @@ #define RKMODULE_SET_CHANNEL_POWER \ _IOW('V', BASE_VIDIOC_PRIVATE + 63, struct rkmodule_channel_power) +#define RKMODULE_SET_CHANNEL_STREAM \ + _IOW('x', 0, struct rkmodule_channel_stream) + #define RKMODULE_REG_LIST_MAX (16) struct rkmodule_reg_struct { __u32 reg_addr; @@ -1094,4 +1097,9 @@ struct rkmodule_channel_power { __u32 enable; }; +struct rkmodule_channel_stream { + __u32 channel; + __u32 enable; +}; + #endif /* _UAPI_RKMODULE_CAMERA_H */ From 4673e18f4296eb279c0d9f16859fb5c930cbb1a9 Mon Sep 17 00:00:00 2001 From: Sandy Huang Date: Thu, 26 Sep 2024 12:00:32 +0800 Subject: [PATCH 07/10] drm/rockchip: vop2: enable writeback complete interrupt for rk3576 Use writeback complete interrupt instead of software mark writeback state and drm_writeback_signal_completion(); Signed-off-by: Sandy Huang Change-Id: I621ba684d64a89cdeb058e79745a75877029b37d --- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 51 ++++++++++++++++---- drivers/gpu/drm/rockchip/rockchip_vop2_reg.c | 1 - 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index caa054ae2569..609cf9b50b89 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -3945,6 +3945,9 @@ static void vop2_wb_irqs_enable(struct vop2 *vop2) const struct vop_intr *intr = &vop2_data->axi_intr[0]; uint32_t irqs = WB_UV_FIFO_FULL_INTR | WB_YRGB_FIFO_FULL_INTR; + if (is_vop3(vop2)) + irqs |= WB_COMPLETE_INTR; + VOP_INTR_SET_TYPE(vop2, intr, clear, irqs, 1); VOP_INTR_SET_TYPE(vop2, intr, enable, irqs, 1); } @@ -3953,7 +3956,7 @@ static uint32_t vop2_read_and_clear_wb_irqs(struct vop2 *vop2) { const struct vop2_data *vop2_data = vop2->data; const struct vop_intr *intr = &vop2_data->axi_intr[0]; - uint32_t irqs = WB_UV_FIFO_FULL_INTR | WB_YRGB_FIFO_FULL_INTR; + uint32_t irqs = WB_UV_FIFO_FULL_INTR | WB_YRGB_FIFO_FULL_INTR | WB_COMPLETE_INTR; uint32_t val; val = VOP_INTR_GET_TYPE(vop2, intr, status, irqs); @@ -3994,13 +3997,14 @@ static void vop2_wb_commit(struct drm_crtc *crtc) drm_writeback_queue_job(wb_conn, conn_state); conn_state->writeback_job = NULL; - - spin_lock_irqsave(&wb->job_lock, flags); - wb->jobs[wb->job_index].pending = true; - wb->job_index++; - if (wb->job_index >= VOP2_WB_JOB_MAX) - wb->job_index = 0; - spin_unlock_irqrestore(&wb->job_lock, flags); + if (vop2->version < VOP_VERSION_RK3576) { + spin_lock_irqsave(&wb->job_lock, flags); + wb->jobs[wb->job_index].pending = true; + wb->job_index++; + if (wb->job_index >= VOP2_WB_JOB_MAX) + wb->job_index = 0; + spin_unlock_irqrestore(&wb->job_lock, flags); + } fifo_throd = fb->pitches[0] >> 4; if (fifo_throd >= vop2->data->wb->fifo_depth) @@ -14371,6 +14375,28 @@ out: return ret; } +static void vop3_writeback_complete(struct vop2 *vop2) +{ + struct vop2_wb *wb = &vop2->wb; + struct vop2_video_port *vp; + uint8_t wb_vp_id; + bool wb_oneframe_mode; + bool wb_en; + + wb_en = VOP_MODULE_GET(vop2, wb, enable); + wb_oneframe_mode = VOP_MODULE_GET(vop2, wb, one_frame_mode); + /* + * The write back should work in one shot mode, + * stop when write back complete in next vsync. + */ + if (wb_en && !wb_oneframe_mode) { + wb_vp_id = VOP_MODULE_GET(vop2, wb, vp_id); + vp = &vop2->vps[wb_vp_id]; + vop2_wb_disable(vp); + } + drm_writeback_signal_completion(&vop2->wb.conn, 0); +} + static irqreturn_t vop3_sys_isr(int irq, void *data) { struct vop2 *vop2 = data; @@ -14423,7 +14449,13 @@ static irqreturn_t vop3_sys_isr(int irq, void *data) active_irqs = wb_irqs; SYS_ERROR_HANDLER(WB_UV_FIFO_FULL); SYS_ERROR_HANDLER(WB_YRGB_FIFO_FULL); - SYS_ERROR_HANDLER(WB_COMPLETE); + if (active_irqs & WB_COMPLETE_INTR) { + active_irqs &= ~WB_COMPLETE_INTR; + vop3_writeback_complete(vop2); + } + /* Unhandled irqs are spurious. */ + if (active_irqs) + DRM_ERROR("Unknown writeback IRQs: %02x\n", active_irqs); } for (i = 0; i < axi_max; i++) { @@ -14496,7 +14528,6 @@ static irqreturn_t vop3_vp_isr(int irq, void *data) if (active_irqs & FS_FIELD_INTR) { rockchip_drm_dbg(vop2->dev, VOP_DEBUG_VSYNC, "vsync_vp%d", vp->id); - vop2_wb_handler(vp); drm_crtc_handle_vblank(crtc); vop2_handle_vblank(vop2, crtc); active_irqs &= ~FS_FIELD_INTR; diff --git a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c index b684cefbb2ae..eab21f2750b4 100644 --- a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c +++ b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c @@ -611,7 +611,6 @@ static const int rk3568_vop_axi_intrs[] = { 0, WB_UV_FIFO_FULL_INTR, WB_YRGB_FIFO_FULL_INTR, - WB_COMPLETE_INTR, }; From 9157f6c553f7f72080b90b9238a94e4578c5e53a Mon Sep 17 00:00:00 2001 From: Chaoyi Chen Date: Fri, 16 May 2025 10:12:39 +0800 Subject: [PATCH 08/10] drm/rockchip: vop2: Remove redundant writeback cleanup The drm_writeback_queue_job() function takes ownership of the passed job and requires the caller to manually set the connector state writeback_job pointer to NULL. Therefore, there is no need to clear the writeback_job again. Related commit: 97eb9eaeb95b ("drm: writeback: Cleanup job ownership handling when queuing job") Change-Id: I74c659f1dd778b5fc72c5705dee9928757f1d17e Signed-off-by: Chaoyi Chen --- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index 609cf9b50b89..19bfcaf3996f 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -3996,7 +3996,6 @@ static void vop2_wb_commit(struct drm_crtc *crtc) fb->pitches[0], &wb_state->yrgb_addr); drm_writeback_queue_job(wb_conn, conn_state); - conn_state->writeback_job = NULL; if (vop2->version < VOP_VERSION_RK3576) { spin_lock_irqsave(&wb->job_lock, flags); wb->jobs[wb->job_index].pending = true; From 75c62984c5ef50fdca5c2a887e8b957492e2690d Mon Sep 17 00:00:00 2001 From: Chaoyi Chen Date: Thu, 15 May 2025 18:32:33 +0800 Subject: [PATCH 09/10] drm/rockchip: vop2: Do not commit writeback when all win disabled When all win is disabled, writeback will not start. Just skip these writeback request. Change-Id: I80aa023b8a1e07ff37a23b4f3f76a6b88219b7aa Signed-off-by: Chaoyi Chen --- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index 19bfcaf3996f..f06cc0eceddb 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -3996,6 +3996,12 @@ static void vop2_wb_commit(struct drm_crtc *crtc) fb->pitches[0], &wb_state->yrgb_addr); drm_writeback_queue_job(wb_conn, conn_state); + if (!vp->enabled_win_mask) { + drm_warn(vop2->drm_dev, "Writeback can not work when all plane are disabled!"); + drm_writeback_signal_completion(&vop2->wb.conn, 0); + return; + } + if (vop2->version < VOP_VERSION_RK3576) { spin_lock_irqsave(&wb->job_lock, flags); wb->jobs[wb->job_index].pending = true; From e6b572efcc8febc5467ee764fbef1f6b316c7806 Mon Sep 17 00:00:00 2001 From: Chaoyi Chen Date: Thu, 7 Aug 2025 19:01:27 +0800 Subject: [PATCH 10/10] drm/rockchip: vop2: Do not clear wb intr status when commit new wb If a new wb commit is too close to the timing of wb dma complete, clearing the wb intr status will lose the wb dma complete status. In this case, the software process is as follows: vop2_wb_commit() -> vop2_wb_irqs_enable() -> Clear wb intr -> vop3_sys_isr()/vop2_isr() -> vop2_read_and_clear_wb_irqs() Since we had cleared the intr in vop2_wb_irqs_enable(), the value read by vop2_read_and_clear_wb_irqs() is 0, and we have lost the interrupt status. Change-Id: I93bf7bd8b57336c7bb64353ce935a6991f93742b Signed-off-by: Chaoyi Chen --- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index f06cc0eceddb..3ef5c987c779 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -3948,7 +3948,6 @@ static void vop2_wb_irqs_enable(struct vop2 *vop2) if (is_vop3(vop2)) irqs |= WB_COMPLETE_INTR; - VOP_INTR_SET_TYPE(vop2, intr, clear, irqs, 1); VOP_INTR_SET_TYPE(vop2, intr, enable, irqs, 1); }