From b98e2935766e2ae69ce0bd55b4a774da2aece579 Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Mon, 17 Jun 2024 10:26:55 +0800 Subject: [PATCH 1/9] media: rockchip: isp: fix cac for multi sensor Change-Id: Ia63c5129ca28ff8d683cd35b56bb2d57b58682e4 Signed-off-by: Cai YiWei --- drivers/media/platform/rockchip/isp/hw.c | 5 ++++ drivers/media/platform/rockchip/isp/rkisp.c | 32 ++++++++++----------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/hw.c b/drivers/media/platform/rockchip/isp/hw.c index ec7360f24be0..df9d2602c806 100644 --- a/drivers/media/platform/rockchip/isp/hw.c +++ b/drivers/media/platform/rockchip/isp/hw.c @@ -573,6 +573,11 @@ void rkisp_hw_reg_restore(struct rkisp_hw_dev *dev) writel(val, base + ISP_MPFBC_HEAD_PTR); val = rkisp_read_reg_cache(isp, MI_SWS_3A_WR_BASE); writel(val, base + MI_SWS_3A_WR_BASE); + /* force for cac to read lut */ + if (dev->isp_ver >= ISP_V33) { + val = rkisp_read_reg_cache(isp, ISP3X_CAC_BASE); + writel(val, base + ISP3X_CAC_BASE); + } } if (dev->is_single) { diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index 5cdecc79a4fc..e81ffc788b53 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -675,9 +675,21 @@ void rkisp_trigger_read_back(struct rkisp_device *dev, u8 dma2frm, u32 mode, boo writel(0, hw->base_addr + CIF_IRCL); } + /* sensor mode & index */ + if (dev->isp_ver >= ISP_V21) { + val = rkisp_read_reg_cache(dev, ISP_ACQ_H_OFFS); + val |= ISP21_SENSOR_INDEX(dev->multi_index); + if (dev->isp_ver == ISP_V32_L) + val |= ISP32L_SENSOR_MODE(dev->multi_mode); + else + val |= ISP21_SENSOR_MODE(dev->multi_mode); + writel(val, hw->base_addr + ISP_ACQ_H_OFFS); + if (hw->unite == ISP_UNITE_TWO) + writel(val, hw->base_next_addr + ISP_ACQ_H_OFFS); + } rkisp_update_regs(dev, CTRL_VI_ISP_PATH, SUPER_IMP_COLOR_CR); rkisp_update_regs(dev, DUAL_CROP_M_H_OFFS, ISP3X_DUAL_CROP_FBC_V_SIZE); - rkisp_update_regs(dev, ISP_ACQ_H_OFFS, DUAL_CROP_CTRL); + rkisp_update_regs(dev, ISP_ACQ_V_OFFS, DUAL_CROP_CTRL); rkisp_update_regs(dev, ISP39_LDCV_BIC_TABLE0, MI_WR_CTRL); rkisp_update_regs(dev, SELF_RESIZE_SCALE_HY, ISP39_LDCV_CTRL); rkisp_update_regs(dev, ISP32_BP_RESIZE_SCALE_HY, SELF_RESIZE_CTRL); @@ -702,21 +714,9 @@ void rkisp_trigger_read_back(struct rkisp_device *dev, u8 dma2frm, u32 mode, boo rkisp_write(dev, ISP39_MAIN_SCALE_UPDATE, ISP32_SCALE_FORCE_UPD, true); rkisp_unite_write(dev, ISP3X_MI_WR_INIT, CIF_MI_INIT_SOFT_UPD, true); } - /* sensor mode & index */ - if (dev->isp_ver >= ISP_V21) { - val = rkisp_read_reg_cache(dev, ISP_ACQ_H_OFFS); - val |= ISP21_SENSOR_INDEX(dev->multi_index); - if (dev->isp_ver == ISP_V32_L || dev->isp_ver == ISP_V39) - val |= ISP32L_SENSOR_MODE(dev->multi_mode); - else - val |= ISP21_SENSOR_MODE(dev->multi_mode); - writel(val, hw->base_addr + ISP_ACQ_H_OFFS); - if (hw->unite == ISP_UNITE_TWO) - writel(val, hw->base_next_addr + ISP_ACQ_H_OFFS); - v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev, - "sensor mode:%d index:%d | 0x%x\n", - dev->multi_mode, dev->multi_index, val); - } + v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev, + "sensor mode:%d index:%d | 0x%x\n", + dev->multi_mode, dev->multi_index, rkisp_read(dev, ISP_ACQ_H_OFFS, true)); is_upd = true; } From 151ca068c0c8b0ddd5ea14233208e70b55ccad3b Mon Sep 17 00:00:00 2001 From: Yifeng Zhao Date: Wed, 12 Jun 2024 15:05:24 +0800 Subject: [PATCH 2/9] fs: inline_crypt: add parameter check force_page_cache_ra did not perform parameter checking when calling fscryptnode_uses_fs_layer_crypto, resulting in illegal memory access. Bug: Unable to handle kernel access to user memory outside uaccess routines at virtual address 0000000000000011 pc : __fscrypt_inode_uses_inline_crypto+0x4/0xc lr : force_page_cache_ra+0x7c/0x128 sp : ffffffc00d593ad0 x29: ffffffc00d593ad0 x28: 00000000ffffffff x27: ffffffc00d593d40 x26: 0000000000000000 x25: 0000000000000153 x24: 0000000000000143 fscrypt_inode_uses_inline_crypto+0x4/0xc page_cache_sync_ra+0x68/0x90 filemap_read+0x194/0xb14 generic_file_read_iter+0x44/0x134 vfs_read+0x1a8/0x27c arm64_sys_pread64+0x84/0xc8 invoke_syscall+0x40/0x104 el0_svc_common+0xbc/0x168 do_el0_svc+0x1c/0x28 el0_svc+0x1c/0x68 el0t_64_sync_handler+0x68/0xb4 el0t_64_sync+0x164/0x168 Signed-off-by: Yifeng Zhao Change-Id: I5a69580f26e578e46110782d3d20c9f1df2acd50 --- fs/crypto/inline_crypt.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fs/crypto/inline_crypt.c b/fs/crypto/inline_crypt.c index 8bfb3ce86476..a62ff92e9e9b 100644 --- a/fs/crypto/inline_crypt.c +++ b/fs/crypto/inline_crypt.c @@ -228,6 +228,8 @@ void fscrypt_destroy_inline_crypt_key(struct super_block *sb, bool __fscrypt_inode_uses_inline_crypto(const struct inode *inode) { + if (!inode->i_crypt_info) + return false; return inode->i_crypt_info->ci_inlinecrypt; } EXPORT_SYMBOL_GPL(__fscrypt_inode_uses_inline_crypto); From 515e6a07f543a99bba28f34e613710735af11661 Mon Sep 17 00:00:00 2001 From: Huang zhibao Date: Tue, 21 May 2024 15:13:39 +0800 Subject: [PATCH 3/9] arm64: configs: Add rk3576_nvr.config Change-Id: I31a0edbe30a2bccf13c30b0c47b89620a4f8d2f8 Signed-off-by: Huang zhibao --- arch/arm64/configs/rk3576_nvr.config | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 arch/arm64/configs/rk3576_nvr.config diff --git a/arch/arm64/configs/rk3576_nvr.config b/arch/arm64/configs/rk3576_nvr.config new file mode 100644 index 000000000000..e10b5bd12912 --- /dev/null +++ b/arch/arm64/configs/rk3576_nvr.config @@ -0,0 +1,5 @@ +CONFIG_DMABUF_PARTIAL=y +# CONFIG_HIGH_RES_TIMERS is not set +CONFIG_HZ=100 +CONFIG_HZ_100=y +# CONFIG_HZ_250 is not set From 2a8fb9afc429de42c04dced50983f58d1c5317bd Mon Sep 17 00:00:00 2001 From: Tao Huang Date: Mon, 17 Jun 2024 19:29:00 +0800 Subject: [PATCH 4/9] arm64: dts: rockchip: rk3576: Use tab indent on system-status-level No functional change. Signed-off-by: Tao Huang Change-Id: I9a9a69b4934b55569db7d8c2d56833a4f8ecb65c --- arch/arm64/boot/dts/rockchip/rk3576.dtsi | 26 ++++++++++++------------ 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/arch/arm64/boot/dts/rockchip/rk3576.dtsi b/arch/arm64/boot/dts/rockchip/rk3576.dtsi index 850d5fed2f70..83e11e7cd5ee 100644 --- a/arch/arm64/boot/dts/rockchip/rk3576.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3576.dtsi @@ -794,19 +794,19 @@ upthreshold = <40>; downdifferential = <20>; system-status-level = < - /*system status freq level*/ - SYS_STATUS_NORMAL DMC_FREQ_LEVEL_MID_HIGH - SYS_STATUS_REBOOT DMC_FREQ_LEVEL_HIGH - SYS_STATUS_SUSPEND DMC_FREQ_LEVEL_LOW - SYS_STATUS_VIDEO_4K DMC_FREQ_LEVEL_MID_HIGH - SYS_STATUS_VIDEO_4K_10B DMC_FREQ_LEVEL_MID_HIGH - SYS_STATUS_VIDEO_SVEP DMC_FREQ_LEVEL_MID_HIGH - SYS_STATUS_BOOST DMC_FREQ_LEVEL_HIGH - SYS_STATUS_ISP DMC_FREQ_LEVEL_HIGH - SYS_STATUS_PERFORMANCE DMC_FREQ_LEVEL_HIGH - SYS_STATUS_DUALVIEW DMC_FREQ_LEVEL_HIGH - SYS_STATUS_HDMIRX DMC_FREQ_LEVEL_HIGH - SYS_STATUS_DEEP_SUSPEND DMC_FREQ_LEVEL_HIGH + /* system status freq level */ + SYS_STATUS_NORMAL DMC_FREQ_LEVEL_MID_HIGH + SYS_STATUS_REBOOT DMC_FREQ_LEVEL_HIGH + SYS_STATUS_SUSPEND DMC_FREQ_LEVEL_LOW + SYS_STATUS_VIDEO_4K DMC_FREQ_LEVEL_MID_HIGH + SYS_STATUS_VIDEO_4K_10B DMC_FREQ_LEVEL_MID_HIGH + SYS_STATUS_VIDEO_SVEP DMC_FREQ_LEVEL_MID_HIGH + SYS_STATUS_BOOST DMC_FREQ_LEVEL_HIGH + SYS_STATUS_ISP DMC_FREQ_LEVEL_HIGH + SYS_STATUS_PERFORMANCE DMC_FREQ_LEVEL_HIGH + SYS_STATUS_DUALVIEW DMC_FREQ_LEVEL_HIGH + SYS_STATUS_HDMIRX DMC_FREQ_LEVEL_HIGH + SYS_STATUS_DEEP_SUSPEND DMC_FREQ_LEVEL_HIGH >; auto-freq-en = <1>; status = "disabled"; From c7ad4cd1f93d6a6a585f11eed4bbae669e1c6745 Mon Sep 17 00:00:00 2001 From: Huang zhibao Date: Tue, 21 May 2024 11:26:07 +0800 Subject: [PATCH 5/9] arm64: dts: rockchip: add rk3576 nvr demo device tree Change-Id: Ifbf7ed01b690b940f561d480dd98e67cb44e7d5c Signed-off-by: Huang zhibao Signed-off-by: Xiao Ya peng --- arch/arm64/boot/dts/rockchip/Makefile | 1 + .../boot/dts/rockchip/rk3576-nvr-v10.dts | 238 ++++++++++++++++++ 2 files changed, 239 insertions(+) create mode 100644 arch/arm64/boot/dts/rockchip/rk3576-nvr-v10.dts diff --git a/arch/arm64/boot/dts/rockchip/Makefile b/arch/arm64/boot/dts/rockchip/Makefile index db2edb5c7352..4a8f5e8c89cc 100644 --- a/arch/arm64/boot/dts/rockchip/Makefile +++ b/arch/arm64/boot/dts/rockchip/Makefile @@ -256,6 +256,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3576-industry-evb-v10.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3576-iotest-v10.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3576-iotest-v10-edp2dp.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3576-iotest-v10-linux.dtb +dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3576-nvr-v10.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3576-tablet-v10.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3576-test1-v10.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3576-test1-v10-eink.dtb diff --git a/arch/arm64/boot/dts/rockchip/rk3576-nvr-v10.dts b/arch/arm64/boot/dts/rockchip/rk3576-nvr-v10.dts new file mode 100644 index 000000000000..1f53c5d4f2ae --- /dev/null +++ b/arch/arm64/boot/dts/rockchip/rk3576-nvr-v10.dts @@ -0,0 +1,238 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2024 Rockchip Electronics Co., Ltd. + * + */ + +/dts-v1/; + +#include +#include "rk3576.dtsi" +#include "rk3576-cpu-swap.dtsi" +#include "rk3576-evb2.dtsi" +#include "rk3576-evb2-rk628-bt1120-to-hdmi.dtsi" +#include "rk3576-evb2-rk628-hdmi2csi.dtsi" +#include "rk3576-linux.dtsi" + +/ { + model = "Rockchip RK3576 EVB2 V10 NVR Board"; + compatible = "rockchip,rk3576-nvr-v10", "rockchip,rk3576"; +}; + +&cluster0_opp_table { + /delete-node/ opp-408000000; + /delete-node/ opp-600000000; + /delete-node/ opp-816000000; + /delete-node/ opp-1008000000; + /delete-node/ opp-1200000000; + /delete-node/ opp-1416000000; + /delete-node/ opp-2208000000; +}; + +&cluster1_opp_table { + /delete-node/ opp-408000000; + /delete-node/ opp-600000000; + /delete-node/ opp-816000000; + /delete-node/ opp-1008000000; + /delete-node/ opp-1200000000; + /delete-node/ opp-1416000000; + /delete-node/ opp-2304000000; +}; + +&display_subsystem { + /delete-property/ clkcks; + /delete-property/ clocks-names; +}; + +&dmc { + status = "okay"; + center-supply = <&vdd_ddr_s0>; + mem-supply = <&vdd_logic_s0>; + system-status-level = < + /* system status freq level */ + SYS_STATUS_NORMAL DMC_FREQ_LEVEL_HIGH + SYS_STATUS_REBOOT DMC_FREQ_LEVEL_HIGH + SYS_STATUS_SUSPEND DMC_FREQ_LEVEL_LOW + SYS_STATUS_VIDEO_4K DMC_FREQ_LEVEL_MID_HIGH + SYS_STATUS_VIDEO_4K_10B DMC_FREQ_LEVEL_MID_HIGH + SYS_STATUS_VIDEO_SVEP DMC_FREQ_LEVEL_MID_HIGH + SYS_STATUS_BOOST DMC_FREQ_LEVEL_HIGH + SYS_STATUS_ISP DMC_FREQ_LEVEL_HIGH + SYS_STATUS_PERFORMANCE DMC_FREQ_LEVEL_HIGH + SYS_STATUS_DUALVIEW DMC_FREQ_LEVEL_HIGH + SYS_STATUS_HDMIRX DMC_FREQ_LEVEL_HIGH + SYS_STATUS_DEEP_SUSPEND DMC_FREQ_LEVEL_HIGH + >; + auto-freq-en = <0>; +}; + +&dp0_in_vp0 { + status = "okay"; +}; + +&dp0_in_vp1 { + status = "okay"; +}; + +&dp0_in_vp2 { + status = "okay"; +}; + +&hdmi_in_vp0 { + status = "okay"; +}; + +&hdmi_in_vp1 { + status = "okay"; +}; + +&hdmi_in_vp2 { + status = "okay"; +}; + +&npu_opp_table { + /delete-node/ opp-1000000000; +}; + +&rgb_in_vp1 { + status = "okay"; +}; + +&rgb_in_vp2 { + status = "okay"; +}; + +&route_dp0 { + status = "okay"; + connect = <&vp0_out_dp0>; + force-output; + + force_timing { + clock-frequency = <65000000>; + hactive = <1024>; + vactive = <768>; + hfront-porch = <24>; + hsync-len = <136>; + hback-porch = <160>; + vfront-porch = <3>; + vsync-len = <6>; + vback-porch = <29>; + hsync-active = <0>; + vsync-active = <0>; + de-active = <0>; + pixelclk-active = <0>; + }; +}; + +&route_hdmi { + status = "okay"; + connect = <&vp0_out_hdmi>; + force-output; + + force_timing { + clock-frequency = <65000000>; + hactive = <1024>; + vactive = <768>; + hfront-porch = <24>; + hsync-len = <136>; + hback-porch = <160>; + vfront-porch = <3>; + vsync-len = <6>; + vback-porch = <29>; + hsync-active = <0>; + vsync-active = <0>; + de-active = <0>; + pixelclk-active = <0>; + }; +}; + +&route_rgb { + status = "okay"; + connect = <&vp1_out_rgb>; + + force-bus-format = ; + force-output; + + force_timing { + clock-frequency = <65000000>; + hactive = <1024>; + vactive = <768>; + hfront-porch = <24>; + hsync-len = <136>; + hback-porch = <160>; + vfront-porch = <3>; + vsync-len = <6>; + vback-porch = <29>; + hsync-active = <1>; + vsync-active = <1>; + de-active = <0>; + pixelclk-active = <0>; + }; +}; + +&rk628d { + display-timings { + src-timing { + clock-frequency = <65000000>; + hactive = <1024>; + vactive = <768>; + hfront-porch = <24>; + hsync-len = <136>; + hback-porch = <160>; + vfront-porch = <3>; + vsync-len = <6>; + vback-porch = <29>; + hsync-active = <1>; + vsync-active = <1>; + de-active = <0>; + pixelclk-active = <0>; + }; + + dst-timing { + clock-frequency = <65000000>; + hactive = <1024>; + vactive = <768>; + hfront-porch = <24>; + hsync-len = <136>; + hback-porch = <160>; + vfront-porch = <3>; + vsync-len = <6>; + vback-porch = <29>; + hsync-active = <0>; + vsync-active = <0>; + de-active = <0>; + pixelclk-active = <0>; + }; + }; +}; + +&rkisp_vir0_sditf { + status = "okay"; +}; + +&rkvpss { + status = "okay"; +}; + +&rkvpss_mmu { + status = "okay"; +}; + +&rkvpss_vir0 { + status = "okay"; +}; + +&vp0 { + assigned-clocks = <&cru DCLK_VP0_SRC>; + assigned-clock-parents = <&cru PLL_VPLL>; +}; + +&vp1 { + assigned-clocks = <&cru DCLK_VP1_SRC>; + assigned-clock-parents = <&cru PLL_VPLL>; +}; + +&vp2 { + assigned-clocks = <&cru DCLK_VP2_SRC>; + assigned-clock-parents = <&cru PLL_GPLL>; +}; From a63bd899a8234f87f26534b83e1be7a94faef919 Mon Sep 17 00:00:00 2001 From: Damon Ding Date: Mon, 17 Jun 2024 15:30:13 +0800 Subject: [PATCH 6/9] drm/rockchip: analogix_dp: init audio in .late_register() of drm_encoder_func According to Documentation/driver-api/driver-model/driver.rst, a warning as follow: -EPROBE_DEFER must not be returned if probe() has already created child devices, even if those child devices are removed again in a cleanup path. If -EPROBE_DEFER is returned after a child device has been registered, it may result in an infinite loop of .probe() calls to the same driver. To avoid this issue, we init the audio in .late_register() of drm_encoder_func. Change-Id: Id2219e0225a88075780ea4d0d5030b30e4d97f8c Signed-off-by: Damon Ding --- .../gpu/drm/rockchip/analogix_dp-rockchip.c | 54 +++++++++++-------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c index 323f4960b64c..861c407b2ab4 100644 --- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c @@ -569,6 +569,35 @@ static int rockchip_dp_of_probe(struct rockchip_dp_device *dp) return 0; } +static int analogix_dp_encoder_late_register(struct drm_encoder *encoder) +{ + struct rockchip_dp_device *dp = encoder_to_dp(encoder); + struct device *dev = dp->dev; + + if (dp->data->audio) { + struct hdmi_codec_pdata codec_data = { + .ops = &rockchip_dp_audio_codec_ops, + .spdif = 1, + .i2s = 1, + .max_i2s_channels = 8, + }; + + dp->audio_pdev = platform_device_register_data(dev, HDMI_CODEC_DRV_NAME, + PLATFORM_DEVID_AUTO, + &codec_data, + sizeof(codec_data)); + if (IS_ERR(dp->audio_pdev)) + dev_warn(dev, "failed to initialize audio\n"); + } + + return 0; +} + +static const struct drm_encoder_funcs analogix_dp_encoder_func = { + .destroy = drm_encoder_cleanup, + .late_register = analogix_dp_encoder_late_register, +}; + static int rockchip_dp_drm_create_encoder(struct rockchip_dp_device *dp) { struct drm_encoder *encoder = &dp->encoder.encoder; @@ -580,8 +609,8 @@ static int rockchip_dp_drm_create_encoder(struct rockchip_dp_device *dp) dev->of_node); DRM_DEBUG_KMS("possible_crtcs = 0x%x\n", encoder->possible_crtcs); - ret = drm_simple_encoder_init(drm_dev, encoder, - DRM_MODE_ENCODER_TMDS); + ret = drm_encoder_init(drm_dev, encoder, &analogix_dp_encoder_func, + DRM_MODE_ENCODER_TMDS, NULL); if (ret) { DRM_ERROR("failed to initialize encoder with drm\n"); return ret; @@ -611,25 +640,6 @@ static int rockchip_dp_bind(struct device *dev, struct device *master, dp->plat_data.encoder = &dp->encoder.encoder; } - if (dp->data->audio) { - struct hdmi_codec_pdata codec_data = { - .ops = &rockchip_dp_audio_codec_ops, - .spdif = 1, - .i2s = 1, - .max_i2s_channels = 8, - }; - - dp->audio_pdev = - platform_device_register_data(dev, HDMI_CODEC_DRV_NAME, - PLATFORM_DEVID_AUTO, - &codec_data, - sizeof(codec_data)); - if (IS_ERR(dp->audio_pdev)) { - ret = PTR_ERR(dp->audio_pdev); - goto err_cleanup_encoder; - } - } - ret = analogix_dp_bind(dp->adp, drm_dev); if (ret) goto err_unregister_audio_pdev; @@ -639,8 +649,6 @@ static int rockchip_dp_bind(struct device *dev, struct device *master, err_unregister_audio_pdev: if (dp->audio_pdev) platform_device_unregister(dp->audio_pdev); -err_cleanup_encoder: - dp->encoder.encoder.funcs->destroy(&dp->encoder.encoder); return ret; } From 709a9da20ee3e2f7c2180a43e1376886f0c869ef Mon Sep 17 00:00:00 2001 From: Sandy Huang Date: Mon, 3 Jun 2024 14:32:34 +0800 Subject: [PATCH 7/9] drm/rockchip: vop2: fix some plane may be lost If dts assigned esmart1-win0 as vp1 primary plane but vp1 is disabled, the esmart1-win0 plane may be lost. Fixes: 1568e5614d9a ("drm/rockchip: vop2: not to register crtc for inactive video port") Signed-off-by: Sandy Huang Change-Id: I13675bd0695c342bceccba224ff64a2e5dc1f9e0 --- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index 04bcf57a8e94..730e215cb909 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -13157,8 +13157,10 @@ static int vop2_create_crtc(struct vop2 *vop2, uint8_t enabled_vp_mask) /* * make sure that the vp to be registered has at least one connector. */ - if (!(enabled_vp_mask & BIT(vp->id))) + if (!(enabled_vp_mask & BIT(vp->id))) { + vop2->vps[vp->id].primary_plane_phy_id = ROCKCHIP_VOP2_PHY_ID_INVALID; continue; + } /* * we assume a vp with a zero plane_mask(set from dts or bootloader) From b5903b409dd622cc1884b890324ae29aa635bea2 Mon Sep 17 00:00:00 2001 From: Sandy Huang Date: Mon, 3 Jun 2024 15:12:21 +0800 Subject: [PATCH 8/9] drm/rockchip: vop2: no need to double attach cluster win share_id_prop Cluster win only need to attach share_id_prop as ordinary win, just like esmart parent win. Fixes: 48c83387b1b1 ("drm/rockchip: vop2: Add unique share id for Cluster window") Signed-off-by: Sandy Huang Change-Id: I45a7486c73ca75a04baba6eb1ac4bda3daab3caa --- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index 730e215cb909..cd27816902ba 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -12738,9 +12738,6 @@ static int vop2_plane_init(struct vop2 *vop2, struct vop2_win *win, unsigned lon drm_object_attach_property(&win->base.base, private->async_commit_prop, 0); - if (win->feature & (WIN_FEATURE_CLUSTER_SUB | WIN_FEATURE_CLUSTER_MAIN)) - drm_object_attach_property(&win->base.base, private->share_id_prop, win->plane_id); - if (win->parent) drm_object_attach_property(&win->base.base, private->share_id_prop, win->parent->base.base.id); From c50cc550bfa0dd274edbe30cbe69acf6e4ea3de9 Mon Sep 17 00:00:00 2001 From: Frank Wang Date: Tue, 28 May 2024 15:03:21 +0800 Subject: [PATCH 9/9] usb: typec: tcpm: handle nak for discover modes command When a NAK is received in one Discover Modes, the Initiator should skip consuming modes and continue to request Discover Modes for the rest of SVIDs or register altmodes that have been consumed in previous ACK. This fixes a few USB-C Docking Stations failed to register DP alternate mode since they respond a ACK in the DP SID Discover Modes first and a NAK in the second VID Discover Modes. Signed-off-by: Frank Wang Change-Id: I52d3fae2731fbe88445f47be3ffee20751309ea4 --- drivers/usb/typec/tcpm/tcpm.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c index 3d6d775e5363..f246d1929cab 100644 --- a/drivers/usb/typec/tcpm/tcpm.c +++ b/drivers/usb/typec/tcpm/tcpm.c @@ -1777,7 +1777,27 @@ static int tcpm_pd_svdm(struct tcpm_port *port, struct typec_altmode *adev, } fallthrough; case CMD_DISCOVER_SVID: + break; case CMD_DISCOVER_MODES: + /* + * 6.4.4.3.3 + * A Responder that does not support any Modes Shall return a NAK. + * + * When Initiator meets this case, it should skip + * consuming modes and continue to request Discover + * Modes for the rest of SVIDs or register altmodes + * that have been consumed in previous ACK. + */ + modep->svid_index++; + if (modep->svid_index < modep->nsvids) { + u16 svid = modep->svids[modep->svid_index]; + + response[0] = VDO(svid, 1, svdm_version, CMD_DISCOVER_MODES); + rlen = 1; + } else if (port->data_role == TYPEC_HOST) { + tcpm_register_partner_altmodes(port); + } + break; case VDO_CMD_VENDOR(0) ... VDO_CMD_VENDOR(15): break; case CMD_ENTER_MODE: