diff mbox series

[V12,07/10] remoteproc: imx_rproc: add i.MX specific parse fw hook

Message ID 1613611500-12414-8-git-send-email-peng.fan@oss.nxp.com
State Superseded
Headers show
Series remoteproc: imx_rproc: support iMX8MQ/M | expand

Commit Message

Peng Fan (OSS) Feb. 18, 2021, 1:24 a.m. UTC
From: Peng Fan <peng.fan@nxp.com>


The hook is used to parse memory-regions and load resource table
from the address the remote processor published.

Reviewed-by: Richard Zhu <hongxing.zhu@nxp.com>

Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>

Signed-off-by: Peng Fan <peng.fan@nxp.com>

---
 drivers/remoteproc/imx_rproc.c | 93 ++++++++++++++++++++++++++++++++++
 1 file changed, 93 insertions(+)

-- 
2.30.0

Comments

kernel test robot Feb. 18, 2021, 3:07 p.m. UTC | #1
Hi,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on next-20210217]
[cannot apply to robh/for-next linus/master remoteproc/for-next rpmsg/for-next v5.11 v5.11-rc7 v5.11-rc6 v5.11]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/peng-fan-oss-nxp-com/remoteproc-imx_rproc-support-iMX8MQ-M/20210218-094227
base:    cd560d8023bf73c94d755908c8d4a0994dd1ec34
config: arm64-allyesconfig (attached as .config)
compiler: aarch64-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/07b8942623e0ba5438d0574f1a3efa7c7a3d71cf
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review peng-fan-oss-nxp-com/remoteproc-imx_rproc-support-iMX8MQ-M/20210218-094227
        git checkout 07b8942623e0ba5438d0574f1a3efa7c7a3d71cf
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=arm64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

Note: the linux-review/peng-fan-oss-nxp-com/remoteproc-imx_rproc-support-iMX8MQ-M/20210218-094227 HEAD 8634388851272efe3b40cfb88b0743639a3e3256 builds fine.
      It only hurts bisectibility.

All errors (new ones prefixed by >>):

   drivers/remoteproc/imx_rproc.c: In function 'imx_rproc_parse_fw':
>> drivers/remoteproc/imx_rproc.c:325:8: error: implicit declaration of function 'rproc_elf_load_rsc_table' [-Werror=implicit-function-declaration]

     325 |  ret = rproc_elf_load_rsc_table(rproc, fw);
         |        ^~~~~~~~~~~~~~~~~~~~~~~~
   drivers/remoteproc/imx_rproc.c: At top level:
>> drivers/remoteproc/imx_rproc.c:336:11: error: 'rproc_elf_load_segments' undeclared here (not in a function)

     336 |  .load  = rproc_elf_load_segments,
         |           ^~~~~~~~~~~~~~~~~~~~~~~
>> drivers/remoteproc/imx_rproc.c:338:27: error: 'rproc_elf_find_loaded_rsc_table' undeclared here (not in a function)

     338 |  .find_loaded_rsc_table = rproc_elf_find_loaded_rsc_table,
         |                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/remoteproc/imx_rproc.c:339:18: error: 'rproc_elf_sanity_check' undeclared here (not in a function)

     339 |  .sanity_check = rproc_elf_sanity_check,
         |                  ^~~~~~~~~~~~~~~~~~~~~~
>> drivers/remoteproc/imx_rproc.c:340:19: error: 'rproc_elf_get_boot_addr' undeclared here (not in a function)

     340 |  .get_boot_addr = rproc_elf_get_boot_addr,
         |                   ^~~~~~~~~~~~~~~~~~~~~~~
   cc1: some warnings being treated as errors


vim +/rproc_elf_load_rsc_table +325 drivers/remoteproc/imx_rproc.c

   317	
   318	static int imx_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw)
   319	{
   320		int ret = imx_rproc_parse_memory_regions(rproc);
   321	
   322		if (ret)
   323			return ret;
   324	
 > 325		ret = rproc_elf_load_rsc_table(rproc, fw);

   326		if (ret)
   327			dev_info(&rproc->dev, "No resource table in elf\n");
   328	
   329		return 0;
   330	}
   331	
   332	static const struct rproc_ops imx_rproc_ops = {
   333		.start		= imx_rproc_start,
   334		.stop		= imx_rproc_stop,
   335		.da_to_va       = imx_rproc_da_to_va,
 > 336		.load		= rproc_elf_load_segments,

   337		.parse_fw	= imx_rproc_parse_fw,
 > 338		.find_loaded_rsc_table = rproc_elf_find_loaded_rsc_table,

 > 339		.sanity_check	= rproc_elf_sanity_check,

 > 340		.get_boot_addr	= rproc_elf_get_boot_addr,

   341	};
   342	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff mbox series

Patch

diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c
index 47fc1d06be6a..5ae1f5209548 100644
--- a/drivers/remoteproc/imx_rproc.c
+++ b/drivers/remoteproc/imx_rproc.c
@@ -10,6 +10,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>
@@ -241,10 +242,102 @@  static void *imx_rproc_da_to_va(struct rproc *rproc, u64 da, size_t len, bool *i
 	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;
+	u32 da;
+
+	/* Register associated reserved memory regions */
+	of_phandle_iterator_init(&it, np, "memory-region", NULL, 0);
+	while (of_phandle_iterator_next(&it) == 0) {
+		/*
+		 * Ignore the first memory region which will be used vdev buffer.
+		 * No need to do extra handlings, rproc_add_virtio_dev will handle it.
+		 */
+		if (!strcmp(it.node->name, "vdev0buffer"))
+			continue;
+
+		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;
+
+		/* 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
+			return -ENOMEM;
+
+		rproc_add_carveout(rproc, mem);
+	}
+
+	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 const struct rproc_ops imx_rproc_ops = {
 	.start		= imx_rproc_start,
 	.stop		= imx_rproc_stop,
 	.da_to_va       = imx_rproc_da_to_va,
+	.load		= rproc_elf_load_segments,
+	.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,
 };
 
 static int imx_rproc_addr_init(struct imx_rproc *priv,