remoteproc: Add mechanism for custom dump function assignment
authorSibi Sankar <sibis@codeaurora.org>
Wed, 17 Oct 2018 13:55:24 +0000 (19:25 +0530)
committerBjorn Andersson <bjorn.andersson@linaro.org>
Fri, 19 Oct 2018 19:53:55 +0000 (12:53 -0700)
This patch adds a mechanism for assigning each rproc dump segment with
a custom dump function and private data. The dump function is to be
called for each rproc segment during coredump if assigned.

Signed-off-by: Sibi Sankar <sibis@codeaurora.org>
[bjorn: reordred arguments to rproc_coredump_add_custom_segment()]
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
drivers/remoteproc/remoteproc_core.c
include/linux/remoteproc.h

index 6bed40d..54ec38f 100644 (file)
@@ -1447,6 +1447,44 @@ int rproc_coredump_add_segment(struct rproc *rproc, dma_addr_t da, size_t size)
 EXPORT_SYMBOL(rproc_coredump_add_segment);
 
 /**
+ * rproc_coredump_add_custom_segment() - add custom coredump segment
+ * @rproc:     handle of a remote processor
+ * @da:                device address
+ * @size:      size of segment
+ * @dumpfn:    custom dump function called for each segment during coredump
+ * @priv:      private data
+ *
+ * Add device memory to the list of segments to be included in the coredump
+ * and associate the segment with the given custom dump function and private
+ * data.
+ *
+ * Return: 0 on success, negative errno on error.
+ */
+int rproc_coredump_add_custom_segment(struct rproc *rproc,
+                                     dma_addr_t da, size_t size,
+                                     void (*dumpfn)(struct rproc *rproc,
+                                                    struct rproc_dump_segment *segment,
+                                                    void *dest),
+                                     void *priv)
+{
+       struct rproc_dump_segment *segment;
+
+       segment = kzalloc(sizeof(*segment), GFP_KERNEL);
+       if (!segment)
+               return -ENOMEM;
+
+       segment->da = da;
+       segment->size = size;
+       segment->priv = priv;
+       segment->dump = dumpfn;
+
+       list_add_tail(&segment->node, &rproc->dump_segments);
+
+       return 0;
+}
+EXPORT_SYMBOL(rproc_coredump_add_custom_segment);
+
+/**
  * rproc_coredump() - perform coredump
  * @rproc:     rproc handle
  *
index 2d036ad..507a2b5 100644 (file)
@@ -592,6 +592,12 @@ int rproc_boot(struct rproc *rproc);
 void rproc_shutdown(struct rproc *rproc);
 void rproc_report_crash(struct rproc *rproc, enum rproc_crash_type type);
 int rproc_coredump_add_segment(struct rproc *rproc, dma_addr_t da, size_t size);
+int rproc_coredump_add_custom_segment(struct rproc *rproc,
+                                     dma_addr_t da, size_t size,
+                                     void (*dumpfn)(struct rproc *rproc,
+                                                    struct rproc_dump_segment *segment,
+                                                    void *dest),
+                                     void *priv);
 
 static inline struct rproc_vdev *vdev_to_rvdev(struct virtio_device *vdev)
 {