Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mfashe...
[pandora-kernel.git] / arch / cris / arch-v32 / kernel / smp.c
index 464ecae..952a24b 100644 (file)
@@ -1,11 +1,12 @@
+#include <linux/types.h>
 #include <asm/delay.h>
-#include <asm/arch/irq.h>
-#include <asm/arch/hwregs/intr_vect.h>
-#include <asm/arch/hwregs/intr_vect_defs.h>
+#include <irq.h>
+#include <hwregs/intr_vect.h>
+#include <hwregs/intr_vect_defs.h>
 #include <asm/tlbflush.h>
 #include <asm/mmu_context.h>
-#include <asm/arch/hwregs/mmu_defs_asm.h>
-#include <asm/arch/hwregs/supp_reg.h>
+#include <hwregs/asm/mmu_defs_asm.h>
+#include <hwregs/supp_reg.h>
 #include <asm/atomic.h>
 
 #include <linux/err.h>
@@ -20,6 +21,7 @@
 #define IPI_SCHEDULE 1
 #define IPI_CALL 2
 #define IPI_FLUSH_TLB 4
+#define IPI_BOOT 8
 
 #define FLUSH_ALL (void*)0xffffffff
 
@@ -28,7 +30,10 @@ spinlock_t cris_atomic_locks[] = { [0 ... LOCK_COUNT - 1] = SPIN_LOCK_UNLOCKED};
 
 /* CPU masks */
 cpumask_t cpu_online_map = CPU_MASK_NONE;
+EXPORT_SYMBOL(cpu_online_map);
 cpumask_t phys_cpu_present_map = CPU_MASK_NONE;
+cpumask_t cpu_possible_map;
+EXPORT_SYMBOL(cpu_possible_map);
 EXPORT_SYMBOL(phys_cpu_present_map);
 
 /* Variables used during SMP boot */
@@ -54,16 +59,19 @@ static unsigned long flush_addr;
 extern int setup_irq(int, struct irqaction *);
 
 /* Mode registers */
-static unsigned long irq_regs[NR_CPUS] =
-{
+static unsigned long irq_regs[NR_CPUS] = {
   regi_irq,
   regi_irq2
 };
 
-static irqreturn_t crisv32_ipi_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+static irqreturn_t crisv32_ipi_interrupt(int irq, void *dev_id);
 static int send_ipi(int vector, int wait, cpumask_t cpu_mask);
-static struct irqaction irq_ipi  = { crisv32_ipi_interrupt, IRQF_DISABLED,
-                                     CPU_MASK_NONE, "ipi", NULL, NULL};
+static struct irqaction irq_ipi  = {
+       .handler = crisv32_ipi_interrupt,
+       .flags = IRQF_DISABLED,
+       .mask = CPU_MASK_NONE,
+       .name = "ipi",
+};
 
 extern void cris_mmu_init(void);
 extern void cris_timer_init(void);
@@ -96,6 +104,7 @@ void __devinit smp_prepare_boot_cpu(void)
 
        cpu_set(0, cpu_online_map);
        cpu_set(0, phys_cpu_present_map);
+       cpu_set(0, cpu_possible_map);
 }
 
 void __init smp_cpus_done(unsigned int max_cpus)
@@ -108,6 +117,7 @@ smp_boot_one_cpu(int cpuid)
 {
        unsigned timeout;
        struct task_struct *idle;
+       cpumask_t cpu_mask = CPU_MASK_NONE;
 
        idle = fork_idle(cpuid);
        if (IS_ERR(idle))
@@ -119,6 +129,12 @@ smp_boot_one_cpu(int cpuid)
        smp_init_current_idle_thread = task_thread_info(idle);
        cpu_now_booting = cpuid;
 
+       /* Kick it */
+       cpu_set(cpuid, cpu_online_map);
+       cpu_set(cpuid, cpu_mask);
+       send_ipi(IPI_BOOT, 0, cpu_mask);
+       cpu_clear(cpuid, cpu_online_map);
+
        /* Wait for CPU to come online */
        for (timeout = 0; timeout < 10000; timeout++) {
                if(cpu_online(cpuid)) {
@@ -137,7 +153,7 @@ smp_boot_one_cpu(int cpuid)
        return -1;
 }
 
-/* Secondary CPUs starts uing C here. Here we need to setup CPU
+/* Secondary CPUs starts using C here. Here we need to setup CPU
  * specific stuff such as the local timer and the MMU. */
 void __init smp_callin(void)
 {
@@ -160,7 +176,7 @@ void __init smp_callin(void)
        /* Enable IRQ and idle */
        REG_WR(intr_vect, irq_regs[cpu], rw_mask, vect_mask);
        unmask_irq(IPI_INTR_VECT);
-       unmask_irq(TIMER_INTR_VECT);
+       unmask_irq(TIMER0_INTR_VECT);
        preempt_disable();
        local_irq_enable();
 
@@ -178,7 +194,7 @@ void stop_this_cpu(void* dummy)
 /* Other calls */
 void smp_send_stop(void)
 {
-       smp_call_function(stop_this_cpu, NULL, 1, 0);
+       smp_call_function(stop_this_cpu, NULL, 0);
 }
 
 int setup_profiling_timer(unsigned int multiplier)
@@ -194,7 +210,7 @@ int setup_profiling_timer(unsigned int multiplier)
  */
 unsigned long cache_decay_ticks = 1;
 
-int __devinit __cpu_up(unsigned int cpu)
+int __cpuinit __cpu_up(unsigned int cpu)
 {
        smp_boot_one_cpu(cpu);
        return cpu_online(cpu) ? 0 : -ENOSYS;
@@ -300,8 +316,7 @@ int send_ipi(int vector, int wait, cpumask_t cpu_mask)
  * You must not call this function with disabled interrupts or from a
  * hardware interrupt handler or from a bottom half handler.
  */
-int smp_call_function(void (*func)(void *info), void *info,
-                     int nonatomic, int wait)
+int smp_call_function(void (*func)(void *info), void *info, int wait)
 {
        cpumask_t cpu_mask = CPU_MASK_ALL;
        struct call_data_struct data;
@@ -323,7 +338,7 @@ int smp_call_function(void (*func)(void *info), void *info,
        return ret;
 }
 
-irqreturn_t crisv32_ipi_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+irqreturn_t crisv32_ipi_interrupt(int irq, void *dev_id)
 {
        void (*func) (void *info) = call_data->func;
        void *info = call_data->info;