Skip to content

Commit 0504fb9

Browse files
Ansuelroxanan1996
authored andcommitted
soc: qcom: mdt_loader: Fix unconditional call to scm_pas_mem_setup
BugLink: https://bugs.launchpad.net/bugs/2036075 commit bcb8898 upstream. Commit ebeb20a ("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 f4e526f ("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: ebeb20a ("soc: qcom: mdt_loader: Always invoke PAS mem_setup") Tested-by: Robert Marko <[email protected]> Co-developed-by: Robert Marko <[email protected]> Signed-off-by: Robert Marko <[email protected]> Signed-off-by: Christian Marangi <[email protected]> Cc: [email protected] Reviewed-by: Mukesh Ojha <[email protected]> Signed-off-by: Bjorn Andersson <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]> Signed-off-by: Kamal Mostafa <[email protected]> Signed-off-by: Stefan Bader <[email protected]>
1 parent 2a0ec06 commit 0504fb9

File tree

1 file changed

+11
-5
lines changed

1 file changed

+11
-5
lines changed

drivers/soc/qcom/mdt_loader.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ int qcom_mdt_pas_init(struct device *dev, const struct firmware *fw,
210210
const struct elf32_hdr *ehdr;
211211
phys_addr_t min_addr = PHYS_ADDR_MAX;
212212
phys_addr_t max_addr = 0;
213+
bool relocate = false;
213214
size_t metadata_len;
214215
void *metadata;
215216
int ret;
@@ -224,6 +225,9 @@ int qcom_mdt_pas_init(struct device *dev, const struct firmware *fw,
224225
if (!mdt_phdr_valid(phdr))
225226
continue;
226227

228+
if (phdr->p_flags & QCOM_MDT_RELOCATABLE)
229+
relocate = true;
230+
227231
if (phdr->p_paddr < min_addr)
228232
min_addr = phdr->p_paddr;
229233

@@ -246,11 +250,13 @@ int qcom_mdt_pas_init(struct device *dev, const struct firmware *fw,
246250
goto out;
247251
}
248252

249-
ret = qcom_scm_pas_mem_setup(pas_id, mem_phys, max_addr - min_addr);
250-
if (ret) {
251-
/* Unable to set up relocation */
252-
dev_err(dev, "error %d setting up firmware %s\n", ret, fw_name);
253-
goto out;
253+
if (relocate) {
254+
ret = qcom_scm_pas_mem_setup(pas_id, mem_phys, max_addr - min_addr);
255+
if (ret) {
256+
/* Unable to set up relocation */
257+
dev_err(dev, "error %d setting up firmware %s\n", ret, fw_name);
258+
goto out;
259+
}
254260
}
255261

256262
out:

0 commit comments

Comments
 (0)