|
@@ -1446,6 +1446,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
|