diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2008-04-28 12:14:26 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2008-04-28 12:14:26 -0400 |
commit | 39b8d5254246ac56342b72f812255c8f7a74dca9 (patch) | |
tree | a9ec6bfb5d09a8367c34cc2067328d1b49bb46c1 /arch/mips/mips-boards/generic | |
parent | 308402445e005a039a72b315cd9b5ceeaea0063c (diff) |
[MIPS] Add support for MIPS CMP platform.
Signed-off-by: Chris Dearman <chris@mips.com>
Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/mips-boards/generic')
-rw-r--r-- | arch/mips/mips-boards/generic/Makefile | 1 | ||||
-rw-r--r-- | arch/mips/mips-boards/generic/amon.c | 80 | ||||
-rw-r--r-- | arch/mips/mips-boards/generic/init.c | 3 | ||||
-rw-r--r-- | arch/mips/mips-boards/generic/time.c | 29 |
4 files changed, 108 insertions, 5 deletions
diff --git a/arch/mips/mips-boards/generic/Makefile b/arch/mips/mips-boards/generic/Makefile index b31d8dfed1be..f7f87fc09d1e 100644 --- a/arch/mips/mips-boards/generic/Makefile +++ b/arch/mips/mips-boards/generic/Makefile | |||
@@ -20,6 +20,7 @@ | |||
20 | 20 | ||
21 | obj-y := reset.o display.o init.o memory.o \ | 21 | obj-y := reset.o display.o init.o memory.o \ |
22 | cmdline.o time.o | 22 | cmdline.o time.o |
23 | obj-y += amon.o | ||
23 | 24 | ||
24 | obj-$(CONFIG_EARLY_PRINTK) += console.o | 25 | obj-$(CONFIG_EARLY_PRINTK) += console.o |
25 | obj-$(CONFIG_PCI) += pci.o | 26 | obj-$(CONFIG_PCI) += pci.o |
diff --git a/arch/mips/mips-boards/generic/amon.c b/arch/mips/mips-boards/generic/amon.c new file mode 100644 index 000000000000..b7633fda4180 --- /dev/null +++ b/arch/mips/mips-boards/generic/amon.c | |||
@@ -0,0 +1,80 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2007 MIPS Technologies, Inc. | ||
3 | * All rights reserved. | ||
4 | |||
5 | * This program is free software; you can distribute it and/or modify it | ||
6 | * under the terms of the GNU General Public License (Version 2) as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
12 | * for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License along | ||
15 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
16 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | ||
17 | * | ||
18 | * Arbitrary Monitor interface | ||
19 | */ | ||
20 | |||
21 | #include <linux/kernel.h> | ||
22 | #include <linux/init.h> | ||
23 | #include <linux/smp.h> | ||
24 | |||
25 | #include <asm-mips/addrspace.h> | ||
26 | #include <asm-mips/mips-boards/launch.h> | ||
27 | #include <asm-mips/mipsmtregs.h> | ||
28 | |||
29 | int amon_cpu_avail(int cpu) | ||
30 | { | ||
31 | struct cpulaunch *launch = (struct cpulaunch *)KSEG0ADDR(CPULAUNCH); | ||
32 | |||
33 | if (cpu < 0 || cpu >= NCPULAUNCH) { | ||
34 | pr_debug("avail: cpu%d is out of range\n", cpu); | ||
35 | return 0; | ||
36 | } | ||
37 | |||
38 | launch += cpu; | ||
39 | if (!(launch->flags & LAUNCH_FREADY)) { | ||
40 | pr_debug("avail: cpu%d is not ready\n", cpu); | ||
41 | return 0; | ||
42 | } | ||
43 | if (launch->flags & (LAUNCH_FGO|LAUNCH_FGONE)) { | ||
44 | pr_debug("avail: too late.. cpu%d is already gone\n", cpu); | ||
45 | return 0; | ||
46 | } | ||
47 | |||
48 | return 1; | ||
49 | } | ||
50 | |||
51 | void amon_cpu_start(int cpu, | ||
52 | unsigned long pc, unsigned long sp, | ||
53 | unsigned long gp, unsigned long a0) | ||
54 | { | ||
55 | volatile struct cpulaunch *launch = | ||
56 | (struct cpulaunch *)KSEG0ADDR(CPULAUNCH); | ||
57 | |||
58 | if (!amon_cpu_avail(cpu)) | ||
59 | return; | ||
60 | if (cpu == smp_processor_id()) { | ||
61 | pr_debug("launch: I am cpu%d!\n", cpu); | ||
62 | return; | ||
63 | } | ||
64 | launch += cpu; | ||
65 | |||
66 | pr_debug("launch: starting cpu%d\n", cpu); | ||
67 | |||
68 | launch->pc = pc; | ||
69 | launch->gp = gp; | ||
70 | launch->sp = sp; | ||
71 | launch->a0 = a0; | ||
72 | |||
73 | /* Make sure target sees parameters before the go bit */ | ||
74 | smp_mb(); | ||
75 | |||
76 | launch->flags |= LAUNCH_FGO; | ||
77 | while ((launch->flags & LAUNCH_FGONE) == 0) | ||
78 | ; | ||
79 | pr_debug("launch: cpu%d gone!\n", cpu); | ||
80 | } | ||
diff --git a/arch/mips/mips-boards/generic/init.c b/arch/mips/mips-boards/generic/init.c index 07671fb9074f..852b19492d8c 100644 --- a/arch/mips/mips-boards/generic/init.c +++ b/arch/mips/mips-boards/generic/init.c | |||
@@ -424,6 +424,9 @@ void __init prom_init(void) | |||
424 | #ifdef CONFIG_SERIAL_8250_CONSOLE | 424 | #ifdef CONFIG_SERIAL_8250_CONSOLE |
425 | console_config(); | 425 | console_config(); |
426 | #endif | 426 | #endif |
427 | #ifdef CONFIG_MIPS_CMP | ||
428 | register_smp_ops(&cmp_smp_ops); | ||
429 | #endif | ||
427 | #ifdef CONFIG_MIPS_MT_SMP | 430 | #ifdef CONFIG_MIPS_MT_SMP |
428 | register_smp_ops(&vsmp_smp_ops); | 431 | register_smp_ops(&vsmp_smp_ops); |
429 | #endif | 432 | #endif |
diff --git a/arch/mips/mips-boards/generic/time.c b/arch/mips/mips-boards/generic/time.c index b50e0fc406ac..4fe62fca994e 100644 --- a/arch/mips/mips-boards/generic/time.c +++ b/arch/mips/mips-boards/generic/time.c | |||
@@ -55,16 +55,36 @@ | |||
55 | unsigned long cpu_khz; | 55 | unsigned long cpu_khz; |
56 | 56 | ||
57 | static int mips_cpu_timer_irq; | 57 | static int mips_cpu_timer_irq; |
58 | static int mips_cpu_perf_irq; | ||
58 | extern int cp0_perfcount_irq; | 59 | extern int cp0_perfcount_irq; |
59 | 60 | ||
61 | DEFINE_PER_CPU(unsigned int, tickcount); | ||
62 | #define tickcount_this_cpu __get_cpu_var(tickcount) | ||
63 | static unsigned long ledbitmask; | ||
64 | |||
60 | static void mips_timer_dispatch(void) | 65 | static void mips_timer_dispatch(void) |
61 | { | 66 | { |
67 | #if defined(CONFIG_MIPS_MALTA) || defined(CONFIG_MIPS_ATLAS) | ||
68 | /* | ||
69 | * Yes, this is very tacky, won't work as expected with SMTC and | ||
70 | * dyntick will break it, | ||
71 | * but it gives me a nice warm feeling during debug | ||
72 | */ | ||
73 | #define LEDBAR 0xbf000408 | ||
74 | if (tickcount_this_cpu++ >= HZ) { | ||
75 | tickcount_this_cpu = 0; | ||
76 | change_bit(smp_processor_id(), &ledbitmask); | ||
77 | smp_wmb(); /* Make sure every one else sees the change */ | ||
78 | /* This will pick up any recent changes made by other CPU's */ | ||
79 | *(unsigned int *)LEDBAR = ledbitmask; | ||
80 | } | ||
81 | #endif | ||
62 | do_IRQ(mips_cpu_timer_irq); | 82 | do_IRQ(mips_cpu_timer_irq); |
63 | } | 83 | } |
64 | 84 | ||
65 | static void mips_perf_dispatch(void) | 85 | static void mips_perf_dispatch(void) |
66 | { | 86 | { |
67 | do_IRQ(cp0_perfcount_irq); | 87 | do_IRQ(mips_cpu_perf_irq); |
68 | } | 88 | } |
69 | 89 | ||
70 | /* | 90 | /* |
@@ -129,19 +149,18 @@ unsigned long read_persistent_clock(void) | |||
129 | 149 | ||
130 | void __init plat_perf_setup(void) | 150 | void __init plat_perf_setup(void) |
131 | { | 151 | { |
132 | cp0_perfcount_irq = -1; | ||
133 | |||
134 | #ifdef MSC01E_INT_BASE | 152 | #ifdef MSC01E_INT_BASE |
135 | if (cpu_has_veic) { | 153 | if (cpu_has_veic) { |
136 | set_vi_handler(MSC01E_INT_PERFCTR, mips_perf_dispatch); | 154 | set_vi_handler(MSC01E_INT_PERFCTR, mips_perf_dispatch); |
137 | cp0_perfcount_irq = MSC01E_INT_BASE + MSC01E_INT_PERFCTR; | 155 | mips_cpu_perf_irq = MSC01E_INT_BASE + MSC01E_INT_PERFCTR; |
138 | } else | 156 | } else |
139 | #endif | 157 | #endif |
140 | if (cp0_perfcount_irq >= 0) { | 158 | if (cp0_perfcount_irq >= 0) { |
141 | if (cpu_has_vint) | 159 | if (cpu_has_vint) |
142 | set_vi_handler(cp0_perfcount_irq, mips_perf_dispatch); | 160 | set_vi_handler(cp0_perfcount_irq, mips_perf_dispatch); |
161 | mips_cpu_perf_irq = MIPS_CPU_IRQ_BASE + cp0_perfcount_irq; | ||
143 | #ifdef CONFIG_SMP | 162 | #ifdef CONFIG_SMP |
144 | set_irq_handler(cp0_perfcount_irq, handle_percpu_irq); | 163 | set_irq_handler(mips_cpu_perf_irq, handle_percpu_irq); |
145 | #endif | 164 | #endif |
146 | } | 165 | } |
147 | } | 166 | } |