aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/Kconfig7
-rw-r--r--arch/arm/include/asm/smp_scu.h10
-rw-r--r--arch/arm/kernel/Makefile1
-rw-r--r--arch/arm/kernel/smp_scu.c41
-rw-r--r--arch/arm/mach-realview/platsmp.c29
5 files changed, 56 insertions, 32 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index ef4f860d5041..f19a9519a723 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -861,6 +861,7 @@ config SMP
861 depends on EXPERIMENTAL && (REALVIEW_EB_ARM11MP || MACH_REALVIEW_PB11MP) 861 depends on EXPERIMENTAL && (REALVIEW_EB_ARM11MP || MACH_REALVIEW_PB11MP)
862 depends on GENERIC_CLOCKEVENTS 862 depends on GENERIC_CLOCKEVENTS
863 select USE_GENERIC_SMP_HELPERS 863 select USE_GENERIC_SMP_HELPERS
864 select HAVE_ARM_SCU if ARCH_REALVIEW
864 help 865 help
865 This enables support for systems with more than one CPU. If you have 866 This enables support for systems with more than one CPU. If you have
866 a system with only one CPU, like most personal computers, say N. If 867 a system with only one CPU, like most personal computers, say N. If
@@ -878,6 +879,12 @@ config SMP
878 879
879 If you don't know what to do here, say N. 880 If you don't know what to do here, say N.
880 881
882config HAVE_ARM_SCU
883 bool
884 depends on SMP
885 help
886 This option enables support for the ARM system coherency unit
887
881choice 888choice
882 prompt "Memory split" 889 prompt "Memory split"
883 default VMSPLIT_3G 890 default VMSPLIT_3G
diff --git a/arch/arm/include/asm/smp_scu.h b/arch/arm/include/asm/smp_scu.h
index d55802d645af..2376835015d6 100644
--- a/arch/arm/include/asm/smp_scu.h
+++ b/arch/arm/include/asm/smp_scu.h
@@ -1,13 +1,7 @@
1#ifndef __ASMARM_ARCH_SCU_H 1#ifndef __ASMARM_ARCH_SCU_H
2#define __ASMARM_ARCH_SCU_H 2#define __ASMARM_ARCH_SCU_H
3 3
4/* 4unsigned int scu_get_core_count(void __iomem *);
5 * SCU registers 5void scu_enable(void __iomem *);
6 */
7#define SCU_CTRL 0x00
8#define SCU_CONFIG 0x04
9#define SCU_CPU_STATUS 0x08
10#define SCU_INVALIDATE 0x0c
11#define SCU_FPGA_REVISION 0x10
12 6
13#endif 7#endif
diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile
index 11a5197a221f..90ffbaf23b4e 100644
--- a/arch/arm/kernel/Makefile
+++ b/arch/arm/kernel/Makefile
@@ -22,6 +22,7 @@ obj-$(CONFIG_ARTHUR) += arthur.o
22obj-$(CONFIG_ISA_DMA) += dma-isa.o 22obj-$(CONFIG_ISA_DMA) += dma-isa.o
23obj-$(CONFIG_PCI) += bios32.o isa.o 23obj-$(CONFIG_PCI) += bios32.o isa.o
24obj-$(CONFIG_SMP) += smp.o 24obj-$(CONFIG_SMP) += smp.o
25obj-$(CONFIG_HAVE_ARM_SCU) += smp_scu.o
25obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o 26obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o
26obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o 27obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o
27obj-$(CONFIG_KPROBES) += kprobes.o kprobes-decode.o 28obj-$(CONFIG_KPROBES) += kprobes.o kprobes-decode.o
diff --git a/arch/arm/kernel/smp_scu.c b/arch/arm/kernel/smp_scu.c
new file mode 100644
index 000000000000..7f24ee9d7330
--- /dev/null
+++ b/arch/arm/kernel/smp_scu.c
@@ -0,0 +1,41 @@
1/*
2 * linux/arch/arm/kernel/smp_scu.c
3 *
4 * Copyright (C) 2002 ARM Ltd.
5 * All Rights Reserved
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11#include <linux/init.h>
12#include <linux/io.h>
13
14#include <asm/smp_scu.h>
15
16#define SCU_CTRL 0x00
17#define SCU_CONFIG 0x04
18#define SCU_CPU_STATUS 0x08
19#define SCU_INVALIDATE 0x0c
20#define SCU_FPGA_REVISION 0x10
21
22/*
23 * Get the number of CPU cores from the SCU configuration
24 */
25unsigned int __init scu_get_core_count(void __iomem *scu_base)
26{
27 unsigned int ncores = __raw_readl(scu_base + SCU_CONFIG);
28 return (ncores & 0x03) + 1;
29}
30
31/*
32 * Enable the SCU
33 */
34void __init scu_enable(void __iomem *scu_base)
35{
36 u32 scu_ctrl;
37
38 scu_ctrl = __raw_readl(scu_base + SCU_CTRL);
39 scu_ctrl |= 1;
40 __raw_writel(scu_ctrl, scu_base + SCU_CTRL);
41}
diff --git a/arch/arm/mach-realview/platsmp.c b/arch/arm/mach-realview/platsmp.c
index c567d3e24447..c862ce19587e 100644
--- a/arch/arm/mach-realview/platsmp.c
+++ b/arch/arm/mach-realview/platsmp.c
@@ -45,31 +45,12 @@ static void __iomem *scu_base_addr(void)
45 return (void __iomem *)0; 45 return (void __iomem *)0;
46} 46}
47 47
48static unsigned int __init get_core_count(void) 48static inline unsigned int get_core_count(void)
49{ 49{
50 unsigned int ncores;
51 void __iomem *scu_base = scu_base_addr(); 50 void __iomem *scu_base = scu_base_addr();
52 51 if (scu_base)
53 if (scu_base) { 52 return scu_get_core_count(scu_base);
54 ncores = __raw_readl(scu_base + SCU_CONFIG); 53 return 1;
55 ncores = (ncores & 0x03) + 1;
56 } else
57 ncores = 1;
58
59 return ncores;
60}
61
62/*
63 * Setup the SCU
64 */
65static void scu_enable(void)
66{
67 u32 scu_ctrl;
68 void __iomem *scu_base = scu_base_addr();
69
70 scu_ctrl = __raw_readl(scu_base + SCU_CTRL);
71 scu_ctrl |= 1;
72 __raw_writel(scu_ctrl, scu_base + SCU_CTRL);
73} 54}
74 55
75static DEFINE_SPINLOCK(boot_lock); 56static DEFINE_SPINLOCK(boot_lock);
@@ -239,7 +220,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
239 */ 220 */
240 percpu_timer_setup(); 221 percpu_timer_setup();
241 222
242 scu_enable(); 223 scu_enable(scu_base_addr());
243 poke_milo(); 224 poke_milo();
244 } 225 }
245} 226}