aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/ipmi.c23
-rw-r--r--include/ipmi.h4
2 files changed, 27 insertions, 0 deletions
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 <opal-api.h>
#include <device.h>
#include <skiboot.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)
{
@@ -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);