[Skiboot] [PATCH v2 16/17] fadump: Send OPAL relocated base address to SBE

Vasant Hegde hegdevasant at linux.vnet.ibm.com
Fri May 4 20:28:16 AEST 2018


OPAL relocates itself during boot. During memory preserving IPL hostboot
needs to access relocated OPAL. Hence send relocated base address to SBE
via 'stash MPIPL config' chip-op. During next IPL SBE will send stashed
data to hostboot... so that hostboot can access these data.

Signed-off-by: Vasant Hegde <hegdevasant at linux.vnet.ibm.com>
---
 core/opal-dump.c |  4 ++++
 hw/sbe-p9.c      | 31 +++++++++++++++++++++++++++++++
 include/sbe-p9.h |  6 ++++++
 3 files changed, 41 insertions(+)

diff --git a/core/opal-dump.c b/core/opal-dump.c
index 16def2a05..1343bfe44 100644
--- a/core/opal-dump.c
+++ b/core/opal-dump.c
@@ -23,6 +23,7 @@
 #include <opal.h>
 #include <opal-dump.h>
 #include <opal-internal.h>
+#include <sbe-p9.h>
 #include <skiboot.h>
 
 #include <ccan/endian/endian.h>
@@ -345,6 +346,9 @@ void opal_fadump_init(void)
 
 	adjust_opal_dump_size(dump_node);
 
+	/* Send OPAL relocated base address to SBE */
+	p9_sbe_send_relocated_base(SKIBOOT_BASE);
+
 	/* OPAL interface */
 	opal_register(OPAL_FADUMP_MANAGE, opal_fadump_manage, 3);
 }
diff --git a/hw/sbe-p9.c b/hw/sbe-p9.c
index d52ada15a..12d9e97ff 100644
--- a/hw/sbe-p9.c
+++ b/hw/sbe-p9.c
@@ -861,6 +861,37 @@ bool p9_sbe_timer_ok(void)
 	return sbe_has_timer;
 }
 
+static void p9_sbe_stash_chipop_resp(struct p9_sbe_msg *msg)
+{
+	int rc = p9_sbe_get_primary_rc(msg->resp);
+
+	if (rc == SBE_STATUS_PRI_SUCCESS) {
+		prlog(PR_DEBUG, "Sent stash MPIPL config\n");
+	} else {
+		prlog(PR_DEBUG,
+		      "Failed to send stash MPIPL config [rc = 0x%x]\n", rc);
+	}
+
+	p9_sbe_freemsg(msg);
+}
+
+void p9_sbe_send_relocated_base(uint64_t val)
+{
+	u8 key = SBE_STASH_KEY_SKIBOOT_BASE;
+	u16 cmd = SBE_CMD_STASH_MPIPL_CONFIG;
+	u16 flag = SBE_CMD_CTRL_RESP_REQ;
+	struct p9_sbe_msg *msg;
+
+	msg = p9_sbe_mkmsg(cmd, flag, key, val, 0);
+	if (!msg) {
+		prlog(PR_DEBUG, "Message allocation failed\n");
+		return;
+	}
+	if (p9_sbe_queue_msg(sbe_default_chip_id, msg, p9_sbe_stash_chipop_resp)) {
+		prlog(PR_ERR, "Failed to queue stash MPIPL config message\n");
+	}
+}
+
 void p9_sbe_init(void)
 {
 	struct dt_node *xn;
diff --git a/include/sbe-p9.h b/include/sbe-p9.h
index 4b839d8ba..7101dc700 100644
--- a/include/sbe-p9.h
+++ b/include/sbe-p9.h
@@ -159,6 +159,9 @@
 #define CONTROL_TIMER_START		0x0001
 #define CONTROL_TIMER_STOP		0x0002
 
+/* Stash MPIPL config */
+#define SBE_STASH_KEY_SKIBOOT_BASE	0x03
+
 /* SBE message state */
 enum p9_sbe_msg_state {
 	sbe_msg_unused = 0,	/* Free */
@@ -237,4 +240,7 @@ extern bool p9_sbe_timer_ok(void);
 /* Update SBE timer expiry */
 extern void p9_sbe_update_timer_expiry(uint64_t new_target);
 
+/* Send skiboot relocated base address to SBE */
+extern void p9_sbe_send_relocated_base(uint64_t val);
+
 #endif	/* __SBE_P9_H */
-- 
2.14.3



More information about the Skiboot mailing list