remoteproc: Introduce custom dump function for each remoteproc segment
authorSibi Sankar <sibis@codeaurora.org>
Wed, 17 Oct 2018 13:55:23 +0000 (19:25 +0530)
committerBjorn Andersson <bjorn.andersson@linaro.org>
Fri, 19 Oct 2018 18:14:16 +0000 (11:14 -0700)
Introduce custom dump function and private data per remoteproc dump
segment. The dump function is responsible for filling the device memory
segment associated with coredump

Signed-off-by: Sibi Sankar <sibis@codeaurora.org>
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
drivers/remoteproc/remoteproc_core.c
include/linux/remoteproc.h

index f77a42f..6bed40d 100644 (file)
@@ -1508,14 +1508,18 @@ static void rproc_coredump(struct rproc *rproc)
                phdr->p_flags = PF_R | PF_W | PF_X;
                phdr->p_align = 0;
 
-               ptr = rproc_da_to_va(rproc, segment->da, segment->size);
-               if (!ptr) {
-                       dev_err(&rproc->dev,
-                               "invalid coredump segment (%pad, %zu)\n",
-                               &segment->da, segment->size);
-                       memset(data + offset, 0xff, segment->size);
+               if (segment->dump) {
+                       segment->dump(rproc, segment, data + offset);
                } else {
-                       memcpy(data + offset, ptr, segment->size);
+                       ptr = rproc_da_to_va(rproc, segment->da, segment->size);
+                       if (!ptr) {
+                               dev_err(&rproc->dev,
+                                       "invalid coredump segment (%pad, %zu)\n",
+                                       &segment->da, segment->size);
+                               memset(data + offset, 0xff, segment->size);
+                       } else {
+                               memcpy(data + offset, ptr, segment->size);
+                       }
                }
 
                offset += phdr->p_filesz;
index 8bb0cf0..2d036ad 100644 (file)
@@ -412,6 +412,9 @@ enum rproc_crash_type {
  * @node:      list node related to the rproc segment list
  * @da:                device address of the segment
  * @size:      size of the segment
+ * @priv:      private data associated with the dump_segment
+ * @dump:      custom dump function to fill device memory segment associated
+ *             with coredump
  */
 struct rproc_dump_segment {
        struct list_head node;
@@ -419,6 +422,9 @@ struct rproc_dump_segment {
        dma_addr_t da;
        size_t size;
 
+       void *priv;
+       void (*dump)(struct rproc *rproc, struct rproc_dump_segment *segment,
+                    void *dest);
        loff_t offset;
 };