aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSibi Sankar <sibis@codeaurora.org>2018-10-17 09:55:23 -0400
committerBjorn Andersson <bjorn.andersson@linaro.org>2018-10-19 14:14:16 -0400
commit3952105df4723abbd36b57e88c8dad42cf6c8b59 (patch)
treece9b4e551a7faffe953c929aab75deb68c34f0e8
parentc6aed238b7a9b15a5c90a0c31f1d36577b5d2cbe (diff)
remoteproc: Introduce custom dump function for each remoteproc segment
Introduce custom dump function and private data per remoteproc dump segment. The dump function is responsible for filling the device memory segment associated with coredump Signed-off-by: Sibi Sankar <sibis@codeaurora.org> Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
-rw-r--r--drivers/remoteproc/remoteproc_core.c18
-rw-r--r--include/linux/remoteproc.h6
2 files changed, 17 insertions, 7 deletions
diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c
index f77a42f6a8aa..6bed40d01dbf 100644
--- a/drivers/remoteproc/remoteproc_core.c
+++ b/drivers/remoteproc/remoteproc_core.c
@@ -1508,14 +1508,18 @@ static void rproc_coredump(struct rproc *rproc)
1508 phdr->p_flags = PF_R | PF_W | PF_X; 1508 phdr->p_flags = PF_R | PF_W | PF_X;
1509 phdr->p_align = 0; 1509 phdr->p_align = 0;
1510 1510
1511 ptr = rproc_da_to_va(rproc, segment->da, segment->size); 1511 if (segment->dump) {
1512 if (!ptr) { 1512 segment->dump(rproc, segment, data + offset);
1513 dev_err(&rproc->dev,
1514 "invalid coredump segment (%pad, %zu)\n",
1515 &segment->da, segment->size);
1516 memset(data + offset, 0xff, segment->size);
1517 } else { 1513 } else {
1518 memcpy(data + offset, ptr, segment->size); 1514 ptr = rproc_da_to_va(rproc, segment->da, segment->size);
1515 if (!ptr) {
1516 dev_err(&rproc->dev,
1517 "invalid coredump segment (%pad, %zu)\n",
1518 &segment->da, segment->size);
1519 memset(data + offset, 0xff, segment->size);
1520 } else {
1521 memcpy(data + offset, ptr, segment->size);
1522 }
1519 } 1523 }
1520 1524
1521 offset += phdr->p_filesz; 1525 offset += phdr->p_filesz;
diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h
index 8bb0cf0416f1..2d036adab7ff 100644
--- a/include/linux/remoteproc.h
+++ b/include/linux/remoteproc.h
@@ -412,6 +412,9 @@ enum rproc_crash_type {
412 * @node: list node related to the rproc segment list 412 * @node: list node related to the rproc segment list
413 * @da: device address of the segment 413 * @da: device address of the segment
414 * @size: size of the segment 414 * @size: size of the segment
415 * @priv: private data associated with the dump_segment
416 * @dump: custom dump function to fill device memory segment associated
417 * with coredump
415 */ 418 */
416struct rproc_dump_segment { 419struct rproc_dump_segment {
417 struct list_head node; 420 struct list_head node;
@@ -419,6 +422,9 @@ struct rproc_dump_segment {
419 dma_addr_t da; 422 dma_addr_t da;
420 size_t size; 423 size_t size;
421 424
425 void *priv;
426 void (*dump)(struct rproc *rproc, struct rproc_dump_segment *segment,
427 void *dest);
422 loff_t offset; 428 loff_t offset;
423}; 429};
424 430