lkml.org 
[lkml]   [2020]   [Apr]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.6 158/254] remoteproc: qcom_q6v5_mss: Dont reassign mpss region on shutdown
    Date
    From: Bjorn Andersson <bjorn.andersson@linaro.org>

    commit 900fc60df22748dbc28e4970838e8f7b8f1013ce upstream.

    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")
    Cc: stable@vger.kernel.org
    Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.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-2-sibis@codeaurora.org
    Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/remoteproc/qcom_q6v5_mss.c | 35 ++++++++++++++++++++++++-----------
    1 file changed, 24 insertions(+), 11 deletions(-)

    --- a/drivers/remoteproc/qcom_q6v5_mss.c
    +++ b/drivers/remoteproc/qcom_q6v5_mss.c
    @@ -1001,11 +1001,6 @@ static void q6v5_mba_reclaim(struct q6v5
    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 *q
    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(struc
    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(struc

    /* 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 *rpro
    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;

    \
     
     \ /
      Last update: 2020-04-16 16:26    [W:3.261 / U:0.100 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site