lkml.org 
[lkml]   [2020]   [Jul]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 07/10] remoteproc: imx_rproc: add i.MX specific parse fw hook
    Date
    The hook is used to parse memory-regions and load resource table
    from the address the remote processor published.

    Signed-off-by: Peng Fan <peng.fan@nxp.com>
    ---
    drivers/remoteproc/imx_rproc.c | 99 +++++++++++++++++++++++++++++++++++++++++-
    1 file changed, 98 insertions(+), 1 deletion(-)

    diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c
    index c23726091228..43000a992455 100644
    --- a/drivers/remoteproc/imx_rproc.c
    +++ b/drivers/remoteproc/imx_rproc.c
    @@ -11,6 +11,7 @@
    #include <linux/mfd/syscon.h>
    #include <linux/module.h>
    #include <linux/of_address.h>
    +#include <linux/of_reserved_mem.h>
    #include <linux/of_device.h>
    #include <linux/platform_device.h>
    #include <linux/regmap.h>
    @@ -89,6 +90,7 @@ struct imx_rproc {
    const struct imx_rproc_dcfg *dcfg;
    struct imx_rproc_mem mem[IMX7D_RPROC_MEM_MAX];
    struct clk *clk;
    + void *rsc_va;
    };

    static const struct imx_rproc_att imx_rproc_att_imx7d[] = {
    @@ -251,6 +253,101 @@ static void *imx_rproc_da_to_va(struct rproc *rproc, u64 da, size_t len)
    return va;
    }

    +static int imx_rproc_mem_alloc(struct rproc *rproc,
    + struct rproc_mem_entry *mem)
    +{
    + struct device *dev = rproc->dev.parent;
    + void *va;
    +
    + dev_dbg(dev, "map memory: %p+%zx\n", &mem->dma, mem->len);
    + va = ioremap_wc(mem->dma, mem->len);
    + if (IS_ERR_OR_NULL(va)) {
    + dev_err(dev, "Unable to map memory region: %p+%zx\n",
    + &mem->dma, mem->len);
    + return -ENOMEM;
    + }
    +
    + /* Update memory entry va */
    + mem->va = va;
    +
    + return 0;
    +}
    +
    +static int imx_rproc_mem_release(struct rproc *rproc,
    + struct rproc_mem_entry *mem)
    +{
    + dev_dbg(rproc->dev.parent, "unmap memory: %pa\n", &mem->dma);
    + iounmap(mem->va);
    +
    + return 0;
    +}
    +
    +static int imx_rproc_parse_memory_regions(struct rproc *rproc)
    +{
    + struct imx_rproc *priv = rproc->priv;
    + struct device_node *np = priv->dev->of_node;
    + struct of_phandle_iterator it;
    + struct rproc_mem_entry *mem;
    + struct reserved_mem *rmem;
    + int index = 0;
    + u32 da;
    +
    + /* Register associated reserved memory regions */
    + of_phandle_iterator_init(&it, np, "memory-region", NULL, 0);
    + while (of_phandle_iterator_next(&it) == 0) {
    + rmem = of_reserved_mem_lookup(it.node);
    + if (!rmem) {
    + dev_err(priv->dev, "unable to acquire memory-region\n");
    + return -EINVAL;
    + }
    +
    + /* No need to translate pa to da, i.MX use same map */
    + da = rmem->base;
    +
    + if (strcmp(it.node->name, "vdev0buffer")) {
    + /* Register memory region */
    + mem = rproc_mem_entry_init(priv->dev, NULL,
    + (dma_addr_t)rmem->base,
    + rmem->size, da,
    + imx_rproc_mem_alloc,
    + imx_rproc_mem_release,
    + it.node->name);
    +
    + if (mem)
    + rproc_coredump_add_segment(rproc, da,
    + rmem->size);
    + } else {
    + /* Register reserved memory for vdev buffer alloc */
    + mem = rproc_of_resm_mem_entry_init(priv->dev, index,
    + rmem->size,
    + rmem->base,
    + it.node->name);
    + }
    +
    + if (!mem)
    + return -ENOMEM;
    +
    + rproc_add_carveout(rproc, mem);
    + index++;
    + }
    +
    + return 0;
    +}
    +
    +static int imx_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw)
    +{
    + int ret = imx_rproc_parse_memory_regions(rproc);
    +
    + if (ret)
    + return ret;
    +
    + ret = rproc_elf_load_rsc_table(rproc, fw);
    + if (ret)
    + dev_info(&rproc->dev, "No resource table in elf\n");
    +
    + return 0;
    +}
    +
    static int imx_rproc_elf_load_segments(struct rproc *rproc, const struct firmware *fw)
    {
    struct device *dev = &rproc->dev;
    @@ -323,7 +420,7 @@ static const struct rproc_ops imx_rproc_ops = {
    .stop = imx_rproc_stop,
    .da_to_va = imx_rproc_da_to_va,
    .load = imx_rproc_elf_load_segments,
    - .parse_fw = rproc_elf_load_rsc_table,
    + .parse_fw = imx_rproc_parse_fw,
    .find_loaded_rsc_table = rproc_elf_find_loaded_rsc_table,
    .sanity_check = rproc_elf_sanity_check,
    .get_boot_addr = rproc_elf_get_boot_addr,
    --
    2.16.4
    \
     
     \ /
      Last update: 2020-07-24 09:45    [W:4.364 / U:0.088 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site