[RFC,15/16] dump: Send OPAL relocated base address to SBE

Message ID 20180403120447.24364-16-hegdevasant@linux.vnet.ibm.com
State RFC
Headers show
Series
  • MPIPL support
Related show

Commit Message

Vasant Hegde April 3, 2018, 12:04 p.m.
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@linux.vnet.ibm.com>
---
 core/opal-dump.c |  4 ++++
 hw/sbe-p9.c      | 31 +++++++++++++++++++++++++++++++
 include/sbe-p9.h |  6 ++++++
 3 files changed, 41 insertions(+)

Patch

diff --git a/core/opal-dump.c b/core/opal-dump.c
index ebf184902..c7671424a 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>
@@ -341,6 +342,9 @@  void opal_fadump_init(void)
 
 	adjust_opal_dump_size();
 
+	/* 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 0da9516f8..e2566bf26 100644
--- a/hw/sbe-p9.c
+++ b/hw/sbe-p9.c
@@ -756,6 +756,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");
+	} 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 c68894f11..b7ca8dba8 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 */
@@ -236,4 +239,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 */