diff options
author | Nicholas Piggin <npiggin@gmail.com> | 2023-05-13 22:12:25 +1000 |
---|---|---|
committer | Reza Arbab <arbab@linux.ibm.com> | 2023-06-06 13:32:12 -0500 |
commit | d2689980a3207508a8737c286ff0ab404bd482bc (patch) | |
tree | 4bd22a47cf21996d33e1e5e51924d409abb0937c /core | |
parent | 47488feb70d3fea5325174a391451e6e1d0c3cf1 (diff) | |
download | skiboot-d2689980a3207508a8737c286ff0ab404bd482bc.zip skiboot-d2689980a3207508a8737c286ff0ab404bd482bc.tar.gz skiboot-d2689980a3207508a8737c286ff0ab404bd482bc.tar.bz2 |
ipmi: flush the ipmi message queue before booting a kernel
Bring ipmi to a consistent state before booting a kernel by flushing
all outstanding messages. The OS may not start kicking the IPMI state
machine for some time.
For example, without this change, when booting in QEMU, the IPMI command
issued by ipmi_wdt_final_reset() to disable the watchdog is not sent to
the BMC before the OS boots, effectively leaving the watchdog enabled
until the OS begins to drive OPAL pollers.
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Reviewed-by: Stewart Smith <stewart@flamingspork.com>
Signed-off-by: Reza Arbab <arbab@linux.ibm.com>
Diffstat (limited to 'core')
-rw-r--r-- | core/ipmi.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/core/ipmi.c b/core/ipmi.c index 59aa95f..673aa0c 100644 --- a/core/ipmi.c +++ b/core/ipmi.c @@ -159,7 +159,7 @@ void ipmi_cmd_done(uint8_t cmd, uint8_t netfn, uint8_t cc, struct ipmi_msg *msg) void ipmi_queue_msg_sync(struct ipmi_msg *msg) { - void (*poll)(void) = msg->backend->poll; + bool (*poll)(void) = msg->backend->poll; if (!ipmi_present()) return; @@ -192,6 +192,15 @@ void ipmi_queue_msg_sync(struct ipmi_msg *msg) } } +void ipmi_flush(void) +{ + if (!ipmi_present()) + return; + + while (ipmi_backend->poll()) + time_wait_ms(10); +} + static void ipmi_read_event_complete(struct ipmi_msg *msg) { prlog(PR_DEBUG, "IPMI read event %02x complete: %d bytes. cc: %02x\n", |