diff options
author | Sibi Sankar <sibis@codeaurora.org> | 2018-10-17 09:55:24 -0400 |
---|---|---|
committer | Bjorn Andersson <bjorn.andersson@linaro.org> | 2018-10-19 15:53:55 -0400 |
commit | ab8f873bb90da7bbe40e2f41c92a4971c4f0dc76 (patch) | |
tree | abfeb259626b278bf5cd7bf2df13e57d9a894a8e | |
parent | 3952105df4723abbd36b57e88c8dad42cf6c8b59 (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.c | 38 | ||||
-rw-r--r-- | include/linux/remoteproc.h | 6 |
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) | |||
1447 | EXPORT_SYMBOL(rproc_coredump_add_segment); | 1447 | EXPORT_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 | */ | ||
1463 | int 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 | } | ||
1485 | EXPORT_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); | |||
592 | void rproc_shutdown(struct rproc *rproc); | 592 | void rproc_shutdown(struct rproc *rproc); |
593 | void rproc_report_crash(struct rproc *rproc, enum rproc_crash_type type); | 593 | void rproc_report_crash(struct rproc *rproc, enum rproc_crash_type type); |
594 | int rproc_coredump_add_segment(struct rproc *rproc, dma_addr_t da, size_t size); | 594 | int rproc_coredump_add_segment(struct rproc *rproc, dma_addr_t da, size_t size); |
595 | int 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 | ||
596 | static inline struct rproc_vdev *vdev_to_rvdev(struct virtio_device *vdev) | 602 | static inline struct rproc_vdev *vdev_to_rvdev(struct virtio_device *vdev) |
597 | { | 603 | { |