From: George Moussalem Date: Thu, 23 Oct 2025 11:16:21 +0000 (+0400) Subject: qualcommax: ipq50xx: split firmware variants and refactor QCN6122 support X-Git-Url: http://git.openwrt.org/?a=commitdiff_plain;h=1f879b88398b06053260c5b19f899cfdd16b93c6;p=openwrt%2Fopenwrt.git qualcommax: ipq50xx: split firmware variants and refactor QCN6122 support IPQ5018 based boards come in multiple wireless architectures. The SOC itself provides 2.4G wifi while 5G wifi is added by either an IPQ5018-specific QCN6122 (2x2) solution or by the more generally available PCIe-based QCN9074 (4x4) wifi chip. On IPQ5018/QCN6122-based boards, both QCN6122 and IPQ5018 wifi is initialized by IPQ5018 firmware which comes in different versions: - IPQ5018: firmware files to initialize WCSS and the internal wifi chip - IPQ5018/QCN6122: above + additional firmware segments to initialize the QCN6122 chip incl. (de-)assertion of resets and clocks enablement OpenWrt currently packages the combined IPQ5018/QCN6122 firmware for both architectures. As such, let's switch to using IPQ5018-only firmware for boards not packed with QCN6122 chip(s) and keep using the shared firmware for devices that do have QCN6122(s) chips. This helps us move to using upstreamed IPQ5018 firmware while using the legacy repo for IPQ5018/QCN6122 firmware and rule out any initialization conflicts/issues caused by loading QCN6122 on IPQ5018-only boards. While at it, default to the secure WCSS remoteproc driver sent upstream for review, move QCN6122 wifi nodes to a separate dtsi, override the Q6 node to load the multi-PD-based architecture remoteproc driver for needed only by IPQ5018/QCN6122 designs, reference said dtsi in boards packed with QCN6122 wifi chip(s), and add provision for migrating the radio path as the wifi nodes now adhere to linux device tree naming conventions. Signed-off-by: George Moussalem Link: https://github.com/openwrt/openwrt/pull/20928 Signed-off-by: Robert Marko --- diff --git a/package/firmware/ath11k-firmware/Makefile b/package/firmware/ath11k-firmware/Makefile index cfc364215f..0ef80b3719 100644 --- a/package/firmware/ath11k-firmware/Makefile +++ b/package/firmware/ath11k-firmware/Makefile @@ -52,6 +52,11 @@ $(Package/ath11k-firmware-default) TITLE:=IPQ5018 ath11k firmware endef +define Package/ath11k-firmware-ipq5018-qcn6122 +$(Package/ath11k-firmware-default) + TITLE:=IPQ5018/QCN6122 ath11k firmware +endef + define Package/ath11k-firmware-ipq6018 $(Package/ath11k-firmware-default) TITLE:=IPQ6018 ath11k firmware @@ -62,12 +67,6 @@ $(Package/ath11k-firmware-default) TITLE:=IPQ8074 ath11k firmware endef -define Package/ath11k-firmware-qcn6122 -$(Package/ath11k-firmware-default) - TITLE:=QCN6122 ath11k firmware - DEPENDS:=ath11k-firmware-ipq5018 -endef - define Package/ath11k-firmware-qcn9074 $(Package/ath11k-firmware-default) TITLE:=QCN9074 ath11k firmware @@ -93,10 +92,21 @@ define Build/Compile endef define Package/ath11k-firmware-ipq5018/install + $(INSTALL_DIR) $(1)/lib/firmware/ath11k/IPQ5018/hw1.0 + $(INSTALL_DATA) \ + $(PKG_BUILD_DIR)/IPQ5018/hw1.0/2.6.0.1/WLAN.HK.2.6.0.1-01291-QCAHKSWPL_SILICONZ-1/* \ + $(1)/lib/firmware/ath11k/IPQ5018/hw1.0/ +endef + +define Package/ath11k-firmware-ipq5018-qcn6122/install $(INSTALL_DIR) $(1)/lib/firmware/ath11k/IPQ5018/hw1.0 $(INSTALL_DATA) \ $(BUILD_DIR)/$(ATH11K_LEGACY_FW_SUBDIR)/ath11k-firmware/IPQ5018_QCN6122_QCN6122/hw1.0/2.7.0.1/WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1/*.* \ $(1)/lib/firmware/ath11k/IPQ5018/hw1.0/ + $(INSTALL_DIR) $(1)/lib/firmware/ath11k/QCN6122/hw1.0 + $(INSTALL_DATA) \ + $(BUILD_DIR)/$(ATH11K_LEGACY_FW_SUBDIR)/ath11k-firmware/IPQ5018_QCN6122_QCN6122/hw1.0/2.7.0.1/WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1/qcn6122/*.* \ + $(1)/lib/firmware/ath11k/QCN6122/hw1.0/ endef define Package/ath11k-firmware-ipq6018/install @@ -113,13 +123,6 @@ define Package/ath11k-firmware-ipq8074/install $(1)/lib/firmware/IPQ8074/ endef -define Package/ath11k-firmware-qcn6122/install - $(INSTALL_DIR) $(1)/lib/firmware/ath11k/QCN6122/hw1.0 - $(INSTALL_DATA) \ - $(BUILD_DIR)/$(ATH11K_LEGACY_FW_SUBDIR)/ath11k-firmware/IPQ5018_QCN6122_QCN6122/hw1.0/2.7.0.1/WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1/qcn6122/* \ - $(1)/lib/firmware/ath11k/QCN6122/hw1.0/ -endef - define Package/ath11k-firmware-qcn9074/install $(INSTALL_DIR) $(1)/lib/firmware/ath11k/QCN9074/hw1.0 $(INSTALL_DATA) \ @@ -130,7 +133,7 @@ define Package/ath11k-firmware-qcn9074/install endef $(eval $(call BuildPackage,ath11k-firmware-ipq5018)) +$(eval $(call BuildPackage,ath11k-firmware-ipq5018-qcn6122)) $(eval $(call BuildPackage,ath11k-firmware-ipq6018)) $(eval $(call BuildPackage,ath11k-firmware-ipq8074)) -$(eval $(call BuildPackage,ath11k-firmware-qcn6122)) $(eval $(call BuildPackage,ath11k-firmware-qcn9074)) diff --git a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-ax6000.dts b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-ax6000.dts index f43da50711..bfe9589ecd 100644 --- a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-ax6000.dts +++ b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-ax6000.dts @@ -84,13 +84,6 @@ gpios = <&tlmm 28 GPIO_ACTIVE_HIGH>; }; }; - - reserved-memory { - q6_mem_regions: q6_mem_regions@4b000000 { - no-map; - reg = <0x0 0x4b000000 0x0 0x3000000>; - }; - }; }; &sleep_clk { @@ -576,61 +569,14 @@ }; &q6v5_wcss { - status = "okay"; - - memory-region = <&q6_mem_regions>; firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt", "ath11k/IPQ5018/hw1.0/m3_fw.mdt"; - - // IPQ5018 - q6_wcss_pd1: pd-1 { - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; - - resets = - <&gcc GCC_WCSSAON_RESET>, - <&gcc GCC_WCSS_BCR>, - <&gcc GCC_CE_BCR>; - reset-names = - "wcss_aon_reset", - "wcss_reset", - "ce_reset"; - - clocks = - <&gcc GCC_WCSS_AHB_S_CLK>, - <&gcc GCC_WCSS_ACMT_CLK>, - <&gcc GCC_WCSS_AXI_M_CLK>; - clock-names = - "gcc_wcss_ahb_s_clk", - "gcc_wcss_acmt_clk", - "gcc_wcss_axi_m_clk"; - - interrupts-extended = - <&wcss_smp2p_in 8 0>, - <&wcss_smp2p_in 9 0>, - <&wcss_smp2p_in 12 0>, - <&wcss_smp2p_in 11 0>; - interrupt-names = - "fatal", - "ready", - "spawn-ack", - "stop-ack"; - - qcom,smem-states = - <&wcss_smp2p_out 8>, - <&wcss_smp2p_out 9>, - <&wcss_smp2p_out 10>; - qcom,smem-state-names = - "shutdown", - "stop", - "spawn"; - }; }; -&wifi0 { +&wifi { status = "okay"; - qcom,rproc = <&q6_wcss_pd1>; + qcom,rproc = <&q6v5_wcss>; qcom,ath11k-calibration-variant = "Xiaomi-AX6000"; qcom,ath11k-fw-memory-mode = <1>; - qcom,bdf-addr = <0x4c400000>; }; diff --git a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-ax830.dts b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-ax830.dts index 4043597981..8f9f027fd3 100644 --- a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-ax830.dts +++ b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-ax830.dts @@ -7,6 +7,7 @@ #include "ipq5018.dtsi" #include "ipq5018-ess.dtsi" +#include "ipq5018-qcn6122.dtsi" #include #include @@ -65,13 +66,6 @@ }; }; - reserved-memory { - q6_mem_regions: q6_mem_regions@4b000000 { - no-map; - reg = <0x0 0x4b000000 0x0 0x3000000>; - }; - }; - gpio-watchdog { compatible = "linux,wdt-gpio"; gpios = <&tlmm 27 GPIO_ACTIVE_LOW>; @@ -381,86 +375,9 @@ }; }; -&q6v5_wcss { +&wifi { status = "okay"; - memory-region = <&q6_mem_regions>; - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt", - "ath11k/IPQ5018/hw1.0/m3_fw.mdt", - "ath11k/QCN6122/hw1.0/m3_fw.mdt"; - - // IPQ5018 - q6_wcss_pd1: pd-1 { - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; - - resets = - <&gcc GCC_WCSSAON_RESET>, - <&gcc GCC_WCSS_BCR>, - <&gcc GCC_CE_BCR>; - reset-names = - "wcss_aon_reset", - "wcss_reset", - "ce_reset"; - - clocks = - <&gcc GCC_WCSS_AHB_S_CLK>, - <&gcc GCC_WCSS_ACMT_CLK>, - <&gcc GCC_WCSS_AXI_M_CLK>; - clock-names = - "gcc_wcss_ahb_s_clk", - "gcc_wcss_acmt_clk", - "gcc_wcss_axi_m_clk"; - - interrupts-extended = - <&wcss_smp2p_in 8 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 9 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 12 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 11 IRQ_TYPE_NONE>; - interrupt-names = - "fatal", - "ready", - "spawn-ack", - "stop-ack"; - - qcom,smem-states = - <&wcss_smp2p_out 8>, - <&wcss_smp2p_out 9>, - <&wcss_smp2p_out 10>; - qcom,smem-state-names = - "shutdown", - "stop", - "spawn"; - }; - - // QCN6122 5G - q6_wcss_pd3: pd-3 { - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; - - interrupts-extended = - <&wcss_smp2p_in 24 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 25 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 28 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 27 IRQ_TYPE_NONE>; - interrupt-names = - "fatal", - "ready", - "spawn-ack", - "stop-ack"; - - qcom,smem-states = - <&wcss_smp2p_out 24>, - <&wcss_smp2p_out 25>, - <&wcss_smp2p_out 26>; - qcom,smem-state-names = - "shutdown", - "stop", - "spawn"; - }; -}; - -&wifi0 { - // IPQ5018 - status = "okay"; qcom,rproc = <&q6_wcss_pd1>; qcom,ath11k-calibration-variant = "Yuncore-AX830"; qcom,ath11k-fw-memory-mode = <1>; @@ -468,8 +385,8 @@ }; &wifi1 { - // QCN6122 5G status = "okay"; + qcom,rproc = <&q6_wcss_pd3>; qcom,userpd-subsys-name = "q6v5_wcss_userpd3"; qcom,ath11k-calibration-variant = "Yuncore-AX830"; diff --git a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-ax850.dts b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-ax850.dts index 30945e6332..f81e5171d0 100644 --- a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-ax850.dts +++ b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-ax850.dts @@ -65,13 +65,6 @@ }; }; - reserved-memory { - q6_mem_regions: q6_mem_regions@4b000000 { - no-map; - reg = <0x0 0x4b000000 0x0 0x3000000>; - }; - }; - gpio-watchdog { compatible = "linux,wdt-gpio"; gpios = <&tlmm 27 GPIO_ACTIVE_LOW>; @@ -384,66 +377,6 @@ status = "okay"; }; -&q6v5_wcss { - status = "okay"; - - memory-region = <&q6_mem_regions>; - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt", - "ath11k/IPQ5018/hw1.0/m3_fw.mdt"; - - // IPQ5018 - q6_wcss_pd1: pd-1 { - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; - - resets = - <&gcc GCC_WCSSAON_RESET>, - <&gcc GCC_WCSS_BCR>, - <&gcc GCC_CE_BCR>; - reset-names = - "wcss_aon_reset", - "wcss_reset", - "ce_reset"; - - clocks = - <&gcc GCC_WCSS_AHB_S_CLK>, - <&gcc GCC_WCSS_ACMT_CLK>, - <&gcc GCC_WCSS_AXI_M_CLK>; - clock-names = - "gcc_wcss_ahb_s_clk", - "gcc_wcss_acmt_clk", - "gcc_wcss_axi_m_clk"; - - interrupts-extended = - <&wcss_smp2p_in 8 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 9 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 12 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 11 IRQ_TYPE_NONE>; - interrupt-names = - "fatal", - "ready", - "spawn-ack", - "stop-ack"; - - qcom,smem-states = - <&wcss_smp2p_out 8>, - <&wcss_smp2p_out 9>, - <&wcss_smp2p_out 10>; - qcom,smem-state-names = - "shutdown", - "stop", - "spawn"; - }; -}; - -&wifi0 { - // IPQ5018 - status = "okay"; - qcom,rproc = <&q6_wcss_pd1>; - qcom,ath11k-calibration-variant = "Yuncore-AX850"; - qcom,ath11k-fw-memory-mode = <1>; - qcom,bdf-addr = <0x4c400000>; -}; - &pcie0_phy { status = "okay"; }; @@ -468,3 +401,16 @@ }; }; }; + +&q6v5_wcss { + firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt", + "ath11k/IPQ5018/hw1.0/m3_fw.mdt"; +}; + +&wifi { + status = "okay"; + + qcom,rproc = <&q6v5_wcss>; + qcom,ath11k-calibration-variant = "Yuncore-AX850"; + qcom,ath11k-fw-memory-mode = <1>; +}; diff --git a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-gl-b3000.dts b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-gl-b3000.dts index cd4f270632..4094867a11 100644 --- a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-gl-b3000.dts +++ b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-gl-b3000.dts @@ -2,6 +2,7 @@ #include "ipq5018.dtsi" #include "ipq5018-ess.dtsi" +#include "ipq5018-qcn6122.dtsi" #include #include @@ -55,13 +56,6 @@ gpios = <&tlmm 23 GPIO_ACTIVE_HIGH>; }; }; - - reserved-memory { - q6_mem_regions: q6_mem_regions@4b000000 { - no-map; - reg = <0x0 0x4b000000 0x0 0x3000000>; - }; - }; }; &switch { @@ -308,13 +302,6 @@ }; &q6v5_wcss { - status = "okay"; - - memory-region = <&q6_mem_regions>; - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt", - "ath11k/IPQ5018/hw1.0/m3_fw.mdt", - "ath11k/QCN6122/hw1.0/m3_fw.mdt"; - /* B3000 currently doesn't support passing bootargs */ /*boot-args = < */ /* type: 0x1 PCIE0 */ @@ -322,79 +309,9 @@ /* PD id: 3 */ /* reset GPIO: 15 */ /* reserved: 0 0>; */ - - // IPQ5018 - q6_wcss_pd1: pd-1 { - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; - - resets = - <&gcc GCC_WCSSAON_RESET>, - <&gcc GCC_WCSS_BCR>, - <&gcc GCC_CE_BCR>; - reset-names = - "wcss_aon_reset", - "wcss_reset", - "ce_reset"; - - clocks = - <&gcc GCC_WCSS_AHB_S_CLK>, - <&gcc GCC_WCSS_ACMT_CLK>, - <&gcc GCC_WCSS_AXI_M_CLK>; - clock-names = - "gcc_wcss_ahb_s_clk", - "gcc_wcss_acmt_clk", - "gcc_wcss_axi_m_clk"; - - // qcom,halt-regs = <&tcsr_q6_block 0xa000 0xd000 0x0>; - interrupts-extended = - <&wcss_smp2p_in 8 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 9 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 12 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 11 IRQ_TYPE_NONE>; - interrupt-names = - "fatal", - "ready", - "spawn-ack", - "stop-ack"; - - qcom,smem-states = - <&wcss_smp2p_out 8>, - <&wcss_smp2p_out 9>, - <&wcss_smp2p_out 10>; - qcom,smem-state-names = - "shutdown", - "stop", - "spawn"; - }; - - // QCN6102 5G - q6_wcss_pd3: pd-3 { - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; - - interrupts-extended = - <&wcss_smp2p_in 24 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 25 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 28 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 27 IRQ_TYPE_NONE>; - interrupt-names = - "fatal", - "ready", - "spawn-ack", - "stop-ack"; - - qcom,smem-states = - <&wcss_smp2p_out 24>, - <&wcss_smp2p_out 25>, - <&wcss_smp2p_out 26>; - qcom,smem-state-names = - "shutdown", - "stop", - "spawn"; - }; }; -&wifi0 { - // IPQ5018 +&wifi { status = "okay"; qcom,rproc = <&q6_wcss_pd1>; @@ -405,7 +322,6 @@ }; &wifi1 { - // QCN6102 5G status = "okay"; qcom,rproc = <&q6_wcss_pd3>; diff --git a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-mr5500.dts b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-mr5500.dts index e86e296be4..77be190dc4 100644 --- a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-mr5500.dts +++ b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-mr5500.dts @@ -321,62 +321,14 @@ }; &q6v5_wcss { - status = "okay"; - - memory-region = <&q6_mem_regions>; firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt", "ath11k/IPQ5018/hw1.0/m3_fw.mdt"; - - // IPQ5018 - q6_wcss_pd1: pd-1 { - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; - - resets = - <&gcc GCC_WCSSAON_RESET>, - <&gcc GCC_WCSS_BCR>, - <&gcc GCC_CE_BCR>; - reset-names = - "wcss_aon_reset", - "wcss_reset", - "ce_reset"; - - clocks = - <&gcc GCC_WCSS_AHB_S_CLK>, - <&gcc GCC_WCSS_ACMT_CLK>, - <&gcc GCC_WCSS_AXI_M_CLK>; - clock-names = - "gcc_wcss_ahb_s_clk", - "gcc_wcss_acmt_clk", - "gcc_wcss_axi_m_clk"; - - interrupts-extended = - <&wcss_smp2p_in 8 0>, - <&wcss_smp2p_in 9 0>, - <&wcss_smp2p_in 12 0>, - <&wcss_smp2p_in 11 0>; - interrupt-names = - "fatal", - "ready", - "spawn-ack", - "stop-ack"; - - qcom,smem-states = - <&wcss_smp2p_out 8>, - <&wcss_smp2p_out 9>, - <&wcss_smp2p_out 10>; - qcom,smem-state-names = - "shutdown", - "stop", - "spawn"; - }; }; -&wifi0 { - // IPQ5018 - qcom,rproc = <&q6_wcss_pd1>; +&wifi { + status = "okay"; + + qcom,rproc = <&q6v5_wcss>; qcom,ath11k-calibration-variant = "Linksys-MR5500"; qcom,ath11k-fw-memory-mode = <1>; - qcom,bdf-addr = <0x4c400000>; - - status = "okay"; }; diff --git a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-mx-base.dtsi b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-mx-base.dtsi index add929f217..6644263545 100644 --- a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-mx-base.dtsi +++ b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-mx-base.dtsi @@ -62,13 +62,6 @@ max-brightness = <255>; }; }; - - reserved-memory { - q6_mem_regions: q6_mem_regions@4b000000 { - no-map; - reg = <0x0 0x4b000000 0x0 0x3000000>; - }; - }; }; &sleep_clk { diff --git a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-mx2000.dts b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-mx2000.dts index 5eaa84e3e6..f6b58d2cbc 100644 --- a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-mx2000.dts +++ b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-mx2000.dts @@ -2,6 +2,7 @@ #include "ipq5018.dtsi" #include "ipq5018-mx-base.dtsi" +#include "ipq5018-qcn6122.dtsi" / { model = "Linksys MX2000"; @@ -146,13 +147,6 @@ }; &q6v5_wcss { - status = "okay"; - - memory-region = <&q6_mem_regions>; - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt", - "ath11k/IPQ5018/hw1.0/m3_fw.mdt", - "ath11k/QCN6122/hw1.0/m3_fw.mdt"; - /* The QCN6102 radio should map to UPD ID 2. Without */ /* bootargs, the firmware will expect it to be on UPD ID 3 */ boot-args = < @@ -161,97 +155,24 @@ /* UPD ID: */ 2 /* reset GPIO: */ 15 /* reserved: */ 0 0>; - - // IPQ5018 - q6_wcss_pd1: pd-1 { - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; - - resets = - <&gcc GCC_WCSSAON_RESET>, - <&gcc GCC_WCSS_BCR>, - <&gcc GCC_CE_BCR>; - reset-names = - "wcss_aon_reset", - "wcss_reset", - "ce_reset"; - - clocks = - <&gcc GCC_WCSS_AHB_S_CLK>, - <&gcc GCC_WCSS_ACMT_CLK>, - <&gcc GCC_WCSS_AXI_M_CLK>; - clock-names = - "gcc_wcss_ahb_s_clk", - "gcc_wcss_acmt_clk", - "gcc_wcss_axi_m_clk"; - - // qcom,halt-regs = <&tcsr_q6_block 0xa000 0xd000 0x0>; - interrupts-extended = - <&wcss_smp2p_in 8 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 9 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 12 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 11 IRQ_TYPE_NONE>; - interrupt-names = - "fatal", - "ready", - "spawn-ack", - "stop-ack"; - - qcom,smem-states = - <&wcss_smp2p_out 8>, - <&wcss_smp2p_out 9>, - <&wcss_smp2p_out 10>; - qcom,smem-state-names = - "shutdown", - "stop", - "spawn"; - status = "okay"; - }; - - // QCN6102 5G - q6_wcss_pd2: pd-2 { - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; - - interrupts-extended = - <&wcss_smp2p_in 16 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 17 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 20 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 19 IRQ_TYPE_NONE>; - interrupt-names = - "fatal", - "ready", - "spawn-ack", - "stop-ack"; - - qcom,smem-states = - <&wcss_smp2p_out 16>, - <&wcss_smp2p_out 17>, - <&wcss_smp2p_out 18>; - qcom,smem-state-names = - "shutdown", - "stop", - "spawn"; - status = "okay"; - }; }; -&wifi0 { - // IPQ5018 +&wifi { + status = "okay"; + qcom,rproc = <&q6_wcss_pd1>; qcom,ath11k-calibration-variant = "Linksys-MX2000"; qcom,ath11k-fw-memory-mode = <1>; qcom,bdf-addr = <0x4c400000>; - - status = "okay"; }; &wifi1 { - // QCN6102 5G + status = "okay"; + qcom,rproc = <&q6_wcss_pd2>; qcom,userpd-subsys-name = "q6v5_wcss_userpd2"; qcom,ath11k-calibration-variant = "Linksys-MX2000"; qcom,ath11k-fw-memory-mode = <1>; qcom,bdf-addr = <0x4d100000>; qcom,m3-dump-addr = <0x4df00000>; - - status = "okay"; }; diff --git a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-mx5500.dts b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-mx5500.dts index 535f0ec10e..2883a466f3 100644 --- a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-mx5500.dts +++ b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-mx5500.dts @@ -168,63 +168,14 @@ }; &q6v5_wcss { - status = "okay"; - - memory-region = <&q6_mem_regions>; firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt", "ath11k/IPQ5018/hw1.0/m3_fw.mdt"; - - // IPQ5018 - q6_wcss_pd1: pd-1 { - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; - - resets = - <&gcc GCC_WCSSAON_RESET>, - <&gcc GCC_WCSS_BCR>, - <&gcc GCC_CE_BCR>; - reset-names = - "wcss_aon_reset", - "wcss_reset", - "ce_reset"; - - clocks = - <&gcc GCC_WCSS_AHB_S_CLK>, - <&gcc GCC_WCSS_ACMT_CLK>, - <&gcc GCC_WCSS_AXI_M_CLK>; - clock-names = - "gcc_wcss_ahb_s_clk", - "gcc_wcss_acmt_clk", - "gcc_wcss_axi_m_clk"; - - interrupts-extended = - <&wcss_smp2p_in 8 0>, - <&wcss_smp2p_in 9 0>, - <&wcss_smp2p_in 12 0>, - <&wcss_smp2p_in 11 0>; - interrupt-names = - "fatal", - "ready", - "spawn-ack", - "stop-ack"; - - qcom,smem-states = - <&wcss_smp2p_out 8>, - <&wcss_smp2p_out 9>, - <&wcss_smp2p_out 10>; - qcom,smem-state-names = - "shutdown", - "stop", - "spawn"; - status = "okay"; - }; }; -&wifi0 { - // IPQ5018 - qcom,rproc = <&q6_wcss_pd1>; +&wifi { + qcom,rproc = <&q6v5_wcss>; qcom,ath11k-calibration-variant = "Linksys-MX5500"; qcom,ath11k-fw-memory-mode = <1>; - qcom,bdf-addr = <0x4c400000>; status = "okay"; }; diff --git a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-pz-l8.dts b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-pz-l8.dts index 4857e3d4f9..a90c6ca8b0 100644 --- a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-pz-l8.dts +++ b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-pz-l8.dts @@ -4,6 +4,7 @@ #include "ipq5018.dtsi" #include "ipq5018-ess.dtsi" +#include "ipq5018-qcn6122.dtsi" #include #include @@ -63,14 +64,6 @@ function = LED_FUNCTION_LAN; }; }; - - reserved-memory { - q6_mem_regions: q6_mem_regions@4b000000 { - no-map; - reg = <0x0 0x4b000000 0x0 0x3000000>; - status = "disabled"; - }; - }; }; &sleep_clk { @@ -367,93 +360,11 @@ */ &q6v5_wcss { status = "disabled"; - - memory-region = <&q6_mem_regions>; - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt", - "ath11k/IPQ5018/hw1.0/m3_fw.mdt", - "ath11k/QCN6122/hw1.0/m3_fw.mdt"; - - /* The QCN6102 radio should map to UPD ID 2. Without */ - /* bootargs, the firmware will expect it to be on UPD ID 3 */ - boot-args = <0x2 4 2 27 0 0>; /* pcie:2, len:4, updid:2, reset:gpio27 */ - - // IPQ5018 - q6_wcss_pd1: pd-1 { - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; - - resets = - <&gcc GCC_WCSSAON_RESET>, - <&gcc GCC_WCSS_BCR>, - <&gcc GCC_CE_BCR>; - reset-names = - "wcss_aon_reset", - "wcss_reset", - "ce_reset"; - - clocks = - <&gcc GCC_WCSS_AHB_S_CLK>, - <&gcc GCC_WCSS_ACMT_CLK>, - <&gcc GCC_WCSS_AXI_M_CLK>; - clock-names = - "gcc_wcss_ahb_s_clk", - "gcc_wcss_acmt_clk", - "gcc_wcss_axi_m_clk"; - - interrupts-extended = - <&wcss_smp2p_in 8 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 9 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 12 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 11 IRQ_TYPE_NONE>; - interrupt-names = - "fatal", - "ready", - "spawn-ack", - "stop-ack"; - - qcom,smem-states = - <&wcss_smp2p_out 8>, - <&wcss_smp2p_out 9>, - <&wcss_smp2p_out 10>; - qcom,smem-state-names = - "shutdown", - "stop", - "spawn"; - - status = "disabled"; - }; - - // QCN6102 5G - q6_wcss_pd2: pd-2 { - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; - - interrupts-extended = - <&wcss_smp2p_in 16 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 17 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 20 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 19 IRQ_TYPE_NONE>; - interrupt-names = - "fatal", - "ready", - "spawn-ack", - "stop-ack"; - - qcom,smem-states = - <&wcss_smp2p_out 16>, - <&wcss_smp2p_out 17>, - <&wcss_smp2p_out 18>; - qcom,smem-state-names = - "shutdown", - "stop", - "spawn"; - - status = "disabled"; - }; }; -&wifi0 { +&wifi { // IPQ5018 qcom,rproc = <&q6_wcss_pd1>; - qcom,userpd-subsys-name = "q6v5_wcss_userpd1"; qcom,ath11k-calibration-variant = "CMCC-PZ-L8"; qcom,ath11k-fw-memory-mode = <1>; qcom,bdf-addr = <0x4c400000>; diff --git a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-qcn6122.dtsi b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-qcn6122.dtsi new file mode 100644 index 0000000000..a59c6ceda3 --- /dev/null +++ b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-qcn6122.dtsi @@ -0,0 +1,135 @@ +// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause +/* + * IPQ5018 SoC device tree source extension for QCN6122 wifi + * + * Copyright (c) 2023-2025 The Linux Foundation. All rights reserved. + */ + +&q6_region { + reg = <0x0 0x4b000000 0x0 0x3000000>; +}; + +&q6v5_wcss { + compatible = "qcom,ipq5018-q6-mpd"; + + firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt", + "ath11k/IPQ5018/hw1.0/m3_fw.mdt", + "ath11k/QCN6122/hw1.0/m3_fw.mdt"; + + // IPQ5018 + q6_wcss_pd1: pd-1 { + firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; + + interrupts-extended = + <&wcss_smp2p_in 8 IRQ_TYPE_NONE>, + <&wcss_smp2p_in 9 IRQ_TYPE_NONE>, + <&wcss_smp2p_in 12 IRQ_TYPE_NONE>, + <&wcss_smp2p_in 11 IRQ_TYPE_NONE>; + interrupt-names = + "fatal", + "ready", + "spawn-ack", + "stop-ack"; + + qcom,smem-states = + <&wcss_smp2p_out 8>, + <&wcss_smp2p_out 9>, + <&wcss_smp2p_out 10>; + qcom,smem-state-names = + "shutdown", + "stop", + "spawn"; + }; + + // QCN6122 + q6_wcss_pd2: pd-2 { + firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; + + interrupts-extended = + <&wcss_smp2p_in 16 IRQ_TYPE_NONE>, + <&wcss_smp2p_in 17 IRQ_TYPE_NONE>, + <&wcss_smp2p_in 20 IRQ_TYPE_NONE>, + <&wcss_smp2p_in 19 IRQ_TYPE_NONE>; + interrupt-names = + "fatal", + "ready", + "spawn-ack", + "stop-ack"; + + qcom,smem-states = + <&wcss_smp2p_out 16>, + <&wcss_smp2p_out 17>, + <&wcss_smp2p_out 18>; + qcom,smem-state-names = + "shutdown", + "stop", + "spawn"; + }; + + // QCN6122 + q6_wcss_pd3: pd-3 { + firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; + + interrupts-extended = + <&wcss_smp2p_in 24 IRQ_TYPE_NONE>, + <&wcss_smp2p_in 25 IRQ_TYPE_NONE>, + <&wcss_smp2p_in 28 IRQ_TYPE_NONE>, + <&wcss_smp2p_in 27 IRQ_TYPE_NONE>; + interrupt-names = + "fatal", + "ready", + "spawn-ack", + "stop-ack"; + + qcom,smem-states = + <&wcss_smp2p_out 24>, + <&wcss_smp2p_out 25>, + <&wcss_smp2p_out 26>; + qcom,smem-state-names = + "shutdown", + "stop", + "spawn"; + }; +}; + +&soc { + //QCN6122: 1st instance + wifi1: wifi@b00a040 { + reg = <0x0b00a040 0x0>; + compatible = "qcom,qcn6122-wifi"; + interrupts = , + , + , + , + , + , + , + , + , + , + , + , + ; + status = "disabled"; + }; + + //QCN6122: 2nd instance + wifi2: wifi@b00b040 { + reg = <0x0b00b040 0x0>; + compatible = "qcom,qcn6122-wifi"; + interrupts = , + , + , + , + , + , + , + , + , + , + , + , + ; + status = "disabled"; + }; +}; diff --git a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-spnmx56.dts b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-spnmx56.dts index 7984f3f57a..6ee86d6029 100644 --- a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-spnmx56.dts +++ b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-spnmx56.dts @@ -179,62 +179,14 @@ }; &q6v5_wcss { - status = "okay"; - - memory-region = <&q6_mem_regions>; firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt", "ath11k/IPQ5018/hw1.0/m3_fw.mdt"; - - // IPQ5018 - q6_wcss_pd1: pd-1 { - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; - - resets = - <&gcc GCC_WCSSAON_RESET>, - <&gcc GCC_WCSS_BCR>, - <&gcc GCC_CE_BCR>; - reset-names = - "wcss_aon_reset", - "wcss_reset", - "ce_reset"; - - clocks = - <&gcc GCC_WCSS_AHB_S_CLK>, - <&gcc GCC_WCSS_ACMT_CLK>, - <&gcc GCC_WCSS_AXI_M_CLK>; - clock-names = - "gcc_wcss_ahb_s_clk", - "gcc_wcss_acmt_clk", - "gcc_wcss_axi_m_clk"; - - interrupts-extended = - <&wcss_smp2p_in 8 0>, - <&wcss_smp2p_in 9 0>, - <&wcss_smp2p_in 12 0>, - <&wcss_smp2p_in 11 0>; - interrupt-names = - "fatal", - "ready", - "spawn-ack", - "stop-ack"; - - qcom,smem-states = - <&wcss_smp2p_out 8>, - <&wcss_smp2p_out 9>, - <&wcss_smp2p_out 10>; - qcom,smem-state-names = - "shutdown", - "stop", - "spawn"; - }; }; -&wifi0 { - // IPQ5018 - qcom,rproc = <&q6_wcss_pd1>; +&wifi { + status = "okay"; + + qcom,rproc = <&q6v5_wcss>; qcom,ath11k-calibration-variant = "Linksys-SPNMX56"; qcom,ath11k-fw-memory-mode = <1>; - qcom,bdf-addr = <0x4c400000>; - - status = "okay"; }; diff --git a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-wn-dax3000gr.dts b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-wn-dax3000gr.dts index a4c8201b8f..de6d415314 100644 --- a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-wn-dax3000gr.dts +++ b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-wn-dax3000gr.dts @@ -4,6 +4,7 @@ #include "ipq5018.dtsi" #include "ipq5018-ess.dtsi" +#include "ipq5018-qcn6122.dtsi" #include #include @@ -113,13 +114,6 @@ function = LED_FUNCTION_WAN; }; }; - - reserved-memory { - q6_mem_regions: q6_mem_regions@4b000000 { - no-map; - reg = <0x0 0x4b000000 0x0 0x3000000>; - }; - }; }; &sleep_clk { @@ -395,83 +389,10 @@ }; &q6v5_wcss { - status = "okay"; - - memory-region = <&q6_mem_regions>; - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt", - "ath11k/IPQ5018/hw1.0/m3_fw.mdt", - "ath11k/QCN6122/hw1.0/m3_fw.mdt"; - boot-args = <0x2 4 2 18 0 0>; /* pcie:1, len:4, updid:2, reset:gpio18 */ - - q6_wcss_pd1: pd-1 { - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; - - resets = - <&gcc GCC_WCSSAON_RESET>, - <&gcc GCC_WCSS_BCR>, - <&gcc GCC_CE_BCR>; - reset-names = - "wcss_aon_reset", - "wcss_reset", - "ce_reset"; - - clocks = - <&gcc GCC_WCSS_AHB_S_CLK>, - <&gcc GCC_WCSS_ACMT_CLK>, - <&gcc GCC_WCSS_AXI_M_CLK>; - clock-names = - "gcc_wcss_ahb_s_clk", - "gcc_wcss_acmt_clk", - "gcc_wcss_axi_m_clk"; - - interrupts-extended = - <&wcss_smp2p_in 8 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 9 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 12 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 11 IRQ_TYPE_NONE>; - interrupt-names = - "fatal", - "ready", - "spawn-ack", - "stop-ack"; - - qcom,smem-states = - <&wcss_smp2p_out 8>, - <&wcss_smp2p_out 9>, - <&wcss_smp2p_out 10>; - qcom,smem-state-names = - "shutdown", - "stop", - "spawn"; - }; - - q6_wcss_pd2: pd-2 { - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; - - interrupts-extended = - <&wcss_smp2p_in 16 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 17 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 20 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 19 IRQ_TYPE_NONE>; - interrupt-names = - "fatal", - "ready", - "spawn-ack", - "stop-ack"; - - qcom,smem-states = - <&wcss_smp2p_out 16>, - <&wcss_smp2p_out 17>, - <&wcss_smp2p_out 18>; - qcom,smem-state-names = - "shutdown", - "stop", - "spawn"; - }; }; -&wifi0 { +&wifi { status = "okay"; qcom,rproc = <&q6_wcss_pd1>; diff --git a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-wrc-x3000gs2.dts b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-wrc-x3000gs2.dts index 0c358f1667..1b6018dbef 100644 --- a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-wrc-x3000gs2.dts +++ b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-wrc-x3000gs2.dts @@ -4,6 +4,7 @@ #include "ipq5018.dtsi" #include "ipq5018-ess.dtsi" +#include "ipq5018-qcn6122.dtsi" #include #include @@ -107,14 +108,6 @@ function = LED_FUNCTION_WAN; }; }; - - reserved-memory { - q6_mem_regions: q6_mem_regions@4b000000 { - no-map; - reg = <0x0 0x4b000000 0x0 0x3000000>; - status = "disabled"; - }; - }; }; &sleep_clk { @@ -397,81 +390,12 @@ &q6v5_wcss { status = "disabled"; - memory-region = <&q6_mem_regions>; - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt", - "ath11k/IPQ5018/hw1.0/m3_fw.mdt", - "ath11k/QCN6122/hw1.0/m3_fw.mdt"; - boot-args = <0x2 4 2 18 0 0>; /* pcie:1, len:4, updid:2, reset:gpio18 */ - - q6_wcss_pd1: pd-1 { - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; - - resets = - <&gcc GCC_WCSSAON_RESET>, - <&gcc GCC_WCSS_BCR>, - <&gcc GCC_CE_BCR>; - reset-names = - "wcss_aon_reset", - "wcss_reset", - "ce_reset"; - - clocks = - <&gcc GCC_WCSS_AHB_S_CLK>, - <&gcc GCC_WCSS_ACMT_CLK>, - <&gcc GCC_WCSS_AXI_M_CLK>; - clock-names = - "gcc_wcss_ahb_s_clk", - "gcc_wcss_acmt_clk", - "gcc_wcss_axi_m_clk"; - - interrupts-extended = - <&wcss_smp2p_in 8 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 9 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 12 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 11 IRQ_TYPE_NONE>; - interrupt-names = - "fatal", - "ready", - "spawn-ack", - "stop-ack"; - - qcom,smem-states = - <&wcss_smp2p_out 8>, - <&wcss_smp2p_out 9>, - <&wcss_smp2p_out 10>; - qcom,smem-state-names = - "shutdown", - "stop", - "spawn"; - }; - - q6_wcss_pd2: pd-2 { - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; - - interrupts-extended = - <&wcss_smp2p_in 16 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 17 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 20 IRQ_TYPE_NONE>, - <&wcss_smp2p_in 19 IRQ_TYPE_NONE>; - interrupt-names = - "fatal", - "ready", - "spawn-ack", - "stop-ack"; - - qcom,smem-states = - <&wcss_smp2p_out 16>, - <&wcss_smp2p_out 17>, - <&wcss_smp2p_out 18>; - qcom,smem-state-names = - "shutdown", - "stop", - "spawn"; - }; }; -&wifi0 { +&wifi { + status = "disabled"; + qcom,rproc = <&q6_wcss_pd1>; qcom,userpd-subsys-name = "q6v5_wcss_userpd1"; qcom,ath11k-calibration-variant = "ELECOM-WRC-X3000GS2"; @@ -479,11 +403,11 @@ qcom,bdf-addr = <0x4c400000>; ieee80211-freq-limit = <2400000 2483000>; - - status = "disabled"; }; &wifi1 { + status = "disabled"; + qcom,rproc = <&q6_wcss_pd2>; qcom,userpd-subsys-name = "q6v5_wcss_userpd2"; qcom,ath11k-calibration-variant = "ELECOM-WRC-X3000GS2"; @@ -492,6 +416,4 @@ qcom,m3-dump-addr = <0x4df00000>; ieee80211-freq-limit = <5150000 5730000>; - - status = "disabled"; }; diff --git a/target/linux/qualcommax/image/ipq50xx.mk b/target/linux/qualcommax/image/ipq50xx.mk index 65d134c4a8..6a6a50d6f7 100644 --- a/target/linux/qualcommax/image/ipq50xx.mk +++ b/target/linux/qualcommax/image/ipq50xx.mk @@ -46,7 +46,8 @@ define Device/elecom_wrc-x3000gs2 IMAGES += factory.bin IMAGE/factory.bin := append-ubi | qsdk-ipq-factory-nand | \ mstc-header 4.04(XZF.0)b90 | elecom-product-header WRC-X3000GS2 - DEVICE_PACKAGES := ath11k-firmware-qcn6122 ipq-wifi-elecom_wrc-x3000gs2 + DEVICE_PACKAGES := ath11k-firmware-ipq5018-qcn6122 \ + ipq-wifi-elecom_wrc-x3000gs2 endef TARGET_DEVICES += elecom_wrc-x3000gs2 @@ -65,7 +66,7 @@ define Device/glinet_gl-b3000 IMAGES := factory.img sysupgrade.bin IMAGE/factory.img := append-ubi | gl-qsdk-factory | append-metadata DEVICE_PACKAGES := \ - ath11k-firmware-qcn6122 \ + ath11k-firmware-ipq5018-qcn6122 \ ipq-wifi-glinet_gl-b3000 \ dumpimage endef @@ -85,7 +86,8 @@ define Device/iodata_wn-dax3000gr IMAGES += factory.bin IMAGE/factory.bin := append-ubi | qsdk-ipq-factory-nand | \ mstc-header 4.04(XZH.1)b90 0x480 - DEVICE_PACKAGES := ath11k-firmware-qcn6122 ipq-wifi-iodata_wn-dax3000gr + DEVICE_PACKAGES := ath11k-firmware-ipq5018-qcn6122 \ + ipq-wifi-iodata_wn-dax3000gr endef TARGET_DEVICES += iodata_wn-dax3000gr @@ -106,7 +108,8 @@ define Device/linksys_mr5500 $(call Device/linksys_ipq50xx_mx_base) DEVICE_MODEL := MR5500 DEVICE_DTS_CONFIG := config@mp03.1 - DEVICE_PACKAGES := kmod-ath11k-pci \ + DEVICE_PACKAGES := ath11k-firmware-ipq5018 \ + kmod-ath11k-pci \ ath11k-firmware-qcn9074 \ ipq-wifi-linksys_mr5500 \ kmod-usb-ledtrig-usbport @@ -117,7 +120,7 @@ define Device/linksys_mx2000 $(call Device/linksys_ipq50xx_mx_base) DEVICE_MODEL := MX2000 DEVICE_DTS_CONFIG := config@mp03.5-c1 - DEVICE_PACKAGES := ath11k-firmware-qcn6122 \ + DEVICE_PACKAGES := ath11k-firmware-ipq5018-qcn6122 \ ipq-wifi-linksys_mx2000 endef TARGET_DEVICES += linksys_mx2000 @@ -126,7 +129,8 @@ define Device/linksys_mx5500 $(call Device/linksys_ipq50xx_mx_base) DEVICE_MODEL := MX5500 DEVICE_DTS_CONFIG := config@mp03.1 - DEVICE_PACKAGES := kmod-ath11k-pci \ + DEVICE_PACKAGES := ath11k-firmware-ipq5018 \ + kmod-ath11k-pci \ ath11k-firmware-qcn9074 \ ipq-wifi-linksys_mx5500 endef @@ -136,7 +140,8 @@ define Device/linksys_spnmx56 $(call Device/linksys_ipq50xx_mx_base) DEVICE_MODEL := SPNMX56 DEVICE_DTS_CONFIG := config@mp03.1 - DEVICE_PACKAGES := kmod-ath11k-pci \ + DEVICE_PACKAGES := ath11k-firmware-ipq5018 \ + kmod-ath11k-pci \ ath11k-firmware-qcn9074 \ ipq-wifi-linksys_spnmx56 endef @@ -153,7 +158,8 @@ define Device/xiaomi_ax6000 SOC := ipq5018 KERNEL_SIZE := 36864k NAND_SIZE := 128m - DEVICE_PACKAGES := kmod-ath11k-pci \ + DEVICE_PACKAGES := ath11k-firmware-ipq5018 \ + kmod-ath11k-pci \ ath11k-firmware-qcn9074 \ kmod-ath10k-ct-smallbuffers \ ath10k-firmware-qca9887-ct \ @@ -174,8 +180,7 @@ define Device/yuncore_ax830 PAGESIZE := 2048 SOC := ipq5018 DEVICE_DTS_CONFIG := config@mp03.5-c1 - DEVICE_PACKAGES := ath11k-firmware-ipq5018 \ - ath11k-firmware-qcn6122 \ + DEVICE_PACKAGES := ath11k-firmware-ipq5018-qcn6122 \ ipq-wifi-yuncore_ax830 endef TARGET_DEVICES += yuncore_ax830 @@ -189,8 +194,8 @@ define Device/yuncore_ax850 PAGESIZE := 2048 SOC := ipq5018 DEVICE_DTS_CONFIG := config@mp03.1 - DEVICE_PACKAGES := kmod-ath11k-pci \ - ath11k-firmware-ipq5018 \ + DEVICE_PACKAGES := ath11k-firmware-ipq5018 \ + kmod-ath11k-pci \ ath11k-firmware-qcn9074 \ ipq-wifi-yuncore_ax850 endef diff --git a/target/linux/qualcommax/ipq50xx/base-files/etc/hotplug.d/firmware/11-ath11k-caldata b/target/linux/qualcommax/ipq50xx/base-files/etc/hotplug.d/firmware/11-ath11k-caldata index 00591ab8b5..c34aadf7d4 100644 --- a/target/linux/qualcommax/ipq50xx/base-files/etc/hotplug.d/firmware/11-ath11k-caldata +++ b/target/linux/qualcommax/ipq50xx/base-files/etc/hotplug.d/firmware/11-ath11k-caldata @@ -44,7 +44,7 @@ case "$FIRMWARE" in ;; esac ;; -"ath11k/QCN6122/hw1.0/cal-ahb-b00a040.wifi1.bin") +"ath11k/QCN6122/hw1.0/cal-ahb-b00a040.wifi.bin") case "$board" in elecom,wrc-x3000gs2|\ iodata,wn-dax3000gr) diff --git a/target/linux/qualcommax/ipq50xx/base-files/etc/hotplug.d/ieee80211/05-wifi-migrate b/target/linux/qualcommax/ipq50xx/base-files/etc/hotplug.d/ieee80211/05-wifi-migrate index d3ad319a31..d3460db582 100644 --- a/target/linux/qualcommax/ipq50xx/base-files/etc/hotplug.d/ieee80211/05-wifi-migrate +++ b/target/linux/qualcommax/ipq50xx/base-files/etc/hotplug.d/ieee80211/05-wifi-migrate @@ -48,6 +48,13 @@ migrate_radio() WIRELESS_CHANGED=false case "$(board_name)" in +elecom,wrc-x3000gs2|\ +glinet,gl-b3000|\ +iodata,wn-dax3000gr|\ +linksys,mx2000|\ +yuncore,ax830) + migrate_radio 'platform/soc@0/b00a040.wifi1' 'platform/soc@0/b00a040.wifi' + ;; linksys,mr5500|\ linksys,mx5500|\ linksys,spnmx56) diff --git a/target/linux/qualcommax/ipq50xx/target.mk b/target/linux/qualcommax/ipq50xx/target.mk index 2e68329265..62b05a7fc3 100644 --- a/target/linux/qualcommax/ipq50xx/target.mk +++ b/target/linux/qualcommax/ipq50xx/target.mk @@ -1,6 +1,5 @@ SUBTARGET:=ipq50xx BOARDNAME:=Qualcomm Atheros IPQ50xx -DEFAULT_PACKAGES += ath11k-firmware-ipq5018 define Target/Description Build firmware images for Qualcomm Atheros IPQ50xx based boards. diff --git a/target/linux/qualcommax/patches-6.12/0189-arm64-dts-qcom-ipq5018-add-nodes-to-bringup-q6.patch b/target/linux/qualcommax/patches-6.12/0189-arm64-dts-qcom-ipq5018-add-nodes-to-bringup-q6.patch new file mode 100644 index 0000000000..6667e1c081 --- /dev/null +++ b/target/linux/qualcommax/patches-6.12/0189-arm64-dts-qcom-ipq5018-add-nodes-to-bringup-q6.patch @@ -0,0 +1,101 @@ +From 553461c1f1ae9b2ac50bce5ed5de15092cc04d29 Mon Sep 17 00:00:00 2001 +From: George Moussalem +Date: Tue, 21 Oct 2025 15:38:32 +0400 +Subject: [PATCH v6 5/8] arm64: dts: qcom: ipq5018: add nodes to bringup q6 +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 7bit +Message-Id: <20251021-ipq5018-wifi-v6-5-c55c547df6fc@outlook.com> + +Enable nodes required for q6 remoteproc bring up. + +Signed-off-by: George Moussalem +--- + arch/arm64/boot/dts/qcom/ipq5018.dtsi | 62 +++++++++++++++++++++++++++++++++++ + 1 file changed, 62 insertions(+) + +--- a/arch/arm64/boot/dts/qcom/ipq5018.dtsi ++++ b/arch/arm64/boot/dts/qcom/ipq5018.dtsi +@@ -158,6 +158,11 @@ + reg = <0x0 0x4ac00000 0x0 0x200000>; + no-map; + }; ++ ++ q6_region: wcss@4b000000 { ++ reg = <0x0 0x4b000000 0x0 0x1b00000>; ++ no-map; ++ }; + }; + + soc: soc@0 { +@@ -717,6 +722,41 @@ + }; + }; + ++ q6v5_wcss: remoteproc@cd00000 { ++ compatible = "qcom,ipq5018-wcss-sec-pil"; ++ reg = <0x0cd00000 0x10000>; ++ firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mbn"; ++ interrupts-extended = <&intc GIC_SPI 291 IRQ_TYPE_EDGE_RISING>, ++ <&wcss_smp2p_in 0 IRQ_TYPE_NONE>, ++ <&wcss_smp2p_in 1 IRQ_TYPE_NONE>, ++ <&wcss_smp2p_in 2 IRQ_TYPE_NONE>, ++ <&wcss_smp2p_in 3 IRQ_TYPE_NONE>; ++ interrupt-names = "wdog", ++ "fatal", ++ "ready", ++ "handover", ++ "stop-ack"; ++ ++ clocks = <&gcc GCC_SLEEP_CLK_SRC>, ++ <&gcc GCC_SYS_NOC_WCSS_AHB_CLK>; ++ clock-names = "sleep", ++ "interconnect"; ++ ++ qcom,smem-states = <&wcss_smp2p_out 0>, ++ <&wcss_smp2p_out 1>; ++ qcom,smem-state-names = "shutdown", ++ "stop"; ++ ++ memory-region = <&q6_region>; ++ ++ glink-edge { ++ interrupts = ; ++ label = "rtr"; ++ qcom,remote-pid = <1>; ++ mboxes = <&apcs_glb 8>; ++ }; ++ }; ++ + pcie1: pcie@80000000 { + compatible = "qcom,pcie-ipq5018"; + reg = <0x80000000 0xf1d>, +@@ -991,4 +1031,28 @@ + , + ; + }; ++ ++ wcss: smp2p-wcss { ++ compatible = "qcom,smp2p"; ++ qcom,smem = <435>, <428>; ++ ++ interrupt-parent = <&intc>; ++ interrupts = ; ++ ++ mboxes = <&apcs_glb 9>; ++ ++ qcom,local-pid = <0>; ++ qcom,remote-pid = <1>; ++ ++ wcss_smp2p_out: master-kernel { ++ qcom,entry-name = "master-kernel"; ++ #qcom,smem-state-cells = <1>; ++ }; ++ ++ wcss_smp2p_in: slave-kernel { ++ qcom,entry-name = "slave-kernel"; ++ interrupt-controller; ++ #interrupt-cells = <2>; ++ }; ++ }; + }; diff --git a/target/linux/qualcommax/patches-6.12/0306-arm64-dts-qcom-ipq5018-Add-PWM-node.patch b/target/linux/qualcommax/patches-6.12/0306-arm64-dts-qcom-ipq5018-Add-PWM-node.patch index 74b82ea0a0..5272a57465 100644 --- a/target/linux/qualcommax/patches-6.12/0306-arm64-dts-qcom-ipq5018-Add-PWM-node.patch +++ b/target/linux/qualcommax/patches-6.12/0306-arm64-dts-qcom-ipq5018-Add-PWM-node.patch @@ -8,7 +8,7 @@ Signed-off-by: George Moussalem --- --- a/arch/arm64/boot/dts/qcom/ipq5018.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq5018.dtsi -@@ -453,6 +453,16 @@ +@@ -458,6 +458,16 @@ reg = <0x01937000 0x21000>; }; diff --git a/target/linux/qualcommax/patches-6.12/0715-arm64-dts-qcom-ipq5018-add-vendor-compatible-to-mdio-node.patch b/target/linux/qualcommax/patches-6.12/0715-arm64-dts-qcom-ipq5018-add-vendor-compatible-to-mdio-node.patch index 18272f3d9a..7250f93424 100644 --- a/target/linux/qualcommax/patches-6.12/0715-arm64-dts-qcom-ipq5018-add-vendor-compatible-to-mdio-node.patch +++ b/target/linux/qualcommax/patches-6.12/0715-arm64-dts-qcom-ipq5018-add-vendor-compatible-to-mdio-node.patch @@ -9,7 +9,7 @@ aren't upstreamed, add the vendor compatible. Signed-off-by: George Moussalem --- a/arch/arm64/boot/dts/qcom/ipq5018.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq5018.dtsi -@@ -214,7 +214,7 @@ +@@ -219,7 +219,7 @@ }; mdio0: mdio@88000 { diff --git a/target/linux/qualcommax/patches-6.12/0816-arm64-dts-qcom-ipq5018-add-wifi-support.patch b/target/linux/qualcommax/patches-6.12/0816-arm64-dts-qcom-ipq5018-add-wifi-support.patch index c4575e6c91..d3e5c58940 100644 --- a/target/linux/qualcommax/patches-6.12/0816-arm64-dts-qcom-ipq5018-add-wifi-support.patch +++ b/target/linux/qualcommax/patches-6.12/0816-arm64-dts-qcom-ipq5018-add-wifi-support.patch @@ -13,67 +13,66 @@ Signed-off-by: George Moussalem --- --- a/arch/arm64/boot/dts/qcom/ipq5018.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq5018.dtsi -@@ -727,6 +727,225 @@ +@@ -732,6 +732,118 @@ }; }; -+ wifi0: wifi@c000000 { ++ wifi: wifi@c000000 { + compatible = "qcom,ipq5018-wifi"; -+ reg = <0xc000000 0x1000000>; ++ reg = <0x0c000000 0x1000000>; + + interrupts = , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ ; -+ ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ , ++ ; + interrupt-names = "misc-pulse1", + "misc-latch", + "sw-exception", @@ -130,112 +129,6 @@ Signed-off-by: George Moussalem + status = "disabled"; + }; + -+ //QCN6102 5G -+ wifi1: wifi1@c000000 { -+ reg = <0x0b00a040 0x0>; -+ compatible = "qcom,qcn6122-wifi"; -+ interrupts = , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ ; -+ status = "disabled"; -+ }; -+ -+ //QCN6122 5G/6G -+ wifi2: wifi2@c000000 { -+ reg = <0x0b00a040 0x0>; -+ compatible = "qcom,qcn6122-wifi"; -+ interrupts = , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ , -+ ; -+ status = "disabled"; -+ }; -+ -+ q6v5_wcss: remoteproc@cd00000 { -+ compatible = "qcom,ipq5018-q6-mpd"; -+ reg = <0x0cd00000 0x4040>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ ranges; -+ -+ clocks = <&gcc GCC_XO_CLK>, -+ <&gcc GCC_SLEEP_CLK_SRC>, -+ <&gcc GCC_SYS_NOC_WCSS_AHB_CLK>; -+ -+ interrupts-extended = <&intc GIC_SPI 291 IRQ_TYPE_EDGE_RISING>, -+ <&wcss_smp2p_in 0 IRQ_TYPE_NONE>, -+ <&wcss_smp2p_in 1 IRQ_TYPE_NONE>, -+ <&wcss_smp2p_in 2 IRQ_TYPE_NONE>, -+ <&wcss_smp2p_in 3 IRQ_TYPE_NONE>; -+ interrupt-names = "wdog", -+ "fatal", -+ "ready", -+ "handover", -+ "stop-ack"; -+ -+ qcom,smem-states = <&wcss_smp2p_out 0>, -+ <&wcss_smp2p_out 1>; -+ qcom,smem-state-names = "shutdown", -+ "stop"; -+ -+ status = "disabled"; -+ -+ glink-edge { -+ interrupts = ; -+ label = "rtr"; -+ qcom,remote-pid = <1>; -+ mboxes = <&apcs_glb 8>; -+ -+ qrtr_requests { -+ qcom,glink-channels = "IPCRTR"; -+ }; -+ }; -+ }; -+ -+ wcss: smp2p-wcss { -+ compatible = "qcom,smp2p"; -+ qcom,smem = <435>, <428>; -+ -+ interrupt-parent = <&intc>; -+ interrupts = ; -+ -+ mboxes = <&apcs_glb 9>; -+ -+ qcom,local-pid = <0>; -+ qcom,remote-pid = <1>; -+ -+ wcss_smp2p_out: master-kernel { -+ qcom,entry-name = "master-kernel"; -+ qcom,smp2p-feature-ssr-ack; -+ #qcom,smem-state-cells = <1>; -+ }; -+ -+ wcss_smp2p_in: slave-kernel { -+ qcom,entry-name = "slave-kernel"; -+ interrupt-controller; -+ #interrupt-cells = <2>; -+ }; -+ }; -+ - pcie1: pcie@80000000 { - compatible = "qcom,pcie-ipq5018"; - reg = <0x80000000 0xf1d>, + q6v5_wcss: remoteproc@cd00000 { + compatible = "qcom,ipq5018-wcss-sec-pil"; + reg = <0x0cd00000 0x10000>;