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 /hw | |
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 'hw')
-rw-r--r-- | hw/bt.c | 7 | ||||
-rw-r--r-- | hw/fsp/fsp-ipmi.c | 12 |
2 files changed, 16 insertions, 3 deletions
@@ -519,9 +519,14 @@ static void bt_poll(struct timer *t __unused, void *data __unused, bt.irq_ok ? TIMER_POLL : msecs_to_tb(BT_DEFAULT_POLL_MS)); } -static void bt_ipmi_poll(void) +static bool bt_ipmi_poll(void) { + if (!lpc_ok()) + return false; + bt_poll(NULL, NULL, mftb()); + + return bt.queue_len > 0; } static void bt_add_msg(struct bt_msg *bt_msg) diff --git a/hw/fsp/fsp-ipmi.c b/hw/fsp/fsp-ipmi.c index e368c28..9e600f3 100644 --- a/hw/fsp/fsp-ipmi.c +++ b/hw/fsp/fsp-ipmi.c @@ -243,14 +243,22 @@ static int fsp_ipmi_dequeue_msg(struct ipmi_msg *ipmi_msg) return 0; } + +static bool fsp_ipmi_poll(void) +{ + /* fsp_opal_poll poller checks command responses */ + opal_run_pollers(); + + return !list_empty(&fsp_ipmi.msg_queue); +} + static struct ipmi_backend fsp_ipmi_backend = { .alloc_msg = fsp_ipmi_alloc_msg, .free_msg = fsp_ipmi_free_msg, .queue_msg = fsp_ipmi_queue_msg, .queue_msg_head = fsp_ipmi_queue_msg_head, .dequeue_msg = fsp_ipmi_dequeue_msg, - /* FIXME if ever use ipmi_queue_msg_sync on FSP */ - .poll = NULL, + .poll = fsp_ipmi_poll, }; static bool fsp_ipmi_rr_notify(uint32_t cmd_sub_mod, |