diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile index 43c79cf02f38..8c2e97c96f99 100644 --- a/arch/arm/boot/dts/Makefile +++ b/arch/arm/boot/dts/Makefile @@ -1202,6 +1202,8 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += \ rv1126b-evb2-v12.dtb \ rv1126b-evb2-v12-aov-dual-cam.dtb \ rv1126b-evb2-v12-fastboot-emmc.dtb \ + rv1126b-evb2-v12-fastboot-spi-nand.dtb \ + rv1126b-evb2-v12-fastboot-spi-nor.dtb \ rv1126b-evb3-v10.dtb \ rv1126b-evb4-v10.dtb \ rv1126b-iotest-v10.dtb \ diff --git a/arch/arm/boot/dts/rv1126b-evb2-v12-fastboot-spi-nand.dts b/arch/arm/boot/dts/rv1126b-evb2-v12-fastboot-spi-nand.dts new file mode 100644 index 000000000000..62e5a66d88cb --- /dev/null +++ b/arch/arm/boot/dts/rv1126b-evb2-v12-fastboot-spi-nand.dts @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2025 Rockchip Electronics Co., Ltd. + */ + +#include "arm64/rockchip/rv1126b-evb2-v12-fastboot-spi-nand.dts" + +/ { + model = "Rockchip RV1126B EVB2 V12 Board"; + compatible = "rockchip,rv1126b-evb2-v12-fastboot-spi-nand", "rockchip,rv1126b"; + + chosen { + bootargs = "loglevel=0 initcall_debug=0 earlycon=uart8250,mmio32,0x20810000 console=ttyFIQ0 root=/dev/rd0 rootfstype=erofs rootflags=dax snd_soc_core.prealloc_buffer_size_kbytes=16 coherent_pool=32K"; + }; +}; + +&ramdisk_r { + reg = <0x48c40000 (40 * 0x00100000)>; +}; + +&ramdisk_c { + reg = <0x4b440000 (20 * 0x00100000)>; +}; diff --git a/arch/arm/boot/dts/rv1126b-evb2-v12-fastboot-spi-nor.dts b/arch/arm/boot/dts/rv1126b-evb2-v12-fastboot-spi-nor.dts new file mode 100644 index 000000000000..775cf1cfb910 --- /dev/null +++ b/arch/arm/boot/dts/rv1126b-evb2-v12-fastboot-spi-nor.dts @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2025 Rockchip Electronics Co., Ltd. + */ + +#include "arm64/rockchip/rv1126b-evb2-v12-fastboot-spi-nor.dts" + +/ { + model = "Rockchip RV1126B EVB2 V12 Board"; + compatible = "rockchip,rv1126b-evb2-v12-fastboot-spi-nor", "rockchip,rv1126b"; + + chosen { + bootargs = "loglevel=0 initcall_debug=0 earlycon=uart8250,mmio32,0x20810000 console=ttyFIQ0 root=/dev/rd0 rootfstype=erofs rootflags=dax snd_soc_core.prealloc_buffer_size_kbytes=16 coherent_pool=32K"; + }; +}; + +&ramdisk_r { + reg = <0x48c40000 (20 * 0x00100000)>; +}; + +&ramdisk_c { + reg = <0x4a040000 (10 * 0x00100000)>; +}; diff --git a/arch/arm64/boot/dts/rockchip/Makefile b/arch/arm64/boot/dts/rockchip/Makefile index a2129674aedc..5246e9d814f8 100644 --- a/arch/arm64/boot/dts/rockchip/Makefile +++ b/arch/arm64/boot/dts/rockchip/Makefile @@ -403,6 +403,8 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rv1126b-evb2-v10-rgb-Q7050ITH2641AA1T.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rv1126b-evb2-v10-sii9022-bt1120-to-hdmi.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rv1126b-evb2-v12.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rv1126b-evb2-v12-fastboot-emmc.dtb +dtb-$(CONFIG_ARCH_ROCKCHIP) += rv1126b-evb2-v12-fastboot-spi-nand.dtb +dtb-$(CONFIG_ARCH_ROCKCHIP) += rv1126b-evb2-v12-fastboot-spi-nor.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rv1126b-evb3-v10.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rv1126b-evb4-v10.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rv1126b-iotest-v10.dtb diff --git a/arch/arm64/boot/dts/rockchip/rv1126b-evb2-v12-fastboot-spi-nand.dts b/arch/arm64/boot/dts/rockchip/rv1126b-evb2-v12-fastboot-spi-nand.dts new file mode 100644 index 000000000000..d5ac2eec46fc --- /dev/null +++ b/arch/arm64/boot/dts/rockchip/rv1126b-evb2-v12-fastboot-spi-nand.dts @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2025 Rockchip Electronics Co., Ltd. + */ + +#include "rv1126b-evb2-v12.dts" +#include "rv1126b-fastboot-spi-nand.dtsi" + +/ { + model = "Rockchip RV1126B EVB2 V12 Arm64 Board"; + compatible = "rockchip,rv1126b-evb2-v12-fastboot-spi-nand", "rockchip,rv1126b"; + + chosen { + bootargs = "loglevel=0 initcall_debug=0 earlycon=uart8250,mmio32,0x20810000 console=ttyFIQ0 root=/dev/rd0 rootfstype=erofs rootflags=dax snd_soc_core.prealloc_buffer_size_kbytes=16 coherent_pool=32K"; + }; +}; + +&ramdisk_r { + reg = <0x48c40000 (40 * 0x00100000)>; +}; + +&ramdisk_c { + reg = <0x4b440000 (20 * 0x00100000)>; +}; diff --git a/arch/arm64/boot/dts/rockchip/rv1126b-evb2-v12-fastboot-spi-nor.dts b/arch/arm64/boot/dts/rockchip/rv1126b-evb2-v12-fastboot-spi-nor.dts new file mode 100644 index 000000000000..11a0d82f54b2 --- /dev/null +++ b/arch/arm64/boot/dts/rockchip/rv1126b-evb2-v12-fastboot-spi-nor.dts @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2025 Rockchip Electronics Co., Ltd. + */ + +/dts-v1/; +#include "rv1126b-evb2-v12.dts" +#include "rv1126b-fastboot-spi-nor.dtsi" + +/ { + model = "Rockchip RV1126B EVB2 V12 Arm64 Board"; + compatible = "rockchip,rv1126b-evb2-v12-fastboot-spi-nor", "rockchip,rv1126b"; + + chosen { + bootargs = "loglevel=0 initcall_debug=0 earlycon=uart8250,mmio32,0x20810000 console=ttyFIQ0 root=/dev/rd0 rootfstype=erofs rootflags=dax snd_soc_core.prealloc_buffer_size_kbytes=16 coherent_pool=32K"; + }; +}; + +&fspi0 { + status = "okay"; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <750000000>; + spi-rx-bus-width = <4>; + spi-tx-bus-width = <1>; + }; +}; + +&ramdisk_r { + reg = <0x48c40000 (20 * 0x00100000)>; +}; + +&ramdisk_c { + reg = <0x4a040000 (10 * 0x00100000)>; +}; diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c index 118153b0572d..2feb2f27a721 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c @@ -327,6 +327,8 @@ struct dw_hdmi_qp { bool hdr2sdr; bool flt_no_timeout; + u8 next_tfr; + bool m_const; u32 scdc_intr; u32 flt_intr; u32 earc_intr; @@ -1768,6 +1770,67 @@ static void hdmi_config_CVTEM(struct dw_hdmi_qp *hdmi) PKTSCHED_PKT_EN); } +static void dw_hdmi_qp_config_vtem_class1(struct dw_hdmi_qp *hdmi, bool m_const, u8 next_tfr) +{ + struct drm_display_mode *mode = &hdmi->previous_mode; + u8 ds_type = 0; + u8 sync = 1; + u8 vfr = 1; + u8 afr = 0; + u8 new = 1; + u8 end = 1; + u8 data_set_length = 4; + u8 base_vfp; + u16 base_refresh_l, base_refresh_h; + u32 val, i; + + if (!next_tfr) { + hdmi_modb(hdmi, 0, PKTSCHED_EMP_VTEM_TX_EN, PKTSCHED_PKT_EN); + return; + } + + val = 0xc0 << 8; + hdmi_writel(hdmi, val, PKT_EMP_VTEM_CONTENTS0); + + val = new << 7 | end << 6 | ds_type << 4 | afr << 3 | + vfr << 2 | sync << 1; + hdmi_writel(hdmi, val, PKT_EMP_VTEM_CONTENTS1); + + if (m_const) + val = 0x6 << 24; + else + val = 0x4 << 24; + + val |= data_set_length << 16; + hdmi_writel(hdmi, val, PKT_EMP_VTEM_CONTENTS2); + + base_vfp = mode->vsync_start - mode->vdisplay; + base_refresh_l = drm_mode_vrefresh(mode); + base_refresh_h = (base_refresh_l >> 8) & 0x3; + base_refresh_l &= 0xff; + + val = base_refresh_l << 16 | next_tfr << 11 | base_refresh_h << 8 | base_vfp; + hdmi_writel(hdmi, val, PKT_EMP_VTEM_CONTENTS3); + + for (i = PKT_EMP_VTEM_CONTENTS4; i <= PKT_EMP_VTEM_CONTENTS7; i += 4) + hdmi_writel(hdmi, 0, i); + + hdmi_modb(hdmi, PKTSCHED_EMP_VTEM_TX_EN, PKTSCHED_EMP_VTEM_TX_EN, PKTSCHED_PKT_EN); +} + +static void dw_hdmi_qp_config_vtem(struct dw_hdmi_qp *hdmi) +{ + if (hdmi->disabled || !hdmi->dclk_en) + return; + + if (!hdmi->next_tfr) { + hdmi_modb(hdmi, 0, PKTSCHED_EMP_VTEM_TX_EN, PKTSCHED_PKT_EN); + return; + } + + dw_hdmi_qp_config_vtem_class1(hdmi, hdmi->m_const, hdmi->next_tfr); +} + static void hdmi_config_drm_infoframe(struct dw_hdmi_qp *hdmi, const struct drm_connector *connector) { @@ -2588,6 +2651,7 @@ static int dw_hdmi_qp_setup(struct dw_hdmi_qp *hdmi, hdmi_config_AVI(hdmi, connector, mode); hdmi_config_vendor_specific_infoframe(hdmi, connector, mode); hdmi_config_CVTEM(hdmi); + dw_hdmi_qp_config_vtem_class1(hdmi, hdmi->m_const, hdmi->next_tfr); hdmi_config_drm_infoframe(hdmi, connector); ret = hdmi_set_op_mode(hdmi, link_cfg, connector); if (ret) { @@ -2963,6 +3027,24 @@ out: } EXPORT_SYMBOL_GPL(dw_hdmi_qp_handle_hpd); +void dw_hdmi_qp_set_qms(struct dw_hdmi_qp *hdmi, u8 next_tfr, u8 m_const) +{ + if (!hdmi) + return; + + hdmi->next_tfr = next_tfr; + hdmi->m_const = m_const; + + dw_hdmi_qp_config_vtem(hdmi); +} +EXPORT_SYMBOL_GPL(dw_hdmi_qp_set_qms); + +u8 dw_hdmi_qp_get_next_tfr(struct dw_hdmi_qp *hdmi) +{ + return hdmi->next_tfr; +} +EXPORT_SYMBOL_GPL(dw_hdmi_qp_get_next_tfr); + static int dw_hdmi_atomic_connector_set_property(struct drm_connector *connector, struct drm_connector_state *state, @@ -3468,6 +3550,7 @@ static void dw_hdmi_connector_atomic_commit(struct drm_connector *connector, if (hdmi->hdmi_changed_status & HDMI_VSIF_CHANGED) hdmi_config_vendor_specific_infoframe(hdmi, hdmi->curr_conn, &hdmi->previous_mode); + dw_hdmi_qp_config_vtem_class1(hdmi, hdmi->m_const, hdmi->next_tfr); } } diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.h b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.h index 8392b1350d3a..022cb47babbf 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.h +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.h @@ -222,6 +222,7 @@ #define PKTSCHED_AVI_TX_EN BIT(13) #define PKTSCHED_VSI_TX_EN BIT(12) #define PKTSCHED_EMP_CVTEM_TX_EN BIT(10) +#define PKTSCHED_EMP_VTEM_TX_EN BIT(9) #define PKTSCHED_AMD_TX_EN BIT(8) #define PKTSCHED_GCP_TX_EN BIT(3) #define PKTSCHED_AUDS_TX_EN BIT(2) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index 9eebcfaa85cb..4f60e065019a 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -25,6 +25,7 @@ #include #include #include +#include #include