static void pnv_kexec_cpu_down(int crash_shutdown, int secondary) { xics_kexec_teardown_cpu(secondary); /* On OPAL v3, we return all CPUs to firmware */ if (!firmware_has_feature(FW_FEATURE_OPALv3)) return; if (secondary) { /* Return secondary CPUs to firmware on OPAL v3 */ mb(); get_paca()->kexec_state = KEXEC_STATE_REAL_MODE; mb(); /* Return the CPU to OPAL */ opal_return_cpu(); } else if (crash_shutdown) { /* * On crash, we don't wait for secondaries to go * down as they might be unreachable or hung, so * instead we just wait a bit and move on. */ mdelay(1); } else { /* Primary waits for the secondaries to have reached OPAL */ pnv_kexec_wait_secondaries_down(); } }
static void pnv_kexec_cpu_down(int crash_shutdown, int secondary) { if (xive_enabled()) xive_kexec_teardown_cpu(secondary); else xics_kexec_teardown_cpu(secondary); /* On OPAL, we return all CPUs to firmware */ if (!firmware_has_feature(FW_FEATURE_OPAL)) return; if (secondary) { /* Return secondary CPUs to firmware on OPAL v3 */ mb(); get_paca()->kexec_state = KEXEC_STATE_REAL_MODE; mb(); /* Return the CPU to OPAL */ opal_return_cpu(); } else { /* Primary waits for the secondaries to have reached OPAL */ pnv_kexec_wait_secondaries_down(); /* Switch XIVE back to emulation mode */ if (xive_enabled()) xive_shutdown(); /* * We might be running as little-endian - now that interrupts * are disabled, reset the HILE bit to big-endian so we don't * take interrupts in the wrong endian later */ opal_reinit_cpus(OPAL_REINIT_CPUS_HILE_BE); } }
/* Return CPUs to OPAL before starting FW update */ static void flash_return_cpu(void *info) { int cpu = smp_processor_id(); if (!cpu_online(cpu)) return; /* Disable IRQ */ hard_irq_disable(); /* Return the CPU to OPAL */ opal_return_cpu(); }
static void pnv_kexec_cpu_down(int crash_shutdown, int secondary) { xics_kexec_teardown_cpu(secondary); /* Return secondary CPUs to firmware on OPAL v3 */ if (firmware_has_feature(FW_FEATURE_OPALv3) && secondary) { mb(); get_paca()->kexec_state = KEXEC_STATE_REAL_MODE; mb(); /* Return the CPU to OPAL */ opal_return_cpu(); } }