diff options
author | Dmitry Torokhov <dtor_core@ameritech.net> | 2006-03-13 23:36:52 -0500 |
---|---|---|
committer | Dmitry Torokhov <dtor_core@ameritech.net> | 2006-03-13 23:36:52 -0500 |
commit | 58a343f22e8ef987b90e34bbef7f1455e3bb5a15 (patch) | |
tree | fc811fb570639f2083df6d9191b6a8d7cff65352 /arch/mips | |
parent | 51c38f9bce274a1e8a90aa457fb433be738f7458 (diff) | |
parent | 3759fa9c55923f719ae944a3f8fbb029b36f759d (diff) |
Merge rsync://rsync.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
Diffstat (limited to 'arch/mips')
34 files changed, 229 insertions, 205 deletions
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 767de847b4ab..3a0f89d2c8dc 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
@@ -1053,6 +1053,7 @@ config CPU_MIPS32_R1 | |||
1053 | depends on SYS_HAS_CPU_MIPS32_R1 | 1053 | depends on SYS_HAS_CPU_MIPS32_R1 |
1054 | select CPU_HAS_PREFETCH | 1054 | select CPU_HAS_PREFETCH |
1055 | select CPU_SUPPORTS_32BIT_KERNEL | 1055 | select CPU_SUPPORTS_32BIT_KERNEL |
1056 | select CPU_SUPPORTS_HIGHMEM | ||
1056 | help | 1057 | help |
1057 | Choose this option to build a kernel for release 1 or later of the | 1058 | Choose this option to build a kernel for release 1 or later of the |
1058 | MIPS32 architecture. Most modern embedded systems with a 32-bit | 1059 | MIPS32 architecture. Most modern embedded systems with a 32-bit |
@@ -1069,6 +1070,7 @@ config CPU_MIPS32_R2 | |||
1069 | depends on SYS_HAS_CPU_MIPS32_R2 | 1070 | depends on SYS_HAS_CPU_MIPS32_R2 |
1070 | select CPU_HAS_PREFETCH | 1071 | select CPU_HAS_PREFETCH |
1071 | select CPU_SUPPORTS_32BIT_KERNEL | 1072 | select CPU_SUPPORTS_32BIT_KERNEL |
1073 | select CPU_SUPPORTS_HIGHMEM | ||
1072 | help | 1074 | help |
1073 | Choose this option to build a kernel for release 2 or later of the | 1075 | Choose this option to build a kernel for release 2 or later of the |
1074 | MIPS32 architecture. Most modern embedded systems with a 32-bit | 1076 | MIPS32 architecture. Most modern embedded systems with a 32-bit |
@@ -1082,6 +1084,7 @@ config CPU_MIPS64_R1 | |||
1082 | select CPU_HAS_PREFETCH | 1084 | select CPU_HAS_PREFETCH |
1083 | select CPU_SUPPORTS_32BIT_KERNEL | 1085 | select CPU_SUPPORTS_32BIT_KERNEL |
1084 | select CPU_SUPPORTS_64BIT_KERNEL | 1086 | select CPU_SUPPORTS_64BIT_KERNEL |
1087 | select CPU_SUPPORTS_HIGHMEM | ||
1085 | help | 1088 | help |
1086 | Choose this option to build a kernel for release 1 or later of the | 1089 | Choose this option to build a kernel for release 1 or later of the |
1087 | MIPS64 architecture. Many modern embedded systems with a 64-bit | 1090 | MIPS64 architecture. Many modern embedded systems with a 64-bit |
@@ -1099,6 +1102,7 @@ config CPU_MIPS64_R2 | |||
1099 | select CPU_HAS_PREFETCH | 1102 | select CPU_HAS_PREFETCH |
1100 | select CPU_SUPPORTS_32BIT_KERNEL | 1103 | select CPU_SUPPORTS_32BIT_KERNEL |
1101 | select CPU_SUPPORTS_64BIT_KERNEL | 1104 | select CPU_SUPPORTS_64BIT_KERNEL |
1105 | select CPU_SUPPORTS_HIGHMEM | ||
1102 | help | 1106 | help |
1103 | Choose this option to build a kernel for release 2 or later of the | 1107 | Choose this option to build a kernel for release 2 or later of the |
1104 | MIPS64 architecture. Many modern embedded systems with a 64-bit | 1108 | MIPS64 architecture. Many modern embedded systems with a 64-bit |
diff --git a/arch/mips/Makefile b/arch/mips/Makefile index 38c0f3360d51..fe9da16f3a40 100644 --- a/arch/mips/Makefile +++ b/arch/mips/Makefile | |||
@@ -95,6 +95,7 @@ endif | |||
95 | # crossformat linking we rely on the elf2ecoff tool for format conversion. | 95 | # crossformat linking we rely on the elf2ecoff tool for format conversion. |
96 | # | 96 | # |
97 | cflags-y += -G 0 -mno-abicalls -fno-pic -pipe | 97 | cflags-y += -G 0 -mno-abicalls -fno-pic -pipe |
98 | cflags-y += -msoft-float | ||
98 | LDFLAGS_vmlinux += -G 0 -static -n -nostdlib | 99 | LDFLAGS_vmlinux += -G 0 -static -n -nostdlib |
99 | MODFLAGS += -mlong-calls | 100 | MODFLAGS += -mlong-calls |
100 | 101 | ||
diff --git a/arch/mips/arc/arc_con.c b/arch/mips/arc/arc_con.c index 51785a6a7328..bc32fe64f42a 100644 --- a/arch/mips/arc/arc_con.c +++ b/arch/mips/arc/arc_con.c | |||
@@ -24,7 +24,7 @@ static void prom_console_write(struct console *co, const char *s, | |||
24 | } | 24 | } |
25 | } | 25 | } |
26 | 26 | ||
27 | static int __init prom_console_setup(struct console *co, char *options) | 27 | static int prom_console_setup(struct console *co, char *options) |
28 | { | 28 | { |
29 | return !(prom_flags & PROM_FLAG_USE_AS_CONSOLE); | 29 | return !(prom_flags & PROM_FLAG_USE_AS_CONSOLE); |
30 | } | 30 | } |
diff --git a/arch/mips/configs/ip27_defconfig b/arch/mips/configs/ip27_defconfig index e17d3adff021..58c22cd344d3 100644 --- a/arch/mips/configs/ip27_defconfig +++ b/arch/mips/configs/ip27_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.15-rc2 | 3 | # Linux kernel version: 2.6.16-rc4 |
4 | # Thu Nov 24 01:06:21 2005 | 4 | # Tue Feb 21 13:44:31 2006 |
5 | # | 5 | # |
6 | CONFIG_MIPS=y | 6 | CONFIG_MIPS=y |
7 | 7 | ||
@@ -144,7 +144,6 @@ CONFIG_PREEMPT_BKL=y | |||
144 | # Code maturity level options | 144 | # Code maturity level options |
145 | # | 145 | # |
146 | CONFIG_EXPERIMENTAL=y | 146 | CONFIG_EXPERIMENTAL=y |
147 | CONFIG_CLEAN_COMPILE=y | ||
148 | CONFIG_LOCK_KERNEL=y | 147 | CONFIG_LOCK_KERNEL=y |
149 | CONFIG_INIT_ENV_ARG_LIMIT=32 | 148 | CONFIG_INIT_ENV_ARG_LIMIT=32 |
150 | 149 | ||
@@ -250,6 +249,7 @@ CONFIG_NET=y | |||
250 | # | 249 | # |
251 | # Networking options | 250 | # Networking options |
252 | # | 251 | # |
252 | # CONFIG_NETDEBUG is not set | ||
253 | CONFIG_PACKET=y | 253 | CONFIG_PACKET=y |
254 | CONFIG_PACKET_MMAP=y | 254 | CONFIG_PACKET_MMAP=y |
255 | CONFIG_UNIX=y | 255 | CONFIG_UNIX=y |
@@ -289,6 +289,7 @@ CONFIG_TCP_CONG_BIC=y | |||
289 | # SCTP Configuration (EXPERIMENTAL) | 289 | # SCTP Configuration (EXPERIMENTAL) |
290 | # | 290 | # |
291 | # CONFIG_IP_SCTP is not set | 291 | # CONFIG_IP_SCTP is not set |
292 | |||
292 | # CONFIG_ATM is not set | 293 | # CONFIG_ATM is not set |
293 | # CONFIG_BRIDGE is not set | 294 | # CONFIG_BRIDGE is not set |
294 | # CONFIG_VLAN_8021Q is not set | 295 | # CONFIG_VLAN_8021Q is not set |
@@ -448,7 +449,7 @@ CONFIG_SCSI_SAS_ATTRS=m | |||
448 | # | 449 | # |
449 | # SCSI low-level drivers | 450 | # SCSI low-level drivers |
450 | # | 451 | # |
451 | CONFIG_ISCSI_TCP=m | 452 | # CONFIG_ISCSI_TCP is not set |
452 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set | 453 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set |
453 | # CONFIG_SCSI_3W_9XXX is not set | 454 | # CONFIG_SCSI_3W_9XXX is not set |
454 | # CONFIG_SCSI_ACARD is not set | 455 | # CONFIG_SCSI_ACARD is not set |
@@ -774,6 +775,10 @@ CONFIG_USB_ARCH_HAS_OHCI=y | |||
774 | # | 775 | # |
775 | 776 | ||
776 | # | 777 | # |
778 | # EDAC - error detection and reporting (RAS) | ||
779 | # | ||
780 | |||
781 | # | ||
777 | # File systems | 782 | # File systems |
778 | # | 783 | # |
779 | CONFIG_EXT2_FS=y | 784 | CONFIG_EXT2_FS=y |
diff --git a/arch/mips/kernel/binfmt_elfn32.c b/arch/mips/kernel/binfmt_elfn32.c index d8e2674a1543..4a9f1ecefaf2 100644 --- a/arch/mips/kernel/binfmt_elfn32.c +++ b/arch/mips/kernel/binfmt_elfn32.c | |||
@@ -103,8 +103,9 @@ jiffies_to_compat_timeval(unsigned long jiffies, struct compat_timeval *value) | |||
103 | * one divide. | 103 | * one divide. |
104 | */ | 104 | */ |
105 | u64 nsec = (u64)jiffies * TICK_NSEC; | 105 | u64 nsec = (u64)jiffies * TICK_NSEC; |
106 | value->tv_sec = div_long_long_rem(nsec, NSEC_PER_SEC, &value->tv_usec); | 106 | long rem; |
107 | value->tv_usec /= NSEC_PER_USEC; | 107 | value->tv_sec = div_long_long_rem(nsec, NSEC_PER_SEC, &rem); |
108 | value->tv_usec = rem / NSEC_PER_USEC; | ||
108 | } | 109 | } |
109 | 110 | ||
110 | #define ELF_CORE_EFLAGS EF_MIPS_ABI2 | 111 | #define ELF_CORE_EFLAGS EF_MIPS_ABI2 |
diff --git a/arch/mips/kernel/binfmt_elfo32.c b/arch/mips/kernel/binfmt_elfo32.c index cec5f327e360..e31813779895 100644 --- a/arch/mips/kernel/binfmt_elfo32.c +++ b/arch/mips/kernel/binfmt_elfo32.c | |||
@@ -105,8 +105,9 @@ jiffies_to_compat_timeval(unsigned long jiffies, struct compat_timeval *value) | |||
105 | * one divide. | 105 | * one divide. |
106 | */ | 106 | */ |
107 | u64 nsec = (u64)jiffies * TICK_NSEC; | 107 | u64 nsec = (u64)jiffies * TICK_NSEC; |
108 | value->tv_sec = div_long_long_rem(nsec, NSEC_PER_SEC, &value->tv_usec); | 108 | long rem; |
109 | value->tv_usec /= NSEC_PER_USEC; | 109 | value->tv_sec = div_long_long_rem(nsec, NSEC_PER_SEC, &rem); |
110 | value->tv_usec = rem / NSEC_PER_USEC; | ||
110 | } | 111 | } |
111 | 112 | ||
112 | #undef ELF_CORE_COPY_REGS | 113 | #undef ELF_CORE_COPY_REGS |
diff --git a/arch/mips/kernel/irq-mv6434x.c b/arch/mips/kernel/irq-mv6434x.c index 0ac067f45cf5..0613f1f36b1b 100644 --- a/arch/mips/kernel/irq-mv6434x.c +++ b/arch/mips/kernel/irq-mv6434x.c | |||
@@ -11,12 +11,14 @@ | |||
11 | #include <linux/module.h> | 11 | #include <linux/module.h> |
12 | #include <linux/interrupt.h> | 12 | #include <linux/interrupt.h> |
13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
14 | #include <asm/ptrace.h> | ||
15 | #include <linux/sched.h> | ||
16 | #include <linux/kernel_stat.h> | 14 | #include <linux/kernel_stat.h> |
15 | #include <linux/mv643xx.h> | ||
16 | #include <linux/sched.h> | ||
17 | |||
18 | #include <asm/ptrace.h> | ||
17 | #include <asm/io.h> | 19 | #include <asm/io.h> |
18 | #include <asm/irq.h> | 20 | #include <asm/irq.h> |
19 | #include <linux/mv643xx.h> | 21 | #include <asm/marvell.h> |
20 | 22 | ||
21 | static unsigned int irq_base; | 23 | static unsigned int irq_base; |
22 | 24 | ||
diff --git a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c index 60353f5acc48..e00e5f6e7fdd 100644 --- a/arch/mips/kernel/linux32.c +++ b/arch/mips/kernel/linux32.c | |||
@@ -161,60 +161,6 @@ out: | |||
161 | return error; | 161 | return error; |
162 | } | 162 | } |
163 | 163 | ||
164 | struct dirent32 { | ||
165 | unsigned int d_ino; | ||
166 | unsigned int d_off; | ||
167 | unsigned short d_reclen; | ||
168 | char d_name[NAME_MAX + 1]; | ||
169 | }; | ||
170 | |||
171 | static void | ||
172 | xlate_dirent(void *dirent64, void *dirent32, long n) | ||
173 | { | ||
174 | long off; | ||
175 | struct dirent *dirp; | ||
176 | struct dirent32 *dirp32; | ||
177 | |||
178 | off = 0; | ||
179 | while (off < n) { | ||
180 | dirp = (struct dirent *)(dirent64 + off); | ||
181 | dirp32 = (struct dirent32 *)(dirent32 + off); | ||
182 | off += dirp->d_reclen; | ||
183 | dirp32->d_ino = dirp->d_ino; | ||
184 | dirp32->d_off = (unsigned int)dirp->d_off; | ||
185 | dirp32->d_reclen = dirp->d_reclen; | ||
186 | strncpy(dirp32->d_name, dirp->d_name, dirp->d_reclen - ((3 * 4) + 2)); | ||
187 | } | ||
188 | return; | ||
189 | } | ||
190 | |||
191 | asmlinkage long | ||
192 | sys32_getdents(unsigned int fd, void * dirent32, unsigned int count) | ||
193 | { | ||
194 | long n; | ||
195 | void *dirent64; | ||
196 | |||
197 | dirent64 = (void *)((unsigned long)(dirent32 + (sizeof(long) - 1)) & ~(sizeof(long) - 1)); | ||
198 | if ((n = sys_getdents(fd, dirent64, count - (dirent64 - dirent32))) < 0) | ||
199 | return(n); | ||
200 | xlate_dirent(dirent64, dirent32, n); | ||
201 | return(n); | ||
202 | } | ||
203 | |||
204 | asmlinkage int old_readdir(unsigned int fd, void * dirent, unsigned int count); | ||
205 | |||
206 | asmlinkage int | ||
207 | sys32_readdir(unsigned int fd, void * dirent32, unsigned int count) | ||
208 | { | ||
209 | int n; | ||
210 | struct dirent dirent64; | ||
211 | |||
212 | if ((n = old_readdir(fd, &dirent64, count)) < 0) | ||
213 | return(n); | ||
214 | xlate_dirent(&dirent64, dirent32, dirent64.d_reclen); | ||
215 | return(n); | ||
216 | } | ||
217 | |||
218 | asmlinkage int | 164 | asmlinkage int |
219 | sys32_waitpid(compat_pid_t pid, unsigned int *stat_addr, int options) | 165 | sys32_waitpid(compat_pid_t pid, unsigned int *stat_addr, int options) |
220 | { | 166 | { |
@@ -230,6 +176,9 @@ sysn32_waitid(int which, compat_pid_t pid, | |||
230 | long ret; | 176 | long ret; |
231 | mm_segment_t old_fs = get_fs(); | 177 | mm_segment_t old_fs = get_fs(); |
232 | 178 | ||
179 | if (!access_ok(VERIFY_WRITE, uinfo, sizeof(*uinfo))) | ||
180 | return -EFAULT; | ||
181 | |||
233 | set_fs (KERNEL_DS); | 182 | set_fs (KERNEL_DS); |
234 | ret = sys_waitid(which, pid, uinfo, options, | 183 | ret = sys_waitid(which, pid, uinfo, options, |
235 | uru ? (struct rusage __user *) &ru : NULL); | 184 | uru ? (struct rusage __user *) &ru : NULL); |
@@ -1450,25 +1399,6 @@ sys32_timer_create(u32 clock, struct sigevent32 __user *se32, timer_t __user *ti | |||
1450 | return sys_timer_create(clock, p, timer_id); | 1399 | return sys_timer_create(clock, p, timer_id); |
1451 | } | 1400 | } |
1452 | 1401 | ||
1453 | asmlinkage long | ||
1454 | sysn32_rt_sigtimedwait(const sigset_t __user *uthese, | ||
1455 | siginfo_t __user *uinfo, | ||
1456 | const struct compat_timespec __user *uts32, | ||
1457 | size_t sigsetsize) | ||
1458 | { | ||
1459 | struct timespec __user *uts = NULL; | ||
1460 | |||
1461 | if (uts32) { | ||
1462 | struct timespec ts; | ||
1463 | uts = compat_alloc_user_space(sizeof(struct timespec)); | ||
1464 | if (get_user(ts.tv_sec, &uts32->tv_sec) || | ||
1465 | get_user(ts.tv_nsec, &uts32->tv_nsec) || | ||
1466 | copy_to_user (uts, &ts, sizeof (ts))) | ||
1467 | return -EFAULT; | ||
1468 | } | ||
1469 | return sys_rt_sigtimedwait(uthese, uinfo, uts, sigsetsize); | ||
1470 | } | ||
1471 | |||
1472 | save_static_function(sys32_clone); | 1402 | save_static_function(sys32_clone); |
1473 | __attribute_used__ noinline static int | 1403 | __attribute_used__ noinline static int |
1474 | _sys32_clone(nabi_no_regargs struct pt_regs regs) | 1404 | _sys32_clone(nabi_no_regargs struct pt_regs regs) |
diff --git a/arch/mips/kernel/scall32-o32.S b/arch/mips/kernel/scall32-o32.S index d83e033dbc87..2f2dc54b2e26 100644 --- a/arch/mips/kernel/scall32-o32.S +++ b/arch/mips/kernel/scall32-o32.S | |||
@@ -626,7 +626,7 @@ einval: li v0, -EINVAL | |||
626 | sys sys_fstatat64 4 | 626 | sys sys_fstatat64 4 |
627 | sys sys_unlinkat 3 | 627 | sys sys_unlinkat 3 |
628 | sys sys_renameat 4 /* 4295 */ | 628 | sys sys_renameat 4 /* 4295 */ |
629 | sys sys_linkat 4 | 629 | sys sys_linkat 5 |
630 | sys sys_symlinkat 3 | 630 | sys sys_symlinkat 3 |
631 | sys sys_readlinkat 4 | 631 | sys sys_readlinkat 4 |
632 | sys sys_fchmodat 3 | 632 | sys sys_fchmodat 3 |
diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index bc4980cefc8b..02c8267e45e7 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S | |||
@@ -195,7 +195,7 @@ EXPORT(sysn32_call_table) | |||
195 | PTR sys_fdatasync | 195 | PTR sys_fdatasync |
196 | PTR sys_truncate | 196 | PTR sys_truncate |
197 | PTR sys_ftruncate /* 6075 */ | 197 | PTR sys_ftruncate /* 6075 */ |
198 | PTR sys32_getdents | 198 | PTR compat_sys_getdents |
199 | PTR sys_getcwd | 199 | PTR sys_getcwd |
200 | PTR sys_chdir | 200 | PTR sys_chdir |
201 | PTR sys_fchdir | 201 | PTR sys_fchdir |
@@ -245,9 +245,9 @@ EXPORT(sysn32_call_table) | |||
245 | PTR sys_capget | 245 | PTR sys_capget |
246 | PTR sys_capset | 246 | PTR sys_capset |
247 | PTR sys32_rt_sigpending /* 6125 */ | 247 | PTR sys32_rt_sigpending /* 6125 */ |
248 | PTR sysn32_rt_sigtimedwait | 248 | PTR compat_sys_rt_sigtimedwait |
249 | PTR sys_rt_sigqueueinfo | 249 | PTR sys_rt_sigqueueinfo |
250 | PTR sys32_rt_sigsuspend | 250 | PTR sysn32_rt_sigsuspend |
251 | PTR sys32_sigaltstack | 251 | PTR sys32_sigaltstack |
252 | PTR compat_sys_utime /* 6130 */ | 252 | PTR compat_sys_utime /* 6130 */ |
253 | PTR sys_mknod | 253 | PTR sys_mknod |
diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S index 5b0414018c9a..797e0d874889 100644 --- a/arch/mips/kernel/scall64-o32.S +++ b/arch/mips/kernel/scall64-o32.S | |||
@@ -293,7 +293,7 @@ sys_call_table: | |||
293 | PTR sys_uselib | 293 | PTR sys_uselib |
294 | PTR sys_swapon | 294 | PTR sys_swapon |
295 | PTR sys_reboot | 295 | PTR sys_reboot |
296 | PTR sys32_readdir | 296 | PTR compat_sys_old_readdir |
297 | PTR old_mmap /* 4090 */ | 297 | PTR old_mmap /* 4090 */ |
298 | PTR sys_munmap | 298 | PTR sys_munmap |
299 | PTR sys_truncate | 299 | PTR sys_truncate |
@@ -345,7 +345,7 @@ sys_call_table: | |||
345 | PTR sys_setfsuid | 345 | PTR sys_setfsuid |
346 | PTR sys_setfsgid | 346 | PTR sys_setfsgid |
347 | PTR sys32_llseek /* 4140 */ | 347 | PTR sys32_llseek /* 4140 */ |
348 | PTR sys32_getdents | 348 | PTR compat_sys_getdents |
349 | PTR compat_sys_select | 349 | PTR compat_sys_select |
350 | PTR sys_flock | 350 | PTR sys_flock |
351 | PTR sys_msync | 351 | PTR sys_msync |
diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index d86affa21278..d9293c558e41 100644 --- a/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c | |||
@@ -540,6 +540,9 @@ void __init setup_arch(char **cmdline_p) | |||
540 | sparse_init(); | 540 | sparse_init(); |
541 | paging_init(); | 541 | paging_init(); |
542 | resource_init(); | 542 | resource_init(); |
543 | #ifdef CONFIG_SMP | ||
544 | plat_smp_setup(); | ||
545 | #endif | ||
543 | } | 546 | } |
544 | 547 | ||
545 | int __init fpu_disable(char *s) | 548 | int __init fpu_disable(char *s) |
diff --git a/arch/mips/kernel/signal32.c b/arch/mips/kernel/signal32.c index 8a8b8dd90417..237cd8a2cd32 100644 --- a/arch/mips/kernel/signal32.c +++ b/arch/mips/kernel/signal32.c | |||
@@ -4,7 +4,7 @@ | |||
4 | * for more details. | 4 | * for more details. |
5 | * | 5 | * |
6 | * Copyright (C) 1991, 1992 Linus Torvalds | 6 | * Copyright (C) 1991, 1992 Linus Torvalds |
7 | * Copyright (C) 1994 - 2000 Ralf Baechle | 7 | * Copyright (C) 1994 - 2000, 2006 Ralf Baechle |
8 | * Copyright (C) 1999, 2000 Silicon Graphics, Inc. | 8 | * Copyright (C) 1999, 2000 Silicon Graphics, Inc. |
9 | */ | 9 | */ |
10 | #include <linux/cache.h> | 10 | #include <linux/cache.h> |
@@ -106,8 +106,6 @@ typedef struct compat_siginfo { | |||
106 | 106 | ||
107 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) | 107 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) |
108 | 108 | ||
109 | extern int do_signal32(sigset_t *oldset, struct pt_regs *regs); | ||
110 | |||
111 | /* 32-bit compatibility types */ | 109 | /* 32-bit compatibility types */ |
112 | 110 | ||
113 | #define _NSIG_BPW32 32 | 111 | #define _NSIG_BPW32 32 |
@@ -198,7 +196,7 @@ __attribute_used__ noinline static int | |||
198 | _sys32_sigsuspend(nabi_no_regargs struct pt_regs regs) | 196 | _sys32_sigsuspend(nabi_no_regargs struct pt_regs regs) |
199 | { | 197 | { |
200 | compat_sigset_t *uset; | 198 | compat_sigset_t *uset; |
201 | sigset_t newset, saveset; | 199 | sigset_t newset; |
202 | 200 | ||
203 | uset = (compat_sigset_t *) regs.regs[4]; | 201 | uset = (compat_sigset_t *) regs.regs[4]; |
204 | if (get_sigset(&newset, uset)) | 202 | if (get_sigset(&newset, uset)) |
@@ -206,19 +204,15 @@ _sys32_sigsuspend(nabi_no_regargs struct pt_regs regs) | |||
206 | sigdelsetmask(&newset, ~_BLOCKABLE); | 204 | sigdelsetmask(&newset, ~_BLOCKABLE); |
207 | 205 | ||
208 | spin_lock_irq(¤t->sighand->siglock); | 206 | spin_lock_irq(¤t->sighand->siglock); |
209 | saveset = current->blocked; | 207 | current->saved_sigmask = current->blocked; |
210 | current->blocked = newset; | 208 | current->blocked = newset; |
211 | recalc_sigpending(); | 209 | recalc_sigpending(); |
212 | spin_unlock_irq(¤t->sighand->siglock); | 210 | spin_unlock_irq(¤t->sighand->siglock); |
213 | 211 | ||
214 | regs.regs[2] = EINTR; | 212 | current->state = TASK_INTERRUPTIBLE; |
215 | regs.regs[7] = 1; | 213 | schedule(); |
216 | while (1) { | 214 | set_thread_flag(TIF_RESTORE_SIGMASK); |
217 | current->state = TASK_INTERRUPTIBLE; | 215 | return -ERESTARTNOHAND; |
218 | schedule(); | ||
219 | if (do_signal32(&saveset, ®s)) | ||
220 | return -EINTR; | ||
221 | } | ||
222 | } | 216 | } |
223 | 217 | ||
224 | save_static_function(sys32_rt_sigsuspend); | 218 | save_static_function(sys32_rt_sigsuspend); |
@@ -226,8 +220,8 @@ __attribute_used__ noinline static int | |||
226 | _sys32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs) | 220 | _sys32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs) |
227 | { | 221 | { |
228 | compat_sigset_t *uset; | 222 | compat_sigset_t *uset; |
229 | sigset_t newset, saveset; | 223 | sigset_t newset; |
230 | size_t sigsetsize; | 224 | size_t sigsetsize; |
231 | 225 | ||
232 | /* XXX Don't preclude handling different sized sigset_t's. */ | 226 | /* XXX Don't preclude handling different sized sigset_t's. */ |
233 | sigsetsize = regs.regs[5]; | 227 | sigsetsize = regs.regs[5]; |
@@ -240,19 +234,15 @@ _sys32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs) | |||
240 | sigdelsetmask(&newset, ~_BLOCKABLE); | 234 | sigdelsetmask(&newset, ~_BLOCKABLE); |
241 | 235 | ||
242 | spin_lock_irq(¤t->sighand->siglock); | 236 | spin_lock_irq(¤t->sighand->siglock); |
243 | saveset = current->blocked; | 237 | current->saved_sigmask = current->blocked; |
244 | current->blocked = newset; | 238 | current->blocked = newset; |
245 | recalc_sigpending(); | 239 | recalc_sigpending(); |
246 | spin_unlock_irq(¤t->sighand->siglock); | 240 | spin_unlock_irq(¤t->sighand->siglock); |
247 | 241 | ||
248 | regs.regs[2] = EINTR; | 242 | current->state = TASK_INTERRUPTIBLE; |
249 | regs.regs[7] = 1; | 243 | schedule(); |
250 | while (1) { | 244 | set_thread_flag(TIF_RESTORE_SIGMASK); |
251 | current->state = TASK_INTERRUPTIBLE; | 245 | return -ERESTARTNOHAND; |
252 | schedule(); | ||
253 | if (do_signal32(&saveset, ®s)) | ||
254 | return -EINTR; | ||
255 | } | ||
256 | } | 246 | } |
257 | 247 | ||
258 | asmlinkage int sys32_sigaction(int sig, const struct sigaction32 *act, | 248 | asmlinkage int sys32_sigaction(int sig, const struct sigaction32 *act, |
@@ -783,7 +773,7 @@ static inline int handle_signal(unsigned long sig, siginfo_t *info, | |||
783 | regs->regs[2] = EINTR; | 773 | regs->regs[2] = EINTR; |
784 | break; | 774 | break; |
785 | case ERESTARTSYS: | 775 | case ERESTARTSYS: |
786 | if(!(ka->sa.sa_flags & SA_RESTART)) { | 776 | if (!(ka->sa.sa_flags & SA_RESTART)) { |
787 | regs->regs[2] = EINTR; | 777 | regs->regs[2] = EINTR; |
788 | break; | 778 | break; |
789 | } | 779 | } |
@@ -810,9 +800,10 @@ static inline int handle_signal(unsigned long sig, siginfo_t *info, | |||
810 | return ret; | 800 | return ret; |
811 | } | 801 | } |
812 | 802 | ||
813 | int do_signal32(sigset_t *oldset, struct pt_regs *regs) | 803 | void do_signal32(struct pt_regs *regs) |
814 | { | 804 | { |
815 | struct k_sigaction ka; | 805 | struct k_sigaction ka; |
806 | sigset_t *oldset; | ||
816 | siginfo_t info; | 807 | siginfo_t info; |
817 | int signr; | 808 | int signr; |
818 | 809 | ||
@@ -822,17 +813,30 @@ int do_signal32(sigset_t *oldset, struct pt_regs *regs) | |||
822 | * if so. | 813 | * if so. |
823 | */ | 814 | */ |
824 | if (!user_mode(regs)) | 815 | if (!user_mode(regs)) |
825 | return 1; | 816 | return; |
826 | 817 | ||
827 | if (try_to_freeze()) | 818 | if (try_to_freeze()) |
828 | goto no_signal; | 819 | goto no_signal; |
829 | 820 | ||
830 | if (!oldset) | 821 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) |
822 | oldset = ¤t->saved_sigmask; | ||
823 | else | ||
831 | oldset = ¤t->blocked; | 824 | oldset = ¤t->blocked; |
832 | 825 | ||
833 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 826 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
834 | if (signr > 0) | 827 | if (signr > 0) { |
835 | return handle_signal(signr, &info, &ka, oldset, regs); | 828 | /* Whee! Actually deliver the signal. */ |
829 | if (handle_signal(signr, &info, &ka, oldset, regs) == 0) { | ||
830 | /* | ||
831 | * A signal was successfully delivered; the saved | ||
832 | * sigmask will have been stored in the signal frame, | ||
833 | * and will be restored by sigreturn, so we can simply | ||
834 | * clear the TIF_RESTORE_SIGMASK flag. | ||
835 | */ | ||
836 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
837 | clear_thread_flag(TIF_RESTORE_SIGMASK); | ||
838 | } | ||
839 | } | ||
836 | 840 | ||
837 | no_signal: | 841 | no_signal: |
838 | /* | 842 | /* |
@@ -853,7 +857,15 @@ no_signal: | |||
853 | regs->cp0_epc -= 4; | 857 | regs->cp0_epc -= 4; |
854 | } | 858 | } |
855 | } | 859 | } |
856 | return 0; | 860 | |
861 | /* | ||
862 | * If there's no signal to deliver, we just put the saved sigmask | ||
863 | * back | ||
864 | */ | ||
865 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) { | ||
866 | clear_thread_flag(TIF_RESTORE_SIGMASK); | ||
867 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | ||
868 | } | ||
857 | } | 869 | } |
858 | 870 | ||
859 | asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 *act, | 871 | asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 *act, |
diff --git a/arch/mips/kernel/signal_n32.c b/arch/mips/kernel/signal_n32.c index 5a3776096f07..3e168c08a3a8 100644 --- a/arch/mips/kernel/signal_n32.c +++ b/arch/mips/kernel/signal_n32.c | |||
@@ -81,6 +81,39 @@ struct rt_sigframe_n32 { | |||
81 | #endif | 81 | #endif |
82 | }; | 82 | }; |
83 | 83 | ||
84 | extern void sigset_from_compat (sigset_t *set, compat_sigset_t *compat); | ||
85 | |||
86 | save_static_function(sysn32_rt_sigsuspend); | ||
87 | __attribute_used__ noinline static int | ||
88 | _sysn32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs) | ||
89 | { | ||
90 | compat_sigset_t __user *unewset, uset; | ||
91 | size_t sigsetsize; | ||
92 | sigset_t newset; | ||
93 | |||
94 | /* XXX Don't preclude handling different sized sigset_t's. */ | ||
95 | sigsetsize = regs.regs[5]; | ||
96 | if (sigsetsize != sizeof(sigset_t)) | ||
97 | return -EINVAL; | ||
98 | |||
99 | unewset = (compat_sigset_t __user *) regs.regs[4]; | ||
100 | if (copy_from_user(&uset, unewset, sizeof(uset))) | ||
101 | return -EFAULT; | ||
102 | sigset_from_compat (&newset, &uset); | ||
103 | sigdelsetmask(&newset, ~_BLOCKABLE); | ||
104 | |||
105 | spin_lock_irq(¤t->sighand->siglock); | ||
106 | current->saved_sigmask = current->blocked; | ||
107 | current->blocked = newset; | ||
108 | recalc_sigpending(); | ||
109 | spin_unlock_irq(¤t->sighand->siglock); | ||
110 | |||
111 | current->state = TASK_INTERRUPTIBLE; | ||
112 | schedule(); | ||
113 | set_thread_flag(TIF_RESTORE_SIGMASK); | ||
114 | return -ERESTARTNOHAND; | ||
115 | } | ||
116 | |||
84 | save_static_function(sysn32_rt_sigreturn); | 117 | save_static_function(sysn32_rt_sigreturn); |
85 | __attribute_used__ noinline static void | 118 | __attribute_used__ noinline static void |
86 | _sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) | 119 | _sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) |
diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c index 25472fcaf715..06ed90752424 100644 --- a/arch/mips/kernel/smp.c +++ b/arch/mips/kernel/smp.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/timex.h> | 29 | #include <linux/timex.h> |
30 | #include <linux/sched.h> | 30 | #include <linux/sched.h> |
31 | #include <linux/cpumask.h> | 31 | #include <linux/cpumask.h> |
32 | #include <linux/cpu.h> | ||
32 | 33 | ||
33 | #include <asm/atomic.h> | 34 | #include <asm/atomic.h> |
34 | #include <asm/cpu.h> | 35 | #include <asm/cpu.h> |
@@ -235,7 +236,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus) | |||
235 | init_new_context(current, &init_mm); | 236 | init_new_context(current, &init_mm); |
236 | current_thread_info()->cpu = 0; | 237 | current_thread_info()->cpu = 0; |
237 | smp_tune_scheduling(); | 238 | smp_tune_scheduling(); |
238 | prom_prepare_cpus(max_cpus); | 239 | plat_prepare_cpus(max_cpus); |
239 | } | 240 | } |
240 | 241 | ||
241 | /* preload SMP state for boot cpu */ | 242 | /* preload SMP state for boot cpu */ |
@@ -424,6 +425,25 @@ void flush_tlb_one(unsigned long vaddr) | |||
424 | local_flush_tlb_one(vaddr); | 425 | local_flush_tlb_one(vaddr); |
425 | } | 426 | } |
426 | 427 | ||
428 | static DEFINE_PER_CPU(struct cpu, cpu_devices); | ||
429 | |||
430 | static int __init topology_init(void) | ||
431 | { | ||
432 | int cpu; | ||
433 | int ret; | ||
434 | |||
435 | for_each_cpu(cpu) { | ||
436 | ret = register_cpu(&per_cpu(cpu_devices, cpu), cpu, NULL); | ||
437 | if (ret) | ||
438 | printk(KERN_WARNING "topology_init: register_cpu %d " | ||
439 | "failed (%d)\n", cpu, ret); | ||
440 | } | ||
441 | |||
442 | return 0; | ||
443 | } | ||
444 | |||
445 | subsys_initcall(topology_init); | ||
446 | |||
427 | EXPORT_SYMBOL(flush_tlb_page); | 447 | EXPORT_SYMBOL(flush_tlb_page); |
428 | EXPORT_SYMBOL(flush_tlb_one); | 448 | EXPORT_SYMBOL(flush_tlb_one); |
429 | EXPORT_SYMBOL(cpu_data); | 449 | EXPORT_SYMBOL(cpu_data); |
diff --git a/arch/mips/kernel/smp_mt.c b/arch/mips/kernel/smp_mt.c index c930364830d0..993b8bf56aaf 100644 --- a/arch/mips/kernel/smp_mt.c +++ b/arch/mips/kernel/smp_mt.c | |||
@@ -143,7 +143,7 @@ static struct irqaction irq_call = { | |||
143 | * Make sure all CPU's are in a sensible state before we boot any of the | 143 | * Make sure all CPU's are in a sensible state before we boot any of the |
144 | * secondarys | 144 | * secondarys |
145 | */ | 145 | */ |
146 | void prom_prepare_cpus(unsigned int max_cpus) | 146 | void plat_smp_setup(void) |
147 | { | 147 | { |
148 | unsigned long val; | 148 | unsigned long val; |
149 | int i, num; | 149 | int i, num; |
@@ -179,11 +179,9 @@ void prom_prepare_cpus(unsigned int max_cpus) | |||
179 | write_vpe_c0_vpeconf0(tmp); | 179 | write_vpe_c0_vpeconf0(tmp); |
180 | 180 | ||
181 | /* Record this as available CPU */ | 181 | /* Record this as available CPU */ |
182 | if (i < max_cpus) { | 182 | cpu_set(i, phys_cpu_present_map); |
183 | cpu_set(i, phys_cpu_present_map); | 183 | __cpu_number_map[i] = ++num; |
184 | __cpu_number_map[i] = ++num; | 184 | __cpu_logical_map[num] = i; |
185 | __cpu_logical_map[num] = i; | ||
186 | } | ||
187 | } | 185 | } |
188 | 186 | ||
189 | /* disable multi-threading with TC's */ | 187 | /* disable multi-threading with TC's */ |
@@ -241,7 +239,10 @@ void prom_prepare_cpus(unsigned int max_cpus) | |||
241 | set_vi_handler (MIPS_CPU_IPI_RESCHED_IRQ, ipi_resched_dispatch); | 239 | set_vi_handler (MIPS_CPU_IPI_RESCHED_IRQ, ipi_resched_dispatch); |
242 | set_vi_handler (MIPS_CPU_IPI_CALL_IRQ, ipi_call_dispatch); | 240 | set_vi_handler (MIPS_CPU_IPI_CALL_IRQ, ipi_call_dispatch); |
243 | } | 241 | } |
242 | } | ||
244 | 243 | ||
244 | void __init plat_prepare_cpus(unsigned int max_cpus) | ||
245 | { | ||
245 | cpu_ipi_resched_irq = MIPSCPU_INT_BASE + MIPS_CPU_IPI_RESCHED_IRQ; | 246 | cpu_ipi_resched_irq = MIPSCPU_INT_BASE + MIPS_CPU_IPI_RESCHED_IRQ; |
246 | cpu_ipi_call_irq = MIPSCPU_INT_BASE + MIPS_CPU_IPI_CALL_IRQ; | 247 | cpu_ipi_call_irq = MIPSCPU_INT_BASE + MIPS_CPU_IPI_CALL_IRQ; |
247 | 248 | ||
diff --git a/arch/mips/kernel/time.c b/arch/mips/kernel/time.c index 7050b4ffffcd..42c94c771afb 100644 --- a/arch/mips/kernel/time.c +++ b/arch/mips/kernel/time.c | |||
@@ -163,7 +163,7 @@ void do_gettimeofday(struct timeval *tv) | |||
163 | unsigned long seq; | 163 | unsigned long seq; |
164 | unsigned long lost; | 164 | unsigned long lost; |
165 | unsigned long usec, sec; | 165 | unsigned long usec, sec; |
166 | unsigned long max_ntp_tick = tick_usec - tickadj; | 166 | unsigned long max_ntp_tick; |
167 | 167 | ||
168 | do { | 168 | do { |
169 | seq = read_seqbegin(&xtime_lock); | 169 | seq = read_seqbegin(&xtime_lock); |
@@ -178,12 +178,13 @@ void do_gettimeofday(struct timeval *tv) | |||
178 | * Better to lose some accuracy than have time go backwards.. | 178 | * Better to lose some accuracy than have time go backwards.. |
179 | */ | 179 | */ |
180 | if (unlikely(time_adjust < 0)) { | 180 | if (unlikely(time_adjust < 0)) { |
181 | max_ntp_tick = (USEC_PER_SEC / HZ) - tickadj; | ||
181 | usec = min(usec, max_ntp_tick); | 182 | usec = min(usec, max_ntp_tick); |
182 | 183 | ||
183 | if (lost) | 184 | if (lost) |
184 | usec += lost * max_ntp_tick; | 185 | usec += lost * max_ntp_tick; |
185 | } else if (unlikely(lost)) | 186 | } else if (unlikely(lost)) |
186 | usec += lost * tick_usec; | 187 | usec += lost * (USEC_PER_SEC / HZ); |
187 | 188 | ||
188 | sec = xtime.tv_sec; | 189 | sec = xtime.tv_sec; |
189 | usec += (xtime.tv_nsec / 1000); | 190 | usec += (xtime.tv_nsec / 1000); |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index c9d2b5147ca3..005debbfbe84 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * License. See the file "COPYING" in the main directory of this archive | 3 | * License. See the file "COPYING" in the main directory of this archive |
4 | * for more details. | 4 | * for more details. |
5 | * | 5 | * |
6 | * Copyright (C) 1994 - 1999, 2000, 01 Ralf Baechle | 6 | * Copyright (C) 1994 - 1999, 2000, 01, 06 Ralf Baechle |
7 | * Copyright (C) 1995, 1996 Paul M. Antoine | 7 | * Copyright (C) 1995, 1996 Paul M. Antoine |
8 | * Copyright (C) 1998 Ulf Carlsson | 8 | * Copyright (C) 1998 Ulf Carlsson |
9 | * Copyright (C) 1999 Silicon Graphics, Inc. | 9 | * Copyright (C) 1999 Silicon Graphics, Inc. |
@@ -548,6 +548,8 @@ asmlinkage void do_ov(struct pt_regs *regs) | |||
548 | { | 548 | { |
549 | siginfo_t info; | 549 | siginfo_t info; |
550 | 550 | ||
551 | die_if_kernel("Integer overflow", regs); | ||
552 | |||
551 | info.si_code = FPE_INTOVF; | 553 | info.si_code = FPE_INTOVF; |
552 | info.si_signo = SIGFPE; | 554 | info.si_signo = SIGFPE; |
553 | info.si_errno = 0; | 555 | info.si_errno = 0; |
diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S index ff699dbb99f7..2ad0cedf29fe 100644 --- a/arch/mips/kernel/vmlinux.lds.S +++ b/arch/mips/kernel/vmlinux.lds.S | |||
@@ -106,6 +106,9 @@ SECTIONS | |||
106 | .con_initcall.init : { *(.con_initcall.init) } | 106 | .con_initcall.init : { *(.con_initcall.init) } |
107 | __con_initcall_end = .; | 107 | __con_initcall_end = .; |
108 | SECURITY_INIT | 108 | SECURITY_INIT |
109 | /* .exit.text is discarded at runtime, not link time, to deal with | ||
110 | references from .rodata */ | ||
111 | .exit.text : { *(.exit.text) } | ||
109 | . = ALIGN(_PAGE_SIZE); | 112 | . = ALIGN(_PAGE_SIZE); |
110 | __initramfs_start = .; | 113 | __initramfs_start = .; |
111 | .init.ramfs : { *(.init.ramfs) } | 114 | .init.ramfs : { *(.init.ramfs) } |
@@ -133,7 +136,6 @@ SECTIONS | |||
133 | 136 | ||
134 | /* Sections to be discarded */ | 137 | /* Sections to be discarded */ |
135 | /DISCARD/ : { | 138 | /DISCARD/ : { |
136 | *(.exit.text) | ||
137 | *(.exit.data) | 139 | *(.exit.data) |
138 | *(.exitcall.exit) | 140 | *(.exitcall.exit) |
139 | 141 | ||
diff --git a/arch/mips/lib/iomap.c b/arch/mips/lib/iomap.c index 7e2ced715cfb..f4ac5bbcd81f 100644 --- a/arch/mips/lib/iomap.c +++ b/arch/mips/lib/iomap.c | |||
@@ -63,7 +63,7 @@ void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen) | |||
63 | return ioport_map(start, len); | 63 | return ioport_map(start, len); |
64 | if (flags & IORESOURCE_MEM) { | 64 | if (flags & IORESOURCE_MEM) { |
65 | if (flags & IORESOURCE_CACHEABLE) | 65 | if (flags & IORESOURCE_CACHEABLE) |
66 | return ioremap_cacheable_cow(start, len); | 66 | return ioremap_cachable(start, len); |
67 | return ioremap_nocache(start, len); | 67 | return ioremap_nocache(start, len); |
68 | } | 68 | } |
69 | 69 | ||
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c index 1b71d91e8268..0668e9bfce41 100644 --- a/arch/mips/mm/c-r4k.c +++ b/arch/mips/mm/c-r4k.c | |||
@@ -235,7 +235,9 @@ static inline void r4k_blast_scache_page_setup(void) | |||
235 | { | 235 | { |
236 | unsigned long sc_lsize = cpu_scache_line_size(); | 236 | unsigned long sc_lsize = cpu_scache_line_size(); |
237 | 237 | ||
238 | if (sc_lsize == 16) | 238 | if (scache_size == 0) |
239 | r4k_blast_scache_page = (void *)no_sc_noop; | ||
240 | else if (sc_lsize == 16) | ||
239 | r4k_blast_scache_page = blast_scache16_page; | 241 | r4k_blast_scache_page = blast_scache16_page; |
240 | else if (sc_lsize == 32) | 242 | else if (sc_lsize == 32) |
241 | r4k_blast_scache_page = blast_scache32_page; | 243 | r4k_blast_scache_page = blast_scache32_page; |
@@ -251,7 +253,9 @@ static inline void r4k_blast_scache_page_indexed_setup(void) | |||
251 | { | 253 | { |
252 | unsigned long sc_lsize = cpu_scache_line_size(); | 254 | unsigned long sc_lsize = cpu_scache_line_size(); |
253 | 255 | ||
254 | if (sc_lsize == 16) | 256 | if (scache_size == 0) |
257 | r4k_blast_scache_page_indexed = (void *)no_sc_noop; | ||
258 | else if (sc_lsize == 16) | ||
255 | r4k_blast_scache_page_indexed = blast_scache16_page_indexed; | 259 | r4k_blast_scache_page_indexed = blast_scache16_page_indexed; |
256 | else if (sc_lsize == 32) | 260 | else if (sc_lsize == 32) |
257 | r4k_blast_scache_page_indexed = blast_scache32_page_indexed; | 261 | r4k_blast_scache_page_indexed = blast_scache32_page_indexed; |
@@ -267,7 +271,9 @@ static inline void r4k_blast_scache_setup(void) | |||
267 | { | 271 | { |
268 | unsigned long sc_lsize = cpu_scache_line_size(); | 272 | unsigned long sc_lsize = cpu_scache_line_size(); |
269 | 273 | ||
270 | if (sc_lsize == 16) | 274 | if (scache_size == 0) |
275 | r4k_blast_scache = (void *)no_sc_noop; | ||
276 | else if (sc_lsize == 16) | ||
271 | r4k_blast_scache = blast_scache16; | 277 | r4k_blast_scache = blast_scache16; |
272 | else if (sc_lsize == 32) | 278 | else if (sc_lsize == 32) |
273 | r4k_blast_scache = blast_scache32; | 279 | r4k_blast_scache = blast_scache32; |
@@ -482,7 +488,7 @@ static inline void local_r4k_flush_icache_range(void *args) | |||
482 | protected_blast_dcache_range(start, end); | 488 | protected_blast_dcache_range(start, end); |
483 | } | 489 | } |
484 | 490 | ||
485 | if (!cpu_icache_snoops_remote_store) { | 491 | if (!cpu_icache_snoops_remote_store && scache_size) { |
486 | if (end - start > scache_size) | 492 | if (end - start > scache_size) |
487 | r4k_blast_scache(); | 493 | r4k_blast_scache(); |
488 | else | 494 | else |
@@ -651,7 +657,7 @@ static void local_r4k_flush_cache_sigtramp(void * arg) | |||
651 | 657 | ||
652 | R4600_HIT_CACHEOP_WAR_IMPL; | 658 | R4600_HIT_CACHEOP_WAR_IMPL; |
653 | protected_writeback_dcache_line(addr & ~(dc_lsize - 1)); | 659 | protected_writeback_dcache_line(addr & ~(dc_lsize - 1)); |
654 | if (!cpu_icache_snoops_remote_store) | 660 | if (!cpu_icache_snoops_remote_store && scache_size) |
655 | protected_writeback_scache_line(addr & ~(sc_lsize - 1)); | 661 | protected_writeback_scache_line(addr & ~(sc_lsize - 1)); |
656 | protected_flush_icache_line(addr & ~(ic_lsize - 1)); | 662 | protected_flush_icache_line(addr & ~(ic_lsize - 1)); |
657 | if (MIPS4K_ICACHE_REFILL_WAR) { | 663 | if (MIPS4K_ICACHE_REFILL_WAR) { |
diff --git a/arch/mips/mm/cex-sb1.S b/arch/mips/mm/cex-sb1.S index 0e71580774ff..e54a62f2807c 100644 --- a/arch/mips/mm/cex-sb1.S +++ b/arch/mips/mm/cex-sb1.S | |||
@@ -64,7 +64,7 @@ LEAF(except_vec2_sb1) | |||
64 | sd k0,0x170($0) | 64 | sd k0,0x170($0) |
65 | sd k1,0x178($0) | 65 | sd k1,0x178($0) |
66 | 66 | ||
67 | #if CONFIG_SB1_CEX_ALWAYS_FATAL | 67 | #ifdef CONFIG_SB1_CEX_ALWAYS_FATAL |
68 | j handle_vec2_sb1 | 68 | j handle_vec2_sb1 |
69 | nop | 69 | nop |
70 | #else | 70 | #else |
diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c index 0f9485806bac..ac4f4bfaae50 100644 --- a/arch/mips/mm/tlbex.c +++ b/arch/mips/mm/tlbex.c | |||
@@ -280,69 +280,69 @@ static void __init build_insn(u32 **buf, enum opcode opc, ...) | |||
280 | } | 280 | } |
281 | 281 | ||
282 | #define I_u1u2u3(op) \ | 282 | #define I_u1u2u3(op) \ |
283 | static inline void i##op(u32 **buf, unsigned int a, \ | 283 | static inline void __init i##op(u32 **buf, unsigned int a, \ |
284 | unsigned int b, unsigned int c) \ | 284 | unsigned int b, unsigned int c) \ |
285 | { \ | 285 | { \ |
286 | build_insn(buf, insn##op, a, b, c); \ | 286 | build_insn(buf, insn##op, a, b, c); \ |
287 | } | 287 | } |
288 | 288 | ||
289 | #define I_u2u1u3(op) \ | 289 | #define I_u2u1u3(op) \ |
290 | static inline void i##op(u32 **buf, unsigned int a, \ | 290 | static inline void __init i##op(u32 **buf, unsigned int a, \ |
291 | unsigned int b, unsigned int c) \ | 291 | unsigned int b, unsigned int c) \ |
292 | { \ | 292 | { \ |
293 | build_insn(buf, insn##op, b, a, c); \ | 293 | build_insn(buf, insn##op, b, a, c); \ |
294 | } | 294 | } |
295 | 295 | ||
296 | #define I_u3u1u2(op) \ | 296 | #define I_u3u1u2(op) \ |
297 | static inline void i##op(u32 **buf, unsigned int a, \ | 297 | static inline void __init i##op(u32 **buf, unsigned int a, \ |
298 | unsigned int b, unsigned int c) \ | 298 | unsigned int b, unsigned int c) \ |
299 | { \ | 299 | { \ |
300 | build_insn(buf, insn##op, b, c, a); \ | 300 | build_insn(buf, insn##op, b, c, a); \ |
301 | } | 301 | } |
302 | 302 | ||
303 | #define I_u1u2s3(op) \ | 303 | #define I_u1u2s3(op) \ |
304 | static inline void i##op(u32 **buf, unsigned int a, \ | 304 | static inline void __init i##op(u32 **buf, unsigned int a, \ |
305 | unsigned int b, signed int c) \ | 305 | unsigned int b, signed int c) \ |
306 | { \ | 306 | { \ |
307 | build_insn(buf, insn##op, a, b, c); \ | 307 | build_insn(buf, insn##op, a, b, c); \ |
308 | } | 308 | } |
309 | 309 | ||
310 | #define I_u2s3u1(op) \ | 310 | #define I_u2s3u1(op) \ |
311 | static inline void i##op(u32 **buf, unsigned int a, \ | 311 | static inline void __init i##op(u32 **buf, unsigned int a, \ |
312 | signed int b, unsigned int c) \ | 312 | signed int b, unsigned int c) \ |
313 | { \ | 313 | { \ |
314 | build_insn(buf, insn##op, c, a, b); \ | 314 | build_insn(buf, insn##op, c, a, b); \ |
315 | } | 315 | } |
316 | 316 | ||
317 | #define I_u2u1s3(op) \ | 317 | #define I_u2u1s3(op) \ |
318 | static inline void i##op(u32 **buf, unsigned int a, \ | 318 | static inline void __init i##op(u32 **buf, unsigned int a, \ |
319 | unsigned int b, signed int c) \ | 319 | unsigned int b, signed int c) \ |
320 | { \ | 320 | { \ |
321 | build_insn(buf, insn##op, b, a, c); \ | 321 | build_insn(buf, insn##op, b, a, c); \ |
322 | } | 322 | } |
323 | 323 | ||
324 | #define I_u1u2(op) \ | 324 | #define I_u1u2(op) \ |
325 | static inline void i##op(u32 **buf, unsigned int a, \ | 325 | static inline void __init i##op(u32 **buf, unsigned int a, \ |
326 | unsigned int b) \ | 326 | unsigned int b) \ |
327 | { \ | 327 | { \ |
328 | build_insn(buf, insn##op, a, b); \ | 328 | build_insn(buf, insn##op, a, b); \ |
329 | } | 329 | } |
330 | 330 | ||
331 | #define I_u1s2(op) \ | 331 | #define I_u1s2(op) \ |
332 | static inline void i##op(u32 **buf, unsigned int a, \ | 332 | static inline void __init i##op(u32 **buf, unsigned int a, \ |
333 | signed int b) \ | 333 | signed int b) \ |
334 | { \ | 334 | { \ |
335 | build_insn(buf, insn##op, a, b); \ | 335 | build_insn(buf, insn##op, a, b); \ |
336 | } | 336 | } |
337 | 337 | ||
338 | #define I_u1(op) \ | 338 | #define I_u1(op) \ |
339 | static inline void i##op(u32 **buf, unsigned int a) \ | 339 | static inline void __init i##op(u32 **buf, unsigned int a) \ |
340 | { \ | 340 | { \ |
341 | build_insn(buf, insn##op, a); \ | 341 | build_insn(buf, insn##op, a); \ |
342 | } | 342 | } |
343 | 343 | ||
344 | #define I_0(op) \ | 344 | #define I_0(op) \ |
345 | static inline void i##op(u32 **buf) \ | 345 | static inline void __init i##op(u32 **buf) \ |
346 | { \ | 346 | { \ |
347 | build_insn(buf, insn##op); \ | 347 | build_insn(buf, insn##op); \ |
348 | } | 348 | } |
@@ -623,42 +623,42 @@ static __init int __attribute__((unused)) insn_has_bdelay(struct reloc *rel, | |||
623 | } | 623 | } |
624 | 624 | ||
625 | /* convenience functions for labeled branches */ | 625 | /* convenience functions for labeled branches */ |
626 | static void __attribute__((unused)) il_bltz(u32 **p, struct reloc **r, | 626 | static void __init __attribute__((unused)) |
627 | unsigned int reg, enum label_id l) | 627 | il_bltz(u32 **p, struct reloc **r, unsigned int reg, enum label_id l) |
628 | { | 628 | { |
629 | r_mips_pc16(r, *p, l); | 629 | r_mips_pc16(r, *p, l); |
630 | i_bltz(p, reg, 0); | 630 | i_bltz(p, reg, 0); |
631 | } | 631 | } |
632 | 632 | ||
633 | static void __attribute__((unused)) il_b(u32 **p, struct reloc **r, | 633 | static void __init __attribute__((unused)) il_b(u32 **p, struct reloc **r, |
634 | enum label_id l) | 634 | enum label_id l) |
635 | { | 635 | { |
636 | r_mips_pc16(r, *p, l); | 636 | r_mips_pc16(r, *p, l); |
637 | i_b(p, 0); | 637 | i_b(p, 0); |
638 | } | 638 | } |
639 | 639 | ||
640 | static void il_beqz(u32 **p, struct reloc **r, unsigned int reg, | 640 | static void __init il_beqz(u32 **p, struct reloc **r, unsigned int reg, |
641 | enum label_id l) | 641 | enum label_id l) |
642 | { | 642 | { |
643 | r_mips_pc16(r, *p, l); | 643 | r_mips_pc16(r, *p, l); |
644 | i_beqz(p, reg, 0); | 644 | i_beqz(p, reg, 0); |
645 | } | 645 | } |
646 | 646 | ||
647 | static void __attribute__((unused)) | 647 | static void __init __attribute__((unused)) |
648 | il_beqzl(u32 **p, struct reloc **r, unsigned int reg, enum label_id l) | 648 | il_beqzl(u32 **p, struct reloc **r, unsigned int reg, enum label_id l) |
649 | { | 649 | { |
650 | r_mips_pc16(r, *p, l); | 650 | r_mips_pc16(r, *p, l); |
651 | i_beqzl(p, reg, 0); | 651 | i_beqzl(p, reg, 0); |
652 | } | 652 | } |
653 | 653 | ||
654 | static void il_bnez(u32 **p, struct reloc **r, unsigned int reg, | 654 | static void __init il_bnez(u32 **p, struct reloc **r, unsigned int reg, |
655 | enum label_id l) | 655 | enum label_id l) |
656 | { | 656 | { |
657 | r_mips_pc16(r, *p, l); | 657 | r_mips_pc16(r, *p, l); |
658 | i_bnez(p, reg, 0); | 658 | i_bnez(p, reg, 0); |
659 | } | 659 | } |
660 | 660 | ||
661 | static void il_bgezl(u32 **p, struct reloc **r, unsigned int reg, | 661 | static void __init il_bgezl(u32 **p, struct reloc **r, unsigned int reg, |
662 | enum label_id l) | 662 | enum label_id l) |
663 | { | 663 | { |
664 | r_mips_pc16(r, *p, l); | 664 | r_mips_pc16(r, *p, l); |
diff --git a/arch/mips/momentum/jaguar_atx/prom.c b/arch/mips/momentum/jaguar_atx/prom.c index aae7a802767a..1cadaa92946a 100644 --- a/arch/mips/momentum/jaguar_atx/prom.c +++ b/arch/mips/momentum/jaguar_atx/prom.c | |||
@@ -21,10 +21,10 @@ | |||
21 | #include <linux/mm.h> | 21 | #include <linux/mm.h> |
22 | #include <linux/sched.h> | 22 | #include <linux/sched.h> |
23 | #include <linux/bootmem.h> | 23 | #include <linux/bootmem.h> |
24 | #include <linux/mv643xx.h> | ||
24 | 25 | ||
25 | #include <asm/addrspace.h> | 26 | #include <asm/addrspace.h> |
26 | #include <asm/bootinfo.h> | 27 | #include <asm/bootinfo.h> |
27 | #include <asm/mv64340.h> | ||
28 | #include <asm/pmon.h> | 28 | #include <asm/pmon.h> |
29 | 29 | ||
30 | #include "jaguar_atx_fpga.h" | 30 | #include "jaguar_atx_fpga.h" |
diff --git a/arch/mips/momentum/jaguar_atx/setup.c b/arch/mips/momentum/jaguar_atx/setup.c index 301d67226d72..2699917b640a 100644 --- a/arch/mips/momentum/jaguar_atx/setup.c +++ b/arch/mips/momentum/jaguar_atx/setup.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * BRIEF MODULE DESCRIPTION | 2 | * BRIEF MODULE DESCRIPTION |
3 | * Momentum Computer Jaguar-ATX board dependent boot routines | 3 | * Momentum Computer Jaguar-ATX board dependent boot routines |
4 | * | 4 | * |
5 | * Copyright (C) 1996, 1997, 2001, 2004 Ralf Baechle (ralf@linux-mips.org) | 5 | * Copyright (C) 1996, 1997, 2001, 04, 06 Ralf Baechle (ralf@linux-mips.org) |
6 | * Copyright (C) 2000 RidgeRun, Inc. | 6 | * Copyright (C) 2000 RidgeRun, Inc. |
7 | * Copyright (C) 2001 Red Hat, Inc. | 7 | * Copyright (C) 2001 Red Hat, Inc. |
8 | * Copyright (C) 2002 Momentum Computer | 8 | * Copyright (C) 2002 Momentum Computer |
@@ -55,6 +55,8 @@ | |||
55 | #include <linux/interrupt.h> | 55 | #include <linux/interrupt.h> |
56 | #include <linux/timex.h> | 56 | #include <linux/timex.h> |
57 | #include <linux/vmalloc.h> | 57 | #include <linux/vmalloc.h> |
58 | #include <linux/mv643xx.h> | ||
59 | |||
58 | #include <asm/time.h> | 60 | #include <asm/time.h> |
59 | #include <asm/bootinfo.h> | 61 | #include <asm/bootinfo.h> |
60 | #include <asm/page.h> | 62 | #include <asm/page.h> |
@@ -64,7 +66,6 @@ | |||
64 | #include <asm/ptrace.h> | 66 | #include <asm/ptrace.h> |
65 | #include <asm/reboot.h> | 67 | #include <asm/reboot.h> |
66 | #include <asm/tlbflush.h> | 68 | #include <asm/tlbflush.h> |
67 | #include <asm/mv64340.h> | ||
68 | 69 | ||
69 | #include "jaguar_atx_fpga.h" | 70 | #include "jaguar_atx_fpga.h" |
70 | 71 | ||
diff --git a/arch/mips/momentum/ocelot_c/irq.c b/arch/mips/momentum/ocelot_c/irq.c index 300fe8e4fbe8..a5764bc20e36 100644 --- a/arch/mips/momentum/ocelot_c/irq.c +++ b/arch/mips/momentum/ocelot_c/irq.c | |||
@@ -41,11 +41,11 @@ | |||
41 | #include <linux/slab.h> | 41 | #include <linux/slab.h> |
42 | #include <linux/random.h> | 42 | #include <linux/random.h> |
43 | #include <linux/bitops.h> | 43 | #include <linux/bitops.h> |
44 | #include <linux/mv643xx.h> | ||
44 | #include <asm/bootinfo.h> | 45 | #include <asm/bootinfo.h> |
45 | #include <asm/io.h> | 46 | #include <asm/io.h> |
46 | #include <asm/irq_cpu.h> | 47 | #include <asm/irq_cpu.h> |
47 | #include <asm/mipsregs.h> | 48 | #include <asm/mipsregs.h> |
48 | #include <asm/mv64340.h> | ||
49 | #include <asm/system.h> | 49 | #include <asm/system.h> |
50 | 50 | ||
51 | extern asmlinkage void ocelot_handle_int(void); | 51 | extern asmlinkage void ocelot_handle_int(void); |
diff --git a/arch/mips/momentum/ocelot_c/prom.c b/arch/mips/momentum/ocelot_c/prom.c index 5b6809724b15..e92364482c7b 100644 --- a/arch/mips/momentum/ocelot_c/prom.c +++ b/arch/mips/momentum/ocelot_c/prom.c | |||
@@ -19,10 +19,10 @@ | |||
19 | #include <linux/mm.h> | 19 | #include <linux/mm.h> |
20 | #include <linux/sched.h> | 20 | #include <linux/sched.h> |
21 | #include <linux/bootmem.h> | 21 | #include <linux/bootmem.h> |
22 | #include <linux/mv643xx.h> | ||
22 | 23 | ||
23 | #include <asm/addrspace.h> | 24 | #include <asm/addrspace.h> |
24 | #include <asm/bootinfo.h> | 25 | #include <asm/bootinfo.h> |
25 | #include <asm/mv64340.h> | ||
26 | #include <asm/pmon.h> | 26 | #include <asm/pmon.h> |
27 | 27 | ||
28 | #include "ocelot_c_fpga.h" | 28 | #include "ocelot_c_fpga.h" |
diff --git a/arch/mips/momentum/ocelot_c/setup.c b/arch/mips/momentum/ocelot_c/setup.c index 15998d8a9341..bd02e60d037a 100644 --- a/arch/mips/momentum/ocelot_c/setup.c +++ b/arch/mips/momentum/ocelot_c/setup.c | |||
@@ -54,6 +54,7 @@ | |||
54 | #include <linux/pm.h> | 54 | #include <linux/pm.h> |
55 | #include <linux/timex.h> | 55 | #include <linux/timex.h> |
56 | #include <linux/vmalloc.h> | 56 | #include <linux/vmalloc.h> |
57 | #include <linux/mv643xx.h> | ||
57 | 58 | ||
58 | #include <asm/time.h> | 59 | #include <asm/time.h> |
59 | #include <asm/bootinfo.h> | 60 | #include <asm/bootinfo.h> |
@@ -64,9 +65,9 @@ | |||
64 | #include <asm/processor.h> | 65 | #include <asm/processor.h> |
65 | #include <asm/ptrace.h> | 66 | #include <asm/ptrace.h> |
66 | #include <asm/reboot.h> | 67 | #include <asm/reboot.h> |
68 | #include <asm/marvell.h> | ||
67 | #include <linux/bootmem.h> | 69 | #include <linux/bootmem.h> |
68 | #include <linux/blkdev.h> | 70 | #include <linux/blkdev.h> |
69 | #include <asm/mv64340.h> | ||
70 | #include "ocelot_c_fpga.h" | 71 | #include "ocelot_c_fpga.h" |
71 | 72 | ||
72 | unsigned long marvell_base; | 73 | unsigned long marvell_base; |
@@ -252,22 +253,22 @@ void __init plat_setup(void) | |||
252 | /* shut down ethernet ports, just to be sure our memory doesn't get | 253 | /* shut down ethernet ports, just to be sure our memory doesn't get |
253 | * corrupted by random ethernet traffic. | 254 | * corrupted by random ethernet traffic. |
254 | */ | 255 | */ |
255 | MV_WRITE(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(0), 0xff << 8); | 256 | MV_WRITE(MV643XX_ETH_TRANSMIT_QUEUE_COMMAND_REG(0), 0xff << 8); |
256 | MV_WRITE(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(1), 0xff << 8); | 257 | MV_WRITE(MV643XX_ETH_TRANSMIT_QUEUE_COMMAND_REG(1), 0xff << 8); |
257 | MV_WRITE(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(0), 0xff << 8); | 258 | MV_WRITE(MV643XX_ETH_RECEIVE_QUEUE_COMMAND_REG(0), 0xff << 8); |
258 | MV_WRITE(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(1), 0xff << 8); | 259 | MV_WRITE(MV643XX_ETH_RECEIVE_QUEUE_COMMAND_REG(1), 0xff << 8); |
259 | do {} | 260 | do {} |
260 | while (MV_READ(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(0)) & 0xff); | 261 | while (MV_READ(MV643XX_ETH_RECEIVE_QUEUE_COMMAND_REG(0)) & 0xff); |
261 | do {} | 262 | do {} |
262 | while (MV_READ(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(1)) & 0xff); | 263 | while (MV_READ(MV643XX_ETH_RECEIVE_QUEUE_COMMAND_REG(1)) & 0xff); |
263 | do {} | 264 | do {} |
264 | while (MV_READ(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(0)) & 0xff); | 265 | while (MV_READ(MV643XX_ETH_TRANSMIT_QUEUE_COMMAND_REG(0)) & 0xff); |
265 | do {} | 266 | do {} |
266 | while (MV_READ(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(1)) & 0xff); | 267 | while (MV_READ(MV643XX_ETH_TRANSMIT_QUEUE_COMMAND_REG(1)) & 0xff); |
267 | MV_WRITE(MV64340_ETH_PORT_SERIAL_CONTROL_REG(0), | 268 | MV_WRITE(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(0), |
268 | MV_READ(MV64340_ETH_PORT_SERIAL_CONTROL_REG(0)) & ~1); | 269 | MV_READ(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(0)) & ~1); |
269 | MV_WRITE(MV64340_ETH_PORT_SERIAL_CONTROL_REG(1), | 270 | MV_WRITE(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(1), |
270 | MV_READ(MV64340_ETH_PORT_SERIAL_CONTROL_REG(1)) & ~1); | 271 | MV_READ(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(1)) & ~1); |
271 | 272 | ||
272 | /* Turn off the Bit-Error LED */ | 273 | /* Turn off the Bit-Error LED */ |
273 | OCELOT_FPGA_WRITE(0x80, CLR); | 274 | OCELOT_FPGA_WRITE(0x80, CLR); |
diff --git a/arch/mips/pci/pci-ocelot-c.c b/arch/mips/pci/pci-ocelot-c.c index 1d84d36e034d..027759f7c904 100644 --- a/arch/mips/pci/pci-ocelot-c.c +++ b/arch/mips/pci/pci-ocelot-c.c | |||
@@ -3,15 +3,17 @@ | |||
3 | * License. See the file "COPYING" in the main directory of this archive | 3 | * License. See the file "COPYING" in the main directory of this archive |
4 | * for more details. | 4 | * for more details. |
5 | * | 5 | * |
6 | * Copyright (C) 2004 by Ralf Baechle (ralf@linux-mips.org) | 6 | * Copyright (C) 2004, 06 by Ralf Baechle (ralf@linux-mips.org) |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #include <linux/types.h> | 9 | #include <linux/types.h> |
10 | #include <linux/pci.h> | 10 | #include <linux/pci.h> |
11 | #include <asm/mv64340.h> | 11 | #include <linux/mv643xx.h> |
12 | 12 | ||
13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
14 | 14 | ||
15 | #include <asm/marvell.h> | ||
16 | |||
15 | /* | 17 | /* |
16 | * We assume the address ranges have already been setup appropriately by | 18 | * We assume the address ranges have already been setup appropriately by |
17 | * the firmware. PMON in case of the Ocelot C does that. | 19 | * the firmware. PMON in case of the Ocelot C does that. |
diff --git a/arch/mips/pmc-sierra/yosemite/smp.c b/arch/mips/pmc-sierra/yosemite/smp.c index f17f575f58f0..c197311e15d3 100644 --- a/arch/mips/pmc-sierra/yosemite/smp.c +++ b/arch/mips/pmc-sierra/yosemite/smp.c | |||
@@ -50,37 +50,25 @@ void __init prom_grab_secondary(void) | |||
50 | * We don't want to start the secondary CPU yet nor do we have a nice probing | 50 | * We don't want to start the secondary CPU yet nor do we have a nice probing |
51 | * feature in PMON so we just assume presence of the secondary core. | 51 | * feature in PMON so we just assume presence of the secondary core. |
52 | */ | 52 | */ |
53 | static char maxcpus_string[] __initdata = | 53 | void __init plat_smp_setup(void) |
54 | KERN_WARNING "max_cpus set to 0; using 1 instead\n"; | ||
55 | |||
56 | void __init prom_prepare_cpus(unsigned int max_cpus) | ||
57 | { | 54 | { |
58 | int enabled = 0, i; | 55 | int i; |
59 | |||
60 | if (max_cpus == 0) { | ||
61 | printk(maxcpus_string); | ||
62 | max_cpus = 1; | ||
63 | } | ||
64 | 56 | ||
65 | cpus_clear(phys_cpu_present_map); | 57 | cpus_clear(phys_cpu_present_map); |
66 | 58 | ||
67 | for (i = 0; i < 2; i++) { | 59 | for (i = 0; i < 2; i++) { |
68 | if (i == max_cpus) | ||
69 | break; | ||
70 | |||
71 | /* | ||
72 | * The boot CPU | ||
73 | */ | ||
74 | cpu_set(i, phys_cpu_present_map); | 60 | cpu_set(i, phys_cpu_present_map); |
75 | __cpu_number_map[i] = i; | 61 | __cpu_number_map[i] = i; |
76 | __cpu_logical_map[i] = i; | 62 | __cpu_logical_map[i] = i; |
77 | enabled++; | ||
78 | } | 63 | } |
64 | } | ||
79 | 65 | ||
66 | void __init plat_prepare_cpus(unsigned int max_cpus) | ||
67 | { | ||
80 | /* | 68 | /* |
81 | * Be paranoid. Enable the IPI only if we're really about to go SMP. | 69 | * Be paranoid. Enable the IPI only if we're really about to go SMP. |
82 | */ | 70 | */ |
83 | if (enabled > 1) | 71 | if (cpus_weight(cpu_possible_map)) |
84 | set_c0_status(STATUSF_IP5); | 72 | set_c0_status(STATUSF_IP5); |
85 | } | 73 | } |
86 | 74 | ||
@@ -94,7 +82,7 @@ void __init prom_prepare_cpus(unsigned int max_cpus) | |||
94 | void prom_boot_secondary(int cpu, struct task_struct *idle) | 82 | void prom_boot_secondary(int cpu, struct task_struct *idle) |
95 | { | 83 | { |
96 | unsigned long gp = (unsigned long) task_thread_info(idle); | 84 | unsigned long gp = (unsigned long) task_thread_info(idle); |
97 | unsigned long sp = __KSTK_TOP(idle); | 85 | unsigned long sp = __KSTK_TOS(idle); |
98 | 86 | ||
99 | secondary_sp = sp; | 87 | secondary_sp = sp; |
100 | secondary_gp = gp; | 88 | secondary_gp = gp; |
diff --git a/arch/mips/sgi-ip27/ip27-smp.c b/arch/mips/sgi-ip27/ip27-smp.c index dbef3f6b5650..09fa7f5216f0 100644 --- a/arch/mips/sgi-ip27/ip27-smp.c +++ b/arch/mips/sgi-ip27/ip27-smp.c | |||
@@ -140,7 +140,7 @@ static __init void intr_clear_all(nasid_t nasid) | |||
140 | REMOTE_HUB_CLR_INTR(nasid, i); | 140 | REMOTE_HUB_CLR_INTR(nasid, i); |
141 | } | 141 | } |
142 | 142 | ||
143 | void __init prom_prepare_cpus(unsigned int max_cpus) | 143 | void __init plat_smp_setup(void) |
144 | { | 144 | { |
145 | cnodeid_t cnode; | 145 | cnodeid_t cnode; |
146 | 146 | ||
@@ -161,6 +161,11 @@ void __init prom_prepare_cpus(unsigned int max_cpus) | |||
161 | alloc_cpupda(0, 0); | 161 | alloc_cpupda(0, 0); |
162 | } | 162 | } |
163 | 163 | ||
164 | void __init plat_prepare_cpus(unsigned int max_cpus) | ||
165 | { | ||
166 | /* We already did everything necessary earlier */ | ||
167 | } | ||
168 | |||
164 | /* | 169 | /* |
165 | * Launch a slave into smp_bootstrap(). It doesn't take an argument, and we | 170 | * Launch a slave into smp_bootstrap(). It doesn't take an argument, and we |
166 | * set sp to the kernel stack of the newly created idle process, gp to the proc | 171 | * set sp to the kernel stack of the newly created idle process, gp to the proc |
diff --git a/arch/mips/sibyte/Kconfig b/arch/mips/sibyte/Kconfig index de46f62ac462..816aee7fcd25 100644 --- a/arch/mips/sibyte/Kconfig +++ b/arch/mips/sibyte/Kconfig | |||
@@ -102,11 +102,11 @@ config SIMULATION | |||
102 | Build a kernel suitable for running under the GDB simulator. | 102 | Build a kernel suitable for running under the GDB simulator. |
103 | Primarily adjusts the kernel's notion of time. | 103 | Primarily adjusts the kernel's notion of time. |
104 | 104 | ||
105 | config CONFIG_SB1_CEX_ALWAYS_FATAL | 105 | config SB1_CEX_ALWAYS_FATAL |
106 | bool "All cache exceptions considered fatal (no recovery attempted)" | 106 | bool "All cache exceptions considered fatal (no recovery attempted)" |
107 | depends on SIBYTE_SB1xxx_SOC | 107 | depends on SIBYTE_SB1xxx_SOC |
108 | 108 | ||
109 | config CONFIG_SB1_CERR_STALL | 109 | config SB1_CERR_STALL |
110 | bool "Stall (rather than panic) on fatal cache error" | 110 | bool "Stall (rather than panic) on fatal cache error" |
111 | depends on SIBYTE_SB1xxx_SOC | 111 | depends on SIBYTE_SB1xxx_SOC |
112 | 112 | ||
diff --git a/arch/mips/sibyte/bcm1480/irq.c b/arch/mips/sibyte/bcm1480/irq.c index b2a1ba5d23df..9cf7d713b13c 100644 --- a/arch/mips/sibyte/bcm1480/irq.c +++ b/arch/mips/sibyte/bcm1480/irq.c | |||
@@ -139,7 +139,7 @@ void bcm1480_unmask_irq(int cpu, int irq) | |||
139 | #ifdef CONFIG_SMP | 139 | #ifdef CONFIG_SMP |
140 | static void bcm1480_set_affinity(unsigned int irq, cpumask_t mask) | 140 | static void bcm1480_set_affinity(unsigned int irq, cpumask_t mask) |
141 | { | 141 | { |
142 | int i = 0, old_cpu, cpu, int_on; | 142 | int i = 0, old_cpu, cpu, int_on, k; |
143 | u64 cur_ints; | 143 | u64 cur_ints; |
144 | irq_desc_t *desc = irq_desc + irq; | 144 | irq_desc_t *desc = irq_desc + irq; |
145 | unsigned long flags; | 145 | unsigned long flags; |
@@ -165,7 +165,6 @@ static void bcm1480_set_affinity(unsigned int irq, cpumask_t mask) | |||
165 | irq_dirty -= BCM1480_NR_IRQS_HALF; | 165 | irq_dirty -= BCM1480_NR_IRQS_HALF; |
166 | } | 166 | } |
167 | 167 | ||
168 | int k; | ||
169 | for (k=0; k<2; k++) { /* Loop through high and low interrupt mask register */ | 168 | for (k=0; k<2; k++) { /* Loop through high and low interrupt mask register */ |
170 | cur_ints = ____raw_readq(IOADDR(A_BCM1480_IMR_MAPPER(old_cpu) + R_BCM1480_IMR_INTERRUPT_MASK_H + (k*BCM1480_IMR_HL_SPACING))); | 169 | cur_ints = ____raw_readq(IOADDR(A_BCM1480_IMR_MAPPER(old_cpu) + R_BCM1480_IMR_INTERRUPT_MASK_H + (k*BCM1480_IMR_HL_SPACING))); |
171 | int_on = !(cur_ints & (((u64) 1) << irq_dirty)); | 170 | int_on = !(cur_ints & (((u64) 1) << irq_dirty)); |
@@ -216,6 +215,7 @@ static void ack_bcm1480_irq(unsigned int irq) | |||
216 | { | 215 | { |
217 | u64 pending; | 216 | u64 pending; |
218 | unsigned int irq_dirty; | 217 | unsigned int irq_dirty; |
218 | int k; | ||
219 | 219 | ||
220 | /* | 220 | /* |
221 | * If the interrupt was an HT interrupt, now is the time to | 221 | * If the interrupt was an HT interrupt, now is the time to |
@@ -227,7 +227,6 @@ static void ack_bcm1480_irq(unsigned int irq) | |||
227 | if ((irq_dirty >= BCM1480_NR_IRQS_HALF) && (irq_dirty <= BCM1480_NR_IRQS)) { | 227 | if ((irq_dirty >= BCM1480_NR_IRQS_HALF) && (irq_dirty <= BCM1480_NR_IRQS)) { |
228 | irq_dirty -= BCM1480_NR_IRQS_HALF; | 228 | irq_dirty -= BCM1480_NR_IRQS_HALF; |
229 | } | 229 | } |
230 | int k; | ||
231 | for (k=0; k<2; k++) { /* Loop through high and low LDT interrupts */ | 230 | for (k=0; k<2; k++) { /* Loop through high and low LDT interrupts */ |
232 | pending = __raw_readq(IOADDR(A_BCM1480_IMR_REGISTER(bcm1480_irq_owner[irq], | 231 | pending = __raw_readq(IOADDR(A_BCM1480_IMR_REGISTER(bcm1480_irq_owner[irq], |
233 | R_BCM1480_IMR_LDT_INTERRUPT_H + (k*BCM1480_IMR_HL_SPACING)))); | 232 | R_BCM1480_IMR_LDT_INTERRUPT_H + (k*BCM1480_IMR_HL_SPACING)))); |
diff --git a/arch/mips/sibyte/cfe/smp.c b/arch/mips/sibyte/cfe/smp.c index 4477af3d8074..eab20e2db323 100644 --- a/arch/mips/sibyte/cfe/smp.c +++ b/arch/mips/sibyte/cfe/smp.c | |||
@@ -31,7 +31,7 @@ | |||
31 | * | 31 | * |
32 | * Common setup before any secondaries are started | 32 | * Common setup before any secondaries are started |
33 | */ | 33 | */ |
34 | void __init prom_prepare_cpus(unsigned int max_cpus) | 34 | void __init plat_smp_setup(void) |
35 | { | 35 | { |
36 | int i, num; | 36 | int i, num; |
37 | 37 | ||
@@ -40,14 +40,18 @@ void __init prom_prepare_cpus(unsigned int max_cpus) | |||
40 | __cpu_number_map[0] = 0; | 40 | __cpu_number_map[0] = 0; |
41 | __cpu_logical_map[0] = 0; | 41 | __cpu_logical_map[0] = 0; |
42 | 42 | ||
43 | for (i=1, num=0; i<NR_CPUS; i++) { | 43 | for (i = 1, num = 0; i < NR_CPUS; i++) { |
44 | if (cfe_cpu_stop(i) == 0) { | 44 | if (cfe_cpu_stop(i) == 0) { |
45 | cpu_set(i, phys_cpu_present_map); | 45 | cpu_set(i, phys_cpu_present_map); |
46 | __cpu_number_map[i] = ++num; | 46 | __cpu_number_map[i] = ++num; |
47 | __cpu_logical_map[num] = i; | 47 | __cpu_logical_map[num] = i; |
48 | } | 48 | } |
49 | } | 49 | } |
50 | printk("Detected %i available secondary CPU(s)\n", num); | 50 | printk(KERN_INFO "Detected %i available secondary CPU(s)\n", num); |
51 | } | ||
52 | |||
53 | void __init plat_prepare_cpus(unsigned int max_cpus) | ||
54 | { | ||
51 | } | 55 | } |
52 | 56 | ||
53 | /* | 57 | /* |