[Skiboot] [PATCH v2 3/4] ipmi: Add support for synchronous message sending
Alistair Popple
alistair at popple.id.au
Wed Feb 4 16:07:45 AEDT 2015
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 <alistair at popple.id.au>
---
core/ipmi.c | 23 +++++++++++++++++++++++
include/ipmi.h | 4 ++++
2 files changed, 27 insertions(+)
diff --git a/core/ipmi.c b/core/ipmi.c
index da06c5f..99c2fd9 100644
--- a/core/ipmi.c
+++ b/core/ipmi.c
@@ -19,8 +19,13 @@
#include <ipmi.h>
#include <opal.h>
#include <device.h>
+#include <lock.h>
+#include <cpu.h>
+#include <timebase.h>
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)
{
@@ -109,6 +114,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);
}
static void ipmi_read_event_complete(struct ipmi_msg *msg)
diff --git a/include/ipmi.h b/include/ipmi.h
index 9c3f295..5cee692 100644
--- a/include/ipmi.h
+++ b/include/ipmi.h
@@ -193,6 +193,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);
--
1.8.3.2
More information about the Skiboot
mailing list