]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
Revert "qualcommax: ipq50xx: remove ipq5018 and qcn6122 wifi m3 fw"
authorRobert Marko <robimarko@gmail.com>
Sat, 27 Dec 2025 11:16:15 +0000 (12:16 +0100)
committerRobert Marko <robimarko@gmail.com>
Sat, 27 Dec 2025 11:16:15 +0000 (12:16 +0100)
This reverts commit 423cda97f9e5152c6e9ad210d7a6b089d3664f28.

It appears that this broke remoteproc on some devices, so revert for now.

Signed-off-by: Robert Marko <robimarko@gmail.com>
target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-ax6000.dts
target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-ax850.dts
target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-mr5500.dts
target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-mx5500.dts
target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-qcn6122.dtsi
target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-spnmx56.dts
target/linux/qualcommax/patches-6.12/0808-remoteproc-qcom-wcss-sec-add-split-firmware-support.patch [new file with mode: 0644]

index a0b94bd2f79f0318b0b65d4a10e7f50b96dcc373..4782101483b7ab9ba7360df7b450a368775fcfc8 100644 (file)
 };
 
 &q6v5_wcss {
-       firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt";
+       firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt",
+                       "ath11k/IPQ5018/hw1.0/m3_fw.mdt";
 };
 
 &wifi {
index 0593c955e01e3d451d1f0c8ab453ac50d0f79fd3..592fc84c5bccb2288b810e4c5df339ac555a49b6 100644 (file)
 };
 
 &q6v5_wcss {
-       firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt";
+       firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt",
+                       "ath11k/IPQ5018/hw1.0/m3_fw.mdt";
 };
 
 &wifi {
index 8ff30ec436cd010f4902b57924c7e3ec017aa48a..4c1f50938cb80bc18b6ffc73a6fa343360f61872 100644 (file)
 };
 
 &q6v5_wcss {
-       firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt";
+       firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt",
+                       "ath11k/IPQ5018/hw1.0/m3_fw.mdt";
 };
 
 &wifi {
index 0ea27d3373a586609404e44d98c17386c9569cd5..73d232e05c6d735038270d18ec1d060fdd99eda9 100644 (file)
 };
 
 &q6v5_wcss {
-       firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt";
+       firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt",
+                       "ath11k/IPQ5018/hw1.0/m3_fw.mdt";
 };
 
 &wifi {
index ceb03b00a35fccfe773140fe2f5ca979938e374d..a59c6ceda36a04c50c67e32c0576b18774eedcd1 100644 (file)
@@ -12,7 +12,9 @@
 &q6v5_wcss {
        compatible = "qcom,ipq5018-q6-mpd";
 
-       firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt";
+       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 {
index 90a87299a6aa0e0de3df51edd3a5f34ff7307e02..1dafa63414cc24323647800472ed296afbe57a50 100644 (file)
 };
 
 &q6v5_wcss {
-       firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt";
+       firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt",
+                       "ath11k/IPQ5018/hw1.0/m3_fw.mdt";
 };
 
 &wifi {
diff --git a/target/linux/qualcommax/patches-6.12/0808-remoteproc-qcom-wcss-sec-add-split-firmware-support.patch b/target/linux/qualcommax/patches-6.12/0808-remoteproc-qcom-wcss-sec-add-split-firmware-support.patch
new file mode 100644 (file)
index 0000000..29644e3
--- /dev/null
@@ -0,0 +1,102 @@
+From: George Moussalem <george.moussalem@outlook.com>
+Date: Tue, 21 Oct 2025 15:26:31 +0400
+Subject: [PATCH] remoteproc: qcom: wcss-sec: add split firmware support
+
+The driver currently expects only one firmware file to be loaded as part
+of bringing up WCSS. For IPQ5018 and QCN6122, multiple firmware files are
+required, both the q6 and m3 firmware files. As such, add support for
+loading up to 3 firmware files.
+
+Signed-off-by: George Moussalem <george.moussalem@outlook.com>
+---
+--- a/drivers/remoteproc/qcom_q6v5_wcss_sec.c
++++ b/drivers/remoteproc/qcom_q6v5_wcss_sec.c
+@@ -25,6 +25,8 @@
+ #define Q6_WAIT_TIMEOUT                       (5 * HZ)
++#define MAX_FIRMWARE                  3
++
+ struct wcss_sec {
+       struct device *dev;
+       struct qcom_rproc_glink glink_subdev;
+@@ -35,6 +37,7 @@ struct wcss_sec {
+       void *mem_region;
+       size_t mem_size;
+       const struct wcss_data *desc;
++      const char **firmware;
+       struct mbox_client mbox_client;
+       struct mbox_chan *mbox_chan;
+@@ -137,7 +140,8 @@ static int wcss_sec_load(struct rproc *r
+ {
+       struct wcss_sec *wcss = rproc->priv;
+       struct device *dev = wcss->dev;
+-      int ret;
++      const struct firmware *fw_hdl;
++      int i, ret;
+       if (wcss->desc->use_tmelcom) {
+               wcss->metadata = qcom_mdt_read_metadata(fw, &wcss->metadata_len,
+@@ -161,6 +165,28 @@ static int wcss_sec_load(struct rproc *r
+                                   wcss->mem_phys, wcss->mem_size, &wcss->mem_reloc);
+               if (ret)
+                       return ret;
++
++              for (i = 1; i < MAX_FIRMWARE; i++) {
++                      if (!wcss->firmware[i])
++                              continue;
++
++                      ret = request_firmware(&fw_hdl, wcss->firmware[i], dev);
++
++                      if (ret)
++                              continue;
++
++                      ret = qcom_mdt_load_no_init(dev, fw_hdl, wcss->firmware[i], 0,
++                                                  wcss->mem_region, wcss->mem_phys,
++                                                  wcss->mem_size, &wcss->mem_reloc);
++
++                      release_firmware(fw_hdl);
++
++                      if (ret) {
++                              dev_err(dev, "error %d loading firmware %s\n",
++                                      ret, wcss->firmware[i]);
++                              return ret;
++                      }
++              }
+       }
+       qcom_pil_info_store("wcss", wcss->mem_phys, wcss->mem_size);
+@@ -291,17 +317,20 @@ static int wcss_sec_probe(struct platfor
+       struct wcss_sec *wcss;
+       struct clk *sleep_clk;
+       struct clk *int_clk;
+-      const char *fw_name = NULL;
++      const char **firmware = NULL;
+       const struct wcss_data *desc = of_device_get_match_data(&pdev->dev);
+       int ret;
+-      ret = of_property_read_string(pdev->dev.of_node, "firmware-name",
+-                                    &fw_name);
++      firmware = devm_kcalloc(&pdev->dev, MAX_FIRMWARE,
++                              sizeof(*firmware), GFP_KERNEL);
++
++      ret = of_property_read_string_array(pdev->dev.of_node, "firmware-name",
++                                          firmware, MAX_FIRMWARE);
+       if (ret < 0)
+               return ret;
+       rproc = devm_rproc_alloc(&pdev->dev, desc->ss_name, &wcss_sec_ops,
+-                               fw_name, sizeof(*wcss));
++                               firmware[0], sizeof(*wcss));
+       if (!rproc) {
+               dev_err(&pdev->dev, "failed to allocate rproc\n");
+               return -ENOMEM;
+@@ -310,6 +339,7 @@ static int wcss_sec_probe(struct platfor
+       wcss = rproc->priv;
+       wcss->dev = &pdev->dev;
+       wcss->desc = desc;
++      wcss->firmware = firmware;
+       ret = wcss_sec_alloc_memory_region(wcss);
+       if (ret)