From c5a06a551ef55468e7bc46615f71f4ee4dbeaa02 Mon Sep 17 00:00:00 2001 From: Alistair Popple Date: Wed, 4 Feb 2015 16:07:45 +1100 Subject: ipmi: Add support for synchronous message sending This patch adds support for sending ipmi messages synchronously. This is necessary to allow messages to be sent during skiboot initialisation as interrupt servicing/polling is controlled by the host operating system which is not yet running. Signed-off-by: Alistair Popple Reviewed-by: Joel Stanley Signed-off-by: Stewart Smith --- core/ipmi.c | 23 +++++++++++++++++++++++ include/ipmi.h | 4 ++++ 2 files changed, 27 insertions(+) diff --git a/core/ipmi.c b/core/ipmi.c index 5caf057..941cf52 100644 --- a/core/ipmi.c +++ b/core/ipmi.c @@ -22,8 +22,13 @@ #include #include #include +#include +#include +#include struct ipmi_backend *ipmi_backend = NULL; +static struct lock sync_lock = LOCK_UNLOCKED; +static struct ipmi_msg *sync_msg = NULL; void ipmi_free_msg(struct ipmi_msg *msg) { @@ -112,6 +117,24 @@ void ipmi_cmd_done(uint8_t cmd, uint8_t netfn, uint8_t cc, struct ipmi_msg *msg) /* At this point the message has should have been freed by the completion functions. */ + + /* If this is a synchronous message flag that we are done */ + if (msg == sync_msg) + sync_msg = NULL; +} + +void ipmi_queue_msg_sync(struct ipmi_msg *msg) +{ + lock(&sync_lock); + + assert(!sync_msg); + sync_msg = msg; + ipmi_queue_msg(msg); + + while (sync_msg) + time_wait_ms(100); + + unlock(&sync_lock); } void ipmi_register_backend(struct ipmi_backend *backend) diff --git a/include/ipmi.h b/include/ipmi.h index bbeae5a..5660704 100644 --- a/include/ipmi.h +++ b/include/ipmi.h @@ -176,6 +176,10 @@ int ipmi_queue_msg(struct ipmi_msg *msg); /* Add an ipmi message to the start of the queue */ int ipmi_queue_msg_head(struct ipmi_msg *msg); +/* Synchronously send an ipmi message. This won't return until the + * messages callback has been called. */ +void ipmi_queue_msg_sync(struct ipmi_msg *msg); + /* Process a completed message */ void ipmi_cmd_done(uint8_t cmd, uint8_t netfn, uint8_t cc, struct ipmi_msg *msg); -- cgit v1.1