Commit 339a3293 authored by Nicholas Piggin's avatar Nicholas Piggin Committed by Michael Ellerman

powerpc/powernv: Avoid waiting for secondary hold spinloop with OPAL

OPAL boot does not insert secondaries at 0x60 to wait at the secondary
hold spinloop. Instead they are started later, and inserted at
generic_secondary_smp_init(), which is after the secondary hold
spinloop.

Avoid waiting on this spinloop when booting with OPAL firmware. This
wait always times out that case.

This saves 100ms boot time on powernv, and 10s of seconds of real time
when booting on the simulator in SMP.
Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 0b2f5a8a
...@@ -55,12 +55,18 @@ ...@@ -55,12 +55,18 @@
* *
* For pSeries or server processors: * For pSeries or server processors:
* 1. The MMU is off & open firmware is running in real mode. * 1. The MMU is off & open firmware is running in real mode.
* 2. The kernel is entered at __start * 2. The primary CPU enters at __start.
* 3. If the RTAS supports "query-cpu-stopped-state", then secondary
* CPUs will enter as directed by "start-cpu" RTAS call, which is
* generic_secondary_smp_init, with PIR in r3.
* 4. Else the secondary CPUs will enter at secondary_hold (0x60) as
* directed by the "start-cpu" RTS call, with PIR in r3.
* -or- For OPAL entry: * -or- For OPAL entry:
* 1. The MMU is off, processor in HV mode, primary CPU enters at 0 * 1. The MMU is off, processor in HV mode.
* with device-tree in gpr3. We also get OPAL base in r8 and * 2. The primary CPU enters at 0 with device-tree in r3, OPAL base
* entry in r9 for debugging purposes * in r8, and entry in r9 for debugging purposes.
* 2. Secondary processors enter at 0x60 with PIR in gpr3 * 3. Secondary CPUs enter as directed by OPAL_START_CPU call, which
* is at generic_secondary_smp_init, with PIR in r3.
* *
* For Book3E processors: * For Book3E processors:
* 1. The MMU is on running in AS0 in a state defined in ePAPR * 1. The MMU is on running in AS0 in a state defined in ePAPR
......
...@@ -360,8 +360,16 @@ void early_setup_secondary(void) ...@@ -360,8 +360,16 @@ void early_setup_secondary(void)
#if defined(CONFIG_SMP) || defined(CONFIG_KEXEC_CORE) #if defined(CONFIG_SMP) || defined(CONFIG_KEXEC_CORE)
static bool use_spinloop(void) static bool use_spinloop(void)
{ {
if (!IS_ENABLED(CONFIG_PPC_BOOK3E)) if (IS_ENABLED(CONFIG_PPC_BOOK3S)) {
/*
* See comments in head_64.S -- not all platforms insert
* secondaries at __secondary_hold and wait at the spin
* loop.
*/
if (firmware_has_feature(FW_FEATURE_OPAL))
return false;
return true; return true;
}
/* /*
* When book3e boots from kexec, the ePAPR spin table does * When book3e boots from kexec, the ePAPR spin table does
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment