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 |
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 --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,