diff options
Diffstat (limited to 'arch')
166 files changed, 1421 insertions, 970 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index a91009c61870..8928b21a2dba 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -45,6 +45,9 @@ config ARM | |||
45 | select GENERIC_SMP_IDLE_THREAD | 45 | select GENERIC_SMP_IDLE_THREAD |
46 | select KTIME_SCALAR | 46 | select KTIME_SCALAR |
47 | select GENERIC_CLOCKEVENTS_BROADCAST if SMP | 47 | select GENERIC_CLOCKEVENTS_BROADCAST if SMP |
48 | select GENERIC_STRNCPY_FROM_USER | ||
49 | select GENERIC_STRNLEN_USER | ||
50 | select DCACHE_WORD_ACCESS if (CPU_V6 || CPU_V6K || CPU_V7) && !CPU_BIG_ENDIAN | ||
48 | help | 51 | help |
49 | The ARM series is a line of low-power-consumption RISC chip designs | 52 | The ARM series is a line of low-power-consumption RISC chip designs |
50 | licensed by ARM Ltd and targeted at embedded applications and | 53 | licensed by ARM Ltd and targeted at embedded applications and |
@@ -1961,6 +1964,25 @@ config ARM_ATAG_DTB_COMPAT | |||
1961 | bootloaders, this option allows zImage to extract the information | 1964 | bootloaders, this option allows zImage to extract the information |
1962 | from the ATAG list and store it at run time into the appended DTB. | 1965 | from the ATAG list and store it at run time into the appended DTB. |
1963 | 1966 | ||
1967 | choice | ||
1968 | prompt "Kernel command line type" if ARM_ATAG_DTB_COMPAT | ||
1969 | default ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER | ||
1970 | |||
1971 | config ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER | ||
1972 | bool "Use bootloader kernel arguments if available" | ||
1973 | help | ||
1974 | Uses the command-line options passed by the boot loader instead of | ||
1975 | the device tree bootargs property. If the boot loader doesn't provide | ||
1976 | any, the device tree bootargs property will be used. | ||
1977 | |||
1978 | config ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND | ||
1979 | bool "Extend with bootloader kernel arguments" | ||
1980 | help | ||
1981 | The command-line arguments provided by the boot loader will be | ||
1982 | appended to the the device tree bootargs property. | ||
1983 | |||
1984 | endchoice | ||
1985 | |||
1964 | config CMDLINE | 1986 | config CMDLINE |
1965 | string "Default kernel command string" | 1987 | string "Default kernel command string" |
1966 | default "" | 1988 | default "" |
diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug index 01a134141216..521e15bc6401 100644 --- a/arch/arm/Kconfig.debug +++ b/arch/arm/Kconfig.debug | |||
@@ -369,4 +369,13 @@ config ARM_KPROBES_TEST | |||
369 | help | 369 | help |
370 | Perform tests of kprobes API and instruction set simulation. | 370 | Perform tests of kprobes API and instruction set simulation. |
371 | 371 | ||
372 | config PID_IN_CONTEXTIDR | ||
373 | bool "Write the current PID to the CONTEXTIDR register" | ||
374 | depends on CPU_COPY_V6 | ||
375 | help | ||
376 | Enabling this option causes the kernel to write the current PID to | ||
377 | the PROCID field of the CONTEXTIDR register, at the expense of some | ||
378 | additional instructions during context switch. Say Y here only if you | ||
379 | are planning to use hardware trace tools with this kernel. | ||
380 | |||
372 | endmenu | 381 | endmenu |
diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 0298b00fe241..f8ebf1e97027 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile | |||
@@ -10,6 +10,9 @@ | |||
10 | # | 10 | # |
11 | # Copyright (C) 1995-2001 by Russell King | 11 | # Copyright (C) 1995-2001 by Russell King |
12 | 12 | ||
13 | # Ensure linker flags are correct | ||
14 | LDFLAGS := | ||
15 | |||
13 | LDFLAGS_vmlinux :=-p --no-undefined -X | 16 | LDFLAGS_vmlinux :=-p --no-undefined -X |
14 | ifeq ($(CONFIG_CPU_ENDIAN_BE8),y) | 17 | ifeq ($(CONFIG_CPU_ENDIAN_BE8),y) |
15 | LDFLAGS_vmlinux += --be8 | 18 | LDFLAGS_vmlinux += --be8 |
diff --git a/arch/arm/boot/compressed/atags_to_fdt.c b/arch/arm/boot/compressed/atags_to_fdt.c index 797f04bedb47..aabc02a68482 100644 --- a/arch/arm/boot/compressed/atags_to_fdt.c +++ b/arch/arm/boot/compressed/atags_to_fdt.c | |||
@@ -1,6 +1,12 @@ | |||
1 | #include <asm/setup.h> | 1 | #include <asm/setup.h> |
2 | #include <libfdt.h> | 2 | #include <libfdt.h> |
3 | 3 | ||
4 | #if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND) | ||
5 | #define do_extend_cmdline 1 | ||
6 | #else | ||
7 | #define do_extend_cmdline 0 | ||
8 | #endif | ||
9 | |||
4 | static int node_offset(void *fdt, const char *node_path) | 10 | static int node_offset(void *fdt, const char *node_path) |
5 | { | 11 | { |
6 | int offset = fdt_path_offset(fdt, node_path); | 12 | int offset = fdt_path_offset(fdt, node_path); |
@@ -36,6 +42,48 @@ static int setprop_cell(void *fdt, const char *node_path, | |||
36 | return fdt_setprop_cell(fdt, offset, property, val); | 42 | return fdt_setprop_cell(fdt, offset, property, val); |
37 | } | 43 | } |
38 | 44 | ||
45 | static const void *getprop(const void *fdt, const char *node_path, | ||
46 | const char *property, int *len) | ||
47 | { | ||
48 | int offset = fdt_path_offset(fdt, node_path); | ||
49 | |||
50 | if (offset == -FDT_ERR_NOTFOUND) | ||
51 | return NULL; | ||
52 | |||
53 | return fdt_getprop(fdt, offset, property, len); | ||
54 | } | ||
55 | |||
56 | static void merge_fdt_bootargs(void *fdt, const char *fdt_cmdline) | ||
57 | { | ||
58 | char cmdline[COMMAND_LINE_SIZE]; | ||
59 | const char *fdt_bootargs; | ||
60 | char *ptr = cmdline; | ||
61 | int len = 0; | ||
62 | |||
63 | /* copy the fdt command line into the buffer */ | ||
64 | fdt_bootargs = getprop(fdt, "/chosen", "bootargs", &len); | ||
65 | if (fdt_bootargs) | ||
66 | if (len < COMMAND_LINE_SIZE) { | ||
67 | memcpy(ptr, fdt_bootargs, len); | ||
68 | /* len is the length of the string | ||
69 | * including the NULL terminator */ | ||
70 | ptr += len - 1; | ||
71 | } | ||
72 | |||
73 | /* and append the ATAG_CMDLINE */ | ||
74 | if (fdt_cmdline) { | ||
75 | len = strlen(fdt_cmdline); | ||
76 | if (ptr - cmdline + len + 2 < COMMAND_LINE_SIZE) { | ||
77 | *ptr++ = ' '; | ||
78 | memcpy(ptr, fdt_cmdline, len); | ||
79 | ptr += len; | ||
80 | } | ||
81 | } | ||
82 | *ptr = '\0'; | ||
83 | |||
84 | setprop_string(fdt, "/chosen", "bootargs", cmdline); | ||
85 | } | ||
86 | |||
39 | /* | 87 | /* |
40 | * Convert and fold provided ATAGs into the provided FDT. | 88 | * Convert and fold provided ATAGs into the provided FDT. |
41 | * | 89 | * |
@@ -72,8 +120,18 @@ int atags_to_fdt(void *atag_list, void *fdt, int total_space) | |||
72 | 120 | ||
73 | for_each_tag(atag, atag_list) { | 121 | for_each_tag(atag, atag_list) { |
74 | if (atag->hdr.tag == ATAG_CMDLINE) { | 122 | if (atag->hdr.tag == ATAG_CMDLINE) { |
75 | setprop_string(fdt, "/chosen", "bootargs", | 123 | /* Append the ATAGS command line to the device tree |
76 | atag->u.cmdline.cmdline); | 124 | * command line. |
125 | * NB: This means that if the same parameter is set in | ||
126 | * the device tree and in the tags, the one from the | ||
127 | * tags will be chosen. | ||
128 | */ | ||
129 | if (do_extend_cmdline) | ||
130 | merge_fdt_bootargs(fdt, | ||
131 | atag->u.cmdline.cmdline); | ||
132 | else | ||
133 | setprop_string(fdt, "/chosen", "bootargs", | ||
134 | atag->u.cmdline.cmdline); | ||
77 | } else if (atag->hdr.tag == ATAG_MEM) { | 135 | } else if (atag->hdr.tag == ATAG_MEM) { |
78 | if (memcount >= sizeof(mem_reg_property)/4) | 136 | if (memcount >= sizeof(mem_reg_property)/4) |
79 | continue; | 137 | continue; |
diff --git a/arch/arm/boot/dts/spear13xx.dtsi b/arch/arm/boot/dts/spear13xx.dtsi index 10dcec7e7321..f7b84aced654 100644 --- a/arch/arm/boot/dts/spear13xx.dtsi +++ b/arch/arm/boot/dts/spear13xx.dtsi | |||
@@ -43,8 +43,8 @@ | |||
43 | 43 | ||
44 | pmu { | 44 | pmu { |
45 | compatible = "arm,cortex-a9-pmu"; | 45 | compatible = "arm,cortex-a9-pmu"; |
46 | interrupts = <0 8 0x04 | 46 | interrupts = <0 6 0x04 |
47 | 0 9 0x04>; | 47 | 0 7 0x04>; |
48 | }; | 48 | }; |
49 | 49 | ||
50 | L2: l2-cache { | 50 | L2: l2-cache { |
@@ -119,8 +119,8 @@ | |||
119 | gmac0: eth@e2000000 { | 119 | gmac0: eth@e2000000 { |
120 | compatible = "st,spear600-gmac"; | 120 | compatible = "st,spear600-gmac"; |
121 | reg = <0xe2000000 0x8000>; | 121 | reg = <0xe2000000 0x8000>; |
122 | interrupts = <0 23 0x4 | 122 | interrupts = <0 33 0x4 |
123 | 0 24 0x4>; | 123 | 0 34 0x4>; |
124 | interrupt-names = "macirq", "eth_wake_irq"; | 124 | interrupt-names = "macirq", "eth_wake_irq"; |
125 | status = "disabled"; | 125 | status = "disabled"; |
126 | }; | 126 | }; |
@@ -202,6 +202,7 @@ | |||
202 | kbd@e0300000 { | 202 | kbd@e0300000 { |
203 | compatible = "st,spear300-kbd"; | 203 | compatible = "st,spear300-kbd"; |
204 | reg = <0xe0300000 0x1000>; | 204 | reg = <0xe0300000 0x1000>; |
205 | interrupts = <0 52 0x4>; | ||
205 | status = "disabled"; | 206 | status = "disabled"; |
206 | }; | 207 | }; |
207 | 208 | ||
@@ -224,7 +225,7 @@ | |||
224 | serial@e0000000 { | 225 | serial@e0000000 { |
225 | compatible = "arm,pl011", "arm,primecell"; | 226 | compatible = "arm,pl011", "arm,primecell"; |
226 | reg = <0xe0000000 0x1000>; | 227 | reg = <0xe0000000 0x1000>; |
227 | interrupts = <0 36 0x4>; | 228 | interrupts = <0 35 0x4>; |
228 | status = "disabled"; | 229 | status = "disabled"; |
229 | }; | 230 | }; |
230 | 231 | ||
diff --git a/arch/arm/boot/dts/spear320-evb.dts b/arch/arm/boot/dts/spear320-evb.dts index c13fd1f3b09f..e4e912f95024 100644 --- a/arch/arm/boot/dts/spear320-evb.dts +++ b/arch/arm/boot/dts/spear320-evb.dts | |||
@@ -15,8 +15,8 @@ | |||
15 | /include/ "spear320.dtsi" | 15 | /include/ "spear320.dtsi" |
16 | 16 | ||
17 | / { | 17 | / { |
18 | model = "ST SPEAr300 Evaluation Board"; | 18 | model = "ST SPEAr320 Evaluation Board"; |
19 | compatible = "st,spear300-evb", "st,spear300"; | 19 | compatible = "st,spear320-evb", "st,spear320"; |
20 | #address-cells = <1>; | 20 | #address-cells = <1>; |
21 | #size-cells = <1>; | 21 | #size-cells = <1>; |
22 | 22 | ||
@@ -26,7 +26,7 @@ | |||
26 | 26 | ||
27 | ahb { | 27 | ahb { |
28 | pinmux@b3000000 { | 28 | pinmux@b3000000 { |
29 | st,pinmux-mode = <3>; | 29 | st,pinmux-mode = <4>; |
30 | pinctrl-names = "default"; | 30 | pinctrl-names = "default"; |
31 | pinctrl-0 = <&state_default>; | 31 | pinctrl-0 = <&state_default>; |
32 | 32 | ||
diff --git a/arch/arm/boot/dts/spear600.dtsi b/arch/arm/boot/dts/spear600.dtsi index 089f0a42c50e..a3c36e47d7ef 100644 --- a/arch/arm/boot/dts/spear600.dtsi +++ b/arch/arm/boot/dts/spear600.dtsi | |||
@@ -181,6 +181,7 @@ | |||
181 | timer@f0000000 { | 181 | timer@f0000000 { |
182 | compatible = "st,spear-timer"; | 182 | compatible = "st,spear-timer"; |
183 | reg = <0xf0000000 0x400>; | 183 | reg = <0xf0000000 0x400>; |
184 | interrupt-parent = <&vic0>; | ||
184 | interrupts = <16>; | 185 | interrupts = <16>; |
185 | }; | 186 | }; |
186 | }; | 187 | }; |
diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig index 9854ff4279e0..11828e632532 100644 --- a/arch/arm/configs/omap2plus_defconfig +++ b/arch/arm/configs/omap2plus_defconfig | |||
@@ -176,7 +176,6 @@ CONFIG_USB_ANNOUNCE_NEW_DEVICES=y | |||
176 | CONFIG_USB_DEVICEFS=y | 176 | CONFIG_USB_DEVICEFS=y |
177 | CONFIG_USB_SUSPEND=y | 177 | CONFIG_USB_SUSPEND=y |
178 | CONFIG_USB_MON=y | 178 | CONFIG_USB_MON=y |
179 | CONFIG_USB_EHCI_HCD=y | ||
180 | CONFIG_USB_WDM=y | 179 | CONFIG_USB_WDM=y |
181 | CONFIG_USB_STORAGE=y | 180 | CONFIG_USB_STORAGE=y |
182 | CONFIG_USB_LIBUSUAL=y | 181 | CONFIG_USB_LIBUSUAL=y |
diff --git a/arch/arm/include/asm/arch_timer.h b/arch/arm/include/asm/arch_timer.h index ed2e95d46e29..62e75475e57e 100644 --- a/arch/arm/include/asm/arch_timer.h +++ b/arch/arm/include/asm/arch_timer.h | |||
@@ -1,7 +1,10 @@ | |||
1 | #ifndef __ASMARM_ARCH_TIMER_H | 1 | #ifndef __ASMARM_ARCH_TIMER_H |
2 | #define __ASMARM_ARCH_TIMER_H | 2 | #define __ASMARM_ARCH_TIMER_H |
3 | 3 | ||
4 | #include <asm/errno.h> | ||
5 | |||
4 | #ifdef CONFIG_ARM_ARCH_TIMER | 6 | #ifdef CONFIG_ARM_ARCH_TIMER |
7 | #define ARCH_HAS_READ_CURRENT_TIMER | ||
5 | int arch_timer_of_register(void); | 8 | int arch_timer_of_register(void); |
6 | int arch_timer_sched_clock_init(void); | 9 | int arch_timer_sched_clock_init(void); |
7 | #else | 10 | #else |
diff --git a/arch/arm/include/asm/delay.h b/arch/arm/include/asm/delay.h index b2deda181549..dc6145120de3 100644 --- a/arch/arm/include/asm/delay.h +++ b/arch/arm/include/asm/delay.h | |||
@@ -6,9 +6,22 @@ | |||
6 | #ifndef __ASM_ARM_DELAY_H | 6 | #ifndef __ASM_ARM_DELAY_H |
7 | #define __ASM_ARM_DELAY_H | 7 | #define __ASM_ARM_DELAY_H |
8 | 8 | ||
9 | #include <asm/memory.h> | ||
9 | #include <asm/param.h> /* HZ */ | 10 | #include <asm/param.h> /* HZ */ |
10 | 11 | ||
11 | extern void __delay(int loops); | 12 | #define MAX_UDELAY_MS 2 |
13 | #define UDELAY_MULT ((UL(2199023) * HZ) >> 11) | ||
14 | #define UDELAY_SHIFT 30 | ||
15 | |||
16 | #ifndef __ASSEMBLY__ | ||
17 | |||
18 | extern struct arm_delay_ops { | ||
19 | void (*delay)(unsigned long); | ||
20 | void (*const_udelay)(unsigned long); | ||
21 | void (*udelay)(unsigned long); | ||
22 | } arm_delay_ops; | ||
23 | |||
24 | #define __delay(n) arm_delay_ops.delay(n) | ||
12 | 25 | ||
13 | /* | 26 | /* |
14 | * This function intentionally does not exist; if you see references to | 27 | * This function intentionally does not exist; if you see references to |
@@ -23,22 +36,27 @@ extern void __bad_udelay(void); | |||
23 | * division by multiplication: you don't have to worry about | 36 | * division by multiplication: you don't have to worry about |
24 | * loss of precision. | 37 | * loss of precision. |
25 | * | 38 | * |
26 | * Use only for very small delays ( < 1 msec). Should probably use a | 39 | * Use only for very small delays ( < 2 msec). Should probably use a |
27 | * lookup table, really, as the multiplications take much too long with | 40 | * lookup table, really, as the multiplications take much too long with |
28 | * short delays. This is a "reasonable" implementation, though (and the | 41 | * short delays. This is a "reasonable" implementation, though (and the |
29 | * first constant multiplications gets optimized away if the delay is | 42 | * first constant multiplications gets optimized away if the delay is |
30 | * a constant) | 43 | * a constant) |
31 | */ | 44 | */ |
32 | extern void __udelay(unsigned long usecs); | 45 | #define __udelay(n) arm_delay_ops.udelay(n) |
33 | extern void __const_udelay(unsigned long); | 46 | #define __const_udelay(n) arm_delay_ops.const_udelay(n) |
34 | |||
35 | #define MAX_UDELAY_MS 2 | ||
36 | 47 | ||
37 | #define udelay(n) \ | 48 | #define udelay(n) \ |
38 | (__builtin_constant_p(n) ? \ | 49 | (__builtin_constant_p(n) ? \ |
39 | ((n) > (MAX_UDELAY_MS * 1000) ? __bad_udelay() : \ | 50 | ((n) > (MAX_UDELAY_MS * 1000) ? __bad_udelay() : \ |
40 | __const_udelay((n) * ((2199023U*HZ)>>11))) : \ | 51 | __const_udelay((n) * UDELAY_MULT)) : \ |
41 | __udelay(n)) | 52 | __udelay(n)) |
42 | 53 | ||
54 | /* Loop-based definitions for assembly code. */ | ||
55 | extern void __loop_delay(unsigned long loops); | ||
56 | extern void __loop_udelay(unsigned long usecs); | ||
57 | extern void __loop_const_udelay(unsigned long); | ||
58 | |||
59 | #endif /* __ASSEMBLY__ */ | ||
60 | |||
43 | #endif /* defined(_ARM_DELAY_H) */ | 61 | #endif /* defined(_ARM_DELAY_H) */ |
44 | 62 | ||
diff --git a/arch/arm/include/asm/locks.h b/arch/arm/include/asm/locks.h deleted file mode 100644 index ef4c897772d1..000000000000 --- a/arch/arm/include/asm/locks.h +++ /dev/null | |||
@@ -1,274 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/include/asm/locks.h | ||
3 | * | ||
4 | * Copyright (C) 2000 Russell King | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | * Interrupt safe locking assembler. | ||
11 | */ | ||
12 | #ifndef __ASM_PROC_LOCKS_H | ||
13 | #define __ASM_PROC_LOCKS_H | ||
14 | |||
15 | #if __LINUX_ARM_ARCH__ >= 6 | ||
16 | |||
17 | #define __down_op(ptr,fail) \ | ||
18 | ({ \ | ||
19 | __asm__ __volatile__( \ | ||
20 | "@ down_op\n" \ | ||
21 | "1: ldrex lr, [%0]\n" \ | ||
22 | " sub lr, lr, %1\n" \ | ||
23 | " strex ip, lr, [%0]\n" \ | ||
24 | " teq ip, #0\n" \ | ||
25 | " bne 1b\n" \ | ||
26 | " teq lr, #0\n" \ | ||
27 | " movmi ip, %0\n" \ | ||
28 | " blmi " #fail \ | ||
29 | : \ | ||
30 | : "r" (ptr), "I" (1) \ | ||
31 | : "ip", "lr", "cc"); \ | ||
32 | smp_mb(); \ | ||
33 | }) | ||
34 | |||
35 | #define __down_op_ret(ptr,fail) \ | ||
36 | ({ \ | ||
37 | unsigned int ret; \ | ||
38 | __asm__ __volatile__( \ | ||
39 | "@ down_op_ret\n" \ | ||
40 | "1: ldrex lr, [%1]\n" \ | ||
41 | " sub lr, lr, %2\n" \ | ||
42 | " strex ip, lr, [%1]\n" \ | ||
43 | " teq ip, #0\n" \ | ||
44 | " bne 1b\n" \ | ||
45 | " teq lr, #0\n" \ | ||
46 | " movmi ip, %1\n" \ | ||
47 | " movpl ip, #0\n" \ | ||
48 | " blmi " #fail "\n" \ | ||
49 | " mov %0, ip" \ | ||
50 | : "=&r" (ret) \ | ||
51 | : "r" (ptr), "I" (1) \ | ||
52 | : "ip", "lr", "cc"); \ | ||
53 | smp_mb(); \ | ||
54 | ret; \ | ||
55 | }) | ||
56 | |||
57 | #define __up_op(ptr,wake) \ | ||
58 | ({ \ | ||
59 | smp_mb(); \ | ||
60 | __asm__ __volatile__( \ | ||
61 | "@ up_op\n" \ | ||
62 | "1: ldrex lr, [%0]\n" \ | ||
63 | " add lr, lr, %1\n" \ | ||
64 | " strex ip, lr, [%0]\n" \ | ||
65 | " teq ip, #0\n" \ | ||
66 | " bne 1b\n" \ | ||
67 | " cmp lr, #0\n" \ | ||
68 | " movle ip, %0\n" \ | ||
69 | " blle " #wake \ | ||
70 | : \ | ||
71 | : "r" (ptr), "I" (1) \ | ||
72 | : "ip", "lr", "cc"); \ | ||
73 | }) | ||
74 | |||
75 | /* | ||
76 | * The value 0x01000000 supports up to 128 processors and | ||
77 | * lots of processes. BIAS must be chosen such that sub'ing | ||
78 | * BIAS once per CPU will result in the long remaining | ||
79 | * negative. | ||
80 | */ | ||
81 | #define RW_LOCK_BIAS 0x01000000 | ||
82 | #define RW_LOCK_BIAS_STR "0x01000000" | ||
83 | |||
84 | #define __down_op_write(ptr,fail) \ | ||
85 | ({ \ | ||
86 | __asm__ __volatile__( \ | ||
87 | "@ down_op_write\n" \ | ||
88 | "1: ldrex lr, [%0]\n" \ | ||
89 | " sub lr, lr, %1\n" \ | ||
90 | " strex ip, lr, [%0]\n" \ | ||
91 | " teq ip, #0\n" \ | ||
92 | " bne 1b\n" \ | ||
93 | " teq lr, #0\n" \ | ||
94 | " movne ip, %0\n" \ | ||
95 | " blne " #fail \ | ||
96 | : \ | ||
97 | : "r" (ptr), "I" (RW_LOCK_BIAS) \ | ||
98 | : "ip", "lr", "cc"); \ | ||
99 | smp_mb(); \ | ||
100 | }) | ||
101 | |||
102 | #define __up_op_write(ptr,wake) \ | ||
103 | ({ \ | ||
104 | smp_mb(); \ | ||
105 | __asm__ __volatile__( \ | ||
106 | "@ up_op_write\n" \ | ||
107 | "1: ldrex lr, [%0]\n" \ | ||
108 | " adds lr, lr, %1\n" \ | ||
109 | " strex ip, lr, [%0]\n" \ | ||
110 | " teq ip, #0\n" \ | ||
111 | " bne 1b\n" \ | ||
112 | " movcs ip, %0\n" \ | ||
113 | " blcs " #wake \ | ||
114 | : \ | ||
115 | : "r" (ptr), "I" (RW_LOCK_BIAS) \ | ||
116 | : "ip", "lr", "cc"); \ | ||
117 | }) | ||
118 | |||
119 | #define __down_op_read(ptr,fail) \ | ||
120 | __down_op(ptr, fail) | ||
121 | |||
122 | #define __up_op_read(ptr,wake) \ | ||
123 | ({ \ | ||
124 | smp_mb(); \ | ||
125 | __asm__ __volatile__( \ | ||
126 | "@ up_op_read\n" \ | ||
127 | "1: ldrex lr, [%0]\n" \ | ||
128 | " add lr, lr, %1\n" \ | ||
129 | " strex ip, lr, [%0]\n" \ | ||
130 | " teq ip, #0\n" \ | ||
131 | " bne 1b\n" \ | ||
132 | " teq lr, #0\n" \ | ||
133 | " moveq ip, %0\n" \ | ||
134 | " bleq " #wake \ | ||
135 | : \ | ||
136 | : "r" (ptr), "I" (1) \ | ||
137 | : "ip", "lr", "cc"); \ | ||
138 | }) | ||
139 | |||
140 | #else | ||
141 | |||
142 | #define __down_op(ptr,fail) \ | ||
143 | ({ \ | ||
144 | __asm__ __volatile__( \ | ||
145 | "@ down_op\n" \ | ||
146 | " mrs ip, cpsr\n" \ | ||
147 | " orr lr, ip, #128\n" \ | ||
148 | " msr cpsr_c, lr\n" \ | ||
149 | " ldr lr, [%0]\n" \ | ||
150 | " subs lr, lr, %1\n" \ | ||
151 | " str lr, [%0]\n" \ | ||
152 | " msr cpsr_c, ip\n" \ | ||
153 | " movmi ip, %0\n" \ | ||
154 | " blmi " #fail \ | ||
155 | : \ | ||
156 | : "r" (ptr), "I" (1) \ | ||
157 | : "ip", "lr", "cc"); \ | ||
158 | smp_mb(); \ | ||
159 | }) | ||
160 | |||
161 | #define __down_op_ret(ptr,fail) \ | ||
162 | ({ \ | ||
163 | unsigned int ret; \ | ||
164 | __asm__ __volatile__( \ | ||
165 | "@ down_op_ret\n" \ | ||
166 | " mrs ip, cpsr\n" \ | ||
167 | " orr lr, ip, #128\n" \ | ||
168 | " msr cpsr_c, lr\n" \ | ||
169 | " ldr lr, [%1]\n" \ | ||
170 | " subs lr, lr, %2\n" \ | ||
171 | " str lr, [%1]\n" \ | ||
172 | " msr cpsr_c, ip\n" \ | ||
173 | " movmi ip, %1\n" \ | ||
174 | " movpl ip, #0\n" \ | ||
175 | " blmi " #fail "\n" \ | ||
176 | " mov %0, ip" \ | ||
177 | : "=&r" (ret) \ | ||
178 | : "r" (ptr), "I" (1) \ | ||
179 | : "ip", "lr", "cc"); \ | ||
180 | smp_mb(); \ | ||
181 | ret; \ | ||
182 | }) | ||
183 | |||
184 | #define __up_op(ptr,wake) \ | ||
185 | ({ \ | ||
186 | smp_mb(); \ | ||
187 | __asm__ __volatile__( \ | ||
188 | "@ up_op\n" \ | ||
189 | " mrs ip, cpsr\n" \ | ||
190 | " orr lr, ip, #128\n" \ | ||
191 | " msr cpsr_c, lr\n" \ | ||
192 | " ldr lr, [%0]\n" \ | ||
193 | " adds lr, lr, %1\n" \ | ||
194 | " str lr, [%0]\n" \ | ||
195 | " msr cpsr_c, ip\n" \ | ||
196 | " movle ip, %0\n" \ | ||
197 | " blle " #wake \ | ||
198 | : \ | ||
199 | : "r" (ptr), "I" (1) \ | ||
200 | : "ip", "lr", "cc"); \ | ||
201 | }) | ||
202 | |||
203 | /* | ||
204 | * The value 0x01000000 supports up to 128 processors and | ||
205 | * lots of processes. BIAS must be chosen such that sub'ing | ||
206 | * BIAS once per CPU will result in the long remaining | ||
207 | * negative. | ||
208 | */ | ||
209 | #define RW_LOCK_BIAS 0x01000000 | ||
210 | #define RW_LOCK_BIAS_STR "0x01000000" | ||
211 | |||
212 | #define __down_op_write(ptr,fail) \ | ||
213 | ({ \ | ||
214 | __asm__ __volatile__( \ | ||
215 | "@ down_op_write\n" \ | ||
216 | " mrs ip, cpsr\n" \ | ||
217 | " orr lr, ip, #128\n" \ | ||
218 | " msr cpsr_c, lr\n" \ | ||
219 | " ldr lr, [%0]\n" \ | ||
220 | " subs lr, lr, %1\n" \ | ||
221 | " str lr, [%0]\n" \ | ||
222 | " msr cpsr_c, ip\n" \ | ||
223 | " movne ip, %0\n" \ | ||
224 | " blne " #fail \ | ||
225 | : \ | ||
226 | : "r" (ptr), "I" (RW_LOCK_BIAS) \ | ||
227 | : "ip", "lr", "cc"); \ | ||
228 | smp_mb(); \ | ||
229 | }) | ||
230 | |||
231 | #define __up_op_write(ptr,wake) \ | ||
232 | ({ \ | ||
233 | __asm__ __volatile__( \ | ||
234 | "@ up_op_write\n" \ | ||
235 | " mrs ip, cpsr\n" \ | ||
236 | " orr lr, ip, #128\n" \ | ||
237 | " msr cpsr_c, lr\n" \ | ||
238 | " ldr lr, [%0]\n" \ | ||
239 | " adds lr, lr, %1\n" \ | ||
240 | " str lr, [%0]\n" \ | ||
241 | " msr cpsr_c, ip\n" \ | ||
242 | " movcs ip, %0\n" \ | ||
243 | " blcs " #wake \ | ||
244 | : \ | ||
245 | : "r" (ptr), "I" (RW_LOCK_BIAS) \ | ||
246 | : "ip", "lr", "cc"); \ | ||
247 | smp_mb(); \ | ||
248 | }) | ||
249 | |||
250 | #define __down_op_read(ptr,fail) \ | ||
251 | __down_op(ptr, fail) | ||
252 | |||
253 | #define __up_op_read(ptr,wake) \ | ||
254 | ({ \ | ||
255 | smp_mb(); \ | ||
256 | __asm__ __volatile__( \ | ||
257 | "@ up_op_read\n" \ | ||
258 | " mrs ip, cpsr\n" \ | ||
259 | " orr lr, ip, #128\n" \ | ||
260 | " msr cpsr_c, lr\n" \ | ||
261 | " ldr lr, [%0]\n" \ | ||
262 | " adds lr, lr, %1\n" \ | ||
263 | " str lr, [%0]\n" \ | ||
264 | " msr cpsr_c, ip\n" \ | ||
265 | " moveq ip, %0\n" \ | ||
266 | " bleq " #wake \ | ||
267 | : \ | ||
268 | : "r" (ptr), "I" (1) \ | ||
269 | : "ip", "lr", "cc"); \ | ||
270 | }) | ||
271 | |||
272 | #endif | ||
273 | |||
274 | #endif | ||
diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h index fcb575747e5e..e965f1b560f1 100644 --- a/arch/arm/include/asm/memory.h +++ b/arch/arm/include/asm/memory.h | |||
@@ -16,7 +16,7 @@ | |||
16 | #include <linux/compiler.h> | 16 | #include <linux/compiler.h> |
17 | #include <linux/const.h> | 17 | #include <linux/const.h> |
18 | #include <linux/types.h> | 18 | #include <linux/types.h> |
19 | #include <asm/sizes.h> | 19 | #include <linux/sizes.h> |
20 | 20 | ||
21 | #ifdef CONFIG_NEED_MACH_MEMORY_H | 21 | #ifdef CONFIG_NEED_MACH_MEMORY_H |
22 | #include <mach/memory.h> | 22 | #include <mach/memory.h> |
diff --git a/arch/arm/include/asm/perf_event.h b/arch/arm/include/asm/perf_event.h index 00cbe10a50e3..e074948d8143 100644 --- a/arch/arm/include/asm/perf_event.h +++ b/arch/arm/include/asm/perf_event.h | |||
@@ -12,21 +12,6 @@ | |||
12 | #ifndef __ARM_PERF_EVENT_H__ | 12 | #ifndef __ARM_PERF_EVENT_H__ |
13 | #define __ARM_PERF_EVENT_H__ | 13 | #define __ARM_PERF_EVENT_H__ |
14 | 14 | ||
15 | /* ARM perf PMU IDs for use by internal perf clients. */ | 15 | /* Nothing to see here... */ |
16 | enum arm_perf_pmu_ids { | ||
17 | ARM_PERF_PMU_ID_XSCALE1 = 0, | ||
18 | ARM_PERF_PMU_ID_XSCALE2, | ||
19 | ARM_PERF_PMU_ID_V6, | ||
20 | ARM_PERF_PMU_ID_V6MP, | ||
21 | ARM_PERF_PMU_ID_CA8, | ||
22 | ARM_PERF_PMU_ID_CA9, | ||
23 | ARM_PERF_PMU_ID_CA5, | ||
24 | ARM_PERF_PMU_ID_CA15, | ||
25 | ARM_PERF_PMU_ID_CA7, | ||
26 | ARM_NUM_PMU_IDS, | ||
27 | }; | ||
28 | |||
29 | extern enum arm_perf_pmu_ids | ||
30 | armpmu_get_pmu_id(void); | ||
31 | 16 | ||
32 | #endif /* __ARM_PERF_EVENT_H__ */ | 17 | #endif /* __ARM_PERF_EVENT_H__ */ |
diff --git a/arch/arm/include/asm/pmu.h b/arch/arm/include/asm/pmu.h index 90114faa9f3c..4432305f4a2a 100644 --- a/arch/arm/include/asm/pmu.h +++ b/arch/arm/include/asm/pmu.h | |||
@@ -103,10 +103,9 @@ struct pmu_hw_events { | |||
103 | 103 | ||
104 | struct arm_pmu { | 104 | struct arm_pmu { |
105 | struct pmu pmu; | 105 | struct pmu pmu; |
106 | enum arm_perf_pmu_ids id; | ||
107 | enum arm_pmu_type type; | 106 | enum arm_pmu_type type; |
108 | cpumask_t active_irqs; | 107 | cpumask_t active_irqs; |
109 | const char *name; | 108 | char *name; |
110 | irqreturn_t (*handle_irq)(int irq_num, void *dev); | 109 | irqreturn_t (*handle_irq)(int irq_num, void *dev); |
111 | void (*enable)(struct hw_perf_event *evt, int idx); | 110 | void (*enable)(struct hw_perf_event *evt, int idx); |
112 | void (*disable)(struct hw_perf_event *evt, int idx); | 111 | void (*disable)(struct hw_perf_event *evt, int idx); |
diff --git a/arch/arm/include/asm/spinlock.h b/arch/arm/include/asm/spinlock.h index 65fa3c88095c..b4ca707d0a69 100644 --- a/arch/arm/include/asm/spinlock.h +++ b/arch/arm/include/asm/spinlock.h | |||
@@ -59,18 +59,13 @@ static inline void dsb_sev(void) | |||
59 | } | 59 | } |
60 | 60 | ||
61 | /* | 61 | /* |
62 | * ARMv6 Spin-locking. | 62 | * ARMv6 ticket-based spin-locking. |
63 | * | 63 | * |
64 | * We exclusively read the old value. If it is zero, we may have | 64 | * A memory barrier is required after we get a lock, and before we |
65 | * won the lock, so we try exclusively storing it. A memory barrier | 65 | * release it, because V6 CPUs are assumed to have weakly ordered |
66 | * is required after we get a lock, and before we release it, because | 66 | * memory. |
67 | * V6 CPUs are assumed to have weakly ordered memory. | ||
68 | * | ||
69 | * Unlocked value: 0 | ||
70 | * Locked value: 1 | ||
71 | */ | 67 | */ |
72 | 68 | ||
73 | #define arch_spin_is_locked(x) ((x)->lock != 0) | ||
74 | #define arch_spin_unlock_wait(lock) \ | 69 | #define arch_spin_unlock_wait(lock) \ |
75 | do { while (arch_spin_is_locked(lock)) cpu_relax(); } while (0) | 70 | do { while (arch_spin_is_locked(lock)) cpu_relax(); } while (0) |
76 | 71 | ||
@@ -79,31 +74,39 @@ static inline void dsb_sev(void) | |||
79 | static inline void arch_spin_lock(arch_spinlock_t *lock) | 74 | static inline void arch_spin_lock(arch_spinlock_t *lock) |
80 | { | 75 | { |
81 | unsigned long tmp; | 76 | unsigned long tmp; |
77 | u32 newval; | ||
78 | arch_spinlock_t lockval; | ||
82 | 79 | ||
83 | __asm__ __volatile__( | 80 | __asm__ __volatile__( |
84 | "1: ldrex %0, [%1]\n" | 81 | "1: ldrex %0, [%3]\n" |
85 | " teq %0, #0\n" | 82 | " add %1, %0, %4\n" |
86 | WFE("ne") | 83 | " strex %2, %1, [%3]\n" |
87 | " strexeq %0, %2, [%1]\n" | 84 | " teq %2, #0\n" |
88 | " teqeq %0, #0\n" | ||
89 | " bne 1b" | 85 | " bne 1b" |
90 | : "=&r" (tmp) | 86 | : "=&r" (lockval), "=&r" (newval), "=&r" (tmp) |
91 | : "r" (&lock->lock), "r" (1) | 87 | : "r" (&lock->slock), "I" (1 << TICKET_SHIFT) |
92 | : "cc"); | 88 | : "cc"); |
93 | 89 | ||
90 | while (lockval.tickets.next != lockval.tickets.owner) { | ||
91 | wfe(); | ||
92 | lockval.tickets.owner = ACCESS_ONCE(lock->tickets.owner); | ||
93 | } | ||
94 | |||
94 | smp_mb(); | 95 | smp_mb(); |
95 | } | 96 | } |
96 | 97 | ||
97 | static inline int arch_spin_trylock(arch_spinlock_t *lock) | 98 | static inline int arch_spin_trylock(arch_spinlock_t *lock) |
98 | { | 99 | { |
99 | unsigned long tmp; | 100 | unsigned long tmp; |
101 | u32 slock; | ||
100 | 102 | ||
101 | __asm__ __volatile__( | 103 | __asm__ __volatile__( |
102 | " ldrex %0, [%1]\n" | 104 | " ldrex %0, [%2]\n" |
103 | " teq %0, #0\n" | 105 | " subs %1, %0, %0, ror #16\n" |
104 | " strexeq %0, %2, [%1]" | 106 | " addeq %0, %0, %3\n" |
105 | : "=&r" (tmp) | 107 | " strexeq %1, %0, [%2]" |
106 | : "r" (&lock->lock), "r" (1) | 108 | : "=&r" (slock), "=&r" (tmp) |
109 | : "r" (&lock->slock), "I" (1 << TICKET_SHIFT) | ||
107 | : "cc"); | 110 | : "cc"); |
108 | 111 | ||
109 | if (tmp == 0) { | 112 | if (tmp == 0) { |
@@ -116,17 +119,38 @@ static inline int arch_spin_trylock(arch_spinlock_t *lock) | |||
116 | 119 | ||
117 | static inline void arch_spin_unlock(arch_spinlock_t *lock) | 120 | static inline void arch_spin_unlock(arch_spinlock_t *lock) |
118 | { | 121 | { |
122 | unsigned long tmp; | ||
123 | u32 slock; | ||
124 | |||
119 | smp_mb(); | 125 | smp_mb(); |
120 | 126 | ||
121 | __asm__ __volatile__( | 127 | __asm__ __volatile__( |
122 | " str %1, [%0]\n" | 128 | " mov %1, #1\n" |
123 | : | 129 | "1: ldrex %0, [%2]\n" |
124 | : "r" (&lock->lock), "r" (0) | 130 | " uadd16 %0, %0, %1\n" |
131 | " strex %1, %0, [%2]\n" | ||
132 | " teq %1, #0\n" | ||
133 | " bne 1b" | ||
134 | : "=&r" (slock), "=&r" (tmp) | ||
135 | : "r" (&lock->slock) | ||
125 | : "cc"); | 136 | : "cc"); |
126 | 137 | ||
127 | dsb_sev(); | 138 | dsb_sev(); |
128 | } | 139 | } |
129 | 140 | ||
141 | static inline int arch_spin_is_locked(arch_spinlock_t *lock) | ||
142 | { | ||
143 | struct __raw_tickets tickets = ACCESS_ONCE(lock->tickets); | ||
144 | return tickets.owner != tickets.next; | ||
145 | } | ||
146 | |||
147 | static inline int arch_spin_is_contended(arch_spinlock_t *lock) | ||
148 | { | ||
149 | struct __raw_tickets tickets = ACCESS_ONCE(lock->tickets); | ||
150 | return (tickets.next - tickets.owner) > 1; | ||
151 | } | ||
152 | #define arch_spin_is_contended arch_spin_is_contended | ||
153 | |||
130 | /* | 154 | /* |
131 | * RWLOCKS | 155 | * RWLOCKS |
132 | * | 156 | * |
@@ -158,7 +182,7 @@ static inline int arch_write_trylock(arch_rwlock_t *rw) | |||
158 | unsigned long tmp; | 182 | unsigned long tmp; |
159 | 183 | ||
160 | __asm__ __volatile__( | 184 | __asm__ __volatile__( |
161 | "1: ldrex %0, [%1]\n" | 185 | " ldrex %0, [%1]\n" |
162 | " teq %0, #0\n" | 186 | " teq %0, #0\n" |
163 | " strexeq %0, %2, [%1]" | 187 | " strexeq %0, %2, [%1]" |
164 | : "=&r" (tmp) | 188 | : "=&r" (tmp) |
@@ -244,7 +268,7 @@ static inline int arch_read_trylock(arch_rwlock_t *rw) | |||
244 | unsigned long tmp, tmp2 = 1; | 268 | unsigned long tmp, tmp2 = 1; |
245 | 269 | ||
246 | __asm__ __volatile__( | 270 | __asm__ __volatile__( |
247 | "1: ldrex %0, [%2]\n" | 271 | " ldrex %0, [%2]\n" |
248 | " adds %0, %0, #1\n" | 272 | " adds %0, %0, #1\n" |
249 | " strexpl %1, %0, [%2]\n" | 273 | " strexpl %1, %0, [%2]\n" |
250 | : "=&r" (tmp), "+r" (tmp2) | 274 | : "=&r" (tmp), "+r" (tmp2) |
diff --git a/arch/arm/include/asm/spinlock_types.h b/arch/arm/include/asm/spinlock_types.h index d14d197ae04a..b262d2f8b478 100644 --- a/arch/arm/include/asm/spinlock_types.h +++ b/arch/arm/include/asm/spinlock_types.h | |||
@@ -5,11 +5,24 @@ | |||
5 | # error "please don't include this file directly" | 5 | # error "please don't include this file directly" |
6 | #endif | 6 | #endif |
7 | 7 | ||
8 | #define TICKET_SHIFT 16 | ||
9 | |||
8 | typedef struct { | 10 | typedef struct { |
9 | volatile unsigned int lock; | 11 | union { |
12 | u32 slock; | ||
13 | struct __raw_tickets { | ||
14 | #ifdef __ARMEB__ | ||
15 | u16 next; | ||
16 | u16 owner; | ||
17 | #else | ||
18 | u16 owner; | ||
19 | u16 next; | ||
20 | #endif | ||
21 | } tickets; | ||
22 | }; | ||
10 | } arch_spinlock_t; | 23 | } arch_spinlock_t; |
11 | 24 | ||
12 | #define __ARCH_SPIN_LOCK_UNLOCKED { 0 } | 25 | #define __ARCH_SPIN_LOCK_UNLOCKED { { 0 } } |
13 | 26 | ||
14 | typedef struct { | 27 | typedef struct { |
15 | volatile unsigned int lock; | 28 | volatile unsigned int lock; |
diff --git a/arch/arm/include/asm/timex.h b/arch/arm/include/asm/timex.h index 3be8de3adaba..ce119442277c 100644 --- a/arch/arm/include/asm/timex.h +++ b/arch/arm/include/asm/timex.h | |||
@@ -12,13 +12,15 @@ | |||
12 | #ifndef _ASMARM_TIMEX_H | 12 | #ifndef _ASMARM_TIMEX_H |
13 | #define _ASMARM_TIMEX_H | 13 | #define _ASMARM_TIMEX_H |
14 | 14 | ||
15 | #include <asm/arch_timer.h> | ||
15 | #include <mach/timex.h> | 16 | #include <mach/timex.h> |
16 | 17 | ||
17 | typedef unsigned long cycles_t; | 18 | typedef unsigned long cycles_t; |
18 | 19 | ||
19 | static inline cycles_t get_cycles (void) | 20 | #ifdef ARCH_HAS_READ_CURRENT_TIMER |
20 | { | 21 | #define get_cycles() ({ cycles_t c; read_current_timer(&c) ? 0 : c; }) |
21 | return 0; | 22 | #else |
22 | } | 23 | #define get_cycles() (0) |
24 | #endif | ||
23 | 25 | ||
24 | #endif | 26 | #endif |
diff --git a/arch/arm/include/asm/uaccess.h b/arch/arm/include/asm/uaccess.h index 71f6536d17ac..479a6352e0b5 100644 --- a/arch/arm/include/asm/uaccess.h +++ b/arch/arm/include/asm/uaccess.h | |||
@@ -189,6 +189,9 @@ static inline void set_fs(mm_segment_t fs) | |||
189 | 189 | ||
190 | #define access_ok(type,addr,size) (__range_ok(addr,size) == 0) | 190 | #define access_ok(type,addr,size) (__range_ok(addr,size) == 0) |
191 | 191 | ||
192 | #define user_addr_max() \ | ||
193 | (segment_eq(get_fs(), USER_DS) ? TASK_SIZE : ~0UL) | ||
194 | |||
192 | /* | 195 | /* |
193 | * The "__xxx" versions of the user access functions do not verify the | 196 | * The "__xxx" versions of the user access functions do not verify the |
194 | * address space - it must have been done previously with a separate | 197 | * address space - it must have been done previously with a separate |
@@ -398,9 +401,6 @@ extern unsigned long __must_check __clear_user_std(void __user *addr, unsigned l | |||
398 | #define __clear_user(addr,n) (memset((void __force *)addr, 0, n), 0) | 401 | #define __clear_user(addr,n) (memset((void __force *)addr, 0, n), 0) |
399 | #endif | 402 | #endif |
400 | 403 | ||
401 | extern unsigned long __must_check __strncpy_from_user(char *to, const char __user *from, unsigned long count); | ||
402 | extern unsigned long __must_check __strnlen_user(const char __user *s, long n); | ||
403 | |||
404 | static inline unsigned long __must_check copy_from_user(void *to, const void __user *from, unsigned long n) | 404 | static inline unsigned long __must_check copy_from_user(void *to, const void __user *from, unsigned long n) |
405 | { | 405 | { |
406 | if (access_ok(VERIFY_READ, from, n)) | 406 | if (access_ok(VERIFY_READ, from, n)) |
@@ -427,24 +427,9 @@ static inline unsigned long __must_check clear_user(void __user *to, unsigned lo | |||
427 | return n; | 427 | return n; |
428 | } | 428 | } |
429 | 429 | ||
430 | static inline long __must_check strncpy_from_user(char *dst, const char __user *src, long count) | 430 | extern long strncpy_from_user(char *dest, const char __user *src, long count); |
431 | { | ||
432 | long res = -EFAULT; | ||
433 | if (access_ok(VERIFY_READ, src, 1)) | ||
434 | res = __strncpy_from_user(dst, src, count); | ||
435 | return res; | ||
436 | } | ||
437 | |||
438 | #define strlen_user(s) strnlen_user(s, ~0UL >> 1) | ||
439 | 431 | ||
440 | static inline long __must_check strnlen_user(const char __user *s, long n) | 432 | extern __must_check long strlen_user(const char __user *str); |
441 | { | 433 | extern __must_check long strnlen_user(const char __user *str, long n); |
442 | unsigned long res = 0; | ||
443 | |||
444 | if (__addr_ok(s)) | ||
445 | res = __strnlen_user(s, n); | ||
446 | |||
447 | return res; | ||
448 | } | ||
449 | 434 | ||
450 | #endif /* _ASMARM_UACCESS_H */ | 435 | #endif /* _ASMARM_UACCESS_H */ |
diff --git a/arch/arm/include/asm/word-at-a-time.h b/arch/arm/include/asm/word-at-a-time.h new file mode 100644 index 000000000000..4d52f92967a6 --- /dev/null +++ b/arch/arm/include/asm/word-at-a-time.h | |||
@@ -0,0 +1,96 @@ | |||
1 | #ifndef __ASM_ARM_WORD_AT_A_TIME_H | ||
2 | #define __ASM_ARM_WORD_AT_A_TIME_H | ||
3 | |||
4 | #ifndef __ARMEB__ | ||
5 | |||
6 | /* | ||
7 | * Little-endian word-at-a-time zero byte handling. | ||
8 | * Heavily based on the x86 algorithm. | ||
9 | */ | ||
10 | #include <linux/kernel.h> | ||
11 | |||
12 | struct word_at_a_time { | ||
13 | const unsigned long one_bits, high_bits; | ||
14 | }; | ||
15 | |||
16 | #define WORD_AT_A_TIME_CONSTANTS { REPEAT_BYTE(0x01), REPEAT_BYTE(0x80) } | ||
17 | |||
18 | static inline unsigned long has_zero(unsigned long a, unsigned long *bits, | ||
19 | const struct word_at_a_time *c) | ||
20 | { | ||
21 | unsigned long mask = ((a - c->one_bits) & ~a) & c->high_bits; | ||
22 | *bits = mask; | ||
23 | return mask; | ||
24 | } | ||
25 | |||
26 | #define prep_zero_mask(a, bits, c) (bits) | ||
27 | |||
28 | static inline unsigned long create_zero_mask(unsigned long bits) | ||
29 | { | ||
30 | bits = (bits - 1) & ~bits; | ||
31 | return bits >> 7; | ||
32 | } | ||
33 | |||
34 | static inline unsigned long find_zero(unsigned long mask) | ||
35 | { | ||
36 | unsigned long ret; | ||
37 | |||
38 | #if __LINUX_ARM_ARCH__ >= 5 | ||
39 | /* We have clz available. */ | ||
40 | ret = fls(mask) >> 3; | ||
41 | #else | ||
42 | /* (000000 0000ff 00ffff ffffff) -> ( 1 1 2 3 ) */ | ||
43 | ret = (0x0ff0001 + mask) >> 23; | ||
44 | /* Fix the 1 for 00 case */ | ||
45 | ret &= mask; | ||
46 | #endif | ||
47 | |||
48 | return ret; | ||
49 | } | ||
50 | |||
51 | #ifdef CONFIG_DCACHE_WORD_ACCESS | ||
52 | |||
53 | #define zero_bytemask(mask) (mask) | ||
54 | |||
55 | /* | ||
56 | * Load an unaligned word from kernel space. | ||
57 | * | ||
58 | * In the (very unlikely) case of the word being a page-crosser | ||
59 | * and the next page not being mapped, take the exception and | ||
60 | * return zeroes in the non-existing part. | ||
61 | */ | ||
62 | static inline unsigned long load_unaligned_zeropad(const void *addr) | ||
63 | { | ||
64 | unsigned long ret, offset; | ||
65 | |||
66 | /* Load word from unaligned pointer addr */ | ||
67 | asm( | ||
68 | "1: ldr %0, [%2]\n" | ||
69 | "2:\n" | ||
70 | " .pushsection .fixup,\"ax\"\n" | ||
71 | " .align 2\n" | ||
72 | "3: and %1, %2, #0x3\n" | ||
73 | " bic %2, %2, #0x3\n" | ||
74 | " ldr %0, [%2]\n" | ||
75 | " lsl %1, %1, #0x3\n" | ||
76 | " lsr %0, %0, %1\n" | ||
77 | " b 2b\n" | ||
78 | " .popsection\n" | ||
79 | " .pushsection __ex_table,\"a\"\n" | ||
80 | " .align 3\n" | ||
81 | " .long 1b, 3b\n" | ||
82 | " .popsection" | ||
83 | : "=&r" (ret), "=&r" (offset) | ||
84 | : "r" (addr), "Qo" (*(unsigned long *)addr)); | ||
85 | |||
86 | return ret; | ||
87 | } | ||
88 | |||
89 | |||
90 | #endif /* DCACHE_WORD_ACCESS */ | ||
91 | |||
92 | #else /* __ARMEB__ */ | ||
93 | #include <asm-generic/word-at-a-time.h> | ||
94 | #endif | ||
95 | |||
96 | #endif /* __ASM_ARM_WORD_AT_A_TIME_H */ | ||
diff --git a/arch/arm/kernel/arch_timer.c b/arch/arm/kernel/arch_timer.c index dd58035621f7..cf258807160d 100644 --- a/arch/arm/kernel/arch_timer.c +++ b/arch/arm/kernel/arch_timer.c | |||
@@ -32,6 +32,8 @@ static int arch_timer_ppi2; | |||
32 | 32 | ||
33 | static struct clock_event_device __percpu **arch_timer_evt; | 33 | static struct clock_event_device __percpu **arch_timer_evt; |
34 | 34 | ||
35 | extern void init_current_timer_delay(unsigned long freq); | ||
36 | |||
35 | /* | 37 | /* |
36 | * Architected system timer support. | 38 | * Architected system timer support. |
37 | */ | 39 | */ |
@@ -137,7 +139,7 @@ static int __cpuinit arch_timer_setup(struct clock_event_device *clk) | |||
137 | /* Be safe... */ | 139 | /* Be safe... */ |
138 | arch_timer_disable(); | 140 | arch_timer_disable(); |
139 | 141 | ||
140 | clk->features = CLOCK_EVT_FEAT_ONESHOT; | 142 | clk->features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_C3STOP; |
141 | clk->name = "arch_sys_timer"; | 143 | clk->name = "arch_sys_timer"; |
142 | clk->rating = 450; | 144 | clk->rating = 450; |
143 | clk->set_mode = arch_timer_set_mode; | 145 | clk->set_mode = arch_timer_set_mode; |
@@ -223,6 +225,14 @@ static cycle_t arch_counter_read(struct clocksource *cs) | |||
223 | return arch_counter_get_cntpct(); | 225 | return arch_counter_get_cntpct(); |
224 | } | 226 | } |
225 | 227 | ||
228 | int read_current_timer(unsigned long *timer_val) | ||
229 | { | ||
230 | if (!arch_timer_rate) | ||
231 | return -ENXIO; | ||
232 | *timer_val = arch_counter_get_cntpct(); | ||
233 | return 0; | ||
234 | } | ||
235 | |||
226 | static struct clocksource clocksource_counter = { | 236 | static struct clocksource clocksource_counter = { |
227 | .name = "arch_sys_counter", | 237 | .name = "arch_sys_counter", |
228 | .rating = 400, | 238 | .rating = 400, |
@@ -296,6 +306,7 @@ static int __init arch_timer_register(void) | |||
296 | if (err) | 306 | if (err) |
297 | goto out_free_irq; | 307 | goto out_free_irq; |
298 | 308 | ||
309 | init_current_timer_delay(arch_timer_rate); | ||
299 | return 0; | 310 | return 0; |
300 | 311 | ||
301 | out_free_irq: | 312 | out_free_irq: |
diff --git a/arch/arm/kernel/armksyms.c b/arch/arm/kernel/armksyms.c index b57c75e0b01f..60d3b738d420 100644 --- a/arch/arm/kernel/armksyms.c +++ b/arch/arm/kernel/armksyms.c | |||
@@ -49,8 +49,7 @@ extern void __aeabi_ulcmp(void); | |||
49 | extern void fpundefinstr(void); | 49 | extern void fpundefinstr(void); |
50 | 50 | ||
51 | /* platform dependent support */ | 51 | /* platform dependent support */ |
52 | EXPORT_SYMBOL(__udelay); | 52 | EXPORT_SYMBOL(arm_delay_ops); |
53 | EXPORT_SYMBOL(__const_udelay); | ||
54 | 53 | ||
55 | /* networking */ | 54 | /* networking */ |
56 | EXPORT_SYMBOL(csum_partial); | 55 | EXPORT_SYMBOL(csum_partial); |
@@ -87,10 +86,6 @@ EXPORT_SYMBOL(memmove); | |||
87 | EXPORT_SYMBOL(memchr); | 86 | EXPORT_SYMBOL(memchr); |
88 | EXPORT_SYMBOL(__memzero); | 87 | EXPORT_SYMBOL(__memzero); |
89 | 88 | ||
90 | /* user mem (segment) */ | ||
91 | EXPORT_SYMBOL(__strnlen_user); | ||
92 | EXPORT_SYMBOL(__strncpy_from_user); | ||
93 | |||
94 | #ifdef CONFIG_MMU | 89 | #ifdef CONFIG_MMU |
95 | EXPORT_SYMBOL(copy_page); | 90 | EXPORT_SYMBOL(copy_page); |
96 | 91 | ||
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 4afed88d250a..49d9f9305247 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S | |||
@@ -95,13 +95,7 @@ ENDPROC(ret_to_user) | |||
95 | ENTRY(ret_from_fork) | 95 | ENTRY(ret_from_fork) |
96 | bl schedule_tail | 96 | bl schedule_tail |
97 | get_thread_info tsk | 97 | get_thread_info tsk |
98 | ldr r1, [tsk, #TI_FLAGS] @ check for syscall tracing | ||
99 | mov why, #1 | 98 | mov why, #1 |
100 | tst r1, #_TIF_SYSCALL_WORK @ are we tracing syscalls? | ||
101 | beq ret_slow_syscall | ||
102 | mov r1, sp | ||
103 | mov r0, #1 @ trace exit [IP = 1] | ||
104 | bl syscall_trace | ||
105 | b ret_slow_syscall | 99 | b ret_slow_syscall |
106 | ENDPROC(ret_from_fork) | 100 | ENDPROC(ret_from_fork) |
107 | 101 | ||
@@ -448,10 +442,9 @@ ENDPROC(vector_swi) | |||
448 | * context switches, and waiting for our parent to respond. | 442 | * context switches, and waiting for our parent to respond. |
449 | */ | 443 | */ |
450 | __sys_trace: | 444 | __sys_trace: |
451 | mov r2, scno | 445 | mov r1, scno |
452 | add r1, sp, #S_OFF | 446 | add r0, sp, #S_OFF |
453 | mov r0, #0 @ trace entry [IP = 0] | 447 | bl syscall_trace_enter |
454 | bl syscall_trace | ||
455 | 448 | ||
456 | adr lr, BSYM(__sys_trace_return) @ return address | 449 | adr lr, BSYM(__sys_trace_return) @ return address |
457 | mov scno, r0 @ syscall number (possibly new) | 450 | mov scno, r0 @ syscall number (possibly new) |
@@ -463,10 +456,9 @@ __sys_trace: | |||
463 | 456 | ||
464 | __sys_trace_return: | 457 | __sys_trace_return: |
465 | str r0, [sp, #S_R0 + S_OFF]! @ save returned r0 | 458 | str r0, [sp, #S_R0 + S_OFF]! @ save returned r0 |
466 | mov r2, scno | 459 | mov r1, scno |
467 | mov r1, sp | 460 | mov r0, sp |
468 | mov r0, #1 @ trace exit [IP = 1] | 461 | bl syscall_trace_exit |
469 | bl syscall_trace | ||
470 | b ret_slow_syscall | 462 | b ret_slow_syscall |
471 | 463 | ||
472 | .align 5 | 464 | .align 5 |
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index 835898e7d704..3db960e20cb8 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S | |||
@@ -55,14 +55,6 @@ | |||
55 | add \rd, \phys, #TEXT_OFFSET - PG_DIR_SIZE | 55 | add \rd, \phys, #TEXT_OFFSET - PG_DIR_SIZE |
56 | .endm | 56 | .endm |
57 | 57 | ||
58 | #ifdef CONFIG_XIP_KERNEL | ||
59 | #define KERNEL_START XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR) | ||
60 | #define KERNEL_END _edata_loc | ||
61 | #else | ||
62 | #define KERNEL_START KERNEL_RAM_VADDR | ||
63 | #define KERNEL_END _end | ||
64 | #endif | ||
65 | |||
66 | /* | 58 | /* |
67 | * Kernel startup entry point. | 59 | * Kernel startup entry point. |
68 | * --------------------------- | 60 | * --------------------------- |
@@ -218,51 +210,46 @@ __create_page_tables: | |||
218 | blo 1b | 210 | blo 1b |
219 | 211 | ||
220 | /* | 212 | /* |
221 | * Now setup the pagetables for our kernel direct | 213 | * Map our RAM from the start to the end of the kernel .bss section. |
222 | * mapped region. | ||
223 | */ | 214 | */ |
224 | mov r3, pc | 215 | add r0, r4, #PAGE_OFFSET >> (SECTION_SHIFT - PMD_ORDER) |
225 | mov r3, r3, lsr #SECTION_SHIFT | 216 | ldr r6, =(_end - 1) |
226 | orr r3, r7, r3, lsl #SECTION_SHIFT | 217 | orr r3, r8, r7 |
227 | add r0, r4, #(KERNEL_START & 0xff000000) >> (SECTION_SHIFT - PMD_ORDER) | ||
228 | str r3, [r0, #((KERNEL_START & 0x00f00000) >> SECTION_SHIFT) << PMD_ORDER]! | ||
229 | ldr r6, =(KERNEL_END - 1) | ||
230 | add r0, r0, #1 << PMD_ORDER | ||
231 | add r6, r4, r6, lsr #(SECTION_SHIFT - PMD_ORDER) | 218 | add r6, r4, r6, lsr #(SECTION_SHIFT - PMD_ORDER) |
232 | 1: cmp r0, r6 | 219 | 1: str r3, [r0], #1 << PMD_ORDER |
233 | add r3, r3, #1 << SECTION_SHIFT | 220 | add r3, r3, #1 << SECTION_SHIFT |
234 | strls r3, [r0], #1 << PMD_ORDER | 221 | cmp r0, r6 |
235 | bls 1b | 222 | bls 1b |
236 | 223 | ||
237 | #ifdef CONFIG_XIP_KERNEL | 224 | #ifdef CONFIG_XIP_KERNEL |
238 | /* | 225 | /* |
239 | * Map some ram to cover our .data and .bss areas. | 226 | * Map the kernel image separately as it is not located in RAM. |
240 | */ | 227 | */ |
241 | add r3, r8, #TEXT_OFFSET | 228 | #define XIP_START XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR) |
242 | orr r3, r3, r7 | 229 | mov r3, pc |
243 | add r0, r4, #(KERNEL_RAM_VADDR & 0xff000000) >> (SECTION_SHIFT - PMD_ORDER) | 230 | mov r3, r3, lsr #SECTION_SHIFT |
244 | str r3, [r0, #(KERNEL_RAM_VADDR & 0x00f00000) >> (SECTION_SHIFT - PMD_ORDER)]! | 231 | orr r3, r7, r3, lsl #SECTION_SHIFT |
245 | ldr r6, =(_end - 1) | 232 | add r0, r4, #(XIP_START & 0xff000000) >> (SECTION_SHIFT - PMD_ORDER) |
246 | add r0, r0, #4 | 233 | str r3, [r0, #((XIP_START & 0x00f00000) >> SECTION_SHIFT) << PMD_ORDER]! |
234 | ldr r6, =(_edata_loc - 1) | ||
235 | add r0, r0, #1 << PMD_ORDER | ||
247 | add r6, r4, r6, lsr #(SECTION_SHIFT - PMD_ORDER) | 236 | add r6, r4, r6, lsr #(SECTION_SHIFT - PMD_ORDER) |
248 | 1: cmp r0, r6 | 237 | 1: cmp r0, r6 |
249 | add r3, r3, #1 << 20 | 238 | add r3, r3, #1 << SECTION_SHIFT |
250 | strls r3, [r0], #4 | 239 | strls r3, [r0], #1 << PMD_ORDER |
251 | bls 1b | 240 | bls 1b |
252 | #endif | 241 | #endif |
253 | 242 | ||
254 | /* | 243 | /* |
255 | * Then map boot params address in r2 or the first 1MB (2MB with LPAE) | 244 | * Then map boot params address in r2 if specified. |
256 | * of ram if boot params address is not specified. | ||
257 | */ | 245 | */ |
258 | mov r0, r2, lsr #SECTION_SHIFT | 246 | mov r0, r2, lsr #SECTION_SHIFT |
259 | movs r0, r0, lsl #SECTION_SHIFT | 247 | movs r0, r0, lsl #SECTION_SHIFT |
260 | moveq r0, r8 | 248 | subne r3, r0, r8 |
261 | sub r3, r0, r8 | 249 | addne r3, r3, #PAGE_OFFSET |
262 | add r3, r3, #PAGE_OFFSET | 250 | addne r3, r4, r3, lsr #(SECTION_SHIFT - PMD_ORDER) |
263 | add r3, r4, r3, lsr #(SECTION_SHIFT - PMD_ORDER) | 251 | orrne r6, r7, r0 |
264 | orr r6, r7, r0 | 252 | strne r6, [r3] |
265 | str r6, [r3] | ||
266 | 253 | ||
267 | #ifdef CONFIG_DEBUG_LL | 254 | #ifdef CONFIG_DEBUG_LL |
268 | #if !defined(CONFIG_DEBUG_ICEDCC) && !defined(CONFIG_DEBUG_SEMIHOSTING) | 255 | #if !defined(CONFIG_DEBUG_ICEDCC) && !defined(CONFIG_DEBUG_SEMIHOSTING) |
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index a02eada3aa5d..ab243b87118d 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c | |||
@@ -47,17 +47,14 @@ static DEFINE_PER_CPU(struct pmu_hw_events, cpu_hw_events); | |||
47 | /* Set at runtime when we know what CPU type we are. */ | 47 | /* Set at runtime when we know what CPU type we are. */ |
48 | static struct arm_pmu *cpu_pmu; | 48 | static struct arm_pmu *cpu_pmu; |
49 | 49 | ||
50 | enum arm_perf_pmu_ids | 50 | const char *perf_pmu_name(void) |
51 | armpmu_get_pmu_id(void) | ||
52 | { | 51 | { |
53 | int id = -ENODEV; | 52 | if (!cpu_pmu) |
54 | 53 | return NULL; | |
55 | if (cpu_pmu != NULL) | ||
56 | id = cpu_pmu->id; | ||
57 | 54 | ||
58 | return id; | 55 | return cpu_pmu->pmu.name; |
59 | } | 56 | } |
60 | EXPORT_SYMBOL_GPL(armpmu_get_pmu_id); | 57 | EXPORT_SYMBOL_GPL(perf_pmu_name); |
61 | 58 | ||
62 | int perf_num_counters(void) | 59 | int perf_num_counters(void) |
63 | { | 60 | { |
@@ -760,7 +757,7 @@ init_hw_perf_events(void) | |||
760 | cpu_pmu->name, cpu_pmu->num_events); | 757 | cpu_pmu->name, cpu_pmu->num_events); |
761 | cpu_pmu_init(cpu_pmu); | 758 | cpu_pmu_init(cpu_pmu); |
762 | register_cpu_notifier(&pmu_cpu_notifier); | 759 | register_cpu_notifier(&pmu_cpu_notifier); |
763 | armpmu_register(cpu_pmu, "cpu", PERF_TYPE_RAW); | 760 | armpmu_register(cpu_pmu, cpu_pmu->name, PERF_TYPE_RAW); |
764 | } else { | 761 | } else { |
765 | pr_info("no hardware support available\n"); | 762 | pr_info("no hardware support available\n"); |
766 | } | 763 | } |
diff --git a/arch/arm/kernel/perf_event_v6.c b/arch/arm/kernel/perf_event_v6.c index ab627a740fa3..c90fcb2b6967 100644 --- a/arch/arm/kernel/perf_event_v6.c +++ b/arch/arm/kernel/perf_event_v6.c | |||
@@ -650,7 +650,6 @@ static int armv6_map_event(struct perf_event *event) | |||
650 | } | 650 | } |
651 | 651 | ||
652 | static struct arm_pmu armv6pmu = { | 652 | static struct arm_pmu armv6pmu = { |
653 | .id = ARM_PERF_PMU_ID_V6, | ||
654 | .name = "v6", | 653 | .name = "v6", |
655 | .handle_irq = armv6pmu_handle_irq, | 654 | .handle_irq = armv6pmu_handle_irq, |
656 | .enable = armv6pmu_enable_event, | 655 | .enable = armv6pmu_enable_event, |
@@ -685,7 +684,6 @@ static int armv6mpcore_map_event(struct perf_event *event) | |||
685 | } | 684 | } |
686 | 685 | ||
687 | static struct arm_pmu armv6mpcore_pmu = { | 686 | static struct arm_pmu armv6mpcore_pmu = { |
688 | .id = ARM_PERF_PMU_ID_V6MP, | ||
689 | .name = "v6mpcore", | 687 | .name = "v6mpcore", |
690 | .handle_irq = armv6pmu_handle_irq, | 688 | .handle_irq = armv6pmu_handle_irq, |
691 | .enable = armv6pmu_enable_event, | 689 | .enable = armv6pmu_enable_event, |
diff --git a/arch/arm/kernel/perf_event_v7.c b/arch/arm/kernel/perf_event_v7.c index d3c536068162..f04070bd2183 100644 --- a/arch/arm/kernel/perf_event_v7.c +++ b/arch/arm/kernel/perf_event_v7.c | |||
@@ -1258,7 +1258,6 @@ static u32 __init armv7_read_num_pmnc_events(void) | |||
1258 | 1258 | ||
1259 | static struct arm_pmu *__init armv7_a8_pmu_init(void) | 1259 | static struct arm_pmu *__init armv7_a8_pmu_init(void) |
1260 | { | 1260 | { |
1261 | armv7pmu.id = ARM_PERF_PMU_ID_CA8; | ||
1262 | armv7pmu.name = "ARMv7 Cortex-A8"; | 1261 | armv7pmu.name = "ARMv7 Cortex-A8"; |
1263 | armv7pmu.map_event = armv7_a8_map_event; | 1262 | armv7pmu.map_event = armv7_a8_map_event; |
1264 | armv7pmu.num_events = armv7_read_num_pmnc_events(); | 1263 | armv7pmu.num_events = armv7_read_num_pmnc_events(); |
@@ -1267,7 +1266,6 @@ static struct arm_pmu *__init armv7_a8_pmu_init(void) | |||
1267 | 1266 | ||
1268 | static struct arm_pmu *__init armv7_a9_pmu_init(void) | 1267 | static struct arm_pmu *__init armv7_a9_pmu_init(void) |
1269 | { | 1268 | { |
1270 | armv7pmu.id = ARM_PERF_PMU_ID_CA9; | ||
1271 | armv7pmu.name = "ARMv7 Cortex-A9"; | 1269 | armv7pmu.name = "ARMv7 Cortex-A9"; |
1272 | armv7pmu.map_event = armv7_a9_map_event; | 1270 | armv7pmu.map_event = armv7_a9_map_event; |
1273 | armv7pmu.num_events = armv7_read_num_pmnc_events(); | 1271 | armv7pmu.num_events = armv7_read_num_pmnc_events(); |
@@ -1276,7 +1274,6 @@ static struct arm_pmu *__init armv7_a9_pmu_init(void) | |||
1276 | 1274 | ||
1277 | static struct arm_pmu *__init armv7_a5_pmu_init(void) | 1275 | static struct arm_pmu *__init armv7_a5_pmu_init(void) |
1278 | { | 1276 | { |
1279 | armv7pmu.id = ARM_PERF_PMU_ID_CA5; | ||
1280 | armv7pmu.name = "ARMv7 Cortex-A5"; | 1277 | armv7pmu.name = "ARMv7 Cortex-A5"; |
1281 | armv7pmu.map_event = armv7_a5_map_event; | 1278 | armv7pmu.map_event = armv7_a5_map_event; |
1282 | armv7pmu.num_events = armv7_read_num_pmnc_events(); | 1279 | armv7pmu.num_events = armv7_read_num_pmnc_events(); |
@@ -1285,7 +1282,6 @@ static struct arm_pmu *__init armv7_a5_pmu_init(void) | |||
1285 | 1282 | ||
1286 | static struct arm_pmu *__init armv7_a15_pmu_init(void) | 1283 | static struct arm_pmu *__init armv7_a15_pmu_init(void) |
1287 | { | 1284 | { |
1288 | armv7pmu.id = ARM_PERF_PMU_ID_CA15; | ||
1289 | armv7pmu.name = "ARMv7 Cortex-A15"; | 1285 | armv7pmu.name = "ARMv7 Cortex-A15"; |
1290 | armv7pmu.map_event = armv7_a15_map_event; | 1286 | armv7pmu.map_event = armv7_a15_map_event; |
1291 | armv7pmu.num_events = armv7_read_num_pmnc_events(); | 1287 | armv7pmu.num_events = armv7_read_num_pmnc_events(); |
@@ -1295,7 +1291,6 @@ static struct arm_pmu *__init armv7_a15_pmu_init(void) | |||
1295 | 1291 | ||
1296 | static struct arm_pmu *__init armv7_a7_pmu_init(void) | 1292 | static struct arm_pmu *__init armv7_a7_pmu_init(void) |
1297 | { | 1293 | { |
1298 | armv7pmu.id = ARM_PERF_PMU_ID_CA7; | ||
1299 | armv7pmu.name = "ARMv7 Cortex-A7"; | 1294 | armv7pmu.name = "ARMv7 Cortex-A7"; |
1300 | armv7pmu.map_event = armv7_a7_map_event; | 1295 | armv7pmu.map_event = armv7_a7_map_event; |
1301 | armv7pmu.num_events = armv7_read_num_pmnc_events(); | 1296 | armv7pmu.num_events = armv7_read_num_pmnc_events(); |
diff --git a/arch/arm/kernel/perf_event_xscale.c b/arch/arm/kernel/perf_event_xscale.c index e34e7254e652..f759fe0bab63 100644 --- a/arch/arm/kernel/perf_event_xscale.c +++ b/arch/arm/kernel/perf_event_xscale.c | |||
@@ -435,7 +435,6 @@ static int xscale_map_event(struct perf_event *event) | |||
435 | } | 435 | } |
436 | 436 | ||
437 | static struct arm_pmu xscale1pmu = { | 437 | static struct arm_pmu xscale1pmu = { |
438 | .id = ARM_PERF_PMU_ID_XSCALE1, | ||
439 | .name = "xscale1", | 438 | .name = "xscale1", |
440 | .handle_irq = xscale1pmu_handle_irq, | 439 | .handle_irq = xscale1pmu_handle_irq, |
441 | .enable = xscale1pmu_enable_event, | 440 | .enable = xscale1pmu_enable_event, |
@@ -803,7 +802,6 @@ xscale2pmu_write_counter(int counter, u32 val) | |||
803 | } | 802 | } |
804 | 803 | ||
805 | static struct arm_pmu xscale2pmu = { | 804 | static struct arm_pmu xscale2pmu = { |
806 | .id = ARM_PERF_PMU_ID_XSCALE2, | ||
807 | .name = "xscale2", | 805 | .name = "xscale2", |
808 | .handle_irq = xscale2pmu_handle_irq, | 806 | .handle_irq = xscale2pmu_handle_irq, |
809 | .enable = xscale2pmu_enable_event, | 807 | .enable = xscale2pmu_enable_event, |
diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index 14e38261cd31..dab711e6e1ca 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c | |||
@@ -907,16 +907,16 @@ long arch_ptrace(struct task_struct *child, long request, | |||
907 | return ret; | 907 | return ret; |
908 | } | 908 | } |
909 | 909 | ||
910 | asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno) | 910 | enum ptrace_syscall_dir { |
911 | PTRACE_SYSCALL_ENTER = 0, | ||
912 | PTRACE_SYSCALL_EXIT, | ||
913 | }; | ||
914 | |||
915 | static int ptrace_syscall_trace(struct pt_regs *regs, int scno, | ||
916 | enum ptrace_syscall_dir dir) | ||
911 | { | 917 | { |
912 | unsigned long ip; | 918 | unsigned long ip; |
913 | 919 | ||
914 | if (why) | ||
915 | audit_syscall_exit(regs); | ||
916 | else | ||
917 | audit_syscall_entry(AUDIT_ARCH_ARM, scno, regs->ARM_r0, | ||
918 | regs->ARM_r1, regs->ARM_r2, regs->ARM_r3); | ||
919 | |||
920 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) | 920 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) |
921 | return scno; | 921 | return scno; |
922 | 922 | ||
@@ -927,14 +927,28 @@ asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno) | |||
927 | * IP = 0 -> entry, =1 -> exit | 927 | * IP = 0 -> entry, =1 -> exit |
928 | */ | 928 | */ |
929 | ip = regs->ARM_ip; | 929 | ip = regs->ARM_ip; |
930 | regs->ARM_ip = why; | 930 | regs->ARM_ip = dir; |
931 | 931 | ||
932 | if (why) | 932 | if (dir == PTRACE_SYSCALL_EXIT) |
933 | tracehook_report_syscall_exit(regs, 0); | 933 | tracehook_report_syscall_exit(regs, 0); |
934 | else if (tracehook_report_syscall_entry(regs)) | 934 | else if (tracehook_report_syscall_entry(regs)) |
935 | current_thread_info()->syscall = -1; | 935 | current_thread_info()->syscall = -1; |
936 | 936 | ||
937 | regs->ARM_ip = ip; | 937 | regs->ARM_ip = ip; |
938 | |||
939 | return current_thread_info()->syscall; | 938 | return current_thread_info()->syscall; |
940 | } | 939 | } |
940 | |||
941 | asmlinkage int syscall_trace_enter(struct pt_regs *regs, int scno) | ||
942 | { | ||
943 | int ret = ptrace_syscall_trace(regs, scno, PTRACE_SYSCALL_ENTER); | ||
944 | audit_syscall_entry(AUDIT_ARCH_ARM, scno, regs->ARM_r0, regs->ARM_r1, | ||
945 | regs->ARM_r2, regs->ARM_r3); | ||
946 | return ret; | ||
947 | } | ||
948 | |||
949 | asmlinkage int syscall_trace_exit(struct pt_regs *regs, int scno) | ||
950 | { | ||
951 | int ret = ptrace_syscall_trace(regs, scno, PTRACE_SYSCALL_EXIT); | ||
952 | audit_syscall_exit(regs); | ||
953 | return ret; | ||
954 | } | ||
diff --git a/arch/arm/kernel/topology.c b/arch/arm/kernel/topology.c index 8200deaa14f6..198b08456e90 100644 --- a/arch/arm/kernel/topology.c +++ b/arch/arm/kernel/topology.c | |||
@@ -17,11 +17,190 @@ | |||
17 | #include <linux/percpu.h> | 17 | #include <linux/percpu.h> |
18 | #include <linux/node.h> | 18 | #include <linux/node.h> |
19 | #include <linux/nodemask.h> | 19 | #include <linux/nodemask.h> |
20 | #include <linux/of.h> | ||
20 | #include <linux/sched.h> | 21 | #include <linux/sched.h> |
22 | #include <linux/slab.h> | ||
21 | 23 | ||
22 | #include <asm/cputype.h> | 24 | #include <asm/cputype.h> |
23 | #include <asm/topology.h> | 25 | #include <asm/topology.h> |
24 | 26 | ||
27 | /* | ||
28 | * cpu power scale management | ||
29 | */ | ||
30 | |||
31 | /* | ||
32 | * cpu power table | ||
33 | * This per cpu data structure describes the relative capacity of each core. | ||
34 | * On a heteregenous system, cores don't have the same computation capacity | ||
35 | * and we reflect that difference in the cpu_power field so the scheduler can | ||
36 | * take this difference into account during load balance. A per cpu structure | ||
37 | * is preferred because each CPU updates its own cpu_power field during the | ||
38 | * load balance except for idle cores. One idle core is selected to run the | ||
39 | * rebalance_domains for all idle cores and the cpu_power can be updated | ||
40 | * during this sequence. | ||
41 | */ | ||
42 | static DEFINE_PER_CPU(unsigned long, cpu_scale); | ||
43 | |||
44 | unsigned long arch_scale_freq_power(struct sched_domain *sd, int cpu) | ||
45 | { | ||
46 | return per_cpu(cpu_scale, cpu); | ||
47 | } | ||
48 | |||
49 | static void set_power_scale(unsigned int cpu, unsigned long power) | ||
50 | { | ||
51 | per_cpu(cpu_scale, cpu) = power; | ||
52 | } | ||
53 | |||
54 | #ifdef CONFIG_OF | ||
55 | struct cpu_efficiency { | ||
56 | const char *compatible; | ||
57 | unsigned long efficiency; | ||
58 | }; | ||
59 | |||
60 | /* | ||
61 | * Table of relative efficiency of each processors | ||
62 | * The efficiency value must fit in 20bit and the final | ||
63 | * cpu_scale value must be in the range | ||
64 | * 0 < cpu_scale < 3*SCHED_POWER_SCALE/2 | ||
65 | * in order to return at most 1 when DIV_ROUND_CLOSEST | ||
66 | * is used to compute the capacity of a CPU. | ||
67 | * Processors that are not defined in the table, | ||
68 | * use the default SCHED_POWER_SCALE value for cpu_scale. | ||
69 | */ | ||
70 | struct cpu_efficiency table_efficiency[] = { | ||
71 | {"arm,cortex-a15", 3891}, | ||
72 | {"arm,cortex-a7", 2048}, | ||
73 | {NULL, }, | ||
74 | }; | ||
75 | |||
76 | struct cpu_capacity { | ||
77 | unsigned long hwid; | ||
78 | unsigned long capacity; | ||
79 | }; | ||
80 | |||
81 | struct cpu_capacity *cpu_capacity; | ||
82 | |||
83 | unsigned long middle_capacity = 1; | ||
84 | |||
85 | /* | ||
86 | * Iterate all CPUs' descriptor in DT and compute the efficiency | ||
87 | * (as per table_efficiency). Also calculate a middle efficiency | ||
88 | * as close as possible to (max{eff_i} - min{eff_i}) / 2 | ||
89 | * This is later used to scale the cpu_power field such that an | ||
90 | * 'average' CPU is of middle power. Also see the comments near | ||
91 | * table_efficiency[] and update_cpu_power(). | ||
92 | */ | ||
93 | static void __init parse_dt_topology(void) | ||
94 | { | ||
95 | struct cpu_efficiency *cpu_eff; | ||
96 | struct device_node *cn = NULL; | ||
97 | unsigned long min_capacity = (unsigned long)(-1); | ||
98 | unsigned long max_capacity = 0; | ||
99 | unsigned long capacity = 0; | ||
100 | int alloc_size, cpu = 0; | ||
101 | |||
102 | alloc_size = nr_cpu_ids * sizeof(struct cpu_capacity); | ||
103 | cpu_capacity = (struct cpu_capacity *)kzalloc(alloc_size, GFP_NOWAIT); | ||
104 | |||
105 | while ((cn = of_find_node_by_type(cn, "cpu"))) { | ||
106 | const u32 *rate, *reg; | ||
107 | int len; | ||
108 | |||
109 | if (cpu >= num_possible_cpus()) | ||
110 | break; | ||
111 | |||
112 | for (cpu_eff = table_efficiency; cpu_eff->compatible; cpu_eff++) | ||
113 | if (of_device_is_compatible(cn, cpu_eff->compatible)) | ||
114 | break; | ||
115 | |||
116 | if (cpu_eff->compatible == NULL) | ||
117 | continue; | ||
118 | |||
119 | rate = of_get_property(cn, "clock-frequency", &len); | ||
120 | if (!rate || len != 4) { | ||
121 | pr_err("%s missing clock-frequency property\n", | ||
122 | cn->full_name); | ||
123 | continue; | ||
124 | } | ||
125 | |||
126 | reg = of_get_property(cn, "reg", &len); | ||
127 | if (!reg || len != 4) { | ||
128 | pr_err("%s missing reg property\n", cn->full_name); | ||
129 | continue; | ||
130 | } | ||
131 | |||
132 | capacity = ((be32_to_cpup(rate)) >> 20) * cpu_eff->efficiency; | ||
133 | |||
134 | /* Save min capacity of the system */ | ||
135 | if (capacity < min_capacity) | ||
136 | min_capacity = capacity; | ||
137 | |||
138 | /* Save max capacity of the system */ | ||
139 | if (capacity > max_capacity) | ||
140 | max_capacity = capacity; | ||
141 | |||
142 | cpu_capacity[cpu].capacity = capacity; | ||
143 | cpu_capacity[cpu++].hwid = be32_to_cpup(reg); | ||
144 | } | ||
145 | |||
146 | if (cpu < num_possible_cpus()) | ||
147 | cpu_capacity[cpu].hwid = (unsigned long)(-1); | ||
148 | |||
149 | /* If min and max capacities are equals, we bypass the update of the | ||
150 | * cpu_scale because all CPUs have the same capacity. Otherwise, we | ||
151 | * compute a middle_capacity factor that will ensure that the capacity | ||
152 | * of an 'average' CPU of the system will be as close as possible to | ||
153 | * SCHED_POWER_SCALE, which is the default value, but with the | ||
154 | * constraint explained near table_efficiency[]. | ||
155 | */ | ||
156 | if (min_capacity == max_capacity) | ||
157 | cpu_capacity[0].hwid = (unsigned long)(-1); | ||
158 | else if (4*max_capacity < (3*(max_capacity + min_capacity))) | ||
159 | middle_capacity = (min_capacity + max_capacity) | ||
160 | >> (SCHED_POWER_SHIFT+1); | ||
161 | else | ||
162 | middle_capacity = ((max_capacity / 3) | ||
163 | >> (SCHED_POWER_SHIFT-1)) + 1; | ||
164 | |||
165 | } | ||
166 | |||
167 | /* | ||
168 | * Look for a customed capacity of a CPU in the cpu_capacity table during the | ||
169 | * boot. The update of all CPUs is in O(n^2) for heteregeneous system but the | ||
170 | * function returns directly for SMP system. | ||
171 | */ | ||
172 | void update_cpu_power(unsigned int cpu, unsigned long hwid) | ||
173 | { | ||
174 | unsigned int idx = 0; | ||
175 | |||
176 | /* look for the cpu's hwid in the cpu capacity table */ | ||
177 | for (idx = 0; idx < num_possible_cpus(); idx++) { | ||
178 | if (cpu_capacity[idx].hwid == hwid) | ||
179 | break; | ||
180 | |||
181 | if (cpu_capacity[idx].hwid == -1) | ||
182 | return; | ||
183 | } | ||
184 | |||
185 | if (idx == num_possible_cpus()) | ||
186 | return; | ||
187 | |||
188 | set_power_scale(cpu, cpu_capacity[idx].capacity / middle_capacity); | ||
189 | |||
190 | printk(KERN_INFO "CPU%u: update cpu_power %lu\n", | ||
191 | cpu, arch_scale_freq_power(NULL, cpu)); | ||
192 | } | ||
193 | |||
194 | #else | ||
195 | static inline void parse_dt_topology(void) {} | ||
196 | static inline void update_cpu_power(unsigned int cpuid, unsigned int mpidr) {} | ||
197 | #endif | ||
198 | |||
199 | |||
200 | /* | ||
201 | * cpu topology management | ||
202 | */ | ||
203 | |||
25 | #define MPIDR_SMP_BITMASK (0x3 << 30) | 204 | #define MPIDR_SMP_BITMASK (0x3 << 30) |
26 | #define MPIDR_SMP_VALUE (0x2 << 30) | 205 | #define MPIDR_SMP_VALUE (0x2 << 30) |
27 | 206 | ||
@@ -31,6 +210,7 @@ | |||
31 | * These masks reflect the current use of the affinity levels. | 210 | * These masks reflect the current use of the affinity levels. |
32 | * The affinity level can be up to 16 bits according to ARM ARM | 211 | * The affinity level can be up to 16 bits according to ARM ARM |
33 | */ | 212 | */ |
213 | #define MPIDR_HWID_BITMASK 0xFFFFFF | ||
34 | 214 | ||
35 | #define MPIDR_LEVEL0_MASK 0x3 | 215 | #define MPIDR_LEVEL0_MASK 0x3 |
36 | #define MPIDR_LEVEL0_SHIFT 0 | 216 | #define MPIDR_LEVEL0_SHIFT 0 |
@@ -41,6 +221,9 @@ | |||
41 | #define MPIDR_LEVEL2_MASK 0xFF | 221 | #define MPIDR_LEVEL2_MASK 0xFF |
42 | #define MPIDR_LEVEL2_SHIFT 16 | 222 | #define MPIDR_LEVEL2_SHIFT 16 |
43 | 223 | ||
224 | /* | ||
225 | * cpu topology table | ||
226 | */ | ||
44 | struct cputopo_arm cpu_topology[NR_CPUS]; | 227 | struct cputopo_arm cpu_topology[NR_CPUS]; |
45 | 228 | ||
46 | const struct cpumask *cpu_coregroup_mask(int cpu) | 229 | const struct cpumask *cpu_coregroup_mask(int cpu) |
@@ -48,6 +231,32 @@ const struct cpumask *cpu_coregroup_mask(int cpu) | |||
48 | return &cpu_topology[cpu].core_sibling; | 231 | return &cpu_topology[cpu].core_sibling; |
49 | } | 232 | } |
50 | 233 | ||
234 | void update_siblings_masks(unsigned int cpuid) | ||
235 | { | ||
236 | struct cputopo_arm *cpu_topo, *cpuid_topo = &cpu_topology[cpuid]; | ||
237 | int cpu; | ||
238 | |||
239 | /* update core and thread sibling masks */ | ||
240 | for_each_possible_cpu(cpu) { | ||
241 | cpu_topo = &cpu_topology[cpu]; | ||
242 | |||
243 | if (cpuid_topo->socket_id != cpu_topo->socket_id) | ||
244 | continue; | ||
245 | |||
246 | cpumask_set_cpu(cpuid, &cpu_topo->core_sibling); | ||
247 | if (cpu != cpuid) | ||
248 | cpumask_set_cpu(cpu, &cpuid_topo->core_sibling); | ||
249 | |||
250 | if (cpuid_topo->core_id != cpu_topo->core_id) | ||
251 | continue; | ||
252 | |||
253 | cpumask_set_cpu(cpuid, &cpu_topo->thread_sibling); | ||
254 | if (cpu != cpuid) | ||
255 | cpumask_set_cpu(cpu, &cpuid_topo->thread_sibling); | ||
256 | } | ||
257 | smp_wmb(); | ||
258 | } | ||
259 | |||
51 | /* | 260 | /* |
52 | * store_cpu_topology is called at boot when only one cpu is running | 261 | * store_cpu_topology is called at boot when only one cpu is running |
53 | * and with the mutex cpu_hotplug.lock locked, when several cpus have booted, | 262 | * and with the mutex cpu_hotplug.lock locked, when several cpus have booted, |
@@ -57,7 +266,6 @@ void store_cpu_topology(unsigned int cpuid) | |||
57 | { | 266 | { |
58 | struct cputopo_arm *cpuid_topo = &cpu_topology[cpuid]; | 267 | struct cputopo_arm *cpuid_topo = &cpu_topology[cpuid]; |
59 | unsigned int mpidr; | 268 | unsigned int mpidr; |
60 | unsigned int cpu; | ||
61 | 269 | ||
62 | /* If the cpu topology has been already set, just return */ | 270 | /* If the cpu topology has been already set, just return */ |
63 | if (cpuid_topo->core_id != -1) | 271 | if (cpuid_topo->core_id != -1) |
@@ -99,26 +307,9 @@ void store_cpu_topology(unsigned int cpuid) | |||
99 | cpuid_topo->socket_id = -1; | 307 | cpuid_topo->socket_id = -1; |
100 | } | 308 | } |
101 | 309 | ||
102 | /* update core and thread sibling masks */ | 310 | update_siblings_masks(cpuid); |
103 | for_each_possible_cpu(cpu) { | 311 | |
104 | struct cputopo_arm *cpu_topo = &cpu_topology[cpu]; | 312 | update_cpu_power(cpuid, mpidr & MPIDR_HWID_BITMASK); |
105 | |||
106 | if (cpuid_topo->socket_id == cpu_topo->socket_id) { | ||
107 | cpumask_set_cpu(cpuid, &cpu_topo->core_sibling); | ||
108 | if (cpu != cpuid) | ||
109 | cpumask_set_cpu(cpu, | ||
110 | &cpuid_topo->core_sibling); | ||
111 | |||
112 | if (cpuid_topo->core_id == cpu_topo->core_id) { | ||
113 | cpumask_set_cpu(cpuid, | ||
114 | &cpu_topo->thread_sibling); | ||
115 | if (cpu != cpuid) | ||
116 | cpumask_set_cpu(cpu, | ||
117 | &cpuid_topo->thread_sibling); | ||
118 | } | ||
119 | } | ||
120 | } | ||
121 | smp_wmb(); | ||
122 | 313 | ||
123 | printk(KERN_INFO "CPU%u: thread %d, cpu %d, socket %d, mpidr %x\n", | 314 | printk(KERN_INFO "CPU%u: thread %d, cpu %d, socket %d, mpidr %x\n", |
124 | cpuid, cpu_topology[cpuid].thread_id, | 315 | cpuid, cpu_topology[cpuid].thread_id, |
@@ -134,7 +325,7 @@ void init_cpu_topology(void) | |||
134 | { | 325 | { |
135 | unsigned int cpu; | 326 | unsigned int cpu; |
136 | 327 | ||
137 | /* init core mask */ | 328 | /* init core mask and power*/ |
138 | for_each_possible_cpu(cpu) { | 329 | for_each_possible_cpu(cpu) { |
139 | struct cputopo_arm *cpu_topo = &(cpu_topology[cpu]); | 330 | struct cputopo_arm *cpu_topo = &(cpu_topology[cpu]); |
140 | 331 | ||
@@ -143,6 +334,10 @@ void init_cpu_topology(void) | |||
143 | cpu_topo->socket_id = -1; | 334 | cpu_topo->socket_id = -1; |
144 | cpumask_clear(&cpu_topo->core_sibling); | 335 | cpumask_clear(&cpu_topo->core_sibling); |
145 | cpumask_clear(&cpu_topo->thread_sibling); | 336 | cpumask_clear(&cpu_topo->thread_sibling); |
337 | |||
338 | set_power_scale(cpu, SCHED_POWER_SCALE); | ||
146 | } | 339 | } |
147 | smp_wmb(); | 340 | smp_wmb(); |
341 | |||
342 | parse_dt_topology(); | ||
148 | } | 343 | } |
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 3647170e9a16..8b97d739b17b 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
@@ -233,9 +233,9 @@ void show_stack(struct task_struct *tsk, unsigned long *sp) | |||
233 | #define S_ISA " ARM" | 233 | #define S_ISA " ARM" |
234 | #endif | 234 | #endif |
235 | 235 | ||
236 | static int __die(const char *str, int err, struct thread_info *thread, struct pt_regs *regs) | 236 | static int __die(const char *str, int err, struct pt_regs *regs) |
237 | { | 237 | { |
238 | struct task_struct *tsk = thread->task; | 238 | struct task_struct *tsk = current; |
239 | static int die_counter; | 239 | static int die_counter; |
240 | int ret; | 240 | int ret; |
241 | 241 | ||
@@ -245,12 +245,12 @@ static int __die(const char *str, int err, struct thread_info *thread, struct pt | |||
245 | /* trap and error numbers are mostly meaningless on ARM */ | 245 | /* trap and error numbers are mostly meaningless on ARM */ |
246 | ret = notify_die(DIE_OOPS, str, regs, err, tsk->thread.trap_no, SIGSEGV); | 246 | ret = notify_die(DIE_OOPS, str, regs, err, tsk->thread.trap_no, SIGSEGV); |
247 | if (ret == NOTIFY_STOP) | 247 | if (ret == NOTIFY_STOP) |
248 | return ret; | 248 | return 1; |
249 | 249 | ||
250 | print_modules(); | 250 | print_modules(); |
251 | __show_regs(regs); | 251 | __show_regs(regs); |
252 | printk(KERN_EMERG "Process %.*s (pid: %d, stack limit = 0x%p)\n", | 252 | printk(KERN_EMERG "Process %.*s (pid: %d, stack limit = 0x%p)\n", |
253 | TASK_COMM_LEN, tsk->comm, task_pid_nr(tsk), thread + 1); | 253 | TASK_COMM_LEN, tsk->comm, task_pid_nr(tsk), end_of_stack(tsk)); |
254 | 254 | ||
255 | if (!user_mode(regs) || in_interrupt()) { | 255 | if (!user_mode(regs) || in_interrupt()) { |
256 | dump_mem(KERN_EMERG, "Stack: ", regs->ARM_sp, | 256 | dump_mem(KERN_EMERG, "Stack: ", regs->ARM_sp, |
@@ -259,45 +259,77 @@ static int __die(const char *str, int err, struct thread_info *thread, struct pt | |||
259 | dump_instr(KERN_EMERG, regs); | 259 | dump_instr(KERN_EMERG, regs); |
260 | } | 260 | } |
261 | 261 | ||
262 | return ret; | 262 | return 0; |
263 | } | 263 | } |
264 | 264 | ||
265 | static DEFINE_RAW_SPINLOCK(die_lock); | 265 | static arch_spinlock_t die_lock = __ARCH_SPIN_LOCK_UNLOCKED; |
266 | static int die_owner = -1; | ||
267 | static unsigned int die_nest_count; | ||
266 | 268 | ||
267 | /* | 269 | static unsigned long oops_begin(void) |
268 | * This function is protected against re-entrancy. | ||
269 | */ | ||
270 | void die(const char *str, struct pt_regs *regs, int err) | ||
271 | { | 270 | { |
272 | struct thread_info *thread = current_thread_info(); | 271 | int cpu; |
273 | int ret; | 272 | unsigned long flags; |
274 | enum bug_trap_type bug_type = BUG_TRAP_TYPE_NONE; | ||
275 | 273 | ||
276 | oops_enter(); | 274 | oops_enter(); |
277 | 275 | ||
278 | raw_spin_lock_irq(&die_lock); | 276 | /* racy, but better than risking deadlock. */ |
277 | raw_local_irq_save(flags); | ||
278 | cpu = smp_processor_id(); | ||
279 | if (!arch_spin_trylock(&die_lock)) { | ||
280 | if (cpu == die_owner) | ||
281 | /* nested oops. should stop eventually */; | ||
282 | else | ||
283 | arch_spin_lock(&die_lock); | ||
284 | } | ||
285 | die_nest_count++; | ||
286 | die_owner = cpu; | ||
279 | console_verbose(); | 287 | console_verbose(); |
280 | bust_spinlocks(1); | 288 | bust_spinlocks(1); |
281 | if (!user_mode(regs)) | 289 | return flags; |
282 | bug_type = report_bug(regs->ARM_pc, regs); | 290 | } |
283 | if (bug_type != BUG_TRAP_TYPE_NONE) | ||
284 | str = "Oops - BUG"; | ||
285 | ret = __die(str, err, thread, regs); | ||
286 | 291 | ||
287 | if (regs && kexec_should_crash(thread->task)) | 292 | static void oops_end(unsigned long flags, struct pt_regs *regs, int signr) |
293 | { | ||
294 | if (regs && kexec_should_crash(current)) | ||
288 | crash_kexec(regs); | 295 | crash_kexec(regs); |
289 | 296 | ||
290 | bust_spinlocks(0); | 297 | bust_spinlocks(0); |
298 | die_owner = -1; | ||
291 | add_taint(TAINT_DIE); | 299 | add_taint(TAINT_DIE); |
292 | raw_spin_unlock_irq(&die_lock); | 300 | die_nest_count--; |
301 | if (!die_nest_count) | ||
302 | /* Nest count reaches zero, release the lock. */ | ||
303 | arch_spin_unlock(&die_lock); | ||
304 | raw_local_irq_restore(flags); | ||
293 | oops_exit(); | 305 | oops_exit(); |
294 | 306 | ||
295 | if (in_interrupt()) | 307 | if (in_interrupt()) |
296 | panic("Fatal exception in interrupt"); | 308 | panic("Fatal exception in interrupt"); |
297 | if (panic_on_oops) | 309 | if (panic_on_oops) |
298 | panic("Fatal exception"); | 310 | panic("Fatal exception"); |
299 | if (ret != NOTIFY_STOP) | 311 | if (signr) |
300 | do_exit(SIGSEGV); | 312 | do_exit(signr); |
313 | } | ||
314 | |||
315 | /* | ||
316 | * This function is protected against re-entrancy. | ||
317 | */ | ||
318 | void die(const char *str, struct pt_regs *regs, int err) | ||
319 | { | ||
320 | enum bug_trap_type bug_type = BUG_TRAP_TYPE_NONE; | ||
321 | unsigned long flags = oops_begin(); | ||
322 | int sig = SIGSEGV; | ||
323 | |||
324 | if (!user_mode(regs)) | ||
325 | bug_type = report_bug(regs->ARM_pc, regs); | ||
326 | if (bug_type != BUG_TRAP_TYPE_NONE) | ||
327 | str = "Oops - BUG"; | ||
328 | |||
329 | if (__die(str, err, regs)) | ||
330 | sig = 0; | ||
331 | |||
332 | oops_end(flags, regs, sig); | ||
301 | } | 333 | } |
302 | 334 | ||
303 | void arm_notify_die(const char *str, struct pt_regs *regs, | 335 | void arm_notify_die(const char *str, struct pt_regs *regs, |
diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile index 992769ae2599..2473fd1fd51c 100644 --- a/arch/arm/lib/Makefile +++ b/arch/arm/lib/Makefile | |||
@@ -6,9 +6,8 @@ | |||
6 | 6 | ||
7 | lib-y := backtrace.o changebit.o csumipv6.o csumpartial.o \ | 7 | lib-y := backtrace.o changebit.o csumipv6.o csumpartial.o \ |
8 | csumpartialcopy.o csumpartialcopyuser.o clearbit.o \ | 8 | csumpartialcopy.o csumpartialcopyuser.o clearbit.o \ |
9 | delay.o findbit.o memchr.o memcpy.o \ | 9 | delay.o delay-loop.o findbit.o memchr.o memcpy.o \ |
10 | memmove.o memset.o memzero.o setbit.o \ | 10 | memmove.o memset.o memzero.o setbit.o \ |
11 | strncpy_from_user.o strnlen_user.o \ | ||
12 | strchr.o strrchr.o \ | 11 | strchr.o strrchr.o \ |
13 | testchangebit.o testclearbit.o testsetbit.o \ | 12 | testchangebit.o testclearbit.o testsetbit.o \ |
14 | ashldi3.o ashrdi3.o lshrdi3.o muldi3.o \ | 13 | ashldi3.o ashrdi3.o lshrdi3.o muldi3.o \ |
diff --git a/arch/arm/lib/delay.S b/arch/arm/lib/delay-loop.S index 3c9a05c8d20b..36b668d8e121 100644 --- a/arch/arm/lib/delay.S +++ b/arch/arm/lib/delay-loop.S | |||
@@ -9,11 +9,11 @@ | |||
9 | */ | 9 | */ |
10 | #include <linux/linkage.h> | 10 | #include <linux/linkage.h> |
11 | #include <asm/assembler.h> | 11 | #include <asm/assembler.h> |
12 | #include <asm/param.h> | 12 | #include <asm/delay.h> |
13 | .text | 13 | .text |
14 | 14 | ||
15 | .LC0: .word loops_per_jiffy | 15 | .LC0: .word loops_per_jiffy |
16 | .LC1: .word (2199023*HZ)>>11 | 16 | .LC1: .word UDELAY_MULT |
17 | 17 | ||
18 | /* | 18 | /* |
19 | * r0 <= 2000 | 19 | * r0 <= 2000 |
@@ -21,10 +21,10 @@ | |||
21 | * HZ <= 1000 | 21 | * HZ <= 1000 |
22 | */ | 22 | */ |
23 | 23 | ||
24 | ENTRY(__udelay) | 24 | ENTRY(__loop_udelay) |
25 | ldr r2, .LC1 | 25 | ldr r2, .LC1 |
26 | mul r0, r2, r0 | 26 | mul r0, r2, r0 |
27 | ENTRY(__const_udelay) @ 0 <= r0 <= 0x7fffff06 | 27 | ENTRY(__loop_const_udelay) @ 0 <= r0 <= 0x7fffff06 |
28 | mov r1, #-1 | 28 | mov r1, #-1 |
29 | ldr r2, .LC0 | 29 | ldr r2, .LC0 |
30 | ldr r2, [r2] @ max = 0x01ffffff | 30 | ldr r2, [r2] @ max = 0x01ffffff |
@@ -39,12 +39,10 @@ ENTRY(__const_udelay) @ 0 <= r0 <= 0x7fffff06 | |||
39 | 39 | ||
40 | /* | 40 | /* |
41 | * loops = r0 * HZ * loops_per_jiffy / 1000000 | 41 | * loops = r0 * HZ * loops_per_jiffy / 1000000 |
42 | * | ||
43 | * Oh, if only we had a cycle counter... | ||
44 | */ | 42 | */ |
45 | 43 | ||
46 | @ Delay routine | 44 | @ Delay routine |
47 | ENTRY(__delay) | 45 | ENTRY(__loop_delay) |
48 | subs r0, r0, #1 | 46 | subs r0, r0, #1 |
49 | #if 0 | 47 | #if 0 |
50 | movls pc, lr | 48 | movls pc, lr |
@@ -62,8 +60,8 @@ ENTRY(__delay) | |||
62 | movls pc, lr | 60 | movls pc, lr |
63 | subs r0, r0, #1 | 61 | subs r0, r0, #1 |
64 | #endif | 62 | #endif |
65 | bhi __delay | 63 | bhi __loop_delay |
66 | mov pc, lr | 64 | mov pc, lr |
67 | ENDPROC(__udelay) | 65 | ENDPROC(__loop_udelay) |
68 | ENDPROC(__const_udelay) | 66 | ENDPROC(__loop_const_udelay) |
69 | ENDPROC(__delay) | 67 | ENDPROC(__loop_delay) |
diff --git a/arch/arm/lib/delay.c b/arch/arm/lib/delay.c new file mode 100644 index 000000000000..d6dacc69254e --- /dev/null +++ b/arch/arm/lib/delay.c | |||
@@ -0,0 +1,71 @@ | |||
1 | /* | ||
2 | * Delay loops based on the OpenRISC implementation. | ||
3 | * | ||
4 | * Copyright (C) 2012 ARM Limited | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
18 | * | ||
19 | * Author: Will Deacon <will.deacon@arm.com> | ||
20 | */ | ||
21 | |||
22 | #include <linux/delay.h> | ||
23 | #include <linux/init.h> | ||
24 | #include <linux/kernel.h> | ||
25 | #include <linux/module.h> | ||
26 | #include <linux/timex.h> | ||
27 | |||
28 | /* | ||
29 | * Default to the loop-based delay implementation. | ||
30 | */ | ||
31 | struct arm_delay_ops arm_delay_ops = { | ||
32 | .delay = __loop_delay, | ||
33 | .const_udelay = __loop_const_udelay, | ||
34 | .udelay = __loop_udelay, | ||
35 | }; | ||
36 | |||
37 | #ifdef ARCH_HAS_READ_CURRENT_TIMER | ||
38 | static void __timer_delay(unsigned long cycles) | ||
39 | { | ||
40 | cycles_t start = get_cycles(); | ||
41 | |||
42 | while ((get_cycles() - start) < cycles) | ||
43 | cpu_relax(); | ||
44 | } | ||
45 | |||
46 | static void __timer_const_udelay(unsigned long xloops) | ||
47 | { | ||
48 | unsigned long long loops = xloops; | ||
49 | loops *= loops_per_jiffy; | ||
50 | __timer_delay(loops >> UDELAY_SHIFT); | ||
51 | } | ||
52 | |||
53 | static void __timer_udelay(unsigned long usecs) | ||
54 | { | ||
55 | __timer_const_udelay(usecs * UDELAY_MULT); | ||
56 | } | ||
57 | |||
58 | void __init init_current_timer_delay(unsigned long freq) | ||
59 | { | ||
60 | pr_info("Switching to timer-based delay loop\n"); | ||
61 | lpj_fine = freq / HZ; | ||
62 | arm_delay_ops.delay = __timer_delay; | ||
63 | arm_delay_ops.const_udelay = __timer_const_udelay; | ||
64 | arm_delay_ops.udelay = __timer_udelay; | ||
65 | } | ||
66 | |||
67 | unsigned long __cpuinit calibrate_delay_is_known(void) | ||
68 | { | ||
69 | return lpj_fine; | ||
70 | } | ||
71 | #endif | ||
diff --git a/arch/arm/lib/strncpy_from_user.S b/arch/arm/lib/strncpy_from_user.S deleted file mode 100644 index f202d7bd1647..000000000000 --- a/arch/arm/lib/strncpy_from_user.S +++ /dev/null | |||
@@ -1,43 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/lib/strncpy_from_user.S | ||
3 | * | ||
4 | * Copyright (C) 1995-2000 Russell King | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | #include <linux/linkage.h> | ||
11 | #include <asm/assembler.h> | ||
12 | #include <asm/errno.h> | ||
13 | |||
14 | .text | ||
15 | .align 5 | ||
16 | |||
17 | /* | ||
18 | * Copy a string from user space to kernel space. | ||
19 | * r0 = dst, r1 = src, r2 = byte length | ||
20 | * returns the number of characters copied (strlen of copied string), | ||
21 | * -EFAULT on exception, or "len" if we fill the whole buffer | ||
22 | */ | ||
23 | ENTRY(__strncpy_from_user) | ||
24 | mov ip, r1 | ||
25 | 1: subs r2, r2, #1 | ||
26 | ldrusr r3, r1, 1, pl | ||
27 | bmi 2f | ||
28 | strb r3, [r0], #1 | ||
29 | teq r3, #0 | ||
30 | bne 1b | ||
31 | sub r1, r1, #1 @ take NUL character out of count | ||
32 | 2: sub r0, r1, ip | ||
33 | mov pc, lr | ||
34 | ENDPROC(__strncpy_from_user) | ||
35 | |||
36 | .pushsection .fixup,"ax" | ||
37 | .align 0 | ||
38 | 9001: mov r3, #0 | ||
39 | strb r3, [r0, #0] @ null terminate | ||
40 | mov r0, #-EFAULT | ||
41 | mov pc, lr | ||
42 | .popsection | ||
43 | |||
diff --git a/arch/arm/lib/strnlen_user.S b/arch/arm/lib/strnlen_user.S deleted file mode 100644 index 0ecbb459c4f1..000000000000 --- a/arch/arm/lib/strnlen_user.S +++ /dev/null | |||
@@ -1,40 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/lib/strnlen_user.S | ||
3 | * | ||
4 | * Copyright (C) 1995-2000 Russell King | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | #include <linux/linkage.h> | ||
11 | #include <asm/assembler.h> | ||
12 | #include <asm/errno.h> | ||
13 | |||
14 | .text | ||
15 | .align 5 | ||
16 | |||
17 | /* Prototype: unsigned long __strnlen_user(const char *str, long n) | ||
18 | * Purpose : get length of a string in user memory | ||
19 | * Params : str - address of string in user memory | ||
20 | * Returns : length of string *including terminator* | ||
21 | * or zero on exception, or n + 1 if too long | ||
22 | */ | ||
23 | ENTRY(__strnlen_user) | ||
24 | mov r2, r0 | ||
25 | 1: | ||
26 | ldrusr r3, r0, 1 | ||
27 | teq r3, #0 | ||
28 | beq 2f | ||
29 | subs r1, r1, #1 | ||
30 | bne 1b | ||
31 | add r0, r0, #1 | ||
32 | 2: sub r0, r0, r2 | ||
33 | mov pc, lr | ||
34 | ENDPROC(__strnlen_user) | ||
35 | |||
36 | .pushsection .fixup,"ax" | ||
37 | .align 0 | ||
38 | 9001: mov r0, #0 | ||
39 | mov pc, lr | ||
40 | .popsection | ||
diff --git a/arch/arm/mach-exynos/pm_domains.c b/arch/arm/mach-exynos/pm_domains.c index e9fafcf163de..373c3c00d24c 100644 --- a/arch/arm/mach-exynos/pm_domains.c +++ b/arch/arm/mach-exynos/pm_domains.c | |||
@@ -119,7 +119,9 @@ static __init void exynos_pm_add_dev_to_genpd(struct platform_device *pdev, | |||
119 | struct exynos_pm_domain *pd) | 119 | struct exynos_pm_domain *pd) |
120 | { | 120 | { |
121 | if (pdev->dev.bus) { | 121 | if (pdev->dev.bus) { |
122 | if (pm_genpd_add_device(&pd->pd, &pdev->dev)) | 122 | if (!pm_genpd_add_device(&pd->pd, &pdev->dev)) |
123 | pm_genpd_dev_need_restore(&pdev->dev, true); | ||
124 | else | ||
123 | pr_info("%s: error in adding %s device to %s power" | 125 | pr_info("%s: error in adding %s device to %s power" |
124 | "domain\n", __func__, dev_name(&pdev->dev), | 126 | "domain\n", __func__, dev_name(&pdev->dev), |
125 | pd->name); | 127 | pd->name); |
@@ -151,9 +153,12 @@ static __init int exynos4_pm_init_power_domain(void) | |||
151 | if (of_have_populated_dt()) | 153 | if (of_have_populated_dt()) |
152 | return exynos_pm_dt_parse_domains(); | 154 | return exynos_pm_dt_parse_domains(); |
153 | 155 | ||
154 | for (idx = 0; idx < ARRAY_SIZE(exynos4_pm_domains); idx++) | 156 | for (idx = 0; idx < ARRAY_SIZE(exynos4_pm_domains); idx++) { |
155 | pm_genpd_init(&exynos4_pm_domains[idx]->pd, NULL, | 157 | struct exynos_pm_domain *pd = exynos4_pm_domains[idx]; |
156 | exynos4_pm_domains[idx]->is_off); | 158 | int on = __raw_readl(pd->base + 0x4) & S5P_INT_LOCAL_PWR_EN; |
159 | |||
160 | pm_genpd_init(&pd->pd, NULL, !on); | ||
161 | } | ||
157 | 162 | ||
158 | #ifdef CONFIG_S5P_DEV_FIMD0 | 163 | #ifdef CONFIG_S5P_DEV_FIMD0 |
159 | exynos_pm_add_dev_to_genpd(&s5p_device_fimd0, &exynos4_pd_lcd0); | 164 | exynos_pm_add_dev_to_genpd(&s5p_device_fimd0, &exynos4_pd_lcd0); |
diff --git a/arch/arm/mach-msm/platsmp.c b/arch/arm/mach-msm/platsmp.c index db0117ec55f4..e012dc8391cf 100644 --- a/arch/arm/mach-msm/platsmp.c +++ b/arch/arm/mach-msm/platsmp.c | |||
@@ -127,7 +127,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) | |||
127 | * the boot monitor to read the system wide flags register, | 127 | * the boot monitor to read the system wide flags register, |
128 | * and branch to the address found there. | 128 | * and branch to the address found there. |
129 | */ | 129 | */ |
130 | gic_raise_softirq(cpumask_of(cpu), 1); | 130 | gic_raise_softirq(cpumask_of(cpu), 0); |
131 | 131 | ||
132 | timeout = jiffies + (1 * HZ); | 132 | timeout = jiffies + (1 * HZ); |
133 | while (time_before(jiffies, timeout)) { | 133 | while (time_before(jiffies, timeout)) { |
diff --git a/arch/arm/mach-omap2/clockdomain.h b/arch/arm/mach-omap2/clockdomain.h index f7b58609bad8..6227e9505c2d 100644 --- a/arch/arm/mach-omap2/clockdomain.h +++ b/arch/arm/mach-omap2/clockdomain.h | |||
@@ -31,12 +31,16 @@ | |||
31 | * | 31 | * |
32 | * CLKDM_NO_AUTODEPS: Prevent "autodeps" from being added/removed from this | 32 | * CLKDM_NO_AUTODEPS: Prevent "autodeps" from being added/removed from this |
33 | * clockdomain. (Currently, this applies to OMAP3 clockdomains only.) | 33 | * clockdomain. (Currently, this applies to OMAP3 clockdomains only.) |
34 | * CLKDM_ACTIVE_WITH_MPU: The PRCM guarantees that this clockdomain is | ||
35 | * active whenever the MPU is active. True for interconnects and | ||
36 | * the WKUP clockdomains. | ||
34 | */ | 37 | */ |
35 | #define CLKDM_CAN_FORCE_SLEEP (1 << 0) | 38 | #define CLKDM_CAN_FORCE_SLEEP (1 << 0) |
36 | #define CLKDM_CAN_FORCE_WAKEUP (1 << 1) | 39 | #define CLKDM_CAN_FORCE_WAKEUP (1 << 1) |
37 | #define CLKDM_CAN_ENABLE_AUTO (1 << 2) | 40 | #define CLKDM_CAN_ENABLE_AUTO (1 << 2) |
38 | #define CLKDM_CAN_DISABLE_AUTO (1 << 3) | 41 | #define CLKDM_CAN_DISABLE_AUTO (1 << 3) |
39 | #define CLKDM_NO_AUTODEPS (1 << 4) | 42 | #define CLKDM_NO_AUTODEPS (1 << 4) |
43 | #define CLKDM_ACTIVE_WITH_MPU (1 << 5) | ||
40 | 44 | ||
41 | #define CLKDM_CAN_HWSUP (CLKDM_CAN_ENABLE_AUTO | CLKDM_CAN_DISABLE_AUTO) | 45 | #define CLKDM_CAN_HWSUP (CLKDM_CAN_ENABLE_AUTO | CLKDM_CAN_DISABLE_AUTO) |
42 | #define CLKDM_CAN_SWSUP (CLKDM_CAN_FORCE_SLEEP | CLKDM_CAN_FORCE_WAKEUP) | 46 | #define CLKDM_CAN_SWSUP (CLKDM_CAN_FORCE_SLEEP | CLKDM_CAN_FORCE_WAKEUP) |
diff --git a/arch/arm/mach-omap2/clockdomains2xxx_3xxx_data.c b/arch/arm/mach-omap2/clockdomains2xxx_3xxx_data.c index 839145e1cfbe..4972219653ce 100644 --- a/arch/arm/mach-omap2/clockdomains2xxx_3xxx_data.c +++ b/arch/arm/mach-omap2/clockdomains2xxx_3xxx_data.c | |||
@@ -88,4 +88,5 @@ struct clockdomain wkup_common_clkdm = { | |||
88 | .name = "wkup_clkdm", | 88 | .name = "wkup_clkdm", |
89 | .pwrdm = { .name = "wkup_pwrdm" }, | 89 | .pwrdm = { .name = "wkup_pwrdm" }, |
90 | .dep_bit = OMAP_EN_WKUP_SHIFT, | 90 | .dep_bit = OMAP_EN_WKUP_SHIFT, |
91 | .flags = CLKDM_ACTIVE_WITH_MPU, | ||
91 | }; | 92 | }; |
diff --git a/arch/arm/mach-omap2/clockdomains44xx_data.c b/arch/arm/mach-omap2/clockdomains44xx_data.c index c53425847493..7f2133abe7d3 100644 --- a/arch/arm/mach-omap2/clockdomains44xx_data.c +++ b/arch/arm/mach-omap2/clockdomains44xx_data.c | |||
@@ -381,7 +381,7 @@ static struct clockdomain l4_wkup_44xx_clkdm = { | |||
381 | .cm_inst = OMAP4430_PRM_WKUP_CM_INST, | 381 | .cm_inst = OMAP4430_PRM_WKUP_CM_INST, |
382 | .clkdm_offs = OMAP4430_PRM_WKUP_CM_WKUP_CDOFFS, | 382 | .clkdm_offs = OMAP4430_PRM_WKUP_CM_WKUP_CDOFFS, |
383 | .dep_bit = OMAP4430_L4WKUP_STATDEP_SHIFT, | 383 | .dep_bit = OMAP4430_L4WKUP_STATDEP_SHIFT, |
384 | .flags = CLKDM_CAN_HWSUP, | 384 | .flags = CLKDM_CAN_HWSUP | CLKDM_ACTIVE_WITH_MPU, |
385 | }; | 385 | }; |
386 | 386 | ||
387 | static struct clockdomain emu_sys_44xx_clkdm = { | 387 | static struct clockdomain emu_sys_44xx_clkdm = { |
diff --git a/arch/arm/mach-omap2/omap-smp.c b/arch/arm/mach-omap2/omap-smp.c index deffbf1c9627..596eb70d37be 100644 --- a/arch/arm/mach-omap2/omap-smp.c +++ b/arch/arm/mach-omap2/omap-smp.c | |||
@@ -111,7 +111,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) | |||
111 | booted = true; | 111 | booted = true; |
112 | } | 112 | } |
113 | 113 | ||
114 | gic_raise_softirq(cpumask_of(cpu), 1); | 114 | gic_raise_softirq(cpumask_of(cpu), 0); |
115 | 115 | ||
116 | /* | 116 | /* |
117 | * Now the secondary core is starting up let it run its | 117 | * Now the secondary core is starting up let it run its |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index 773193670ea2..2d710f50fca2 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
@@ -1124,15 +1124,18 @@ static struct omap_hwmod_addr_space * __init _find_mpu_rt_addr_space(struct omap | |||
1124 | * _enable_sysc - try to bring a module out of idle via OCP_SYSCONFIG | 1124 | * _enable_sysc - try to bring a module out of idle via OCP_SYSCONFIG |
1125 | * @oh: struct omap_hwmod * | 1125 | * @oh: struct omap_hwmod * |
1126 | * | 1126 | * |
1127 | * If module is marked as SWSUP_SIDLE, force the module out of slave | 1127 | * Ensure that the OCP_SYSCONFIG register for the IP block represented |
1128 | * idle; otherwise, configure it for smart-idle. If module is marked | 1128 | * by @oh is set to indicate to the PRCM that the IP block is active. |
1129 | * as SWSUP_MSUSPEND, force the module out of master standby; | 1129 | * Usually this means placing the module into smart-idle mode and |
1130 | * otherwise, configure it for smart-standby. No return value. | 1130 | * smart-standby, but if there is a bug in the automatic idle handling |
1131 | * for the IP block, it may need to be placed into the force-idle or | ||
1132 | * no-idle variants of these modes. No return value. | ||
1131 | */ | 1133 | */ |
1132 | static void _enable_sysc(struct omap_hwmod *oh) | 1134 | static void _enable_sysc(struct omap_hwmod *oh) |
1133 | { | 1135 | { |
1134 | u8 idlemode, sf; | 1136 | u8 idlemode, sf; |
1135 | u32 v; | 1137 | u32 v; |
1138 | bool clkdm_act; | ||
1136 | 1139 | ||
1137 | if (!oh->class->sysc) | 1140 | if (!oh->class->sysc) |
1138 | return; | 1141 | return; |
@@ -1141,8 +1144,16 @@ static void _enable_sysc(struct omap_hwmod *oh) | |||
1141 | sf = oh->class->sysc->sysc_flags; | 1144 | sf = oh->class->sysc->sysc_flags; |
1142 | 1145 | ||
1143 | if (sf & SYSC_HAS_SIDLEMODE) { | 1146 | if (sf & SYSC_HAS_SIDLEMODE) { |
1144 | idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ? | 1147 | clkdm_act = ((oh->clkdm && |
1145 | HWMOD_IDLEMODE_NO : HWMOD_IDLEMODE_SMART; | 1148 | oh->clkdm->flags & CLKDM_ACTIVE_WITH_MPU) || |
1149 | (oh->_clk && oh->_clk->clkdm && | ||
1150 | oh->_clk->clkdm->flags & CLKDM_ACTIVE_WITH_MPU)); | ||
1151 | if (clkdm_act && !(oh->class->sysc->idlemodes & | ||
1152 | (SIDLE_SMART | SIDLE_SMART_WKUP))) | ||
1153 | idlemode = HWMOD_IDLEMODE_FORCE; | ||
1154 | else | ||
1155 | idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ? | ||
1156 | HWMOD_IDLEMODE_NO : HWMOD_IDLEMODE_SMART; | ||
1146 | _set_slave_idlemode(oh, idlemode, &v); | 1157 | _set_slave_idlemode(oh, idlemode, &v); |
1147 | } | 1158 | } |
1148 | 1159 | ||
@@ -1208,8 +1219,13 @@ static void _idle_sysc(struct omap_hwmod *oh) | |||
1208 | sf = oh->class->sysc->sysc_flags; | 1219 | sf = oh->class->sysc->sysc_flags; |
1209 | 1220 | ||
1210 | if (sf & SYSC_HAS_SIDLEMODE) { | 1221 | if (sf & SYSC_HAS_SIDLEMODE) { |
1211 | idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ? | 1222 | /* XXX What about HWMOD_IDLEMODE_SMART_WKUP? */ |
1212 | HWMOD_IDLEMODE_FORCE : HWMOD_IDLEMODE_SMART; | 1223 | if (oh->flags & HWMOD_SWSUP_SIDLE || |
1224 | !(oh->class->sysc->idlemodes & | ||
1225 | (SIDLE_SMART | SIDLE_SMART_WKUP))) | ||
1226 | idlemode = HWMOD_IDLEMODE_FORCE; | ||
1227 | else | ||
1228 | idlemode = HWMOD_IDLEMODE_SMART; | ||
1213 | _set_slave_idlemode(oh, idlemode, &v); | 1229 | _set_slave_idlemode(oh, idlemode, &v); |
1214 | } | 1230 | } |
1215 | 1231 | ||
diff --git a/arch/arm/mach-pxa/include/mach/regs-ost.h b/arch/arm/mach-pxa/include/mach/regs-ost.h index a3e5f86ef67e..628819995c52 100644 --- a/arch/arm/mach-pxa/include/mach/regs-ost.h +++ b/arch/arm/mach-pxa/include/mach/regs-ost.h | |||
@@ -7,17 +7,17 @@ | |||
7 | * OS Timer & Match Registers | 7 | * OS Timer & Match Registers |
8 | */ | 8 | */ |
9 | 9 | ||
10 | #define OSMR0 __REG(0x40A00000) /* */ | 10 | #define OSMR0 io_p2v(0x40A00000) /* */ |
11 | #define OSMR1 __REG(0x40A00004) /* */ | 11 | #define OSMR1 io_p2v(0x40A00004) /* */ |
12 | #define OSMR2 __REG(0x40A00008) /* */ | 12 | #define OSMR2 io_p2v(0x40A00008) /* */ |
13 | #define OSMR3 __REG(0x40A0000C) /* */ | 13 | #define OSMR3 io_p2v(0x40A0000C) /* */ |
14 | #define OSMR4 __REG(0x40A00080) /* */ | 14 | #define OSMR4 io_p2v(0x40A00080) /* */ |
15 | #define OSCR __REG(0x40A00010) /* OS Timer Counter Register */ | 15 | #define OSCR io_p2v(0x40A00010) /* OS Timer Counter Register */ |
16 | #define OSCR4 __REG(0x40A00040) /* OS Timer Counter Register */ | 16 | #define OSCR4 io_p2v(0x40A00040) /* OS Timer Counter Register */ |
17 | #define OMCR4 __REG(0x40A000C0) /* */ | 17 | #define OMCR4 io_p2v(0x40A000C0) /* */ |
18 | #define OSSR __REG(0x40A00014) /* OS Timer Status Register */ | 18 | #define OSSR io_p2v(0x40A00014) /* OS Timer Status Register */ |
19 | #define OWER __REG(0x40A00018) /* OS Timer Watchdog Enable Register */ | 19 | #define OWER io_p2v(0x40A00018) /* OS Timer Watchdog Enable Register */ |
20 | #define OIER __REG(0x40A0001C) /* OS Timer Interrupt Enable Register */ | 20 | #define OIER io_p2v(0x40A0001C) /* OS Timer Interrupt Enable Register */ |
21 | 21 | ||
22 | #define OSSR_M3 (1 << 3) /* Match status channel 3 */ | 22 | #define OSSR_M3 (1 << 3) /* Match status channel 3 */ |
23 | #define OSSR_M2 (1 << 2) /* Match status channel 2 */ | 23 | #define OSSR_M2 (1 << 2) /* Match status channel 2 */ |
diff --git a/arch/arm/mach-pxa/reset.c b/arch/arm/mach-pxa/reset.c index b4528899ef08..3fab583755d4 100644 --- a/arch/arm/mach-pxa/reset.c +++ b/arch/arm/mach-pxa/reset.c | |||
@@ -77,9 +77,10 @@ static void do_gpio_reset(void) | |||
77 | static void do_hw_reset(void) | 77 | static void do_hw_reset(void) |
78 | { | 78 | { |
79 | /* Initialize the watchdog and let it fire */ | 79 | /* Initialize the watchdog and let it fire */ |
80 | OWER = OWER_WME; | 80 | writel_relaxed(OWER_WME, OWER); |
81 | OSSR = OSSR_M3; | 81 | writel_relaxed(OSSR_M3, OSSR); |
82 | OSMR3 = OSCR + 368640; /* ... in 100 ms */ | 82 | /* ... in 100 ms */ |
83 | writel_relaxed(readl_relaxed(OSCR) + 368640, OSMR3); | ||
83 | } | 84 | } |
84 | 85 | ||
85 | void pxa_restart(char mode, const char *cmd) | 86 | void pxa_restart(char mode, const char *cmd) |
diff --git a/arch/arm/mach-pxa/time.c b/arch/arm/mach-pxa/time.c index 3d6c9bd90de6..4bc47d63698b 100644 --- a/arch/arm/mach-pxa/time.c +++ b/arch/arm/mach-pxa/time.c | |||
@@ -35,7 +35,7 @@ | |||
35 | 35 | ||
36 | static u32 notrace pxa_read_sched_clock(void) | 36 | static u32 notrace pxa_read_sched_clock(void) |
37 | { | 37 | { |
38 | return OSCR; | 38 | return readl_relaxed(OSCR); |
39 | } | 39 | } |
40 | 40 | ||
41 | 41 | ||
@@ -47,8 +47,8 @@ pxa_ost0_interrupt(int irq, void *dev_id) | |||
47 | struct clock_event_device *c = dev_id; | 47 | struct clock_event_device *c = dev_id; |
48 | 48 | ||
49 | /* Disarm the compare/match, signal the event. */ | 49 | /* Disarm the compare/match, signal the event. */ |
50 | OIER &= ~OIER_E0; | 50 | writel_relaxed(readl_relaxed(OIER) & ~OIER_E0, OIER); |
51 | OSSR = OSSR_M0; | 51 | writel_relaxed(OSSR_M0, OSSR); |
52 | c->event_handler(c); | 52 | c->event_handler(c); |
53 | 53 | ||
54 | return IRQ_HANDLED; | 54 | return IRQ_HANDLED; |
@@ -59,10 +59,10 @@ pxa_osmr0_set_next_event(unsigned long delta, struct clock_event_device *dev) | |||
59 | { | 59 | { |
60 | unsigned long next, oscr; | 60 | unsigned long next, oscr; |
61 | 61 | ||
62 | OIER |= OIER_E0; | 62 | writel_relaxed(readl_relaxed(OIER) | OIER_E0, OIER); |
63 | next = OSCR + delta; | 63 | next = readl_relaxed(OSCR) + delta; |
64 | OSMR0 = next; | 64 | writel_relaxed(next, OSMR0); |
65 | oscr = OSCR; | 65 | oscr = readl_relaxed(OSCR); |
66 | 66 | ||
67 | return (signed)(next - oscr) <= MIN_OSCR_DELTA ? -ETIME : 0; | 67 | return (signed)(next - oscr) <= MIN_OSCR_DELTA ? -ETIME : 0; |
68 | } | 68 | } |
@@ -72,15 +72,15 @@ pxa_osmr0_set_mode(enum clock_event_mode mode, struct clock_event_device *dev) | |||
72 | { | 72 | { |
73 | switch (mode) { | 73 | switch (mode) { |
74 | case CLOCK_EVT_MODE_ONESHOT: | 74 | case CLOCK_EVT_MODE_ONESHOT: |
75 | OIER &= ~OIER_E0; | 75 | writel_relaxed(readl_relaxed(OIER) & ~OIER_E0, OIER); |
76 | OSSR = OSSR_M0; | 76 | writel_relaxed(OSSR_M0, OSSR); |
77 | break; | 77 | break; |
78 | 78 | ||
79 | case CLOCK_EVT_MODE_UNUSED: | 79 | case CLOCK_EVT_MODE_UNUSED: |
80 | case CLOCK_EVT_MODE_SHUTDOWN: | 80 | case CLOCK_EVT_MODE_SHUTDOWN: |
81 | /* initializing, released, or preparing for suspend */ | 81 | /* initializing, released, or preparing for suspend */ |
82 | OIER &= ~OIER_E0; | 82 | writel_relaxed(readl_relaxed(OIER) & ~OIER_E0, OIER); |
83 | OSSR = OSSR_M0; | 83 | writel_relaxed(OSSR_M0, OSSR); |
84 | break; | 84 | break; |
85 | 85 | ||
86 | case CLOCK_EVT_MODE_RESUME: | 86 | case CLOCK_EVT_MODE_RESUME: |
@@ -108,8 +108,8 @@ static void __init pxa_timer_init(void) | |||
108 | { | 108 | { |
109 | unsigned long clock_tick_rate = get_clock_tick_rate(); | 109 | unsigned long clock_tick_rate = get_clock_tick_rate(); |
110 | 110 | ||
111 | OIER = 0; | 111 | writel_relaxed(0, OIER); |
112 | OSSR = OSSR_M0 | OSSR_M1 | OSSR_M2 | OSSR_M3; | 112 | writel_relaxed(OSSR_M0 | OSSR_M1 | OSSR_M2 | OSSR_M3, OSSR); |
113 | 113 | ||
114 | setup_sched_clock(pxa_read_sched_clock, 32, clock_tick_rate); | 114 | setup_sched_clock(pxa_read_sched_clock, 32, clock_tick_rate); |
115 | 115 | ||
@@ -122,7 +122,7 @@ static void __init pxa_timer_init(void) | |||
122 | 122 | ||
123 | setup_irq(IRQ_OST0, &pxa_ost0_irq); | 123 | setup_irq(IRQ_OST0, &pxa_ost0_irq); |
124 | 124 | ||
125 | clocksource_mmio_init(&OSCR, "oscr0", clock_tick_rate, 200, 32, | 125 | clocksource_mmio_init(OSCR, "oscr0", clock_tick_rate, 200, 32, |
126 | clocksource_mmio_readl_up); | 126 | clocksource_mmio_readl_up); |
127 | clockevents_register_device(&ckevt_pxa_osmr0); | 127 | clockevents_register_device(&ckevt_pxa_osmr0); |
128 | } | 128 | } |
@@ -132,12 +132,12 @@ static unsigned long osmr[4], oier, oscr; | |||
132 | 132 | ||
133 | static void pxa_timer_suspend(void) | 133 | static void pxa_timer_suspend(void) |
134 | { | 134 | { |
135 | osmr[0] = OSMR0; | 135 | osmr[0] = readl_relaxed(OSMR0); |
136 | osmr[1] = OSMR1; | 136 | osmr[1] = readl_relaxed(OSMR1); |
137 | osmr[2] = OSMR2; | 137 | osmr[2] = readl_relaxed(OSMR2); |
138 | osmr[3] = OSMR3; | 138 | osmr[3] = readl_relaxed(OSMR3); |
139 | oier = OIER; | 139 | oier = readl_relaxed(OIER); |
140 | oscr = OSCR; | 140 | oscr = readl_relaxed(OSCR); |
141 | } | 141 | } |
142 | 142 | ||
143 | static void pxa_timer_resume(void) | 143 | static void pxa_timer_resume(void) |
@@ -151,12 +151,12 @@ static void pxa_timer_resume(void) | |||
151 | if (osmr[0] - oscr < MIN_OSCR_DELTA) | 151 | if (osmr[0] - oscr < MIN_OSCR_DELTA) |
152 | osmr[0] += MIN_OSCR_DELTA; | 152 | osmr[0] += MIN_OSCR_DELTA; |
153 | 153 | ||
154 | OSMR0 = osmr[0]; | 154 | writel_relaxed(osmr[0], OSMR0); |
155 | OSMR1 = osmr[1]; | 155 | writel_relaxed(osmr[1], OSMR1); |
156 | OSMR2 = osmr[2]; | 156 | writel_relaxed(osmr[2], OSMR2); |
157 | OSMR3 = osmr[3]; | 157 | writel_relaxed(osmr[3], OSMR3); |
158 | OIER = oier; | 158 | writel_relaxed(oier, OIER); |
159 | OSCR = oscr; | 159 | writel_relaxed(oscr, OSCR); |
160 | } | 160 | } |
161 | #else | 161 | #else |
162 | #define pxa_timer_suspend NULL | 162 | #define pxa_timer_suspend NULL |
diff --git a/arch/arm/mach-s3c24xx/clock-s3c2440.c b/arch/arm/mach-s3c24xx/clock-s3c2440.c index 414364eb426c..cb2883d553b5 100644 --- a/arch/arm/mach-s3c24xx/clock-s3c2440.c +++ b/arch/arm/mach-s3c24xx/clock-s3c2440.c | |||
@@ -106,7 +106,7 @@ static struct clk s3c2440_clk_cam_upll = { | |||
106 | static struct clk s3c2440_clk_ac97 = { | 106 | static struct clk s3c2440_clk_ac97 = { |
107 | .name = "ac97", | 107 | .name = "ac97", |
108 | .enable = s3c2410_clkcon_enable, | 108 | .enable = s3c2410_clkcon_enable, |
109 | .ctrlbit = S3C2440_CLKCON_CAMERA, | 109 | .ctrlbit = S3C2440_CLKCON_AC97, |
110 | }; | 110 | }; |
111 | 111 | ||
112 | static unsigned long s3c2440_fclk_n_getrate(struct clk *clk) | 112 | static unsigned long s3c2440_fclk_n_getrate(struct clk *clk) |
diff --git a/arch/arm/mach-sa1100/assabet.c b/arch/arm/mach-sa1100/assabet.c index d1dc7f1a239c..d673211f121c 100644 --- a/arch/arm/mach-sa1100/assabet.c +++ b/arch/arm/mach-sa1100/assabet.c | |||
@@ -362,7 +362,7 @@ static void __init assabet_init(void) | |||
362 | static void __init map_sa1100_gpio_regs( void ) | 362 | static void __init map_sa1100_gpio_regs( void ) |
363 | { | 363 | { |
364 | unsigned long phys = __PREG(GPLR) & PMD_MASK; | 364 | unsigned long phys = __PREG(GPLR) & PMD_MASK; |
365 | unsigned long virt = io_p2v(phys); | 365 | unsigned long virt = (unsigned long)io_p2v(phys); |
366 | int prot = PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_DOMAIN(DOMAIN_IO); | 366 | int prot = PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_DOMAIN(DOMAIN_IO); |
367 | pmd_t *pmd; | 367 | pmd_t *pmd; |
368 | 368 | ||
diff --git a/arch/arm/mach-sa1100/cpu-sa1100.c b/arch/arm/mach-sa1100/cpu-sa1100.c index 19b2053f5af4..e8f4d1e19233 100644 --- a/arch/arm/mach-sa1100/cpu-sa1100.c +++ b/arch/arm/mach-sa1100/cpu-sa1100.c | |||
@@ -87,6 +87,7 @@ | |||
87 | #include <linux/types.h> | 87 | #include <linux/types.h> |
88 | #include <linux/init.h> | 88 | #include <linux/init.h> |
89 | #include <linux/cpufreq.h> | 89 | #include <linux/cpufreq.h> |
90 | #include <linux/io.h> | ||
90 | 91 | ||
91 | #include <asm/cputype.h> | 92 | #include <asm/cputype.h> |
92 | 93 | ||
diff --git a/arch/arm/mach-sa1100/cpu-sa1110.c b/arch/arm/mach-sa1100/cpu-sa1110.c index 675bf8ef97e8..48c45b0c92bb 100644 --- a/arch/arm/mach-sa1100/cpu-sa1110.c +++ b/arch/arm/mach-sa1100/cpu-sa1110.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/cpufreq.h> | 19 | #include <linux/cpufreq.h> |
20 | #include <linux/delay.h> | 20 | #include <linux/delay.h> |
21 | #include <linux/init.h> | 21 | #include <linux/init.h> |
22 | #include <linux/io.h> | ||
22 | #include <linux/kernel.h> | 23 | #include <linux/kernel.h> |
23 | #include <linux/moduleparam.h> | 24 | #include <linux/moduleparam.h> |
24 | #include <linux/types.h> | 25 | #include <linux/types.h> |
diff --git a/arch/arm/mach-sa1100/include/mach/SA-1100.h b/arch/arm/mach-sa1100/include/mach/SA-1100.h index 3f2d1b60188c..0ac6cc08a19c 100644 --- a/arch/arm/mach-sa1100/include/mach/SA-1100.h +++ b/arch/arm/mach-sa1100/include/mach/SA-1100.h | |||
@@ -830,14 +830,14 @@ | |||
830 | * (read/write). | 830 | * (read/write). |
831 | */ | 831 | */ |
832 | 832 | ||
833 | #define OSMR0 __REG(0x90000000) /* OS timer Match Reg. 0 */ | 833 | #define OSMR0 io_p2v(0x90000000) /* OS timer Match Reg. 0 */ |
834 | #define OSMR1 __REG(0x90000004) /* OS timer Match Reg. 1 */ | 834 | #define OSMR1 io_p2v(0x90000004) /* OS timer Match Reg. 1 */ |
835 | #define OSMR2 __REG(0x90000008) /* OS timer Match Reg. 2 */ | 835 | #define OSMR2 io_p2v(0x90000008) /* OS timer Match Reg. 2 */ |
836 | #define OSMR3 __REG(0x9000000c) /* OS timer Match Reg. 3 */ | 836 | #define OSMR3 io_p2v(0x9000000c) /* OS timer Match Reg. 3 */ |
837 | #define OSCR __REG(0x90000010) /* OS timer Counter Reg. */ | 837 | #define OSCR io_p2v(0x90000010) /* OS timer Counter Reg. */ |
838 | #define OSSR __REG(0x90000014 ) /* OS timer Status Reg. */ | 838 | #define OSSR io_p2v(0x90000014) /* OS timer Status Reg. */ |
839 | #define OWER __REG(0x90000018 ) /* OS timer Watch-dog Enable Reg. */ | 839 | #define OWER io_p2v(0x90000018) /* OS timer Watch-dog Enable Reg. */ |
840 | #define OIER __REG(0x9000001C ) /* OS timer Interrupt Enable Reg. */ | 840 | #define OIER io_p2v(0x9000001C) /* OS timer Interrupt Enable Reg. */ |
841 | 841 | ||
842 | #define OSSR_M(Nb) /* Match detected [0..3] */ \ | 842 | #define OSSR_M(Nb) /* Match detected [0..3] */ \ |
843 | (0x00000001 << (Nb)) | 843 | (0x00000001 << (Nb)) |
diff --git a/arch/arm/mach-sa1100/include/mach/gpio.h b/arch/arm/mach-sa1100/include/mach/gpio.h index a38fc4f54241..6a9eecf3137e 100644 --- a/arch/arm/mach-sa1100/include/mach/gpio.h +++ b/arch/arm/mach-sa1100/include/mach/gpio.h | |||
@@ -24,6 +24,7 @@ | |||
24 | #ifndef __ASM_ARCH_SA1100_GPIO_H | 24 | #ifndef __ASM_ARCH_SA1100_GPIO_H |
25 | #define __ASM_ARCH_SA1100_GPIO_H | 25 | #define __ASM_ARCH_SA1100_GPIO_H |
26 | 26 | ||
27 | #include <linux/io.h> | ||
27 | #include <mach/hardware.h> | 28 | #include <mach/hardware.h> |
28 | #include <asm/irq.h> | 29 | #include <asm/irq.h> |
29 | #include <asm-generic/gpio.h> | 30 | #include <asm-generic/gpio.h> |
diff --git a/arch/arm/mach-sa1100/include/mach/hardware.h b/arch/arm/mach-sa1100/include/mach/hardware.h index 99f5856d8de4..cbedd75a9d65 100644 --- a/arch/arm/mach-sa1100/include/mach/hardware.h +++ b/arch/arm/mach-sa1100/include/mach/hardware.h | |||
@@ -32,7 +32,7 @@ | |||
32 | #define PIO_START 0x80000000 /* physical start of IO space */ | 32 | #define PIO_START 0x80000000 /* physical start of IO space */ |
33 | 33 | ||
34 | #define io_p2v( x ) \ | 34 | #define io_p2v( x ) \ |
35 | ( (((x)&0x00ffffff) | (((x)&0x30000000)>>VIO_SHIFT)) + VIO_BASE ) | 35 | IOMEM( (((x)&0x00ffffff) | (((x)&0x30000000)>>VIO_SHIFT)) + VIO_BASE ) |
36 | #define io_v2p( x ) \ | 36 | #define io_v2p( x ) \ |
37 | ( (((x)&0x00ffffff) | (((x)&(0x30000000>>VIO_SHIFT))<<VIO_SHIFT)) + PIO_START ) | 37 | ( (((x)&0x00ffffff) | (((x)&(0x30000000>>VIO_SHIFT))<<VIO_SHIFT)) + PIO_START ) |
38 | 38 | ||
@@ -47,6 +47,8 @@ | |||
47 | #define CPU_SA1110_ID (0x6901b110) | 47 | #define CPU_SA1110_ID (0x6901b110) |
48 | #define CPU_SA1110_MASK (0xfffffff0) | 48 | #define CPU_SA1110_MASK (0xfffffff0) |
49 | 49 | ||
50 | #define __MREG(x) IOMEM(io_p2v(x)) | ||
51 | |||
50 | #ifndef __ASSEMBLY__ | 52 | #ifndef __ASSEMBLY__ |
51 | 53 | ||
52 | #include <asm/cputype.h> | 54 | #include <asm/cputype.h> |
@@ -56,7 +58,7 @@ | |||
56 | #define cpu_is_sa1100() ((read_cpuid_id() & CPU_SA1100_MASK) == CPU_SA1100_ID) | 58 | #define cpu_is_sa1100() ((read_cpuid_id() & CPU_SA1100_MASK) == CPU_SA1100_ID) |
57 | #define cpu_is_sa1110() ((read_cpuid_id() & CPU_SA1110_MASK) == CPU_SA1110_ID) | 59 | #define cpu_is_sa1110() ((read_cpuid_id() & CPU_SA1110_MASK) == CPU_SA1110_ID) |
58 | 60 | ||
59 | # define __REG(x) (*((volatile unsigned long *)io_p2v(x))) | 61 | # define __REG(x) (*((volatile unsigned long __iomem *)io_p2v(x))) |
60 | # define __PREG(x) (io_v2p((unsigned long)&(x))) | 62 | # define __PREG(x) (io_v2p((unsigned long)&(x))) |
61 | 63 | ||
62 | static inline unsigned long get_clock_tick_rate(void) | 64 | static inline unsigned long get_clock_tick_rate(void) |
diff --git a/arch/arm/mach-sa1100/include/mach/uncompress.h b/arch/arm/mach-sa1100/include/mach/uncompress.h index 6cb39ddde656..5cf71da60e42 100644 --- a/arch/arm/mach-sa1100/include/mach/uncompress.h +++ b/arch/arm/mach-sa1100/include/mach/uncompress.h | |||
@@ -8,6 +8,8 @@ | |||
8 | 8 | ||
9 | #include "hardware.h" | 9 | #include "hardware.h" |
10 | 10 | ||
11 | #define IOMEM(x) (x) | ||
12 | |||
11 | /* | 13 | /* |
12 | * The following code assumes the serial port has already been | 14 | * The following code assumes the serial port has already been |
13 | * initialized by the bootloader. We search for the first enabled | 15 | * initialized by the bootloader. We search for the first enabled |
diff --git a/arch/arm/mach-sa1100/irq.c b/arch/arm/mach-sa1100/irq.c index 516ccc25d7fd..2124f1fc2fbe 100644 --- a/arch/arm/mach-sa1100/irq.c +++ b/arch/arm/mach-sa1100/irq.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/module.h> | 13 | #include <linux/module.h> |
14 | #include <linux/interrupt.h> | 14 | #include <linux/interrupt.h> |
15 | #include <linux/io.h> | ||
15 | #include <linux/irq.h> | 16 | #include <linux/irq.h> |
16 | #include <linux/ioport.h> | 17 | #include <linux/ioport.h> |
17 | #include <linux/syscore_ops.h> | 18 | #include <linux/syscore_ops.h> |
diff --git a/arch/arm/mach-sa1100/jornada720_ssp.c b/arch/arm/mach-sa1100/jornada720_ssp.c index b412fc09c80c..7f07f08d8968 100644 --- a/arch/arm/mach-sa1100/jornada720_ssp.c +++ b/arch/arm/mach-sa1100/jornada720_ssp.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/module.h> | 18 | #include <linux/module.h> |
19 | #include <linux/platform_device.h> | 19 | #include <linux/platform_device.h> |
20 | #include <linux/sched.h> | 20 | #include <linux/sched.h> |
21 | #include <linux/io.h> | ||
21 | 22 | ||
22 | #include <mach/hardware.h> | 23 | #include <mach/hardware.h> |
23 | #include <mach/jornada720.h> | 24 | #include <mach/jornada720.h> |
diff --git a/arch/arm/mach-sa1100/leds-cerf.c b/arch/arm/mach-sa1100/leds-cerf.c index 040540fb7d8a..30fc3b2bf555 100644 --- a/arch/arm/mach-sa1100/leds-cerf.c +++ b/arch/arm/mach-sa1100/leds-cerf.c | |||
@@ -4,6 +4,7 @@ | |||
4 | * Author: ??? | 4 | * Author: ??? |
5 | */ | 5 | */ |
6 | #include <linux/init.h> | 6 | #include <linux/init.h> |
7 | #include <linux/io.h> | ||
7 | 8 | ||
8 | #include <mach/hardware.h> | 9 | #include <mach/hardware.h> |
9 | #include <asm/leds.h> | 10 | #include <asm/leds.h> |
diff --git a/arch/arm/mach-sa1100/leds-lart.c b/arch/arm/mach-sa1100/leds-lart.c index a51830c60e53..50a5b143b460 100644 --- a/arch/arm/mach-sa1100/leds-lart.c +++ b/arch/arm/mach-sa1100/leds-lart.c | |||
@@ -10,6 +10,7 @@ | |||
10 | * pace of the LED. | 10 | * pace of the LED. |
11 | */ | 11 | */ |
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/io.h> | ||
13 | 14 | ||
14 | #include <mach/hardware.h> | 15 | #include <mach/hardware.h> |
15 | #include <asm/leds.h> | 16 | #include <asm/leds.h> |
diff --git a/arch/arm/mach-sa1100/pm.c b/arch/arm/mach-sa1100/pm.c index 690cf0ce5c0c..6645d1e31f14 100644 --- a/arch/arm/mach-sa1100/pm.c +++ b/arch/arm/mach-sa1100/pm.c | |||
@@ -23,6 +23,7 @@ | |||
23 | * Storage is local on the stack now. | 23 | * Storage is local on the stack now. |
24 | */ | 24 | */ |
25 | #include <linux/init.h> | 25 | #include <linux/init.h> |
26 | #include <linux/io.h> | ||
26 | #include <linux/suspend.h> | 27 | #include <linux/suspend.h> |
27 | #include <linux/errno.h> | 28 | #include <linux/errno.h> |
28 | #include <linux/time.h> | 29 | #include <linux/time.h> |
diff --git a/arch/arm/mach-sa1100/sleep.S b/arch/arm/mach-sa1100/sleep.S index 30cc6721665b..85863741ef8b 100644 --- a/arch/arm/mach-sa1100/sleep.S +++ b/arch/arm/mach-sa1100/sleep.S | |||
@@ -38,9 +38,9 @@ ENTRY(sa1100_finish_suspend) | |||
38 | orr r4, r4, #MDREFR_K1DB2 | 38 | orr r4, r4, #MDREFR_K1DB2 |
39 | ldr r5, =PPCR | 39 | ldr r5, =PPCR |
40 | 40 | ||
41 | @ Pre-load __udelay into the I-cache | 41 | @ Pre-load __loop_udelay into the I-cache |
42 | mov r0, #1 | 42 | mov r0, #1 |
43 | bl __udelay | 43 | bl __loop_udelay |
44 | mov r0, r0 | 44 | mov r0, r0 |
45 | 45 | ||
46 | @ The following must all exist in a single cache line to | 46 | @ The following must all exist in a single cache line to |
@@ -53,11 +53,11 @@ ENTRY(sa1100_finish_suspend) | |||
53 | @ delay 90us and set CPU PLL to lowest speed | 53 | @ delay 90us and set CPU PLL to lowest speed |
54 | @ fixes resume problem on high speed SA1110 | 54 | @ fixes resume problem on high speed SA1110 |
55 | mov r0, #90 | 55 | mov r0, #90 |
56 | bl __udelay | 56 | bl __loop_udelay |
57 | mov r1, #0 | 57 | mov r1, #0 |
58 | str r1, [r5] | 58 | str r1, [r5] |
59 | mov r0, #90 | 59 | mov r0, #90 |
60 | bl __udelay | 60 | bl __loop_udelay |
61 | 61 | ||
62 | /* | 62 | /* |
63 | * SA1110 SDRAM controller workaround. register values: | 63 | * SA1110 SDRAM controller workaround. register values: |
diff --git a/arch/arm/mach-sa1100/time.c b/arch/arm/mach-sa1100/time.c index 6af26e8d55e6..80702c9ecc77 100644 --- a/arch/arm/mach-sa1100/time.c +++ b/arch/arm/mach-sa1100/time.c | |||
@@ -22,7 +22,7 @@ | |||
22 | 22 | ||
23 | static u32 notrace sa1100_read_sched_clock(void) | 23 | static u32 notrace sa1100_read_sched_clock(void) |
24 | { | 24 | { |
25 | return OSCR; | 25 | return readl_relaxed(OSCR); |
26 | } | 26 | } |
27 | 27 | ||
28 | #define MIN_OSCR_DELTA 2 | 28 | #define MIN_OSCR_DELTA 2 |
@@ -32,8 +32,8 @@ static irqreturn_t sa1100_ost0_interrupt(int irq, void *dev_id) | |||
32 | struct clock_event_device *c = dev_id; | 32 | struct clock_event_device *c = dev_id; |
33 | 33 | ||
34 | /* Disarm the compare/match, signal the event. */ | 34 | /* Disarm the compare/match, signal the event. */ |
35 | OIER &= ~OIER_E0; | 35 | writel_relaxed(readl_relaxed(OIER) & ~OIER_E0, OIER); |
36 | OSSR = OSSR_M0; | 36 | writel_relaxed(OSSR_M0, OSSR); |
37 | c->event_handler(c); | 37 | c->event_handler(c); |
38 | 38 | ||
39 | return IRQ_HANDLED; | 39 | return IRQ_HANDLED; |
@@ -44,10 +44,10 @@ sa1100_osmr0_set_next_event(unsigned long delta, struct clock_event_device *c) | |||
44 | { | 44 | { |
45 | unsigned long next, oscr; | 45 | unsigned long next, oscr; |
46 | 46 | ||
47 | OIER |= OIER_E0; | 47 | writel_relaxed(readl_relaxed(OIER) | OIER_E0, OIER); |
48 | next = OSCR + delta; | 48 | next = readl_relaxed(OSCR) + delta; |
49 | OSMR0 = next; | 49 | writel_relaxed(next, OSMR0); |
50 | oscr = OSCR; | 50 | oscr = readl_relaxed(OSCR); |
51 | 51 | ||
52 | return (signed)(next - oscr) <= MIN_OSCR_DELTA ? -ETIME : 0; | 52 | return (signed)(next - oscr) <= MIN_OSCR_DELTA ? -ETIME : 0; |
53 | } | 53 | } |
@@ -59,8 +59,8 @@ sa1100_osmr0_set_mode(enum clock_event_mode mode, struct clock_event_device *c) | |||
59 | case CLOCK_EVT_MODE_ONESHOT: | 59 | case CLOCK_EVT_MODE_ONESHOT: |
60 | case CLOCK_EVT_MODE_UNUSED: | 60 | case CLOCK_EVT_MODE_UNUSED: |
61 | case CLOCK_EVT_MODE_SHUTDOWN: | 61 | case CLOCK_EVT_MODE_SHUTDOWN: |
62 | OIER &= ~OIER_E0; | 62 | writel_relaxed(readl_relaxed(OIER) & ~OIER_E0, OIER); |
63 | OSSR = OSSR_M0; | 63 | writel_relaxed(OSSR_M0, OSSR); |
64 | break; | 64 | break; |
65 | 65 | ||
66 | case CLOCK_EVT_MODE_RESUME: | 66 | case CLOCK_EVT_MODE_RESUME: |
@@ -86,8 +86,8 @@ static struct irqaction sa1100_timer_irq = { | |||
86 | 86 | ||
87 | static void __init sa1100_timer_init(void) | 87 | static void __init sa1100_timer_init(void) |
88 | { | 88 | { |
89 | OIER = 0; | 89 | writel_relaxed(0, OIER); |
90 | OSSR = OSSR_M0 | OSSR_M1 | OSSR_M2 | OSSR_M3; | 90 | writel_relaxed(OSSR_M0 | OSSR_M1 | OSSR_M2 | OSSR_M3, OSSR); |
91 | 91 | ||
92 | setup_sched_clock(sa1100_read_sched_clock, 32, 3686400); | 92 | setup_sched_clock(sa1100_read_sched_clock, 32, 3686400); |
93 | 93 | ||
@@ -100,7 +100,7 @@ static void __init sa1100_timer_init(void) | |||
100 | 100 | ||
101 | setup_irq(IRQ_OST0, &sa1100_timer_irq); | 101 | setup_irq(IRQ_OST0, &sa1100_timer_irq); |
102 | 102 | ||
103 | clocksource_mmio_init(&OSCR, "oscr", CLOCK_TICK_RATE, 200, 32, | 103 | clocksource_mmio_init(OSCR, "oscr", CLOCK_TICK_RATE, 200, 32, |
104 | clocksource_mmio_readl_up); | 104 | clocksource_mmio_readl_up); |
105 | clockevents_register_device(&ckevt_sa1100_osmr0); | 105 | clockevents_register_device(&ckevt_sa1100_osmr0); |
106 | } | 106 | } |
@@ -110,26 +110,26 @@ unsigned long osmr[4], oier; | |||
110 | 110 | ||
111 | static void sa1100_timer_suspend(void) | 111 | static void sa1100_timer_suspend(void) |
112 | { | 112 | { |
113 | osmr[0] = OSMR0; | 113 | osmr[0] = readl_relaxed(OSMR0); |
114 | osmr[1] = OSMR1; | 114 | osmr[1] = readl_relaxed(OSMR1); |
115 | osmr[2] = OSMR2; | 115 | osmr[2] = readl_relaxed(OSMR2); |
116 | osmr[3] = OSMR3; | 116 | osmr[3] = readl_relaxed(OSMR3); |
117 | oier = OIER; | 117 | oier = readl_relaxed(OIER); |
118 | } | 118 | } |
119 | 119 | ||
120 | static void sa1100_timer_resume(void) | 120 | static void sa1100_timer_resume(void) |
121 | { | 121 | { |
122 | OSSR = 0x0f; | 122 | writel_relaxed(0x0f, OSSR); |
123 | OSMR0 = osmr[0]; | 123 | writel_relaxed(osmr[0], OSMR0); |
124 | OSMR1 = osmr[1]; | 124 | writel_relaxed(osmr[1], OSMR1); |
125 | OSMR2 = osmr[2]; | 125 | writel_relaxed(osmr[2], OSMR2); |
126 | OSMR3 = osmr[3]; | 126 | writel_relaxed(osmr[3], OSMR3); |
127 | OIER = oier; | 127 | writel_relaxed(oier, OIER); |
128 | 128 | ||
129 | /* | 129 | /* |
130 | * OSMR0 is the system timer: make sure OSCR is sufficiently behind | 130 | * OSMR0 is the system timer: make sure OSCR is sufficiently behind |
131 | */ | 131 | */ |
132 | OSCR = OSMR0 - LATCH; | 132 | writel_relaxed(OSMR0 - LATCH, OSCR); |
133 | } | 133 | } |
134 | #else | 134 | #else |
135 | #define sa1100_timer_suspend NULL | 135 | #define sa1100_timer_suspend NULL |
diff --git a/arch/arm/mach-shmobile/platsmp.c b/arch/arm/mach-shmobile/platsmp.c index e859fcdb3d58..fde0d23121dc 100644 --- a/arch/arm/mach-shmobile/platsmp.c +++ b/arch/arm/mach-shmobile/platsmp.c | |||
@@ -22,8 +22,13 @@ | |||
22 | #include <mach/common.h> | 22 | #include <mach/common.h> |
23 | #include <mach/emev2.h> | 23 | #include <mach/emev2.h> |
24 | 24 | ||
25 | #ifdef CONFIG_ARCH_SH73A0 | ||
25 | #define is_sh73a0() (machine_is_ag5evm() || machine_is_kota2() || \ | 26 | #define is_sh73a0() (machine_is_ag5evm() || machine_is_kota2() || \ |
26 | of_machine_is_compatible("renesas,sh73a0")) | 27 | of_machine_is_compatible("renesas,sh73a0")) |
28 | #else | ||
29 | #define is_sh73a0() (0) | ||
30 | #endif | ||
31 | |||
27 | #define is_r8a7779() machine_is_marzen() | 32 | #define is_r8a7779() machine_is_marzen() |
28 | 33 | ||
29 | #ifdef CONFIG_ARCH_EMEV2 | 34 | #ifdef CONFIG_ARCH_EMEV2 |
diff --git a/arch/arm/mach-spear3xx/spear3xx.c b/arch/arm/mach-spear3xx/spear3xx.c index 0f41bd1c47c3..66db5f13af84 100644 --- a/arch/arm/mach-spear3xx/spear3xx.c +++ b/arch/arm/mach-spear3xx/spear3xx.c | |||
@@ -87,7 +87,7 @@ void __init spear3xx_map_io(void) | |||
87 | 87 | ||
88 | static void __init spear3xx_timer_init(void) | 88 | static void __init spear3xx_timer_init(void) |
89 | { | 89 | { |
90 | char pclk_name[] = "pll3_48m_clk"; | 90 | char pclk_name[] = "pll3_clk"; |
91 | struct clk *gpt_clk, *pclk; | 91 | struct clk *gpt_clk, *pclk; |
92 | 92 | ||
93 | spear3xx_clk_init(); | 93 | spear3xx_clk_init(); |
diff --git a/arch/arm/mach-spear6xx/spear6xx.c b/arch/arm/mach-spear6xx/spear6xx.c index 2e2e3596583e..9af67d003c62 100644 --- a/arch/arm/mach-spear6xx/spear6xx.c +++ b/arch/arm/mach-spear6xx/spear6xx.c | |||
@@ -423,7 +423,7 @@ void __init spear6xx_map_io(void) | |||
423 | 423 | ||
424 | static void __init spear6xx_timer_init(void) | 424 | static void __init spear6xx_timer_init(void) |
425 | { | 425 | { |
426 | char pclk_name[] = "pll3_48m_clk"; | 426 | char pclk_name[] = "pll3_clk"; |
427 | struct clk *gpt_clk, *pclk; | 427 | struct clk *gpt_clk, *pclk; |
428 | 428 | ||
429 | spear6xx_clk_init(); | 429 | spear6xx_clk_init(); |
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index 1509a3cb5833..4fd93f5c49ec 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c | |||
@@ -625,11 +625,6 @@ static struct platform_device *snowball_platform_devs[] __initdata = { | |||
625 | &ab8500_device, | 625 | &ab8500_device, |
626 | }; | 626 | }; |
627 | 627 | ||
628 | static struct platform_device *snowball_of_platform_devs[] __initdata = { | ||
629 | &snowball_led_dev, | ||
630 | &snowball_key_dev, | ||
631 | }; | ||
632 | |||
633 | static void __init mop500_init_machine(void) | 628 | static void __init mop500_init_machine(void) |
634 | { | 629 | { |
635 | struct device *parent = NULL; | 630 | struct device *parent = NULL; |
@@ -769,6 +764,11 @@ MACHINE_END | |||
769 | 764 | ||
770 | #ifdef CONFIG_MACH_UX500_DT | 765 | #ifdef CONFIG_MACH_UX500_DT |
771 | 766 | ||
767 | static struct platform_device *snowball_of_platform_devs[] __initdata = { | ||
768 | &snowball_led_dev, | ||
769 | &snowball_key_dev, | ||
770 | }; | ||
771 | |||
772 | struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = { | 772 | struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = { |
773 | /* Requires DMA and call-back bindings. */ | 773 | /* Requires DMA and call-back bindings. */ |
774 | OF_DEV_AUXDATA("arm,pl011", 0x80120000, "uart0", &uart0_plat), | 774 | OF_DEV_AUXDATA("arm,pl011", 0x80120000, "uart0", &uart0_plat), |
@@ -786,6 +786,8 @@ struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = { | |||
786 | OF_DEV_AUXDATA("st,nomadik-gpio", 0x8011e000, "gpio.6", NULL), | 786 | OF_DEV_AUXDATA("st,nomadik-gpio", 0x8011e000, "gpio.6", NULL), |
787 | OF_DEV_AUXDATA("st,nomadik-gpio", 0x8011e080, "gpio.7", NULL), | 787 | OF_DEV_AUXDATA("st,nomadik-gpio", 0x8011e080, "gpio.7", NULL), |
788 | OF_DEV_AUXDATA("st,nomadik-gpio", 0xa03fe000, "gpio.8", NULL), | 788 | OF_DEV_AUXDATA("st,nomadik-gpio", 0xa03fe000, "gpio.8", NULL), |
789 | /* Requires device name bindings. */ | ||
790 | OF_DEV_AUXDATA("stericsson,nmk_pinctrl", 0, "pinctrl-db8500", NULL), | ||
789 | {}, | 791 | {}, |
790 | }; | 792 | }; |
791 | 793 | ||
diff --git a/arch/arm/mach-ux500/timer.c b/arch/arm/mach-ux500/timer.c index 741e71feca78..66e7f00884ab 100644 --- a/arch/arm/mach-ux500/timer.c +++ b/arch/arm/mach-ux500/timer.c | |||
@@ -63,8 +63,10 @@ static void __init ux500_timer_init(void) | |||
63 | 63 | ||
64 | /* TODO: Once MTU has been DT:ed place code above into else. */ | 64 | /* TODO: Once MTU has been DT:ed place code above into else. */ |
65 | if (of_have_populated_dt()) { | 65 | if (of_have_populated_dt()) { |
66 | #ifdef CONFIG_OF | ||
66 | np = of_find_matching_node(NULL, prcmu_timer_of_match); | 67 | np = of_find_matching_node(NULL, prcmu_timer_of_match); |
67 | if (!np) | 68 | if (!np) |
69 | #endif | ||
68 | goto dt_fail; | 70 | goto dt_fail; |
69 | 71 | ||
70 | tmp_base = of_iomap(np, 0); | 72 | tmp_base = of_iomap(np, 0); |
diff --git a/arch/arm/mm/context.c b/arch/arm/mm/context.c index 806cc4f63516..119bc52ab93e 100644 --- a/arch/arm/mm/context.c +++ b/arch/arm/mm/context.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/percpu.h> | 14 | #include <linux/percpu.h> |
15 | 15 | ||
16 | #include <asm/mmu_context.h> | 16 | #include <asm/mmu_context.h> |
17 | #include <asm/thread_notify.h> | ||
17 | #include <asm/tlbflush.h> | 18 | #include <asm/tlbflush.h> |
18 | 19 | ||
19 | static DEFINE_RAW_SPINLOCK(cpu_asid_lock); | 20 | static DEFINE_RAW_SPINLOCK(cpu_asid_lock); |
@@ -48,6 +49,40 @@ void cpu_set_reserved_ttbr0(void) | |||
48 | } | 49 | } |
49 | #endif | 50 | #endif |
50 | 51 | ||
52 | #ifdef CONFIG_PID_IN_CONTEXTIDR | ||
53 | static int contextidr_notifier(struct notifier_block *unused, unsigned long cmd, | ||
54 | void *t) | ||
55 | { | ||
56 | u32 contextidr; | ||
57 | pid_t pid; | ||
58 | struct thread_info *thread = t; | ||
59 | |||
60 | if (cmd != THREAD_NOTIFY_SWITCH) | ||
61 | return NOTIFY_DONE; | ||
62 | |||
63 | pid = task_pid_nr(thread->task) << ASID_BITS; | ||
64 | asm volatile( | ||
65 | " mrc p15, 0, %0, c13, c0, 1\n" | ||
66 | " bfi %1, %0, #0, %2\n" | ||
67 | " mcr p15, 0, %1, c13, c0, 1\n" | ||
68 | : "=r" (contextidr), "+r" (pid) | ||
69 | : "I" (ASID_BITS)); | ||
70 | isb(); | ||
71 | |||
72 | return NOTIFY_OK; | ||
73 | } | ||
74 | |||
75 | static struct notifier_block contextidr_notifier_block = { | ||
76 | .notifier_call = contextidr_notifier, | ||
77 | }; | ||
78 | |||
79 | static int __init contextidr_notifier_init(void) | ||
80 | { | ||
81 | return thread_register_notifier(&contextidr_notifier_block); | ||
82 | } | ||
83 | arch_initcall(contextidr_notifier_init); | ||
84 | #endif | ||
85 | |||
51 | /* | 86 | /* |
52 | * We fork()ed a process, and we need a new context for the child | 87 | * We fork()ed a process, and we need a new context for the child |
53 | * to run in. | 88 | * to run in. |
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 4044abcf6f9d..5cfc98994076 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
@@ -23,12 +23,12 @@ | |||
23 | #include <linux/slab.h> | 23 | #include <linux/slab.h> |
24 | #include <linux/iommu.h> | 24 | #include <linux/iommu.h> |
25 | #include <linux/vmalloc.h> | 25 | #include <linux/vmalloc.h> |
26 | #include <linux/sizes.h> | ||
26 | 27 | ||
27 | #include <asm/memory.h> | 28 | #include <asm/memory.h> |
28 | #include <asm/highmem.h> | 29 | #include <asm/highmem.h> |
29 | #include <asm/cacheflush.h> | 30 | #include <asm/cacheflush.h> |
30 | #include <asm/tlbflush.h> | 31 | #include <asm/tlbflush.h> |
31 | #include <asm/sizes.h> | ||
32 | #include <asm/mach/arch.h> | 32 | #include <asm/mach/arch.h> |
33 | #include <asm/dma-iommu.h> | 33 | #include <asm/dma-iommu.h> |
34 | #include <asm/mach/map.h> | 34 | #include <asm/mach/map.h> |
@@ -1091,7 +1091,7 @@ error: | |||
1091 | while (--i) | 1091 | while (--i) |
1092 | if (pages[i]) | 1092 | if (pages[i]) |
1093 | __free_pages(pages[i], 0); | 1093 | __free_pages(pages[i], 0); |
1094 | if (array_size < PAGE_SIZE) | 1094 | if (array_size <= PAGE_SIZE) |
1095 | kfree(pages); | 1095 | kfree(pages); |
1096 | else | 1096 | else |
1097 | vfree(pages); | 1097 | vfree(pages); |
@@ -1106,7 +1106,7 @@ static int __iommu_free_buffer(struct device *dev, struct page **pages, size_t s | |||
1106 | for (i = 0; i < count; i++) | 1106 | for (i = 0; i < count; i++) |
1107 | if (pages[i]) | 1107 | if (pages[i]) |
1108 | __free_pages(pages[i], 0); | 1108 | __free_pages(pages[i], 0); |
1109 | if (array_size < PAGE_SIZE) | 1109 | if (array_size <= PAGE_SIZE) |
1110 | kfree(pages); | 1110 | kfree(pages); |
1111 | else | 1111 | else |
1112 | vfree(pages); | 1112 | vfree(pages); |
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index f54d59219764..9aec41fa80ae 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c | |||
@@ -21,13 +21,13 @@ | |||
21 | #include <linux/gfp.h> | 21 | #include <linux/gfp.h> |
22 | #include <linux/memblock.h> | 22 | #include <linux/memblock.h> |
23 | #include <linux/dma-contiguous.h> | 23 | #include <linux/dma-contiguous.h> |
24 | #include <linux/sizes.h> | ||
24 | 25 | ||
25 | #include <asm/mach-types.h> | 26 | #include <asm/mach-types.h> |
26 | #include <asm/memblock.h> | 27 | #include <asm/memblock.h> |
27 | #include <asm/prom.h> | 28 | #include <asm/prom.h> |
28 | #include <asm/sections.h> | 29 | #include <asm/sections.h> |
29 | #include <asm/setup.h> | 30 | #include <asm/setup.h> |
30 | #include <asm/sizes.h> | ||
31 | #include <asm/tlb.h> | 31 | #include <asm/tlb.h> |
32 | #include <asm/fixmap.h> | 32 | #include <asm/fixmap.h> |
33 | 33 | ||
diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c index 4f55f5062ab7..566750fa57d4 100644 --- a/arch/arm/mm/ioremap.c +++ b/arch/arm/mm/ioremap.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/mm.h> | 25 | #include <linux/mm.h> |
26 | #include <linux/vmalloc.h> | 26 | #include <linux/vmalloc.h> |
27 | #include <linux/io.h> | 27 | #include <linux/io.h> |
28 | #include <linux/sizes.h> | ||
28 | 29 | ||
29 | #include <asm/cp15.h> | 30 | #include <asm/cp15.h> |
30 | #include <asm/cputype.h> | 31 | #include <asm/cputype.h> |
@@ -32,7 +33,6 @@ | |||
32 | #include <asm/mmu_context.h> | 33 | #include <asm/mmu_context.h> |
33 | #include <asm/pgalloc.h> | 34 | #include <asm/pgalloc.h> |
34 | #include <asm/tlbflush.h> | 35 | #include <asm/tlbflush.h> |
35 | #include <asm/sizes.h> | ||
36 | #include <asm/system_info.h> | 36 | #include <asm/system_info.h> |
37 | 37 | ||
38 | #include <asm/mach/map.h> | 38 | #include <asm/mach/map.h> |
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index cf4528d51774..4c2d0451e84a 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
@@ -16,13 +16,13 @@ | |||
16 | #include <linux/memblock.h> | 16 | #include <linux/memblock.h> |
17 | #include <linux/fs.h> | 17 | #include <linux/fs.h> |
18 | #include <linux/vmalloc.h> | 18 | #include <linux/vmalloc.h> |
19 | #include <linux/sizes.h> | ||
19 | 20 | ||
20 | #include <asm/cp15.h> | 21 | #include <asm/cp15.h> |
21 | #include <asm/cputype.h> | 22 | #include <asm/cputype.h> |
22 | #include <asm/sections.h> | 23 | #include <asm/sections.h> |
23 | #include <asm/cachetype.h> | 24 | #include <asm/cachetype.h> |
24 | #include <asm/setup.h> | 25 | #include <asm/setup.h> |
25 | #include <asm/sizes.h> | ||
26 | #include <asm/smp_plat.h> | 26 | #include <asm/smp_plat.h> |
27 | #include <asm/tlb.h> | 27 | #include <asm/tlb.h> |
28 | #include <asm/highmem.h> | 28 | #include <asm/highmem.h> |
@@ -422,12 +422,6 @@ static void __init build_mem_type_table(void) | |||
422 | vecs_pgprot = kern_pgprot = user_pgprot = cp->pte; | 422 | vecs_pgprot = kern_pgprot = user_pgprot = cp->pte; |
423 | 423 | ||
424 | /* | 424 | /* |
425 | * Only use write-through for non-SMP systems | ||
426 | */ | ||
427 | if (!is_smp() && cpu_arch >= CPU_ARCH_ARMv5 && cachepolicy > CPOLICY_WRITETHROUGH) | ||
428 | vecs_pgprot = cache_policies[CPOLICY_WRITETHROUGH].pte; | ||
429 | |||
430 | /* | ||
431 | * Enable CPU-specific coherency if supported. | 425 | * Enable CPU-specific coherency if supported. |
432 | * (Only available on XSC3 at the moment.) | 426 | * (Only available on XSC3 at the moment.) |
433 | */ | 427 | */ |
diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S index 5900cd520e84..86b8b480634f 100644 --- a/arch/arm/mm/proc-v6.S +++ b/arch/arm/mm/proc-v6.S | |||
@@ -107,6 +107,12 @@ ENTRY(cpu_v6_switch_mm) | |||
107 | mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB | 107 | mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB |
108 | mcr p15, 0, r2, c7, c10, 4 @ drain write buffer | 108 | mcr p15, 0, r2, c7, c10, 4 @ drain write buffer |
109 | mcr p15, 0, r0, c2, c0, 0 @ set TTB 0 | 109 | mcr p15, 0, r0, c2, c0, 0 @ set TTB 0 |
110 | #ifdef CONFIG_PID_IN_CONTEXTIDR | ||
111 | mrc p15, 0, r2, c13, c0, 1 @ read current context ID | ||
112 | bic r2, r2, #0xff @ extract the PID | ||
113 | and r1, r1, #0xff | ||
114 | orr r1, r1, r2 @ insert into new context ID | ||
115 | #endif | ||
110 | mcr p15, 0, r1, c13, c0, 1 @ set context ID | 116 | mcr p15, 0, r1, c13, c0, 1 @ set context ID |
111 | #endif | 117 | #endif |
112 | mov pc, lr | 118 | mov pc, lr |
diff --git a/arch/arm/mm/proc-v7-2level.S b/arch/arm/mm/proc-v7-2level.S index 42ac069c8012..fd045e706390 100644 --- a/arch/arm/mm/proc-v7-2level.S +++ b/arch/arm/mm/proc-v7-2level.S | |||
@@ -46,6 +46,11 @@ ENTRY(cpu_v7_switch_mm) | |||
46 | #ifdef CONFIG_ARM_ERRATA_430973 | 46 | #ifdef CONFIG_ARM_ERRATA_430973 |
47 | mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB | 47 | mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB |
48 | #endif | 48 | #endif |
49 | #ifdef CONFIG_PID_IN_CONTEXTIDR | ||
50 | mrc p15, 0, r2, c13, c0, 1 @ read current context ID | ||
51 | lsr r2, r2, #8 @ extract the PID | ||
52 | bfi r1, r2, #8, #24 @ insert into new context ID | ||
53 | #endif | ||
49 | #ifdef CONFIG_ARM_ERRATA_754322 | 54 | #ifdef CONFIG_ARM_ERRATA_754322 |
50 | dsb | 55 | dsb |
51 | #endif | 56 | #endif |
diff --git a/arch/arm/oprofile/common.c b/arch/arm/oprofile/common.c index 4e0a371630b3..99c63d4b6af8 100644 --- a/arch/arm/oprofile/common.c +++ b/arch/arm/oprofile/common.c | |||
@@ -23,26 +23,37 @@ | |||
23 | #include <asm/ptrace.h> | 23 | #include <asm/ptrace.h> |
24 | 24 | ||
25 | #ifdef CONFIG_HW_PERF_EVENTS | 25 | #ifdef CONFIG_HW_PERF_EVENTS |
26 | |||
27 | /* | ||
28 | * OProfile has a curious naming scheme for the ARM PMUs, but they are | ||
29 | * part of the user ABI so we need to map from the perf PMU name for | ||
30 | * supported PMUs. | ||
31 | */ | ||
32 | static struct op_perf_name { | ||
33 | char *perf_name; | ||
34 | char *op_name; | ||
35 | } op_perf_name_map[] = { | ||
36 | { "xscale1", "arm/xscale1" }, | ||
37 | { "xscale1", "arm/xscale2" }, | ||
38 | { "v6", "arm/armv6" }, | ||
39 | { "v6mpcore", "arm/mpcore" }, | ||
40 | { "ARMv7 Cortex-A8", "arm/armv7" }, | ||
41 | { "ARMv7 Cortex-A9", "arm/armv7-ca9" }, | ||
42 | }; | ||
43 | |||
26 | char *op_name_from_perf_id(void) | 44 | char *op_name_from_perf_id(void) |
27 | { | 45 | { |
28 | enum arm_perf_pmu_ids id = armpmu_get_pmu_id(); | 46 | int i; |
29 | 47 | struct op_perf_name names; | |
30 | switch (id) { | 48 | const char *perf_name = perf_pmu_name(); |
31 | case ARM_PERF_PMU_ID_XSCALE1: | 49 | |
32 | return "arm/xscale1"; | 50 | for (i = 0; i < ARRAY_SIZE(op_perf_name_map); ++i) { |
33 | case ARM_PERF_PMU_ID_XSCALE2: | 51 | names = op_perf_name_map[i]; |
34 | return "arm/xscale2"; | 52 | if (!strcmp(names.perf_name, perf_name)) |
35 | case ARM_PERF_PMU_ID_V6: | 53 | return names.op_name; |
36 | return "arm/armv6"; | ||
37 | case ARM_PERF_PMU_ID_V6MP: | ||
38 | return "arm/mpcore"; | ||
39 | case ARM_PERF_PMU_ID_CA8: | ||
40 | return "arm/armv7"; | ||
41 | case ARM_PERF_PMU_ID_CA9: | ||
42 | return "arm/armv7-ca9"; | ||
43 | default: | ||
44 | return NULL; | ||
45 | } | 54 | } |
55 | |||
56 | return NULL; | ||
46 | } | 57 | } |
47 | #endif | 58 | #endif |
48 | 59 | ||
diff --git a/arch/arm/plat-samsung/adc.c b/arch/arm/plat-samsung/adc.c index 33ecd0c9f0c3..b1e05ccff3ac 100644 --- a/arch/arm/plat-samsung/adc.c +++ b/arch/arm/plat-samsung/adc.c | |||
@@ -157,11 +157,13 @@ int s3c_adc_start(struct s3c_adc_client *client, | |||
157 | return -EINVAL; | 157 | return -EINVAL; |
158 | } | 158 | } |
159 | 159 | ||
160 | if (client->is_ts && adc->ts_pend) | ||
161 | return -EAGAIN; | ||
162 | |||
163 | spin_lock_irqsave(&adc->lock, flags); | 160 | spin_lock_irqsave(&adc->lock, flags); |
164 | 161 | ||
162 | if (client->is_ts && adc->ts_pend) { | ||
163 | spin_unlock_irqrestore(&adc->lock, flags); | ||
164 | return -EAGAIN; | ||
165 | } | ||
166 | |||
165 | client->channel = channel; | 167 | client->channel = channel; |
166 | client->nr_samples = nr_samples; | 168 | client->nr_samples = nr_samples; |
167 | 169 | ||
diff --git a/arch/arm/plat-samsung/devs.c b/arch/arm/plat-samsung/devs.c index 1d214cb9d770..6303974c2ee0 100644 --- a/arch/arm/plat-samsung/devs.c +++ b/arch/arm/plat-samsung/devs.c | |||
@@ -126,7 +126,8 @@ struct platform_device s3c_device_adc = { | |||
126 | #ifdef CONFIG_CPU_S3C2440 | 126 | #ifdef CONFIG_CPU_S3C2440 |
127 | static struct resource s3c_camif_resource[] = { | 127 | static struct resource s3c_camif_resource[] = { |
128 | [0] = DEFINE_RES_MEM(S3C2440_PA_CAMIF, S3C2440_SZ_CAMIF), | 128 | [0] = DEFINE_RES_MEM(S3C2440_PA_CAMIF, S3C2440_SZ_CAMIF), |
129 | [1] = DEFINE_RES_IRQ(IRQ_CAM), | 129 | [1] = DEFINE_RES_IRQ(IRQ_S3C2440_CAM_C), |
130 | [2] = DEFINE_RES_IRQ(IRQ_S3C2440_CAM_P), | ||
130 | }; | 131 | }; |
131 | 132 | ||
132 | struct platform_device s3c_device_camif = { | 133 | struct platform_device s3c_device_camif = { |
diff --git a/arch/arm/plat-samsung/s5p-clock.c b/arch/arm/plat-samsung/s5p-clock.c index 031a61899bef..48a159911037 100644 --- a/arch/arm/plat-samsung/s5p-clock.c +++ b/arch/arm/plat-samsung/s5p-clock.c | |||
@@ -37,6 +37,7 @@ struct clk clk_ext_xtal_mux = { | |||
37 | struct clk clk_xusbxti = { | 37 | struct clk clk_xusbxti = { |
38 | .name = "xusbxti", | 38 | .name = "xusbxti", |
39 | .id = -1, | 39 | .id = -1, |
40 | .rate = 24000000, | ||
40 | }; | 41 | }; |
41 | 42 | ||
42 | struct clk s5p_clk_27m = { | 43 | struct clk s5p_clk_27m = { |
diff --git a/arch/arm/plat-versatile/platsmp.c b/arch/arm/plat-versatile/platsmp.c index 49c7db48c7f1..d7c5c171f5aa 100644 --- a/arch/arm/plat-versatile/platsmp.c +++ b/arch/arm/plat-versatile/platsmp.c | |||
@@ -85,7 +85,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) | |||
85 | * the boot monitor to read the system wide flags register, | 85 | * the boot monitor to read the system wide flags register, |
86 | * and branch to the address found there. | 86 | * and branch to the address found there. |
87 | */ | 87 | */ |
88 | gic_raise_softirq(cpumask_of(cpu), 1); | 88 | gic_raise_softirq(cpumask_of(cpu), 0); |
89 | 89 | ||
90 | timeout = jiffies + (1 * HZ); | 90 | timeout = jiffies + (1 * HZ); |
91 | while (time_before(jiffies, timeout)) { | 91 | while (time_before(jiffies, timeout)) { |
diff --git a/arch/h8300/include/asm/pgtable.h b/arch/h8300/include/asm/pgtable.h index a09230a08e02..62ef17676b40 100644 --- a/arch/h8300/include/asm/pgtable.h +++ b/arch/h8300/include/asm/pgtable.h | |||
@@ -70,4 +70,7 @@ extern int is_in_rom(unsigned long); | |||
70 | #define VMALLOC_END 0xffffffff | 70 | #define VMALLOC_END 0xffffffff |
71 | 71 | ||
72 | #define arch_enter_lazy_cpu_mode() do {} while (0) | 72 | #define arch_enter_lazy_cpu_mode() do {} while (0) |
73 | |||
74 | #include <asm-generic/pgtable.h> | ||
75 | |||
73 | #endif /* _H8300_PGTABLE_H */ | 76 | #endif /* _H8300_PGTABLE_H */ |
diff --git a/arch/h8300/include/asm/uaccess.h b/arch/h8300/include/asm/uaccess.h index 356068cd0879..8725d1ad4272 100644 --- a/arch/h8300/include/asm/uaccess.h +++ b/arch/h8300/include/asm/uaccess.h | |||
@@ -100,7 +100,6 @@ extern int __put_user_bad(void); | |||
100 | break; \ | 100 | break; \ |
101 | default: \ | 101 | default: \ |
102 | __gu_err = __get_user_bad(); \ | 102 | __gu_err = __get_user_bad(); \ |
103 | __gu_val = 0; \ | ||
104 | break; \ | 103 | break; \ |
105 | } \ | 104 | } \ |
106 | (x) = __gu_val; \ | 105 | (x) = __gu_val; \ |
@@ -159,4 +158,6 @@ clear_user(void *to, unsigned long n) | |||
159 | return 0; | 158 | return 0; |
160 | } | 159 | } |
161 | 160 | ||
161 | #define __clear_user clear_user | ||
162 | |||
162 | #endif /* _H8300_UACCESS_H */ | 163 | #endif /* _H8300_UACCESS_H */ |
diff --git a/arch/h8300/kernel/signal.c b/arch/h8300/kernel/signal.c index fca10378701b..5adaadaf9218 100644 --- a/arch/h8300/kernel/signal.c +++ b/arch/h8300/kernel/signal.c | |||
@@ -447,7 +447,7 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
447 | * want to handle. Thus you cannot kill init even with a SIGKILL even by | 447 | * want to handle. Thus you cannot kill init even with a SIGKILL even by |
448 | * mistake. | 448 | * mistake. |
449 | */ | 449 | */ |
450 | statis void do_signal(struct pt_regs *regs) | 450 | static void do_signal(struct pt_regs *regs) |
451 | { | 451 | { |
452 | siginfo_t info; | 452 | siginfo_t info; |
453 | int signr; | 453 | int signr; |
diff --git a/arch/h8300/kernel/time.c b/arch/h8300/kernel/time.c index 32263a138aa6..e0f74191d553 100644 --- a/arch/h8300/kernel/time.c +++ b/arch/h8300/kernel/time.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/profile.h> | 27 | #include <linux/profile.h> |
28 | 28 | ||
29 | #include <asm/io.h> | 29 | #include <asm/io.h> |
30 | #include <asm/irq_regs.h> | ||
30 | #include <asm/timer.h> | 31 | #include <asm/timer.h> |
31 | 32 | ||
32 | #define TICK_SIZE (tick_nsec / 1000) | 33 | #define TICK_SIZE (tick_nsec / 1000) |
diff --git a/arch/m32r/boot/compressed/Makefile b/arch/m32r/boot/compressed/Makefile index 177716b1d613..01729c2979ba 100644 --- a/arch/m32r/boot/compressed/Makefile +++ b/arch/m32r/boot/compressed/Makefile | |||
@@ -43,9 +43,9 @@ endif | |||
43 | 43 | ||
44 | OBJCOPYFLAGS += -R .empty_zero_page | 44 | OBJCOPYFLAGS += -R .empty_zero_page |
45 | 45 | ||
46 | suffix_$(CONFIG_KERNEL_GZIP) = gz | 46 | suffix-$(CONFIG_KERNEL_GZIP) = gz |
47 | suffix_$(CONFIG_KERNEL_BZIP2) = bz2 | 47 | suffix-$(CONFIG_KERNEL_BZIP2) = bz2 |
48 | suffix_$(CONFIG_KERNEL_LZMA) = lzma | 48 | suffix-$(CONFIG_KERNEL_LZMA) = lzma |
49 | 49 | ||
50 | $(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/vmlinux.bin.$(suffix-y) FORCE | 50 | $(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/vmlinux.bin.$(suffix-y) FORCE |
51 | $(call if_changed,ld) | 51 | $(call if_changed,ld) |
diff --git a/arch/m32r/boot/compressed/misc.c b/arch/m32r/boot/compressed/misc.c index 370d60881977..28a09529f206 100644 --- a/arch/m32r/boot/compressed/misc.c +++ b/arch/m32r/boot/compressed/misc.c | |||
@@ -28,7 +28,7 @@ static unsigned long free_mem_ptr; | |||
28 | static unsigned long free_mem_end_ptr; | 28 | static unsigned long free_mem_end_ptr; |
29 | 29 | ||
30 | #ifdef CONFIG_KERNEL_BZIP2 | 30 | #ifdef CONFIG_KERNEL_BZIP2 |
31 | static void *memset(void *s, int c, size_t n) | 31 | void *memset(void *s, int c, size_t n) |
32 | { | 32 | { |
33 | char *ss = s; | 33 | char *ss = s; |
34 | 34 | ||
@@ -39,6 +39,16 @@ static void *memset(void *s, int c, size_t n) | |||
39 | #endif | 39 | #endif |
40 | 40 | ||
41 | #ifdef CONFIG_KERNEL_GZIP | 41 | #ifdef CONFIG_KERNEL_GZIP |
42 | void *memcpy(void *dest, const void *src, size_t n) | ||
43 | { | ||
44 | char *d = dest; | ||
45 | const char *s = src; | ||
46 | while (n--) | ||
47 | *d++ = *s++; | ||
48 | |||
49 | return dest; | ||
50 | } | ||
51 | |||
42 | #define BOOT_HEAP_SIZE 0x10000 | 52 | #define BOOT_HEAP_SIZE 0x10000 |
43 | #include "../../../../lib/decompress_inflate.c" | 53 | #include "../../../../lib/decompress_inflate.c" |
44 | #endif | 54 | #endif |
diff --git a/arch/m32r/include/asm/ptrace.h b/arch/m32r/include/asm/ptrace.h index 527527584dd0..4313aa62b51b 100644 --- a/arch/m32r/include/asm/ptrace.h +++ b/arch/m32r/include/asm/ptrace.h | |||
@@ -113,9 +113,6 @@ struct pt_regs { | |||
113 | 113 | ||
114 | #define PTRACE_OLDSETOPTIONS 21 | 114 | #define PTRACE_OLDSETOPTIONS 21 |
115 | 115 | ||
116 | /* options set using PTRACE_SETOPTIONS */ | ||
117 | #define PTRACE_O_TRACESYSGOOD 0x00000001 | ||
118 | |||
119 | #ifdef __KERNEL__ | 116 | #ifdef __KERNEL__ |
120 | 117 | ||
121 | #include <asm/m32r.h> /* M32R_PSW_BSM, M32R_PSW_BPM */ | 118 | #include <asm/m32r.h> /* M32R_PSW_BSM, M32R_PSW_BPM */ |
diff --git a/arch/m32r/kernel/ptrace.c b/arch/m32r/kernel/ptrace.c index 4c03361537aa..51f5e9aa4901 100644 --- a/arch/m32r/kernel/ptrace.c +++ b/arch/m32r/kernel/ptrace.c | |||
@@ -591,17 +591,16 @@ void user_enable_single_step(struct task_struct *child) | |||
591 | 591 | ||
592 | if (access_process_vm(child, pc&~3, &insn, sizeof(insn), 0) | 592 | if (access_process_vm(child, pc&~3, &insn, sizeof(insn), 0) |
593 | != sizeof(insn)) | 593 | != sizeof(insn)) |
594 | return -EIO; | 594 | return; |
595 | 595 | ||
596 | compute_next_pc(insn, pc, &next_pc, child); | 596 | compute_next_pc(insn, pc, &next_pc, child); |
597 | if (next_pc & 0x80000000) | 597 | if (next_pc & 0x80000000) |
598 | return -EIO; | 598 | return; |
599 | 599 | ||
600 | if (embed_debug_trap(child, next_pc)) | 600 | if (embed_debug_trap(child, next_pc)) |
601 | return -EIO; | 601 | return; |
602 | 602 | ||
603 | invalidate_cache(); | 603 | invalidate_cache(); |
604 | return 0; | ||
605 | } | 604 | } |
606 | 605 | ||
607 | void user_disable_single_step(struct task_struct *child) | 606 | void user_disable_single_step(struct task_struct *child) |
diff --git a/arch/m32r/kernel/signal.c b/arch/m32r/kernel/signal.c index f3fb2c029cfc..d0f60b97bbc5 100644 --- a/arch/m32r/kernel/signal.c +++ b/arch/m32r/kernel/signal.c | |||
@@ -286,7 +286,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, | |||
286 | case -ERESTARTNOINTR: | 286 | case -ERESTARTNOINTR: |
287 | regs->r0 = regs->orig_r0; | 287 | regs->r0 = regs->orig_r0; |
288 | if (prev_insn(regs) < 0) | 288 | if (prev_insn(regs) < 0) |
289 | return -EFAULT; | 289 | return; |
290 | } | 290 | } |
291 | } | 291 | } |
292 | 292 | ||
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 09ab87ee6fef..b3e10fdd3898 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
@@ -288,6 +288,7 @@ config MIPS_MALTA | |||
288 | select SYS_HAS_CPU_MIPS32_R1 | 288 | select SYS_HAS_CPU_MIPS32_R1 |
289 | select SYS_HAS_CPU_MIPS32_R2 | 289 | select SYS_HAS_CPU_MIPS32_R2 |
290 | select SYS_HAS_CPU_MIPS64_R1 | 290 | select SYS_HAS_CPU_MIPS64_R1 |
291 | select SYS_HAS_CPU_MIPS64_R2 | ||
291 | select SYS_HAS_CPU_NEVADA | 292 | select SYS_HAS_CPU_NEVADA |
292 | select SYS_HAS_CPU_RM7000 | 293 | select SYS_HAS_CPU_RM7000 |
293 | select SYS_HAS_EARLY_PRINTK | 294 | select SYS_HAS_EARLY_PRINTK |
@@ -1423,6 +1424,7 @@ config CPU_SB1 | |||
1423 | config CPU_CAVIUM_OCTEON | 1424 | config CPU_CAVIUM_OCTEON |
1424 | bool "Cavium Octeon processor" | 1425 | bool "Cavium Octeon processor" |
1425 | depends on SYS_HAS_CPU_CAVIUM_OCTEON | 1426 | depends on SYS_HAS_CPU_CAVIUM_OCTEON |
1427 | select ARCH_SPARSEMEM_ENABLE | ||
1426 | select CPU_HAS_PREFETCH | 1428 | select CPU_HAS_PREFETCH |
1427 | select CPU_SUPPORTS_64BIT_KERNEL | 1429 | select CPU_SUPPORTS_64BIT_KERNEL |
1428 | select SYS_SUPPORTS_SMP | 1430 | select SYS_SUPPORTS_SMP |
diff --git a/arch/mips/bcm47xx/Kconfig b/arch/mips/bcm47xx/Kconfig index 6210b8d84109..b311be45a720 100644 --- a/arch/mips/bcm47xx/Kconfig +++ b/arch/mips/bcm47xx/Kconfig | |||
@@ -21,6 +21,7 @@ config BCM47XX_BCMA | |||
21 | select BCMA | 21 | select BCMA |
22 | select BCMA_HOST_SOC | 22 | select BCMA_HOST_SOC |
23 | select BCMA_DRIVER_MIPS | 23 | select BCMA_DRIVER_MIPS |
24 | select BCMA_HOST_PCI if PCI | ||
24 | select BCMA_DRIVER_PCI_HOSTMODE if PCI | 25 | select BCMA_DRIVER_PCI_HOSTMODE if PCI |
25 | default y | 26 | default y |
26 | help | 27 | help |
diff --git a/arch/mips/bcm63xx/dev-pcmcia.c b/arch/mips/bcm63xx/dev-pcmcia.c index de4d917fd54d..a551bab5ecb9 100644 --- a/arch/mips/bcm63xx/dev-pcmcia.c +++ b/arch/mips/bcm63xx/dev-pcmcia.c | |||
@@ -79,11 +79,11 @@ static int __init config_pcmcia_cs(unsigned int cs, | |||
79 | return ret; | 79 | return ret; |
80 | } | 80 | } |
81 | 81 | ||
82 | static const __initdata struct { | 82 | static const struct { |
83 | unsigned int cs; | 83 | unsigned int cs; |
84 | unsigned int base; | 84 | unsigned int base; |
85 | unsigned int size; | 85 | unsigned int size; |
86 | } pcmcia_cs[3] = { | 86 | } pcmcia_cs[3] __initconst = { |
87 | { | 87 | { |
88 | .cs = MPI_CS_PCMCIA_COMMON, | 88 | .cs = MPI_CS_PCMCIA_COMMON, |
89 | .base = BCM_PCMCIA_COMMON_BASE_PA, | 89 | .base = BCM_PCMCIA_COMMON_BASE_PA, |
diff --git a/arch/mips/cavium-octeon/Kconfig b/arch/mips/cavium-octeon/Kconfig index f9e275a50d98..2f4f6d5e05b6 100644 --- a/arch/mips/cavium-octeon/Kconfig +++ b/arch/mips/cavium-octeon/Kconfig | |||
@@ -82,10 +82,6 @@ config CAVIUM_OCTEON_LOCK_L2_MEMCPY | |||
82 | help | 82 | help |
83 | Lock the kernel's implementation of memcpy() into L2. | 83 | Lock the kernel's implementation of memcpy() into L2. |
84 | 84 | ||
85 | config ARCH_SPARSEMEM_ENABLE | ||
86 | def_bool y | ||
87 | select SPARSEMEM_STATIC | ||
88 | |||
89 | config IOMMU_HELPER | 85 | config IOMMU_HELPER |
90 | bool | 86 | bool |
91 | 87 | ||
diff --git a/arch/mips/cavium-octeon/smp.c b/arch/mips/cavium-octeon/smp.c index 4b93048044eb..ee1fb9f7f517 100644 --- a/arch/mips/cavium-octeon/smp.c +++ b/arch/mips/cavium-octeon/smp.c | |||
@@ -185,7 +185,6 @@ static void __cpuinit octeon_init_secondary(void) | |||
185 | octeon_init_cvmcount(); | 185 | octeon_init_cvmcount(); |
186 | 186 | ||
187 | octeon_irq_setup_secondary(); | 187 | octeon_irq_setup_secondary(); |
188 | raw_local_irq_enable(); | ||
189 | } | 188 | } |
190 | 189 | ||
191 | /** | 190 | /** |
@@ -233,6 +232,7 @@ static void octeon_smp_finish(void) | |||
233 | 232 | ||
234 | /* to generate the first CPU timer interrupt */ | 233 | /* to generate the first CPU timer interrupt */ |
235 | write_c0_compare(read_c0_count() + mips_hpt_frequency / HZ); | 234 | write_c0_compare(read_c0_count() + mips_hpt_frequency / HZ); |
235 | local_irq_enable(); | ||
236 | } | 236 | } |
237 | 237 | ||
238 | /** | 238 | /** |
diff --git a/arch/mips/include/asm/bitops.h b/arch/mips/include/asm/bitops.h index 2e1ad4c652b7..82ad35ce2b45 100644 --- a/arch/mips/include/asm/bitops.h +++ b/arch/mips/include/asm/bitops.h | |||
@@ -17,7 +17,6 @@ | |||
17 | #include <linux/irqflags.h> | 17 | #include <linux/irqflags.h> |
18 | #include <linux/types.h> | 18 | #include <linux/types.h> |
19 | #include <asm/barrier.h> | 19 | #include <asm/barrier.h> |
20 | #include <asm/bug.h> | ||
21 | #include <asm/byteorder.h> /* sigh ... */ | 20 | #include <asm/byteorder.h> /* sigh ... */ |
22 | #include <asm/cpu-features.h> | 21 | #include <asm/cpu-features.h> |
23 | #include <asm/sgidefs.h> | 22 | #include <asm/sgidefs.h> |
diff --git a/arch/mips/include/asm/cmpxchg.h b/arch/mips/include/asm/cmpxchg.h index 285a41fa0b18..eee10dc07ac1 100644 --- a/arch/mips/include/asm/cmpxchg.h +++ b/arch/mips/include/asm/cmpxchg.h | |||
@@ -8,6 +8,7 @@ | |||
8 | #ifndef __ASM_CMPXCHG_H | 8 | #ifndef __ASM_CMPXCHG_H |
9 | #define __ASM_CMPXCHG_H | 9 | #define __ASM_CMPXCHG_H |
10 | 10 | ||
11 | #include <linux/bug.h> | ||
11 | #include <linux/irqflags.h> | 12 | #include <linux/irqflags.h> |
12 | #include <asm/war.h> | 13 | #include <asm/war.h> |
13 | 14 | ||
diff --git a/arch/mips/include/asm/cpu.h b/arch/mips/include/asm/cpu.h index f9fa2a479dd0..95e40c1e8ed1 100644 --- a/arch/mips/include/asm/cpu.h +++ b/arch/mips/include/asm/cpu.h | |||
@@ -94,6 +94,7 @@ | |||
94 | #define PRID_IMP_24KE 0x9600 | 94 | #define PRID_IMP_24KE 0x9600 |
95 | #define PRID_IMP_74K 0x9700 | 95 | #define PRID_IMP_74K 0x9700 |
96 | #define PRID_IMP_1004K 0x9900 | 96 | #define PRID_IMP_1004K 0x9900 |
97 | #define PRID_IMP_M14KC 0x9c00 | ||
97 | 98 | ||
98 | /* | 99 | /* |
99 | * These are the PRID's for when 23:16 == PRID_COMP_SIBYTE | 100 | * These are the PRID's for when 23:16 == PRID_COMP_SIBYTE |
@@ -260,12 +261,12 @@ enum cpu_type_enum { | |||
260 | */ | 261 | */ |
261 | CPU_4KC, CPU_4KEC, CPU_4KSC, CPU_24K, CPU_34K, CPU_1004K, CPU_74K, | 262 | CPU_4KC, CPU_4KEC, CPU_4KSC, CPU_24K, CPU_34K, CPU_1004K, CPU_74K, |
262 | CPU_ALCHEMY, CPU_PR4450, CPU_BMIPS32, CPU_BMIPS3300, CPU_BMIPS4350, | 263 | CPU_ALCHEMY, CPU_PR4450, CPU_BMIPS32, CPU_BMIPS3300, CPU_BMIPS4350, |
263 | CPU_BMIPS4380, CPU_BMIPS5000, CPU_JZRISC, | 264 | CPU_BMIPS4380, CPU_BMIPS5000, CPU_JZRISC, CPU_M14KC, |
264 | 265 | ||
265 | /* | 266 | /* |
266 | * MIPS64 class processors | 267 | * MIPS64 class processors |
267 | */ | 268 | */ |
268 | CPU_5KC, CPU_20KC, CPU_25KF, CPU_SB1, CPU_SB1A, CPU_LOONGSON2, | 269 | CPU_5KC, CPU_5KE, CPU_20KC, CPU_25KF, CPU_SB1, CPU_SB1A, CPU_LOONGSON2, |
269 | CPU_CAVIUM_OCTEON, CPU_CAVIUM_OCTEON_PLUS, CPU_CAVIUM_OCTEON2, | 270 | CPU_CAVIUM_OCTEON, CPU_CAVIUM_OCTEON_PLUS, CPU_CAVIUM_OCTEON2, |
270 | CPU_XLR, CPU_XLP, | 271 | CPU_XLR, CPU_XLP, |
271 | 272 | ||
@@ -288,7 +289,7 @@ enum cpu_type_enum { | |||
288 | #define MIPS_CPU_ISA_M64R2 0x00000100 | 289 | #define MIPS_CPU_ISA_M64R2 0x00000100 |
289 | 290 | ||
290 | #define MIPS_CPU_ISA_32BIT (MIPS_CPU_ISA_I | MIPS_CPU_ISA_II | \ | 291 | #define MIPS_CPU_ISA_32BIT (MIPS_CPU_ISA_I | MIPS_CPU_ISA_II | \ |
291 | MIPS_CPU_ISA_M32R1 | MIPS_CPU_ISA_M32R2 ) | 292 | MIPS_CPU_ISA_M32R1 | MIPS_CPU_ISA_M32R2) |
292 | #define MIPS_CPU_ISA_64BIT (MIPS_CPU_ISA_III | MIPS_CPU_ISA_IV | \ | 293 | #define MIPS_CPU_ISA_64BIT (MIPS_CPU_ISA_III | MIPS_CPU_ISA_IV | \ |
293 | MIPS_CPU_ISA_V | MIPS_CPU_ISA_M64R1 | MIPS_CPU_ISA_M64R2) | 294 | MIPS_CPU_ISA_V | MIPS_CPU_ISA_M64R1 | MIPS_CPU_ISA_M64R2) |
294 | 295 | ||
diff --git a/arch/mips/include/asm/gic.h b/arch/mips/include/asm/gic.h index 86548da650e7..991b659e2548 100644 --- a/arch/mips/include/asm/gic.h +++ b/arch/mips/include/asm/gic.h | |||
@@ -206,7 +206,7 @@ | |||
206 | 206 | ||
207 | #define GIC_VPE_EIC_SHADOW_SET_BASE 0x0100 | 207 | #define GIC_VPE_EIC_SHADOW_SET_BASE 0x0100 |
208 | #define GIC_VPE_EIC_SS(intr) \ | 208 | #define GIC_VPE_EIC_SS(intr) \ |
209 | (GIC_EIC_SHADOW_SET_BASE + (4 * intr)) | 209 | (GIC_VPE_EIC_SHADOW_SET_BASE + (4 * intr)) |
210 | 210 | ||
211 | #define GIC_VPE_EIC_VEC_BASE 0x0800 | 211 | #define GIC_VPE_EIC_VEC_BASE 0x0800 |
212 | #define GIC_VPE_EIC_VEC(intr) \ | 212 | #define GIC_VPE_EIC_VEC(intr) \ |
@@ -330,6 +330,17 @@ struct gic_intr_map { | |||
330 | #define GIC_FLAG_TRANSPARENT 0x02 | 330 | #define GIC_FLAG_TRANSPARENT 0x02 |
331 | }; | 331 | }; |
332 | 332 | ||
333 | /* | ||
334 | * This is only used in EIC mode. This helps to figure out which | ||
335 | * shared interrupts we need to process when we get a vector interrupt. | ||
336 | */ | ||
337 | #define GIC_MAX_SHARED_INTR 0x5 | ||
338 | struct gic_shared_intr_map { | ||
339 | unsigned int num_shared_intr; | ||
340 | unsigned int intr_list[GIC_MAX_SHARED_INTR]; | ||
341 | unsigned int local_intr_mask; | ||
342 | }; | ||
343 | |||
333 | extern void gic_init(unsigned long gic_base_addr, | 344 | extern void gic_init(unsigned long gic_base_addr, |
334 | unsigned long gic_addrspace_size, struct gic_intr_map *intrmap, | 345 | unsigned long gic_addrspace_size, struct gic_intr_map *intrmap, |
335 | unsigned int intrmap_size, unsigned int irqbase); | 346 | unsigned int intrmap_size, unsigned int irqbase); |
@@ -338,5 +349,7 @@ extern unsigned int gic_get_int(void); | |||
338 | extern void gic_send_ipi(unsigned int intr); | 349 | extern void gic_send_ipi(unsigned int intr); |
339 | extern unsigned int plat_ipi_call_int_xlate(unsigned int); | 350 | extern unsigned int plat_ipi_call_int_xlate(unsigned int); |
340 | extern unsigned int plat_ipi_resched_int_xlate(unsigned int); | 351 | extern unsigned int plat_ipi_resched_int_xlate(unsigned int); |
352 | extern void gic_bind_eic_interrupt(int irq, int set); | ||
353 | extern unsigned int gic_get_timer_pending(void); | ||
341 | 354 | ||
342 | #endif /* _ASM_GICREGS_H */ | 355 | #endif /* _ASM_GICREGS_H */ |
diff --git a/arch/mips/include/asm/inst.h b/arch/mips/include/asm/inst.h index 7ebfc392e58d..ab84064283db 100644 --- a/arch/mips/include/asm/inst.h +++ b/arch/mips/include/asm/inst.h | |||
@@ -251,7 +251,7 @@ struct f_format { /* FPU register format */ | |||
251 | unsigned int func : 6; | 251 | unsigned int func : 6; |
252 | }; | 252 | }; |
253 | 253 | ||
254 | struct ma_format { /* FPU multipy and add format (MIPS IV) */ | 254 | struct ma_format { /* FPU multiply and add format (MIPS IV) */ |
255 | unsigned int opcode : 6; | 255 | unsigned int opcode : 6; |
256 | unsigned int fr : 5; | 256 | unsigned int fr : 5; |
257 | unsigned int ft : 5; | 257 | unsigned int ft : 5; |
@@ -324,7 +324,7 @@ struct f_format { /* FPU register format */ | |||
324 | unsigned int opcode : 6; | 324 | unsigned int opcode : 6; |
325 | }; | 325 | }; |
326 | 326 | ||
327 | struct ma_format { /* FPU multipy and add format (MIPS IV) */ | 327 | struct ma_format { /* FPU multiply and add format (MIPS IV) */ |
328 | unsigned int fmt : 2; | 328 | unsigned int fmt : 2; |
329 | unsigned int func : 4; | 329 | unsigned int func : 4; |
330 | unsigned int fd : 5; | 330 | unsigned int fd : 5; |
diff --git a/arch/mips/include/asm/io.h b/arch/mips/include/asm/io.h index a58f22998a86..29d9c23c20c7 100644 --- a/arch/mips/include/asm/io.h +++ b/arch/mips/include/asm/io.h | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/types.h> | 17 | #include <linux/types.h> |
18 | 18 | ||
19 | #include <asm/addrspace.h> | 19 | #include <asm/addrspace.h> |
20 | #include <asm/bug.h> | ||
20 | #include <asm/byteorder.h> | 21 | #include <asm/byteorder.h> |
21 | #include <asm/cpu.h> | 22 | #include <asm/cpu.h> |
22 | #include <asm/cpu-features.h> | 23 | #include <asm/cpu-features.h> |
diff --git a/arch/mips/include/asm/irq.h b/arch/mips/include/asm/irq.h index fb698dc09bc9..78dbb8a86da2 100644 --- a/arch/mips/include/asm/irq.h +++ b/arch/mips/include/asm/irq.h | |||
@@ -136,6 +136,7 @@ extern void free_irqno(unsigned int irq); | |||
136 | * IE7. Since R2 their number has to be read from the c0_intctl register. | 136 | * IE7. Since R2 their number has to be read from the c0_intctl register. |
137 | */ | 137 | */ |
138 | #define CP0_LEGACY_COMPARE_IRQ 7 | 138 | #define CP0_LEGACY_COMPARE_IRQ 7 |
139 | #define CP0_LEGACY_PERFCNT_IRQ 7 | ||
139 | 140 | ||
140 | extern int cp0_compare_irq; | 141 | extern int cp0_compare_irq; |
141 | extern int cp0_compare_irq_shift; | 142 | extern int cp0_compare_irq_shift; |
diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h index 94d4faad29a1..fdcd78ca1b03 100644 --- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h | |||
@@ -99,7 +99,7 @@ | |||
99 | #define CKCTL_6368_USBH_CLK_EN (1 << 15) | 99 | #define CKCTL_6368_USBH_CLK_EN (1 << 15) |
100 | #define CKCTL_6368_DISABLE_GLESS_EN (1 << 16) | 100 | #define CKCTL_6368_DISABLE_GLESS_EN (1 << 16) |
101 | #define CKCTL_6368_NAND_CLK_EN (1 << 17) | 101 | #define CKCTL_6368_NAND_CLK_EN (1 << 17) |
102 | #define CKCTL_6368_IPSEC_CLK_EN (1 << 17) | 102 | #define CKCTL_6368_IPSEC_CLK_EN (1 << 18) |
103 | 103 | ||
104 | #define CKCTL_6368_ALL_SAFE_EN (CKCTL_6368_SWPKT_USB_EN | \ | 104 | #define CKCTL_6368_ALL_SAFE_EN (CKCTL_6368_SWPKT_USB_EN | \ |
105 | CKCTL_6368_SWPKT_SAR_EN | \ | 105 | CKCTL_6368_SWPKT_SAR_EN | \ |
diff --git a/arch/mips/include/asm/mips-boards/maltaint.h b/arch/mips/include/asm/mips-boards/maltaint.h index d11aa02a956a..5447d9fc4219 100644 --- a/arch/mips/include/asm/mips-boards/maltaint.h +++ b/arch/mips/include/asm/mips-boards/maltaint.h | |||
@@ -86,6 +86,16 @@ | |||
86 | #define GIC_CPU_INT4 4 /* . */ | 86 | #define GIC_CPU_INT4 4 /* . */ |
87 | #define GIC_CPU_INT5 5 /* Core Interrupt 5 */ | 87 | #define GIC_CPU_INT5 5 /* Core Interrupt 5 */ |
88 | 88 | ||
89 | /* MALTA GIC local interrupts */ | ||
90 | #define GIC_INT_TMR (GIC_CPU_INT5) | ||
91 | #define GIC_INT_PERFCTR (GIC_CPU_INT5) | ||
92 | |||
93 | /* GIC constants */ | ||
94 | /* Add 2 to convert non-eic hw int # to eic vector # */ | ||
95 | #define GIC_CPU_TO_VEC_OFFSET (2) | ||
96 | /* If we map an intr to pin X, GIC will actually generate vector X+1 */ | ||
97 | #define GIC_PIN_TO_VEC_OFFSET (1) | ||
98 | |||
89 | #define GIC_EXT_INTR(x) x | 99 | #define GIC_EXT_INTR(x) x |
90 | 100 | ||
91 | /* External Interrupts used for IPI */ | 101 | /* External Interrupts used for IPI */ |
diff --git a/arch/mips/include/asm/mipsmtregs.h b/arch/mips/include/asm/mipsmtregs.h index c9420aa97e32..e71ff4c317f2 100644 --- a/arch/mips/include/asm/mipsmtregs.h +++ b/arch/mips/include/asm/mipsmtregs.h | |||
@@ -48,7 +48,7 @@ | |||
48 | #define CP0_VPECONF0 $1, 2 | 48 | #define CP0_VPECONF0 $1, 2 |
49 | #define CP0_VPECONF1 $1, 3 | 49 | #define CP0_VPECONF1 $1, 3 |
50 | #define CP0_YQMASK $1, 4 | 50 | #define CP0_YQMASK $1, 4 |
51 | #define CP0_VPESCHEDULE $1, 5 | 51 | #define CP0_VPESCHEDULE $1, 5 |
52 | #define CP0_VPESCHEFBK $1, 6 | 52 | #define CP0_VPESCHEFBK $1, 6 |
53 | #define CP0_TCSTATUS $2, 1 | 53 | #define CP0_TCSTATUS $2, 1 |
54 | #define CP0_TCBIND $2, 2 | 54 | #define CP0_TCBIND $2, 2 |
diff --git a/arch/mips/include/asm/switch_to.h b/arch/mips/include/asm/switch_to.h index 5d33621b5658..4f8ddba8c360 100644 --- a/arch/mips/include/asm/switch_to.h +++ b/arch/mips/include/asm/switch_to.h | |||
@@ -22,7 +22,7 @@ struct task_struct; | |||
22 | * switch_to(n) should switch tasks to task nr n, first | 22 | * switch_to(n) should switch tasks to task nr n, first |
23 | * checking that n isn't the current task, in which case it does nothing. | 23 | * checking that n isn't the current task, in which case it does nothing. |
24 | */ | 24 | */ |
25 | extern asmlinkage void *resume(void *last, void *next, void *next_ti); | 25 | extern asmlinkage void *resume(void *last, void *next, void *next_ti, u32 __usedfpu); |
26 | 26 | ||
27 | extern unsigned int ll_bit; | 27 | extern unsigned int ll_bit; |
28 | extern struct task_struct *ll_task; | 28 | extern struct task_struct *ll_task; |
@@ -66,11 +66,13 @@ do { \ | |||
66 | 66 | ||
67 | #define switch_to(prev, next, last) \ | 67 | #define switch_to(prev, next, last) \ |
68 | do { \ | 68 | do { \ |
69 | u32 __usedfpu; \ | ||
69 | __mips_mt_fpaff_switch_to(prev); \ | 70 | __mips_mt_fpaff_switch_to(prev); \ |
70 | if (cpu_has_dsp) \ | 71 | if (cpu_has_dsp) \ |
71 | __save_dsp(prev); \ | 72 | __save_dsp(prev); \ |
72 | __clear_software_ll_bit(); \ | 73 | __clear_software_ll_bit(); \ |
73 | (last) = resume(prev, next, task_thread_info(next)); \ | 74 | __usedfpu = test_and_clear_tsk_thread_flag(prev, TIF_USEDFPU); \ |
75 | (last) = resume(prev, next, task_thread_info(next), __usedfpu); \ | ||
74 | } while (0) | 76 | } while (0) |
75 | 77 | ||
76 | #define finish_arch_switch(prev) \ | 78 | #define finish_arch_switch(prev) \ |
diff --git a/arch/mips/include/asm/thread_info.h b/arch/mips/include/asm/thread_info.h index e2eca7d10598..ca97e0ecb64b 100644 --- a/arch/mips/include/asm/thread_info.h +++ b/arch/mips/include/asm/thread_info.h | |||
@@ -60,6 +60,8 @@ struct thread_info { | |||
60 | register struct thread_info *__current_thread_info __asm__("$28"); | 60 | register struct thread_info *__current_thread_info __asm__("$28"); |
61 | #define current_thread_info() __current_thread_info | 61 | #define current_thread_info() __current_thread_info |
62 | 62 | ||
63 | #endif /* !__ASSEMBLY__ */ | ||
64 | |||
63 | /* thread information allocation */ | 65 | /* thread information allocation */ |
64 | #if defined(CONFIG_PAGE_SIZE_4KB) && defined(CONFIG_32BIT) | 66 | #if defined(CONFIG_PAGE_SIZE_4KB) && defined(CONFIG_32BIT) |
65 | #define THREAD_SIZE_ORDER (1) | 67 | #define THREAD_SIZE_ORDER (1) |
@@ -85,8 +87,6 @@ register struct thread_info *__current_thread_info __asm__("$28"); | |||
85 | 87 | ||
86 | #define STACK_WARN (THREAD_SIZE / 8) | 88 | #define STACK_WARN (THREAD_SIZE / 8) |
87 | 89 | ||
88 | #endif /* !__ASSEMBLY__ */ | ||
89 | |||
90 | #define PREEMPT_ACTIVE 0x10000000 | 90 | #define PREEMPT_ACTIVE 0x10000000 |
91 | 91 | ||
92 | /* | 92 | /* |
diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c index 6ae7ce4ac63e..f4630e1082ab 100644 --- a/arch/mips/kernel/cpu-probe.c +++ b/arch/mips/kernel/cpu-probe.c | |||
@@ -4,7 +4,7 @@ | |||
4 | * Copyright (C) xxxx the Anonymous | 4 | * Copyright (C) xxxx the Anonymous |
5 | * Copyright (C) 1994 - 2006 Ralf Baechle | 5 | * Copyright (C) 1994 - 2006 Ralf Baechle |
6 | * Copyright (C) 2003, 2004 Maciej W. Rozycki | 6 | * Copyright (C) 2003, 2004 Maciej W. Rozycki |
7 | * Copyright (C) 2001, 2004 MIPS Inc. | 7 | * Copyright (C) 2001, 2004, 2011, 2012 MIPS Technologies, Inc. |
8 | * | 8 | * |
9 | * This program is free software; you can redistribute it and/or | 9 | * This program is free software; you can redistribute it and/or |
10 | * modify it under the terms of the GNU General Public License | 10 | * modify it under the terms of the GNU General Public License |
@@ -199,6 +199,7 @@ void __init check_wait(void) | |||
199 | cpu_wait = rm7k_wait_irqoff; | 199 | cpu_wait = rm7k_wait_irqoff; |
200 | break; | 200 | break; |
201 | 201 | ||
202 | case CPU_M14KC: | ||
202 | case CPU_24K: | 203 | case CPU_24K: |
203 | case CPU_34K: | 204 | case CPU_34K: |
204 | case CPU_1004K: | 205 | case CPU_1004K: |
@@ -810,6 +811,10 @@ static inline void cpu_probe_mips(struct cpuinfo_mips *c, unsigned int cpu) | |||
810 | c->cputype = CPU_5KC; | 811 | c->cputype = CPU_5KC; |
811 | __cpu_name[cpu] = "MIPS 5Kc"; | 812 | __cpu_name[cpu] = "MIPS 5Kc"; |
812 | break; | 813 | break; |
814 | case PRID_IMP_5KE: | ||
815 | c->cputype = CPU_5KE; | ||
816 | __cpu_name[cpu] = "MIPS 5KE"; | ||
817 | break; | ||
813 | case PRID_IMP_20KC: | 818 | case PRID_IMP_20KC: |
814 | c->cputype = CPU_20KC; | 819 | c->cputype = CPU_20KC; |
815 | __cpu_name[cpu] = "MIPS 20Kc"; | 820 | __cpu_name[cpu] = "MIPS 20Kc"; |
@@ -831,6 +836,10 @@ static inline void cpu_probe_mips(struct cpuinfo_mips *c, unsigned int cpu) | |||
831 | c->cputype = CPU_74K; | 836 | c->cputype = CPU_74K; |
832 | __cpu_name[cpu] = "MIPS 74Kc"; | 837 | __cpu_name[cpu] = "MIPS 74Kc"; |
833 | break; | 838 | break; |
839 | case PRID_IMP_M14KC: | ||
840 | c->cputype = CPU_M14KC; | ||
841 | __cpu_name[cpu] = "MIPS M14Kc"; | ||
842 | break; | ||
834 | case PRID_IMP_1004K: | 843 | case PRID_IMP_1004K: |
835 | c->cputype = CPU_1004K; | 844 | c->cputype = CPU_1004K; |
836 | __cpu_name[cpu] = "MIPS 1004Kc"; | 845 | __cpu_name[cpu] = "MIPS 1004Kc"; |
diff --git a/arch/mips/kernel/mips_ksyms.c b/arch/mips/kernel/mips_ksyms.c index 57ba13edb03a..3fc1691110dc 100644 --- a/arch/mips/kernel/mips_ksyms.c +++ b/arch/mips/kernel/mips_ksyms.c | |||
@@ -5,7 +5,7 @@ | |||
5 | * License. See the file "COPYING" in the main directory of this archive | 5 | * License. See the file "COPYING" in the main directory of this archive |
6 | * for more details. | 6 | * for more details. |
7 | * | 7 | * |
8 | * Copyright (C) 1996, 97, 98, 99, 2000, 01, 03, 04, 05 by Ralf Baechle | 8 | * Copyright (C) 1996, 97, 98, 99, 2000, 01, 03, 04, 05, 12 by Ralf Baechle |
9 | * Copyright (C) 1999, 2000, 01 Silicon Graphics, Inc. | 9 | * Copyright (C) 1999, 2000, 01 Silicon Graphics, Inc. |
10 | */ | 10 | */ |
11 | #include <linux/interrupt.h> | 11 | #include <linux/interrupt.h> |
@@ -35,6 +35,12 @@ EXPORT_SYMBOL(memmove); | |||
35 | EXPORT_SYMBOL(kernel_thread); | 35 | EXPORT_SYMBOL(kernel_thread); |
36 | 36 | ||
37 | /* | 37 | /* |
38 | * Functions that operate on entire pages. Mostly used by memory management. | ||
39 | */ | ||
40 | EXPORT_SYMBOL(clear_page); | ||
41 | EXPORT_SYMBOL(copy_page); | ||
42 | |||
43 | /* | ||
38 | * Userspace access stuff. | 44 | * Userspace access stuff. |
39 | */ | 45 | */ |
40 | EXPORT_SYMBOL(__copy_user); | 46 | EXPORT_SYMBOL(__copy_user); |
diff --git a/arch/mips/kernel/octeon_switch.S b/arch/mips/kernel/octeon_switch.S index ce89c8061708..0441f54b2a6a 100644 --- a/arch/mips/kernel/octeon_switch.S +++ b/arch/mips/kernel/octeon_switch.S | |||
@@ -31,7 +31,7 @@ | |||
31 | 31 | ||
32 | /* | 32 | /* |
33 | * task_struct *resume(task_struct *prev, task_struct *next, | 33 | * task_struct *resume(task_struct *prev, task_struct *next, |
34 | * struct thread_info *next_ti) | 34 | * struct thread_info *next_ti, int usedfpu) |
35 | */ | 35 | */ |
36 | .align 7 | 36 | .align 7 |
37 | LEAF(resume) | 37 | LEAF(resume) |
diff --git a/arch/mips/kernel/perf_event_mipsxx.c b/arch/mips/kernel/perf_event_mipsxx.c index f29099b104c4..eb5e394a4650 100644 --- a/arch/mips/kernel/perf_event_mipsxx.c +++ b/arch/mips/kernel/perf_event_mipsxx.c | |||
@@ -162,11 +162,6 @@ static unsigned int counters_total_to_per_cpu(unsigned int counters) | |||
162 | return counters >> vpe_shift(); | 162 | return counters >> vpe_shift(); |
163 | } | 163 | } |
164 | 164 | ||
165 | static unsigned int counters_per_cpu_to_total(unsigned int counters) | ||
166 | { | ||
167 | return counters << vpe_shift(); | ||
168 | } | ||
169 | |||
170 | #else /* !CONFIG_MIPS_MT_SMP */ | 165 | #else /* !CONFIG_MIPS_MT_SMP */ |
171 | #define vpe_id() 0 | 166 | #define vpe_id() 0 |
172 | 167 | ||
diff --git a/arch/mips/kernel/r2300_switch.S b/arch/mips/kernel/r2300_switch.S index 293898391e67..9c51be5a163a 100644 --- a/arch/mips/kernel/r2300_switch.S +++ b/arch/mips/kernel/r2300_switch.S | |||
@@ -43,7 +43,7 @@ | |||
43 | 43 | ||
44 | /* | 44 | /* |
45 | * task_struct *resume(task_struct *prev, task_struct *next, | 45 | * task_struct *resume(task_struct *prev, task_struct *next, |
46 | * struct thread_info *next_ti) ) | 46 | * struct thread_info *next_ti, int usedfpu) |
47 | */ | 47 | */ |
48 | LEAF(resume) | 48 | LEAF(resume) |
49 | mfc0 t1, CP0_STATUS | 49 | mfc0 t1, CP0_STATUS |
@@ -51,18 +51,9 @@ LEAF(resume) | |||
51 | cpu_save_nonscratch a0 | 51 | cpu_save_nonscratch a0 |
52 | sw ra, THREAD_REG31(a0) | 52 | sw ra, THREAD_REG31(a0) |
53 | 53 | ||
54 | /* | 54 | beqz a3, 1f |
55 | * check if we need to save FPU registers | ||
56 | */ | ||
57 | lw t3, TASK_THREAD_INFO(a0) | ||
58 | lw t0, TI_FLAGS(t3) | ||
59 | li t1, _TIF_USEDFPU | ||
60 | and t2, t0, t1 | ||
61 | beqz t2, 1f | ||
62 | nor t1, zero, t1 | ||
63 | 55 | ||
64 | and t0, t0, t1 | 56 | PTR_L t3, TASK_THREAD_INFO(a0) |
65 | sw t0, TI_FLAGS(t3) | ||
66 | 57 | ||
67 | /* | 58 | /* |
68 | * clear saved user stack CU1 bit | 59 | * clear saved user stack CU1 bit |
diff --git a/arch/mips/kernel/r4k_switch.S b/arch/mips/kernel/r4k_switch.S index 9414f9354469..42d2a3938420 100644 --- a/arch/mips/kernel/r4k_switch.S +++ b/arch/mips/kernel/r4k_switch.S | |||
@@ -41,7 +41,7 @@ | |||
41 | 41 | ||
42 | /* | 42 | /* |
43 | * task_struct *resume(task_struct *prev, task_struct *next, | 43 | * task_struct *resume(task_struct *prev, task_struct *next, |
44 | * struct thread_info *next_ti) | 44 | * struct thread_info *next_ti, int usedfpu) |
45 | */ | 45 | */ |
46 | .align 5 | 46 | .align 5 |
47 | LEAF(resume) | 47 | LEAF(resume) |
@@ -53,16 +53,10 @@ | |||
53 | /* | 53 | /* |
54 | * check if we need to save FPU registers | 54 | * check if we need to save FPU registers |
55 | */ | 55 | */ |
56 | PTR_L t3, TASK_THREAD_INFO(a0) | ||
57 | LONG_L t0, TI_FLAGS(t3) | ||
58 | li t1, _TIF_USEDFPU | ||
59 | and t2, t0, t1 | ||
60 | beqz t2, 1f | ||
61 | nor t1, zero, t1 | ||
62 | 56 | ||
63 | and t0, t0, t1 | 57 | beqz a3, 1f |
64 | LONG_S t0, TI_FLAGS(t3) | ||
65 | 58 | ||
59 | PTR_L t3, TASK_THREAD_INFO(a0) | ||
66 | /* | 60 | /* |
67 | * clear saved user stack CU1 bit | 61 | * clear saved user stack CU1 bit |
68 | */ | 62 | */ |
diff --git a/arch/mips/kernel/smp-bmips.c b/arch/mips/kernel/smp-bmips.c index 3046e2986006..8e393b8443f7 100644 --- a/arch/mips/kernel/smp-bmips.c +++ b/arch/mips/kernel/smp-bmips.c | |||
@@ -15,7 +15,6 @@ | |||
15 | #include <linux/smp.h> | 15 | #include <linux/smp.h> |
16 | #include <linux/interrupt.h> | 16 | #include <linux/interrupt.h> |
17 | #include <linux/spinlock.h> | 17 | #include <linux/spinlock.h> |
18 | #include <linux/init.h> | ||
19 | #include <linux/cpu.h> | 18 | #include <linux/cpu.h> |
20 | #include <linux/cpumask.h> | 19 | #include <linux/cpumask.h> |
21 | #include <linux/reboot.h> | 20 | #include <linux/reboot.h> |
@@ -197,13 +196,6 @@ static void bmips_init_secondary(void) | |||
197 | 196 | ||
198 | write_c0_brcm_action(ACTION_CLR_IPI(smp_processor_id(), 0)); | 197 | write_c0_brcm_action(ACTION_CLR_IPI(smp_processor_id(), 0)); |
199 | #endif | 198 | #endif |
200 | |||
201 | /* make sure there won't be a timer interrupt for a little while */ | ||
202 | write_c0_compare(read_c0_count() + mips_hpt_frequency / HZ); | ||
203 | |||
204 | irq_enable_hazard(); | ||
205 | set_c0_status(IE_SW0 | IE_SW1 | IE_IRQ1 | IE_IRQ5 | ST0_IE); | ||
206 | irq_enable_hazard(); | ||
207 | } | 199 | } |
208 | 200 | ||
209 | /* | 201 | /* |
@@ -212,6 +204,13 @@ static void bmips_init_secondary(void) | |||
212 | static void bmips_smp_finish(void) | 204 | static void bmips_smp_finish(void) |
213 | { | 205 | { |
214 | pr_info("SMP: CPU%d is running\n", smp_processor_id()); | 206 | pr_info("SMP: CPU%d is running\n", smp_processor_id()); |
207 | |||
208 | /* make sure there won't be a timer interrupt for a little while */ | ||
209 | write_c0_compare(read_c0_count() + mips_hpt_frequency / HZ); | ||
210 | |||
211 | irq_enable_hazard(); | ||
212 | set_c0_status(IE_SW0 | IE_SW1 | IE_IRQ1 | IE_IRQ5 | ST0_IE); | ||
213 | irq_enable_hazard(); | ||
215 | } | 214 | } |
216 | 215 | ||
217 | /* | 216 | /* |
diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c index 48650c818040..1268392f1d27 100644 --- a/arch/mips/kernel/smp.c +++ b/arch/mips/kernel/smp.c | |||
@@ -122,13 +122,21 @@ asmlinkage __cpuinit void start_secondary(void) | |||
122 | 122 | ||
123 | notify_cpu_starting(cpu); | 123 | notify_cpu_starting(cpu); |
124 | 124 | ||
125 | mp_ops->smp_finish(); | 125 | set_cpu_online(cpu, true); |
126 | |||
126 | set_cpu_sibling_map(cpu); | 127 | set_cpu_sibling_map(cpu); |
127 | 128 | ||
128 | cpu_set(cpu, cpu_callin_map); | 129 | cpu_set(cpu, cpu_callin_map); |
129 | 130 | ||
130 | synchronise_count_slave(); | 131 | synchronise_count_slave(); |
131 | 132 | ||
133 | /* | ||
134 | * irq will be enabled in ->smp_finish(), enabling it too early | ||
135 | * is dangerous. | ||
136 | */ | ||
137 | WARN_ON_ONCE(!irqs_disabled()); | ||
138 | mp_ops->smp_finish(); | ||
139 | |||
132 | cpu_idle(); | 140 | cpu_idle(); |
133 | } | 141 | } |
134 | 142 | ||
@@ -196,8 +204,6 @@ int __cpuinit __cpu_up(unsigned int cpu, struct task_struct *tidle) | |||
196 | while (!cpu_isset(cpu, cpu_callin_map)) | 204 | while (!cpu_isset(cpu, cpu_callin_map)) |
197 | udelay(100); | 205 | udelay(100); |
198 | 206 | ||
199 | set_cpu_online(cpu, true); | ||
200 | |||
201 | return 0; | 207 | return 0; |
202 | } | 208 | } |
203 | 209 | ||
diff --git a/arch/mips/kernel/smtc.c b/arch/mips/kernel/smtc.c index f5dd38f1d015..15b5f3cfd20c 100644 --- a/arch/mips/kernel/smtc.c +++ b/arch/mips/kernel/smtc.c | |||
@@ -322,7 +322,7 @@ int __init smtc_build_cpu_map(int start_cpu_slot) | |||
322 | 322 | ||
323 | /* | 323 | /* |
324 | * Common setup before any secondaries are started | 324 | * Common setup before any secondaries are started |
325 | * Make sure all CPU's are in a sensible state before we boot any of the | 325 | * Make sure all CPUs are in a sensible state before we boot any of the |
326 | * secondaries. | 326 | * secondaries. |
327 | * | 327 | * |
328 | * For MIPS MT "SMTC" operation, we set up all TCs, spread as evenly | 328 | * For MIPS MT "SMTC" operation, we set up all TCs, spread as evenly |
@@ -340,12 +340,12 @@ static void smtc_tc_setup(int vpe, int tc, int cpu) | |||
340 | /* | 340 | /* |
341 | * TCContext gets an offset from the base of the IPIQ array | 341 | * TCContext gets an offset from the base of the IPIQ array |
342 | * to be used in low-level code to detect the presence of | 342 | * to be used in low-level code to detect the presence of |
343 | * an active IPI queue | 343 | * an active IPI queue. |
344 | */ | 344 | */ |
345 | write_tc_c0_tccontext((sizeof(struct smtc_ipi_q) * cpu) << 16); | 345 | write_tc_c0_tccontext((sizeof(struct smtc_ipi_q) * cpu) << 16); |
346 | /* Bind tc to vpe */ | 346 | /* Bind tc to vpe */ |
347 | write_tc_c0_tcbind(vpe); | 347 | write_tc_c0_tcbind(vpe); |
348 | /* In general, all TCs should have the same cpu_data indications */ | 348 | /* In general, all TCs should have the same cpu_data indications. */ |
349 | memcpy(&cpu_data[cpu], &cpu_data[0], sizeof(struct cpuinfo_mips)); | 349 | memcpy(&cpu_data[cpu], &cpu_data[0], sizeof(struct cpuinfo_mips)); |
350 | /* For 34Kf, start with TC/CPU 0 as sole owner of single FPU context */ | 350 | /* For 34Kf, start with TC/CPU 0 as sole owner of single FPU context */ |
351 | if (cpu_data[0].cputype == CPU_34K || | 351 | if (cpu_data[0].cputype == CPU_34K || |
@@ -358,8 +358,8 @@ static void smtc_tc_setup(int vpe, int tc, int cpu) | |||
358 | } | 358 | } |
359 | 359 | ||
360 | /* | 360 | /* |
361 | * Tweak to get Count registes in as close a sync as possible. | 361 | * Tweak to get Count registes in as close a sync as possible. The |
362 | * Value seems good for 34K-class cores. | 362 | * value seems good for 34K-class cores. |
363 | */ | 363 | */ |
364 | 364 | ||
365 | #define CP0_SKEW 8 | 365 | #define CP0_SKEW 8 |
@@ -615,7 +615,6 @@ void __cpuinit smtc_boot_secondary(int cpu, struct task_struct *idle) | |||
615 | 615 | ||
616 | void smtc_init_secondary(void) | 616 | void smtc_init_secondary(void) |
617 | { | 617 | { |
618 | local_irq_enable(); | ||
619 | } | 618 | } |
620 | 619 | ||
621 | void smtc_smp_finish(void) | 620 | void smtc_smp_finish(void) |
@@ -631,6 +630,8 @@ void smtc_smp_finish(void) | |||
631 | if (cpu > 0 && (cpu_data[cpu].vpe_id != cpu_data[cpu - 1].vpe_id)) | 630 | if (cpu > 0 && (cpu_data[cpu].vpe_id != cpu_data[cpu - 1].vpe_id)) |
632 | write_c0_compare(read_c0_count() + mips_hpt_frequency/HZ); | 631 | write_c0_compare(read_c0_count() + mips_hpt_frequency/HZ); |
633 | 632 | ||
633 | local_irq_enable(); | ||
634 | |||
634 | printk("TC %d going on-line as CPU %d\n", | 635 | printk("TC %d going on-line as CPU %d\n", |
635 | cpu_data[smp_processor_id()].tc_id, smp_processor_id()); | 636 | cpu_data[smp_processor_id()].tc_id, smp_processor_id()); |
636 | } | 637 | } |
diff --git a/arch/mips/kernel/sync-r4k.c b/arch/mips/kernel/sync-r4k.c index 99f913c8d7a6..842d55e411fd 100644 --- a/arch/mips/kernel/sync-r4k.c +++ b/arch/mips/kernel/sync-r4k.c | |||
@@ -111,7 +111,6 @@ void __cpuinit synchronise_count_master(void) | |||
111 | void __cpuinit synchronise_count_slave(void) | 111 | void __cpuinit synchronise_count_slave(void) |
112 | { | 112 | { |
113 | int i; | 113 | int i; |
114 | unsigned long flags; | ||
115 | unsigned int initcount; | 114 | unsigned int initcount; |
116 | int ncpus; | 115 | int ncpus; |
117 | 116 | ||
@@ -123,8 +122,6 @@ void __cpuinit synchronise_count_slave(void) | |||
123 | return; | 122 | return; |
124 | #endif | 123 | #endif |
125 | 124 | ||
126 | local_irq_save(flags); | ||
127 | |||
128 | /* | 125 | /* |
129 | * Not every cpu is online at the time this gets called, | 126 | * Not every cpu is online at the time this gets called, |
130 | * so we first wait for the master to say everyone is ready | 127 | * so we first wait for the master to say everyone is ready |
@@ -154,7 +151,5 @@ void __cpuinit synchronise_count_slave(void) | |||
154 | } | 151 | } |
155 | /* Arrange for an interrupt in a short while */ | 152 | /* Arrange for an interrupt in a short while */ |
156 | write_c0_compare(read_c0_count() + COUNTON); | 153 | write_c0_compare(read_c0_count() + COUNTON); |
157 | |||
158 | local_irq_restore(flags); | ||
159 | } | 154 | } |
160 | #undef NR_LOOPS | 155 | #undef NR_LOOPS |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index 2d0c2a277f52..c3c293543703 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
@@ -132,6 +132,9 @@ static void show_backtrace(struct task_struct *task, const struct pt_regs *regs) | |||
132 | unsigned long ra = regs->regs[31]; | 132 | unsigned long ra = regs->regs[31]; |
133 | unsigned long pc = regs->cp0_epc; | 133 | unsigned long pc = regs->cp0_epc; |
134 | 134 | ||
135 | if (!task) | ||
136 | task = current; | ||
137 | |||
135 | if (raw_show_trace || !__kernel_text_address(pc)) { | 138 | if (raw_show_trace || !__kernel_text_address(pc)) { |
136 | show_raw_backtrace(sp); | 139 | show_raw_backtrace(sp); |
137 | return; | 140 | return; |
@@ -1249,6 +1252,7 @@ static inline void parity_protection_init(void) | |||
1249 | break; | 1252 | break; |
1250 | 1253 | ||
1251 | case CPU_5KC: | 1254 | case CPU_5KC: |
1255 | case CPU_5KE: | ||
1252 | write_c0_ecc(0x80000000); | 1256 | write_c0_ecc(0x80000000); |
1253 | back_to_back_c0_hazard(); | 1257 | back_to_back_c0_hazard(); |
1254 | /* Set the PE bit (bit 31) in the c0_errctl register. */ | 1258 | /* Set the PE bit (bit 31) in the c0_errctl register. */ |
@@ -1498,6 +1502,7 @@ extern void flush_tlb_handlers(void); | |||
1498 | * Timer interrupt | 1502 | * Timer interrupt |
1499 | */ | 1503 | */ |
1500 | int cp0_compare_irq; | 1504 | int cp0_compare_irq; |
1505 | EXPORT_SYMBOL_GPL(cp0_compare_irq); | ||
1501 | int cp0_compare_irq_shift; | 1506 | int cp0_compare_irq_shift; |
1502 | 1507 | ||
1503 | /* | 1508 | /* |
@@ -1597,7 +1602,7 @@ void __cpuinit per_cpu_trap_init(bool is_boot_cpu) | |||
1597 | cp0_perfcount_irq = -1; | 1602 | cp0_perfcount_irq = -1; |
1598 | } else { | 1603 | } else { |
1599 | cp0_compare_irq = CP0_LEGACY_COMPARE_IRQ; | 1604 | cp0_compare_irq = CP0_LEGACY_COMPARE_IRQ; |
1600 | cp0_compare_irq_shift = cp0_compare_irq; | 1605 | cp0_compare_irq_shift = CP0_LEGACY_PERFCNT_IRQ; |
1601 | cp0_perfcount_irq = -1; | 1606 | cp0_perfcount_irq = -1; |
1602 | } | 1607 | } |
1603 | 1608 | ||
diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S index 924da5eb7031..df243a64f430 100644 --- a/arch/mips/kernel/vmlinux.lds.S +++ b/arch/mips/kernel/vmlinux.lds.S | |||
@@ -1,5 +1,6 @@ | |||
1 | #include <asm/asm-offsets.h> | 1 | #include <asm/asm-offsets.h> |
2 | #include <asm/page.h> | 2 | #include <asm/page.h> |
3 | #include <asm/thread_info.h> | ||
3 | #include <asm-generic/vmlinux.lds.h> | 4 | #include <asm-generic/vmlinux.lds.h> |
4 | 5 | ||
5 | #undef mips | 6 | #undef mips |
@@ -72,7 +73,7 @@ SECTIONS | |||
72 | .data : { /* Data */ | 73 | .data : { /* Data */ |
73 | . = . + DATAOFFSET; /* for CONFIG_MAPPED_KERNEL */ | 74 | . = . + DATAOFFSET; /* for CONFIG_MAPPED_KERNEL */ |
74 | 75 | ||
75 | INIT_TASK_DATA(PAGE_SIZE) | 76 | INIT_TASK_DATA(THREAD_SIZE) |
76 | NOSAVE_DATA | 77 | NOSAVE_DATA |
77 | CACHELINE_ALIGNED_DATA(1 << CONFIG_MIPS_L1_CACHE_SHIFT) | 78 | CACHELINE_ALIGNED_DATA(1 << CONFIG_MIPS_L1_CACHE_SHIFT) |
78 | READ_MOSTLY_DATA(1 << CONFIG_MIPS_L1_CACHE_SHIFT) | 79 | READ_MOSTLY_DATA(1 << CONFIG_MIPS_L1_CACHE_SHIFT) |
diff --git a/arch/mips/mm/Makefile b/arch/mips/mm/Makefile index 4aa20280613e..fd6203f14f1f 100644 --- a/arch/mips/mm/Makefile +++ b/arch/mips/mm/Makefile | |||
@@ -3,8 +3,8 @@ | |||
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y += cache.o dma-default.o extable.o fault.o \ | 5 | obj-y += cache.o dma-default.o extable.o fault.o \ |
6 | gup.o init.o mmap.o page.o tlbex.o \ | 6 | gup.o init.o mmap.o page.o page-funcs.o \ |
7 | tlbex-fault.o uasm.o | 7 | tlbex.o tlbex-fault.o uasm.o |
8 | 8 | ||
9 | obj-$(CONFIG_32BIT) += ioremap.o pgtable-32.o | 9 | obj-$(CONFIG_32BIT) += ioremap.o pgtable-32.o |
10 | obj-$(CONFIG_64BIT) += pgtable-64.o | 10 | obj-$(CONFIG_64BIT) += pgtable-64.o |
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c index 5109be96d98d..f092c265dc63 100644 --- a/arch/mips/mm/c-r4k.c +++ b/arch/mips/mm/c-r4k.c | |||
@@ -977,7 +977,7 @@ static void __cpuinit probe_pcache(void) | |||
977 | c->icache.linesz = 2 << lsize; | 977 | c->icache.linesz = 2 << lsize; |
978 | else | 978 | else |
979 | c->icache.linesz = lsize; | 979 | c->icache.linesz = lsize; |
980 | c->icache.sets = 64 << ((config1 >> 22) & 7); | 980 | c->icache.sets = 32 << (((config1 >> 22) + 1) & 7); |
981 | c->icache.ways = 1 + ((config1 >> 16) & 7); | 981 | c->icache.ways = 1 + ((config1 >> 16) & 7); |
982 | 982 | ||
983 | icache_size = c->icache.sets * | 983 | icache_size = c->icache.sets * |
@@ -997,7 +997,7 @@ static void __cpuinit probe_pcache(void) | |||
997 | c->dcache.linesz = 2 << lsize; | 997 | c->dcache.linesz = 2 << lsize; |
998 | else | 998 | else |
999 | c->dcache.linesz= lsize; | 999 | c->dcache.linesz= lsize; |
1000 | c->dcache.sets = 64 << ((config1 >> 13) & 7); | 1000 | c->dcache.sets = 32 << (((config1 >> 13) + 1) & 7); |
1001 | c->dcache.ways = 1 + ((config1 >> 7) & 7); | 1001 | c->dcache.ways = 1 + ((config1 >> 7) & 7); |
1002 | 1002 | ||
1003 | dcache_size = c->dcache.sets * | 1003 | dcache_size = c->dcache.sets * |
@@ -1051,6 +1051,7 @@ static void __cpuinit probe_pcache(void) | |||
1051 | case CPU_R14000: | 1051 | case CPU_R14000: |
1052 | break; | 1052 | break; |
1053 | 1053 | ||
1054 | case CPU_M14KC: | ||
1054 | case CPU_24K: | 1055 | case CPU_24K: |
1055 | case CPU_34K: | 1056 | case CPU_34K: |
1056 | case CPU_74K: | 1057 | case CPU_74K: |
diff --git a/arch/mips/mm/page-funcs.S b/arch/mips/mm/page-funcs.S new file mode 100644 index 000000000000..48a6b38ff13e --- /dev/null +++ b/arch/mips/mm/page-funcs.S | |||
@@ -0,0 +1,50 @@ | |||
1 | /* | ||
2 | * This file is subject to the terms and conditions of the GNU General Public | ||
3 | * License. See the file "COPYING" in the main directory of this archive | ||
4 | * for more details. | ||
5 | * | ||
6 | * Micro-assembler generated clear_page/copy_page functions. | ||
7 | * | ||
8 | * Copyright (C) 2012 MIPS Technologies, Inc. | ||
9 | * Copyright (C) 2012 Ralf Baechle <ralf@linux-mips.org> | ||
10 | */ | ||
11 | #include <asm/asm.h> | ||
12 | #include <asm/regdef.h> | ||
13 | |||
14 | #ifdef CONFIG_SIBYTE_DMA_PAGEOPS | ||
15 | #define cpu_clear_page_function_name clear_page_cpu | ||
16 | #define cpu_copy_page_function_name copy_page_cpu | ||
17 | #else | ||
18 | #define cpu_clear_page_function_name clear_page | ||
19 | #define cpu_copy_page_function_name copy_page | ||
20 | #endif | ||
21 | |||
22 | /* | ||
23 | * Maximum sizes: | ||
24 | * | ||
25 | * R4000 128 bytes S-cache: 0x058 bytes | ||
26 | * R4600 v1.7: 0x05c bytes | ||
27 | * R4600 v2.0: 0x060 bytes | ||
28 | * With prefetching, 16 word strides 0x120 bytes | ||
29 | */ | ||
30 | EXPORT(__clear_page_start) | ||
31 | LEAF(cpu_clear_page_function_name) | ||
32 | 1: j 1b /* Dummy, will be replaced. */ | ||
33 | .space 288 | ||
34 | END(cpu_clear_page_function_name) | ||
35 | EXPORT(__clear_page_end) | ||
36 | |||
37 | /* | ||
38 | * Maximum sizes: | ||
39 | * | ||
40 | * R4000 128 bytes S-cache: 0x11c bytes | ||
41 | * R4600 v1.7: 0x080 bytes | ||
42 | * R4600 v2.0: 0x07c bytes | ||
43 | * With prefetching, 16 word strides 0x540 bytes | ||
44 | */ | ||
45 | EXPORT(__copy_page_start) | ||
46 | LEAF(cpu_copy_page_function_name) | ||
47 | 1: j 1b /* Dummy, will be replaced. */ | ||
48 | .space 1344 | ||
49 | END(cpu_copy_page_function_name) | ||
50 | EXPORT(__copy_page_end) | ||
diff --git a/arch/mips/mm/page.c b/arch/mips/mm/page.c index cc0b626858b3..98f530e18216 100644 --- a/arch/mips/mm/page.c +++ b/arch/mips/mm/page.c | |||
@@ -6,6 +6,7 @@ | |||
6 | * Copyright (C) 2003, 04, 05 Ralf Baechle (ralf@linux-mips.org) | 6 | * Copyright (C) 2003, 04, 05 Ralf Baechle (ralf@linux-mips.org) |
7 | * Copyright (C) 2007 Maciej W. Rozycki | 7 | * Copyright (C) 2007 Maciej W. Rozycki |
8 | * Copyright (C) 2008 Thiemo Seufer | 8 | * Copyright (C) 2008 Thiemo Seufer |
9 | * Copyright (C) 2012 MIPS Technologies, Inc. | ||
9 | */ | 10 | */ |
10 | #include <linux/init.h> | 11 | #include <linux/init.h> |
11 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
@@ -71,45 +72,6 @@ static struct uasm_reloc __cpuinitdata relocs[5]; | |||
71 | #define cpu_is_r4600_v1_x() ((read_c0_prid() & 0xfffffff0) == 0x00002010) | 72 | #define cpu_is_r4600_v1_x() ((read_c0_prid() & 0xfffffff0) == 0x00002010) |
72 | #define cpu_is_r4600_v2_x() ((read_c0_prid() & 0xfffffff0) == 0x00002020) | 73 | #define cpu_is_r4600_v2_x() ((read_c0_prid() & 0xfffffff0) == 0x00002020) |
73 | 74 | ||
74 | /* | ||
75 | * Maximum sizes: | ||
76 | * | ||
77 | * R4000 128 bytes S-cache: 0x058 bytes | ||
78 | * R4600 v1.7: 0x05c bytes | ||
79 | * R4600 v2.0: 0x060 bytes | ||
80 | * With prefetching, 16 word strides 0x120 bytes | ||
81 | */ | ||
82 | |||
83 | static u32 clear_page_array[0x120 / 4]; | ||
84 | |||
85 | #ifdef CONFIG_SIBYTE_DMA_PAGEOPS | ||
86 | void clear_page_cpu(void *page) __attribute__((alias("clear_page_array"))); | ||
87 | #else | ||
88 | void clear_page(void *page) __attribute__((alias("clear_page_array"))); | ||
89 | #endif | ||
90 | |||
91 | EXPORT_SYMBOL(clear_page); | ||
92 | |||
93 | /* | ||
94 | * Maximum sizes: | ||
95 | * | ||
96 | * R4000 128 bytes S-cache: 0x11c bytes | ||
97 | * R4600 v1.7: 0x080 bytes | ||
98 | * R4600 v2.0: 0x07c bytes | ||
99 | * With prefetching, 16 word strides 0x540 bytes | ||
100 | */ | ||
101 | static u32 copy_page_array[0x540 / 4]; | ||
102 | |||
103 | #ifdef CONFIG_SIBYTE_DMA_PAGEOPS | ||
104 | void | ||
105 | copy_page_cpu(void *to, void *from) __attribute__((alias("copy_page_array"))); | ||
106 | #else | ||
107 | void copy_page(void *to, void *from) __attribute__((alias("copy_page_array"))); | ||
108 | #endif | ||
109 | |||
110 | EXPORT_SYMBOL(copy_page); | ||
111 | |||
112 | |||
113 | static int pref_bias_clear_store __cpuinitdata; | 75 | static int pref_bias_clear_store __cpuinitdata; |
114 | static int pref_bias_copy_load __cpuinitdata; | 76 | static int pref_bias_copy_load __cpuinitdata; |
115 | static int pref_bias_copy_store __cpuinitdata; | 77 | static int pref_bias_copy_store __cpuinitdata; |
@@ -282,10 +244,15 @@ static inline void __cpuinit build_clear_pref(u32 **buf, int off) | |||
282 | } | 244 | } |
283 | } | 245 | } |
284 | 246 | ||
247 | extern u32 __clear_page_start; | ||
248 | extern u32 __clear_page_end; | ||
249 | extern u32 __copy_page_start; | ||
250 | extern u32 __copy_page_end; | ||
251 | |||
285 | void __cpuinit build_clear_page(void) | 252 | void __cpuinit build_clear_page(void) |
286 | { | 253 | { |
287 | int off; | 254 | int off; |
288 | u32 *buf = (u32 *)&clear_page_array; | 255 | u32 *buf = &__clear_page_start; |
289 | struct uasm_label *l = labels; | 256 | struct uasm_label *l = labels; |
290 | struct uasm_reloc *r = relocs; | 257 | struct uasm_reloc *r = relocs; |
291 | int i; | 258 | int i; |
@@ -356,17 +323,17 @@ void __cpuinit build_clear_page(void) | |||
356 | uasm_i_jr(&buf, RA); | 323 | uasm_i_jr(&buf, RA); |
357 | uasm_i_nop(&buf); | 324 | uasm_i_nop(&buf); |
358 | 325 | ||
359 | BUG_ON(buf > clear_page_array + ARRAY_SIZE(clear_page_array)); | 326 | BUG_ON(buf > &__clear_page_end); |
360 | 327 | ||
361 | uasm_resolve_relocs(relocs, labels); | 328 | uasm_resolve_relocs(relocs, labels); |
362 | 329 | ||
363 | pr_debug("Synthesized clear page handler (%u instructions).\n", | 330 | pr_debug("Synthesized clear page handler (%u instructions).\n", |
364 | (u32)(buf - clear_page_array)); | 331 | (u32)(buf - &__clear_page_start)); |
365 | 332 | ||
366 | pr_debug("\t.set push\n"); | 333 | pr_debug("\t.set push\n"); |
367 | pr_debug("\t.set noreorder\n"); | 334 | pr_debug("\t.set noreorder\n"); |
368 | for (i = 0; i < (buf - clear_page_array); i++) | 335 | for (i = 0; i < (buf - &__clear_page_start); i++) |
369 | pr_debug("\t.word 0x%08x\n", clear_page_array[i]); | 336 | pr_debug("\t.word 0x%08x\n", (&__clear_page_start)[i]); |
370 | pr_debug("\t.set pop\n"); | 337 | pr_debug("\t.set pop\n"); |
371 | } | 338 | } |
372 | 339 | ||
@@ -427,7 +394,7 @@ static inline void build_copy_store_pref(u32 **buf, int off) | |||
427 | void __cpuinit build_copy_page(void) | 394 | void __cpuinit build_copy_page(void) |
428 | { | 395 | { |
429 | int off; | 396 | int off; |
430 | u32 *buf = (u32 *)©_page_array; | 397 | u32 *buf = &__copy_page_start; |
431 | struct uasm_label *l = labels; | 398 | struct uasm_label *l = labels; |
432 | struct uasm_reloc *r = relocs; | 399 | struct uasm_reloc *r = relocs; |
433 | int i; | 400 | int i; |
@@ -595,21 +562,23 @@ void __cpuinit build_copy_page(void) | |||
595 | uasm_i_jr(&buf, RA); | 562 | uasm_i_jr(&buf, RA); |
596 | uasm_i_nop(&buf); | 563 | uasm_i_nop(&buf); |
597 | 564 | ||
598 | BUG_ON(buf > copy_page_array + ARRAY_SIZE(copy_page_array)); | 565 | BUG_ON(buf > &__copy_page_end); |
599 | 566 | ||
600 | uasm_resolve_relocs(relocs, labels); | 567 | uasm_resolve_relocs(relocs, labels); |
601 | 568 | ||
602 | pr_debug("Synthesized copy page handler (%u instructions).\n", | 569 | pr_debug("Synthesized copy page handler (%u instructions).\n", |
603 | (u32)(buf - copy_page_array)); | 570 | (u32)(buf - &__copy_page_start)); |
604 | 571 | ||
605 | pr_debug("\t.set push\n"); | 572 | pr_debug("\t.set push\n"); |
606 | pr_debug("\t.set noreorder\n"); | 573 | pr_debug("\t.set noreorder\n"); |
607 | for (i = 0; i < (buf - copy_page_array); i++) | 574 | for (i = 0; i < (buf - &__copy_page_start); i++) |
608 | pr_debug("\t.word 0x%08x\n", copy_page_array[i]); | 575 | pr_debug("\t.word 0x%08x\n", (&__copy_page_start)[i]); |
609 | pr_debug("\t.set pop\n"); | 576 | pr_debug("\t.set pop\n"); |
610 | } | 577 | } |
611 | 578 | ||
612 | #ifdef CONFIG_SIBYTE_DMA_PAGEOPS | 579 | #ifdef CONFIG_SIBYTE_DMA_PAGEOPS |
580 | extern void clear_page_cpu(void *page); | ||
581 | extern void copy_page_cpu(void *to, void *from); | ||
613 | 582 | ||
614 | /* | 583 | /* |
615 | * Pad descriptors to cacheline, since each is exclusively owned by a | 584 | * Pad descriptors to cacheline, since each is exclusively owned by a |
diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c index 0bc485b3cd60..03eb0ef91580 100644 --- a/arch/mips/mm/tlbex.c +++ b/arch/mips/mm/tlbex.c | |||
@@ -9,6 +9,7 @@ | |||
9 | * Copyright (C) 2005, 2007, 2008, 2009 Maciej W. Rozycki | 9 | * Copyright (C) 2005, 2007, 2008, 2009 Maciej W. Rozycki |
10 | * Copyright (C) 2006 Ralf Baechle (ralf@linux-mips.org) | 10 | * Copyright (C) 2006 Ralf Baechle (ralf@linux-mips.org) |
11 | * Copyright (C) 2008, 2009 Cavium Networks, Inc. | 11 | * Copyright (C) 2008, 2009 Cavium Networks, Inc. |
12 | * Copyright (C) 2011 MIPS Technologies, Inc. | ||
12 | * | 13 | * |
13 | * ... and the days got worse and worse and now you see | 14 | * ... and the days got worse and worse and now you see |
14 | * I've gone completly out of my mind. | 15 | * I've gone completly out of my mind. |
@@ -494,6 +495,7 @@ static void __cpuinit build_tlb_write_entry(u32 **p, struct uasm_label **l, | |||
494 | case CPU_R14000: | 495 | case CPU_R14000: |
495 | case CPU_4KC: | 496 | case CPU_4KC: |
496 | case CPU_4KEC: | 497 | case CPU_4KEC: |
498 | case CPU_M14KC: | ||
497 | case CPU_SB1: | 499 | case CPU_SB1: |
498 | case CPU_SB1A: | 500 | case CPU_SB1A: |
499 | case CPU_4KSC: | 501 | case CPU_4KSC: |
diff --git a/arch/mips/mti-malta/malta-pci.c b/arch/mips/mti-malta/malta-pci.c index bf80921f2f56..284dea54faf5 100644 --- a/arch/mips/mti-malta/malta-pci.c +++ b/arch/mips/mti-malta/malta-pci.c | |||
@@ -241,8 +241,9 @@ void __init mips_pcibios_init(void) | |||
241 | return; | 241 | return; |
242 | } | 242 | } |
243 | 243 | ||
244 | if (controller->io_resource->start < 0x00001000UL) /* FIXME */ | 244 | /* Change start address to avoid conflicts with ACPI and SMB devices */ |
245 | controller->io_resource->start = 0x00001000UL; | 245 | if (controller->io_resource->start < 0x00002000UL) |
246 | controller->io_resource->start = 0x00002000UL; | ||
246 | 247 | ||
247 | iomem_resource.end &= 0xfffffffffULL; /* 64 GB */ | 248 | iomem_resource.end &= 0xfffffffffULL; /* 64 GB */ |
248 | ioport_resource.end = controller->io_resource->end; | 249 | ioport_resource.end = controller->io_resource->end; |
@@ -253,7 +254,7 @@ void __init mips_pcibios_init(void) | |||
253 | } | 254 | } |
254 | 255 | ||
255 | /* Enable PCI 2.1 compatibility in PIIX4 */ | 256 | /* Enable PCI 2.1 compatibility in PIIX4 */ |
256 | static void __init quirk_dlcsetup(struct pci_dev *dev) | 257 | static void __devinit quirk_dlcsetup(struct pci_dev *dev) |
257 | { | 258 | { |
258 | u8 odlc, ndlc; | 259 | u8 odlc, ndlc; |
259 | (void) pci_read_config_byte(dev, 0x82, &odlc); | 260 | (void) pci_read_config_byte(dev, 0x82, &odlc); |
diff --git a/arch/mips/mti-malta/malta-setup.c b/arch/mips/mti-malta/malta-setup.c index b7f37d4982fa..2e28f653f66d 100644 --- a/arch/mips/mti-malta/malta-setup.c +++ b/arch/mips/mti-malta/malta-setup.c | |||
@@ -111,7 +111,7 @@ static void __init pci_clock_check(void) | |||
111 | unsigned int __iomem *jmpr_p = | 111 | unsigned int __iomem *jmpr_p = |
112 | (unsigned int *) ioremap(MALTA_JMPRS_REG, sizeof(unsigned int)); | 112 | (unsigned int *) ioremap(MALTA_JMPRS_REG, sizeof(unsigned int)); |
113 | int jmpr = (__raw_readl(jmpr_p) >> 2) & 0x07; | 113 | int jmpr = (__raw_readl(jmpr_p) >> 2) & 0x07; |
114 | static const int pciclocks[] __initdata = { | 114 | static const int pciclocks[] __initconst = { |
115 | 33, 20, 25, 30, 12, 16, 37, 10 | 115 | 33, 20, 25, 30, 12, 16, 37, 10 |
116 | }; | 116 | }; |
117 | int pciclock = pciclocks[jmpr]; | 117 | int pciclock = pciclocks[jmpr]; |
diff --git a/arch/mips/netlogic/xlp/setup.c b/arch/mips/netlogic/xlp/setup.c index acb677a1227c..b3df7c2aad1e 100644 --- a/arch/mips/netlogic/xlp/setup.c +++ b/arch/mips/netlogic/xlp/setup.c | |||
@@ -82,8 +82,10 @@ void __init prom_free_prom_memory(void) | |||
82 | 82 | ||
83 | void xlp_mmu_init(void) | 83 | void xlp_mmu_init(void) |
84 | { | 84 | { |
85 | /* enable extended TLB and Large Fixed TLB */ | ||
85 | write_c0_config6(read_c0_config6() | 0x24); | 86 | write_c0_config6(read_c0_config6() | 0x24); |
86 | current_cpu_data.tlbsize = ((read_c0_config6() >> 16) & 0xffff) + 1; | 87 | |
88 | /* set page mask of Fixed TLB in config7 */ | ||
87 | write_c0_config7(PM_DEFAULT_MASK >> | 89 | write_c0_config7(PM_DEFAULT_MASK >> |
88 | (13 + (ffz(PM_DEFAULT_MASK >> 13) / 2))); | 90 | (13 + (ffz(PM_DEFAULT_MASK >> 13) / 2))); |
89 | } | 91 | } |
@@ -100,6 +102,10 @@ void __init prom_init(void) | |||
100 | nlm_common_ebase = read_c0_ebase() & (~((1 << 12) - 1)); | 102 | nlm_common_ebase = read_c0_ebase() & (~((1 << 12) - 1)); |
101 | #ifdef CONFIG_SMP | 103 | #ifdef CONFIG_SMP |
102 | nlm_wakeup_secondary_cpus(0xffffffff); | 104 | nlm_wakeup_secondary_cpus(0xffffffff); |
105 | |||
106 | /* update TLB size after waking up threads */ | ||
107 | current_cpu_data.tlbsize = ((read_c0_config6() >> 16) & 0xffff) + 1; | ||
108 | |||
103 | register_smp_ops(&nlm_smp_ops); | 109 | register_smp_ops(&nlm_smp_ops); |
104 | #endif | 110 | #endif |
105 | } | 111 | } |
diff --git a/arch/mips/oprofile/common.c b/arch/mips/oprofile/common.c index d1f2d4c52d42..b6e378211a2c 100644 --- a/arch/mips/oprofile/common.c +++ b/arch/mips/oprofile/common.c | |||
@@ -78,6 +78,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops) | |||
78 | 78 | ||
79 | switch (current_cpu_type()) { | 79 | switch (current_cpu_type()) { |
80 | case CPU_5KC: | 80 | case CPU_5KC: |
81 | case CPU_M14KC: | ||
81 | case CPU_20KC: | 82 | case CPU_20KC: |
82 | case CPU_24K: | 83 | case CPU_24K: |
83 | case CPU_25KF: | 84 | case CPU_25KF: |
diff --git a/arch/mips/oprofile/op_model_mipsxx.c b/arch/mips/oprofile/op_model_mipsxx.c index baba3bcaa3c2..4d80a856048d 100644 --- a/arch/mips/oprofile/op_model_mipsxx.c +++ b/arch/mips/oprofile/op_model_mipsxx.c | |||
@@ -322,6 +322,10 @@ static int __init mipsxx_init(void) | |||
322 | 322 | ||
323 | op_model_mipsxx_ops.num_counters = counters; | 323 | op_model_mipsxx_ops.num_counters = counters; |
324 | switch (current_cpu_type()) { | 324 | switch (current_cpu_type()) { |
325 | case CPU_M14KC: | ||
326 | op_model_mipsxx_ops.cpu_type = "mips/M14Kc"; | ||
327 | break; | ||
328 | |||
325 | case CPU_20KC: | 329 | case CPU_20KC: |
326 | op_model_mipsxx_ops.cpu_type = "mips/20K"; | 330 | op_model_mipsxx_ops.cpu_type = "mips/20K"; |
327 | break; | 331 | break; |
diff --git a/arch/mips/pci/fixup-fuloong2e.c b/arch/mips/pci/fixup-fuloong2e.c index d5d4c018fb04..0857ab8c3919 100644 --- a/arch/mips/pci/fixup-fuloong2e.c +++ b/arch/mips/pci/fixup-fuloong2e.c | |||
@@ -48,7 +48,7 @@ int pcibios_plat_dev_init(struct pci_dev *dev) | |||
48 | return 0; | 48 | return 0; |
49 | } | 49 | } |
50 | 50 | ||
51 | static void __init loongson2e_nec_fixup(struct pci_dev *pdev) | 51 | static void __devinit loongson2e_nec_fixup(struct pci_dev *pdev) |
52 | { | 52 | { |
53 | unsigned int val; | 53 | unsigned int val; |
54 | 54 | ||
@@ -60,7 +60,7 @@ static void __init loongson2e_nec_fixup(struct pci_dev *pdev) | |||
60 | pci_write_config_dword(pdev, 0xe4, 1 << 5); | 60 | pci_write_config_dword(pdev, 0xe4, 1 << 5); |
61 | } | 61 | } |
62 | 62 | ||
63 | static void __init loongson2e_686b_func0_fixup(struct pci_dev *pdev) | 63 | static void __devinit loongson2e_686b_func0_fixup(struct pci_dev *pdev) |
64 | { | 64 | { |
65 | unsigned char c; | 65 | unsigned char c; |
66 | 66 | ||
@@ -135,7 +135,7 @@ static void __init loongson2e_686b_func0_fixup(struct pci_dev *pdev) | |||
135 | printk(KERN_INFO"via686b fix: ISA bridge done\n"); | 135 | printk(KERN_INFO"via686b fix: ISA bridge done\n"); |
136 | } | 136 | } |
137 | 137 | ||
138 | static void __init loongson2e_686b_func1_fixup(struct pci_dev *pdev) | 138 | static void __devinit loongson2e_686b_func1_fixup(struct pci_dev *pdev) |
139 | { | 139 | { |
140 | printk(KERN_INFO"via686b fix: IDE\n"); | 140 | printk(KERN_INFO"via686b fix: IDE\n"); |
141 | 141 | ||
@@ -168,19 +168,19 @@ static void __init loongson2e_686b_func1_fixup(struct pci_dev *pdev) | |||
168 | printk(KERN_INFO"via686b fix: IDE done\n"); | 168 | printk(KERN_INFO"via686b fix: IDE done\n"); |
169 | } | 169 | } |
170 | 170 | ||
171 | static void __init loongson2e_686b_func2_fixup(struct pci_dev *pdev) | 171 | static void __devinit loongson2e_686b_func2_fixup(struct pci_dev *pdev) |
172 | { | 172 | { |
173 | /* irq routing */ | 173 | /* irq routing */ |
174 | pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, 10); | 174 | pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, 10); |
175 | } | 175 | } |
176 | 176 | ||
177 | static void __init loongson2e_686b_func3_fixup(struct pci_dev *pdev) | 177 | static void __devinit loongson2e_686b_func3_fixup(struct pci_dev *pdev) |
178 | { | 178 | { |
179 | /* irq routing */ | 179 | /* irq routing */ |
180 | pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, 11); | 180 | pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, 11); |
181 | } | 181 | } |
182 | 182 | ||
183 | static void __init loongson2e_686b_func5_fixup(struct pci_dev *pdev) | 183 | static void __devinit loongson2e_686b_func5_fixup(struct pci_dev *pdev) |
184 | { | 184 | { |
185 | unsigned int val; | 185 | unsigned int val; |
186 | unsigned char c; | 186 | unsigned char c; |
diff --git a/arch/mips/pci/fixup-lemote2f.c b/arch/mips/pci/fixup-lemote2f.c index 4b9768d5d729..a7b917dcf604 100644 --- a/arch/mips/pci/fixup-lemote2f.c +++ b/arch/mips/pci/fixup-lemote2f.c | |||
@@ -96,21 +96,21 @@ int pcibios_plat_dev_init(struct pci_dev *dev) | |||
96 | } | 96 | } |
97 | 97 | ||
98 | /* CS5536 SPEC. fixup */ | 98 | /* CS5536 SPEC. fixup */ |
99 | static void __init loongson_cs5536_isa_fixup(struct pci_dev *pdev) | 99 | static void __devinit loongson_cs5536_isa_fixup(struct pci_dev *pdev) |
100 | { | 100 | { |
101 | /* the uart1 and uart2 interrupt in PIC is enabled as default */ | 101 | /* the uart1 and uart2 interrupt in PIC is enabled as default */ |
102 | pci_write_config_dword(pdev, PCI_UART1_INT_REG, 1); | 102 | pci_write_config_dword(pdev, PCI_UART1_INT_REG, 1); |
103 | pci_write_config_dword(pdev, PCI_UART2_INT_REG, 1); | 103 | pci_write_config_dword(pdev, PCI_UART2_INT_REG, 1); |
104 | } | 104 | } |
105 | 105 | ||
106 | static void __init loongson_cs5536_ide_fixup(struct pci_dev *pdev) | 106 | static void __devinit loongson_cs5536_ide_fixup(struct pci_dev *pdev) |
107 | { | 107 | { |
108 | /* setting the mutex pin as IDE function */ | 108 | /* setting the mutex pin as IDE function */ |
109 | pci_write_config_dword(pdev, PCI_IDE_CFG_REG, | 109 | pci_write_config_dword(pdev, PCI_IDE_CFG_REG, |
110 | CS5536_IDE_FLASH_SIGNATURE); | 110 | CS5536_IDE_FLASH_SIGNATURE); |
111 | } | 111 | } |
112 | 112 | ||
113 | static void __init loongson_cs5536_acc_fixup(struct pci_dev *pdev) | 113 | static void __devinit loongson_cs5536_acc_fixup(struct pci_dev *pdev) |
114 | { | 114 | { |
115 | /* enable the AUDIO interrupt in PIC */ | 115 | /* enable the AUDIO interrupt in PIC */ |
116 | pci_write_config_dword(pdev, PCI_ACC_INT_REG, 1); | 116 | pci_write_config_dword(pdev, PCI_ACC_INT_REG, 1); |
@@ -118,14 +118,14 @@ static void __init loongson_cs5536_acc_fixup(struct pci_dev *pdev) | |||
118 | pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0xc0); | 118 | pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0xc0); |
119 | } | 119 | } |
120 | 120 | ||
121 | static void __init loongson_cs5536_ohci_fixup(struct pci_dev *pdev) | 121 | static void __devinit loongson_cs5536_ohci_fixup(struct pci_dev *pdev) |
122 | { | 122 | { |
123 | /* enable the OHCI interrupt in PIC */ | 123 | /* enable the OHCI interrupt in PIC */ |
124 | /* THE OHCI, EHCI, UDC, OTG are shared with interrupt in PIC */ | 124 | /* THE OHCI, EHCI, UDC, OTG are shared with interrupt in PIC */ |
125 | pci_write_config_dword(pdev, PCI_OHCI_INT_REG, 1); | 125 | pci_write_config_dword(pdev, PCI_OHCI_INT_REG, 1); |
126 | } | 126 | } |
127 | 127 | ||
128 | static void __init loongson_cs5536_ehci_fixup(struct pci_dev *pdev) | 128 | static void __devinit loongson_cs5536_ehci_fixup(struct pci_dev *pdev) |
129 | { | 129 | { |
130 | u32 hi, lo; | 130 | u32 hi, lo; |
131 | 131 | ||
@@ -137,7 +137,7 @@ static void __init loongson_cs5536_ehci_fixup(struct pci_dev *pdev) | |||
137 | pci_write_config_dword(pdev, PCI_EHCI_FLADJ_REG, 0x2000); | 137 | pci_write_config_dword(pdev, PCI_EHCI_FLADJ_REG, 0x2000); |
138 | } | 138 | } |
139 | 139 | ||
140 | static void __init loongson_nec_fixup(struct pci_dev *pdev) | 140 | static void __devinit loongson_nec_fixup(struct pci_dev *pdev) |
141 | { | 141 | { |
142 | unsigned int val; | 142 | unsigned int val; |
143 | 143 | ||
diff --git a/arch/mips/pci/fixup-malta.c b/arch/mips/pci/fixup-malta.c index 0f48498bc231..70073c98ed32 100644 --- a/arch/mips/pci/fixup-malta.c +++ b/arch/mips/pci/fixup-malta.c | |||
@@ -49,10 +49,10 @@ int pcibios_plat_dev_init(struct pci_dev *dev) | |||
49 | return 0; | 49 | return 0; |
50 | } | 50 | } |
51 | 51 | ||
52 | static void __init malta_piix_func0_fixup(struct pci_dev *pdev) | 52 | static void __devinit malta_piix_func0_fixup(struct pci_dev *pdev) |
53 | { | 53 | { |
54 | unsigned char reg_val; | 54 | unsigned char reg_val; |
55 | static int piixirqmap[16] __initdata = { /* PIIX PIRQC[A:D] irq mappings */ | 55 | static int piixirqmap[16] __devinitdata = { /* PIIX PIRQC[A:D] irq mappings */ |
56 | 0, 0, 0, 3, | 56 | 0, 0, 0, 3, |
57 | 4, 5, 6, 7, | 57 | 4, 5, 6, 7, |
58 | 0, 9, 10, 11, | 58 | 0, 9, 10, 11, |
@@ -83,7 +83,7 @@ static void __init malta_piix_func0_fixup(struct pci_dev *pdev) | |||
83 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_0, | 83 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_0, |
84 | malta_piix_func0_fixup); | 84 | malta_piix_func0_fixup); |
85 | 85 | ||
86 | static void __init malta_piix_func1_fixup(struct pci_dev *pdev) | 86 | static void __devinit malta_piix_func1_fixup(struct pci_dev *pdev) |
87 | { | 87 | { |
88 | unsigned char reg_val; | 88 | unsigned char reg_val; |
89 | 89 | ||
diff --git a/arch/mips/pci/fixup-mpc30x.c b/arch/mips/pci/fixup-mpc30x.c index e08f49cb6875..8e4f8288eca2 100644 --- a/arch/mips/pci/fixup-mpc30x.c +++ b/arch/mips/pci/fixup-mpc30x.c | |||
@@ -22,13 +22,13 @@ | |||
22 | 22 | ||
23 | #include <asm/vr41xx/mpc30x.h> | 23 | #include <asm/vr41xx/mpc30x.h> |
24 | 24 | ||
25 | static const int internal_func_irqs[] __initdata = { | 25 | static const int internal_func_irqs[] __initconst = { |
26 | VRC4173_CASCADE_IRQ, | 26 | VRC4173_CASCADE_IRQ, |
27 | VRC4173_AC97_IRQ, | 27 | VRC4173_AC97_IRQ, |
28 | VRC4173_USB_IRQ, | 28 | VRC4173_USB_IRQ, |
29 | }; | 29 | }; |
30 | 30 | ||
31 | static const int irq_tab_mpc30x[] __initdata = { | 31 | static const int irq_tab_mpc30x[] __initconst = { |
32 | [12] = VRC4173_PCMCIA1_IRQ, | 32 | [12] = VRC4173_PCMCIA1_IRQ, |
33 | [13] = VRC4173_PCMCIA2_IRQ, | 33 | [13] = VRC4173_PCMCIA2_IRQ, |
34 | [29] = MQ200_IRQ, | 34 | [29] = MQ200_IRQ, |
diff --git a/arch/mips/pci/fixup-sb1250.c b/arch/mips/pci/fixup-sb1250.c index f0bb9146e6c0..d02900a72916 100644 --- a/arch/mips/pci/fixup-sb1250.c +++ b/arch/mips/pci/fixup-sb1250.c | |||
@@ -15,7 +15,7 @@ | |||
15 | * Set the BCM1250, etc. PCI host bridge's TRDY timeout | 15 | * Set the BCM1250, etc. PCI host bridge's TRDY timeout |
16 | * to the finite max. | 16 | * to the finite max. |
17 | */ | 17 | */ |
18 | static void __init quirk_sb1250_pci(struct pci_dev *dev) | 18 | static void __devinit quirk_sb1250_pci(struct pci_dev *dev) |
19 | { | 19 | { |
20 | pci_write_config_byte(dev, 0x40, 0xff); | 20 | pci_write_config_byte(dev, 0x40, 0xff); |
21 | } | 21 | } |
@@ -25,7 +25,7 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SIBYTE, PCI_DEVICE_ID_BCM1250_PCI, | |||
25 | /* | 25 | /* |
26 | * The BCM1250, etc. PCI/HT bridge reports as a host bridge. | 26 | * The BCM1250, etc. PCI/HT bridge reports as a host bridge. |
27 | */ | 27 | */ |
28 | static void __init quirk_sb1250_ht(struct pci_dev *dev) | 28 | static void __devinit quirk_sb1250_ht(struct pci_dev *dev) |
29 | { | 29 | { |
30 | dev->class = PCI_CLASS_BRIDGE_PCI << 8; | 30 | dev->class = PCI_CLASS_BRIDGE_PCI << 8; |
31 | } | 31 | } |
@@ -35,7 +35,7 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SIBYTE, PCI_DEVICE_ID_BCM1250_HT, | |||
35 | /* | 35 | /* |
36 | * Set the SP1011 HT/PCI bridge's TRDY timeout to the finite max. | 36 | * Set the SP1011 HT/PCI bridge's TRDY timeout to the finite max. |
37 | */ | 37 | */ |
38 | static void __init quirk_sp1011(struct pci_dev *dev) | 38 | static void __devinit quirk_sp1011(struct pci_dev *dev) |
39 | { | 39 | { |
40 | pci_write_config_byte(dev, 0x64, 0xff); | 40 | pci_write_config_byte(dev, 0x64, 0xff); |
41 | } | 41 | } |
diff --git a/arch/mips/pci/ops-tx4927.c b/arch/mips/pci/ops-tx4927.c index a1e7e6d80c8c..bc13e29d2bb3 100644 --- a/arch/mips/pci/ops-tx4927.c +++ b/arch/mips/pci/ops-tx4927.c | |||
@@ -495,7 +495,7 @@ irqreturn_t tx4927_pcierr_interrupt(int irq, void *dev_id) | |||
495 | } | 495 | } |
496 | 496 | ||
497 | #ifdef CONFIG_TOSHIBA_FPCIB0 | 497 | #ifdef CONFIG_TOSHIBA_FPCIB0 |
498 | static void __init tx4927_quirk_slc90e66_bridge(struct pci_dev *dev) | 498 | static void __devinit tx4927_quirk_slc90e66_bridge(struct pci_dev *dev) |
499 | { | 499 | { |
500 | struct tx4927_pcic_reg __iomem *pcicptr = pci_bus_to_pcicptr(dev->bus); | 500 | struct tx4927_pcic_reg __iomem *pcicptr = pci_bus_to_pcicptr(dev->bus); |
501 | 501 | ||
diff --git a/arch/mips/pci/pci-ip27.c b/arch/mips/pci/pci-ip27.c index 0fbe4c0c170a..fdc24440294c 100644 --- a/arch/mips/pci/pci-ip27.c +++ b/arch/mips/pci/pci-ip27.c | |||
@@ -212,7 +212,7 @@ static inline void pci_enable_swapping(struct pci_dev *dev) | |||
212 | bridge->b_widget.w_tflush; /* Flush */ | 212 | bridge->b_widget.w_tflush; /* Flush */ |
213 | } | 213 | } |
214 | 214 | ||
215 | static void __init pci_fixup_ioc3(struct pci_dev *d) | 215 | static void __devinit pci_fixup_ioc3(struct pci_dev *d) |
216 | { | 216 | { |
217 | pci_disable_swapping(d); | 217 | pci_disable_swapping(d); |
218 | } | 218 | } |
diff --git a/arch/mips/pci/pci-lantiq.c b/arch/mips/pci/pci-lantiq.c index ea453532a33c..075d87acd12a 100644 --- a/arch/mips/pci/pci-lantiq.c +++ b/arch/mips/pci/pci-lantiq.c | |||
@@ -129,7 +129,7 @@ static int __devinit ltq_pci_startup(struct platform_device *pdev) | |||
129 | 129 | ||
130 | /* setup reset gpio used by pci */ | 130 | /* setup reset gpio used by pci */ |
131 | reset_gpio = of_get_named_gpio(node, "gpio-reset", 0); | 131 | reset_gpio = of_get_named_gpio(node, "gpio-reset", 0); |
132 | if (reset_gpio > 0) | 132 | if (gpio_is_valid(reset_gpio)) |
133 | devm_gpio_request(&pdev->dev, reset_gpio, "pci-reset"); | 133 | devm_gpio_request(&pdev->dev, reset_gpio, "pci-reset"); |
134 | 134 | ||
135 | /* enable auto-switching between PCI and EBU */ | 135 | /* enable auto-switching between PCI and EBU */ |
@@ -192,7 +192,7 @@ static int __devinit ltq_pci_startup(struct platform_device *pdev) | |||
192 | ltq_ebu_w32(ltq_ebu_r32(LTQ_EBU_PCC_IEN) | 0x10, LTQ_EBU_PCC_IEN); | 192 | ltq_ebu_w32(ltq_ebu_r32(LTQ_EBU_PCC_IEN) | 0x10, LTQ_EBU_PCC_IEN); |
193 | 193 | ||
194 | /* toggle reset pin */ | 194 | /* toggle reset pin */ |
195 | if (reset_gpio > 0) { | 195 | if (gpio_is_valid(reset_gpio)) { |
196 | __gpio_set_value(reset_gpio, 0); | 196 | __gpio_set_value(reset_gpio, 0); |
197 | wmb(); | 197 | wmb(); |
198 | mdelay(1); | 198 | mdelay(1); |
diff --git a/arch/mips/pci/pci-xlr.c b/arch/mips/pci/pci-xlr.c index 1644805a6730..172af1cd5867 100644 --- a/arch/mips/pci/pci-xlr.c +++ b/arch/mips/pci/pci-xlr.c | |||
@@ -41,6 +41,7 @@ | |||
41 | #include <linux/irq.h> | 41 | #include <linux/irq.h> |
42 | #include <linux/irqdesc.h> | 42 | #include <linux/irqdesc.h> |
43 | #include <linux/console.h> | 43 | #include <linux/console.h> |
44 | #include <linux/pci_regs.h> | ||
44 | 45 | ||
45 | #include <asm/io.h> | 46 | #include <asm/io.h> |
46 | 47 | ||
@@ -156,35 +157,55 @@ struct pci_controller nlm_pci_controller = { | |||
156 | .io_offset = 0x00000000UL, | 157 | .io_offset = 0x00000000UL, |
157 | }; | 158 | }; |
158 | 159 | ||
160 | /* | ||
161 | * The top level PCIe links on the XLS PCIe controller appear as | ||
162 | * bridges. Given a device, this function finds which link it is | ||
163 | * on. | ||
164 | */ | ||
165 | static struct pci_dev *xls_get_pcie_link(const struct pci_dev *dev) | ||
166 | { | ||
167 | struct pci_bus *bus, *p; | ||
168 | |||
169 | /* Find the bridge on bus 0 */ | ||
170 | bus = dev->bus; | ||
171 | for (p = bus->parent; p && p->number != 0; p = p->parent) | ||
172 | bus = p; | ||
173 | |||
174 | return p ? bus->self : NULL; | ||
175 | } | ||
176 | |||
159 | static int get_irq_vector(const struct pci_dev *dev) | 177 | static int get_irq_vector(const struct pci_dev *dev) |
160 | { | 178 | { |
179 | struct pci_dev *lnk; | ||
180 | |||
161 | if (!nlm_chip_is_xls()) | 181 | if (!nlm_chip_is_xls()) |
162 | return PIC_PCIX_IRQ; /* for XLR just one IRQ*/ | 182 | return PIC_PCIX_IRQ; /* for XLR just one IRQ */ |
163 | 183 | ||
164 | /* | 184 | /* |
165 | * For XLS PCIe, there is an IRQ per Link, find out which | 185 | * For XLS PCIe, there is an IRQ per Link, find out which |
166 | * link the device is on to assign interrupts | 186 | * link the device is on to assign interrupts |
167 | */ | 187 | */ |
168 | if (dev->bus->self == NULL) | 188 | lnk = xls_get_pcie_link(dev); |
189 | if (lnk == NULL) | ||
169 | return 0; | 190 | return 0; |
170 | 191 | ||
171 | switch (dev->bus->self->devfn) { | 192 | switch (PCI_SLOT(lnk->devfn)) { |
172 | case 0x0: | 193 | case 0: |
173 | return PIC_PCIE_LINK0_IRQ; | 194 | return PIC_PCIE_LINK0_IRQ; |
174 | case 0x8: | 195 | case 1: |
175 | return PIC_PCIE_LINK1_IRQ; | 196 | return PIC_PCIE_LINK1_IRQ; |
176 | case 0x10: | 197 | case 2: |
177 | if (nlm_chip_is_xls_b()) | 198 | if (nlm_chip_is_xls_b()) |
178 | return PIC_PCIE_XLSB0_LINK2_IRQ; | 199 | return PIC_PCIE_XLSB0_LINK2_IRQ; |
179 | else | 200 | else |
180 | return PIC_PCIE_LINK2_IRQ; | 201 | return PIC_PCIE_LINK2_IRQ; |
181 | case 0x18: | 202 | case 3: |
182 | if (nlm_chip_is_xls_b()) | 203 | if (nlm_chip_is_xls_b()) |
183 | return PIC_PCIE_XLSB0_LINK3_IRQ; | 204 | return PIC_PCIE_XLSB0_LINK3_IRQ; |
184 | else | 205 | else |
185 | return PIC_PCIE_LINK3_IRQ; | 206 | return PIC_PCIE_LINK3_IRQ; |
186 | } | 207 | } |
187 | WARN(1, "Unexpected devfn %d\n", dev->bus->self->devfn); | 208 | WARN(1, "Unexpected devfn %d\n", lnk->devfn); |
188 | return 0; | 209 | return 0; |
189 | } | 210 | } |
190 | 211 | ||
@@ -202,7 +223,27 @@ void arch_teardown_msi_irq(unsigned int irq) | |||
202 | int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc) | 223 | int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc) |
203 | { | 224 | { |
204 | struct msi_msg msg; | 225 | struct msi_msg msg; |
226 | struct pci_dev *lnk; | ||
205 | int irq, ret; | 227 | int irq, ret; |
228 | u16 val; | ||
229 | |||
230 | /* MSI not supported on XLR */ | ||
231 | if (!nlm_chip_is_xls()) | ||
232 | return 1; | ||
233 | |||
234 | /* | ||
235 | * Enable MSI on the XLS PCIe controller bridge which was disabled | ||
236 | * at enumeration, the bridge MSI capability is at 0x50 | ||
237 | */ | ||
238 | lnk = xls_get_pcie_link(dev); | ||
239 | if (lnk == NULL) | ||
240 | return 1; | ||
241 | |||
242 | pci_read_config_word(lnk, 0x50 + PCI_MSI_FLAGS, &val); | ||
243 | if ((val & PCI_MSI_FLAGS_ENABLE) == 0) { | ||
244 | val |= PCI_MSI_FLAGS_ENABLE; | ||
245 | pci_write_config_word(lnk, 0x50 + PCI_MSI_FLAGS, val); | ||
246 | } | ||
206 | 247 | ||
207 | irq = get_irq_vector(dev); | 248 | irq = get_irq_vector(dev); |
208 | if (irq <= 0) | 249 | if (irq <= 0) |
@@ -327,7 +368,7 @@ static int __init pcibios_init(void) | |||
327 | } | 368 | } |
328 | } else { | 369 | } else { |
329 | /* XLR PCI controller ACK */ | 370 | /* XLR PCI controller ACK */ |
330 | irq_set_handler_data(PIC_PCIE_XLSB0_LINK3_IRQ, xlr_pci_ack); | 371 | irq_set_handler_data(PIC_PCIX_IRQ, xlr_pci_ack); |
331 | } | 372 | } |
332 | 373 | ||
333 | return 0; | 374 | return 0; |
diff --git a/arch/mips/pmc-sierra/yosemite/smp.c b/arch/mips/pmc-sierra/yosemite/smp.c index b71fae231049..5edab2bc6fc0 100644 --- a/arch/mips/pmc-sierra/yosemite/smp.c +++ b/arch/mips/pmc-sierra/yosemite/smp.c | |||
@@ -115,11 +115,11 @@ static void yos_send_ipi_mask(const struct cpumask *mask, unsigned int action) | |||
115 | */ | 115 | */ |
116 | static void __cpuinit yos_init_secondary(void) | 116 | static void __cpuinit yos_init_secondary(void) |
117 | { | 117 | { |
118 | set_c0_status(ST0_CO | ST0_IE | ST0_IM); | ||
119 | } | 118 | } |
120 | 119 | ||
121 | static void __cpuinit yos_smp_finish(void) | 120 | static void __cpuinit yos_smp_finish(void) |
122 | { | 121 | { |
122 | set_c0_status(ST0_CO | ST0_IM | ST0_IE); | ||
123 | } | 123 | } |
124 | 124 | ||
125 | /* Hook for after all CPUs are online */ | 125 | /* Hook for after all CPUs are online */ |
diff --git a/arch/mips/powertv/asic/asic-calliope.c b/arch/mips/powertv/asic/asic-calliope.c index 0a170e0ffeaa..7773f3d956b0 100644 --- a/arch/mips/powertv/asic/asic-calliope.c +++ b/arch/mips/powertv/asic/asic-calliope.c | |||
@@ -28,7 +28,7 @@ | |||
28 | 28 | ||
29 | #define CALLIOPE_ADDR(x) (CALLIOPE_IO_BASE + (x)) | 29 | #define CALLIOPE_ADDR(x) (CALLIOPE_IO_BASE + (x)) |
30 | 30 | ||
31 | const struct register_map calliope_register_map __initdata = { | 31 | const struct register_map calliope_register_map __initconst = { |
32 | .eic_slow0_strt_add = {.phys = CALLIOPE_ADDR(0x800000)}, | 32 | .eic_slow0_strt_add = {.phys = CALLIOPE_ADDR(0x800000)}, |
33 | .eic_cfg_bits = {.phys = CALLIOPE_ADDR(0x800038)}, | 33 | .eic_cfg_bits = {.phys = CALLIOPE_ADDR(0x800038)}, |
34 | .eic_ready_status = {.phys = CALLIOPE_ADDR(0x80004c)}, | 34 | .eic_ready_status = {.phys = CALLIOPE_ADDR(0x80004c)}, |
diff --git a/arch/mips/powertv/asic/asic-cronus.c b/arch/mips/powertv/asic/asic-cronus.c index bbc0c122be5e..da076db7b7ed 100644 --- a/arch/mips/powertv/asic/asic-cronus.c +++ b/arch/mips/powertv/asic/asic-cronus.c | |||
@@ -28,7 +28,7 @@ | |||
28 | 28 | ||
29 | #define CRONUS_ADDR(x) (CRONUS_IO_BASE + (x)) | 29 | #define CRONUS_ADDR(x) (CRONUS_IO_BASE + (x)) |
30 | 30 | ||
31 | const struct register_map cronus_register_map __initdata = { | 31 | const struct register_map cronus_register_map __initconst = { |
32 | .eic_slow0_strt_add = {.phys = CRONUS_ADDR(0x000000)}, | 32 | .eic_slow0_strt_add = {.phys = CRONUS_ADDR(0x000000)}, |
33 | .eic_cfg_bits = {.phys = CRONUS_ADDR(0x000038)}, | 33 | .eic_cfg_bits = {.phys = CRONUS_ADDR(0x000038)}, |
34 | .eic_ready_status = {.phys = CRONUS_ADDR(0x00004C)}, | 34 | .eic_ready_status = {.phys = CRONUS_ADDR(0x00004C)}, |
diff --git a/arch/mips/powertv/asic/asic-gaia.c b/arch/mips/powertv/asic/asic-gaia.c index 91dda682752c..47683b370e74 100644 --- a/arch/mips/powertv/asic/asic-gaia.c +++ b/arch/mips/powertv/asic/asic-gaia.c | |||
@@ -23,7 +23,7 @@ | |||
23 | #include <linux/init.h> | 23 | #include <linux/init.h> |
24 | #include <asm/mach-powertv/asic.h> | 24 | #include <asm/mach-powertv/asic.h> |
25 | 25 | ||
26 | const struct register_map gaia_register_map __initdata = { | 26 | const struct register_map gaia_register_map __initconst = { |
27 | .eic_slow0_strt_add = {.phys = GAIA_IO_BASE + 0x000000}, | 27 | .eic_slow0_strt_add = {.phys = GAIA_IO_BASE + 0x000000}, |
28 | .eic_cfg_bits = {.phys = GAIA_IO_BASE + 0x000038}, | 28 | .eic_cfg_bits = {.phys = GAIA_IO_BASE + 0x000038}, |
29 | .eic_ready_status = {.phys = GAIA_IO_BASE + 0x00004C}, | 29 | .eic_ready_status = {.phys = GAIA_IO_BASE + 0x00004C}, |
diff --git a/arch/mips/powertv/asic/asic-zeus.c b/arch/mips/powertv/asic/asic-zeus.c index 4a05bb096476..6ff4b10f09da 100644 --- a/arch/mips/powertv/asic/asic-zeus.c +++ b/arch/mips/powertv/asic/asic-zeus.c | |||
@@ -28,7 +28,7 @@ | |||
28 | 28 | ||
29 | #define ZEUS_ADDR(x) (ZEUS_IO_BASE + (x)) | 29 | #define ZEUS_ADDR(x) (ZEUS_IO_BASE + (x)) |
30 | 30 | ||
31 | const struct register_map zeus_register_map __initdata = { | 31 | const struct register_map zeus_register_map __initconst = { |
32 | .eic_slow0_strt_add = {.phys = ZEUS_ADDR(0x000000)}, | 32 | .eic_slow0_strt_add = {.phys = ZEUS_ADDR(0x000000)}, |
33 | .eic_cfg_bits = {.phys = ZEUS_ADDR(0x000038)}, | 33 | .eic_cfg_bits = {.phys = ZEUS_ADDR(0x000038)}, |
34 | .eic_ready_status = {.phys = ZEUS_ADDR(0x00004c)}, | 34 | .eic_ready_status = {.phys = ZEUS_ADDR(0x00004c)}, |
diff --git a/arch/mips/txx9/generic/pci.c b/arch/mips/txx9/generic/pci.c index 682efb0c108d..64eb71b15280 100644 --- a/arch/mips/txx9/generic/pci.c +++ b/arch/mips/txx9/generic/pci.c | |||
@@ -269,7 +269,7 @@ txx9_i8259_irq_setup(int irq) | |||
269 | return err; | 269 | return err; |
270 | } | 270 | } |
271 | 271 | ||
272 | static void __init quirk_slc90e66_bridge(struct pci_dev *dev) | 272 | static void __devinit quirk_slc90e66_bridge(struct pci_dev *dev) |
273 | { | 273 | { |
274 | int irq; /* PCI/ISA Bridge interrupt */ | 274 | int irq; /* PCI/ISA Bridge interrupt */ |
275 | u8 reg_64; | 275 | u8 reg_64; |
diff --git a/arch/mn10300/include/asm/ptrace.h b/arch/mn10300/include/asm/ptrace.h index 55b79ef10028..44251b974f1d 100644 --- a/arch/mn10300/include/asm/ptrace.h +++ b/arch/mn10300/include/asm/ptrace.h | |||
@@ -81,9 +81,6 @@ struct pt_regs { | |||
81 | #define PTRACE_GETFPREGS 14 | 81 | #define PTRACE_GETFPREGS 14 |
82 | #define PTRACE_SETFPREGS 15 | 82 | #define PTRACE_SETFPREGS 15 |
83 | 83 | ||
84 | /* options set using PTRACE_SETOPTIONS */ | ||
85 | #define PTRACE_O_TRACESYSGOOD 0x00000001 | ||
86 | |||
87 | #ifdef __KERNEL__ | 84 | #ifdef __KERNEL__ |
88 | 85 | ||
89 | #define user_mode(regs) (((regs)->epsw & EPSW_nSL) == EPSW_nSL) | 86 | #define user_mode(regs) (((regs)->epsw & EPSW_nSL) == EPSW_nSL) |
diff --git a/arch/mn10300/include/asm/thread_info.h b/arch/mn10300/include/asm/thread_info.h index 08251d6f6b11..ac519bbd42ff 100644 --- a/arch/mn10300/include/asm/thread_info.h +++ b/arch/mn10300/include/asm/thread_info.h | |||
@@ -123,7 +123,7 @@ static inline unsigned long current_stack_pointer(void) | |||
123 | } | 123 | } |
124 | 124 | ||
125 | #ifndef CONFIG_KGDB | 125 | #ifndef CONFIG_KGDB |
126 | void arch_release_thread_info(struct thread_info *ti) | 126 | void arch_release_thread_info(struct thread_info *ti); |
127 | #endif | 127 | #endif |
128 | #define get_thread_info(ti) get_task_struct((ti)->task) | 128 | #define get_thread_info(ti) get_task_struct((ti)->task) |
129 | #define put_thread_info(ti) put_task_struct((ti)->task) | 129 | #define put_thread_info(ti) put_task_struct((ti)->task) |
diff --git a/arch/mn10300/include/asm/timex.h b/arch/mn10300/include/asm/timex.h index bd4e90dfe6c2..f8e66425cbf8 100644 --- a/arch/mn10300/include/asm/timex.h +++ b/arch/mn10300/include/asm/timex.h | |||
@@ -11,7 +11,6 @@ | |||
11 | #ifndef _ASM_TIMEX_H | 11 | #ifndef _ASM_TIMEX_H |
12 | #define _ASM_TIMEX_H | 12 | #define _ASM_TIMEX_H |
13 | 13 | ||
14 | #include <asm/hardirq.h> | ||
15 | #include <unit/timex.h> | 14 | #include <unit/timex.h> |
16 | 15 | ||
17 | #define TICK_SIZE (tick_nsec / 1000) | 16 | #define TICK_SIZE (tick_nsec / 1000) |
@@ -30,16 +29,6 @@ static inline cycles_t get_cycles(void) | |||
30 | extern int init_clockevents(void); | 29 | extern int init_clockevents(void); |
31 | extern int init_clocksource(void); | 30 | extern int init_clocksource(void); |
32 | 31 | ||
33 | static inline void setup_jiffies_interrupt(int irq, | ||
34 | struct irqaction *action) | ||
35 | { | ||
36 | u16 tmp; | ||
37 | setup_irq(irq, action); | ||
38 | set_intr_level(irq, NUM2GxICR_LEVEL(CONFIG_TIMER_IRQ_LEVEL)); | ||
39 | GxICR(irq) |= GxICR_ENABLE | GxICR_DETECT | GxICR_REQUEST; | ||
40 | tmp = GxICR(irq); | ||
41 | } | ||
42 | |||
43 | #endif /* __KERNEL__ */ | 32 | #endif /* __KERNEL__ */ |
44 | 33 | ||
45 | #endif /* _ASM_TIMEX_H */ | 34 | #endif /* _ASM_TIMEX_H */ |
diff --git a/arch/mn10300/kernel/cevt-mn10300.c b/arch/mn10300/kernel/cevt-mn10300.c index 69cae0260786..ccce35e3e179 100644 --- a/arch/mn10300/kernel/cevt-mn10300.c +++ b/arch/mn10300/kernel/cevt-mn10300.c | |||
@@ -70,6 +70,16 @@ static void event_handler(struct clock_event_device *dev) | |||
70 | { | 70 | { |
71 | } | 71 | } |
72 | 72 | ||
73 | static inline void setup_jiffies_interrupt(int irq, | ||
74 | struct irqaction *action) | ||
75 | { | ||
76 | u16 tmp; | ||
77 | setup_irq(irq, action); | ||
78 | set_intr_level(irq, NUM2GxICR_LEVEL(CONFIG_TIMER_IRQ_LEVEL)); | ||
79 | GxICR(irq) |= GxICR_ENABLE | GxICR_DETECT | GxICR_REQUEST; | ||
80 | tmp = GxICR(irq); | ||
81 | } | ||
82 | |||
73 | int __init init_clockevents(void) | 83 | int __init init_clockevents(void) |
74 | { | 84 | { |
75 | struct clock_event_device *cd; | 85 | struct clock_event_device *cd; |
diff --git a/arch/mn10300/kernel/internal.h b/arch/mn10300/kernel/internal.h index a5ac755dd69f..2df440105a80 100644 --- a/arch/mn10300/kernel/internal.h +++ b/arch/mn10300/kernel/internal.h | |||
@@ -9,6 +9,8 @@ | |||
9 | * 2 of the Licence, or (at your option) any later version. | 9 | * 2 of the Licence, or (at your option) any later version. |
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <linux/irqreturn.h> | ||
13 | |||
12 | struct clocksource; | 14 | struct clocksource; |
13 | struct clock_event_device; | 15 | struct clock_event_device; |
14 | 16 | ||
diff --git a/arch/mn10300/kernel/irq.c b/arch/mn10300/kernel/irq.c index 2381df83bd00..35932a8de8b8 100644 --- a/arch/mn10300/kernel/irq.c +++ b/arch/mn10300/kernel/irq.c | |||
@@ -170,9 +170,9 @@ mn10300_cpupic_setaffinity(struct irq_data *d, const struct cpumask *mask, | |||
170 | case SC1TXIRQ: | 170 | case SC1TXIRQ: |
171 | #ifdef CONFIG_MN10300_TTYSM1_TIMER12 | 171 | #ifdef CONFIG_MN10300_TTYSM1_TIMER12 |
172 | case TM12IRQ: | 172 | case TM12IRQ: |
173 | #elif CONFIG_MN10300_TTYSM1_TIMER9 | 173 | #elif defined(CONFIG_MN10300_TTYSM1_TIMER9) |
174 | case TM9IRQ: | 174 | case TM9IRQ: |
175 | #elif CONFIG_MN10300_TTYSM1_TIMER3 | 175 | #elif defined(CONFIG_MN10300_TTYSM1_TIMER3) |
176 | case TM3IRQ: | 176 | case TM3IRQ: |
177 | #endif /* CONFIG_MN10300_TTYSM1_TIMER12 */ | 177 | #endif /* CONFIG_MN10300_TTYSM1_TIMER12 */ |
178 | #endif /* CONFIG_MN10300_TTYSM1 */ | 178 | #endif /* CONFIG_MN10300_TTYSM1 */ |
diff --git a/arch/mn10300/kernel/signal.c b/arch/mn10300/kernel/signal.c index 6ab0bee2a54f..4d584ae29ae1 100644 --- a/arch/mn10300/kernel/signal.c +++ b/arch/mn10300/kernel/signal.c | |||
@@ -459,10 +459,11 @@ static int handle_signal(int sig, | |||
459 | else | 459 | else |
460 | ret = setup_frame(sig, ka, oldset, regs); | 460 | ret = setup_frame(sig, ka, oldset, regs); |
461 | if (ret) | 461 | if (ret) |
462 | return; | 462 | return ret; |
463 | 463 | ||
464 | signal_delivered(sig, info, ka, regs, | 464 | signal_delivered(sig, info, ka, regs, |
465 | test_thread_flag(TIF_SINGLESTEP)); | 465 | test_thread_flag(TIF_SINGLESTEP)); |
466 | return 0; | ||
466 | } | 467 | } |
467 | 468 | ||
468 | /* | 469 | /* |
diff --git a/arch/mn10300/kernel/traps.c b/arch/mn10300/kernel/traps.c index 94a9c6d53e1b..b900e5afa0ae 100644 --- a/arch/mn10300/kernel/traps.c +++ b/arch/mn10300/kernel/traps.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/kdebug.h> | 26 | #include <linux/kdebug.h> |
27 | #include <linux/bug.h> | 27 | #include <linux/bug.h> |
28 | #include <linux/irq.h> | 28 | #include <linux/irq.h> |
29 | #include <linux/export.h> | ||
29 | #include <asm/processor.h> | 30 | #include <asm/processor.h> |
30 | #include <linux/uaccess.h> | 31 | #include <linux/uaccess.h> |
31 | #include <asm/io.h> | 32 | #include <asm/io.h> |
diff --git a/arch/mn10300/mm/dma-alloc.c b/arch/mn10300/mm/dma-alloc.c index 159acb02cfd4..e244ebe637e1 100644 --- a/arch/mn10300/mm/dma-alloc.c +++ b/arch/mn10300/mm/dma-alloc.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/string.h> | 15 | #include <linux/string.h> |
16 | #include <linux/pci.h> | 16 | #include <linux/pci.h> |
17 | #include <linux/gfp.h> | 17 | #include <linux/gfp.h> |
18 | #include <linux/export.h> | ||
18 | #include <asm/io.h> | 19 | #include <asm/io.h> |
19 | 20 | ||
20 | static unsigned long pci_sram_allocated = 0xbc000000; | 21 | static unsigned long pci_sram_allocated = 0xbc000000; |
diff --git a/arch/mn10300/unit-asb2303/include/unit/timex.h b/arch/mn10300/unit-asb2303/include/unit/timex.h index cc18fe7d8b90..c37f9832cf17 100644 --- a/arch/mn10300/unit-asb2303/include/unit/timex.h +++ b/arch/mn10300/unit-asb2303/include/unit/timex.h | |||
@@ -11,10 +11,6 @@ | |||
11 | #ifndef _ASM_UNIT_TIMEX_H | 11 | #ifndef _ASM_UNIT_TIMEX_H |
12 | #define _ASM_UNIT_TIMEX_H | 12 | #define _ASM_UNIT_TIMEX_H |
13 | 13 | ||
14 | #ifndef __ASSEMBLY__ | ||
15 | #include <linux/irq.h> | ||
16 | #endif /* __ASSEMBLY__ */ | ||
17 | |||
18 | #include <asm/timer-regs.h> | 14 | #include <asm/timer-regs.h> |
19 | #include <unit/clock.h> | 15 | #include <unit/clock.h> |
20 | #include <asm/param.h> | 16 | #include <asm/param.h> |
diff --git a/arch/mn10300/unit-asb2303/smc91111.c b/arch/mn10300/unit-asb2303/smc91111.c index 43c246439413..53677694b165 100644 --- a/arch/mn10300/unit-asb2303/smc91111.c +++ b/arch/mn10300/unit-asb2303/smc91111.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/platform_device.h> | 15 | #include <linux/platform_device.h> |
16 | 16 | ||
17 | #include <asm/io.h> | 17 | #include <asm/io.h> |
18 | #include <asm/irq.h> | ||
18 | #include <asm/timex.h> | 19 | #include <asm/timex.h> |
19 | #include <asm/processor.h> | 20 | #include <asm/processor.h> |
20 | #include <asm/intctl-regs.h> | 21 | #include <asm/intctl-regs.h> |
diff --git a/arch/mn10300/unit-asb2305/include/unit/timex.h b/arch/mn10300/unit-asb2305/include/unit/timex.h index 758af30d1a16..4cefc224f448 100644 --- a/arch/mn10300/unit-asb2305/include/unit/timex.h +++ b/arch/mn10300/unit-asb2305/include/unit/timex.h | |||
@@ -11,10 +11,6 @@ | |||
11 | #ifndef _ASM_UNIT_TIMEX_H | 11 | #ifndef _ASM_UNIT_TIMEX_H |
12 | #define _ASM_UNIT_TIMEX_H | 12 | #define _ASM_UNIT_TIMEX_H |
13 | 13 | ||
14 | #ifndef __ASSEMBLY__ | ||
15 | #include <linux/irq.h> | ||
16 | #endif /* __ASSEMBLY__ */ | ||
17 | |||
18 | #include <asm/timer-regs.h> | 14 | #include <asm/timer-regs.h> |
19 | #include <unit/clock.h> | 15 | #include <unit/clock.h> |
20 | #include <asm/param.h> | 16 | #include <asm/param.h> |
diff --git a/arch/mn10300/unit-asb2305/unit-init.c b/arch/mn10300/unit-asb2305/unit-init.c index e1becd6b7571..bc4adfaf815c 100644 --- a/arch/mn10300/unit-asb2305/unit-init.c +++ b/arch/mn10300/unit-asb2305/unit-init.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
14 | #include <linux/pci.h> | 14 | #include <linux/pci.h> |
15 | #include <asm/io.h> | 15 | #include <asm/io.h> |
16 | #include <asm/irq.h> | ||
16 | #include <asm/setup.h> | 17 | #include <asm/setup.h> |
17 | #include <asm/processor.h> | 18 | #include <asm/processor.h> |
18 | #include <asm/intctl-regs.h> | 19 | #include <asm/intctl-regs.h> |
diff --git a/arch/mn10300/unit-asb2364/include/unit/timex.h b/arch/mn10300/unit-asb2364/include/unit/timex.h index ddb7ed010706..42f32db75087 100644 --- a/arch/mn10300/unit-asb2364/include/unit/timex.h +++ b/arch/mn10300/unit-asb2364/include/unit/timex.h | |||
@@ -11,10 +11,6 @@ | |||
11 | #ifndef _ASM_UNIT_TIMEX_H | 11 | #ifndef _ASM_UNIT_TIMEX_H |
12 | #define _ASM_UNIT_TIMEX_H | 12 | #define _ASM_UNIT_TIMEX_H |
13 | 13 | ||
14 | #ifndef __ASSEMBLY__ | ||
15 | #include <linux/irq.h> | ||
16 | #endif /* __ASSEMBLY__ */ | ||
17 | |||
18 | #include <asm/timer-regs.h> | 14 | #include <asm/timer-regs.h> |
19 | #include <unit/clock.h> | 15 | #include <unit/clock.h> |
20 | #include <asm/param.h> | 16 | #include <asm/param.h> |
diff --git a/arch/powerpc/include/asm/hw_irq.h b/arch/powerpc/include/asm/hw_irq.h index 6eb75b80488c..0554ab062bdc 100644 --- a/arch/powerpc/include/asm/hw_irq.h +++ b/arch/powerpc/include/asm/hw_irq.h | |||
@@ -86,8 +86,8 @@ static inline bool arch_irqs_disabled(void) | |||
86 | } | 86 | } |
87 | 87 | ||
88 | #ifdef CONFIG_PPC_BOOK3E | 88 | #ifdef CONFIG_PPC_BOOK3E |
89 | #define __hard_irq_enable() asm volatile("wrteei 1" : : : "memory"); | 89 | #define __hard_irq_enable() asm volatile("wrteei 1" : : : "memory") |
90 | #define __hard_irq_disable() asm volatile("wrteei 0" : : : "memory"); | 90 | #define __hard_irq_disable() asm volatile("wrteei 0" : : : "memory") |
91 | #else | 91 | #else |
92 | #define __hard_irq_enable() __mtmsrd(local_paca->kernel_msr | MSR_EE, 1) | 92 | #define __hard_irq_enable() __mtmsrd(local_paca->kernel_msr | MSR_EE, 1) |
93 | #define __hard_irq_disable() __mtmsrd(local_paca->kernel_msr, 1) | 93 | #define __hard_irq_disable() __mtmsrd(local_paca->kernel_msr, 1) |
@@ -125,6 +125,8 @@ static inline bool arch_irq_disabled_regs(struct pt_regs *regs) | |||
125 | return !regs->softe; | 125 | return !regs->softe; |
126 | } | 126 | } |
127 | 127 | ||
128 | extern bool prep_irq_for_idle(void); | ||
129 | |||
128 | #else /* CONFIG_PPC64 */ | 130 | #else /* CONFIG_PPC64 */ |
129 | 131 | ||
130 | #define SET_MSR_EE(x) mtmsr(x) | 132 | #define SET_MSR_EE(x) mtmsr(x) |
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 1b415027ec0e..1f017bb7a7ce 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
@@ -229,7 +229,7 @@ notrace void arch_local_irq_restore(unsigned long en) | |||
229 | */ | 229 | */ |
230 | if (unlikely(irq_happened != PACA_IRQ_HARD_DIS)) | 230 | if (unlikely(irq_happened != PACA_IRQ_HARD_DIS)) |
231 | __hard_irq_disable(); | 231 | __hard_irq_disable(); |
232 | #ifdef CONFIG_TRACE_IRQFLAG | 232 | #ifdef CONFIG_TRACE_IRQFLAGS |
233 | else { | 233 | else { |
234 | /* | 234 | /* |
235 | * We should already be hard disabled here. We had bugs | 235 | * We should already be hard disabled here. We had bugs |
@@ -286,6 +286,52 @@ void notrace restore_interrupts(void) | |||
286 | __hard_irq_enable(); | 286 | __hard_irq_enable(); |
287 | } | 287 | } |
288 | 288 | ||
289 | /* | ||
290 | * This is a helper to use when about to go into idle low-power | ||
291 | * when the latter has the side effect of re-enabling interrupts | ||
292 | * (such as calling H_CEDE under pHyp). | ||
293 | * | ||
294 | * You call this function with interrupts soft-disabled (this is | ||
295 | * already the case when ppc_md.power_save is called). The function | ||
296 | * will return whether to enter power save or just return. | ||
297 | * | ||
298 | * In the former case, it will have notified lockdep of interrupts | ||
299 | * being re-enabled and generally sanitized the lazy irq state, | ||
300 | * and in the latter case it will leave with interrupts hard | ||
301 | * disabled and marked as such, so the local_irq_enable() call | ||
302 | * in cpu_idle() will properly re-enable everything. | ||
303 | */ | ||
304 | bool prep_irq_for_idle(void) | ||
305 | { | ||
306 | /* | ||
307 | * First we need to hard disable to ensure no interrupt | ||
308 | * occurs before we effectively enter the low power state | ||
309 | */ | ||
310 | hard_irq_disable(); | ||
311 | |||
312 | /* | ||
313 | * If anything happened while we were soft-disabled, | ||
314 | * we return now and do not enter the low power state. | ||
315 | */ | ||
316 | if (lazy_irq_pending()) | ||
317 | return false; | ||
318 | |||
319 | /* Tell lockdep we are about to re-enable */ | ||
320 | trace_hardirqs_on(); | ||
321 | |||
322 | /* | ||
323 | * Mark interrupts as soft-enabled and clear the | ||
324 | * PACA_IRQ_HARD_DIS from the pending mask since we | ||
325 | * are about to hard enable as well as a side effect | ||
326 | * of entering the low power state. | ||
327 | */ | ||
328 | local_paca->irq_happened &= ~PACA_IRQ_HARD_DIS; | ||
329 | local_paca->soft_enabled = 1; | ||
330 | |||
331 | /* Tell the caller to enter the low power state */ | ||
332 | return true; | ||
333 | } | ||
334 | |||
289 | #endif /* CONFIG_PPC64 */ | 335 | #endif /* CONFIG_PPC64 */ |
290 | 336 | ||
291 | int arch_show_interrupts(struct seq_file *p, int prec) | 337 | int arch_show_interrupts(struct seq_file *p, int prec) |
diff --git a/arch/powerpc/kvm/book3s_pr_papr.c b/arch/powerpc/kvm/book3s_pr_papr.c index 3ff9013d6e79..ee02b30878ed 100644 --- a/arch/powerpc/kvm/book3s_pr_papr.c +++ b/arch/powerpc/kvm/book3s_pr_papr.c | |||
@@ -241,6 +241,7 @@ int kvmppc_h_pr(struct kvm_vcpu *vcpu, unsigned long cmd) | |||
241 | case H_PUT_TCE: | 241 | case H_PUT_TCE: |
242 | return kvmppc_h_pr_put_tce(vcpu); | 242 | return kvmppc_h_pr_put_tce(vcpu); |
243 | case H_CEDE: | 243 | case H_CEDE: |
244 | vcpu->arch.shared->msr |= MSR_EE; | ||
244 | kvm_vcpu_block(vcpu); | 245 | kvm_vcpu_block(vcpu); |
245 | clear_bit(KVM_REQ_UNHALT, &vcpu->requests); | 246 | clear_bit(KVM_REQ_UNHALT, &vcpu->requests); |
246 | vcpu->stat.halt_wakeup++; | 247 | vcpu->stat.halt_wakeup++; |
diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c index 6e8f677f5646..1e95556dc692 100644 --- a/arch/powerpc/mm/numa.c +++ b/arch/powerpc/mm/numa.c | |||
@@ -639,7 +639,7 @@ static void __init parse_drconf_memory(struct device_node *memory) | |||
639 | unsigned int n, rc, ranges, is_kexec_kdump = 0; | 639 | unsigned int n, rc, ranges, is_kexec_kdump = 0; |
640 | unsigned long lmb_size, base, size, sz; | 640 | unsigned long lmb_size, base, size, sz; |
641 | int nid; | 641 | int nid; |
642 | struct assoc_arrays aa; | 642 | struct assoc_arrays aa = { .arrays = NULL }; |
643 | 643 | ||
644 | n = of_get_drconf_memory(memory, &dm); | 644 | n = of_get_drconf_memory(memory, &dm); |
645 | if (!n) | 645 | if (!n) |
diff --git a/arch/powerpc/platforms/cell/pervasive.c b/arch/powerpc/platforms/cell/pervasive.c index efdacc829576..d17e98bc0c10 100644 --- a/arch/powerpc/platforms/cell/pervasive.c +++ b/arch/powerpc/platforms/cell/pervasive.c | |||
@@ -42,11 +42,9 @@ static void cbe_power_save(void) | |||
42 | { | 42 | { |
43 | unsigned long ctrl, thread_switch_control; | 43 | unsigned long ctrl, thread_switch_control; |
44 | 44 | ||
45 | /* | 45 | /* Ensure our interrupt state is properly tracked */ |
46 | * We need to hard disable interrupts, the local_irq_enable() done by | 46 | if (!prep_irq_for_idle()) |
47 | * our caller upon return will hard re-enable. | 47 | return; |
48 | */ | ||
49 | hard_irq_disable(); | ||
50 | 48 | ||
51 | ctrl = mfspr(SPRN_CTRLF); | 49 | ctrl = mfspr(SPRN_CTRLF); |
52 | 50 | ||
@@ -81,6 +79,9 @@ static void cbe_power_save(void) | |||
81 | */ | 79 | */ |
82 | ctrl &= ~(CTRL_RUNLATCH | CTRL_TE); | 80 | ctrl &= ~(CTRL_RUNLATCH | CTRL_TE); |
83 | mtspr(SPRN_CTRLT, ctrl); | 81 | mtspr(SPRN_CTRLT, ctrl); |
82 | |||
83 | /* Re-enable interrupts in MSR */ | ||
84 | __hard_irq_enable(); | ||
84 | } | 85 | } |
85 | 86 | ||
86 | static int cbe_system_reset_exception(struct pt_regs *regs) | 87 | static int cbe_system_reset_exception(struct pt_regs *regs) |
diff --git a/arch/powerpc/platforms/pseries/processor_idle.c b/arch/powerpc/platforms/pseries/processor_idle.c index e61483e8e960..c71be66bd5dc 100644 --- a/arch/powerpc/platforms/pseries/processor_idle.c +++ b/arch/powerpc/platforms/pseries/processor_idle.c | |||
@@ -99,15 +99,18 @@ out: | |||
99 | static void check_and_cede_processor(void) | 99 | static void check_and_cede_processor(void) |
100 | { | 100 | { |
101 | /* | 101 | /* |
102 | * Interrupts are soft-disabled at this point, | 102 | * Ensure our interrupt state is properly tracked, |
103 | * but not hard disabled. So an interrupt might have | 103 | * also checks if no interrupt has occurred while we |
104 | * occurred before entering NAP, and would be potentially | 104 | * were soft-disabled |
105 | * lost (edge events, decrementer events, etc...) unless | ||
106 | * we first hard disable then check. | ||
107 | */ | 105 | */ |
108 | hard_irq_disable(); | 106 | if (prep_irq_for_idle()) { |
109 | if (!lazy_irq_pending()) | ||
110 | cede_processor(); | 107 | cede_processor(); |
108 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
109 | /* Ensure that H_CEDE returns with IRQs on */ | ||
110 | if (WARN_ON(!(mfmsr() & MSR_EE))) | ||
111 | __hard_irq_enable(); | ||
112 | #endif | ||
113 | } | ||
111 | } | 114 | } |
112 | 115 | ||
113 | static int dedicated_cede_loop(struct cpuidle_device *dev, | 116 | static int dedicated_cede_loop(struct cpuidle_device *dev, |
diff --git a/arch/sh/include/asm/io_noioport.h b/arch/sh/include/asm/io_noioport.h index e136d28d1d2e..4d48f1436a63 100644 --- a/arch/sh/include/asm/io_noioport.h +++ b/arch/sh/include/asm/io_noioport.h | |||
@@ -19,9 +19,20 @@ static inline u32 inl(unsigned long addr) | |||
19 | return -1; | 19 | return -1; |
20 | } | 20 | } |
21 | 21 | ||
22 | #define outb(x, y) BUG() | 22 | static inline void outb(unsigned char x, unsigned long port) |
23 | #define outw(x, y) BUG() | 23 | { |
24 | #define outl(x, y) BUG() | 24 | BUG(); |
25 | } | ||
26 | |||
27 | static inline void outw(unsigned short x, unsigned long port) | ||
28 | { | ||
29 | BUG(); | ||
30 | } | ||
31 | |||
32 | static inline void outl(unsigned int x, unsigned long port) | ||
33 | { | ||
34 | BUG(); | ||
35 | } | ||
25 | 36 | ||
26 | #define inb_p(addr) inb(addr) | 37 | #define inb_p(addr) inb(addr) |
27 | #define inw_p(addr) inw(addr) | 38 | #define inw_p(addr) inw(addr) |
diff --git a/arch/sh/kernel/cpu/sh3/serial-sh7720.c b/arch/sh/kernel/cpu/sh3/serial-sh7720.c index 8832c526cdf9..c4a0336660dd 100644 --- a/arch/sh/kernel/cpu/sh3/serial-sh7720.c +++ b/arch/sh/kernel/cpu/sh3/serial-sh7720.c | |||
@@ -2,7 +2,7 @@ | |||
2 | #include <linux/serial_core.h> | 2 | #include <linux/serial_core.h> |
3 | #include <linux/io.h> | 3 | #include <linux/io.h> |
4 | #include <cpu/serial.h> | 4 | #include <cpu/serial.h> |
5 | #include <asm/gpio.h> | 5 | #include <cpu/gpio.h> |
6 | 6 | ||
7 | static void sh7720_sci_init_pins(struct uart_port *port, unsigned int cflag) | 7 | static void sh7720_sci_init_pins(struct uart_port *port, unsigned int cflag) |
8 | { | 8 | { |
diff --git a/arch/tile/kernel/backtrace.c b/arch/tile/kernel/backtrace.c index 9092ce8aa6b4..f8b74ca83b92 100644 --- a/arch/tile/kernel/backtrace.c +++ b/arch/tile/kernel/backtrace.c | |||
@@ -14,6 +14,7 @@ | |||
14 | 14 | ||
15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
16 | #include <linux/string.h> | 16 | #include <linux/string.h> |
17 | #include <asm/byteorder.h> | ||
17 | #include <asm/backtrace.h> | 18 | #include <asm/backtrace.h> |
18 | #include <asm/tile-desc.h> | 19 | #include <asm/tile-desc.h> |
19 | #include <arch/abi.h> | 20 | #include <arch/abi.h> |
@@ -336,8 +337,12 @@ static void find_caller_pc_and_caller_sp(CallerLocation *location, | |||
336 | bytes_to_prefetch / sizeof(tile_bundle_bits); | 337 | bytes_to_prefetch / sizeof(tile_bundle_bits); |
337 | } | 338 | } |
338 | 339 | ||
339 | /* Decode the next bundle. */ | 340 | /* |
340 | bundle.bits = prefetched_bundles[next_bundle++]; | 341 | * Decode the next bundle. |
342 | * TILE always stores instruction bundles in little-endian | ||
343 | * mode, even when the chip is running in big-endian mode. | ||
344 | */ | ||
345 | bundle.bits = le64_to_cpu(prefetched_bundles[next_bundle++]); | ||
341 | bundle.num_insns = | 346 | bundle.num_insns = |
342 | parse_insn_tile(bundle.bits, pc, bundle.insns); | 347 | parse_insn_tile(bundle.bits, pc, bundle.insns); |
343 | num_info_ops = bt_get_info_ops(&bundle, info_operands); | 348 | num_info_ops = bt_get_info_ops(&bundle, info_operands); |
diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c index 88e466b159dc..43b39d61b538 100644 --- a/arch/um/drivers/mconsole_kern.c +++ b/arch/um/drivers/mconsole_kern.c | |||
@@ -705,7 +705,6 @@ static void stack_proc(void *arg) | |||
705 | struct task_struct *from = current, *to = arg; | 705 | struct task_struct *from = current, *to = arg; |
706 | 706 | ||
707 | to->thread.saved_task = from; | 707 | to->thread.saved_task = from; |
708 | rcu_switch_from(from); | ||
709 | switch_to(from, to, from); | 708 | switch_to(from, to, from); |
710 | } | 709 | } |
711 | 710 | ||
diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c index 7515cf0e1805..5db36caf4289 100644 --- a/arch/x86/kernel/vsyscall_64.c +++ b/arch/x86/kernel/vsyscall_64.c | |||
@@ -139,6 +139,19 @@ static int addr_to_vsyscall_nr(unsigned long addr) | |||
139 | return nr; | 139 | return nr; |
140 | } | 140 | } |
141 | 141 | ||
142 | #ifdef CONFIG_SECCOMP | ||
143 | static int vsyscall_seccomp(struct task_struct *tsk, int syscall_nr) | ||
144 | { | ||
145 | if (!seccomp_mode(&tsk->seccomp)) | ||
146 | return 0; | ||
147 | task_pt_regs(tsk)->orig_ax = syscall_nr; | ||
148 | task_pt_regs(tsk)->ax = syscall_nr; | ||
149 | return __secure_computing(syscall_nr); | ||
150 | } | ||
151 | #else | ||
152 | #define vsyscall_seccomp(_tsk, _nr) 0 | ||
153 | #endif | ||
154 | |||
142 | static bool write_ok_or_segv(unsigned long ptr, size_t size) | 155 | static bool write_ok_or_segv(unsigned long ptr, size_t size) |
143 | { | 156 | { |
144 | /* | 157 | /* |
@@ -174,6 +187,7 @@ bool emulate_vsyscall(struct pt_regs *regs, unsigned long address) | |||
174 | int vsyscall_nr; | 187 | int vsyscall_nr; |
175 | int prev_sig_on_uaccess_error; | 188 | int prev_sig_on_uaccess_error; |
176 | long ret; | 189 | long ret; |
190 | int skip; | ||
177 | 191 | ||
178 | /* | 192 | /* |
179 | * No point in checking CS -- the only way to get here is a user mode | 193 | * No point in checking CS -- the only way to get here is a user mode |
@@ -205,9 +219,6 @@ bool emulate_vsyscall(struct pt_regs *regs, unsigned long address) | |||
205 | } | 219 | } |
206 | 220 | ||
207 | tsk = current; | 221 | tsk = current; |
208 | if (seccomp_mode(&tsk->seccomp)) | ||
209 | do_exit(SIGKILL); | ||
210 | |||
211 | /* | 222 | /* |
212 | * With a real vsyscall, page faults cause SIGSEGV. We want to | 223 | * With a real vsyscall, page faults cause SIGSEGV. We want to |
213 | * preserve that behavior to make writing exploits harder. | 224 | * preserve that behavior to make writing exploits harder. |
@@ -222,8 +233,13 @@ bool emulate_vsyscall(struct pt_regs *regs, unsigned long address) | |||
222 | * address 0". | 233 | * address 0". |
223 | */ | 234 | */ |
224 | ret = -EFAULT; | 235 | ret = -EFAULT; |
236 | skip = 0; | ||
225 | switch (vsyscall_nr) { | 237 | switch (vsyscall_nr) { |
226 | case 0: | 238 | case 0: |
239 | skip = vsyscall_seccomp(tsk, __NR_gettimeofday); | ||
240 | if (skip) | ||
241 | break; | ||
242 | |||
227 | if (!write_ok_or_segv(regs->di, sizeof(struct timeval)) || | 243 | if (!write_ok_or_segv(regs->di, sizeof(struct timeval)) || |
228 | !write_ok_or_segv(regs->si, sizeof(struct timezone))) | 244 | !write_ok_or_segv(regs->si, sizeof(struct timezone))) |
229 | break; | 245 | break; |
@@ -234,6 +250,10 @@ bool emulate_vsyscall(struct pt_regs *regs, unsigned long address) | |||
234 | break; | 250 | break; |
235 | 251 | ||
236 | case 1: | 252 | case 1: |
253 | skip = vsyscall_seccomp(tsk, __NR_time); | ||
254 | if (skip) | ||
255 | break; | ||
256 | |||
237 | if (!write_ok_or_segv(regs->di, sizeof(time_t))) | 257 | if (!write_ok_or_segv(regs->di, sizeof(time_t))) |
238 | break; | 258 | break; |
239 | 259 | ||
@@ -241,6 +261,10 @@ bool emulate_vsyscall(struct pt_regs *regs, unsigned long address) | |||
241 | break; | 261 | break; |
242 | 262 | ||
243 | case 2: | 263 | case 2: |
264 | skip = vsyscall_seccomp(tsk, __NR_getcpu); | ||
265 | if (skip) | ||
266 | break; | ||
267 | |||
244 | if (!write_ok_or_segv(regs->di, sizeof(unsigned)) || | 268 | if (!write_ok_or_segv(regs->di, sizeof(unsigned)) || |
245 | !write_ok_or_segv(regs->si, sizeof(unsigned))) | 269 | !write_ok_or_segv(regs->si, sizeof(unsigned))) |
246 | break; | 270 | break; |
@@ -253,6 +277,12 @@ bool emulate_vsyscall(struct pt_regs *regs, unsigned long address) | |||
253 | 277 | ||
254 | current_thread_info()->sig_on_uaccess_error = prev_sig_on_uaccess_error; | 278 | current_thread_info()->sig_on_uaccess_error = prev_sig_on_uaccess_error; |
255 | 279 | ||
280 | if (skip) { | ||
281 | if ((long)regs->ax <= 0L) /* seccomp errno emulation */ | ||
282 | goto do_ret; | ||
283 | goto done; /* seccomp trace/trap */ | ||
284 | } | ||
285 | |||
256 | if (ret == -EFAULT) { | 286 | if (ret == -EFAULT) { |
257 | /* Bad news -- userspace fed a bad pointer to a vsyscall. */ | 287 | /* Bad news -- userspace fed a bad pointer to a vsyscall. */ |
258 | warn_bad_vsyscall(KERN_INFO, regs, | 288 | warn_bad_vsyscall(KERN_INFO, regs, |
@@ -271,10 +301,11 @@ bool emulate_vsyscall(struct pt_regs *regs, unsigned long address) | |||
271 | 301 | ||
272 | regs->ax = ret; | 302 | regs->ax = ret; |
273 | 303 | ||
304 | do_ret: | ||
274 | /* Emulate a ret instruction. */ | 305 | /* Emulate a ret instruction. */ |
275 | regs->ip = caller; | 306 | regs->ip = caller; |
276 | regs->sp += 8; | 307 | regs->sp += 8; |
277 | 308 | done: | |
278 | return true; | 309 | return true; |
279 | 310 | ||
280 | sigsegv: | 311 | sigsegv: |
diff --git a/arch/xtensa/kernel/process.c b/arch/xtensa/kernel/process.c index 9b306e550e3f..2c8d6a3d250a 100644 --- a/arch/xtensa/kernel/process.c +++ b/arch/xtensa/kernel/process.c | |||
@@ -277,7 +277,7 @@ void xtensa_elf_core_copy_regs (xtensa_gregset_t *elfregs, struct pt_regs *regs) | |||
277 | 277 | ||
278 | /* Don't leak any random bits. */ | 278 | /* Don't leak any random bits. */ |
279 | 279 | ||
280 | memset(elfregs, 0, sizeof (elfregs)); | 280 | memset(elfregs, 0, sizeof(*elfregs)); |
281 | 281 | ||
282 | /* Note: PS.EXCM is not set while user task is running; its | 282 | /* Note: PS.EXCM is not set while user task is running; its |
283 | * being set in regs->ps is for exception handling convenience. | 283 | * being set in regs->ps is for exception handling convenience. |