[v9,14/25] SBE: Send OPAL relocated base address to SBE
diff mbox series

Message ID 20190712111802.23560-15-hegdevasant@linux.vnet.ibm.com
State Accepted
Headers show
Series
  • MPIPL support
Related show

Checks

Context Check Description
snowpatch_ozlabs/snowpatch_job_snowpatch-skiboot-dco success Signed-off-by present
snowpatch_ozlabs/snowpatch_job_snowpatch-skiboot success Test snowpatch/job/snowpatch-skiboot on branch master
snowpatch_ozlabs/apply_patch success Successfully applied on branch master (4db38a36b31045f0a116d388ddeac850b38c8680)

Commit Message

Vasant Hegde July 12, 2019, 11:17 a.m. UTC
OPAL relocates itself during boot. During memory preserving IPL hostboot needs
to access relocated OPAL base address to get MDST, MDDT tables. 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      | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
 include/sbe-p9.h |  8 +++++++-
 3 files changed, 59 insertions(+), 1 deletion(-)

Patch
diff mbox series

diff --git a/core/opal-dump.c b/core/opal-dump.c
index 775ec8161..9ca01e5e2 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>
@@ -361,6 +362,9 @@  void opal_mpipl_init(void)
 
 	opal_mpipl_register();
 
+	/* Send OPAL relocated base address to SBE */
+	p9_sbe_send_relocated_base(SKIBOOT_BASE);
+
 	/* OPAL API for MPIPL update */
 	opal_register(OPAL_MPIPL_UPDATE, opal_mpipl_update, 4);
 	opal_register(OPAL_MPIPL_REGISTER_TAG, opal_mpipl_register_tag, 2);
diff --git a/hw/sbe-p9.c b/hw/sbe-p9.c
index c28dbb9d6..d3dd4bdb4 100644
--- a/hw/sbe-p9.c
+++ b/hw/sbe-p9.c
@@ -861,6 +861,54 @@  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);
+	struct p9_sbe *sbe = (void *)msg->user_data;
+
+	if (rc == SBE_STATUS_PRI_SUCCESS) {
+		prlog(PR_DEBUG, "Sent stash MPIPL config [chip id =0x%x]\n",
+		      sbe->chip_id);
+	} else {
+		prlog(PR_ERR, "Failed to send stash MPIPL config "
+		      "[chip id = 0x%x, rc = %d]\n", sbe->chip_id, rc);
+	}
+
+	p9_sbe_freemsg(msg);
+}
+
+static void p9_sbe_send_relocated_base_single(struct p9_sbe *sbe, u64 reloc_base)
+{
+	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, reloc_base, 0);
+	if (!msg) {
+		prlog(PR_ERR, "Message allocation failed\n");
+		return;
+	}
+
+	msg->user_data = (void *)sbe;
+	if (p9_sbe_queue_msg(sbe->chip_id, msg, p9_sbe_stash_chipop_resp)) {
+		prlog(PR_ERR, "Failed to queue stash MPIPL config message\n");
+	}
+}
+
+/* Send relocated skiboot base address to all SBE */
+void p9_sbe_send_relocated_base(uint64_t reloc_base)
+{
+	struct proc_chip *chip;
+
+	for_each_chip(chip) {
+		if (chip->sbe == NULL)
+			continue;
+
+		p9_sbe_send_relocated_base_single(chip->sbe, reloc_base);
+	}
+}
+
 void p9_sbe_init(void)
 {
 	struct dt_node *xn;
diff --git a/include/sbe-p9.h b/include/sbe-p9.h
index 5ad0422ac..1191a94b4 100644
--- a/include/sbe-p9.h
+++ b/include/sbe-p9.h
@@ -1,4 +1,4 @@ 
-/* Copyright 2017-2018 IBM Corp.
+/* Copyright 2017-2019 IBM Corp.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -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 reloc_base);
+
 #endif	/* __SBE_P9_H */