FAILED: patch "[PATCH] remoteproc: qcom_q6v5_mss: Don't reassign mpss region on" failed to apply to 4.19-stable tree
[email protected]
maintainerThe patch below does not apply to the 4.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 900fc60df22748dbc28e4970838e8f7b8f1013ce Mon Sep 17 00:00:00 2001
From: Bjorn Andersson <[email protected]>
Date: Thu, 5 Mar 2020 01:17:27 +0530
Subject: [PATCH] remoteproc: qcom_q6v5_mss: Don't reassign mpss region on
shutdown
Trying to reclaim mpss memory while the mba is not running causes the system to crash on devices with security fuses blown, so leave it assigned to the remote on shutdown and recover it on a subsequent boot.
Fixes 6c5a9dc2481b ("remoteproc: qcom: Make secure world call for mem ownership switch")
Signed-off-by Bjorn Andersson <[email protected]>
Signed-off-by Sibi Sankar <[email protected]>
Tested-by Bjorn Andersson <[email protected]>
Signed-off-by Bjorn Andersson <[email protected]>
drivers/remoteproc/qcom_q6v5_mss.c +24 -11
@@ -1001,11 +1001,6 @@ static void q6v5_mba_reclaim(struct q6v5 *qproc)writel (val, qproc->reg_base +QDSP6SS_PWR_CTL_REG ); } - ret =q6v5_xfer_mem_ownership (qproc, &qproc->mpss_perm, - false, qproc->mpss_phys, - qproc->mpss_size); -WARN_ON (ret); -q6v5_reset_assert (qproc); q6v5_clk_disable(qproc->dev, qproc->reset_clks,
@@ -1095,6 +1090,14 @@ static int q6v5_mpss_load(struct q6v5 *qproc) max_addr =ALIGN (phdr->p_paddr + phdr->p_memsz,SZ_4K ); } +/** +* In case of a modem subsystem restart on secure devices, the modem +* memory can be reclaimed only after MBA is loaded. For modem cold +* boot this will be a nop +*/ +q6v5_xfer_mem_ownership (qproc, &qproc->mpss_perm, false, + qproc->mpss_phys, qproc->mpss_size); + mpss_reloc = relocate ? min_addr : qproc->mpss_phys; qproc->mpss_reloc = mpss_reloc;/* Load firmware segments */
@@ -1184,8 +1187,16 @@ static void qcom_q6v5_dump_segment(struct rproc *rproc,void *ptr =rproc_da_to_va (rproc, segment->da, segment->size);/* Unlock mba before copying segments */ -if (!qproc->dump_mba_loaded) +if (!qproc->dump_mba_loaded) { ret =q6v5_mba_load (qproc); +if (!ret) { +/* Reset ownership back to Linux to copy segments */ + ret =q6v5_xfer_mem_ownership (qproc, &qproc->mpss_perm, + false, + qproc->mpss_phys, + qproc->mpss_size); + } + }if (!ptr || ret)memset (dest,0xff , segment->size);
@@ -1196,8 +1207,14 @@ static void qcom_q6v5_dump_segment(struct rproc *rproc,/* Reclaim mba after copying segments */ if (qproc->dump_segment_mask == qproc->dump_complete_mask) { -if (qproc->dump_mba_loaded) +if (qproc->dump_mba_loaded) { +/* Try to reset ownership back to Q6 */ +q6v5_xfer_mem_ownership (qproc, &qproc->mpss_perm, + true, + qproc->mpss_phys, + qproc->mpss_size);q6v5_mba_reclaim (qproc); + } } }
@@ -1237,10 +1254,6 @@ static int q6v5_start(struct rproc *rproc)return 0 ; reclaim_mpss: - xfermemop_ret =q6v5_xfer_mem_ownership (qproc, &qproc->mpss_perm, - false, qproc->mpss_phys, - qproc->mpss_size); -WARN_ON (xfermemop_ret);q6v5_mba_reclaim (qproc);return ret;