summaryrefslogtreecommitdiff
path: root/aoc.c
diff options
context:
space:
mode:
authorCraig Dooley <dooleyc@google.com>2022-03-04 01:35:23 +0000
committerRoger Liao <rogerliao@google.com>2022-05-10 06:01:33 +0800
commit3c4d470f9a27f7057a151bdf68306a1577f58423 (patch)
treea0f706a304ee49d2f5a3ea4a3f805c76532044c7 /aoc.c
parent0f8ce0b9679b4980028947d0e1f58bd0547a87bd (diff)
downloadaoc-3c4d470f9a27f7057a151bdf68306a1577f58423.tar.gz
Send a "crash" mailbox message to AoC during AP restart
Bug: 222458256 Signed-off-by: Craig Dooley <dooleyc@google.com> Change-Id: I4db45a9f97dfb916b1fe9c5724b01ac3fed175cd
Diffstat (limited to 'aoc.c')
-rw-r--r--aoc.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/aoc.c b/aoc.c
index 7749fd5..8ce5d52 100644
--- a/aoc.c
+++ b/aoc.c
@@ -211,6 +211,7 @@ struct sscd_info {
u16 seg_count;
};
+static void trigger_aoc_ramdump(struct aoc_prvdata *prvdata);
static void sscd_release(struct device *dev);
static struct sscd_info sscd_info;
@@ -1993,6 +1994,16 @@ static struct aoc_service_dev *create_service_device(struct aoc_prvdata *prvdata
return dev;
}
+static void trigger_aoc_ramdump(struct aoc_prvdata *prvdata)
+{
+ struct mbox_chan *channel = prvdata->mbox_channels[15].channel;
+ static const uint32_t command[] = { 0, 0, 0, 0, 0x0deada0c, 0, 0, 0 };
+
+ dev_notice(prvdata->dev, "Attempting to force AoC coredump\n");
+
+ mbox_send_message(channel, (void *)&command);
+}
+
static void signal_aoc(struct mbox_chan *channel)
{
#ifdef AOC_JUNO
@@ -2534,11 +2545,16 @@ static void aoc_watchdog(struct work_struct *work)
goto err_coredump;
}
+ /* If this was a true watchdog timeout, the AoC may still be running, so
+ * the coredump will not be written. Attempt to force a coredump by sending
+ * a death message to the AoC to trigger a failure.
+ */
+ trigger_aoc_ramdump(prvdata);
+
if (prvdata->ap_triggered_reset) {
prvdata->ap_triggered_reset = false;
snprintf(crash_info, RAMDUMP_SECTION_CRASH_INFO_SIZE - 1,
"AP Triggered Reset: %s", prvdata->ap_reset_reason);
- goto coredump_submit;
}
ramdump_timeout = jiffies + (5 * HZ);
@@ -2598,7 +2614,6 @@ static void aoc_watchdog(struct work_struct *work)
sscd_info.segs[0].vaddr = (void *)carveout_vaddr_from_aoc;
sscd_info.seg_count = 1;
-coredump_submit:
/*
* sscd_report() returns -EAGAIN if there are no readers to consume a
* coredump. Retry sscd_report() with a sleep to handle the race condition