ipq807x: mark MDT loader fix as backport
authorRobert Marko <robimarko@gmail.com>
Tue, 6 Jun 2023 10:25:27 +0000 (12:25 +0200)
committerChristian Marangi <ansuelsmth@gmail.com>
Tue, 6 Jun 2023 18:08:10 +0000 (20:08 +0200)
MDT loader fix for remoteproc was already merged, so mark it as a backport
with the future 6.5 kernel version.

Signed-off-by: Robert Marko <robimarko@gmail.com>
target/linux/ipq807x/patches-6.1/0022-v6.5-soc-qcom-mdt_loader-Fix-unconditional-call-to-scm_pa.patch [new file with mode: 0644]
target/linux/ipq807x/patches-6.1/0131-soc-qcom-mdt_loader-Fix-unconditional-call-to-scm_pa.patch [deleted file]

diff --git a/target/linux/ipq807x/patches-6.1/0022-v6.5-soc-qcom-mdt_loader-Fix-unconditional-call-to-scm_pa.patch b/target/linux/ipq807x/patches-6.1/0022-v6.5-soc-qcom-mdt_loader-Fix-unconditional-call-to-scm_pa.patch
new file mode 100644 (file)
index 0000000..72b3827
--- /dev/null
@@ -0,0 +1,77 @@
+From b8295c6eb276b60f7b75c53a9703ca8fee01eba2 Mon Sep 17 00:00:00 2001
+From: Christian Marangi <ansuelsmth@gmail.com>
+Date: Fri, 26 May 2023 13:09:17 +0200
+Subject: [PATCH] soc: qcom: mdt_loader: Fix unconditional call to
+ scm_pas_mem_setup
+
+Commit ebeb20a9cd3f ("soc: qcom: mdt_loader: Always invoke PAS
+mem_setup") dropped the relocate check and made pas_mem_setup run
+unconditionally. The code was later moved with commit f4e526ff7e38
+("soc: qcom: mdt_loader: Extract PAS operations") to
+qcom_mdt_pas_init() effectively losing track of what was actually
+done.
+
+The assumption that PAS mem_setup can be done anytime was effectively
+wrong, with no good reason and this caused regression on some SoC
+that use remoteproc to bringup ath11k. One example is IPQ8074 SoC that
+effectively broke resulting in remoteproc silently die and ath11k not
+working.
+
+On this SoC FW relocate is not enabled and PAS mem_setup was correctly
+skipped in previous kernel version resulting in correct bringup and
+function of remoteproc and ath11k.
+
+To fix the regression, reintroduce the relocate check in
+qcom_mdt_pas_init() and correctly skip PAS mem_setup where relocate is
+not enabled.
+
+Fixes: ebeb20a9cd3f ("soc: qcom: mdt_loader: Always invoke PAS mem_setup")
+Reported-by: Robert Marko <robimarko@gmail.com>
+Tested-by: Robert Marko <robimarko@gmail.com>
+Co-developed-by: Robert Marko <robimarko@gmail.com>
+Signed-off-by: Robert Marko <robimarko@gmail.com>
+Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
+Cc: stable@vger.kernel.org
+---
+ drivers/soc/qcom/mdt_loader.c | 16 +++++++++++-----
+ 1 file changed, 11 insertions(+), 5 deletions(-)
+
+--- a/drivers/soc/qcom/mdt_loader.c
++++ b/drivers/soc/qcom/mdt_loader.c
+@@ -210,6 +210,7 @@ int qcom_mdt_pas_init(struct device *dev
+       const struct elf32_hdr *ehdr;
+       phys_addr_t min_addr = PHYS_ADDR_MAX;
+       phys_addr_t max_addr = 0;
++      bool relocate = false;
+       size_t metadata_len;
+       void *metadata;
+       int ret;
+@@ -224,6 +225,9 @@ int qcom_mdt_pas_init(struct device *dev
+               if (!mdt_phdr_valid(phdr))
+                       continue;
++              if (phdr->p_flags & QCOM_MDT_RELOCATABLE)
++                      relocate = true;
++
+               if (phdr->p_paddr < min_addr)
+                       min_addr = phdr->p_paddr;
+@@ -246,11 +250,13 @@ int qcom_mdt_pas_init(struct device *dev
+               goto out;
+       }
+-      ret = qcom_scm_pas_mem_setup(pas_id, mem_phys, max_addr - min_addr);
+-      if (ret) {
+-              /* Unable to set up relocation */
+-              dev_err(dev, "error %d setting up firmware %s\n", ret, fw_name);
+-              goto out;
++      if (relocate) {
++              ret = qcom_scm_pas_mem_setup(pas_id, mem_phys, max_addr - min_addr);
++              if (ret) {
++                      /* Unable to set up relocation */
++                      dev_err(dev, "error %d setting up firmware %s\n", ret, fw_name);
++                      goto out;
++              }
+       }
+ out:
diff --git a/target/linux/ipq807x/patches-6.1/0131-soc-qcom-mdt_loader-Fix-unconditional-call-to-scm_pa.patch b/target/linux/ipq807x/patches-6.1/0131-soc-qcom-mdt_loader-Fix-unconditional-call-to-scm_pa.patch
deleted file mode 100644 (file)
index 72b3827..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-From b8295c6eb276b60f7b75c53a9703ca8fee01eba2 Mon Sep 17 00:00:00 2001
-From: Christian Marangi <ansuelsmth@gmail.com>
-Date: Fri, 26 May 2023 13:09:17 +0200
-Subject: [PATCH] soc: qcom: mdt_loader: Fix unconditional call to
- scm_pas_mem_setup
-
-Commit ebeb20a9cd3f ("soc: qcom: mdt_loader: Always invoke PAS
-mem_setup") dropped the relocate check and made pas_mem_setup run
-unconditionally. The code was later moved with commit f4e526ff7e38
-("soc: qcom: mdt_loader: Extract PAS operations") to
-qcom_mdt_pas_init() effectively losing track of what was actually
-done.
-
-The assumption that PAS mem_setup can be done anytime was effectively
-wrong, with no good reason and this caused regression on some SoC
-that use remoteproc to bringup ath11k. One example is IPQ8074 SoC that
-effectively broke resulting in remoteproc silently die and ath11k not
-working.
-
-On this SoC FW relocate is not enabled and PAS mem_setup was correctly
-skipped in previous kernel version resulting in correct bringup and
-function of remoteproc and ath11k.
-
-To fix the regression, reintroduce the relocate check in
-qcom_mdt_pas_init() and correctly skip PAS mem_setup where relocate is
-not enabled.
-
-Fixes: ebeb20a9cd3f ("soc: qcom: mdt_loader: Always invoke PAS mem_setup")
-Reported-by: Robert Marko <robimarko@gmail.com>
-Tested-by: Robert Marko <robimarko@gmail.com>
-Co-developed-by: Robert Marko <robimarko@gmail.com>
-Signed-off-by: Robert Marko <robimarko@gmail.com>
-Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
-Cc: stable@vger.kernel.org
----
- drivers/soc/qcom/mdt_loader.c | 16 +++++++++++-----
- 1 file changed, 11 insertions(+), 5 deletions(-)
-
---- a/drivers/soc/qcom/mdt_loader.c
-+++ b/drivers/soc/qcom/mdt_loader.c
-@@ -210,6 +210,7 @@ int qcom_mdt_pas_init(struct device *dev
-       const struct elf32_hdr *ehdr;
-       phys_addr_t min_addr = PHYS_ADDR_MAX;
-       phys_addr_t max_addr = 0;
-+      bool relocate = false;
-       size_t metadata_len;
-       void *metadata;
-       int ret;
-@@ -224,6 +225,9 @@ int qcom_mdt_pas_init(struct device *dev
-               if (!mdt_phdr_valid(phdr))
-                       continue;
-+              if (phdr->p_flags & QCOM_MDT_RELOCATABLE)
-+                      relocate = true;
-+
-               if (phdr->p_paddr < min_addr)
-                       min_addr = phdr->p_paddr;
-@@ -246,11 +250,13 @@ int qcom_mdt_pas_init(struct device *dev
-               goto out;
-       }
--      ret = qcom_scm_pas_mem_setup(pas_id, mem_phys, max_addr - min_addr);
--      if (ret) {
--              /* Unable to set up relocation */
--              dev_err(dev, "error %d setting up firmware %s\n", ret, fw_name);
--              goto out;
-+      if (relocate) {
-+              ret = qcom_scm_pas_mem_setup(pas_id, mem_phys, max_addr - min_addr);
-+              if (ret) {
-+                      /* Unable to set up relocation */
-+                      dev_err(dev, "error %d setting up firmware %s\n", ret, fw_name);
-+                      goto out;
-+              }
-       }
- out: