Skip to content

Commit

Permalink
soc: qcom: mdt_loader: Fix unconditional call to scm_pas_mem_setup
Browse files Browse the repository at this point in the history
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]>
  • Loading branch information
Ansuel authored and gregkh committed Jul 23, 2023
1 parent f83c7b7 commit 1554461
Showing 1 changed file with 11 additions and 5 deletions.
16 changes: 11 additions & 5 deletions drivers/soc/qcom/mdt_loader.c
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,7 @@ int qcom_mdt_pas_init(struct device *dev, const struct firmware *fw,
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;
Expand All @@ -224,6 +225,9 @@ int qcom_mdt_pas_init(struct device *dev, const struct firmware *fw,
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;

Expand All @@ -246,11 +250,13 @@ int qcom_mdt_pas_init(struct device *dev, const struct firmware *fw,
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:
Expand Down

0 comments on commit 1554461

Please sign in to comment.