aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMahesh Salgaonkar <mahesh@linux.vnet.ibm.com>2019-11-05 16:15:18 +0530
committerVasant Hegde <hegdevasant@linux.vnet.ibm.com>2019-12-06 13:55:40 +0530
commitd4f999a5d3b5d35feb1a1163f7e4d970fd217316 (patch)
tree5fc85cd2ed4019c3cef3e73f72116522939a1a79
parent1ac0e1f6dd114b2170c37e599bcf938e2e5b6a4f (diff)
downloadskiboot-d4f999a5d3b5d35feb1a1163f7e4d970fd217316.zip
skiboot-d4f999a5d3b5d35feb1a1163f7e4d970fd217316.tar.gz
skiboot-d4f999a5d3b5d35feb1a1163f7e4d970fd217316.tar.bz2
IPMI: Trigger OPAL TI in abort path.
[ Upstream commit a810d1fe7a1631dc1eb211ff70885f044cb40904 ] The current assert/abort implementation for BMC based system invokes cec reboot after printing backtrace. This means that BMC never gets notified about OPAL crash/termination. This sometimes leads into never ending IPL-ing loop if OPAL keeps aborting very early in boot path. Trigger a software xstop (OPAL TI) to inform BMC about the OPAL termination. BMC is capable of catching checkstop signal and facilitate in rebooting (IPL-ing) host. With AutoReboot policy, OpenBMC handles checkstop signals and counts them against the reboot counter. In cases where OPAL is crashing before host reaches to runtime, OpenBMC will move the system in Quiesced state after 3 or so attempts of IPL/reboot so that system can be debugged. When OPAL triggers software checkstop it causes all the CPU threads to be stooped and moved to quiesced state. Hence OPAL don't need to explicitly stop all CPUs before calling software xstop. Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com> Reviewed-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com> Signed-off-by: Oliver O'Halloran <oohall@gmail.com> Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
-rw-r--r--hw/ipmi/ipmi-attn.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/hw/ipmi/ipmi-attn.c b/hw/ipmi/ipmi-attn.c
index 3a61518..93ede05 100644
--- a/hw/ipmi/ipmi-attn.c
+++ b/hw/ipmi/ipmi-attn.c
@@ -14,6 +14,7 @@
#include <skiboot.h>
#include <stack.h>
#include <timebase.h>
+#include <xscom.h>
/* Use same attention SRC for BMC based machine */
DEFINE_LOG_ENTRY(OPAL_RC_ATTN, OPAL_PLATFORM_ERR_EVT,
@@ -67,18 +68,33 @@ void __attribute__((noreturn)) ipmi_terminate(const char *msg)
*/
p9_sbe_terminate();
- /* Terminate called before initializing IPMI (early abort) */
- if (!ipmi_present()) {
- if (platform.cec_reboot)
- platform.cec_reboot();
- goto out;
- }
+ /*
+ * Trigger software xstop (OPAL TI). It will stop all the CPU threads
+ * moving them into quiesced state. OCC will collect all FIR data.
+ * Upon checkstop signal, BMC will then decide whether to reboot/IPL or
+ * not depending on AutoReboot policy, if any. This helps in cases
+ * where OPAL is crashing/terminating before host reaches to runtime.
+ * With OpenBMC AutoReboot policy, in such cases, it will make sure
+ * that system is moved to Quiesced state after 3 or so attempts to
+ * IPL. Without OPAL TI, OpenBMC will never know that OPAL is
+ * terminating and system would go into never ending IPL'ing loop.
+ *
+ * Once the system reaches to runtime, OpenBMC resets the boot counter.
+ * Hence next time when BMC receieves the OPAL TI, it will IPL the
+ * system if AutoReboot is enabled. We don't need to worry about self
+ * rebooting.
+ */
+
+ xscom_trigger_xstop();
+ /*
+ * Control will not reach here if software xstop has been supported and
+ * enabled. If not supported then fallback to cec reboot path below.
+ */
/* Reboot call */
if (platform.cec_reboot)
platform.cec_reboot();
-out:
while (1)
time_wait_ms(100);
}