meta-st-stm32mp/recipes-kernel/linux/linux-stm32mp/4.19/4.19.9/0048-ARM-stm32mp1-r0-rc4-RE...

101 lines
3.2 KiB
Diff

From 457cfdb049a39670f15df8cae1d78a2479962ef9 Mon Sep 17 00:00:00 2001
From: Romuald JEANNE <romuald.jeanne@st.com>
Date: Fri, 21 Dec 2018 16:57:38 +0100
Subject: [PATCH 48/52] ARM: stm32mp1-r0-rc4: REMOTEPROC RPMSG
---
drivers/remoteproc/rproc_srm_core.c | 2 +-
drivers/remoteproc/stm32_rproc.c | 40 +++++++++++++++++++++++++++----------
2 files changed, 30 insertions(+), 12 deletions(-)
diff --git a/drivers/remoteproc/rproc_srm_core.c b/drivers/remoteproc/rproc_srm_core.c
index 66be92e..fc61e8b 100644
--- a/drivers/remoteproc/rproc_srm_core.c
+++ b/drivers/remoteproc/rproc_srm_core.c
@@ -189,7 +189,7 @@ static int rproc_srm_core_prepare(struct rproc_subdev *subdev)
/* Wait for every child to be bound */
if (!wait_for_completion_timeout(&rproc_srm_core->all_bound,
msecs_to_jiffies(BIND_TIMEOUT))) {
- dev_err(dev, "bind timeout\n");
+ dev_err(dev, "failed to bind one or more system resource device(s)\n");
ret = -ETIMEDOUT;
goto master;
}
diff --git a/drivers/remoteproc/stm32_rproc.c b/drivers/remoteproc/stm32_rproc.c
index 9a7e034..70b7e55c 100644
--- a/drivers/remoteproc/stm32_rproc.c
+++ b/drivers/remoteproc/stm32_rproc.c
@@ -196,22 +196,12 @@ static int stm32_rproc_mbox_idx(struct rproc *rproc, const unsigned char *name)
static int stm32_rproc_elf_load_rsc_table(struct rproc *rproc,
const struct firmware *fw)
{
- int status, i;
+ int status;
struct resource_table *table = NULL;
struct stm32_rproc *ddata = rproc->priv;
size_t tablesz = 0;
- const struct elf32_hdr *ehdr;
- const struct elf32_phdr *phdr;
if (!rproc->early_boot) {
- /* set coredump segments */
- ehdr = (const struct elf32_hdr *)fw->data;
- phdr = (const struct elf32_phdr *)(fw->data + ehdr->e_phoff);
- for (i = 0; i < ehdr->e_phnum; i++, phdr++)
- rproc_coredump_add_segment(rproc, phdr->p_paddr,
- phdr->p_memsz);
-
- /* load resource table */
status = rproc_elf_load_rsc_table(rproc, fw);
if (status)
goto no_rsc_table;
@@ -276,6 +266,10 @@ static int stm32_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw)
stm32_rproc_mem_alloc,
stm32_rproc_mem_release,
it.node->name);
+
+ if (mem)
+ rproc_coredump_add_segment(rproc, da,
+ rmem->size);
} else {
/* Register reserved memory for vdev buffer alloc */
mem = rproc_of_resm_mem_entry_init(dev, index,
@@ -436,10 +430,34 @@ static int stm32_rproc_set_hold_boot(struct rproc *rproc, bool hold)
return err;
}
+static void stm32_rproc_add_coredump_trace(struct rproc *rproc)
+{
+ struct rproc_debug_trace *trace;
+ struct rproc_dump_segment *segment;
+ bool already_added;
+
+ list_for_each_entry(trace, &rproc->traces, node) {
+ already_added = false;
+
+ list_for_each_entry(segment, &rproc->dump_segments, node) {
+ if (segment->da == trace->trace_mem.da) {
+ already_added = true;
+ break;
+ }
+ }
+
+ if (!already_added)
+ rproc_coredump_add_segment(rproc, trace->trace_mem.da,
+ trace->trace_mem.len);
+ }
+}
+
static int stm32_rproc_start(struct rproc *rproc)
{
int err;
+ stm32_rproc_add_coredump_trace(rproc);
+
/*
* If M4 previously started by bootloader, just guarantee holdboot
* is set to catch any crash.
--
2.7.4