diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c index fa08cbcfcbf7..bfdc707dd9c3 100644 --- a/drivers/remoteproc/remoteproc_core.c +++ b/drivers/remoteproc/remoteproc_core.c @@ -71,6 +71,23 @@ static const char *rproc_crash_to_string(enum rproc_crash_type type) return "unknown"; } +/* + * rproc_memcpy() - memcpy verison for remoteproc usage + * @flags: + * - 0 means to DA + * - 1 means from DA + * + */ +void *rproc_memcpy(struct rproc *rproc, void *dest, + const void *src, size_t count, int flags) +{ + if (rproc->ops->memcpy) + return rproc->ops->memcpy(rproc, dest, src, count, flags); + + return memcpy(dest, src, count); +} +EXPORT_SYMBOL(rproc_memcpy); + /* * This is the IOMMU fault handler we register with the IOMMU API * (when relevant; not all remote processors access memory through @@ -1642,7 +1659,8 @@ static void rproc_coredump(struct rproc *rproc) &segment->da, segment->size); memset(data + offset, 0xff, segment->size); } else { - memcpy(data + offset, ptr, segment->size); + rproc_memcpy(rproc, data + offset, ptr, + segment->size, 1); } } diff --git a/drivers/remoteproc/remoteproc_elf_loader.c b/drivers/remoteproc/remoteproc_elf_loader.c index dcf1c821bdfd..92741a5488d7 100644 --- a/drivers/remoteproc/remoteproc_elf_loader.c +++ b/drivers/remoteproc/remoteproc_elf_loader.c @@ -183,7 +183,8 @@ int rproc_elf_load_segments(struct rproc *rproc, const struct firmware *fw) /* put the segment where the remote processor expects it */ if (phdr->p_filesz) - memcpy(ptr, elf_data + phdr->p_offset, filesz); + rproc_memcpy(rproc, ptr, elf_data + phdr->p_offset, + filesz, 0); } diff --git a/drivers/remoteproc/remoteproc_internal.h b/drivers/remoteproc/remoteproc_internal.h index 493ef9262411..3dbe41ab73d8 100644 --- a/drivers/remoteproc/remoteproc_internal.h +++ b/drivers/remoteproc/remoteproc_internal.h @@ -50,6 +50,8 @@ void rproc_exit_sysfs(void); void rproc_free_vring(struct rproc_vring *rvring); int rproc_alloc_vring(struct rproc_vdev *rvdev, int i); +void *rproc_memcpy(struct rproc *rproc, void *dest, const void *src, + size_t count, int); void *rproc_da_to_va(struct rproc *rproc, u64 da, int len); phys_addr_t rproc_va_to_pa(void *cpu_addr); int rproc_trigger_recovery(struct rproc *rproc); diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h index 4fd5bedab4fa..1c624906eb72 100644 --- a/include/linux/remoteproc.h +++ b/include/linux/remoteproc.h @@ -383,6 +383,8 @@ struct rproc_ops { int (*load)(struct rproc *rproc, const struct firmware *fw); int (*sanity_check)(struct rproc *rproc, const struct firmware *fw); u32 (*get_boot_addr)(struct rproc *rproc, const struct firmware *fw); + void * (*memcpy)(struct rproc *rproc, void *dest, + const void *src, size_t count, int flags); }; /**