forked from Minki/linux
c4007a2fbf
Several platforms use their own copy of what is essentially the same code, using RTAS to synchronize the timebases when bringing up new CPUs. This moves it all into a single common implementation and additionally turns the spinlock into a raw spinlock since the former can rely on the timebase not being frozen when spinlock debugging is enabled, and finally masks interrupts while the timebase is disabled. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
53 lines
1.2 KiB
C
53 lines
1.2 KiB
C
/*
|
|
* Smp support for CHRP machines.
|
|
*
|
|
* Written by Cort Dougan (cort@cs.nmt.edu) borrowing a great
|
|
* deal of code from the sparc and intel versions.
|
|
*
|
|
* Copyright (C) 1999 Cort Dougan <cort@cs.nmt.edu>
|
|
*
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/sched.h>
|
|
#include <linux/smp.h>
|
|
#include <linux/interrupt.h>
|
|
#include <linux/kernel_stat.h>
|
|
#include <linux/delay.h>
|
|
#include <linux/init.h>
|
|
#include <linux/spinlock.h>
|
|
|
|
#include <asm/ptrace.h>
|
|
#include <asm/atomic.h>
|
|
#include <asm/irq.h>
|
|
#include <asm/page.h>
|
|
#include <asm/pgtable.h>
|
|
#include <asm/sections.h>
|
|
#include <asm/io.h>
|
|
#include <asm/prom.h>
|
|
#include <asm/smp.h>
|
|
#include <asm/machdep.h>
|
|
#include <asm/mpic.h>
|
|
#include <asm/rtas.h>
|
|
|
|
static void __devinit smp_chrp_kick_cpu(int nr)
|
|
{
|
|
*(unsigned long *)KERNELBASE = nr;
|
|
asm volatile("dcbf 0,%0"::"r"(KERNELBASE):"memory");
|
|
}
|
|
|
|
static void __devinit smp_chrp_setup_cpu(int cpu_nr)
|
|
{
|
|
mpic_setup_this_cpu();
|
|
}
|
|
|
|
/* CHRP with openpic */
|
|
struct smp_ops_t chrp_smp_ops = {
|
|
.message_pass = smp_mpic_message_pass,
|
|
.probe = smp_mpic_probe,
|
|
.kick_cpu = smp_chrp_kick_cpu,
|
|
.setup_cpu = smp_chrp_setup_cpu,
|
|
.give_timebase = rtas_give_timebase,
|
|
.take_timebase = rtas_take_timebase,
|
|
};
|