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>
This commit is contained in:
Родитель
3952105df4
Коммит
ab8f873bb9
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Загрузка…
Ссылка в новой задаче