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

Commit 563fdd4a authored by Kumar Gala's avatar Kumar Gala
Browse files

powerpc/85xx: Update smp support to handle doorbells and non-mpic init



Use device tree to determine if we actually have an MPIC and use
CPU feature to decide if we should use doorbells for IPIs.

Signed-off-by: default avatarKumar Gala <galak@kernel.crashing.org>
parent 1a3d1fc2
Loading
Loading
Loading
Loading
+35 −8
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@
#include <asm/page.h>
#include <asm/mpic.h>
#include <asm/cacheflush.h>
#include <asm/dbell.h>

#include <sysdev/fsl_soc.h>

@@ -80,10 +81,8 @@ smp_85xx_kick_cpu(int nr)
}

static void __init
smp_85xx_setup_cpu(int cpu_nr)
smp_85xx_basic_setup(int cpu_nr)
{
	mpic_setup_this_cpu();

	/* Clear any pending timer interrupts */
	mtspr(SPRN_TSR, TSR_ENW | TSR_WIS | TSR_DIS | TSR_FIS);

@@ -91,15 +90,43 @@ smp_85xx_setup_cpu(int cpu_nr)
	mtspr(SPRN_TCR, TCR_DIE);
}

static void __init
smp_85xx_setup_cpu(int cpu_nr)
{
	mpic_setup_this_cpu();

	smp_85xx_basic_setup(cpu_nr);
}

struct smp_ops_t smp_85xx_ops = {
	.message_pass = smp_mpic_message_pass,
	.probe = smp_mpic_probe,
	.kick_cpu = smp_85xx_kick_cpu,
	.setup_cpu = smp_85xx_setup_cpu,
};

void __init
mpc85xx_smp_init(void)
static int __init smp_dummy_probe(void)
{
	return NR_CPUS;
}

void __init mpc85xx_smp_init(void)
{
	struct device_node *np;

	smp_85xx_ops.message_pass = NULL;

	np = of_find_node_by_type(NULL, "open-pic");
	if (np) {
		smp_85xx_ops.probe = smp_mpic_probe;
		smp_85xx_ops.setup_cpu = smp_85xx_setup_cpu;
		smp_85xx_ops.message_pass = smp_mpic_message_pass;
	} else {
		smp_85xx_ops.probe = smp_dummy_probe;
		smp_85xx_ops.setup_cpu = smp_85xx_basic_setup;
	}

	if (cpu_has_feature(CPU_FTR_DBELL))
		smp_85xx_ops.message_pass = smp_dbell_message_pass;

	BUG_ON(!smp_85xx_ops.message_pass);

	smp_ops = &smp_85xx_ops;
}