diff options
Diffstat (limited to 'arch/mips/kernel')
26 files changed, 115 insertions, 102 deletions
diff --git a/arch/mips/kernel/binfmt_elfo32.c b/arch/mips/kernel/binfmt_elfo32.c index e1333d7319e2..ff448233dab5 100644 --- a/arch/mips/kernel/binfmt_elfo32.c +++ b/arch/mips/kernel/binfmt_elfo32.c | |||
| @@ -53,6 +53,23 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; | |||
| 53 | #define ELF_ET_DYN_BASE (TASK32_SIZE / 3 * 2) | 53 | #define ELF_ET_DYN_BASE (TASK32_SIZE / 3 * 2) |
| 54 | 54 | ||
| 55 | #include <asm/processor.h> | 55 | #include <asm/processor.h> |
| 56 | |||
| 57 | /* | ||
| 58 | * When this file is selected, we are definitely running a 64bit kernel. | ||
| 59 | * So using the right regs define in asm/reg.h | ||
| 60 | */ | ||
| 61 | #define WANT_COMPAT_REG_H | ||
| 62 | |||
| 63 | /* These MUST be defined before elf.h gets included */ | ||
| 64 | extern void elf32_core_copy_regs(elf_gregset_t grp, struct pt_regs *regs); | ||
| 65 | #define ELF_CORE_COPY_REGS(_dest, _regs) elf32_core_copy_regs(_dest, _regs); | ||
| 66 | #define ELF_CORE_COPY_TASK_REGS(_tsk, _dest) \ | ||
| 67 | ({ \ | ||
| 68 | int __res = 1; \ | ||
| 69 | elf32_core_copy_regs(*(_dest), task_pt_regs(_tsk)); \ | ||
| 70 | __res; \ | ||
| 71 | }) | ||
| 72 | |||
| 56 | #include <linux/module.h> | 73 | #include <linux/module.h> |
| 57 | #include <linux/elfcore.h> | 74 | #include <linux/elfcore.h> |
| 58 | #include <linux/compat.h> | 75 | #include <linux/compat.h> |
| @@ -110,9 +127,6 @@ jiffies_to_compat_timeval(unsigned long jiffies, struct compat_timeval *value) | |||
| 110 | value->tv_usec = rem / NSEC_PER_USEC; | 127 | value->tv_usec = rem / NSEC_PER_USEC; |
| 111 | } | 128 | } |
| 112 | 129 | ||
| 113 | #undef ELF_CORE_COPY_REGS | ||
| 114 | #define ELF_CORE_COPY_REGS(_dest, _regs) elf32_core_copy_regs(_dest, _regs); | ||
| 115 | |||
| 116 | void elf32_core_copy_regs(elf_gregset_t grp, struct pt_regs *regs) | 130 | void elf32_core_copy_regs(elf_gregset_t grp, struct pt_regs *regs) |
| 117 | { | 131 | { |
| 118 | int i; | 132 | int i; |
diff --git a/arch/mips/kernel/cevt-bcm1480.c b/arch/mips/kernel/cevt-bcm1480.c index a5182a207696..e02f79b1eb51 100644 --- a/arch/mips/kernel/cevt-bcm1480.c +++ b/arch/mips/kernel/cevt-bcm1480.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <linux/clockchips.h> | 18 | #include <linux/clockchips.h> |
| 19 | #include <linux/interrupt.h> | 19 | #include <linux/interrupt.h> |
| 20 | #include <linux/percpu.h> | 20 | #include <linux/percpu.h> |
| 21 | #include <linux/smp.h> | ||
| 21 | 22 | ||
| 22 | #include <asm/addrspace.h> | 23 | #include <asm/addrspace.h> |
| 23 | #include <asm/io.h> | 24 | #include <asm/io.h> |
diff --git a/arch/mips/kernel/cevt-ds1287.c b/arch/mips/kernel/cevt-ds1287.c index 1ada45ea0700..6996da4d74a2 100644 --- a/arch/mips/kernel/cevt-ds1287.c +++ b/arch/mips/kernel/cevt-ds1287.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * DS1287 clockevent driver | 2 | * DS1287 clockevent driver |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2008 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2008 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/kernel/cevt-gt641xx.c b/arch/mips/kernel/cevt-gt641xx.c index e9b787feedcb..92351e00ae0e 100644 --- a/arch/mips/kernel/cevt-gt641xx.c +++ b/arch/mips/kernel/cevt-gt641xx.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * GT641xx clockevent routines. | 2 | * GT641xx clockevent routines. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2007 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/kernel/cevt-r4k.c b/arch/mips/kernel/cevt-r4k.c index 0015e442572b..2652362ce047 100644 --- a/arch/mips/kernel/cevt-r4k.c +++ b/arch/mips/kernel/cevt-r4k.c | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | #include <linux/clockchips.h> | 9 | #include <linux/clockchips.h> |
| 10 | #include <linux/interrupt.h> | 10 | #include <linux/interrupt.h> |
| 11 | #include <linux/percpu.h> | 11 | #include <linux/percpu.h> |
| 12 | #include <linux/smp.h> | ||
| 12 | 13 | ||
| 13 | #include <asm/smtc_ipi.h> | 14 | #include <asm/smtc_ipi.h> |
| 14 | #include <asm/time.h> | 15 | #include <asm/time.h> |
diff --git a/arch/mips/kernel/cevt-sb1250.c b/arch/mips/kernel/cevt-sb1250.c index 340f53e5c6b1..ac5903d1b20e 100644 --- a/arch/mips/kernel/cevt-sb1250.c +++ b/arch/mips/kernel/cevt-sb1250.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <linux/clockchips.h> | 18 | #include <linux/clockchips.h> |
| 19 | #include <linux/interrupt.h> | 19 | #include <linux/interrupt.h> |
| 20 | #include <linux/percpu.h> | 20 | #include <linux/percpu.h> |
| 21 | #include <linux/smp.h> | ||
| 21 | 22 | ||
| 22 | #include <asm/addrspace.h> | 23 | #include <asm/addrspace.h> |
| 23 | #include <asm/io.h> | 24 | #include <asm/io.h> |
diff --git a/arch/mips/kernel/cevt-smtc.c b/arch/mips/kernel/cevt-smtc.c index df6f5bc60572..98bd7de75778 100644 --- a/arch/mips/kernel/cevt-smtc.c +++ b/arch/mips/kernel/cevt-smtc.c | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #include <linux/clockchips.h> | 10 | #include <linux/clockchips.h> |
| 11 | #include <linux/interrupt.h> | 11 | #include <linux/interrupt.h> |
| 12 | #include <linux/percpu.h> | 12 | #include <linux/percpu.h> |
| 13 | #include <linux/smp.h> | ||
| 13 | 14 | ||
| 14 | #include <asm/smtc_ipi.h> | 15 | #include <asm/smtc_ipi.h> |
| 15 | #include <asm/time.h> | 16 | #include <asm/time.h> |
diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c index b13b8eb30596..1abe9905c9c1 100644 --- a/arch/mips/kernel/cpu-probe.c +++ b/arch/mips/kernel/cpu-probe.c | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
| 15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
| 16 | #include <linux/ptrace.h> | 16 | #include <linux/ptrace.h> |
| 17 | #include <linux/smp.h> | ||
| 17 | #include <linux/stddef.h> | 18 | #include <linux/stddef.h> |
| 18 | 19 | ||
| 19 | #include <asm/bugs.h> | 20 | #include <asm/bugs.h> |
diff --git a/arch/mips/kernel/csrc-ioasic.c b/arch/mips/kernel/csrc-ioasic.c index b551f48d3a07..23da108506b0 100644 --- a/arch/mips/kernel/csrc-ioasic.c +++ b/arch/mips/kernel/csrc-ioasic.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * DEC I/O ASIC's counter clocksource | 2 | * DEC I/O ASIC's counter clocksource |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2008 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2008 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/kernel/i8253.c b/arch/mips/kernel/i8253.c index ed20e7fe65e3..f7d8d5d0ddbf 100644 --- a/arch/mips/kernel/i8253.c +++ b/arch/mips/kernel/i8253.c | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | #include <linux/interrupt.h> | 7 | #include <linux/interrupt.h> |
| 8 | #include <linux/jiffies.h> | 8 | #include <linux/jiffies.h> |
| 9 | #include <linux/module.h> | 9 | #include <linux/module.h> |
| 10 | #include <linux/smp.h> | ||
| 10 | #include <linux/spinlock.h> | 11 | #include <linux/spinlock.h> |
| 11 | 12 | ||
| 12 | #include <asm/delay.h> | 13 | #include <asm/delay.h> |
diff --git a/arch/mips/kernel/irq-gic.c b/arch/mips/kernel/irq-gic.c index 3f43c2e3aa5a..d2072cd38592 100644 --- a/arch/mips/kernel/irq-gic.c +++ b/arch/mips/kernel/irq-gic.c | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | 2 | ||
| 3 | #include <linux/bitmap.h> | 3 | #include <linux/bitmap.h> |
| 4 | #include <linux/init.h> | 4 | #include <linux/init.h> |
| 5 | #include <linux/smp.h> | ||
| 5 | 6 | ||
| 6 | #include <asm/io.h> | 7 | #include <asm/io.h> |
| 7 | #include <asm/gic.h> | 8 | #include <asm/gic.h> |
| @@ -106,9 +107,7 @@ static unsigned int gic_irq_startup(unsigned int irq) | |||
| 106 | { | 107 | { |
| 107 | pr_debug("CPU%d: %s: irq%d\n", smp_processor_id(), __func__, irq); | 108 | pr_debug("CPU%d: %s: irq%d\n", smp_processor_id(), __func__, irq); |
| 108 | irq -= _irqbase; | 109 | irq -= _irqbase; |
| 109 | /* FIXME: this is wrong for !GICISWORDLITTLEENDIAN */ | 110 | GIC_SET_INTR_MASK(irq, 1); |
| 110 | GICWRITE(GIC_REG_ADDR(SHARED, (GIC_SH_SMASK_31_0_OFS + (irq / 32))), | ||
| 111 | 1 << (irq % 32)); | ||
| 112 | return 0; | 111 | return 0; |
| 113 | } | 112 | } |
| 114 | 113 | ||
| @@ -119,8 +118,7 @@ static void gic_irq_ack(unsigned int irq) | |||
| 119 | #endif | 118 | #endif |
| 120 | pr_debug("CPU%d: %s: irq%d\n", smp_processor_id(), __func__, irq); | 119 | pr_debug("CPU%d: %s: irq%d\n", smp_processor_id(), __func__, irq); |
| 121 | irq -= _irqbase; | 120 | irq -= _irqbase; |
| 122 | GICWRITE(GIC_REG_ADDR(SHARED, (GIC_SH_RMASK_31_0_OFS + (irq / 32))), | 121 | GIC_CLR_INTR_MASK(irq, 1); |
| 123 | 1 << (irq % 32)); | ||
| 124 | 122 | ||
| 125 | if (_intrmap[irq].trigtype == GIC_TRIG_EDGE) { | 123 | if (_intrmap[irq].trigtype == GIC_TRIG_EDGE) { |
| 126 | if (!gic_wedgeb2bok) | 124 | if (!gic_wedgeb2bok) |
| @@ -137,18 +135,14 @@ static void gic_mask_irq(unsigned int irq) | |||
| 137 | { | 135 | { |
| 138 | pr_debug("CPU%d: %s: irq%d\n", smp_processor_id(), __func__, irq); | 136 | pr_debug("CPU%d: %s: irq%d\n", smp_processor_id(), __func__, irq); |
| 139 | irq -= _irqbase; | 137 | irq -= _irqbase; |
| 140 | /* FIXME: this is wrong for !GICISWORDLITTLEENDIAN */ | 138 | GIC_CLR_INTR_MASK(irq, 1); |
| 141 | GICWRITE(GIC_REG_ADDR(SHARED, (GIC_SH_RMASK_31_0_OFS + (irq / 32))), | ||
| 142 | 1 << (irq % 32)); | ||
| 143 | } | 139 | } |
| 144 | 140 | ||
| 145 | static void gic_unmask_irq(unsigned int irq) | 141 | static void gic_unmask_irq(unsigned int irq) |
| 146 | { | 142 | { |
| 147 | pr_debug("CPU%d: %s: irq%d\n", smp_processor_id(), __func__, irq); | 143 | pr_debug("CPU%d: %s: irq%d\n", smp_processor_id(), __func__, irq); |
| 148 | irq -= _irqbase; | 144 | irq -= _irqbase; |
| 149 | /* FIXME: this is wrong for !GICISWORDLITTLEENDIAN */ | 145 | GIC_SET_INTR_MASK(irq, 1); |
| 150 | GICWRITE(GIC_REG_ADDR(SHARED, (GIC_SH_SMASK_31_0_OFS + (irq / 32))), | ||
| 151 | 1 << (irq % 32)); | ||
| 152 | } | 146 | } |
| 153 | 147 | ||
| 154 | #ifdef CONFIG_SMP | 148 | #ifdef CONFIG_SMP |
| @@ -253,6 +247,10 @@ static void __init gic_basic_init(void) | |||
| 253 | if (cpu == X) | 247 | if (cpu == X) |
| 254 | continue; | 248 | continue; |
| 255 | 249 | ||
| 250 | if (cpu == 0 && i != 0 && _intrmap[i].intrnum == 0 && | ||
| 251 | _intrmap[i].ipiflag == 0) | ||
| 252 | continue; | ||
| 253 | |||
| 256 | setup_intr(_intrmap[i].intrnum, | 254 | setup_intr(_intrmap[i].intrnum, |
| 257 | _intrmap[i].cpunum, | 255 | _intrmap[i].cpunum, |
| 258 | _intrmap[i].pin, | 256 | _intrmap[i].pin, |
diff --git a/arch/mips/kernel/irq-gt641xx.c b/arch/mips/kernel/irq-gt641xx.c index 1b81b131f43c..ebcc5f7ad9c2 100644 --- a/arch/mips/kernel/irq-gt641xx.c +++ b/arch/mips/kernel/irq-gt641xx.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * GT641xx IRQ routines. | 2 | * GT641xx IRQ routines. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 4 | * Copyright (C) 2007 Yoichi Yuasa <yuasa@linux-mips.org> |
| 5 | * | 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
diff --git a/arch/mips/kernel/kgdb.c b/arch/mips/kernel/kgdb.c index 6e152c80cd4a..50c9bb880667 100644 --- a/arch/mips/kernel/kgdb.c +++ b/arch/mips/kernel/kgdb.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <linux/kgdb.h> | 26 | #include <linux/kgdb.h> |
| 27 | #include <linux/kdebug.h> | 27 | #include <linux/kdebug.h> |
| 28 | #include <linux/sched.h> | 28 | #include <linux/sched.h> |
| 29 | #include <linux/smp.h> | ||
| 29 | #include <asm/inst.h> | 30 | #include <asm/inst.h> |
| 30 | #include <asm/fpu.h> | 31 | #include <asm/fpu.h> |
| 31 | #include <asm/cacheflush.h> | 32 | #include <asm/cacheflush.h> |
diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c index 1eaaa450e20c..c09d681b7181 100644 --- a/arch/mips/kernel/process.c +++ b/arch/mips/kernel/process.c | |||
| @@ -50,10 +50,15 @@ | |||
| 50 | */ | 50 | */ |
| 51 | void __noreturn cpu_idle(void) | 51 | void __noreturn cpu_idle(void) |
| 52 | { | 52 | { |
| 53 | int cpu; | ||
| 54 | |||
| 55 | /* CPU is going idle. */ | ||
| 56 | cpu = smp_processor_id(); | ||
| 57 | |||
| 53 | /* endless idle loop with no priority at all */ | 58 | /* endless idle loop with no priority at all */ |
| 54 | while (1) { | 59 | while (1) { |
| 55 | tick_nohz_stop_sched_tick(1); | 60 | tick_nohz_stop_sched_tick(1); |
| 56 | while (!need_resched()) { | 61 | while (!need_resched() && cpu_online(cpu)) { |
| 57 | #ifdef CONFIG_MIPS_MT_SMTC | 62 | #ifdef CONFIG_MIPS_MT_SMTC |
| 58 | extern void smtc_idle_loop_hook(void); | 63 | extern void smtc_idle_loop_hook(void); |
| 59 | 64 | ||
| @@ -62,6 +67,12 @@ void __noreturn cpu_idle(void) | |||
| 62 | if (cpu_wait) | 67 | if (cpu_wait) |
| 63 | (*cpu_wait)(); | 68 | (*cpu_wait)(); |
| 64 | } | 69 | } |
| 70 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 71 | if (!cpu_online(cpu) && !cpu_isset(cpu, cpu_callin_map) && | ||
| 72 | (system_state == SYSTEM_RUNNING || | ||
| 73 | system_state == SYSTEM_BOOTING)) | ||
| 74 | play_dead(); | ||
| 75 | #endif | ||
| 65 | tick_nohz_restart_sched_tick(); | 76 | tick_nohz_restart_sched_tick(); |
| 66 | preempt_enable_no_resched(); | 77 | preempt_enable_no_resched(); |
| 67 | schedule(); | 78 | schedule(); |
diff --git a/arch/mips/kernel/ptrace32.c b/arch/mips/kernel/ptrace32.c index c4f9ac17474a..32644b4a0714 100644 --- a/arch/mips/kernel/ptrace32.c +++ b/arch/mips/kernel/ptrace32.c | |||
| @@ -22,7 +22,6 @@ | |||
| 22 | #include <linux/errno.h> | 22 | #include <linux/errno.h> |
| 23 | #include <linux/ptrace.h> | 23 | #include <linux/ptrace.h> |
| 24 | #include <linux/smp.h> | 24 | #include <linux/smp.h> |
| 25 | #include <linux/smp_lock.h> | ||
| 26 | #include <linux/user.h> | 25 | #include <linux/user.h> |
| 27 | #include <linux/security.h> | 26 | #include <linux/security.h> |
| 28 | 27 | ||
diff --git a/arch/mips/kernel/scall32-o32.S b/arch/mips/kernel/scall32-o32.S index 0b31b9bda048..20a86e08fd58 100644 --- a/arch/mips/kernel/scall32-o32.S +++ b/arch/mips/kernel/scall32-o32.S | |||
| @@ -652,6 +652,8 @@ einval: li v0, -ENOSYS | |||
| 652 | sys sys_inotify_init1 1 | 652 | sys sys_inotify_init1 1 |
| 653 | sys sys_preadv 6 /* 4330 */ | 653 | sys sys_preadv 6 /* 4330 */ |
| 654 | sys sys_pwritev 6 | 654 | sys sys_pwritev 6 |
| 655 | sys sys_rt_tgsigqueueinfo 4 | ||
| 656 | sys sys_perf_counter_open 5 | ||
| 655 | .endm | 657 | .endm |
| 656 | 658 | ||
| 657 | /* We pre-compute the number of _instruction_ bytes needed to | 659 | /* We pre-compute the number of _instruction_ bytes needed to |
diff --git a/arch/mips/kernel/scall64-64.S b/arch/mips/kernel/scall64-64.S index c647fd6e722f..b046130d4c5d 100644 --- a/arch/mips/kernel/scall64-64.S +++ b/arch/mips/kernel/scall64-64.S | |||
| @@ -489,4 +489,6 @@ sys_call_table: | |||
| 489 | PTR sys_inotify_init1 | 489 | PTR sys_inotify_init1 |
| 490 | PTR sys_preadv | 490 | PTR sys_preadv |
| 491 | PTR sys_pwritev /* 5390 */ | 491 | PTR sys_pwritev /* 5390 */ |
| 492 | PTR sys_rt_tgsigqueueinfo | ||
| 493 | PTR sys_perf_counter_open | ||
| 492 | .size sys_call_table,.-sys_call_table | 494 | .size sys_call_table,.-sys_call_table |
diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index 93cc672f4522..15874f9812cc 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S | |||
| @@ -415,4 +415,6 @@ EXPORT(sysn32_call_table) | |||
| 415 | PTR sys_inotify_init1 | 415 | PTR sys_inotify_init1 |
| 416 | PTR sys_preadv | 416 | PTR sys_preadv |
| 417 | PTR sys_pwritev | 417 | PTR sys_pwritev |
| 418 | PTR compat_sys_rt_tgsigqueueinfo /* 5295 */ | ||
| 419 | PTR sys_perf_counter_open | ||
| 418 | .size sysn32_call_table,.-sysn32_call_table | 420 | .size sysn32_call_table,.-sysn32_call_table |
diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S index a5598b2339dd..781e0f1e9533 100644 --- a/arch/mips/kernel/scall64-o32.S +++ b/arch/mips/kernel/scall64-o32.S | |||
| @@ -535,4 +535,6 @@ sys_call_table: | |||
| 535 | PTR sys_inotify_init1 | 535 | PTR sys_inotify_init1 |
| 536 | PTR compat_sys_preadv /* 4330 */ | 536 | PTR compat_sys_preadv /* 4330 */ |
| 537 | PTR compat_sys_pwritev | 537 | PTR compat_sys_pwritev |
| 538 | PTR compat_sys_rt_tgsigqueueinfo | ||
| 539 | PTR sys_perf_counter_open | ||
| 538 | .size sys_call_table,.-sys_call_table | 540 | .size sys_call_table,.-sys_call_table |
diff --git a/arch/mips/kernel/smp-cmp.c b/arch/mips/kernel/smp-cmp.c index f27beca4b26d..ad0ff5dc4d59 100644 --- a/arch/mips/kernel/smp-cmp.c +++ b/arch/mips/kernel/smp-cmp.c | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | 20 | ||
| 21 | #include <linux/kernel.h> | 21 | #include <linux/kernel.h> |
| 22 | #include <linux/sched.h> | 22 | #include <linux/sched.h> |
| 23 | #include <linux/smp.h> | ||
| 23 | #include <linux/cpumask.h> | 24 | #include <linux/cpumask.h> |
| 24 | #include <linux/interrupt.h> | 25 | #include <linux/interrupt.h> |
| 25 | #include <linux/compiler.h> | 26 | #include <linux/compiler.h> |
| @@ -36,80 +37,24 @@ | |||
| 36 | #include <asm/mipsregs.h> | 37 | #include <asm/mipsregs.h> |
| 37 | #include <asm/mipsmtregs.h> | 38 | #include <asm/mipsmtregs.h> |
| 38 | #include <asm/mips_mt.h> | 39 | #include <asm/mips_mt.h> |
| 39 | 40 | #include <asm/amon.h> | |
| 40 | /* | 41 | #include <asm/gic.h> |
| 41 | * Crude manipulation of the CPU masks to control which | ||
| 42 | * which CPU's are brought online during initialisation | ||
| 43 | * | ||
| 44 | * Beware... this needs to be called after CPU discovery | ||
| 45 | * but before CPU bringup | ||
| 46 | */ | ||
| 47 | static int __init allowcpus(char *str) | ||
| 48 | { | ||
| 49 | cpumask_t cpu_allow_map; | ||
| 50 | char buf[256]; | ||
| 51 | int len; | ||
| 52 | |||
| 53 | cpus_clear(cpu_allow_map); | ||
| 54 | if (cpulist_parse(str, &cpu_allow_map) == 0) { | ||
| 55 | cpu_set(0, cpu_allow_map); | ||
| 56 | cpus_and(cpu_possible_map, cpu_possible_map, cpu_allow_map); | ||
| 57 | len = cpulist_scnprintf(buf, sizeof(buf)-1, &cpu_possible_map); | ||
| 58 | buf[len] = '\0'; | ||
| 59 | pr_debug("Allowable CPUs: %s\n", buf); | ||
| 60 | return 1; | ||
| 61 | } else | ||
| 62 | return 0; | ||
| 63 | } | ||
| 64 | __setup("allowcpus=", allowcpus); | ||
| 65 | 42 | ||
| 66 | static void ipi_call_function(unsigned int cpu) | 43 | static void ipi_call_function(unsigned int cpu) |
| 67 | { | 44 | { |
| 68 | unsigned int action = 0; | ||
| 69 | |||
| 70 | pr_debug("CPU%d: %s cpu %d status %08x\n", | 45 | pr_debug("CPU%d: %s cpu %d status %08x\n", |
| 71 | smp_processor_id(), __func__, cpu, read_c0_status()); | 46 | smp_processor_id(), __func__, cpu, read_c0_status()); |
| 72 | 47 | ||
| 73 | switch (cpu) { | 48 | gic_send_ipi(plat_ipi_call_int_xlate(cpu)); |
| 74 | case 0: | ||
| 75 | action = GIC_IPI_EXT_INTR_CALLFNC_VPE0; | ||
| 76 | break; | ||
| 77 | case 1: | ||
| 78 | action = GIC_IPI_EXT_INTR_CALLFNC_VPE1; | ||
| 79 | break; | ||
| 80 | case 2: | ||
| 81 | action = GIC_IPI_EXT_INTR_CALLFNC_VPE2; | ||
| 82 | break; | ||
| 83 | case 3: | ||
| 84 | action = GIC_IPI_EXT_INTR_CALLFNC_VPE3; | ||
| 85 | break; | ||
| 86 | } | ||
| 87 | gic_send_ipi(action); | ||
| 88 | } | 49 | } |
| 89 | 50 | ||
| 90 | 51 | ||
| 91 | static void ipi_resched(unsigned int cpu) | 52 | static void ipi_resched(unsigned int cpu) |
| 92 | { | 53 | { |
| 93 | unsigned int action = 0; | ||
| 94 | |||
| 95 | pr_debug("CPU%d: %s cpu %d status %08x\n", | 54 | pr_debug("CPU%d: %s cpu %d status %08x\n", |
| 96 | smp_processor_id(), __func__, cpu, read_c0_status()); | 55 | smp_processor_id(), __func__, cpu, read_c0_status()); |
| 97 | 56 | ||
| 98 | switch (cpu) { | 57 | gic_send_ipi(plat_ipi_resched_int_xlate(cpu)); |
| 99 | case 0: | ||
| 100 | action = GIC_IPI_EXT_INTR_RESCHED_VPE0; | ||
| 101 | break; | ||
| 102 | case 1: | ||
| 103 | action = GIC_IPI_EXT_INTR_RESCHED_VPE1; | ||
| 104 | break; | ||
| 105 | case 2: | ||
| 106 | action = GIC_IPI_EXT_INTR_RESCHED_VPE2; | ||
| 107 | break; | ||
| 108 | case 3: | ||
| 109 | action = GIC_IPI_EXT_INTR_RESCHED_VPE3; | ||
| 110 | break; | ||
| 111 | } | ||
| 112 | gic_send_ipi(action); | ||
| 113 | } | 58 | } |
| 114 | 59 | ||
| 115 | /* | 60 | /* |
| @@ -205,7 +150,7 @@ static void cmp_boot_secondary(int cpu, struct task_struct *idle) | |||
| 205 | (unsigned long)(gp + sizeof(struct thread_info))); | 150 | (unsigned long)(gp + sizeof(struct thread_info))); |
| 206 | #endif | 151 | #endif |
| 207 | 152 | ||
| 208 | amon_cpu_start(cpu, pc, sp, gp, a0); | 153 | amon_cpu_start(cpu, pc, sp, (unsigned long)gp, a0); |
| 209 | } | 154 | } |
| 210 | 155 | ||
| 211 | /* | 156 | /* |
diff --git a/arch/mips/kernel/smp-up.c b/arch/mips/kernel/smp-up.c index 878e3733bbb2..2508d55d68fd 100644 --- a/arch/mips/kernel/smp-up.c +++ b/arch/mips/kernel/smp-up.c | |||
| @@ -55,6 +55,18 @@ static void __init up_prepare_cpus(unsigned int max_cpus) | |||
| 55 | { | 55 | { |
| 56 | } | 56 | } |
| 57 | 57 | ||
| 58 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 59 | static int up_cpu_disable(void) | ||
| 60 | { | ||
| 61 | return -ENOSYS; | ||
| 62 | } | ||
| 63 | |||
| 64 | static void up_cpu_die(unsigned int cpu) | ||
| 65 | { | ||
| 66 | BUG(); | ||
| 67 | } | ||
| 68 | #endif | ||
| 69 | |||
| 58 | struct plat_smp_ops up_smp_ops = { | 70 | struct plat_smp_ops up_smp_ops = { |
| 59 | .send_ipi_single = up_send_ipi_single, | 71 | .send_ipi_single = up_send_ipi_single, |
| 60 | .send_ipi_mask = up_send_ipi_mask, | 72 | .send_ipi_mask = up_send_ipi_mask, |
| @@ -64,4 +76,8 @@ struct plat_smp_ops up_smp_ops = { | |||
| 64 | .boot_secondary = up_boot_secondary, | 76 | .boot_secondary = up_boot_secondary, |
| 65 | .smp_setup = up_smp_setup, | 77 | .smp_setup = up_smp_setup, |
| 66 | .prepare_cpus = up_prepare_cpus, | 78 | .prepare_cpus = up_prepare_cpus, |
| 79 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 80 | .cpu_disable = up_cpu_disable, | ||
| 81 | .cpu_die = up_cpu_die, | ||
| 82 | #endif | ||
| 67 | }; | 83 | }; |
diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c index c937506a03aa..bc7d9b05e2f4 100644 --- a/arch/mips/kernel/smp.c +++ b/arch/mips/kernel/smp.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/delay.h> | 22 | #include <linux/delay.h> |
| 23 | #include <linux/init.h> | 23 | #include <linux/init.h> |
| 24 | #include <linux/interrupt.h> | 24 | #include <linux/interrupt.h> |
| 25 | #include <linux/smp.h> | ||
| 25 | #include <linux/spinlock.h> | 26 | #include <linux/spinlock.h> |
| 26 | #include <linux/threads.h> | 27 | #include <linux/threads.h> |
| 27 | #include <linux/module.h> | 28 | #include <linux/module.h> |
| @@ -44,7 +45,7 @@ | |||
| 44 | #include <asm/mipsmtregs.h> | 45 | #include <asm/mipsmtregs.h> |
| 45 | #endif /* CONFIG_MIPS_MT_SMTC */ | 46 | #endif /* CONFIG_MIPS_MT_SMTC */ |
| 46 | 47 | ||
| 47 | static volatile cpumask_t cpu_callin_map; /* Bitmask of started secondaries */ | 48 | volatile cpumask_t cpu_callin_map; /* Bitmask of started secondaries */ |
| 48 | int __cpu_number_map[NR_CPUS]; /* Map physical to logical */ | 49 | int __cpu_number_map[NR_CPUS]; /* Map physical to logical */ |
| 49 | int __cpu_logical_map[NR_CPUS]; /* Map logical to physical */ | 50 | int __cpu_logical_map[NR_CPUS]; /* Map logical to physical */ |
| 50 | 51 | ||
| @@ -200,6 +201,8 @@ void __devinit smp_prepare_boot_cpu(void) | |||
| 200 | * and keep control until "cpu_online(cpu)" is set. Note: cpu is | 201 | * and keep control until "cpu_online(cpu)" is set. Note: cpu is |
| 201 | * physical, not logical. | 202 | * physical, not logical. |
| 202 | */ | 203 | */ |
| 204 | static struct task_struct *cpu_idle_thread[NR_CPUS]; | ||
| 205 | |||
| 203 | int __cpuinit __cpu_up(unsigned int cpu) | 206 | int __cpuinit __cpu_up(unsigned int cpu) |
| 204 | { | 207 | { |
| 205 | struct task_struct *idle; | 208 | struct task_struct *idle; |
| @@ -209,9 +212,16 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
| 209 | * The following code is purely to make sure | 212 | * The following code is purely to make sure |
| 210 | * Linux can schedule processes on this slave. | 213 | * Linux can schedule processes on this slave. |
| 211 | */ | 214 | */ |
| 212 | idle = fork_idle(cpu); | 215 | if (!cpu_idle_thread[cpu]) { |
| 213 | if (IS_ERR(idle)) | 216 | idle = fork_idle(cpu); |
| 214 | panic(KERN_ERR "Fork failed for CPU %d", cpu); | 217 | cpu_idle_thread[cpu] = idle; |
| 218 | |||
| 219 | if (IS_ERR(idle)) | ||
| 220 | panic(KERN_ERR "Fork failed for CPU %d", cpu); | ||
| 221 | } else { | ||
| 222 | idle = cpu_idle_thread[cpu]; | ||
| 223 | init_idle(idle, cpu); | ||
| 224 | } | ||
| 215 | 225 | ||
| 216 | mp_ops->boot_secondary(cpu, idle); | 226 | mp_ops->boot_secondary(cpu, idle); |
| 217 | 227 | ||
diff --git a/arch/mips/kernel/smtc.c b/arch/mips/kernel/smtc.c index 37d51cd124e9..8a0626cbb108 100644 --- a/arch/mips/kernel/smtc.c +++ b/arch/mips/kernel/smtc.c | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | #include <linux/clockchips.h> | 20 | #include <linux/clockchips.h> |
| 21 | #include <linux/kernel.h> | 21 | #include <linux/kernel.h> |
| 22 | #include <linux/sched.h> | 22 | #include <linux/sched.h> |
| 23 | #include <linux/smp.h> | ||
| 23 | #include <linux/cpumask.h> | 24 | #include <linux/cpumask.h> |
| 24 | #include <linux/interrupt.h> | 25 | #include <linux/interrupt.h> |
| 25 | #include <linux/kernel_stat.h> | 26 | #include <linux/kernel_stat.h> |
diff --git a/arch/mips/kernel/sync-r4k.c b/arch/mips/kernel/sync-r4k.c index 9021108eb9c1..05dd170a83f7 100644 --- a/arch/mips/kernel/sync-r4k.c +++ b/arch/mips/kernel/sync-r4k.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Count register synchronisation. | 2 | * Count register synchronisation. |
| 3 | * | 3 | * |
| 4 | * All CPUs will have their count registers synchronised to the CPU0 expirelo | 4 | * All CPUs will have their count registers synchronised to the CPU0 next time |
| 5 | * value. This can cause a small timewarp for CPU0. All other CPU's should | 5 | * value. This can cause a small timewarp for CPU0. All other CPU's should |
| 6 | * not have done anything significant (but they may have had interrupts | 6 | * not have done anything significant (but they may have had interrupts |
| 7 | * enabled briefly - prom_smp_finish() should not be responsible for enabling | 7 | * enabled briefly - prom_smp_finish() should not be responsible for enabling |
| @@ -13,21 +13,22 @@ | |||
| 13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
| 14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
| 15 | #include <linux/irqflags.h> | 15 | #include <linux/irqflags.h> |
| 16 | #include <linux/r4k-timer.h> | 16 | #include <linux/cpumask.h> |
| 17 | 17 | ||
| 18 | #include <asm/r4k-timer.h> | ||
| 18 | #include <asm/atomic.h> | 19 | #include <asm/atomic.h> |
| 19 | #include <asm/barrier.h> | 20 | #include <asm/barrier.h> |
| 20 | #include <asm/cpumask.h> | ||
| 21 | #include <asm/mipsregs.h> | 21 | #include <asm/mipsregs.h> |
| 22 | 22 | ||
| 23 | static atomic_t __initdata count_start_flag = ATOMIC_INIT(0); | 23 | static atomic_t __cpuinitdata count_start_flag = ATOMIC_INIT(0); |
| 24 | static atomic_t __initdata count_count_start = ATOMIC_INIT(0); | 24 | static atomic_t __cpuinitdata count_count_start = ATOMIC_INIT(0); |
| 25 | static atomic_t __initdata count_count_stop = ATOMIC_INIT(0); | 25 | static atomic_t __cpuinitdata count_count_stop = ATOMIC_INIT(0); |
| 26 | static atomic_t __cpuinitdata count_reference = ATOMIC_INIT(0); | ||
| 26 | 27 | ||
| 27 | #define COUNTON 100 | 28 | #define COUNTON 100 |
| 28 | #define NR_LOOPS 5 | 29 | #define NR_LOOPS 5 |
| 29 | 30 | ||
| 30 | void __init synchronise_count_master(void) | 31 | void __cpuinit synchronise_count_master(void) |
| 31 | { | 32 | { |
| 32 | int i; | 33 | int i; |
| 33 | unsigned long flags; | 34 | unsigned long flags; |
| @@ -42,19 +43,20 @@ void __init synchronise_count_master(void) | |||
| 42 | return; | 43 | return; |
| 43 | #endif | 44 | #endif |
| 44 | 45 | ||
| 45 | pr_info("Checking COUNT synchronization across %u CPUs: ", | 46 | printk(KERN_INFO "Synchronize counters across %u CPUs: ", |
| 46 | num_online_cpus()); | 47 | num_online_cpus()); |
| 47 | 48 | ||
| 48 | local_irq_save(flags); | 49 | local_irq_save(flags); |
| 49 | 50 | ||
| 50 | /* | 51 | /* |
| 51 | * Notify the slaves that it's time to start | 52 | * Notify the slaves that it's time to start |
| 52 | */ | 53 | */ |
| 54 | atomic_set(&count_reference, read_c0_count()); | ||
| 53 | atomic_set(&count_start_flag, 1); | 55 | atomic_set(&count_start_flag, 1); |
| 54 | smp_wmb(); | 56 | smp_wmb(); |
| 55 | 57 | ||
| 56 | /* Count will be initialised to expirelo for all CPU's */ | 58 | /* Count will be initialised to current timer for all CPU's */ |
| 57 | initcount = expirelo; | 59 | initcount = read_c0_count(); |
| 58 | 60 | ||
| 59 | /* | 61 | /* |
| 60 | * We loop a few times to get a primed instruction cache, | 62 | * We loop a few times to get a primed instruction cache, |
| @@ -106,7 +108,7 @@ void __init synchronise_count_master(void) | |||
| 106 | printk("done.\n"); | 108 | printk("done.\n"); |
| 107 | } | 109 | } |
| 108 | 110 | ||
| 109 | void __init synchronise_count_slave(void) | 111 | void __cpuinit synchronise_count_slave(void) |
| 110 | { | 112 | { |
| 111 | int i; | 113 | int i; |
| 112 | unsigned long flags; | 114 | unsigned long flags; |
| @@ -131,8 +133,8 @@ void __init synchronise_count_slave(void) | |||
| 131 | while (!atomic_read(&count_start_flag)) | 133 | while (!atomic_read(&count_start_flag)) |
| 132 | mb(); | 134 | mb(); |
| 133 | 135 | ||
| 134 | /* Count will be initialised to expirelo for all CPU's */ | 136 | /* Count will be initialised to next expire for all CPU's */ |
| 135 | initcount = expirelo; | 137 | initcount = atomic_read(&count_reference); |
| 136 | 138 | ||
| 137 | ncpus = num_online_cpus(); | 139 | ncpus = num_online_cpus(); |
| 138 | for (i = 0; i < NR_LOOPS; i++) { | 140 | for (i = 0; i < NR_LOOPS; i++) { |
| @@ -156,4 +158,3 @@ void __init synchronise_count_slave(void) | |||
| 156 | local_irq_restore(flags); | 158 | local_irq_restore(flags); |
| 157 | } | 159 | } |
| 158 | #undef NR_LOOPS | 160 | #undef NR_LOOPS |
| 159 | #endif | ||
diff --git a/arch/mips/kernel/topology.c b/arch/mips/kernel/topology.c index 660e44ed44d7..cf3eb61fad12 100644 --- a/arch/mips/kernel/topology.c +++ b/arch/mips/kernel/topology.c | |||
| @@ -17,7 +17,10 @@ static int __init topology_init(void) | |||
| 17 | #endif /* CONFIG_NUMA */ | 17 | #endif /* CONFIG_NUMA */ |
| 18 | 18 | ||
| 19 | for_each_present_cpu(i) { | 19 | for_each_present_cpu(i) { |
| 20 | ret = register_cpu(&per_cpu(cpu_devices, i), i); | 20 | struct cpu *c = &per_cpu(cpu_devices, i); |
| 21 | |||
| 22 | c->hotpluggable = 1; | ||
| 23 | ret = register_cpu(c, i); | ||
| 21 | if (ret) | 24 | if (ret) |
| 22 | printk(KERN_WARNING "topology_init: register_cpu %d " | 25 | printk(KERN_WARNING "topology_init: register_cpu %d " |
| 23 | "failed (%d)\n", i, ret); | 26 | "failed (%d)\n", i, ret); |
diff --git a/arch/mips/kernel/vpe.c b/arch/mips/kernel/vpe.c index 3ca5f42e819d..07b9ec2c6e3d 100644 --- a/arch/mips/kernel/vpe.c +++ b/arch/mips/kernel/vpe.c | |||
| @@ -1387,7 +1387,7 @@ static ssize_t store_ntcs(struct device *dev, struct device_attribute *attr, | |||
| 1387 | return len; | 1387 | return len; |
| 1388 | 1388 | ||
| 1389 | out_einval: | 1389 | out_einval: |
| 1390 | return -EINVAL;; | 1390 | return -EINVAL; |
| 1391 | } | 1391 | } |
| 1392 | 1392 | ||
| 1393 | static struct device_attribute vpe_class_attributes[] = { | 1393 | static struct device_attribute vpe_class_attributes[] = { |
