@@ -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;
@@ -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);
};