@@ -641,6 +641,10 @@ void __noreturn load_and_boot_kernel(bool is_reboot)
cpu_give_self_os();
+ /* init MPIPL */
+ if (!is_reboot)
+ opal_mpipl_init();
+
if (kernel_32bit)
start_kernel32(kernel_entry, fdt, mem_top);
start_kernel(kernel_entry, fdt, mem_top);
@@ -1363,9 +1367,6 @@ void __noreturn __nomcount main_cpu_entry(const void *fdt)
/* Create the LPC bus interrupt-map on P9 */
lpc_finalize_interrupts();
- /* init opal dump */
- opal_mpipl_init();
-
/* Add the list of interrupts going to OPAL */
add_opal_interrupts();
@@ -67,6 +67,8 @@ static int opal_mpipl_max_tags = MAX_OPAL_MPIPL_TAGS;
static u64 opal_dump_addr, opal_dump_size;
+static bool mpipl_enabled;
+
static int opal_mpipl_add_entry(u8 region, u64 src, u64 dest, u64 size)
{
int i;
@@ -526,6 +528,11 @@ void opal_mpipl_reserve_mem(void)
arch_regs_dest, arch_regs_size);
}
+bool is_mpipl_enabled(void)
+{
+ return mpipl_enabled;
+}
+
void opal_mpipl_init(void)
{
void *mdst_base = (void *)MDST_TABLE_BASE;
@@ -575,4 +582,7 @@ void opal_mpipl_init(void)
opal_register(OPAL_MPIPL_UPDATE, opal_mpipl_update, 4);
opal_register(OPAL_MPIPL_REGISTER_TAG, opal_mpipl_register_tag, 2);
opal_register(OPAL_MPIPL_QUERY_TAG, opal_mpipl_query_tag, 2);
+
+ /* Enable MPIPL */
+ mpipl_enabled = true;
}
@@ -949,7 +949,7 @@ void p9_sbe_terminate(void)
struct proc_chip *chip;
/* Return if MPIPL is not supported */
- if (!dt_find_by_path(opal_node, "dump"))
+ if (!is_mpipl_enabled())
return;
/* Unregister flash. It will request BMC MBOX reset */
@@ -127,4 +127,7 @@ void opal_mpipl_save_crashing_pir(void);
/* Reserve memory to capture OPAL dump */
extern void opal_mpipl_reserve_mem(void);
+/* Check MPIPL enabled or not */
+extern bool is_mpipl_enabled(void);
+
#endif /* __OPAL_DUMP_H */
If OPAL boot fails after MPIPL init (opal_mpipl_init()) then we call MPIPL boot instead of reboot. BMC is not aware of MPIPL. Hence it may result in continuous MPIPL loop (boot -> crash -> MPIPL -> boot). If OPAL boot fails (before loading kernel) then its better to call reboot. So that BMC can detect `n` number of boot failures (generally n = 3) and stop booting. That way we can avoid continuous loop. This patch moves MPIPL init to the end of init process (just before starting kernel). So that if we fail to boot OPAL we call normal reboot. Also this patch introduces new function to detect MPIPL is enabled or not (is_mpipl_enabled()). And in assert() path we check for this function instead of `dump` DT node. So that it will make sure we will not call MPIPL until opal_mpipl_init is complete. Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com> --- core/init.c | 7 ++++--- core/opal-dump.c | 10 ++++++++++ hw/sbe-p9.c | 2 +- include/opal-dump.h | 3 +++ 4 files changed, 18 insertions(+), 4 deletions(-)