Skip to content

Commit 89de09a

Browse files
author
Linus Torvalds
committed
Merge master.kernel.org:/home/rmk/linux-2.6-arm
2 parents dad2ad8 + f6db449 commit 89de09a

File tree

20 files changed

+472
-54
lines changed

20 files changed

+472
-54
lines changed

arch/arm/Kconfig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ menu "Kernel Features"
324324

325325
config SMP
326326
bool "Symmetric Multi-Processing (EXPERIMENTAL)"
327-
depends on EXPERIMENTAL && BROKEN #&& n
327+
depends on EXPERIMENTAL && REALVIEW_MPCORE
328328
help
329329
This enables support for systems with more than one CPU. If you have
330330
a system with only one CPU, like most personal computers, say N. If
@@ -585,7 +585,7 @@ config FPE_NWFPE
585585

586586
config FPE_NWFPE_XP
587587
bool "Support extended precision"
588-
depends on FPE_NWFPE && !CPU_BIG_ENDIAN
588+
depends on FPE_NWFPE
589589
help
590590
Say Y to include 80-bit support in the kernel floating-point
591591
emulator. Otherwise, only 32 and 64-bit support is compiled in.

arch/arm/mach-ixp2000/core.c

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -84,63 +84,54 @@ static struct map_desc ixp2000_io_desc[] __initdata = {
8484
.virtual = IXP2000_CAP_VIRT_BASE,
8585
.pfn = __phys_to_pfn(IXP2000_CAP_PHYS_BASE),
8686
.length = IXP2000_CAP_SIZE,
87-
.type = MT_DEVICE
87+
.type = MT_IXP2000_DEVICE,
8888
}, {
8989
.virtual = IXP2000_INTCTL_VIRT_BASE,
9090
.pfn = __phys_to_pfn(IXP2000_INTCTL_PHYS_BASE),
9191
.length = IXP2000_INTCTL_SIZE,
92-
.type = MT_DEVICE
92+
.type = MT_IXP2000_DEVICE,
9393
}, {
9494
.virtual = IXP2000_PCI_CREG_VIRT_BASE,
9595
.pfn = __phys_to_pfn(IXP2000_PCI_CREG_PHYS_BASE),
9696
.length = IXP2000_PCI_CREG_SIZE,
97-
.type = MT_DEVICE
97+
.type = MT_IXP2000_DEVICE,
9898
}, {
9999
.virtual = IXP2000_PCI_CSR_VIRT_BASE,
100100
.pfn = __phys_to_pfn(IXP2000_PCI_CSR_PHYS_BASE),
101101
.length = IXP2000_PCI_CSR_SIZE,
102-
.type = MT_DEVICE
102+
.type = MT_IXP2000_DEVICE,
103103
}, {
104104
.virtual = IXP2000_MSF_VIRT_BASE,
105105
.pfn = __phys_to_pfn(IXP2000_MSF_PHYS_BASE),
106106
.length = IXP2000_MSF_SIZE,
107-
.type = MT_DEVICE
107+
.type = MT_IXP2000_DEVICE,
108108
}, {
109109
.virtual = IXP2000_PCI_IO_VIRT_BASE,
110110
.pfn = __phys_to_pfn(IXP2000_PCI_IO_PHYS_BASE),
111111
.length = IXP2000_PCI_IO_SIZE,
112-
.type = MT_DEVICE
112+
.type = MT_IXP2000_DEVICE,
113113
}, {
114114
.virtual = IXP2000_PCI_CFG0_VIRT_BASE,
115115
.pfn = __phys_to_pfn(IXP2000_PCI_CFG0_PHYS_BASE),
116116
.length = IXP2000_PCI_CFG0_SIZE,
117-
.type = MT_DEVICE
117+
.type = MT_IXP2000_DEVICE,
118118
}, {
119119
.virtual = IXP2000_PCI_CFG1_VIRT_BASE,
120120
.pfn = __phys_to_pfn(IXP2000_PCI_CFG1_PHYS_BASE),
121121
.length = IXP2000_PCI_CFG1_SIZE,
122-
.type = MT_DEVICE
122+
.type = MT_IXP2000_DEVICE,
123123
}
124124
};
125125

126126
void __init ixp2000_map_io(void)
127127
{
128-
extern unsigned int processor_id;
129-
130128
/*
131-
* On IXP2400 CPUs we need to use MT_IXP2000_DEVICE for
132-
* tweaking the PMDs so XCB=101. On IXP2800s we use the normal
133-
* PMD flags.
129+
* On IXP2400 CPUs we need to use MT_IXP2000_DEVICE so that
130+
* XCB=101 (to avoid triggering erratum #66), and given that
131+
* this mode speeds up I/O accesses and we have write buffer
132+
* flushes in the right places anyway, it doesn't hurt to use
133+
* XCB=101 for all IXP2000s.
134134
*/
135-
if ((processor_id & 0xfffffff0) == 0x69054190) {
136-
int i;
137-
138-
printk(KERN_INFO "Enabling IXP2400 erratum #66 workaround\n");
139-
140-
for(i=0;i<ARRAY_SIZE(ixp2000_io_desc);i++)
141-
ixp2000_io_desc[i].type = MT_IXP2000_DEVICE;
142-
}
143-
144135
iotable_init(ixp2000_io_desc, ARRAY_SIZE(ixp2000_io_desc));
145136

146137
/* Set slowport to 8-bit mode. */

arch/arm/mach-realview/Kconfig

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,13 @@ config MACH_REALVIEW_EB
88
help
99
Include support for the ARM(R) RealView Emulation Baseboard platform.
1010

11+
config REALVIEW_MPCORE
12+
bool "Support MPcore tile"
13+
depends on MACH_REALVIEW_EB
14+
help
15+
Enable support for the MPCore tile on the Realview platform.
16+
Since there are device address and interrupt differences, a
17+
kernel built with this option enabled is not compatible with
18+
other tiles.
19+
1120
endmenu

arch/arm/mach-realview/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@
44

55
obj-y := core.o clock.o
66
obj-$(CONFIG_MACH_REALVIEW_EB) += realview_eb.o
7+
obj-$(CONFIG_SMP) += platsmp.o headsmp.o

arch/arm/mach-realview/core.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#define __ASM_ARCH_REALVIEW_H
2424

2525
#include <asm/hardware/amba.h>
26+
#include <asm/leds.h>
2627
#include <asm/io.h>
2728

2829
#define __io_address(n) __io(IO_ADDRESS(n))

arch/arm/mach-realview/headsmp.S

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* linux/arch/arm/mach-realview/headsmp.S
3+
*
4+
* Copyright (c) 2003 ARM Limited
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/linkage.h>
12+
#include <linux/init.h>
13+
14+
__INIT
15+
16+
/*
17+
* Realview specific entry point for secondary CPUs. This provides
18+
* a "holding pen" into which all secondary cores are held until we're
19+
* ready for them to initialise.
20+
*/
21+
ENTRY(realview_secondary_startup)
22+
mrc p15, 0, r0, c0, c0, 5
23+
and r0, r0, #15
24+
adr r4, 1f
25+
ldmia r4, {r5, r6}
26+
sub r4, r4, r5
27+
add r6, r6, r4
28+
pen: ldr r7, [r6]
29+
cmp r7, r0
30+
bne pen
31+
32+
/*
33+
* we've been released from the holding pen: secondary_stack
34+
* should now contain the SVC stack for this core
35+
*/
36+
b secondary_startup
37+
38+
1: .long .
39+
.long pen_release

arch/arm/mach-realview/platsmp.c

Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
/*
2+
* linux/arch/arm/mach-realview/platsmp.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/errno.h>
13+
#include <linux/delay.h>
14+
#include <linux/device.h>
15+
#include <linux/smp.h>
16+
17+
#include <asm/cacheflush.h>
18+
#include <asm/hardware/arm_scu.h>
19+
#include <asm/hardware.h>
20+
21+
#include "core.h"
22+
23+
extern void realview_secondary_startup(void);
24+
25+
/*
26+
* control for which core is the next to come out of the secondary
27+
* boot "holding pen"
28+
*/
29+
volatile int __cpuinitdata pen_release = -1;
30+
31+
static unsigned int __init get_core_count(void)
32+
{
33+
unsigned int ncores;
34+
35+
ncores = __raw_readl(IO_ADDRESS(REALVIEW_MPCORE_SCU_BASE) + SCU_CONFIG);
36+
37+
return (ncores & 0x03) + 1;
38+
}
39+
40+
static DEFINE_SPINLOCK(boot_lock);
41+
42+
void __cpuinit platform_secondary_init(unsigned int cpu)
43+
{
44+
/*
45+
* the primary core may have used a "cross call" soft interrupt
46+
* to get this processor out of WFI in the BootMonitor - make
47+
* sure that we are no longer being sent this soft interrupt
48+
*/
49+
smp_cross_call_done(cpumask_of_cpu(cpu));
50+
51+
/*
52+
* if any interrupts are already enabled for the primary
53+
* core (e.g. timer irq), then they will not have been enabled
54+
* for us: do so
55+
*/
56+
gic_cpu_init(__io_address(REALVIEW_GIC_CPU_BASE));
57+
58+
/*
59+
* let the primary processor know we're out of the
60+
* pen, then head off into the C entry point
61+
*/
62+
pen_release = -1;
63+
64+
/*
65+
* Synchronise with the boot thread.
66+
*/
67+
spin_lock(&boot_lock);
68+
spin_unlock(&boot_lock);
69+
}
70+
71+
int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
72+
{
73+
unsigned long timeout;
74+
75+
/*
76+
* set synchronisation state between this boot processor
77+
* and the secondary one
78+
*/
79+
spin_lock(&boot_lock);
80+
81+
/*
82+
* The secondary processor is waiting to be released from
83+
* the holding pen - release it, then wait for it to flag
84+
* that it has been released by resetting pen_release.
85+
*
86+
* Note that "pen_release" is the hardware CPU ID, whereas
87+
* "cpu" is Linux's internal ID.
88+
*/
89+
pen_release = cpu;
90+
flush_cache_all();
91+
92+
/*
93+
* XXX
94+
*
95+
* This is a later addition to the booting protocol: the
96+
* bootMonitor now puts secondary cores into WFI, so
97+
* poke_milo() no longer gets the cores moving; we need
98+
* to send a soft interrupt to wake the secondary core.
99+
* Use smp_cross_call() for this, since there's little
100+
* point duplicating the code here
101+
*/
102+
smp_cross_call(cpumask_of_cpu(cpu));
103+
104+
timeout = jiffies + (1 * HZ);
105+
while (time_before(jiffies, timeout)) {
106+
if (pen_release == -1)
107+
break;
108+
109+
udelay(10);
110+
}
111+
112+
/*
113+
* now the secondary core is starting up let it run its
114+
* calibrations, then wait for it to finish
115+
*/
116+
spin_unlock(&boot_lock);
117+
118+
return pen_release != -1 ? -ENOSYS : 0;
119+
}
120+
121+
static void __init poke_milo(void)
122+
{
123+
extern void secondary_startup(void);
124+
125+
/* nobody is to be released from the pen yet */
126+
pen_release = -1;
127+
128+
/*
129+
* write the address of secondary startup into the system-wide
130+
* flags register, then clear the bottom two bits, which is what
131+
* BootMonitor is waiting for
132+
*/
133+
#if 1
134+
#define REALVIEW_SYS_FLAGSS_OFFSET 0x30
135+
__raw_writel(virt_to_phys(realview_secondary_startup),
136+
(IO_ADDRESS(REALVIEW_SYS_BASE) +
137+
REALVIEW_SYS_FLAGSS_OFFSET));
138+
#define REALVIEW_SYS_FLAGSC_OFFSET 0x34
139+
__raw_writel(3,
140+
(IO_ADDRESS(REALVIEW_SYS_BASE) +
141+
REALVIEW_SYS_FLAGSC_OFFSET));
142+
#endif
143+
144+
mb();
145+
}
146+
147+
void __init smp_prepare_cpus(unsigned int max_cpus)
148+
{
149+
unsigned int ncores = get_core_count();
150+
unsigned int cpu = smp_processor_id();
151+
int i;
152+
153+
/* sanity check */
154+
if (ncores == 0) {
155+
printk(KERN_ERR
156+
"Realview: strange CM count of 0? Default to 1\n");
157+
158+
ncores = 1;
159+
}
160+
161+
if (ncores > NR_CPUS) {
162+
printk(KERN_WARNING
163+
"Realview: no. of cores (%d) greater than configured "
164+
"maximum of %d - clipping\n",
165+
ncores, NR_CPUS);
166+
ncores = NR_CPUS;
167+
}
168+
169+
smp_store_cpu_info(cpu);
170+
171+
/*
172+
* are we trying to boot more cores than exist?
173+
*/
174+
if (max_cpus > ncores)
175+
max_cpus = ncores;
176+
177+
/*
178+
* Initialise the possible/present maps.
179+
* cpu_possible_map describes the set of CPUs which may be present
180+
* cpu_present_map describes the set of CPUs populated
181+
*/
182+
for (i = 0; i < max_cpus; i++) {
183+
cpu_set(i, cpu_possible_map);
184+
cpu_set(i, cpu_present_map);
185+
}
186+
187+
/*
188+
* Do we need any more CPUs? If so, then let them know where
189+
* to start. Note that, on modern versions of MILO, the "poke"
190+
* doesn't actually do anything until each individual core is
191+
* sent a soft interrupt to get it out of WFI
192+
*/
193+
if (max_cpus > 1)
194+
poke_milo();
195+
}

arch/arm/mach-realview/realview_eb.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,11 @@ static struct amba_device *amba_devs[] __initdata = {
136136

137137
static void __init gic_init_irq(void)
138138
{
139+
#ifdef CONFIG_REALVIEW_MPCORE
140+
writel(0x0000a05f, __io_address(REALVIEW_SYS_LOCK));
141+
writel(0x008003c0, __io_address(REALVIEW_SYS_BASE) + 0xd8);
142+
writel(0x00000000, __io_address(REALVIEW_SYS_LOCK));
143+
#endif
139144
gic_dist_init(__io_address(REALVIEW_GIC_DIST_BASE));
140145
gic_cpu_init(__io_address(REALVIEW_GIC_CPU_BASE));
141146
}

0 commit comments

Comments
 (0)