summaryrefslogtreecommitdiffstats
path: root/target/linux
diff options
context:
space:
mode:
authorRobert Marko <robimarko@gmail.com>2023-05-26 14:00:45 +0200
committerChristian Marangi <ansuelsmth@gmail.com>2023-05-28 08:57:10 +0200
commit09085d1740ef33ef9ca4404c45802342850b6e02 (patch)
treef8e969c065b5e876e3521859cdfb69fc252b4e18 /target/linux
parent3790a0f94226e74a5531a7bd2f66823332edde8a (diff)
downloadopenwrt-09085d1740ef33ef9ca4404c45802342850b6e02.tar.gz
openwrt-09085d1740ef33ef9ca4404c45802342850b6e02.tar.bz2
openwrt-09085d1740ef33ef9ca4404c45802342850b6e02.zip
ipq807x: 6.1: fix remoteproc booting
In 6.1 booting the remoteprocessor that is actually running the WLAN unfortunatelly broke, so after a long time bisecting we managed to track it down to commit ("soc: qcom: mdt_loader: Always invoke PAS mem_setup"). Luckily adding back the relocation check and not making an SCM call qcom_scm_pas_mem_setup() restored the functionality. Ansuel has sent the patch upstream. Signed-off-by: Robert Marko <robimarko@gmail.com>
Diffstat (limited to 'target/linux')
-rw-r--r--target/linux/ipq807x/patches-6.1/0131-soc-qcom-mdt_loader-Fix-unconditional-call-to-scm_pa.patch77
1 files changed, 77 insertions, 0 deletions
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
new file mode 100644
index 0000000000..72b38270c4
--- /dev/null
+++ b/target/linux/ipq807x/patches-6.1/0131-soc-qcom-mdt_loader-Fix-unconditional-call-to-scm_pa.patch
@@ -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: