All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] remoteproc: elf: support platform specific memory hook
@ 2020-07-28  9:31 ` peng.fan
  0 siblings, 0 replies; 12+ messages in thread
From: peng.fan @ 2020-07-28  9:31 UTC (permalink / raw)
  To: ohad, bjorn.andersson, robh+dt, shawnguo, s.hauer, kernel,
	festevam, mathieu.poirier, o.rempel
  Cc: linux-imx, linux-remoteproc, linux-arm-kernel, linux-kernel, Peng Fan

From: Peng Fan <peng.fan@nxp.com>

To arm64, "dc      zva, dst" is used in memset.
Per ARM DDI 0487A.j, chapter C5.3.8 DC ZVA, Data Cache Zero by VA,

"If the memory region being zeroed is any type of Device memory,
this instruction can give an alignment fault which is prioritized
in the same way as other alignment faults that are determined
by the memory type."

On i.MX platforms, when elf is loaded to onchip TCM area, the region
is ioremapped, so "dc zva, dst" will trigger abort. And ioremap_wc()
on i.MX not able to write correct data to TCM area.

So we need to use io helpers, and extend the elf loader to support
platform specific memory functions.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
---
 drivers/remoteproc/remoteproc_elf_loader.c | 20 ++++++++++++++++++--
 include/linux/remoteproc.h                 |  2 ++
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/drivers/remoteproc/remoteproc_elf_loader.c b/drivers/remoteproc/remoteproc_elf_loader.c
index df68d87752e4..f442bac64432 100644
--- a/drivers/remoteproc/remoteproc_elf_loader.c
+++ b/drivers/remoteproc/remoteproc_elf_loader.c
@@ -129,6 +129,22 @@ u64 rproc_elf_get_boot_addr(struct rproc *rproc, const struct firmware *fw)
 }
 EXPORT_SYMBOL(rproc_elf_get_boot_addr);
 
+static void *rproc_elf_memcpy(struct rproc *rproc, void *dest, const void *src, size_t count)
+{
+	if (!rproc->ops->memcpy)
+		return memcpy(dest, src, count);
+
+	return rproc->ops->memcpy(rproc, dest, src, count);
+}
+
+static void *rproc_elf_memset(struct rproc *rproc, void *s, int c, size_t count)
+{
+	if (!rproc->ops->memset)
+		return memset(s, c, count);
+
+	return rproc->ops->memset(rproc, s, c, count);
+}
+
 /**
  * rproc_elf_load_segments() - load firmware segments to memory
  * @rproc: remote processor which will be booted using these fw segments
@@ -214,7 +230,7 @@ int rproc_elf_load_segments(struct rproc *rproc, const struct firmware *fw)
 
 		/* put the segment where the remote processor expects it */
 		if (filesz)
-			memcpy(ptr, elf_data + offset, filesz);
+			rproc_elf_memcpy(rproc, ptr, elf_data + offset, filesz);
 
 		/*
 		 * Zero out remaining memory for this segment.
@@ -224,7 +240,7 @@ int rproc_elf_load_segments(struct rproc *rproc, const struct firmware *fw)
 		 * this.
 		 */
 		if (memsz > filesz)
-			memset(ptr + filesz, 0, memsz - filesz);
+			rproc_elf_memset(rproc, ptr + filesz, 0, memsz - filesz);
 	}
 
 	return ret;
diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h
index 0e8d2ff575b4..88fc9643c1a8 100644
--- a/include/linux/remoteproc.h
+++ b/include/linux/remoteproc.h
@@ -391,6 +391,8 @@ struct rproc_ops {
 	int (*load)(struct rproc *rproc, const struct firmware *fw);
 	int (*sanity_check)(struct rproc *rproc, const struct firmware *fw);
 	u64 (*get_boot_addr)(struct rproc *rproc, const struct firmware *fw);
+	void *(*memcpy)(struct rproc *rproc, void *dest, const void *src, size_t count);
+	void *(*memset)(struct rproc *rproc, void *s, int c, size_t count);
 	unsigned long (*panic)(struct rproc *rproc);
 };
 
-- 
2.16.4


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 1/2] remoteproc: elf: support platform specific memory hook
@ 2020-07-28  9:31 ` peng.fan
  0 siblings, 0 replies; 12+ messages in thread
From: peng.fan @ 2020-07-28  9:31 UTC (permalink / raw)
  To: ohad, bjorn.andersson, robh+dt, shawnguo, s.hauer, kernel,
	festevam, mathieu.poirier, o.rempel
  Cc: Peng Fan, linux-remoteproc, linux-imx, linux-arm-kernel, linux-kernel

From: Peng Fan <peng.fan@nxp.com>

To arm64, "dc      zva, dst" is used in memset.
Per ARM DDI 0487A.j, chapter C5.3.8 DC ZVA, Data Cache Zero by VA,

"If the memory region being zeroed is any type of Device memory,
this instruction can give an alignment fault which is prioritized
in the same way as other alignment faults that are determined
by the memory type."

On i.MX platforms, when elf is loaded to onchip TCM area, the region
is ioremapped, so "dc zva, dst" will trigger abort. And ioremap_wc()
on i.MX not able to write correct data to TCM area.

So we need to use io helpers, and extend the elf loader to support
platform specific memory functions.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
---
 drivers/remoteproc/remoteproc_elf_loader.c | 20 ++++++++++++++++++--
 include/linux/remoteproc.h                 |  2 ++
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/drivers/remoteproc/remoteproc_elf_loader.c b/drivers/remoteproc/remoteproc_elf_loader.c
index df68d87752e4..f442bac64432 100644
--- a/drivers/remoteproc/remoteproc_elf_loader.c
+++ b/drivers/remoteproc/remoteproc_elf_loader.c
@@ -129,6 +129,22 @@ u64 rproc_elf_get_boot_addr(struct rproc *rproc, const struct firmware *fw)
 }
 EXPORT_SYMBOL(rproc_elf_get_boot_addr);
 
+static void *rproc_elf_memcpy(struct rproc *rproc, void *dest, const void *src, size_t count)
+{
+	if (!rproc->ops->memcpy)
+		return memcpy(dest, src, count);
+
+	return rproc->ops->memcpy(rproc, dest, src, count);
+}
+
+static void *rproc_elf_memset(struct rproc *rproc, void *s, int c, size_t count)
+{
+	if (!rproc->ops->memset)
+		return memset(s, c, count);
+
+	return rproc->ops->memset(rproc, s, c, count);
+}
+
 /**
  * rproc_elf_load_segments() - load firmware segments to memory
  * @rproc: remote processor which will be booted using these fw segments
@@ -214,7 +230,7 @@ int rproc_elf_load_segments(struct rproc *rproc, const struct firmware *fw)
 
 		/* put the segment where the remote processor expects it */
 		if (filesz)
-			memcpy(ptr, elf_data + offset, filesz);
+			rproc_elf_memcpy(rproc, ptr, elf_data + offset, filesz);
 
 		/*
 		 * Zero out remaining memory for this segment.
@@ -224,7 +240,7 @@ int rproc_elf_load_segments(struct rproc *rproc, const struct firmware *fw)
 		 * this.
 		 */
 		if (memsz > filesz)
-			memset(ptr + filesz, 0, memsz - filesz);
+			rproc_elf_memset(rproc, ptr + filesz, 0, memsz - filesz);
 	}
 
 	return ret;
diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h
index 0e8d2ff575b4..88fc9643c1a8 100644
--- a/include/linux/remoteproc.h
+++ b/include/linux/remoteproc.h
@@ -391,6 +391,8 @@ struct rproc_ops {
 	int (*load)(struct rproc *rproc, const struct firmware *fw);
 	int (*sanity_check)(struct rproc *rproc, const struct firmware *fw);
 	u64 (*get_boot_addr)(struct rproc *rproc, const struct firmware *fw);
+	void *(*memcpy)(struct rproc *rproc, void *dest, const void *src, size_t count);
+	void *(*memset)(struct rproc *rproc, void *s, int c, size_t count);
 	unsigned long (*panic)(struct rproc *rproc);
 };
 
-- 
2.16.4


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 2/2] remoteproc: imx_rproc: add elf memory hooks
  2020-07-28  9:31 ` peng.fan
@ 2020-07-28  9:31   ` peng.fan
  -1 siblings, 0 replies; 12+ messages in thread
From: peng.fan @ 2020-07-28  9:31 UTC (permalink / raw)
  To: ohad, bjorn.andersson, robh+dt, shawnguo, s.hauer, kernel,
	festevam, mathieu.poirier, o.rempel
  Cc: linux-imx, linux-remoteproc, linux-arm-kernel, linux-kernel, Peng Fan

From: Peng Fan <peng.fan@nxp.com>

Please not apply 2/2 for now, this 2/2 has not gone through
test on all i.MX8 platforms.

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

diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c
index 8957ed271d20..8ad860c65256 100644
--- a/drivers/remoteproc/imx_rproc.c
+++ b/drivers/remoteproc/imx_rproc.c
@@ -6,6 +6,7 @@
 #include <linux/clk.h>
 #include <linux/err.h>
 #include <linux/interrupt.h>
+#include <linux/io.h>
 #include <linux/kernel.h>
 #include <linux/mfd/syscon.h>
 #include <linux/module.h>
@@ -241,10 +242,22 @@ static void *imx_rproc_da_to_va(struct rproc *rproc, u64 da, size_t len)
 	return va;
 }
 
+static void *imx_rproc_memcpy(struct rproc *rproc, void *dest, const void *src, size_t count)
+{
+       memcpy_toio((void * __iomem)dest, src, count);
+}
+
+static void *imx_rproc_memset(struct rproc *rproc, void *s, int c, size_t count)
+{
+	memset_io((void * __iomem)s, c, count);
+}
+
 static const struct rproc_ops imx_rproc_ops = {
 	.start		= imx_rproc_start,
 	.stop		= imx_rproc_stop,
 	.da_to_va       = imx_rproc_da_to_va,
+	.memset		= imx_rproc_memset,
+	.memcpy		= imx_rproc_memcpy,
 };
 
 static int imx_rproc_addr_init(struct imx_rproc *priv,
-- 
2.16.4


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 2/2] remoteproc: imx_rproc: add elf memory hooks
@ 2020-07-28  9:31   ` peng.fan
  0 siblings, 0 replies; 12+ messages in thread
From: peng.fan @ 2020-07-28  9:31 UTC (permalink / raw)
  To: ohad, bjorn.andersson, robh+dt, shawnguo, s.hauer, kernel,
	festevam, mathieu.poirier, o.rempel
  Cc: Peng Fan, linux-remoteproc, linux-imx, linux-arm-kernel, linux-kernel

From: Peng Fan <peng.fan@nxp.com>

Please not apply 2/2 for now, this 2/2 has not gone through
test on all i.MX8 platforms.

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

diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c
index 8957ed271d20..8ad860c65256 100644
--- a/drivers/remoteproc/imx_rproc.c
+++ b/drivers/remoteproc/imx_rproc.c
@@ -6,6 +6,7 @@
 #include <linux/clk.h>
 #include <linux/err.h>
 #include <linux/interrupt.h>
+#include <linux/io.h>
 #include <linux/kernel.h>
 #include <linux/mfd/syscon.h>
 #include <linux/module.h>
@@ -241,10 +242,22 @@ static void *imx_rproc_da_to_va(struct rproc *rproc, u64 da, size_t len)
 	return va;
 }
 
+static void *imx_rproc_memcpy(struct rproc *rproc, void *dest, const void *src, size_t count)
+{
+       memcpy_toio((void * __iomem)dest, src, count);
+}
+
+static void *imx_rproc_memset(struct rproc *rproc, void *s, int c, size_t count)
+{
+	memset_io((void * __iomem)s, c, count);
+}
+
 static const struct rproc_ops imx_rproc_ops = {
 	.start		= imx_rproc_start,
 	.stop		= imx_rproc_stop,
 	.da_to_va       = imx_rproc_da_to_va,
+	.memset		= imx_rproc_memset,
+	.memcpy		= imx_rproc_memcpy,
 };
 
 static int imx_rproc_addr_init(struct imx_rproc *priv,
-- 
2.16.4


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH 1/2] remoteproc: elf: support platform specific memory hook
  2020-07-28  9:31 ` peng.fan
  (?)
  (?)
@ 2020-07-28 16:51 ` kernel test robot
  -1 siblings, 0 replies; 12+ messages in thread
From: kernel test robot @ 2020-07-28 16:51 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 8441 bytes --]

Hi,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on soc/for-next]
[also build test ERROR on linus/master v5.8-rc7 next-20200728]
[cannot apply to xlnx/master]
[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-nxp-com/remoteproc-elf-support-platform-specific-memory-hook/20200728-173920
base:   https://git.kernel.org/pub/scm/linux/kernel/git/soc/soc.git for-next
config: i386-randconfig-s001-20200728 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-14) 9.3.0
reproduce:
        # apt-get install sparse
        # sparse version: v0.6.2-94-geb6779f6-dirty
        # save the attached .config to linux build tree
        make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=i386 

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

All errors (new ones prefixed by >>):

   drivers/remoteproc/remoteproc_elf_loader.c: In function 'rproc_elf_memcpy':
>> drivers/remoteproc/remoteproc_elf_loader.c:137:51: error: macro "memcpy" passed 4 arguments, but takes just 3
     137 |  return rproc->ops->memcpy(rproc, dest, src, count);
         |                                                   ^
   In file included from arch/x86/include/asm/string.h:3,
                    from include/linux/string.h:20,
                    from arch/x86/include/asm/page_32.h:35,
                    from arch/x86/include/asm/page.h:14,
                    from arch/x86/include/asm/thread_info.h:12,
                    from include/linux/thread_info.h:38,
                    from arch/x86/include/asm/preempt.h:7,
                    from include/linux/preempt.h:78,
                    from include/linux/spinlock.h:51,
                    from include/linux/seqlock.h:36,
                    from include/linux/time.h:6,
                    from include/linux/stat.h:19,
                    from include/linux/module.h:13,
                    from drivers/remoteproc/remoteproc_elf_loader.c:20:
   arch/x86/include/asm/string_32.h:182: note: macro "memcpy" defined here
     182 | #define memcpy(t, f, n) __builtin_memcpy(t, f, n)
         | 
   drivers/remoteproc/remoteproc_elf_loader.c: In function 'rproc_elf_memset':
>> drivers/remoteproc/remoteproc_elf_loader.c:145:46: error: macro "memset" passed 4 arguments, but takes just 3
     145 |  return rproc->ops->memset(rproc, s, c, count);
         |                                              ^
   In file included from arch/x86/include/asm/string.h:3,
                    from include/linux/string.h:20,
                    from arch/x86/include/asm/page_32.h:35,
                    from arch/x86/include/asm/page.h:14,
                    from arch/x86/include/asm/thread_info.h:12,
                    from include/linux/thread_info.h:38,
                    from arch/x86/include/asm/preempt.h:7,
                    from include/linux/preempt.h:78,
                    from include/linux/spinlock.h:51,
                    from include/linux/seqlock.h:36,
                    from include/linux/time.h:6,
                    from include/linux/stat.h:19,
                    from include/linux/module.h:13,
                    from drivers/remoteproc/remoteproc_elf_loader.c:20:
   arch/x86/include/asm/string_32.h:228: note: macro "memset" defined here
     228 | #define memset(s, c, count) __builtin_memset(s, c, count)
         | 

sparse warnings: (new ones prefixed by >>)

>> drivers/remoteproc/remoteproc_elf_loader.c:137:28: sparse: sparse: macro "memcpy" passed 4 arguments, but takes just 3
>> drivers/remoteproc/remoteproc_elf_loader.c:145:28: sparse: sparse: macro "memset" passed 4 arguments, but takes just 3

vim +/memcpy +137 drivers/remoteproc/remoteproc_elf_loader.c

    19	
  > 20	#include <linux/module.h>
    21	#include <linux/firmware.h>
    22	#include <linux/remoteproc.h>
    23	#include <linux/elf.h>
    24	
    25	#include "remoteproc_internal.h"
    26	#include "remoteproc_elf_helpers.h"
    27	
    28	/**
    29	 * rproc_elf_sanity_check() - Sanity Check for ELF32/ELF64 firmware image
    30	 * @rproc: the remote processor handle
    31	 * @fw: the ELF firmware image
    32	 *
    33	 * Make sure this fw image is sane (ie a correct ELF32/ELF64 file).
    34	 */
    35	int rproc_elf_sanity_check(struct rproc *rproc, const struct firmware *fw)
    36	{
    37		const char *name = rproc->firmware;
    38		struct device *dev = &rproc->dev;
    39		/*
    40		 * Elf files are beginning with the same structure. Thus, to simplify
    41		 * header parsing, we can use the elf32_hdr one for both elf64 and
    42		 * elf32.
    43		 */
    44		struct elf32_hdr *ehdr;
    45		u32 elf_shdr_get_size;
    46		u64 phoff, shoff;
    47		char class;
    48		u16 phnum;
    49	
    50		if (!fw) {
    51			dev_err(dev, "failed to load %s\n", name);
    52			return -EINVAL;
    53		}
    54	
    55		if (fw->size < sizeof(struct elf32_hdr)) {
    56			dev_err(dev, "Image is too small\n");
    57			return -EINVAL;
    58		}
    59	
    60		ehdr = (struct elf32_hdr *)fw->data;
    61	
    62		if (memcmp(ehdr->e_ident, ELFMAG, SELFMAG)) {
    63			dev_err(dev, "Image is corrupted (bad magic)\n");
    64			return -EINVAL;
    65		}
    66	
    67		class = ehdr->e_ident[EI_CLASS];
    68		if (class != ELFCLASS32 && class != ELFCLASS64) {
    69			dev_err(dev, "Unsupported class: %d\n", class);
    70			return -EINVAL;
    71		}
    72	
    73		if (class == ELFCLASS64 && fw->size < sizeof(struct elf64_hdr)) {
    74			dev_err(dev, "elf64 header is too small\n");
    75			return -EINVAL;
    76		}
    77	
    78		/* We assume the firmware has the same endianness as the host */
    79	# ifdef __LITTLE_ENDIAN
    80		if (ehdr->e_ident[EI_DATA] != ELFDATA2LSB) {
    81	# else /* BIG ENDIAN */
    82		if (ehdr->e_ident[EI_DATA] != ELFDATA2MSB) {
    83	# endif
    84			dev_err(dev, "Unsupported firmware endianness\n");
    85			return -EINVAL;
    86		}
    87	
    88		phoff = elf_hdr_get_e_phoff(class, fw->data);
    89		shoff = elf_hdr_get_e_shoff(class, fw->data);
    90		phnum =  elf_hdr_get_e_phnum(class, fw->data);
    91		elf_shdr_get_size = elf_size_of_shdr(class);
    92	
    93		if (fw->size < shoff + elf_shdr_get_size) {
    94			dev_err(dev, "Image is too small\n");
    95			return -EINVAL;
    96		}
    97	
    98		if (phnum == 0) {
    99			dev_err(dev, "No loadable segments\n");
   100			return -EINVAL;
   101		}
   102	
   103		if (phoff > fw->size) {
   104			dev_err(dev, "Firmware size is too small\n");
   105			return -EINVAL;
   106		}
   107	
   108		dev_dbg(dev, "Firmware is an elf%d file\n",
   109			class == ELFCLASS32 ? 32 : 64);
   110	
   111		return 0;
   112	}
   113	EXPORT_SYMBOL(rproc_elf_sanity_check);
   114	
   115	/**
   116	 * rproc_elf_get_boot_addr() - Get rproc's boot address.
   117	 * @rproc: the remote processor handle
   118	 * @fw: the ELF firmware image
   119	 *
   120	 * This function returns the entry point address of the ELF
   121	 * image.
   122	 *
   123	 * Note that the boot address is not a configurable property of all remote
   124	 * processors. Some will always boot at a specific hard-coded address.
   125	 */
   126	u64 rproc_elf_get_boot_addr(struct rproc *rproc, const struct firmware *fw)
   127	{
   128		return elf_hdr_get_e_entry(fw_elf_get_class(fw), fw->data);
   129	}
   130	EXPORT_SYMBOL(rproc_elf_get_boot_addr);
   131	
   132	static void *rproc_elf_memcpy(struct rproc *rproc, void *dest, const void *src, size_t count)
   133	{
   134		if (!rproc->ops->memcpy)
   135			return memcpy(dest, src, count);
   136	
 > 137		return rproc->ops->memcpy(rproc, dest, src, count);
   138	}
   139	
   140	static void *rproc_elf_memset(struct rproc *rproc, void *s, int c, size_t count)
   141	{
   142		if (!rproc->ops->memset)
   143			return memset(s, c, count);
   144	
 > 145		return rproc->ops->memset(rproc, s, c, count);
   146	}
   147	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 33288 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/2] remoteproc: imx_rproc: add elf memory hooks
  2020-07-28  9:31   ` peng.fan
  (?)
@ 2020-07-28 20:25   ` kernel test robot
  -1 siblings, 0 replies; 12+ messages in thread
From: kernel test robot @ 2020-07-28 20:25 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 2006 bytes --]

Hi,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on soc/for-next]
[also build test WARNING on linus/master v5.8-rc7 next-20200728]
[cannot apply to xlnx/master remoteproc/for-next rpmsg/for-next]
[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-nxp-com/remoteproc-elf-support-platform-specific-memory-hook/20200728-173920
base:   https://git.kernel.org/pub/scm/linux/kernel/git/soc/soc.git for-next
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
        # 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>

All warnings (new ones prefixed by >>):

   drivers/remoteproc/imx_rproc.c: In function 'imx_rproc_memcpy':
>> drivers/remoteproc/imx_rproc.c:248:1: warning: no return statement in function returning non-void [-Wreturn-type]
     248 | }
         | ^
   drivers/remoteproc/imx_rproc.c: In function 'imx_rproc_memset':
   drivers/remoteproc/imx_rproc.c:253:1: warning: no return statement in function returning non-void [-Wreturn-type]
     253 | }
         | ^

vim +248 drivers/remoteproc/imx_rproc.c

   244	
   245	static void *imx_rproc_memcpy(struct rproc *rproc, void *dest, const void *src, size_t count)
   246	{
   247	       memcpy_toio((void * __iomem)dest, src, count);
 > 248	}
   249	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 73601 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/2] remoteproc: imx_rproc: add elf memory hooks
  2020-07-28  9:31   ` peng.fan
@ 2020-08-01  4:37     ` Oleksij Rempel
  -1 siblings, 0 replies; 12+ messages in thread
From: Oleksij Rempel @ 2020-08-01  4:37 UTC (permalink / raw)
  To: peng.fan
  Cc: ohad, bjorn.andersson, robh+dt, shawnguo, s.hauer, kernel,
	festevam, mathieu.poirier, linux-imx, linux-remoteproc,
	linux-arm-kernel, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 1913 bytes --]

Hi,

please fix errors reported by test robot.

On Tue, Jul 28, 2020 at 05:31:13PM +0800, peng.fan@nxp.com wrote:
> From: Peng Fan <peng.fan@nxp.com>
> 
> Please not apply 2/2 for now, this 2/2 has not gone through
> test on all i.MX8 platforms.
> 
> Signed-off-by: Peng Fan <peng.fan@nxp.com>
> ---
>  drivers/remoteproc/imx_rproc.c | 13 +++++++++++++
>  1 file changed, 13 insertions(+)
> 
> diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c
> index 8957ed271d20..8ad860c65256 100644
> --- a/drivers/remoteproc/imx_rproc.c
> +++ b/drivers/remoteproc/imx_rproc.c
> @@ -6,6 +6,7 @@
>  #include <linux/clk.h>
>  #include <linux/err.h>
>  #include <linux/interrupt.h>
> +#include <linux/io.h>
>  #include <linux/kernel.h>
>  #include <linux/mfd/syscon.h>
>  #include <linux/module.h>
> @@ -241,10 +242,22 @@ static void *imx_rproc_da_to_va(struct rproc *rproc, u64 da, size_t len)
>  	return va;
>  }
>  
> +static void *imx_rproc_memcpy(struct rproc *rproc, void *dest, const void *src, size_t count)
> +{
> +       memcpy_toio((void * __iomem)dest, src, count);
> +}
> +
> +static void *imx_rproc_memset(struct rproc *rproc, void *s, int c, size_t count)
> +{
> +	memset_io((void * __iomem)s, c, count);
> +}
> +
>  static const struct rproc_ops imx_rproc_ops = {
>  	.start		= imx_rproc_start,
>  	.stop		= imx_rproc_stop,
>  	.da_to_va       = imx_rproc_da_to_va,
> +	.memset		= imx_rproc_memset,
> +	.memcpy		= imx_rproc_memcpy,
>  };
>  
>  static int imx_rproc_addr_init(struct imx_rproc *priv,
> -- 
> 2.16.4
> 
> 

-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/2] remoteproc: imx_rproc: add elf memory hooks
@ 2020-08-01  4:37     ` Oleksij Rempel
  0 siblings, 0 replies; 12+ messages in thread
From: Oleksij Rempel @ 2020-08-01  4:37 UTC (permalink / raw)
  To: peng.fan
  Cc: ohad, mathieu.poirier, festevam, s.hauer, linux-remoteproc,
	linux-kernel, bjorn.andersson, robh+dt, linux-imx, kernel,
	shawnguo, linux-arm-kernel


[-- Attachment #1.1: Type: text/plain, Size: 1913 bytes --]

Hi,

please fix errors reported by test robot.

On Tue, Jul 28, 2020 at 05:31:13PM +0800, peng.fan@nxp.com wrote:
> From: Peng Fan <peng.fan@nxp.com>
> 
> Please not apply 2/2 for now, this 2/2 has not gone through
> test on all i.MX8 platforms.
> 
> Signed-off-by: Peng Fan <peng.fan@nxp.com>
> ---
>  drivers/remoteproc/imx_rproc.c | 13 +++++++++++++
>  1 file changed, 13 insertions(+)
> 
> diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c
> index 8957ed271d20..8ad860c65256 100644
> --- a/drivers/remoteproc/imx_rproc.c
> +++ b/drivers/remoteproc/imx_rproc.c
> @@ -6,6 +6,7 @@
>  #include <linux/clk.h>
>  #include <linux/err.h>
>  #include <linux/interrupt.h>
> +#include <linux/io.h>
>  #include <linux/kernel.h>
>  #include <linux/mfd/syscon.h>
>  #include <linux/module.h>
> @@ -241,10 +242,22 @@ static void *imx_rproc_da_to_va(struct rproc *rproc, u64 da, size_t len)
>  	return va;
>  }
>  
> +static void *imx_rproc_memcpy(struct rproc *rproc, void *dest, const void *src, size_t count)
> +{
> +       memcpy_toio((void * __iomem)dest, src, count);
> +}
> +
> +static void *imx_rproc_memset(struct rproc *rproc, void *s, int c, size_t count)
> +{
> +	memset_io((void * __iomem)s, c, count);
> +}
> +
>  static const struct rproc_ops imx_rproc_ops = {
>  	.start		= imx_rproc_start,
>  	.stop		= imx_rproc_stop,
>  	.da_to_va       = imx_rproc_da_to_va,
> +	.memset		= imx_rproc_memset,
> +	.memcpy		= imx_rproc_memcpy,
>  };
>  
>  static int imx_rproc_addr_init(struct imx_rproc *priv,
> -- 
> 2.16.4
> 
> 

-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 176 bytes --]

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/2] remoteproc: imx_rproc: add elf memory hooks
  2020-07-28  9:31   ` peng.fan
@ 2020-08-11 22:46     ` Mathieu Poirier
  -1 siblings, 0 replies; 12+ messages in thread
From: Mathieu Poirier @ 2020-08-11 22:46 UTC (permalink / raw)
  To: peng.fan
  Cc: ohad, bjorn.andersson, robh+dt, shawnguo, s.hauer, kernel,
	festevam, o.rempel, linux-imx, linux-remoteproc,
	linux-arm-kernel, linux-kernel

On Tue, Jul 28, 2020 at 05:31:13PM +0800, peng.fan@nxp.com wrote:
> From: Peng Fan <peng.fan@nxp.com>
> 
> Please not apply 2/2 for now, this 2/2 has not gone through
> test on all i.MX8 platforms.

Why sending patches to the mailing list if they are not ready to be applied?

> 
> Signed-off-by: Peng Fan <peng.fan@nxp.com>
> ---
>  drivers/remoteproc/imx_rproc.c | 13 +++++++++++++
>  1 file changed, 13 insertions(+)
> 
> diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c
> index 8957ed271d20..8ad860c65256 100644
> --- a/drivers/remoteproc/imx_rproc.c
> +++ b/drivers/remoteproc/imx_rproc.c
> @@ -6,6 +6,7 @@
>  #include <linux/clk.h>
>  #include <linux/err.h>
>  #include <linux/interrupt.h>
> +#include <linux/io.h>
>  #include <linux/kernel.h>
>  #include <linux/mfd/syscon.h>
>  #include <linux/module.h>
> @@ -241,10 +242,22 @@ static void *imx_rproc_da_to_va(struct rproc *rproc, u64 da, size_t len)
>  	return va;
>  }
>  
> +static void *imx_rproc_memcpy(struct rproc *rproc, void *dest, const void *src, size_t count)
> +{
> +       memcpy_toio((void * __iomem)dest, src, count);
> +}
> +
> +static void *imx_rproc_memset(struct rproc *rproc, void *s, int c, size_t count)
> +{
> +	memset_io((void * __iomem)s, c, count);
> +}
> +
>  static const struct rproc_ops imx_rproc_ops = {
>  	.start		= imx_rproc_start,
>  	.stop		= imx_rproc_stop,
>  	.da_to_va       = imx_rproc_da_to_va,
> +	.memset		= imx_rproc_memset,
> +	.memcpy		= imx_rproc_memcpy,

That won't work - you are modifying how _all_ the platforms out there are
working.  As I indicated on the series on iMX8M, add a field to imx_rproc_dcfg
and apply the correct memory accessor based on that.  

It might also suggest that it is time to split the iMX platform drivers, i.e
older MCU and iMX8M.

>  };
>  
>  static int imx_rproc_addr_init(struct imx_rproc *priv,
> -- 
> 2.16.4
> 

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/2] remoteproc: imx_rproc: add elf memory hooks
@ 2020-08-11 22:46     ` Mathieu Poirier
  0 siblings, 0 replies; 12+ messages in thread
From: Mathieu Poirier @ 2020-08-11 22:46 UTC (permalink / raw)
  To: peng.fan
  Cc: ohad, festevam, s.hauer, linux-remoteproc, linux-kernel,
	bjorn.andersson, o.rempel, robh+dt, linux-imx, kernel, shawnguo,
	linux-arm-kernel

On Tue, Jul 28, 2020 at 05:31:13PM +0800, peng.fan@nxp.com wrote:
> From: Peng Fan <peng.fan@nxp.com>
> 
> Please not apply 2/2 for now, this 2/2 has not gone through
> test on all i.MX8 platforms.

Why sending patches to the mailing list if they are not ready to be applied?

> 
> Signed-off-by: Peng Fan <peng.fan@nxp.com>
> ---
>  drivers/remoteproc/imx_rproc.c | 13 +++++++++++++
>  1 file changed, 13 insertions(+)
> 
> diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c
> index 8957ed271d20..8ad860c65256 100644
> --- a/drivers/remoteproc/imx_rproc.c
> +++ b/drivers/remoteproc/imx_rproc.c
> @@ -6,6 +6,7 @@
>  #include <linux/clk.h>
>  #include <linux/err.h>
>  #include <linux/interrupt.h>
> +#include <linux/io.h>
>  #include <linux/kernel.h>
>  #include <linux/mfd/syscon.h>
>  #include <linux/module.h>
> @@ -241,10 +242,22 @@ static void *imx_rproc_da_to_va(struct rproc *rproc, u64 da, size_t len)
>  	return va;
>  }
>  
> +static void *imx_rproc_memcpy(struct rproc *rproc, void *dest, const void *src, size_t count)
> +{
> +       memcpy_toio((void * __iomem)dest, src, count);
> +}
> +
> +static void *imx_rproc_memset(struct rproc *rproc, void *s, int c, size_t count)
> +{
> +	memset_io((void * __iomem)s, c, count);
> +}
> +
>  static const struct rproc_ops imx_rproc_ops = {
>  	.start		= imx_rproc_start,
>  	.stop		= imx_rproc_stop,
>  	.da_to_va       = imx_rproc_da_to_va,
> +	.memset		= imx_rproc_memset,
> +	.memcpy		= imx_rproc_memcpy,

That won't work - you are modifying how _all_ the platforms out there are
working.  As I indicated on the series on iMX8M, add a field to imx_rproc_dcfg
and apply the correct memory accessor based on that.  

It might also suggest that it is time to split the iMX platform drivers, i.e
older MCU and iMX8M.

>  };
>  
>  static int imx_rproc_addr_init(struct imx_rproc *priv,
> -- 
> 2.16.4
> 

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 1/2] remoteproc: elf: support platform specific memory hook
@ 2020-07-28  9:29 ` peng.fan
  0 siblings, 0 replies; 12+ messages in thread
From: peng.fan @ 2020-07-28  9:29 UTC (permalink / raw)
  To: ohad, bjorn.andersson, robh+dt, shawnguo, s.hauer, kernel, festevam
  Cc: linux-imx, linux-remoteproc, linux-arm-kernel, linux-kernel, Peng Fan

From: Peng Fan <peng.fan@nxp.com>

To arm64, "dc      zva, dst" is used in memset.
Per ARM DDI 0487A.j, chapter C5.3.8 DC ZVA, Data Cache Zero by VA,

"If the memory region being zeroed is any type of Device memory,
this instruction can give an alignment fault which is prioritized
in the same way as other alignment faults that are determined
by the memory type."

On i.MX platforms, when elf is loaded to onchip TCM area, the region
is ioremapped, so "dc zva, dst" will trigger abort. And ioremap_wc()
on i.MX not able to write correct data to TCM area.

So we need to use io helpers, and extend the elf loader to support
platform specific memory functions.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
---
 drivers/remoteproc/remoteproc_elf_loader.c | 20 ++++++++++++++++++--
 include/linux/remoteproc.h                 |  2 ++
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/drivers/remoteproc/remoteproc_elf_loader.c b/drivers/remoteproc/remoteproc_elf_loader.c
index df68d87752e4..f442bac64432 100644
--- a/drivers/remoteproc/remoteproc_elf_loader.c
+++ b/drivers/remoteproc/remoteproc_elf_loader.c
@@ -129,6 +129,22 @@ u64 rproc_elf_get_boot_addr(struct rproc *rproc, const struct firmware *fw)
 }
 EXPORT_SYMBOL(rproc_elf_get_boot_addr);
 
+static void *rproc_elf_memcpy(struct rproc *rproc, void *dest, const void *src, size_t count)
+{
+	if (!rproc->ops->memcpy)
+		return memcpy(dest, src, count);
+
+	return rproc->ops->memcpy(rproc, dest, src, count);
+}
+
+static void *rproc_elf_memset(struct rproc *rproc, void *s, int c, size_t count)
+{
+	if (!rproc->ops->memset)
+		return memset(s, c, count);
+
+	return rproc->ops->memset(rproc, s, c, count);
+}
+
 /**
  * rproc_elf_load_segments() - load firmware segments to memory
  * @rproc: remote processor which will be booted using these fw segments
@@ -214,7 +230,7 @@ int rproc_elf_load_segments(struct rproc *rproc, const struct firmware *fw)
 
 		/* put the segment where the remote processor expects it */
 		if (filesz)
-			memcpy(ptr, elf_data + offset, filesz);
+			rproc_elf_memcpy(rproc, ptr, elf_data + offset, filesz);
 
 		/*
 		 * Zero out remaining memory for this segment.
@@ -224,7 +240,7 @@ int rproc_elf_load_segments(struct rproc *rproc, const struct firmware *fw)
 		 * this.
 		 */
 		if (memsz > filesz)
-			memset(ptr + filesz, 0, memsz - filesz);
+			rproc_elf_memset(rproc, ptr + filesz, 0, memsz - filesz);
 	}
 
 	return ret;
diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h
index 0e8d2ff575b4..88fc9643c1a8 100644
--- a/include/linux/remoteproc.h
+++ b/include/linux/remoteproc.h
@@ -391,6 +391,8 @@ struct rproc_ops {
 	int (*load)(struct rproc *rproc, const struct firmware *fw);
 	int (*sanity_check)(struct rproc *rproc, const struct firmware *fw);
 	u64 (*get_boot_addr)(struct rproc *rproc, const struct firmware *fw);
+	void *(*memcpy)(struct rproc *rproc, void *dest, const void *src, size_t count);
+	void *(*memset)(struct rproc *rproc, void *s, int c, size_t count);
 	unsigned long (*panic)(struct rproc *rproc);
 };
 
-- 
2.16.4


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 1/2] remoteproc: elf: support platform specific memory hook
@ 2020-07-28  9:29 ` peng.fan
  0 siblings, 0 replies; 12+ messages in thread
From: peng.fan @ 2020-07-28  9:29 UTC (permalink / raw)
  To: ohad, bjorn.andersson, robh+dt, shawnguo, s.hauer, kernel, festevam
  Cc: Peng Fan, linux-remoteproc, linux-imx, linux-arm-kernel, linux-kernel

From: Peng Fan <peng.fan@nxp.com>

To arm64, "dc      zva, dst" is used in memset.
Per ARM DDI 0487A.j, chapter C5.3.8 DC ZVA, Data Cache Zero by VA,

"If the memory region being zeroed is any type of Device memory,
this instruction can give an alignment fault which is prioritized
in the same way as other alignment faults that are determined
by the memory type."

On i.MX platforms, when elf is loaded to onchip TCM area, the region
is ioremapped, so "dc zva, dst" will trigger abort. And ioremap_wc()
on i.MX not able to write correct data to TCM area.

So we need to use io helpers, and extend the elf loader to support
platform specific memory functions.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
---
 drivers/remoteproc/remoteproc_elf_loader.c | 20 ++++++++++++++++++--
 include/linux/remoteproc.h                 |  2 ++
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/drivers/remoteproc/remoteproc_elf_loader.c b/drivers/remoteproc/remoteproc_elf_loader.c
index df68d87752e4..f442bac64432 100644
--- a/drivers/remoteproc/remoteproc_elf_loader.c
+++ b/drivers/remoteproc/remoteproc_elf_loader.c
@@ -129,6 +129,22 @@ u64 rproc_elf_get_boot_addr(struct rproc *rproc, const struct firmware *fw)
 }
 EXPORT_SYMBOL(rproc_elf_get_boot_addr);
 
+static void *rproc_elf_memcpy(struct rproc *rproc, void *dest, const void *src, size_t count)
+{
+	if (!rproc->ops->memcpy)
+		return memcpy(dest, src, count);
+
+	return rproc->ops->memcpy(rproc, dest, src, count);
+}
+
+static void *rproc_elf_memset(struct rproc *rproc, void *s, int c, size_t count)
+{
+	if (!rproc->ops->memset)
+		return memset(s, c, count);
+
+	return rproc->ops->memset(rproc, s, c, count);
+}
+
 /**
  * rproc_elf_load_segments() - load firmware segments to memory
  * @rproc: remote processor which will be booted using these fw segments
@@ -214,7 +230,7 @@ int rproc_elf_load_segments(struct rproc *rproc, const struct firmware *fw)
 
 		/* put the segment where the remote processor expects it */
 		if (filesz)
-			memcpy(ptr, elf_data + offset, filesz);
+			rproc_elf_memcpy(rproc, ptr, elf_data + offset, filesz);
 
 		/*
 		 * Zero out remaining memory for this segment.
@@ -224,7 +240,7 @@ int rproc_elf_load_segments(struct rproc *rproc, const struct firmware *fw)
 		 * this.
 		 */
 		if (memsz > filesz)
-			memset(ptr + filesz, 0, memsz - filesz);
+			rproc_elf_memset(rproc, ptr + filesz, 0, memsz - filesz);
 	}
 
 	return ret;
diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h
index 0e8d2ff575b4..88fc9643c1a8 100644
--- a/include/linux/remoteproc.h
+++ b/include/linux/remoteproc.h
@@ -391,6 +391,8 @@ struct rproc_ops {
 	int (*load)(struct rproc *rproc, const struct firmware *fw);
 	int (*sanity_check)(struct rproc *rproc, const struct firmware *fw);
 	u64 (*get_boot_addr)(struct rproc *rproc, const struct firmware *fw);
+	void *(*memcpy)(struct rproc *rproc, void *dest, const void *src, size_t count);
+	void *(*memset)(struct rproc *rproc, void *s, int c, size_t count);
 	unsigned long (*panic)(struct rproc *rproc);
 };
 
-- 
2.16.4


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2020-08-11 22:47 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-28  9:31 [PATCH 1/2] remoteproc: elf: support platform specific memory hook peng.fan
2020-07-28  9:31 ` peng.fan
2020-07-28  9:31 ` [PATCH 2/2] remoteproc: imx_rproc: add elf memory hooks peng.fan
2020-07-28  9:31   ` peng.fan
2020-07-28 20:25   ` kernel test robot
2020-08-01  4:37   ` Oleksij Rempel
2020-08-01  4:37     ` Oleksij Rempel
2020-08-11 22:46   ` Mathieu Poirier
2020-08-11 22:46     ` Mathieu Poirier
2020-07-28 16:51 ` [PATCH 1/2] remoteproc: elf: support platform specific memory hook kernel test robot
  -- strict thread matches above, loose matches on Subject: below --
2020-07-28  9:29 peng.fan
2020-07-28  9:29 ` peng.fan

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.