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>
This commit is contained in:
parent
3790a0f942
commit
09085d1740
|
@ -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:
|
Loading…
Reference in New Issue