| From 45da2d650068c057c2d2b24c10aca1ffa7749465 Mon Sep 17 00:00:00 2001 |
| From: Sibi Sankar <sibis@codeaurora.org> |
| Date: Thu, 5 Mar 2020 01:17:29 +0530 |
| Subject: [PATCH] remoteproc: qcom_q6v5_mss: Reload the mba region on coredump |
| |
| commit d96f2571dc84d128cacf1944f4ecc87834c779a6 upstream. |
| |
| On secure devices after a wdog/fatal interrupt, the mba region has to be |
| refreshed in order to prevent the following errors during mba load. |
| |
| Err Logs: |
| remoteproc remoteproc2: stopped remote processor 4080000.remoteproc |
| qcom-q6v5-mss 4080000.remoteproc: PBL returned unexpected status -284031232 |
| qcom-q6v5-mss 4080000.remoteproc: PBL returned unexpected status -284031232 |
| .... |
| qcom-q6v5-mss 4080000.remoteproc: PBL returned unexpected status -284031232 |
| qcom-q6v5-mss 4080000.remoteproc: MBA booted, loading mpss |
| |
| Fixes: 7dd8ade24dc2a ("remoteproc: qcom: q6v5-mss: Add custom dump function for modem") |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Sibi Sankar <sibis@codeaurora.org> |
| Tested-by: Bjorn Andersson <bjorn.andersson@linaro.org> |
| Link: https://lore.kernel.org/r/20200304194729.27979-4-sibis@codeaurora.org |
| Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/remoteproc/qcom_q6v5_mss.c b/drivers/remoteproc/qcom_q6v5_mss.c |
| index ec819af00502..90f9773b8ee0 100644 |
| --- a/drivers/remoteproc/qcom_q6v5_mss.c |
| +++ b/drivers/remoteproc/qcom_q6v5_mss.c |
| @@ -898,6 +898,23 @@ static void q6v5_mba_reclaim(struct q6v5 *qproc) |
| } |
| } |
| |
| +static int q6v5_reload_mba(struct rproc *rproc) |
| +{ |
| + struct q6v5 *qproc = rproc->priv; |
| + const struct firmware *fw; |
| + int ret; |
| + |
| + ret = request_firmware(&fw, rproc->firmware, qproc->dev); |
| + if (ret < 0) |
| + return ret; |
| + |
| + q6v5_load(rproc, fw); |
| + ret = q6v5_mba_load(qproc); |
| + release_firmware(fw); |
| + |
| + return ret; |
| +} |
| + |
| static int q6v5_mpss_load(struct q6v5 *qproc) |
| { |
| const struct elf32_phdr *phdrs; |
| @@ -1045,7 +1062,7 @@ static void qcom_q6v5_dump_segment(struct rproc *rproc, |
| |
| /* Unlock mba before copying segments */ |
| if (!qproc->dump_mba_loaded) { |
| - ret = q6v5_mba_load(qproc); |
| + ret = q6v5_reload_mba(rproc); |
| if (!ret) { |
| /* Reset ownership back to Linux to copy segments */ |
| ret = q6v5_xfer_mem_ownership(qproc, &qproc->mpss_perm, |
| -- |
| 2.7.4 |
| |