diff options
author | Craig Dooley <dooleyc@google.com> | 2022-03-04 01:35:23 +0000 |
---|---|---|
committer | Roger Liao <rogerliao@google.com> | 2022-05-10 06:01:33 +0800 |
commit | 3c4d470f9a27f7057a151bdf68306a1577f58423 (patch) | |
tree | a0f706a304ee49d2f5a3ea4a3f805c76532044c7 | |
parent | 0f8ce0b9679b4980028947d0e1f58bd0547a87bd (diff) | |
download | aoc-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
-rw-r--r-- | aoc.c | 19 |
1 files changed, 17 insertions, 2 deletions
@@ -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 |