Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b8f51021 authored by Michael Ellerman's avatar Michael Ellerman
Browse files

powerpc: Implement smp_release_cpus() in C not asm



There's no reason for smp_release_cpus() to be asm, and most people can make
more sense of C code. Add an extern declaration to smp.h and remove the custom
one in machine_kexec.c

Signed-off-by: default avatarMichael Ellerman <michael@ellerman.id.au>

Signed-off-by: default avatarStephen Rothwell <sfr@canb.auug.org.au>
parent 40765d2b
Loading
Loading
Loading
Loading
+0 −18
Original line number Diff line number Diff line
@@ -1914,24 +1914,6 @@ _GLOBAL(hmt_start_secondary)
	blr
#endif

#if defined(CONFIG_KEXEC) || defined(CONFIG_SMP)
_GLOBAL(smp_release_cpus)
	/* All secondary cpus are spinning on a common
	 * spinloop, release them all now so they can start
	 * to spin on their individual paca spinloops.
	 * For non SMP kernels, the secondary cpus never
	 * get out of the common spinloop.
	 * XXX This does nothing useful on iSeries, secondaries are
	 * already waiting on their paca.
	 */
	li	r3,1
	LOADADDR(r5,__secondary_hold_spinloop)
	std	r3,0(r5)
	sync
	blr
#endif /* CONFIG_SMP */


/*
 * We put a few things here that have to be page-aligned.
 * This stuff goes at the beginning of the bss, which is page-aligned.
+21 −2
Original line number Diff line number Diff line
@@ -103,8 +103,6 @@ extern void htab_initialize(void);
extern void early_init_devtree(void *flat_dt);
extern void unflatten_device_tree(void);

extern void smp_release_cpus(void);

int have_of = 1;
int boot_cpuid = 0;
int boot_cpuid_phys = 0;
@@ -400,6 +398,27 @@ void __init early_setup(unsigned long dt_ptr)
}


#if defined(CONFIG_SMP) || defined(CONFIG_KEXEC)
void smp_release_cpus(void)
{
	extern unsigned long __secondary_hold_spinloop;

	DBG(" -> smp_release_cpus()\n");

	/* All secondary cpus are spinning on a common spinloop, release them
	 * all now so they can start to spin on their individual paca
	 * spinloops. For non SMP kernels, the secondary cpus never get out
	 * of the common spinloop.
	 * This is useless but harmless on iSeries, secondaries are already
	 * waiting on their paca spinloops. */

	__secondary_hold_spinloop = 1;
	mb();

	DBG(" <- smp_release_cpus()\n");
}
#endif /* CONFIG_SMP || CONFIG_KEXEC */

/*
 * Initialize some remaining members of the ppc64_caches and systemcfg structures
 * (at least until we get rid of them completely). This is mostly some
+0 −18
Original line number Diff line number Diff line
@@ -1914,24 +1914,6 @@ _GLOBAL(hmt_start_secondary)
	blr
#endif

#if defined(CONFIG_KEXEC) || defined(CONFIG_SMP)
_GLOBAL(smp_release_cpus)
	/* All secondary cpus are spinning on a common
	 * spinloop, release them all now so they can start
	 * to spin on their individual paca spinloops.
	 * For non SMP kernels, the secondary cpus never
	 * get out of the common spinloop.
	 * XXX This does nothing useful on iSeries, secondaries are
	 * already waiting on their paca.
	 */
	li	r3,1
	LOADADDR(r5,__secondary_hold_spinloop)
	std	r3,0(r5)
	sync
	blr
#endif /* CONFIG_SMP */


/*
 * We put a few things here that have to be page-aligned.
 * This stuff goes at the beginning of the bss, which is page-aligned.
+0 −1
Original line number Diff line number Diff line
@@ -244,7 +244,6 @@ static void kexec_prepare_cpus(void)

static void kexec_prepare_cpus(void)
{
	extern void smp_release_cpus(void);
	/*
	 * move the secondarys to us so that we can copy
	 * the new kernel 0-0x100 safely
+1 −0
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@ extern int smt_enabled_at_boot;
extern int smp_mpic_probe(void);
extern void smp_mpic_setup_cpu(int cpu);
extern void smp_generic_kick_cpu(int nr);
extern void smp_release_cpus(void);

extern void smp_generic_give_timebase(void);
extern void smp_generic_take_timebase(void);