lkml.org 
[lkml]   [2021]   [Feb]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v6 07/16] remoteproc: stm32: Move memory parsing to rproc_ops
    Date
    From: Arnaud POULIQUEN <arnaud.pouliquen@foss.st.com>

    Some actions such as memory resources reallocation are needed when
    trying to reattach a co-processor. Use the prepare() operation for
    these actions.

    Co-developed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
    Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
    Signed-off-by: Arnaud POULIQUEN <arnaud.pouliquen@foss.st.com>
    ---
    drivers/remoteproc/remoteproc_core.c | 14 ++++++++++++--
    drivers/remoteproc/stm32_rproc.c | 27 ++++++---------------------
    2 files changed, 18 insertions(+), 23 deletions(-)

    diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c
    index 0012b7bdce24..86572880c726 100644
    --- a/drivers/remoteproc/remoteproc_core.c
    +++ b/drivers/remoteproc/remoteproc_core.c
    @@ -1582,10 +1582,17 @@ static int rproc_attach(struct rproc *rproc)
    return ret;
    }

    + /* Do anything that is needed to boot the remote processor */
    + ret = rproc_prepare_device(rproc);
    + if (ret) {
    + dev_err(dev, "can't prepare rproc %s: %d\n", rproc->name, ret);
    + goto disable_iommu;
    + }
    +
    ret = rproc_set_loaded_rsc_table(rproc);
    if (ret) {
    dev_err(dev, "can't load resource table: %d\n", ret);
    - goto disable_iommu;
    + goto unprepare_device;
    }

    /* reset max_notifyid */
    @@ -1602,7 +1609,7 @@ static int rproc_attach(struct rproc *rproc)
    ret = rproc_handle_resources(rproc, rproc_loading_handlers);
    if (ret) {
    dev_err(dev, "Failed to process resources: %d\n", ret);
    - goto disable_iommu;
    + goto unprepare_device;
    }

    /* Allocate carveout resources associated to rproc */
    @@ -1621,6 +1628,9 @@ static int rproc_attach(struct rproc *rproc)

    clean_up_resources:
    rproc_resource_cleanup(rproc);
    +unprepare_device:
    + /* release HW resources if needed */
    + rproc_unprepare_device(rproc);
    disable_iommu:
    rproc_disable_iommu(rproc);
    return ret;
    diff --git a/drivers/remoteproc/stm32_rproc.c b/drivers/remoteproc/stm32_rproc.c
    index f647e565014b..3d45f51de4d0 100644
    --- a/drivers/remoteproc/stm32_rproc.c
    +++ b/drivers/remoteproc/stm32_rproc.c
    @@ -207,16 +207,7 @@ static int stm32_rproc_mbox_idx(struct rproc *rproc, const unsigned char *name)
    return -EINVAL;
    }

    -static int stm32_rproc_elf_load_rsc_table(struct rproc *rproc,
    - const struct firmware *fw)
    -{
    - if (rproc_elf_load_rsc_table(rproc, fw))
    - dev_warn(&rproc->dev, "no resource table found for this firmware\n");
    -
    - return 0;
    -}
    -
    -static int stm32_rproc_parse_memory_regions(struct rproc *rproc)
    +static int stm32_rproc_prepare(struct rproc *rproc)
    {
    struct device *dev = rproc->dev.parent;
    struct device_node *np = dev->of_node;
    @@ -274,12 +265,10 @@ static int stm32_rproc_parse_memory_regions(struct rproc *rproc)

    static int stm32_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw)
    {
    - int ret = stm32_rproc_parse_memory_regions(rproc);
    -
    - if (ret)
    - return ret;
    + if (rproc_elf_load_rsc_table(rproc, fw))
    + dev_warn(&rproc->dev, "no resource table found for this firmware\n");

    - return stm32_rproc_elf_load_rsc_table(rproc, fw);
    + return 0;
    }

    static irqreturn_t stm32_rproc_wdg(int irq, void *data)
    @@ -614,6 +603,7 @@ stm32_rproc_get_loaded_rsc_table(struct rproc *rproc, size_t *table_sz)
    }

    static const struct rproc_ops st_rproc_ops = {
    + .prepare = stm32_rproc_prepare,
    .start = stm32_rproc_start,
    .stop = stm32_rproc_stop,
    .attach = stm32_rproc_attach,
    @@ -796,14 +786,9 @@ static int stm32_rproc_probe(struct platform_device *pdev)
    if (ret)
    goto free_rproc;

    - if (state == M4_STATE_CRUN) {
    + if (state == M4_STATE_CRUN)
    rproc->state = RPROC_DETACHED;

    - ret = stm32_rproc_parse_memory_regions(rproc);
    - if (ret)
    - goto free_resources;
    - }
    -
    rproc->has_iommu = false;
    ddata->workqueue = create_workqueue(dev_name(dev));
    if (!ddata->workqueue) {
    --
    2.25.1
    \
     
     \ /
      Last update: 2021-02-24 01:25    [W:5.569 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site