summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSibi Sankar <sibis@codeaurora.org>2018-10-17 09:55:24 -0400
committerBjorn Andersson <bjorn.andersson@linaro.org>2018-10-19 15:53:55 -0400
commitab8f873bb90da7bbe40e2f41c92a4971c4f0dc76 (patch)
treeabfeb259626b278bf5cd7bf2df13e57d9a894a8e
parent3952105df4723abbd36b57e88c8dad42cf6c8b59 (diff)
remoteproc: Add mechanism for custom dump function assignment
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>
-rw-r--r--drivers/remoteproc/remoteproc_core.c38
-rw-r--r--include/linux/remoteproc.h6
2 files changed, 44 insertions, 0 deletions
diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c
index 6bed40d01dbf..54ec38fc5dca 100644
--- a/drivers/remoteproc/remoteproc_core.c
+++ b/drivers/remoteproc/remoteproc_core.c
@@ -1447,6 +1447,44 @@ int rproc_coredump_add_segment(struct rproc *rproc, dma_addr_t da, size_t size)
1447EXPORT_SYMBOL(rproc_coredump_add_segment); 1447EXPORT_SYMBOL(rproc_coredump_add_segment);
1448 1448
1449/** 1449/**
1450 * rproc_coredump_add_custom_segment() - add custom coredump segment
1451 * @rproc: handle of a remote processor
1452 * @da: device address
1453 * @size: size of segment
1454 * @dumpfn: custom dump function called for each segment during coredump
1455 * @priv: private data
1456 *
1457 * Add device memory to the list of segments to be included in the coredump
1458 * and associate the segment with the given custom dump function and private
1459 * data.
1460 *
1461 * Return: 0 on success, negative errno on error.
1462 */
1463int rproc_coredump_add_custom_segment(struct rproc *rproc,
1464 dma_addr_t da, size_t size,
1465 void (*dumpfn)(struct rproc *rproc,
1466 struct rproc_dump_segment *segment,
1467 void *dest),
1468 void *priv)
1469{
1470 struct rproc_dump_segment *segment;
1471
1472 segment = kzalloc(sizeof(*segment), GFP_KERNEL);
1473 if (!segment)
1474 return -ENOMEM;
1475
1476 segment->da = da;
1477 segment->size = size;
1478 segment->priv = priv;
1479 segment->dump = dumpfn;
1480
1481 list_add_tail(&segment->node, &rproc->dump_segments);
1482
1483 return 0;
1484}
1485EXPORT_SYMBOL(rproc_coredump_add_custom_segment);
1486
1487/**
1450 * rproc_coredump() - perform coredump 1488 * rproc_coredump() - perform coredump
1451 * @rproc: rproc handle 1489 * @rproc: rproc handle
1452 * 1490 *
diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h
index 2d036adab7ff..507a2b524208 100644
--- a/include/linux/remoteproc.h
+++ b/include/linux/remoteproc.h
@@ -592,6 +592,12 @@ int rproc_boot(struct rproc *rproc);
592void rproc_shutdown(struct rproc *rproc); 592void rproc_shutdown(struct rproc *rproc);
593void rproc_report_crash(struct rproc *rproc, enum rproc_crash_type type); 593void rproc_report_crash(struct rproc *rproc, enum rproc_crash_type type);
594int rproc_coredump_add_segment(struct rproc *rproc, dma_addr_t da, size_t size); 594int rproc_coredump_add_segment(struct rproc *rproc, dma_addr_t da, size_t size);
595int rproc_coredump_add_custom_segment(struct rproc *rproc,
596 dma_addr_t da, size_t size,
597 void (*dumpfn)(struct rproc *rproc,
598 struct rproc_dump_segment *segment,
599 void *dest),
600 void *priv);
595 601
596static inline struct rproc_vdev *vdev_to_rvdev(struct virtio_device *vdev) 602static inline struct rproc_vdev *vdev_to_rvdev(struct virtio_device *vdev)
597{ 603{