diff options
Diffstat (limited to 'arch')
787 files changed, 14263 insertions, 11083 deletions
diff --git a/arch/Kconfig b/arch/Kconfig index f1cf895c040f..80bbb8ccd0d1 100644 --- a/arch/Kconfig +++ b/arch/Kconfig | |||
@@ -336,6 +336,73 @@ config SECCOMP_FILTER | |||
336 | 336 | ||
337 | See Documentation/prctl/seccomp_filter.txt for details. | 337 | See Documentation/prctl/seccomp_filter.txt for details. |
338 | 338 | ||
339 | config HAVE_CC_STACKPROTECTOR | ||
340 | bool | ||
341 | help | ||
342 | An arch should select this symbol if: | ||
343 | - its compiler supports the -fstack-protector option | ||
344 | - it has implemented a stack canary (e.g. __stack_chk_guard) | ||
345 | |||
346 | config CC_STACKPROTECTOR | ||
347 | def_bool n | ||
348 | help | ||
349 | Set when a stack-protector mode is enabled, so that the build | ||
350 | can enable kernel-side support for the GCC feature. | ||
351 | |||
352 | choice | ||
353 | prompt "Stack Protector buffer overflow detection" | ||
354 | depends on HAVE_CC_STACKPROTECTOR | ||
355 | default CC_STACKPROTECTOR_NONE | ||
356 | help | ||
357 | This option turns on the "stack-protector" GCC feature. This | ||
358 | feature puts, at the beginning of functions, a canary value on | ||
359 | the stack just before the return address, and validates | ||
360 | the value just before actually returning. Stack based buffer | ||
361 | overflows (that need to overwrite this return address) now also | ||
362 | overwrite the canary, which gets detected and the attack is then | ||
363 | neutralized via a kernel panic. | ||
364 | |||
365 | config CC_STACKPROTECTOR_NONE | ||
366 | bool "None" | ||
367 | help | ||
368 | Disable "stack-protector" GCC feature. | ||
369 | |||
370 | config CC_STACKPROTECTOR_REGULAR | ||
371 | bool "Regular" | ||
372 | select CC_STACKPROTECTOR | ||
373 | help | ||
374 | Functions will have the stack-protector canary logic added if they | ||
375 | have an 8-byte or larger character array on the stack. | ||
376 | |||
377 | This feature requires gcc version 4.2 or above, or a distribution | ||
378 | gcc with the feature backported ("-fstack-protector"). | ||
379 | |||
380 | On an x86 "defconfig" build, this feature adds canary checks to | ||
381 | about 3% of all kernel functions, which increases kernel code size | ||
382 | by about 0.3%. | ||
383 | |||
384 | config CC_STACKPROTECTOR_STRONG | ||
385 | bool "Strong" | ||
386 | select CC_STACKPROTECTOR | ||
387 | help | ||
388 | Functions will have the stack-protector canary logic added in any | ||
389 | of the following conditions: | ||
390 | |||
391 | - local variable's address used as part of the right hand side of an | ||
392 | assignment or function argument | ||
393 | - local variable is an array (or union containing an array), | ||
394 | regardless of array type or length | ||
395 | - uses register local variables | ||
396 | |||
397 | This feature requires gcc version 4.9 or above, or a distribution | ||
398 | gcc with the feature backported ("-fstack-protector-strong"). | ||
399 | |||
400 | On an x86 "defconfig" build, this feature adds canary checks to | ||
401 | about 20% of all kernel functions, which increases the kernel code | ||
402 | size by about 2%. | ||
403 | |||
404 | endchoice | ||
405 | |||
339 | config HAVE_CONTEXT_TRACKING | 406 | config HAVE_CONTEXT_TRACKING |
340 | bool | 407 | bool |
341 | help | 408 | help |
diff --git a/arch/alpha/include/asm/barrier.h b/arch/alpha/include/asm/barrier.h index ce8860a0b32d..3832bdb794fe 100644 --- a/arch/alpha/include/asm/barrier.h +++ b/arch/alpha/include/asm/barrier.h | |||
@@ -3,33 +3,18 @@ | |||
3 | 3 | ||
4 | #include <asm/compiler.h> | 4 | #include <asm/compiler.h> |
5 | 5 | ||
6 | #define mb() \ | 6 | #define mb() __asm__ __volatile__("mb": : :"memory") |
7 | __asm__ __volatile__("mb": : :"memory") | 7 | #define rmb() __asm__ __volatile__("mb": : :"memory") |
8 | #define wmb() __asm__ __volatile__("wmb": : :"memory") | ||
8 | 9 | ||
9 | #define rmb() \ | 10 | #define read_barrier_depends() __asm__ __volatile__("mb": : :"memory") |
10 | __asm__ __volatile__("mb": : :"memory") | ||
11 | |||
12 | #define wmb() \ | ||
13 | __asm__ __volatile__("wmb": : :"memory") | ||
14 | |||
15 | #define read_barrier_depends() \ | ||
16 | __asm__ __volatile__("mb": : :"memory") | ||
17 | 11 | ||
18 | #ifdef CONFIG_SMP | 12 | #ifdef CONFIG_SMP |
19 | #define __ASM_SMP_MB "\tmb\n" | 13 | #define __ASM_SMP_MB "\tmb\n" |
20 | #define smp_mb() mb() | ||
21 | #define smp_rmb() rmb() | ||
22 | #define smp_wmb() wmb() | ||
23 | #define smp_read_barrier_depends() read_barrier_depends() | ||
24 | #else | 14 | #else |
25 | #define __ASM_SMP_MB | 15 | #define __ASM_SMP_MB |
26 | #define smp_mb() barrier() | ||
27 | #define smp_rmb() barrier() | ||
28 | #define smp_wmb() barrier() | ||
29 | #define smp_read_barrier_depends() do { } while (0) | ||
30 | #endif | 16 | #endif |
31 | 17 | ||
32 | #define set_mb(var, value) \ | 18 | #include <asm-generic/barrier.h> |
33 | do { var = value; mb(); } while (0) | ||
34 | 19 | ||
35 | #endif /* __BARRIER_H */ | 20 | #endif /* __BARRIER_H */ |
diff --git a/arch/arc/Kconfig b/arch/arc/Kconfig index 2ee0c9bfd032..9063ae6553cc 100644 --- a/arch/arc/Kconfig +++ b/arch/arc/Kconfig | |||
@@ -8,6 +8,7 @@ | |||
8 | 8 | ||
9 | config ARC | 9 | config ARC |
10 | def_bool y | 10 | def_bool y |
11 | select BUILDTIME_EXTABLE_SORT | ||
11 | select CLONE_BACKWARDS | 12 | select CLONE_BACKWARDS |
12 | # ARC Busybox based initramfs absolutely relies on DEVTMPFS for /dev | 13 | # ARC Busybox based initramfs absolutely relies on DEVTMPFS for /dev |
13 | select DEVTMPFS if !INITRAMFS_SOURCE="" | 14 | select DEVTMPFS if !INITRAMFS_SOURCE="" |
diff --git a/arch/arc/include/asm/Kbuild b/arch/arc/include/asm/Kbuild index 5943f7f9d325..9ae21c198007 100644 --- a/arch/arc/include/asm/Kbuild +++ b/arch/arc/include/asm/Kbuild | |||
@@ -1,4 +1,5 @@ | |||
1 | generic-y += auxvec.h | 1 | generic-y += auxvec.h |
2 | generic-y += barrier.h | ||
2 | generic-y += bugs.h | 3 | generic-y += bugs.h |
3 | generic-y += bitsperlong.h | 4 | generic-y += bitsperlong.h |
4 | generic-y += clkdev.h | 5 | generic-y += clkdev.h |
diff --git a/arch/arc/include/asm/atomic.h b/arch/arc/include/asm/atomic.h index 83f03ca6caf6..03e494f695d1 100644 --- a/arch/arc/include/asm/atomic.h +++ b/arch/arc/include/asm/atomic.h | |||
@@ -190,6 +190,11 @@ static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr) | |||
190 | 190 | ||
191 | #endif /* !CONFIG_ARC_HAS_LLSC */ | 191 | #endif /* !CONFIG_ARC_HAS_LLSC */ |
192 | 192 | ||
193 | #define smp_mb__before_atomic_dec() barrier() | ||
194 | #define smp_mb__after_atomic_dec() barrier() | ||
195 | #define smp_mb__before_atomic_inc() barrier() | ||
196 | #define smp_mb__after_atomic_inc() barrier() | ||
197 | |||
193 | /** | 198 | /** |
194 | * __atomic_add_unless - add unless the number is a given value | 199 | * __atomic_add_unless - add unless the number is a given value |
195 | * @v: pointer of type atomic_t | 200 | * @v: pointer of type atomic_t |
diff --git a/arch/arc/include/asm/barrier.h b/arch/arc/include/asm/barrier.h index f6cb7c4ffb35..c32245c3d1e9 100644 --- a/arch/arc/include/asm/barrier.h +++ b/arch/arc/include/asm/barrier.h | |||
@@ -30,11 +30,6 @@ | |||
30 | #define smp_wmb() barrier() | 30 | #define smp_wmb() barrier() |
31 | #endif | 31 | #endif |
32 | 32 | ||
33 | #define smp_mb__before_atomic_dec() barrier() | ||
34 | #define smp_mb__after_atomic_dec() barrier() | ||
35 | #define smp_mb__before_atomic_inc() barrier() | ||
36 | #define smp_mb__after_atomic_inc() barrier() | ||
37 | |||
38 | #define smp_read_barrier_depends() do { } while (0) | 33 | #define smp_read_barrier_depends() do { } while (0) |
39 | 34 | ||
40 | #endif | 35 | #endif |
diff --git a/arch/arc/include/uapi/asm/unistd.h b/arch/arc/include/uapi/asm/unistd.h index 6f30484f34b7..39e58d1cdf90 100644 --- a/arch/arc/include/uapi/asm/unistd.h +++ b/arch/arc/include/uapi/asm/unistd.h | |||
@@ -8,6 +8,13 @@ | |||
8 | 8 | ||
9 | /******** no-legacy-syscalls-ABI *******/ | 9 | /******** no-legacy-syscalls-ABI *******/ |
10 | 10 | ||
11 | /* | ||
12 | * Non-typical guard macro to enable inclusion twice in ARCH sys.c | ||
13 | * That is how the Generic syscall wrapper generator works | ||
14 | */ | ||
15 | #if !defined(_UAPI_ASM_ARC_UNISTD_H) || defined(__SYSCALL) | ||
16 | #define _UAPI_ASM_ARC_UNISTD_H | ||
17 | |||
11 | #define __ARCH_WANT_SYS_EXECVE | 18 | #define __ARCH_WANT_SYS_EXECVE |
12 | #define __ARCH_WANT_SYS_CLONE | 19 | #define __ARCH_WANT_SYS_CLONE |
13 | #define __ARCH_WANT_SYS_VFORK | 20 | #define __ARCH_WANT_SYS_VFORK |
@@ -32,3 +39,7 @@ __SYSCALL(__NR_arc_gettls, sys_arc_gettls) | |||
32 | /* Generic syscall (fs/filesystems.c - lost in asm-generic/unistd.h */ | 39 | /* Generic syscall (fs/filesystems.c - lost in asm-generic/unistd.h */ |
33 | #define __NR_sysfs (__NR_arch_specific_syscall + 3) | 40 | #define __NR_sysfs (__NR_arch_specific_syscall + 3) |
34 | __SYSCALL(__NR_sysfs, sys_sysfs) | 41 | __SYSCALL(__NR_sysfs, sys_sysfs) |
42 | |||
43 | #undef __SYSCALL | ||
44 | |||
45 | #endif | ||
diff --git a/arch/arc/kernel/perf_event.c b/arch/arc/kernel/perf_event.c index e46d81f70979..63177e4cb66d 100644 --- a/arch/arc/kernel/perf_event.c +++ b/arch/arc/kernel/perf_event.c | |||
@@ -79,9 +79,9 @@ static int arc_pmu_cache_event(u64 config) | |||
79 | cache_result = (config >> 16) & 0xff; | 79 | cache_result = (config >> 16) & 0xff; |
80 | if (cache_type >= PERF_COUNT_HW_CACHE_MAX) | 80 | if (cache_type >= PERF_COUNT_HW_CACHE_MAX) |
81 | return -EINVAL; | 81 | return -EINVAL; |
82 | if (cache_type >= PERF_COUNT_HW_CACHE_OP_MAX) | 82 | if (cache_op >= PERF_COUNT_HW_CACHE_OP_MAX) |
83 | return -EINVAL; | 83 | return -EINVAL; |
84 | if (cache_type >= PERF_COUNT_HW_CACHE_RESULT_MAX) | 84 | if (cache_result >= PERF_COUNT_HW_CACHE_RESULT_MAX) |
85 | return -EINVAL; | 85 | return -EINVAL; |
86 | 86 | ||
87 | ret = arc_pmu_cache_map[cache_type][cache_op][cache_result]; | 87 | ret = arc_pmu_cache_map[cache_type][cache_op][cache_result]; |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index c1f1a7eee953..ab1689c96a71 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -30,6 +30,7 @@ config ARM | |||
30 | select HAVE_BPF_JIT | 30 | select HAVE_BPF_JIT |
31 | select HAVE_CONTEXT_TRACKING | 31 | select HAVE_CONTEXT_TRACKING |
32 | select HAVE_C_RECORDMCOUNT | 32 | select HAVE_C_RECORDMCOUNT |
33 | select HAVE_CC_STACKPROTECTOR | ||
33 | select HAVE_DEBUG_KMEMLEAK | 34 | select HAVE_DEBUG_KMEMLEAK |
34 | select HAVE_DMA_API_DEBUG | 35 | select HAVE_DMA_API_DEBUG |
35 | select HAVE_DMA_ATTRS | 36 | select HAVE_DMA_ATTRS |
@@ -710,7 +711,6 @@ config ARCH_S3C24XX | |||
710 | select HAVE_S3C2410_WATCHDOG if WATCHDOG | 711 | select HAVE_S3C2410_WATCHDOG if WATCHDOG |
711 | select HAVE_S3C_RTC if RTC_CLASS | 712 | select HAVE_S3C_RTC if RTC_CLASS |
712 | select MULTI_IRQ_HANDLER | 713 | select MULTI_IRQ_HANDLER |
713 | select NEED_MACH_GPIO_H | ||
714 | select NEED_MACH_IO_H | 714 | select NEED_MACH_IO_H |
715 | select SAMSUNG_ATAGS | 715 | select SAMSUNG_ATAGS |
716 | help | 716 | help |
@@ -723,6 +723,7 @@ config ARCH_S3C64XX | |||
723 | bool "Samsung S3C64XX" | 723 | bool "Samsung S3C64XX" |
724 | select ARCH_HAS_CPUFREQ | 724 | select ARCH_HAS_CPUFREQ |
725 | select ARCH_REQUIRE_GPIOLIB | 725 | select ARCH_REQUIRE_GPIOLIB |
726 | select ARM_AMBA | ||
726 | select ARM_VIC | 727 | select ARM_VIC |
727 | select CLKDEV_LOOKUP | 728 | select CLKDEV_LOOKUP |
728 | select CLKSRC_SAMSUNG_PWM | 729 | select CLKSRC_SAMSUNG_PWM |
@@ -733,7 +734,6 @@ config ARCH_S3C64XX | |||
733 | select HAVE_S3C2410_I2C if I2C | 734 | select HAVE_S3C2410_I2C if I2C |
734 | select HAVE_S3C2410_WATCHDOG if WATCHDOG | 735 | select HAVE_S3C2410_WATCHDOG if WATCHDOG |
735 | select HAVE_TCM | 736 | select HAVE_TCM |
736 | select NEED_MACH_GPIO_H | ||
737 | select NO_IOPORT | 737 | select NO_IOPORT |
738 | select PLAT_SAMSUNG | 738 | select PLAT_SAMSUNG |
739 | select PM_GENERIC_DOMAINS | 739 | select PM_GENERIC_DOMAINS |
@@ -1593,7 +1593,7 @@ config ARM_PSCI | |||
1593 | config ARCH_NR_GPIO | 1593 | config ARCH_NR_GPIO |
1594 | int | 1594 | int |
1595 | default 1024 if ARCH_SHMOBILE || ARCH_TEGRA | 1595 | default 1024 if ARCH_SHMOBILE || ARCH_TEGRA |
1596 | default 512 if ARCH_EXYNOS || ARCH_KEYSTONE || SOC_OMAP5 || SOC_DRA7XX | 1596 | default 512 if ARCH_EXYNOS || ARCH_KEYSTONE || SOC_OMAP5 || SOC_DRA7XX || ARCH_S3C24XX || ARCH_S3C64XX |
1597 | default 392 if ARCH_U8500 | 1597 | default 392 if ARCH_U8500 |
1598 | default 352 if ARCH_VT8500 | 1598 | default 352 if ARCH_VT8500 |
1599 | default 288 if ARCH_SUNXI | 1599 | default 288 if ARCH_SUNXI |
@@ -1856,18 +1856,6 @@ config SECCOMP | |||
1856 | and the task is only allowed to execute a few safe syscalls | 1856 | and the task is only allowed to execute a few safe syscalls |
1857 | defined by each seccomp mode. | 1857 | defined by each seccomp mode. |
1858 | 1858 | ||
1859 | config CC_STACKPROTECTOR | ||
1860 | bool "Enable -fstack-protector buffer overflow detection (EXPERIMENTAL)" | ||
1861 | help | ||
1862 | This option turns on the -fstack-protector GCC feature. This | ||
1863 | feature puts, at the beginning of functions, a canary value on | ||
1864 | the stack just before the return address, and validates | ||
1865 | the value just before actually returning. Stack based buffer | ||
1866 | overflows (that need to overwrite this return address) now also | ||
1867 | overwrite the canary, which gets detected and the attack is then | ||
1868 | neutralized via a kernel panic. | ||
1869 | This feature requires gcc version 4.2 or above. | ||
1870 | |||
1871 | config SWIOTLB | 1859 | config SWIOTLB |
1872 | def_bool y | 1860 | def_bool y |
1873 | 1861 | ||
diff --git a/arch/arm/Makefile b/arch/arm/Makefile index c99b1086d83d..55b4255ad6ed 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile | |||
@@ -40,10 +40,6 @@ ifeq ($(CONFIG_FRAME_POINTER),y) | |||
40 | KBUILD_CFLAGS +=-fno-omit-frame-pointer -mapcs -mno-sched-prolog | 40 | KBUILD_CFLAGS +=-fno-omit-frame-pointer -mapcs -mno-sched-prolog |
41 | endif | 41 | endif |
42 | 42 | ||
43 | ifeq ($(CONFIG_CC_STACKPROTECTOR),y) | ||
44 | KBUILD_CFLAGS +=-fstack-protector | ||
45 | endif | ||
46 | |||
47 | ifeq ($(CONFIG_CPU_BIG_ENDIAN),y) | 43 | ifeq ($(CONFIG_CPU_BIG_ENDIAN),y) |
48 | KBUILD_CPPFLAGS += -mbig-endian | 44 | KBUILD_CPPFLAGS += -mbig-endian |
49 | AS += -EB | 45 | AS += -EB |
diff --git a/arch/arm/boot/compressed/misc.c b/arch/arm/boot/compressed/misc.c index 31bd43b82095..d4f891f56996 100644 --- a/arch/arm/boot/compressed/misc.c +++ b/arch/arm/boot/compressed/misc.c | |||
@@ -127,6 +127,18 @@ asmlinkage void __div0(void) | |||
127 | error("Attempting division by 0!"); | 127 | error("Attempting division by 0!"); |
128 | } | 128 | } |
129 | 129 | ||
130 | unsigned long __stack_chk_guard; | ||
131 | |||
132 | void __stack_chk_guard_setup(void) | ||
133 | { | ||
134 | __stack_chk_guard = 0x000a0dff; | ||
135 | } | ||
136 | |||
137 | void __stack_chk_fail(void) | ||
138 | { | ||
139 | error("stack-protector: Kernel stack is corrupted\n"); | ||
140 | } | ||
141 | |||
130 | extern int do_decompress(u8 *input, int len, u8 *output, void (*error)(char *x)); | 142 | extern int do_decompress(u8 *input, int len, u8 *output, void (*error)(char *x)); |
131 | 143 | ||
132 | 144 | ||
@@ -137,6 +149,8 @@ decompress_kernel(unsigned long output_start, unsigned long free_mem_ptr_p, | |||
137 | { | 149 | { |
138 | int ret; | 150 | int ret; |
139 | 151 | ||
152 | __stack_chk_guard_setup(); | ||
153 | |||
140 | output_data = (unsigned char *)output_start; | 154 | output_data = (unsigned char *)output_start; |
141 | free_mem_ptr = free_mem_ptr_p; | 155 | free_mem_ptr = free_mem_ptr_p; |
142 | free_mem_end_ptr = free_mem_ptr_end_p; | 156 | free_mem_end_ptr = free_mem_ptr_end_p; |
diff --git a/arch/arm/boot/dts/am335x-base0033.dts b/arch/arm/boot/dts/am335x-base0033.dts index b4f95c2bbf74..72a9b3fc4251 100644 --- a/arch/arm/boot/dts/am335x-base0033.dts +++ b/arch/arm/boot/dts/am335x-base0033.dts | |||
@@ -13,4 +13,83 @@ | |||
13 | / { | 13 | / { |
14 | model = "IGEP COM AM335x on AQUILA Expansion"; | 14 | model = "IGEP COM AM335x on AQUILA Expansion"; |
15 | compatible = "isee,am335x-base0033", "isee,am335x-igep0033", "ti,am33xx"; | 15 | compatible = "isee,am335x-base0033", "isee,am335x-igep0033", "ti,am33xx"; |
16 | |||
17 | hdmi { | ||
18 | compatible = "ti,tilcdc,slave"; | ||
19 | i2c = <&i2c0>; | ||
20 | pinctrl-names = "default", "off"; | ||
21 | pinctrl-0 = <&nxp_hdmi_pins>; | ||
22 | pinctrl-1 = <&nxp_hdmi_off_pins>; | ||
23 | status = "okay"; | ||
24 | }; | ||
25 | |||
26 | leds_base { | ||
27 | pinctrl-names = "default"; | ||
28 | pinctrl-0 = <&leds_base_pins>; | ||
29 | |||
30 | compatible = "gpio-leds"; | ||
31 | |||
32 | led@0 { | ||
33 | label = "base:red:user"; | ||
34 | gpios = <&gpio1 21 GPIO_ACTIVE_HIGH>; /* gpio1_21 */ | ||
35 | default-state = "off"; | ||
36 | }; | ||
37 | |||
38 | led@1 { | ||
39 | label = "base:green:user"; | ||
40 | gpios = <&gpio2 0 GPIO_ACTIVE_HIGH>; /* gpio2_0 */ | ||
41 | default-state = "off"; | ||
42 | }; | ||
43 | }; | ||
44 | }; | ||
45 | |||
46 | &am33xx_pinmux { | ||
47 | nxp_hdmi_pins: pinmux_nxp_hdmi_pins { | ||
48 | pinctrl-single,pins = < | ||
49 | 0x1b0 (PIN_OUTPUT | MUX_MODE3) /* xdma_event_intr0.clkout1 */ | ||
50 | 0xa0 (PIN_OUTPUT | MUX_MODE0) /* lcd_data0 */ | ||
51 | 0xa4 (PIN_OUTPUT | MUX_MODE0) /* lcd_data1 */ | ||
52 | 0xa8 (PIN_OUTPUT | MUX_MODE0) /* lcd_data2 */ | ||
53 | 0xac (PIN_OUTPUT | MUX_MODE0) /* lcd_data3 */ | ||
54 | 0xb0 (PIN_OUTPUT | MUX_MODE0) /* lcd_data4 */ | ||
55 | 0xb4 (PIN_OUTPUT | MUX_MODE0) /* lcd_data5 */ | ||
56 | 0xb8 (PIN_OUTPUT | MUX_MODE0) /* lcd_data6 */ | ||
57 | 0xbc (PIN_OUTPUT | MUX_MODE0) /* lcd_data7 */ | ||
58 | 0xc0 (PIN_OUTPUT | MUX_MODE0) /* lcd_data8 */ | ||
59 | 0xc4 (PIN_OUTPUT | MUX_MODE0) /* lcd_data9 */ | ||
60 | 0xc8 (PIN_OUTPUT | MUX_MODE0) /* lcd_data10 */ | ||
61 | 0xcc (PIN_OUTPUT | MUX_MODE0) /* lcd_data11 */ | ||
62 | 0xd0 (PIN_OUTPUT | MUX_MODE0) /* lcd_data12 */ | ||
63 | 0xd4 (PIN_OUTPUT | MUX_MODE0) /* lcd_data13 */ | ||
64 | 0xd8 (PIN_OUTPUT | MUX_MODE0) /* lcd_data14 */ | ||
65 | 0xdc (PIN_OUTPUT | MUX_MODE0) /* lcd_data15 */ | ||
66 | 0xe0 (PIN_OUTPUT | MUX_MODE0) /* lcd_vsync */ | ||
67 | 0xe4 (PIN_OUTPUT | MUX_MODE0) /* lcd_hsync */ | ||
68 | 0xe8 (PIN_OUTPUT | MUX_MODE0) /* lcd_pclk */ | ||
69 | 0xec (PIN_OUTPUT | MUX_MODE0) /* lcd_ac_bias_en */ | ||
70 | >; | ||
71 | }; | ||
72 | nxp_hdmi_off_pins: pinmux_nxp_hdmi_off_pins { | ||
73 | pinctrl-single,pins = < | ||
74 | 0x1b0 (PIN_OUTPUT | MUX_MODE3) /* xdma_event_intr0.clkout1 */ | ||
75 | >; | ||
76 | }; | ||
77 | |||
78 | leds_base_pins: pinmux_leds_base_pins { | ||
79 | pinctrl-single,pins = < | ||
80 | 0x54 (PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* gpmc_a5.gpio1_21 */ | ||
81 | 0x88 (PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* gpmc_csn3.gpio2_0 */ | ||
82 | >; | ||
83 | }; | ||
84 | }; | ||
85 | |||
86 | &lcdc { | ||
87 | status = "okay"; | ||
88 | }; | ||
89 | |||
90 | &i2c0 { | ||
91 | eeprom: eeprom@50 { | ||
92 | compatible = "at,24c256"; | ||
93 | reg = <0x50>; | ||
94 | }; | ||
16 | }; | 95 | }; |
diff --git a/arch/arm/boot/dts/am335x-igep0033.dtsi b/arch/arm/boot/dts/am335x-igep0033.dtsi index 619624479311..7063311a58d9 100644 --- a/arch/arm/boot/dts/am335x-igep0033.dtsi +++ b/arch/arm/boot/dts/am335x-igep0033.dtsi | |||
@@ -199,6 +199,35 @@ | |||
199 | pinctrl-0 = <&uart0_pins>; | 199 | pinctrl-0 = <&uart0_pins>; |
200 | }; | 200 | }; |
201 | 201 | ||
202 | &usb { | ||
203 | status = "okay"; | ||
204 | |||
205 | control@44e10000 { | ||
206 | status = "okay"; | ||
207 | }; | ||
208 | |||
209 | usb-phy@47401300 { | ||
210 | status = "okay"; | ||
211 | }; | ||
212 | |||
213 | usb-phy@47401b00 { | ||
214 | status = "okay"; | ||
215 | }; | ||
216 | |||
217 | usb@47401000 { | ||
218 | status = "okay"; | ||
219 | }; | ||
220 | |||
221 | usb@47401800 { | ||
222 | status = "okay"; | ||
223 | dr_mode = "host"; | ||
224 | }; | ||
225 | |||
226 | dma-controller@07402000 { | ||
227 | status = "okay"; | ||
228 | }; | ||
229 | }; | ||
230 | |||
202 | #include "tps65910.dtsi" | 231 | #include "tps65910.dtsi" |
203 | 232 | ||
204 | &tps { | 233 | &tps { |
diff --git a/arch/arm/boot/dts/am3517-evm.dts b/arch/arm/boot/dts/am3517-evm.dts index e99dfaf70052..03fcbf0a88a8 100644 --- a/arch/arm/boot/dts/am3517-evm.dts +++ b/arch/arm/boot/dts/am3517-evm.dts | |||
@@ -7,11 +7,11 @@ | |||
7 | */ | 7 | */ |
8 | /dts-v1/; | 8 | /dts-v1/; |
9 | 9 | ||
10 | #include "omap34xx.dtsi" | 10 | #include "am3517.dtsi" |
11 | 11 | ||
12 | / { | 12 | / { |
13 | model = "TI AM3517 EVM (AM3517/05)"; | 13 | model = "TI AM3517 EVM (AM3517/05 TMDSEVM3517)"; |
14 | compatible = "ti,am3517-evm", "ti,omap3"; | 14 | compatible = "ti,am3517-evm", "ti,am3517", "ti,omap3"; |
15 | 15 | ||
16 | memory { | 16 | memory { |
17 | device_type = "memory"; | 17 | device_type = "memory"; |
diff --git a/arch/arm/boot/dts/am3517.dtsi b/arch/arm/boot/dts/am3517.dtsi new file mode 100644 index 000000000000..2fbe02faa8b1 --- /dev/null +++ b/arch/arm/boot/dts/am3517.dtsi | |||
@@ -0,0 +1,63 @@ | |||
1 | /* | ||
2 | * Device Tree Source for am3517 SoC | ||
3 | * | ||
4 | * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com/ | ||
5 | * | ||
6 | * This file is licensed under the terms of the GNU General Public License | ||
7 | * version 2. This program is licensed "as is" without any warranty of any | ||
8 | * kind, whether express or implied. | ||
9 | */ | ||
10 | |||
11 | #include "omap3.dtsi" | ||
12 | |||
13 | / { | ||
14 | aliases { | ||
15 | serial3 = &uart4; | ||
16 | }; | ||
17 | |||
18 | ocp { | ||
19 | am35x_otg_hs: am35x_otg_hs@5c040000 { | ||
20 | compatible = "ti,omap3-musb"; | ||
21 | ti,hwmods = "am35x_otg_hs"; | ||
22 | status = "disabled"; | ||
23 | reg = <0x5c040000 0x1000>; | ||
24 | interrupts = <71>; | ||
25 | interrupt-names = "mc"; | ||
26 | }; | ||
27 | |||
28 | davinci_emac: ethernet@0x5c000000 { | ||
29 | compatible = "ti,am3517-emac"; | ||
30 | ti,hwmods = "davinci_emac"; | ||
31 | status = "disabled"; | ||
32 | reg = <0x5c000000 0x30000>; | ||
33 | interrupts = <67 68 69 70>; | ||
34 | ti,davinci-ctrl-reg-offset = <0x10000>; | ||
35 | ti,davinci-ctrl-mod-reg-offset = <0>; | ||
36 | ti,davinci-ctrl-ram-offset = <0x20000>; | ||
37 | ti,davinci-ctrl-ram-size = <0x2000>; | ||
38 | ti,davinci-rmii-en = /bits/ 8 <1>; | ||
39 | local-mac-address = [ 00 00 00 00 00 00 ]; | ||
40 | }; | ||
41 | |||
42 | davinci_mdio: ethernet@0x5c030000 { | ||
43 | compatible = "ti,davinci_mdio"; | ||
44 | ti,hwmods = "davinci_mdio"; | ||
45 | status = "disabled"; | ||
46 | reg = <0x5c030000 0x1000>; | ||
47 | bus_freq = <1000000>; | ||
48 | #address-cells = <1>; | ||
49 | #size-cells = <0>; | ||
50 | }; | ||
51 | |||
52 | uart4: serial@4809e000 { | ||
53 | compatible = "ti,omap3-uart"; | ||
54 | ti,hwmods = "uart4"; | ||
55 | status = "disabled"; | ||
56 | reg = <0x4809e000 0x400>; | ||
57 | interrupts = <84>; | ||
58 | dmas = <&sdma 55 &sdma 54>; | ||
59 | dma-names = "tx", "rx"; | ||
60 | clock-frequency = <48000000>; | ||
61 | }; | ||
62 | }; | ||
63 | }; | ||
diff --git a/arch/arm/boot/dts/armada-370-db.dts b/arch/arm/boot/dts/armada-370-db.dts index 90ce29dbe119..08a56bcfc724 100644 --- a/arch/arm/boot/dts/armada-370-db.dts +++ b/arch/arm/boot/dts/armada-370-db.dts | |||
@@ -99,22 +99,22 @@ | |||
99 | spi-max-frequency = <50000000>; | 99 | spi-max-frequency = <50000000>; |
100 | }; | 100 | }; |
101 | }; | 101 | }; |
102 | }; | ||
102 | 103 | ||
103 | pcie-controller { | 104 | pcie-controller { |
105 | status = "okay"; | ||
106 | /* | ||
107 | * The two PCIe units are accessible through | ||
108 | * both standard PCIe slots and mini-PCIe | ||
109 | * slots on the board. | ||
110 | */ | ||
111 | pcie@1,0 { | ||
112 | /* Port 0, Lane 0 */ | ||
113 | status = "okay"; | ||
114 | }; | ||
115 | pcie@2,0 { | ||
116 | /* Port 1, Lane 0 */ | ||
104 | status = "okay"; | 117 | status = "okay"; |
105 | /* | ||
106 | * The two PCIe units are accessible through | ||
107 | * both standard PCIe slots and mini-PCIe | ||
108 | * slots on the board. | ||
109 | */ | ||
110 | pcie@1,0 { | ||
111 | /* Port 0, Lane 0 */ | ||
112 | status = "okay"; | ||
113 | }; | ||
114 | pcie@2,0 { | ||
115 | /* Port 1, Lane 0 */ | ||
116 | status = "okay"; | ||
117 | }; | ||
118 | }; | 118 | }; |
119 | }; | 119 | }; |
120 | }; | 120 | }; |
diff --git a/arch/arm/boot/dts/armada-370-xp.dtsi b/arch/arm/boot/dts/armada-370-xp.dtsi index 00d6a798c705..80ffacd128f8 100644 --- a/arch/arm/boot/dts/armada-370-xp.dtsi +++ b/arch/arm/boot/dts/armada-370-xp.dtsi | |||
@@ -118,7 +118,7 @@ | |||
118 | 118 | ||
119 | coherency-fabric@20200 { | 119 | coherency-fabric@20200 { |
120 | compatible = "marvell,coherency-fabric"; | 120 | compatible = "marvell,coherency-fabric"; |
121 | reg = <0x20200 0xb0>, <0x21810 0x1c>; | 121 | reg = <0x20200 0xb0>, <0x21010 0x1c>; |
122 | }; | 122 | }; |
123 | 123 | ||
124 | serial@12000 { | 124 | serial@12000 { |
@@ -152,7 +152,7 @@ | |||
152 | }; | 152 | }; |
153 | 153 | ||
154 | sata@a0000 { | 154 | sata@a0000 { |
155 | compatible = "marvell,orion-sata"; | 155 | compatible = "marvell,armada-370-sata"; |
156 | reg = <0xa0000 0x5000>; | 156 | reg = <0xa0000 0x5000>; |
157 | interrupts = <55>; | 157 | interrupts = <55>; |
158 | clocks = <&gateclk 15>, <&gateclk 30>; | 158 | clocks = <&gateclk 15>, <&gateclk 30>; |
diff --git a/arch/arm/boot/dts/armada-xp-mv78230.dtsi b/arch/arm/boot/dts/armada-xp-mv78230.dtsi index 3f5e6121c730..98335fb34b7a 100644 --- a/arch/arm/boot/dts/armada-xp-mv78230.dtsi +++ b/arch/arm/boot/dts/armada-xp-mv78230.dtsi | |||
@@ -47,7 +47,7 @@ | |||
47 | /* | 47 | /* |
48 | * MV78230 has 2 PCIe units Gen2.0: One unit can be | 48 | * MV78230 has 2 PCIe units Gen2.0: One unit can be |
49 | * configured as x4 or quad x1 lanes. One unit is | 49 | * configured as x4 or quad x1 lanes. One unit is |
50 | * x4/x1. | 50 | * x1 only. |
51 | */ | 51 | */ |
52 | pcie-controller { | 52 | pcie-controller { |
53 | compatible = "marvell,armada-xp-pcie"; | 53 | compatible = "marvell,armada-xp-pcie"; |
@@ -62,10 +62,10 @@ | |||
62 | 62 | ||
63 | ranges = | 63 | ranges = |
64 | <0x82000000 0 0x40000 MBUS_ID(0xf0, 0x01) 0x40000 0 0x00002000 /* Port 0.0 registers */ | 64 | <0x82000000 0 0x40000 MBUS_ID(0xf0, 0x01) 0x40000 0 0x00002000 /* Port 0.0 registers */ |
65 | 0x82000000 0 0x42000 MBUS_ID(0xf0, 0x01) 0x42000 0 0x00002000 /* Port 2.0 registers */ | ||
66 | 0x82000000 0 0x44000 MBUS_ID(0xf0, 0x01) 0x44000 0 0x00002000 /* Port 0.1 registers */ | 65 | 0x82000000 0 0x44000 MBUS_ID(0xf0, 0x01) 0x44000 0 0x00002000 /* Port 0.1 registers */ |
67 | 0x82000000 0 0x48000 MBUS_ID(0xf0, 0x01) 0x48000 0 0x00002000 /* Port 0.2 registers */ | 66 | 0x82000000 0 0x48000 MBUS_ID(0xf0, 0x01) 0x48000 0 0x00002000 /* Port 0.2 registers */ |
68 | 0x82000000 0 0x4c000 MBUS_ID(0xf0, 0x01) 0x4c000 0 0x00002000 /* Port 0.3 registers */ | 67 | 0x82000000 0 0x4c000 MBUS_ID(0xf0, 0x01) 0x4c000 0 0x00002000 /* Port 0.3 registers */ |
68 | 0x82000000 0 0x80000 MBUS_ID(0xf0, 0x01) 0x80000 0 0x00002000 /* Port 1.0 registers */ | ||
69 | 0x82000000 0x1 0 MBUS_ID(0x04, 0xe8) 0 1 0 /* Port 0.0 MEM */ | 69 | 0x82000000 0x1 0 MBUS_ID(0x04, 0xe8) 0 1 0 /* Port 0.0 MEM */ |
70 | 0x81000000 0x1 0 MBUS_ID(0x04, 0xe0) 0 1 0 /* Port 0.0 IO */ | 70 | 0x81000000 0x1 0 MBUS_ID(0x04, 0xe0) 0 1 0 /* Port 0.0 IO */ |
71 | 0x82000000 0x2 0 MBUS_ID(0x04, 0xd8) 0 1 0 /* Port 0.1 MEM */ | 71 | 0x82000000 0x2 0 MBUS_ID(0x04, 0xd8) 0 1 0 /* Port 0.1 MEM */ |
@@ -74,8 +74,8 @@ | |||
74 | 0x81000000 0x3 0 MBUS_ID(0x04, 0xb0) 0 1 0 /* Port 0.2 IO */ | 74 | 0x81000000 0x3 0 MBUS_ID(0x04, 0xb0) 0 1 0 /* Port 0.2 IO */ |
75 | 0x82000000 0x4 0 MBUS_ID(0x04, 0x78) 0 1 0 /* Port 0.3 MEM */ | 75 | 0x82000000 0x4 0 MBUS_ID(0x04, 0x78) 0 1 0 /* Port 0.3 MEM */ |
76 | 0x81000000 0x4 0 MBUS_ID(0x04, 0x70) 0 1 0 /* Port 0.3 IO */ | 76 | 0x81000000 0x4 0 MBUS_ID(0x04, 0x70) 0 1 0 /* Port 0.3 IO */ |
77 | 0x82000000 0x9 0 MBUS_ID(0x04, 0xf8) 0 1 0 /* Port 2.0 MEM */ | 77 | 0x82000000 0x5 0 MBUS_ID(0x08, 0xe8) 0 1 0 /* Port 1.0 MEM */ |
78 | 0x81000000 0x9 0 MBUS_ID(0x04, 0xf0) 0 1 0 /* Port 2.0 IO */>; | 78 | 0x81000000 0x5 0 MBUS_ID(0x08, 0xe0) 0 1 0 /* Port 1.0 IO */>; |
79 | 79 | ||
80 | pcie@1,0 { | 80 | pcie@1,0 { |
81 | device_type = "pci"; | 81 | device_type = "pci"; |
@@ -145,20 +145,20 @@ | |||
145 | status = "disabled"; | 145 | status = "disabled"; |
146 | }; | 146 | }; |
147 | 147 | ||
148 | pcie@9,0 { | 148 | pcie@5,0 { |
149 | device_type = "pci"; | 149 | device_type = "pci"; |
150 | assigned-addresses = <0x82000800 0 0x42000 0 0x2000>; | 150 | assigned-addresses = <0x82000800 0 0x80000 0 0x2000>; |
151 | reg = <0x4800 0 0 0 0>; | 151 | reg = <0x2800 0 0 0 0>; |
152 | #address-cells = <3>; | 152 | #address-cells = <3>; |
153 | #size-cells = <2>; | 153 | #size-cells = <2>; |
154 | #interrupt-cells = <1>; | 154 | #interrupt-cells = <1>; |
155 | ranges = <0x82000000 0 0 0x82000000 0x9 0 1 0 | 155 | ranges = <0x82000000 0 0 0x82000000 0x5 0 1 0 |
156 | 0x81000000 0 0 0x81000000 0x9 0 1 0>; | 156 | 0x81000000 0 0 0x81000000 0x5 0 1 0>; |
157 | interrupt-map-mask = <0 0 0 0>; | 157 | interrupt-map-mask = <0 0 0 0>; |
158 | interrupt-map = <0 0 0 0 &mpic 99>; | 158 | interrupt-map = <0 0 0 0 &mpic 62>; |
159 | marvell,pcie-port = <2>; | 159 | marvell,pcie-port = <1>; |
160 | marvell,pcie-lane = <0>; | 160 | marvell,pcie-lane = <0>; |
161 | clocks = <&gateclk 26>; | 161 | clocks = <&gateclk 9>; |
162 | status = "disabled"; | 162 | status = "disabled"; |
163 | }; | 163 | }; |
164 | }; | 164 | }; |
diff --git a/arch/arm/boot/dts/armada-xp-mv78260.dtsi b/arch/arm/boot/dts/armada-xp-mv78260.dtsi index 3e9fd1353f89..66609684d41b 100644 --- a/arch/arm/boot/dts/armada-xp-mv78260.dtsi +++ b/arch/arm/boot/dts/armada-xp-mv78260.dtsi | |||
@@ -48,7 +48,7 @@ | |||
48 | /* | 48 | /* |
49 | * MV78260 has 3 PCIe units Gen2.0: Two units can be | 49 | * MV78260 has 3 PCIe units Gen2.0: Two units can be |
50 | * configured as x4 or quad x1 lanes. One unit is | 50 | * configured as x4 or quad x1 lanes. One unit is |
51 | * x4/x1. | 51 | * x4 only. |
52 | */ | 52 | */ |
53 | pcie-controller { | 53 | pcie-controller { |
54 | compatible = "marvell,armada-xp-pcie"; | 54 | compatible = "marvell,armada-xp-pcie"; |
@@ -68,7 +68,9 @@ | |||
68 | 0x82000000 0 0x48000 MBUS_ID(0xf0, 0x01) 0x48000 0 0x00002000 /* Port 0.2 registers */ | 68 | 0x82000000 0 0x48000 MBUS_ID(0xf0, 0x01) 0x48000 0 0x00002000 /* Port 0.2 registers */ |
69 | 0x82000000 0 0x4c000 MBUS_ID(0xf0, 0x01) 0x4c000 0 0x00002000 /* Port 0.3 registers */ | 69 | 0x82000000 0 0x4c000 MBUS_ID(0xf0, 0x01) 0x4c000 0 0x00002000 /* Port 0.3 registers */ |
70 | 0x82000000 0 0x80000 MBUS_ID(0xf0, 0x01) 0x80000 0 0x00002000 /* Port 1.0 registers */ | 70 | 0x82000000 0 0x80000 MBUS_ID(0xf0, 0x01) 0x80000 0 0x00002000 /* Port 1.0 registers */ |
71 | 0x82000000 0 0x82000 MBUS_ID(0xf0, 0x01) 0x82000 0 0x00002000 /* Port 3.0 registers */ | 71 | 0x82000000 0 0x84000 MBUS_ID(0xf0, 0x01) 0x84000 0 0x00002000 /* Port 1.1 registers */ |
72 | 0x82000000 0 0x88000 MBUS_ID(0xf0, 0x01) 0x88000 0 0x00002000 /* Port 1.2 registers */ | ||
73 | 0x82000000 0 0x8c000 MBUS_ID(0xf0, 0x01) 0x8c000 0 0x00002000 /* Port 1.3 registers */ | ||
72 | 0x82000000 0x1 0 MBUS_ID(0x04, 0xe8) 0 1 0 /* Port 0.0 MEM */ | 74 | 0x82000000 0x1 0 MBUS_ID(0x04, 0xe8) 0 1 0 /* Port 0.0 MEM */ |
73 | 0x81000000 0x1 0 MBUS_ID(0x04, 0xe0) 0 1 0 /* Port 0.0 IO */ | 75 | 0x81000000 0x1 0 MBUS_ID(0x04, 0xe0) 0 1 0 /* Port 0.0 IO */ |
74 | 0x82000000 0x2 0 MBUS_ID(0x04, 0xd8) 0 1 0 /* Port 0.1 MEM */ | 76 | 0x82000000 0x2 0 MBUS_ID(0x04, 0xd8) 0 1 0 /* Port 0.1 MEM */ |
@@ -77,10 +79,18 @@ | |||
77 | 0x81000000 0x3 0 MBUS_ID(0x04, 0xb0) 0 1 0 /* Port 0.2 IO */ | 79 | 0x81000000 0x3 0 MBUS_ID(0x04, 0xb0) 0 1 0 /* Port 0.2 IO */ |
78 | 0x82000000 0x4 0 MBUS_ID(0x04, 0x78) 0 1 0 /* Port 0.3 MEM */ | 80 | 0x82000000 0x4 0 MBUS_ID(0x04, 0x78) 0 1 0 /* Port 0.3 MEM */ |
79 | 0x81000000 0x4 0 MBUS_ID(0x04, 0x70) 0 1 0 /* Port 0.3 IO */ | 81 | 0x81000000 0x4 0 MBUS_ID(0x04, 0x70) 0 1 0 /* Port 0.3 IO */ |
80 | 0x82000000 0x9 0 MBUS_ID(0x08, 0xe8) 0 1 0 /* Port 1.0 MEM */ | 82 | |
81 | 0x81000000 0x9 0 MBUS_ID(0x08, 0xe0) 0 1 0 /* Port 1.0 IO */ | 83 | 0x82000000 0x5 0 MBUS_ID(0x08, 0xe8) 0 1 0 /* Port 1.0 MEM */ |
82 | 0x82000000 0xa 0 MBUS_ID(0x08, 0xf8) 0 1 0 /* Port 3.0 MEM */ | 84 | 0x81000000 0x5 0 MBUS_ID(0x08, 0xe0) 0 1 0 /* Port 1.0 IO */ |
83 | 0x81000000 0xa 0 MBUS_ID(0x08, 0xf0) 0 1 0 /* Port 3.0 IO */>; | 85 | 0x82000000 0x6 0 MBUS_ID(0x08, 0xd8) 0 1 0 /* Port 1.1 MEM */ |
86 | 0x81000000 0x6 0 MBUS_ID(0x08, 0xd0) 0 1 0 /* Port 1.1 IO */ | ||
87 | 0x82000000 0x7 0 MBUS_ID(0x08, 0xb8) 0 1 0 /* Port 1.2 MEM */ | ||
88 | 0x81000000 0x7 0 MBUS_ID(0x08, 0xb0) 0 1 0 /* Port 1.2 IO */ | ||
89 | 0x82000000 0x8 0 MBUS_ID(0x08, 0x78) 0 1 0 /* Port 1.3 MEM */ | ||
90 | 0x81000000 0x8 0 MBUS_ID(0x08, 0x70) 0 1 0 /* Port 1.3 IO */ | ||
91 | |||
92 | 0x82000000 0x9 0 MBUS_ID(0x04, 0xf8) 0 1 0 /* Port 2.0 MEM */ | ||
93 | 0x81000000 0x9 0 MBUS_ID(0x04, 0xf0) 0 1 0 /* Port 2.0 IO */>; | ||
84 | 94 | ||
85 | pcie@1,0 { | 95 | pcie@1,0 { |
86 | device_type = "pci"; | 96 | device_type = "pci"; |
@@ -106,8 +116,8 @@ | |||
106 | #address-cells = <3>; | 116 | #address-cells = <3>; |
107 | #size-cells = <2>; | 117 | #size-cells = <2>; |
108 | #interrupt-cells = <1>; | 118 | #interrupt-cells = <1>; |
109 | ranges = <0x82000000 0 0 0x82000000 0x2 0 1 0 | 119 | ranges = <0x82000000 0 0 0x82000000 0x2 0 1 0 |
110 | 0x81000000 0 0 0x81000000 0x2 0 1 0>; | 120 | 0x81000000 0 0 0x81000000 0x2 0 1 0>; |
111 | interrupt-map-mask = <0 0 0 0>; | 121 | interrupt-map-mask = <0 0 0 0>; |
112 | interrupt-map = <0 0 0 0 &mpic 59>; | 122 | interrupt-map = <0 0 0 0 &mpic 59>; |
113 | marvell,pcie-port = <0>; | 123 | marvell,pcie-port = <0>; |
@@ -150,37 +160,88 @@ | |||
150 | status = "disabled"; | 160 | status = "disabled"; |
151 | }; | 161 | }; |
152 | 162 | ||
153 | pcie@9,0 { | 163 | pcie@5,0 { |
154 | device_type = "pci"; | 164 | device_type = "pci"; |
155 | assigned-addresses = <0x82000800 0 0x42000 0 0x2000>; | 165 | assigned-addresses = <0x82000800 0 0x80000 0 0x2000>; |
156 | reg = <0x4800 0 0 0 0>; | 166 | reg = <0x2800 0 0 0 0>; |
157 | #address-cells = <3>; | 167 | #address-cells = <3>; |
158 | #size-cells = <2>; | 168 | #size-cells = <2>; |
159 | #interrupt-cells = <1>; | 169 | #interrupt-cells = <1>; |
160 | ranges = <0x82000000 0 0 0x82000000 0x9 0 1 0 | 170 | ranges = <0x82000000 0 0 0x82000000 0x5 0 1 0 |
161 | 0x81000000 0 0 0x81000000 0x9 0 1 0>; | 171 | 0x81000000 0 0 0x81000000 0x5 0 1 0>; |
162 | interrupt-map-mask = <0 0 0 0>; | 172 | interrupt-map-mask = <0 0 0 0>; |
163 | interrupt-map = <0 0 0 0 &mpic 99>; | 173 | interrupt-map = <0 0 0 0 &mpic 62>; |
164 | marvell,pcie-port = <2>; | 174 | marvell,pcie-port = <1>; |
165 | marvell,pcie-lane = <0>; | 175 | marvell,pcie-lane = <0>; |
166 | clocks = <&gateclk 26>; | 176 | clocks = <&gateclk 9>; |
167 | status = "disabled"; | 177 | status = "disabled"; |
168 | }; | 178 | }; |
169 | 179 | ||
170 | pcie@10,0 { | 180 | pcie@6,0 { |
171 | device_type = "pci"; | 181 | device_type = "pci"; |
172 | assigned-addresses = <0x82000800 0 0x82000 0 0x2000>; | 182 | assigned-addresses = <0x82000800 0 0x84000 0 0x2000>; |
173 | reg = <0x5000 0 0 0 0>; | 183 | reg = <0x3000 0 0 0 0>; |
174 | #address-cells = <3>; | 184 | #address-cells = <3>; |
175 | #size-cells = <2>; | 185 | #size-cells = <2>; |
176 | #interrupt-cells = <1>; | 186 | #interrupt-cells = <1>; |
177 | ranges = <0x82000000 0 0 0x82000000 0xa 0 1 0 | 187 | ranges = <0x82000000 0 0 0x82000000 0x6 0 1 0 |
178 | 0x81000000 0 0 0x81000000 0xa 0 1 0>; | 188 | 0x81000000 0 0 0x81000000 0x6 0 1 0>; |
179 | interrupt-map-mask = <0 0 0 0>; | 189 | interrupt-map-mask = <0 0 0 0>; |
180 | interrupt-map = <0 0 0 0 &mpic 103>; | 190 | interrupt-map = <0 0 0 0 &mpic 63>; |
181 | marvell,pcie-port = <3>; | 191 | marvell,pcie-port = <1>; |
192 | marvell,pcie-lane = <1>; | ||
193 | clocks = <&gateclk 10>; | ||
194 | status = "disabled"; | ||
195 | }; | ||
196 | |||
197 | pcie@7,0 { | ||
198 | device_type = "pci"; | ||
199 | assigned-addresses = <0x82000800 0 0x88000 0 0x2000>; | ||
200 | reg = <0x3800 0 0 0 0>; | ||
201 | #address-cells = <3>; | ||
202 | #size-cells = <2>; | ||
203 | #interrupt-cells = <1>; | ||
204 | ranges = <0x82000000 0 0 0x82000000 0x7 0 1 0 | ||
205 | 0x81000000 0 0 0x81000000 0x7 0 1 0>; | ||
206 | interrupt-map-mask = <0 0 0 0>; | ||
207 | interrupt-map = <0 0 0 0 &mpic 64>; | ||
208 | marvell,pcie-port = <1>; | ||
209 | marvell,pcie-lane = <2>; | ||
210 | clocks = <&gateclk 11>; | ||
211 | status = "disabled"; | ||
212 | }; | ||
213 | |||
214 | pcie@8,0 { | ||
215 | device_type = "pci"; | ||
216 | assigned-addresses = <0x82000800 0 0x8c000 0 0x2000>; | ||
217 | reg = <0x4000 0 0 0 0>; | ||
218 | #address-cells = <3>; | ||
219 | #size-cells = <2>; | ||
220 | #interrupt-cells = <1>; | ||
221 | ranges = <0x82000000 0 0 0x82000000 0x8 0 1 0 | ||
222 | 0x81000000 0 0 0x81000000 0x8 0 1 0>; | ||
223 | interrupt-map-mask = <0 0 0 0>; | ||
224 | interrupt-map = <0 0 0 0 &mpic 65>; | ||
225 | marvell,pcie-port = <1>; | ||
226 | marvell,pcie-lane = <3>; | ||
227 | clocks = <&gateclk 12>; | ||
228 | status = "disabled"; | ||
229 | }; | ||
230 | |||
231 | pcie@9,0 { | ||
232 | device_type = "pci"; | ||
233 | assigned-addresses = <0x82000800 0 0x42000 0 0x2000>; | ||
234 | reg = <0x4800 0 0 0 0>; | ||
235 | #address-cells = <3>; | ||
236 | #size-cells = <2>; | ||
237 | #interrupt-cells = <1>; | ||
238 | ranges = <0x82000000 0 0 0x82000000 0x9 0 1 0 | ||
239 | 0x81000000 0 0 0x81000000 0x9 0 1 0>; | ||
240 | interrupt-map-mask = <0 0 0 0>; | ||
241 | interrupt-map = <0 0 0 0 &mpic 99>; | ||
242 | marvell,pcie-port = <2>; | ||
182 | marvell,pcie-lane = <0>; | 243 | marvell,pcie-lane = <0>; |
183 | clocks = <&gateclk 27>; | 244 | clocks = <&gateclk 26>; |
184 | status = "disabled"; | 245 | status = "disabled"; |
185 | }; | 246 | }; |
186 | }; | 247 | }; |
diff --git a/arch/arm/boot/dts/at91sam9x5_usart3.dtsi b/arch/arm/boot/dts/at91sam9x5_usart3.dtsi index 2347e9563cef..6801106fa1f8 100644 --- a/arch/arm/boot/dts/at91sam9x5_usart3.dtsi +++ b/arch/arm/boot/dts/at91sam9x5_usart3.dtsi | |||
@@ -11,6 +11,10 @@ | |||
11 | #include <dt-bindings/interrupt-controller/irq.h> | 11 | #include <dt-bindings/interrupt-controller/irq.h> |
12 | 12 | ||
13 | / { | 13 | / { |
14 | aliases { | ||
15 | serial4 = &usart3; | ||
16 | }; | ||
17 | |||
14 | ahb { | 18 | ahb { |
15 | apb { | 19 | apb { |
16 | pinctrl@fffff400 { | 20 | pinctrl@fffff400 { |
diff --git a/arch/arm/boot/dts/bcm11351.dtsi b/arch/arm/boot/dts/bcm11351.dtsi index b0c0610d1395..dd8e878741c0 100644 --- a/arch/arm/boot/dts/bcm11351.dtsi +++ b/arch/arm/boot/dts/bcm11351.dtsi | |||
@@ -142,4 +142,8 @@ | |||
142 | status = "disabled"; | 142 | status = "disabled"; |
143 | }; | 143 | }; |
144 | 144 | ||
145 | pinctrl@35004800 { | ||
146 | compatible = "brcm,capri-pinctrl"; | ||
147 | reg = <0x35004800 0x430>; | ||
148 | }; | ||
145 | }; | 149 | }; |
diff --git a/arch/arm/boot/dts/bcm2835.dtsi b/arch/arm/boot/dts/bcm2835.dtsi index 1e12aeff403b..aa537ed13f0a 100644 --- a/arch/arm/boot/dts/bcm2835.dtsi +++ b/arch/arm/boot/dts/bcm2835.dtsi | |||
@@ -85,6 +85,8 @@ | |||
85 | reg = <0x7e205000 0x1000>; | 85 | reg = <0x7e205000 0x1000>; |
86 | interrupts = <2 21>; | 86 | interrupts = <2 21>; |
87 | clocks = <&clk_i2c>; | 87 | clocks = <&clk_i2c>; |
88 | #address-cells = <1>; | ||
89 | #size-cells = <0>; | ||
88 | status = "disabled"; | 90 | status = "disabled"; |
89 | }; | 91 | }; |
90 | 92 | ||
@@ -93,6 +95,8 @@ | |||
93 | reg = <0x7e804000 0x1000>; | 95 | reg = <0x7e804000 0x1000>; |
94 | interrupts = <2 21>; | 96 | interrupts = <2 21>; |
95 | clocks = <&clk_i2c>; | 97 | clocks = <&clk_i2c>; |
98 | #address-cells = <1>; | ||
99 | #size-cells = <0>; | ||
96 | status = "disabled"; | 100 | status = "disabled"; |
97 | }; | 101 | }; |
98 | 102 | ||
diff --git a/arch/arm/boot/dts/cros5250-common.dtsi b/arch/arm/boot/dts/cros5250-common.dtsi index dc259e8b8a73..9b186ac06c8b 100644 --- a/arch/arm/boot/dts/cros5250-common.dtsi +++ b/arch/arm/boot/dts/cros5250-common.dtsi | |||
@@ -27,6 +27,13 @@ | |||
27 | i2c2_bus: i2c2-bus { | 27 | i2c2_bus: i2c2-bus { |
28 | samsung,pin-pud = <0>; | 28 | samsung,pin-pud = <0>; |
29 | }; | 29 | }; |
30 | |||
31 | max77686_irq: max77686-irq { | ||
32 | samsung,pins = "gpx3-2"; | ||
33 | samsung,pin-function = <0>; | ||
34 | samsung,pin-pud = <0>; | ||
35 | samsung,pin-drv = <0>; | ||
36 | }; | ||
30 | }; | 37 | }; |
31 | 38 | ||
32 | i2c@12C60000 { | 39 | i2c@12C60000 { |
@@ -35,6 +42,11 @@ | |||
35 | 42 | ||
36 | max77686@09 { | 43 | max77686@09 { |
37 | compatible = "maxim,max77686"; | 44 | compatible = "maxim,max77686"; |
45 | interrupt-parent = <&gpx3>; | ||
46 | interrupts = <2 0>; | ||
47 | pinctrl-names = "default"; | ||
48 | pinctrl-0 = <&max77686_irq>; | ||
49 | wakeup-source; | ||
38 | reg = <0x09>; | 50 | reg = <0x09>; |
39 | 51 | ||
40 | voltage-regulators { | 52 | voltage-regulators { |
diff --git a/arch/arm/boot/dts/exynos5250.dtsi b/arch/arm/boot/dts/exynos5250.dtsi index 9db5047812f3..177becde7a26 100644 --- a/arch/arm/boot/dts/exynos5250.dtsi +++ b/arch/arm/boot/dts/exynos5250.dtsi | |||
@@ -559,7 +559,7 @@ | |||
559 | compatible = "arm,pl330", "arm,primecell"; | 559 | compatible = "arm,pl330", "arm,primecell"; |
560 | reg = <0x10800000 0x1000>; | 560 | reg = <0x10800000 0x1000>; |
561 | interrupts = <0 33 0>; | 561 | interrupts = <0 33 0>; |
562 | clocks = <&clock 271>; | 562 | clocks = <&clock 346>; |
563 | clock-names = "apb_pclk"; | 563 | clock-names = "apb_pclk"; |
564 | #dma-cells = <1>; | 564 | #dma-cells = <1>; |
565 | #dma-channels = <8>; | 565 | #dma-channels = <8>; |
diff --git a/arch/arm/boot/dts/imx6qdl.dtsi b/arch/arm/boot/dts/imx6qdl.dtsi index 59154dc15fe4..fb28b2ecb1db 100644 --- a/arch/arm/boot/dts/imx6qdl.dtsi +++ b/arch/arm/boot/dts/imx6qdl.dtsi | |||
@@ -161,7 +161,7 @@ | |||
161 | clocks = <&clks 197>, <&clks 3>, | 161 | clocks = <&clks 197>, <&clks 3>, |
162 | <&clks 197>, <&clks 107>, | 162 | <&clks 197>, <&clks 107>, |
163 | <&clks 0>, <&clks 118>, | 163 | <&clks 0>, <&clks 118>, |
164 | <&clks 62>, <&clks 139>, | 164 | <&clks 0>, <&clks 139>, |
165 | <&clks 0>; | 165 | <&clks 0>; |
166 | clock-names = "core", "rxtx0", | 166 | clock-names = "core", "rxtx0", |
167 | "rxtx1", "rxtx2", | 167 | "rxtx1", "rxtx2", |
diff --git a/arch/arm/boot/dts/omap-gpmc-smsc911x.dtsi b/arch/arm/boot/dts/omap-gpmc-smsc911x.dtsi index 9c18adf788f7..f577b7df9a29 100644 --- a/arch/arm/boot/dts/omap-gpmc-smsc911x.dtsi +++ b/arch/arm/boot/dts/omap-gpmc-smsc911x.dtsi | |||
@@ -44,8 +44,8 @@ | |||
44 | gpmc,wr-access-ns = <186>; | 44 | gpmc,wr-access-ns = <186>; |
45 | gpmc,cycle2cycle-samecsen; | 45 | gpmc,cycle2cycle-samecsen; |
46 | gpmc,cycle2cycle-diffcsen; | 46 | gpmc,cycle2cycle-diffcsen; |
47 | vmmc-supply = <&vddvario>; | 47 | vddvario-supply = <&vddvario>; |
48 | vmmc_aux-supply = <&vdd33a>; | 48 | vdd33a-supply = <&vdd33a>; |
49 | reg-io-width = <4>; | 49 | reg-io-width = <4>; |
50 | smsc,save-mac-address; | 50 | smsc,save-mac-address; |
51 | }; | 51 | }; |
diff --git a/arch/arm/boot/dts/omap-zoom-common.dtsi b/arch/arm/boot/dts/omap-zoom-common.dtsi index b0ee342598f0..68221fab978d 100644 --- a/arch/arm/boot/dts/omap-zoom-common.dtsi +++ b/arch/arm/boot/dts/omap-zoom-common.dtsi | |||
@@ -13,7 +13,7 @@ | |||
13 | * they probably share the same GPIO IRQ | 13 | * they probably share the same GPIO IRQ |
14 | * REVISIT: Add timing support from slls644g.pdf | 14 | * REVISIT: Add timing support from slls644g.pdf |
15 | */ | 15 | */ |
16 | 8250@3,0 { | 16 | uart@3,0 { |
17 | compatible = "ns16550a"; | 17 | compatible = "ns16550a"; |
18 | reg = <3 0 0x100>; | 18 | reg = <3 0 0x100>; |
19 | bank-width = <2>; | 19 | bank-width = <2>; |
diff --git a/arch/arm/boot/dts/omap2.dtsi b/arch/arm/boot/dts/omap2.dtsi index a2bfcde858a6..d0c5b37e248c 100644 --- a/arch/arm/boot/dts/omap2.dtsi +++ b/arch/arm/boot/dts/omap2.dtsi | |||
@@ -9,6 +9,7 @@ | |||
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include <dt-bindings/gpio/gpio.h> | 11 | #include <dt-bindings/gpio/gpio.h> |
12 | #include <dt-bindings/interrupt-controller/irq.h> | ||
12 | #include <dt-bindings/pinctrl/omap.h> | 13 | #include <dt-bindings/pinctrl/omap.h> |
13 | 14 | ||
14 | #include "skeleton.dtsi" | 15 | #include "skeleton.dtsi" |
@@ -21,6 +22,8 @@ | |||
21 | serial0 = &uart1; | 22 | serial0 = &uart1; |
22 | serial1 = &uart2; | 23 | serial1 = &uart2; |
23 | serial2 = &uart3; | 24 | serial2 = &uart3; |
25 | i2c0 = &i2c1; | ||
26 | i2c1 = &i2c2; | ||
24 | }; | 27 | }; |
25 | 28 | ||
26 | cpus { | 29 | cpus { |
@@ -53,6 +56,28 @@ | |||
53 | ranges; | 56 | ranges; |
54 | ti,hwmods = "l3_main"; | 57 | ti,hwmods = "l3_main"; |
55 | 58 | ||
59 | aes: aes@480a6000 { | ||
60 | compatible = "ti,omap2-aes"; | ||
61 | ti,hwmods = "aes"; | ||
62 | reg = <0x480a6000 0x50>; | ||
63 | dmas = <&sdma 9 &sdma 10>; | ||
64 | dma-names = "tx", "rx"; | ||
65 | }; | ||
66 | |||
67 | hdq1w: 1w@480b2000 { | ||
68 | compatible = "ti,omap2420-1w"; | ||
69 | ti,hwmods = "hdq1w"; | ||
70 | reg = <0x480b2000 0x1000>; | ||
71 | interrupts = <58>; | ||
72 | }; | ||
73 | |||
74 | mailbox: mailbox@48094000 { | ||
75 | compatible = "ti,omap2-mailbox"; | ||
76 | ti,hwmods = "mailbox"; | ||
77 | reg = <0x48094000 0x200>; | ||
78 | interrupts = <26>; | ||
79 | }; | ||
80 | |||
56 | intc: interrupt-controller@1 { | 81 | intc: interrupt-controller@1 { |
57 | compatible = "ti,omap2-intc"; | 82 | compatible = "ti,omap2-intc"; |
58 | interrupt-controller; | 83 | interrupt-controller; |
@@ -63,6 +88,7 @@ | |||
63 | 88 | ||
64 | sdma: dma-controller@48056000 { | 89 | sdma: dma-controller@48056000 { |
65 | compatible = "ti,omap2430-sdma", "ti,omap2420-sdma"; | 90 | compatible = "ti,omap2430-sdma", "ti,omap2420-sdma"; |
91 | ti,hwmods = "dma"; | ||
66 | reg = <0x48056000 0x1000>; | 92 | reg = <0x48056000 0x1000>; |
67 | interrupts = <12>, | 93 | interrupts = <12>, |
68 | <13>, | 94 | <13>, |
@@ -73,21 +99,91 @@ | |||
73 | #dma-requests = <64>; | 99 | #dma-requests = <64>; |
74 | }; | 100 | }; |
75 | 101 | ||
102 | i2c1: i2c@48070000 { | ||
103 | compatible = "ti,omap2-i2c"; | ||
104 | ti,hwmods = "i2c1"; | ||
105 | reg = <0x48070000 0x80>; | ||
106 | #address-cells = <1>; | ||
107 | #size-cells = <0>; | ||
108 | interrupts = <56>; | ||
109 | dmas = <&sdma 27 &sdma 28>; | ||
110 | dma-names = "tx", "rx"; | ||
111 | }; | ||
112 | |||
113 | i2c2: i2c@48072000 { | ||
114 | compatible = "ti,omap2-i2c"; | ||
115 | ti,hwmods = "i2c2"; | ||
116 | reg = <0x48072000 0x80>; | ||
117 | #address-cells = <1>; | ||
118 | #size-cells = <0>; | ||
119 | interrupts = <57>; | ||
120 | dmas = <&sdma 29 &sdma 30>; | ||
121 | dma-names = "tx", "rx"; | ||
122 | }; | ||
123 | |||
124 | mcspi1: mcspi@48098000 { | ||
125 | compatible = "ti,omap2-mcspi"; | ||
126 | ti,hwmods = "mcspi1"; | ||
127 | reg = <0x48098000 0x100>; | ||
128 | interrupts = <65>; | ||
129 | dmas = <&sdma 35 &sdma 36 &sdma 37 &sdma 38 | ||
130 | &sdma 39 &sdma 40 &sdma 41 &sdma 42>; | ||
131 | dma-names = "tx0", "rx0", "tx1", "rx1", | ||
132 | "tx2", "rx2", "tx3", "rx3"; | ||
133 | }; | ||
134 | |||
135 | mcspi2: mcspi@4809a000 { | ||
136 | compatible = "ti,omap2-mcspi"; | ||
137 | ti,hwmods = "mcspi2"; | ||
138 | reg = <0x4809a000 0x100>; | ||
139 | interrupts = <66>; | ||
140 | dmas = <&sdma 43 &sdma 44 &sdma 45 &sdma 46>; | ||
141 | dma-names = "tx0", "rx0", "tx1", "rx1"; | ||
142 | }; | ||
143 | |||
144 | rng: rng@480a0000 { | ||
145 | compatible = "ti,omap2-rng"; | ||
146 | ti,hwmods = "rng"; | ||
147 | reg = <0x480a0000 0x50>; | ||
148 | interrupts = <36>; | ||
149 | }; | ||
150 | |||
151 | sham: sham@480a4000 { | ||
152 | compatible = "ti,omap2-sham"; | ||
153 | ti,hwmods = "sham"; | ||
154 | reg = <0x480a4000 0x64>; | ||
155 | interrupts = <51>; | ||
156 | dmas = <&sdma 13>; | ||
157 | dma-names = "rx"; | ||
158 | }; | ||
159 | |||
76 | uart1: serial@4806a000 { | 160 | uart1: serial@4806a000 { |
77 | compatible = "ti,omap2-uart"; | 161 | compatible = "ti,omap2-uart"; |
78 | ti,hwmods = "uart1"; | 162 | ti,hwmods = "uart1"; |
163 | reg = <0x4806a000 0x2000>; | ||
164 | interrupts = <72>; | ||
165 | dmas = <&sdma 49 &sdma 50>; | ||
166 | dma-names = "tx", "rx"; | ||
79 | clock-frequency = <48000000>; | 167 | clock-frequency = <48000000>; |
80 | }; | 168 | }; |
81 | 169 | ||
82 | uart2: serial@4806c000 { | 170 | uart2: serial@4806c000 { |
83 | compatible = "ti,omap2-uart"; | 171 | compatible = "ti,omap2-uart"; |
84 | ti,hwmods = "uart2"; | 172 | ti,hwmods = "uart2"; |
173 | reg = <0x4806c000 0x400>; | ||
174 | interrupts = <73>; | ||
175 | dmas = <&sdma 51 &sdma 52>; | ||
176 | dma-names = "tx", "rx"; | ||
85 | clock-frequency = <48000000>; | 177 | clock-frequency = <48000000>; |
86 | }; | 178 | }; |
87 | 179 | ||
88 | uart3: serial@4806e000 { | 180 | uart3: serial@4806e000 { |
89 | compatible = "ti,omap2-uart"; | 181 | compatible = "ti,omap2-uart"; |
90 | ti,hwmods = "uart3"; | 182 | ti,hwmods = "uart3"; |
183 | reg = <0x4806e000 0x400>; | ||
184 | interrupts = <74>; | ||
185 | dmas = <&sdma 53 &sdma 54>; | ||
186 | dma-names = "tx", "rx"; | ||
91 | clock-frequency = <48000000>; | 187 | clock-frequency = <48000000>; |
92 | }; | 188 | }; |
93 | 189 | ||
diff --git a/arch/arm/boot/dts/omap2420.dtsi b/arch/arm/boot/dts/omap2420.dtsi index c8f9c55169ea..60c605de22dd 100644 --- a/arch/arm/boot/dts/omap2420.dtsi +++ b/arch/arm/boot/dts/omap2420.dtsi | |||
@@ -114,6 +114,15 @@ | |||
114 | dma-names = "tx", "rx"; | 114 | dma-names = "tx", "rx"; |
115 | }; | 115 | }; |
116 | 116 | ||
117 | msdi1: mmc@4809c000 { | ||
118 | compatible = "ti,omap2420-mmc"; | ||
119 | ti,hwmods = "msdi1"; | ||
120 | reg = <0x4809c000 0x80>; | ||
121 | interrupts = <83>; | ||
122 | dmas = <&sdma 61 &sdma 62>; | ||
123 | dma-names = "tx", "rx"; | ||
124 | }; | ||
125 | |||
117 | timer1: timer@48028000 { | 126 | timer1: timer@48028000 { |
118 | compatible = "ti,omap2420-timer"; | 127 | compatible = "ti,omap2420-timer"; |
119 | reg = <0x48028000 0x400>; | 128 | reg = <0x48028000 0x400>; |
@@ -121,5 +130,19 @@ | |||
121 | ti,hwmods = "timer1"; | 130 | ti,hwmods = "timer1"; |
122 | ti,timer-alwon; | 131 | ti,timer-alwon; |
123 | }; | 132 | }; |
133 | |||
134 | wd_timer2: wdt@48022000 { | ||
135 | compatible = "ti,omap2-wdt"; | ||
136 | ti,hwmods = "wd_timer2"; | ||
137 | reg = <0x48022000 0x80>; | ||
138 | }; | ||
124 | }; | 139 | }; |
125 | }; | 140 | }; |
141 | |||
142 | &i2c1 { | ||
143 | compatible = "ti,omap2420-i2c"; | ||
144 | }; | ||
145 | |||
146 | &i2c2 { | ||
147 | compatible = "ti,omap2420-i2c"; | ||
148 | }; | ||
diff --git a/arch/arm/boot/dts/omap2430.dtsi b/arch/arm/boot/dts/omap2430.dtsi index c535a5a2b27f..d624345666f5 100644 --- a/arch/arm/boot/dts/omap2430.dtsi +++ b/arch/arm/boot/dts/omap2430.dtsi | |||
@@ -175,6 +175,25 @@ | |||
175 | dma-names = "tx", "rx"; | 175 | dma-names = "tx", "rx"; |
176 | }; | 176 | }; |
177 | 177 | ||
178 | mmc1: mmc@4809c000 { | ||
179 | compatible = "ti,omap2-hsmmc"; | ||
180 | reg = <0x4809c000 0x200>; | ||
181 | interrupts = <83>; | ||
182 | ti,hwmods = "mmc1"; | ||
183 | ti,dual-volt; | ||
184 | dmas = <&sdma 61>, <&sdma 62>; | ||
185 | dma-names = "tx", "rx"; | ||
186 | }; | ||
187 | |||
188 | mmc2: mmc@480b4000 { | ||
189 | compatible = "ti,omap2-hsmmc"; | ||
190 | reg = <0x480b4000 0x200>; | ||
191 | interrupts = <86>; | ||
192 | ti,hwmods = "mmc2"; | ||
193 | dmas = <&sdma 47>, <&sdma 48>; | ||
194 | dma-names = "tx", "rx"; | ||
195 | }; | ||
196 | |||
178 | timer1: timer@49018000 { | 197 | timer1: timer@49018000 { |
179 | compatible = "ti,omap2420-timer"; | 198 | compatible = "ti,omap2420-timer"; |
180 | reg = <0x49018000 0x400>; | 199 | reg = <0x49018000 0x400>; |
@@ -182,5 +201,35 @@ | |||
182 | ti,hwmods = "timer1"; | 201 | ti,hwmods = "timer1"; |
183 | ti,timer-alwon; | 202 | ti,timer-alwon; |
184 | }; | 203 | }; |
204 | |||
205 | mcspi3: mcspi@480b8000 { | ||
206 | compatible = "ti,omap2-mcspi"; | ||
207 | ti,hwmods = "mcspi3"; | ||
208 | reg = <0x480b8000 0x100>; | ||
209 | interrupts = <91>; | ||
210 | dmas = <&sdma 15 &sdma 16 &sdma 23 &sdma 24>; | ||
211 | dma-names = "tx0", "rx0", "tx1", "rx1"; | ||
212 | }; | ||
213 | |||
214 | usb_otg_hs: usb_otg_hs@480ac000 { | ||
215 | compatible = "ti,omap2-musb"; | ||
216 | ti,hwmods = "usb_otg_hs"; | ||
217 | reg = <0x480ac000 0x1000>; | ||
218 | interrupts = <93>; | ||
219 | }; | ||
220 | |||
221 | wd_timer2: wdt@49016000 { | ||
222 | compatible = "ti,omap2-wdt"; | ||
223 | ti,hwmods = "wd_timer2"; | ||
224 | reg = <0x49016000 0x80>; | ||
225 | }; | ||
185 | }; | 226 | }; |
186 | }; | 227 | }; |
228 | |||
229 | &i2c1 { | ||
230 | compatible = "ti,omap2430-i2c"; | ||
231 | }; | ||
232 | |||
233 | &i2c2 { | ||
234 | compatible = "ti,omap2430-i2c"; | ||
235 | }; | ||
diff --git a/arch/arm/boot/dts/omap3-beagle-xm.dts b/arch/arm/boot/dts/omap3-beagle-xm.dts index 31a632f7effb..df33a50bc070 100644 --- a/arch/arm/boot/dts/omap3-beagle-xm.dts +++ b/arch/arm/boot/dts/omap3-beagle-xm.dts | |||
@@ -215,3 +215,10 @@ | |||
215 | &usbhsehci { | 215 | &usbhsehci { |
216 | phys = <0 &hsusb2_phy>; | 216 | phys = <0 &hsusb2_phy>; |
217 | }; | 217 | }; |
218 | |||
219 | &vaux2 { | ||
220 | regulator-name = "usb_1v8"; | ||
221 | regulator-min-microvolt = <1800000>; | ||
222 | regulator-max-microvolt = <1800000>; | ||
223 | regulator-always-on; | ||
224 | }; | ||
diff --git a/arch/arm/boot/dts/omap3-beagle.dts b/arch/arm/boot/dts/omap3-beagle.dts index fa532aaacc68..3ba4a625ea5b 100644 --- a/arch/arm/boot/dts/omap3-beagle.dts +++ b/arch/arm/boot/dts/omap3-beagle.dts | |||
@@ -61,6 +61,14 @@ | |||
61 | vcc-supply = <&hsusb2_power>; | 61 | vcc-supply = <&hsusb2_power>; |
62 | }; | 62 | }; |
63 | 63 | ||
64 | sound { | ||
65 | compatible = "ti,omap-twl4030"; | ||
66 | ti,model = "omap3beagle"; | ||
67 | |||
68 | ti,mcbsp = <&mcbsp2>; | ||
69 | ti,codec = <&twl_audio>; | ||
70 | }; | ||
71 | |||
64 | gpio_keys { | 72 | gpio_keys { |
65 | compatible = "gpio-keys"; | 73 | compatible = "gpio-keys"; |
66 | 74 | ||
@@ -120,6 +128,12 @@ | |||
120 | reg = <0x48>; | 128 | reg = <0x48>; |
121 | interrupts = <7>; /* SYS_NIRQ cascaded to intc */ | 129 | interrupts = <7>; /* SYS_NIRQ cascaded to intc */ |
122 | interrupt-parent = <&intc>; | 130 | interrupt-parent = <&intc>; |
131 | |||
132 | twl_audio: audio { | ||
133 | compatible = "ti,twl4030-audio"; | ||
134 | codec { | ||
135 | }; | ||
136 | }; | ||
123 | }; | 137 | }; |
124 | }; | 138 | }; |
125 | 139 | ||
@@ -178,3 +192,10 @@ | |||
178 | mode = <3>; | 192 | mode = <3>; |
179 | power = <50>; | 193 | power = <50>; |
180 | }; | 194 | }; |
195 | |||
196 | &vaux2 { | ||
197 | regulator-name = "vdd_ehci"; | ||
198 | regulator-min-microvolt = <1800000>; | ||
199 | regulator-max-microvolt = <1800000>; | ||
200 | regulator-always-on; | ||
201 | }; | ||
diff --git a/arch/arm/boot/dts/omap3-igep.dtsi b/arch/arm/boot/dts/omap3-igep.dtsi index ba1e58b7b7e3..165aaf7591ba 100644 --- a/arch/arm/boot/dts/omap3-igep.dtsi +++ b/arch/arm/boot/dts/omap3-igep.dtsi | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Device Tree Source for IGEP Technology devices | 2 | * Common device tree for IGEP boards based on AM/DM37x |
3 | * | 3 | * |
4 | * Copyright (C) 2012 Javier Martinez Canillas <javier@collabora.co.uk> | 4 | * Copyright (C) 2012 Javier Martinez Canillas <javier@collabora.co.uk> |
5 | * Copyright (C) 2012 Enric Balletbo i Serra <eballetbo@gmail.com> | 5 | * Copyright (C) 2012 Enric Balletbo i Serra <eballetbo@gmail.com> |
@@ -10,7 +10,7 @@ | |||
10 | */ | 10 | */ |
11 | /dts-v1/; | 11 | /dts-v1/; |
12 | 12 | ||
13 | #include "omap34xx.dtsi" | 13 | #include "omap36xx.dtsi" |
14 | 14 | ||
15 | / { | 15 | / { |
16 | memory { | 16 | memory { |
@@ -24,6 +24,25 @@ | |||
24 | ti,mcbsp = <&mcbsp2>; | 24 | ti,mcbsp = <&mcbsp2>; |
25 | ti,codec = <&twl_audio>; | 25 | ti,codec = <&twl_audio>; |
26 | }; | 26 | }; |
27 | |||
28 | vdd33: regulator-vdd33 { | ||
29 | compatible = "regulator-fixed"; | ||
30 | regulator-name = "vdd33"; | ||
31 | regulator-always-on; | ||
32 | }; | ||
33 | |||
34 | lbee1usjyc_vmmc: lbee1usjyc_vmmc { | ||
35 | pinctrl-names = "default"; | ||
36 | pinctrl-0 = <&lbee1usjyc_pins>; | ||
37 | compatible = "regulator-fixed"; | ||
38 | regulator-name = "regulator-lbee1usjyc"; | ||
39 | regulator-min-microvolt = <3300000>; | ||
40 | regulator-max-microvolt = <3300000>; | ||
41 | gpio = <&gpio5 10 GPIO_ACTIVE_HIGH>; /* gpio_138 WIFI_PDN */ | ||
42 | startup-delay-us = <10000>; | ||
43 | enable-active-high; | ||
44 | vin-supply = <&vdd33>; | ||
45 | }; | ||
27 | }; | 46 | }; |
28 | 47 | ||
29 | &omap3_pmx_core { | 48 | &omap3_pmx_core { |
@@ -48,6 +67,15 @@ | |||
48 | >; | 67 | >; |
49 | }; | 68 | }; |
50 | 69 | ||
70 | /* WiFi/BT combo */ | ||
71 | lbee1usjyc_pins: pinmux_lbee1usjyc_pins { | ||
72 | pinctrl-single,pins = < | ||
73 | 0x136 (PIN_OUTPUT | MUX_MODE4) /* sdmmc2_dat5.gpio_137 */ | ||
74 | 0x138 (PIN_OUTPUT | MUX_MODE4) /* sdmmc2_dat6.gpio_138 */ | ||
75 | 0x13a (PIN_OUTPUT | MUX_MODE4) /* sdmmc2_dat7.gpio_139 */ | ||
76 | >; | ||
77 | }; | ||
78 | |||
51 | mcbsp2_pins: pinmux_mcbsp2_pins { | 79 | mcbsp2_pins: pinmux_mcbsp2_pins { |
52 | pinctrl-single,pins = < | 80 | pinctrl-single,pins = < |
53 | 0x10c (PIN_INPUT | MUX_MODE0) /* mcbsp2_fsx.mcbsp2_fsx */ | 81 | 0x10c (PIN_INPUT | MUX_MODE0) /* mcbsp2_fsx.mcbsp2_fsx */ |
@@ -65,10 +93,17 @@ | |||
65 | 0x11a (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc1_dat1.sdmmc1_dat1 */ | 93 | 0x11a (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc1_dat1.sdmmc1_dat1 */ |
66 | 0x11c (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc1_dat2.sdmmc1_dat2 */ | 94 | 0x11c (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc1_dat2.sdmmc1_dat2 */ |
67 | 0x11e (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc1_dat3.sdmmc1_dat3 */ | 95 | 0x11e (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc1_dat3.sdmmc1_dat3 */ |
68 | 0x120 (PIN_INPUT | MUX_MODE0) /* sdmmc1_dat4.sdmmc1_dat4 */ | 96 | >; |
69 | 0x122 (PIN_INPUT | MUX_MODE0) /* sdmmc1_dat5.sdmmc1_dat5 */ | 97 | }; |
70 | 0x124 (PIN_INPUT | MUX_MODE0) /* sdmmc1_dat6.sdmmc1_dat6 */ | 98 | |
71 | 0x126 (PIN_INPUT | MUX_MODE0) /* sdmmc1_dat7.sdmmc1_dat7 */ | 99 | mmc2_pins: pinmux_mmc2_pins { |
100 | pinctrl-single,pins = < | ||
101 | 0x128 (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc2_clk.sdmmc2_clk */ | ||
102 | 0x12a (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc2_cmd.sdmmc2_cmd */ | ||
103 | 0x12c (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc2_dat0.sdmmc2_dat0 */ | ||
104 | 0x12e (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc2_dat1.sdmmc2_dat1 */ | ||
105 | 0x130 (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc2_dat2.sdmmc2_dat2 */ | ||
106 | 0x132 (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc2_dat3.sdmmc2_dat3 */ | ||
72 | >; | 107 | >; |
73 | }; | 108 | }; |
74 | 109 | ||
@@ -78,10 +113,33 @@ | |||
78 | >; | 113 | >; |
79 | }; | 114 | }; |
80 | 115 | ||
116 | i2c1_pins: pinmux_i2c1_pins { | ||
117 | pinctrl-single,pins = < | ||
118 | 0x18a (PIN_INPUT | MUX_MODE0) /* i2c1_scl.i2c1_scl */ | ||
119 | 0x18c (PIN_INPUT | MUX_MODE0) /* i2c1_sda.i2c1_sda */ | ||
120 | >; | ||
121 | }; | ||
122 | |||
123 | i2c2_pins: pinmux_i2c2_pins { | ||
124 | pinctrl-single,pins = < | ||
125 | 0x18e (PIN_INPUT | MUX_MODE0) /* i2c2_scl.i2c2_scl */ | ||
126 | 0x190 (PIN_INPUT | MUX_MODE0) /* i2c2_sda.i2c2_sda */ | ||
127 | >; | ||
128 | }; | ||
129 | |||
130 | i2c3_pins: pinmux_i2c3_pins { | ||
131 | pinctrl-single,pins = < | ||
132 | 0x192 (PIN_INPUT | MUX_MODE0) /* i2c3_scl.i2c3_scl */ | ||
133 | 0x194 (PIN_INPUT | MUX_MODE0) /* i2c3_sda.i2c3_sda */ | ||
134 | >; | ||
135 | }; | ||
136 | |||
81 | leds_pins: pinmux_leds_pins { }; | 137 | leds_pins: pinmux_leds_pins { }; |
82 | }; | 138 | }; |
83 | 139 | ||
84 | &i2c1 { | 140 | &i2c1 { |
141 | pinctrl-names = "default"; | ||
142 | pinctrl-0 = <&i2c1_pins>; | ||
85 | clock-frequency = <2600000>; | 143 | clock-frequency = <2600000>; |
86 | 144 | ||
87 | twl: twl@48 { | 145 | twl: twl@48 { |
@@ -101,9 +159,16 @@ | |||
101 | #include "twl4030_omap3.dtsi" | 159 | #include "twl4030_omap3.dtsi" |
102 | 160 | ||
103 | &i2c2 { | 161 | &i2c2 { |
162 | pinctrl-names = "default"; | ||
163 | pinctrl-0 = <&i2c2_pins>; | ||
104 | clock-frequency = <400000>; | 164 | clock-frequency = <400000>; |
105 | }; | 165 | }; |
106 | 166 | ||
167 | &i2c3 { | ||
168 | pinctrl-names = "default"; | ||
169 | pinctrl-0 = <&i2c3_pins>; | ||
170 | }; | ||
171 | |||
107 | &mcbsp2 { | 172 | &mcbsp2 { |
108 | pinctrl-names = "default"; | 173 | pinctrl-names = "default"; |
109 | pinctrl-0 = <&mcbsp2_pins>; | 174 | pinctrl-0 = <&mcbsp2_pins>; |
@@ -114,11 +179,15 @@ | |||
114 | pinctrl-0 = <&mmc1_pins>; | 179 | pinctrl-0 = <&mmc1_pins>; |
115 | vmmc-supply = <&vmmc1>; | 180 | vmmc-supply = <&vmmc1>; |
116 | vmmc_aux-supply = <&vsim>; | 181 | vmmc_aux-supply = <&vsim>; |
117 | bus-width = <8>; | 182 | bus-width = <4>; |
118 | }; | 183 | }; |
119 | 184 | ||
120 | &mmc2 { | 185 | &mmc2 { |
121 | status = "disabled"; | 186 | pinctrl-names = "default"; |
187 | pinctrl-0 = <&mmc2_pins>; | ||
188 | vmmc-supply = <&lbee1usjyc_vmmc>; | ||
189 | bus-width = <4>; | ||
190 | non-removable; | ||
122 | }; | 191 | }; |
123 | 192 | ||
124 | &mmc3 { | 193 | &mmc3 { |
diff --git a/arch/arm/boot/dts/omap3-igep0020.dts b/arch/arm/boot/dts/omap3-igep0020.dts index d5cc79267250..1c7e74d2d2bc 100644 --- a/arch/arm/boot/dts/omap3-igep0020.dts +++ b/arch/arm/boot/dts/omap3-igep0020.dts | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Device Tree Source for IGEPv2 board | 2 | * Device Tree Source for IGEPv2 Rev. (TI OMAP AM/DM37x) |
3 | * | 3 | * |
4 | * Copyright (C) 2012 Javier Martinez Canillas <javier@collabora.co.uk> | 4 | * Copyright (C) 2012 Javier Martinez Canillas <javier@collabora.co.uk> |
5 | * Copyright (C) 2012 Enric Balletbo i Serra <eballetbo@gmail.com> | 5 | * Copyright (C) 2012 Enric Balletbo i Serra <eballetbo@gmail.com> |
@@ -13,7 +13,7 @@ | |||
13 | #include "omap-gpmc-smsc911x.dtsi" | 13 | #include "omap-gpmc-smsc911x.dtsi" |
14 | 14 | ||
15 | / { | 15 | / { |
16 | model = "IGEPv2"; | 16 | model = "IGEPv2 (TI OMAP AM/DM37x)"; |
17 | compatible = "isee,omap3-igep0020", "ti,omap3"; | 17 | compatible = "isee,omap3-igep0020", "ti,omap3"; |
18 | 18 | ||
19 | leds { | 19 | leds { |
@@ -67,6 +67,8 @@ | |||
67 | pinctrl-names = "default"; | 67 | pinctrl-names = "default"; |
68 | pinctrl-0 = < | 68 | pinctrl-0 = < |
69 | &hsusbb1_pins | 69 | &hsusbb1_pins |
70 | &tfp410_pins | ||
71 | &dss_pins | ||
70 | >; | 72 | >; |
71 | 73 | ||
72 | hsusbb1_pins: pinmux_hsusbb1_pins { | 74 | hsusbb1_pins: pinmux_hsusbb1_pins { |
@@ -85,6 +87,45 @@ | |||
85 | 0x5ba (PIN_INPUT_PULLDOWN | MUX_MODE3) /* etk_d7.hsusb1_data3 */ | 87 | 0x5ba (PIN_INPUT_PULLDOWN | MUX_MODE3) /* etk_d7.hsusb1_data3 */ |
86 | >; | 88 | >; |
87 | }; | 89 | }; |
90 | |||
91 | tfp410_pins: tfp410_dvi_pins { | ||
92 | pinctrl-single,pins = < | ||
93 | 0x196 (PIN_OUTPUT | MUX_MODE4) /* hdq_sio.gpio_170 */ | ||
94 | >; | ||
95 | }; | ||
96 | |||
97 | dss_pins: pinmux_dss_dvi_pins { | ||
98 | pinctrl-single,pins = < | ||
99 | 0x0a4 (PIN_OUTPUT | MUX_MODE0) /* dss_pclk.dss_pclk */ | ||
100 | 0x0a6 (PIN_OUTPUT | MUX_MODE0) /* dss_hsync.dss_hsync */ | ||
101 | 0x0a8 (PIN_OUTPUT | MUX_MODE0) /* dss_vsync.dss_vsync */ | ||
102 | 0x0aa (PIN_OUTPUT | MUX_MODE0) /* dss_acbias.dss_acbias */ | ||
103 | 0x0ac (PIN_OUTPUT | MUX_MODE0) /* dss_data0.dss_data0 */ | ||
104 | 0x0ae (PIN_OUTPUT | MUX_MODE0) /* dss_data1.dss_data1 */ | ||
105 | 0x0b0 (PIN_OUTPUT | MUX_MODE0) /* dss_data2.dss_data2 */ | ||
106 | 0x0b2 (PIN_OUTPUT | MUX_MODE0) /* dss_data3.dss_data3 */ | ||
107 | 0x0b4 (PIN_OUTPUT | MUX_MODE0) /* dss_data4.dss_data4 */ | ||
108 | 0x0b6 (PIN_OUTPUT | MUX_MODE0) /* dss_data5.dss_data5 */ | ||
109 | 0x0b8 (PIN_OUTPUT | MUX_MODE0) /* dss_data6.dss_data6 */ | ||
110 | 0x0ba (PIN_OUTPUT | MUX_MODE0) /* dss_data7.dss_data7 */ | ||
111 | 0x0bc (PIN_OUTPUT | MUX_MODE0) /* dss_data8.dss_data8 */ | ||
112 | 0x0be (PIN_OUTPUT | MUX_MODE0) /* dss_data9.dss_data9 */ | ||
113 | 0x0c0 (PIN_OUTPUT | MUX_MODE0) /* dss_data10.dss_data10 */ | ||
114 | 0x0c2 (PIN_OUTPUT | MUX_MODE0) /* dss_data11.dss_data11 */ | ||
115 | 0x0c4 (PIN_OUTPUT | MUX_MODE0) /* dss_data12.dss_data12 */ | ||
116 | 0x0c6 (PIN_OUTPUT | MUX_MODE0) /* dss_data13.dss_data13 */ | ||
117 | 0x0c8 (PIN_OUTPUT | MUX_MODE0) /* dss_data14.dss_data14 */ | ||
118 | 0x0ca (PIN_OUTPUT | MUX_MODE0) /* dss_data15.dss_data15 */ | ||
119 | 0x0cc (PIN_OUTPUT | MUX_MODE0) /* dss_data16.dss_data16 */ | ||
120 | 0x0ce (PIN_OUTPUT | MUX_MODE0) /* dss_data17.dss_data17 */ | ||
121 | 0x0d0 (PIN_OUTPUT | MUX_MODE0) /* dss_data18.dss_data18 */ | ||
122 | 0x0d2 (PIN_OUTPUT | MUX_MODE0) /* dss_data19.dss_data19 */ | ||
123 | 0x0d4 (PIN_OUTPUT | MUX_MODE0) /* dss_data20.dss_data20 */ | ||
124 | 0x0d6 (PIN_OUTPUT | MUX_MODE0) /* dss_data21.dss_data21 */ | ||
125 | 0x0d8 (PIN_OUTPUT | MUX_MODE0) /* dss_data22.dss_data22 */ | ||
126 | 0x0da (PIN_OUTPUT | MUX_MODE0) /* dss_data23.dss_data23 */ | ||
127 | >; | ||
128 | }; | ||
88 | }; | 129 | }; |
89 | 130 | ||
90 | &leds_pins { | 131 | &leds_pins { |
@@ -174,3 +215,8 @@ | |||
174 | &usbhsehci { | 215 | &usbhsehci { |
175 | phys = <&hsusb1_phy>; | 216 | phys = <&hsusb1_phy>; |
176 | }; | 217 | }; |
218 | |||
219 | &vpll2 { | ||
220 | /* Needed for DSS */ | ||
221 | regulator-name = "vdds_dsi"; | ||
222 | }; | ||
diff --git a/arch/arm/boot/dts/omap3-igep0030.dts b/arch/arm/boot/dts/omap3-igep0030.dts index 525e6d9b0978..02a23f8a3384 100644 --- a/arch/arm/boot/dts/omap3-igep0030.dts +++ b/arch/arm/boot/dts/omap3-igep0030.dts | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Device Tree Source for IGEP COM Module | 2 | * Device Tree Source for IGEP COM MODULE (TI OMAP AM/DM37x) |
3 | * | 3 | * |
4 | * Copyright (C) 2012 Javier Martinez Canillas <javier@collabora.co.uk> | 4 | * Copyright (C) 2012 Javier Martinez Canillas <javier@collabora.co.uk> |
5 | * Copyright (C) 2012 Enric Balletbo i Serra <eballetbo@gmail.com> | 5 | * Copyright (C) 2012 Enric Balletbo i Serra <eballetbo@gmail.com> |
@@ -12,7 +12,7 @@ | |||
12 | #include "omap3-igep.dtsi" | 12 | #include "omap3-igep.dtsi" |
13 | 13 | ||
14 | / { | 14 | / { |
15 | model = "IGEP COM Module"; | 15 | model = "IGEP COM MODULE (TI OMAP AM/DM37x)"; |
16 | compatible = "isee,omap3-igep0030", "ti,omap3"; | 16 | compatible = "isee,omap3-igep0030", "ti,omap3"; |
17 | 17 | ||
18 | leds { | 18 | leds { |
diff --git a/arch/arm/boot/dts/omap3-n900.dts b/arch/arm/boot/dts/omap3-n900.dts index c4f20bfe4cce..6fc85f963530 100644 --- a/arch/arm/boot/dts/omap3-n900.dts +++ b/arch/arm/boot/dts/omap3-n900.dts | |||
@@ -9,7 +9,7 @@ | |||
9 | 9 | ||
10 | /dts-v1/; | 10 | /dts-v1/; |
11 | 11 | ||
12 | #include "omap34xx.dtsi" | 12 | #include "omap34xx-hs.dtsi" |
13 | 13 | ||
14 | / { | 14 | / { |
15 | model = "Nokia N900"; | 15 | model = "Nokia N900"; |
@@ -125,6 +125,21 @@ | |||
125 | >; | 125 | >; |
126 | }; | 126 | }; |
127 | 127 | ||
128 | mmc2_pins: pinmux_mmc2_pins { | ||
129 | pinctrl-single,pins = < | ||
130 | 0x128 (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc2_clk */ | ||
131 | 0x12a (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc2_cmd */ | ||
132 | 0x12c (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc2_dat0 */ | ||
133 | 0x12e (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc2_dat1 */ | ||
134 | 0x130 (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc2_dat2 */ | ||
135 | 0x132 (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc2_dat3 */ | ||
136 | 0x134 (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc2_dat4 */ | ||
137 | 0x136 (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc2_dat5 */ | ||
138 | 0x138 (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc2_dat6 */ | ||
139 | 0x13a (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc2_dat7 */ | ||
140 | >; | ||
141 | }; | ||
142 | |||
128 | display_pins: pinmux_display_pins { | 143 | display_pins: pinmux_display_pins { |
129 | pinctrl-single,pins = < | 144 | pinctrl-single,pins = < |
130 | 0x0d4 (PIN_OUTPUT | MUX_MODE4) /* RX51_LCD_RESET_GPIO */ | 145 | 0x0d4 (PIN_OUTPUT | MUX_MODE4) /* RX51_LCD_RESET_GPIO */ |
@@ -358,8 +373,14 @@ | |||
358 | cd-gpios = <&gpio6 0 GPIO_ACTIVE_HIGH>; /* 160 */ | 373 | cd-gpios = <&gpio6 0 GPIO_ACTIVE_HIGH>; /* 160 */ |
359 | }; | 374 | }; |
360 | 375 | ||
376 | /* most boards use vaux3, only some old versions use vmmc2 instead */ | ||
361 | &mmc2 { | 377 | &mmc2 { |
362 | status = "disabled"; | 378 | pinctrl-names = "default"; |
379 | pinctrl-0 = <&mmc2_pins>; | ||
380 | vmmc-supply = <&vaux3>; | ||
381 | vmmc_aux-supply = <&vsim>; | ||
382 | bus-width = <8>; | ||
383 | non-removable; | ||
363 | }; | 384 | }; |
364 | 385 | ||
365 | &mmc3 { | 386 | &mmc3 { |
diff --git a/arch/arm/boot/dts/omap3-n950-n9.dtsi b/arch/arm/boot/dts/omap3-n950-n9.dtsi index 94eb77d3b9dd..5c26c184f2c1 100644 --- a/arch/arm/boot/dts/omap3-n950-n9.dtsi +++ b/arch/arm/boot/dts/omap3-n950-n9.dtsi | |||
@@ -8,7 +8,7 @@ | |||
8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include "omap36xx.dtsi" | 11 | #include "omap36xx-hs.dtsi" |
12 | 12 | ||
13 | / { | 13 | / { |
14 | cpus { | 14 | cpus { |
diff --git a/arch/arm/boot/dts/omap3.dtsi b/arch/arm/boot/dts/omap3.dtsi index f3a0c26ed0c2..daabf99d402a 100644 --- a/arch/arm/boot/dts/omap3.dtsi +++ b/arch/arm/boot/dts/omap3.dtsi | |||
@@ -82,6 +82,13 @@ | |||
82 | ranges; | 82 | ranges; |
83 | ti,hwmods = "l3_main"; | 83 | ti,hwmods = "l3_main"; |
84 | 84 | ||
85 | aes: aes@480c5000 { | ||
86 | compatible = "ti,omap3-aes"; | ||
87 | ti,hwmods = "aes"; | ||
88 | reg = <0x480c5000 0x50>; | ||
89 | interrupts = <0>; | ||
90 | }; | ||
91 | |||
85 | counter32k: counter@48320000 { | 92 | counter32k: counter@48320000 { |
86 | compatible = "ti,omap-counter32k"; | 93 | compatible = "ti,omap-counter32k"; |
87 | reg = <0x48320000 0x20>; | 94 | reg = <0x48320000 0x20>; |
@@ -260,6 +267,13 @@ | |||
260 | ti,hwmods = "i2c3"; | 267 | ti,hwmods = "i2c3"; |
261 | }; | 268 | }; |
262 | 269 | ||
270 | mailbox: mailbox@48094000 { | ||
271 | compatible = "ti,omap3-mailbox"; | ||
272 | ti,hwmods = "mailbox"; | ||
273 | reg = <0x48094000 0x200>; | ||
274 | interrupts = <26>; | ||
275 | }; | ||
276 | |||
263 | mcspi1: spi@48098000 { | 277 | mcspi1: spi@48098000 { |
264 | compatible = "ti,omap2-mcspi"; | 278 | compatible = "ti,omap2-mcspi"; |
265 | reg = <0x48098000 0x100>; | 279 | reg = <0x48098000 0x100>; |
@@ -357,6 +371,13 @@ | |||
357 | dma-names = "tx", "rx"; | 371 | dma-names = "tx", "rx"; |
358 | }; | 372 | }; |
359 | 373 | ||
374 | mmu_isp: mmu@480bd400 { | ||
375 | compatible = "ti,omap3-mmu-isp"; | ||
376 | ti,hwmods = "mmu_isp"; | ||
377 | reg = <0x480bd400 0x80>; | ||
378 | interrupts = <8>; | ||
379 | }; | ||
380 | |||
360 | wdt2: wdt@48314000 { | 381 | wdt2: wdt@48314000 { |
361 | compatible = "ti,omap3-wdt"; | 382 | compatible = "ti,omap3-wdt"; |
362 | reg = <0x48314000 0x80>; | 383 | reg = <0x48314000 0x80>; |
@@ -442,6 +463,27 @@ | |||
442 | dma-names = "tx", "rx"; | 463 | dma-names = "tx", "rx"; |
443 | }; | 464 | }; |
444 | 465 | ||
466 | sham: sham@480c3000 { | ||
467 | compatible = "ti,omap3-sham"; | ||
468 | ti,hwmods = "sham"; | ||
469 | reg = <0x480c3000 0x64>; | ||
470 | interrupts = <49>; | ||
471 | }; | ||
472 | |||
473 | smartreflex_core: smartreflex@480cb000 { | ||
474 | compatible = "ti,omap3-smartreflex-core"; | ||
475 | ti,hwmods = "smartreflex_core"; | ||
476 | reg = <0x480cb000 0x400>; | ||
477 | interrupts = <19>; | ||
478 | }; | ||
479 | |||
480 | smartreflex_mpu_iva: smartreflex@480c9000 { | ||
481 | compatible = "ti,omap3-smartreflex-iva"; | ||
482 | ti,hwmods = "smartreflex_mpu_iva"; | ||
483 | reg = <0x480c9000 0x400>; | ||
484 | interrupts = <18>; | ||
485 | }; | ||
486 | |||
445 | timer1: timer@48318000 { | 487 | timer1: timer@48318000 { |
446 | compatible = "ti,omap3430-timer"; | 488 | compatible = "ti,omap3430-timer"; |
447 | reg = <0x48318000 0x400>; | 489 | reg = <0x48318000 0x400>; |
diff --git a/arch/arm/boot/dts/omap34xx-hs.dtsi b/arch/arm/boot/dts/omap34xx-hs.dtsi new file mode 100644 index 000000000000..1ff626489546 --- /dev/null +++ b/arch/arm/boot/dts/omap34xx-hs.dtsi | |||
@@ -0,0 +1,16 @@ | |||
1 | /* Disabled modules for secure omaps */ | ||
2 | |||
3 | #include "omap34xx.dtsi" | ||
4 | |||
5 | /* Secure omaps have some devices inaccessible depending on the firmware */ | ||
6 | &aes { | ||
7 | status = "disabled"; | ||
8 | }; | ||
9 | |||
10 | &sham { | ||
11 | status = "disabled"; | ||
12 | }; | ||
13 | |||
14 | &timer12 { | ||
15 | status = "disabled"; | ||
16 | }; | ||
diff --git a/arch/arm/boot/dts/omap36xx-hs.dtsi b/arch/arm/boot/dts/omap36xx-hs.dtsi new file mode 100644 index 000000000000..2c7febb0e016 --- /dev/null +++ b/arch/arm/boot/dts/omap36xx-hs.dtsi | |||
@@ -0,0 +1,16 @@ | |||
1 | /* Disabled modules for secure omaps */ | ||
2 | |||
3 | #include "omap36xx.dtsi" | ||
4 | |||
5 | /* Secure omaps have some devices inaccessible depending on the firmware */ | ||
6 | &aes { | ||
7 | status = "disabled"; | ||
8 | }; | ||
9 | |||
10 | &sham { | ||
11 | status = "disabled"; | ||
12 | }; | ||
13 | |||
14 | &timer12 { | ||
15 | status = "disabled"; | ||
16 | }; | ||
diff --git a/arch/arm/boot/dts/omap4-panda-common.dtsi b/arch/arm/boot/dts/omap4-panda-common.dtsi index 298e85020e1b..88c6a05cab41 100644 --- a/arch/arm/boot/dts/omap4-panda-common.dtsi +++ b/arch/arm/boot/dts/omap4-panda-common.dtsi | |||
@@ -246,15 +246,6 @@ | |||
246 | 0xf0 (PIN_INPUT_PULLUP | MUX_MODE0) /* i2c4_sda */ | 246 | 0xf0 (PIN_INPUT_PULLUP | MUX_MODE0) /* i2c4_sda */ |
247 | >; | 247 | >; |
248 | }; | 248 | }; |
249 | }; | ||
250 | |||
251 | &omap4_pmx_wkup { | ||
252 | led_wkgpio_pins: pinmux_leds_wkpins { | ||
253 | pinctrl-single,pins = < | ||
254 | 0x1a (PIN_OUTPUT | MUX_MODE3) /* gpio_wk7 */ | ||
255 | 0x1c (PIN_OUTPUT | MUX_MODE3) /* gpio_wk8 */ | ||
256 | >; | ||
257 | }; | ||
258 | 249 | ||
259 | /* | 250 | /* |
260 | * wl12xx GPIO outputs for WLAN_EN, BT_EN, FM_EN, BT_WAKEUP | 251 | * wl12xx GPIO outputs for WLAN_EN, BT_EN, FM_EN, BT_WAKEUP |
@@ -274,7 +265,7 @@ | |||
274 | pinctrl-single,pins = < | 265 | pinctrl-single,pins = < |
275 | 0x38 (PIN_INPUT | MUX_MODE3) /* gpmc_ncs2.gpio_52 */ | 266 | 0x38 (PIN_INPUT | MUX_MODE3) /* gpmc_ncs2.gpio_52 */ |
276 | 0x3a (PIN_INPUT | MUX_MODE3) /* gpmc_ncs3.gpio_53 */ | 267 | 0x3a (PIN_INPUT | MUX_MODE3) /* gpmc_ncs3.gpio_53 */ |
277 | 0x108 (PIN_OUTPUT | MUX_MODE0) /* sdmmc5_clk.sdmmc5_clk */ | 268 | 0x108 (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc5_clk.sdmmc5_clk */ |
278 | 0x10a (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc5_cmd.sdmmc5_cmd */ | 269 | 0x10a (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc5_cmd.sdmmc5_cmd */ |
279 | 0x10c (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc5_dat0.sdmmc5_dat0 */ | 270 | 0x10c (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc5_dat0.sdmmc5_dat0 */ |
280 | 0x10e (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc5_dat1.sdmmc5_dat1 */ | 271 | 0x10e (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc5_dat1.sdmmc5_dat1 */ |
@@ -284,6 +275,15 @@ | |||
284 | }; | 275 | }; |
285 | }; | 276 | }; |
286 | 277 | ||
278 | &omap4_pmx_wkup { | ||
279 | led_wkgpio_pins: pinmux_leds_wkpins { | ||
280 | pinctrl-single,pins = < | ||
281 | 0x1a (PIN_OUTPUT | MUX_MODE3) /* gpio_wk7 */ | ||
282 | 0x1c (PIN_OUTPUT | MUX_MODE3) /* gpio_wk8 */ | ||
283 | >; | ||
284 | }; | ||
285 | }; | ||
286 | |||
287 | &i2c1 { | 287 | &i2c1 { |
288 | pinctrl-names = "default"; | 288 | pinctrl-names = "default"; |
289 | pinctrl-0 = <&i2c1_pins>; | 289 | pinctrl-0 = <&i2c1_pins>; |
diff --git a/arch/arm/boot/dts/omap4-sdp.dts b/arch/arm/boot/dts/omap4-sdp.dts index 5fc3f43c5a81..dbc81fb6ef03 100644 --- a/arch/arm/boot/dts/omap4-sdp.dts +++ b/arch/arm/boot/dts/omap4-sdp.dts | |||
@@ -300,12 +300,12 @@ | |||
300 | wl12xx_pins: pinmux_wl12xx_pins { | 300 | wl12xx_pins: pinmux_wl12xx_pins { |
301 | pinctrl-single,pins = < | 301 | pinctrl-single,pins = < |
302 | 0x3a (PIN_INPUT | MUX_MODE3) /* gpmc_ncs3.gpio_53 */ | 302 | 0x3a (PIN_INPUT | MUX_MODE3) /* gpmc_ncs3.gpio_53 */ |
303 | 0x108 (PIN_OUTPUT | MUX_MODE3) /* sdmmc5_clk.sdmmc5_clk */ | 303 | 0x108 (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc5_clk.sdmmc5_clk */ |
304 | 0x10a (PIN_INPUT_PULLUP | MUX_MODE3) /* sdmmc5_cmd.sdmmc5_cmd */ | 304 | 0x10a (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc5_cmd.sdmmc5_cmd */ |
305 | 0x10c (PIN_INPUT_PULLUP | MUX_MODE3) /* sdmmc5_dat0.sdmmc5_dat0 */ | 305 | 0x10c (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc5_dat0.sdmmc5_dat0 */ |
306 | 0x10e (PIN_INPUT_PULLUP | MUX_MODE3) /* sdmmc5_dat1.sdmmc5_dat1 */ | 306 | 0x10e (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc5_dat1.sdmmc5_dat1 */ |
307 | 0x110 (PIN_INPUT_PULLUP | MUX_MODE3) /* sdmmc5_dat2.sdmmc5_dat2 */ | 307 | 0x110 (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc5_dat2.sdmmc5_dat2 */ |
308 | 0x112 (PIN_INPUT_PULLUP | MUX_MODE3) /* sdmmc5_dat3.sdmmc5_dat3 */ | 308 | 0x112 (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc5_dat3.sdmmc5_dat3 */ |
309 | >; | 309 | >; |
310 | }; | 310 | }; |
311 | }; | 311 | }; |
diff --git a/arch/arm/boot/dts/r8a7790.dtsi b/arch/arm/boot/dts/r8a7790.dtsi index ee845fad939b..9987dd0e9c59 100644 --- a/arch/arm/boot/dts/r8a7790.dtsi +++ b/arch/arm/boot/dts/r8a7790.dtsi | |||
@@ -87,9 +87,9 @@ | |||
87 | interrupts = <1 9 0xf04>; | 87 | interrupts = <1 9 0xf04>; |
88 | }; | 88 | }; |
89 | 89 | ||
90 | gpio0: gpio@ffc40000 { | 90 | gpio0: gpio@e6050000 { |
91 | compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar"; | 91 | compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar"; |
92 | reg = <0 0xffc40000 0 0x2c>; | 92 | reg = <0 0xe6050000 0 0x50>; |
93 | interrupt-parent = <&gic>; | 93 | interrupt-parent = <&gic>; |
94 | interrupts = <0 4 0x4>; | 94 | interrupts = <0 4 0x4>; |
95 | #gpio-cells = <2>; | 95 | #gpio-cells = <2>; |
@@ -99,9 +99,9 @@ | |||
99 | interrupt-controller; | 99 | interrupt-controller; |
100 | }; | 100 | }; |
101 | 101 | ||
102 | gpio1: gpio@ffc41000 { | 102 | gpio1: gpio@e6051000 { |
103 | compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar"; | 103 | compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar"; |
104 | reg = <0 0xffc41000 0 0x2c>; | 104 | reg = <0 0xe6051000 0 0x50>; |
105 | interrupt-parent = <&gic>; | 105 | interrupt-parent = <&gic>; |
106 | interrupts = <0 5 0x4>; | 106 | interrupts = <0 5 0x4>; |
107 | #gpio-cells = <2>; | 107 | #gpio-cells = <2>; |
@@ -111,9 +111,9 @@ | |||
111 | interrupt-controller; | 111 | interrupt-controller; |
112 | }; | 112 | }; |
113 | 113 | ||
114 | gpio2: gpio@ffc42000 { | 114 | gpio2: gpio@e6052000 { |
115 | compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar"; | 115 | compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar"; |
116 | reg = <0 0xffc42000 0 0x2c>; | 116 | reg = <0 0xe6052000 0 0x50>; |
117 | interrupt-parent = <&gic>; | 117 | interrupt-parent = <&gic>; |
118 | interrupts = <0 6 0x4>; | 118 | interrupts = <0 6 0x4>; |
119 | #gpio-cells = <2>; | 119 | #gpio-cells = <2>; |
@@ -123,9 +123,9 @@ | |||
123 | interrupt-controller; | 123 | interrupt-controller; |
124 | }; | 124 | }; |
125 | 125 | ||
126 | gpio3: gpio@ffc43000 { | 126 | gpio3: gpio@e6053000 { |
127 | compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar"; | 127 | compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar"; |
128 | reg = <0 0xffc43000 0 0x2c>; | 128 | reg = <0 0xe6053000 0 0x50>; |
129 | interrupt-parent = <&gic>; | 129 | interrupt-parent = <&gic>; |
130 | interrupts = <0 7 0x4>; | 130 | interrupts = <0 7 0x4>; |
131 | #gpio-cells = <2>; | 131 | #gpio-cells = <2>; |
@@ -135,9 +135,9 @@ | |||
135 | interrupt-controller; | 135 | interrupt-controller; |
136 | }; | 136 | }; |
137 | 137 | ||
138 | gpio4: gpio@ffc44000 { | 138 | gpio4: gpio@e6054000 { |
139 | compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar"; | 139 | compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar"; |
140 | reg = <0 0xffc44000 0 0x2c>; | 140 | reg = <0 0xe6054000 0 0x50>; |
141 | interrupt-parent = <&gic>; | 141 | interrupt-parent = <&gic>; |
142 | interrupts = <0 8 0x4>; | 142 | interrupts = <0 8 0x4>; |
143 | #gpio-cells = <2>; | 143 | #gpio-cells = <2>; |
@@ -147,9 +147,9 @@ | |||
147 | interrupt-controller; | 147 | interrupt-controller; |
148 | }; | 148 | }; |
149 | 149 | ||
150 | gpio5: gpio@ffc45000 { | 150 | gpio5: gpio@e6055000 { |
151 | compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar"; | 151 | compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar"; |
152 | reg = <0 0xffc45000 0 0x2c>; | 152 | reg = <0 0xe6055000 0 0x50>; |
153 | interrupt-parent = <&gic>; | 153 | interrupt-parent = <&gic>; |
154 | interrupts = <0 9 0x4>; | 154 | interrupts = <0 9 0x4>; |
155 | #gpio-cells = <2>; | 155 | #gpio-cells = <2>; |
@@ -241,7 +241,7 @@ | |||
241 | 241 | ||
242 | sdhi0: sdhi@ee100000 { | 242 | sdhi0: sdhi@ee100000 { |
243 | compatible = "renesas,sdhi-r8a7790"; | 243 | compatible = "renesas,sdhi-r8a7790"; |
244 | reg = <0 0xee100000 0 0x100>; | 244 | reg = <0 0xee100000 0 0x200>; |
245 | interrupt-parent = <&gic>; | 245 | interrupt-parent = <&gic>; |
246 | interrupts = <0 165 4>; | 246 | interrupts = <0 165 4>; |
247 | cap-sd-highspeed; | 247 | cap-sd-highspeed; |
@@ -250,7 +250,7 @@ | |||
250 | 250 | ||
251 | sdhi1: sdhi@ee120000 { | 251 | sdhi1: sdhi@ee120000 { |
252 | compatible = "renesas,sdhi-r8a7790"; | 252 | compatible = "renesas,sdhi-r8a7790"; |
253 | reg = <0 0xee120000 0 0x100>; | 253 | reg = <0 0xee120000 0 0x200>; |
254 | interrupt-parent = <&gic>; | 254 | interrupt-parent = <&gic>; |
255 | interrupts = <0 166 4>; | 255 | interrupts = <0 166 4>; |
256 | cap-sd-highspeed; | 256 | cap-sd-highspeed; |
diff --git a/arch/arm/boot/dts/socfpga.dtsi b/arch/arm/boot/dts/socfpga.dtsi index 6d09b8d42fdd..f936476c2753 100644 --- a/arch/arm/boot/dts/socfpga.dtsi +++ b/arch/arm/boot/dts/socfpga.dtsi | |||
@@ -245,14 +245,14 @@ | |||
245 | 245 | ||
246 | mpu_periph_clk: mpu_periph_clk { | 246 | mpu_periph_clk: mpu_periph_clk { |
247 | #clock-cells = <0>; | 247 | #clock-cells = <0>; |
248 | compatible = "altr,socfpga-gate-clk"; | 248 | compatible = "altr,socfpga-perip-clk"; |
249 | clocks = <&mpuclk>; | 249 | clocks = <&mpuclk>; |
250 | fixed-divider = <4>; | 250 | fixed-divider = <4>; |
251 | }; | 251 | }; |
252 | 252 | ||
253 | mpu_l2_ram_clk: mpu_l2_ram_clk { | 253 | mpu_l2_ram_clk: mpu_l2_ram_clk { |
254 | #clock-cells = <0>; | 254 | #clock-cells = <0>; |
255 | compatible = "altr,socfpga-gate-clk"; | 255 | compatible = "altr,socfpga-perip-clk"; |
256 | clocks = <&mpuclk>; | 256 | clocks = <&mpuclk>; |
257 | fixed-divider = <2>; | 257 | fixed-divider = <2>; |
258 | }; | 258 | }; |
@@ -266,8 +266,9 @@ | |||
266 | 266 | ||
267 | l3_main_clk: l3_main_clk { | 267 | l3_main_clk: l3_main_clk { |
268 | #clock-cells = <0>; | 268 | #clock-cells = <0>; |
269 | compatible = "altr,socfpga-gate-clk"; | 269 | compatible = "altr,socfpga-perip-clk"; |
270 | clocks = <&mainclk>; | 270 | clocks = <&mainclk>; |
271 | fixed-divider = <1>; | ||
271 | }; | 272 | }; |
272 | 273 | ||
273 | l3_mp_clk: l3_mp_clk { | 274 | l3_mp_clk: l3_mp_clk { |
diff --git a/arch/arm/boot/dts/sun5i-a10s.dtsi b/arch/arm/boot/dts/sun5i-a10s.dtsi index 52476742a104..e674c94c7206 100644 --- a/arch/arm/boot/dts/sun5i-a10s.dtsi +++ b/arch/arm/boot/dts/sun5i-a10s.dtsi | |||
@@ -332,5 +332,12 @@ | |||
332 | clock-frequency = <100000>; | 332 | clock-frequency = <100000>; |
333 | status = "disabled"; | 333 | status = "disabled"; |
334 | }; | 334 | }; |
335 | |||
336 | timer@01c60000 { | ||
337 | compatible = "allwinner,sun5i-a13-hstimer"; | ||
338 | reg = <0x01c60000 0x1000>; | ||
339 | interrupts = <82>, <83>; | ||
340 | clocks = <&ahb_gates 28>; | ||
341 | }; | ||
335 | }; | 342 | }; |
336 | }; | 343 | }; |
diff --git a/arch/arm/boot/dts/sun5i-a13.dtsi b/arch/arm/boot/dts/sun5i-a13.dtsi index ce8ef2a45be0..1ccd75d37f49 100644 --- a/arch/arm/boot/dts/sun5i-a13.dtsi +++ b/arch/arm/boot/dts/sun5i-a13.dtsi | |||
@@ -273,5 +273,12 @@ | |||
273 | clock-frequency = <100000>; | 273 | clock-frequency = <100000>; |
274 | status = "disabled"; | 274 | status = "disabled"; |
275 | }; | 275 | }; |
276 | |||
277 | timer@01c60000 { | ||
278 | compatible = "allwinner,sun5i-a13-hstimer"; | ||
279 | reg = <0x01c60000 0x1000>; | ||
280 | interrupts = <82>, <83>; | ||
281 | clocks = <&ahb_gates 28>; | ||
282 | }; | ||
276 | }; | 283 | }; |
277 | }; | 284 | }; |
diff --git a/arch/arm/boot/dts/sun6i-a31.dtsi b/arch/arm/boot/dts/sun6i-a31.dtsi index c1751a64889a..7f5878c2784a 100644 --- a/arch/arm/boot/dts/sun6i-a31.dtsi +++ b/arch/arm/boot/dts/sun6i-a31.dtsi | |||
@@ -193,7 +193,10 @@ | |||
193 | pio: pinctrl@01c20800 { | 193 | pio: pinctrl@01c20800 { |
194 | compatible = "allwinner,sun6i-a31-pinctrl"; | 194 | compatible = "allwinner,sun6i-a31-pinctrl"; |
195 | reg = <0x01c20800 0x400>; | 195 | reg = <0x01c20800 0x400>; |
196 | interrupts = <0 11 1>, <0 15 1>, <0 16 1>, <0 17 1>; | 196 | interrupts = <0 11 4>, |
197 | <0 15 4>, | ||
198 | <0 16 4>, | ||
199 | <0 17 4>; | ||
197 | clocks = <&apb1_gates 5>; | 200 | clocks = <&apb1_gates 5>; |
198 | gpio-controller; | 201 | gpio-controller; |
199 | interrupt-controller; | 202 | interrupt-controller; |
@@ -212,11 +215,11 @@ | |||
212 | timer@01c20c00 { | 215 | timer@01c20c00 { |
213 | compatible = "allwinner,sun4i-timer"; | 216 | compatible = "allwinner,sun4i-timer"; |
214 | reg = <0x01c20c00 0xa0>; | 217 | reg = <0x01c20c00 0xa0>; |
215 | interrupts = <0 18 1>, | 218 | interrupts = <0 18 4>, |
216 | <0 19 1>, | 219 | <0 19 4>, |
217 | <0 20 1>, | 220 | <0 20 4>, |
218 | <0 21 1>, | 221 | <0 21 4>, |
219 | <0 22 1>; | 222 | <0 22 4>; |
220 | clocks = <&osc24M>; | 223 | clocks = <&osc24M>; |
221 | }; | 224 | }; |
222 | 225 | ||
@@ -228,7 +231,7 @@ | |||
228 | uart0: serial@01c28000 { | 231 | uart0: serial@01c28000 { |
229 | compatible = "snps,dw-apb-uart"; | 232 | compatible = "snps,dw-apb-uart"; |
230 | reg = <0x01c28000 0x400>; | 233 | reg = <0x01c28000 0x400>; |
231 | interrupts = <0 0 1>; | 234 | interrupts = <0 0 4>; |
232 | reg-shift = <2>; | 235 | reg-shift = <2>; |
233 | reg-io-width = <4>; | 236 | reg-io-width = <4>; |
234 | clocks = <&apb2_gates 16>; | 237 | clocks = <&apb2_gates 16>; |
@@ -238,7 +241,7 @@ | |||
238 | uart1: serial@01c28400 { | 241 | uart1: serial@01c28400 { |
239 | compatible = "snps,dw-apb-uart"; | 242 | compatible = "snps,dw-apb-uart"; |
240 | reg = <0x01c28400 0x400>; | 243 | reg = <0x01c28400 0x400>; |
241 | interrupts = <0 1 1>; | 244 | interrupts = <0 1 4>; |
242 | reg-shift = <2>; | 245 | reg-shift = <2>; |
243 | reg-io-width = <4>; | 246 | reg-io-width = <4>; |
244 | clocks = <&apb2_gates 17>; | 247 | clocks = <&apb2_gates 17>; |
@@ -248,7 +251,7 @@ | |||
248 | uart2: serial@01c28800 { | 251 | uart2: serial@01c28800 { |
249 | compatible = "snps,dw-apb-uart"; | 252 | compatible = "snps,dw-apb-uart"; |
250 | reg = <0x01c28800 0x400>; | 253 | reg = <0x01c28800 0x400>; |
251 | interrupts = <0 2 1>; | 254 | interrupts = <0 2 4>; |
252 | reg-shift = <2>; | 255 | reg-shift = <2>; |
253 | reg-io-width = <4>; | 256 | reg-io-width = <4>; |
254 | clocks = <&apb2_gates 18>; | 257 | clocks = <&apb2_gates 18>; |
@@ -258,7 +261,7 @@ | |||
258 | uart3: serial@01c28c00 { | 261 | uart3: serial@01c28c00 { |
259 | compatible = "snps,dw-apb-uart"; | 262 | compatible = "snps,dw-apb-uart"; |
260 | reg = <0x01c28c00 0x400>; | 263 | reg = <0x01c28c00 0x400>; |
261 | interrupts = <0 3 1>; | 264 | interrupts = <0 3 4>; |
262 | reg-shift = <2>; | 265 | reg-shift = <2>; |
263 | reg-io-width = <4>; | 266 | reg-io-width = <4>; |
264 | clocks = <&apb2_gates 19>; | 267 | clocks = <&apb2_gates 19>; |
@@ -268,7 +271,7 @@ | |||
268 | uart4: serial@01c29000 { | 271 | uart4: serial@01c29000 { |
269 | compatible = "snps,dw-apb-uart"; | 272 | compatible = "snps,dw-apb-uart"; |
270 | reg = <0x01c29000 0x400>; | 273 | reg = <0x01c29000 0x400>; |
271 | interrupts = <0 4 1>; | 274 | interrupts = <0 4 4>; |
272 | reg-shift = <2>; | 275 | reg-shift = <2>; |
273 | reg-io-width = <4>; | 276 | reg-io-width = <4>; |
274 | clocks = <&apb2_gates 20>; | 277 | clocks = <&apb2_gates 20>; |
@@ -278,7 +281,7 @@ | |||
278 | uart5: serial@01c29400 { | 281 | uart5: serial@01c29400 { |
279 | compatible = "snps,dw-apb-uart"; | 282 | compatible = "snps,dw-apb-uart"; |
280 | reg = <0x01c29400 0x400>; | 283 | reg = <0x01c29400 0x400>; |
281 | interrupts = <0 5 1>; | 284 | interrupts = <0 5 4>; |
282 | reg-shift = <2>; | 285 | reg-shift = <2>; |
283 | reg-io-width = <4>; | 286 | reg-io-width = <4>; |
284 | clocks = <&apb2_gates 21>; | 287 | clocks = <&apb2_gates 21>; |
diff --git a/arch/arm/boot/dts/sun7i-a20.dtsi b/arch/arm/boot/dts/sun7i-a20.dtsi index e46cfedde74c..0135039eff96 100644 --- a/arch/arm/boot/dts/sun7i-a20.dtsi +++ b/arch/arm/boot/dts/sun7i-a20.dtsi | |||
@@ -170,7 +170,7 @@ | |||
170 | emac: ethernet@01c0b000 { | 170 | emac: ethernet@01c0b000 { |
171 | compatible = "allwinner,sun4i-emac"; | 171 | compatible = "allwinner,sun4i-emac"; |
172 | reg = <0x01c0b000 0x1000>; | 172 | reg = <0x01c0b000 0x1000>; |
173 | interrupts = <0 55 1>; | 173 | interrupts = <0 55 4>; |
174 | clocks = <&ahb_gates 17>; | 174 | clocks = <&ahb_gates 17>; |
175 | status = "disabled"; | 175 | status = "disabled"; |
176 | }; | 176 | }; |
@@ -186,7 +186,7 @@ | |||
186 | pio: pinctrl@01c20800 { | 186 | pio: pinctrl@01c20800 { |
187 | compatible = "allwinner,sun7i-a20-pinctrl"; | 187 | compatible = "allwinner,sun7i-a20-pinctrl"; |
188 | reg = <0x01c20800 0x400>; | 188 | reg = <0x01c20800 0x400>; |
189 | interrupts = <0 28 1>; | 189 | interrupts = <0 28 4>; |
190 | clocks = <&apb0_gates 5>; | 190 | clocks = <&apb0_gates 5>; |
191 | gpio-controller; | 191 | gpio-controller; |
192 | interrupt-controller; | 192 | interrupt-controller; |
@@ -251,12 +251,12 @@ | |||
251 | timer@01c20c00 { | 251 | timer@01c20c00 { |
252 | compatible = "allwinner,sun4i-timer"; | 252 | compatible = "allwinner,sun4i-timer"; |
253 | reg = <0x01c20c00 0x90>; | 253 | reg = <0x01c20c00 0x90>; |
254 | interrupts = <0 22 1>, | 254 | interrupts = <0 22 4>, |
255 | <0 23 1>, | 255 | <0 23 4>, |
256 | <0 24 1>, | 256 | <0 24 4>, |
257 | <0 25 1>, | 257 | <0 25 4>, |
258 | <0 67 1>, | 258 | <0 67 4>, |
259 | <0 68 1>; | 259 | <0 68 4>; |
260 | clocks = <&osc24M>; | 260 | clocks = <&osc24M>; |
261 | }; | 261 | }; |
262 | 262 | ||
@@ -273,7 +273,7 @@ | |||
273 | uart0: serial@01c28000 { | 273 | uart0: serial@01c28000 { |
274 | compatible = "snps,dw-apb-uart"; | 274 | compatible = "snps,dw-apb-uart"; |
275 | reg = <0x01c28000 0x400>; | 275 | reg = <0x01c28000 0x400>; |
276 | interrupts = <0 1 1>; | 276 | interrupts = <0 1 4>; |
277 | reg-shift = <2>; | 277 | reg-shift = <2>; |
278 | reg-io-width = <4>; | 278 | reg-io-width = <4>; |
279 | clocks = <&apb1_gates 16>; | 279 | clocks = <&apb1_gates 16>; |
@@ -283,7 +283,7 @@ | |||
283 | uart1: serial@01c28400 { | 283 | uart1: serial@01c28400 { |
284 | compatible = "snps,dw-apb-uart"; | 284 | compatible = "snps,dw-apb-uart"; |
285 | reg = <0x01c28400 0x400>; | 285 | reg = <0x01c28400 0x400>; |
286 | interrupts = <0 2 1>; | 286 | interrupts = <0 2 4>; |
287 | reg-shift = <2>; | 287 | reg-shift = <2>; |
288 | reg-io-width = <4>; | 288 | reg-io-width = <4>; |
289 | clocks = <&apb1_gates 17>; | 289 | clocks = <&apb1_gates 17>; |
@@ -293,7 +293,7 @@ | |||
293 | uart2: serial@01c28800 { | 293 | uart2: serial@01c28800 { |
294 | compatible = "snps,dw-apb-uart"; | 294 | compatible = "snps,dw-apb-uart"; |
295 | reg = <0x01c28800 0x400>; | 295 | reg = <0x01c28800 0x400>; |
296 | interrupts = <0 3 1>; | 296 | interrupts = <0 3 4>; |
297 | reg-shift = <2>; | 297 | reg-shift = <2>; |
298 | reg-io-width = <4>; | 298 | reg-io-width = <4>; |
299 | clocks = <&apb1_gates 18>; | 299 | clocks = <&apb1_gates 18>; |
@@ -303,7 +303,7 @@ | |||
303 | uart3: serial@01c28c00 { | 303 | uart3: serial@01c28c00 { |
304 | compatible = "snps,dw-apb-uart"; | 304 | compatible = "snps,dw-apb-uart"; |
305 | reg = <0x01c28c00 0x400>; | 305 | reg = <0x01c28c00 0x400>; |
306 | interrupts = <0 4 1>; | 306 | interrupts = <0 4 4>; |
307 | reg-shift = <2>; | 307 | reg-shift = <2>; |
308 | reg-io-width = <4>; | 308 | reg-io-width = <4>; |
309 | clocks = <&apb1_gates 19>; | 309 | clocks = <&apb1_gates 19>; |
@@ -313,7 +313,7 @@ | |||
313 | uart4: serial@01c29000 { | 313 | uart4: serial@01c29000 { |
314 | compatible = "snps,dw-apb-uart"; | 314 | compatible = "snps,dw-apb-uart"; |
315 | reg = <0x01c29000 0x400>; | 315 | reg = <0x01c29000 0x400>; |
316 | interrupts = <0 17 1>; | 316 | interrupts = <0 17 4>; |
317 | reg-shift = <2>; | 317 | reg-shift = <2>; |
318 | reg-io-width = <4>; | 318 | reg-io-width = <4>; |
319 | clocks = <&apb1_gates 20>; | 319 | clocks = <&apb1_gates 20>; |
@@ -323,7 +323,7 @@ | |||
323 | uart5: serial@01c29400 { | 323 | uart5: serial@01c29400 { |
324 | compatible = "snps,dw-apb-uart"; | 324 | compatible = "snps,dw-apb-uart"; |
325 | reg = <0x01c29400 0x400>; | 325 | reg = <0x01c29400 0x400>; |
326 | interrupts = <0 18 1>; | 326 | interrupts = <0 18 4>; |
327 | reg-shift = <2>; | 327 | reg-shift = <2>; |
328 | reg-io-width = <4>; | 328 | reg-io-width = <4>; |
329 | clocks = <&apb1_gates 21>; | 329 | clocks = <&apb1_gates 21>; |
@@ -333,7 +333,7 @@ | |||
333 | uart6: serial@01c29800 { | 333 | uart6: serial@01c29800 { |
334 | compatible = "snps,dw-apb-uart"; | 334 | compatible = "snps,dw-apb-uart"; |
335 | reg = <0x01c29800 0x400>; | 335 | reg = <0x01c29800 0x400>; |
336 | interrupts = <0 19 1>; | 336 | interrupts = <0 19 4>; |
337 | reg-shift = <2>; | 337 | reg-shift = <2>; |
338 | reg-io-width = <4>; | 338 | reg-io-width = <4>; |
339 | clocks = <&apb1_gates 22>; | 339 | clocks = <&apb1_gates 22>; |
@@ -343,7 +343,7 @@ | |||
343 | uart7: serial@01c29c00 { | 343 | uart7: serial@01c29c00 { |
344 | compatible = "snps,dw-apb-uart"; | 344 | compatible = "snps,dw-apb-uart"; |
345 | reg = <0x01c29c00 0x400>; | 345 | reg = <0x01c29c00 0x400>; |
346 | interrupts = <0 20 1>; | 346 | interrupts = <0 20 4>; |
347 | reg-shift = <2>; | 347 | reg-shift = <2>; |
348 | reg-io-width = <4>; | 348 | reg-io-width = <4>; |
349 | clocks = <&apb1_gates 23>; | 349 | clocks = <&apb1_gates 23>; |
@@ -353,7 +353,7 @@ | |||
353 | i2c0: i2c@01c2ac00 { | 353 | i2c0: i2c@01c2ac00 { |
354 | compatible = "allwinner,sun4i-i2c"; | 354 | compatible = "allwinner,sun4i-i2c"; |
355 | reg = <0x01c2ac00 0x400>; | 355 | reg = <0x01c2ac00 0x400>; |
356 | interrupts = <0 7 1>; | 356 | interrupts = <0 7 4>; |
357 | clocks = <&apb1_gates 0>; | 357 | clocks = <&apb1_gates 0>; |
358 | clock-frequency = <100000>; | 358 | clock-frequency = <100000>; |
359 | status = "disabled"; | 359 | status = "disabled"; |
@@ -362,7 +362,7 @@ | |||
362 | i2c1: i2c@01c2b000 { | 362 | i2c1: i2c@01c2b000 { |
363 | compatible = "allwinner,sun4i-i2c"; | 363 | compatible = "allwinner,sun4i-i2c"; |
364 | reg = <0x01c2b000 0x400>; | 364 | reg = <0x01c2b000 0x400>; |
365 | interrupts = <0 8 1>; | 365 | interrupts = <0 8 4>; |
366 | clocks = <&apb1_gates 1>; | 366 | clocks = <&apb1_gates 1>; |
367 | clock-frequency = <100000>; | 367 | clock-frequency = <100000>; |
368 | status = "disabled"; | 368 | status = "disabled"; |
@@ -371,7 +371,7 @@ | |||
371 | i2c2: i2c@01c2b400 { | 371 | i2c2: i2c@01c2b400 { |
372 | compatible = "allwinner,sun4i-i2c"; | 372 | compatible = "allwinner,sun4i-i2c"; |
373 | reg = <0x01c2b400 0x400>; | 373 | reg = <0x01c2b400 0x400>; |
374 | interrupts = <0 9 1>; | 374 | interrupts = <0 9 4>; |
375 | clocks = <&apb1_gates 2>; | 375 | clocks = <&apb1_gates 2>; |
376 | clock-frequency = <100000>; | 376 | clock-frequency = <100000>; |
377 | status = "disabled"; | 377 | status = "disabled"; |
@@ -380,7 +380,7 @@ | |||
380 | i2c3: i2c@01c2b800 { | 380 | i2c3: i2c@01c2b800 { |
381 | compatible = "allwinner,sun4i-i2c"; | 381 | compatible = "allwinner,sun4i-i2c"; |
382 | reg = <0x01c2b800 0x400>; | 382 | reg = <0x01c2b800 0x400>; |
383 | interrupts = <0 88 1>; | 383 | interrupts = <0 88 4>; |
384 | clocks = <&apb1_gates 3>; | 384 | clocks = <&apb1_gates 3>; |
385 | clock-frequency = <100000>; | 385 | clock-frequency = <100000>; |
386 | status = "disabled"; | 386 | status = "disabled"; |
@@ -389,12 +389,22 @@ | |||
389 | i2c4: i2c@01c2bc00 { | 389 | i2c4: i2c@01c2bc00 { |
390 | compatible = "allwinner,sun4i-i2c"; | 390 | compatible = "allwinner,sun4i-i2c"; |
391 | reg = <0x01c2bc00 0x400>; | 391 | reg = <0x01c2bc00 0x400>; |
392 | interrupts = <0 89 1>; | 392 | interrupts = <0 89 4>; |
393 | clocks = <&apb1_gates 15>; | 393 | clocks = <&apb1_gates 15>; |
394 | clock-frequency = <100000>; | 394 | clock-frequency = <100000>; |
395 | status = "disabled"; | 395 | status = "disabled"; |
396 | }; | 396 | }; |
397 | 397 | ||
398 | hstimer@01c60000 { | ||
399 | compatible = "allwinner,sun7i-a20-hstimer"; | ||
400 | reg = <0x01c60000 0x1000>; | ||
401 | interrupts = <0 81 1>, | ||
402 | <0 82 1>, | ||
403 | <0 83 1>, | ||
404 | <0 84 1>; | ||
405 | clocks = <&ahb_gates 28>; | ||
406 | }; | ||
407 | |||
398 | gic: interrupt-controller@01c81000 { | 408 | gic: interrupt-controller@01c81000 { |
399 | compatible = "arm,cortex-a7-gic", "arm,cortex-a15-gic"; | 409 | compatible = "arm,cortex-a7-gic", "arm,cortex-a15-gic"; |
400 | reg = <0x01c81000 0x1000>, | 410 | reg = <0x01c81000 0x1000>, |
diff --git a/arch/arm/boot/dts/tegra20-colibri-512.dtsi b/arch/arm/boot/dts/tegra20-colibri-512.dtsi index d5c9bca01232..cbe89ff10686 100644 --- a/arch/arm/boot/dts/tegra20-colibri-512.dtsi +++ b/arch/arm/boot/dts/tegra20-colibri-512.dtsi | |||
@@ -268,8 +268,8 @@ | |||
268 | reg = <3>; | 268 | reg = <3>; |
269 | regulator-compatible = "sm2"; | 269 | regulator-compatible = "sm2"; |
270 | regulator-name = "vdd_sm2,vin_ldo*"; | 270 | regulator-name = "vdd_sm2,vin_ldo*"; |
271 | regulator-min-microvolt = <3700000>; | 271 | regulator-min-microvolt = <1800000>; |
272 | regulator-max-microvolt = <3700000>; | 272 | regulator-max-microvolt = <1800000>; |
273 | regulator-always-on; | 273 | regulator-always-on; |
274 | }; | 274 | }; |
275 | 275 | ||
diff --git a/arch/arm/configs/bcm_defconfig b/arch/arm/configs/bcm_defconfig index 287ac1d7aac7..bede51171d98 100644 --- a/arch/arm/configs/bcm_defconfig +++ b/arch/arm/configs/bcm_defconfig | |||
@@ -126,3 +126,4 @@ CONFIG_CRC_ITU_T=y | |||
126 | CONFIG_CRC7=y | 126 | CONFIG_CRC7=y |
127 | CONFIG_XZ_DEC=y | 127 | CONFIG_XZ_DEC=y |
128 | CONFIG_AVERAGE=y | 128 | CONFIG_AVERAGE=y |
129 | CONFIG_PINCTRL_CAPRI=y | ||
diff --git a/arch/arm/configs/multi_v7_defconfig b/arch/arm/configs/multi_v7_defconfig index 4a5903e04827..c1df4e9db140 100644 --- a/arch/arm/configs/multi_v7_defconfig +++ b/arch/arm/configs/multi_v7_defconfig | |||
@@ -69,6 +69,7 @@ CONFIG_KS8851=y | |||
69 | CONFIG_SMSC911X=y | 69 | CONFIG_SMSC911X=y |
70 | CONFIG_STMMAC_ETH=y | 70 | CONFIG_STMMAC_ETH=y |
71 | CONFIG_MDIO_SUN4I=y | 71 | CONFIG_MDIO_SUN4I=y |
72 | CONFIG_TI_CPSW=y | ||
72 | CONFIG_KEYBOARD_SPEAR=y | 73 | CONFIG_KEYBOARD_SPEAR=y |
73 | CONFIG_SERIO_AMBAKMI=y | 74 | CONFIG_SERIO_AMBAKMI=y |
74 | CONFIG_SERIAL_8250=y | 75 | CONFIG_SERIAL_8250=y |
@@ -133,12 +134,14 @@ CONFIG_USB_GPIO_VBUS=y | |||
133 | CONFIG_USB_ISP1301=y | 134 | CONFIG_USB_ISP1301=y |
134 | CONFIG_USB_MXS_PHY=y | 135 | CONFIG_USB_MXS_PHY=y |
135 | CONFIG_MMC=y | 136 | CONFIG_MMC=y |
137 | CONFIG_MMC_BLOCK_MINORS=16 | ||
136 | CONFIG_MMC_ARMMMCI=y | 138 | CONFIG_MMC_ARMMMCI=y |
137 | CONFIG_MMC_SDHCI=y | 139 | CONFIG_MMC_SDHCI=y |
138 | CONFIG_MMC_SDHCI_PLTFM=y | 140 | CONFIG_MMC_SDHCI_PLTFM=y |
139 | CONFIG_MMC_SDHCI_ESDHC_IMX=y | 141 | CONFIG_MMC_SDHCI_ESDHC_IMX=y |
140 | CONFIG_MMC_SDHCI_TEGRA=y | 142 | CONFIG_MMC_SDHCI_TEGRA=y |
141 | CONFIG_MMC_SDHCI_SPEAR=y | 143 | CONFIG_MMC_SDHCI_SPEAR=y |
144 | CONFIG_MMC_SDHCI_BCM_KONA=y | ||
142 | CONFIG_MMC_OMAP=y | 145 | CONFIG_MMC_OMAP=y |
143 | CONFIG_MMC_OMAP_HS=y | 146 | CONFIG_MMC_OMAP_HS=y |
144 | CONFIG_EDAC=y | 147 | CONFIG_EDAC=y |
diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig index 98a50c309b90..bfa80a11e8c7 100644 --- a/arch/arm/configs/omap2plus_defconfig +++ b/arch/arm/configs/omap2plus_defconfig | |||
@@ -173,6 +173,7 @@ CONFIG_MFD_PALMAS=y | |||
173 | CONFIG_MFD_TPS65217=y | 173 | CONFIG_MFD_TPS65217=y |
174 | CONFIG_MFD_TPS65910=y | 174 | CONFIG_MFD_TPS65910=y |
175 | CONFIG_TWL6040_CORE=y | 175 | CONFIG_TWL6040_CORE=y |
176 | CONFIG_REGULATOR_FIXED_VOLTAGE=y | ||
176 | CONFIG_REGULATOR_PALMAS=y | 177 | CONFIG_REGULATOR_PALMAS=y |
177 | CONFIG_REGULATOR_TPS65023=y | 178 | CONFIG_REGULATOR_TPS65023=y |
178 | CONFIG_REGULATOR_TPS6507X=y | 179 | CONFIG_REGULATOR_TPS6507X=y |
diff --git a/arch/arm/configs/sunxi_defconfig b/arch/arm/configs/sunxi_defconfig index d57a85badb5e..3e2259b60236 100644 --- a/arch/arm/configs/sunxi_defconfig +++ b/arch/arm/configs/sunxi_defconfig | |||
@@ -12,6 +12,9 @@ CONFIG_NET=y | |||
12 | CONFIG_PACKET=y | 12 | CONFIG_PACKET=y |
13 | CONFIG_UNIX=y | 13 | CONFIG_UNIX=y |
14 | CONFIG_INET=y | 14 | CONFIG_INET=y |
15 | CONFIG_IP_PNP=y | ||
16 | CONFIG_IP_PNP_DHCP=y | ||
17 | CONFIG_IP_PNP_BOOTP=y | ||
15 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | 18 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set |
16 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | 19 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set |
17 | # CONFIG_INET_XFRM_MODE_BEET is not set | 20 | # CONFIG_INET_XFRM_MODE_BEET is not set |
@@ -58,4 +61,8 @@ CONFIG_LEDS_TRIGGER_HEARTBEAT=y | |||
58 | CONFIG_LEDS_TRIGGER_DEFAULT_ON=y | 61 | CONFIG_LEDS_TRIGGER_DEFAULT_ON=y |
59 | CONFIG_COMMON_CLK_DEBUG=y | 62 | CONFIG_COMMON_CLK_DEBUG=y |
60 | # CONFIG_IOMMU_SUPPORT is not set | 63 | # CONFIG_IOMMU_SUPPORT is not set |
64 | CONFIG_TMPFS=y | ||
65 | CONFIG_NFS_FS=y | ||
66 | CONFIG_ROOT_NFS=y | ||
61 | CONFIG_NLS=y | 67 | CONFIG_NLS=y |
68 | CONFIG_PRINTK_TIME=y | ||
diff --git a/arch/arm/configs/u8500_defconfig b/arch/arm/configs/u8500_defconfig index ac632cc38f24..c6ebc184bf68 100644 --- a/arch/arm/configs/u8500_defconfig +++ b/arch/arm/configs/u8500_defconfig | |||
@@ -22,6 +22,7 @@ CONFIG_CMDLINE="root=/dev/ram0 console=ttyAMA2,115200n8" | |||
22 | CONFIG_CPU_FREQ=y | 22 | CONFIG_CPU_FREQ=y |
23 | CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y | 23 | CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y |
24 | CONFIG_CPU_IDLE=y | 24 | CONFIG_CPU_IDLE=y |
25 | CONFIG_ARM_U8500_CPUIDLE=y | ||
25 | CONFIG_VFP=y | 26 | CONFIG_VFP=y |
26 | CONFIG_NEON=y | 27 | CONFIG_NEON=y |
27 | CONFIG_PM_RUNTIME=y | 28 | CONFIG_PM_RUNTIME=y |
@@ -109,6 +110,8 @@ CONFIG_EXT2_FS_SECURITY=y | |||
109 | CONFIG_EXT3_FS=y | 110 | CONFIG_EXT3_FS=y |
110 | CONFIG_EXT4_FS=y | 111 | CONFIG_EXT4_FS=y |
111 | CONFIG_VFAT_FS=y | 112 | CONFIG_VFAT_FS=y |
113 | CONFIG_DEVTMPFS=y | ||
114 | CONFIG_DEVTMPFS_MOUNT=y | ||
112 | CONFIG_TMPFS=y | 115 | CONFIG_TMPFS=y |
113 | CONFIG_TMPFS_POSIX_ACL=y | 116 | CONFIG_TMPFS_POSIX_ACL=y |
114 | # CONFIG_MISC_FILESYSTEMS is not set | 117 | # CONFIG_MISC_FILESYSTEMS is not set |
diff --git a/arch/arm/crypto/aesbs-core.S_shipped b/arch/arm/crypto/aesbs-core.S_shipped index 64205d453260..71e5fc7cfb18 100644 --- a/arch/arm/crypto/aesbs-core.S_shipped +++ b/arch/arm/crypto/aesbs-core.S_shipped | |||
@@ -58,7 +58,7 @@ | |||
58 | # define VFP_ABI_FRAME 0 | 58 | # define VFP_ABI_FRAME 0 |
59 | # define BSAES_ASM_EXTENDED_KEY | 59 | # define BSAES_ASM_EXTENDED_KEY |
60 | # define XTS_CHAIN_TWEAK | 60 | # define XTS_CHAIN_TWEAK |
61 | # define __ARM_ARCH__ __LINUX_ARM_ARCH__ | 61 | # define __ARM_ARCH__ 7 |
62 | #endif | 62 | #endif |
63 | 63 | ||
64 | #ifdef __thumb__ | 64 | #ifdef __thumb__ |
diff --git a/arch/arm/crypto/bsaes-armv7.pl b/arch/arm/crypto/bsaes-armv7.pl index f3d96d932573..be068db960ee 100644 --- a/arch/arm/crypto/bsaes-armv7.pl +++ b/arch/arm/crypto/bsaes-armv7.pl | |||
@@ -701,7 +701,7 @@ $code.=<<___; | |||
701 | # define VFP_ABI_FRAME 0 | 701 | # define VFP_ABI_FRAME 0 |
702 | # define BSAES_ASM_EXTENDED_KEY | 702 | # define BSAES_ASM_EXTENDED_KEY |
703 | # define XTS_CHAIN_TWEAK | 703 | # define XTS_CHAIN_TWEAK |
704 | # define __ARM_ARCH__ __LINUX_ARM_ARCH__ | 704 | # define __ARM_ARCH__ 7 |
705 | #endif | 705 | #endif |
706 | 706 | ||
707 | #ifdef __thumb__ | 707 | #ifdef __thumb__ |
diff --git a/arch/arm/include/asm/barrier.h b/arch/arm/include/asm/barrier.h index 60f15e274e6d..2f59f7443396 100644 --- a/arch/arm/include/asm/barrier.h +++ b/arch/arm/include/asm/barrier.h | |||
@@ -59,6 +59,21 @@ | |||
59 | #define smp_wmb() dmb(ishst) | 59 | #define smp_wmb() dmb(ishst) |
60 | #endif | 60 | #endif |
61 | 61 | ||
62 | #define smp_store_release(p, v) \ | ||
63 | do { \ | ||
64 | compiletime_assert_atomic_type(*p); \ | ||
65 | smp_mb(); \ | ||
66 | ACCESS_ONCE(*p) = (v); \ | ||
67 | } while (0) | ||
68 | |||
69 | #define smp_load_acquire(p) \ | ||
70 | ({ \ | ||
71 | typeof(*p) ___p1 = ACCESS_ONCE(*p); \ | ||
72 | compiletime_assert_atomic_type(*p); \ | ||
73 | smp_mb(); \ | ||
74 | ___p1; \ | ||
75 | }) | ||
76 | |||
62 | #define read_barrier_depends() do { } while(0) | 77 | #define read_barrier_depends() do { } while(0) |
63 | #define smp_read_barrier_depends() do { } while(0) | 78 | #define smp_read_barrier_depends() do { } while(0) |
64 | 79 | ||
diff --git a/arch/arm/include/asm/dma.h b/arch/arm/include/asm/dma.h index 58b8c6a0ab1f..99084431d6ae 100644 --- a/arch/arm/include/asm/dma.h +++ b/arch/arm/include/asm/dma.h | |||
@@ -8,8 +8,8 @@ | |||
8 | #define MAX_DMA_ADDRESS 0xffffffffUL | 8 | #define MAX_DMA_ADDRESS 0xffffffffUL |
9 | #else | 9 | #else |
10 | #define MAX_DMA_ADDRESS ({ \ | 10 | #define MAX_DMA_ADDRESS ({ \ |
11 | extern unsigned long arm_dma_zone_size; \ | 11 | extern phys_addr_t arm_dma_zone_size; \ |
12 | arm_dma_zone_size ? \ | 12 | arm_dma_zone_size && arm_dma_zone_size < (0x10000000 - PAGE_OFFSET) ? \ |
13 | (PAGE_OFFSET + arm_dma_zone_size) : 0xffffffffUL; }) | 13 | (PAGE_OFFSET + arm_dma_zone_size) : 0xffffffffUL; }) |
14 | #endif | 14 | #endif |
15 | 15 | ||
diff --git a/arch/arm/include/asm/io.h b/arch/arm/include/asm/io.h index 3c597c222ef2..fbeb39c869e9 100644 --- a/arch/arm/include/asm/io.h +++ b/arch/arm/include/asm/io.h | |||
@@ -329,7 +329,7 @@ extern void _memset_io(volatile void __iomem *, int, size_t); | |||
329 | */ | 329 | */ |
330 | #define ioremap(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE) | 330 | #define ioremap(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE) |
331 | #define ioremap_nocache(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE) | 331 | #define ioremap_nocache(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE) |
332 | #define ioremap_cached(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE_CACHED) | 332 | #define ioremap_cache(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE_CACHED) |
333 | #define ioremap_wc(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE_WC) | 333 | #define ioremap_wc(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE_WC) |
334 | #define iounmap __arm_iounmap | 334 | #define iounmap __arm_iounmap |
335 | 335 | ||
diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h index 9ecccc865046..8756e4bcdba0 100644 --- a/arch/arm/include/asm/memory.h +++ b/arch/arm/include/asm/memory.h | |||
@@ -100,23 +100,19 @@ | |||
100 | #define TASK_UNMAPPED_BASE UL(0x00000000) | 100 | #define TASK_UNMAPPED_BASE UL(0x00000000) |
101 | #endif | 101 | #endif |
102 | 102 | ||
103 | #ifndef PHYS_OFFSET | ||
104 | #define PHYS_OFFSET UL(CONFIG_DRAM_BASE) | ||
105 | #endif | ||
106 | |||
107 | #ifndef END_MEM | 103 | #ifndef END_MEM |
108 | #define END_MEM (UL(CONFIG_DRAM_BASE) + CONFIG_DRAM_SIZE) | 104 | #define END_MEM (UL(CONFIG_DRAM_BASE) + CONFIG_DRAM_SIZE) |
109 | #endif | 105 | #endif |
110 | 106 | ||
111 | #ifndef PAGE_OFFSET | 107 | #ifndef PAGE_OFFSET |
112 | #define PAGE_OFFSET (PHYS_OFFSET) | 108 | #define PAGE_OFFSET PLAT_PHYS_OFFSET |
113 | #endif | 109 | #endif |
114 | 110 | ||
115 | /* | 111 | /* |
116 | * The module can be at any place in ram in nommu mode. | 112 | * The module can be at any place in ram in nommu mode. |
117 | */ | 113 | */ |
118 | #define MODULES_END (END_MEM) | 114 | #define MODULES_END (END_MEM) |
119 | #define MODULES_VADDR (PHYS_OFFSET) | 115 | #define MODULES_VADDR PAGE_OFFSET |
120 | 116 | ||
121 | #define XIP_VIRT_ADDR(physaddr) (physaddr) | 117 | #define XIP_VIRT_ADDR(physaddr) (physaddr) |
122 | 118 | ||
@@ -157,6 +153,16 @@ | |||
157 | #endif | 153 | #endif |
158 | #define ARCH_PGD_MASK ((1 << ARCH_PGD_SHIFT) - 1) | 154 | #define ARCH_PGD_MASK ((1 << ARCH_PGD_SHIFT) - 1) |
159 | 155 | ||
156 | /* | ||
157 | * PLAT_PHYS_OFFSET is the offset (from zero) of the start of physical | ||
158 | * memory. This is used for XIP and NoMMU kernels, or by kernels which | ||
159 | * have their own mach/memory.h. Assembly code must always use | ||
160 | * PLAT_PHYS_OFFSET and not PHYS_OFFSET. | ||
161 | */ | ||
162 | #ifndef PLAT_PHYS_OFFSET | ||
163 | #define PLAT_PHYS_OFFSET UL(CONFIG_PHYS_OFFSET) | ||
164 | #endif | ||
165 | |||
160 | #ifndef __ASSEMBLY__ | 166 | #ifndef __ASSEMBLY__ |
161 | 167 | ||
162 | /* | 168 | /* |
@@ -239,6 +245,8 @@ static inline unsigned long __phys_to_virt(phys_addr_t x) | |||
239 | 245 | ||
240 | #else | 246 | #else |
241 | 247 | ||
248 | #define PHYS_OFFSET PLAT_PHYS_OFFSET | ||
249 | |||
242 | static inline phys_addr_t __virt_to_phys(unsigned long x) | 250 | static inline phys_addr_t __virt_to_phys(unsigned long x) |
243 | { | 251 | { |
244 | return (phys_addr_t)x - PAGE_OFFSET + PHYS_OFFSET; | 252 | return (phys_addr_t)x - PAGE_OFFSET + PHYS_OFFSET; |
@@ -251,17 +259,6 @@ static inline unsigned long __phys_to_virt(phys_addr_t x) | |||
251 | 259 | ||
252 | #endif | 260 | #endif |
253 | #endif | 261 | #endif |
254 | #endif /* __ASSEMBLY__ */ | ||
255 | |||
256 | #ifndef PHYS_OFFSET | ||
257 | #ifdef PLAT_PHYS_OFFSET | ||
258 | #define PHYS_OFFSET PLAT_PHYS_OFFSET | ||
259 | #else | ||
260 | #define PHYS_OFFSET UL(CONFIG_PHYS_OFFSET) | ||
261 | #endif | ||
262 | #endif | ||
263 | |||
264 | #ifndef __ASSEMBLY__ | ||
265 | 262 | ||
266 | /* | 263 | /* |
267 | * PFNs are used to describe any physical page; this means | 264 | * PFNs are used to describe any physical page; this means |
@@ -350,7 +347,8 @@ static inline __deprecated void *bus_to_virt(unsigned long x) | |||
350 | #define ARCH_PFN_OFFSET PHYS_PFN_OFFSET | 347 | #define ARCH_PFN_OFFSET PHYS_PFN_OFFSET |
351 | 348 | ||
352 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) | 349 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) |
353 | #define virt_addr_valid(kaddr) ((unsigned long)(kaddr) >= PAGE_OFFSET && (unsigned long)(kaddr) < (unsigned long)high_memory) | 350 | #define virt_addr_valid(kaddr) (((unsigned long)(kaddr) >= PAGE_OFFSET && (unsigned long)(kaddr) < (unsigned long)high_memory) \ |
351 | && pfn_valid(__pa(kaddr) >> PAGE_SHIFT) ) | ||
354 | 352 | ||
355 | #endif | 353 | #endif |
356 | 354 | ||
diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h index be956dbf6bae..1571d126e9dd 100644 --- a/arch/arm/include/asm/pgtable.h +++ b/arch/arm/include/asm/pgtable.h | |||
@@ -61,7 +61,7 @@ extern void __pgd_error(const char *file, int line, pgd_t); | |||
61 | * mapping to be mapped at. This is particularly important for | 61 | * mapping to be mapped at. This is particularly important for |
62 | * non-high vector CPUs. | 62 | * non-high vector CPUs. |
63 | */ | 63 | */ |
64 | #define FIRST_USER_ADDRESS PAGE_SIZE | 64 | #define FIRST_USER_ADDRESS (PAGE_SIZE * 2) |
65 | 65 | ||
66 | /* | 66 | /* |
67 | * Use TASK_SIZE as the ceiling argument for free_pgtables() and | 67 | * Use TASK_SIZE as the ceiling argument for free_pgtables() and |
diff --git a/arch/arm/include/asm/unistd.h b/arch/arm/include/asm/unistd.h index 141baa3f9a72..acabef1a75df 100644 --- a/arch/arm/include/asm/unistd.h +++ b/arch/arm/include/asm/unistd.h | |||
@@ -15,7 +15,7 @@ | |||
15 | 15 | ||
16 | #include <uapi/asm/unistd.h> | 16 | #include <uapi/asm/unistd.h> |
17 | 17 | ||
18 | #define __NR_syscalls (380) | 18 | #define __NR_syscalls (384) |
19 | #define __ARM_NR_cmpxchg (__ARM_NR_BASE+0x00fff0) | 19 | #define __ARM_NR_cmpxchg (__ARM_NR_BASE+0x00fff0) |
20 | 20 | ||
21 | #define __ARCH_WANT_STAT64 | 21 | #define __ARCH_WANT_STAT64 |
diff --git a/arch/arm/include/asm/xen/page.h b/arch/arm/include/asm/xen/page.h index 75579a9d6f76..3759cacdd7f8 100644 --- a/arch/arm/include/asm/xen/page.h +++ b/arch/arm/include/asm/xen/page.h | |||
@@ -117,6 +117,6 @@ static inline bool set_phys_to_machine(unsigned long pfn, unsigned long mfn) | |||
117 | return __set_phys_to_machine(pfn, mfn); | 117 | return __set_phys_to_machine(pfn, mfn); |
118 | } | 118 | } |
119 | 119 | ||
120 | #define xen_remap(cookie, size) ioremap_cached((cookie), (size)); | 120 | #define xen_remap(cookie, size) ioremap_cache((cookie), (size)); |
121 | 121 | ||
122 | #endif /* _ASM_ARM_XEN_PAGE_H */ | 122 | #endif /* _ASM_ARM_XEN_PAGE_H */ |
diff --git a/arch/arm/include/uapi/asm/unistd.h b/arch/arm/include/uapi/asm/unistd.h index af33b44990ed..fb5584d0cc05 100644 --- a/arch/arm/include/uapi/asm/unistd.h +++ b/arch/arm/include/uapi/asm/unistd.h | |||
@@ -406,6 +406,8 @@ | |||
406 | #define __NR_process_vm_writev (__NR_SYSCALL_BASE+377) | 406 | #define __NR_process_vm_writev (__NR_SYSCALL_BASE+377) |
407 | #define __NR_kcmp (__NR_SYSCALL_BASE+378) | 407 | #define __NR_kcmp (__NR_SYSCALL_BASE+378) |
408 | #define __NR_finit_module (__NR_SYSCALL_BASE+379) | 408 | #define __NR_finit_module (__NR_SYSCALL_BASE+379) |
409 | #define __NR_sched_setattr (__NR_SYSCALL_BASE+380) | ||
410 | #define __NR_sched_getattr (__NR_SYSCALL_BASE+381) | ||
409 | 411 | ||
410 | /* | 412 | /* |
411 | * This may need to be greater than __NR_last_syscall+1 in order to | 413 | * This may need to be greater than __NR_last_syscall+1 in order to |
diff --git a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S index c6ca7e376773..166e945de832 100644 --- a/arch/arm/kernel/calls.S +++ b/arch/arm/kernel/calls.S | |||
@@ -389,6 +389,8 @@ | |||
389 | CALL(sys_process_vm_writev) | 389 | CALL(sys_process_vm_writev) |
390 | CALL(sys_kcmp) | 390 | CALL(sys_kcmp) |
391 | CALL(sys_finit_module) | 391 | CALL(sys_finit_module) |
392 | /* 380 */ CALL(sys_sched_setattr) | ||
393 | CALL(sys_sched_getattr) | ||
392 | #ifndef syscalls_counted | 394 | #ifndef syscalls_counted |
393 | .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls | 395 | .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls |
394 | #define syscalls_counted | 396 | #define syscalls_counted |
diff --git a/arch/arm/kernel/devtree.c b/arch/arm/kernel/devtree.c index 739c3dfc1da2..f751714d52c1 100644 --- a/arch/arm/kernel/devtree.c +++ b/arch/arm/kernel/devtree.c | |||
@@ -33,7 +33,7 @@ void __init early_init_dt_add_memory_arch(u64 base, u64 size) | |||
33 | 33 | ||
34 | void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align) | 34 | void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align) |
35 | { | 35 | { |
36 | return alloc_bootmem_align(size, align); | 36 | return memblock_virt_alloc(size, align); |
37 | } | 37 | } |
38 | 38 | ||
39 | void __init arm_dt_memblock_reserve(void) | 39 | void __init arm_dt_memblock_reserve(void) |
@@ -171,7 +171,7 @@ void __init arm_dt_init_cpu_maps(void) | |||
171 | 171 | ||
172 | bool arch_match_cpu_phys_id(int cpu, u64 phys_id) | 172 | bool arch_match_cpu_phys_id(int cpu, u64 phys_id) |
173 | { | 173 | { |
174 | return (phys_id & MPIDR_HWID_BITMASK) == cpu_logical_map(cpu); | 174 | return phys_id == cpu_logical_map(cpu); |
175 | } | 175 | } |
176 | 176 | ||
177 | static const void * __init arch_get_next_mach(const char *const **match) | 177 | static const void * __init arch_get_next_mach(const char *const **match) |
diff --git a/arch/arm/kernel/head-nommu.S b/arch/arm/kernel/head-nommu.S index 14235ba64a90..716249cc2ee1 100644 --- a/arch/arm/kernel/head-nommu.S +++ b/arch/arm/kernel/head-nommu.S | |||
@@ -68,7 +68,7 @@ ENTRY(stext) | |||
68 | 68 | ||
69 | #ifdef CONFIG_ARM_MPU | 69 | #ifdef CONFIG_ARM_MPU |
70 | /* Calculate the size of a region covering just the kernel */ | 70 | /* Calculate the size of a region covering just the kernel */ |
71 | ldr r5, =PHYS_OFFSET @ Region start: PHYS_OFFSET | 71 | ldr r5, =PLAT_PHYS_OFFSET @ Region start: PHYS_OFFSET |
72 | ldr r6, =(_end) @ Cover whole kernel | 72 | ldr r6, =(_end) @ Cover whole kernel |
73 | sub r6, r6, r5 @ Minimum size of region to map | 73 | sub r6, r6, r5 @ Minimum size of region to map |
74 | clz r6, r6 @ Region size must be 2^N... | 74 | clz r6, r6 @ Region size must be 2^N... |
@@ -213,7 +213,7 @@ ENTRY(__setup_mpu) | |||
213 | set_region_nr r0, #MPU_RAM_REGION | 213 | set_region_nr r0, #MPU_RAM_REGION |
214 | isb | 214 | isb |
215 | /* Full access from PL0, PL1, shared for CONFIG_SMP, cacheable */ | 215 | /* Full access from PL0, PL1, shared for CONFIG_SMP, cacheable */ |
216 | ldr r0, =PHYS_OFFSET @ RAM starts at PHYS_OFFSET | 216 | ldr r0, =PLAT_PHYS_OFFSET @ RAM starts at PHYS_OFFSET |
217 | ldr r5,=(MPU_AP_PL1RW_PL0RW | MPU_RGN_NORMAL) | 217 | ldr r5,=(MPU_AP_PL1RW_PL0RW | MPU_RGN_NORMAL) |
218 | 218 | ||
219 | setup_region r0, r5, r6, MPU_DATA_SIDE @ PHYS_OFFSET, shared, enabled | 219 | setup_region r0, r5, r6, MPU_DATA_SIDE @ PHYS_OFFSET, shared, enabled |
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index 11d59b32fb8d..32f317e5828a 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S | |||
@@ -110,7 +110,7 @@ ENTRY(stext) | |||
110 | sub r4, r3, r4 @ (PHYS_OFFSET - PAGE_OFFSET) | 110 | sub r4, r3, r4 @ (PHYS_OFFSET - PAGE_OFFSET) |
111 | add r8, r8, r4 @ PHYS_OFFSET | 111 | add r8, r8, r4 @ PHYS_OFFSET |
112 | #else | 112 | #else |
113 | ldr r8, =PHYS_OFFSET @ always constant in this case | 113 | ldr r8, =PLAT_PHYS_OFFSET @ always constant in this case |
114 | #endif | 114 | #endif |
115 | 115 | ||
116 | /* | 116 | /* |
diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c index 57221e349a7c..f0d180d8b29f 100644 --- a/arch/arm/kernel/machine_kexec.c +++ b/arch/arm/kernel/machine_kexec.c | |||
@@ -14,11 +14,12 @@ | |||
14 | #include <asm/pgalloc.h> | 14 | #include <asm/pgalloc.h> |
15 | #include <asm/mmu_context.h> | 15 | #include <asm/mmu_context.h> |
16 | #include <asm/cacheflush.h> | 16 | #include <asm/cacheflush.h> |
17 | #include <asm/fncpy.h> | ||
17 | #include <asm/mach-types.h> | 18 | #include <asm/mach-types.h> |
18 | #include <asm/smp_plat.h> | 19 | #include <asm/smp_plat.h> |
19 | #include <asm/system_misc.h> | 20 | #include <asm/system_misc.h> |
20 | 21 | ||
21 | extern const unsigned char relocate_new_kernel[]; | 22 | extern void relocate_new_kernel(void); |
22 | extern const unsigned int relocate_new_kernel_size; | 23 | extern const unsigned int relocate_new_kernel_size; |
23 | 24 | ||
24 | extern unsigned long kexec_start_address; | 25 | extern unsigned long kexec_start_address; |
@@ -142,6 +143,8 @@ void machine_kexec(struct kimage *image) | |||
142 | { | 143 | { |
143 | unsigned long page_list; | 144 | unsigned long page_list; |
144 | unsigned long reboot_code_buffer_phys; | 145 | unsigned long reboot_code_buffer_phys; |
146 | unsigned long reboot_entry = (unsigned long)relocate_new_kernel; | ||
147 | unsigned long reboot_entry_phys; | ||
145 | void *reboot_code_buffer; | 148 | void *reboot_code_buffer; |
146 | 149 | ||
147 | /* | 150 | /* |
@@ -168,16 +171,16 @@ void machine_kexec(struct kimage *image) | |||
168 | 171 | ||
169 | 172 | ||
170 | /* copy our kernel relocation code to the control code page */ | 173 | /* copy our kernel relocation code to the control code page */ |
171 | memcpy(reboot_code_buffer, | 174 | reboot_entry = fncpy(reboot_code_buffer, |
172 | relocate_new_kernel, relocate_new_kernel_size); | 175 | reboot_entry, |
176 | relocate_new_kernel_size); | ||
177 | reboot_entry_phys = (unsigned long)reboot_entry + | ||
178 | (reboot_code_buffer_phys - (unsigned long)reboot_code_buffer); | ||
173 | 179 | ||
174 | |||
175 | flush_icache_range((unsigned long) reboot_code_buffer, | ||
176 | (unsigned long) reboot_code_buffer + KEXEC_CONTROL_PAGE_SIZE); | ||
177 | printk(KERN_INFO "Bye!\n"); | 180 | printk(KERN_INFO "Bye!\n"); |
178 | 181 | ||
179 | if (kexec_reinit) | 182 | if (kexec_reinit) |
180 | kexec_reinit(); | 183 | kexec_reinit(); |
181 | 184 | ||
182 | soft_restart(reboot_code_buffer_phys); | 185 | soft_restart(reboot_entry_phys); |
183 | } | 186 | } |
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index bc3f2efa0d86..789d846a9184 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c | |||
@@ -99,10 +99,6 @@ int armpmu_event_set_period(struct perf_event *event) | |||
99 | s64 period = hwc->sample_period; | 99 | s64 period = hwc->sample_period; |
100 | int ret = 0; | 100 | int ret = 0; |
101 | 101 | ||
102 | /* The period may have been changed by PERF_EVENT_IOC_PERIOD */ | ||
103 | if (unlikely(period != hwc->last_period)) | ||
104 | left = period - (hwc->last_period - left); | ||
105 | |||
106 | if (unlikely(left <= -period)) { | 102 | if (unlikely(left <= -period)) { |
107 | left = period; | 103 | left = period; |
108 | local64_set(&hwc->period_left, left); | 104 | local64_set(&hwc->period_left, left); |
diff --git a/arch/arm/kernel/perf_event_cpu.c b/arch/arm/kernel/perf_event_cpu.c index d85055cd24ba..20d553c9f5e2 100644 --- a/arch/arm/kernel/perf_event_cpu.c +++ b/arch/arm/kernel/perf_event_cpu.c | |||
@@ -254,7 +254,7 @@ static int probe_current_pmu(struct arm_pmu *pmu) | |||
254 | static int cpu_pmu_device_probe(struct platform_device *pdev) | 254 | static int cpu_pmu_device_probe(struct platform_device *pdev) |
255 | { | 255 | { |
256 | const struct of_device_id *of_id; | 256 | const struct of_device_id *of_id; |
257 | int (*init_fn)(struct arm_pmu *); | 257 | const int (*init_fn)(struct arm_pmu *); |
258 | struct device_node *node = pdev->dev.of_node; | 258 | struct device_node *node = pdev->dev.of_node; |
259 | struct arm_pmu *pmu; | 259 | struct arm_pmu *pmu; |
260 | int ret = -ENODEV; | 260 | int ret = -ENODEV; |
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 94f6b05f9e24..92f7b15dd221 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c | |||
@@ -404,6 +404,7 @@ EXPORT_SYMBOL(dump_fpu); | |||
404 | unsigned long get_wchan(struct task_struct *p) | 404 | unsigned long get_wchan(struct task_struct *p) |
405 | { | 405 | { |
406 | struct stackframe frame; | 406 | struct stackframe frame; |
407 | unsigned long stack_page; | ||
407 | int count = 0; | 408 | int count = 0; |
408 | if (!p || p == current || p->state == TASK_RUNNING) | 409 | if (!p || p == current || p->state == TASK_RUNNING) |
409 | return 0; | 410 | return 0; |
@@ -412,9 +413,11 @@ unsigned long get_wchan(struct task_struct *p) | |||
412 | frame.sp = thread_saved_sp(p); | 413 | frame.sp = thread_saved_sp(p); |
413 | frame.lr = 0; /* recovered from the stack */ | 414 | frame.lr = 0; /* recovered from the stack */ |
414 | frame.pc = thread_saved_pc(p); | 415 | frame.pc = thread_saved_pc(p); |
416 | stack_page = (unsigned long)task_stack_page(p); | ||
415 | do { | 417 | do { |
416 | int ret = unwind_frame(&frame); | 418 | if (frame.sp < stack_page || |
417 | if (ret < 0) | 419 | frame.sp >= stack_page + THREAD_SIZE || |
420 | unwind_frame(&frame) < 0) | ||
418 | return 0; | 421 | return 0; |
419 | if (!in_sched_functions(frame.pc)) | 422 | if (!in_sched_functions(frame.pc)) |
420 | return frame.pc; | 423 | return frame.pc; |
diff --git a/arch/arm/kernel/relocate_kernel.S b/arch/arm/kernel/relocate_kernel.S index d0cdedf4864d..95858966d84e 100644 --- a/arch/arm/kernel/relocate_kernel.S +++ b/arch/arm/kernel/relocate_kernel.S | |||
@@ -2,10 +2,12 @@ | |||
2 | * relocate_kernel.S - put the kernel image in place to boot | 2 | * relocate_kernel.S - put the kernel image in place to boot |
3 | */ | 3 | */ |
4 | 4 | ||
5 | #include <linux/linkage.h> | ||
5 | #include <asm/kexec.h> | 6 | #include <asm/kexec.h> |
6 | 7 | ||
7 | .globl relocate_new_kernel | 8 | .align 3 /* not needed for this code, but keeps fncpy() happy */ |
8 | relocate_new_kernel: | 9 | |
10 | ENTRY(relocate_new_kernel) | ||
9 | 11 | ||
10 | ldr r0,kexec_indirection_page | 12 | ldr r0,kexec_indirection_page |
11 | ldr r1,kexec_start_address | 13 | ldr r1,kexec_start_address |
@@ -79,6 +81,8 @@ kexec_mach_type: | |||
79 | kexec_boot_atags: | 81 | kexec_boot_atags: |
80 | .long 0x0 | 82 | .long 0x0 |
81 | 83 | ||
84 | ENDPROC(relocate_new_kernel) | ||
85 | |||
82 | relocate_new_kernel_end: | 86 | relocate_new_kernel_end: |
83 | 87 | ||
84 | .globl relocate_new_kernel_size | 88 | .globl relocate_new_kernel_size |
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 6a1b8a81b1ae..8ce1cbd08dba 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
@@ -717,7 +717,7 @@ static void __init request_standard_resources(const struct machine_desc *mdesc) | |||
717 | kernel_data.end = virt_to_phys(_end - 1); | 717 | kernel_data.end = virt_to_phys(_end - 1); |
718 | 718 | ||
719 | for_each_memblock(memory, region) { | 719 | for_each_memblock(memory, region) { |
720 | res = alloc_bootmem_low(sizeof(*res)); | 720 | res = memblock_virt_alloc(sizeof(*res), 0); |
721 | res->name = "System RAM"; | 721 | res->name = "System RAM"; |
722 | res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region)); | 722 | res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region)); |
723 | res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1; | 723 | res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1; |
@@ -873,8 +873,6 @@ void __init setup_arch(char **cmdline_p) | |||
873 | machine_desc = mdesc; | 873 | machine_desc = mdesc; |
874 | machine_name = mdesc->name; | 874 | machine_name = mdesc->name; |
875 | 875 | ||
876 | setup_dma_zone(mdesc); | ||
877 | |||
878 | if (mdesc->reboot_mode != REBOOT_HARD) | 876 | if (mdesc->reboot_mode != REBOOT_HARD) |
879 | reboot_mode = mdesc->reboot_mode; | 877 | reboot_mode = mdesc->reboot_mode; |
880 | 878 | ||
@@ -892,6 +890,7 @@ void __init setup_arch(char **cmdline_p) | |||
892 | sort(&meminfo.bank, meminfo.nr_banks, sizeof(meminfo.bank[0]), meminfo_cmp, NULL); | 890 | sort(&meminfo.bank, meminfo.nr_banks, sizeof(meminfo.bank[0]), meminfo_cmp, NULL); |
893 | 891 | ||
894 | early_paging_init(mdesc, lookup_processor_type(read_cpuid_id())); | 892 | early_paging_init(mdesc, lookup_processor_type(read_cpuid_id())); |
893 | setup_dma_zone(mdesc); | ||
895 | sanity_check_meminfo(); | 894 | sanity_check_meminfo(); |
896 | arm_memblock_init(&meminfo, mdesc); | 895 | arm_memblock_init(&meminfo, mdesc); |
897 | 896 | ||
diff --git a/arch/arm/kernel/sigreturn_codes.S b/arch/arm/kernel/sigreturn_codes.S index 3c5d0f2170fd..b84d0cb13682 100644 --- a/arch/arm/kernel/sigreturn_codes.S +++ b/arch/arm/kernel/sigreturn_codes.S | |||
@@ -30,6 +30,27 @@ | |||
30 | * snippets. | 30 | * snippets. |
31 | */ | 31 | */ |
32 | 32 | ||
33 | /* | ||
34 | * In CPU_THUMBONLY case kernel arm opcodes are not allowed. | ||
35 | * Note in this case codes skips those instructions but it uses .org | ||
36 | * directive to keep correct layout of sigreturn_codes array. | ||
37 | */ | ||
38 | #ifndef CONFIG_CPU_THUMBONLY | ||
39 | #define ARM_OK(code...) code | ||
40 | #else | ||
41 | #define ARM_OK(code...) | ||
42 | #endif | ||
43 | |||
44 | .macro arm_slot n | ||
45 | .org sigreturn_codes + 12 * (\n) | ||
46 | ARM_OK( .arm ) | ||
47 | .endm | ||
48 | |||
49 | .macro thumb_slot n | ||
50 | .org sigreturn_codes + 12 * (\n) + 8 | ||
51 | .thumb | ||
52 | .endm | ||
53 | |||
33 | #if __LINUX_ARM_ARCH__ <= 4 | 54 | #if __LINUX_ARM_ARCH__ <= 4 |
34 | /* | 55 | /* |
35 | * Note we manually set minimally required arch that supports | 56 | * Note we manually set minimally required arch that supports |
@@ -45,26 +66,27 @@ | |||
45 | .global sigreturn_codes | 66 | .global sigreturn_codes |
46 | .type sigreturn_codes, #object | 67 | .type sigreturn_codes, #object |
47 | 68 | ||
48 | .arm | 69 | .align |
49 | 70 | ||
50 | sigreturn_codes: | 71 | sigreturn_codes: |
51 | 72 | ||
52 | /* ARM sigreturn syscall code snippet */ | 73 | /* ARM sigreturn syscall code snippet */ |
53 | mov r7, #(__NR_sigreturn - __NR_SYSCALL_BASE) | 74 | arm_slot 0 |
54 | swi #(__NR_sigreturn)|(__NR_OABI_SYSCALL_BASE) | 75 | ARM_OK( mov r7, #(__NR_sigreturn - __NR_SYSCALL_BASE) ) |
76 | ARM_OK( swi #(__NR_sigreturn)|(__NR_OABI_SYSCALL_BASE) ) | ||
55 | 77 | ||
56 | /* Thumb sigreturn syscall code snippet */ | 78 | /* Thumb sigreturn syscall code snippet */ |
57 | .thumb | 79 | thumb_slot 0 |
58 | movs r7, #(__NR_sigreturn - __NR_SYSCALL_BASE) | 80 | movs r7, #(__NR_sigreturn - __NR_SYSCALL_BASE) |
59 | swi #0 | 81 | swi #0 |
60 | 82 | ||
61 | /* ARM sigreturn_rt syscall code snippet */ | 83 | /* ARM sigreturn_rt syscall code snippet */ |
62 | .arm | 84 | arm_slot 1 |
63 | mov r7, #(__NR_rt_sigreturn - __NR_SYSCALL_BASE) | 85 | ARM_OK( mov r7, #(__NR_rt_sigreturn - __NR_SYSCALL_BASE) ) |
64 | swi #(__NR_rt_sigreturn)|(__NR_OABI_SYSCALL_BASE) | 86 | ARM_OK( swi #(__NR_rt_sigreturn)|(__NR_OABI_SYSCALL_BASE) ) |
65 | 87 | ||
66 | /* Thumb sigreturn_rt syscall code snippet */ | 88 | /* Thumb sigreturn_rt syscall code snippet */ |
67 | .thumb | 89 | thumb_slot 1 |
68 | movs r7, #(__NR_rt_sigreturn - __NR_SYSCALL_BASE) | 90 | movs r7, #(__NR_rt_sigreturn - __NR_SYSCALL_BASE) |
69 | swi #0 | 91 | swi #0 |
70 | 92 | ||
@@ -74,7 +96,7 @@ sigreturn_codes: | |||
74 | * it is thumb case or not, so we need additional | 96 | * it is thumb case or not, so we need additional |
75 | * word after real last entry. | 97 | * word after real last entry. |
76 | */ | 98 | */ |
77 | .arm | 99 | arm_slot 2 |
78 | .space 4 | 100 | .space 4 |
79 | 101 | ||
80 | .size sigreturn_codes, . - sigreturn_codes | 102 | .size sigreturn_codes, . - sigreturn_codes |
diff --git a/arch/arm/kernel/stacktrace.c b/arch/arm/kernel/stacktrace.c index 00f79e59985b..af4e8c8a5422 100644 --- a/arch/arm/kernel/stacktrace.c +++ b/arch/arm/kernel/stacktrace.c | |||
@@ -31,7 +31,7 @@ int notrace unwind_frame(struct stackframe *frame) | |||
31 | high = ALIGN(low, THREAD_SIZE); | 31 | high = ALIGN(low, THREAD_SIZE); |
32 | 32 | ||
33 | /* check current frame pointer is within bounds */ | 33 | /* check current frame pointer is within bounds */ |
34 | if (fp < (low + 12) || fp + 4 >= high) | 34 | if (fp < low + 12 || fp > high - 4) |
35 | return -EINVAL; | 35 | return -EINVAL; |
36 | 36 | ||
37 | /* restore the registers from the stack frame */ | 37 | /* restore the registers from the stack frame */ |
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index dbf0923e8d76..4636d56af2db 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
@@ -36,7 +36,13 @@ | |||
36 | #include <asm/system_misc.h> | 36 | #include <asm/system_misc.h> |
37 | #include <asm/opcodes.h> | 37 | #include <asm/opcodes.h> |
38 | 38 | ||
39 | static const char *handler[]= { "prefetch abort", "data abort", "address exception", "interrupt" }; | 39 | static const char *handler[]= { |
40 | "prefetch abort", | ||
41 | "data abort", | ||
42 | "address exception", | ||
43 | "interrupt", | ||
44 | "undefined instruction", | ||
45 | }; | ||
40 | 46 | ||
41 | void *vectors_page; | 47 | void *vectors_page; |
42 | 48 | ||
@@ -425,9 +431,10 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs) | |||
425 | instr2 = __mem_to_opcode_thumb16(instr2); | 431 | instr2 = __mem_to_opcode_thumb16(instr2); |
426 | instr = __opcode_thumb32_compose(instr, instr2); | 432 | instr = __opcode_thumb32_compose(instr, instr2); |
427 | } | 433 | } |
428 | } else if (get_user(instr, (u32 __user *)pc)) { | 434 | } else { |
435 | if (get_user(instr, (u32 __user *)pc)) | ||
436 | goto die_sig; | ||
429 | instr = __mem_to_opcode_arm(instr); | 437 | instr = __mem_to_opcode_arm(instr); |
430 | goto die_sig; | ||
431 | } | 438 | } |
432 | 439 | ||
433 | if (call_undef_hook(regs, instr) == 0) | 440 | if (call_undef_hook(regs, instr) == 0) |
@@ -509,9 +516,10 @@ static inline int | |||
509 | __do_cache_op(unsigned long start, unsigned long end) | 516 | __do_cache_op(unsigned long start, unsigned long end) |
510 | { | 517 | { |
511 | int ret; | 518 | int ret; |
512 | unsigned long chunk = PAGE_SIZE; | ||
513 | 519 | ||
514 | do { | 520 | do { |
521 | unsigned long chunk = min(PAGE_SIZE, end - start); | ||
522 | |||
515 | if (signal_pending(current)) { | 523 | if (signal_pending(current)) { |
516 | struct thread_info *ti = current_thread_info(); | 524 | struct thread_info *ti = current_thread_info(); |
517 | 525 | ||
diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c index 2a700e00528d..b18165ca1d38 100644 --- a/arch/arm/kvm/arm.c +++ b/arch/arm/kvm/arm.c | |||
@@ -17,6 +17,7 @@ | |||
17 | */ | 17 | */ |
18 | 18 | ||
19 | #include <linux/cpu.h> | 19 | #include <linux/cpu.h> |
20 | #include <linux/cpu_pm.h> | ||
20 | #include <linux/errno.h> | 21 | #include <linux/errno.h> |
21 | #include <linux/err.h> | 22 | #include <linux/err.h> |
22 | #include <linux/kvm_host.h> | 23 | #include <linux/kvm_host.h> |
@@ -853,6 +854,33 @@ static struct notifier_block hyp_init_cpu_nb = { | |||
853 | .notifier_call = hyp_init_cpu_notify, | 854 | .notifier_call = hyp_init_cpu_notify, |
854 | }; | 855 | }; |
855 | 856 | ||
857 | #ifdef CONFIG_CPU_PM | ||
858 | static int hyp_init_cpu_pm_notifier(struct notifier_block *self, | ||
859 | unsigned long cmd, | ||
860 | void *v) | ||
861 | { | ||
862 | if (cmd == CPU_PM_EXIT) { | ||
863 | cpu_init_hyp_mode(NULL); | ||
864 | return NOTIFY_OK; | ||
865 | } | ||
866 | |||
867 | return NOTIFY_DONE; | ||
868 | } | ||
869 | |||
870 | static struct notifier_block hyp_init_cpu_pm_nb = { | ||
871 | .notifier_call = hyp_init_cpu_pm_notifier, | ||
872 | }; | ||
873 | |||
874 | static void __init hyp_cpu_pm_init(void) | ||
875 | { | ||
876 | cpu_pm_register_notifier(&hyp_init_cpu_pm_nb); | ||
877 | } | ||
878 | #else | ||
879 | static inline void hyp_cpu_pm_init(void) | ||
880 | { | ||
881 | } | ||
882 | #endif | ||
883 | |||
856 | /** | 884 | /** |
857 | * Inits Hyp-mode on all online CPUs | 885 | * Inits Hyp-mode on all online CPUs |
858 | */ | 886 | */ |
@@ -1013,6 +1041,8 @@ int kvm_arch_init(void *opaque) | |||
1013 | goto out_err; | 1041 | goto out_err; |
1014 | } | 1042 | } |
1015 | 1043 | ||
1044 | hyp_cpu_pm_init(); | ||
1045 | |||
1016 | kvm_coproc_table_init(); | 1046 | kvm_coproc_table_init(); |
1017 | return 0; | 1047 | return 0; |
1018 | out_err: | 1048 | out_err: |
diff --git a/arch/arm/lib/delay-loop.S b/arch/arm/lib/delay-loop.S index 36b668d8e121..bc1033b897b4 100644 --- a/arch/arm/lib/delay-loop.S +++ b/arch/arm/lib/delay-loop.S | |||
@@ -40,6 +40,7 @@ ENTRY(__loop_const_udelay) @ 0 <= r0 <= 0x7fffff06 | |||
40 | /* | 40 | /* |
41 | * loops = r0 * HZ * loops_per_jiffy / 1000000 | 41 | * loops = r0 * HZ * loops_per_jiffy / 1000000 |
42 | */ | 42 | */ |
43 | .align 3 | ||
43 | 44 | ||
44 | @ Delay routine | 45 | @ Delay routine |
45 | ENTRY(__loop_delay) | 46 | ENTRY(__loop_delay) |
diff --git a/arch/arm/mach-at91/at91rm9200_time.c b/arch/arm/mach-at91/at91rm9200_time.c index f607deb40f4d..bc7b363a3083 100644 --- a/arch/arm/mach-at91/at91rm9200_time.c +++ b/arch/arm/mach-at91/at91rm9200_time.c | |||
@@ -174,7 +174,6 @@ clkevt32k_next_event(unsigned long delta, struct clock_event_device *dev) | |||
174 | static struct clock_event_device clkevt = { | 174 | static struct clock_event_device clkevt = { |
175 | .name = "at91_tick", | 175 | .name = "at91_tick", |
176 | .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, | 176 | .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, |
177 | .shift = 32, | ||
178 | .rating = 150, | 177 | .rating = 150, |
179 | .set_next_event = clkevt32k_next_event, | 178 | .set_next_event = clkevt32k_next_event, |
180 | .set_mode = clkevt32k_mode, | 179 | .set_mode = clkevt32k_mode, |
@@ -265,11 +264,9 @@ void __init at91rm9200_timer_init(void) | |||
265 | at91_st_write(AT91_ST_RTMR, 1); | 264 | at91_st_write(AT91_ST_RTMR, 1); |
266 | 265 | ||
267 | /* Setup timer clockevent, with minimum of two ticks (important!!) */ | 266 | /* Setup timer clockevent, with minimum of two ticks (important!!) */ |
268 | clkevt.mult = div_sc(AT91_SLOW_CLOCK, NSEC_PER_SEC, clkevt.shift); | ||
269 | clkevt.max_delta_ns = clockevent_delta2ns(AT91_ST_ALMV, &clkevt); | ||
270 | clkevt.min_delta_ns = clockevent_delta2ns(2, &clkevt) + 1; | ||
271 | clkevt.cpumask = cpumask_of(0); | 267 | clkevt.cpumask = cpumask_of(0); |
272 | clockevents_register_device(&clkevt); | 268 | clockevents_config_and_register(&clkevt, AT91_SLOW_CLOCK, |
269 | 2, AT91_ST_ALMV); | ||
273 | 270 | ||
274 | /* register clocksource */ | 271 | /* register clocksource */ |
275 | clocksource_register_hz(&clk32k, AT91_SLOW_CLOCK); | 272 | clocksource_register_hz(&clk32k, AT91_SLOW_CLOCK); |
diff --git a/arch/arm/mach-at91/pm.h b/arch/arm/mach-at91/pm.h index 3ed190ce062b..c5101dcb4fb0 100644 --- a/arch/arm/mach-at91/pm.h +++ b/arch/arm/mach-at91/pm.h | |||
@@ -16,7 +16,11 @@ | |||
16 | #include <mach/at91_ramc.h> | 16 | #include <mach/at91_ramc.h> |
17 | #include <mach/at91rm9200_sdramc.h> | 17 | #include <mach/at91rm9200_sdramc.h> |
18 | 18 | ||
19 | #ifdef CONFIG_PM | ||
19 | extern void at91_pm_set_standby(void (*at91_standby)(void)); | 20 | extern void at91_pm_set_standby(void (*at91_standby)(void)); |
21 | #else | ||
22 | static inline void at91_pm_set_standby(void (*at91_standby)(void)) { } | ||
23 | #endif | ||
20 | 24 | ||
21 | /* | 25 | /* |
22 | * The AT91RM9200 goes into self-refresh mode with this command, and will | 26 | * The AT91RM9200 goes into self-refresh mode with this command, and will |
diff --git a/arch/arm/mach-at91/sama5d3.c b/arch/arm/mach-at91/sama5d3.c index 3ea86428ee09..a28873fe3049 100644 --- a/arch/arm/mach-at91/sama5d3.c +++ b/arch/arm/mach-at91/sama5d3.c | |||
@@ -95,19 +95,19 @@ static struct clk twi0_clk = { | |||
95 | .name = "twi0_clk", | 95 | .name = "twi0_clk", |
96 | .pid = SAMA5D3_ID_TWI0, | 96 | .pid = SAMA5D3_ID_TWI0, |
97 | .type = CLK_TYPE_PERIPHERAL, | 97 | .type = CLK_TYPE_PERIPHERAL, |
98 | .div = AT91_PMC_PCR_DIV2, | 98 | .div = AT91_PMC_PCR_DIV8, |
99 | }; | 99 | }; |
100 | static struct clk twi1_clk = { | 100 | static struct clk twi1_clk = { |
101 | .name = "twi1_clk", | 101 | .name = "twi1_clk", |
102 | .pid = SAMA5D3_ID_TWI1, | 102 | .pid = SAMA5D3_ID_TWI1, |
103 | .type = CLK_TYPE_PERIPHERAL, | 103 | .type = CLK_TYPE_PERIPHERAL, |
104 | .div = AT91_PMC_PCR_DIV2, | 104 | .div = AT91_PMC_PCR_DIV8, |
105 | }; | 105 | }; |
106 | static struct clk twi2_clk = { | 106 | static struct clk twi2_clk = { |
107 | .name = "twi2_clk", | 107 | .name = "twi2_clk", |
108 | .pid = SAMA5D3_ID_TWI2, | 108 | .pid = SAMA5D3_ID_TWI2, |
109 | .type = CLK_TYPE_PERIPHERAL, | 109 | .type = CLK_TYPE_PERIPHERAL, |
110 | .div = AT91_PMC_PCR_DIV2, | 110 | .div = AT91_PMC_PCR_DIV8, |
111 | }; | 111 | }; |
112 | static struct clk mmc0_clk = { | 112 | static struct clk mmc0_clk = { |
113 | .name = "mci0_clk", | 113 | .name = "mci0_clk", |
diff --git a/arch/arm/mach-bcm/Kconfig b/arch/arm/mach-bcm/Kconfig index 9fe6d88737ed..b1aa6a9b3bd1 100644 --- a/arch/arm/mach-bcm/Kconfig +++ b/arch/arm/mach-bcm/Kconfig | |||
@@ -25,6 +25,7 @@ config ARCH_BCM_MOBILE | |||
25 | select TICK_ONESHOT | 25 | select TICK_ONESHOT |
26 | select CACHE_L2X0 | 26 | select CACHE_L2X0 |
27 | select HAVE_ARM_ARCH_TIMER | 27 | select HAVE_ARM_ARCH_TIMER |
28 | select PINCTRL | ||
28 | help | 29 | help |
29 | This enables support for systems based on Broadcom mobile SoCs. | 30 | This enables support for systems based on Broadcom mobile SoCs. |
30 | It currently supports the 'BCM281XX' family, which includes | 31 | It currently supports the 'BCM281XX' family, which includes |
diff --git a/arch/arm/mach-clps711x/devices.c b/arch/arm/mach-clps711x/devices.c index fb77d1448fec..2001488a5ef2 100644 --- a/arch/arm/mach-clps711x/devices.c +++ b/arch/arm/mach-clps711x/devices.c | |||
@@ -61,8 +61,29 @@ static void __init clps711x_add_syscon(void) | |||
61 | &clps711x_syscon_res[i], 1); | 61 | &clps711x_syscon_res[i], 1); |
62 | } | 62 | } |
63 | 63 | ||
64 | static const struct resource clps711x_uart1_res[] __initconst = { | ||
65 | DEFINE_RES_MEM(CLPS711X_PHYS_BASE + UARTDR1, SZ_128), | ||
66 | DEFINE_RES_IRQ(IRQ_UTXINT1), | ||
67 | DEFINE_RES_IRQ(IRQ_URXINT1), | ||
68 | }; | ||
69 | |||
70 | static const struct resource clps711x_uart2_res[] __initconst = { | ||
71 | DEFINE_RES_MEM(CLPS711X_PHYS_BASE + UARTDR2, SZ_128), | ||
72 | DEFINE_RES_IRQ(IRQ_UTXINT2), | ||
73 | DEFINE_RES_IRQ(IRQ_URXINT2), | ||
74 | }; | ||
75 | |||
76 | static void __init clps711x_add_uart(void) | ||
77 | { | ||
78 | platform_device_register_simple("clps711x-uart", 0, clps711x_uart1_res, | ||
79 | ARRAY_SIZE(clps711x_uart1_res)); | ||
80 | platform_device_register_simple("clps711x-uart", 1, clps711x_uart2_res, | ||
81 | ARRAY_SIZE(clps711x_uart2_res)); | ||
82 | }; | ||
83 | |||
64 | void __init clps711x_devices_init(void) | 84 | void __init clps711x_devices_init(void) |
65 | { | 85 | { |
66 | clps711x_add_gpio(); | 86 | clps711x_add_gpio(); |
67 | clps711x_add_syscon(); | 87 | clps711x_add_syscon(); |
88 | clps711x_add_uart(); | ||
68 | } | 89 | } |
diff --git a/arch/arm/mach-davinci/devices-da8xx.c b/arch/arm/mach-davinci/devices-da8xx.c index c46eccbbd512..78829c513fdc 100644 --- a/arch/arm/mach-davinci/devices-da8xx.c +++ b/arch/arm/mach-davinci/devices-da8xx.c | |||
@@ -487,7 +487,7 @@ int __init da8xx_register_emac(void) | |||
487 | 487 | ||
488 | static struct resource da830_mcasp1_resources[] = { | 488 | static struct resource da830_mcasp1_resources[] = { |
489 | { | 489 | { |
490 | .name = "mcasp1", | 490 | .name = "mpu", |
491 | .start = DAVINCI_DA830_MCASP1_REG_BASE, | 491 | .start = DAVINCI_DA830_MCASP1_REG_BASE, |
492 | .end = DAVINCI_DA830_MCASP1_REG_BASE + (SZ_1K * 12) - 1, | 492 | .end = DAVINCI_DA830_MCASP1_REG_BASE + (SZ_1K * 12) - 1, |
493 | .flags = IORESOURCE_MEM, | 493 | .flags = IORESOURCE_MEM, |
@@ -515,7 +515,7 @@ static struct platform_device da830_mcasp1_device = { | |||
515 | 515 | ||
516 | static struct resource da850_mcasp_resources[] = { | 516 | static struct resource da850_mcasp_resources[] = { |
517 | { | 517 | { |
518 | .name = "mcasp", | 518 | .name = "mpu", |
519 | .start = DAVINCI_DA8XX_MCASP0_REG_BASE, | 519 | .start = DAVINCI_DA8XX_MCASP0_REG_BASE, |
520 | .end = DAVINCI_DA8XX_MCASP0_REG_BASE + (SZ_1K * 12) - 1, | 520 | .end = DAVINCI_DA8XX_MCASP0_REG_BASE + (SZ_1K * 12) - 1, |
521 | .flags = IORESOURCE_MEM, | 521 | .flags = IORESOURCE_MEM, |
diff --git a/arch/arm/mach-davinci/dm355.c b/arch/arm/mach-davinci/dm355.c index ef9ff1fb6f52..6117fc644188 100644 --- a/arch/arm/mach-davinci/dm355.c +++ b/arch/arm/mach-davinci/dm355.c | |||
@@ -641,6 +641,7 @@ static struct platform_device dm355_edma_device = { | |||
641 | 641 | ||
642 | static struct resource dm355_asp1_resources[] = { | 642 | static struct resource dm355_asp1_resources[] = { |
643 | { | 643 | { |
644 | .name = "mpu", | ||
644 | .start = DAVINCI_ASP1_BASE, | 645 | .start = DAVINCI_ASP1_BASE, |
645 | .end = DAVINCI_ASP1_BASE + SZ_8K - 1, | 646 | .end = DAVINCI_ASP1_BASE + SZ_8K - 1, |
646 | .flags = IORESOURCE_MEM, | 647 | .flags = IORESOURCE_MEM, |
@@ -906,7 +907,7 @@ static struct davinci_gpio_platform_data dm355_gpio_platform_data = { | |||
906 | int __init dm355_gpio_register(void) | 907 | int __init dm355_gpio_register(void) |
907 | { | 908 | { |
908 | return davinci_gpio_register(dm355_gpio_resources, | 909 | return davinci_gpio_register(dm355_gpio_resources, |
909 | sizeof(dm355_gpio_resources), | 910 | ARRAY_SIZE(dm355_gpio_resources), |
910 | &dm355_gpio_platform_data); | 911 | &dm355_gpio_platform_data); |
911 | } | 912 | } |
912 | /*----------------------------------------------------------------------*/ | 913 | /*----------------------------------------------------------------------*/ |
diff --git a/arch/arm/mach-davinci/dm365.c b/arch/arm/mach-davinci/dm365.c index 1511a0680f9a..d7c6f85d3fc9 100644 --- a/arch/arm/mach-davinci/dm365.c +++ b/arch/arm/mach-davinci/dm365.c | |||
@@ -720,7 +720,7 @@ static struct davinci_gpio_platform_data dm365_gpio_platform_data = { | |||
720 | int __init dm365_gpio_register(void) | 720 | int __init dm365_gpio_register(void) |
721 | { | 721 | { |
722 | return davinci_gpio_register(dm365_gpio_resources, | 722 | return davinci_gpio_register(dm365_gpio_resources, |
723 | sizeof(dm365_gpio_resources), | 723 | ARRAY_SIZE(dm365_gpio_resources), |
724 | &dm365_gpio_platform_data); | 724 | &dm365_gpio_platform_data); |
725 | } | 725 | } |
726 | 726 | ||
@@ -942,6 +942,7 @@ static struct platform_device dm365_edma_device = { | |||
942 | 942 | ||
943 | static struct resource dm365_asp_resources[] = { | 943 | static struct resource dm365_asp_resources[] = { |
944 | { | 944 | { |
945 | .name = "mpu", | ||
945 | .start = DAVINCI_DM365_ASP0_BASE, | 946 | .start = DAVINCI_DM365_ASP0_BASE, |
946 | .end = DAVINCI_DM365_ASP0_BASE + SZ_8K - 1, | 947 | .end = DAVINCI_DM365_ASP0_BASE + SZ_8K - 1, |
947 | .flags = IORESOURCE_MEM, | 948 | .flags = IORESOURCE_MEM, |
diff --git a/arch/arm/mach-davinci/dm644x.c b/arch/arm/mach-davinci/dm644x.c index 143a3217e8ef..3ce47997bb46 100644 --- a/arch/arm/mach-davinci/dm644x.c +++ b/arch/arm/mach-davinci/dm644x.c | |||
@@ -572,6 +572,7 @@ static struct platform_device dm644x_edma_device = { | |||
572 | /* DM6446 EVM uses ASP0; line-out is a pair of RCA jacks */ | 572 | /* DM6446 EVM uses ASP0; line-out is a pair of RCA jacks */ |
573 | static struct resource dm644x_asp_resources[] = { | 573 | static struct resource dm644x_asp_resources[] = { |
574 | { | 574 | { |
575 | .name = "mpu", | ||
575 | .start = DAVINCI_ASP0_BASE, | 576 | .start = DAVINCI_ASP0_BASE, |
576 | .end = DAVINCI_ASP0_BASE + SZ_8K - 1, | 577 | .end = DAVINCI_ASP0_BASE + SZ_8K - 1, |
577 | .flags = IORESOURCE_MEM, | 578 | .flags = IORESOURCE_MEM, |
@@ -792,7 +793,7 @@ static struct davinci_gpio_platform_data dm644_gpio_platform_data = { | |||
792 | int __init dm644x_gpio_register(void) | 793 | int __init dm644x_gpio_register(void) |
793 | { | 794 | { |
794 | return davinci_gpio_register(dm644_gpio_resources, | 795 | return davinci_gpio_register(dm644_gpio_resources, |
795 | sizeof(dm644_gpio_resources), | 796 | ARRAY_SIZE(dm644_gpio_resources), |
796 | &dm644_gpio_platform_data); | 797 | &dm644_gpio_platform_data); |
797 | } | 798 | } |
798 | /*----------------------------------------------------------------------*/ | 799 | /*----------------------------------------------------------------------*/ |
diff --git a/arch/arm/mach-davinci/dm646x.c b/arch/arm/mach-davinci/dm646x.c index 2a73f299c1d0..0e81fea65e7f 100644 --- a/arch/arm/mach-davinci/dm646x.c +++ b/arch/arm/mach-davinci/dm646x.c | |||
@@ -621,7 +621,7 @@ static struct platform_device dm646x_edma_device = { | |||
621 | 621 | ||
622 | static struct resource dm646x_mcasp0_resources[] = { | 622 | static struct resource dm646x_mcasp0_resources[] = { |
623 | { | 623 | { |
624 | .name = "mcasp0", | 624 | .name = "mpu", |
625 | .start = DAVINCI_DM646X_MCASP0_REG_BASE, | 625 | .start = DAVINCI_DM646X_MCASP0_REG_BASE, |
626 | .end = DAVINCI_DM646X_MCASP0_REG_BASE + (SZ_1K << 1) - 1, | 626 | .end = DAVINCI_DM646X_MCASP0_REG_BASE + (SZ_1K << 1) - 1, |
627 | .flags = IORESOURCE_MEM, | 627 | .flags = IORESOURCE_MEM, |
@@ -641,7 +641,7 @@ static struct resource dm646x_mcasp0_resources[] = { | |||
641 | 641 | ||
642 | static struct resource dm646x_mcasp1_resources[] = { | 642 | static struct resource dm646x_mcasp1_resources[] = { |
643 | { | 643 | { |
644 | .name = "mcasp1", | 644 | .name = "mpu", |
645 | .start = DAVINCI_DM646X_MCASP1_REG_BASE, | 645 | .start = DAVINCI_DM646X_MCASP1_REG_BASE, |
646 | .end = DAVINCI_DM646X_MCASP1_REG_BASE + (SZ_1K << 1) - 1, | 646 | .end = DAVINCI_DM646X_MCASP1_REG_BASE + (SZ_1K << 1) - 1, |
647 | .flags = IORESOURCE_MEM, | 647 | .flags = IORESOURCE_MEM, |
@@ -769,7 +769,7 @@ static struct davinci_gpio_platform_data dm646x_gpio_platform_data = { | |||
769 | int __init dm646x_gpio_register(void) | 769 | int __init dm646x_gpio_register(void) |
770 | { | 770 | { |
771 | return davinci_gpio_register(dm646x_gpio_resources, | 771 | return davinci_gpio_register(dm646x_gpio_resources, |
772 | sizeof(dm646x_gpio_resources), | 772 | ARRAY_SIZE(dm646x_gpio_resources), |
773 | &dm646x_gpio_platform_data); | 773 | &dm646x_gpio_platform_data); |
774 | } | 774 | } |
775 | /*----------------------------------------------------------------------*/ | 775 | /*----------------------------------------------------------------------*/ |
diff --git a/arch/arm/mach-footbridge/common.c b/arch/arm/mach-footbridge/common.c index 2739ca2c1334..e0091685fd48 100644 --- a/arch/arm/mach-footbridge/common.c +++ b/arch/arm/mach-footbridge/common.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
16 | #include <linux/io.h> | 16 | #include <linux/io.h> |
17 | #include <linux/spinlock.h> | 17 | #include <linux/spinlock.h> |
18 | #include <video/vga.h> | ||
18 | 19 | ||
19 | #include <asm/pgtable.h> | 20 | #include <asm/pgtable.h> |
20 | #include <asm/page.h> | 21 | #include <asm/page.h> |
@@ -196,6 +197,8 @@ void __init footbridge_map_io(void) | |||
196 | iotable_init(ebsa285_host_io_desc, ARRAY_SIZE(ebsa285_host_io_desc)); | 197 | iotable_init(ebsa285_host_io_desc, ARRAY_SIZE(ebsa285_host_io_desc)); |
197 | pci_map_io_early(__phys_to_pfn(DC21285_PCI_IO)); | 198 | pci_map_io_early(__phys_to_pfn(DC21285_PCI_IO)); |
198 | } | 199 | } |
200 | |||
201 | vga_base = PCIMEM_BASE; | ||
199 | } | 202 | } |
200 | 203 | ||
201 | void footbridge_restart(enum reboot_mode mode, const char *cmd) | 204 | void footbridge_restart(enum reboot_mode mode, const char *cmd) |
diff --git a/arch/arm/mach-footbridge/dc21285-timer.c b/arch/arm/mach-footbridge/dc21285-timer.c index 9ee78f7b4990..782f6c71fa0a 100644 --- a/arch/arm/mach-footbridge/dc21285-timer.c +++ b/arch/arm/mach-footbridge/dc21285-timer.c | |||
@@ -96,11 +96,12 @@ static struct irqaction footbridge_timer_irq = { | |||
96 | void __init footbridge_timer_init(void) | 96 | void __init footbridge_timer_init(void) |
97 | { | 97 | { |
98 | struct clock_event_device *ce = &ckevt_dc21285; | 98 | struct clock_event_device *ce = &ckevt_dc21285; |
99 | unsigned rate = DIV_ROUND_CLOSEST(mem_fclk_21285, 16); | ||
99 | 100 | ||
100 | clocksource_register_hz(&cksrc_dc21285, (mem_fclk_21285 + 8) / 16); | 101 | clocksource_register_hz(&cksrc_dc21285, rate); |
101 | 102 | ||
102 | setup_irq(ce->irq, &footbridge_timer_irq); | 103 | setup_irq(ce->irq, &footbridge_timer_irq); |
103 | 104 | ||
104 | ce->cpumask = cpumask_of(smp_processor_id()); | 105 | ce->cpumask = cpumask_of(smp_processor_id()); |
105 | clockevents_config_and_register(ce, mem_fclk_21285, 0x4, 0xffffff); | 106 | clockevents_config_and_register(ce, rate, 0x4, 0xffffff); |
106 | } | 107 | } |
diff --git a/arch/arm/mach-footbridge/dc21285.c b/arch/arm/mach-footbridge/dc21285.c index 3490a24f969e..7c2fdae9a38b 100644 --- a/arch/arm/mach-footbridge/dc21285.c +++ b/arch/arm/mach-footbridge/dc21285.c | |||
@@ -18,7 +18,6 @@ | |||
18 | #include <linux/irq.h> | 18 | #include <linux/irq.h> |
19 | #include <linux/io.h> | 19 | #include <linux/io.h> |
20 | #include <linux/spinlock.h> | 20 | #include <linux/spinlock.h> |
21 | #include <video/vga.h> | ||
22 | 21 | ||
23 | #include <asm/irq.h> | 22 | #include <asm/irq.h> |
24 | #include <asm/mach/pci.h> | 23 | #include <asm/mach/pci.h> |
@@ -291,7 +290,6 @@ void __init dc21285_preinit(void) | |||
291 | int cfn_mode; | 290 | int cfn_mode; |
292 | 291 | ||
293 | pcibios_min_mem = 0x81000000; | 292 | pcibios_min_mem = 0x81000000; |
294 | vga_base = PCIMEM_BASE; | ||
295 | 293 | ||
296 | mem_size = (unsigned int)high_memory - PAGE_OFFSET; | 294 | mem_size = (unsigned int)high_memory - PAGE_OFFSET; |
297 | for (mem_mask = 0x00100000; mem_mask < 0x10000000; mem_mask <<= 1) | 295 | for (mem_mask = 0x00100000; mem_mask < 0x10000000; mem_mask <<= 1) |
diff --git a/arch/arm/mach-footbridge/ebsa285.c b/arch/arm/mach-footbridge/ebsa285.c index b08243500e2e..1a7235fb52ac 100644 --- a/arch/arm/mach-footbridge/ebsa285.c +++ b/arch/arm/mach-footbridge/ebsa285.c | |||
@@ -30,21 +30,24 @@ static const struct { | |||
30 | const char *name; | 30 | const char *name; |
31 | const char *trigger; | 31 | const char *trigger; |
32 | } ebsa285_leds[] = { | 32 | } ebsa285_leds[] = { |
33 | { "ebsa285:amber", "heartbeat", }, | 33 | { "ebsa285:amber", "cpu0", }, |
34 | { "ebsa285:green", "cpu0", }, | 34 | { "ebsa285:green", "heartbeat", }, |
35 | { "ebsa285:red",}, | 35 | { "ebsa285:red",}, |
36 | }; | 36 | }; |
37 | 37 | ||
38 | static unsigned char hw_led_state; | ||
39 | |||
38 | static void ebsa285_led_set(struct led_classdev *cdev, | 40 | static void ebsa285_led_set(struct led_classdev *cdev, |
39 | enum led_brightness b) | 41 | enum led_brightness b) |
40 | { | 42 | { |
41 | struct ebsa285_led *led = container_of(cdev, | 43 | struct ebsa285_led *led = container_of(cdev, |
42 | struct ebsa285_led, cdev); | 44 | struct ebsa285_led, cdev); |
43 | 45 | ||
44 | if (b != LED_OFF) | 46 | if (b == LED_OFF) |
45 | *XBUS_LEDS |= led->mask; | 47 | hw_led_state |= led->mask; |
46 | else | 48 | else |
47 | *XBUS_LEDS &= ~led->mask; | 49 | hw_led_state &= ~led->mask; |
50 | *XBUS_LEDS = hw_led_state; | ||
48 | } | 51 | } |
49 | 52 | ||
50 | static enum led_brightness ebsa285_led_get(struct led_classdev *cdev) | 53 | static enum led_brightness ebsa285_led_get(struct led_classdev *cdev) |
@@ -52,18 +55,19 @@ static enum led_brightness ebsa285_led_get(struct led_classdev *cdev) | |||
52 | struct ebsa285_led *led = container_of(cdev, | 55 | struct ebsa285_led *led = container_of(cdev, |
53 | struct ebsa285_led, cdev); | 56 | struct ebsa285_led, cdev); |
54 | 57 | ||
55 | return (*XBUS_LEDS & led->mask) ? LED_FULL : LED_OFF; | 58 | return hw_led_state & led->mask ? LED_OFF : LED_FULL; |
56 | } | 59 | } |
57 | 60 | ||
58 | static int __init ebsa285_leds_init(void) | 61 | static int __init ebsa285_leds_init(void) |
59 | { | 62 | { |
60 | int i; | 63 | int i; |
61 | 64 | ||
62 | if (machine_is_ebsa285()) | 65 | if (!machine_is_ebsa285()) |
63 | return -ENODEV; | 66 | return -ENODEV; |
64 | 67 | ||
65 | /* 3 LEDS All ON */ | 68 | /* 3 LEDS all off */ |
66 | *XBUS_LEDS |= XBUS_LED_AMBER | XBUS_LED_GREEN | XBUS_LED_RED; | 69 | hw_led_state = XBUS_LED_AMBER | XBUS_LED_GREEN | XBUS_LED_RED; |
70 | *XBUS_LEDS = hw_led_state; | ||
67 | 71 | ||
68 | for (i = 0; i < ARRAY_SIZE(ebsa285_leds); i++) { | 72 | for (i = 0; i < ARRAY_SIZE(ebsa285_leds); i++) { |
69 | struct ebsa285_led *led; | 73 | struct ebsa285_led *led; |
diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c index b3d7e5634b83..c7de89b263dd 100644 --- a/arch/arm/mach-highbank/highbank.c +++ b/arch/arm/mach-highbank/highbank.c | |||
@@ -17,12 +17,15 @@ | |||
17 | #include <linux/clkdev.h> | 17 | #include <linux/clkdev.h> |
18 | #include <linux/clocksource.h> | 18 | #include <linux/clocksource.h> |
19 | #include <linux/dma-mapping.h> | 19 | #include <linux/dma-mapping.h> |
20 | #include <linux/input.h> | ||
20 | #include <linux/io.h> | 21 | #include <linux/io.h> |
21 | #include <linux/irqchip.h> | 22 | #include <linux/irqchip.h> |
23 | #include <linux/mailbox.h> | ||
22 | #include <linux/of.h> | 24 | #include <linux/of.h> |
23 | #include <linux/of_irq.h> | 25 | #include <linux/of_irq.h> |
24 | #include <linux/of_platform.h> | 26 | #include <linux/of_platform.h> |
25 | #include <linux/of_address.h> | 27 | #include <linux/of_address.h> |
28 | #include <linux/reboot.h> | ||
26 | #include <linux/amba/bus.h> | 29 | #include <linux/amba/bus.h> |
27 | #include <linux/platform_device.h> | 30 | #include <linux/platform_device.h> |
28 | 31 | ||
@@ -50,6 +53,7 @@ static void __init highbank_scu_map_io(void) | |||
50 | 53 | ||
51 | static void highbank_l2x0_disable(void) | 54 | static void highbank_l2x0_disable(void) |
52 | { | 55 | { |
56 | outer_flush_all(); | ||
53 | /* Disable PL310 L2 Cache controller */ | 57 | /* Disable PL310 L2 Cache controller */ |
54 | highbank_smc1(0x102, 0x0); | 58 | highbank_smc1(0x102, 0x0); |
55 | } | 59 | } |
@@ -130,6 +134,24 @@ static struct platform_device highbank_cpuidle_device = { | |||
130 | .name = "cpuidle-calxeda", | 134 | .name = "cpuidle-calxeda", |
131 | }; | 135 | }; |
132 | 136 | ||
137 | static int hb_keys_notifier(struct notifier_block *nb, unsigned long event, void *data) | ||
138 | { | ||
139 | u32 key = *(u32 *)data; | ||
140 | |||
141 | if (event != 0x1000) | ||
142 | return 0; | ||
143 | |||
144 | if (key == KEY_POWER) | ||
145 | orderly_poweroff(false); | ||
146 | else if (key == 0xffff) | ||
147 | ctrl_alt_del(); | ||
148 | |||
149 | return 0; | ||
150 | } | ||
151 | static struct notifier_block hb_keys_nb = { | ||
152 | .notifier_call = hb_keys_notifier, | ||
153 | }; | ||
154 | |||
133 | static void __init highbank_init(void) | 155 | static void __init highbank_init(void) |
134 | { | 156 | { |
135 | struct device_node *np; | 157 | struct device_node *np; |
@@ -145,6 +167,8 @@ static void __init highbank_init(void) | |||
145 | bus_register_notifier(&platform_bus_type, &highbank_platform_nb); | 167 | bus_register_notifier(&platform_bus_type, &highbank_platform_nb); |
146 | bus_register_notifier(&amba_bustype, &highbank_amba_nb); | 168 | bus_register_notifier(&amba_bustype, &highbank_amba_nb); |
147 | 169 | ||
170 | pl320_ipc_register_notifier(&hb_keys_nb); | ||
171 | |||
148 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); | 172 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); |
149 | 173 | ||
150 | if (psci_ops.cpu_suspend) | 174 | if (psci_ops.cpu_suspend) |
diff --git a/arch/arm/mach-ks8695/include/mach/gpio.h b/arch/arm/mach-ks8695/include/mach/gpio.h deleted file mode 100644 index f5fda36e4512..000000000000 --- a/arch/arm/mach-ks8695/include/mach/gpio.h +++ /dev/null | |||
@@ -1,19 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-ks8695/include/mach/gpio.h | ||
3 | * | ||
4 | * Copyright (C) 2006 Andrew Victor | ||
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 | |||
11 | #ifndef __ASM_ARCH_GPIO_H_ | ||
12 | #define __ASM_ARCH_GPIO_H_ | ||
13 | |||
14 | /* | ||
15 | * Map IRQ number to GPIO line. | ||
16 | */ | ||
17 | extern int irq_to_gpio(unsigned int irq); | ||
18 | |||
19 | #endif | ||
diff --git a/arch/arm/mach-lpc32xx/include/mach/gpio-lpc32xx.h b/arch/arm/mach-lpc32xx/include/mach/gpio-lpc32xx.h deleted file mode 100644 index a544e962a818..000000000000 --- a/arch/arm/mach-lpc32xx/include/mach/gpio-lpc32xx.h +++ /dev/null | |||
@@ -1,50 +0,0 @@ | |||
1 | /* | ||
2 | * Author: Kevin Wells <kevin.wells@nxp.com> | ||
3 | * | ||
4 | * Copyright (C) 2010 NXP Semiconductors | ||
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 as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | */ | ||
16 | |||
17 | #ifndef __MACH_GPIO_LPC32XX_H | ||
18 | #define __MACH_GPIO_LPC32XX_H | ||
19 | |||
20 | /* | ||
21 | * Note! | ||
22 | * Muxed GP pins need to be setup to the GP state in the board level | ||
23 | * code prior to using this driver. | ||
24 | * GPI pins : 28xP3 group | ||
25 | * GPO pins : 24xP3 group | ||
26 | * GPIO pins: 8xP0 group, 24xP1 group, 13xP2 group, 6xP3 group | ||
27 | */ | ||
28 | |||
29 | #define LPC32XX_GPIO_P0_MAX 8 | ||
30 | #define LPC32XX_GPIO_P1_MAX 24 | ||
31 | #define LPC32XX_GPIO_P2_MAX 13 | ||
32 | #define LPC32XX_GPIO_P3_MAX 6 | ||
33 | #define LPC32XX_GPI_P3_MAX 29 | ||
34 | #define LPC32XX_GPO_P3_MAX 24 | ||
35 | |||
36 | #define LPC32XX_GPIO_P0_GRP 0 | ||
37 | #define LPC32XX_GPIO_P1_GRP (LPC32XX_GPIO_P0_GRP + LPC32XX_GPIO_P0_MAX) | ||
38 | #define LPC32XX_GPIO_P2_GRP (LPC32XX_GPIO_P1_GRP + LPC32XX_GPIO_P1_MAX) | ||
39 | #define LPC32XX_GPIO_P3_GRP (LPC32XX_GPIO_P2_GRP + LPC32XX_GPIO_P2_MAX) | ||
40 | #define LPC32XX_GPI_P3_GRP (LPC32XX_GPIO_P3_GRP + LPC32XX_GPIO_P3_MAX) | ||
41 | #define LPC32XX_GPO_P3_GRP (LPC32XX_GPI_P3_GRP + LPC32XX_GPI_P3_MAX) | ||
42 | |||
43 | /* | ||
44 | * A specific GPIO can be selected with this macro | ||
45 | * ie, GPIO_05 can be selected with LPC32XX_GPIO(LPC32XX_GPIO_P3_GRP, 5) | ||
46 | * See the LPC32x0 User's guide for GPIO group numbers | ||
47 | */ | ||
48 | #define LPC32XX_GPIO(x, y) ((x) + (y)) | ||
49 | |||
50 | #endif /* __MACH_GPIO_LPC32XX_H */ | ||
diff --git a/arch/arm/mach-lpc32xx/include/mach/gpio.h b/arch/arm/mach-lpc32xx/include/mach/gpio.h deleted file mode 100644 index 0052e7a76179..000000000000 --- a/arch/arm/mach-lpc32xx/include/mach/gpio.h +++ /dev/null | |||
@@ -1,6 +0,0 @@ | |||
1 | #ifndef __MACH_GPIO_H | ||
2 | #define __MACH_GPIO_H | ||
3 | |||
4 | #include "gpio-lpc32xx.h" | ||
5 | |||
6 | #endif /* __MACH_GPIO_H */ | ||
diff --git a/arch/arm/mach-lpc32xx/phy3250.c b/arch/arm/mach-lpc32xx/phy3250.c index e54f87ec2e4a..34932e0e31fa 100644 --- a/arch/arm/mach-lpc32xx/phy3250.c +++ b/arch/arm/mach-lpc32xx/phy3250.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include <linux/clk.h> | 36 | #include <linux/clk.h> |
37 | #include <linux/mtd/lpc32xx_slc.h> | 37 | #include <linux/mtd/lpc32xx_slc.h> |
38 | #include <linux/mtd/lpc32xx_mlc.h> | 38 | #include <linux/mtd/lpc32xx_mlc.h> |
39 | #include <linux/platform_data/gpio-lpc32xx.h> | ||
39 | 40 | ||
40 | #include <asm/setup.h> | 41 | #include <asm/setup.h> |
41 | #include <asm/mach-types.h> | 42 | #include <asm/mach-types.h> |
@@ -44,7 +45,6 @@ | |||
44 | #include <mach/hardware.h> | 45 | #include <mach/hardware.h> |
45 | #include <mach/platform.h> | 46 | #include <mach/platform.h> |
46 | #include <mach/board.h> | 47 | #include <mach/board.h> |
47 | #include <mach/gpio-lpc32xx.h> | ||
48 | #include "common.h" | 48 | #include "common.h" |
49 | 49 | ||
50 | /* | 50 | /* |
diff --git a/arch/arm/mach-mv78xx0/include/mach/gpio.h b/arch/arm/mach-mv78xx0/include/mach/gpio.h deleted file mode 100644 index 77e1b843e768..000000000000 --- a/arch/arm/mach-mv78xx0/include/mach/gpio.h +++ /dev/null | |||
@@ -1,9 +0,0 @@ | |||
1 | /* | ||
2 | * arch/asm-arm/mach-mv78xx0/include/mach/gpio.h | ||
3 | * | ||
4 | * This file is licensed under the terms of the GNU General Public | ||
5 | * License version 2. This program is licensed "as is" without any | ||
6 | * warranty of any kind, whether express or implied. | ||
7 | */ | ||
8 | |||
9 | #include <plat/gpio.h> | ||
diff --git a/arch/arm/mach-omap1/include/mach/usb.h b/arch/arm/mach-omap1/include/mach/usb.h index 45e5ac707cbb..2c263051dc51 100644 --- a/arch/arm/mach-omap1/include/mach/usb.h +++ b/arch/arm/mach-omap1/include/mach/usb.h | |||
@@ -8,43 +8,7 @@ | |||
8 | #define is_usb0_device(config) 0 | 8 | #define is_usb0_device(config) 0 |
9 | #endif | 9 | #endif |
10 | 10 | ||
11 | struct omap_usb_config { | 11 | #include <linux/platform_data/usb-omap1.h> |
12 | /* Configure drivers according to the connectors on your board: | ||
13 | * - "A" connector (rectagular) | ||
14 | * ... for host/OHCI use, set "register_host". | ||
15 | * - "B" connector (squarish) or "Mini-B" | ||
16 | * ... for device/gadget use, set "register_dev". | ||
17 | * - "Mini-AB" connector (very similar to Mini-B) | ||
18 | * ... for OTG use as device OR host, initialize "otg" | ||
19 | */ | ||
20 | unsigned register_host:1; | ||
21 | unsigned register_dev:1; | ||
22 | u8 otg; /* port number, 1-based: usb1 == 2 */ | ||
23 | |||
24 | u8 hmc_mode; | ||
25 | |||
26 | /* implicitly true if otg: host supports remote wakeup? */ | ||
27 | u8 rwc; | ||
28 | |||
29 | /* signaling pins used to talk to transceiver on usbN: | ||
30 | * 0 == usbN unused | ||
31 | * 2 == usb0-only, using internal transceiver | ||
32 | * 3 == 3 wire bidirectional | ||
33 | * 4 == 4 wire bidirectional | ||
34 | * 6 == 6 wire unidirectional (or TLL) | ||
35 | */ | ||
36 | u8 pins[3]; | ||
37 | |||
38 | struct platform_device *udc_device; | ||
39 | struct platform_device *ohci_device; | ||
40 | struct platform_device *otg_device; | ||
41 | |||
42 | u32 (*usb0_init)(unsigned nwires, unsigned is_device); | ||
43 | u32 (*usb1_init)(unsigned nwires); | ||
44 | u32 (*usb2_init)(unsigned nwires, unsigned alt_pingroup); | ||
45 | |||
46 | int (*ocpi_enable)(void); | ||
47 | }; | ||
48 | 12 | ||
49 | void omap_otg_init(struct omap_usb_config *config); | 13 | void omap_otg_init(struct omap_usb_config *config); |
50 | 14 | ||
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index 1f25f3e99c05..adcef406ff0a 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile | |||
@@ -19,11 +19,11 @@ secure-common = omap-smc.o omap-secure.o | |||
19 | 19 | ||
20 | obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(hwmod-common) | 20 | obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(hwmod-common) |
21 | obj-$(CONFIG_ARCH_OMAP3) += $(omap-2-3-common) $(hwmod-common) $(secure-common) | 21 | obj-$(CONFIG_ARCH_OMAP3) += $(omap-2-3-common) $(hwmod-common) $(secure-common) |
22 | obj-$(CONFIG_ARCH_OMAP4) += prm44xx.o $(hwmod-common) $(secure-common) | 22 | obj-$(CONFIG_ARCH_OMAP4) += $(hwmod-common) $(secure-common) |
23 | obj-$(CONFIG_SOC_AM33XX) += irq.o $(hwmod-common) | 23 | obj-$(CONFIG_SOC_AM33XX) += irq.o $(hwmod-common) |
24 | obj-$(CONFIG_SOC_OMAP5) += prm44xx.o $(hwmod-common) $(secure-common) | 24 | obj-$(CONFIG_SOC_OMAP5) += $(hwmod-common) $(secure-common) |
25 | obj-$(CONFIG_SOC_AM43XX) += $(hwmod-common) $(secure-common) | 25 | obj-$(CONFIG_SOC_AM43XX) += $(hwmod-common) $(secure-common) |
26 | obj-$(CONFIG_SOC_DRA7XX) += prm44xx.o $(hwmod-common) $(secure-common) | 26 | obj-$(CONFIG_SOC_DRA7XX) += $(hwmod-common) $(secure-common) |
27 | 27 | ||
28 | ifneq ($(CONFIG_SND_OMAP_SOC_MCBSP),) | 28 | ifneq ($(CONFIG_SND_OMAP_SOC_MCBSP),) |
29 | obj-y += mcbsp.o | 29 | obj-y += mcbsp.o |
diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index 19f1652e94cf..8d972ff18c56 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c | |||
@@ -131,6 +131,24 @@ DT_MACHINE_START(OMAP3_GP_DT, "Generic OMAP3-GP (Flattened Device Tree)") | |||
131 | .dt_compat = omap3_gp_boards_compat, | 131 | .dt_compat = omap3_gp_boards_compat, |
132 | .restart = omap3xxx_restart, | 132 | .restart = omap3xxx_restart, |
133 | MACHINE_END | 133 | MACHINE_END |
134 | |||
135 | static const char *am3517_boards_compat[] __initdata = { | ||
136 | "ti,am3517", | ||
137 | NULL, | ||
138 | }; | ||
139 | |||
140 | DT_MACHINE_START(AM3517_DT, "Generic AM3517 (Flattened Device Tree)") | ||
141 | .reserve = omap_reserve, | ||
142 | .map_io = omap3_map_io, | ||
143 | .init_early = am35xx_init_early, | ||
144 | .init_irq = omap_intc_of_init, | ||
145 | .handle_irq = omap3_intc_handle_irq, | ||
146 | .init_machine = omap_generic_init, | ||
147 | .init_late = omap3_init_late, | ||
148 | .init_time = omap3_gptimer_timer_init, | ||
149 | .dt_compat = am3517_boards_compat, | ||
150 | .restart = omap3xxx_restart, | ||
151 | MACHINE_END | ||
134 | #endif | 152 | #endif |
135 | 153 | ||
136 | #ifdef CONFIG_SOC_AM33XX | 154 | #ifdef CONFIG_SOC_AM33XX |
diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c index 4ec8d82b0492..44a59c3abfb0 100644 --- a/arch/arm/mach-omap2/board-ldp.c +++ b/arch/arm/mach-omap2/board-ldp.c | |||
@@ -242,12 +242,18 @@ static void __init ldp_display_init(void) | |||
242 | 242 | ||
243 | static int ldp_twl_gpio_setup(struct device *dev, unsigned gpio, unsigned ngpio) | 243 | static int ldp_twl_gpio_setup(struct device *dev, unsigned gpio, unsigned ngpio) |
244 | { | 244 | { |
245 | int res; | ||
246 | |||
245 | /* LCD enable GPIO */ | 247 | /* LCD enable GPIO */ |
246 | ldp_lcd_pdata.enable_gpio = gpio + 7; | 248 | ldp_lcd_pdata.enable_gpio = gpio + 7; |
247 | 249 | ||
248 | /* Backlight enable GPIO */ | 250 | /* Backlight enable GPIO */ |
249 | ldp_lcd_pdata.backlight_gpio = gpio + 15; | 251 | ldp_lcd_pdata.backlight_gpio = gpio + 15; |
250 | 252 | ||
253 | res = platform_device_register(&ldp_lcd_device); | ||
254 | if (res) | ||
255 | pr_err("Unable to register LCD: %d\n", res); | ||
256 | |||
251 | return 0; | 257 | return 0; |
252 | } | 258 | } |
253 | 259 | ||
@@ -346,7 +352,6 @@ static struct omap2_hsmmc_info mmc[] __initdata = { | |||
346 | 352 | ||
347 | static struct platform_device *ldp_devices[] __initdata = { | 353 | static struct platform_device *ldp_devices[] __initdata = { |
348 | &ldp_gpio_keys_device, | 354 | &ldp_gpio_keys_device, |
349 | &ldp_lcd_device, | ||
350 | }; | 355 | }; |
351 | 356 | ||
352 | #ifdef CONFIG_OMAP_MUX | 357 | #ifdef CONFIG_OMAP_MUX |
diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h index f7644febee81..e30ef6797c63 100644 --- a/arch/arm/mach-omap2/common.h +++ b/arch/arm/mach-omap2/common.h | |||
@@ -299,7 +299,6 @@ struct omap_sdrc_params; | |||
299 | extern void omap_sdrc_init(struct omap_sdrc_params *sdrc_cs0, | 299 | extern void omap_sdrc_init(struct omap_sdrc_params *sdrc_cs0, |
300 | struct omap_sdrc_params *sdrc_cs1); | 300 | struct omap_sdrc_params *sdrc_cs1); |
301 | struct omap2_hsmmc_info; | 301 | struct omap2_hsmmc_info; |
302 | extern int omap4_twl6030_hsmmc_init(struct omap2_hsmmc_info *controllers); | ||
303 | extern void omap_reserve(void); | 302 | extern void omap_reserve(void); |
304 | 303 | ||
305 | struct omap_hwmod; | 304 | struct omap_hwmod; |
diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c index a4e536b11ec9..4cf165502b35 100644 --- a/arch/arm/mach-omap2/display.c +++ b/arch/arm/mach-omap2/display.c | |||
@@ -32,7 +32,6 @@ | |||
32 | 32 | ||
33 | #include "soc.h" | 33 | #include "soc.h" |
34 | #include "iomap.h" | 34 | #include "iomap.h" |
35 | #include "mux.h" | ||
36 | #include "control.h" | 35 | #include "control.h" |
37 | #include "display.h" | 36 | #include "display.h" |
38 | #include "prm.h" | 37 | #include "prm.h" |
@@ -102,35 +101,6 @@ static const struct omap_dss_hwmod_data omap4_dss_hwmod_data[] __initconst = { | |||
102 | { "dss_hdmi", "omapdss_hdmi", -1 }, | 101 | { "dss_hdmi", "omapdss_hdmi", -1 }, |
103 | }; | 102 | }; |
104 | 103 | ||
105 | static void __init omap4_tpd12s015_mux_pads(void) | ||
106 | { | ||
107 | omap_mux_init_signal("hdmi_cec", | ||
108 | OMAP_PIN_INPUT_PULLUP); | ||
109 | omap_mux_init_signal("hdmi_ddc_scl", | ||
110 | OMAP_PIN_INPUT_PULLUP); | ||
111 | omap_mux_init_signal("hdmi_ddc_sda", | ||
112 | OMAP_PIN_INPUT_PULLUP); | ||
113 | } | ||
114 | |||
115 | static void __init omap4_hdmi_mux_pads(enum omap_hdmi_flags flags) | ||
116 | { | ||
117 | u32 reg; | ||
118 | u16 control_i2c_1; | ||
119 | |||
120 | /* | ||
121 | * CONTROL_I2C_1: HDMI_DDC_SDA_PULLUPRESX (bit 28) and | ||
122 | * HDMI_DDC_SCL_PULLUPRESX (bit 24) are set to disable | ||
123 | * internal pull up resistor. | ||
124 | */ | ||
125 | if (flags & OMAP_HDMI_SDA_SCL_EXTERNAL_PULLUP) { | ||
126 | control_i2c_1 = OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_I2C_1; | ||
127 | reg = omap4_ctrl_pad_readl(control_i2c_1); | ||
128 | reg |= (OMAP4_HDMI_DDC_SDA_PULLUPRESX_MASK | | ||
129 | OMAP4_HDMI_DDC_SCL_PULLUPRESX_MASK); | ||
130 | omap4_ctrl_pad_writel(reg, control_i2c_1); | ||
131 | } | ||
132 | } | ||
133 | |||
134 | static int omap4_dsi_mux_pads(int dsi_id, unsigned lanes) | 104 | static int omap4_dsi_mux_pads(int dsi_id, unsigned lanes) |
135 | { | 105 | { |
136 | u32 enable_mask, enable_shift; | 106 | u32 enable_mask, enable_shift; |
@@ -164,16 +134,6 @@ static int omap4_dsi_mux_pads(int dsi_id, unsigned lanes) | |||
164 | return 0; | 134 | return 0; |
165 | } | 135 | } |
166 | 136 | ||
167 | int __init omap_hdmi_init(enum omap_hdmi_flags flags) | ||
168 | { | ||
169 | if (cpu_is_omap44xx()) { | ||
170 | omap4_hdmi_mux_pads(flags); | ||
171 | omap4_tpd12s015_mux_pads(); | ||
172 | } | ||
173 | |||
174 | return 0; | ||
175 | } | ||
176 | |||
177 | static int omap_dsi_enable_pads(int dsi_id, unsigned lane_mask) | 137 | static int omap_dsi_enable_pads(int dsi_id, unsigned lane_mask) |
178 | { | 138 | { |
179 | if (cpu_is_omap44xx()) | 139 | if (cpu_is_omap44xx()) |
diff --git a/arch/arm/mach-omap2/dss-common.c b/arch/arm/mach-omap2/dss-common.c index 365bfd3d9c68..dadccc91488c 100644 --- a/arch/arm/mach-omap2/dss-common.c +++ b/arch/arm/mach-omap2/dss-common.c | |||
@@ -223,7 +223,7 @@ void __init omap_4430sdp_display_init_of(void) | |||
223 | static struct connector_dvi_platform_data omap3_igep2_dvi_connector_pdata = { | 223 | static struct connector_dvi_platform_data omap3_igep2_dvi_connector_pdata = { |
224 | .name = "dvi", | 224 | .name = "dvi", |
225 | .source = "tfp410.0", | 225 | .source = "tfp410.0", |
226 | .i2c_bus_num = 3, | 226 | .i2c_bus_num = 2, |
227 | }; | 227 | }; |
228 | 228 | ||
229 | static struct platform_device omap3_igep2_dvi_connector_device = { | 229 | static struct platform_device omap3_igep2_dvi_connector_device = { |
diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c index 81de56251955..d24926e6340f 100644 --- a/arch/arm/mach-omap2/gpmc.c +++ b/arch/arm/mach-omap2/gpmc.c | |||
@@ -1502,6 +1502,22 @@ static int gpmc_probe_generic_child(struct platform_device *pdev, | |||
1502 | } | 1502 | } |
1503 | 1503 | ||
1504 | /* | 1504 | /* |
1505 | * For some GPMC devices we still need to rely on the bootloader | ||
1506 | * timings because the devices can be connected via FPGA. So far | ||
1507 | * the list is smc91x on the omap2 SDP boards, and 8250 on zooms. | ||
1508 | * REVISIT: Add timing support from slls644g.pdf and from the | ||
1509 | * lan91c96 manual. | ||
1510 | */ | ||
1511 | if (of_device_is_compatible(child, "ns16550a") || | ||
1512 | of_device_is_compatible(child, "smsc,lan91c94") || | ||
1513 | of_device_is_compatible(child, "smsc,lan91c111")) { | ||
1514 | dev_warn(&pdev->dev, | ||
1515 | "%s using bootloader timings on CS%d\n", | ||
1516 | child->name, cs); | ||
1517 | goto no_timings; | ||
1518 | } | ||
1519 | |||
1520 | /* | ||
1505 | * FIXME: gpmc_cs_request() will map the CS to an arbitary | 1521 | * FIXME: gpmc_cs_request() will map the CS to an arbitary |
1506 | * location in the gpmc address space. When booting with | 1522 | * location in the gpmc address space. When booting with |
1507 | * device-tree we want the NOR flash to be mapped to the | 1523 | * device-tree we want the NOR flash to be mapped to the |
@@ -1529,6 +1545,7 @@ static int gpmc_probe_generic_child(struct platform_device *pdev, | |||
1529 | gpmc_read_timings_dt(child, &gpmc_t); | 1545 | gpmc_read_timings_dt(child, &gpmc_t); |
1530 | gpmc_cs_set_timings(cs, &gpmc_t); | 1546 | gpmc_cs_set_timings(cs, &gpmc_t); |
1531 | 1547 | ||
1548 | no_timings: | ||
1532 | if (of_platform_device_create(child, NULL, &pdev->dev)) | 1549 | if (of_platform_device_create(child, NULL, &pdev->dev)) |
1533 | return 0; | 1550 | return 0; |
1534 | 1551 | ||
@@ -1541,42 +1558,6 @@ err: | |||
1541 | return ret; | 1558 | return ret; |
1542 | } | 1559 | } |
1543 | 1560 | ||
1544 | /* | ||
1545 | * REVISIT: Add timing support from slls644g.pdf | ||
1546 | */ | ||
1547 | static int gpmc_probe_8250(struct platform_device *pdev, | ||
1548 | struct device_node *child) | ||
1549 | { | ||
1550 | struct resource res; | ||
1551 | unsigned long base; | ||
1552 | int ret, cs; | ||
1553 | |||
1554 | if (of_property_read_u32(child, "reg", &cs) < 0) { | ||
1555 | dev_err(&pdev->dev, "%s has no 'reg' property\n", | ||
1556 | child->full_name); | ||
1557 | return -ENODEV; | ||
1558 | } | ||
1559 | |||
1560 | if (of_address_to_resource(child, 0, &res) < 0) { | ||
1561 | dev_err(&pdev->dev, "%s has malformed 'reg' property\n", | ||
1562 | child->full_name); | ||
1563 | return -ENODEV; | ||
1564 | } | ||
1565 | |||
1566 | ret = gpmc_cs_request(cs, resource_size(&res), &base); | ||
1567 | if (ret < 0) { | ||
1568 | dev_err(&pdev->dev, "cannot request GPMC CS %d\n", cs); | ||
1569 | return ret; | ||
1570 | } | ||
1571 | |||
1572 | if (of_platform_device_create(child, NULL, &pdev->dev)) | ||
1573 | return 0; | ||
1574 | |||
1575 | dev_err(&pdev->dev, "failed to create gpmc child %s\n", child->name); | ||
1576 | |||
1577 | return -ENODEV; | ||
1578 | } | ||
1579 | |||
1580 | static int gpmc_probe_dt(struct platform_device *pdev) | 1561 | static int gpmc_probe_dt(struct platform_device *pdev) |
1581 | { | 1562 | { |
1582 | int ret; | 1563 | int ret; |
@@ -1618,10 +1599,9 @@ static int gpmc_probe_dt(struct platform_device *pdev) | |||
1618 | else if (of_node_cmp(child->name, "onenand") == 0) | 1599 | else if (of_node_cmp(child->name, "onenand") == 0) |
1619 | ret = gpmc_probe_onenand_child(pdev, child); | 1600 | ret = gpmc_probe_onenand_child(pdev, child); |
1620 | else if (of_node_cmp(child->name, "ethernet") == 0 || | 1601 | else if (of_node_cmp(child->name, "ethernet") == 0 || |
1621 | of_node_cmp(child->name, "nor") == 0) | 1602 | of_node_cmp(child->name, "nor") == 0 || |
1603 | of_node_cmp(child->name, "uart") == 0) | ||
1622 | ret = gpmc_probe_generic_child(pdev, child); | 1604 | ret = gpmc_probe_generic_child(pdev, child); |
1623 | else if (of_node_cmp(child->name, "8250") == 0) | ||
1624 | ret = gpmc_probe_8250(pdev, child); | ||
1625 | 1605 | ||
1626 | if (WARN(ret < 0, "%s: probing gpmc child %s failed\n", | 1606 | if (WARN(ret < 0, "%s: probing gpmc child %s failed\n", |
1627 | __func__, child->full_name)) | 1607 | __func__, child->full_name)) |
diff --git a/arch/arm/mach-omap2/omap-secure.h b/arch/arm/mach-omap2/omap-secure.h index 8cc7d331437d..3e97c6c8ecf1 100644 --- a/arch/arm/mach-omap2/omap-secure.h +++ b/arch/arm/mach-omap2/omap-secure.h | |||
@@ -76,6 +76,13 @@ static inline void omap_barrier_reserve_memblock(void) | |||
76 | { } | 76 | { } |
77 | #endif | 77 | #endif |
78 | 78 | ||
79 | #ifdef CONFIG_SOC_HAS_REALTIME_COUNTER | ||
79 | void set_cntfreq(void); | 80 | void set_cntfreq(void); |
81 | #else | ||
82 | static inline void set_cntfreq(void) | ||
83 | { | ||
84 | } | ||
85 | #endif | ||
86 | |||
80 | #endif /* __ASSEMBLER__ */ | 87 | #endif /* __ASSEMBLER__ */ |
81 | #endif /* OMAP_ARCH_OMAP_SECURE_H */ | 88 | #endif /* OMAP_ARCH_OMAP_SECURE_H */ |
diff --git a/arch/arm/mach-omap2/omap4-common.c b/arch/arm/mach-omap2/omap4-common.c index 57911430324e..c0ab9b26be3d 100644 --- a/arch/arm/mach-omap2/omap4-common.c +++ b/arch/arm/mach-omap2/omap4-common.c | |||
@@ -35,7 +35,6 @@ | |||
35 | #include "iomap.h" | 35 | #include "iomap.h" |
36 | #include "common.h" | 36 | #include "common.h" |
37 | #include "mmc.h" | 37 | #include "mmc.h" |
38 | #include "hsmmc.h" | ||
39 | #include "prminst44xx.h" | 38 | #include "prminst44xx.h" |
40 | #include "prcm_mpu44xx.h" | 39 | #include "prcm_mpu44xx.h" |
41 | #include "omap4-sar-layout.h" | 40 | #include "omap4-sar-layout.h" |
@@ -163,6 +162,7 @@ void __iomem *omap4_get_l2cache_base(void) | |||
163 | 162 | ||
164 | static void omap4_l2x0_disable(void) | 163 | static void omap4_l2x0_disable(void) |
165 | { | 164 | { |
165 | outer_flush_all(); | ||
166 | /* Disable PL310 L2 Cache controller */ | 166 | /* Disable PL310 L2 Cache controller */ |
167 | omap_smc1(0x102, 0x0); | 167 | omap_smc1(0x102, 0x0); |
168 | } | 168 | } |
@@ -284,59 +284,3 @@ skip_errata_init: | |||
284 | omap_wakeupgen_init(); | 284 | omap_wakeupgen_init(); |
285 | irqchip_init(); | 285 | irqchip_init(); |
286 | } | 286 | } |
287 | |||
288 | #if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE) | ||
289 | static int omap4_twl6030_hsmmc_late_init(struct device *dev) | ||
290 | { | ||
291 | int irq = 0; | ||
292 | struct platform_device *pdev = container_of(dev, | ||
293 | struct platform_device, dev); | ||
294 | struct omap_mmc_platform_data *pdata = dev->platform_data; | ||
295 | |||
296 | /* Setting MMC1 Card detect Irq */ | ||
297 | if (pdev->id == 0) { | ||
298 | irq = twl6030_mmc_card_detect_config(); | ||
299 | if (irq < 0) { | ||
300 | dev_err(dev, "%s: Error card detect config(%d)\n", | ||
301 | __func__, irq); | ||
302 | return irq; | ||
303 | } | ||
304 | pdata->slots[0].card_detect_irq = irq; | ||
305 | pdata->slots[0].card_detect = twl6030_mmc_card_detect; | ||
306 | } | ||
307 | return 0; | ||
308 | } | ||
309 | |||
310 | static __init void omap4_twl6030_hsmmc_set_late_init(struct device *dev) | ||
311 | { | ||
312 | struct omap_mmc_platform_data *pdata; | ||
313 | |||
314 | /* dev can be null if CONFIG_MMC_OMAP_HS is not set */ | ||
315 | if (!dev) { | ||
316 | pr_err("Failed %s\n", __func__); | ||
317 | return; | ||
318 | } | ||
319 | pdata = dev->platform_data; | ||
320 | pdata->init = omap4_twl6030_hsmmc_late_init; | ||
321 | } | ||
322 | |||
323 | int __init omap4_twl6030_hsmmc_init(struct omap2_hsmmc_info *controllers) | ||
324 | { | ||
325 | struct omap2_hsmmc_info *c; | ||
326 | |||
327 | omap_hsmmc_init(controllers); | ||
328 | for (c = controllers; c->mmc; c++) { | ||
329 | /* pdev can be null if CONFIG_MMC_OMAP_HS is not set */ | ||
330 | if (!c->pdev) | ||
331 | continue; | ||
332 | omap4_twl6030_hsmmc_set_late_init(&c->pdev->dev); | ||
333 | } | ||
334 | |||
335 | return 0; | ||
336 | } | ||
337 | #else | ||
338 | int __init omap4_twl6030_hsmmc_init(struct omap2_hsmmc_info *controllers) | ||
339 | { | ||
340 | return 0; | ||
341 | } | ||
342 | #endif | ||
diff --git a/arch/arm/mach-omap2/omap_device.c b/arch/arm/mach-omap2/omap_device.c index 53f0735817bb..e0a398cf28d8 100644 --- a/arch/arm/mach-omap2/omap_device.c +++ b/arch/arm/mach-omap2/omap_device.c | |||
@@ -183,6 +183,10 @@ static int omap_device_build_from_dt(struct platform_device *pdev) | |||
183 | odbfd_exit1: | 183 | odbfd_exit1: |
184 | kfree(hwmods); | 184 | kfree(hwmods); |
185 | odbfd_exit: | 185 | odbfd_exit: |
186 | /* if data/we are at fault.. load up a fail handler */ | ||
187 | if (ret) | ||
188 | pdev->dev.pm_domain = &omap_device_fail_pm_domain; | ||
189 | |||
186 | return ret; | 190 | return ret; |
187 | } | 191 | } |
188 | 192 | ||
@@ -604,6 +608,19 @@ static int _od_runtime_resume(struct device *dev) | |||
604 | 608 | ||
605 | return pm_generic_runtime_resume(dev); | 609 | return pm_generic_runtime_resume(dev); |
606 | } | 610 | } |
611 | |||
612 | static int _od_fail_runtime_suspend(struct device *dev) | ||
613 | { | ||
614 | dev_warn(dev, "%s: FIXME: missing hwmod/omap_dev info\n", __func__); | ||
615 | return -ENODEV; | ||
616 | } | ||
617 | |||
618 | static int _od_fail_runtime_resume(struct device *dev) | ||
619 | { | ||
620 | dev_warn(dev, "%s: FIXME: missing hwmod/omap_dev info\n", __func__); | ||
621 | return -ENODEV; | ||
622 | } | ||
623 | |||
607 | #endif | 624 | #endif |
608 | 625 | ||
609 | #ifdef CONFIG_SUSPEND | 626 | #ifdef CONFIG_SUSPEND |
@@ -657,6 +674,13 @@ static int _od_resume_noirq(struct device *dev) | |||
657 | #define _od_resume_noirq NULL | 674 | #define _od_resume_noirq NULL |
658 | #endif | 675 | #endif |
659 | 676 | ||
677 | struct dev_pm_domain omap_device_fail_pm_domain = { | ||
678 | .ops = { | ||
679 | SET_RUNTIME_PM_OPS(_od_fail_runtime_suspend, | ||
680 | _od_fail_runtime_resume, NULL) | ||
681 | } | ||
682 | }; | ||
683 | |||
660 | struct dev_pm_domain omap_device_pm_domain = { | 684 | struct dev_pm_domain omap_device_pm_domain = { |
661 | .ops = { | 685 | .ops = { |
662 | SET_RUNTIME_PM_OPS(_od_runtime_suspend, _od_runtime_resume, | 686 | SET_RUNTIME_PM_OPS(_od_runtime_suspend, _od_runtime_resume, |
diff --git a/arch/arm/mach-omap2/omap_device.h b/arch/arm/mach-omap2/omap_device.h index 17ca1aec2710..78c02b355179 100644 --- a/arch/arm/mach-omap2/omap_device.h +++ b/arch/arm/mach-omap2/omap_device.h | |||
@@ -29,6 +29,7 @@ | |||
29 | #include "omap_hwmod.h" | 29 | #include "omap_hwmod.h" |
30 | 30 | ||
31 | extern struct dev_pm_domain omap_device_pm_domain; | 31 | extern struct dev_pm_domain omap_device_pm_domain; |
32 | extern struct dev_pm_domain omap_device_fail_pm_domain; | ||
32 | 33 | ||
33 | /* omap_device._state values */ | 34 | /* omap_device._state values */ |
34 | #define OMAP_DEVICE_STATE_UNKNOWN 0 | 35 | #define OMAP_DEVICE_STATE_UNKNOWN 0 |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index e3f0ecaf87dd..f7a6fd35b1e4 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
@@ -399,7 +399,7 @@ static int _set_clockactivity(struct omap_hwmod *oh, u8 clockact, u32 *v) | |||
399 | } | 399 | } |
400 | 400 | ||
401 | /** | 401 | /** |
402 | * _set_softreset: set OCP_SYSCONFIG.CLOCKACTIVITY bits in @v | 402 | * _set_softreset: set OCP_SYSCONFIG.SOFTRESET bit in @v |
403 | * @oh: struct omap_hwmod * | 403 | * @oh: struct omap_hwmod * |
404 | * @v: pointer to register contents to modify | 404 | * @v: pointer to register contents to modify |
405 | * | 405 | * |
@@ -427,6 +427,36 @@ static int _set_softreset(struct omap_hwmod *oh, u32 *v) | |||
427 | } | 427 | } |
428 | 428 | ||
429 | /** | 429 | /** |
430 | * _clear_softreset: clear OCP_SYSCONFIG.SOFTRESET bit in @v | ||
431 | * @oh: struct omap_hwmod * | ||
432 | * @v: pointer to register contents to modify | ||
433 | * | ||
434 | * Clear the SOFTRESET bit in @v for hwmod @oh. Returns -EINVAL upon | ||
435 | * error or 0 upon success. | ||
436 | */ | ||
437 | static int _clear_softreset(struct omap_hwmod *oh, u32 *v) | ||
438 | { | ||
439 | u32 softrst_mask; | ||
440 | |||
441 | if (!oh->class->sysc || | ||
442 | !(oh->class->sysc->sysc_flags & SYSC_HAS_SOFTRESET)) | ||
443 | return -EINVAL; | ||
444 | |||
445 | if (!oh->class->sysc->sysc_fields) { | ||
446 | WARN(1, | ||
447 | "omap_hwmod: %s: sysc_fields absent for sysconfig class\n", | ||
448 | oh->name); | ||
449 | return -EINVAL; | ||
450 | } | ||
451 | |||
452 | softrst_mask = (0x1 << oh->class->sysc->sysc_fields->srst_shift); | ||
453 | |||
454 | *v &= ~softrst_mask; | ||
455 | |||
456 | return 0; | ||
457 | } | ||
458 | |||
459 | /** | ||
430 | * _wait_softreset_complete - wait for an OCP softreset to complete | 460 | * _wait_softreset_complete - wait for an OCP softreset to complete |
431 | * @oh: struct omap_hwmod * to wait on | 461 | * @oh: struct omap_hwmod * to wait on |
432 | * | 462 | * |
@@ -785,6 +815,7 @@ static int _init_interface_clks(struct omap_hwmod *oh) | |||
785 | pr_warning("omap_hwmod: %s: cannot clk_get interface_clk %s\n", | 815 | pr_warning("omap_hwmod: %s: cannot clk_get interface_clk %s\n", |
786 | oh->name, os->clk); | 816 | oh->name, os->clk); |
787 | ret = -EINVAL; | 817 | ret = -EINVAL; |
818 | continue; | ||
788 | } | 819 | } |
789 | os->_clk = c; | 820 | os->_clk = c; |
790 | /* | 821 | /* |
@@ -821,6 +852,7 @@ static int _init_opt_clks(struct omap_hwmod *oh) | |||
821 | pr_warning("omap_hwmod: %s: cannot clk_get opt_clk %s\n", | 852 | pr_warning("omap_hwmod: %s: cannot clk_get opt_clk %s\n", |
822 | oh->name, oc->clk); | 853 | oh->name, oc->clk); |
823 | ret = -EINVAL; | 854 | ret = -EINVAL; |
855 | continue; | ||
824 | } | 856 | } |
825 | oc->_clk = c; | 857 | oc->_clk = c; |
826 | /* | 858 | /* |
@@ -1911,6 +1943,12 @@ static int _ocp_softreset(struct omap_hwmod *oh) | |||
1911 | ret = _set_softreset(oh, &v); | 1943 | ret = _set_softreset(oh, &v); |
1912 | if (ret) | 1944 | if (ret) |
1913 | goto dis_opt_clks; | 1945 | goto dis_opt_clks; |
1946 | |||
1947 | _write_sysconfig(v, oh); | ||
1948 | ret = _clear_softreset(oh, &v); | ||
1949 | if (ret) | ||
1950 | goto dis_opt_clks; | ||
1951 | |||
1914 | _write_sysconfig(v, oh); | 1952 | _write_sysconfig(v, oh); |
1915 | 1953 | ||
1916 | if (oh->class->sysc->srst_udelay) | 1954 | if (oh->class->sysc->srst_udelay) |
@@ -2326,38 +2364,80 @@ static int _shutdown(struct omap_hwmod *oh) | |||
2326 | return 0; | 2364 | return 0; |
2327 | } | 2365 | } |
2328 | 2366 | ||
2367 | static int of_dev_find_hwmod(struct device_node *np, | ||
2368 | struct omap_hwmod *oh) | ||
2369 | { | ||
2370 | int count, i, res; | ||
2371 | const char *p; | ||
2372 | |||
2373 | count = of_property_count_strings(np, "ti,hwmods"); | ||
2374 | if (count < 1) | ||
2375 | return -ENODEV; | ||
2376 | |||
2377 | for (i = 0; i < count; i++) { | ||
2378 | res = of_property_read_string_index(np, "ti,hwmods", | ||
2379 | i, &p); | ||
2380 | if (res) | ||
2381 | continue; | ||
2382 | if (!strcmp(p, oh->name)) { | ||
2383 | pr_debug("omap_hwmod: dt %s[%i] uses hwmod %s\n", | ||
2384 | np->name, i, oh->name); | ||
2385 | return i; | ||
2386 | } | ||
2387 | } | ||
2388 | |||
2389 | return -ENODEV; | ||
2390 | } | ||
2391 | |||
2329 | /** | 2392 | /** |
2330 | * of_dev_hwmod_lookup - look up needed hwmod from dt blob | 2393 | * of_dev_hwmod_lookup - look up needed hwmod from dt blob |
2331 | * @np: struct device_node * | 2394 | * @np: struct device_node * |
2332 | * @oh: struct omap_hwmod * | 2395 | * @oh: struct omap_hwmod * |
2396 | * @index: index of the entry found | ||
2397 | * @found: struct device_node * found or NULL | ||
2333 | * | 2398 | * |
2334 | * Parse the dt blob and find out needed hwmod. Recursive function is | 2399 | * Parse the dt blob and find out needed hwmod. Recursive function is |
2335 | * implemented to take care hierarchical dt blob parsing. | 2400 | * implemented to take care hierarchical dt blob parsing. |
2336 | * Return: The device node on success or NULL on failure. | 2401 | * Return: Returns 0 on success, -ENODEV when not found. |
2337 | */ | 2402 | */ |
2338 | static struct device_node *of_dev_hwmod_lookup(struct device_node *np, | 2403 | static int of_dev_hwmod_lookup(struct device_node *np, |
2339 | struct omap_hwmod *oh) | 2404 | struct omap_hwmod *oh, |
2405 | int *index, | ||
2406 | struct device_node **found) | ||
2340 | { | 2407 | { |
2341 | struct device_node *np0 = NULL, *np1 = NULL; | 2408 | struct device_node *np0 = NULL; |
2342 | const char *p; | 2409 | int res; |
2410 | |||
2411 | res = of_dev_find_hwmod(np, oh); | ||
2412 | if (res >= 0) { | ||
2413 | *found = np; | ||
2414 | *index = res; | ||
2415 | return 0; | ||
2416 | } | ||
2343 | 2417 | ||
2344 | for_each_child_of_node(np, np0) { | 2418 | for_each_child_of_node(np, np0) { |
2345 | if (of_find_property(np0, "ti,hwmods", NULL)) { | 2419 | struct device_node *fc; |
2346 | p = of_get_property(np0, "ti,hwmods", NULL); | 2420 | int i; |
2347 | if (!strcmp(p, oh->name)) | 2421 | |
2348 | return np0; | 2422 | res = of_dev_hwmod_lookup(np0, oh, &i, &fc); |
2349 | np1 = of_dev_hwmod_lookup(np0, oh); | 2423 | if (res == 0) { |
2350 | if (np1) | 2424 | *found = fc; |
2351 | return np1; | 2425 | *index = i; |
2426 | return 0; | ||
2352 | } | 2427 | } |
2353 | } | 2428 | } |
2354 | return NULL; | 2429 | |
2430 | *found = NULL; | ||
2431 | *index = 0; | ||
2432 | |||
2433 | return -ENODEV; | ||
2355 | } | 2434 | } |
2356 | 2435 | ||
2357 | /** | 2436 | /** |
2358 | * _init_mpu_rt_base - populate the virtual address for a hwmod | 2437 | * _init_mpu_rt_base - populate the virtual address for a hwmod |
2359 | * @oh: struct omap_hwmod * to locate the virtual address | 2438 | * @oh: struct omap_hwmod * to locate the virtual address |
2360 | * @data: (unused, caller should pass NULL) | 2439 | * @data: (unused, caller should pass NULL) |
2440 | * @index: index of the reg entry iospace in device tree | ||
2361 | * @np: struct device_node * of the IP block's device node in the DT data | 2441 | * @np: struct device_node * of the IP block's device node in the DT data |
2362 | * | 2442 | * |
2363 | * Cache the virtual address used by the MPU to access this IP block's | 2443 | * Cache the virtual address used by the MPU to access this IP block's |
@@ -2368,7 +2448,7 @@ static struct device_node *of_dev_hwmod_lookup(struct device_node *np, | |||
2368 | * -ENXIO on absent or invalid register target address space. | 2448 | * -ENXIO on absent or invalid register target address space. |
2369 | */ | 2449 | */ |
2370 | static int __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data, | 2450 | static int __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data, |
2371 | struct device_node *np) | 2451 | int index, struct device_node *np) |
2372 | { | 2452 | { |
2373 | struct omap_hwmod_addr_space *mem; | 2453 | struct omap_hwmod_addr_space *mem; |
2374 | void __iomem *va_start = NULL; | 2454 | void __iomem *va_start = NULL; |
@@ -2390,13 +2470,17 @@ static int __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data, | |||
2390 | if (!np) | 2470 | if (!np) |
2391 | return -ENXIO; | 2471 | return -ENXIO; |
2392 | 2472 | ||
2393 | va_start = of_iomap(np, oh->mpu_rt_idx); | 2473 | va_start = of_iomap(np, index + oh->mpu_rt_idx); |
2394 | } else { | 2474 | } else { |
2395 | va_start = ioremap(mem->pa_start, mem->pa_end - mem->pa_start); | 2475 | va_start = ioremap(mem->pa_start, mem->pa_end - mem->pa_start); |
2396 | } | 2476 | } |
2397 | 2477 | ||
2398 | if (!va_start) { | 2478 | if (!va_start) { |
2399 | pr_err("omap_hwmod: %s: Could not ioremap\n", oh->name); | 2479 | if (mem) |
2480 | pr_err("omap_hwmod: %s: Could not ioremap\n", oh->name); | ||
2481 | else | ||
2482 | pr_err("omap_hwmod: %s: Missing dt reg%i for %s\n", | ||
2483 | oh->name, index, np->full_name); | ||
2400 | return -ENXIO; | 2484 | return -ENXIO; |
2401 | } | 2485 | } |
2402 | 2486 | ||
@@ -2422,17 +2506,29 @@ static int __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data, | |||
2422 | */ | 2506 | */ |
2423 | static int __init _init(struct omap_hwmod *oh, void *data) | 2507 | static int __init _init(struct omap_hwmod *oh, void *data) |
2424 | { | 2508 | { |
2425 | int r; | 2509 | int r, index; |
2426 | struct device_node *np = NULL; | 2510 | struct device_node *np = NULL; |
2427 | 2511 | ||
2428 | if (oh->_state != _HWMOD_STATE_REGISTERED) | 2512 | if (oh->_state != _HWMOD_STATE_REGISTERED) |
2429 | return 0; | 2513 | return 0; |
2430 | 2514 | ||
2431 | if (of_have_populated_dt()) | 2515 | if (of_have_populated_dt()) { |
2432 | np = of_dev_hwmod_lookup(of_find_node_by_name(NULL, "ocp"), oh); | 2516 | struct device_node *bus; |
2517 | |||
2518 | bus = of_find_node_by_name(NULL, "ocp"); | ||
2519 | if (!bus) | ||
2520 | return -ENODEV; | ||
2521 | |||
2522 | r = of_dev_hwmod_lookup(bus, oh, &index, &np); | ||
2523 | if (r) | ||
2524 | pr_debug("omap_hwmod: %s missing dt data\n", oh->name); | ||
2525 | else if (np && index) | ||
2526 | pr_warn("omap_hwmod: %s using broken dt data from %s\n", | ||
2527 | oh->name, np->name); | ||
2528 | } | ||
2433 | 2529 | ||
2434 | if (oh->class->sysc) { | 2530 | if (oh->class->sysc) { |
2435 | r = _init_mpu_rt_base(oh, NULL, np); | 2531 | r = _init_mpu_rt_base(oh, NULL, index, np); |
2436 | if (r < 0) { | 2532 | if (r < 0) { |
2437 | WARN(1, "omap_hwmod: %s: doesn't have mpu register target base\n", | 2533 | WARN(1, "omap_hwmod: %s: doesn't have mpu register target base\n", |
2438 | oh->name); | 2534 | oh->name); |
@@ -2695,9 +2791,7 @@ static int __init _alloc_links(struct omap_hwmod_link **ml, | |||
2695 | sz = sizeof(struct omap_hwmod_link) * LINKS_PER_OCP_IF; | 2791 | sz = sizeof(struct omap_hwmod_link) * LINKS_PER_OCP_IF; |
2696 | 2792 | ||
2697 | *sl = NULL; | 2793 | *sl = NULL; |
2698 | *ml = alloc_bootmem(sz); | 2794 | *ml = memblock_virt_alloc(sz, 0); |
2699 | |||
2700 | memset(*ml, 0, sz); | ||
2701 | 2795 | ||
2702 | *sl = (void *)(*ml) + sizeof(struct omap_hwmod_link); | 2796 | *sl = (void *)(*ml) + sizeof(struct omap_hwmod_link); |
2703 | 2797 | ||
@@ -2816,9 +2910,7 @@ static int __init _alloc_linkspace(struct omap_hwmod_ocp_if **ois) | |||
2816 | pr_debug("omap_hwmod: %s: allocating %d byte linkspace (%d links)\n", | 2910 | pr_debug("omap_hwmod: %s: allocating %d byte linkspace (%d links)\n", |
2817 | __func__, sz, max_ls); | 2911 | __func__, sz, max_ls); |
2818 | 2912 | ||
2819 | linkspace = alloc_bootmem(sz); | 2913 | linkspace = memblock_virt_alloc(sz, 0); |
2820 | |||
2821 | memset(linkspace, 0, sz); | ||
2822 | 2914 | ||
2823 | return 0; | 2915 | return 0; |
2824 | } | 2916 | } |
@@ -3169,6 +3261,11 @@ int omap_hwmod_softreset(struct omap_hwmod *oh) | |||
3169 | goto error; | 3261 | goto error; |
3170 | _write_sysconfig(v, oh); | 3262 | _write_sysconfig(v, oh); |
3171 | 3263 | ||
3264 | ret = _clear_softreset(oh, &v); | ||
3265 | if (ret) | ||
3266 | goto error; | ||
3267 | _write_sysconfig(v, oh); | ||
3268 | |||
3172 | error: | 3269 | error: |
3173 | return ret; | 3270 | return ret; |
3174 | } | 3271 | } |
diff --git a/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c b/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c index 56cebb05509e..d23c77fadb31 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c | |||
@@ -796,7 +796,7 @@ struct omap_hwmod omap2xxx_counter_32k_hwmod = { | |||
796 | 796 | ||
797 | /* gpmc */ | 797 | /* gpmc */ |
798 | static struct omap_hwmod_irq_info omap2xxx_gpmc_irqs[] = { | 798 | static struct omap_hwmod_irq_info omap2xxx_gpmc_irqs[] = { |
799 | { .irq = 20 }, | 799 | { .irq = 20 + OMAP_INTC_START, }, |
800 | { .irq = -1 } | 800 | { .irq = -1 } |
801 | }; | 801 | }; |
802 | 802 | ||
@@ -841,7 +841,7 @@ static struct omap_hwmod_class omap2_rng_hwmod_class = { | |||
841 | }; | 841 | }; |
842 | 842 | ||
843 | static struct omap_hwmod_irq_info omap2_rng_mpu_irqs[] = { | 843 | static struct omap_hwmod_irq_info omap2_rng_mpu_irqs[] = { |
844 | { .irq = 52 }, | 844 | { .irq = 52 + OMAP_INTC_START, }, |
845 | { .irq = -1 } | 845 | { .irq = -1 } |
846 | }; | 846 | }; |
847 | 847 | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index 9e56fabd7fa3..4c3b1e6df508 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | |||
@@ -1943,7 +1943,8 @@ static struct omap_hwmod_class_sysconfig omap3xxx_usb_host_hs_sysc = { | |||
1943 | .syss_offs = 0x0014, | 1943 | .syss_offs = 0x0014, |
1944 | .sysc_flags = (SYSC_HAS_MIDLEMODE | SYSC_HAS_CLOCKACTIVITY | | 1944 | .sysc_flags = (SYSC_HAS_MIDLEMODE | SYSC_HAS_CLOCKACTIVITY | |
1945 | SYSC_HAS_SIDLEMODE | SYSC_HAS_ENAWAKEUP | | 1945 | SYSC_HAS_SIDLEMODE | SYSC_HAS_ENAWAKEUP | |
1946 | SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE), | 1946 | SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE | |
1947 | SYSS_HAS_RESET_STATUS), | ||
1947 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | | 1948 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | |
1948 | MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART), | 1949 | MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART), |
1949 | .sysc_fields = &omap_hwmod_sysc_type1, | 1950 | .sysc_fields = &omap_hwmod_sysc_type1, |
@@ -2021,15 +2022,7 @@ static struct omap_hwmod omap3xxx_usb_host_hs_hwmod = { | |||
2021 | * hence HWMOD_SWSUP_MSTANDBY | 2022 | * hence HWMOD_SWSUP_MSTANDBY |
2022 | */ | 2023 | */ |
2023 | 2024 | ||
2024 | /* | 2025 | .flags = HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY, |
2025 | * During system boot; If the hwmod framework resets the module | ||
2026 | * the module will have smart idle settings; which can lead to deadlock | ||
2027 | * (above Errata Id:i660); so, dont reset the module during boot; | ||
2028 | * Use HWMOD_INIT_NO_RESET. | ||
2029 | */ | ||
2030 | |||
2031 | .flags = HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY | | ||
2032 | HWMOD_INIT_NO_RESET, | ||
2033 | }; | 2026 | }; |
2034 | 2027 | ||
2035 | /* | 2028 | /* |
@@ -2172,7 +2165,7 @@ static struct omap_hwmod_class omap3xxx_gpmc_hwmod_class = { | |||
2172 | }; | 2165 | }; |
2173 | 2166 | ||
2174 | static struct omap_hwmod_irq_info omap3xxx_gpmc_irqs[] = { | 2167 | static struct omap_hwmod_irq_info omap3xxx_gpmc_irqs[] = { |
2175 | { .irq = 20 }, | 2168 | { .irq = 20 + OMAP_INTC_START, }, |
2176 | { .irq = -1 } | 2169 | { .irq = -1 } |
2177 | }; | 2170 | }; |
2178 | 2171 | ||
@@ -3006,7 +2999,7 @@ static struct omap_mmu_dev_attr mmu_isp_dev_attr = { | |||
3006 | 2999 | ||
3007 | static struct omap_hwmod omap3xxx_mmu_isp_hwmod; | 3000 | static struct omap_hwmod omap3xxx_mmu_isp_hwmod; |
3008 | static struct omap_hwmod_irq_info omap3xxx_mmu_isp_irqs[] = { | 3001 | static struct omap_hwmod_irq_info omap3xxx_mmu_isp_irqs[] = { |
3009 | { .irq = 24 }, | 3002 | { .irq = 24 + OMAP_INTC_START, }, |
3010 | { .irq = -1 } | 3003 | { .irq = -1 } |
3011 | }; | 3004 | }; |
3012 | 3005 | ||
@@ -3048,7 +3041,7 @@ static struct omap_mmu_dev_attr mmu_iva_dev_attr = { | |||
3048 | 3041 | ||
3049 | static struct omap_hwmod omap3xxx_mmu_iva_hwmod; | 3042 | static struct omap_hwmod omap3xxx_mmu_iva_hwmod; |
3050 | static struct omap_hwmod_irq_info omap3xxx_mmu_iva_irqs[] = { | 3043 | static struct omap_hwmod_irq_info omap3xxx_mmu_iva_irqs[] = { |
3051 | { .irq = 28 }, | 3044 | { .irq = 28 + OMAP_INTC_START, }, |
3052 | { .irq = -1 } | 3045 | { .irq = -1 } |
3053 | }; | 3046 | }; |
3054 | 3047 | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index 1e5b12cb8246..3318cae96e7d 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c | |||
@@ -2937,7 +2937,7 @@ static struct omap_hwmod_class_sysconfig omap44xx_usb_host_hs_sysc = { | |||
2937 | .sysc_offs = 0x0010, | 2937 | .sysc_offs = 0x0010, |
2938 | .syss_offs = 0x0014, | 2938 | .syss_offs = 0x0014, |
2939 | .sysc_flags = (SYSC_HAS_MIDLEMODE | SYSC_HAS_SIDLEMODE | | 2939 | .sysc_flags = (SYSC_HAS_MIDLEMODE | SYSC_HAS_SIDLEMODE | |
2940 | SYSC_HAS_SOFTRESET), | 2940 | SYSC_HAS_SOFTRESET | SYSC_HAS_RESET_STATUS), |
2941 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | | 2941 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | |
2942 | SIDLE_SMART_WKUP | MSTANDBY_FORCE | MSTANDBY_NO | | 2942 | SIDLE_SMART_WKUP | MSTANDBY_FORCE | MSTANDBY_NO | |
2943 | MSTANDBY_SMART | MSTANDBY_SMART_WKUP), | 2943 | MSTANDBY_SMART | MSTANDBY_SMART_WKUP), |
@@ -3001,15 +3001,7 @@ static struct omap_hwmod omap44xx_usb_host_hs_hwmod = { | |||
3001 | * hence HWMOD_SWSUP_MSTANDBY | 3001 | * hence HWMOD_SWSUP_MSTANDBY |
3002 | */ | 3002 | */ |
3003 | 3003 | ||
3004 | /* | 3004 | .flags = HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY, |
3005 | * During system boot; If the hwmod framework resets the module | ||
3006 | * the module will have smart idle settings; which can lead to deadlock | ||
3007 | * (above Errata Id:i660); so, dont reset the module during boot; | ||
3008 | * Use HWMOD_INIT_NO_RESET. | ||
3009 | */ | ||
3010 | |||
3011 | .flags = HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY | | ||
3012 | HWMOD_INIT_NO_RESET, | ||
3013 | }; | 3005 | }; |
3014 | 3006 | ||
3015 | /* | 3007 | /* |
diff --git a/arch/arm/mach-omap2/omap_hwmod_54xx_data.c b/arch/arm/mach-omap2/omap_hwmod_54xx_data.c index 9e08d6994a0b..e297d6231c3a 100644 --- a/arch/arm/mach-omap2/omap_hwmod_54xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_54xx_data.c | |||
@@ -1544,7 +1544,8 @@ static struct omap_hwmod_class_sysconfig omap54xx_usb_host_hs_sysc = { | |||
1544 | .rev_offs = 0x0000, | 1544 | .rev_offs = 0x0000, |
1545 | .sysc_offs = 0x0010, | 1545 | .sysc_offs = 0x0010, |
1546 | .sysc_flags = (SYSC_HAS_MIDLEMODE | SYSC_HAS_RESET_STATUS | | 1546 | .sysc_flags = (SYSC_HAS_MIDLEMODE | SYSC_HAS_RESET_STATUS | |
1547 | SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET), | 1547 | SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET | |
1548 | SYSC_HAS_RESET_STATUS), | ||
1548 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | | 1549 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | |
1549 | SIDLE_SMART_WKUP | MSTANDBY_FORCE | MSTANDBY_NO | | 1550 | SIDLE_SMART_WKUP | MSTANDBY_FORCE | MSTANDBY_NO | |
1550 | MSTANDBY_SMART | MSTANDBY_SMART_WKUP), | 1551 | MSTANDBY_SMART | MSTANDBY_SMART_WKUP), |
@@ -1598,15 +1599,7 @@ static struct omap_hwmod omap54xx_usb_host_hs_hwmod = { | |||
1598 | * hence HWMOD_SWSUP_MSTANDBY | 1599 | * hence HWMOD_SWSUP_MSTANDBY |
1599 | */ | 1600 | */ |
1600 | 1601 | ||
1601 | /* | 1602 | .flags = HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY, |
1602 | * During system boot; If the hwmod framework resets the module | ||
1603 | * the module will have smart idle settings; which can lead to deadlock | ||
1604 | * (above Errata Id:i660); so, dont reset the module during boot; | ||
1605 | * Use HWMOD_INIT_NO_RESET. | ||
1606 | */ | ||
1607 | |||
1608 | .flags = HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY | | ||
1609 | HWMOD_INIT_NO_RESET, | ||
1610 | .main_clk = "l3init_60m_fclk", | 1603 | .main_clk = "l3init_60m_fclk", |
1611 | .prcm = { | 1604 | .prcm = { |
1612 | .omap4 = { | 1605 | .omap4 = { |
diff --git a/arch/arm/mach-omap2/omap_hwmod_7xx_data.c b/arch/arm/mach-omap2/omap_hwmod_7xx_data.c index db32d5380b11..18f333c440db 100644 --- a/arch/arm/mach-omap2/omap_hwmod_7xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_7xx_data.c | |||
@@ -1637,7 +1637,7 @@ static struct omap_hwmod dra7xx_uart1_hwmod = { | |||
1637 | .class = &dra7xx_uart_hwmod_class, | 1637 | .class = &dra7xx_uart_hwmod_class, |
1638 | .clkdm_name = "l4per_clkdm", | 1638 | .clkdm_name = "l4per_clkdm", |
1639 | .main_clk = "uart1_gfclk_mux", | 1639 | .main_clk = "uart1_gfclk_mux", |
1640 | .flags = HWMOD_SWSUP_SIDLE_ACT, | 1640 | .flags = HWMOD_SWSUP_SIDLE_ACT | DEBUG_OMAP2UART1_FLAGS, |
1641 | .prcm = { | 1641 | .prcm = { |
1642 | .omap4 = { | 1642 | .omap4 = { |
1643 | .clkctrl_offs = DRA7XX_CM_L4PER_UART1_CLKCTRL_OFFSET, | 1643 | .clkctrl_offs = DRA7XX_CM_L4PER_UART1_CLKCTRL_OFFSET, |
diff --git a/arch/arm/mach-omap2/pdata-quirks.c b/arch/arm/mach-omap2/pdata-quirks.c index 10c71450cf63..39f020c982e8 100644 --- a/arch/arm/mach-omap2/pdata-quirks.c +++ b/arch/arm/mach-omap2/pdata-quirks.c | |||
@@ -139,6 +139,7 @@ struct of_dev_auxdata omap_auxdata_lookup[] __initdata = { | |||
139 | 139 | ||
140 | static struct pdata_init pdata_quirks[] __initdata = { | 140 | static struct pdata_init pdata_quirks[] __initdata = { |
141 | #ifdef CONFIG_ARCH_OMAP3 | 141 | #ifdef CONFIG_ARCH_OMAP3 |
142 | { "nokia,omap3-n900", hsmmc2_internal_input_clk, }, | ||
142 | { "nokia,omap3-n9", hsmmc2_internal_input_clk, }, | 143 | { "nokia,omap3-n9", hsmmc2_internal_input_clk, }, |
143 | { "nokia,omap3-n950", hsmmc2_internal_input_clk, }, | 144 | { "nokia,omap3-n950", hsmmc2_internal_input_clk, }, |
144 | { "isee,omap3-igep0020", omap3_igep0020_legacy_init, }, | 145 | { "isee,omap3-igep0020", omap3_igep0020_legacy_init, }, |
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 93b80e5da8d4..1f3770a8a728 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
@@ -120,7 +120,7 @@ static void omap3_save_secure_ram_context(void) | |||
120 | * will hang the system. | 120 | * will hang the system. |
121 | */ | 121 | */ |
122 | pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_ON); | 122 | pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_ON); |
123 | ret = _omap_save_secure_sram((u32 *) | 123 | ret = _omap_save_secure_sram((u32 *)(unsigned long) |
124 | __pa(omap3_secure_ram_storage)); | 124 | __pa(omap3_secure_ram_storage)); |
125 | pwrdm_set_next_pwrst(mpu_pwrdm, mpu_next_state); | 125 | pwrdm_set_next_pwrst(mpu_pwrdm, mpu_next_state); |
126 | /* Following is for error tracking, it should not happen */ | 126 | /* Following is for error tracking, it should not happen */ |
diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c index e233dfcbc186..93a2a6e4260f 100644 --- a/arch/arm/mach-omap2/powerdomain.c +++ b/arch/arm/mach-omap2/powerdomain.c | |||
@@ -128,7 +128,8 @@ skip_voltdm: | |||
128 | for (i = 0; i < pwrdm->banks; i++) | 128 | for (i = 0; i < pwrdm->banks; i++) |
129 | pwrdm->ret_mem_off_counter[i] = 0; | 129 | pwrdm->ret_mem_off_counter[i] = 0; |
130 | 130 | ||
131 | arch_pwrdm->pwrdm_wait_transition(pwrdm); | 131 | if (arch_pwrdm && arch_pwrdm->pwrdm_wait_transition) |
132 | arch_pwrdm->pwrdm_wait_transition(pwrdm); | ||
132 | pwrdm->state = pwrdm_read_pwrst(pwrdm); | 133 | pwrdm->state = pwrdm_read_pwrst(pwrdm); |
133 | pwrdm->state_counter[pwrdm->state] = 1; | 134 | pwrdm->state_counter[pwrdm->state] = 1; |
134 | 135 | ||
diff --git a/arch/arm/mach-omap2/prm44xx_54xx.h b/arch/arm/mach-omap2/prm44xx_54xx.h index 7a976065e138..8d95aa543ef5 100644 --- a/arch/arm/mach-omap2/prm44xx_54xx.h +++ b/arch/arm/mach-omap2/prm44xx_54xx.h | |||
@@ -43,7 +43,7 @@ extern void omap4_prm_vcvp_write(u32 val, u8 offset); | |||
43 | extern u32 omap4_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset); | 43 | extern u32 omap4_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset); |
44 | 44 | ||
45 | #if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) || \ | 45 | #if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) || \ |
46 | defined(CONFIG_SOC_DRA7XX) | 46 | defined(CONFIG_SOC_DRA7XX) || defined(CONFIG_SOC_AM43XX) |
47 | void omap44xx_prm_reconfigure_io_chain(void); | 47 | void omap44xx_prm_reconfigure_io_chain(void); |
48 | #else | 48 | #else |
49 | static inline void omap44xx_prm_reconfigure_io_chain(void) | 49 | static inline void omap44xx_prm_reconfigure_io_chain(void) |
diff --git a/arch/arm/mach-pxa/include/mach/lubbock.h b/arch/arm/mach-pxa/include/mach/lubbock.h index 2a086e8373eb..958cd6af9384 100644 --- a/arch/arm/mach-pxa/include/mach/lubbock.h +++ b/arch/arm/mach-pxa/include/mach/lubbock.h | |||
@@ -10,6 +10,8 @@ | |||
10 | * published by the Free Software Foundation. | 10 | * published by the Free Software Foundation. |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <mach/irqs.h> | ||
14 | |||
13 | #define LUBBOCK_ETH_PHYS PXA_CS3_PHYS | 15 | #define LUBBOCK_ETH_PHYS PXA_CS3_PHYS |
14 | 16 | ||
15 | #define LUBBOCK_FPGA_PHYS PXA_CS2_PHYS | 17 | #define LUBBOCK_FPGA_PHYS PXA_CS2_PHYS |
diff --git a/arch/arm/mach-pxa/reset.c b/arch/arm/mach-pxa/reset.c index 0d5dd646f61f..263b15249b5b 100644 --- a/arch/arm/mach-pxa/reset.c +++ b/arch/arm/mach-pxa/reset.c | |||
@@ -13,6 +13,7 @@ | |||
13 | 13 | ||
14 | #include <mach/regs-ost.h> | 14 | #include <mach/regs-ost.h> |
15 | #include <mach/reset.h> | 15 | #include <mach/reset.h> |
16 | #include <mach/smemc.h> | ||
16 | 17 | ||
17 | unsigned int reset_status; | 18 | unsigned int reset_status; |
18 | EXPORT_SYMBOL(reset_status); | 19 | EXPORT_SYMBOL(reset_status); |
@@ -81,6 +82,12 @@ static void do_hw_reset(void) | |||
81 | writel_relaxed(OSSR_M3, OSSR); | 82 | writel_relaxed(OSSR_M3, OSSR); |
82 | /* ... in 100 ms */ | 83 | /* ... in 100 ms */ |
83 | writel_relaxed(readl_relaxed(OSCR) + 368640, OSMR3); | 84 | writel_relaxed(readl_relaxed(OSCR) + 368640, OSMR3); |
85 | /* | ||
86 | * SDRAM hangs on watchdog reset on Marvell PXA270 (erratum 71) | ||
87 | * we put SDRAM into self-refresh to prevent that | ||
88 | */ | ||
89 | while (1) | ||
90 | writel_relaxed(MDREFR_SLFRSH, MDREFR); | ||
84 | } | 91 | } |
85 | 92 | ||
86 | void pxa_restart(enum reboot_mode mode, const char *cmd) | 93 | void pxa_restart(enum reboot_mode mode, const char *cmd) |
@@ -104,4 +111,3 @@ void pxa_restart(enum reboot_mode mode, const char *cmd) | |||
104 | break; | 111 | break; |
105 | } | 112 | } |
106 | } | 113 | } |
107 | |||
diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c index 0206b915a6f6..ef5557b807ed 100644 --- a/arch/arm/mach-pxa/tosa.c +++ b/arch/arm/mach-pxa/tosa.c | |||
@@ -425,57 +425,57 @@ static struct platform_device tosa_power_device = { | |||
425 | * Tosa Keyboard | 425 | * Tosa Keyboard |
426 | */ | 426 | */ |
427 | static const uint32_t tosakbd_keymap[] = { | 427 | static const uint32_t tosakbd_keymap[] = { |
428 | KEY(0, 2, KEY_W), | 428 | KEY(0, 1, KEY_W), |
429 | KEY(0, 6, KEY_K), | 429 | KEY(0, 5, KEY_K), |
430 | KEY(0, 7, KEY_BACKSPACE), | 430 | KEY(0, 6, KEY_BACKSPACE), |
431 | KEY(0, 8, KEY_P), | 431 | KEY(0, 7, KEY_P), |
432 | KEY(1, 1, KEY_Q), | 432 | KEY(1, 0, KEY_Q), |
433 | KEY(1, 2, KEY_E), | 433 | KEY(1, 1, KEY_E), |
434 | KEY(1, 3, KEY_T), | 434 | KEY(1, 2, KEY_T), |
435 | KEY(1, 4, KEY_Y), | 435 | KEY(1, 3, KEY_Y), |
436 | KEY(1, 6, KEY_O), | 436 | KEY(1, 5, KEY_O), |
437 | KEY(1, 7, KEY_I), | 437 | KEY(1, 6, KEY_I), |
438 | KEY(1, 8, KEY_COMMA), | 438 | KEY(1, 7, KEY_COMMA), |
439 | KEY(2, 1, KEY_A), | 439 | KEY(2, 0, KEY_A), |
440 | KEY(2, 2, KEY_D), | 440 | KEY(2, 1, KEY_D), |
441 | KEY(2, 3, KEY_G), | 441 | KEY(2, 2, KEY_G), |
442 | KEY(2, 4, KEY_U), | 442 | KEY(2, 3, KEY_U), |
443 | KEY(2, 6, KEY_L), | 443 | KEY(2, 5, KEY_L), |
444 | KEY(2, 7, KEY_ENTER), | 444 | KEY(2, 6, KEY_ENTER), |
445 | KEY(2, 8, KEY_DOT), | 445 | KEY(2, 7, KEY_DOT), |
446 | KEY(3, 1, KEY_Z), | 446 | KEY(3, 0, KEY_Z), |
447 | KEY(3, 2, KEY_C), | 447 | KEY(3, 1, KEY_C), |
448 | KEY(3, 3, KEY_V), | 448 | KEY(3, 2, KEY_V), |
449 | KEY(3, 4, KEY_J), | 449 | KEY(3, 3, KEY_J), |
450 | KEY(3, 5, TOSA_KEY_ADDRESSBOOK), | 450 | KEY(3, 4, TOSA_KEY_ADDRESSBOOK), |
451 | KEY(3, 6, TOSA_KEY_CANCEL), | 451 | KEY(3, 5, TOSA_KEY_CANCEL), |
452 | KEY(3, 7, TOSA_KEY_CENTER), | 452 | KEY(3, 6, TOSA_KEY_CENTER), |
453 | KEY(3, 8, TOSA_KEY_OK), | 453 | KEY(3, 7, TOSA_KEY_OK), |
454 | KEY(3, 9, KEY_LEFTSHIFT), | 454 | KEY(3, 8, KEY_LEFTSHIFT), |
455 | KEY(4, 1, KEY_S), | 455 | KEY(4, 0, KEY_S), |
456 | KEY(4, 2, KEY_R), | 456 | KEY(4, 1, KEY_R), |
457 | KEY(4, 3, KEY_B), | 457 | KEY(4, 2, KEY_B), |
458 | KEY(4, 4, KEY_N), | 458 | KEY(4, 3, KEY_N), |
459 | KEY(4, 5, TOSA_KEY_CALENDAR), | 459 | KEY(4, 4, TOSA_KEY_CALENDAR), |
460 | KEY(4, 6, TOSA_KEY_HOMEPAGE), | 460 | KEY(4, 5, TOSA_KEY_HOMEPAGE), |
461 | KEY(4, 7, KEY_LEFTCTRL), | 461 | KEY(4, 6, KEY_LEFTCTRL), |
462 | KEY(4, 8, TOSA_KEY_LIGHT), | 462 | KEY(4, 7, TOSA_KEY_LIGHT), |
463 | KEY(4, 10, KEY_RIGHTSHIFT), | 463 | KEY(4, 9, KEY_RIGHTSHIFT), |
464 | KEY(5, 1, KEY_TAB), | 464 | KEY(5, 0, KEY_TAB), |
465 | KEY(5, 2, KEY_SLASH), | 465 | KEY(5, 1, KEY_SLASH), |
466 | KEY(5, 3, KEY_H), | 466 | KEY(5, 2, KEY_H), |
467 | KEY(5, 4, KEY_M), | 467 | KEY(5, 3, KEY_M), |
468 | KEY(5, 5, TOSA_KEY_MENU), | 468 | KEY(5, 4, TOSA_KEY_MENU), |
469 | KEY(5, 7, KEY_UP), | 469 | KEY(5, 6, KEY_UP), |
470 | KEY(5, 11, TOSA_KEY_FN), | 470 | KEY(5, 10, TOSA_KEY_FN), |
471 | KEY(6, 1, KEY_X), | 471 | KEY(6, 0, KEY_X), |
472 | KEY(6, 2, KEY_F), | 472 | KEY(6, 1, KEY_F), |
473 | KEY(6, 3, KEY_SPACE), | 473 | KEY(6, 2, KEY_SPACE), |
474 | KEY(6, 4, KEY_APOSTROPHE), | 474 | KEY(6, 3, KEY_APOSTROPHE), |
475 | KEY(6, 5, TOSA_KEY_MAIL), | 475 | KEY(6, 4, TOSA_KEY_MAIL), |
476 | KEY(6, 6, KEY_LEFT), | 476 | KEY(6, 5, KEY_LEFT), |
477 | KEY(6, 7, KEY_DOWN), | 477 | KEY(6, 6, KEY_DOWN), |
478 | KEY(6, 8, KEY_RIGHT), | 478 | KEY(6, 7, KEY_RIGHT), |
479 | }; | 479 | }; |
480 | 480 | ||
481 | static struct matrix_keymap_data tosakbd_keymap_data = { | 481 | static struct matrix_keymap_data tosakbd_keymap_data = { |
diff --git a/arch/arm/mach-s3c24xx/Kconfig b/arch/arm/mach-s3c24xx/Kconfig index 8f1d327e0cd1..d876431d64c0 100644 --- a/arch/arm/mach-s3c24xx/Kconfig +++ b/arch/arm/mach-s3c24xx/Kconfig | |||
@@ -180,27 +180,6 @@ config CPU_LLSERIAL_S3C2440 | |||
180 | Selected if there is an S3C2440 (or register compatible) serial | 180 | Selected if there is an S3C2440 (or register compatible) serial |
181 | low-level implementation needed | 181 | low-level implementation needed |
182 | 182 | ||
183 | # gpio configurations | ||
184 | |||
185 | config S3C24XX_GPIO_EXTRA | ||
186 | int | ||
187 | default 128 if S3C24XX_GPIO_EXTRA128 | ||
188 | default 64 if S3C24XX_GPIO_EXTRA64 | ||
189 | default 16 if ARCH_H1940 | ||
190 | default 0 | ||
191 | |||
192 | config S3C24XX_GPIO_EXTRA64 | ||
193 | bool | ||
194 | help | ||
195 | Add an extra 64 gpio numbers to the available GPIO pool. This is | ||
196 | available for boards that need extra gpios for external devices. | ||
197 | |||
198 | config S3C24XX_GPIO_EXTRA128 | ||
199 | bool | ||
200 | help | ||
201 | Add an extra 128 gpio numbers to the available GPIO pool. This is | ||
202 | available for boards that need extra gpios for external devices. | ||
203 | |||
204 | config S3C24XX_PLL | 183 | config S3C24XX_PLL |
205 | bool "Support CPUfreq changing of PLL frequency (EXPERIMENTAL)" | 184 | bool "Support CPUfreq changing of PLL frequency (EXPERIMENTAL)" |
206 | depends on ARM_S3C24XX_CPUFREQ | 185 | depends on ARM_S3C24XX_CPUFREQ |
diff --git a/arch/arm/mach-s3c24xx/common-smdk.c b/arch/arm/mach-s3c24xx/common-smdk.c index 404444dd3840..e9fbcc91c5c0 100644 --- a/arch/arm/mach-s3c24xx/common-smdk.c +++ b/arch/arm/mach-s3c24xx/common-smdk.c | |||
@@ -37,8 +37,8 @@ | |||
37 | #include <asm/irq.h> | 37 | #include <asm/irq.h> |
38 | 38 | ||
39 | #include <mach/regs-gpio.h> | 39 | #include <mach/regs-gpio.h> |
40 | #include <mach/gpio-samsung.h> | ||
40 | #include <linux/platform_data/leds-s3c24xx.h> | 41 | #include <linux/platform_data/leds-s3c24xx.h> |
41 | |||
42 | #include <linux/platform_data/mtd-nand-s3c2410.h> | 42 | #include <linux/platform_data/mtd-nand-s3c2410.h> |
43 | 43 | ||
44 | #include <plat/gpio-cfg.h> | 44 | #include <plat/gpio-cfg.h> |
diff --git a/arch/arm/mach-s3c24xx/h1940-bluetooth.c b/arch/arm/mach-s3c24xx/h1940-bluetooth.c index 5b98bfd1df43..b4d14b864367 100644 --- a/arch/arm/mach-s3c24xx/h1940-bluetooth.c +++ b/arch/arm/mach-s3c24xx/h1940-bluetooth.c | |||
@@ -19,8 +19,10 @@ | |||
19 | #include <linux/gpio.h> | 19 | #include <linux/gpio.h> |
20 | #include <linux/rfkill.h> | 20 | #include <linux/rfkill.h> |
21 | 21 | ||
22 | #include <plat/gpio-cfg.h> | ||
22 | #include <mach/hardware.h> | 23 | #include <mach/hardware.h> |
23 | #include <mach/regs-gpio.h> | 24 | #include <mach/regs-gpio.h> |
25 | #include <mach/gpio-samsung.h> | ||
24 | 26 | ||
25 | #include "h1940.h" | 27 | #include "h1940.h" |
26 | 28 | ||
diff --git a/arch/arm/mach-s3c24xx/include/mach/gpio.h b/arch/arm/mach-s3c24xx/include/mach/gpio-samsung.h index 14591563ca70..528fcdc4f63e 100644 --- a/arch/arm/mach-s3c24xx/include/mach/gpio.h +++ b/arch/arm/mach-s3c24xx/include/mach/gpio-samsung.h | |||
@@ -14,16 +14,8 @@ | |||
14 | * devices that need GPIO. | 14 | * devices that need GPIO. |
15 | */ | 15 | */ |
16 | 16 | ||
17 | #ifndef __MACH_GPIO_H | 17 | #ifndef GPIO_SAMSUNG_S3C24XX_H |
18 | #define __MACH_GPIO_H __FILE__ | 18 | #define GPIO_SAMSUNG_S3C24XX_H |
19 | |||
20 | #ifdef CONFIG_CPU_S3C244X | ||
21 | #define ARCH_NR_GPIOS (32 * 9 + CONFIG_S3C24XX_GPIO_EXTRA) | ||
22 | #elif defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2416) | ||
23 | #define ARCH_NR_GPIOS (32 * 12 + CONFIG_S3C24XX_GPIO_EXTRA) | ||
24 | #else | ||
25 | #define ARCH_NR_GPIOS (256 + CONFIG_S3C24XX_GPIO_EXTRA) | ||
26 | #endif | ||
27 | 19 | ||
28 | /* | 20 | /* |
29 | * GPIO sizes for various SoCs: | 21 | * GPIO sizes for various SoCs: |
@@ -31,17 +23,17 @@ | |||
31 | * 2410 2412 2440 2443 2416 | 23 | * 2410 2412 2440 2443 2416 |
32 | * 2442 | 24 | * 2442 |
33 | * ---- ---- ---- ---- ---- | 25 | * ---- ---- ---- ---- ---- |
34 | * A 23 22 25 16 25 | 26 | * A 23 22 25 16 27 |
35 | * B 11 11 11 11 9 | 27 | * B 11 11 11 11 11 |
36 | * C 16 15 16 16 16 | 28 | * C 16 16 16 16 16 |
37 | * D 16 16 16 16 16 | 29 | * D 16 16 16 16 16 |
38 | * E 16 16 16 16 16 | 30 | * E 16 16 16 16 16 |
39 | * F 8 8 8 8 8 | 31 | * F 8 8 8 8 8 |
40 | * G 16 16 16 16 8 | 32 | * G 16 16 16 16 8 |
41 | * H 11 11 9 15 15 | 33 | * H 11 11 11 15 15 |
42 | * J -- -- 13 16 -- | 34 | * J -- -- 13 16 -- |
43 | * K -- -- -- -- 16 | 35 | * K -- -- -- -- 16 |
44 | * L -- -- -- 15 7 | 36 | * L -- -- -- 15 14 |
45 | * M -- -- -- 2 2 | 37 | * M -- -- -- 2 2 |
46 | */ | 38 | */ |
47 | 39 | ||
@@ -101,8 +93,6 @@ enum s3c_gpio_number { | |||
101 | #define S3C2410_GPL(_nr) (S3C2410_GPIO_L_START + (_nr)) | 93 | #define S3C2410_GPL(_nr) (S3C2410_GPIO_L_START + (_nr)) |
102 | #define S3C2410_GPM(_nr) (S3C2410_GPIO_M_START + (_nr)) | 94 | #define S3C2410_GPM(_nr) (S3C2410_GPIO_M_START + (_nr)) |
103 | 95 | ||
104 | #include <plat/gpio-cfg.h> | ||
105 | |||
106 | #ifdef CONFIG_CPU_S3C244X | 96 | #ifdef CONFIG_CPU_S3C244X |
107 | #define S3C_GPIO_END (S3C2410_GPJ(0) + 32) | 97 | #define S3C_GPIO_END (S3C2410_GPJ(0) + 32) |
108 | #elif defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2416) | 98 | #elif defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2416) |
@@ -111,4 +101,4 @@ enum s3c_gpio_number { | |||
111 | #define S3C_GPIO_END (S3C2410_GPH(0) + 32) | 101 | #define S3C_GPIO_END (S3C2410_GPH(0) + 32) |
112 | #endif | 102 | #endif |
113 | 103 | ||
114 | #endif /* __MACH_GPIO_H */ | 104 | #endif /* GPIO_SAMSUNG_S3C24XX_H */ |
diff --git a/arch/arm/mach-s3c24xx/mach-amlm5900.c b/arch/arm/mach-s3c24xx/mach-amlm5900.c index e27b5c91b3db..284ea1f44205 100644 --- a/arch/arm/mach-s3c24xx/mach-amlm5900.c +++ b/arch/arm/mach-s3c24xx/mach-amlm5900.c | |||
@@ -52,6 +52,7 @@ | |||
52 | #include <plat/regs-serial.h> | 52 | #include <plat/regs-serial.h> |
53 | #include <mach/regs-lcd.h> | 53 | #include <mach/regs-lcd.h> |
54 | #include <mach/regs-gpio.h> | 54 | #include <mach/regs-gpio.h> |
55 | #include <mach/gpio-samsung.h> | ||
55 | 56 | ||
56 | #include <linux/platform_data/i2c-s3c2410.h> | 57 | #include <linux/platform_data/i2c-s3c2410.h> |
57 | #include <plat/devs.h> | 58 | #include <plat/devs.h> |
diff --git a/arch/arm/mach-s3c24xx/mach-anubis.c b/arch/arm/mach-s3c24xx/mach-anubis.c index c1fb6c37867f..2a16f8fb3584 100644 --- a/arch/arm/mach-s3c24xx/mach-anubis.c +++ b/arch/arm/mach-s3c24xx/mach-anubis.c | |||
@@ -35,6 +35,7 @@ | |||
35 | #include <plat/regs-serial.h> | 35 | #include <plat/regs-serial.h> |
36 | #include <mach/regs-gpio.h> | 36 | #include <mach/regs-gpio.h> |
37 | #include <mach/regs-lcd.h> | 37 | #include <mach/regs-lcd.h> |
38 | #include <mach/gpio-samsung.h> | ||
38 | #include <linux/platform_data/mtd-nand-s3c2410.h> | 39 | #include <linux/platform_data/mtd-nand-s3c2410.h> |
39 | #include <linux/platform_data/i2c-s3c2410.h> | 40 | #include <linux/platform_data/i2c-s3c2410.h> |
40 | 41 | ||
diff --git a/arch/arm/mach-s3c24xx/mach-at2440evb.c b/arch/arm/mach-s3c24xx/mach-at2440evb.c index 6dfeeb7ef469..6beab674c147 100644 --- a/arch/arm/mach-s3c24xx/mach-at2440evb.c +++ b/arch/arm/mach-s3c24xx/mach-at2440evb.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include <plat/regs-serial.h> | 36 | #include <plat/regs-serial.h> |
37 | #include <mach/regs-gpio.h> | 37 | #include <mach/regs-gpio.h> |
38 | #include <mach/regs-lcd.h> | 38 | #include <mach/regs-lcd.h> |
39 | #include <mach/gpio-samsung.h> | ||
39 | #include <linux/platform_data/mtd-nand-s3c2410.h> | 40 | #include <linux/platform_data/mtd-nand-s3c2410.h> |
40 | #include <linux/platform_data/i2c-s3c2410.h> | 41 | #include <linux/platform_data/i2c-s3c2410.h> |
41 | 42 | ||
diff --git a/arch/arm/mach-s3c24xx/mach-bast.c b/arch/arm/mach-s3c24xx/mach-bast.c index 22d6ae926d91..981ba1eb9fdc 100644 --- a/arch/arm/mach-s3c24xx/mach-bast.c +++ b/arch/arm/mach-s3c24xx/mach-bast.c | |||
@@ -48,6 +48,7 @@ | |||
48 | #include <mach/hardware.h> | 48 | #include <mach/hardware.h> |
49 | #include <mach/regs-gpio.h> | 49 | #include <mach/regs-gpio.h> |
50 | #include <mach/regs-lcd.h> | 50 | #include <mach/regs-lcd.h> |
51 | #include <mach/gpio-samsung.h> | ||
51 | 52 | ||
52 | #include <plat/clock.h> | 53 | #include <plat/clock.h> |
53 | #include <plat/cpu.h> | 54 | #include <plat/cpu.h> |
diff --git a/arch/arm/mach-s3c24xx/mach-gta02.c b/arch/arm/mach-s3c24xx/mach-gta02.c index 13d8d073675a..d9170e9f8ccd 100644 --- a/arch/arm/mach-s3c24xx/mach-gta02.c +++ b/arch/arm/mach-s3c24xx/mach-gta02.c | |||
@@ -75,6 +75,7 @@ | |||
75 | #include <mach/hardware.h> | 75 | #include <mach/hardware.h> |
76 | #include <mach/regs-gpio.h> | 76 | #include <mach/regs-gpio.h> |
77 | #include <mach/regs-irq.h> | 77 | #include <mach/regs-irq.h> |
78 | #include <mach/gpio-samsung.h> | ||
78 | 79 | ||
79 | #include <plat/cpu.h> | 80 | #include <plat/cpu.h> |
80 | #include <plat/devs.h> | 81 | #include <plat/devs.h> |
diff --git a/arch/arm/mach-s3c24xx/mach-h1940.c b/arch/arm/mach-s3c24xx/mach-h1940.c index 952b6a040d1f..de0832181d8c 100644 --- a/arch/arm/mach-s3c24xx/mach-h1940.c +++ b/arch/arm/mach-s3c24xx/mach-h1940.c | |||
@@ -54,6 +54,7 @@ | |||
54 | #include <mach/regs-clock.h> | 54 | #include <mach/regs-clock.h> |
55 | #include <mach/regs-gpio.h> | 55 | #include <mach/regs-gpio.h> |
56 | #include <mach/regs-lcd.h> | 56 | #include <mach/regs-lcd.h> |
57 | #include <mach/gpio-samsung.h> | ||
57 | 58 | ||
58 | #include <plat/clock.h> | 59 | #include <plat/clock.h> |
59 | #include <plat/cpu.h> | 60 | #include <plat/cpu.h> |
diff --git a/arch/arm/mach-s3c24xx/mach-jive.c b/arch/arm/mach-s3c24xx/mach-jive.c index 43c23e220f5b..67cb8e948b7e 100644 --- a/arch/arm/mach-s3c24xx/mach-jive.c +++ b/arch/arm/mach-s3c24xx/mach-jive.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <mach/regs-gpio.h> | 38 | #include <mach/regs-gpio.h> |
39 | #include <mach/regs-lcd.h> | 39 | #include <mach/regs-lcd.h> |
40 | #include <mach/fb.h> | 40 | #include <mach/fb.h> |
41 | #include <mach/gpio-samsung.h> | ||
41 | 42 | ||
42 | #include <asm/mach-types.h> | 43 | #include <asm/mach-types.h> |
43 | 44 | ||
diff --git a/arch/arm/mach-s3c24xx/mach-mini2440.c b/arch/arm/mach-s3c24xx/mach-mini2440.c index 4a18d49a63e0..1f1559713d8b 100644 --- a/arch/arm/mach-s3c24xx/mach-mini2440.c +++ b/arch/arm/mach-s3c24xx/mach-mini2440.c | |||
@@ -42,6 +42,7 @@ | |||
42 | #include <linux/platform_data/leds-s3c24xx.h> | 42 | #include <linux/platform_data/leds-s3c24xx.h> |
43 | #include <mach/regs-lcd.h> | 43 | #include <mach/regs-lcd.h> |
44 | #include <mach/irqs.h> | 44 | #include <mach/irqs.h> |
45 | #include <mach/gpio-samsung.h> | ||
45 | #include <linux/platform_data/mtd-nand-s3c2410.h> | 46 | #include <linux/platform_data/mtd-nand-s3c2410.h> |
46 | #include <linux/platform_data/i2c-s3c2410.h> | 47 | #include <linux/platform_data/i2c-s3c2410.h> |
47 | #include <linux/platform_data/mmc-s3cmci.h> | 48 | #include <linux/platform_data/mmc-s3cmci.h> |
diff --git a/arch/arm/mach-s3c24xx/mach-n30.c b/arch/arm/mach-s3c24xx/mach-n30.c index 2cb46c37c920..997684f17930 100644 --- a/arch/arm/mach-s3c24xx/mach-n30.c +++ b/arch/arm/mach-s3c24xx/mach-n30.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include <linux/platform_data/leds-s3c24xx.h> | 36 | #include <linux/platform_data/leds-s3c24xx.h> |
37 | #include <mach/regs-gpio.h> | 37 | #include <mach/regs-gpio.h> |
38 | #include <mach/regs-lcd.h> | 38 | #include <mach/regs-lcd.h> |
39 | #include <mach/gpio-samsung.h> | ||
39 | 40 | ||
40 | #include <asm/mach/arch.h> | 41 | #include <asm/mach/arch.h> |
41 | #include <asm/mach/irq.h> | 42 | #include <asm/mach/irq.h> |
diff --git a/arch/arm/mach-s3c24xx/mach-nexcoder.c b/arch/arm/mach-s3c24xx/mach-nexcoder.c index 01f4354206f9..575d28c9e6c6 100644 --- a/arch/arm/mach-s3c24xx/mach-nexcoder.c +++ b/arch/arm/mach-s3c24xx/mach-nexcoder.c | |||
@@ -37,6 +37,7 @@ | |||
37 | 37 | ||
38 | //#include <asm/debug-ll.h> | 38 | //#include <asm/debug-ll.h> |
39 | #include <mach/regs-gpio.h> | 39 | #include <mach/regs-gpio.h> |
40 | #include <mach/gpio-samsung.h> | ||
40 | #include <plat/regs-serial.h> | 41 | #include <plat/regs-serial.h> |
41 | #include <linux/platform_data/i2c-s3c2410.h> | 42 | #include <linux/platform_data/i2c-s3c2410.h> |
42 | 43 | ||
diff --git a/arch/arm/mach-s3c24xx/mach-osiris-dvs.c b/arch/arm/mach-s3c24xx/mach-osiris-dvs.c index 45e74363aaa9..33afb9190091 100644 --- a/arch/arm/mach-s3c24xx/mach-osiris-dvs.c +++ b/arch/arm/mach-s3c24xx/mach-osiris-dvs.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/i2c/tps65010.h> | 20 | #include <linux/i2c/tps65010.h> |
21 | 21 | ||
22 | #include <plat/cpu-freq.h> | 22 | #include <plat/cpu-freq.h> |
23 | #include <mach/gpio-samsung.h> | ||
23 | 24 | ||
24 | #define OSIRIS_GPIO_DVS S3C2410_GPB(5) | 25 | #define OSIRIS_GPIO_DVS S3C2410_GPB(5) |
25 | 26 | ||
diff --git a/arch/arm/mach-s3c24xx/mach-osiris.c b/arch/arm/mach-s3c24xx/mach-osiris.c index 58d6fbe5bf1f..f84f2a4c0c6d 100644 --- a/arch/arm/mach-s3c24xx/mach-osiris.c +++ b/arch/arm/mach-s3c24xx/mach-osiris.c | |||
@@ -50,6 +50,7 @@ | |||
50 | #include <mach/hardware.h> | 50 | #include <mach/hardware.h> |
51 | #include <mach/regs-gpio.h> | 51 | #include <mach/regs-gpio.h> |
52 | #include <mach/regs-lcd.h> | 52 | #include <mach/regs-lcd.h> |
53 | #include <mach/gpio-samsung.h> | ||
53 | 54 | ||
54 | #include "common.h" | 55 | #include "common.h" |
55 | #include "osiris.h" | 56 | #include "osiris.h" |
diff --git a/arch/arm/mach-s3c24xx/mach-qt2410.c b/arch/arm/mach-s3c24xx/mach-qt2410.c index f8feaeadb55a..b534b76812e3 100644 --- a/arch/arm/mach-s3c24xx/mach-qt2410.c +++ b/arch/arm/mach-s3c24xx/mach-qt2410.c | |||
@@ -54,6 +54,7 @@ | |||
54 | #include <linux/platform_data/mtd-nand-s3c2410.h> | 54 | #include <linux/platform_data/mtd-nand-s3c2410.h> |
55 | #include <linux/platform_data/usb-s3c2410_udc.h> | 55 | #include <linux/platform_data/usb-s3c2410_udc.h> |
56 | #include <linux/platform_data/i2c-s3c2410.h> | 56 | #include <linux/platform_data/i2c-s3c2410.h> |
57 | #include <mach/gpio-samsung.h> | ||
57 | 58 | ||
58 | #include <plat/gpio-cfg.h> | 59 | #include <plat/gpio-cfg.h> |
59 | #include <plat/devs.h> | 60 | #include <plat/devs.h> |
diff --git a/arch/arm/mach-s3c24xx/mach-rx1950.c b/arch/arm/mach-s3c24xx/mach-rx1950.c index 034b7fe45c49..0a5456cda1bc 100644 --- a/arch/arm/mach-s3c24xx/mach-rx1950.c +++ b/arch/arm/mach-s3c24xx/mach-rx1950.c | |||
@@ -51,6 +51,7 @@ | |||
51 | #include <mach/fb.h> | 51 | #include <mach/fb.h> |
52 | #include <mach/regs-gpio.h> | 52 | #include <mach/regs-gpio.h> |
53 | #include <mach/regs-lcd.h> | 53 | #include <mach/regs-lcd.h> |
54 | #include <mach/gpio-samsung.h> | ||
54 | 55 | ||
55 | #include <plat/clock.h> | 56 | #include <plat/clock.h> |
56 | #include <plat/cpu.h> | 57 | #include <plat/cpu.h> |
@@ -58,6 +59,7 @@ | |||
58 | #include <plat/pm.h> | 59 | #include <plat/pm.h> |
59 | #include <plat/regs-serial.h> | 60 | #include <plat/regs-serial.h> |
60 | #include <plat/samsung-time.h> | 61 | #include <plat/samsung-time.h> |
62 | #include <plat/gpio-cfg.h> | ||
61 | 63 | ||
62 | #include "common.h" | 64 | #include "common.h" |
63 | #include "h1940.h" | 65 | #include "h1940.h" |
diff --git a/arch/arm/mach-s3c24xx/mach-rx3715.c b/arch/arm/mach-s3c24xx/mach-rx3715.c index 3bc6231d0a1f..b36edce8b2b8 100644 --- a/arch/arm/mach-s3c24xx/mach-rx3715.c +++ b/arch/arm/mach-s3c24xx/mach-rx3715.c | |||
@@ -43,6 +43,7 @@ | |||
43 | #include <mach/hardware.h> | 43 | #include <mach/hardware.h> |
44 | #include <mach/regs-gpio.h> | 44 | #include <mach/regs-gpio.h> |
45 | #include <mach/regs-lcd.h> | 45 | #include <mach/regs-lcd.h> |
46 | #include <mach/gpio-samsung.h> | ||
46 | 47 | ||
47 | #include <plat/clock.h> | 48 | #include <plat/clock.h> |
48 | #include <plat/cpu.h> | 49 | #include <plat/cpu.h> |
diff --git a/arch/arm/mach-s3c24xx/mach-smdk2413.c b/arch/arm/mach-s3c24xx/mach-smdk2413.c index c9d31ef28dd1..f5bc721217e3 100644 --- a/arch/arm/mach-s3c24xx/mach-smdk2413.c +++ b/arch/arm/mach-s3c24xx/mach-smdk2413.c | |||
@@ -39,6 +39,7 @@ | |||
39 | 39 | ||
40 | #include <linux/platform_data/usb-s3c2410_udc.h> | 40 | #include <linux/platform_data/usb-s3c2410_udc.h> |
41 | #include <linux/platform_data/i2c-s3c2410.h> | 41 | #include <linux/platform_data/i2c-s3c2410.h> |
42 | #include <mach/gpio-samsung.h> | ||
42 | #include <mach/fb.h> | 43 | #include <mach/fb.h> |
43 | 44 | ||
44 | #include <plat/clock.h> | 45 | #include <plat/clock.h> |
diff --git a/arch/arm/mach-s3c24xx/mach-smdk2416.c b/arch/arm/mach-s3c24xx/mach-smdk2416.c index f88e672ad1e4..12023cae4378 100644 --- a/arch/arm/mach-s3c24xx/mach-smdk2416.c +++ b/arch/arm/mach-s3c24xx/mach-smdk2416.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <mach/regs-gpio.h> | 38 | #include <mach/regs-gpio.h> |
39 | #include <mach/regs-lcd.h> | 39 | #include <mach/regs-lcd.h> |
40 | #include <mach/regs-s3c2443-clock.h> | 40 | #include <mach/regs-s3c2443-clock.h> |
41 | #include <mach/gpio-samsung.h> | ||
41 | 42 | ||
42 | #include <linux/platform_data/leds-s3c24xx.h> | 43 | #include <linux/platform_data/leds-s3c24xx.h> |
43 | #include <linux/platform_data/i2c-s3c2410.h> | 44 | #include <linux/platform_data/i2c-s3c2410.h> |
diff --git a/arch/arm/mach-s3c24xx/mach-vr1000.c b/arch/arm/mach-s3c24xx/mach-vr1000.c index 42e7187fed60..755df489a45f 100644 --- a/arch/arm/mach-s3c24xx/mach-vr1000.c +++ b/arch/arm/mach-s3c24xx/mach-vr1000.c | |||
@@ -40,6 +40,7 @@ | |||
40 | 40 | ||
41 | #include <mach/hardware.h> | 41 | #include <mach/hardware.h> |
42 | #include <mach/regs-gpio.h> | 42 | #include <mach/regs-gpio.h> |
43 | #include <mach/gpio-samsung.h> | ||
43 | 44 | ||
44 | #include <plat/clock.h> | 45 | #include <plat/clock.h> |
45 | #include <plat/cpu.h> | 46 | #include <plat/cpu.h> |
diff --git a/arch/arm/mach-s3c24xx/pm-s3c2410.c b/arch/arm/mach-s3c24xx/pm-s3c2410.c index 2d82c4f116cd..20e481d8a33a 100644 --- a/arch/arm/mach-s3c24xx/pm-s3c2410.c +++ b/arch/arm/mach-s3c24xx/pm-s3c2410.c | |||
@@ -33,7 +33,9 @@ | |||
33 | 33 | ||
34 | #include <mach/hardware.h> | 34 | #include <mach/hardware.h> |
35 | #include <mach/regs-gpio.h> | 35 | #include <mach/regs-gpio.h> |
36 | #include <mach/gpio-samsung.h> | ||
36 | 37 | ||
38 | #include <plat/gpio-cfg.h> | ||
37 | #include <plat/cpu.h> | 39 | #include <plat/cpu.h> |
38 | #include <plat/pm.h> | 40 | #include <plat/pm.h> |
39 | 41 | ||
diff --git a/arch/arm/mach-s3c24xx/pm.c b/arch/arm/mach-s3c24xx/pm.c index caa5b7211380..052ca23393a7 100644 --- a/arch/arm/mach-s3c24xx/pm.c +++ b/arch/arm/mach-s3c24xx/pm.c | |||
@@ -39,6 +39,7 @@ | |||
39 | #include <mach/regs-clock.h> | 39 | #include <mach/regs-clock.h> |
40 | #include <mach/regs-gpio.h> | 40 | #include <mach/regs-gpio.h> |
41 | #include <mach/regs-irq.h> | 41 | #include <mach/regs-irq.h> |
42 | #include <mach/gpio-samsung.h> | ||
42 | 43 | ||
43 | #include <asm/mach/time.h> | 44 | #include <asm/mach/time.h> |
44 | 45 | ||
diff --git a/arch/arm/mach-s3c24xx/s3c2410.c b/arch/arm/mach-s3c24xx/s3c2410.c index 34676d1d5fec..ffb92cbca08c 100644 --- a/arch/arm/mach-s3c24xx/s3c2410.c +++ b/arch/arm/mach-s3c24xx/s3c2410.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <asm/mach/irq.h> | 30 | #include <asm/mach/irq.h> |
31 | 31 | ||
32 | #include <mach/hardware.h> | 32 | #include <mach/hardware.h> |
33 | #include <mach/gpio-samsung.h> | ||
33 | #include <asm/irq.h> | 34 | #include <asm/irq.h> |
34 | #include <asm/system_misc.h> | 35 | #include <asm/system_misc.h> |
35 | 36 | ||
diff --git a/arch/arm/mach-s3c24xx/s3c2416.c b/arch/arm/mach-s3c24xx/s3c2416.c index 9ef3ccfbe196..8e01b4f2df35 100644 --- a/arch/arm/mach-s3c24xx/s3c2416.c +++ b/arch/arm/mach-s3c24xx/s3c2416.c | |||
@@ -42,6 +42,7 @@ | |||
42 | #include <asm/mach/irq.h> | 42 | #include <asm/mach/irq.h> |
43 | 43 | ||
44 | #include <mach/hardware.h> | 44 | #include <mach/hardware.h> |
45 | #include <mach/gpio-samsung.h> | ||
45 | #include <asm/proc-fns.h> | 46 | #include <asm/proc-fns.h> |
46 | #include <asm/irq.h> | 47 | #include <asm/irq.h> |
47 | #include <asm/system_misc.h> | 48 | #include <asm/system_misc.h> |
diff --git a/arch/arm/mach-s3c24xx/s3c2440.c b/arch/arm/mach-s3c24xx/s3c2440.c index 5f9d6569475d..03d379f1fc52 100644 --- a/arch/arm/mach-s3c24xx/s3c2440.c +++ b/arch/arm/mach-s3c24xx/s3c2440.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <asm/mach/irq.h> | 29 | #include <asm/mach/irq.h> |
30 | 30 | ||
31 | #include <mach/hardware.h> | 31 | #include <mach/hardware.h> |
32 | #include <mach/gpio-samsung.h> | ||
32 | #include <asm/irq.h> | 33 | #include <asm/irq.h> |
33 | 34 | ||
34 | #include <plat/devs.h> | 35 | #include <plat/devs.h> |
diff --git a/arch/arm/mach-s3c24xx/s3c2442.c b/arch/arm/mach-s3c24xx/s3c2442.c index 6819961f6b19..2c8adc028538 100644 --- a/arch/arm/mach-s3c24xx/s3c2442.c +++ b/arch/arm/mach-s3c24xx/s3c2442.c | |||
@@ -37,6 +37,7 @@ | |||
37 | #include <linux/io.h> | 37 | #include <linux/io.h> |
38 | 38 | ||
39 | #include <mach/hardware.h> | 39 | #include <mach/hardware.h> |
40 | #include <mach/gpio-samsung.h> | ||
40 | #include <linux/atomic.h> | 41 | #include <linux/atomic.h> |
41 | #include <asm/irq.h> | 42 | #include <asm/irq.h> |
42 | 43 | ||
diff --git a/arch/arm/mach-s3c24xx/s3c2443.c b/arch/arm/mach-s3c24xx/s3c2443.c index b6c71918b25c..886c2147062b 100644 --- a/arch/arm/mach-s3c24xx/s3c2443.c +++ b/arch/arm/mach-s3c24xx/s3c2443.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <asm/mach/irq.h> | 29 | #include <asm/mach/irq.h> |
30 | 30 | ||
31 | #include <mach/hardware.h> | 31 | #include <mach/hardware.h> |
32 | #include <mach/gpio-samsung.h> | ||
32 | #include <asm/irq.h> | 33 | #include <asm/irq.h> |
33 | #include <asm/system_misc.h> | 34 | #include <asm/system_misc.h> |
34 | 35 | ||
diff --git a/arch/arm/mach-s3c24xx/setup-i2c.c b/arch/arm/mach-s3c24xx/setup-i2c.c index 7b4f33332d19..1852696ca16e 100644 --- a/arch/arm/mach-s3c24xx/setup-i2c.c +++ b/arch/arm/mach-s3c24xx/setup-i2c.c | |||
@@ -19,6 +19,7 @@ struct platform_device; | |||
19 | #include <linux/platform_data/i2c-s3c2410.h> | 19 | #include <linux/platform_data/i2c-s3c2410.h> |
20 | #include <mach/hardware.h> | 20 | #include <mach/hardware.h> |
21 | #include <mach/regs-gpio.h> | 21 | #include <mach/regs-gpio.h> |
22 | #include <mach/gpio-samsung.h> | ||
22 | 23 | ||
23 | void s3c_i2c0_cfg_gpio(struct platform_device *dev) | 24 | void s3c_i2c0_cfg_gpio(struct platform_device *dev) |
24 | { | 25 | { |
diff --git a/arch/arm/mach-s3c24xx/setup-sdhci-gpio.c b/arch/arm/mach-s3c24xx/setup-sdhci-gpio.c index f65cb3ef16ce..c99b0f664db7 100644 --- a/arch/arm/mach-s3c24xx/setup-sdhci-gpio.c +++ b/arch/arm/mach-s3c24xx/setup-sdhci-gpio.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/gpio.h> | 20 | #include <linux/gpio.h> |
21 | 21 | ||
22 | #include <mach/regs-gpio.h> | 22 | #include <mach/regs-gpio.h> |
23 | #include <mach/gpio-samsung.h> | ||
23 | #include <plat/gpio-cfg.h> | 24 | #include <plat/gpio-cfg.h> |
24 | 25 | ||
25 | void s3c2416_setup_sdhci0_cfg_gpio(struct platform_device *dev, int width) | 26 | void s3c2416_setup_sdhci0_cfg_gpio(struct platform_device *dev, int width) |
diff --git a/arch/arm/mach-s3c24xx/setup-ts.c b/arch/arm/mach-s3c24xx/setup-ts.c index 4e11affce3a8..46466d20257e 100644 --- a/arch/arm/mach-s3c24xx/setup-ts.c +++ b/arch/arm/mach-s3c24xx/setup-ts.c | |||
@@ -15,7 +15,9 @@ | |||
15 | 15 | ||
16 | struct platform_device; /* don't need the contents */ | 16 | struct platform_device; /* don't need the contents */ |
17 | 17 | ||
18 | #include <plat/gpio-cfg.h> | ||
18 | #include <mach/hardware.h> | 19 | #include <mach/hardware.h> |
20 | #include <mach/gpio-samsung.h> | ||
19 | 21 | ||
20 | /** | 22 | /** |
21 | * s3c24xx_ts_cfg_gpio - configure gpio for s3c2410 systems | 23 | * s3c24xx_ts_cfg_gpio - configure gpio for s3c2410 systems |
diff --git a/arch/arm/mach-s3c24xx/simtec-usb.c b/arch/arm/mach-s3c24xx/simtec-usb.c index 2ed2e32430dc..8dea917e954b 100644 --- a/arch/arm/mach-s3c24xx/simtec-usb.c +++ b/arch/arm/mach-s3c24xx/simtec-usb.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <asm/mach/irq.h> | 29 | #include <asm/mach/irq.h> |
30 | 30 | ||
31 | #include <mach/hardware.h> | 31 | #include <mach/hardware.h> |
32 | #include <mach/gpio-samsung.h> | ||
32 | #include <asm/irq.h> | 33 | #include <asm/irq.h> |
33 | 34 | ||
34 | #include <linux/platform_data/usb-ohci-s3c2410.h> | 35 | #include <linux/platform_data/usb-ohci-s3c2410.h> |
diff --git a/arch/arm/mach-s3c64xx/Kconfig b/arch/arm/mach-s3c64xx/Kconfig index 2cb8dc55b50e..64f04e6f9c31 100644 --- a/arch/arm/mach-s3c64xx/Kconfig +++ b/arch/arm/mach-s3c64xx/Kconfig | |||
@@ -17,9 +17,10 @@ config CPU_S3C6410 | |||
17 | help | 17 | help |
18 | Enable S3C6410 CPU support | 18 | Enable S3C6410 CPU support |
19 | 19 | ||
20 | config S3C64XX_DMA | 20 | config S3C64XX_PL080 |
21 | bool "S3C64XX DMA" | 21 | bool "S3C64XX DMA using generic PL08x driver" |
22 | select S3C_DMA | 22 | select AMBA_PL08X |
23 | select SAMSUNG_DMADEV | ||
23 | 24 | ||
24 | config S3C64XX_SETUP_SDHCI | 25 | config S3C64XX_SETUP_SDHCI |
25 | bool | 26 | bool |
@@ -192,7 +193,6 @@ config SMDK6410_WM1190_EV1 | |||
192 | select MFD_WM8350_I2C | 193 | select MFD_WM8350_I2C |
193 | select REGULATOR | 194 | select REGULATOR |
194 | select REGULATOR_WM8350 | 195 | select REGULATOR_WM8350 |
195 | select SAMSUNG_GPIO_EXTRA64 | ||
196 | help | 196 | help |
197 | The Wolfson Microelectronics 1190-EV1 is a WM835x based PMIC | 197 | The Wolfson Microelectronics 1190-EV1 is a WM835x based PMIC |
198 | and audio daughtercard for the Samsung SMDK6410 reference | 198 | and audio daughtercard for the Samsung SMDK6410 reference |
@@ -208,7 +208,6 @@ config SMDK6410_WM1192_EV1 | |||
208 | select MFD_WM831X_I2C | 208 | select MFD_WM831X_I2C |
209 | select REGULATOR | 209 | select REGULATOR |
210 | select REGULATOR_WM831X | 210 | select REGULATOR_WM831X |
211 | select SAMSUNG_GPIO_EXTRA64 | ||
212 | help | 211 | help |
213 | The Wolfson Microelectronics 1192-EV1 is a WM831x based PMIC | 212 | The Wolfson Microelectronics 1192-EV1 is a WM831x based PMIC |
214 | daughtercard for the Samsung SMDK6410 reference platform. | 213 | daughtercard for the Samsung SMDK6410 reference platform. |
@@ -294,7 +293,6 @@ config MACH_WLF_CRAGG_6410 | |||
294 | select SAMSUNG_DEV_ADC | 293 | select SAMSUNG_DEV_ADC |
295 | select SAMSUNG_DEV_KEYPAD | 294 | select SAMSUNG_DEV_KEYPAD |
296 | select SAMSUNG_DEV_PWM | 295 | select SAMSUNG_DEV_PWM |
297 | select SAMSUNG_GPIO_EXTRA128 | ||
298 | help | 296 | help |
299 | Machine support for the Wolfson Cragganmore S3C6410 variant. | 297 | Machine support for the Wolfson Cragganmore S3C6410 variant. |
300 | 298 | ||
diff --git a/arch/arm/mach-s3c64xx/Makefile b/arch/arm/mach-s3c64xx/Makefile index 6faedcffce04..58069a702a43 100644 --- a/arch/arm/mach-s3c64xx/Makefile +++ b/arch/arm/mach-s3c64xx/Makefile | |||
@@ -26,7 +26,7 @@ obj-$(CONFIG_CPU_IDLE) += cpuidle.o | |||
26 | 26 | ||
27 | # DMA support | 27 | # DMA support |
28 | 28 | ||
29 | obj-$(CONFIG_S3C64XX_DMA) += dma.o | 29 | obj-$(CONFIG_S3C64XX_PL080) += pl080.o |
30 | 30 | ||
31 | # Device support | 31 | # Device support |
32 | 32 | ||
diff --git a/arch/arm/mach-s3c64xx/common.c b/arch/arm/mach-s3c64xx/common.c index 7a3ce4c39e5f..76ab595d849b 100644 --- a/arch/arm/mach-s3c64xx/common.c +++ b/arch/arm/mach-s3c64xx/common.c | |||
@@ -41,6 +41,7 @@ | |||
41 | #include <mach/map.h> | 41 | #include <mach/map.h> |
42 | #include <mach/hardware.h> | 42 | #include <mach/hardware.h> |
43 | #include <mach/regs-gpio.h> | 43 | #include <mach/regs-gpio.h> |
44 | #include <mach/gpio-samsung.h> | ||
44 | 45 | ||
45 | #include <plat/cpu.h> | 46 | #include <plat/cpu.h> |
46 | #include <plat/devs.h> | 47 | #include <plat/devs.h> |
diff --git a/arch/arm/mach-s3c64xx/common.h b/arch/arm/mach-s3c64xx/common.h index bd3bd562011e..7043e7a3a67e 100644 --- a/arch/arm/mach-s3c64xx/common.h +++ b/arch/arm/mach-s3c64xx/common.h | |||
@@ -58,4 +58,9 @@ int __init s3c64xx_pm_late_initcall(void); | |||
58 | static inline int s3c64xx_pm_late_initcall(void) { return 0; } | 58 | static inline int s3c64xx_pm_late_initcall(void) { return 0; } |
59 | #endif | 59 | #endif |
60 | 60 | ||
61 | #ifdef CONFIG_S3C64XX_PL080 | ||
62 | extern struct pl08x_platform_data s3c64xx_dma0_plat_data; | ||
63 | extern struct pl08x_platform_data s3c64xx_dma1_plat_data; | ||
64 | #endif | ||
65 | |||
61 | #endif /* __ARCH_ARM_MACH_S3C64XX_COMMON_H */ | 66 | #endif /* __ARCH_ARM_MACH_S3C64XX_COMMON_H */ |
diff --git a/arch/arm/mach-s3c64xx/crag6410.h b/arch/arm/mach-s3c64xx/crag6410.h index 4c3c9994fc2c..7bc66682687e 100644 --- a/arch/arm/mach-s3c64xx/crag6410.h +++ b/arch/arm/mach-s3c64xx/crag6410.h | |||
@@ -11,7 +11,7 @@ | |||
11 | #ifndef MACH_CRAG6410_H | 11 | #ifndef MACH_CRAG6410_H |
12 | #define MACH_CRAG6410_H | 12 | #define MACH_CRAG6410_H |
13 | 13 | ||
14 | #include <linux/gpio.h> | 14 | #include <mach/gpio-samsung.h> |
15 | 15 | ||
16 | #define GLENFARCLAS_PMIC_IRQ_BASE IRQ_BOARD_START | 16 | #define GLENFARCLAS_PMIC_IRQ_BASE IRQ_BOARD_START |
17 | 17 | ||
diff --git a/arch/arm/mach-s3c64xx/dev-audio.c b/arch/arm/mach-s3c64xx/dev-audio.c index e367e87bbc29..ff780a8d8366 100644 --- a/arch/arm/mach-s3c64xx/dev-audio.c +++ b/arch/arm/mach-s3c64xx/dev-audio.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <plat/devs.h> | 22 | #include <plat/devs.h> |
23 | #include <linux/platform_data/asoc-s3c.h> | 23 | #include <linux/platform_data/asoc-s3c.h> |
24 | #include <plat/gpio-cfg.h> | 24 | #include <plat/gpio-cfg.h> |
25 | #include <mach/gpio-samsung.h> | ||
25 | 26 | ||
26 | static int s3c64xx_i2s_cfg_gpio(struct platform_device *pdev) | 27 | static int s3c64xx_i2s_cfg_gpio(struct platform_device *pdev) |
27 | { | 28 | { |
diff --git a/arch/arm/mach-s3c64xx/dma.c b/arch/arm/mach-s3c64xx/dma.c deleted file mode 100644 index 7e22c2113816..000000000000 --- a/arch/arm/mach-s3c64xx/dma.c +++ /dev/null | |||
@@ -1,762 +0,0 @@ | |||
1 | /* linux/arch/arm/plat-s3c64xx/dma.c | ||
2 | * | ||
3 | * Copyright 2009 Openmoko, Inc. | ||
4 | * Copyright 2009 Simtec Electronics | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * http://armlinux.simtec.co.uk/ | ||
7 | * | ||
8 | * S3C64XX DMA core | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | /* | ||
16 | * NOTE: Code in this file is not used when booting with Device Tree support. | ||
17 | */ | ||
18 | |||
19 | #include <linux/kernel.h> | ||
20 | #include <linux/module.h> | ||
21 | #include <linux/interrupt.h> | ||
22 | #include <linux/dmapool.h> | ||
23 | #include <linux/device.h> | ||
24 | #include <linux/errno.h> | ||
25 | #include <linux/slab.h> | ||
26 | #include <linux/delay.h> | ||
27 | #include <linux/clk.h> | ||
28 | #include <linux/err.h> | ||
29 | #include <linux/io.h> | ||
30 | #include <linux/amba/pl080.h> | ||
31 | #include <linux/of.h> | ||
32 | |||
33 | #include <mach/dma.h> | ||
34 | #include <mach/map.h> | ||
35 | #include <mach/irqs.h> | ||
36 | |||
37 | #include "regs-sys.h" | ||
38 | |||
39 | /* dma channel state information */ | ||
40 | |||
41 | struct s3c64xx_dmac { | ||
42 | struct device dev; | ||
43 | struct clk *clk; | ||
44 | void __iomem *regs; | ||
45 | struct s3c2410_dma_chan *channels; | ||
46 | enum dma_ch chanbase; | ||
47 | }; | ||
48 | |||
49 | /* pool to provide LLI buffers */ | ||
50 | static struct dma_pool *dma_pool; | ||
51 | |||
52 | /* Debug configuration and code */ | ||
53 | |||
54 | static unsigned char debug_show_buffs = 0; | ||
55 | |||
56 | static void dbg_showchan(struct s3c2410_dma_chan *chan) | ||
57 | { | ||
58 | pr_debug("DMA%d: %08x->%08x L %08x C %08x,%08x S %08x\n", | ||
59 | chan->number, | ||
60 | readl(chan->regs + PL080_CH_SRC_ADDR), | ||
61 | readl(chan->regs + PL080_CH_DST_ADDR), | ||
62 | readl(chan->regs + PL080_CH_LLI), | ||
63 | readl(chan->regs + PL080_CH_CONTROL), | ||
64 | readl(chan->regs + PL080S_CH_CONTROL2), | ||
65 | readl(chan->regs + PL080S_CH_CONFIG)); | ||
66 | } | ||
67 | |||
68 | static void show_lli(struct pl080s_lli *lli) | ||
69 | { | ||
70 | pr_debug("LLI[%p] %08x->%08x, NL %08x C %08x,%08x\n", | ||
71 | lli, lli->src_addr, lli->dst_addr, lli->next_lli, | ||
72 | lli->control0, lli->control1); | ||
73 | } | ||
74 | |||
75 | static void dbg_showbuffs(struct s3c2410_dma_chan *chan) | ||
76 | { | ||
77 | struct s3c64xx_dma_buff *ptr; | ||
78 | struct s3c64xx_dma_buff *end; | ||
79 | |||
80 | pr_debug("DMA%d: buffs next %p, curr %p, end %p\n", | ||
81 | chan->number, chan->next, chan->curr, chan->end); | ||
82 | |||
83 | ptr = chan->next; | ||
84 | end = chan->end; | ||
85 | |||
86 | if (debug_show_buffs) { | ||
87 | for (; ptr != NULL; ptr = ptr->next) { | ||
88 | pr_debug("DMA%d: %08x ", | ||
89 | chan->number, ptr->lli_dma); | ||
90 | show_lli(ptr->lli); | ||
91 | } | ||
92 | } | ||
93 | } | ||
94 | |||
95 | /* End of Debug */ | ||
96 | |||
97 | static struct s3c2410_dma_chan *s3c64xx_dma_map_channel(unsigned int channel) | ||
98 | { | ||
99 | struct s3c2410_dma_chan *chan; | ||
100 | unsigned int start, offs; | ||
101 | |||
102 | start = 0; | ||
103 | |||
104 | if (channel >= DMACH_PCM1_TX) | ||
105 | start = 8; | ||
106 | |||
107 | for (offs = 0; offs < 8; offs++) { | ||
108 | chan = &s3c2410_chans[start + offs]; | ||
109 | if (!chan->in_use) | ||
110 | goto found; | ||
111 | } | ||
112 | |||
113 | return NULL; | ||
114 | |||
115 | found: | ||
116 | s3c_dma_chan_map[channel] = chan; | ||
117 | return chan; | ||
118 | } | ||
119 | |||
120 | int s3c2410_dma_config(enum dma_ch channel, int xferunit) | ||
121 | { | ||
122 | struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); | ||
123 | |||
124 | if (chan == NULL) | ||
125 | return -EINVAL; | ||
126 | |||
127 | switch (xferunit) { | ||
128 | case 1: | ||
129 | chan->hw_width = 0; | ||
130 | break; | ||
131 | case 2: | ||
132 | chan->hw_width = 1; | ||
133 | break; | ||
134 | case 4: | ||
135 | chan->hw_width = 2; | ||
136 | break; | ||
137 | default: | ||
138 | printk(KERN_ERR "%s: illegal width %d\n", __func__, xferunit); | ||
139 | return -EINVAL; | ||
140 | } | ||
141 | |||
142 | return 0; | ||
143 | } | ||
144 | EXPORT_SYMBOL(s3c2410_dma_config); | ||
145 | |||
146 | static void s3c64xx_dma_fill_lli(struct s3c2410_dma_chan *chan, | ||
147 | struct pl080s_lli *lli, | ||
148 | dma_addr_t data, int size) | ||
149 | { | ||
150 | dma_addr_t src, dst; | ||
151 | u32 control0, control1; | ||
152 | |||
153 | switch (chan->source) { | ||
154 | case DMA_FROM_DEVICE: | ||
155 | src = chan->dev_addr; | ||
156 | dst = data; | ||
157 | control0 = PL080_CONTROL_SRC_AHB2; | ||
158 | control0 |= PL080_CONTROL_DST_INCR; | ||
159 | break; | ||
160 | |||
161 | case DMA_TO_DEVICE: | ||
162 | src = data; | ||
163 | dst = chan->dev_addr; | ||
164 | control0 = PL080_CONTROL_DST_AHB2; | ||
165 | control0 |= PL080_CONTROL_SRC_INCR; | ||
166 | break; | ||
167 | default: | ||
168 | BUG(); | ||
169 | } | ||
170 | |||
171 | /* note, we do not currently setup any of the burst controls */ | ||
172 | |||
173 | control1 = size >> chan->hw_width; /* size in no of xfers */ | ||
174 | control0 |= PL080_CONTROL_PROT_SYS; /* always in priv. mode */ | ||
175 | control0 |= PL080_CONTROL_TC_IRQ_EN; /* always fire IRQ */ | ||
176 | control0 |= (u32)chan->hw_width << PL080_CONTROL_DWIDTH_SHIFT; | ||
177 | control0 |= (u32)chan->hw_width << PL080_CONTROL_SWIDTH_SHIFT; | ||
178 | |||
179 | lli->src_addr = src; | ||
180 | lli->dst_addr = dst; | ||
181 | lli->next_lli = 0; | ||
182 | lli->control0 = control0; | ||
183 | lli->control1 = control1; | ||
184 | } | ||
185 | |||
186 | static void s3c64xx_lli_to_regs(struct s3c2410_dma_chan *chan, | ||
187 | struct pl080s_lli *lli) | ||
188 | { | ||
189 | void __iomem *regs = chan->regs; | ||
190 | |||
191 | pr_debug("%s: LLI %p => regs\n", __func__, lli); | ||
192 | show_lli(lli); | ||
193 | |||
194 | writel(lli->src_addr, regs + PL080_CH_SRC_ADDR); | ||
195 | writel(lli->dst_addr, regs + PL080_CH_DST_ADDR); | ||
196 | writel(lli->next_lli, regs + PL080_CH_LLI); | ||
197 | writel(lli->control0, regs + PL080_CH_CONTROL); | ||
198 | writel(lli->control1, regs + PL080S_CH_CONTROL2); | ||
199 | } | ||
200 | |||
201 | static int s3c64xx_dma_start(struct s3c2410_dma_chan *chan) | ||
202 | { | ||
203 | struct s3c64xx_dmac *dmac = chan->dmac; | ||
204 | u32 config; | ||
205 | u32 bit = chan->bit; | ||
206 | |||
207 | dbg_showchan(chan); | ||
208 | |||
209 | pr_debug("%s: clearing interrupts\n", __func__); | ||
210 | |||
211 | /* clear interrupts */ | ||
212 | writel(bit, dmac->regs + PL080_TC_CLEAR); | ||
213 | writel(bit, dmac->regs + PL080_ERR_CLEAR); | ||
214 | |||
215 | pr_debug("%s: starting channel\n", __func__); | ||
216 | |||
217 | config = readl(chan->regs + PL080S_CH_CONFIG); | ||
218 | config |= PL080_CONFIG_ENABLE; | ||
219 | config &= ~PL080_CONFIG_HALT; | ||
220 | |||
221 | pr_debug("%s: writing config %08x\n", __func__, config); | ||
222 | writel(config, chan->regs + PL080S_CH_CONFIG); | ||
223 | |||
224 | return 0; | ||
225 | } | ||
226 | |||
227 | static int s3c64xx_dma_stop(struct s3c2410_dma_chan *chan) | ||
228 | { | ||
229 | u32 config; | ||
230 | int timeout; | ||
231 | |||
232 | pr_debug("%s: stopping channel\n", __func__); | ||
233 | |||
234 | dbg_showchan(chan); | ||
235 | |||
236 | config = readl(chan->regs + PL080S_CH_CONFIG); | ||
237 | config |= PL080_CONFIG_HALT; | ||
238 | writel(config, chan->regs + PL080S_CH_CONFIG); | ||
239 | |||
240 | timeout = 1000; | ||
241 | do { | ||
242 | config = readl(chan->regs + PL080S_CH_CONFIG); | ||
243 | pr_debug("%s: %d - config %08x\n", __func__, timeout, config); | ||
244 | if (config & PL080_CONFIG_ACTIVE) | ||
245 | udelay(10); | ||
246 | else | ||
247 | break; | ||
248 | } while (--timeout > 0); | ||
249 | |||
250 | if (config & PL080_CONFIG_ACTIVE) { | ||
251 | printk(KERN_ERR "%s: channel still active\n", __func__); | ||
252 | return -EFAULT; | ||
253 | } | ||
254 | |||
255 | config = readl(chan->regs + PL080S_CH_CONFIG); | ||
256 | config &= ~PL080_CONFIG_ENABLE; | ||
257 | writel(config, chan->regs + PL080S_CH_CONFIG); | ||
258 | |||
259 | return 0; | ||
260 | } | ||
261 | |||
262 | static inline void s3c64xx_dma_bufffdone(struct s3c2410_dma_chan *chan, | ||
263 | struct s3c64xx_dma_buff *buf, | ||
264 | enum s3c2410_dma_buffresult result) | ||
265 | { | ||
266 | if (chan->callback_fn != NULL) | ||
267 | (chan->callback_fn)(chan, buf->pw, 0, result); | ||
268 | } | ||
269 | |||
270 | static void s3c64xx_dma_freebuff(struct s3c64xx_dma_buff *buff) | ||
271 | { | ||
272 | dma_pool_free(dma_pool, buff->lli, buff->lli_dma); | ||
273 | kfree(buff); | ||
274 | } | ||
275 | |||
276 | static int s3c64xx_dma_flush(struct s3c2410_dma_chan *chan) | ||
277 | { | ||
278 | struct s3c64xx_dma_buff *buff, *next; | ||
279 | u32 config; | ||
280 | |||
281 | dbg_showchan(chan); | ||
282 | |||
283 | pr_debug("%s: flushing channel\n", __func__); | ||
284 | |||
285 | config = readl(chan->regs + PL080S_CH_CONFIG); | ||
286 | config &= ~PL080_CONFIG_ENABLE; | ||
287 | writel(config, chan->regs + PL080S_CH_CONFIG); | ||
288 | |||
289 | /* dump all the buffers associated with this channel */ | ||
290 | |||
291 | for (buff = chan->curr; buff != NULL; buff = next) { | ||
292 | next = buff->next; | ||
293 | pr_debug("%s: buff %p (next %p)\n", __func__, buff, buff->next); | ||
294 | |||
295 | s3c64xx_dma_bufffdone(chan, buff, S3C2410_RES_ABORT); | ||
296 | s3c64xx_dma_freebuff(buff); | ||
297 | } | ||
298 | |||
299 | chan->curr = chan->next = chan->end = NULL; | ||
300 | |||
301 | return 0; | ||
302 | } | ||
303 | |||
304 | int s3c2410_dma_ctrl(enum dma_ch channel, enum s3c2410_chan_op op) | ||
305 | { | ||
306 | struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); | ||
307 | |||
308 | WARN_ON(!chan); | ||
309 | if (!chan) | ||
310 | return -EINVAL; | ||
311 | |||
312 | switch (op) { | ||
313 | case S3C2410_DMAOP_START: | ||
314 | return s3c64xx_dma_start(chan); | ||
315 | |||
316 | case S3C2410_DMAOP_STOP: | ||
317 | return s3c64xx_dma_stop(chan); | ||
318 | |||
319 | case S3C2410_DMAOP_FLUSH: | ||
320 | return s3c64xx_dma_flush(chan); | ||
321 | |||
322 | /* believe PAUSE/RESUME are no-ops */ | ||
323 | case S3C2410_DMAOP_PAUSE: | ||
324 | case S3C2410_DMAOP_RESUME: | ||
325 | case S3C2410_DMAOP_STARTED: | ||
326 | case S3C2410_DMAOP_TIMEOUT: | ||
327 | return 0; | ||
328 | } | ||
329 | |||
330 | return -ENOENT; | ||
331 | } | ||
332 | EXPORT_SYMBOL(s3c2410_dma_ctrl); | ||
333 | |||
334 | /* s3c2410_dma_enque | ||
335 | * | ||
336 | */ | ||
337 | |||
338 | int s3c2410_dma_enqueue(enum dma_ch channel, void *id, | ||
339 | dma_addr_t data, int size) | ||
340 | { | ||
341 | struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); | ||
342 | struct s3c64xx_dma_buff *next; | ||
343 | struct s3c64xx_dma_buff *buff; | ||
344 | struct pl080s_lli *lli; | ||
345 | unsigned long flags; | ||
346 | int ret; | ||
347 | |||
348 | WARN_ON(!chan); | ||
349 | if (!chan) | ||
350 | return -EINVAL; | ||
351 | |||
352 | buff = kzalloc(sizeof(struct s3c64xx_dma_buff), GFP_ATOMIC); | ||
353 | if (!buff) { | ||
354 | printk(KERN_ERR "%s: no memory for buffer\n", __func__); | ||
355 | return -ENOMEM; | ||
356 | } | ||
357 | |||
358 | lli = dma_pool_alloc(dma_pool, GFP_ATOMIC, &buff->lli_dma); | ||
359 | if (!lli) { | ||
360 | printk(KERN_ERR "%s: no memory for lli\n", __func__); | ||
361 | ret = -ENOMEM; | ||
362 | goto err_buff; | ||
363 | } | ||
364 | |||
365 | pr_debug("%s: buff %p, dp %08x lli (%p, %08x) %d\n", | ||
366 | __func__, buff, data, lli, (u32)buff->lli_dma, size); | ||
367 | |||
368 | buff->lli = lli; | ||
369 | buff->pw = id; | ||
370 | |||
371 | s3c64xx_dma_fill_lli(chan, lli, data, size); | ||
372 | |||
373 | local_irq_save(flags); | ||
374 | |||
375 | if ((next = chan->next) != NULL) { | ||
376 | struct s3c64xx_dma_buff *end = chan->end; | ||
377 | struct pl080s_lli *endlli = end->lli; | ||
378 | |||
379 | pr_debug("enquing onto channel\n"); | ||
380 | |||
381 | end->next = buff; | ||
382 | endlli->next_lli = buff->lli_dma; | ||
383 | |||
384 | if (chan->flags & S3C2410_DMAF_CIRCULAR) { | ||
385 | struct s3c64xx_dma_buff *curr = chan->curr; | ||
386 | lli->next_lli = curr->lli_dma; | ||
387 | } | ||
388 | |||
389 | if (next == chan->curr) { | ||
390 | writel(buff->lli_dma, chan->regs + PL080_CH_LLI); | ||
391 | chan->next = buff; | ||
392 | } | ||
393 | |||
394 | show_lli(endlli); | ||
395 | chan->end = buff; | ||
396 | } else { | ||
397 | pr_debug("enquing onto empty channel\n"); | ||
398 | |||
399 | chan->curr = buff; | ||
400 | chan->next = buff; | ||
401 | chan->end = buff; | ||
402 | |||
403 | s3c64xx_lli_to_regs(chan, lli); | ||
404 | } | ||
405 | |||
406 | local_irq_restore(flags); | ||
407 | |||
408 | show_lli(lli); | ||
409 | |||
410 | dbg_showchan(chan); | ||
411 | dbg_showbuffs(chan); | ||
412 | return 0; | ||
413 | |||
414 | err_buff: | ||
415 | kfree(buff); | ||
416 | return ret; | ||
417 | } | ||
418 | |||
419 | EXPORT_SYMBOL(s3c2410_dma_enqueue); | ||
420 | |||
421 | |||
422 | int s3c2410_dma_devconfig(enum dma_ch channel, | ||
423 | enum dma_data_direction source, | ||
424 | unsigned long devaddr) | ||
425 | { | ||
426 | struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); | ||
427 | u32 peripheral; | ||
428 | u32 config = 0; | ||
429 | |||
430 | pr_debug("%s: channel %d, source %d, dev %08lx, chan %p\n", | ||
431 | __func__, channel, source, devaddr, chan); | ||
432 | |||
433 | WARN_ON(!chan); | ||
434 | if (!chan) | ||
435 | return -EINVAL; | ||
436 | |||
437 | peripheral = (chan->peripheral & 0xf); | ||
438 | chan->source = source; | ||
439 | chan->dev_addr = devaddr; | ||
440 | |||
441 | pr_debug("%s: peripheral %d\n", __func__, peripheral); | ||
442 | |||
443 | switch (source) { | ||
444 | case DMA_FROM_DEVICE: | ||
445 | config = 2 << PL080_CONFIG_FLOW_CONTROL_SHIFT; | ||
446 | config |= peripheral << PL080_CONFIG_SRC_SEL_SHIFT; | ||
447 | break; | ||
448 | case DMA_TO_DEVICE: | ||
449 | config = 1 << PL080_CONFIG_FLOW_CONTROL_SHIFT; | ||
450 | config |= peripheral << PL080_CONFIG_DST_SEL_SHIFT; | ||
451 | break; | ||
452 | default: | ||
453 | printk(KERN_ERR "%s: bad source\n", __func__); | ||
454 | return -EINVAL; | ||
455 | } | ||
456 | |||
457 | /* allow TC and ERR interrupts */ | ||
458 | config |= PL080_CONFIG_TC_IRQ_MASK; | ||
459 | config |= PL080_CONFIG_ERR_IRQ_MASK; | ||
460 | |||
461 | pr_debug("%s: config %08x\n", __func__, config); | ||
462 | |||
463 | writel(config, chan->regs + PL080S_CH_CONFIG); | ||
464 | |||
465 | return 0; | ||
466 | } | ||
467 | EXPORT_SYMBOL(s3c2410_dma_devconfig); | ||
468 | |||
469 | |||
470 | int s3c2410_dma_getposition(enum dma_ch channel, | ||
471 | dma_addr_t *src, dma_addr_t *dst) | ||
472 | { | ||
473 | struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); | ||
474 | |||
475 | WARN_ON(!chan); | ||
476 | if (!chan) | ||
477 | return -EINVAL; | ||
478 | |||
479 | if (src != NULL) | ||
480 | *src = readl(chan->regs + PL080_CH_SRC_ADDR); | ||
481 | |||
482 | if (dst != NULL) | ||
483 | *dst = readl(chan->regs + PL080_CH_DST_ADDR); | ||
484 | |||
485 | return 0; | ||
486 | } | ||
487 | EXPORT_SYMBOL(s3c2410_dma_getposition); | ||
488 | |||
489 | /* s3c2410_request_dma | ||
490 | * | ||
491 | * get control of an dma channel | ||
492 | */ | ||
493 | |||
494 | int s3c2410_dma_request(enum dma_ch channel, | ||
495 | struct s3c2410_dma_client *client, | ||
496 | void *dev) | ||
497 | { | ||
498 | struct s3c2410_dma_chan *chan; | ||
499 | unsigned long flags; | ||
500 | |||
501 | pr_debug("dma%d: s3c2410_request_dma: client=%s, dev=%p\n", | ||
502 | channel, client->name, dev); | ||
503 | |||
504 | local_irq_save(flags); | ||
505 | |||
506 | chan = s3c64xx_dma_map_channel(channel); | ||
507 | if (chan == NULL) { | ||
508 | local_irq_restore(flags); | ||
509 | return -EBUSY; | ||
510 | } | ||
511 | |||
512 | dbg_showchan(chan); | ||
513 | |||
514 | chan->client = client; | ||
515 | chan->in_use = 1; | ||
516 | chan->peripheral = channel; | ||
517 | chan->flags = 0; | ||
518 | |||
519 | local_irq_restore(flags); | ||
520 | |||
521 | /* need to setup */ | ||
522 | |||
523 | pr_debug("%s: channel initialised, %p\n", __func__, chan); | ||
524 | |||
525 | return chan->number | DMACH_LOW_LEVEL; | ||
526 | } | ||
527 | |||
528 | EXPORT_SYMBOL(s3c2410_dma_request); | ||
529 | |||
530 | /* s3c2410_dma_free | ||
531 | * | ||
532 | * release the given channel back to the system, will stop and flush | ||
533 | * any outstanding transfers, and ensure the channel is ready for the | ||
534 | * next claimant. | ||
535 | * | ||
536 | * Note, although a warning is currently printed if the freeing client | ||
537 | * info is not the same as the registrant's client info, the free is still | ||
538 | * allowed to go through. | ||
539 | */ | ||
540 | |||
541 | int s3c2410_dma_free(enum dma_ch channel, struct s3c2410_dma_client *client) | ||
542 | { | ||
543 | struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); | ||
544 | unsigned long flags; | ||
545 | |||
546 | if (chan == NULL) | ||
547 | return -EINVAL; | ||
548 | |||
549 | local_irq_save(flags); | ||
550 | |||
551 | if (chan->client != client) { | ||
552 | printk(KERN_WARNING "dma%d: possible free from different client (channel %p, passed %p)\n", | ||
553 | channel, chan->client, client); | ||
554 | } | ||
555 | |||
556 | /* sort out stopping and freeing the channel */ | ||
557 | |||
558 | |||
559 | chan->client = NULL; | ||
560 | chan->in_use = 0; | ||
561 | |||
562 | if (!(channel & DMACH_LOW_LEVEL)) | ||
563 | s3c_dma_chan_map[channel] = NULL; | ||
564 | |||
565 | local_irq_restore(flags); | ||
566 | |||
567 | return 0; | ||
568 | } | ||
569 | |||
570 | EXPORT_SYMBOL(s3c2410_dma_free); | ||
571 | |||
572 | static irqreturn_t s3c64xx_dma_irq(int irq, void *pw) | ||
573 | { | ||
574 | struct s3c64xx_dmac *dmac = pw; | ||
575 | struct s3c2410_dma_chan *chan; | ||
576 | enum s3c2410_dma_buffresult res; | ||
577 | u32 tcstat, errstat; | ||
578 | u32 bit; | ||
579 | int offs; | ||
580 | |||
581 | tcstat = readl(dmac->regs + PL080_TC_STATUS); | ||
582 | errstat = readl(dmac->regs + PL080_ERR_STATUS); | ||
583 | |||
584 | for (offs = 0, bit = 1; offs < 8; offs++, bit <<= 1) { | ||
585 | struct s3c64xx_dma_buff *buff; | ||
586 | |||
587 | if (!(errstat & bit) && !(tcstat & bit)) | ||
588 | continue; | ||
589 | |||
590 | chan = dmac->channels + offs; | ||
591 | res = S3C2410_RES_ERR; | ||
592 | |||
593 | if (tcstat & bit) { | ||
594 | writel(bit, dmac->regs + PL080_TC_CLEAR); | ||
595 | res = S3C2410_RES_OK; | ||
596 | } | ||
597 | |||
598 | if (errstat & bit) | ||
599 | writel(bit, dmac->regs + PL080_ERR_CLEAR); | ||
600 | |||
601 | /* 'next' points to the buffer that is next to the | ||
602 | * currently active buffer. | ||
603 | * For CIRCULAR queues, 'next' will be same as 'curr' | ||
604 | * when 'end' is the active buffer. | ||
605 | */ | ||
606 | buff = chan->curr; | ||
607 | while (buff && buff != chan->next | ||
608 | && buff->next != chan->next) | ||
609 | buff = buff->next; | ||
610 | |||
611 | if (!buff) | ||
612 | BUG(); | ||
613 | |||
614 | if (buff == chan->next) | ||
615 | buff = chan->end; | ||
616 | |||
617 | s3c64xx_dma_bufffdone(chan, buff, res); | ||
618 | |||
619 | /* Free the node and update curr, if non-circular queue */ | ||
620 | if (!(chan->flags & S3C2410_DMAF_CIRCULAR)) { | ||
621 | chan->curr = buff->next; | ||
622 | s3c64xx_dma_freebuff(buff); | ||
623 | } | ||
624 | |||
625 | /* Update 'next' */ | ||
626 | buff = chan->next; | ||
627 | if (chan->next == chan->end) { | ||
628 | chan->next = chan->curr; | ||
629 | if (!(chan->flags & S3C2410_DMAF_CIRCULAR)) | ||
630 | chan->end = NULL; | ||
631 | } else { | ||
632 | chan->next = buff->next; | ||
633 | } | ||
634 | } | ||
635 | |||
636 | return IRQ_HANDLED; | ||
637 | } | ||
638 | |||
639 | static struct bus_type dma_subsys = { | ||
640 | .name = "s3c64xx-dma", | ||
641 | .dev_name = "s3c64xx-dma", | ||
642 | }; | ||
643 | |||
644 | static int s3c64xx_dma_init1(int chno, enum dma_ch chbase, | ||
645 | int irq, unsigned int base) | ||
646 | { | ||
647 | struct s3c2410_dma_chan *chptr = &s3c2410_chans[chno]; | ||
648 | struct s3c64xx_dmac *dmac; | ||
649 | char clkname[16]; | ||
650 | void __iomem *regs; | ||
651 | void __iomem *regptr; | ||
652 | int err, ch; | ||
653 | |||
654 | dmac = kzalloc(sizeof(struct s3c64xx_dmac), GFP_KERNEL); | ||
655 | if (!dmac) { | ||
656 | printk(KERN_ERR "%s: failed to alloc mem\n", __func__); | ||
657 | return -ENOMEM; | ||
658 | } | ||
659 | |||
660 | dmac->dev.id = chno / 8; | ||
661 | dmac->dev.bus = &dma_subsys; | ||
662 | |||
663 | err = device_register(&dmac->dev); | ||
664 | if (err) { | ||
665 | printk(KERN_ERR "%s: failed to register device\n", __func__); | ||
666 | goto err_alloc; | ||
667 | } | ||
668 | |||
669 | regs = ioremap(base, 0x200); | ||
670 | if (!regs) { | ||
671 | printk(KERN_ERR "%s: failed to ioremap()\n", __func__); | ||
672 | err = -ENXIO; | ||
673 | goto err_dev; | ||
674 | } | ||
675 | |||
676 | snprintf(clkname, sizeof(clkname), "dma%d", dmac->dev.id); | ||
677 | |||
678 | dmac->clk = clk_get(NULL, clkname); | ||
679 | if (IS_ERR(dmac->clk)) { | ||
680 | printk(KERN_ERR "%s: failed to get clock %s\n", __func__, clkname); | ||
681 | err = PTR_ERR(dmac->clk); | ||
682 | goto err_map; | ||
683 | } | ||
684 | |||
685 | clk_prepare_enable(dmac->clk); | ||
686 | |||
687 | dmac->regs = regs; | ||
688 | dmac->chanbase = chbase; | ||
689 | dmac->channels = chptr; | ||
690 | |||
691 | err = request_irq(irq, s3c64xx_dma_irq, 0, "DMA", dmac); | ||
692 | if (err < 0) { | ||
693 | printk(KERN_ERR "%s: failed to get irq\n", __func__); | ||
694 | goto err_clk; | ||
695 | } | ||
696 | |||
697 | regptr = regs + PL080_Cx_BASE(0); | ||
698 | |||
699 | for (ch = 0; ch < 8; ch++, chptr++) { | ||
700 | pr_debug("%s: registering DMA %d (%p)\n", | ||
701 | __func__, chno + ch, regptr); | ||
702 | |||
703 | chptr->bit = 1 << ch; | ||
704 | chptr->number = chno + ch; | ||
705 | chptr->dmac = dmac; | ||
706 | chptr->regs = regptr; | ||
707 | regptr += PL080_Cx_STRIDE; | ||
708 | } | ||
709 | |||
710 | /* for the moment, permanently enable the controller */ | ||
711 | writel(PL080_CONFIG_ENABLE, regs + PL080_CONFIG); | ||
712 | |||
713 | printk(KERN_INFO "PL080: IRQ %d, at %p, channels %d..%d\n", | ||
714 | irq, regs, chno, chno+8); | ||
715 | |||
716 | return 0; | ||
717 | |||
718 | err_clk: | ||
719 | clk_disable_unprepare(dmac->clk); | ||
720 | clk_put(dmac->clk); | ||
721 | err_map: | ||
722 | iounmap(regs); | ||
723 | err_dev: | ||
724 | device_unregister(&dmac->dev); | ||
725 | err_alloc: | ||
726 | kfree(dmac); | ||
727 | return err; | ||
728 | } | ||
729 | |||
730 | static int __init s3c64xx_dma_init(void) | ||
731 | { | ||
732 | int ret; | ||
733 | |||
734 | /* This driver is not supported when booting with device tree. */ | ||
735 | if (of_have_populated_dt()) | ||
736 | return -ENODEV; | ||
737 | |||
738 | printk(KERN_INFO "%s: Registering DMA channels\n", __func__); | ||
739 | |||
740 | dma_pool = dma_pool_create("DMA-LLI", NULL, sizeof(struct pl080s_lli), 16, 0); | ||
741 | if (!dma_pool) { | ||
742 | printk(KERN_ERR "%s: failed to create pool\n", __func__); | ||
743 | return -ENOMEM; | ||
744 | } | ||
745 | |||
746 | ret = subsys_system_register(&dma_subsys, NULL); | ||
747 | if (ret) { | ||
748 | printk(KERN_ERR "%s: failed to create subsys\n", __func__); | ||
749 | return -ENOMEM; | ||
750 | } | ||
751 | |||
752 | /* Set all DMA configuration to be DMA, not SDMA */ | ||
753 | writel(0xffffff, S3C64XX_SDMA_SEL); | ||
754 | |||
755 | /* Register standard DMA controllers */ | ||
756 | s3c64xx_dma_init1(0, DMACH_UART0, IRQ_DMA0, 0x75000000); | ||
757 | s3c64xx_dma_init1(8, DMACH_PCM1_TX, IRQ_DMA1, 0x75100000); | ||
758 | |||
759 | return 0; | ||
760 | } | ||
761 | |||
762 | arch_initcall(s3c64xx_dma_init); | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/dma.h b/arch/arm/mach-s3c64xx/include/mach/dma.h index fe1a98cf0e4c..059b1fc85037 100644 --- a/arch/arm/mach-s3c64xx/include/mach/dma.h +++ b/arch/arm/mach-s3c64xx/include/mach/dma.h | |||
@@ -11,51 +11,48 @@ | |||
11 | #ifndef __ASM_ARCH_DMA_H | 11 | #ifndef __ASM_ARCH_DMA_H |
12 | #define __ASM_ARCH_DMA_H __FILE__ | 12 | #define __ASM_ARCH_DMA_H __FILE__ |
13 | 13 | ||
14 | #define S3C_DMA_CHANNELS (16) | 14 | #define S3C64XX_DMA_CHAN(name) ((unsigned long)(name)) |
15 | |||
16 | /* DMA0/SDMA0 */ | ||
17 | #define DMACH_UART0 S3C64XX_DMA_CHAN("uart0_tx") | ||
18 | #define DMACH_UART0_SRC2 S3C64XX_DMA_CHAN("uart0_rx") | ||
19 | #define DMACH_UART1 S3C64XX_DMA_CHAN("uart1_tx") | ||
20 | #define DMACH_UART1_SRC2 S3C64XX_DMA_CHAN("uart1_rx") | ||
21 | #define DMACH_UART2 S3C64XX_DMA_CHAN("uart2_tx") | ||
22 | #define DMACH_UART2_SRC2 S3C64XX_DMA_CHAN("uart2_rx") | ||
23 | #define DMACH_UART3 S3C64XX_DMA_CHAN("uart3_tx") | ||
24 | #define DMACH_UART3_SRC2 S3C64XX_DMA_CHAN("uart3_rx") | ||
25 | #define DMACH_PCM0_TX S3C64XX_DMA_CHAN("pcm0_tx") | ||
26 | #define DMACH_PCM0_RX S3C64XX_DMA_CHAN("pcm0_rx") | ||
27 | #define DMACH_I2S0_OUT S3C64XX_DMA_CHAN("i2s0_tx") | ||
28 | #define DMACH_I2S0_IN S3C64XX_DMA_CHAN("i2s0_rx") | ||
29 | #define DMACH_SPI0_TX S3C64XX_DMA_CHAN("spi0_tx") | ||
30 | #define DMACH_SPI0_RX S3C64XX_DMA_CHAN("spi0_rx") | ||
31 | #define DMACH_HSI_I2SV40_TX S3C64XX_DMA_CHAN("i2s2_tx") | ||
32 | #define DMACH_HSI_I2SV40_RX S3C64XX_DMA_CHAN("i2s2_rx") | ||
33 | |||
34 | /* DMA1/SDMA1 */ | ||
35 | #define DMACH_PCM1_TX S3C64XX_DMA_CHAN("pcm1_tx") | ||
36 | #define DMACH_PCM1_RX S3C64XX_DMA_CHAN("pcm1_rx") | ||
37 | #define DMACH_I2S1_OUT S3C64XX_DMA_CHAN("i2s1_tx") | ||
38 | #define DMACH_I2S1_IN S3C64XX_DMA_CHAN("i2s1_rx") | ||
39 | #define DMACH_SPI1_TX S3C64XX_DMA_CHAN("spi1_tx") | ||
40 | #define DMACH_SPI1_RX S3C64XX_DMA_CHAN("spi1_rx") | ||
41 | #define DMACH_AC97_PCMOUT S3C64XX_DMA_CHAN("ac97_out") | ||
42 | #define DMACH_AC97_PCMIN S3C64XX_DMA_CHAN("ac97_in") | ||
43 | #define DMACH_AC97_MICIN S3C64XX_DMA_CHAN("ac97_mic") | ||
44 | #define DMACH_PWM S3C64XX_DMA_CHAN("pwm") | ||
45 | #define DMACH_IRDA S3C64XX_DMA_CHAN("irda") | ||
46 | #define DMACH_EXTERNAL S3C64XX_DMA_CHAN("external") | ||
47 | #define DMACH_SECURITY_RX S3C64XX_DMA_CHAN("sec_rx") | ||
48 | #define DMACH_SECURITY_TX S3C64XX_DMA_CHAN("sec_tx") | ||
15 | 49 | ||
16 | /* see mach-s3c2410/dma.h for notes on dma channel numbers */ | ||
17 | |||
18 | /* Note, for the S3C64XX architecture we keep the DMACH_ | ||
19 | * defines in the order they are allocated to [S]DMA0/[S]DMA1 | ||
20 | * so that is easy to do DHACH_ -> DMA controller conversion | ||
21 | */ | ||
22 | enum dma_ch { | 50 | enum dma_ch { |
23 | /* DMA0/SDMA0 */ | 51 | DMACH_MAX = 32 |
24 | DMACH_UART0 = 0, | 52 | }; |
25 | DMACH_UART0_SRC2, | ||
26 | DMACH_UART1, | ||
27 | DMACH_UART1_SRC2, | ||
28 | DMACH_UART2, | ||
29 | DMACH_UART2_SRC2, | ||
30 | DMACH_UART3, | ||
31 | DMACH_UART3_SRC2, | ||
32 | DMACH_PCM0_TX, | ||
33 | DMACH_PCM0_RX, | ||
34 | DMACH_I2S0_OUT, | ||
35 | DMACH_I2S0_IN, | ||
36 | DMACH_SPI0_TX, | ||
37 | DMACH_SPI0_RX, | ||
38 | DMACH_HSI_I2SV40_TX, | ||
39 | DMACH_HSI_I2SV40_RX, | ||
40 | 53 | ||
41 | /* DMA1/SDMA1 */ | 54 | struct s3c2410_dma_client { |
42 | DMACH_PCM1_TX = 16, | 55 | char *name; |
43 | DMACH_PCM1_RX, | ||
44 | DMACH_I2S1_OUT, | ||
45 | DMACH_I2S1_IN, | ||
46 | DMACH_SPI1_TX, | ||
47 | DMACH_SPI1_RX, | ||
48 | DMACH_AC97_PCMOUT, | ||
49 | DMACH_AC97_PCMIN, | ||
50 | DMACH_AC97_MICIN, | ||
51 | DMACH_PWM, | ||
52 | DMACH_IRDA, | ||
53 | DMACH_EXTERNAL, | ||
54 | DMACH_RES1, | ||
55 | DMACH_RES2, | ||
56 | DMACH_SECURITY_RX, /* SDMA1 only */ | ||
57 | DMACH_SECURITY_TX, /* SDMA1 only */ | ||
58 | DMACH_MAX /* the end */ | ||
59 | }; | 56 | }; |
60 | 57 | ||
61 | static inline bool samsung_dma_has_circular(void) | 58 | static inline bool samsung_dma_has_circular(void) |
@@ -65,67 +62,10 @@ static inline bool samsung_dma_has_circular(void) | |||
65 | 62 | ||
66 | static inline bool samsung_dma_is_dmadev(void) | 63 | static inline bool samsung_dma_is_dmadev(void) |
67 | { | 64 | { |
68 | return false; | 65 | return true; |
69 | } | 66 | } |
70 | #define S3C2410_DMAF_CIRCULAR (1 << 0) | ||
71 | |||
72 | #include <plat/dma.h> | ||
73 | |||
74 | #define DMACH_LOW_LEVEL (1<<28) /* use this to specifiy hardware ch no */ | ||
75 | |||
76 | struct s3c64xx_dma_buff; | ||
77 | |||
78 | /** s3c64xx_dma_buff - S3C64XX DMA buffer descriptor | ||
79 | * @next: Pointer to next buffer in queue or ring. | ||
80 | * @pw: Client provided identifier | ||
81 | * @lli: Pointer to hardware descriptor this buffer is associated with. | ||
82 | * @lli_dma: Hardare address of the descriptor. | ||
83 | */ | ||
84 | struct s3c64xx_dma_buff { | ||
85 | struct s3c64xx_dma_buff *next; | ||
86 | |||
87 | void *pw; | ||
88 | struct pl080s_lli *lli; | ||
89 | dma_addr_t lli_dma; | ||
90 | }; | ||
91 | |||
92 | struct s3c64xx_dmac; | ||
93 | |||
94 | struct s3c2410_dma_chan { | ||
95 | unsigned char number; /* number of this dma channel */ | ||
96 | unsigned char in_use; /* channel allocated */ | ||
97 | unsigned char bit; /* bit for enable/disable/etc */ | ||
98 | unsigned char hw_width; | ||
99 | unsigned char peripheral; | ||
100 | |||
101 | unsigned int flags; | ||
102 | enum dma_data_direction source; | ||
103 | |||
104 | |||
105 | dma_addr_t dev_addr; | ||
106 | |||
107 | struct s3c2410_dma_client *client; | ||
108 | struct s3c64xx_dmac *dmac; /* pointer to controller */ | ||
109 | |||
110 | void __iomem *regs; | ||
111 | |||
112 | /* cdriver callbacks */ | ||
113 | s3c2410_dma_cbfn_t callback_fn; /* buffer done callback */ | ||
114 | s3c2410_dma_opfn_t op_fn; /* channel op callback */ | ||
115 | |||
116 | /* buffer list and information */ | ||
117 | struct s3c64xx_dma_buff *curr; /* current dma buffer */ | ||
118 | struct s3c64xx_dma_buff *next; /* next buffer to load */ | ||
119 | struct s3c64xx_dma_buff *end; /* end of queue */ | ||
120 | |||
121 | /* note, when channel is running in circular mode, curr is the | ||
122 | * first buffer enqueued, end is the last and curr is where the | ||
123 | * last buffer-done event is set-at. The buffers are not freed | ||
124 | * and the last buffer hardware descriptor points back to the | ||
125 | * first. | ||
126 | */ | ||
127 | }; | ||
128 | 67 | ||
129 | #include <plat/dma-core.h> | 68 | #include <linux/amba/pl08x.h> |
69 | #include <plat/dma-ops.h> | ||
130 | 70 | ||
131 | #endif /* __ASM_ARCH_IRQ_H */ | 71 | #endif /* __ASM_ARCH_IRQ_H */ |
diff --git a/arch/arm/mach-s3c64xx/include/mach/gpio.h b/arch/arm/mach-s3c64xx/include/mach/gpio-samsung.h index 8b540c42d5dd..9c81fac3b2d5 100644 --- a/arch/arm/mach-s3c64xx/include/mach/gpio.h +++ b/arch/arm/mach-s3c64xx/include/mach/gpio-samsung.h | |||
@@ -1,5 +1,4 @@ | |||
1 | /* arch/arm/mach-s3c6400/include/mach/gpio.h | 1 | /* |
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | 2 | * Copyright 2008 Openmoko, Inc. |
4 | * Copyright 2008 Simtec Electronics | 3 | * Copyright 2008 Simtec Electronics |
5 | * http://armlinux.simtec.co.uk/ | 4 | * http://armlinux.simtec.co.uk/ |
@@ -12,6 +11,9 @@ | |||
12 | * published by the Free Software Foundation. | 11 | * published by the Free Software Foundation. |
13 | */ | 12 | */ |
14 | 13 | ||
14 | #ifndef GPIO_SAMSUNG_S3C64XX_H | ||
15 | #define GPIO_SAMSUNG_S3C64XX_H | ||
16 | |||
15 | /* GPIO bank sizes */ | 17 | /* GPIO bank sizes */ |
16 | #define S3C64XX_GPIO_A_NR (8) | 18 | #define S3C64XX_GPIO_A_NR (8) |
17 | #define S3C64XX_GPIO_B_NR (7) | 19 | #define S3C64XX_GPIO_B_NR (7) |
@@ -88,6 +90,5 @@ enum s3c_gpio_number { | |||
88 | /* define the number of gpios we need to the one after the GPQ() range */ | 90 | /* define the number of gpios we need to the one after the GPQ() range */ |
89 | #define GPIO_BOARD_START (S3C64XX_GPQ(S3C64XX_GPIO_Q_NR) + 1) | 91 | #define GPIO_BOARD_START (S3C64XX_GPQ(S3C64XX_GPIO_Q_NR) + 1) |
90 | 92 | ||
91 | #define BOARD_NR_GPIOS (16 + CONFIG_SAMSUNG_GPIO_EXTRA) | 93 | #endif /* GPIO_SAMSUNG_S3C64XX_H */ |
92 | 94 | ||
93 | #define ARCH_NR_GPIOS (GPIO_BOARD_START + BOARD_NR_GPIOS) | ||
diff --git a/arch/arm/mach-s3c64xx/mach-anw6410.c b/arch/arm/mach-s3c64xx/mach-anw6410.c index d266dd5f7060..ddeb0e51a962 100644 --- a/arch/arm/mach-s3c64xx/mach-anw6410.c +++ b/arch/arm/mach-s3c64xx/mach-anw6410.c | |||
@@ -49,6 +49,7 @@ | |||
49 | #include <plat/devs.h> | 49 | #include <plat/devs.h> |
50 | #include <plat/cpu.h> | 50 | #include <plat/cpu.h> |
51 | #include <mach/regs-gpio.h> | 51 | #include <mach/regs-gpio.h> |
52 | #include <mach/gpio-samsung.h> | ||
52 | #include <plat/samsung-time.h> | 53 | #include <plat/samsung-time.h> |
53 | 54 | ||
54 | #include "common.h" | 55 | #include "common.h" |
diff --git a/arch/arm/mach-s3c64xx/mach-crag6410.c b/arch/arm/mach-s3c64xx/mach-crag6410.c index 758e31b26550..3df3c372ee1f 100644 --- a/arch/arm/mach-s3c64xx/mach-crag6410.c +++ b/arch/arm/mach-s3c64xx/mach-crag6410.c | |||
@@ -48,8 +48,8 @@ | |||
48 | #include <video/samsung_fimd.h> | 48 | #include <video/samsung_fimd.h> |
49 | #include <mach/hardware.h> | 49 | #include <mach/hardware.h> |
50 | #include <mach/map.h> | 50 | #include <mach/map.h> |
51 | |||
52 | #include <mach/regs-gpio.h> | 51 | #include <mach/regs-gpio.h> |
52 | #include <mach/gpio-samsung.h> | ||
53 | 53 | ||
54 | #include <plat/regs-serial.h> | 54 | #include <plat/regs-serial.h> |
55 | #include <plat/fb.h> | 55 | #include <plat/fb.h> |
diff --git a/arch/arm/mach-s3c64xx/mach-hmt.c b/arch/arm/mach-s3c64xx/mach-hmt.c index 614a03a92cf7..0431016925b9 100644 --- a/arch/arm/mach-s3c64xx/mach-hmt.c +++ b/arch/arm/mach-s3c64xx/mach-hmt.c | |||
@@ -35,6 +35,7 @@ | |||
35 | 35 | ||
36 | #include <plat/regs-serial.h> | 36 | #include <plat/regs-serial.h> |
37 | #include <linux/platform_data/i2c-s3c2410.h> | 37 | #include <linux/platform_data/i2c-s3c2410.h> |
38 | #include <mach/gpio-samsung.h> | ||
38 | #include <plat/fb.h> | 39 | #include <plat/fb.h> |
39 | #include <linux/platform_data/mtd-nand-s3c2410.h> | 40 | #include <linux/platform_data/mtd-nand-s3c2410.h> |
40 | 41 | ||
diff --git a/arch/arm/mach-s3c64xx/mach-mini6410.c b/arch/arm/mach-s3c64xx/mach-mini6410.c index 58d46a3d7b78..8c84d3448dac 100644 --- a/arch/arm/mach-s3c64xx/mach-mini6410.c +++ b/arch/arm/mach-s3c64xx/mach-mini6410.c | |||
@@ -30,6 +30,7 @@ | |||
30 | 30 | ||
31 | #include <mach/map.h> | 31 | #include <mach/map.h> |
32 | #include <mach/regs-gpio.h> | 32 | #include <mach/regs-gpio.h> |
33 | #include <mach/gpio-samsung.h> | ||
33 | 34 | ||
34 | #include <plat/adc.h> | 35 | #include <plat/adc.h> |
35 | #include <plat/cpu.h> | 36 | #include <plat/cpu.h> |
diff --git a/arch/arm/mach-s3c64xx/mach-real6410.c b/arch/arm/mach-s3c64xx/mach-real6410.c index 8bed37b3d5ac..5152026f0e19 100644 --- a/arch/arm/mach-s3c64xx/mach-real6410.c +++ b/arch/arm/mach-s3c64xx/mach-real6410.c | |||
@@ -31,6 +31,7 @@ | |||
31 | 31 | ||
32 | #include <mach/map.h> | 32 | #include <mach/map.h> |
33 | #include <mach/regs-gpio.h> | 33 | #include <mach/regs-gpio.h> |
34 | #include <mach/gpio-samsung.h> | ||
34 | 35 | ||
35 | #include <plat/adc.h> | 36 | #include <plat/adc.h> |
36 | #include <plat/cpu.h> | 37 | #include <plat/cpu.h> |
diff --git a/arch/arm/mach-s3c64xx/mach-s3c64xx-dt.c b/arch/arm/mach-s3c64xx/mach-s3c64xx-dt.c index 7eb9a10fc1af..2fddf38192df 100644 --- a/arch/arm/mach-s3c64xx/mach-s3c64xx-dt.c +++ b/arch/arm/mach-s3c64xx/mach-s3c64xx-dt.c | |||
@@ -8,8 +8,6 @@ | |||
8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include <linux/clk-provider.h> | ||
12 | #include <linux/irqchip.h> | ||
13 | #include <linux/of_platform.h> | 11 | #include <linux/of_platform.h> |
14 | 12 | ||
15 | #include <asm/mach/arch.h> | 13 | #include <asm/mach/arch.h> |
@@ -48,15 +46,9 @@ static void __init s3c64xx_dt_map_io(void) | |||
48 | panic("SoC is not S3C64xx!"); | 46 | panic("SoC is not S3C64xx!"); |
49 | } | 47 | } |
50 | 48 | ||
51 | static void __init s3c64xx_dt_init_irq(void) | ||
52 | { | ||
53 | of_clk_init(NULL); | ||
54 | samsung_wdt_reset_of_init(); | ||
55 | irqchip_init(); | ||
56 | }; | ||
57 | |||
58 | static void __init s3c64xx_dt_init_machine(void) | 49 | static void __init s3c64xx_dt_init_machine(void) |
59 | { | 50 | { |
51 | samsung_wdt_reset_of_init(); | ||
60 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); | 52 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); |
61 | } | 53 | } |
62 | 54 | ||
@@ -79,7 +71,6 @@ DT_MACHINE_START(S3C6400_DT, "Samsung S3C64xx (Flattened Device Tree)") | |||
79 | /* Maintainer: Tomasz Figa <tomasz.figa@gmail.com> */ | 71 | /* Maintainer: Tomasz Figa <tomasz.figa@gmail.com> */ |
80 | .dt_compat = s3c64xx_dt_compat, | 72 | .dt_compat = s3c64xx_dt_compat, |
81 | .map_io = s3c64xx_dt_map_io, | 73 | .map_io = s3c64xx_dt_map_io, |
82 | .init_irq = s3c64xx_dt_init_irq, | ||
83 | .init_machine = s3c64xx_dt_init_machine, | 74 | .init_machine = s3c64xx_dt_init_machine, |
84 | .restart = s3c64xx_dt_restart, | 75 | .restart = s3c64xx_dt_restart, |
85 | MACHINE_END | 76 | MACHINE_END |
diff --git a/arch/arm/mach-s3c64xx/mach-smartq.c b/arch/arm/mach-s3c64xx/mach-smartq.c index a6b338fd0470..5629df905fcd 100644 --- a/arch/arm/mach-s3c64xx/mach-smartq.c +++ b/arch/arm/mach-s3c64xx/mach-smartq.c | |||
@@ -25,6 +25,7 @@ | |||
25 | 25 | ||
26 | #include <mach/map.h> | 26 | #include <mach/map.h> |
27 | #include <mach/regs-gpio.h> | 27 | #include <mach/regs-gpio.h> |
28 | #include <mach/gpio-samsung.h> | ||
28 | 29 | ||
29 | #include <plat/clock.h> | 30 | #include <plat/clock.h> |
30 | #include <plat/cpu.h> | 31 | #include <plat/cpu.h> |
diff --git a/arch/arm/mach-s3c64xx/mach-smartq5.c b/arch/arm/mach-s3c64xx/mach-smartq5.c index 8aca5daf3d05..dec4c08e834f 100644 --- a/arch/arm/mach-s3c64xx/mach-smartq5.c +++ b/arch/arm/mach-s3c64xx/mach-smartq5.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <video/samsung_fimd.h> | 23 | #include <video/samsung_fimd.h> |
24 | #include <mach/map.h> | 24 | #include <mach/map.h> |
25 | #include <mach/regs-gpio.h> | 25 | #include <mach/regs-gpio.h> |
26 | #include <mach/gpio-samsung.h> | ||
26 | 27 | ||
27 | #include <plat/cpu.h> | 28 | #include <plat/cpu.h> |
28 | #include <plat/devs.h> | 29 | #include <plat/devs.h> |
diff --git a/arch/arm/mach-s3c64xx/mach-smartq7.c b/arch/arm/mach-s3c64xx/mach-smartq7.c index a052e107c0b4..27b322069c7d 100644 --- a/arch/arm/mach-s3c64xx/mach-smartq7.c +++ b/arch/arm/mach-s3c64xx/mach-smartq7.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <video/samsung_fimd.h> | 23 | #include <video/samsung_fimd.h> |
24 | #include <mach/map.h> | 24 | #include <mach/map.h> |
25 | #include <mach/regs-gpio.h> | 25 | #include <mach/regs-gpio.h> |
26 | #include <mach/gpio-samsung.h> | ||
26 | 27 | ||
27 | #include <plat/cpu.h> | 28 | #include <plat/cpu.h> |
28 | #include <plat/devs.h> | 29 | #include <plat/devs.h> |
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6400.c b/arch/arm/mach-s3c64xx/mach-smdk6400.c index 27381cfcabbe..150f55fb9e33 100644 --- a/arch/arm/mach-s3c64xx/mach-smdk6400.c +++ b/arch/arm/mach-s3c64xx/mach-smdk6400.c | |||
@@ -35,6 +35,7 @@ | |||
35 | #include <plat/devs.h> | 35 | #include <plat/devs.h> |
36 | #include <plat/cpu.h> | 36 | #include <plat/cpu.h> |
37 | #include <linux/platform_data/i2c-s3c2410.h> | 37 | #include <linux/platform_data/i2c-s3c2410.h> |
38 | #include <mach/gpio-samsung.h> | ||
38 | #include <plat/samsung-time.h> | 39 | #include <plat/samsung-time.h> |
39 | 40 | ||
40 | #include "common.h" | 41 | #include "common.h" |
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6410.c b/arch/arm/mach-s3c64xx/mach-smdk6410.c index d5ea938cc9a1..43261d24a0a5 100644 --- a/arch/arm/mach-s3c64xx/mach-smdk6410.c +++ b/arch/arm/mach-s3c64xx/mach-smdk6410.c | |||
@@ -57,6 +57,7 @@ | |||
57 | 57 | ||
58 | #include <plat/regs-serial.h> | 58 | #include <plat/regs-serial.h> |
59 | #include <mach/regs-gpio.h> | 59 | #include <mach/regs-gpio.h> |
60 | #include <mach/gpio-samsung.h> | ||
60 | #include <linux/platform_data/ata-samsung_cf.h> | 61 | #include <linux/platform_data/ata-samsung_cf.h> |
61 | #include <linux/platform_data/i2c-s3c2410.h> | 62 | #include <linux/platform_data/i2c-s3c2410.h> |
62 | #include <plat/fb.h> | 63 | #include <plat/fb.h> |
diff --git a/arch/arm/mach-s3c64xx/pl080.c b/arch/arm/mach-s3c64xx/pl080.c new file mode 100644 index 000000000000..901a984bddc2 --- /dev/null +++ b/arch/arm/mach-s3c64xx/pl080.c | |||
@@ -0,0 +1,244 @@ | |||
1 | /* | ||
2 | * Samsung's S3C64XX generic DMA support using amba-pl08x driver. | ||
3 | * | ||
4 | * Copyright (c) 2013 Tomasz Figa <tomasz.figa@gmail.com> | ||
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 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/amba/bus.h> | ||
13 | #include <linux/amba/pl080.h> | ||
14 | #include <linux/amba/pl08x.h> | ||
15 | #include <linux/of.h> | ||
16 | |||
17 | #include <mach/irqs.h> | ||
18 | #include <mach/map.h> | ||
19 | |||
20 | #include "regs-sys.h" | ||
21 | |||
22 | static int pl08x_get_xfer_signal(const struct pl08x_channel_data *cd) | ||
23 | { | ||
24 | return cd->min_signal; | ||
25 | } | ||
26 | |||
27 | static void pl08x_put_xfer_signal(const struct pl08x_channel_data *cd, int ch) | ||
28 | { | ||
29 | } | ||
30 | |||
31 | /* | ||
32 | * DMA0 | ||
33 | */ | ||
34 | |||
35 | static struct pl08x_channel_data s3c64xx_dma0_info[] = { | ||
36 | { | ||
37 | .bus_id = "uart0_tx", | ||
38 | .min_signal = 0, | ||
39 | .max_signal = 0, | ||
40 | .periph_buses = PL08X_AHB2, | ||
41 | }, { | ||
42 | .bus_id = "uart0_rx", | ||
43 | .min_signal = 1, | ||
44 | .max_signal = 1, | ||
45 | .periph_buses = PL08X_AHB2, | ||
46 | }, { | ||
47 | .bus_id = "uart1_tx", | ||
48 | .min_signal = 2, | ||
49 | .max_signal = 2, | ||
50 | .periph_buses = PL08X_AHB2, | ||
51 | }, { | ||
52 | .bus_id = "uart1_rx", | ||
53 | .min_signal = 3, | ||
54 | .max_signal = 3, | ||
55 | .periph_buses = PL08X_AHB2, | ||
56 | }, { | ||
57 | .bus_id = "uart2_tx", | ||
58 | .min_signal = 4, | ||
59 | .max_signal = 4, | ||
60 | .periph_buses = PL08X_AHB2, | ||
61 | }, { | ||
62 | .bus_id = "uart2_rx", | ||
63 | .min_signal = 5, | ||
64 | .max_signal = 5, | ||
65 | .periph_buses = PL08X_AHB2, | ||
66 | }, { | ||
67 | .bus_id = "uart3_tx", | ||
68 | .min_signal = 6, | ||
69 | .max_signal = 6, | ||
70 | .periph_buses = PL08X_AHB2, | ||
71 | }, { | ||
72 | .bus_id = "uart3_rx", | ||
73 | .min_signal = 7, | ||
74 | .max_signal = 7, | ||
75 | .periph_buses = PL08X_AHB2, | ||
76 | }, { | ||
77 | .bus_id = "pcm0_tx", | ||
78 | .min_signal = 8, | ||
79 | .max_signal = 8, | ||
80 | .periph_buses = PL08X_AHB2, | ||
81 | }, { | ||
82 | .bus_id = "pcm0_rx", | ||
83 | .min_signal = 9, | ||
84 | .max_signal = 9, | ||
85 | .periph_buses = PL08X_AHB2, | ||
86 | }, { | ||
87 | .bus_id = "i2s0_tx", | ||
88 | .min_signal = 10, | ||
89 | .max_signal = 10, | ||
90 | .periph_buses = PL08X_AHB2, | ||
91 | }, { | ||
92 | .bus_id = "i2s0_rx", | ||
93 | .min_signal = 11, | ||
94 | .max_signal = 11, | ||
95 | .periph_buses = PL08X_AHB2, | ||
96 | }, { | ||
97 | .bus_id = "spi0_tx", | ||
98 | .min_signal = 12, | ||
99 | .max_signal = 12, | ||
100 | .periph_buses = PL08X_AHB2, | ||
101 | }, { | ||
102 | .bus_id = "spi0_rx", | ||
103 | .min_signal = 13, | ||
104 | .max_signal = 13, | ||
105 | .periph_buses = PL08X_AHB2, | ||
106 | }, { | ||
107 | .bus_id = "i2s2_tx", | ||
108 | .min_signal = 14, | ||
109 | .max_signal = 14, | ||
110 | .periph_buses = PL08X_AHB2, | ||
111 | }, { | ||
112 | .bus_id = "i2s2_rx", | ||
113 | .min_signal = 15, | ||
114 | .max_signal = 15, | ||
115 | .periph_buses = PL08X_AHB2, | ||
116 | } | ||
117 | }; | ||
118 | |||
119 | struct pl08x_platform_data s3c64xx_dma0_plat_data = { | ||
120 | .memcpy_channel = { | ||
121 | .bus_id = "memcpy", | ||
122 | .cctl_memcpy = | ||
123 | (PL080_BSIZE_4 << PL080_CONTROL_SB_SIZE_SHIFT | | ||
124 | PL080_BSIZE_4 << PL080_CONTROL_DB_SIZE_SHIFT | | ||
125 | PL080_WIDTH_32BIT << PL080_CONTROL_SWIDTH_SHIFT | | ||
126 | PL080_WIDTH_32BIT << PL080_CONTROL_DWIDTH_SHIFT | | ||
127 | PL080_CONTROL_PROT_BUFF | PL080_CONTROL_PROT_CACHE | | ||
128 | PL080_CONTROL_PROT_SYS), | ||
129 | }, | ||
130 | .lli_buses = PL08X_AHB1, | ||
131 | .mem_buses = PL08X_AHB1, | ||
132 | .get_xfer_signal = pl08x_get_xfer_signal, | ||
133 | .put_xfer_signal = pl08x_put_xfer_signal, | ||
134 | .slave_channels = s3c64xx_dma0_info, | ||
135 | .num_slave_channels = ARRAY_SIZE(s3c64xx_dma0_info), | ||
136 | }; | ||
137 | |||
138 | static AMBA_AHB_DEVICE(s3c64xx_dma0, "dma-pl080s.0", 0, | ||
139 | 0x75000000, {IRQ_DMA0}, &s3c64xx_dma0_plat_data); | ||
140 | |||
141 | /* | ||
142 | * DMA1 | ||
143 | */ | ||
144 | |||
145 | static struct pl08x_channel_data s3c64xx_dma1_info[] = { | ||
146 | { | ||
147 | .bus_id = "pcm1_tx", | ||
148 | .min_signal = 0, | ||
149 | .max_signal = 0, | ||
150 | .periph_buses = PL08X_AHB2, | ||
151 | }, { | ||
152 | .bus_id = "pcm1_rx", | ||
153 | .min_signal = 1, | ||
154 | .max_signal = 1, | ||
155 | .periph_buses = PL08X_AHB2, | ||
156 | }, { | ||
157 | .bus_id = "i2s1_tx", | ||
158 | .min_signal = 2, | ||
159 | .max_signal = 2, | ||
160 | .periph_buses = PL08X_AHB2, | ||
161 | }, { | ||
162 | .bus_id = "i2s1_rx", | ||
163 | .min_signal = 3, | ||
164 | .max_signal = 3, | ||
165 | .periph_buses = PL08X_AHB2, | ||
166 | }, { | ||
167 | .bus_id = "spi1_tx", | ||
168 | .min_signal = 4, | ||
169 | .max_signal = 4, | ||
170 | .periph_buses = PL08X_AHB2, | ||
171 | }, { | ||
172 | .bus_id = "spi1_rx", | ||
173 | .min_signal = 5, | ||
174 | .max_signal = 5, | ||
175 | .periph_buses = PL08X_AHB2, | ||
176 | }, { | ||
177 | .bus_id = "ac97_out", | ||
178 | .min_signal = 6, | ||
179 | .max_signal = 6, | ||
180 | .periph_buses = PL08X_AHB2, | ||
181 | }, { | ||
182 | .bus_id = "ac97_in", | ||
183 | .min_signal = 7, | ||
184 | .max_signal = 7, | ||
185 | .periph_buses = PL08X_AHB2, | ||
186 | }, { | ||
187 | .bus_id = "ac97_mic", | ||
188 | .min_signal = 8, | ||
189 | .max_signal = 8, | ||
190 | .periph_buses = PL08X_AHB2, | ||
191 | }, { | ||
192 | .bus_id = "pwm", | ||
193 | .min_signal = 9, | ||
194 | .max_signal = 9, | ||
195 | .periph_buses = PL08X_AHB2, | ||
196 | }, { | ||
197 | .bus_id = "irda", | ||
198 | .min_signal = 10, | ||
199 | .max_signal = 10, | ||
200 | .periph_buses = PL08X_AHB2, | ||
201 | }, { | ||
202 | .bus_id = "external", | ||
203 | .min_signal = 11, | ||
204 | .max_signal = 11, | ||
205 | .periph_buses = PL08X_AHB2, | ||
206 | }, | ||
207 | }; | ||
208 | |||
209 | struct pl08x_platform_data s3c64xx_dma1_plat_data = { | ||
210 | .memcpy_channel = { | ||
211 | .bus_id = "memcpy", | ||
212 | .cctl_memcpy = | ||
213 | (PL080_BSIZE_4 << PL080_CONTROL_SB_SIZE_SHIFT | | ||
214 | PL080_BSIZE_4 << PL080_CONTROL_DB_SIZE_SHIFT | | ||
215 | PL080_WIDTH_32BIT << PL080_CONTROL_SWIDTH_SHIFT | | ||
216 | PL080_WIDTH_32BIT << PL080_CONTROL_DWIDTH_SHIFT | | ||
217 | PL080_CONTROL_PROT_BUFF | PL080_CONTROL_PROT_CACHE | | ||
218 | PL080_CONTROL_PROT_SYS), | ||
219 | }, | ||
220 | .lli_buses = PL08X_AHB1, | ||
221 | .mem_buses = PL08X_AHB1, | ||
222 | .get_xfer_signal = pl08x_get_xfer_signal, | ||
223 | .put_xfer_signal = pl08x_put_xfer_signal, | ||
224 | .slave_channels = s3c64xx_dma1_info, | ||
225 | .num_slave_channels = ARRAY_SIZE(s3c64xx_dma1_info), | ||
226 | }; | ||
227 | |||
228 | static AMBA_AHB_DEVICE(s3c64xx_dma1, "dma-pl080s.1", 0, | ||
229 | 0x75100000, {IRQ_DMA1}, &s3c64xx_dma1_plat_data); | ||
230 | |||
231 | static int __init s3c64xx_pl080_init(void) | ||
232 | { | ||
233 | /* Set all DMA configuration to be DMA, not SDMA */ | ||
234 | writel(0xffffff, S3C64XX_SDMA_SEL); | ||
235 | |||
236 | if (of_have_populated_dt()) | ||
237 | return 0; | ||
238 | |||
239 | amba_device_register(&s3c64xx_dma0_device, &iomem_resource); | ||
240 | amba_device_register(&s3c64xx_dma1_device, &iomem_resource); | ||
241 | |||
242 | return 0; | ||
243 | } | ||
244 | arch_initcall(s3c64xx_pl080_init); | ||
diff --git a/arch/arm/mach-s3c64xx/pm.c b/arch/arm/mach-s3c64xx/pm.c index 8cdb824a3b43..b5a66986a529 100644 --- a/arch/arm/mach-s3c64xx/pm.c +++ b/arch/arm/mach-s3c64xx/pm.c | |||
@@ -28,6 +28,7 @@ | |||
28 | 28 | ||
29 | #include <mach/regs-gpio.h> | 29 | #include <mach/regs-gpio.h> |
30 | #include <mach/regs-clock.h> | 30 | #include <mach/regs-clock.h> |
31 | #include <mach/gpio-samsung.h> | ||
31 | 32 | ||
32 | #include "regs-gpio-memport.h" | 33 | #include "regs-gpio-memport.h" |
33 | #include "regs-modem.h" | 34 | #include "regs-modem.h" |
diff --git a/arch/arm/mach-s3c64xx/setup-fb-24bpp.c b/arch/arm/mach-s3c64xx/setup-fb-24bpp.c index 2cf80026c58d..9d17bff12d4d 100644 --- a/arch/arm/mach-s3c64xx/setup-fb-24bpp.c +++ b/arch/arm/mach-s3c64xx/setup-fb-24bpp.c | |||
@@ -19,6 +19,7 @@ | |||
19 | 19 | ||
20 | #include <plat/fb.h> | 20 | #include <plat/fb.h> |
21 | #include <plat/gpio-cfg.h> | 21 | #include <plat/gpio-cfg.h> |
22 | #include <mach/gpio-samsung.h> | ||
22 | 23 | ||
23 | void s3c64xx_fb_gpio_setup_24bpp(void) | 24 | void s3c64xx_fb_gpio_setup_24bpp(void) |
24 | { | 25 | { |
diff --git a/arch/arm/mach-s3c64xx/setup-i2c0.c b/arch/arm/mach-s3c64xx/setup-i2c0.c index 40666ba8d607..4b8c1cfdd1fc 100644 --- a/arch/arm/mach-s3c64xx/setup-i2c0.c +++ b/arch/arm/mach-s3c64xx/setup-i2c0.c | |||
@@ -20,6 +20,7 @@ struct platform_device; /* don't need the contents */ | |||
20 | 20 | ||
21 | #include <linux/platform_data/i2c-s3c2410.h> | 21 | #include <linux/platform_data/i2c-s3c2410.h> |
22 | #include <plat/gpio-cfg.h> | 22 | #include <plat/gpio-cfg.h> |
23 | #include <mach/gpio-samsung.h> | ||
23 | 24 | ||
24 | void s3c_i2c0_cfg_gpio(struct platform_device *dev) | 25 | void s3c_i2c0_cfg_gpio(struct platform_device *dev) |
25 | { | 26 | { |
diff --git a/arch/arm/mach-s3c64xx/setup-i2c1.c b/arch/arm/mach-s3c64xx/setup-i2c1.c index 3fdb24c4e62a..cd1df71ee13b 100644 --- a/arch/arm/mach-s3c64xx/setup-i2c1.c +++ b/arch/arm/mach-s3c64xx/setup-i2c1.c | |||
@@ -20,6 +20,7 @@ struct platform_device; /* don't need the contents */ | |||
20 | 20 | ||
21 | #include <linux/platform_data/i2c-s3c2410.h> | 21 | #include <linux/platform_data/i2c-s3c2410.h> |
22 | #include <plat/gpio-cfg.h> | 22 | #include <plat/gpio-cfg.h> |
23 | #include <mach/gpio-samsung.h> | ||
23 | 24 | ||
24 | void s3c_i2c1_cfg_gpio(struct platform_device *dev) | 25 | void s3c_i2c1_cfg_gpio(struct platform_device *dev) |
25 | { | 26 | { |
diff --git a/arch/arm/mach-s3c64xx/setup-ide.c b/arch/arm/mach-s3c64xx/setup-ide.c index 648d8b85bf6b..689fb72e715c 100644 --- a/arch/arm/mach-s3c64xx/setup-ide.c +++ b/arch/arm/mach-s3c64xx/setup-ide.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <mach/map.h> | 17 | #include <mach/map.h> |
18 | #include <mach/regs-clock.h> | 18 | #include <mach/regs-clock.h> |
19 | #include <plat/gpio-cfg.h> | 19 | #include <plat/gpio-cfg.h> |
20 | #include <mach/gpio-samsung.h> | ||
20 | #include <linux/platform_data/ata-samsung_cf.h> | 21 | #include <linux/platform_data/ata-samsung_cf.h> |
21 | 22 | ||
22 | void s3c64xx_ide_setup_gpio(void) | 23 | void s3c64xx_ide_setup_gpio(void) |
diff --git a/arch/arm/mach-s3c64xx/setup-keypad.c b/arch/arm/mach-s3c64xx/setup-keypad.c index 1d4d0ee9e870..6ad9a89dfddf 100644 --- a/arch/arm/mach-s3c64xx/setup-keypad.c +++ b/arch/arm/mach-s3c64xx/setup-keypad.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/gpio.h> | 13 | #include <linux/gpio.h> |
14 | #include <plat/gpio-cfg.h> | 14 | #include <plat/gpio-cfg.h> |
15 | #include <plat/keypad.h> | 15 | #include <plat/keypad.h> |
16 | #include <mach/gpio-samsung.h> | ||
16 | 17 | ||
17 | void samsung_keypad_cfg_gpio(unsigned int rows, unsigned int cols) | 18 | void samsung_keypad_cfg_gpio(unsigned int rows, unsigned int cols) |
18 | { | 19 | { |
diff --git a/arch/arm/mach-s3c64xx/setup-sdhci-gpio.c b/arch/arm/mach-s3c64xx/setup-sdhci-gpio.c index 6eac071afae2..f426b7a16c16 100644 --- a/arch/arm/mach-s3c64xx/setup-sdhci-gpio.c +++ b/arch/arm/mach-s3c64xx/setup-sdhci-gpio.c | |||
@@ -20,6 +20,7 @@ | |||
20 | 20 | ||
21 | #include <plat/gpio-cfg.h> | 21 | #include <plat/gpio-cfg.h> |
22 | #include <plat/sdhci.h> | 22 | #include <plat/sdhci.h> |
23 | #include <mach/gpio-samsung.h> | ||
23 | 24 | ||
24 | void s3c64xx_setup_sdhci0_cfg_gpio(struct platform_device *dev, int width) | 25 | void s3c64xx_setup_sdhci0_cfg_gpio(struct platform_device *dev, int width) |
25 | { | 26 | { |
diff --git a/arch/arm/mach-s3c64xx/setup-spi.c b/arch/arm/mach-s3c64xx/setup-spi.c index 4dc53450d715..5fd1a315c901 100644 --- a/arch/arm/mach-s3c64xx/setup-spi.c +++ b/arch/arm/mach-s3c64xx/setup-spi.c | |||
@@ -10,6 +10,7 @@ | |||
10 | 10 | ||
11 | #include <linux/gpio.h> | 11 | #include <linux/gpio.h> |
12 | #include <plat/gpio-cfg.h> | 12 | #include <plat/gpio-cfg.h> |
13 | #include <mach/gpio-samsung.h> | ||
13 | 14 | ||
14 | #ifdef CONFIG_S3C64XX_DEV_SPI0 | 15 | #ifdef CONFIG_S3C64XX_DEV_SPI0 |
15 | int s3c64xx_spi0_cfg_gpio(void) | 16 | int s3c64xx_spi0_cfg_gpio(void) |
diff --git a/arch/arm/mach-shmobile/board-armadillo800eva.c b/arch/arm/mach-shmobile/board-armadillo800eva.c index 958e3cbf0ac2..8ea87bd45c33 100644 --- a/arch/arm/mach-shmobile/board-armadillo800eva.c +++ b/arch/arm/mach-shmobile/board-armadillo800eva.c | |||
@@ -483,7 +483,7 @@ static struct platform_device lcdc0_device = { | |||
483 | .id = 0, | 483 | .id = 0, |
484 | .dev = { | 484 | .dev = { |
485 | .platform_data = &lcdc0_info, | 485 | .platform_data = &lcdc0_info, |
486 | .coherent_dma_mask = ~0, | 486 | .coherent_dma_mask = DMA_BIT_MASK(32), |
487 | }, | 487 | }, |
488 | }; | 488 | }; |
489 | 489 | ||
@@ -580,7 +580,7 @@ static struct platform_device hdmi_lcdc_device = { | |||
580 | .id = 1, | 580 | .id = 1, |
581 | .dev = { | 581 | .dev = { |
582 | .platform_data = &hdmi_lcdc_info, | 582 | .platform_data = &hdmi_lcdc_info, |
583 | .coherent_dma_mask = ~0, | 583 | .coherent_dma_mask = DMA_BIT_MASK(32), |
584 | }, | 584 | }, |
585 | }; | 585 | }; |
586 | 586 | ||
@@ -614,6 +614,11 @@ static struct regulator_consumer_supply fixed3v3_power_consumers[] = { | |||
614 | REGULATOR_SUPPLY("vqmmc", "sh_mmcif"), | 614 | REGULATOR_SUPPLY("vqmmc", "sh_mmcif"), |
615 | }; | 615 | }; |
616 | 616 | ||
617 | /* Fixed 3.3V regulator used by LCD backlight */ | ||
618 | static struct regulator_consumer_supply fixed5v0_power_consumers[] = { | ||
619 | REGULATOR_SUPPLY("power", "pwm-backlight.0"), | ||
620 | }; | ||
621 | |||
617 | /* Fixed 3.3V regulator to be used by SDHI0 */ | 622 | /* Fixed 3.3V regulator to be used by SDHI0 */ |
618 | static struct regulator_consumer_supply vcc_sdhi0_consumers[] = { | 623 | static struct regulator_consumer_supply vcc_sdhi0_consumers[] = { |
619 | REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"), | 624 | REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"), |
@@ -1196,6 +1201,8 @@ static void __init eva_init(void) | |||
1196 | 1201 | ||
1197 | regulator_register_always_on(0, "fixed-3.3V", fixed3v3_power_consumers, | 1202 | regulator_register_always_on(0, "fixed-3.3V", fixed3v3_power_consumers, |
1198 | ARRAY_SIZE(fixed3v3_power_consumers), 3300000); | 1203 | ARRAY_SIZE(fixed3v3_power_consumers), 3300000); |
1204 | regulator_register_always_on(3, "fixed-5.0V", fixed5v0_power_consumers, | ||
1205 | ARRAY_SIZE(fixed5v0_power_consumers), 5000000); | ||
1199 | 1206 | ||
1200 | pinctrl_register_mappings(eva_pinctrl_map, ARRAY_SIZE(eva_pinctrl_map)); | 1207 | pinctrl_register_mappings(eva_pinctrl_map, ARRAY_SIZE(eva_pinctrl_map)); |
1201 | pwm_add_table(pwm_lookup, ARRAY_SIZE(pwm_lookup)); | 1208 | pwm_add_table(pwm_lookup, ARRAY_SIZE(pwm_lookup)); |
diff --git a/arch/arm/mach-shmobile/board-bockw.c b/arch/arm/mach-shmobile/board-bockw.c index 38611526fe9a..3c4995aebd22 100644 --- a/arch/arm/mach-shmobile/board-bockw.c +++ b/arch/arm/mach-shmobile/board-bockw.c | |||
@@ -679,7 +679,7 @@ static void __init bockw_init(void) | |||
679 | .id = i, | 679 | .id = i, |
680 | .data = &rsnd_card_info[i], | 680 | .data = &rsnd_card_info[i], |
681 | .size_data = sizeof(struct asoc_simple_card_info), | 681 | .size_data = sizeof(struct asoc_simple_card_info), |
682 | .dma_mask = ~0, | 682 | .dma_mask = DMA_BIT_MASK(32), |
683 | }; | 683 | }; |
684 | 684 | ||
685 | platform_device_register_full(&cardinfo); | 685 | platform_device_register_full(&cardinfo); |
diff --git a/arch/arm/mach-shmobile/board-kzm9g.c b/arch/arm/mach-shmobile/board-kzm9g.c index fe689b7fdc9e..bc40b853ffd3 100644 --- a/arch/arm/mach-shmobile/board-kzm9g.c +++ b/arch/arm/mach-shmobile/board-kzm9g.c | |||
@@ -334,7 +334,7 @@ static struct platform_device lcdc_device = { | |||
334 | .resource = lcdc_resources, | 334 | .resource = lcdc_resources, |
335 | .dev = { | 335 | .dev = { |
336 | .platform_data = &lcdc_info, | 336 | .platform_data = &lcdc_info, |
337 | .coherent_dma_mask = ~0, | 337 | .coherent_dma_mask = DMA_BIT_MASK(32), |
338 | }, | 338 | }, |
339 | }; | 339 | }; |
340 | 340 | ||
diff --git a/arch/arm/mach-shmobile/board-lager.c b/arch/arm/mach-shmobile/board-lager.c index a8d3ce646fb9..e0406fd37390 100644 --- a/arch/arm/mach-shmobile/board-lager.c +++ b/arch/arm/mach-shmobile/board-lager.c | |||
@@ -245,7 +245,9 @@ static void __init lager_init(void) | |||
245 | { | 245 | { |
246 | lager_add_standard_devices(); | 246 | lager_add_standard_devices(); |
247 | 247 | ||
248 | phy_register_fixup_for_id("r8a7790-ether-ff:01", lager_ksz8041_fixup); | 248 | if (IS_ENABLED(CONFIG_PHYLIB)) |
249 | phy_register_fixup_for_id("r8a7790-ether-ff:01", | ||
250 | lager_ksz8041_fixup); | ||
249 | } | 251 | } |
250 | 252 | ||
251 | static const char * const lager_boards_compat_dt[] __initconst = { | 253 | static const char * const lager_boards_compat_dt[] __initconst = { |
diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c index af06753eb809..e721d2ccceae 100644 --- a/arch/arm/mach-shmobile/board-mackerel.c +++ b/arch/arm/mach-shmobile/board-mackerel.c | |||
@@ -409,7 +409,7 @@ static struct platform_device lcdc_device = { | |||
409 | .resource = lcdc_resources, | 409 | .resource = lcdc_resources, |
410 | .dev = { | 410 | .dev = { |
411 | .platform_data = &lcdc_info, | 411 | .platform_data = &lcdc_info, |
412 | .coherent_dma_mask = ~0, | 412 | .coherent_dma_mask = DMA_BIT_MASK(32), |
413 | }, | 413 | }, |
414 | }; | 414 | }; |
415 | 415 | ||
@@ -499,7 +499,7 @@ static struct platform_device hdmi_lcdc_device = { | |||
499 | .id = 1, | 499 | .id = 1, |
500 | .dev = { | 500 | .dev = { |
501 | .platform_data = &hdmi_lcdc_info, | 501 | .platform_data = &hdmi_lcdc_info, |
502 | .coherent_dma_mask = ~0, | 502 | .coherent_dma_mask = DMA_BIT_MASK(32), |
503 | }, | 503 | }, |
504 | }; | 504 | }; |
505 | 505 | ||
diff --git a/arch/arm/mach-socfpga/Kconfig b/arch/arm/mach-socfpga/Kconfig index 037100a1563a..aee77f06f887 100644 --- a/arch/arm/mach-socfpga/Kconfig +++ b/arch/arm/mach-socfpga/Kconfig | |||
@@ -10,6 +10,7 @@ config ARCH_SOCFPGA | |||
10 | select GENERIC_CLOCKEVENTS | 10 | select GENERIC_CLOCKEVENTS |
11 | select GPIO_PL061 if GPIOLIB | 11 | select GPIO_PL061 if GPIOLIB |
12 | select HAVE_ARM_SCU | 12 | select HAVE_ARM_SCU |
13 | select HAVE_ARM_TWD if SMP | ||
13 | select HAVE_SMP | 14 | select HAVE_SMP |
14 | select MFD_SYSCON | 15 | select MFD_SYSCON |
15 | select SPARSE_IRQ | 16 | select SPARSE_IRQ |
diff --git a/arch/arm/mach-sunxi/Kconfig b/arch/arm/mach-sunxi/Kconfig index c9e72c89066a..bce0d4277f71 100644 --- a/arch/arm/mach-sunxi/Kconfig +++ b/arch/arm/mach-sunxi/Kconfig | |||
@@ -12,3 +12,4 @@ config ARCH_SUNXI | |||
12 | select PINCTRL_SUNXI | 12 | select PINCTRL_SUNXI |
13 | select SPARSE_IRQ | 13 | select SPARSE_IRQ |
14 | select SUN4I_TIMER | 14 | select SUN4I_TIMER |
15 | select SUN5I_HSTIMER | ||
diff --git a/arch/arm/mach-tegra/board-paz00.c b/arch/arm/mach-tegra/board-paz00.c index 06f024070dab..e4dec9fcb084 100644 --- a/arch/arm/mach-tegra/board-paz00.c +++ b/arch/arm/mach-tegra/board-paz00.c | |||
@@ -18,6 +18,7 @@ | |||
18 | */ | 18 | */ |
19 | 19 | ||
20 | #include <linux/platform_device.h> | 20 | #include <linux/platform_device.h> |
21 | #include <linux/gpio/driver.h> | ||
21 | #include <linux/rfkill-gpio.h> | 22 | #include <linux/rfkill-gpio.h> |
22 | #include "board.h" | 23 | #include "board.h" |
23 | 24 | ||
@@ -36,7 +37,17 @@ static struct platform_device wifi_rfkill_device = { | |||
36 | }, | 37 | }, |
37 | }; | 38 | }; |
38 | 39 | ||
40 | static struct gpiod_lookup_table wifi_gpio_lookup = { | ||
41 | .dev_id = "rfkill_gpio", | ||
42 | .table = { | ||
43 | GPIO_LOOKUP_IDX("tegra-gpio", 25, NULL, 0, 0), | ||
44 | GPIO_LOOKUP_IDX("tegra-gpio", 85, NULL, 1, 0), | ||
45 | { }, | ||
46 | }, | ||
47 | }; | ||
48 | |||
39 | void __init tegra_paz00_wifikill_init(void) | 49 | void __init tegra_paz00_wifikill_init(void) |
40 | { | 50 | { |
51 | gpiod_add_lookup_table(&wifi_gpio_lookup); | ||
41 | platform_device_register(&wifi_rfkill_device); | 52 | platform_device_register(&wifi_rfkill_device); |
42 | } | 53 | } |
diff --git a/arch/arm/mach-tegra/fuse.c b/arch/arm/mach-tegra/fuse.c index d4639c506622..3a9c1f1c219d 100644 --- a/arch/arm/mach-tegra/fuse.c +++ b/arch/arm/mach-tegra/fuse.c | |||
@@ -198,10 +198,12 @@ void __init tegra_init_fuse(void) | |||
198 | switch (tegra_chip_id) { | 198 | switch (tegra_chip_id) { |
199 | case TEGRA20: | 199 | case TEGRA20: |
200 | tegra20_fuse_init_randomness(); | 200 | tegra20_fuse_init_randomness(); |
201 | break; | ||
201 | case TEGRA30: | 202 | case TEGRA30: |
202 | case TEGRA114: | 203 | case TEGRA114: |
203 | default: | 204 | default: |
204 | tegra30_fuse_init_randomness(); | 205 | tegra30_fuse_init_randomness(); |
206 | break; | ||
205 | } | 207 | } |
206 | 208 | ||
207 | pr_info("Tegra Revision: %s SKU: %d CPU Process: %d Core Process: %d\n", | 209 | pr_info("Tegra Revision: %s SKU: %d CPU Process: %d Core Process: %d\n", |
@@ -209,13 +211,3 @@ void __init tegra_init_fuse(void) | |||
209 | tegra_sku_id, tegra_cpu_process_id, | 211 | tegra_sku_id, tegra_cpu_process_id, |
210 | tegra_core_process_id); | 212 | tegra_core_process_id); |
211 | } | 213 | } |
212 | |||
213 | unsigned long long tegra_chip_uid(void) | ||
214 | { | ||
215 | unsigned long long lo, hi; | ||
216 | |||
217 | lo = tegra_fuse_readl(FUSE_UID_LOW); | ||
218 | hi = tegra_fuse_readl(FUSE_UID_HIGH); | ||
219 | return (hi << 32ull) | lo; | ||
220 | } | ||
221 | EXPORT_SYMBOL(tegra_chip_uid); | ||
diff --git a/arch/arm/mach-ux500/board-mop500-audio.c b/arch/arm/mach-ux500/board-mop500-audio.c index 154e15f59702..43d6cb8c381d 100644 --- a/arch/arm/mach-ux500/board-mop500-audio.c +++ b/arch/arm/mach-ux500/board-mop500-audio.c | |||
@@ -31,7 +31,7 @@ static struct stedma40_chan_cfg msp0_dma_tx = { | |||
31 | }; | 31 | }; |
32 | 32 | ||
33 | struct msp_i2s_platform_data msp0_platform_data = { | 33 | struct msp_i2s_platform_data msp0_platform_data = { |
34 | .id = MSP_I2S_0, | 34 | .id = 0, |
35 | .msp_i2s_dma_rx = &msp0_dma_rx, | 35 | .msp_i2s_dma_rx = &msp0_dma_rx, |
36 | .msp_i2s_dma_tx = &msp0_dma_tx, | 36 | .msp_i2s_dma_tx = &msp0_dma_tx, |
37 | }; | 37 | }; |
@@ -49,7 +49,7 @@ static struct stedma40_chan_cfg msp1_dma_tx = { | |||
49 | }; | 49 | }; |
50 | 50 | ||
51 | struct msp_i2s_platform_data msp1_platform_data = { | 51 | struct msp_i2s_platform_data msp1_platform_data = { |
52 | .id = MSP_I2S_1, | 52 | .id = 1, |
53 | .msp_i2s_dma_rx = NULL, | 53 | .msp_i2s_dma_rx = NULL, |
54 | .msp_i2s_dma_tx = &msp1_dma_tx, | 54 | .msp_i2s_dma_tx = &msp1_dma_tx, |
55 | }; | 55 | }; |
@@ -69,13 +69,13 @@ static struct stedma40_chan_cfg msp2_dma_tx = { | |||
69 | }; | 69 | }; |
70 | 70 | ||
71 | struct msp_i2s_platform_data msp2_platform_data = { | 71 | struct msp_i2s_platform_data msp2_platform_data = { |
72 | .id = MSP_I2S_2, | 72 | .id = 2, |
73 | .msp_i2s_dma_rx = &msp2_dma_rx, | 73 | .msp_i2s_dma_rx = &msp2_dma_rx, |
74 | .msp_i2s_dma_tx = &msp2_dma_tx, | 74 | .msp_i2s_dma_tx = &msp2_dma_tx, |
75 | }; | 75 | }; |
76 | 76 | ||
77 | struct msp_i2s_platform_data msp3_platform_data = { | 77 | struct msp_i2s_platform_data msp3_platform_data = { |
78 | .id = MSP_I2S_3, | 78 | .id = 3, |
79 | .msp_i2s_dma_rx = &msp1_dma_rx, | 79 | .msp_i2s_dma_rx = &msp1_dma_rx, |
80 | .msp_i2s_dma_tx = NULL, | 80 | .msp_i2s_dma_tx = NULL, |
81 | }; | 81 | }; |
diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c index 2e85c1e72535..12c7e5c03ea4 100644 --- a/arch/arm/mach-ux500/cpu-db8500.c +++ b/arch/arm/mach-ux500/cpu-db8500.c | |||
@@ -140,6 +140,10 @@ static struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = { | |||
140 | /* Requires call-back bindings. */ | 140 | /* Requires call-back bindings. */ |
141 | OF_DEV_AUXDATA("arm,cortex-a9-pmu", 0, "arm-pmu", &db8500_pmu_platdata), | 141 | OF_DEV_AUXDATA("arm,cortex-a9-pmu", 0, "arm-pmu", &db8500_pmu_platdata), |
142 | /* Requires DMA bindings. */ | 142 | /* Requires DMA bindings. */ |
143 | OF_DEV_AUXDATA("arm,pl18x", 0x80126000, "sdi0", &mop500_sdi0_data), | ||
144 | OF_DEV_AUXDATA("arm,pl18x", 0x80118000, "sdi1", &mop500_sdi1_data), | ||
145 | OF_DEV_AUXDATA("arm,pl18x", 0x80005000, "sdi2", &mop500_sdi2_data), | ||
146 | OF_DEV_AUXDATA("arm,pl18x", 0x80114000, "sdi4", &mop500_sdi4_data), | ||
143 | OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80123000, | 147 | OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80123000, |
144 | "ux500-msp-i2s.0", &msp0_platform_data), | 148 | "ux500-msp-i2s.0", &msp0_platform_data), |
145 | OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80124000, | 149 | OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80124000, |
diff --git a/arch/arm/mach-vexpress/spc.c b/arch/arm/mach-vexpress/spc.c index 033d34dcbd3f..c26ef5b92ca7 100644 --- a/arch/arm/mach-vexpress/spc.c +++ b/arch/arm/mach-vexpress/spc.c | |||
@@ -53,6 +53,11 @@ | |||
53 | #define A15_BX_ADDR0 0x68 | 53 | #define A15_BX_ADDR0 0x68 |
54 | #define A7_BX_ADDR0 0x78 | 54 | #define A7_BX_ADDR0 0x78 |
55 | 55 | ||
56 | /* SPC CPU/cluster reset statue */ | ||
57 | #define STANDBYWFI_STAT 0x3c | ||
58 | #define STANDBYWFI_STAT_A15_CPU_MASK(cpu) (1 << (cpu)) | ||
59 | #define STANDBYWFI_STAT_A7_CPU_MASK(cpu) (1 << (3 + (cpu))) | ||
60 | |||
56 | /* SPC system config interface registers */ | 61 | /* SPC system config interface registers */ |
57 | #define SYSCFG_WDATA 0x70 | 62 | #define SYSCFG_WDATA 0x70 |
58 | #define SYSCFG_RDATA 0x74 | 63 | #define SYSCFG_RDATA 0x74 |
@@ -213,6 +218,41 @@ void ve_spc_powerdown(u32 cluster, bool enable) | |||
213 | writel_relaxed(enable, info->baseaddr + pwdrn_reg); | 218 | writel_relaxed(enable, info->baseaddr + pwdrn_reg); |
214 | } | 219 | } |
215 | 220 | ||
221 | static u32 standbywfi_cpu_mask(u32 cpu, u32 cluster) | ||
222 | { | ||
223 | return cluster_is_a15(cluster) ? | ||
224 | STANDBYWFI_STAT_A15_CPU_MASK(cpu) | ||
225 | : STANDBYWFI_STAT_A7_CPU_MASK(cpu); | ||
226 | } | ||
227 | |||
228 | /** | ||
229 | * ve_spc_cpu_in_wfi(u32 cpu, u32 cluster) | ||
230 | * | ||
231 | * @cpu: mpidr[7:0] bitfield describing CPU affinity level within cluster | ||
232 | * @cluster: mpidr[15:8] bitfield describing cluster affinity level | ||
233 | * | ||
234 | * @return: non-zero if and only if the specified CPU is in WFI | ||
235 | * | ||
236 | * Take care when interpreting the result of this function: a CPU might | ||
237 | * be in WFI temporarily due to idle, and is not necessarily safely | ||
238 | * parked. | ||
239 | */ | ||
240 | int ve_spc_cpu_in_wfi(u32 cpu, u32 cluster) | ||
241 | { | ||
242 | int ret; | ||
243 | u32 mask = standbywfi_cpu_mask(cpu, cluster); | ||
244 | |||
245 | if (cluster >= MAX_CLUSTERS) | ||
246 | return 1; | ||
247 | |||
248 | ret = readl_relaxed(info->baseaddr + STANDBYWFI_STAT); | ||
249 | |||
250 | pr_debug("%s: PCFGREG[0x%X] = 0x%08X, mask = 0x%X\n", | ||
251 | __func__, STANDBYWFI_STAT, ret, mask); | ||
252 | |||
253 | return ret & mask; | ||
254 | } | ||
255 | |||
216 | static int ve_spc_get_performance(int cluster, u32 *freq) | 256 | static int ve_spc_get_performance(int cluster, u32 *freq) |
217 | { | 257 | { |
218 | struct ve_spc_opp *opps = info->opps[cluster]; | 258 | struct ve_spc_opp *opps = info->opps[cluster]; |
diff --git a/arch/arm/mach-vexpress/spc.h b/arch/arm/mach-vexpress/spc.h index dbd44c3720f9..793d065243b9 100644 --- a/arch/arm/mach-vexpress/spc.h +++ b/arch/arm/mach-vexpress/spc.h | |||
@@ -20,5 +20,6 @@ void ve_spc_global_wakeup_irq(bool set); | |||
20 | void ve_spc_cpu_wakeup_irq(u32 cluster, u32 cpu, bool set); | 20 | void ve_spc_cpu_wakeup_irq(u32 cluster, u32 cpu, bool set); |
21 | void ve_spc_set_resume_addr(u32 cluster, u32 cpu, u32 addr); | 21 | void ve_spc_set_resume_addr(u32 cluster, u32 cpu, u32 addr); |
22 | void ve_spc_powerdown(u32 cluster, bool enable); | 22 | void ve_spc_powerdown(u32 cluster, bool enable); |
23 | int ve_spc_cpu_in_wfi(u32 cpu, u32 cluster); | ||
23 | 24 | ||
24 | #endif | 25 | #endif |
diff --git a/arch/arm/mach-vexpress/tc2_pm.c b/arch/arm/mach-vexpress/tc2_pm.c index 05a364c5077a..29e7785a54bc 100644 --- a/arch/arm/mach-vexpress/tc2_pm.c +++ b/arch/arm/mach-vexpress/tc2_pm.c | |||
@@ -12,6 +12,7 @@ | |||
12 | * published by the Free Software Foundation. | 12 | * published by the Free Software Foundation. |
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <linux/delay.h> | ||
15 | #include <linux/init.h> | 16 | #include <linux/init.h> |
16 | #include <linux/io.h> | 17 | #include <linux/io.h> |
17 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
@@ -32,11 +33,17 @@ | |||
32 | #include "spc.h" | 33 | #include "spc.h" |
33 | 34 | ||
34 | /* SCC conf registers */ | 35 | /* SCC conf registers */ |
36 | #define RESET_CTRL 0x018 | ||
37 | #define RESET_A15_NCORERESET(cpu) (1 << (2 + (cpu))) | ||
38 | #define RESET_A7_NCORERESET(cpu) (1 << (16 + (cpu))) | ||
39 | |||
35 | #define A15_CONF 0x400 | 40 | #define A15_CONF 0x400 |
36 | #define A7_CONF 0x500 | 41 | #define A7_CONF 0x500 |
37 | #define SYS_INFO 0x700 | 42 | #define SYS_INFO 0x700 |
38 | #define SPC_BASE 0xb00 | 43 | #define SPC_BASE 0xb00 |
39 | 44 | ||
45 | static void __iomem *scc; | ||
46 | |||
40 | /* | 47 | /* |
41 | * We can't use regular spinlocks. In the switcher case, it is possible | 48 | * We can't use regular spinlocks. In the switcher case, it is possible |
42 | * for an outbound CPU to call power_down() after its inbound counterpart | 49 | * for an outbound CPU to call power_down() after its inbound counterpart |
@@ -190,6 +197,55 @@ static void tc2_pm_power_down(void) | |||
190 | tc2_pm_down(0); | 197 | tc2_pm_down(0); |
191 | } | 198 | } |
192 | 199 | ||
200 | static int tc2_core_in_reset(unsigned int cpu, unsigned int cluster) | ||
201 | { | ||
202 | u32 mask = cluster ? | ||
203 | RESET_A7_NCORERESET(cpu) | ||
204 | : RESET_A15_NCORERESET(cpu); | ||
205 | |||
206 | return !(readl_relaxed(scc + RESET_CTRL) & mask); | ||
207 | } | ||
208 | |||
209 | #define POLL_MSEC 10 | ||
210 | #define TIMEOUT_MSEC 1000 | ||
211 | |||
212 | static int tc2_pm_power_down_finish(unsigned int cpu, unsigned int cluster) | ||
213 | { | ||
214 | unsigned tries; | ||
215 | |||
216 | pr_debug("%s: cpu %u cluster %u\n", __func__, cpu, cluster); | ||
217 | BUG_ON(cluster >= TC2_CLUSTERS || cpu >= TC2_MAX_CPUS_PER_CLUSTER); | ||
218 | |||
219 | for (tries = 0; tries < TIMEOUT_MSEC / POLL_MSEC; ++tries) { | ||
220 | /* | ||
221 | * Only examine the hardware state if the target CPU has | ||
222 | * caught up at least as far as tc2_pm_down(): | ||
223 | */ | ||
224 | if (ACCESS_ONCE(tc2_pm_use_count[cpu][cluster]) == 0) { | ||
225 | pr_debug("%s(cpu=%u, cluster=%u): RESET_CTRL = 0x%08X\n", | ||
226 | __func__, cpu, cluster, | ||
227 | readl_relaxed(scc + RESET_CTRL)); | ||
228 | |||
229 | /* | ||
230 | * We need the CPU to reach WFI, but the power | ||
231 | * controller may put the cluster in reset and | ||
232 | * power it off as soon as that happens, before | ||
233 | * we have a chance to see STANDBYWFI. | ||
234 | * | ||
235 | * So we need to check for both conditions: | ||
236 | */ | ||
237 | if (tc2_core_in_reset(cpu, cluster) || | ||
238 | ve_spc_cpu_in_wfi(cpu, cluster)) | ||
239 | return 0; /* success: the CPU is halted */ | ||
240 | } | ||
241 | |||
242 | /* Otherwise, wait and retry: */ | ||
243 | msleep(POLL_MSEC); | ||
244 | } | ||
245 | |||
246 | return -ETIMEDOUT; /* timeout */ | ||
247 | } | ||
248 | |||
193 | static void tc2_pm_suspend(u64 residency) | 249 | static void tc2_pm_suspend(u64 residency) |
194 | { | 250 | { |
195 | unsigned int mpidr, cpu, cluster; | 251 | unsigned int mpidr, cpu, cluster; |
@@ -232,10 +288,11 @@ static void tc2_pm_powered_up(void) | |||
232 | } | 288 | } |
233 | 289 | ||
234 | static const struct mcpm_platform_ops tc2_pm_power_ops = { | 290 | static const struct mcpm_platform_ops tc2_pm_power_ops = { |
235 | .power_up = tc2_pm_power_up, | 291 | .power_up = tc2_pm_power_up, |
236 | .power_down = tc2_pm_power_down, | 292 | .power_down = tc2_pm_power_down, |
237 | .suspend = tc2_pm_suspend, | 293 | .power_down_finish = tc2_pm_power_down_finish, |
238 | .powered_up = tc2_pm_powered_up, | 294 | .suspend = tc2_pm_suspend, |
295 | .powered_up = tc2_pm_powered_up, | ||
239 | }; | 296 | }; |
240 | 297 | ||
241 | static bool __init tc2_pm_usage_count_init(void) | 298 | static bool __init tc2_pm_usage_count_init(void) |
@@ -269,7 +326,6 @@ static void __naked tc2_pm_power_up_setup(unsigned int affinity_level) | |||
269 | static int __init tc2_pm_init(void) | 326 | static int __init tc2_pm_init(void) |
270 | { | 327 | { |
271 | int ret, irq; | 328 | int ret, irq; |
272 | void __iomem *scc; | ||
273 | u32 a15_cluster_id, a7_cluster_id, sys_info; | 329 | u32 a15_cluster_id, a7_cluster_id, sys_info; |
274 | struct device_node *np; | 330 | struct device_node *np; |
275 | 331 | ||
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 79f8b39801a8..f61a5707823a 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
@@ -9,6 +9,7 @@ | |||
9 | * | 9 | * |
10 | * DMA uncached mapping support. | 10 | * DMA uncached mapping support. |
11 | */ | 11 | */ |
12 | #include <linux/bootmem.h> | ||
12 | #include <linux/module.h> | 13 | #include <linux/module.h> |
13 | #include <linux/mm.h> | 14 | #include <linux/mm.h> |
14 | #include <linux/gfp.h> | 15 | #include <linux/gfp.h> |
@@ -157,6 +158,44 @@ struct dma_map_ops arm_coherent_dma_ops = { | |||
157 | }; | 158 | }; |
158 | EXPORT_SYMBOL(arm_coherent_dma_ops); | 159 | EXPORT_SYMBOL(arm_coherent_dma_ops); |
159 | 160 | ||
161 | static int __dma_supported(struct device *dev, u64 mask, bool warn) | ||
162 | { | ||
163 | unsigned long max_dma_pfn; | ||
164 | |||
165 | /* | ||
166 | * If the mask allows for more memory than we can address, | ||
167 | * and we actually have that much memory, then we must | ||
168 | * indicate that DMA to this device is not supported. | ||
169 | */ | ||
170 | if (sizeof(mask) != sizeof(dma_addr_t) && | ||
171 | mask > (dma_addr_t)~0 && | ||
172 | dma_to_pfn(dev, ~0) < max_pfn) { | ||
173 | if (warn) { | ||
174 | dev_warn(dev, "Coherent DMA mask %#llx is larger than dma_addr_t allows\n", | ||
175 | mask); | ||
176 | dev_warn(dev, "Driver did not use or check the return value from dma_set_coherent_mask()?\n"); | ||
177 | } | ||
178 | return 0; | ||
179 | } | ||
180 | |||
181 | max_dma_pfn = min(max_pfn, arm_dma_pfn_limit); | ||
182 | |||
183 | /* | ||
184 | * Translate the device's DMA mask to a PFN limit. This | ||
185 | * PFN number includes the page which we can DMA to. | ||
186 | */ | ||
187 | if (dma_to_pfn(dev, mask) < max_dma_pfn) { | ||
188 | if (warn) | ||
189 | dev_warn(dev, "Coherent DMA mask %#llx (pfn %#lx-%#lx) covers a smaller range of system memory than the DMA zone pfn 0x0-%#lx\n", | ||
190 | mask, | ||
191 | dma_to_pfn(dev, 0), dma_to_pfn(dev, mask) + 1, | ||
192 | max_dma_pfn + 1); | ||
193 | return 0; | ||
194 | } | ||
195 | |||
196 | return 1; | ||
197 | } | ||
198 | |||
160 | static u64 get_coherent_dma_mask(struct device *dev) | 199 | static u64 get_coherent_dma_mask(struct device *dev) |
161 | { | 200 | { |
162 | u64 mask = (u64)DMA_BIT_MASK(32); | 201 | u64 mask = (u64)DMA_BIT_MASK(32); |
@@ -173,32 +212,8 @@ static u64 get_coherent_dma_mask(struct device *dev) | |||
173 | return 0; | 212 | return 0; |
174 | } | 213 | } |
175 | 214 | ||
176 | /* | 215 | if (!__dma_supported(dev, mask, true)) |
177 | * If the mask allows for more memory than we can address, | ||
178 | * and we actually have that much memory, then fail the | ||
179 | * allocation. | ||
180 | */ | ||
181 | if (sizeof(mask) != sizeof(dma_addr_t) && | ||
182 | mask > (dma_addr_t)~0 && | ||
183 | dma_to_pfn(dev, ~0) > arm_dma_pfn_limit) { | ||
184 | dev_warn(dev, "Coherent DMA mask %#llx is larger than dma_addr_t allows\n", | ||
185 | mask); | ||
186 | dev_warn(dev, "Driver did not use or check the return value from dma_set_coherent_mask()?\n"); | ||
187 | return 0; | ||
188 | } | ||
189 | |||
190 | /* | ||
191 | * Now check that the mask, when translated to a PFN, | ||
192 | * fits within the allowable addresses which we can | ||
193 | * allocate. | ||
194 | */ | ||
195 | if (dma_to_pfn(dev, mask) < arm_dma_pfn_limit) { | ||
196 | dev_warn(dev, "Coherent DMA mask %#llx (pfn %#lx-%#lx) covers a smaller range of system memory than the DMA zone pfn 0x0-%#lx\n", | ||
197 | mask, | ||
198 | dma_to_pfn(dev, 0), dma_to_pfn(dev, mask) + 1, | ||
199 | arm_dma_pfn_limit + 1); | ||
200 | return 0; | 216 | return 0; |
201 | } | ||
202 | } | 217 | } |
203 | 218 | ||
204 | return mask; | 219 | return mask; |
@@ -1027,28 +1042,7 @@ void arm_dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, | |||
1027 | */ | 1042 | */ |
1028 | int dma_supported(struct device *dev, u64 mask) | 1043 | int dma_supported(struct device *dev, u64 mask) |
1029 | { | 1044 | { |
1030 | unsigned long limit; | 1045 | return __dma_supported(dev, mask, false); |
1031 | |||
1032 | /* | ||
1033 | * If the mask allows for more memory than we can address, | ||
1034 | * and we actually have that much memory, then we must | ||
1035 | * indicate that DMA to this device is not supported. | ||
1036 | */ | ||
1037 | if (sizeof(mask) != sizeof(dma_addr_t) && | ||
1038 | mask > (dma_addr_t)~0 && | ||
1039 | dma_to_pfn(dev, ~0) > arm_dma_pfn_limit) | ||
1040 | return 0; | ||
1041 | |||
1042 | /* | ||
1043 | * Translate the device's DMA mask to a PFN limit. This | ||
1044 | * PFN number includes the page which we can DMA to. | ||
1045 | */ | ||
1046 | limit = dma_to_pfn(dev, mask); | ||
1047 | |||
1048 | if (limit < arm_dma_pfn_limit) | ||
1049 | return 0; | ||
1050 | |||
1051 | return 1; | ||
1052 | } | 1046 | } |
1053 | EXPORT_SYMBOL(dma_supported); | 1047 | EXPORT_SYMBOL(dma_supported); |
1054 | 1048 | ||
diff --git a/arch/arm/mm/flush.c b/arch/arm/mm/flush.c index 6d5ba9afb16a..3387e60e4ea3 100644 --- a/arch/arm/mm/flush.c +++ b/arch/arm/mm/flush.c | |||
@@ -175,16 +175,16 @@ void __flush_dcache_page(struct address_space *mapping, struct page *page) | |||
175 | unsigned long i; | 175 | unsigned long i; |
176 | if (cache_is_vipt_nonaliasing()) { | 176 | if (cache_is_vipt_nonaliasing()) { |
177 | for (i = 0; i < (1 << compound_order(page)); i++) { | 177 | for (i = 0; i < (1 << compound_order(page)); i++) { |
178 | void *addr = kmap_atomic(page); | 178 | void *addr = kmap_atomic(page + i); |
179 | __cpuc_flush_dcache_area(addr, PAGE_SIZE); | 179 | __cpuc_flush_dcache_area(addr, PAGE_SIZE); |
180 | kunmap_atomic(addr); | 180 | kunmap_atomic(addr); |
181 | } | 181 | } |
182 | } else { | 182 | } else { |
183 | for (i = 0; i < (1 << compound_order(page)); i++) { | 183 | for (i = 0; i < (1 << compound_order(page)); i++) { |
184 | void *addr = kmap_high_get(page); | 184 | void *addr = kmap_high_get(page + i); |
185 | if (addr) { | 185 | if (addr) { |
186 | __cpuc_flush_dcache_area(addr, PAGE_SIZE); | 186 | __cpuc_flush_dcache_area(addr, PAGE_SIZE); |
187 | kunmap_high(page); | 187 | kunmap_high(page + i); |
188 | } | 188 | } |
189 | } | 189 | } |
190 | } | 190 | } |
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index 3e8f106ee5fe..11eb8add7820 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c | |||
@@ -92,9 +92,6 @@ void show_mem(unsigned int filter) | |||
92 | printk("Mem-info:\n"); | 92 | printk("Mem-info:\n"); |
93 | show_free_areas(filter); | 93 | show_free_areas(filter); |
94 | 94 | ||
95 | if (filter & SHOW_MEM_FILTER_PAGE_COUNT) | ||
96 | return; | ||
97 | |||
98 | for_each_bank (i, mi) { | 95 | for_each_bank (i, mi) { |
99 | struct membank *bank = &mi->bank[i]; | 96 | struct membank *bank = &mi->bank[i]; |
100 | unsigned int pfn1, pfn2; | 97 | unsigned int pfn1, pfn2; |
@@ -461,7 +458,7 @@ free_memmap(unsigned long start_pfn, unsigned long end_pfn) | |||
461 | * free the section of the memmap array. | 458 | * free the section of the memmap array. |
462 | */ | 459 | */ |
463 | if (pg < pgend) | 460 | if (pg < pgend) |
464 | free_bootmem(pg, pgend - pg); | 461 | memblock_free_early(pg, pgend - pg); |
465 | } | 462 | } |
466 | 463 | ||
467 | /* | 464 | /* |
diff --git a/arch/arm/mm/mmap.c b/arch/arm/mm/mmap.c index d27158c38eb0..5e85ed371364 100644 --- a/arch/arm/mm/mmap.c +++ b/arch/arm/mm/mmap.c | |||
@@ -146,7 +146,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, | |||
146 | 146 | ||
147 | info.flags = VM_UNMAPPED_AREA_TOPDOWN; | 147 | info.flags = VM_UNMAPPED_AREA_TOPDOWN; |
148 | info.length = len; | 148 | info.length = len; |
149 | info.low_limit = PAGE_SIZE; | 149 | info.low_limit = FIRST_USER_ADDRESS; |
150 | info.high_limit = mm->mmap_base; | 150 | info.high_limit = mm->mmap_base; |
151 | info.align_mask = do_align ? (PAGE_MASK & (SHMLBA - 1)) : 0; | 151 | info.align_mask = do_align ? (PAGE_MASK & (SHMLBA - 1)) : 0; |
152 | info.align_offset = pgoff << PAGE_SHIFT; | 152 | info.align_offset = pgoff << PAGE_SHIFT; |
diff --git a/arch/arm/mm/pgd.c b/arch/arm/mm/pgd.c index 0acb089d0f70..1046b373d1ae 100644 --- a/arch/arm/mm/pgd.c +++ b/arch/arm/mm/pgd.c | |||
@@ -87,7 +87,8 @@ pgd_t *pgd_alloc(struct mm_struct *mm) | |||
87 | init_pud = pud_offset(init_pgd, 0); | 87 | init_pud = pud_offset(init_pgd, 0); |
88 | init_pmd = pmd_offset(init_pud, 0); | 88 | init_pmd = pmd_offset(init_pud, 0); |
89 | init_pte = pte_offset_map(init_pmd, 0); | 89 | init_pte = pte_offset_map(init_pmd, 0); |
90 | set_pte_ext(new_pte, *init_pte, 0); | 90 | set_pte_ext(new_pte + 0, init_pte[0], 0); |
91 | set_pte_ext(new_pte + 1, init_pte[1], 0); | ||
91 | pte_unmap(init_pte); | 92 | pte_unmap(init_pte); |
92 | pte_unmap(new_pte); | 93 | pte_unmap(new_pte); |
93 | } | 94 | } |
diff --git a/arch/arm/net/bpf_jit_32.c b/arch/arm/net/bpf_jit_32.c index 9ed155ad0f97..271b5e971568 100644 --- a/arch/arm/net/bpf_jit_32.c +++ b/arch/arm/net/bpf_jit_32.c | |||
@@ -641,10 +641,10 @@ load_ind: | |||
641 | emit(ARM_MUL(r_A, r_A, r_X), ctx); | 641 | emit(ARM_MUL(r_A, r_A, r_X), ctx); |
642 | break; | 642 | break; |
643 | case BPF_S_ALU_DIV_K: | 643 | case BPF_S_ALU_DIV_K: |
644 | /* current k == reciprocal_value(userspace k) */ | 644 | if (k == 1) |
645 | break; | ||
645 | emit_mov_i(r_scratch, k, ctx); | 646 | emit_mov_i(r_scratch, k, ctx); |
646 | /* A = top 32 bits of the product */ | 647 | emit_udiv(r_A, r_A, r_scratch, ctx); |
647 | emit(ARM_UMULL(r_scratch, r_A, r_A, r_scratch), ctx); | ||
648 | break; | 648 | break; |
649 | case BPF_S_ALU_DIV_X: | 649 | case BPF_S_ALU_DIV_X: |
650 | update_on_xread(ctx); | 650 | update_on_xread(ctx); |
diff --git a/arch/arm/plat-omap/include/plat/dmtimer.h b/arch/arm/plat-omap/include/plat/dmtimer.h index fb92abb91628..2861b155485a 100644 --- a/arch/arm/plat-omap/include/plat/dmtimer.h +++ b/arch/arm/plat-omap/include/plat/dmtimer.h | |||
@@ -336,8 +336,11 @@ static inline void __omap_dm_timer_enable_posted(struct omap_dm_timer *timer) | |||
336 | if (timer->posted) | 336 | if (timer->posted) |
337 | return; | 337 | return; |
338 | 338 | ||
339 | if (timer->errata & OMAP_TIMER_ERRATA_I103_I767) | 339 | if (timer->errata & OMAP_TIMER_ERRATA_I103_I767) { |
340 | timer->posted = OMAP_TIMER_NONPOSTED; | ||
341 | __omap_dm_timer_write(timer, OMAP_TIMER_IF_CTRL_REG, 0, 0); | ||
340 | return; | 342 | return; |
343 | } | ||
341 | 344 | ||
342 | __omap_dm_timer_write(timer, OMAP_TIMER_IF_CTRL_REG, | 345 | __omap_dm_timer_write(timer, OMAP_TIMER_IF_CTRL_REG, |
343 | OMAP_TIMER_CTRL_POSTED, 0); | 346 | OMAP_TIMER_CTRL_POSTED, 0); |
diff --git a/arch/arm/plat-samsung/devs.c b/arch/arm/plat-samsung/devs.c index 99a3590f0349..ac07e871f6a7 100644 --- a/arch/arm/plat-samsung/devs.c +++ b/arch/arm/plat-samsung/devs.c | |||
@@ -1468,6 +1468,8 @@ void __init s3c64xx_spi0_set_platdata(int (*cfg_gpio)(void), int src_clk_nr, | |||
1468 | pd.cfg_gpio = (cfg_gpio) ? cfg_gpio : s3c64xx_spi0_cfg_gpio; | 1468 | pd.cfg_gpio = (cfg_gpio) ? cfg_gpio : s3c64xx_spi0_cfg_gpio; |
1469 | #if defined(CONFIG_PL330_DMA) | 1469 | #if defined(CONFIG_PL330_DMA) |
1470 | pd.filter = pl330_filter; | 1470 | pd.filter = pl330_filter; |
1471 | #elif defined(CONFIG_S3C64XX_PL080) | ||
1472 | pd.filter = pl08x_filter_id; | ||
1471 | #elif defined(CONFIG_S3C24XX_DMAC) | 1473 | #elif defined(CONFIG_S3C24XX_DMAC) |
1472 | pd.filter = s3c24xx_dma_filter; | 1474 | pd.filter = s3c24xx_dma_filter; |
1473 | #endif | 1475 | #endif |
@@ -1509,8 +1511,10 @@ void __init s3c64xx_spi1_set_platdata(int (*cfg_gpio)(void), int src_clk_nr, | |||
1509 | pd.num_cs = num_cs; | 1511 | pd.num_cs = num_cs; |
1510 | pd.src_clk_nr = src_clk_nr; | 1512 | pd.src_clk_nr = src_clk_nr; |
1511 | pd.cfg_gpio = (cfg_gpio) ? cfg_gpio : s3c64xx_spi1_cfg_gpio; | 1513 | pd.cfg_gpio = (cfg_gpio) ? cfg_gpio : s3c64xx_spi1_cfg_gpio; |
1512 | #ifdef CONFIG_PL330_DMA | 1514 | #if defined(CONFIG_PL330_DMA) |
1513 | pd.filter = pl330_filter; | 1515 | pd.filter = pl330_filter; |
1516 | #elif defined(CONFIG_S3C64XX_PL080) | ||
1517 | pd.filter = pl08x_filter_id; | ||
1514 | #endif | 1518 | #endif |
1515 | 1519 | ||
1516 | s3c_set_platdata(&pd, sizeof(pd), &s3c64xx_device_spi1); | 1520 | s3c_set_platdata(&pd, sizeof(pd), &s3c64xx_device_spi1); |
@@ -1550,8 +1554,10 @@ void __init s3c64xx_spi2_set_platdata(int (*cfg_gpio)(void), int src_clk_nr, | |||
1550 | pd.num_cs = num_cs; | 1554 | pd.num_cs = num_cs; |
1551 | pd.src_clk_nr = src_clk_nr; | 1555 | pd.src_clk_nr = src_clk_nr; |
1552 | pd.cfg_gpio = (cfg_gpio) ? cfg_gpio : s3c64xx_spi2_cfg_gpio; | 1556 | pd.cfg_gpio = (cfg_gpio) ? cfg_gpio : s3c64xx_spi2_cfg_gpio; |
1553 | #ifdef CONFIG_PL330_DMA | 1557 | #if defined(CONFIG_PL330_DMA) |
1554 | pd.filter = pl330_filter; | 1558 | pd.filter = pl330_filter; |
1559 | #elif defined(CONFIG_S3C64XX_PL080) | ||
1560 | pd.filter = pl08x_filter_id; | ||
1555 | #endif | 1561 | #endif |
1556 | 1562 | ||
1557 | s3c_set_platdata(&pd, sizeof(pd), &s3c64xx_device_spi2); | 1563 | s3c_set_platdata(&pd, sizeof(pd), &s3c64xx_device_spi2); |
diff --git a/arch/arm/plat-samsung/dma-ops.c b/arch/arm/plat-samsung/dma-ops.c index ec0d731b0e7b..886326ee6f6c 100644 --- a/arch/arm/plat-samsung/dma-ops.c +++ b/arch/arm/plat-samsung/dma-ops.c | |||
@@ -18,6 +18,12 @@ | |||
18 | 18 | ||
19 | #include <mach/dma.h> | 19 | #include <mach/dma.h> |
20 | 20 | ||
21 | #if defined(CONFIG_PL330_DMA) | ||
22 | #define dma_filter pl330_filter | ||
23 | #elif defined(CONFIG_S3C64XX_PL080) | ||
24 | #define dma_filter pl08x_filter_id | ||
25 | #endif | ||
26 | |||
21 | static unsigned samsung_dmadev_request(enum dma_ch dma_ch, | 27 | static unsigned samsung_dmadev_request(enum dma_ch dma_ch, |
22 | struct samsung_dma_req *param, | 28 | struct samsung_dma_req *param, |
23 | struct device *dev, char *ch_name) | 29 | struct device *dev, char *ch_name) |
@@ -30,7 +36,7 @@ static unsigned samsung_dmadev_request(enum dma_ch dma_ch, | |||
30 | if (dev->of_node) | 36 | if (dev->of_node) |
31 | return (unsigned)dma_request_slave_channel(dev, ch_name); | 37 | return (unsigned)dma_request_slave_channel(dev, ch_name); |
32 | else | 38 | else |
33 | return (unsigned)dma_request_channel(mask, pl330_filter, | 39 | return (unsigned)dma_request_channel(mask, dma_filter, |
34 | (void *)dma_ch); | 40 | (void *)dma_ch); |
35 | } | 41 | } |
36 | 42 | ||
diff --git a/arch/arm/plat-samsung/include/plat/regs-ata.h b/arch/arm/plat-samsung/include/plat/regs-ata.h deleted file mode 100644 index f5df92fdae26..000000000000 --- a/arch/arm/plat-samsung/include/plat/regs-ata.h +++ /dev/null | |||
@@ -1,56 +0,0 @@ | |||
1 | /* linux/arch/arm/plat-samsung/include/plat/regs-ata.h | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | ||
5 | * | ||
6 | * Samsung CF-ATA register definitions | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #ifndef __ASM_PLAT_REGS_ATA_H | ||
14 | #define __ASM_PLAT_REGS_ATA_H __FILE__ | ||
15 | |||
16 | #define S3C_CFATA_REG(x) (x) | ||
17 | |||
18 | #define S3C_CFATA_MUX S3C_CFATA_REG(0x0) | ||
19 | |||
20 | #define S3C_ATA_CTRL S3C_CFATA_REG(0x0) | ||
21 | #define S3C_ATA_STATUS S3C_CFATA_REG(0x4) | ||
22 | #define S3C_ATA_CMD S3C_CFATA_REG(0x8) | ||
23 | #define S3C_ATA_SWRST S3C_CFATA_REG(0xc) | ||
24 | #define S3C_ATA_IRQ S3C_CFATA_REG(0x10) | ||
25 | #define S3C_ATA_IRQ_MSK S3C_CFATA_REG(0x14) | ||
26 | #define S3C_ATA_CFG S3C_CFATA_REG(0x18) | ||
27 | |||
28 | #define S3C_ATA_MDMA_TIME S3C_CFATA_REG(0x28) | ||
29 | #define S3C_ATA_PIO_TIME S3C_CFATA_REG(0x2c) | ||
30 | #define S3C_ATA_UDMA_TIME S3C_CFATA_REG(0x30) | ||
31 | #define S3C_ATA_XFR_NUM S3C_CFATA_REG(0x34) | ||
32 | #define S3C_ATA_XFR_CNT S3C_CFATA_REG(0x38) | ||
33 | #define S3C_ATA_TBUF_START S3C_CFATA_REG(0x3c) | ||
34 | #define S3C_ATA_TBUF_SIZE S3C_CFATA_REG(0x40) | ||
35 | #define S3C_ATA_SBUF_START S3C_CFATA_REG(0x44) | ||
36 | #define S3C_ATA_SBUF_SIZE S3C_CFATA_REG(0x48) | ||
37 | #define S3C_ATA_CADR_TBUF S3C_CFATA_REG(0x4c) | ||
38 | #define S3C_ATA_CADR_SBUF S3C_CFATA_REG(0x50) | ||
39 | #define S3C_ATA_PIO_DTR S3C_CFATA_REG(0x54) | ||
40 | #define S3C_ATA_PIO_FED S3C_CFATA_REG(0x58) | ||
41 | #define S3C_ATA_PIO_SCR S3C_CFATA_REG(0x5c) | ||
42 | #define S3C_ATA_PIO_LLR S3C_CFATA_REG(0x60) | ||
43 | #define S3C_ATA_PIO_LMR S3C_CFATA_REG(0x64) | ||
44 | #define S3C_ATA_PIO_LHR S3C_CFATA_REG(0x68) | ||
45 | #define S3C_ATA_PIO_DVR S3C_CFATA_REG(0x6c) | ||
46 | #define S3C_ATA_PIO_CSD S3C_CFATA_REG(0x70) | ||
47 | #define S3C_ATA_PIO_DAD S3C_CFATA_REG(0x74) | ||
48 | #define S3C_ATA_PIO_READY S3C_CFATA_REG(0x78) | ||
49 | #define S3C_ATA_PIO_RDATA S3C_CFATA_REG(0x7c) | ||
50 | |||
51 | #define S3C_CFATA_MUX_TRUEIDE 0x01 | ||
52 | |||
53 | #define S3C_ATA_CFG_SWAP 0x40 | ||
54 | #define S3C_ATA_CFG_IORDYEN 0x02 | ||
55 | |||
56 | #endif /* __ASM_PLAT_REGS_ATA_H */ | ||
diff --git a/arch/arm/plat-samsung/pm-gpio.c b/arch/arm/plat-samsung/pm-gpio.c index a8de3cfe2ee1..dd4c15d0d68f 100644 --- a/arch/arm/plat-samsung/pm-gpio.c +++ b/arch/arm/plat-samsung/pm-gpio.c | |||
@@ -19,6 +19,10 @@ | |||
19 | #include <linux/io.h> | 19 | #include <linux/io.h> |
20 | #include <linux/gpio.h> | 20 | #include <linux/gpio.h> |
21 | 21 | ||
22 | #if defined(CONFIG_ARCH_S3C24XX) || defined(CONFIG_ARCH_S3C64XX) | ||
23 | #include <mach/gpio-samsung.h> | ||
24 | #endif | ||
25 | |||
22 | #include <plat/gpio-core.h> | 26 | #include <plat/gpio-core.h> |
23 | #include <plat/pm.h> | 27 | #include <plat/pm.h> |
24 | 28 | ||
diff --git a/arch/arm/plat-samsung/setup-camif.c b/arch/arm/plat-samsung/setup-camif.c index e01bf760af2c..72d8edb8927a 100644 --- a/arch/arm/plat-samsung/setup-camif.c +++ b/arch/arm/plat-samsung/setup-camif.c | |||
@@ -10,6 +10,7 @@ | |||
10 | 10 | ||
11 | #include <linux/gpio.h> | 11 | #include <linux/gpio.h> |
12 | #include <plat/gpio-cfg.h> | 12 | #include <plat/gpio-cfg.h> |
13 | #include <mach/gpio-samsung.h> | ||
13 | 14 | ||
14 | /* Number of camera port pins, without FIELD */ | 15 | /* Number of camera port pins, without FIELD */ |
15 | #define S3C_CAMIF_NUM_GPIOS 13 | 16 | #define S3C_CAMIF_NUM_GPIOS 13 |
diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c index 83e4f959ee47..85501238b425 100644 --- a/arch/arm/xen/enlighten.c +++ b/arch/arm/xen/enlighten.c | |||
@@ -96,7 +96,7 @@ static int remap_pte_fn(pte_t *ptep, pgtable_t token, unsigned long addr, | |||
96 | struct remap_data *info = data; | 96 | struct remap_data *info = data; |
97 | struct page *page = info->pages[info->index++]; | 97 | struct page *page = info->pages[info->index++]; |
98 | unsigned long pfn = page_to_pfn(page); | 98 | unsigned long pfn = page_to_pfn(page); |
99 | pte_t pte = pfn_pte(pfn, info->prot); | 99 | pte_t pte = pte_mkspecial(pfn_pte(pfn, info->prot)); |
100 | 100 | ||
101 | if (map_foreign_page(pfn, info->fgmfn, info->domid)) | 101 | if (map_foreign_page(pfn, info->fgmfn, info->domid)) |
102 | return -EFAULT; | 102 | return -EFAULT; |
@@ -224,10 +224,10 @@ static int __init xen_guest_init(void) | |||
224 | } | 224 | } |
225 | if (of_address_to_resource(node, GRANT_TABLE_PHYSADDR, &res)) | 225 | if (of_address_to_resource(node, GRANT_TABLE_PHYSADDR, &res)) |
226 | return 0; | 226 | return 0; |
227 | xen_hvm_resume_frames = res.start >> PAGE_SHIFT; | 227 | xen_hvm_resume_frames = res.start; |
228 | xen_events_irq = irq_of_parse_and_map(node, 0); | 228 | xen_events_irq = irq_of_parse_and_map(node, 0); |
229 | pr_info("Xen %s support found, events_irq=%d gnttab_frame_pfn=%lx\n", | 229 | pr_info("Xen %s support found, events_irq=%d gnttab_frame_pfn=%lx\n", |
230 | version, xen_events_irq, xen_hvm_resume_frames); | 230 | version, xen_events_irq, (xen_hvm_resume_frames >> PAGE_SHIFT)); |
231 | xen_domain_type = XEN_HVM_DOMAIN; | 231 | xen_domain_type = XEN_HVM_DOMAIN; |
232 | 232 | ||
233 | xen_setup_features(); | 233 | xen_setup_features(); |
diff --git a/arch/arm/xen/p2m.c b/arch/arm/xen/p2m.c index 23732cdff551..b31ee1b275b0 100644 --- a/arch/arm/xen/p2m.c +++ b/arch/arm/xen/p2m.c | |||
@@ -25,8 +25,9 @@ struct xen_p2m_entry { | |||
25 | struct rb_node rbnode_phys; | 25 | struct rb_node rbnode_phys; |
26 | }; | 26 | }; |
27 | 27 | ||
28 | rwlock_t p2m_lock; | 28 | static rwlock_t p2m_lock; |
29 | struct rb_root phys_to_mach = RB_ROOT; | 29 | struct rb_root phys_to_mach = RB_ROOT; |
30 | EXPORT_SYMBOL_GPL(phys_to_mach); | ||
30 | static struct rb_root mach_to_phys = RB_ROOT; | 31 | static struct rb_root mach_to_phys = RB_ROOT; |
31 | 32 | ||
32 | static int xen_add_phys_to_mach_entry(struct xen_p2m_entry *new) | 33 | static int xen_add_phys_to_mach_entry(struct xen_p2m_entry *new) |
@@ -200,7 +201,7 @@ bool __set_phys_to_machine(unsigned long pfn, unsigned long mfn) | |||
200 | } | 201 | } |
201 | EXPORT_SYMBOL_GPL(__set_phys_to_machine); | 202 | EXPORT_SYMBOL_GPL(__set_phys_to_machine); |
202 | 203 | ||
203 | int p2m_init(void) | 204 | static int p2m_init(void) |
204 | { | 205 | { |
205 | rwlock_init(&p2m_lock); | 206 | rwlock_init(&p2m_lock); |
206 | return 0; | 207 | return 0; |
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 88c8b6c1341a..dd4327f09ba4 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig | |||
@@ -2,6 +2,7 @@ config ARM64 | |||
2 | def_bool y | 2 | def_bool y |
3 | select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE | 3 | select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE |
4 | select ARCH_USE_CMPXCHG_LOCKREF | 4 | select ARCH_USE_CMPXCHG_LOCKREF |
5 | select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST | ||
5 | select ARCH_WANT_OPTIONAL_GPIOLIB | 6 | select ARCH_WANT_OPTIONAL_GPIOLIB |
6 | select ARCH_WANT_COMPAT_IPC_PARSE_VERSION | 7 | select ARCH_WANT_COMPAT_IPC_PARSE_VERSION |
7 | select ARCH_WANT_FRAME_POINTERS | 8 | select ARCH_WANT_FRAME_POINTERS |
@@ -11,19 +12,27 @@ config ARM64 | |||
11 | select BUILDTIME_EXTABLE_SORT | 12 | select BUILDTIME_EXTABLE_SORT |
12 | select CLONE_BACKWARDS | 13 | select CLONE_BACKWARDS |
13 | select COMMON_CLK | 14 | select COMMON_CLK |
15 | select CPU_PM if (SUSPEND || CPU_IDLE) | ||
16 | select DCACHE_WORD_ACCESS | ||
14 | select GENERIC_CLOCKEVENTS | 17 | select GENERIC_CLOCKEVENTS |
18 | select GENERIC_CLOCKEVENTS_BROADCAST if SMP | ||
15 | select GENERIC_IOMAP | 19 | select GENERIC_IOMAP |
16 | select GENERIC_IRQ_PROBE | 20 | select GENERIC_IRQ_PROBE |
17 | select GENERIC_IRQ_SHOW | 21 | select GENERIC_IRQ_SHOW |
18 | select GENERIC_SCHED_CLOCK | 22 | select GENERIC_SCHED_CLOCK |
19 | select GENERIC_SMP_IDLE_THREAD | 23 | select GENERIC_SMP_IDLE_THREAD |
24 | select GENERIC_STRNCPY_FROM_USER | ||
25 | select GENERIC_STRNLEN_USER | ||
20 | select GENERIC_TIME_VSYSCALL | 26 | select GENERIC_TIME_VSYSCALL |
21 | select HARDIRQS_SW_RESEND | 27 | select HARDIRQS_SW_RESEND |
28 | select HAVE_ARCH_JUMP_LABEL | ||
22 | select HAVE_ARCH_TRACEHOOK | 29 | select HAVE_ARCH_TRACEHOOK |
23 | select HAVE_DEBUG_BUGVERBOSE | 30 | select HAVE_DEBUG_BUGVERBOSE |
24 | select HAVE_DEBUG_KMEMLEAK | 31 | select HAVE_DEBUG_KMEMLEAK |
25 | select HAVE_DMA_API_DEBUG | 32 | select HAVE_DMA_API_DEBUG |
26 | select HAVE_DMA_ATTRS | 33 | select HAVE_DMA_ATTRS |
34 | select HAVE_DMA_CONTIGUOUS | ||
35 | select HAVE_EFFICIENT_UNALIGNED_ACCESS | ||
27 | select HAVE_GENERIC_DMA_COHERENT | 36 | select HAVE_GENERIC_DMA_COHERENT |
28 | select HAVE_HW_BREAKPOINT if PERF_EVENTS | 37 | select HAVE_HW_BREAKPOINT if PERF_EVENTS |
29 | select HAVE_MEMBLOCK | 38 | select HAVE_MEMBLOCK |
@@ -159,8 +168,7 @@ config NR_CPUS | |||
159 | range 2 32 | 168 | range 2 32 |
160 | depends on SMP | 169 | depends on SMP |
161 | # These have to remain sorted largest to smallest | 170 | # These have to remain sorted largest to smallest |
162 | default "8" if ARCH_XGENE | 171 | default "8" |
163 | default "4" | ||
164 | 172 | ||
165 | config HOTPLUG_CPU | 173 | config HOTPLUG_CPU |
166 | bool "Support for hot-pluggable CPUs" | 174 | bool "Support for hot-pluggable CPUs" |
@@ -276,6 +284,24 @@ config SYSVIPC_COMPAT | |||
276 | 284 | ||
277 | endmenu | 285 | endmenu |
278 | 286 | ||
287 | menu "Power management options" | ||
288 | |||
289 | source "kernel/power/Kconfig" | ||
290 | |||
291 | config ARCH_SUSPEND_POSSIBLE | ||
292 | def_bool y | ||
293 | |||
294 | config ARM64_CPU_SUSPEND | ||
295 | def_bool PM_SLEEP | ||
296 | |||
297 | endmenu | ||
298 | |||
299 | menu "CPU Power Management" | ||
300 | |||
301 | source "drivers/cpuidle/Kconfig" | ||
302 | |||
303 | endmenu | ||
304 | |||
279 | source "net/Kconfig" | 305 | source "net/Kconfig" |
280 | 306 | ||
281 | source "drivers/Kconfig" | 307 | source "drivers/Kconfig" |
diff --git a/arch/arm64/boot/dts/foundation-v8.dts b/arch/arm64/boot/dts/foundation-v8.dts index 84fcc5018284..4a060906809d 100644 --- a/arch/arm64/boot/dts/foundation-v8.dts +++ b/arch/arm64/boot/dts/foundation-v8.dts | |||
@@ -6,6 +6,8 @@ | |||
6 | 6 | ||
7 | /dts-v1/; | 7 | /dts-v1/; |
8 | 8 | ||
9 | /memreserve/ 0x80000000 0x00010000; | ||
10 | |||
9 | / { | 11 | / { |
10 | model = "Foundation-v8A"; | 12 | model = "Foundation-v8A"; |
11 | compatible = "arm,foundation-aarch64", "arm,vexpress"; | 13 | compatible = "arm,foundation-aarch64", "arm,vexpress"; |
@@ -222,7 +224,7 @@ | |||
222 | 224 | ||
223 | virtio_block@0130000 { | 225 | virtio_block@0130000 { |
224 | compatible = "virtio,mmio"; | 226 | compatible = "virtio,mmio"; |
225 | reg = <0x130000 0x1000>; | 227 | reg = <0x130000 0x200>; |
226 | interrupts = <42>; | 228 | interrupts = <42>; |
227 | }; | 229 | }; |
228 | }; | 230 | }; |
diff --git a/arch/arm64/boot/dts/rtsm_ve-motherboard.dtsi b/arch/arm64/boot/dts/rtsm_ve-motherboard.dtsi index b45e5f39f577..2f2ecd217363 100644 --- a/arch/arm64/boot/dts/rtsm_ve-motherboard.dtsi +++ b/arch/arm64/boot/dts/rtsm_ve-motherboard.dtsi | |||
@@ -183,6 +183,12 @@ | |||
183 | clocks = <&v2m_oscclk1>, <&v2m_clk24mhz>; | 183 | clocks = <&v2m_oscclk1>, <&v2m_clk24mhz>; |
184 | clock-names = "clcdclk", "apb_pclk"; | 184 | clock-names = "clcdclk", "apb_pclk"; |
185 | }; | 185 | }; |
186 | |||
187 | virtio_block@0130000 { | ||
188 | compatible = "virtio,mmio"; | ||
189 | reg = <0x130000 0x200>; | ||
190 | interrupts = <42>; | ||
191 | }; | ||
186 | }; | 192 | }; |
187 | 193 | ||
188 | v2m_fixed_3v3: fixedregulator@0 { | 194 | v2m_fixed_3v3: fixedregulator@0 { |
diff --git a/arch/arm64/include/asm/Kbuild b/arch/arm64/include/asm/Kbuild index 519f89f5b6a3..d0ff25de67ca 100644 --- a/arch/arm64/include/asm/Kbuild +++ b/arch/arm64/include/asm/Kbuild | |||
@@ -26,7 +26,6 @@ generic-y += mman.h | |||
26 | generic-y += msgbuf.h | 26 | generic-y += msgbuf.h |
27 | generic-y += mutex.h | 27 | generic-y += mutex.h |
28 | generic-y += pci.h | 28 | generic-y += pci.h |
29 | generic-y += percpu.h | ||
30 | generic-y += poll.h | 29 | generic-y += poll.h |
31 | generic-y += posix_types.h | 30 | generic-y += posix_types.h |
32 | generic-y += resource.h | 31 | generic-y += resource.h |
diff --git a/arch/arm64/include/asm/barrier.h b/arch/arm64/include/asm/barrier.h index d4a63338a53c..78e20ba8806b 100644 --- a/arch/arm64/include/asm/barrier.h +++ b/arch/arm64/include/asm/barrier.h | |||
@@ -35,10 +35,60 @@ | |||
35 | #define smp_mb() barrier() | 35 | #define smp_mb() barrier() |
36 | #define smp_rmb() barrier() | 36 | #define smp_rmb() barrier() |
37 | #define smp_wmb() barrier() | 37 | #define smp_wmb() barrier() |
38 | |||
39 | #define smp_store_release(p, v) \ | ||
40 | do { \ | ||
41 | compiletime_assert_atomic_type(*p); \ | ||
42 | smp_mb(); \ | ||
43 | ACCESS_ONCE(*p) = (v); \ | ||
44 | } while (0) | ||
45 | |||
46 | #define smp_load_acquire(p) \ | ||
47 | ({ \ | ||
48 | typeof(*p) ___p1 = ACCESS_ONCE(*p); \ | ||
49 | compiletime_assert_atomic_type(*p); \ | ||
50 | smp_mb(); \ | ||
51 | ___p1; \ | ||
52 | }) | ||
53 | |||
38 | #else | 54 | #else |
55 | |||
39 | #define smp_mb() asm volatile("dmb ish" : : : "memory") | 56 | #define smp_mb() asm volatile("dmb ish" : : : "memory") |
40 | #define smp_rmb() asm volatile("dmb ishld" : : : "memory") | 57 | #define smp_rmb() asm volatile("dmb ishld" : : : "memory") |
41 | #define smp_wmb() asm volatile("dmb ishst" : : : "memory") | 58 | #define smp_wmb() asm volatile("dmb ishst" : : : "memory") |
59 | |||
60 | #define smp_store_release(p, v) \ | ||
61 | do { \ | ||
62 | compiletime_assert_atomic_type(*p); \ | ||
63 | switch (sizeof(*p)) { \ | ||
64 | case 4: \ | ||
65 | asm volatile ("stlr %w1, %0" \ | ||
66 | : "=Q" (*p) : "r" (v) : "memory"); \ | ||
67 | break; \ | ||
68 | case 8: \ | ||
69 | asm volatile ("stlr %1, %0" \ | ||
70 | : "=Q" (*p) : "r" (v) : "memory"); \ | ||
71 | break; \ | ||
72 | } \ | ||
73 | } while (0) | ||
74 | |||
75 | #define smp_load_acquire(p) \ | ||
76 | ({ \ | ||
77 | typeof(*p) ___p1; \ | ||
78 | compiletime_assert_atomic_type(*p); \ | ||
79 | switch (sizeof(*p)) { \ | ||
80 | case 4: \ | ||
81 | asm volatile ("ldar %w0, %1" \ | ||
82 | : "=r" (___p1) : "Q" (*p) : "memory"); \ | ||
83 | break; \ | ||
84 | case 8: \ | ||
85 | asm volatile ("ldar %0, %1" \ | ||
86 | : "=r" (___p1) : "Q" (*p) : "memory"); \ | ||
87 | break; \ | ||
88 | } \ | ||
89 | ___p1; \ | ||
90 | }) | ||
91 | |||
42 | #endif | 92 | #endif |
43 | 93 | ||
44 | #define read_barrier_depends() do { } while(0) | 94 | #define read_barrier_depends() do { } while(0) |
diff --git a/arch/arm64/include/asm/cmpxchg.h b/arch/arm64/include/asm/cmpxchg.h index 3914c0dcd09c..56166d7f4a25 100644 --- a/arch/arm64/include/asm/cmpxchg.h +++ b/arch/arm64/include/asm/cmpxchg.h | |||
@@ -158,17 +158,23 @@ static inline unsigned long __cmpxchg_mb(volatile void *ptr, unsigned long old, | |||
158 | return ret; | 158 | return ret; |
159 | } | 159 | } |
160 | 160 | ||
161 | #define cmpxchg(ptr,o,n) \ | 161 | #define cmpxchg(ptr, o, n) \ |
162 | ((__typeof__(*(ptr)))__cmpxchg_mb((ptr), \ | 162 | ({ \ |
163 | (unsigned long)(o), \ | 163 | __typeof__(*(ptr)) __ret; \ |
164 | (unsigned long)(n), \ | 164 | __ret = (__typeof__(*(ptr))) \ |
165 | sizeof(*(ptr)))) | 165 | __cmpxchg_mb((ptr), (unsigned long)(o), (unsigned long)(n), \ |
166 | 166 | sizeof(*(ptr))); \ | |
167 | #define cmpxchg_local(ptr,o,n) \ | 167 | __ret; \ |
168 | ((__typeof__(*(ptr)))__cmpxchg((ptr), \ | 168 | }) |
169 | (unsigned long)(o), \ | 169 | |
170 | (unsigned long)(n), \ | 170 | #define cmpxchg_local(ptr, o, n) \ |
171 | sizeof(*(ptr)))) | 171 | ({ \ |
172 | __typeof__(*(ptr)) __ret; \ | ||
173 | __ret = (__typeof__(*(ptr))) \ | ||
174 | __cmpxchg((ptr), (unsigned long)(o), \ | ||
175 | (unsigned long)(n), sizeof(*(ptr))); \ | ||
176 | __ret; \ | ||
177 | }) | ||
172 | 178 | ||
173 | #define cmpxchg64(ptr,o,n) cmpxchg((ptr),(o),(n)) | 179 | #define cmpxchg64(ptr,o,n) cmpxchg((ptr),(o),(n)) |
174 | #define cmpxchg64_local(ptr,o,n) cmpxchg_local((ptr),(o),(n)) | 180 | #define cmpxchg64_local(ptr,o,n) cmpxchg_local((ptr),(o),(n)) |
diff --git a/arch/arm64/include/asm/cpu_ops.h b/arch/arm64/include/asm/cpu_ops.h index c4cdb5e5b73d..152413076503 100644 --- a/arch/arm64/include/asm/cpu_ops.h +++ b/arch/arm64/include/asm/cpu_ops.h | |||
@@ -39,6 +39,9 @@ struct device_node; | |||
39 | * from the cpu to be killed. | 39 | * from the cpu to be killed. |
40 | * @cpu_die: Makes a cpu leave the kernel. Must not fail. Called from the | 40 | * @cpu_die: Makes a cpu leave the kernel. Must not fail. Called from the |
41 | * cpu being killed. | 41 | * cpu being killed. |
42 | * @cpu_suspend: Suspends a cpu and saves the required context. May fail owing | ||
43 | * to wrong parameters or error conditions. Called from the | ||
44 | * CPU being suspended. Must be called with IRQs disabled. | ||
42 | */ | 45 | */ |
43 | struct cpu_operations { | 46 | struct cpu_operations { |
44 | const char *name; | 47 | const char *name; |
@@ -50,6 +53,9 @@ struct cpu_operations { | |||
50 | int (*cpu_disable)(unsigned int cpu); | 53 | int (*cpu_disable)(unsigned int cpu); |
51 | void (*cpu_die)(unsigned int cpu); | 54 | void (*cpu_die)(unsigned int cpu); |
52 | #endif | 55 | #endif |
56 | #ifdef CONFIG_ARM64_CPU_SUSPEND | ||
57 | int (*cpu_suspend)(unsigned long); | ||
58 | #endif | ||
53 | }; | 59 | }; |
54 | 60 | ||
55 | extern const struct cpu_operations *cpu_ops[NR_CPUS]; | 61 | extern const struct cpu_operations *cpu_ops[NR_CPUS]; |
diff --git a/arch/arm64/include/asm/cputype.h b/arch/arm64/include/asm/cputype.h index 5fe138e0b828..c404fb0df3a6 100644 --- a/arch/arm64/include/asm/cputype.h +++ b/arch/arm64/include/asm/cputype.h | |||
@@ -16,23 +16,23 @@ | |||
16 | #ifndef __ASM_CPUTYPE_H | 16 | #ifndef __ASM_CPUTYPE_H |
17 | #define __ASM_CPUTYPE_H | 17 | #define __ASM_CPUTYPE_H |
18 | 18 | ||
19 | #define ID_MIDR_EL1 "midr_el1" | ||
20 | #define ID_MPIDR_EL1 "mpidr_el1" | ||
21 | #define ID_CTR_EL0 "ctr_el0" | ||
22 | |||
23 | #define ID_AA64PFR0_EL1 "id_aa64pfr0_el1" | ||
24 | #define ID_AA64DFR0_EL1 "id_aa64dfr0_el1" | ||
25 | #define ID_AA64AFR0_EL1 "id_aa64afr0_el1" | ||
26 | #define ID_AA64ISAR0_EL1 "id_aa64isar0_el1" | ||
27 | #define ID_AA64MMFR0_EL1 "id_aa64mmfr0_el1" | ||
28 | |||
29 | #define INVALID_HWID ULONG_MAX | 19 | #define INVALID_HWID ULONG_MAX |
30 | 20 | ||
31 | #define MPIDR_HWID_BITMASK 0xff00ffffff | 21 | #define MPIDR_HWID_BITMASK 0xff00ffffff |
32 | 22 | ||
23 | #define MPIDR_LEVEL_BITS_SHIFT 3 | ||
24 | #define MPIDR_LEVEL_BITS (1 << MPIDR_LEVEL_BITS_SHIFT) | ||
25 | #define MPIDR_LEVEL_MASK ((1 << MPIDR_LEVEL_BITS) - 1) | ||
26 | |||
27 | #define MPIDR_LEVEL_SHIFT(level) \ | ||
28 | (((1 << level) >> 1) << MPIDR_LEVEL_BITS_SHIFT) | ||
29 | |||
30 | #define MPIDR_AFFINITY_LEVEL(mpidr, level) \ | ||
31 | ((mpidr >> MPIDR_LEVEL_SHIFT(level)) & MPIDR_LEVEL_MASK) | ||
32 | |||
33 | #define read_cpuid(reg) ({ \ | 33 | #define read_cpuid(reg) ({ \ |
34 | u64 __val; \ | 34 | u64 __val; \ |
35 | asm("mrs %0, " reg : "=r" (__val)); \ | 35 | asm("mrs %0, " #reg : "=r" (__val)); \ |
36 | __val; \ | 36 | __val; \ |
37 | }) | 37 | }) |
38 | 38 | ||
@@ -54,12 +54,12 @@ | |||
54 | */ | 54 | */ |
55 | static inline u32 __attribute_const__ read_cpuid_id(void) | 55 | static inline u32 __attribute_const__ read_cpuid_id(void) |
56 | { | 56 | { |
57 | return read_cpuid(ID_MIDR_EL1); | 57 | return read_cpuid(MIDR_EL1); |
58 | } | 58 | } |
59 | 59 | ||
60 | static inline u64 __attribute_const__ read_cpuid_mpidr(void) | 60 | static inline u64 __attribute_const__ read_cpuid_mpidr(void) |
61 | { | 61 | { |
62 | return read_cpuid(ID_MPIDR_EL1); | 62 | return read_cpuid(MPIDR_EL1); |
63 | } | 63 | } |
64 | 64 | ||
65 | static inline unsigned int __attribute_const__ read_cpuid_implementor(void) | 65 | static inline unsigned int __attribute_const__ read_cpuid_implementor(void) |
@@ -74,7 +74,7 @@ static inline unsigned int __attribute_const__ read_cpuid_part_number(void) | |||
74 | 74 | ||
75 | static inline u32 __attribute_const__ read_cpuid_cachetype(void) | 75 | static inline u32 __attribute_const__ read_cpuid_cachetype(void) |
76 | { | 76 | { |
77 | return read_cpuid(ID_CTR_EL0); | 77 | return read_cpuid(CTR_EL0); |
78 | } | 78 | } |
79 | 79 | ||
80 | #endif /* __ASSEMBLY__ */ | 80 | #endif /* __ASSEMBLY__ */ |
diff --git a/arch/arm64/include/asm/debug-monitors.h b/arch/arm64/include/asm/debug-monitors.h index a2232d07be9d..62314791570c 100644 --- a/arch/arm64/include/asm/debug-monitors.h +++ b/arch/arm64/include/asm/debug-monitors.h | |||
@@ -62,6 +62,27 @@ struct task_struct; | |||
62 | 62 | ||
63 | #define DBG_ARCH_ID_RESERVED 0 /* In case of ptrace ABI updates. */ | 63 | #define DBG_ARCH_ID_RESERVED 0 /* In case of ptrace ABI updates. */ |
64 | 64 | ||
65 | #define DBG_HOOK_HANDLED 0 | ||
66 | #define DBG_HOOK_ERROR 1 | ||
67 | |||
68 | struct step_hook { | ||
69 | struct list_head node; | ||
70 | int (*fn)(struct pt_regs *regs, unsigned int esr); | ||
71 | }; | ||
72 | |||
73 | void register_step_hook(struct step_hook *hook); | ||
74 | void unregister_step_hook(struct step_hook *hook); | ||
75 | |||
76 | struct break_hook { | ||
77 | struct list_head node; | ||
78 | u32 esr_val; | ||
79 | u32 esr_mask; | ||
80 | int (*fn)(struct pt_regs *regs, unsigned int esr); | ||
81 | }; | ||
82 | |||
83 | void register_break_hook(struct break_hook *hook); | ||
84 | void unregister_break_hook(struct break_hook *hook); | ||
85 | |||
65 | u8 debug_monitors_arch(void); | 86 | u8 debug_monitors_arch(void); |
66 | 87 | ||
67 | void enable_debug_monitors(enum debug_el el); | 88 | void enable_debug_monitors(enum debug_el el); |
diff --git a/arch/arm64/include/asm/dma-contiguous.h b/arch/arm64/include/asm/dma-contiguous.h new file mode 100644 index 000000000000..d6aacb61ff4a --- /dev/null +++ b/arch/arm64/include/asm/dma-contiguous.h | |||
@@ -0,0 +1,29 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2013, The Linux Foundation. All rights reserved. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 and | ||
6 | * only version 2 as published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | */ | ||
13 | |||
14 | #ifndef _ASM_DMA_CONTIGUOUS_H | ||
15 | #define _ASM_DMA_CONTIGUOUS_H | ||
16 | |||
17 | #ifdef __KERNEL__ | ||
18 | #ifdef CONFIG_DMA_CMA | ||
19 | |||
20 | #include <linux/types.h> | ||
21 | #include <asm-generic/dma-contiguous.h> | ||
22 | |||
23 | static inline void | ||
24 | dma_contiguous_early_fixup(phys_addr_t base, unsigned long size) { } | ||
25 | |||
26 | #endif | ||
27 | #endif | ||
28 | |||
29 | #endif | ||
diff --git a/arch/arm64/include/asm/futex.h b/arch/arm64/include/asm/futex.h index c582fa316366..78cc3aba5d69 100644 --- a/arch/arm64/include/asm/futex.h +++ b/arch/arm64/include/asm/futex.h | |||
@@ -30,6 +30,7 @@ | |||
30 | " cbnz %w3, 1b\n" \ | 30 | " cbnz %w3, 1b\n" \ |
31 | "3:\n" \ | 31 | "3:\n" \ |
32 | " .pushsection .fixup,\"ax\"\n" \ | 32 | " .pushsection .fixup,\"ax\"\n" \ |
33 | " .align 2\n" \ | ||
33 | "4: mov %w0, %w5\n" \ | 34 | "4: mov %w0, %w5\n" \ |
34 | " b 3b\n" \ | 35 | " b 3b\n" \ |
35 | " .popsection\n" \ | 36 | " .popsection\n" \ |
diff --git a/arch/arm64/include/asm/hardirq.h b/arch/arm64/include/asm/hardirq.h index 990c051e7829..ae4801d77514 100644 --- a/arch/arm64/include/asm/hardirq.h +++ b/arch/arm64/include/asm/hardirq.h | |||
@@ -20,7 +20,7 @@ | |||
20 | #include <linux/threads.h> | 20 | #include <linux/threads.h> |
21 | #include <asm/irq.h> | 21 | #include <asm/irq.h> |
22 | 22 | ||
23 | #define NR_IPI 4 | 23 | #define NR_IPI 5 |
24 | 24 | ||
25 | typedef struct { | 25 | typedef struct { |
26 | unsigned int __softirq_pending; | 26 | unsigned int __softirq_pending; |
diff --git a/arch/arm64/include/asm/insn.h b/arch/arm64/include/asm/insn.h new file mode 100644 index 000000000000..c44ad39ed310 --- /dev/null +++ b/arch/arm64/include/asm/insn.h | |||
@@ -0,0 +1,108 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2013 Huawei Ltd. | ||
3 | * Author: Jiang Liu <liuj97@gmail.com> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License version 2 as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
16 | */ | ||
17 | #ifndef __ASM_INSN_H | ||
18 | #define __ASM_INSN_H | ||
19 | #include <linux/types.h> | ||
20 | |||
21 | /* A64 instructions are always 32 bits. */ | ||
22 | #define AARCH64_INSN_SIZE 4 | ||
23 | |||
24 | /* | ||
25 | * ARM Architecture Reference Manual for ARMv8 Profile-A, Issue A.a | ||
26 | * Section C3.1 "A64 instruction index by encoding": | ||
27 | * AArch64 main encoding table | ||
28 | * Bit position | ||
29 | * 28 27 26 25 Encoding Group | ||
30 | * 0 0 - - Unallocated | ||
31 | * 1 0 0 - Data processing, immediate | ||
32 | * 1 0 1 - Branch, exception generation and system instructions | ||
33 | * - 1 - 0 Loads and stores | ||
34 | * - 1 0 1 Data processing - register | ||
35 | * 0 1 1 1 Data processing - SIMD and floating point | ||
36 | * 1 1 1 1 Data processing - SIMD and floating point | ||
37 | * "-" means "don't care" | ||
38 | */ | ||
39 | enum aarch64_insn_encoding_class { | ||
40 | AARCH64_INSN_CLS_UNKNOWN, /* UNALLOCATED */ | ||
41 | AARCH64_INSN_CLS_DP_IMM, /* Data processing - immediate */ | ||
42 | AARCH64_INSN_CLS_DP_REG, /* Data processing - register */ | ||
43 | AARCH64_INSN_CLS_DP_FPSIMD, /* Data processing - SIMD and FP */ | ||
44 | AARCH64_INSN_CLS_LDST, /* Loads and stores */ | ||
45 | AARCH64_INSN_CLS_BR_SYS, /* Branch, exception generation and | ||
46 | * system instructions */ | ||
47 | }; | ||
48 | |||
49 | enum aarch64_insn_hint_op { | ||
50 | AARCH64_INSN_HINT_NOP = 0x0 << 5, | ||
51 | AARCH64_INSN_HINT_YIELD = 0x1 << 5, | ||
52 | AARCH64_INSN_HINT_WFE = 0x2 << 5, | ||
53 | AARCH64_INSN_HINT_WFI = 0x3 << 5, | ||
54 | AARCH64_INSN_HINT_SEV = 0x4 << 5, | ||
55 | AARCH64_INSN_HINT_SEVL = 0x5 << 5, | ||
56 | }; | ||
57 | |||
58 | enum aarch64_insn_imm_type { | ||
59 | AARCH64_INSN_IMM_ADR, | ||
60 | AARCH64_INSN_IMM_26, | ||
61 | AARCH64_INSN_IMM_19, | ||
62 | AARCH64_INSN_IMM_16, | ||
63 | AARCH64_INSN_IMM_14, | ||
64 | AARCH64_INSN_IMM_12, | ||
65 | AARCH64_INSN_IMM_9, | ||
66 | AARCH64_INSN_IMM_MAX | ||
67 | }; | ||
68 | |||
69 | enum aarch64_insn_branch_type { | ||
70 | AARCH64_INSN_BRANCH_NOLINK, | ||
71 | AARCH64_INSN_BRANCH_LINK, | ||
72 | }; | ||
73 | |||
74 | #define __AARCH64_INSN_FUNCS(abbr, mask, val) \ | ||
75 | static __always_inline bool aarch64_insn_is_##abbr(u32 code) \ | ||
76 | { return (code & (mask)) == (val); } \ | ||
77 | static __always_inline u32 aarch64_insn_get_##abbr##_value(void) \ | ||
78 | { return (val); } | ||
79 | |||
80 | __AARCH64_INSN_FUNCS(b, 0xFC000000, 0x14000000) | ||
81 | __AARCH64_INSN_FUNCS(bl, 0xFC000000, 0x94000000) | ||
82 | __AARCH64_INSN_FUNCS(svc, 0xFFE0001F, 0xD4000001) | ||
83 | __AARCH64_INSN_FUNCS(hvc, 0xFFE0001F, 0xD4000002) | ||
84 | __AARCH64_INSN_FUNCS(smc, 0xFFE0001F, 0xD4000003) | ||
85 | __AARCH64_INSN_FUNCS(brk, 0xFFE0001F, 0xD4200000) | ||
86 | __AARCH64_INSN_FUNCS(hint, 0xFFFFF01F, 0xD503201F) | ||
87 | |||
88 | #undef __AARCH64_INSN_FUNCS | ||
89 | |||
90 | bool aarch64_insn_is_nop(u32 insn); | ||
91 | |||
92 | int aarch64_insn_read(void *addr, u32 *insnp); | ||
93 | int aarch64_insn_write(void *addr, u32 insn); | ||
94 | enum aarch64_insn_encoding_class aarch64_get_insn_class(u32 insn); | ||
95 | u32 aarch64_insn_encode_immediate(enum aarch64_insn_imm_type type, | ||
96 | u32 insn, u64 imm); | ||
97 | u32 aarch64_insn_gen_branch_imm(unsigned long pc, unsigned long addr, | ||
98 | enum aarch64_insn_branch_type type); | ||
99 | u32 aarch64_insn_gen_hint(enum aarch64_insn_hint_op op); | ||
100 | u32 aarch64_insn_gen_nop(void); | ||
101 | |||
102 | bool aarch64_insn_hotpatch_safe(u32 old_insn, u32 new_insn); | ||
103 | |||
104 | int aarch64_insn_patch_text_nosync(void *addr, u32 insn); | ||
105 | int aarch64_insn_patch_text_sync(void *addrs[], u32 insns[], int cnt); | ||
106 | int aarch64_insn_patch_text(void *addrs[], u32 insns[], int cnt); | ||
107 | |||
108 | #endif /* __ASM_INSN_H */ | ||
diff --git a/arch/arm64/include/asm/irqflags.h b/arch/arm64/include/asm/irqflags.h index aa11943b8502..b2fcfbc51ecc 100644 --- a/arch/arm64/include/asm/irqflags.h +++ b/arch/arm64/include/asm/irqflags.h | |||
@@ -56,6 +56,9 @@ static inline void arch_local_irq_disable(void) | |||
56 | #define local_fiq_enable() asm("msr daifclr, #1" : : : "memory") | 56 | #define local_fiq_enable() asm("msr daifclr, #1" : : : "memory") |
57 | #define local_fiq_disable() asm("msr daifset, #1" : : : "memory") | 57 | #define local_fiq_disable() asm("msr daifset, #1" : : : "memory") |
58 | 58 | ||
59 | #define local_async_enable() asm("msr daifclr, #4" : : : "memory") | ||
60 | #define local_async_disable() asm("msr daifset, #4" : : : "memory") | ||
61 | |||
59 | /* | 62 | /* |
60 | * Save the current interrupt enable state. | 63 | * Save the current interrupt enable state. |
61 | */ | 64 | */ |
diff --git a/arch/arm64/include/asm/jump_label.h b/arch/arm64/include/asm/jump_label.h new file mode 100644 index 000000000000..076a1c714049 --- /dev/null +++ b/arch/arm64/include/asm/jump_label.h | |||
@@ -0,0 +1,52 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2013 Huawei Ltd. | ||
3 | * Author: Jiang Liu <liuj97@gmail.com> | ||
4 | * | ||
5 | * Based on arch/arm/include/asm/jump_label.h | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
18 | */ | ||
19 | #ifndef __ASM_JUMP_LABEL_H | ||
20 | #define __ASM_JUMP_LABEL_H | ||
21 | #include <linux/types.h> | ||
22 | #include <asm/insn.h> | ||
23 | |||
24 | #ifdef __KERNEL__ | ||
25 | |||
26 | #define JUMP_LABEL_NOP_SIZE AARCH64_INSN_SIZE | ||
27 | |||
28 | static __always_inline bool arch_static_branch(struct static_key *key) | ||
29 | { | ||
30 | asm goto("1: nop\n\t" | ||
31 | ".pushsection __jump_table, \"aw\"\n\t" | ||
32 | ".align 3\n\t" | ||
33 | ".quad 1b, %l[l_yes], %c0\n\t" | ||
34 | ".popsection\n\t" | ||
35 | : : "i"(key) : : l_yes); | ||
36 | |||
37 | return false; | ||
38 | l_yes: | ||
39 | return true; | ||
40 | } | ||
41 | |||
42 | #endif /* __KERNEL__ */ | ||
43 | |||
44 | typedef u64 jump_label_t; | ||
45 | |||
46 | struct jump_entry { | ||
47 | jump_label_t code; | ||
48 | jump_label_t target; | ||
49 | jump_label_t key; | ||
50 | }; | ||
51 | |||
52 | #endif /* __ASM_JUMP_LABEL_H */ | ||
diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h index 37762175896f..9dc5dc39fded 100644 --- a/arch/arm64/include/asm/memory.h +++ b/arch/arm64/include/asm/memory.h | |||
@@ -146,8 +146,7 @@ static inline void *phys_to_virt(phys_addr_t x) | |||
146 | #define ARCH_PFN_OFFSET PHYS_PFN_OFFSET | 146 | #define ARCH_PFN_OFFSET PHYS_PFN_OFFSET |
147 | 147 | ||
148 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) | 148 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) |
149 | #define virt_addr_valid(kaddr) (((void *)(kaddr) >= (void *)PAGE_OFFSET) && \ | 149 | #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) |
150 | ((void *)(kaddr) < (void *)high_memory)) | ||
151 | 150 | ||
152 | #endif | 151 | #endif |
153 | 152 | ||
diff --git a/arch/arm64/include/asm/percpu.h b/arch/arm64/include/asm/percpu.h new file mode 100644 index 000000000000..13fb0b3efc5f --- /dev/null +++ b/arch/arm64/include/asm/percpu.h | |||
@@ -0,0 +1,41 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2013 ARM Ltd. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | #ifndef __ASM_PERCPU_H | ||
17 | #define __ASM_PERCPU_H | ||
18 | |||
19 | static inline void set_my_cpu_offset(unsigned long off) | ||
20 | { | ||
21 | asm volatile("msr tpidr_el1, %0" :: "r" (off) : "memory"); | ||
22 | } | ||
23 | |||
24 | static inline unsigned long __my_cpu_offset(void) | ||
25 | { | ||
26 | unsigned long off; | ||
27 | register unsigned long *sp asm ("sp"); | ||
28 | |||
29 | /* | ||
30 | * We want to allow caching the value, so avoid using volatile and | ||
31 | * instead use a fake stack read to hazard against barrier(). | ||
32 | */ | ||
33 | asm("mrs %0, tpidr_el1" : "=r" (off) : "Q" (*sp)); | ||
34 | |||
35 | return off; | ||
36 | } | ||
37 | #define __my_cpu_offset __my_cpu_offset() | ||
38 | |||
39 | #include <asm-generic/percpu.h> | ||
40 | |||
41 | #endif /* __ASM_PERCPU_H */ | ||
diff --git a/arch/arm64/include/asm/pgtable-hwdef.h b/arch/arm64/include/asm/pgtable-hwdef.h index 755f86143320..b1d2e26c3c88 100644 --- a/arch/arm64/include/asm/pgtable-hwdef.h +++ b/arch/arm64/include/asm/pgtable-hwdef.h | |||
@@ -43,7 +43,7 @@ | |||
43 | * Section | 43 | * Section |
44 | */ | 44 | */ |
45 | #define PMD_SECT_VALID (_AT(pmdval_t, 1) << 0) | 45 | #define PMD_SECT_VALID (_AT(pmdval_t, 1) << 0) |
46 | #define PMD_SECT_PROT_NONE (_AT(pmdval_t, 1) << 2) | 46 | #define PMD_SECT_PROT_NONE (_AT(pmdval_t, 1) << 58) |
47 | #define PMD_SECT_USER (_AT(pmdval_t, 1) << 6) /* AP[1] */ | 47 | #define PMD_SECT_USER (_AT(pmdval_t, 1) << 6) /* AP[1] */ |
48 | #define PMD_SECT_RDONLY (_AT(pmdval_t, 1) << 7) /* AP[2] */ | 48 | #define PMD_SECT_RDONLY (_AT(pmdval_t, 1) << 7) /* AP[2] */ |
49 | #define PMD_SECT_S (_AT(pmdval_t, 3) << 8) | 49 | #define PMD_SECT_S (_AT(pmdval_t, 3) << 8) |
diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h index 17bd3af0a117..7f2b60affbb4 100644 --- a/arch/arm64/include/asm/pgtable.h +++ b/arch/arm64/include/asm/pgtable.h | |||
@@ -25,10 +25,11 @@ | |||
25 | * Software defined PTE bits definition. | 25 | * Software defined PTE bits definition. |
26 | */ | 26 | */ |
27 | #define PTE_VALID (_AT(pteval_t, 1) << 0) | 27 | #define PTE_VALID (_AT(pteval_t, 1) << 0) |
28 | #define PTE_PROT_NONE (_AT(pteval_t, 1) << 2) /* only when !PTE_VALID */ | 28 | #define PTE_FILE (_AT(pteval_t, 1) << 2) /* only when !pte_present() */ |
29 | #define PTE_FILE (_AT(pteval_t, 1) << 3) /* only when !pte_present() */ | ||
30 | #define PTE_DIRTY (_AT(pteval_t, 1) << 55) | 29 | #define PTE_DIRTY (_AT(pteval_t, 1) << 55) |
31 | #define PTE_SPECIAL (_AT(pteval_t, 1) << 56) | 30 | #define PTE_SPECIAL (_AT(pteval_t, 1) << 56) |
31 | /* bit 57 for PMD_SECT_SPLITTING */ | ||
32 | #define PTE_PROT_NONE (_AT(pteval_t, 1) << 58) /* only when !PTE_VALID */ | ||
32 | 33 | ||
33 | /* | 34 | /* |
34 | * VMALLOC and SPARSEMEM_VMEMMAP ranges. | 35 | * VMALLOC and SPARSEMEM_VMEMMAP ranges. |
@@ -254,7 +255,7 @@ static inline int has_transparent_hugepage(void) | |||
254 | #define pgprot_noncached(prot) \ | 255 | #define pgprot_noncached(prot) \ |
255 | __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_DEVICE_nGnRnE)) | 256 | __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_DEVICE_nGnRnE)) |
256 | #define pgprot_writecombine(prot) \ | 257 | #define pgprot_writecombine(prot) \ |
257 | __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_DEVICE_GRE)) | 258 | __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC)) |
258 | #define pgprot_dmacoherent(prot) \ | 259 | #define pgprot_dmacoherent(prot) \ |
259 | __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC)) | 260 | __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC)) |
260 | #define __HAVE_PHYS_MEM_ACCESS_PROT | 261 | #define __HAVE_PHYS_MEM_ACCESS_PROT |
@@ -357,18 +358,20 @@ extern pgd_t idmap_pg_dir[PTRS_PER_PGD]; | |||
357 | 358 | ||
358 | /* | 359 | /* |
359 | * Encode and decode a swap entry: | 360 | * Encode and decode a swap entry: |
360 | * bits 0, 2: present (must both be zero) | 361 | * bits 0-1: present (must be zero) |
361 | * bit 3: PTE_FILE | 362 | * bit 2: PTE_FILE |
362 | * bits 4-8: swap type | 363 | * bits 3-8: swap type |
363 | * bits 9-63: swap offset | 364 | * bits 9-57: swap offset |
364 | */ | 365 | */ |
365 | #define __SWP_TYPE_SHIFT 4 | 366 | #define __SWP_TYPE_SHIFT 3 |
366 | #define __SWP_TYPE_BITS 6 | 367 | #define __SWP_TYPE_BITS 6 |
368 | #define __SWP_OFFSET_BITS 49 | ||
367 | #define __SWP_TYPE_MASK ((1 << __SWP_TYPE_BITS) - 1) | 369 | #define __SWP_TYPE_MASK ((1 << __SWP_TYPE_BITS) - 1) |
368 | #define __SWP_OFFSET_SHIFT (__SWP_TYPE_BITS + __SWP_TYPE_SHIFT) | 370 | #define __SWP_OFFSET_SHIFT (__SWP_TYPE_BITS + __SWP_TYPE_SHIFT) |
371 | #define __SWP_OFFSET_MASK ((1UL << __SWP_OFFSET_BITS) - 1) | ||
369 | 372 | ||
370 | #define __swp_type(x) (((x).val >> __SWP_TYPE_SHIFT) & __SWP_TYPE_MASK) | 373 | #define __swp_type(x) (((x).val >> __SWP_TYPE_SHIFT) & __SWP_TYPE_MASK) |
371 | #define __swp_offset(x) ((x).val >> __SWP_OFFSET_SHIFT) | 374 | #define __swp_offset(x) (((x).val >> __SWP_OFFSET_SHIFT) & __SWP_OFFSET_MASK) |
372 | #define __swp_entry(type,offset) ((swp_entry_t) { ((type) << __SWP_TYPE_SHIFT) | ((offset) << __SWP_OFFSET_SHIFT) }) | 375 | #define __swp_entry(type,offset) ((swp_entry_t) { ((type) << __SWP_TYPE_SHIFT) | ((offset) << __SWP_OFFSET_SHIFT) }) |
373 | 376 | ||
374 | #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) | 377 | #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) |
@@ -382,15 +385,15 @@ extern pgd_t idmap_pg_dir[PTRS_PER_PGD]; | |||
382 | 385 | ||
383 | /* | 386 | /* |
384 | * Encode and decode a file entry: | 387 | * Encode and decode a file entry: |
385 | * bits 0, 2: present (must both be zero) | 388 | * bits 0-1: present (must be zero) |
386 | * bit 3: PTE_FILE | 389 | * bit 2: PTE_FILE |
387 | * bits 4-63: file offset / PAGE_SIZE | 390 | * bits 3-57: file offset / PAGE_SIZE |
388 | */ | 391 | */ |
389 | #define pte_file(pte) (pte_val(pte) & PTE_FILE) | 392 | #define pte_file(pte) (pte_val(pte) & PTE_FILE) |
390 | #define pte_to_pgoff(x) (pte_val(x) >> 4) | 393 | #define pte_to_pgoff(x) (pte_val(x) >> 3) |
391 | #define pgoff_to_pte(x) __pte(((x) << 4) | PTE_FILE) | 394 | #define pgoff_to_pte(x) __pte(((x) << 3) | PTE_FILE) |
392 | 395 | ||
393 | #define PTE_FILE_MAX_BITS 60 | 396 | #define PTE_FILE_MAX_BITS 55 |
394 | 397 | ||
395 | extern int kern_addr_valid(unsigned long addr); | 398 | extern int kern_addr_valid(unsigned long addr); |
396 | 399 | ||
diff --git a/arch/arm64/include/asm/proc-fns.h b/arch/arm64/include/asm/proc-fns.h index 7cdf466fd0c5..0c657bb54597 100644 --- a/arch/arm64/include/asm/proc-fns.h +++ b/arch/arm64/include/asm/proc-fns.h | |||
@@ -26,11 +26,14 @@ | |||
26 | #include <asm/page.h> | 26 | #include <asm/page.h> |
27 | 27 | ||
28 | struct mm_struct; | 28 | struct mm_struct; |
29 | struct cpu_suspend_ctx; | ||
29 | 30 | ||
30 | extern void cpu_cache_off(void); | 31 | extern void cpu_cache_off(void); |
31 | extern void cpu_do_idle(void); | 32 | extern void cpu_do_idle(void); |
32 | extern void cpu_do_switch_mm(unsigned long pgd_phys, struct mm_struct *mm); | 33 | extern void cpu_do_switch_mm(unsigned long pgd_phys, struct mm_struct *mm); |
33 | extern void cpu_reset(unsigned long addr) __attribute__((noreturn)); | 34 | extern void cpu_reset(unsigned long addr) __attribute__((noreturn)); |
35 | extern void cpu_do_suspend(struct cpu_suspend_ctx *ptr); | ||
36 | extern u64 cpu_do_resume(phys_addr_t ptr, u64 idmap_ttbr); | ||
34 | 37 | ||
35 | #include <asm/memory.h> | 38 | #include <asm/memory.h> |
36 | 39 | ||
diff --git a/arch/arm64/include/asm/smp_plat.h b/arch/arm64/include/asm/smp_plat.h index ed43a0d2b1b2..59e282311b58 100644 --- a/arch/arm64/include/asm/smp_plat.h +++ b/arch/arm64/include/asm/smp_plat.h | |||
@@ -21,6 +21,19 @@ | |||
21 | 21 | ||
22 | #include <asm/types.h> | 22 | #include <asm/types.h> |
23 | 23 | ||
24 | struct mpidr_hash { | ||
25 | u64 mask; | ||
26 | u32 shift_aff[4]; | ||
27 | u32 bits; | ||
28 | }; | ||
29 | |||
30 | extern struct mpidr_hash mpidr_hash; | ||
31 | |||
32 | static inline u32 mpidr_hash_size(void) | ||
33 | { | ||
34 | return 1 << mpidr_hash.bits; | ||
35 | } | ||
36 | |||
24 | /* | 37 | /* |
25 | * Logical CPU mapping. | 38 | * Logical CPU mapping. |
26 | */ | 39 | */ |
diff --git a/arch/arm64/include/asm/suspend.h b/arch/arm64/include/asm/suspend.h new file mode 100644 index 000000000000..e9c149c042e0 --- /dev/null +++ b/arch/arm64/include/asm/suspend.h | |||
@@ -0,0 +1,27 @@ | |||
1 | #ifndef __ASM_SUSPEND_H | ||
2 | #define __ASM_SUSPEND_H | ||
3 | |||
4 | #define NR_CTX_REGS 11 | ||
5 | |||
6 | /* | ||
7 | * struct cpu_suspend_ctx must be 16-byte aligned since it is allocated on | ||
8 | * the stack, which must be 16-byte aligned on v8 | ||
9 | */ | ||
10 | struct cpu_suspend_ctx { | ||
11 | /* | ||
12 | * This struct must be kept in sync with | ||
13 | * cpu_do_{suspend/resume} in mm/proc.S | ||
14 | */ | ||
15 | u64 ctx_regs[NR_CTX_REGS]; | ||
16 | u64 sp; | ||
17 | } __aligned(16); | ||
18 | |||
19 | struct sleep_save_sp { | ||
20 | phys_addr_t *save_ptr_stash; | ||
21 | phys_addr_t save_ptr_stash_phys; | ||
22 | }; | ||
23 | |||
24 | extern void cpu_resume(void); | ||
25 | extern int cpu_suspend(unsigned long); | ||
26 | |||
27 | #endif | ||
diff --git a/arch/arm64/include/asm/uaccess.h b/arch/arm64/include/asm/uaccess.h index 7ecc2b23882e..6c0f684aca81 100644 --- a/arch/arm64/include/asm/uaccess.h +++ b/arch/arm64/include/asm/uaccess.h | |||
@@ -100,6 +100,7 @@ static inline void set_fs(mm_segment_t fs) | |||
100 | }) | 100 | }) |
101 | 101 | ||
102 | #define access_ok(type, addr, size) __range_ok(addr, size) | 102 | #define access_ok(type, addr, size) __range_ok(addr, size) |
103 | #define user_addr_max get_fs | ||
103 | 104 | ||
104 | /* | 105 | /* |
105 | * The "__xxx" versions of the user access functions do not verify the address | 106 | * The "__xxx" versions of the user access functions do not verify the address |
@@ -240,9 +241,6 @@ extern unsigned long __must_check __copy_to_user(void __user *to, const void *fr | |||
240 | extern unsigned long __must_check __copy_in_user(void __user *to, const void __user *from, unsigned long n); | 241 | extern unsigned long __must_check __copy_in_user(void __user *to, const void __user *from, unsigned long n); |
241 | extern unsigned long __must_check __clear_user(void __user *addr, unsigned long n); | 242 | extern unsigned long __must_check __clear_user(void __user *addr, unsigned long n); |
242 | 243 | ||
243 | extern unsigned long __must_check __strncpy_from_user(char *to, const char __user *from, unsigned long count); | ||
244 | extern unsigned long __must_check __strnlen_user(const char __user *s, long n); | ||
245 | |||
246 | static inline unsigned long __must_check copy_from_user(void *to, const void __user *from, unsigned long n) | 244 | static inline unsigned long __must_check copy_from_user(void *to, const void __user *from, unsigned long n) |
247 | { | 245 | { |
248 | if (access_ok(VERIFY_READ, from, n)) | 246 | if (access_ok(VERIFY_READ, from, n)) |
@@ -276,24 +274,9 @@ static inline unsigned long __must_check clear_user(void __user *to, unsigned lo | |||
276 | return n; | 274 | return n; |
277 | } | 275 | } |
278 | 276 | ||
279 | static inline long __must_check strncpy_from_user(char *dst, const char __user *src, long count) | 277 | extern long strncpy_from_user(char *dest, const char __user *src, long count); |
280 | { | ||
281 | long res = -EFAULT; | ||
282 | if (access_ok(VERIFY_READ, src, 1)) | ||
283 | res = __strncpy_from_user(dst, src, count); | ||
284 | return res; | ||
285 | } | ||
286 | |||
287 | #define strlen_user(s) strnlen_user(s, ~0UL >> 1) | ||
288 | 278 | ||
289 | static inline long __must_check strnlen_user(const char __user *s, long n) | 279 | extern __must_check long strlen_user(const char __user *str); |
290 | { | 280 | extern __must_check long strnlen_user(const char __user *str, long n); |
291 | unsigned long res = 0; | ||
292 | |||
293 | if (__addr_ok(s)) | ||
294 | res = __strnlen_user(s, n); | ||
295 | |||
296 | return res; | ||
297 | } | ||
298 | 281 | ||
299 | #endif /* __ASM_UACCESS_H */ | 282 | #endif /* __ASM_UACCESS_H */ |
diff --git a/arch/arm64/include/asm/word-at-a-time.h b/arch/arm64/include/asm/word-at-a-time.h new file mode 100644 index 000000000000..aab5bf09e9d9 --- /dev/null +++ b/arch/arm64/include/asm/word-at-a-time.h | |||
@@ -0,0 +1,94 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2013 ARM Ltd. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | #ifndef __ASM_WORD_AT_A_TIME_H | ||
17 | #define __ASM_WORD_AT_A_TIME_H | ||
18 | |||
19 | #ifndef __AARCH64EB__ | ||
20 | |||
21 | #include <linux/kernel.h> | ||
22 | |||
23 | struct word_at_a_time { | ||
24 | const unsigned long one_bits, high_bits; | ||
25 | }; | ||
26 | |||
27 | #define WORD_AT_A_TIME_CONSTANTS { REPEAT_BYTE(0x01), REPEAT_BYTE(0x80) } | ||
28 | |||
29 | static inline unsigned long has_zero(unsigned long a, unsigned long *bits, | ||
30 | const struct word_at_a_time *c) | ||
31 | { | ||
32 | unsigned long mask = ((a - c->one_bits) & ~a) & c->high_bits; | ||
33 | *bits = mask; | ||
34 | return mask; | ||
35 | } | ||
36 | |||
37 | #define prep_zero_mask(a, bits, c) (bits) | ||
38 | |||
39 | static inline unsigned long create_zero_mask(unsigned long bits) | ||
40 | { | ||
41 | bits = (bits - 1) & ~bits; | ||
42 | return bits >> 7; | ||
43 | } | ||
44 | |||
45 | static inline unsigned long find_zero(unsigned long mask) | ||
46 | { | ||
47 | return fls64(mask) >> 3; | ||
48 | } | ||
49 | |||
50 | #define zero_bytemask(mask) (mask) | ||
51 | |||
52 | #else /* __AARCH64EB__ */ | ||
53 | #include <asm-generic/word-at-a-time.h> | ||
54 | #endif | ||
55 | |||
56 | /* | ||
57 | * Load an unaligned word from kernel space. | ||
58 | * | ||
59 | * In the (very unlikely) case of the word being a page-crosser | ||
60 | * and the next page not being mapped, take the exception and | ||
61 | * return zeroes in the non-existing part. | ||
62 | */ | ||
63 | static inline unsigned long load_unaligned_zeropad(const void *addr) | ||
64 | { | ||
65 | unsigned long ret, offset; | ||
66 | |||
67 | /* Load word from unaligned pointer addr */ | ||
68 | asm( | ||
69 | "1: ldr %0, %3\n" | ||
70 | "2:\n" | ||
71 | " .pushsection .fixup,\"ax\"\n" | ||
72 | " .align 2\n" | ||
73 | "3: and %1, %2, #0x7\n" | ||
74 | " bic %2, %2, #0x7\n" | ||
75 | " ldr %0, [%2]\n" | ||
76 | " lsl %1, %1, #0x3\n" | ||
77 | #ifndef __AARCH64EB__ | ||
78 | " lsr %0, %0, %1\n" | ||
79 | #else | ||
80 | " lsl %0, %0, %1\n" | ||
81 | #endif | ||
82 | " b 2b\n" | ||
83 | " .popsection\n" | ||
84 | " .pushsection __ex_table,\"a\"\n" | ||
85 | " .align 3\n" | ||
86 | " .quad 1b, 3b\n" | ||
87 | " .popsection" | ||
88 | : "=&r" (ret), "=&r" (offset) | ||
89 | : "r" (addr), "Q" (*(unsigned long *)addr)); | ||
90 | |||
91 | return ret; | ||
92 | } | ||
93 | |||
94 | #endif /* __ASM_WORD_AT_A_TIME_H */ | ||
diff --git a/arch/arm64/include/asm/xen/page-coherent.h b/arch/arm64/include/asm/xen/page-coherent.h index 2820f1a6eebe..dde3fc9c49f0 100644 --- a/arch/arm64/include/asm/xen/page-coherent.h +++ b/arch/arm64/include/asm/xen/page-coherent.h | |||
@@ -23,25 +23,21 @@ static inline void xen_dma_map_page(struct device *hwdev, struct page *page, | |||
23 | unsigned long offset, size_t size, enum dma_data_direction dir, | 23 | unsigned long offset, size_t size, enum dma_data_direction dir, |
24 | struct dma_attrs *attrs) | 24 | struct dma_attrs *attrs) |
25 | { | 25 | { |
26 | __generic_dma_ops(hwdev)->map_page(hwdev, page, offset, size, dir, attrs); | ||
27 | } | 26 | } |
28 | 27 | ||
29 | static inline void xen_dma_unmap_page(struct device *hwdev, dma_addr_t handle, | 28 | static inline void xen_dma_unmap_page(struct device *hwdev, dma_addr_t handle, |
30 | size_t size, enum dma_data_direction dir, | 29 | size_t size, enum dma_data_direction dir, |
31 | struct dma_attrs *attrs) | 30 | struct dma_attrs *attrs) |
32 | { | 31 | { |
33 | __generic_dma_ops(hwdev)->unmap_page(hwdev, handle, size, dir, attrs); | ||
34 | } | 32 | } |
35 | 33 | ||
36 | static inline void xen_dma_sync_single_for_cpu(struct device *hwdev, | 34 | static inline void xen_dma_sync_single_for_cpu(struct device *hwdev, |
37 | dma_addr_t handle, size_t size, enum dma_data_direction dir) | 35 | dma_addr_t handle, size_t size, enum dma_data_direction dir) |
38 | { | 36 | { |
39 | __generic_dma_ops(hwdev)->sync_single_for_cpu(hwdev, handle, size, dir); | ||
40 | } | 37 | } |
41 | 38 | ||
42 | static inline void xen_dma_sync_single_for_device(struct device *hwdev, | 39 | static inline void xen_dma_sync_single_for_device(struct device *hwdev, |
43 | dma_addr_t handle, size_t size, enum dma_data_direction dir) | 40 | dma_addr_t handle, size_t size, enum dma_data_direction dir) |
44 | { | 41 | { |
45 | __generic_dma_ops(hwdev)->sync_single_for_device(hwdev, handle, size, dir); | ||
46 | } | 42 | } |
47 | #endif /* _ASM_ARM64_XEN_PAGE_COHERENT_H */ | 43 | #endif /* _ASM_ARM64_XEN_PAGE_COHERENT_H */ |
diff --git a/arch/arm64/include/uapi/asm/hwcap.h b/arch/arm64/include/uapi/asm/hwcap.h index 9b12476e9c85..73cf0f54d57c 100644 --- a/arch/arm64/include/uapi/asm/hwcap.h +++ b/arch/arm64/include/uapi/asm/hwcap.h | |||
@@ -22,6 +22,10 @@ | |||
22 | #define HWCAP_FP (1 << 0) | 22 | #define HWCAP_FP (1 << 0) |
23 | #define HWCAP_ASIMD (1 << 1) | 23 | #define HWCAP_ASIMD (1 << 1) |
24 | #define HWCAP_EVTSTRM (1 << 2) | 24 | #define HWCAP_EVTSTRM (1 << 2) |
25 | 25 | #define HWCAP_AES (1 << 3) | |
26 | #define HWCAP_PMULL (1 << 4) | ||
27 | #define HWCAP_SHA1 (1 << 5) | ||
28 | #define HWCAP_SHA2 (1 << 6) | ||
29 | #define HWCAP_CRC32 (1 << 7) | ||
26 | 30 | ||
27 | #endif /* _UAPI__ASM_HWCAP_H */ | 31 | #endif /* _UAPI__ASM_HWCAP_H */ |
diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 5ba2fd43a75b..2d4554b13410 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile | |||
@@ -9,7 +9,7 @@ AFLAGS_head.o := -DTEXT_OFFSET=$(TEXT_OFFSET) | |||
9 | arm64-obj-y := cputable.o debug-monitors.o entry.o irq.o fpsimd.o \ | 9 | arm64-obj-y := cputable.o debug-monitors.o entry.o irq.o fpsimd.o \ |
10 | entry-fpsimd.o process.o ptrace.o setup.o signal.o \ | 10 | entry-fpsimd.o process.o ptrace.o setup.o signal.o \ |
11 | sys.o stacktrace.o time.o traps.o io.o vdso.o \ | 11 | sys.o stacktrace.o time.o traps.o io.o vdso.o \ |
12 | hyp-stub.o psci.o cpu_ops.o | 12 | hyp-stub.o psci.o cpu_ops.o insn.o |
13 | 13 | ||
14 | arm64-obj-$(CONFIG_COMPAT) += sys32.o kuser32.o signal32.o \ | 14 | arm64-obj-$(CONFIG_COMPAT) += sys32.o kuser32.o signal32.o \ |
15 | sys_compat.o | 15 | sys_compat.o |
@@ -18,6 +18,8 @@ arm64-obj-$(CONFIG_SMP) += smp.o smp_spin_table.o | |||
18 | arm64-obj-$(CONFIG_HW_PERF_EVENTS) += perf_event.o | 18 | arm64-obj-$(CONFIG_HW_PERF_EVENTS) += perf_event.o |
19 | arm64-obj-$(CONFIG_HAVE_HW_BREAKPOINT)+= hw_breakpoint.o | 19 | arm64-obj-$(CONFIG_HAVE_HW_BREAKPOINT)+= hw_breakpoint.o |
20 | arm64-obj-$(CONFIG_EARLY_PRINTK) += early_printk.o | 20 | arm64-obj-$(CONFIG_EARLY_PRINTK) += early_printk.o |
21 | arm64-obj-$(CONFIG_ARM64_CPU_SUSPEND) += sleep.o suspend.o | ||
22 | arm64-obj-$(CONFIG_JUMP_LABEL) += jump_label.o | ||
21 | 23 | ||
22 | obj-y += $(arm64-obj-y) vdso/ | 24 | obj-y += $(arm64-obj-y) vdso/ |
23 | obj-m += $(arm64-obj-m) | 25 | obj-m += $(arm64-obj-m) |
diff --git a/arch/arm64/kernel/arm64ksyms.c b/arch/arm64/kernel/arm64ksyms.c index e7ee770c0697..338b568cd8ae 100644 --- a/arch/arm64/kernel/arm64ksyms.c +++ b/arch/arm64/kernel/arm64ksyms.c | |||
@@ -29,13 +29,10 @@ | |||
29 | 29 | ||
30 | #include <asm/checksum.h> | 30 | #include <asm/checksum.h> |
31 | 31 | ||
32 | /* user mem (segment) */ | ||
33 | EXPORT_SYMBOL(__strnlen_user); | ||
34 | EXPORT_SYMBOL(__strncpy_from_user); | ||
35 | |||
36 | EXPORT_SYMBOL(copy_page); | 32 | EXPORT_SYMBOL(copy_page); |
37 | EXPORT_SYMBOL(clear_page); | 33 | EXPORT_SYMBOL(clear_page); |
38 | 34 | ||
35 | /* user mem (segment) */ | ||
39 | EXPORT_SYMBOL(__copy_from_user); | 36 | EXPORT_SYMBOL(__copy_from_user); |
40 | EXPORT_SYMBOL(__copy_to_user); | 37 | EXPORT_SYMBOL(__copy_to_user); |
41 | EXPORT_SYMBOL(__clear_user); | 38 | EXPORT_SYMBOL(__clear_user); |
diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c index 666e231d410b..646f888387cd 100644 --- a/arch/arm64/kernel/asm-offsets.c +++ b/arch/arm64/kernel/asm-offsets.c | |||
@@ -25,6 +25,8 @@ | |||
25 | #include <asm/thread_info.h> | 25 | #include <asm/thread_info.h> |
26 | #include <asm/memory.h> | 26 | #include <asm/memory.h> |
27 | #include <asm/cputable.h> | 27 | #include <asm/cputable.h> |
28 | #include <asm/smp_plat.h> | ||
29 | #include <asm/suspend.h> | ||
28 | #include <asm/vdso_datapage.h> | 30 | #include <asm/vdso_datapage.h> |
29 | #include <linux/kbuild.h> | 31 | #include <linux/kbuild.h> |
30 | 32 | ||
@@ -138,5 +140,14 @@ int main(void) | |||
138 | DEFINE(KVM_VTTBR, offsetof(struct kvm, arch.vttbr)); | 140 | DEFINE(KVM_VTTBR, offsetof(struct kvm, arch.vttbr)); |
139 | DEFINE(KVM_VGIC_VCTRL, offsetof(struct kvm, arch.vgic.vctrl_base)); | 141 | DEFINE(KVM_VGIC_VCTRL, offsetof(struct kvm, arch.vgic.vctrl_base)); |
140 | #endif | 142 | #endif |
143 | #ifdef CONFIG_ARM64_CPU_SUSPEND | ||
144 | DEFINE(CPU_SUSPEND_SZ, sizeof(struct cpu_suspend_ctx)); | ||
145 | DEFINE(CPU_CTX_SP, offsetof(struct cpu_suspend_ctx, sp)); | ||
146 | DEFINE(MPIDR_HASH_MASK, offsetof(struct mpidr_hash, mask)); | ||
147 | DEFINE(MPIDR_HASH_SHIFTS, offsetof(struct mpidr_hash, shift_aff)); | ||
148 | DEFINE(SLEEP_SAVE_SP_SZ, sizeof(struct sleep_save_sp)); | ||
149 | DEFINE(SLEEP_SAVE_SP_PHYS, offsetof(struct sleep_save_sp, save_ptr_stash_phys)); | ||
150 | DEFINE(SLEEP_SAVE_SP_VIRT, offsetof(struct sleep_save_sp, save_ptr_stash)); | ||
151 | #endif | ||
141 | return 0; | 152 | return 0; |
142 | } | 153 | } |
diff --git a/arch/arm64/kernel/debug-monitors.c b/arch/arm64/kernel/debug-monitors.c index 6a0a9b132d7a..636ba8b6240b 100644 --- a/arch/arm64/kernel/debug-monitors.c +++ b/arch/arm64/kernel/debug-monitors.c | |||
@@ -187,6 +187,48 @@ static void clear_regs_spsr_ss(struct pt_regs *regs) | |||
187 | regs->pstate = spsr; | 187 | regs->pstate = spsr; |
188 | } | 188 | } |
189 | 189 | ||
190 | /* EL1 Single Step Handler hooks */ | ||
191 | static LIST_HEAD(step_hook); | ||
192 | DEFINE_RWLOCK(step_hook_lock); | ||
193 | |||
194 | void register_step_hook(struct step_hook *hook) | ||
195 | { | ||
196 | write_lock(&step_hook_lock); | ||
197 | list_add(&hook->node, &step_hook); | ||
198 | write_unlock(&step_hook_lock); | ||
199 | } | ||
200 | |||
201 | void unregister_step_hook(struct step_hook *hook) | ||
202 | { | ||
203 | write_lock(&step_hook_lock); | ||
204 | list_del(&hook->node); | ||
205 | write_unlock(&step_hook_lock); | ||
206 | } | ||
207 | |||
208 | /* | ||
209 | * Call registered single step handers | ||
210 | * There is no Syndrome info to check for determining the handler. | ||
211 | * So we call all the registered handlers, until the right handler is | ||
212 | * found which returns zero. | ||
213 | */ | ||
214 | static int call_step_hook(struct pt_regs *regs, unsigned int esr) | ||
215 | { | ||
216 | struct step_hook *hook; | ||
217 | int retval = DBG_HOOK_ERROR; | ||
218 | |||
219 | read_lock(&step_hook_lock); | ||
220 | |||
221 | list_for_each_entry(hook, &step_hook, node) { | ||
222 | retval = hook->fn(regs, esr); | ||
223 | if (retval == DBG_HOOK_HANDLED) | ||
224 | break; | ||
225 | } | ||
226 | |||
227 | read_unlock(&step_hook_lock); | ||
228 | |||
229 | return retval; | ||
230 | } | ||
231 | |||
190 | static int single_step_handler(unsigned long addr, unsigned int esr, | 232 | static int single_step_handler(unsigned long addr, unsigned int esr, |
191 | struct pt_regs *regs) | 233 | struct pt_regs *regs) |
192 | { | 234 | { |
@@ -214,7 +256,9 @@ static int single_step_handler(unsigned long addr, unsigned int esr, | |||
214 | */ | 256 | */ |
215 | user_rewind_single_step(current); | 257 | user_rewind_single_step(current); |
216 | } else { | 258 | } else { |
217 | /* TODO: route to KGDB */ | 259 | if (call_step_hook(regs, esr) == DBG_HOOK_HANDLED) |
260 | return 0; | ||
261 | |||
218 | pr_warning("Unexpected kernel single-step exception at EL1\n"); | 262 | pr_warning("Unexpected kernel single-step exception at EL1\n"); |
219 | /* | 263 | /* |
220 | * Re-enable stepping since we know that we will be | 264 | * Re-enable stepping since we know that we will be |
@@ -226,11 +270,53 @@ static int single_step_handler(unsigned long addr, unsigned int esr, | |||
226 | return 0; | 270 | return 0; |
227 | } | 271 | } |
228 | 272 | ||
273 | /* | ||
274 | * Breakpoint handler is re-entrant as another breakpoint can | ||
275 | * hit within breakpoint handler, especically in kprobes. | ||
276 | * Use reader/writer locks instead of plain spinlock. | ||
277 | */ | ||
278 | static LIST_HEAD(break_hook); | ||
279 | DEFINE_RWLOCK(break_hook_lock); | ||
280 | |||
281 | void register_break_hook(struct break_hook *hook) | ||
282 | { | ||
283 | write_lock(&break_hook_lock); | ||
284 | list_add(&hook->node, &break_hook); | ||
285 | write_unlock(&break_hook_lock); | ||
286 | } | ||
287 | |||
288 | void unregister_break_hook(struct break_hook *hook) | ||
289 | { | ||
290 | write_lock(&break_hook_lock); | ||
291 | list_del(&hook->node); | ||
292 | write_unlock(&break_hook_lock); | ||
293 | } | ||
294 | |||
295 | static int call_break_hook(struct pt_regs *regs, unsigned int esr) | ||
296 | { | ||
297 | struct break_hook *hook; | ||
298 | int (*fn)(struct pt_regs *regs, unsigned int esr) = NULL; | ||
299 | |||
300 | read_lock(&break_hook_lock); | ||
301 | list_for_each_entry(hook, &break_hook, node) | ||
302 | if ((esr & hook->esr_mask) == hook->esr_val) | ||
303 | fn = hook->fn; | ||
304 | read_unlock(&break_hook_lock); | ||
305 | |||
306 | return fn ? fn(regs, esr) : DBG_HOOK_ERROR; | ||
307 | } | ||
308 | |||
229 | static int brk_handler(unsigned long addr, unsigned int esr, | 309 | static int brk_handler(unsigned long addr, unsigned int esr, |
230 | struct pt_regs *regs) | 310 | struct pt_regs *regs) |
231 | { | 311 | { |
232 | siginfo_t info; | 312 | siginfo_t info; |
233 | 313 | ||
314 | if (call_break_hook(regs, esr) == DBG_HOOK_HANDLED) | ||
315 | return 0; | ||
316 | |||
317 | pr_warn("unexpected brk exception at %lx, esr=0x%x\n", | ||
318 | (long)instruction_pointer(regs), esr); | ||
319 | |||
234 | if (!user_mode(regs)) | 320 | if (!user_mode(regs)) |
235 | return -EFAULT; | 321 | return -EFAULT; |
236 | 322 | ||
@@ -248,7 +334,8 @@ static int brk_handler(unsigned long addr, unsigned int esr, | |||
248 | int aarch32_break_handler(struct pt_regs *regs) | 334 | int aarch32_break_handler(struct pt_regs *regs) |
249 | { | 335 | { |
250 | siginfo_t info; | 336 | siginfo_t info; |
251 | unsigned int instr; | 337 | u32 arm_instr; |
338 | u16 thumb_instr; | ||
252 | bool bp = false; | 339 | bool bp = false; |
253 | void __user *pc = (void __user *)instruction_pointer(regs); | 340 | void __user *pc = (void __user *)instruction_pointer(regs); |
254 | 341 | ||
@@ -257,18 +344,21 @@ int aarch32_break_handler(struct pt_regs *regs) | |||
257 | 344 | ||
258 | if (compat_thumb_mode(regs)) { | 345 | if (compat_thumb_mode(regs)) { |
259 | /* get 16-bit Thumb instruction */ | 346 | /* get 16-bit Thumb instruction */ |
260 | get_user(instr, (u16 __user *)pc); | 347 | get_user(thumb_instr, (u16 __user *)pc); |
261 | if (instr == AARCH32_BREAK_THUMB2_LO) { | 348 | thumb_instr = le16_to_cpu(thumb_instr); |
349 | if (thumb_instr == AARCH32_BREAK_THUMB2_LO) { | ||
262 | /* get second half of 32-bit Thumb-2 instruction */ | 350 | /* get second half of 32-bit Thumb-2 instruction */ |
263 | get_user(instr, (u16 __user *)(pc + 2)); | 351 | get_user(thumb_instr, (u16 __user *)(pc + 2)); |
264 | bp = instr == AARCH32_BREAK_THUMB2_HI; | 352 | thumb_instr = le16_to_cpu(thumb_instr); |
353 | bp = thumb_instr == AARCH32_BREAK_THUMB2_HI; | ||
265 | } else { | 354 | } else { |
266 | bp = instr == AARCH32_BREAK_THUMB; | 355 | bp = thumb_instr == AARCH32_BREAK_THUMB; |
267 | } | 356 | } |
268 | } else { | 357 | } else { |
269 | /* 32-bit ARM instruction */ | 358 | /* 32-bit ARM instruction */ |
270 | get_user(instr, (u32 __user *)pc); | 359 | get_user(arm_instr, (u32 __user *)pc); |
271 | bp = (instr & ~0xf0000000) == AARCH32_BREAK_ARM; | 360 | arm_instr = le32_to_cpu(arm_instr); |
361 | bp = (arm_instr & ~0xf0000000) == AARCH32_BREAK_ARM; | ||
272 | } | 362 | } |
273 | 363 | ||
274 | if (!bp) | 364 | if (!bp) |
diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index e1166145ca29..39ac630d83de 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S | |||
@@ -288,6 +288,8 @@ el1_dbg: | |||
288 | /* | 288 | /* |
289 | * Debug exception handling | 289 | * Debug exception handling |
290 | */ | 290 | */ |
291 | cmp x24, #ESR_EL1_EC_BRK64 // if BRK64 | ||
292 | cinc x24, x24, eq // set bit '0' | ||
291 | tbz x24, #0, el1_inv // EL1 only | 293 | tbz x24, #0, el1_inv // EL1 only |
292 | mrs x0, far_el1 | 294 | mrs x0, far_el1 |
293 | mov x2, sp // struct pt_regs | 295 | mov x2, sp // struct pt_regs |
@@ -309,15 +311,12 @@ el1_irq: | |||
309 | #ifdef CONFIG_TRACE_IRQFLAGS | 311 | #ifdef CONFIG_TRACE_IRQFLAGS |
310 | bl trace_hardirqs_off | 312 | bl trace_hardirqs_off |
311 | #endif | 313 | #endif |
314 | |||
315 | irq_handler | ||
316 | |||
312 | #ifdef CONFIG_PREEMPT | 317 | #ifdef CONFIG_PREEMPT |
313 | get_thread_info tsk | 318 | get_thread_info tsk |
314 | ldr w24, [tsk, #TI_PREEMPT] // get preempt count | 319 | ldr w24, [tsk, #TI_PREEMPT] // get preempt count |
315 | add w0, w24, #1 // increment it | ||
316 | str w0, [tsk, #TI_PREEMPT] | ||
317 | #endif | ||
318 | irq_handler | ||
319 | #ifdef CONFIG_PREEMPT | ||
320 | str w24, [tsk, #TI_PREEMPT] // restore preempt count | ||
321 | cbnz w24, 1f // preempt count != 0 | 320 | cbnz w24, 1f // preempt count != 0 |
322 | ldr x0, [tsk, #TI_FLAGS] // get flags | 321 | ldr x0, [tsk, #TI_FLAGS] // get flags |
323 | tbz x0, #TIF_NEED_RESCHED, 1f // needs rescheduling? | 322 | tbz x0, #TIF_NEED_RESCHED, 1f // needs rescheduling? |
@@ -507,22 +506,10 @@ el0_irq_naked: | |||
507 | #ifdef CONFIG_TRACE_IRQFLAGS | 506 | #ifdef CONFIG_TRACE_IRQFLAGS |
508 | bl trace_hardirqs_off | 507 | bl trace_hardirqs_off |
509 | #endif | 508 | #endif |
510 | get_thread_info tsk | 509 | |
511 | #ifdef CONFIG_PREEMPT | ||
512 | ldr w24, [tsk, #TI_PREEMPT] // get preempt count | ||
513 | add w23, w24, #1 // increment it | ||
514 | str w23, [tsk, #TI_PREEMPT] | ||
515 | #endif | ||
516 | irq_handler | 510 | irq_handler |
517 | #ifdef CONFIG_PREEMPT | 511 | get_thread_info tsk |
518 | ldr w0, [tsk, #TI_PREEMPT] | 512 | |
519 | str w24, [tsk, #TI_PREEMPT] | ||
520 | cmp w0, w23 | ||
521 | b.eq 1f | ||
522 | mov x1, #0 | ||
523 | str x1, [x1] // BUG | ||
524 | 1: | ||
525 | #endif | ||
526 | #ifdef CONFIG_TRACE_IRQFLAGS | 513 | #ifdef CONFIG_TRACE_IRQFLAGS |
527 | bl trace_hardirqs_on | 514 | bl trace_hardirqs_on |
528 | #endif | 515 | #endif |
diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c index bb785d23dbde..4aef42a04bdc 100644 --- a/arch/arm64/kernel/fpsimd.c +++ b/arch/arm64/kernel/fpsimd.c | |||
@@ -17,6 +17,7 @@ | |||
17 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | 17 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
18 | */ | 18 | */ |
19 | 19 | ||
20 | #include <linux/cpu_pm.h> | ||
20 | #include <linux/kernel.h> | 21 | #include <linux/kernel.h> |
21 | #include <linux/init.h> | 22 | #include <linux/init.h> |
22 | #include <linux/sched.h> | 23 | #include <linux/sched.h> |
@@ -113,6 +114,39 @@ EXPORT_SYMBOL(kernel_neon_end); | |||
113 | 114 | ||
114 | #endif /* CONFIG_KERNEL_MODE_NEON */ | 115 | #endif /* CONFIG_KERNEL_MODE_NEON */ |
115 | 116 | ||
117 | #ifdef CONFIG_CPU_PM | ||
118 | static int fpsimd_cpu_pm_notifier(struct notifier_block *self, | ||
119 | unsigned long cmd, void *v) | ||
120 | { | ||
121 | switch (cmd) { | ||
122 | case CPU_PM_ENTER: | ||
123 | if (current->mm) | ||
124 | fpsimd_save_state(¤t->thread.fpsimd_state); | ||
125 | break; | ||
126 | case CPU_PM_EXIT: | ||
127 | if (current->mm) | ||
128 | fpsimd_load_state(¤t->thread.fpsimd_state); | ||
129 | break; | ||
130 | case CPU_PM_ENTER_FAILED: | ||
131 | default: | ||
132 | return NOTIFY_DONE; | ||
133 | } | ||
134 | return NOTIFY_OK; | ||
135 | } | ||
136 | |||
137 | static struct notifier_block fpsimd_cpu_pm_notifier_block = { | ||
138 | .notifier_call = fpsimd_cpu_pm_notifier, | ||
139 | }; | ||
140 | |||
141 | static void fpsimd_pm_init(void) | ||
142 | { | ||
143 | cpu_pm_register_notifier(&fpsimd_cpu_pm_notifier_block); | ||
144 | } | ||
145 | |||
146 | #else | ||
147 | static inline void fpsimd_pm_init(void) { } | ||
148 | #endif /* CONFIG_CPU_PM */ | ||
149 | |||
116 | /* | 150 | /* |
117 | * FP/SIMD support code initialisation. | 151 | * FP/SIMD support code initialisation. |
118 | */ | 152 | */ |
@@ -131,6 +165,8 @@ static int __init fpsimd_init(void) | |||
131 | else | 165 | else |
132 | elf_hwcap |= HWCAP_ASIMD; | 166 | elf_hwcap |= HWCAP_ASIMD; |
133 | 167 | ||
168 | fpsimd_pm_init(); | ||
169 | |||
134 | return 0; | 170 | return 0; |
135 | } | 171 | } |
136 | late_initcall(fpsimd_init); | 172 | late_initcall(fpsimd_init); |
diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S index 7009387348b7..0b281fffda51 100644 --- a/arch/arm64/kernel/head.S +++ b/arch/arm64/kernel/head.S | |||
@@ -282,8 +282,9 @@ ENDPROC(secondary_holding_pen) | |||
282 | * be used where CPUs are brought online dynamically by the kernel. | 282 | * be used where CPUs are brought online dynamically by the kernel. |
283 | */ | 283 | */ |
284 | ENTRY(secondary_entry) | 284 | ENTRY(secondary_entry) |
285 | bl __calc_phys_offset // x2=phys offset | ||
286 | bl el2_setup // Drop to EL1 | 285 | bl el2_setup // Drop to EL1 |
286 | bl __calc_phys_offset // x24=PHYS_OFFSET, x28=PHYS_OFFSET-PAGE_OFFSET | ||
287 | bl set_cpu_boot_mode_flag | ||
287 | b secondary_startup | 288 | b secondary_startup |
288 | ENDPROC(secondary_entry) | 289 | ENDPROC(secondary_entry) |
289 | 290 | ||
@@ -481,8 +482,6 @@ ENDPROC(__create_page_tables) | |||
481 | .type __switch_data, %object | 482 | .type __switch_data, %object |
482 | __switch_data: | 483 | __switch_data: |
483 | .quad __mmap_switched | 484 | .quad __mmap_switched |
484 | .quad __data_loc // x4 | ||
485 | .quad _data // x5 | ||
486 | .quad __bss_start // x6 | 485 | .quad __bss_start // x6 |
487 | .quad _end // x7 | 486 | .quad _end // x7 |
488 | .quad processor_id // x4 | 487 | .quad processor_id // x4 |
@@ -497,15 +496,7 @@ __switch_data: | |||
497 | __mmap_switched: | 496 | __mmap_switched: |
498 | adr x3, __switch_data + 8 | 497 | adr x3, __switch_data + 8 |
499 | 498 | ||
500 | ldp x4, x5, [x3], #16 | ||
501 | ldp x6, x7, [x3], #16 | 499 | ldp x6, x7, [x3], #16 |
502 | cmp x4, x5 // Copy data segment if needed | ||
503 | 1: ccmp x5, x6, #4, ne | ||
504 | b.eq 2f | ||
505 | ldr x16, [x4], #8 | ||
506 | str x16, [x5], #8 | ||
507 | b 1b | ||
508 | 2: | ||
509 | 1: cmp x6, x7 | 500 | 1: cmp x6, x7 |
510 | b.hs 2f | 501 | b.hs 2f |
511 | str xzr, [x6], #8 // Clear BSS | 502 | str xzr, [x6], #8 // Clear BSS |
diff --git a/arch/arm64/kernel/hw_breakpoint.c b/arch/arm64/kernel/hw_breakpoint.c index ff516f6691e4..f17f581116fc 100644 --- a/arch/arm64/kernel/hw_breakpoint.c +++ b/arch/arm64/kernel/hw_breakpoint.c | |||
@@ -20,6 +20,7 @@ | |||
20 | 20 | ||
21 | #define pr_fmt(fmt) "hw-breakpoint: " fmt | 21 | #define pr_fmt(fmt) "hw-breakpoint: " fmt |
22 | 22 | ||
23 | #include <linux/cpu_pm.h> | ||
23 | #include <linux/errno.h> | 24 | #include <linux/errno.h> |
24 | #include <linux/hw_breakpoint.h> | 25 | #include <linux/hw_breakpoint.h> |
25 | #include <linux/perf_event.h> | 26 | #include <linux/perf_event.h> |
@@ -169,15 +170,68 @@ static enum debug_el debug_exception_level(int privilege) | |||
169 | } | 170 | } |
170 | } | 171 | } |
171 | 172 | ||
172 | /* | 173 | enum hw_breakpoint_ops { |
173 | * Install a perf counter breakpoint. | 174 | HW_BREAKPOINT_INSTALL, |
175 | HW_BREAKPOINT_UNINSTALL, | ||
176 | HW_BREAKPOINT_RESTORE | ||
177 | }; | ||
178 | |||
179 | /** | ||
180 | * hw_breakpoint_slot_setup - Find and setup a perf slot according to | ||
181 | * operations | ||
182 | * | ||
183 | * @slots: pointer to array of slots | ||
184 | * @max_slots: max number of slots | ||
185 | * @bp: perf_event to setup | ||
186 | * @ops: operation to be carried out on the slot | ||
187 | * | ||
188 | * Return: | ||
189 | * slot index on success | ||
190 | * -ENOSPC if no slot is available/matches | ||
191 | * -EINVAL on wrong operations parameter | ||
174 | */ | 192 | */ |
175 | int arch_install_hw_breakpoint(struct perf_event *bp) | 193 | static int hw_breakpoint_slot_setup(struct perf_event **slots, int max_slots, |
194 | struct perf_event *bp, | ||
195 | enum hw_breakpoint_ops ops) | ||
196 | { | ||
197 | int i; | ||
198 | struct perf_event **slot; | ||
199 | |||
200 | for (i = 0; i < max_slots; ++i) { | ||
201 | slot = &slots[i]; | ||
202 | switch (ops) { | ||
203 | case HW_BREAKPOINT_INSTALL: | ||
204 | if (!*slot) { | ||
205 | *slot = bp; | ||
206 | return i; | ||
207 | } | ||
208 | break; | ||
209 | case HW_BREAKPOINT_UNINSTALL: | ||
210 | if (*slot == bp) { | ||
211 | *slot = NULL; | ||
212 | return i; | ||
213 | } | ||
214 | break; | ||
215 | case HW_BREAKPOINT_RESTORE: | ||
216 | if (*slot == bp) | ||
217 | return i; | ||
218 | break; | ||
219 | default: | ||
220 | pr_warn_once("Unhandled hw breakpoint ops %d\n", ops); | ||
221 | return -EINVAL; | ||
222 | } | ||
223 | } | ||
224 | return -ENOSPC; | ||
225 | } | ||
226 | |||
227 | static int hw_breakpoint_control(struct perf_event *bp, | ||
228 | enum hw_breakpoint_ops ops) | ||
176 | { | 229 | { |
177 | struct arch_hw_breakpoint *info = counter_arch_bp(bp); | 230 | struct arch_hw_breakpoint *info = counter_arch_bp(bp); |
178 | struct perf_event **slot, **slots; | 231 | struct perf_event **slots; |
179 | struct debug_info *debug_info = ¤t->thread.debug; | 232 | struct debug_info *debug_info = ¤t->thread.debug; |
180 | int i, max_slots, ctrl_reg, val_reg, reg_enable; | 233 | int i, max_slots, ctrl_reg, val_reg, reg_enable; |
234 | enum debug_el dbg_el = debug_exception_level(info->ctrl.privilege); | ||
181 | u32 ctrl; | 235 | u32 ctrl; |
182 | 236 | ||
183 | if (info->ctrl.type == ARM_BREAKPOINT_EXECUTE) { | 237 | if (info->ctrl.type == ARM_BREAKPOINT_EXECUTE) { |
@@ -196,67 +250,54 @@ int arch_install_hw_breakpoint(struct perf_event *bp) | |||
196 | reg_enable = !debug_info->wps_disabled; | 250 | reg_enable = !debug_info->wps_disabled; |
197 | } | 251 | } |
198 | 252 | ||
199 | for (i = 0; i < max_slots; ++i) { | 253 | i = hw_breakpoint_slot_setup(slots, max_slots, bp, ops); |
200 | slot = &slots[i]; | ||
201 | |||
202 | if (!*slot) { | ||
203 | *slot = bp; | ||
204 | break; | ||
205 | } | ||
206 | } | ||
207 | |||
208 | if (WARN_ONCE(i == max_slots, "Can't find any breakpoint slot")) | ||
209 | return -ENOSPC; | ||
210 | 254 | ||
211 | /* Ensure debug monitors are enabled at the correct exception level. */ | 255 | if (WARN_ONCE(i < 0, "Can't find any breakpoint slot")) |
212 | enable_debug_monitors(debug_exception_level(info->ctrl.privilege)); | 256 | return i; |
213 | 257 | ||
214 | /* Setup the address register. */ | 258 | switch (ops) { |
215 | write_wb_reg(val_reg, i, info->address); | 259 | case HW_BREAKPOINT_INSTALL: |
260 | /* | ||
261 | * Ensure debug monitors are enabled at the correct exception | ||
262 | * level. | ||
263 | */ | ||
264 | enable_debug_monitors(dbg_el); | ||
265 | /* Fall through */ | ||
266 | case HW_BREAKPOINT_RESTORE: | ||
267 | /* Setup the address register. */ | ||
268 | write_wb_reg(val_reg, i, info->address); | ||
269 | |||
270 | /* Setup the control register. */ | ||
271 | ctrl = encode_ctrl_reg(info->ctrl); | ||
272 | write_wb_reg(ctrl_reg, i, | ||
273 | reg_enable ? ctrl | 0x1 : ctrl & ~0x1); | ||
274 | break; | ||
275 | case HW_BREAKPOINT_UNINSTALL: | ||
276 | /* Reset the control register. */ | ||
277 | write_wb_reg(ctrl_reg, i, 0); | ||
216 | 278 | ||
217 | /* Setup the control register. */ | 279 | /* |
218 | ctrl = encode_ctrl_reg(info->ctrl); | 280 | * Release the debug monitors for the correct exception |
219 | write_wb_reg(ctrl_reg, i, reg_enable ? ctrl | 0x1 : ctrl & ~0x1); | 281 | * level. |
282 | */ | ||
283 | disable_debug_monitors(dbg_el); | ||
284 | break; | ||
285 | } | ||
220 | 286 | ||
221 | return 0; | 287 | return 0; |
222 | } | 288 | } |
223 | 289 | ||
224 | void arch_uninstall_hw_breakpoint(struct perf_event *bp) | 290 | /* |
291 | * Install a perf counter breakpoint. | ||
292 | */ | ||
293 | int arch_install_hw_breakpoint(struct perf_event *bp) | ||
225 | { | 294 | { |
226 | struct arch_hw_breakpoint *info = counter_arch_bp(bp); | 295 | return hw_breakpoint_control(bp, HW_BREAKPOINT_INSTALL); |
227 | struct perf_event **slot, **slots; | 296 | } |
228 | int i, max_slots, base; | ||
229 | |||
230 | if (info->ctrl.type == ARM_BREAKPOINT_EXECUTE) { | ||
231 | /* Breakpoint */ | ||
232 | base = AARCH64_DBG_REG_BCR; | ||
233 | slots = this_cpu_ptr(bp_on_reg); | ||
234 | max_slots = core_num_brps; | ||
235 | } else { | ||
236 | /* Watchpoint */ | ||
237 | base = AARCH64_DBG_REG_WCR; | ||
238 | slots = this_cpu_ptr(wp_on_reg); | ||
239 | max_slots = core_num_wrps; | ||
240 | } | ||
241 | |||
242 | /* Remove the breakpoint. */ | ||
243 | for (i = 0; i < max_slots; ++i) { | ||
244 | slot = &slots[i]; | ||
245 | |||
246 | if (*slot == bp) { | ||
247 | *slot = NULL; | ||
248 | break; | ||
249 | } | ||
250 | } | ||
251 | |||
252 | if (WARN_ONCE(i == max_slots, "Can't find any breakpoint slot")) | ||
253 | return; | ||
254 | |||
255 | /* Reset the control register. */ | ||
256 | write_wb_reg(base, i, 0); | ||
257 | 297 | ||
258 | /* Release the debug monitors for the correct exception level. */ | 298 | void arch_uninstall_hw_breakpoint(struct perf_event *bp) |
259 | disable_debug_monitors(debug_exception_level(info->ctrl.privilege)); | 299 | { |
300 | hw_breakpoint_control(bp, HW_BREAKPOINT_UNINSTALL); | ||
260 | } | 301 | } |
261 | 302 | ||
262 | static int get_hbp_len(u8 hbp_len) | 303 | static int get_hbp_len(u8 hbp_len) |
@@ -806,18 +847,36 @@ void hw_breakpoint_thread_switch(struct task_struct *next) | |||
806 | /* | 847 | /* |
807 | * CPU initialisation. | 848 | * CPU initialisation. |
808 | */ | 849 | */ |
809 | static void reset_ctrl_regs(void *unused) | 850 | static void hw_breakpoint_reset(void *unused) |
810 | { | 851 | { |
811 | int i; | 852 | int i; |
812 | 853 | struct perf_event **slots; | |
813 | for (i = 0; i < core_num_brps; ++i) { | 854 | /* |
814 | write_wb_reg(AARCH64_DBG_REG_BCR, i, 0UL); | 855 | * When a CPU goes through cold-boot, it does not have any installed |
815 | write_wb_reg(AARCH64_DBG_REG_BVR, i, 0UL); | 856 | * slot, so it is safe to share the same function for restoring and |
857 | * resetting breakpoints; when a CPU is hotplugged in, it goes | ||
858 | * through the slots, which are all empty, hence it just resets control | ||
859 | * and value for debug registers. | ||
860 | * When this function is triggered on warm-boot through a CPU PM | ||
861 | * notifier some slots might be initialized; if so they are | ||
862 | * reprogrammed according to the debug slots content. | ||
863 | */ | ||
864 | for (slots = this_cpu_ptr(bp_on_reg), i = 0; i < core_num_brps; ++i) { | ||
865 | if (slots[i]) { | ||
866 | hw_breakpoint_control(slots[i], HW_BREAKPOINT_RESTORE); | ||
867 | } else { | ||
868 | write_wb_reg(AARCH64_DBG_REG_BCR, i, 0UL); | ||
869 | write_wb_reg(AARCH64_DBG_REG_BVR, i, 0UL); | ||
870 | } | ||
816 | } | 871 | } |
817 | 872 | ||
818 | for (i = 0; i < core_num_wrps; ++i) { | 873 | for (slots = this_cpu_ptr(wp_on_reg), i = 0; i < core_num_wrps; ++i) { |
819 | write_wb_reg(AARCH64_DBG_REG_WCR, i, 0UL); | 874 | if (slots[i]) { |
820 | write_wb_reg(AARCH64_DBG_REG_WVR, i, 0UL); | 875 | hw_breakpoint_control(slots[i], HW_BREAKPOINT_RESTORE); |
876 | } else { | ||
877 | write_wb_reg(AARCH64_DBG_REG_WCR, i, 0UL); | ||
878 | write_wb_reg(AARCH64_DBG_REG_WVR, i, 0UL); | ||
879 | } | ||
821 | } | 880 | } |
822 | } | 881 | } |
823 | 882 | ||
@@ -827,7 +886,7 @@ static int hw_breakpoint_reset_notify(struct notifier_block *self, | |||
827 | { | 886 | { |
828 | int cpu = (long)hcpu; | 887 | int cpu = (long)hcpu; |
829 | if (action == CPU_ONLINE) | 888 | if (action == CPU_ONLINE) |
830 | smp_call_function_single(cpu, reset_ctrl_regs, NULL, 1); | 889 | smp_call_function_single(cpu, hw_breakpoint_reset, NULL, 1); |
831 | return NOTIFY_OK; | 890 | return NOTIFY_OK; |
832 | } | 891 | } |
833 | 892 | ||
@@ -835,6 +894,14 @@ static struct notifier_block hw_breakpoint_reset_nb = { | |||
835 | .notifier_call = hw_breakpoint_reset_notify, | 894 | .notifier_call = hw_breakpoint_reset_notify, |
836 | }; | 895 | }; |
837 | 896 | ||
897 | #ifdef CONFIG_ARM64_CPU_SUSPEND | ||
898 | extern void cpu_suspend_set_dbg_restorer(void (*hw_bp_restore)(void *)); | ||
899 | #else | ||
900 | static inline void cpu_suspend_set_dbg_restorer(void (*hw_bp_restore)(void *)) | ||
901 | { | ||
902 | } | ||
903 | #endif | ||
904 | |||
838 | /* | 905 | /* |
839 | * One-time initialisation. | 906 | * One-time initialisation. |
840 | */ | 907 | */ |
@@ -850,8 +917,8 @@ static int __init arch_hw_breakpoint_init(void) | |||
850 | * Reset the breakpoint resources. We assume that a halting | 917 | * Reset the breakpoint resources. We assume that a halting |
851 | * debugger will leave the world in a nice state for us. | 918 | * debugger will leave the world in a nice state for us. |
852 | */ | 919 | */ |
853 | smp_call_function(reset_ctrl_regs, NULL, 1); | 920 | smp_call_function(hw_breakpoint_reset, NULL, 1); |
854 | reset_ctrl_regs(NULL); | 921 | hw_breakpoint_reset(NULL); |
855 | 922 | ||
856 | /* Register debug fault handlers. */ | 923 | /* Register debug fault handlers. */ |
857 | hook_debug_fault_code(DBG_ESR_EVT_HWBP, breakpoint_handler, SIGTRAP, | 924 | hook_debug_fault_code(DBG_ESR_EVT_HWBP, breakpoint_handler, SIGTRAP, |
@@ -861,6 +928,8 @@ static int __init arch_hw_breakpoint_init(void) | |||
861 | 928 | ||
862 | /* Register hotplug notifier. */ | 929 | /* Register hotplug notifier. */ |
863 | register_cpu_notifier(&hw_breakpoint_reset_nb); | 930 | register_cpu_notifier(&hw_breakpoint_reset_nb); |
931 | /* Register cpu_suspend hw breakpoint restore hook */ | ||
932 | cpu_suspend_set_dbg_restorer(hw_breakpoint_reset); | ||
864 | 933 | ||
865 | return 0; | 934 | return 0; |
866 | } | 935 | } |
diff --git a/arch/arm64/kernel/insn.c b/arch/arm64/kernel/insn.c new file mode 100644 index 000000000000..92f36835486b --- /dev/null +++ b/arch/arm64/kernel/insn.c | |||
@@ -0,0 +1,304 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2013 Huawei Ltd. | ||
3 | * Author: Jiang Liu <liuj97@gmail.com> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License version 2 as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
16 | */ | ||
17 | #include <linux/bitops.h> | ||
18 | #include <linux/compiler.h> | ||
19 | #include <linux/kernel.h> | ||
20 | #include <linux/smp.h> | ||
21 | #include <linux/stop_machine.h> | ||
22 | #include <linux/uaccess.h> | ||
23 | #include <asm/cacheflush.h> | ||
24 | #include <asm/insn.h> | ||
25 | |||
26 | static int aarch64_insn_encoding_class[] = { | ||
27 | AARCH64_INSN_CLS_UNKNOWN, | ||
28 | AARCH64_INSN_CLS_UNKNOWN, | ||
29 | AARCH64_INSN_CLS_UNKNOWN, | ||
30 | AARCH64_INSN_CLS_UNKNOWN, | ||
31 | AARCH64_INSN_CLS_LDST, | ||
32 | AARCH64_INSN_CLS_DP_REG, | ||
33 | AARCH64_INSN_CLS_LDST, | ||
34 | AARCH64_INSN_CLS_DP_FPSIMD, | ||
35 | AARCH64_INSN_CLS_DP_IMM, | ||
36 | AARCH64_INSN_CLS_DP_IMM, | ||
37 | AARCH64_INSN_CLS_BR_SYS, | ||
38 | AARCH64_INSN_CLS_BR_SYS, | ||
39 | AARCH64_INSN_CLS_LDST, | ||
40 | AARCH64_INSN_CLS_DP_REG, | ||
41 | AARCH64_INSN_CLS_LDST, | ||
42 | AARCH64_INSN_CLS_DP_FPSIMD, | ||
43 | }; | ||
44 | |||
45 | enum aarch64_insn_encoding_class __kprobes aarch64_get_insn_class(u32 insn) | ||
46 | { | ||
47 | return aarch64_insn_encoding_class[(insn >> 25) & 0xf]; | ||
48 | } | ||
49 | |||
50 | /* NOP is an alias of HINT */ | ||
51 | bool __kprobes aarch64_insn_is_nop(u32 insn) | ||
52 | { | ||
53 | if (!aarch64_insn_is_hint(insn)) | ||
54 | return false; | ||
55 | |||
56 | switch (insn & 0xFE0) { | ||
57 | case AARCH64_INSN_HINT_YIELD: | ||
58 | case AARCH64_INSN_HINT_WFE: | ||
59 | case AARCH64_INSN_HINT_WFI: | ||
60 | case AARCH64_INSN_HINT_SEV: | ||
61 | case AARCH64_INSN_HINT_SEVL: | ||
62 | return false; | ||
63 | default: | ||
64 | return true; | ||
65 | } | ||
66 | } | ||
67 | |||
68 | /* | ||
69 | * In ARMv8-A, A64 instructions have a fixed length of 32 bits and are always | ||
70 | * little-endian. | ||
71 | */ | ||
72 | int __kprobes aarch64_insn_read(void *addr, u32 *insnp) | ||
73 | { | ||
74 | int ret; | ||
75 | u32 val; | ||
76 | |||
77 | ret = probe_kernel_read(&val, addr, AARCH64_INSN_SIZE); | ||
78 | if (!ret) | ||
79 | *insnp = le32_to_cpu(val); | ||
80 | |||
81 | return ret; | ||
82 | } | ||
83 | |||
84 | int __kprobes aarch64_insn_write(void *addr, u32 insn) | ||
85 | { | ||
86 | insn = cpu_to_le32(insn); | ||
87 | return probe_kernel_write(addr, &insn, AARCH64_INSN_SIZE); | ||
88 | } | ||
89 | |||
90 | static bool __kprobes __aarch64_insn_hotpatch_safe(u32 insn) | ||
91 | { | ||
92 | if (aarch64_get_insn_class(insn) != AARCH64_INSN_CLS_BR_SYS) | ||
93 | return false; | ||
94 | |||
95 | return aarch64_insn_is_b(insn) || | ||
96 | aarch64_insn_is_bl(insn) || | ||
97 | aarch64_insn_is_svc(insn) || | ||
98 | aarch64_insn_is_hvc(insn) || | ||
99 | aarch64_insn_is_smc(insn) || | ||
100 | aarch64_insn_is_brk(insn) || | ||
101 | aarch64_insn_is_nop(insn); | ||
102 | } | ||
103 | |||
104 | /* | ||
105 | * ARM Architecture Reference Manual for ARMv8 Profile-A, Issue A.a | ||
106 | * Section B2.6.5 "Concurrent modification and execution of instructions": | ||
107 | * Concurrent modification and execution of instructions can lead to the | ||
108 | * resulting instruction performing any behavior that can be achieved by | ||
109 | * executing any sequence of instructions that can be executed from the | ||
110 | * same Exception level, except where the instruction before modification | ||
111 | * and the instruction after modification is a B, BL, NOP, BKPT, SVC, HVC, | ||
112 | * or SMC instruction. | ||
113 | */ | ||
114 | bool __kprobes aarch64_insn_hotpatch_safe(u32 old_insn, u32 new_insn) | ||
115 | { | ||
116 | return __aarch64_insn_hotpatch_safe(old_insn) && | ||
117 | __aarch64_insn_hotpatch_safe(new_insn); | ||
118 | } | ||
119 | |||
120 | int __kprobes aarch64_insn_patch_text_nosync(void *addr, u32 insn) | ||
121 | { | ||
122 | u32 *tp = addr; | ||
123 | int ret; | ||
124 | |||
125 | /* A64 instructions must be word aligned */ | ||
126 | if ((uintptr_t)tp & 0x3) | ||
127 | return -EINVAL; | ||
128 | |||
129 | ret = aarch64_insn_write(tp, insn); | ||
130 | if (ret == 0) | ||
131 | flush_icache_range((uintptr_t)tp, | ||
132 | (uintptr_t)tp + AARCH64_INSN_SIZE); | ||
133 | |||
134 | return ret; | ||
135 | } | ||
136 | |||
137 | struct aarch64_insn_patch { | ||
138 | void **text_addrs; | ||
139 | u32 *new_insns; | ||
140 | int insn_cnt; | ||
141 | atomic_t cpu_count; | ||
142 | }; | ||
143 | |||
144 | static int __kprobes aarch64_insn_patch_text_cb(void *arg) | ||
145 | { | ||
146 | int i, ret = 0; | ||
147 | struct aarch64_insn_patch *pp = arg; | ||
148 | |||
149 | /* The first CPU becomes master */ | ||
150 | if (atomic_inc_return(&pp->cpu_count) == 1) { | ||
151 | for (i = 0; ret == 0 && i < pp->insn_cnt; i++) | ||
152 | ret = aarch64_insn_patch_text_nosync(pp->text_addrs[i], | ||
153 | pp->new_insns[i]); | ||
154 | /* | ||
155 | * aarch64_insn_patch_text_nosync() calls flush_icache_range(), | ||
156 | * which ends with "dsb; isb" pair guaranteeing global | ||
157 | * visibility. | ||
158 | */ | ||
159 | atomic_set(&pp->cpu_count, -1); | ||
160 | } else { | ||
161 | while (atomic_read(&pp->cpu_count) != -1) | ||
162 | cpu_relax(); | ||
163 | isb(); | ||
164 | } | ||
165 | |||
166 | return ret; | ||
167 | } | ||
168 | |||
169 | int __kprobes aarch64_insn_patch_text_sync(void *addrs[], u32 insns[], int cnt) | ||
170 | { | ||
171 | struct aarch64_insn_patch patch = { | ||
172 | .text_addrs = addrs, | ||
173 | .new_insns = insns, | ||
174 | .insn_cnt = cnt, | ||
175 | .cpu_count = ATOMIC_INIT(0), | ||
176 | }; | ||
177 | |||
178 | if (cnt <= 0) | ||
179 | return -EINVAL; | ||
180 | |||
181 | return stop_machine(aarch64_insn_patch_text_cb, &patch, | ||
182 | cpu_online_mask); | ||
183 | } | ||
184 | |||
185 | int __kprobes aarch64_insn_patch_text(void *addrs[], u32 insns[], int cnt) | ||
186 | { | ||
187 | int ret; | ||
188 | u32 insn; | ||
189 | |||
190 | /* Unsafe to patch multiple instructions without synchronizaiton */ | ||
191 | if (cnt == 1) { | ||
192 | ret = aarch64_insn_read(addrs[0], &insn); | ||
193 | if (ret) | ||
194 | return ret; | ||
195 | |||
196 | if (aarch64_insn_hotpatch_safe(insn, insns[0])) { | ||
197 | /* | ||
198 | * ARMv8 architecture doesn't guarantee all CPUs see | ||
199 | * the new instruction after returning from function | ||
200 | * aarch64_insn_patch_text_nosync(). So send IPIs to | ||
201 | * all other CPUs to achieve instruction | ||
202 | * synchronization. | ||
203 | */ | ||
204 | ret = aarch64_insn_patch_text_nosync(addrs[0], insns[0]); | ||
205 | kick_all_cpus_sync(); | ||
206 | return ret; | ||
207 | } | ||
208 | } | ||
209 | |||
210 | return aarch64_insn_patch_text_sync(addrs, insns, cnt); | ||
211 | } | ||
212 | |||
213 | u32 __kprobes aarch64_insn_encode_immediate(enum aarch64_insn_imm_type type, | ||
214 | u32 insn, u64 imm) | ||
215 | { | ||
216 | u32 immlo, immhi, lomask, himask, mask; | ||
217 | int shift; | ||
218 | |||
219 | switch (type) { | ||
220 | case AARCH64_INSN_IMM_ADR: | ||
221 | lomask = 0x3; | ||
222 | himask = 0x7ffff; | ||
223 | immlo = imm & lomask; | ||
224 | imm >>= 2; | ||
225 | immhi = imm & himask; | ||
226 | imm = (immlo << 24) | (immhi); | ||
227 | mask = (lomask << 24) | (himask); | ||
228 | shift = 5; | ||
229 | break; | ||
230 | case AARCH64_INSN_IMM_26: | ||
231 | mask = BIT(26) - 1; | ||
232 | shift = 0; | ||
233 | break; | ||
234 | case AARCH64_INSN_IMM_19: | ||
235 | mask = BIT(19) - 1; | ||
236 | shift = 5; | ||
237 | break; | ||
238 | case AARCH64_INSN_IMM_16: | ||
239 | mask = BIT(16) - 1; | ||
240 | shift = 5; | ||
241 | break; | ||
242 | case AARCH64_INSN_IMM_14: | ||
243 | mask = BIT(14) - 1; | ||
244 | shift = 5; | ||
245 | break; | ||
246 | case AARCH64_INSN_IMM_12: | ||
247 | mask = BIT(12) - 1; | ||
248 | shift = 10; | ||
249 | break; | ||
250 | case AARCH64_INSN_IMM_9: | ||
251 | mask = BIT(9) - 1; | ||
252 | shift = 12; | ||
253 | break; | ||
254 | default: | ||
255 | pr_err("aarch64_insn_encode_immediate: unknown immediate encoding %d\n", | ||
256 | type); | ||
257 | return 0; | ||
258 | } | ||
259 | |||
260 | /* Update the immediate field. */ | ||
261 | insn &= ~(mask << shift); | ||
262 | insn |= (imm & mask) << shift; | ||
263 | |||
264 | return insn; | ||
265 | } | ||
266 | |||
267 | u32 __kprobes aarch64_insn_gen_branch_imm(unsigned long pc, unsigned long addr, | ||
268 | enum aarch64_insn_branch_type type) | ||
269 | { | ||
270 | u32 insn; | ||
271 | long offset; | ||
272 | |||
273 | /* | ||
274 | * PC: A 64-bit Program Counter holding the address of the current | ||
275 | * instruction. A64 instructions must be word-aligned. | ||
276 | */ | ||
277 | BUG_ON((pc & 0x3) || (addr & 0x3)); | ||
278 | |||
279 | /* | ||
280 | * B/BL support [-128M, 128M) offset | ||
281 | * ARM64 virtual address arrangement guarantees all kernel and module | ||
282 | * texts are within +/-128M. | ||
283 | */ | ||
284 | offset = ((long)addr - (long)pc); | ||
285 | BUG_ON(offset < -SZ_128M || offset >= SZ_128M); | ||
286 | |||
287 | if (type == AARCH64_INSN_BRANCH_LINK) | ||
288 | insn = aarch64_insn_get_bl_value(); | ||
289 | else | ||
290 | insn = aarch64_insn_get_b_value(); | ||
291 | |||
292 | return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_26, insn, | ||
293 | offset >> 2); | ||
294 | } | ||
295 | |||
296 | u32 __kprobes aarch64_insn_gen_hint(enum aarch64_insn_hint_op op) | ||
297 | { | ||
298 | return aarch64_insn_get_hint_value() | op; | ||
299 | } | ||
300 | |||
301 | u32 __kprobes aarch64_insn_gen_nop(void) | ||
302 | { | ||
303 | return aarch64_insn_gen_hint(AARCH64_INSN_HINT_NOP); | ||
304 | } | ||
diff --git a/arch/arm64/kernel/jump_label.c b/arch/arm64/kernel/jump_label.c new file mode 100644 index 000000000000..263a166291fb --- /dev/null +++ b/arch/arm64/kernel/jump_label.c | |||
@@ -0,0 +1,58 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2013 Huawei Ltd. | ||
3 | * Author: Jiang Liu <liuj97@gmail.com> | ||
4 | * | ||
5 | * Based on arch/arm/kernel/jump_label.c | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
18 | */ | ||
19 | #include <linux/kernel.h> | ||
20 | #include <linux/jump_label.h> | ||
21 | #include <asm/insn.h> | ||
22 | |||
23 | #ifdef HAVE_JUMP_LABEL | ||
24 | |||
25 | static void __arch_jump_label_transform(struct jump_entry *entry, | ||
26 | enum jump_label_type type, | ||
27 | bool is_static) | ||
28 | { | ||
29 | void *addr = (void *)entry->code; | ||
30 | u32 insn; | ||
31 | |||
32 | if (type == JUMP_LABEL_ENABLE) { | ||
33 | insn = aarch64_insn_gen_branch_imm(entry->code, | ||
34 | entry->target, | ||
35 | AARCH64_INSN_BRANCH_NOLINK); | ||
36 | } else { | ||
37 | insn = aarch64_insn_gen_nop(); | ||
38 | } | ||
39 | |||
40 | if (is_static) | ||
41 | aarch64_insn_patch_text_nosync(addr, insn); | ||
42 | else | ||
43 | aarch64_insn_patch_text(&addr, &insn, 1); | ||
44 | } | ||
45 | |||
46 | void arch_jump_label_transform(struct jump_entry *entry, | ||
47 | enum jump_label_type type) | ||
48 | { | ||
49 | __arch_jump_label_transform(entry, type, false); | ||
50 | } | ||
51 | |||
52 | void arch_jump_label_transform_static(struct jump_entry *entry, | ||
53 | enum jump_label_type type) | ||
54 | { | ||
55 | __arch_jump_label_transform(entry, type, true); | ||
56 | } | ||
57 | |||
58 | #endif /* HAVE_JUMP_LABEL */ | ||
diff --git a/arch/arm64/kernel/module.c b/arch/arm64/kernel/module.c index e2ad0d87721f..1eb1cc955139 100644 --- a/arch/arm64/kernel/module.c +++ b/arch/arm64/kernel/module.c | |||
@@ -25,6 +25,10 @@ | |||
25 | #include <linux/mm.h> | 25 | #include <linux/mm.h> |
26 | #include <linux/moduleloader.h> | 26 | #include <linux/moduleloader.h> |
27 | #include <linux/vmalloc.h> | 27 | #include <linux/vmalloc.h> |
28 | #include <asm/insn.h> | ||
29 | |||
30 | #define AARCH64_INSN_IMM_MOVNZ AARCH64_INSN_IMM_MAX | ||
31 | #define AARCH64_INSN_IMM_MOVK AARCH64_INSN_IMM_16 | ||
28 | 32 | ||
29 | void *module_alloc(unsigned long size) | 33 | void *module_alloc(unsigned long size) |
30 | { | 34 | { |
@@ -94,28 +98,18 @@ static int reloc_data(enum aarch64_reloc_op op, void *place, u64 val, int len) | |||
94 | return 0; | 98 | return 0; |
95 | } | 99 | } |
96 | 100 | ||
97 | enum aarch64_imm_type { | 101 | static int reloc_insn_movw(enum aarch64_reloc_op op, void *place, u64 val, |
98 | INSN_IMM_MOVNZ, | 102 | int lsb, enum aarch64_insn_imm_type imm_type) |
99 | INSN_IMM_MOVK, | ||
100 | INSN_IMM_ADR, | ||
101 | INSN_IMM_26, | ||
102 | INSN_IMM_19, | ||
103 | INSN_IMM_16, | ||
104 | INSN_IMM_14, | ||
105 | INSN_IMM_12, | ||
106 | INSN_IMM_9, | ||
107 | }; | ||
108 | |||
109 | static u32 encode_insn_immediate(enum aarch64_imm_type type, u32 insn, u64 imm) | ||
110 | { | 103 | { |
111 | u32 immlo, immhi, lomask, himask, mask; | 104 | u64 imm, limit = 0; |
112 | int shift; | 105 | s64 sval; |
106 | u32 insn = le32_to_cpu(*(u32 *)place); | ||
113 | 107 | ||
114 | /* The instruction stream is always little endian. */ | 108 | sval = do_reloc(op, place, val); |
115 | insn = le32_to_cpu(insn); | 109 | sval >>= lsb; |
110 | imm = sval & 0xffff; | ||
116 | 111 | ||
117 | switch (type) { | 112 | if (imm_type == AARCH64_INSN_IMM_MOVNZ) { |
118 | case INSN_IMM_MOVNZ: | ||
119 | /* | 113 | /* |
120 | * For signed MOVW relocations, we have to manipulate the | 114 | * For signed MOVW relocations, we have to manipulate the |
121 | * instruction encoding depending on whether or not the | 115 | * instruction encoding depending on whether or not the |
@@ -134,70 +128,12 @@ static u32 encode_insn_immediate(enum aarch64_imm_type type, u32 insn, u64 imm) | |||
134 | */ | 128 | */ |
135 | imm = ~imm; | 129 | imm = ~imm; |
136 | } | 130 | } |
137 | case INSN_IMM_MOVK: | 131 | imm_type = AARCH64_INSN_IMM_MOVK; |
138 | mask = BIT(16) - 1; | ||
139 | shift = 5; | ||
140 | break; | ||
141 | case INSN_IMM_ADR: | ||
142 | lomask = 0x3; | ||
143 | himask = 0x7ffff; | ||
144 | immlo = imm & lomask; | ||
145 | imm >>= 2; | ||
146 | immhi = imm & himask; | ||
147 | imm = (immlo << 24) | (immhi); | ||
148 | mask = (lomask << 24) | (himask); | ||
149 | shift = 5; | ||
150 | break; | ||
151 | case INSN_IMM_26: | ||
152 | mask = BIT(26) - 1; | ||
153 | shift = 0; | ||
154 | break; | ||
155 | case INSN_IMM_19: | ||
156 | mask = BIT(19) - 1; | ||
157 | shift = 5; | ||
158 | break; | ||
159 | case INSN_IMM_16: | ||
160 | mask = BIT(16) - 1; | ||
161 | shift = 5; | ||
162 | break; | ||
163 | case INSN_IMM_14: | ||
164 | mask = BIT(14) - 1; | ||
165 | shift = 5; | ||
166 | break; | ||
167 | case INSN_IMM_12: | ||
168 | mask = BIT(12) - 1; | ||
169 | shift = 10; | ||
170 | break; | ||
171 | case INSN_IMM_9: | ||
172 | mask = BIT(9) - 1; | ||
173 | shift = 12; | ||
174 | break; | ||
175 | default: | ||
176 | pr_err("encode_insn_immediate: unknown immediate encoding %d\n", | ||
177 | type); | ||
178 | return 0; | ||
179 | } | 132 | } |
180 | 133 | ||
181 | /* Update the immediate field. */ | ||
182 | insn &= ~(mask << shift); | ||
183 | insn |= (imm & mask) << shift; | ||
184 | |||
185 | return cpu_to_le32(insn); | ||
186 | } | ||
187 | |||
188 | static int reloc_insn_movw(enum aarch64_reloc_op op, void *place, u64 val, | ||
189 | int lsb, enum aarch64_imm_type imm_type) | ||
190 | { | ||
191 | u64 imm, limit = 0; | ||
192 | s64 sval; | ||
193 | u32 insn = *(u32 *)place; | ||
194 | |||
195 | sval = do_reloc(op, place, val); | ||
196 | sval >>= lsb; | ||
197 | imm = sval & 0xffff; | ||
198 | |||
199 | /* Update the instruction with the new encoding. */ | 134 | /* Update the instruction with the new encoding. */ |
200 | *(u32 *)place = encode_insn_immediate(imm_type, insn, imm); | 135 | insn = aarch64_insn_encode_immediate(imm_type, insn, imm); |
136 | *(u32 *)place = cpu_to_le32(insn); | ||
201 | 137 | ||
202 | /* Shift out the immediate field. */ | 138 | /* Shift out the immediate field. */ |
203 | sval >>= 16; | 139 | sval >>= 16; |
@@ -206,9 +142,9 @@ static int reloc_insn_movw(enum aarch64_reloc_op op, void *place, u64 val, | |||
206 | * For unsigned immediates, the overflow check is straightforward. | 142 | * For unsigned immediates, the overflow check is straightforward. |
207 | * For signed immediates, the sign bit is actually the bit past the | 143 | * For signed immediates, the sign bit is actually the bit past the |
208 | * most significant bit of the field. | 144 | * most significant bit of the field. |
209 | * The INSN_IMM_16 immediate type is unsigned. | 145 | * The AARCH64_INSN_IMM_16 immediate type is unsigned. |
210 | */ | 146 | */ |
211 | if (imm_type != INSN_IMM_16) { | 147 | if (imm_type != AARCH64_INSN_IMM_16) { |
212 | sval++; | 148 | sval++; |
213 | limit++; | 149 | limit++; |
214 | } | 150 | } |
@@ -221,11 +157,11 @@ static int reloc_insn_movw(enum aarch64_reloc_op op, void *place, u64 val, | |||
221 | } | 157 | } |
222 | 158 | ||
223 | static int reloc_insn_imm(enum aarch64_reloc_op op, void *place, u64 val, | 159 | static int reloc_insn_imm(enum aarch64_reloc_op op, void *place, u64 val, |
224 | int lsb, int len, enum aarch64_imm_type imm_type) | 160 | int lsb, int len, enum aarch64_insn_imm_type imm_type) |
225 | { | 161 | { |
226 | u64 imm, imm_mask; | 162 | u64 imm, imm_mask; |
227 | s64 sval; | 163 | s64 sval; |
228 | u32 insn = *(u32 *)place; | 164 | u32 insn = le32_to_cpu(*(u32 *)place); |
229 | 165 | ||
230 | /* Calculate the relocation value. */ | 166 | /* Calculate the relocation value. */ |
231 | sval = do_reloc(op, place, val); | 167 | sval = do_reloc(op, place, val); |
@@ -236,7 +172,8 @@ static int reloc_insn_imm(enum aarch64_reloc_op op, void *place, u64 val, | |||
236 | imm = sval & imm_mask; | 172 | imm = sval & imm_mask; |
237 | 173 | ||
238 | /* Update the instruction's immediate field. */ | 174 | /* Update the instruction's immediate field. */ |
239 | *(u32 *)place = encode_insn_immediate(imm_type, insn, imm); | 175 | insn = aarch64_insn_encode_immediate(imm_type, insn, imm); |
176 | *(u32 *)place = cpu_to_le32(insn); | ||
240 | 177 | ||
241 | /* | 178 | /* |
242 | * Extract the upper value bits (including the sign bit) and | 179 | * Extract the upper value bits (including the sign bit) and |
@@ -318,125 +255,125 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, | |||
318 | overflow_check = false; | 255 | overflow_check = false; |
319 | case R_AARCH64_MOVW_UABS_G0: | 256 | case R_AARCH64_MOVW_UABS_G0: |
320 | ovf = reloc_insn_movw(RELOC_OP_ABS, loc, val, 0, | 257 | ovf = reloc_insn_movw(RELOC_OP_ABS, loc, val, 0, |
321 | INSN_IMM_16); | 258 | AARCH64_INSN_IMM_16); |
322 | break; | 259 | break; |
323 | case R_AARCH64_MOVW_UABS_G1_NC: | 260 | case R_AARCH64_MOVW_UABS_G1_NC: |
324 | overflow_check = false; | 261 | overflow_check = false; |
325 | case R_AARCH64_MOVW_UABS_G1: | 262 | case R_AARCH64_MOVW_UABS_G1: |
326 | ovf = reloc_insn_movw(RELOC_OP_ABS, loc, val, 16, | 263 | ovf = reloc_insn_movw(RELOC_OP_ABS, loc, val, 16, |
327 | INSN_IMM_16); | 264 | AARCH64_INSN_IMM_16); |
328 | break; | 265 | break; |
329 | case R_AARCH64_MOVW_UABS_G2_NC: | 266 | case R_AARCH64_MOVW_UABS_G2_NC: |
330 | overflow_check = false; | 267 | overflow_check = false; |
331 | case R_AARCH64_MOVW_UABS_G2: | 268 | case R_AARCH64_MOVW_UABS_G2: |
332 | ovf = reloc_insn_movw(RELOC_OP_ABS, loc, val, 32, | 269 | ovf = reloc_insn_movw(RELOC_OP_ABS, loc, val, 32, |
333 | INSN_IMM_16); | 270 | AARCH64_INSN_IMM_16); |
334 | break; | 271 | break; |
335 | case R_AARCH64_MOVW_UABS_G3: | 272 | case R_AARCH64_MOVW_UABS_G3: |
336 | /* We're using the top bits so we can't overflow. */ | 273 | /* We're using the top bits so we can't overflow. */ |
337 | overflow_check = false; | 274 | overflow_check = false; |
338 | ovf = reloc_insn_movw(RELOC_OP_ABS, loc, val, 48, | 275 | ovf = reloc_insn_movw(RELOC_OP_ABS, loc, val, 48, |
339 | INSN_IMM_16); | 276 | AARCH64_INSN_IMM_16); |
340 | break; | 277 | break; |
341 | case R_AARCH64_MOVW_SABS_G0: | 278 | case R_AARCH64_MOVW_SABS_G0: |
342 | ovf = reloc_insn_movw(RELOC_OP_ABS, loc, val, 0, | 279 | ovf = reloc_insn_movw(RELOC_OP_ABS, loc, val, 0, |
343 | INSN_IMM_MOVNZ); | 280 | AARCH64_INSN_IMM_MOVNZ); |
344 | break; | 281 | break; |
345 | case R_AARCH64_MOVW_SABS_G1: | 282 | case R_AARCH64_MOVW_SABS_G1: |
346 | ovf = reloc_insn_movw(RELOC_OP_ABS, loc, val, 16, | 283 | ovf = reloc_insn_movw(RELOC_OP_ABS, loc, val, 16, |
347 | INSN_IMM_MOVNZ); | 284 | AARCH64_INSN_IMM_MOVNZ); |
348 | break; | 285 | break; |
349 | case R_AARCH64_MOVW_SABS_G2: | 286 | case R_AARCH64_MOVW_SABS_G2: |
350 | ovf = reloc_insn_movw(RELOC_OP_ABS, loc, val, 32, | 287 | ovf = reloc_insn_movw(RELOC_OP_ABS, loc, val, 32, |
351 | INSN_IMM_MOVNZ); | 288 | AARCH64_INSN_IMM_MOVNZ); |
352 | break; | 289 | break; |
353 | case R_AARCH64_MOVW_PREL_G0_NC: | 290 | case R_AARCH64_MOVW_PREL_G0_NC: |
354 | overflow_check = false; | 291 | overflow_check = false; |
355 | ovf = reloc_insn_movw(RELOC_OP_PREL, loc, val, 0, | 292 | ovf = reloc_insn_movw(RELOC_OP_PREL, loc, val, 0, |
356 | INSN_IMM_MOVK); | 293 | AARCH64_INSN_IMM_MOVK); |
357 | break; | 294 | break; |
358 | case R_AARCH64_MOVW_PREL_G0: | 295 | case R_AARCH64_MOVW_PREL_G0: |
359 | ovf = reloc_insn_movw(RELOC_OP_PREL, loc, val, 0, | 296 | ovf = reloc_insn_movw(RELOC_OP_PREL, loc, val, 0, |
360 | INSN_IMM_MOVNZ); | 297 | AARCH64_INSN_IMM_MOVNZ); |
361 | break; | 298 | break; |
362 | case R_AARCH64_MOVW_PREL_G1_NC: | 299 | case R_AARCH64_MOVW_PREL_G1_NC: |
363 | overflow_check = false; | 300 | overflow_check = false; |
364 | ovf = reloc_insn_movw(RELOC_OP_PREL, loc, val, 16, | 301 | ovf = reloc_insn_movw(RELOC_OP_PREL, loc, val, 16, |
365 | INSN_IMM_MOVK); | 302 | AARCH64_INSN_IMM_MOVK); |
366 | break; | 303 | break; |
367 | case R_AARCH64_MOVW_PREL_G1: | 304 | case R_AARCH64_MOVW_PREL_G1: |
368 | ovf = reloc_insn_movw(RELOC_OP_PREL, loc, val, 16, | 305 | ovf = reloc_insn_movw(RELOC_OP_PREL, loc, val, 16, |
369 | INSN_IMM_MOVNZ); | 306 | AARCH64_INSN_IMM_MOVNZ); |
370 | break; | 307 | break; |
371 | case R_AARCH64_MOVW_PREL_G2_NC: | 308 | case R_AARCH64_MOVW_PREL_G2_NC: |
372 | overflow_check = false; | 309 | overflow_check = false; |
373 | ovf = reloc_insn_movw(RELOC_OP_PREL, loc, val, 32, | 310 | ovf = reloc_insn_movw(RELOC_OP_PREL, loc, val, 32, |
374 | INSN_IMM_MOVK); | 311 | AARCH64_INSN_IMM_MOVK); |
375 | break; | 312 | break; |
376 | case R_AARCH64_MOVW_PREL_G2: | 313 | case R_AARCH64_MOVW_PREL_G2: |
377 | ovf = reloc_insn_movw(RELOC_OP_PREL, loc, val, 32, | 314 | ovf = reloc_insn_movw(RELOC_OP_PREL, loc, val, 32, |
378 | INSN_IMM_MOVNZ); | 315 | AARCH64_INSN_IMM_MOVNZ); |
379 | break; | 316 | break; |
380 | case R_AARCH64_MOVW_PREL_G3: | 317 | case R_AARCH64_MOVW_PREL_G3: |
381 | /* We're using the top bits so we can't overflow. */ | 318 | /* We're using the top bits so we can't overflow. */ |
382 | overflow_check = false; | 319 | overflow_check = false; |
383 | ovf = reloc_insn_movw(RELOC_OP_PREL, loc, val, 48, | 320 | ovf = reloc_insn_movw(RELOC_OP_PREL, loc, val, 48, |
384 | INSN_IMM_MOVNZ); | 321 | AARCH64_INSN_IMM_MOVNZ); |
385 | break; | 322 | break; |
386 | 323 | ||
387 | /* Immediate instruction relocations. */ | 324 | /* Immediate instruction relocations. */ |
388 | case R_AARCH64_LD_PREL_LO19: | 325 | case R_AARCH64_LD_PREL_LO19: |
389 | ovf = reloc_insn_imm(RELOC_OP_PREL, loc, val, 2, 19, | 326 | ovf = reloc_insn_imm(RELOC_OP_PREL, loc, val, 2, 19, |
390 | INSN_IMM_19); | 327 | AARCH64_INSN_IMM_19); |
391 | break; | 328 | break; |
392 | case R_AARCH64_ADR_PREL_LO21: | 329 | case R_AARCH64_ADR_PREL_LO21: |
393 | ovf = reloc_insn_imm(RELOC_OP_PREL, loc, val, 0, 21, | 330 | ovf = reloc_insn_imm(RELOC_OP_PREL, loc, val, 0, 21, |
394 | INSN_IMM_ADR); | 331 | AARCH64_INSN_IMM_ADR); |
395 | break; | 332 | break; |
396 | case R_AARCH64_ADR_PREL_PG_HI21_NC: | 333 | case R_AARCH64_ADR_PREL_PG_HI21_NC: |
397 | overflow_check = false; | 334 | overflow_check = false; |
398 | case R_AARCH64_ADR_PREL_PG_HI21: | 335 | case R_AARCH64_ADR_PREL_PG_HI21: |
399 | ovf = reloc_insn_imm(RELOC_OP_PAGE, loc, val, 12, 21, | 336 | ovf = reloc_insn_imm(RELOC_OP_PAGE, loc, val, 12, 21, |
400 | INSN_IMM_ADR); | 337 | AARCH64_INSN_IMM_ADR); |
401 | break; | 338 | break; |
402 | case R_AARCH64_ADD_ABS_LO12_NC: | 339 | case R_AARCH64_ADD_ABS_LO12_NC: |
403 | case R_AARCH64_LDST8_ABS_LO12_NC: | 340 | case R_AARCH64_LDST8_ABS_LO12_NC: |
404 | overflow_check = false; | 341 | overflow_check = false; |
405 | ovf = reloc_insn_imm(RELOC_OP_ABS, loc, val, 0, 12, | 342 | ovf = reloc_insn_imm(RELOC_OP_ABS, loc, val, 0, 12, |
406 | INSN_IMM_12); | 343 | AARCH64_INSN_IMM_12); |
407 | break; | 344 | break; |
408 | case R_AARCH64_LDST16_ABS_LO12_NC: | 345 | case R_AARCH64_LDST16_ABS_LO12_NC: |
409 | overflow_check = false; | 346 | overflow_check = false; |
410 | ovf = reloc_insn_imm(RELOC_OP_ABS, loc, val, 1, 11, | 347 | ovf = reloc_insn_imm(RELOC_OP_ABS, loc, val, 1, 11, |
411 | INSN_IMM_12); | 348 | AARCH64_INSN_IMM_12); |
412 | break; | 349 | break; |
413 | case R_AARCH64_LDST32_ABS_LO12_NC: | 350 | case R_AARCH64_LDST32_ABS_LO12_NC: |
414 | overflow_check = false; | 351 | overflow_check = false; |
415 | ovf = reloc_insn_imm(RELOC_OP_ABS, loc, val, 2, 10, | 352 | ovf = reloc_insn_imm(RELOC_OP_ABS, loc, val, 2, 10, |
416 | INSN_IMM_12); | 353 | AARCH64_INSN_IMM_12); |
417 | break; | 354 | break; |
418 | case R_AARCH64_LDST64_ABS_LO12_NC: | 355 | case R_AARCH64_LDST64_ABS_LO12_NC: |
419 | overflow_check = false; | 356 | overflow_check = false; |
420 | ovf = reloc_insn_imm(RELOC_OP_ABS, loc, val, 3, 9, | 357 | ovf = reloc_insn_imm(RELOC_OP_ABS, loc, val, 3, 9, |
421 | INSN_IMM_12); | 358 | AARCH64_INSN_IMM_12); |
422 | break; | 359 | break; |
423 | case R_AARCH64_LDST128_ABS_LO12_NC: | 360 | case R_AARCH64_LDST128_ABS_LO12_NC: |
424 | overflow_check = false; | 361 | overflow_check = false; |
425 | ovf = reloc_insn_imm(RELOC_OP_ABS, loc, val, 4, 8, | 362 | ovf = reloc_insn_imm(RELOC_OP_ABS, loc, val, 4, 8, |
426 | INSN_IMM_12); | 363 | AARCH64_INSN_IMM_12); |
427 | break; | 364 | break; |
428 | case R_AARCH64_TSTBR14: | 365 | case R_AARCH64_TSTBR14: |
429 | ovf = reloc_insn_imm(RELOC_OP_PREL, loc, val, 2, 14, | 366 | ovf = reloc_insn_imm(RELOC_OP_PREL, loc, val, 2, 14, |
430 | INSN_IMM_14); | 367 | AARCH64_INSN_IMM_14); |
431 | break; | 368 | break; |
432 | case R_AARCH64_CONDBR19: | 369 | case R_AARCH64_CONDBR19: |
433 | ovf = reloc_insn_imm(RELOC_OP_PREL, loc, val, 2, 19, | 370 | ovf = reloc_insn_imm(RELOC_OP_PREL, loc, val, 2, 19, |
434 | INSN_IMM_19); | 371 | AARCH64_INSN_IMM_19); |
435 | break; | 372 | break; |
436 | case R_AARCH64_JUMP26: | 373 | case R_AARCH64_JUMP26: |
437 | case R_AARCH64_CALL26: | 374 | case R_AARCH64_CALL26: |
438 | ovf = reloc_insn_imm(RELOC_OP_PREL, loc, val, 2, 26, | 375 | ovf = reloc_insn_imm(RELOC_OP_PREL, loc, val, 2, 26, |
439 | INSN_IMM_26); | 376 | AARCH64_INSN_IMM_26); |
440 | break; | 377 | break; |
441 | 378 | ||
442 | default: | 379 | default: |
diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c index 0e63c98d224c..5b1cd792274a 100644 --- a/arch/arm64/kernel/perf_event.c +++ b/arch/arm64/kernel/perf_event.c | |||
@@ -22,6 +22,7 @@ | |||
22 | 22 | ||
23 | #include <linux/bitmap.h> | 23 | #include <linux/bitmap.h> |
24 | #include <linux/interrupt.h> | 24 | #include <linux/interrupt.h> |
25 | #include <linux/irq.h> | ||
25 | #include <linux/kernel.h> | 26 | #include <linux/kernel.h> |
26 | #include <linux/export.h> | 27 | #include <linux/export.h> |
27 | #include <linux/perf_event.h> | 28 | #include <linux/perf_event.h> |
@@ -363,26 +364,53 @@ validate_group(struct perf_event *event) | |||
363 | } | 364 | } |
364 | 365 | ||
365 | static void | 366 | static void |
367 | armpmu_disable_percpu_irq(void *data) | ||
368 | { | ||
369 | unsigned int irq = *(unsigned int *)data; | ||
370 | disable_percpu_irq(irq); | ||
371 | } | ||
372 | |||
373 | static void | ||
366 | armpmu_release_hardware(struct arm_pmu *armpmu) | 374 | armpmu_release_hardware(struct arm_pmu *armpmu) |
367 | { | 375 | { |
368 | int i, irq, irqs; | 376 | int irq; |
377 | unsigned int i, irqs; | ||
369 | struct platform_device *pmu_device = armpmu->plat_device; | 378 | struct platform_device *pmu_device = armpmu->plat_device; |
370 | 379 | ||
371 | irqs = min(pmu_device->num_resources, num_possible_cpus()); | 380 | irqs = min(pmu_device->num_resources, num_possible_cpus()); |
381 | if (!irqs) | ||
382 | return; | ||
372 | 383 | ||
373 | for (i = 0; i < irqs; ++i) { | 384 | irq = platform_get_irq(pmu_device, 0); |
374 | if (!cpumask_test_and_clear_cpu(i, &armpmu->active_irqs)) | 385 | if (irq <= 0) |
375 | continue; | 386 | return; |
376 | irq = platform_get_irq(pmu_device, i); | 387 | |
377 | if (irq >= 0) | 388 | if (irq_is_percpu(irq)) { |
378 | free_irq(irq, armpmu); | 389 | on_each_cpu(armpmu_disable_percpu_irq, &irq, 1); |
390 | free_percpu_irq(irq, &cpu_hw_events); | ||
391 | } else { | ||
392 | for (i = 0; i < irqs; ++i) { | ||
393 | if (!cpumask_test_and_clear_cpu(i, &armpmu->active_irqs)) | ||
394 | continue; | ||
395 | irq = platform_get_irq(pmu_device, i); | ||
396 | if (irq > 0) | ||
397 | free_irq(irq, armpmu); | ||
398 | } | ||
379 | } | 399 | } |
380 | } | 400 | } |
381 | 401 | ||
402 | static void | ||
403 | armpmu_enable_percpu_irq(void *data) | ||
404 | { | ||
405 | unsigned int irq = *(unsigned int *)data; | ||
406 | enable_percpu_irq(irq, IRQ_TYPE_NONE); | ||
407 | } | ||
408 | |||
382 | static int | 409 | static int |
383 | armpmu_reserve_hardware(struct arm_pmu *armpmu) | 410 | armpmu_reserve_hardware(struct arm_pmu *armpmu) |
384 | { | 411 | { |
385 | int i, err, irq, irqs; | 412 | int err, irq; |
413 | unsigned int i, irqs; | ||
386 | struct platform_device *pmu_device = armpmu->plat_device; | 414 | struct platform_device *pmu_device = armpmu->plat_device; |
387 | 415 | ||
388 | if (!pmu_device) { | 416 | if (!pmu_device) { |
@@ -391,39 +419,59 @@ armpmu_reserve_hardware(struct arm_pmu *armpmu) | |||
391 | } | 419 | } |
392 | 420 | ||
393 | irqs = min(pmu_device->num_resources, num_possible_cpus()); | 421 | irqs = min(pmu_device->num_resources, num_possible_cpus()); |
394 | if (irqs < 1) { | 422 | if (!irqs) { |
395 | pr_err("no irqs for PMUs defined\n"); | 423 | pr_err("no irqs for PMUs defined\n"); |
396 | return -ENODEV; | 424 | return -ENODEV; |
397 | } | 425 | } |
398 | 426 | ||
399 | for (i = 0; i < irqs; ++i) { | 427 | irq = platform_get_irq(pmu_device, 0); |
400 | err = 0; | 428 | if (irq <= 0) { |
401 | irq = platform_get_irq(pmu_device, i); | 429 | pr_err("failed to get valid irq for PMU device\n"); |
402 | if (irq < 0) | 430 | return -ENODEV; |
403 | continue; | 431 | } |
404 | 432 | ||
405 | /* | 433 | if (irq_is_percpu(irq)) { |
406 | * If we have a single PMU interrupt that we can't shift, | 434 | err = request_percpu_irq(irq, armpmu->handle_irq, |
407 | * assume that we're running on a uniprocessor machine and | 435 | "arm-pmu", &cpu_hw_events); |
408 | * continue. Otherwise, continue without this interrupt. | ||
409 | */ | ||
410 | if (irq_set_affinity(irq, cpumask_of(i)) && irqs > 1) { | ||
411 | pr_warning("unable to set irq affinity (irq=%d, cpu=%u)\n", | ||
412 | irq, i); | ||
413 | continue; | ||
414 | } | ||
415 | 436 | ||
416 | err = request_irq(irq, armpmu->handle_irq, | ||
417 | IRQF_NOBALANCING, | ||
418 | "arm-pmu", armpmu); | ||
419 | if (err) { | 437 | if (err) { |
420 | pr_err("unable to request IRQ%d for ARM PMU counters\n", | 438 | pr_err("unable to request percpu IRQ%d for ARM PMU counters\n", |
421 | irq); | 439 | irq); |
422 | armpmu_release_hardware(armpmu); | 440 | armpmu_release_hardware(armpmu); |
423 | return err; | 441 | return err; |
424 | } | 442 | } |
425 | 443 | ||
426 | cpumask_set_cpu(i, &armpmu->active_irqs); | 444 | on_each_cpu(armpmu_enable_percpu_irq, &irq, 1); |
445 | } else { | ||
446 | for (i = 0; i < irqs; ++i) { | ||
447 | err = 0; | ||
448 | irq = platform_get_irq(pmu_device, i); | ||
449 | if (irq <= 0) | ||
450 | continue; | ||
451 | |||
452 | /* | ||
453 | * If we have a single PMU interrupt that we can't shift, | ||
454 | * assume that we're running on a uniprocessor machine and | ||
455 | * continue. Otherwise, continue without this interrupt. | ||
456 | */ | ||
457 | if (irq_set_affinity(irq, cpumask_of(i)) && irqs > 1) { | ||
458 | pr_warning("unable to set irq affinity (irq=%d, cpu=%u)\n", | ||
459 | irq, i); | ||
460 | continue; | ||
461 | } | ||
462 | |||
463 | err = request_irq(irq, armpmu->handle_irq, | ||
464 | IRQF_NOBALANCING, | ||
465 | "arm-pmu", armpmu); | ||
466 | if (err) { | ||
467 | pr_err("unable to request IRQ%d for ARM PMU counters\n", | ||
468 | irq); | ||
469 | armpmu_release_hardware(armpmu); | ||
470 | return err; | ||
471 | } | ||
472 | |||
473 | cpumask_set_cpu(i, &armpmu->active_irqs); | ||
474 | } | ||
427 | } | 475 | } |
428 | 476 | ||
429 | return 0; | 477 | return 0; |
diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c index de17c89985db..248a15db37f2 100644 --- a/arch/arm64/kernel/process.c +++ b/arch/arm64/kernel/process.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/kallsyms.h> | 33 | #include <linux/kallsyms.h> |
34 | #include <linux/init.h> | 34 | #include <linux/init.h> |
35 | #include <linux/cpu.h> | 35 | #include <linux/cpu.h> |
36 | #include <linux/cpuidle.h> | ||
36 | #include <linux/elfcore.h> | 37 | #include <linux/elfcore.h> |
37 | #include <linux/pm.h> | 38 | #include <linux/pm.h> |
38 | #include <linux/tick.h> | 39 | #include <linux/tick.h> |
@@ -98,8 +99,10 @@ void arch_cpu_idle(void) | |||
98 | * This should do all the clock switching and wait for interrupt | 99 | * This should do all the clock switching and wait for interrupt |
99 | * tricks | 100 | * tricks |
100 | */ | 101 | */ |
101 | cpu_do_idle(); | 102 | if (cpuidle_idle_call()) { |
102 | local_irq_enable(); | 103 | cpu_do_idle(); |
104 | local_irq_enable(); | ||
105 | } | ||
103 | } | 106 | } |
104 | 107 | ||
105 | #ifdef CONFIG_HOTPLUG_CPU | 108 | #ifdef CONFIG_HOTPLUG_CPU |
@@ -308,6 +311,7 @@ struct task_struct *__switch_to(struct task_struct *prev, | |||
308 | unsigned long get_wchan(struct task_struct *p) | 311 | unsigned long get_wchan(struct task_struct *p) |
309 | { | 312 | { |
310 | struct stackframe frame; | 313 | struct stackframe frame; |
314 | unsigned long stack_page; | ||
311 | int count = 0; | 315 | int count = 0; |
312 | if (!p || p == current || p->state == TASK_RUNNING) | 316 | if (!p || p == current || p->state == TASK_RUNNING) |
313 | return 0; | 317 | return 0; |
@@ -315,9 +319,11 @@ unsigned long get_wchan(struct task_struct *p) | |||
315 | frame.fp = thread_saved_fp(p); | 319 | frame.fp = thread_saved_fp(p); |
316 | frame.sp = thread_saved_sp(p); | 320 | frame.sp = thread_saved_sp(p); |
317 | frame.pc = thread_saved_pc(p); | 321 | frame.pc = thread_saved_pc(p); |
322 | stack_page = (unsigned long)task_stack_page(p); | ||
318 | do { | 323 | do { |
319 | int ret = unwind_frame(&frame); | 324 | if (frame.sp < stack_page || |
320 | if (ret < 0) | 325 | frame.sp >= stack_page + THREAD_SIZE || |
326 | unwind_frame(&frame)) | ||
321 | return 0; | 327 | return 0; |
322 | if (!in_sched_functions(frame.pc)) | 328 | if (!in_sched_functions(frame.pc)) |
323 | return frame.pc; | 329 | return frame.pc; |
diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index fecdbf7de82e..6a8928bba03c 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c | |||
@@ -214,31 +214,29 @@ static int ptrace_hbp_fill_attr_ctrl(unsigned int note_type, | |||
214 | { | 214 | { |
215 | int err, len, type, disabled = !ctrl.enabled; | 215 | int err, len, type, disabled = !ctrl.enabled; |
216 | 216 | ||
217 | if (disabled) { | 217 | attr->disabled = disabled; |
218 | len = 0; | 218 | if (disabled) |
219 | type = HW_BREAKPOINT_EMPTY; | 219 | return 0; |
220 | } else { | 220 | |
221 | err = arch_bp_generic_fields(ctrl, &len, &type); | 221 | err = arch_bp_generic_fields(ctrl, &len, &type); |
222 | if (err) | 222 | if (err) |
223 | return err; | 223 | return err; |
224 | 224 | ||
225 | switch (note_type) { | 225 | switch (note_type) { |
226 | case NT_ARM_HW_BREAK: | 226 | case NT_ARM_HW_BREAK: |
227 | if ((type & HW_BREAKPOINT_X) != type) | 227 | if ((type & HW_BREAKPOINT_X) != type) |
228 | return -EINVAL; | ||
229 | break; | ||
230 | case NT_ARM_HW_WATCH: | ||
231 | if ((type & HW_BREAKPOINT_RW) != type) | ||
232 | return -EINVAL; | ||
233 | break; | ||
234 | default: | ||
235 | return -EINVAL; | 228 | return -EINVAL; |
236 | } | 229 | break; |
230 | case NT_ARM_HW_WATCH: | ||
231 | if ((type & HW_BREAKPOINT_RW) != type) | ||
232 | return -EINVAL; | ||
233 | break; | ||
234 | default: | ||
235 | return -EINVAL; | ||
237 | } | 236 | } |
238 | 237 | ||
239 | attr->bp_len = len; | 238 | attr->bp_len = len; |
240 | attr->bp_type = type; | 239 | attr->bp_type = type; |
241 | attr->disabled = disabled; | ||
242 | 240 | ||
243 | return 0; | 241 | return 0; |
244 | } | 242 | } |
@@ -636,28 +634,27 @@ static int compat_gpr_get(struct task_struct *target, | |||
636 | 634 | ||
637 | for (i = 0; i < num_regs; ++i) { | 635 | for (i = 0; i < num_regs; ++i) { |
638 | unsigned int idx = start + i; | 636 | unsigned int idx = start + i; |
639 | void *reg; | 637 | compat_ulong_t reg; |
640 | 638 | ||
641 | switch (idx) { | 639 | switch (idx) { |
642 | case 15: | 640 | case 15: |
643 | reg = (void *)&task_pt_regs(target)->pc; | 641 | reg = task_pt_regs(target)->pc; |
644 | break; | 642 | break; |
645 | case 16: | 643 | case 16: |
646 | reg = (void *)&task_pt_regs(target)->pstate; | 644 | reg = task_pt_regs(target)->pstate; |
647 | break; | 645 | break; |
648 | case 17: | 646 | case 17: |
649 | reg = (void *)&task_pt_regs(target)->orig_x0; | 647 | reg = task_pt_regs(target)->orig_x0; |
650 | break; | 648 | break; |
651 | default: | 649 | default: |
652 | reg = (void *)&task_pt_regs(target)->regs[idx]; | 650 | reg = task_pt_regs(target)->regs[idx]; |
653 | } | 651 | } |
654 | 652 | ||
655 | ret = copy_to_user(ubuf, reg, sizeof(compat_ulong_t)); | 653 | ret = copy_to_user(ubuf, ®, sizeof(reg)); |
656 | |||
657 | if (ret) | 654 | if (ret) |
658 | break; | 655 | break; |
659 | else | 656 | |
660 | ubuf += sizeof(compat_ulong_t); | 657 | ubuf += sizeof(reg); |
661 | } | 658 | } |
662 | 659 | ||
663 | return ret; | 660 | return ret; |
@@ -685,28 +682,28 @@ static int compat_gpr_set(struct task_struct *target, | |||
685 | 682 | ||
686 | for (i = 0; i < num_regs; ++i) { | 683 | for (i = 0; i < num_regs; ++i) { |
687 | unsigned int idx = start + i; | 684 | unsigned int idx = start + i; |
688 | void *reg; | 685 | compat_ulong_t reg; |
686 | |||
687 | ret = copy_from_user(®, ubuf, sizeof(reg)); | ||
688 | if (ret) | ||
689 | return ret; | ||
690 | |||
691 | ubuf += sizeof(reg); | ||
689 | 692 | ||
690 | switch (idx) { | 693 | switch (idx) { |
691 | case 15: | 694 | case 15: |
692 | reg = (void *)&newregs.pc; | 695 | newregs.pc = reg; |
693 | break; | 696 | break; |
694 | case 16: | 697 | case 16: |
695 | reg = (void *)&newregs.pstate; | 698 | newregs.pstate = reg; |
696 | break; | 699 | break; |
697 | case 17: | 700 | case 17: |
698 | reg = (void *)&newregs.orig_x0; | 701 | newregs.orig_x0 = reg; |
699 | break; | 702 | break; |
700 | default: | 703 | default: |
701 | reg = (void *)&newregs.regs[idx]; | 704 | newregs.regs[idx] = reg; |
702 | } | 705 | } |
703 | 706 | ||
704 | ret = copy_from_user(reg, ubuf, sizeof(compat_ulong_t)); | ||
705 | |||
706 | if (ret) | ||
707 | goto out; | ||
708 | else | ||
709 | ubuf += sizeof(compat_ulong_t); | ||
710 | } | 707 | } |
711 | 708 | ||
712 | if (valid_user_regs(&newregs.user_regs)) | 709 | if (valid_user_regs(&newregs.user_regs)) |
@@ -714,7 +711,6 @@ static int compat_gpr_set(struct task_struct *target, | |||
714 | else | 711 | else |
715 | ret = -EINVAL; | 712 | ret = -EINVAL; |
716 | 713 | ||
717 | out: | ||
718 | return ret; | 714 | return ret; |
719 | } | 715 | } |
720 | 716 | ||
diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c index 0bc5e4cbc017..c8e9effe52e1 100644 --- a/arch/arm64/kernel/setup.c +++ b/arch/arm64/kernel/setup.c | |||
@@ -108,20 +108,95 @@ void __init early_print(const char *str, ...) | |||
108 | printk("%s", buf); | 108 | printk("%s", buf); |
109 | } | 109 | } |
110 | 110 | ||
111 | void __init smp_setup_processor_id(void) | ||
112 | { | ||
113 | /* | ||
114 | * clear __my_cpu_offset on boot CPU to avoid hang caused by | ||
115 | * using percpu variable early, for example, lockdep will | ||
116 | * access percpu variable inside lock_release | ||
117 | */ | ||
118 | set_my_cpu_offset(0); | ||
119 | } | ||
120 | |||
111 | bool arch_match_cpu_phys_id(int cpu, u64 phys_id) | 121 | bool arch_match_cpu_phys_id(int cpu, u64 phys_id) |
112 | { | 122 | { |
113 | return phys_id == cpu_logical_map(cpu); | 123 | return phys_id == cpu_logical_map(cpu); |
114 | } | 124 | } |
115 | 125 | ||
126 | struct mpidr_hash mpidr_hash; | ||
127 | #ifdef CONFIG_SMP | ||
128 | /** | ||
129 | * smp_build_mpidr_hash - Pre-compute shifts required at each affinity | ||
130 | * level in order to build a linear index from an | ||
131 | * MPIDR value. Resulting algorithm is a collision | ||
132 | * free hash carried out through shifting and ORing | ||
133 | */ | ||
134 | static void __init smp_build_mpidr_hash(void) | ||
135 | { | ||
136 | u32 i, affinity, fs[4], bits[4], ls; | ||
137 | u64 mask = 0; | ||
138 | /* | ||
139 | * Pre-scan the list of MPIDRS and filter out bits that do | ||
140 | * not contribute to affinity levels, ie they never toggle. | ||
141 | */ | ||
142 | for_each_possible_cpu(i) | ||
143 | mask |= (cpu_logical_map(i) ^ cpu_logical_map(0)); | ||
144 | pr_debug("mask of set bits %#llx\n", mask); | ||
145 | /* | ||
146 | * Find and stash the last and first bit set at all affinity levels to | ||
147 | * check how many bits are required to represent them. | ||
148 | */ | ||
149 | for (i = 0; i < 4; i++) { | ||
150 | affinity = MPIDR_AFFINITY_LEVEL(mask, i); | ||
151 | /* | ||
152 | * Find the MSB bit and LSB bits position | ||
153 | * to determine how many bits are required | ||
154 | * to express the affinity level. | ||
155 | */ | ||
156 | ls = fls(affinity); | ||
157 | fs[i] = affinity ? ffs(affinity) - 1 : 0; | ||
158 | bits[i] = ls - fs[i]; | ||
159 | } | ||
160 | /* | ||
161 | * An index can be created from the MPIDR_EL1 by isolating the | ||
162 | * significant bits at each affinity level and by shifting | ||
163 | * them in order to compress the 32 bits values space to a | ||
164 | * compressed set of values. This is equivalent to hashing | ||
165 | * the MPIDR_EL1 through shifting and ORing. It is a collision free | ||
166 | * hash though not minimal since some levels might contain a number | ||
167 | * of CPUs that is not an exact power of 2 and their bit | ||
168 | * representation might contain holes, eg MPIDR_EL1[7:0] = {0x2, 0x80}. | ||
169 | */ | ||
170 | mpidr_hash.shift_aff[0] = MPIDR_LEVEL_SHIFT(0) + fs[0]; | ||
171 | mpidr_hash.shift_aff[1] = MPIDR_LEVEL_SHIFT(1) + fs[1] - bits[0]; | ||
172 | mpidr_hash.shift_aff[2] = MPIDR_LEVEL_SHIFT(2) + fs[2] - | ||
173 | (bits[1] + bits[0]); | ||
174 | mpidr_hash.shift_aff[3] = MPIDR_LEVEL_SHIFT(3) + | ||
175 | fs[3] - (bits[2] + bits[1] + bits[0]); | ||
176 | mpidr_hash.mask = mask; | ||
177 | mpidr_hash.bits = bits[3] + bits[2] + bits[1] + bits[0]; | ||
178 | pr_debug("MPIDR hash: aff0[%u] aff1[%u] aff2[%u] aff3[%u] mask[%#llx] bits[%u]\n", | ||
179 | mpidr_hash.shift_aff[0], | ||
180 | mpidr_hash.shift_aff[1], | ||
181 | mpidr_hash.shift_aff[2], | ||
182 | mpidr_hash.shift_aff[3], | ||
183 | mpidr_hash.mask, | ||
184 | mpidr_hash.bits); | ||
185 | /* | ||
186 | * 4x is an arbitrary value used to warn on a hash table much bigger | ||
187 | * than expected on most systems. | ||
188 | */ | ||
189 | if (mpidr_hash_size() > 4 * num_possible_cpus()) | ||
190 | pr_warn("Large number of MPIDR hash buckets detected\n"); | ||
191 | __flush_dcache_area(&mpidr_hash, sizeof(struct mpidr_hash)); | ||
192 | } | ||
193 | #endif | ||
194 | |||
116 | static void __init setup_processor(void) | 195 | static void __init setup_processor(void) |
117 | { | 196 | { |
118 | struct cpu_info *cpu_info; | 197 | struct cpu_info *cpu_info; |
198 | u64 features, block; | ||
119 | 199 | ||
120 | /* | ||
121 | * locate processor in the list of supported processor | ||
122 | * types. The linker builds this table for us from the | ||
123 | * entries in arch/arm/mm/proc.S | ||
124 | */ | ||
125 | cpu_info = lookup_processor_type(read_cpuid_id()); | 200 | cpu_info = lookup_processor_type(read_cpuid_id()); |
126 | if (!cpu_info) { | 201 | if (!cpu_info) { |
127 | printk("CPU configuration botched (ID %08x), unable to continue.\n", | 202 | printk("CPU configuration botched (ID %08x), unable to continue.\n", |
@@ -136,6 +211,37 @@ static void __init setup_processor(void) | |||
136 | 211 | ||
137 | sprintf(init_utsname()->machine, ELF_PLATFORM); | 212 | sprintf(init_utsname()->machine, ELF_PLATFORM); |
138 | elf_hwcap = 0; | 213 | elf_hwcap = 0; |
214 | |||
215 | /* | ||
216 | * ID_AA64ISAR0_EL1 contains 4-bit wide signed feature blocks. | ||
217 | * The blocks we test below represent incremental functionality | ||
218 | * for non-negative values. Negative values are reserved. | ||
219 | */ | ||
220 | features = read_cpuid(ID_AA64ISAR0_EL1); | ||
221 | block = (features >> 4) & 0xf; | ||
222 | if (!(block & 0x8)) { | ||
223 | switch (block) { | ||
224 | default: | ||
225 | case 2: | ||
226 | elf_hwcap |= HWCAP_PMULL; | ||
227 | case 1: | ||
228 | elf_hwcap |= HWCAP_AES; | ||
229 | case 0: | ||
230 | break; | ||
231 | } | ||
232 | } | ||
233 | |||
234 | block = (features >> 8) & 0xf; | ||
235 | if (block && !(block & 0x8)) | ||
236 | elf_hwcap |= HWCAP_SHA1; | ||
237 | |||
238 | block = (features >> 12) & 0xf; | ||
239 | if (block && !(block & 0x8)) | ||
240 | elf_hwcap |= HWCAP_SHA2; | ||
241 | |||
242 | block = (features >> 16) & 0xf; | ||
243 | if (block && !(block & 0x8)) | ||
244 | elf_hwcap |= HWCAP_CRC32; | ||
139 | } | 245 | } |
140 | 246 | ||
141 | static void __init setup_machine_fdt(phys_addr_t dt_phys) | 247 | static void __init setup_machine_fdt(phys_addr_t dt_phys) |
@@ -205,6 +311,11 @@ u64 __cpu_logical_map[NR_CPUS] = { [0 ... NR_CPUS-1] = INVALID_HWID }; | |||
205 | 311 | ||
206 | void __init setup_arch(char **cmdline_p) | 312 | void __init setup_arch(char **cmdline_p) |
207 | { | 313 | { |
314 | /* | ||
315 | * Unmask asynchronous aborts early to catch possible system errors. | ||
316 | */ | ||
317 | local_async_enable(); | ||
318 | |||
208 | setup_processor(); | 319 | setup_processor(); |
209 | 320 | ||
210 | setup_machine_fdt(__fdt_pointer); | 321 | setup_machine_fdt(__fdt_pointer); |
@@ -231,6 +342,7 @@ void __init setup_arch(char **cmdline_p) | |||
231 | cpu_read_bootcpu_ops(); | 342 | cpu_read_bootcpu_ops(); |
232 | #ifdef CONFIG_SMP | 343 | #ifdef CONFIG_SMP |
233 | smp_init_cpus(); | 344 | smp_init_cpus(); |
345 | smp_build_mpidr_hash(); | ||
234 | #endif | 346 | #endif |
235 | 347 | ||
236 | #ifdef CONFIG_VT | 348 | #ifdef CONFIG_VT |
@@ -270,6 +382,11 @@ static const char *hwcap_str[] = { | |||
270 | "fp", | 382 | "fp", |
271 | "asimd", | 383 | "asimd", |
272 | "evtstrm", | 384 | "evtstrm", |
385 | "aes", | ||
386 | "pmull", | ||
387 | "sha1", | ||
388 | "sha2", | ||
389 | "crc32", | ||
273 | NULL | 390 | NULL |
274 | }; | 391 | }; |
275 | 392 | ||
diff --git a/arch/arm64/kernel/sleep.S b/arch/arm64/kernel/sleep.S new file mode 100644 index 000000000000..b1925729c692 --- /dev/null +++ b/arch/arm64/kernel/sleep.S | |||
@@ -0,0 +1,184 @@ | |||
1 | #include <linux/errno.h> | ||
2 | #include <linux/linkage.h> | ||
3 | #include <asm/asm-offsets.h> | ||
4 | #include <asm/assembler.h> | ||
5 | |||
6 | .text | ||
7 | /* | ||
8 | * Implementation of MPIDR_EL1 hash algorithm through shifting | ||
9 | * and OR'ing. | ||
10 | * | ||
11 | * @dst: register containing hash result | ||
12 | * @rs0: register containing affinity level 0 bit shift | ||
13 | * @rs1: register containing affinity level 1 bit shift | ||
14 | * @rs2: register containing affinity level 2 bit shift | ||
15 | * @rs3: register containing affinity level 3 bit shift | ||
16 | * @mpidr: register containing MPIDR_EL1 value | ||
17 | * @mask: register containing MPIDR mask | ||
18 | * | ||
19 | * Pseudo C-code: | ||
20 | * | ||
21 | *u32 dst; | ||
22 | * | ||
23 | *compute_mpidr_hash(u32 rs0, u32 rs1, u32 rs2, u32 rs3, u64 mpidr, u64 mask) { | ||
24 | * u32 aff0, aff1, aff2, aff3; | ||
25 | * u64 mpidr_masked = mpidr & mask; | ||
26 | * aff0 = mpidr_masked & 0xff; | ||
27 | * aff1 = mpidr_masked & 0xff00; | ||
28 | * aff2 = mpidr_masked & 0xff0000; | ||
29 | * aff2 = mpidr_masked & 0xff00000000; | ||
30 | * dst = (aff0 >> rs0 | aff1 >> rs1 | aff2 >> rs2 | aff3 >> rs3); | ||
31 | *} | ||
32 | * Input registers: rs0, rs1, rs2, rs3, mpidr, mask | ||
33 | * Output register: dst | ||
34 | * Note: input and output registers must be disjoint register sets | ||
35 | (eg: a macro instance with mpidr = x1 and dst = x1 is invalid) | ||
36 | */ | ||
37 | .macro compute_mpidr_hash dst, rs0, rs1, rs2, rs3, mpidr, mask | ||
38 | and \mpidr, \mpidr, \mask // mask out MPIDR bits | ||
39 | and \dst, \mpidr, #0xff // mask=aff0 | ||
40 | lsr \dst ,\dst, \rs0 // dst=aff0>>rs0 | ||
41 | and \mask, \mpidr, #0xff00 // mask = aff1 | ||
42 | lsr \mask ,\mask, \rs1 | ||
43 | orr \dst, \dst, \mask // dst|=(aff1>>rs1) | ||
44 | and \mask, \mpidr, #0xff0000 // mask = aff2 | ||
45 | lsr \mask ,\mask, \rs2 | ||
46 | orr \dst, \dst, \mask // dst|=(aff2>>rs2) | ||
47 | and \mask, \mpidr, #0xff00000000 // mask = aff3 | ||
48 | lsr \mask ,\mask, \rs3 | ||
49 | orr \dst, \dst, \mask // dst|=(aff3>>rs3) | ||
50 | .endm | ||
51 | /* | ||
52 | * Save CPU state for a suspend. This saves callee registers, and allocates | ||
53 | * space on the kernel stack to save the CPU specific registers + some | ||
54 | * other data for resume. | ||
55 | * | ||
56 | * x0 = suspend finisher argument | ||
57 | */ | ||
58 | ENTRY(__cpu_suspend) | ||
59 | stp x29, lr, [sp, #-96]! | ||
60 | stp x19, x20, [sp,#16] | ||
61 | stp x21, x22, [sp,#32] | ||
62 | stp x23, x24, [sp,#48] | ||
63 | stp x25, x26, [sp,#64] | ||
64 | stp x27, x28, [sp,#80] | ||
65 | mov x2, sp | ||
66 | sub sp, sp, #CPU_SUSPEND_SZ // allocate cpu_suspend_ctx | ||
67 | mov x1, sp | ||
68 | /* | ||
69 | * x1 now points to struct cpu_suspend_ctx allocated on the stack | ||
70 | */ | ||
71 | str x2, [x1, #CPU_CTX_SP] | ||
72 | ldr x2, =sleep_save_sp | ||
73 | ldr x2, [x2, #SLEEP_SAVE_SP_VIRT] | ||
74 | #ifdef CONFIG_SMP | ||
75 | mrs x7, mpidr_el1 | ||
76 | ldr x9, =mpidr_hash | ||
77 | ldr x10, [x9, #MPIDR_HASH_MASK] | ||
78 | /* | ||
79 | * Following code relies on the struct mpidr_hash | ||
80 | * members size. | ||
81 | */ | ||
82 | ldp w3, w4, [x9, #MPIDR_HASH_SHIFTS] | ||
83 | ldp w5, w6, [x9, #(MPIDR_HASH_SHIFTS + 8)] | ||
84 | compute_mpidr_hash x8, x3, x4, x5, x6, x7, x10 | ||
85 | add x2, x2, x8, lsl #3 | ||
86 | #endif | ||
87 | bl __cpu_suspend_finisher | ||
88 | /* | ||
89 | * Never gets here, unless suspend fails. | ||
90 | * Successful cpu_suspend should return from cpu_resume, returning | ||
91 | * through this code path is considered an error | ||
92 | * If the return value is set to 0 force x0 = -EOPNOTSUPP | ||
93 | * to make sure a proper error condition is propagated | ||
94 | */ | ||
95 | cmp x0, #0 | ||
96 | mov x3, #-EOPNOTSUPP | ||
97 | csel x0, x3, x0, eq | ||
98 | add sp, sp, #CPU_SUSPEND_SZ // rewind stack pointer | ||
99 | ldp x19, x20, [sp, #16] | ||
100 | ldp x21, x22, [sp, #32] | ||
101 | ldp x23, x24, [sp, #48] | ||
102 | ldp x25, x26, [sp, #64] | ||
103 | ldp x27, x28, [sp, #80] | ||
104 | ldp x29, lr, [sp], #96 | ||
105 | ret | ||
106 | ENDPROC(__cpu_suspend) | ||
107 | .ltorg | ||
108 | |||
109 | /* | ||
110 | * x0 must contain the sctlr value retrieved from restored context | ||
111 | */ | ||
112 | ENTRY(cpu_resume_mmu) | ||
113 | ldr x3, =cpu_resume_after_mmu | ||
114 | msr sctlr_el1, x0 // restore sctlr_el1 | ||
115 | isb | ||
116 | br x3 // global jump to virtual address | ||
117 | ENDPROC(cpu_resume_mmu) | ||
118 | cpu_resume_after_mmu: | ||
119 | mov x0, #0 // return zero on success | ||
120 | ldp x19, x20, [sp, #16] | ||
121 | ldp x21, x22, [sp, #32] | ||
122 | ldp x23, x24, [sp, #48] | ||
123 | ldp x25, x26, [sp, #64] | ||
124 | ldp x27, x28, [sp, #80] | ||
125 | ldp x29, lr, [sp], #96 | ||
126 | ret | ||
127 | ENDPROC(cpu_resume_after_mmu) | ||
128 | |||
129 | .data | ||
130 | ENTRY(cpu_resume) | ||
131 | bl el2_setup // if in EL2 drop to EL1 cleanly | ||
132 | #ifdef CONFIG_SMP | ||
133 | mrs x1, mpidr_el1 | ||
134 | adr x4, mpidr_hash_ptr | ||
135 | ldr x5, [x4] | ||
136 | add x8, x4, x5 // x8 = struct mpidr_hash phys address | ||
137 | /* retrieve mpidr_hash members to compute the hash */ | ||
138 | ldr x2, [x8, #MPIDR_HASH_MASK] | ||
139 | ldp w3, w4, [x8, #MPIDR_HASH_SHIFTS] | ||
140 | ldp w5, w6, [x8, #(MPIDR_HASH_SHIFTS + 8)] | ||
141 | compute_mpidr_hash x7, x3, x4, x5, x6, x1, x2 | ||
142 | /* x7 contains hash index, let's use it to grab context pointer */ | ||
143 | #else | ||
144 | mov x7, xzr | ||
145 | #endif | ||
146 | adr x0, sleep_save_sp | ||
147 | ldr x0, [x0, #SLEEP_SAVE_SP_PHYS] | ||
148 | ldr x0, [x0, x7, lsl #3] | ||
149 | /* load sp from context */ | ||
150 | ldr x2, [x0, #CPU_CTX_SP] | ||
151 | adr x1, sleep_idmap_phys | ||
152 | /* load physical address of identity map page table in x1 */ | ||
153 | ldr x1, [x1] | ||
154 | mov sp, x2 | ||
155 | /* | ||
156 | * cpu_do_resume expects x0 to contain context physical address | ||
157 | * pointer and x1 to contain physical address of 1:1 page tables | ||
158 | */ | ||
159 | bl cpu_do_resume // PC relative jump, MMU off | ||
160 | b cpu_resume_mmu // Resume MMU, never returns | ||
161 | ENDPROC(cpu_resume) | ||
162 | |||
163 | .align 3 | ||
164 | mpidr_hash_ptr: | ||
165 | /* | ||
166 | * offset of mpidr_hash symbol from current location | ||
167 | * used to obtain run-time mpidr_hash address with MMU off | ||
168 | */ | ||
169 | .quad mpidr_hash - . | ||
170 | /* | ||
171 | * physical address of identity mapped page tables | ||
172 | */ | ||
173 | .type sleep_idmap_phys, #object | ||
174 | ENTRY(sleep_idmap_phys) | ||
175 | .quad 0 | ||
176 | /* | ||
177 | * struct sleep_save_sp { | ||
178 | * phys_addr_t *save_ptr_stash; | ||
179 | * phys_addr_t save_ptr_stash_phys; | ||
180 | * }; | ||
181 | */ | ||
182 | .type sleep_save_sp, #object | ||
183 | ENTRY(sleep_save_sp) | ||
184 | .space SLEEP_SAVE_SP_SZ // struct sleep_save_sp | ||
diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c index a5aeefab03c3..1b7617ab499b 100644 --- a/arch/arm64/kernel/smp.c +++ b/arch/arm64/kernel/smp.c | |||
@@ -61,6 +61,7 @@ enum ipi_msg_type { | |||
61 | IPI_CALL_FUNC, | 61 | IPI_CALL_FUNC, |
62 | IPI_CALL_FUNC_SINGLE, | 62 | IPI_CALL_FUNC_SINGLE, |
63 | IPI_CPU_STOP, | 63 | IPI_CPU_STOP, |
64 | IPI_TIMER, | ||
64 | }; | 65 | }; |
65 | 66 | ||
66 | /* | 67 | /* |
@@ -122,8 +123,6 @@ asmlinkage void secondary_start_kernel(void) | |||
122 | struct mm_struct *mm = &init_mm; | 123 | struct mm_struct *mm = &init_mm; |
123 | unsigned int cpu = smp_processor_id(); | 124 | unsigned int cpu = smp_processor_id(); |
124 | 125 | ||
125 | printk("CPU%u: Booted secondary processor\n", cpu); | ||
126 | |||
127 | /* | 126 | /* |
128 | * All kernel threads share the same mm context; grab a | 127 | * All kernel threads share the same mm context; grab a |
129 | * reference and switch to it. | 128 | * reference and switch to it. |
@@ -132,6 +131,9 @@ asmlinkage void secondary_start_kernel(void) | |||
132 | current->active_mm = mm; | 131 | current->active_mm = mm; |
133 | cpumask_set_cpu(cpu, mm_cpumask(mm)); | 132 | cpumask_set_cpu(cpu, mm_cpumask(mm)); |
134 | 133 | ||
134 | set_my_cpu_offset(per_cpu_offset(smp_processor_id())); | ||
135 | printk("CPU%u: Booted secondary processor\n", cpu); | ||
136 | |||
135 | /* | 137 | /* |
136 | * TTBR0 is only used for the identity mapping at this stage. Make it | 138 | * TTBR0 is only used for the identity mapping at this stage. Make it |
137 | * point to zero page to avoid speculatively fetching new entries. | 139 | * point to zero page to avoid speculatively fetching new entries. |
@@ -160,6 +162,7 @@ asmlinkage void secondary_start_kernel(void) | |||
160 | 162 | ||
161 | local_irq_enable(); | 163 | local_irq_enable(); |
162 | local_fiq_enable(); | 164 | local_fiq_enable(); |
165 | local_async_enable(); | ||
163 | 166 | ||
164 | /* | 167 | /* |
165 | * OK, it's off to the idle thread for us | 168 | * OK, it's off to the idle thread for us |
@@ -270,6 +273,7 @@ void __init smp_cpus_done(unsigned int max_cpus) | |||
270 | 273 | ||
271 | void __init smp_prepare_boot_cpu(void) | 274 | void __init smp_prepare_boot_cpu(void) |
272 | { | 275 | { |
276 | set_my_cpu_offset(per_cpu_offset(smp_processor_id())); | ||
273 | } | 277 | } |
274 | 278 | ||
275 | static void (*smp_cross_call)(const struct cpumask *, unsigned int); | 279 | static void (*smp_cross_call)(const struct cpumask *, unsigned int); |
@@ -446,6 +450,7 @@ static const char *ipi_types[NR_IPI] = { | |||
446 | S(IPI_CALL_FUNC, "Function call interrupts"), | 450 | S(IPI_CALL_FUNC, "Function call interrupts"), |
447 | S(IPI_CALL_FUNC_SINGLE, "Single function call interrupts"), | 451 | S(IPI_CALL_FUNC_SINGLE, "Single function call interrupts"), |
448 | S(IPI_CPU_STOP, "CPU stop interrupts"), | 452 | S(IPI_CPU_STOP, "CPU stop interrupts"), |
453 | S(IPI_TIMER, "Timer broadcast interrupts"), | ||
449 | }; | 454 | }; |
450 | 455 | ||
451 | void show_ipi_list(struct seq_file *p, int prec) | 456 | void show_ipi_list(struct seq_file *p, int prec) |
@@ -531,6 +536,14 @@ void handle_IPI(int ipinr, struct pt_regs *regs) | |||
531 | irq_exit(); | 536 | irq_exit(); |
532 | break; | 537 | break; |
533 | 538 | ||
539 | #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST | ||
540 | case IPI_TIMER: | ||
541 | irq_enter(); | ||
542 | tick_receive_broadcast(); | ||
543 | irq_exit(); | ||
544 | break; | ||
545 | #endif | ||
546 | |||
534 | default: | 547 | default: |
535 | pr_crit("CPU%u: Unknown IPI message 0x%x\n", cpu, ipinr); | 548 | pr_crit("CPU%u: Unknown IPI message 0x%x\n", cpu, ipinr); |
536 | break; | 549 | break; |
@@ -543,6 +556,13 @@ void smp_send_reschedule(int cpu) | |||
543 | smp_cross_call(cpumask_of(cpu), IPI_RESCHEDULE); | 556 | smp_cross_call(cpumask_of(cpu), IPI_RESCHEDULE); |
544 | } | 557 | } |
545 | 558 | ||
559 | #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST | ||
560 | void tick_broadcast(const struct cpumask *mask) | ||
561 | { | ||
562 | smp_cross_call(mask, IPI_TIMER); | ||
563 | } | ||
564 | #endif | ||
565 | |||
546 | void smp_send_stop(void) | 566 | void smp_send_stop(void) |
547 | { | 567 | { |
548 | unsigned long timeout; | 568 | unsigned long timeout; |
diff --git a/arch/arm64/kernel/stacktrace.c b/arch/arm64/kernel/stacktrace.c index d25459ff57fc..c3b6c63ea5fb 100644 --- a/arch/arm64/kernel/stacktrace.c +++ b/arch/arm64/kernel/stacktrace.c | |||
@@ -43,7 +43,7 @@ int unwind_frame(struct stackframe *frame) | |||
43 | low = frame->sp; | 43 | low = frame->sp; |
44 | high = ALIGN(low, THREAD_SIZE); | 44 | high = ALIGN(low, THREAD_SIZE); |
45 | 45 | ||
46 | if (fp < low || fp > high || fp & 0xf) | 46 | if (fp < low || fp > high - 0x18 || fp & 0xf) |
47 | return -EINVAL; | 47 | return -EINVAL; |
48 | 48 | ||
49 | frame->sp = fp + 0x10; | 49 | frame->sp = fp + 0x10; |
diff --git a/arch/arm64/kernel/suspend.c b/arch/arm64/kernel/suspend.c new file mode 100644 index 000000000000..430344e2c989 --- /dev/null +++ b/arch/arm64/kernel/suspend.c | |||
@@ -0,0 +1,132 @@ | |||
1 | #include <linux/slab.h> | ||
2 | #include <asm/cacheflush.h> | ||
3 | #include <asm/cpu_ops.h> | ||
4 | #include <asm/debug-monitors.h> | ||
5 | #include <asm/pgtable.h> | ||
6 | #include <asm/memory.h> | ||
7 | #include <asm/smp_plat.h> | ||
8 | #include <asm/suspend.h> | ||
9 | #include <asm/tlbflush.h> | ||
10 | |||
11 | extern int __cpu_suspend(unsigned long); | ||
12 | /* | ||
13 | * This is called by __cpu_suspend() to save the state, and do whatever | ||
14 | * flushing is required to ensure that when the CPU goes to sleep we have | ||
15 | * the necessary data available when the caches are not searched. | ||
16 | * | ||
17 | * @arg: Argument to pass to suspend operations | ||
18 | * @ptr: CPU context virtual address | ||
19 | * @save_ptr: address of the location where the context physical address | ||
20 | * must be saved | ||
21 | */ | ||
22 | int __cpu_suspend_finisher(unsigned long arg, struct cpu_suspend_ctx *ptr, | ||
23 | phys_addr_t *save_ptr) | ||
24 | { | ||
25 | int cpu = smp_processor_id(); | ||
26 | |||
27 | *save_ptr = virt_to_phys(ptr); | ||
28 | |||
29 | cpu_do_suspend(ptr); | ||
30 | /* | ||
31 | * Only flush the context that must be retrieved with the MMU | ||
32 | * off. VA primitives ensure the flush is applied to all | ||
33 | * cache levels so context is pushed to DRAM. | ||
34 | */ | ||
35 | __flush_dcache_area(ptr, sizeof(*ptr)); | ||
36 | __flush_dcache_area(save_ptr, sizeof(*save_ptr)); | ||
37 | |||
38 | return cpu_ops[cpu]->cpu_suspend(arg); | ||
39 | } | ||
40 | |||
41 | /* | ||
42 | * This hook is provided so that cpu_suspend code can restore HW | ||
43 | * breakpoints as early as possible in the resume path, before reenabling | ||
44 | * debug exceptions. Code cannot be run from a CPU PM notifier since by the | ||
45 | * time the notifier runs debug exceptions might have been enabled already, | ||
46 | * with HW breakpoints registers content still in an unknown state. | ||
47 | */ | ||
48 | void (*hw_breakpoint_restore)(void *); | ||
49 | void __init cpu_suspend_set_dbg_restorer(void (*hw_bp_restore)(void *)) | ||
50 | { | ||
51 | /* Prevent multiple restore hook initializations */ | ||
52 | if (WARN_ON(hw_breakpoint_restore)) | ||
53 | return; | ||
54 | hw_breakpoint_restore = hw_bp_restore; | ||
55 | } | ||
56 | |||
57 | /** | ||
58 | * cpu_suspend | ||
59 | * | ||
60 | * @arg: argument to pass to the finisher function | ||
61 | */ | ||
62 | int cpu_suspend(unsigned long arg) | ||
63 | { | ||
64 | struct mm_struct *mm = current->active_mm; | ||
65 | int ret, cpu = smp_processor_id(); | ||
66 | unsigned long flags; | ||
67 | |||
68 | /* | ||
69 | * If cpu_ops have not been registered or suspend | ||
70 | * has not been initialized, cpu_suspend call fails early. | ||
71 | */ | ||
72 | if (!cpu_ops[cpu] || !cpu_ops[cpu]->cpu_suspend) | ||
73 | return -EOPNOTSUPP; | ||
74 | |||
75 | /* | ||
76 | * From this point debug exceptions are disabled to prevent | ||
77 | * updates to mdscr register (saved and restored along with | ||
78 | * general purpose registers) from kernel debuggers. | ||
79 | */ | ||
80 | local_dbg_save(flags); | ||
81 | |||
82 | /* | ||
83 | * mm context saved on the stack, it will be restored when | ||
84 | * the cpu comes out of reset through the identity mapped | ||
85 | * page tables, so that the thread address space is properly | ||
86 | * set-up on function return. | ||
87 | */ | ||
88 | ret = __cpu_suspend(arg); | ||
89 | if (ret == 0) { | ||
90 | cpu_switch_mm(mm->pgd, mm); | ||
91 | flush_tlb_all(); | ||
92 | /* | ||
93 | * Restore HW breakpoint registers to sane values | ||
94 | * before debug exceptions are possibly reenabled | ||
95 | * through local_dbg_restore. | ||
96 | */ | ||
97 | if (hw_breakpoint_restore) | ||
98 | hw_breakpoint_restore(NULL); | ||
99 | } | ||
100 | |||
101 | /* | ||
102 | * Restore pstate flags. OS lock and mdscr have been already | ||
103 | * restored, so from this point onwards, debugging is fully | ||
104 | * renabled if it was enabled when core started shutdown. | ||
105 | */ | ||
106 | local_dbg_restore(flags); | ||
107 | |||
108 | return ret; | ||
109 | } | ||
110 | |||
111 | extern struct sleep_save_sp sleep_save_sp; | ||
112 | extern phys_addr_t sleep_idmap_phys; | ||
113 | |||
114 | static int cpu_suspend_init(void) | ||
115 | { | ||
116 | void *ctx_ptr; | ||
117 | |||
118 | /* ctx_ptr is an array of physical addresses */ | ||
119 | ctx_ptr = kcalloc(mpidr_hash_size(), sizeof(phys_addr_t), GFP_KERNEL); | ||
120 | |||
121 | if (WARN_ON(!ctx_ptr)) | ||
122 | return -ENOMEM; | ||
123 | |||
124 | sleep_save_sp.save_ptr_stash = ctx_ptr; | ||
125 | sleep_save_sp.save_ptr_stash_phys = virt_to_phys(ctx_ptr); | ||
126 | sleep_idmap_phys = virt_to_phys(idmap_pg_dir); | ||
127 | __flush_dcache_area(&sleep_save_sp, sizeof(struct sleep_save_sp)); | ||
128 | __flush_dcache_area(&sleep_idmap_phys, sizeof(sleep_idmap_phys)); | ||
129 | |||
130 | return 0; | ||
131 | } | ||
132 | early_initcall(cpu_suspend_init); | ||
diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S index 5161ad992091..4ba7a55b49c7 100644 --- a/arch/arm64/kernel/vmlinux.lds.S +++ b/arch/arm64/kernel/vmlinux.lds.S | |||
@@ -99,17 +99,14 @@ SECTIONS | |||
99 | 99 | ||
100 | . = ALIGN(PAGE_SIZE); | 100 | . = ALIGN(PAGE_SIZE); |
101 | _data = .; | 101 | _data = .; |
102 | __data_loc = _data - LOAD_OFFSET; | ||
103 | _sdata = .; | 102 | _sdata = .; |
104 | RW_DATA_SECTION(64, PAGE_SIZE, THREAD_SIZE) | 103 | RW_DATA_SECTION(64, PAGE_SIZE, THREAD_SIZE) |
105 | _edata = .; | 104 | _edata = .; |
106 | _edata_loc = __data_loc + SIZEOF(.data); | ||
107 | 105 | ||
108 | BSS_SECTION(0, 0, 0) | 106 | BSS_SECTION(0, 0, 0) |
109 | _end = .; | 107 | _end = .; |
110 | 108 | ||
111 | STABS_DEBUG | 109 | STABS_DEBUG |
112 | .comment 0 : { *(.comment) } | ||
113 | } | 110 | } |
114 | 111 | ||
115 | /* | 112 | /* |
diff --git a/arch/arm64/lib/Makefile b/arch/arm64/lib/Makefile index 59acc0ef0462..328ce1a99daa 100644 --- a/arch/arm64/lib/Makefile +++ b/arch/arm64/lib/Makefile | |||
@@ -1,6 +1,4 @@ | |||
1 | lib-y := bitops.o delay.o \ | 1 | lib-y := bitops.o clear_user.o delay.o copy_from_user.o \ |
2 | strncpy_from_user.o strnlen_user.o clear_user.o \ | 2 | copy_to_user.o copy_in_user.o copy_page.o \ |
3 | copy_from_user.o copy_to_user.o copy_in_user.o \ | 3 | clear_page.o memchr.o memcpy.o memmove.o memset.o \ |
4 | copy_page.o clear_page.o \ | ||
5 | memchr.o memcpy.o memmove.o memset.o \ | ||
6 | strchr.o strrchr.o | 4 | strchr.o strrchr.o |
diff --git a/arch/arm64/lib/strncpy_from_user.S b/arch/arm64/lib/strncpy_from_user.S deleted file mode 100644 index 56e448a831a0..000000000000 --- a/arch/arm64/lib/strncpy_from_user.S +++ /dev/null | |||
@@ -1,50 +0,0 @@ | |||
1 | /* | ||
2 | * Based on arch/arm/lib/strncpy_from_user.S | ||
3 | * | ||
4 | * Copyright (C) 1995-2000 Russell King | ||
5 | * Copyright (C) 2012 ARM Ltd. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
18 | */ | ||
19 | |||
20 | #include <linux/linkage.h> | ||
21 | #include <asm/assembler.h> | ||
22 | #include <asm/errno.h> | ||
23 | |||
24 | .text | ||
25 | .align 5 | ||
26 | |||
27 | /* | ||
28 | * Copy a string from user space to kernel space. | ||
29 | * x0 = dst, x1 = src, x2 = byte length | ||
30 | * returns the number of characters copied (strlen of copied string), | ||
31 | * -EFAULT on exception, or "len" if we fill the whole buffer | ||
32 | */ | ||
33 | ENTRY(__strncpy_from_user) | ||
34 | mov x4, x1 | ||
35 | 1: subs x2, x2, #1 | ||
36 | bmi 2f | ||
37 | USER(9f, ldrb w3, [x1], #1 ) | ||
38 | strb w3, [x0], #1 | ||
39 | cbnz w3, 1b | ||
40 | sub x1, x1, #1 // take NUL character out of count | ||
41 | 2: sub x0, x1, x4 | ||
42 | ret | ||
43 | ENDPROC(__strncpy_from_user) | ||
44 | |||
45 | .section .fixup,"ax" | ||
46 | .align 0 | ||
47 | 9: strb wzr, [x0] // null terminate | ||
48 | mov x0, #-EFAULT | ||
49 | ret | ||
50 | .previous | ||
diff --git a/arch/arm64/lib/strnlen_user.S b/arch/arm64/lib/strnlen_user.S deleted file mode 100644 index 7f7b176a5646..000000000000 --- a/arch/arm64/lib/strnlen_user.S +++ /dev/null | |||
@@ -1,47 +0,0 @@ | |||
1 | /* | ||
2 | * Based on arch/arm/lib/strnlen_user.S | ||
3 | * | ||
4 | * Copyright (C) 1995-2000 Russell King | ||
5 | * Copyright (C) 2012 ARM Ltd. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
18 | */ | ||
19 | |||
20 | #include <linux/linkage.h> | ||
21 | #include <asm/assembler.h> | ||
22 | #include <asm/errno.h> | ||
23 | |||
24 | .text | ||
25 | .align 5 | ||
26 | |||
27 | /* Prototype: unsigned long __strnlen_user(const char *str, long n) | ||
28 | * Purpose : get length of a string in user memory | ||
29 | * Params : str - address of string in user memory | ||
30 | * Returns : length of string *including terminator* | ||
31 | * or zero on exception, or n if too long | ||
32 | */ | ||
33 | ENTRY(__strnlen_user) | ||
34 | mov x2, x0 | ||
35 | 1: subs x1, x1, #1 | ||
36 | b.mi 2f | ||
37 | USER(9f, ldrb w3, [x0], #1 ) | ||
38 | cbnz w3, 1b | ||
39 | 2: sub x0, x0, x2 | ||
40 | ret | ||
41 | ENDPROC(__strnlen_user) | ||
42 | |||
43 | .section .fixup,"ax" | ||
44 | .align 0 | ||
45 | 9: mov x0, #0 | ||
46 | ret | ||
47 | .previous | ||
diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c index 4bd7579ec9e6..45b5ab54c9ee 100644 --- a/arch/arm64/mm/dma-mapping.c +++ b/arch/arm64/mm/dma-mapping.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/export.h> | 21 | #include <linux/export.h> |
22 | #include <linux/slab.h> | 22 | #include <linux/slab.h> |
23 | #include <linux/dma-mapping.h> | 23 | #include <linux/dma-mapping.h> |
24 | #include <linux/dma-contiguous.h> | ||
24 | #include <linux/vmalloc.h> | 25 | #include <linux/vmalloc.h> |
25 | #include <linux/swiotlb.h> | 26 | #include <linux/swiotlb.h> |
26 | 27 | ||
@@ -33,17 +34,47 @@ static void *arm64_swiotlb_alloc_coherent(struct device *dev, size_t size, | |||
33 | dma_addr_t *dma_handle, gfp_t flags, | 34 | dma_addr_t *dma_handle, gfp_t flags, |
34 | struct dma_attrs *attrs) | 35 | struct dma_attrs *attrs) |
35 | { | 36 | { |
37 | if (dev == NULL) { | ||
38 | WARN_ONCE(1, "Use an actual device structure for DMA allocation\n"); | ||
39 | return NULL; | ||
40 | } | ||
41 | |||
36 | if (IS_ENABLED(CONFIG_ZONE_DMA32) && | 42 | if (IS_ENABLED(CONFIG_ZONE_DMA32) && |
37 | dev->coherent_dma_mask <= DMA_BIT_MASK(32)) | 43 | dev->coherent_dma_mask <= DMA_BIT_MASK(32)) |
38 | flags |= GFP_DMA32; | 44 | flags |= GFP_DMA32; |
39 | return swiotlb_alloc_coherent(dev, size, dma_handle, flags); | 45 | if (IS_ENABLED(CONFIG_DMA_CMA)) { |
46 | struct page *page; | ||
47 | |||
48 | page = dma_alloc_from_contiguous(dev, size >> PAGE_SHIFT, | ||
49 | get_order(size)); | ||
50 | if (!page) | ||
51 | return NULL; | ||
52 | |||
53 | *dma_handle = phys_to_dma(dev, page_to_phys(page)); | ||
54 | return page_address(page); | ||
55 | } else { | ||
56 | return swiotlb_alloc_coherent(dev, size, dma_handle, flags); | ||
57 | } | ||
40 | } | 58 | } |
41 | 59 | ||
42 | static void arm64_swiotlb_free_coherent(struct device *dev, size_t size, | 60 | static void arm64_swiotlb_free_coherent(struct device *dev, size_t size, |
43 | void *vaddr, dma_addr_t dma_handle, | 61 | void *vaddr, dma_addr_t dma_handle, |
44 | struct dma_attrs *attrs) | 62 | struct dma_attrs *attrs) |
45 | { | 63 | { |
46 | swiotlb_free_coherent(dev, size, vaddr, dma_handle); | 64 | if (dev == NULL) { |
65 | WARN_ONCE(1, "Use an actual device structure for DMA allocation\n"); | ||
66 | return; | ||
67 | } | ||
68 | |||
69 | if (IS_ENABLED(CONFIG_DMA_CMA)) { | ||
70 | phys_addr_t paddr = dma_to_phys(dev, dma_handle); | ||
71 | |||
72 | dma_release_from_contiguous(dev, | ||
73 | phys_to_page(paddr), | ||
74 | size >> PAGE_SHIFT); | ||
75 | } else { | ||
76 | swiotlb_free_coherent(dev, size, vaddr, dma_handle); | ||
77 | } | ||
47 | } | 78 | } |
48 | 79 | ||
49 | static struct dma_map_ops arm64_swiotlb_dma_ops = { | 80 | static struct dma_map_ops arm64_swiotlb_dma_ops = { |
diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c index 0cb8742de4f2..d0b4c2efda90 100644 --- a/arch/arm64/mm/init.c +++ b/arch/arm64/mm/init.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/memblock.h> | 30 | #include <linux/memblock.h> |
31 | #include <linux/sort.h> | 31 | #include <linux/sort.h> |
32 | #include <linux/of_fdt.h> | 32 | #include <linux/of_fdt.h> |
33 | #include <linux/dma-contiguous.h> | ||
33 | 34 | ||
34 | #include <asm/sections.h> | 35 | #include <asm/sections.h> |
35 | #include <asm/setup.h> | 36 | #include <asm/setup.h> |
@@ -159,6 +160,8 @@ void __init arm64_memblock_init(void) | |||
159 | memblock_reserve(base, size); | 160 | memblock_reserve(base, size); |
160 | } | 161 | } |
161 | 162 | ||
163 | dma_contiguous_reserve(0); | ||
164 | |||
162 | memblock_allow_resize(); | 165 | memblock_allow_resize(); |
163 | memblock_dump_all(); | 166 | memblock_dump_all(); |
164 | } | 167 | } |
diff --git a/arch/arm64/mm/proc.S b/arch/arm64/mm/proc.S index 421b99fd635d..bed1f1de1caf 100644 --- a/arch/arm64/mm/proc.S +++ b/arch/arm64/mm/proc.S | |||
@@ -80,6 +80,75 @@ ENTRY(cpu_do_idle) | |||
80 | ret | 80 | ret |
81 | ENDPROC(cpu_do_idle) | 81 | ENDPROC(cpu_do_idle) |
82 | 82 | ||
83 | #ifdef CONFIG_ARM64_CPU_SUSPEND | ||
84 | /** | ||
85 | * cpu_do_suspend - save CPU registers context | ||
86 | * | ||
87 | * x0: virtual address of context pointer | ||
88 | */ | ||
89 | ENTRY(cpu_do_suspend) | ||
90 | mrs x2, tpidr_el0 | ||
91 | mrs x3, tpidrro_el0 | ||
92 | mrs x4, contextidr_el1 | ||
93 | mrs x5, mair_el1 | ||
94 | mrs x6, cpacr_el1 | ||
95 | mrs x7, ttbr1_el1 | ||
96 | mrs x8, tcr_el1 | ||
97 | mrs x9, vbar_el1 | ||
98 | mrs x10, mdscr_el1 | ||
99 | mrs x11, oslsr_el1 | ||
100 | mrs x12, sctlr_el1 | ||
101 | stp x2, x3, [x0] | ||
102 | stp x4, x5, [x0, #16] | ||
103 | stp x6, x7, [x0, #32] | ||
104 | stp x8, x9, [x0, #48] | ||
105 | stp x10, x11, [x0, #64] | ||
106 | str x12, [x0, #80] | ||
107 | ret | ||
108 | ENDPROC(cpu_do_suspend) | ||
109 | |||
110 | /** | ||
111 | * cpu_do_resume - restore CPU register context | ||
112 | * | ||
113 | * x0: Physical address of context pointer | ||
114 | * x1: ttbr0_el1 to be restored | ||
115 | * | ||
116 | * Returns: | ||
117 | * sctlr_el1 value in x0 | ||
118 | */ | ||
119 | ENTRY(cpu_do_resume) | ||
120 | /* | ||
121 | * Invalidate local tlb entries before turning on MMU | ||
122 | */ | ||
123 | tlbi vmalle1 | ||
124 | ldp x2, x3, [x0] | ||
125 | ldp x4, x5, [x0, #16] | ||
126 | ldp x6, x7, [x0, #32] | ||
127 | ldp x8, x9, [x0, #48] | ||
128 | ldp x10, x11, [x0, #64] | ||
129 | ldr x12, [x0, #80] | ||
130 | msr tpidr_el0, x2 | ||
131 | msr tpidrro_el0, x3 | ||
132 | msr contextidr_el1, x4 | ||
133 | msr mair_el1, x5 | ||
134 | msr cpacr_el1, x6 | ||
135 | msr ttbr0_el1, x1 | ||
136 | msr ttbr1_el1, x7 | ||
137 | msr tcr_el1, x8 | ||
138 | msr vbar_el1, x9 | ||
139 | msr mdscr_el1, x10 | ||
140 | /* | ||
141 | * Restore oslsr_el1 by writing oslar_el1 | ||
142 | */ | ||
143 | ubfx x11, x11, #1, #1 | ||
144 | msr oslar_el1, x11 | ||
145 | mov x0, x12 | ||
146 | dsb nsh // Make sure local tlb invalidation completed | ||
147 | isb | ||
148 | ret | ||
149 | ENDPROC(cpu_do_resume) | ||
150 | #endif | ||
151 | |||
83 | /* | 152 | /* |
84 | * cpu_switch_mm(pgd_phys, tsk) | 153 | * cpu_switch_mm(pgd_phys, tsk) |
85 | * | 154 | * |
@@ -111,12 +180,12 @@ ENTRY(__cpu_setup) | |||
111 | bl __flush_dcache_all | 180 | bl __flush_dcache_all |
112 | mov lr, x28 | 181 | mov lr, x28 |
113 | ic iallu // I+BTB cache invalidate | 182 | ic iallu // I+BTB cache invalidate |
183 | tlbi vmalle1is // invalidate I + D TLBs | ||
114 | dsb sy | 184 | dsb sy |
115 | 185 | ||
116 | mov x0, #3 << 20 | 186 | mov x0, #3 << 20 |
117 | msr cpacr_el1, x0 // Enable FP/ASIMD | 187 | msr cpacr_el1, x0 // Enable FP/ASIMD |
118 | msr mdscr_el1, xzr // Reset mdscr_el1 | 188 | msr mdscr_el1, xzr // Reset mdscr_el1 |
119 | tlbi vmalle1is // invalidate I + D TLBs | ||
120 | /* | 189 | /* |
121 | * Memory region attributes for LPAE: | 190 | * Memory region attributes for LPAE: |
122 | * | 191 | * |
diff --git a/arch/avr32/boards/favr-32/setup.c b/arch/avr32/boards/favr-32/setup.c index 7b1f2cd85400..1f121497b517 100644 --- a/arch/avr32/boards/favr-32/setup.c +++ b/arch/avr32/boards/favr-32/setup.c | |||
@@ -298,8 +298,10 @@ static int __init set_abdac_rate(struct platform_device *pdev) | |||
298 | */ | 298 | */ |
299 | retval = clk_round_rate(pll1, | 299 | retval = clk_round_rate(pll1, |
300 | CONFIG_BOARD_FAVR32_ABDAC_RATE * 256 * 16); | 300 | CONFIG_BOARD_FAVR32_ABDAC_RATE * 256 * 16); |
301 | if (retval < 0) | 301 | if (retval <= 0) { |
302 | retval = -EINVAL; | ||
302 | goto out_abdac; | 303 | goto out_abdac; |
304 | } | ||
303 | 305 | ||
304 | retval = clk_set_rate(pll1, retval); | 306 | retval = clk_set_rate(pll1, retval); |
305 | if (retval != 0) | 307 | if (retval != 0) |
diff --git a/arch/avr32/configs/atngw100_defconfig b/arch/avr32/configs/atngw100_defconfig index d5aff36ade92..4733e38e7ae6 100644 --- a/arch/avr32/configs/atngw100_defconfig +++ b/arch/avr32/configs/atngw100_defconfig | |||
@@ -59,7 +59,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | |||
59 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | 59 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set |
60 | # CONFIG_FW_LOADER is not set | 60 | # CONFIG_FW_LOADER is not set |
61 | CONFIG_MTD=y | 61 | CONFIG_MTD=y |
62 | CONFIG_MTD_PARTITIONS=y | ||
63 | CONFIG_MTD_CMDLINE_PARTS=y | 62 | CONFIG_MTD_CMDLINE_PARTS=y |
64 | CONFIG_MTD_CHAR=y | 63 | CONFIG_MTD_CHAR=y |
65 | CONFIG_MTD_BLOCK=y | 64 | CONFIG_MTD_BLOCK=y |
diff --git a/arch/avr32/configs/atngw100_evklcd100_defconfig b/arch/avr32/configs/atngw100_evklcd100_defconfig index 4abcf435d599..1be0ee31bd91 100644 --- a/arch/avr32/configs/atngw100_evklcd100_defconfig +++ b/arch/avr32/configs/atngw100_evklcd100_defconfig | |||
@@ -61,7 +61,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | |||
61 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | 61 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set |
62 | # CONFIG_FW_LOADER is not set | 62 | # CONFIG_FW_LOADER is not set |
63 | CONFIG_MTD=y | 63 | CONFIG_MTD=y |
64 | CONFIG_MTD_PARTITIONS=y | ||
65 | CONFIG_MTD_CMDLINE_PARTS=y | 64 | CONFIG_MTD_CMDLINE_PARTS=y |
66 | CONFIG_MTD_CHAR=y | 65 | CONFIG_MTD_CHAR=y |
67 | CONFIG_MTD_BLOCK=y | 66 | CONFIG_MTD_BLOCK=y |
diff --git a/arch/avr32/configs/atngw100_evklcd101_defconfig b/arch/avr32/configs/atngw100_evklcd101_defconfig index 18f3fa0470ff..796e536f7bc4 100644 --- a/arch/avr32/configs/atngw100_evklcd101_defconfig +++ b/arch/avr32/configs/atngw100_evklcd101_defconfig | |||
@@ -60,7 +60,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | |||
60 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | 60 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set |
61 | # CONFIG_FW_LOADER is not set | 61 | # CONFIG_FW_LOADER is not set |
62 | CONFIG_MTD=y | 62 | CONFIG_MTD=y |
63 | CONFIG_MTD_PARTITIONS=y | ||
64 | CONFIG_MTD_CMDLINE_PARTS=y | 63 | CONFIG_MTD_CMDLINE_PARTS=y |
65 | CONFIG_MTD_CHAR=y | 64 | CONFIG_MTD_CHAR=y |
66 | CONFIG_MTD_BLOCK=y | 65 | CONFIG_MTD_BLOCK=y |
diff --git a/arch/avr32/configs/atngw100_mrmt_defconfig b/arch/avr32/configs/atngw100_mrmt_defconfig index 06e389cfcd12..9a57da44eb6f 100644 --- a/arch/avr32/configs/atngw100_mrmt_defconfig +++ b/arch/avr32/configs/atngw100_mrmt_defconfig | |||
@@ -48,7 +48,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | |||
48 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | 48 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set |
49 | # CONFIG_FW_LOADER is not set | 49 | # CONFIG_FW_LOADER is not set |
50 | CONFIG_MTD=y | 50 | CONFIG_MTD=y |
51 | CONFIG_MTD_PARTITIONS=y | ||
52 | CONFIG_MTD_CMDLINE_PARTS=y | 51 | CONFIG_MTD_CMDLINE_PARTS=y |
53 | CONFIG_MTD_CHAR=y | 52 | CONFIG_MTD_CHAR=y |
54 | CONFIG_MTD_BLOCK=y | 53 | CONFIG_MTD_BLOCK=y |
diff --git a/arch/avr32/configs/atngw100mkii_defconfig b/arch/avr32/configs/atngw100mkii_defconfig index 2518a1368d7c..97fe1b399b06 100644 --- a/arch/avr32/configs/atngw100mkii_defconfig +++ b/arch/avr32/configs/atngw100mkii_defconfig | |||
@@ -59,7 +59,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | |||
59 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | 59 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set |
60 | # CONFIG_FW_LOADER is not set | 60 | # CONFIG_FW_LOADER is not set |
61 | CONFIG_MTD=y | 61 | CONFIG_MTD=y |
62 | CONFIG_MTD_PARTITIONS=y | ||
63 | CONFIG_MTD_CMDLINE_PARTS=y | 62 | CONFIG_MTD_CMDLINE_PARTS=y |
64 | CONFIG_MTD_CHAR=y | 63 | CONFIG_MTD_CHAR=y |
65 | CONFIG_MTD_BLOCK=y | 64 | CONFIG_MTD_BLOCK=y |
diff --git a/arch/avr32/configs/atngw100mkii_evklcd100_defconfig b/arch/avr32/configs/atngw100mkii_evklcd100_defconfig index 245ef6bd0fa6..a176d24467e9 100644 --- a/arch/avr32/configs/atngw100mkii_evklcd100_defconfig +++ b/arch/avr32/configs/atngw100mkii_evklcd100_defconfig | |||
@@ -62,7 +62,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | |||
62 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | 62 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set |
63 | # CONFIG_FW_LOADER is not set | 63 | # CONFIG_FW_LOADER is not set |
64 | CONFIG_MTD=y | 64 | CONFIG_MTD=y |
65 | CONFIG_MTD_PARTITIONS=y | ||
66 | CONFIG_MTD_CMDLINE_PARTS=y | 65 | CONFIG_MTD_CMDLINE_PARTS=y |
67 | CONFIG_MTD_CHAR=y | 66 | CONFIG_MTD_CHAR=y |
68 | CONFIG_MTD_BLOCK=y | 67 | CONFIG_MTD_BLOCK=y |
diff --git a/arch/avr32/configs/atngw100mkii_evklcd101_defconfig b/arch/avr32/configs/atngw100mkii_evklcd101_defconfig index fa6cbac6e418..d1bf6dcfc47d 100644 --- a/arch/avr32/configs/atngw100mkii_evklcd101_defconfig +++ b/arch/avr32/configs/atngw100mkii_evklcd101_defconfig | |||
@@ -61,7 +61,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | |||
61 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | 61 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set |
62 | # CONFIG_FW_LOADER is not set | 62 | # CONFIG_FW_LOADER is not set |
63 | CONFIG_MTD=y | 63 | CONFIG_MTD=y |
64 | CONFIG_MTD_PARTITIONS=y | ||
65 | CONFIG_MTD_CMDLINE_PARTS=y | 64 | CONFIG_MTD_CMDLINE_PARTS=y |
66 | CONFIG_MTD_CHAR=y | 65 | CONFIG_MTD_CHAR=y |
67 | CONFIG_MTD_BLOCK=y | 66 | CONFIG_MTD_BLOCK=y |
diff --git a/arch/avr32/configs/atstk1002_defconfig b/arch/avr32/configs/atstk1002_defconfig index bbd5131021a5..2813dd2b9138 100644 --- a/arch/avr32/configs/atstk1002_defconfig +++ b/arch/avr32/configs/atstk1002_defconfig | |||
@@ -53,7 +53,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | |||
53 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | 53 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set |
54 | # CONFIG_FW_LOADER is not set | 54 | # CONFIG_FW_LOADER is not set |
55 | CONFIG_MTD=y | 55 | CONFIG_MTD=y |
56 | CONFIG_MTD_PARTITIONS=y | ||
57 | CONFIG_MTD_CMDLINE_PARTS=y | 56 | CONFIG_MTD_CMDLINE_PARTS=y |
58 | CONFIG_MTD_CHAR=y | 57 | CONFIG_MTD_CHAR=y |
59 | CONFIG_MTD_BLOCK=y | 58 | CONFIG_MTD_BLOCK=y |
diff --git a/arch/avr32/configs/atstk1003_defconfig b/arch/avr32/configs/atstk1003_defconfig index c1cd726f9012..f8ff3a3baad4 100644 --- a/arch/avr32/configs/atstk1003_defconfig +++ b/arch/avr32/configs/atstk1003_defconfig | |||
@@ -42,7 +42,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | |||
42 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | 42 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set |
43 | # CONFIG_FW_LOADER is not set | 43 | # CONFIG_FW_LOADER is not set |
44 | CONFIG_MTD=y | 44 | CONFIG_MTD=y |
45 | CONFIG_MTD_PARTITIONS=y | ||
46 | CONFIG_MTD_CMDLINE_PARTS=y | 45 | CONFIG_MTD_CMDLINE_PARTS=y |
47 | CONFIG_MTD_CHAR=y | 46 | CONFIG_MTD_CHAR=y |
48 | CONFIG_MTD_BLOCK=y | 47 | CONFIG_MTD_BLOCK=y |
diff --git a/arch/avr32/configs/atstk1004_defconfig b/arch/avr32/configs/atstk1004_defconfig index 754ae56b2767..992228e54e38 100644 --- a/arch/avr32/configs/atstk1004_defconfig +++ b/arch/avr32/configs/atstk1004_defconfig | |||
@@ -42,7 +42,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | |||
42 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | 42 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set |
43 | # CONFIG_FW_LOADER is not set | 43 | # CONFIG_FW_LOADER is not set |
44 | CONFIG_MTD=y | 44 | CONFIG_MTD=y |
45 | CONFIG_MTD_PARTITIONS=y | ||
46 | CONFIG_MTD_CMDLINE_PARTS=y | 45 | CONFIG_MTD_CMDLINE_PARTS=y |
47 | CONFIG_MTD_CHAR=y | 46 | CONFIG_MTD_CHAR=y |
48 | CONFIG_MTD_BLOCK=y | 47 | CONFIG_MTD_BLOCK=y |
diff --git a/arch/avr32/configs/atstk1006_defconfig b/arch/avr32/configs/atstk1006_defconfig index 58589d8cc0ac..b8e698b0d1fa 100644 --- a/arch/avr32/configs/atstk1006_defconfig +++ b/arch/avr32/configs/atstk1006_defconfig | |||
@@ -54,7 +54,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | |||
54 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | 54 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set |
55 | # CONFIG_FW_LOADER is not set | 55 | # CONFIG_FW_LOADER is not set |
56 | CONFIG_MTD=y | 56 | CONFIG_MTD=y |
57 | CONFIG_MTD_PARTITIONS=y | ||
58 | CONFIG_MTD_CMDLINE_PARTS=y | 57 | CONFIG_MTD_CMDLINE_PARTS=y |
59 | CONFIG_MTD_CHAR=y | 58 | CONFIG_MTD_CHAR=y |
60 | CONFIG_MTD_BLOCK=y | 59 | CONFIG_MTD_BLOCK=y |
diff --git a/arch/avr32/configs/favr-32_defconfig b/arch/avr32/configs/favr-32_defconfig index c90fbf6d35bc..07bed3f7eb5e 100644 --- a/arch/avr32/configs/favr-32_defconfig +++ b/arch/avr32/configs/favr-32_defconfig | |||
@@ -58,7 +58,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | |||
58 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | 58 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set |
59 | # CONFIG_FW_LOADER is not set | 59 | # CONFIG_FW_LOADER is not set |
60 | CONFIG_MTD=y | 60 | CONFIG_MTD=y |
61 | CONFIG_MTD_PARTITIONS=y | ||
62 | CONFIG_MTD_CMDLINE_PARTS=y | 61 | CONFIG_MTD_CMDLINE_PARTS=y |
63 | CONFIG_MTD_CHAR=y | 62 | CONFIG_MTD_CHAR=y |
64 | CONFIG_MTD_BLOCK=y | 63 | CONFIG_MTD_BLOCK=y |
diff --git a/arch/avr32/configs/hammerhead_defconfig b/arch/avr32/configs/hammerhead_defconfig index ba7c31e269cb..18db853386c8 100644 --- a/arch/avr32/configs/hammerhead_defconfig +++ b/arch/avr32/configs/hammerhead_defconfig | |||
@@ -58,7 +58,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | |||
58 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | 58 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set |
59 | # CONFIG_FW_LOADER is not set | 59 | # CONFIG_FW_LOADER is not set |
60 | CONFIG_MTD=y | 60 | CONFIG_MTD=y |
61 | CONFIG_MTD_PARTITIONS=y | ||
62 | CONFIG_MTD_CMDLINE_PARTS=y | 61 | CONFIG_MTD_CMDLINE_PARTS=y |
63 | CONFIG_MTD_CHAR=y | 62 | CONFIG_MTD_CHAR=y |
64 | CONFIG_MTD_BLOCK=y | 63 | CONFIG_MTD_BLOCK=y |
diff --git a/arch/avr32/configs/merisc_defconfig b/arch/avr32/configs/merisc_defconfig index 65de4431108c..91df6b2986be 100644 --- a/arch/avr32/configs/merisc_defconfig +++ b/arch/avr32/configs/merisc_defconfig | |||
@@ -46,7 +46,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | |||
46 | # CONFIG_FW_LOADER is not set | 46 | # CONFIG_FW_LOADER is not set |
47 | CONFIG_MTD=y | 47 | CONFIG_MTD=y |
48 | CONFIG_MTD_CONCAT=y | 48 | CONFIG_MTD_CONCAT=y |
49 | CONFIG_MTD_PARTITIONS=y | ||
50 | CONFIG_MTD_CHAR=y | 49 | CONFIG_MTD_CHAR=y |
51 | CONFIG_MTD_BLOCK=y | 50 | CONFIG_MTD_BLOCK=y |
52 | CONFIG_MTD_CFI=y | 51 | CONFIG_MTD_CFI=y |
diff --git a/arch/avr32/configs/mimc200_defconfig b/arch/avr32/configs/mimc200_defconfig index 0a8bfdc420e0..d630e089dd32 100644 --- a/arch/avr32/configs/mimc200_defconfig +++ b/arch/avr32/configs/mimc200_defconfig | |||
@@ -49,7 +49,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | |||
49 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | 49 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set |
50 | # CONFIG_FW_LOADER is not set | 50 | # CONFIG_FW_LOADER is not set |
51 | CONFIG_MTD=y | 51 | CONFIG_MTD=y |
52 | CONFIG_MTD_PARTITIONS=y | ||
53 | CONFIG_MTD_CMDLINE_PARTS=y | 52 | CONFIG_MTD_CMDLINE_PARTS=y |
54 | CONFIG_MTD_CHAR=y | 53 | CONFIG_MTD_CHAR=y |
55 | CONFIG_MTD_BLOCK=y | 54 | CONFIG_MTD_BLOCK=y |
diff --git a/arch/avr32/include/asm/barrier.h b/arch/avr32/include/asm/barrier.h index 0961275373db..715100790fd0 100644 --- a/arch/avr32/include/asm/barrier.h +++ b/arch/avr32/include/asm/barrier.h | |||
@@ -8,22 +8,15 @@ | |||
8 | #ifndef __ASM_AVR32_BARRIER_H | 8 | #ifndef __ASM_AVR32_BARRIER_H |
9 | #define __ASM_AVR32_BARRIER_H | 9 | #define __ASM_AVR32_BARRIER_H |
10 | 10 | ||
11 | #define nop() asm volatile("nop") | 11 | /* |
12 | 12 | * Weirdest thing ever.. no full barrier, but it has a write barrier! | |
13 | #define mb() asm volatile("" : : : "memory") | 13 | */ |
14 | #define rmb() mb() | 14 | #define wmb() asm volatile("sync 0" : : : "memory") |
15 | #define wmb() asm volatile("sync 0" : : : "memory") | ||
16 | #define read_barrier_depends() do { } while(0) | ||
17 | #define set_mb(var, value) do { var = value; mb(); } while(0) | ||
18 | 15 | ||
19 | #ifdef CONFIG_SMP | 16 | #ifdef CONFIG_SMP |
20 | # error "The AVR32 port does not support SMP" | 17 | # error "The AVR32 port does not support SMP" |
21 | #else | ||
22 | # define smp_mb() barrier() | ||
23 | # define smp_rmb() barrier() | ||
24 | # define smp_wmb() barrier() | ||
25 | # define smp_read_barrier_depends() do { } while(0) | ||
26 | #endif | 18 | #endif |
27 | 19 | ||
20 | #include <asm-generic/barrier.h> | ||
28 | 21 | ||
29 | #endif /* __ASM_AVR32_BARRIER_H */ | 22 | #endif /* __ASM_AVR32_BARRIER_H */ |
diff --git a/arch/avr32/kernel/time.c b/arch/avr32/kernel/time.c index 12f828ad5058..d0f771be9e96 100644 --- a/arch/avr32/kernel/time.c +++ b/arch/avr32/kernel/time.c | |||
@@ -59,7 +59,7 @@ static irqreturn_t timer_interrupt(int irq, void *dev_id) | |||
59 | static struct irqaction timer_irqaction = { | 59 | static struct irqaction timer_irqaction = { |
60 | .handler = timer_interrupt, | 60 | .handler = timer_interrupt, |
61 | /* Oprofile uses the same irq as the timer, so allow it to be shared */ | 61 | /* Oprofile uses the same irq as the timer, so allow it to be shared */ |
62 | .flags = IRQF_TIMER | IRQF_DISABLED | IRQF_SHARED, | 62 | .flags = IRQF_TIMER | IRQF_SHARED, |
63 | .name = "avr32_comparator", | 63 | .name = "avr32_comparator", |
64 | }; | 64 | }; |
65 | 65 | ||
diff --git a/arch/avr32/mach-at32ap/pm.c b/arch/avr32/mach-at32ap/pm.c index 32d680eb6f48..db190842b80c 100644 --- a/arch/avr32/mach-at32ap/pm.c +++ b/arch/avr32/mach-at32ap/pm.c | |||
@@ -181,7 +181,7 @@ static const struct platform_suspend_ops avr32_pm_ops = { | |||
181 | .enter = avr32_pm_enter, | 181 | .enter = avr32_pm_enter, |
182 | }; | 182 | }; |
183 | 183 | ||
184 | static unsigned long avr32_pm_offset(void *symbol) | 184 | static unsigned long __init avr32_pm_offset(void *symbol) |
185 | { | 185 | { |
186 | extern u8 pm_exception[]; | 186 | extern u8 pm_exception[]; |
187 | 187 | ||
diff --git a/arch/blackfin/include/asm/barrier.h b/arch/blackfin/include/asm/barrier.h index ebb189507dd7..19283a16ac08 100644 --- a/arch/blackfin/include/asm/barrier.h +++ b/arch/blackfin/include/asm/barrier.h | |||
@@ -23,26 +23,10 @@ | |||
23 | # define rmb() do { barrier(); smp_check_barrier(); } while (0) | 23 | # define rmb() do { barrier(); smp_check_barrier(); } while (0) |
24 | # define wmb() do { barrier(); smp_mark_barrier(); } while (0) | 24 | # define wmb() do { barrier(); smp_mark_barrier(); } while (0) |
25 | # define read_barrier_depends() do { barrier(); smp_check_barrier(); } while (0) | 25 | # define read_barrier_depends() do { barrier(); smp_check_barrier(); } while (0) |
26 | #else | ||
27 | # define mb() barrier() | ||
28 | # define rmb() barrier() | ||
29 | # define wmb() barrier() | ||
30 | # define read_barrier_depends() do { } while (0) | ||
31 | #endif | 26 | #endif |
32 | 27 | ||
33 | #else /* !CONFIG_SMP */ | ||
34 | |||
35 | #define mb() barrier() | ||
36 | #define rmb() barrier() | ||
37 | #define wmb() barrier() | ||
38 | #define read_barrier_depends() do { } while (0) | ||
39 | |||
40 | #endif /* !CONFIG_SMP */ | 28 | #endif /* !CONFIG_SMP */ |
41 | 29 | ||
42 | #define smp_mb() mb() | 30 | #include <asm-generic/barrier.h> |
43 | #define smp_rmb() rmb() | ||
44 | #define smp_wmb() wmb() | ||
45 | #define set_mb(var, value) do { var = value; mb(); } while (0) | ||
46 | #define smp_read_barrier_depends() read_barrier_depends() | ||
47 | 31 | ||
48 | #endif /* _BLACKFIN_BARRIER_H */ | 32 | #endif /* _BLACKFIN_BARRIER_H */ |
diff --git a/arch/cris/include/asm/Kbuild b/arch/cris/include/asm/Kbuild index b06caf649a95..199b1a9dab89 100644 --- a/arch/cris/include/asm/Kbuild +++ b/arch/cris/include/asm/Kbuild | |||
@@ -3,6 +3,7 @@ header-y += arch-v10/ | |||
3 | header-y += arch-v32/ | 3 | header-y += arch-v32/ |
4 | 4 | ||
5 | 5 | ||
6 | generic-y += barrier.h | ||
6 | generic-y += clkdev.h | 7 | generic-y += clkdev.h |
7 | generic-y += exec.h | 8 | generic-y += exec.h |
8 | generic-y += kvm_para.h | 9 | generic-y += kvm_para.h |
diff --git a/arch/cris/include/asm/barrier.h b/arch/cris/include/asm/barrier.h deleted file mode 100644 index 198ad7fa6b25..000000000000 --- a/arch/cris/include/asm/barrier.h +++ /dev/null | |||
@@ -1,25 +0,0 @@ | |||
1 | #ifndef __ASM_CRIS_BARRIER_H | ||
2 | #define __ASM_CRIS_BARRIER_H | ||
3 | |||
4 | #define nop() __asm__ __volatile__ ("nop"); | ||
5 | |||
6 | #define barrier() __asm__ __volatile__("": : :"memory") | ||
7 | #define mb() barrier() | ||
8 | #define rmb() mb() | ||
9 | #define wmb() mb() | ||
10 | #define read_barrier_depends() do { } while(0) | ||
11 | #define set_mb(var, value) do { var = value; mb(); } while (0) | ||
12 | |||
13 | #ifdef CONFIG_SMP | ||
14 | #define smp_mb() mb() | ||
15 | #define smp_rmb() rmb() | ||
16 | #define smp_wmb() wmb() | ||
17 | #define smp_read_barrier_depends() read_barrier_depends() | ||
18 | #else | ||
19 | #define smp_mb() barrier() | ||
20 | #define smp_rmb() barrier() | ||
21 | #define smp_wmb() barrier() | ||
22 | #define smp_read_barrier_depends() do { } while(0) | ||
23 | #endif | ||
24 | |||
25 | #endif /* __ASM_CRIS_BARRIER_H */ | ||
diff --git a/arch/frv/include/asm/barrier.h b/arch/frv/include/asm/barrier.h index 06776ad9f5e9..abbef470154c 100644 --- a/arch/frv/include/asm/barrier.h +++ b/arch/frv/include/asm/barrier.h | |||
@@ -17,13 +17,7 @@ | |||
17 | #define mb() asm volatile ("membar" : : :"memory") | 17 | #define mb() asm volatile ("membar" : : :"memory") |
18 | #define rmb() asm volatile ("membar" : : :"memory") | 18 | #define rmb() asm volatile ("membar" : : :"memory") |
19 | #define wmb() asm volatile ("membar" : : :"memory") | 19 | #define wmb() asm volatile ("membar" : : :"memory") |
20 | #define read_barrier_depends() do { } while (0) | ||
21 | 20 | ||
22 | #define smp_mb() barrier() | 21 | #include <asm-generic/barrier.h> |
23 | #define smp_rmb() barrier() | ||
24 | #define smp_wmb() barrier() | ||
25 | #define smp_read_barrier_depends() do {} while(0) | ||
26 | #define set_mb(var, value) \ | ||
27 | do { var = (value); barrier(); } while (0) | ||
28 | 22 | ||
29 | #endif /* _ASM_BARRIER_H */ | 23 | #endif /* _ASM_BARRIER_H */ |
diff --git a/arch/hexagon/include/asm/Kbuild b/arch/hexagon/include/asm/Kbuild index 67c3450309b7..ada843c701ef 100644 --- a/arch/hexagon/include/asm/Kbuild +++ b/arch/hexagon/include/asm/Kbuild | |||
@@ -2,6 +2,7 @@ | |||
2 | header-y += ucontext.h | 2 | header-y += ucontext.h |
3 | 3 | ||
4 | generic-y += auxvec.h | 4 | generic-y += auxvec.h |
5 | generic-y += barrier.h | ||
5 | generic-y += bug.h | 6 | generic-y += bug.h |
6 | generic-y += bugs.h | 7 | generic-y += bugs.h |
7 | generic-y += clkdev.h | 8 | generic-y += clkdev.h |
diff --git a/arch/hexagon/include/asm/atomic.h b/arch/hexagon/include/asm/atomic.h index 8a64ff2337f6..7aae4cb2a29a 100644 --- a/arch/hexagon/include/asm/atomic.h +++ b/arch/hexagon/include/asm/atomic.h | |||
@@ -160,8 +160,12 @@ static inline int __atomic_add_unless(atomic_t *v, int a, int u) | |||
160 | #define atomic_sub_and_test(i, v) (atomic_sub_return(i, (v)) == 0) | 160 | #define atomic_sub_and_test(i, v) (atomic_sub_return(i, (v)) == 0) |
161 | #define atomic_add_negative(i, v) (atomic_add_return(i, (v)) < 0) | 161 | #define atomic_add_negative(i, v) (atomic_add_return(i, (v)) < 0) |
162 | 162 | ||
163 | |||
164 | #define atomic_inc_return(v) (atomic_add_return(1, v)) | 163 | #define atomic_inc_return(v) (atomic_add_return(1, v)) |
165 | #define atomic_dec_return(v) (atomic_sub_return(1, v)) | 164 | #define atomic_dec_return(v) (atomic_sub_return(1, v)) |
166 | 165 | ||
166 | #define smp_mb__before_atomic_dec() barrier() | ||
167 | #define smp_mb__after_atomic_dec() barrier() | ||
168 | #define smp_mb__before_atomic_inc() barrier() | ||
169 | #define smp_mb__after_atomic_inc() barrier() | ||
170 | |||
167 | #endif | 171 | #endif |
diff --git a/arch/hexagon/include/asm/barrier.h b/arch/hexagon/include/asm/barrier.h index 1041a8e70ce8..4e863daea25b 100644 --- a/arch/hexagon/include/asm/barrier.h +++ b/arch/hexagon/include/asm/barrier.h | |||
@@ -29,10 +29,6 @@ | |||
29 | #define smp_read_barrier_depends() barrier() | 29 | #define smp_read_barrier_depends() barrier() |
30 | #define smp_wmb() barrier() | 30 | #define smp_wmb() barrier() |
31 | #define smp_mb() barrier() | 31 | #define smp_mb() barrier() |
32 | #define smp_mb__before_atomic_dec() barrier() | ||
33 | #define smp_mb__after_atomic_dec() barrier() | ||
34 | #define smp_mb__before_atomic_inc() barrier() | ||
35 | #define smp_mb__after_atomic_inc() barrier() | ||
36 | 32 | ||
37 | /* Set a value and use a memory barrier. Used by the scheduler somewhere. */ | 33 | /* Set a value and use a memory barrier. Used by the scheduler somewhere. */ |
38 | #define set_mb(var, value) \ | 34 | #define set_mb(var, value) \ |
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index 4e4119b0e691..a8c3a11dc5ab 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig | |||
@@ -147,9 +147,6 @@ config PARAVIRT | |||
147 | over full virtualization. However, when run without a hypervisor | 147 | over full virtualization. However, when run without a hypervisor |
148 | the kernel is theoretically slower and slightly larger. | 148 | the kernel is theoretically slower and slightly larger. |
149 | 149 | ||
150 | |||
151 | source "arch/ia64/xen/Kconfig" | ||
152 | |||
153 | endif | 150 | endif |
154 | 151 | ||
155 | choice | 152 | choice |
@@ -175,7 +172,6 @@ config IA64_GENERIC | |||
175 | SGI-SN2 For SGI Altix systems | 172 | SGI-SN2 For SGI Altix systems |
176 | SGI-UV For SGI UV systems | 173 | SGI-UV For SGI UV systems |
177 | Ski-simulator For the HP simulator <http://www.hpl.hp.com/research/linux/ski/> | 174 | Ski-simulator For the HP simulator <http://www.hpl.hp.com/research/linux/ski/> |
178 | Xen-domU For xen domU system | ||
179 | 175 | ||
180 | If you don't know what to do, choose "generic". | 176 | If you don't know what to do, choose "generic". |
181 | 177 | ||
@@ -231,14 +227,6 @@ config IA64_HP_SIM | |||
231 | bool "Ski-simulator" | 227 | bool "Ski-simulator" |
232 | select SWIOTLB | 228 | select SWIOTLB |
233 | 229 | ||
234 | config IA64_XEN_GUEST | ||
235 | bool "Xen guest" | ||
236 | select SWIOTLB | ||
237 | depends on XEN | ||
238 | help | ||
239 | Build a kernel that runs on Xen guest domain. At this moment only | ||
240 | 16KB page size in supported. | ||
241 | |||
242 | endchoice | 230 | endchoice |
243 | 231 | ||
244 | choice | 232 | choice |
diff --git a/arch/ia64/Makefile b/arch/ia64/Makefile index be7bfa12b705..f37238f45bcd 100644 --- a/arch/ia64/Makefile +++ b/arch/ia64/Makefile | |||
@@ -51,11 +51,9 @@ core-$(CONFIG_IA64_DIG_VTD) += arch/ia64/dig/ | |||
51 | core-$(CONFIG_IA64_GENERIC) += arch/ia64/dig/ | 51 | core-$(CONFIG_IA64_GENERIC) += arch/ia64/dig/ |
52 | core-$(CONFIG_IA64_HP_ZX1) += arch/ia64/dig/ | 52 | core-$(CONFIG_IA64_HP_ZX1) += arch/ia64/dig/ |
53 | core-$(CONFIG_IA64_HP_ZX1_SWIOTLB) += arch/ia64/dig/ | 53 | core-$(CONFIG_IA64_HP_ZX1_SWIOTLB) += arch/ia64/dig/ |
54 | core-$(CONFIG_IA64_XEN_GUEST) += arch/ia64/dig/ | ||
55 | core-$(CONFIG_IA64_SGI_SN2) += arch/ia64/sn/ | 54 | core-$(CONFIG_IA64_SGI_SN2) += arch/ia64/sn/ |
56 | core-$(CONFIG_IA64_SGI_UV) += arch/ia64/uv/ | 55 | core-$(CONFIG_IA64_SGI_UV) += arch/ia64/uv/ |
57 | core-$(CONFIG_KVM) += arch/ia64/kvm/ | 56 | core-$(CONFIG_KVM) += arch/ia64/kvm/ |
58 | core-$(CONFIG_XEN) += arch/ia64/xen/ | ||
59 | 57 | ||
60 | drivers-$(CONFIG_PCI) += arch/ia64/pci/ | 58 | drivers-$(CONFIG_PCI) += arch/ia64/pci/ |
61 | drivers-$(CONFIG_IA64_HP_SIM) += arch/ia64/hp/sim/ | 59 | drivers-$(CONFIG_IA64_HP_SIM) += arch/ia64/hp/sim/ |
diff --git a/arch/ia64/configs/xen_domu_defconfig b/arch/ia64/configs/xen_domu_defconfig deleted file mode 100644 index b025acfde5c1..000000000000 --- a/arch/ia64/configs/xen_domu_defconfig +++ /dev/null | |||
@@ -1,199 +0,0 @@ | |||
1 | CONFIG_EXPERIMENTAL=y | ||
2 | CONFIG_SYSVIPC=y | ||
3 | CONFIG_POSIX_MQUEUE=y | ||
4 | CONFIG_IKCONFIG=y | ||
5 | CONFIG_IKCONFIG_PROC=y | ||
6 | CONFIG_LOG_BUF_SHIFT=20 | ||
7 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
8 | CONFIG_BLK_DEV_INITRD=y | ||
9 | CONFIG_KALLSYMS_ALL=y | ||
10 | CONFIG_MODULES=y | ||
11 | CONFIG_MODULE_UNLOAD=y | ||
12 | CONFIG_MODVERSIONS=y | ||
13 | CONFIG_MODULE_SRCVERSION_ALL=y | ||
14 | # CONFIG_BLK_DEV_BSG is not set | ||
15 | CONFIG_PARAVIRT_GUEST=y | ||
16 | CONFIG_IA64_XEN_GUEST=y | ||
17 | CONFIG_MCKINLEY=y | ||
18 | CONFIG_IA64_CYCLONE=y | ||
19 | CONFIG_SMP=y | ||
20 | CONFIG_NR_CPUS=16 | ||
21 | CONFIG_HOTPLUG_CPU=y | ||
22 | CONFIG_PERMIT_BSP_REMOVE=y | ||
23 | CONFIG_FORCE_CPEI_RETARGET=y | ||
24 | CONFIG_IA64_MCA_RECOVERY=y | ||
25 | CONFIG_PERFMON=y | ||
26 | CONFIG_IA64_PALINFO=y | ||
27 | CONFIG_KEXEC=y | ||
28 | CONFIG_EFI_VARS=y | ||
29 | CONFIG_BINFMT_MISC=m | ||
30 | CONFIG_ACPI_PROCFS=y | ||
31 | CONFIG_ACPI_BUTTON=m | ||
32 | CONFIG_ACPI_FAN=m | ||
33 | CONFIG_ACPI_PROCESSOR=m | ||
34 | CONFIG_ACPI_CONTAINER=m | ||
35 | CONFIG_HOTPLUG_PCI=y | ||
36 | CONFIG_HOTPLUG_PCI_ACPI=m | ||
37 | CONFIG_PACKET=y | ||
38 | CONFIG_UNIX=y | ||
39 | CONFIG_INET=y | ||
40 | CONFIG_IP_MULTICAST=y | ||
41 | CONFIG_ARPD=y | ||
42 | CONFIG_SYN_COOKIES=y | ||
43 | # CONFIG_INET_LRO is not set | ||
44 | # CONFIG_IPV6 is not set | ||
45 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
46 | CONFIG_BLK_DEV_LOOP=m | ||
47 | CONFIG_BLK_DEV_CRYPTOLOOP=m | ||
48 | CONFIG_BLK_DEV_NBD=m | ||
49 | CONFIG_BLK_DEV_RAM=y | ||
50 | CONFIG_IDE=y | ||
51 | CONFIG_BLK_DEV_IDECD=y | ||
52 | CONFIG_BLK_DEV_GENERIC=y | ||
53 | CONFIG_BLK_DEV_CMD64X=y | ||
54 | CONFIG_BLK_DEV_PIIX=y | ||
55 | CONFIG_SCSI=y | ||
56 | CONFIG_BLK_DEV_SD=y | ||
57 | CONFIG_CHR_DEV_ST=m | ||
58 | CONFIG_BLK_DEV_SR=m | ||
59 | CONFIG_CHR_DEV_SG=m | ||
60 | CONFIG_SCSI_SYM53C8XX_2=y | ||
61 | CONFIG_SCSI_QLOGIC_1280=y | ||
62 | CONFIG_MD=y | ||
63 | CONFIG_BLK_DEV_MD=m | ||
64 | CONFIG_MD_LINEAR=m | ||
65 | CONFIG_MD_RAID0=m | ||
66 | CONFIG_MD_RAID1=m | ||
67 | CONFIG_MD_MULTIPATH=m | ||
68 | CONFIG_BLK_DEV_DM=m | ||
69 | CONFIG_DM_CRYPT=m | ||
70 | CONFIG_DM_SNAPSHOT=m | ||
71 | CONFIG_DM_MIRROR=m | ||
72 | CONFIG_DM_ZERO=m | ||
73 | CONFIG_FUSION=y | ||
74 | CONFIG_FUSION_SPI=y | ||
75 | CONFIG_FUSION_FC=y | ||
76 | CONFIG_FUSION_CTL=y | ||
77 | CONFIG_NETDEVICES=y | ||
78 | CONFIG_DUMMY=m | ||
79 | CONFIG_NET_ETHERNET=y | ||
80 | CONFIG_NET_TULIP=y | ||
81 | CONFIG_TULIP=m | ||
82 | CONFIG_NET_PCI=y | ||
83 | CONFIG_NET_VENDOR_INTEL=y | ||
84 | CONFIG_E100=m | ||
85 | CONFIG_E1000=y | ||
86 | CONFIG_TIGON3=y | ||
87 | CONFIG_NETCONSOLE=y | ||
88 | # CONFIG_SERIO_SERPORT is not set | ||
89 | CONFIG_GAMEPORT=m | ||
90 | CONFIG_SERIAL_NONSTANDARD=y | ||
91 | CONFIG_SERIAL_8250=y | ||
92 | CONFIG_SERIAL_8250_CONSOLE=y | ||
93 | CONFIG_SERIAL_8250_NR_UARTS=6 | ||
94 | CONFIG_SERIAL_8250_EXTENDED=y | ||
95 | CONFIG_SERIAL_8250_SHARE_IRQ=y | ||
96 | # CONFIG_HW_RANDOM is not set | ||
97 | CONFIG_EFI_RTC=y | ||
98 | CONFIG_RAW_DRIVER=m | ||
99 | CONFIG_HPET=y | ||
100 | CONFIG_AGP=m | ||
101 | CONFIG_DRM=m | ||
102 | CONFIG_DRM_TDFX=m | ||
103 | CONFIG_DRM_R128=m | ||
104 | CONFIG_DRM_RADEON=m | ||
105 | CONFIG_DRM_MGA=m | ||
106 | CONFIG_DRM_SIS=m | ||
107 | CONFIG_HID_GYRATION=y | ||
108 | CONFIG_HID_NTRIG=y | ||
109 | CONFIG_HID_PANTHERLORD=y | ||
110 | CONFIG_HID_PETALYNX=y | ||
111 | CONFIG_HID_SAMSUNG=y | ||
112 | CONFIG_HID_SONY=y | ||
113 | CONFIG_HID_SUNPLUS=y | ||
114 | CONFIG_HID_TOPSEED=y | ||
115 | CONFIG_USB=y | ||
116 | CONFIG_USB_DEVICEFS=y | ||
117 | CONFIG_USB_EHCI_HCD=m | ||
118 | CONFIG_USB_OHCI_HCD=m | ||
119 | CONFIG_USB_UHCI_HCD=y | ||
120 | CONFIG_USB_STORAGE=m | ||
121 | CONFIG_EXT2_FS=y | ||
122 | CONFIG_EXT2_FS_XATTR=y | ||
123 | CONFIG_EXT2_FS_POSIX_ACL=y | ||
124 | CONFIG_EXT2_FS_SECURITY=y | ||
125 | CONFIG_EXT3_FS=y | ||
126 | CONFIG_EXT3_FS_POSIX_ACL=y | ||
127 | CONFIG_EXT3_FS_SECURITY=y | ||
128 | CONFIG_REISERFS_FS=y | ||
129 | CONFIG_REISERFS_FS_XATTR=y | ||
130 | CONFIG_REISERFS_FS_POSIX_ACL=y | ||
131 | CONFIG_REISERFS_FS_SECURITY=y | ||
132 | CONFIG_XFS_FS=y | ||
133 | CONFIG_AUTOFS_FS=y | ||
134 | CONFIG_AUTOFS4_FS=y | ||
135 | CONFIG_ISO9660_FS=m | ||
136 | CONFIG_JOLIET=y | ||
137 | CONFIG_UDF_FS=m | ||
138 | CONFIG_VFAT_FS=y | ||
139 | CONFIG_NTFS_FS=m | ||
140 | CONFIG_PROC_KCORE=y | ||
141 | CONFIG_TMPFS=y | ||
142 | CONFIG_HUGETLBFS=y | ||
143 | CONFIG_NFS_FS=m | ||
144 | CONFIG_NFS_V3=y | ||
145 | CONFIG_NFS_V4=y | ||
146 | CONFIG_NFSD=m | ||
147 | CONFIG_NFSD_V4=y | ||
148 | CONFIG_SMB_FS=m | ||
149 | CONFIG_SMB_NLS_DEFAULT=y | ||
150 | CONFIG_CIFS=m | ||
151 | CONFIG_PARTITION_ADVANCED=y | ||
152 | CONFIG_SGI_PARTITION=y | ||
153 | CONFIG_EFI_PARTITION=y | ||
154 | CONFIG_NLS_CODEPAGE_437=y | ||
155 | CONFIG_NLS_CODEPAGE_737=m | ||
156 | CONFIG_NLS_CODEPAGE_775=m | ||
157 | CONFIG_NLS_CODEPAGE_850=m | ||
158 | CONFIG_NLS_CODEPAGE_852=m | ||
159 | CONFIG_NLS_CODEPAGE_855=m | ||
160 | CONFIG_NLS_CODEPAGE_857=m | ||
161 | CONFIG_NLS_CODEPAGE_860=m | ||
162 | CONFIG_NLS_CODEPAGE_861=m | ||
163 | CONFIG_NLS_CODEPAGE_862=m | ||
164 | CONFIG_NLS_CODEPAGE_863=m | ||
165 | CONFIG_NLS_CODEPAGE_864=m | ||
166 | CONFIG_NLS_CODEPAGE_865=m | ||
167 | CONFIG_NLS_CODEPAGE_866=m | ||
168 | CONFIG_NLS_CODEPAGE_869=m | ||
169 | CONFIG_NLS_CODEPAGE_936=m | ||
170 | CONFIG_NLS_CODEPAGE_950=m | ||
171 | CONFIG_NLS_CODEPAGE_932=m | ||
172 | CONFIG_NLS_CODEPAGE_949=m | ||
173 | CONFIG_NLS_CODEPAGE_874=m | ||
174 | CONFIG_NLS_ISO8859_8=m | ||
175 | CONFIG_NLS_CODEPAGE_1250=m | ||
176 | CONFIG_NLS_CODEPAGE_1251=m | ||
177 | CONFIG_NLS_ISO8859_1=y | ||
178 | CONFIG_NLS_ISO8859_2=m | ||
179 | CONFIG_NLS_ISO8859_3=m | ||
180 | CONFIG_NLS_ISO8859_4=m | ||
181 | CONFIG_NLS_ISO8859_5=m | ||
182 | CONFIG_NLS_ISO8859_6=m | ||
183 | CONFIG_NLS_ISO8859_7=m | ||
184 | CONFIG_NLS_ISO8859_9=m | ||
185 | CONFIG_NLS_ISO8859_13=m | ||
186 | CONFIG_NLS_ISO8859_14=m | ||
187 | CONFIG_NLS_ISO8859_15=m | ||
188 | CONFIG_NLS_KOI8_R=m | ||
189 | CONFIG_NLS_KOI8_U=m | ||
190 | CONFIG_NLS_UTF8=m | ||
191 | CONFIG_MAGIC_SYSRQ=y | ||
192 | CONFIG_DEBUG_KERNEL=y | ||
193 | CONFIG_DEBUG_MUTEXES=y | ||
194 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
195 | CONFIG_IA64_GRANULE_16MB=y | ||
196 | CONFIG_CRYPTO_ECB=m | ||
197 | CONFIG_CRYPTO_PCBC=m | ||
198 | CONFIG_CRYPTO_MD5=y | ||
199 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | ||
diff --git a/arch/ia64/include/asm/acpi.h b/arch/ia64/include/asm/acpi.h index faa1bf0da815..d651102a4d45 100644 --- a/arch/ia64/include/asm/acpi.h +++ b/arch/ia64/include/asm/acpi.h | |||
@@ -111,8 +111,6 @@ static inline const char *acpi_get_sysname (void) | |||
111 | return "uv"; | 111 | return "uv"; |
112 | # elif defined (CONFIG_IA64_DIG) | 112 | # elif defined (CONFIG_IA64_DIG) |
113 | return "dig"; | 113 | return "dig"; |
114 | # elif defined (CONFIG_IA64_XEN_GUEST) | ||
115 | return "xen"; | ||
116 | # elif defined(CONFIG_IA64_DIG_VTD) | 114 | # elif defined(CONFIG_IA64_DIG_VTD) |
117 | return "dig_vtd"; | 115 | return "dig_vtd"; |
118 | # else | 116 | # else |
diff --git a/arch/ia64/include/asm/barrier.h b/arch/ia64/include/asm/barrier.h index 60576e06b6fb..d0a69aa35e27 100644 --- a/arch/ia64/include/asm/barrier.h +++ b/arch/ia64/include/asm/barrier.h | |||
@@ -45,14 +45,37 @@ | |||
45 | # define smp_rmb() rmb() | 45 | # define smp_rmb() rmb() |
46 | # define smp_wmb() wmb() | 46 | # define smp_wmb() wmb() |
47 | # define smp_read_barrier_depends() read_barrier_depends() | 47 | # define smp_read_barrier_depends() read_barrier_depends() |
48 | |||
48 | #else | 49 | #else |
50 | |||
49 | # define smp_mb() barrier() | 51 | # define smp_mb() barrier() |
50 | # define smp_rmb() barrier() | 52 | # define smp_rmb() barrier() |
51 | # define smp_wmb() barrier() | 53 | # define smp_wmb() barrier() |
52 | # define smp_read_barrier_depends() do { } while(0) | 54 | # define smp_read_barrier_depends() do { } while(0) |
55 | |||
53 | #endif | 56 | #endif |
54 | 57 | ||
55 | /* | 58 | /* |
59 | * IA64 GCC turns volatile stores into st.rel and volatile loads into ld.acq no | ||
60 | * need for asm trickery! | ||
61 | */ | ||
62 | |||
63 | #define smp_store_release(p, v) \ | ||
64 | do { \ | ||
65 | compiletime_assert_atomic_type(*p); \ | ||
66 | barrier(); \ | ||
67 | ACCESS_ONCE(*p) = (v); \ | ||
68 | } while (0) | ||
69 | |||
70 | #define smp_load_acquire(p) \ | ||
71 | ({ \ | ||
72 | typeof(*p) ___p1 = ACCESS_ONCE(*p); \ | ||
73 | compiletime_assert_atomic_type(*p); \ | ||
74 | barrier(); \ | ||
75 | ___p1; \ | ||
76 | }) | ||
77 | |||
78 | /* | ||
56 | * XXX check on this ---I suspect what Linus really wants here is | 79 | * XXX check on this ---I suspect what Linus really wants here is |
57 | * acquire vs release semantics but we can't discuss this stuff with | 80 | * acquire vs release semantics but we can't discuss this stuff with |
58 | * Linus just yet. Grrr... | 81 | * Linus just yet. Grrr... |
diff --git a/arch/ia64/include/asm/machvec.h b/arch/ia64/include/asm/machvec.h index 2d1ad4b11a85..9c39bdfc2da8 100644 --- a/arch/ia64/include/asm/machvec.h +++ b/arch/ia64/include/asm/machvec.h | |||
@@ -113,8 +113,6 @@ extern void machvec_tlb_migrate_finish (struct mm_struct *); | |||
113 | # include <asm/machvec_sn2.h> | 113 | # include <asm/machvec_sn2.h> |
114 | # elif defined (CONFIG_IA64_SGI_UV) | 114 | # elif defined (CONFIG_IA64_SGI_UV) |
115 | # include <asm/machvec_uv.h> | 115 | # include <asm/machvec_uv.h> |
116 | # elif defined (CONFIG_IA64_XEN_GUEST) | ||
117 | # include <asm/machvec_xen.h> | ||
118 | # elif defined (CONFIG_IA64_GENERIC) | 116 | # elif defined (CONFIG_IA64_GENERIC) |
119 | 117 | ||
120 | # ifdef MACHVEC_PLATFORM_HEADER | 118 | # ifdef MACHVEC_PLATFORM_HEADER |
diff --git a/arch/ia64/include/asm/machvec_xen.h b/arch/ia64/include/asm/machvec_xen.h deleted file mode 100644 index 8b8bd0eb3923..000000000000 --- a/arch/ia64/include/asm/machvec_xen.h +++ /dev/null | |||
@@ -1,22 +0,0 @@ | |||
1 | #ifndef _ASM_IA64_MACHVEC_XEN_h | ||
2 | #define _ASM_IA64_MACHVEC_XEN_h | ||
3 | |||
4 | extern ia64_mv_setup_t dig_setup; | ||
5 | extern ia64_mv_cpu_init_t xen_cpu_init; | ||
6 | extern ia64_mv_irq_init_t xen_irq_init; | ||
7 | extern ia64_mv_send_ipi_t xen_platform_send_ipi; | ||
8 | |||
9 | /* | ||
10 | * This stuff has dual use! | ||
11 | * | ||
12 | * For a generic kernel, the macros are used to initialize the | ||
13 | * platform's machvec structure. When compiling a non-generic kernel, | ||
14 | * the macros are used directly. | ||
15 | */ | ||
16 | #define ia64_platform_name "xen" | ||
17 | #define platform_setup dig_setup | ||
18 | #define platform_cpu_init xen_cpu_init | ||
19 | #define platform_irq_init xen_irq_init | ||
20 | #define platform_send_ipi xen_platform_send_ipi | ||
21 | |||
22 | #endif /* _ASM_IA64_MACHVEC_XEN_h */ | ||
diff --git a/arch/ia64/include/asm/meminit.h b/arch/ia64/include/asm/meminit.h index 61c7b1750b16..092f1c91b36c 100644 --- a/arch/ia64/include/asm/meminit.h +++ b/arch/ia64/include/asm/meminit.h | |||
@@ -18,7 +18,6 @@ | |||
18 | * - crash dumping code reserved region | 18 | * - crash dumping code reserved region |
19 | * - Kernel memory map built from EFI memory map | 19 | * - Kernel memory map built from EFI memory map |
20 | * - ELF core header | 20 | * - ELF core header |
21 | * - xen start info if CONFIG_XEN | ||
22 | * | 21 | * |
23 | * More could be added if necessary | 22 | * More could be added if necessary |
24 | */ | 23 | */ |
diff --git a/arch/ia64/include/asm/paravirt.h b/arch/ia64/include/asm/paravirt.h index b149b88ea795..b53518a98026 100644 --- a/arch/ia64/include/asm/paravirt.h +++ b/arch/ia64/include/asm/paravirt.h | |||
@@ -75,7 +75,6 @@ void *paravirt_get_gate_section(void); | |||
75 | #ifdef CONFIG_PARAVIRT_GUEST | 75 | #ifdef CONFIG_PARAVIRT_GUEST |
76 | 76 | ||
77 | #define PARAVIRT_HYPERVISOR_TYPE_DEFAULT 0 | 77 | #define PARAVIRT_HYPERVISOR_TYPE_DEFAULT 0 |
78 | #define PARAVIRT_HYPERVISOR_TYPE_XEN 1 | ||
79 | 78 | ||
80 | #ifndef __ASSEMBLY__ | 79 | #ifndef __ASSEMBLY__ |
81 | 80 | ||
diff --git a/arch/ia64/include/asm/pvclock-abi.h b/arch/ia64/include/asm/pvclock-abi.h index 44ef9ef8f5b3..42b233bedeb5 100644 --- a/arch/ia64/include/asm/pvclock-abi.h +++ b/arch/ia64/include/asm/pvclock-abi.h | |||
@@ -11,7 +11,7 @@ | |||
11 | /* | 11 | /* |
12 | * These structs MUST NOT be changed. | 12 | * These structs MUST NOT be changed. |
13 | * They are the ABI between hypervisor and guest OS. | 13 | * They are the ABI between hypervisor and guest OS. |
14 | * Both Xen and KVM are using this. | 14 | * KVM is using this. |
15 | * | 15 | * |
16 | * pvclock_vcpu_time_info holds the system time and the tsc timestamp | 16 | * pvclock_vcpu_time_info holds the system time and the tsc timestamp |
17 | * of the last update. So the guest can use the tsc delta to get a | 17 | * of the last update. So the guest can use the tsc delta to get a |
diff --git a/arch/ia64/include/asm/sync_bitops.h b/arch/ia64/include/asm/sync_bitops.h deleted file mode 100644 index 593c12eeb270..000000000000 --- a/arch/ia64/include/asm/sync_bitops.h +++ /dev/null | |||
@@ -1,51 +0,0 @@ | |||
1 | #ifndef _ASM_IA64_SYNC_BITOPS_H | ||
2 | #define _ASM_IA64_SYNC_BITOPS_H | ||
3 | |||
4 | /* | ||
5 | * Copyright (C) 2008 Isaku Yamahata <yamahata at valinux co jp> | ||
6 | * | ||
7 | * Based on synch_bitops.h which Dan Magenhaimer wrote. | ||
8 | * | ||
9 | * bit operations which provide guaranteed strong synchronisation | ||
10 | * when communicating with Xen or other guest OSes running on other CPUs. | ||
11 | */ | ||
12 | |||
13 | static inline void sync_set_bit(int nr, volatile void *addr) | ||
14 | { | ||
15 | set_bit(nr, addr); | ||
16 | } | ||
17 | |||
18 | static inline void sync_clear_bit(int nr, volatile void *addr) | ||
19 | { | ||
20 | clear_bit(nr, addr); | ||
21 | } | ||
22 | |||
23 | static inline void sync_change_bit(int nr, volatile void *addr) | ||
24 | { | ||
25 | change_bit(nr, addr); | ||
26 | } | ||
27 | |||
28 | static inline int sync_test_and_set_bit(int nr, volatile void *addr) | ||
29 | { | ||
30 | return test_and_set_bit(nr, addr); | ||
31 | } | ||
32 | |||
33 | static inline int sync_test_and_clear_bit(int nr, volatile void *addr) | ||
34 | { | ||
35 | return test_and_clear_bit(nr, addr); | ||
36 | } | ||
37 | |||
38 | static inline int sync_test_and_change_bit(int nr, volatile void *addr) | ||
39 | { | ||
40 | return test_and_change_bit(nr, addr); | ||
41 | } | ||
42 | |||
43 | static inline int sync_test_bit(int nr, const volatile void *addr) | ||
44 | { | ||
45 | return test_bit(nr, addr); | ||
46 | } | ||
47 | |||
48 | #define sync_cmpxchg(ptr, old, new) \ | ||
49 | ((__typeof__(*(ptr)))cmpxchg_acq((ptr), (old), (new))) | ||
50 | |||
51 | #endif /* _ASM_IA64_SYNC_BITOPS_H */ | ||
diff --git a/arch/ia64/include/asm/xen/events.h b/arch/ia64/include/asm/xen/events.h deleted file mode 100644 index baa74c82aa71..000000000000 --- a/arch/ia64/include/asm/xen/events.h +++ /dev/null | |||
@@ -1,41 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * arch/ia64/include/asm/xen/events.h | ||
3 | * | ||
4 | * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp> | ||
5 | * VA Linux Systems Japan K.K. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | * | ||
21 | */ | ||
22 | #ifndef _ASM_IA64_XEN_EVENTS_H | ||
23 | #define _ASM_IA64_XEN_EVENTS_H | ||
24 | |||
25 | enum ipi_vector { | ||
26 | XEN_RESCHEDULE_VECTOR, | ||
27 | XEN_IPI_VECTOR, | ||
28 | XEN_CMCP_VECTOR, | ||
29 | XEN_CPEP_VECTOR, | ||
30 | |||
31 | XEN_NR_IPIS, | ||
32 | }; | ||
33 | |||
34 | static inline int xen_irqs_disabled(struct pt_regs *regs) | ||
35 | { | ||
36 | return !(ia64_psr(regs)->i); | ||
37 | } | ||
38 | |||
39 | #define irq_ctx_init(cpu) do { } while (0) | ||
40 | |||
41 | #endif /* _ASM_IA64_XEN_EVENTS_H */ | ||
diff --git a/arch/ia64/include/asm/xen/hypercall.h b/arch/ia64/include/asm/xen/hypercall.h deleted file mode 100644 index ed28bcd5bb85..000000000000 --- a/arch/ia64/include/asm/xen/hypercall.h +++ /dev/null | |||
@@ -1,265 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * hypercall.h | ||
3 | * | ||
4 | * Linux-specific hypervisor handling. | ||
5 | * | ||
6 | * Copyright (c) 2002-2004, K A Fraser | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or | ||
9 | * modify it under the terms of the GNU General Public License version 2 | ||
10 | * as published by the Free Software Foundation; or, when distributed | ||
11 | * separately from the Linux kernel or incorporated into other | ||
12 | * software packages, subject to the following license: | ||
13 | * | ||
14 | * Permission is hereby granted, free of charge, to any person obtaining a copy | ||
15 | * of this source file (the "Software"), to deal in the Software without | ||
16 | * restriction, including without limitation the rights to use, copy, modify, | ||
17 | * merge, publish, distribute, sublicense, and/or sell copies of the Software, | ||
18 | * and to permit persons to whom the Software is furnished to do so, subject to | ||
19 | * the following conditions: | ||
20 | * | ||
21 | * The above copyright notice and this permission notice shall be included in | ||
22 | * all copies or substantial portions of the Software. | ||
23 | * | ||
24 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
25 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
26 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
27 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
28 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
29 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | ||
30 | * IN THE SOFTWARE. | ||
31 | */ | ||
32 | |||
33 | #ifndef _ASM_IA64_XEN_HYPERCALL_H | ||
34 | #define _ASM_IA64_XEN_HYPERCALL_H | ||
35 | |||
36 | #include <xen/interface/xen.h> | ||
37 | #include <xen/interface/physdev.h> | ||
38 | #include <xen/interface/sched.h> | ||
39 | #include <asm/xen/xcom_hcall.h> | ||
40 | struct xencomm_handle; | ||
41 | extern unsigned long __hypercall(unsigned long a1, unsigned long a2, | ||
42 | unsigned long a3, unsigned long a4, | ||
43 | unsigned long a5, unsigned long cmd); | ||
44 | |||
45 | /* | ||
46 | * Assembler stubs for hyper-calls. | ||
47 | */ | ||
48 | |||
49 | #define _hypercall0(type, name) \ | ||
50 | ({ \ | ||
51 | long __res; \ | ||
52 | __res = __hypercall(0, 0, 0, 0, 0, __HYPERVISOR_##name);\ | ||
53 | (type)__res; \ | ||
54 | }) | ||
55 | |||
56 | #define _hypercall1(type, name, a1) \ | ||
57 | ({ \ | ||
58 | long __res; \ | ||
59 | __res = __hypercall((unsigned long)a1, \ | ||
60 | 0, 0, 0, 0, __HYPERVISOR_##name); \ | ||
61 | (type)__res; \ | ||
62 | }) | ||
63 | |||
64 | #define _hypercall2(type, name, a1, a2) \ | ||
65 | ({ \ | ||
66 | long __res; \ | ||
67 | __res = __hypercall((unsigned long)a1, \ | ||
68 | (unsigned long)a2, \ | ||
69 | 0, 0, 0, __HYPERVISOR_##name); \ | ||
70 | (type)__res; \ | ||
71 | }) | ||
72 | |||
73 | #define _hypercall3(type, name, a1, a2, a3) \ | ||
74 | ({ \ | ||
75 | long __res; \ | ||
76 | __res = __hypercall((unsigned long)a1, \ | ||
77 | (unsigned long)a2, \ | ||
78 | (unsigned long)a3, \ | ||
79 | 0, 0, __HYPERVISOR_##name); \ | ||
80 | (type)__res; \ | ||
81 | }) | ||
82 | |||
83 | #define _hypercall4(type, name, a1, a2, a3, a4) \ | ||
84 | ({ \ | ||
85 | long __res; \ | ||
86 | __res = __hypercall((unsigned long)a1, \ | ||
87 | (unsigned long)a2, \ | ||
88 | (unsigned long)a3, \ | ||
89 | (unsigned long)a4, \ | ||
90 | 0, __HYPERVISOR_##name); \ | ||
91 | (type)__res; \ | ||
92 | }) | ||
93 | |||
94 | #define _hypercall5(type, name, a1, a2, a3, a4, a5) \ | ||
95 | ({ \ | ||
96 | long __res; \ | ||
97 | __res = __hypercall((unsigned long)a1, \ | ||
98 | (unsigned long)a2, \ | ||
99 | (unsigned long)a3, \ | ||
100 | (unsigned long)a4, \ | ||
101 | (unsigned long)a5, \ | ||
102 | __HYPERVISOR_##name); \ | ||
103 | (type)__res; \ | ||
104 | }) | ||
105 | |||
106 | |||
107 | static inline int | ||
108 | xencomm_arch_hypercall_sched_op(int cmd, struct xencomm_handle *arg) | ||
109 | { | ||
110 | return _hypercall2(int, sched_op, cmd, arg); | ||
111 | } | ||
112 | |||
113 | static inline long | ||
114 | HYPERVISOR_set_timer_op(u64 timeout) | ||
115 | { | ||
116 | unsigned long timeout_hi = (unsigned long)(timeout >> 32); | ||
117 | unsigned long timeout_lo = (unsigned long)timeout; | ||
118 | return _hypercall2(long, set_timer_op, timeout_lo, timeout_hi); | ||
119 | } | ||
120 | |||
121 | static inline int | ||
122 | xencomm_arch_hypercall_multicall(struct xencomm_handle *call_list, | ||
123 | int nr_calls) | ||
124 | { | ||
125 | return _hypercall2(int, multicall, call_list, nr_calls); | ||
126 | } | ||
127 | |||
128 | static inline int | ||
129 | xencomm_arch_hypercall_memory_op(unsigned int cmd, struct xencomm_handle *arg) | ||
130 | { | ||
131 | return _hypercall2(int, memory_op, cmd, arg); | ||
132 | } | ||
133 | |||
134 | static inline int | ||
135 | xencomm_arch_hypercall_event_channel_op(int cmd, struct xencomm_handle *arg) | ||
136 | { | ||
137 | return _hypercall2(int, event_channel_op, cmd, arg); | ||
138 | } | ||
139 | |||
140 | static inline int | ||
141 | xencomm_arch_hypercall_xen_version(int cmd, struct xencomm_handle *arg) | ||
142 | { | ||
143 | return _hypercall2(int, xen_version, cmd, arg); | ||
144 | } | ||
145 | |||
146 | static inline int | ||
147 | xencomm_arch_hypercall_console_io(int cmd, int count, | ||
148 | struct xencomm_handle *str) | ||
149 | { | ||
150 | return _hypercall3(int, console_io, cmd, count, str); | ||
151 | } | ||
152 | |||
153 | static inline int | ||
154 | xencomm_arch_hypercall_physdev_op(int cmd, struct xencomm_handle *arg) | ||
155 | { | ||
156 | return _hypercall2(int, physdev_op, cmd, arg); | ||
157 | } | ||
158 | |||
159 | static inline int | ||
160 | xencomm_arch_hypercall_grant_table_op(unsigned int cmd, | ||
161 | struct xencomm_handle *uop, | ||
162 | unsigned int count) | ||
163 | { | ||
164 | return _hypercall3(int, grant_table_op, cmd, uop, count); | ||
165 | } | ||
166 | |||
167 | int HYPERVISOR_grant_table_op(unsigned int cmd, void *uop, unsigned int count); | ||
168 | |||
169 | extern int xencomm_arch_hypercall_suspend(struct xencomm_handle *arg); | ||
170 | |||
171 | static inline int | ||
172 | xencomm_arch_hypercall_callback_op(int cmd, struct xencomm_handle *arg) | ||
173 | { | ||
174 | return _hypercall2(int, callback_op, cmd, arg); | ||
175 | } | ||
176 | |||
177 | static inline long | ||
178 | xencomm_arch_hypercall_vcpu_op(int cmd, int cpu, void *arg) | ||
179 | { | ||
180 | return _hypercall3(long, vcpu_op, cmd, cpu, arg); | ||
181 | } | ||
182 | |||
183 | static inline int | ||
184 | HYPERVISOR_physdev_op(int cmd, void *arg) | ||
185 | { | ||
186 | switch (cmd) { | ||
187 | case PHYSDEVOP_eoi: | ||
188 | return _hypercall1(int, ia64_fast_eoi, | ||
189 | ((struct physdev_eoi *)arg)->irq); | ||
190 | default: | ||
191 | return xencomm_hypercall_physdev_op(cmd, arg); | ||
192 | } | ||
193 | } | ||
194 | |||
195 | static inline long | ||
196 | xencomm_arch_hypercall_opt_feature(struct xencomm_handle *arg) | ||
197 | { | ||
198 | return _hypercall1(long, opt_feature, arg); | ||
199 | } | ||
200 | |||
201 | /* for balloon driver */ | ||
202 | #define HYPERVISOR_update_va_mapping(va, new_val, flags) (0) | ||
203 | |||
204 | /* Use xencomm to do hypercalls. */ | ||
205 | #define HYPERVISOR_sched_op xencomm_hypercall_sched_op | ||
206 | #define HYPERVISOR_event_channel_op xencomm_hypercall_event_channel_op | ||
207 | #define HYPERVISOR_callback_op xencomm_hypercall_callback_op | ||
208 | #define HYPERVISOR_multicall xencomm_hypercall_multicall | ||
209 | #define HYPERVISOR_xen_version xencomm_hypercall_xen_version | ||
210 | #define HYPERVISOR_console_io xencomm_hypercall_console_io | ||
211 | #define HYPERVISOR_memory_op xencomm_hypercall_memory_op | ||
212 | #define HYPERVISOR_suspend xencomm_hypercall_suspend | ||
213 | #define HYPERVISOR_vcpu_op xencomm_hypercall_vcpu_op | ||
214 | #define HYPERVISOR_opt_feature xencomm_hypercall_opt_feature | ||
215 | |||
216 | /* to compile gnttab_copy_grant_page() in drivers/xen/core/gnttab.c */ | ||
217 | #define HYPERVISOR_mmu_update(req, count, success_count, domid) ({ BUG(); 0; }) | ||
218 | |||
219 | static inline int | ||
220 | HYPERVISOR_shutdown( | ||
221 | unsigned int reason) | ||
222 | { | ||
223 | struct sched_shutdown sched_shutdown = { | ||
224 | .reason = reason | ||
225 | }; | ||
226 | |||
227 | int rc = HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown); | ||
228 | |||
229 | return rc; | ||
230 | } | ||
231 | |||
232 | /* for netfront.c, netback.c */ | ||
233 | #define MULTI_UVMFLAGS_INDEX 0 /* XXX any value */ | ||
234 | |||
235 | static inline void | ||
236 | MULTI_update_va_mapping( | ||
237 | struct multicall_entry *mcl, unsigned long va, | ||
238 | pte_t new_val, unsigned long flags) | ||
239 | { | ||
240 | mcl->op = __HYPERVISOR_update_va_mapping; | ||
241 | mcl->result = 0; | ||
242 | } | ||
243 | |||
244 | static inline void | ||
245 | MULTI_grant_table_op(struct multicall_entry *mcl, unsigned int cmd, | ||
246 | void *uop, unsigned int count) | ||
247 | { | ||
248 | mcl->op = __HYPERVISOR_grant_table_op; | ||
249 | mcl->args[0] = cmd; | ||
250 | mcl->args[1] = (unsigned long)uop; | ||
251 | mcl->args[2] = count; | ||
252 | } | ||
253 | |||
254 | static inline void | ||
255 | MULTI_mmu_update(struct multicall_entry *mcl, struct mmu_update *req, | ||
256 | int count, int *success_count, domid_t domid) | ||
257 | { | ||
258 | mcl->op = __HYPERVISOR_mmu_update; | ||
259 | mcl->args[0] = (unsigned long)req; | ||
260 | mcl->args[1] = count; | ||
261 | mcl->args[2] = (unsigned long)success_count; | ||
262 | mcl->args[3] = domid; | ||
263 | } | ||
264 | |||
265 | #endif /* _ASM_IA64_XEN_HYPERCALL_H */ | ||
diff --git a/arch/ia64/include/asm/xen/hypervisor.h b/arch/ia64/include/asm/xen/hypervisor.h deleted file mode 100644 index 67455c2ed2b1..000000000000 --- a/arch/ia64/include/asm/xen/hypervisor.h +++ /dev/null | |||
@@ -1,61 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * hypervisor.h | ||
3 | * | ||
4 | * Linux-specific hypervisor handling. | ||
5 | * | ||
6 | * Copyright (c) 2002-2004, K A Fraser | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or | ||
9 | * modify it under the terms of the GNU General Public License version 2 | ||
10 | * as published by the Free Software Foundation; or, when distributed | ||
11 | * separately from the Linux kernel or incorporated into other | ||
12 | * software packages, subject to the following license: | ||
13 | * | ||
14 | * Permission is hereby granted, free of charge, to any person obtaining a copy | ||
15 | * of this source file (the "Software"), to deal in the Software without | ||
16 | * restriction, including without limitation the rights to use, copy, modify, | ||
17 | * merge, publish, distribute, sublicense, and/or sell copies of the Software, | ||
18 | * and to permit persons to whom the Software is furnished to do so, subject to | ||
19 | * the following conditions: | ||
20 | * | ||
21 | * The above copyright notice and this permission notice shall be included in | ||
22 | * all copies or substantial portions of the Software. | ||
23 | * | ||
24 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
25 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
26 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
27 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
28 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
29 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | ||
30 | * IN THE SOFTWARE. | ||
31 | */ | ||
32 | |||
33 | #ifndef _ASM_IA64_XEN_HYPERVISOR_H | ||
34 | #define _ASM_IA64_XEN_HYPERVISOR_H | ||
35 | |||
36 | #include <linux/err.h> | ||
37 | #include <xen/interface/xen.h> | ||
38 | #include <xen/interface/version.h> /* to compile feature.c */ | ||
39 | #include <xen/features.h> /* to comiple xen-netfront.c */ | ||
40 | #include <xen/xen.h> | ||
41 | #include <asm/xen/hypercall.h> | ||
42 | |||
43 | #ifdef CONFIG_XEN | ||
44 | extern struct shared_info *HYPERVISOR_shared_info; | ||
45 | extern struct start_info *xen_start_info; | ||
46 | |||
47 | void __init xen_setup_vcpu_info_placement(void); | ||
48 | void force_evtchn_callback(void); | ||
49 | |||
50 | /* for drivers/xen/balloon/balloon.c */ | ||
51 | #ifdef CONFIG_XEN_SCRUB_PAGES | ||
52 | #define scrub_pages(_p, _n) memset((void *)(_p), 0, (_n) << PAGE_SHIFT) | ||
53 | #else | ||
54 | #define scrub_pages(_p, _n) ((void)0) | ||
55 | #endif | ||
56 | |||
57 | /* For setup_arch() in arch/ia64/kernel/setup.c */ | ||
58 | void xen_ia64_enable_opt_feature(void); | ||
59 | #endif | ||
60 | |||
61 | #endif /* _ASM_IA64_XEN_HYPERVISOR_H */ | ||
diff --git a/arch/ia64/include/asm/xen/inst.h b/arch/ia64/include/asm/xen/inst.h deleted file mode 100644 index c53a47611208..000000000000 --- a/arch/ia64/include/asm/xen/inst.h +++ /dev/null | |||
@@ -1,486 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * arch/ia64/include/asm/xen/inst.h | ||
3 | * | ||
4 | * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp> | ||
5 | * VA Linux Systems Japan K.K. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | * | ||
21 | */ | ||
22 | |||
23 | #include <asm/xen/privop.h> | ||
24 | |||
25 | #define ia64_ivt xen_ivt | ||
26 | #define DO_SAVE_MIN XEN_DO_SAVE_MIN | ||
27 | |||
28 | #define __paravirt_switch_to xen_switch_to | ||
29 | #define __paravirt_leave_syscall xen_leave_syscall | ||
30 | #define __paravirt_work_processed_syscall xen_work_processed_syscall | ||
31 | #define __paravirt_leave_kernel xen_leave_kernel | ||
32 | #define __paravirt_pending_syscall_end xen_work_pending_syscall_end | ||
33 | #define __paravirt_work_processed_syscall_target \ | ||
34 | xen_work_processed_syscall | ||
35 | |||
36 | #define paravirt_fsyscall_table xen_fsyscall_table | ||
37 | #define paravirt_fsys_bubble_down xen_fsys_bubble_down | ||
38 | |||
39 | #define MOV_FROM_IFA(reg) \ | ||
40 | movl reg = XSI_IFA; \ | ||
41 | ;; \ | ||
42 | ld8 reg = [reg] | ||
43 | |||
44 | #define MOV_FROM_ITIR(reg) \ | ||
45 | movl reg = XSI_ITIR; \ | ||
46 | ;; \ | ||
47 | ld8 reg = [reg] | ||
48 | |||
49 | #define MOV_FROM_ISR(reg) \ | ||
50 | movl reg = XSI_ISR; \ | ||
51 | ;; \ | ||
52 | ld8 reg = [reg] | ||
53 | |||
54 | #define MOV_FROM_IHA(reg) \ | ||
55 | movl reg = XSI_IHA; \ | ||
56 | ;; \ | ||
57 | ld8 reg = [reg] | ||
58 | |||
59 | #define MOV_FROM_IPSR(pred, reg) \ | ||
60 | (pred) movl reg = XSI_IPSR; \ | ||
61 | ;; \ | ||
62 | (pred) ld8 reg = [reg] | ||
63 | |||
64 | #define MOV_FROM_IIM(reg) \ | ||
65 | movl reg = XSI_IIM; \ | ||
66 | ;; \ | ||
67 | ld8 reg = [reg] | ||
68 | |||
69 | #define MOV_FROM_IIP(reg) \ | ||
70 | movl reg = XSI_IIP; \ | ||
71 | ;; \ | ||
72 | ld8 reg = [reg] | ||
73 | |||
74 | .macro __MOV_FROM_IVR reg, clob | ||
75 | .ifc "\reg", "r8" | ||
76 | XEN_HYPER_GET_IVR | ||
77 | .exitm | ||
78 | .endif | ||
79 | .ifc "\clob", "r8" | ||
80 | XEN_HYPER_GET_IVR | ||
81 | ;; | ||
82 | mov \reg = r8 | ||
83 | .exitm | ||
84 | .endif | ||
85 | |||
86 | mov \clob = r8 | ||
87 | ;; | ||
88 | XEN_HYPER_GET_IVR | ||
89 | ;; | ||
90 | mov \reg = r8 | ||
91 | ;; | ||
92 | mov r8 = \clob | ||
93 | .endm | ||
94 | #define MOV_FROM_IVR(reg, clob) __MOV_FROM_IVR reg, clob | ||
95 | |||
96 | .macro __MOV_FROM_PSR pred, reg, clob | ||
97 | .ifc "\reg", "r8" | ||
98 | (\pred) XEN_HYPER_GET_PSR; | ||
99 | .exitm | ||
100 | .endif | ||
101 | .ifc "\clob", "r8" | ||
102 | (\pred) XEN_HYPER_GET_PSR | ||
103 | ;; | ||
104 | (\pred) mov \reg = r8 | ||
105 | .exitm | ||
106 | .endif | ||
107 | |||
108 | (\pred) mov \clob = r8 | ||
109 | (\pred) XEN_HYPER_GET_PSR | ||
110 | ;; | ||
111 | (\pred) mov \reg = r8 | ||
112 | (\pred) mov r8 = \clob | ||
113 | .endm | ||
114 | #define MOV_FROM_PSR(pred, reg, clob) __MOV_FROM_PSR pred, reg, clob | ||
115 | |||
116 | /* assuming ar.itc is read with interrupt disabled. */ | ||
117 | #define MOV_FROM_ITC(pred, pred_clob, reg, clob) \ | ||
118 | (pred) movl clob = XSI_ITC_OFFSET; \ | ||
119 | ;; \ | ||
120 | (pred) ld8 clob = [clob]; \ | ||
121 | (pred) mov reg = ar.itc; \ | ||
122 | ;; \ | ||
123 | (pred) add reg = reg, clob; \ | ||
124 | ;; \ | ||
125 | (pred) movl clob = XSI_ITC_LAST; \ | ||
126 | ;; \ | ||
127 | (pred) ld8 clob = [clob]; \ | ||
128 | ;; \ | ||
129 | (pred) cmp.geu.unc pred_clob, p0 = clob, reg; \ | ||
130 | ;; \ | ||
131 | (pred_clob) add reg = 1, clob; \ | ||
132 | ;; \ | ||
133 | (pred) movl clob = XSI_ITC_LAST; \ | ||
134 | ;; \ | ||
135 | (pred) st8 [clob] = reg | ||
136 | |||
137 | |||
138 | #define MOV_TO_IFA(reg, clob) \ | ||
139 | movl clob = XSI_IFA; \ | ||
140 | ;; \ | ||
141 | st8 [clob] = reg \ | ||
142 | |||
143 | #define MOV_TO_ITIR(pred, reg, clob) \ | ||
144 | (pred) movl clob = XSI_ITIR; \ | ||
145 | ;; \ | ||
146 | (pred) st8 [clob] = reg | ||
147 | |||
148 | #define MOV_TO_IHA(pred, reg, clob) \ | ||
149 | (pred) movl clob = XSI_IHA; \ | ||
150 | ;; \ | ||
151 | (pred) st8 [clob] = reg | ||
152 | |||
153 | #define MOV_TO_IPSR(pred, reg, clob) \ | ||
154 | (pred) movl clob = XSI_IPSR; \ | ||
155 | ;; \ | ||
156 | (pred) st8 [clob] = reg; \ | ||
157 | ;; | ||
158 | |||
159 | #define MOV_TO_IFS(pred, reg, clob) \ | ||
160 | (pred) movl clob = XSI_IFS; \ | ||
161 | ;; \ | ||
162 | (pred) st8 [clob] = reg; \ | ||
163 | ;; | ||
164 | |||
165 | #define MOV_TO_IIP(reg, clob) \ | ||
166 | movl clob = XSI_IIP; \ | ||
167 | ;; \ | ||
168 | st8 [clob] = reg | ||
169 | |||
170 | .macro ____MOV_TO_KR kr, reg, clob0, clob1 | ||
171 | .ifc "\clob0", "r9" | ||
172 | .error "clob0 \clob0 must not be r9" | ||
173 | .endif | ||
174 | .ifc "\clob1", "r8" | ||
175 | .error "clob1 \clob1 must not be r8" | ||
176 | .endif | ||
177 | |||
178 | .ifnc "\reg", "r9" | ||
179 | .ifnc "\clob1", "r9" | ||
180 | mov \clob1 = r9 | ||
181 | .endif | ||
182 | mov r9 = \reg | ||
183 | .endif | ||
184 | .ifnc "\clob0", "r8" | ||
185 | mov \clob0 = r8 | ||
186 | .endif | ||
187 | mov r8 = \kr | ||
188 | ;; | ||
189 | XEN_HYPER_SET_KR | ||
190 | |||
191 | .ifnc "\reg", "r9" | ||
192 | .ifnc "\clob1", "r9" | ||
193 | mov r9 = \clob1 | ||
194 | .endif | ||
195 | .endif | ||
196 | .ifnc "\clob0", "r8" | ||
197 | mov r8 = \clob0 | ||
198 | .endif | ||
199 | .endm | ||
200 | |||
201 | .macro __MOV_TO_KR kr, reg, clob0, clob1 | ||
202 | .ifc "\clob0", "r9" | ||
203 | ____MOV_TO_KR \kr, \reg, \clob1, \clob0 | ||
204 | .exitm | ||
205 | .endif | ||
206 | .ifc "\clob1", "r8" | ||
207 | ____MOV_TO_KR \kr, \reg, \clob1, \clob0 | ||
208 | .exitm | ||
209 | .endif | ||
210 | |||
211 | ____MOV_TO_KR \kr, \reg, \clob0, \clob1 | ||
212 | .endm | ||
213 | |||
214 | #define MOV_TO_KR(kr, reg, clob0, clob1) \ | ||
215 | __MOV_TO_KR IA64_KR_ ## kr, reg, clob0, clob1 | ||
216 | |||
217 | |||
218 | .macro __ITC_I pred, reg, clob | ||
219 | .ifc "\reg", "r8" | ||
220 | (\pred) XEN_HYPER_ITC_I | ||
221 | .exitm | ||
222 | .endif | ||
223 | .ifc "\clob", "r8" | ||
224 | (\pred) mov r8 = \reg | ||
225 | ;; | ||
226 | (\pred) XEN_HYPER_ITC_I | ||
227 | .exitm | ||
228 | .endif | ||
229 | |||
230 | (\pred) mov \clob = r8 | ||
231 | (\pred) mov r8 = \reg | ||
232 | ;; | ||
233 | (\pred) XEN_HYPER_ITC_I | ||
234 | ;; | ||
235 | (\pred) mov r8 = \clob | ||
236 | ;; | ||
237 | .endm | ||
238 | #define ITC_I(pred, reg, clob) __ITC_I pred, reg, clob | ||
239 | |||
240 | .macro __ITC_D pred, reg, clob | ||
241 | .ifc "\reg", "r8" | ||
242 | (\pred) XEN_HYPER_ITC_D | ||
243 | ;; | ||
244 | .exitm | ||
245 | .endif | ||
246 | .ifc "\clob", "r8" | ||
247 | (\pred) mov r8 = \reg | ||
248 | ;; | ||
249 | (\pred) XEN_HYPER_ITC_D | ||
250 | ;; | ||
251 | .exitm | ||
252 | .endif | ||
253 | |||
254 | (\pred) mov \clob = r8 | ||
255 | (\pred) mov r8 = \reg | ||
256 | ;; | ||
257 | (\pred) XEN_HYPER_ITC_D | ||
258 | ;; | ||
259 | (\pred) mov r8 = \clob | ||
260 | ;; | ||
261 | .endm | ||
262 | #define ITC_D(pred, reg, clob) __ITC_D pred, reg, clob | ||
263 | |||
264 | .macro __ITC_I_AND_D pred_i, pred_d, reg, clob | ||
265 | .ifc "\reg", "r8" | ||
266 | (\pred_i)XEN_HYPER_ITC_I | ||
267 | ;; | ||
268 | (\pred_d)XEN_HYPER_ITC_D | ||
269 | ;; | ||
270 | .exitm | ||
271 | .endif | ||
272 | .ifc "\clob", "r8" | ||
273 | mov r8 = \reg | ||
274 | ;; | ||
275 | (\pred_i)XEN_HYPER_ITC_I | ||
276 | ;; | ||
277 | (\pred_d)XEN_HYPER_ITC_D | ||
278 | ;; | ||
279 | .exitm | ||
280 | .endif | ||
281 | |||
282 | mov \clob = r8 | ||
283 | mov r8 = \reg | ||
284 | ;; | ||
285 | (\pred_i)XEN_HYPER_ITC_I | ||
286 | ;; | ||
287 | (\pred_d)XEN_HYPER_ITC_D | ||
288 | ;; | ||
289 | mov r8 = \clob | ||
290 | ;; | ||
291 | .endm | ||
292 | #define ITC_I_AND_D(pred_i, pred_d, reg, clob) \ | ||
293 | __ITC_I_AND_D pred_i, pred_d, reg, clob | ||
294 | |||
295 | .macro __THASH pred, reg0, reg1, clob | ||
296 | .ifc "\reg0", "r8" | ||
297 | (\pred) mov r8 = \reg1 | ||
298 | (\pred) XEN_HYPER_THASH | ||
299 | .exitm | ||
300 | .endc | ||
301 | .ifc "\reg1", "r8" | ||
302 | (\pred) XEN_HYPER_THASH | ||
303 | ;; | ||
304 | (\pred) mov \reg0 = r8 | ||
305 | ;; | ||
306 | .exitm | ||
307 | .endif | ||
308 | .ifc "\clob", "r8" | ||
309 | (\pred) mov r8 = \reg1 | ||
310 | (\pred) XEN_HYPER_THASH | ||
311 | ;; | ||
312 | (\pred) mov \reg0 = r8 | ||
313 | ;; | ||
314 | .exitm | ||
315 | .endif | ||
316 | |||
317 | (\pred) mov \clob = r8 | ||
318 | (\pred) mov r8 = \reg1 | ||
319 | (\pred) XEN_HYPER_THASH | ||
320 | ;; | ||
321 | (\pred) mov \reg0 = r8 | ||
322 | (\pred) mov r8 = \clob | ||
323 | ;; | ||
324 | .endm | ||
325 | #define THASH(pred, reg0, reg1, clob) __THASH pred, reg0, reg1, clob | ||
326 | |||
327 | #define SSM_PSR_IC_AND_DEFAULT_BITS_AND_SRLZ_I(clob0, clob1) \ | ||
328 | mov clob0 = 1; \ | ||
329 | movl clob1 = XSI_PSR_IC; \ | ||
330 | ;; \ | ||
331 | st4 [clob1] = clob0 \ | ||
332 | ;; | ||
333 | |||
334 | #define SSM_PSR_IC_AND_SRLZ_D(clob0, clob1) \ | ||
335 | ;; \ | ||
336 | srlz.d; \ | ||
337 | mov clob1 = 1; \ | ||
338 | movl clob0 = XSI_PSR_IC; \ | ||
339 | ;; \ | ||
340 | st4 [clob0] = clob1 | ||
341 | |||
342 | #define RSM_PSR_IC(clob) \ | ||
343 | movl clob = XSI_PSR_IC; \ | ||
344 | ;; \ | ||
345 | st4 [clob] = r0; \ | ||
346 | ;; | ||
347 | |||
348 | /* pred will be clobbered */ | ||
349 | #define MASK_TO_PEND_OFS (-1) | ||
350 | #define SSM_PSR_I(pred, pred_clob, clob) \ | ||
351 | (pred) movl clob = XSI_PSR_I_ADDR \ | ||
352 | ;; \ | ||
353 | (pred) ld8 clob = [clob] \ | ||
354 | ;; \ | ||
355 | /* if (pred) vpsr.i = 1 */ \ | ||
356 | /* if (pred) (vcpu->vcpu_info->evtchn_upcall_mask)=0 */ \ | ||
357 | (pred) st1 [clob] = r0, MASK_TO_PEND_OFS \ | ||
358 | ;; \ | ||
359 | /* if (vcpu->vcpu_info->evtchn_upcall_pending) */ \ | ||
360 | (pred) ld1 clob = [clob] \ | ||
361 | ;; \ | ||
362 | (pred) cmp.ne.unc pred_clob, p0 = clob, r0 \ | ||
363 | ;; \ | ||
364 | (pred_clob)XEN_HYPER_SSM_I /* do areal ssm psr.i */ | ||
365 | |||
366 | #define RSM_PSR_I(pred, clob0, clob1) \ | ||
367 | movl clob0 = XSI_PSR_I_ADDR; \ | ||
368 | mov clob1 = 1; \ | ||
369 | ;; \ | ||
370 | ld8 clob0 = [clob0]; \ | ||
371 | ;; \ | ||
372 | (pred) st1 [clob0] = clob1 | ||
373 | |||
374 | #define RSM_PSR_I_IC(clob0, clob1, clob2) \ | ||
375 | movl clob0 = XSI_PSR_I_ADDR; \ | ||
376 | movl clob1 = XSI_PSR_IC; \ | ||
377 | ;; \ | ||
378 | ld8 clob0 = [clob0]; \ | ||
379 | mov clob2 = 1; \ | ||
380 | ;; \ | ||
381 | /* note: clears both vpsr.i and vpsr.ic! */ \ | ||
382 | st1 [clob0] = clob2; \ | ||
383 | st4 [clob1] = r0; \ | ||
384 | ;; | ||
385 | |||
386 | #define RSM_PSR_DT \ | ||
387 | XEN_HYPER_RSM_PSR_DT | ||
388 | |||
389 | #define RSM_PSR_BE_I(clob0, clob1) \ | ||
390 | RSM_PSR_I(p0, clob0, clob1); \ | ||
391 | rum psr.be | ||
392 | |||
393 | #define SSM_PSR_DT_AND_SRLZ_I \ | ||
394 | XEN_HYPER_SSM_PSR_DT | ||
395 | |||
396 | #define BSW_0(clob0, clob1, clob2) \ | ||
397 | ;; \ | ||
398 | /* r16-r31 all now hold bank1 values */ \ | ||
399 | mov clob2 = ar.unat; \ | ||
400 | movl clob0 = XSI_BANK1_R16; \ | ||
401 | movl clob1 = XSI_BANK1_R16 + 8; \ | ||
402 | ;; \ | ||
403 | .mem.offset 0, 0; st8.spill [clob0] = r16, 16; \ | ||
404 | .mem.offset 8, 0; st8.spill [clob1] = r17, 16; \ | ||
405 | ;; \ | ||
406 | .mem.offset 0, 0; st8.spill [clob0] = r18, 16; \ | ||
407 | .mem.offset 8, 0; st8.spill [clob1] = r19, 16; \ | ||
408 | ;; \ | ||
409 | .mem.offset 0, 0; st8.spill [clob0] = r20, 16; \ | ||
410 | .mem.offset 8, 0; st8.spill [clob1] = r21, 16; \ | ||
411 | ;; \ | ||
412 | .mem.offset 0, 0; st8.spill [clob0] = r22, 16; \ | ||
413 | .mem.offset 8, 0; st8.spill [clob1] = r23, 16; \ | ||
414 | ;; \ | ||
415 | .mem.offset 0, 0; st8.spill [clob0] = r24, 16; \ | ||
416 | .mem.offset 8, 0; st8.spill [clob1] = r25, 16; \ | ||
417 | ;; \ | ||
418 | .mem.offset 0, 0; st8.spill [clob0] = r26, 16; \ | ||
419 | .mem.offset 8, 0; st8.spill [clob1] = r27, 16; \ | ||
420 | ;; \ | ||
421 | .mem.offset 0, 0; st8.spill [clob0] = r28, 16; \ | ||
422 | .mem.offset 8, 0; st8.spill [clob1] = r29, 16; \ | ||
423 | ;; \ | ||
424 | .mem.offset 0, 0; st8.spill [clob0] = r30, 16; \ | ||
425 | .mem.offset 8, 0; st8.spill [clob1] = r31, 16; \ | ||
426 | ;; \ | ||
427 | mov clob1 = ar.unat; \ | ||
428 | movl clob0 = XSI_B1NAT; \ | ||
429 | ;; \ | ||
430 | st8 [clob0] = clob1; \ | ||
431 | mov ar.unat = clob2; \ | ||
432 | movl clob0 = XSI_BANKNUM; \ | ||
433 | ;; \ | ||
434 | st4 [clob0] = r0 | ||
435 | |||
436 | |||
437 | /* FIXME: THIS CODE IS NOT NaT SAFE! */ | ||
438 | #define XEN_BSW_1(clob) \ | ||
439 | mov clob = ar.unat; \ | ||
440 | movl r30 = XSI_B1NAT; \ | ||
441 | ;; \ | ||
442 | ld8 r30 = [r30]; \ | ||
443 | mov r31 = 1; \ | ||
444 | ;; \ | ||
445 | mov ar.unat = r30; \ | ||
446 | movl r30 = XSI_BANKNUM; \ | ||
447 | ;; \ | ||
448 | st4 [r30] = r31; \ | ||
449 | movl r30 = XSI_BANK1_R16; \ | ||
450 | movl r31 = XSI_BANK1_R16+8; \ | ||
451 | ;; \ | ||
452 | ld8.fill r16 = [r30], 16; \ | ||
453 | ld8.fill r17 = [r31], 16; \ | ||
454 | ;; \ | ||
455 | ld8.fill r18 = [r30], 16; \ | ||
456 | ld8.fill r19 = [r31], 16; \ | ||
457 | ;; \ | ||
458 | ld8.fill r20 = [r30], 16; \ | ||
459 | ld8.fill r21 = [r31], 16; \ | ||
460 | ;; \ | ||
461 | ld8.fill r22 = [r30], 16; \ | ||
462 | ld8.fill r23 = [r31], 16; \ | ||
463 | ;; \ | ||
464 | ld8.fill r24 = [r30], 16; \ | ||
465 | ld8.fill r25 = [r31], 16; \ | ||
466 | ;; \ | ||
467 | ld8.fill r26 = [r30], 16; \ | ||
468 | ld8.fill r27 = [r31], 16; \ | ||
469 | ;; \ | ||
470 | ld8.fill r28 = [r30], 16; \ | ||
471 | ld8.fill r29 = [r31], 16; \ | ||
472 | ;; \ | ||
473 | ld8.fill r30 = [r30]; \ | ||
474 | ld8.fill r31 = [r31]; \ | ||
475 | ;; \ | ||
476 | mov ar.unat = clob | ||
477 | |||
478 | #define BSW_1(clob0, clob1) XEN_BSW_1(clob1) | ||
479 | |||
480 | |||
481 | #define COVER \ | ||
482 | XEN_HYPER_COVER | ||
483 | |||
484 | #define RFI \ | ||
485 | XEN_HYPER_RFI; \ | ||
486 | dv_serialize_data | ||
diff --git a/arch/ia64/include/asm/xen/interface.h b/arch/ia64/include/asm/xen/interface.h deleted file mode 100644 index e88c5de27410..000000000000 --- a/arch/ia64/include/asm/xen/interface.h +++ /dev/null | |||
@@ -1,363 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * arch-ia64/hypervisor-if.h | ||
3 | * | ||
4 | * Guest OS interface to IA64 Xen. | ||
5 | * | ||
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy | ||
7 | * of this software and associated documentation files (the "Software"), to | ||
8 | * deal in the Software without restriction, including without limitation the | ||
9 | * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | ||
10 | * sell copies of the Software, and to permit persons to whom the Software is | ||
11 | * furnished to do so, subject to the following conditions: | ||
12 | * | ||
13 | * The above copyright notice and this permission notice shall be included in | ||
14 | * all copies or substantial portions of the Software. | ||
15 | * | ||
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
21 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | ||
22 | * DEALINGS IN THE SOFTWARE. | ||
23 | * | ||
24 | * Copyright by those who contributed. (in alphabetical order) | ||
25 | * | ||
26 | * Anthony Xu <anthony.xu@intel.com> | ||
27 | * Eddie Dong <eddie.dong@intel.com> | ||
28 | * Fred Yang <fred.yang@intel.com> | ||
29 | * Kevin Tian <kevin.tian@intel.com> | ||
30 | * Alex Williamson <alex.williamson@hp.com> | ||
31 | * Chris Wright <chrisw@sous-sol.org> | ||
32 | * Christian Limpach <Christian.Limpach@cl.cam.ac.uk> | ||
33 | * Dietmar Hahn <dietmar.hahn@fujitsu-siemens.com> | ||
34 | * Hollis Blanchard <hollisb@us.ibm.com> | ||
35 | * Isaku Yamahata <yamahata@valinux.co.jp> | ||
36 | * Jan Beulich <jbeulich@novell.com> | ||
37 | * John Levon <john.levon@sun.com> | ||
38 | * Kazuhiro Suzuki <kaz@jp.fujitsu.com> | ||
39 | * Keir Fraser <keir.fraser@citrix.com> | ||
40 | * Kouya Shimura <kouya@jp.fujitsu.com> | ||
41 | * Masaki Kanno <kanno.masaki@jp.fujitsu.com> | ||
42 | * Matt Chapman <matthewc@hp.com> | ||
43 | * Matthew Chapman <matthewc@hp.com> | ||
44 | * Samuel Thibault <samuel.thibault@eu.citrix.com> | ||
45 | * Tomonari Horikoshi <t.horikoshi@jp.fujitsu.com> | ||
46 | * Tristan Gingold <tgingold@free.fr> | ||
47 | * Tsunehisa Doi <Doi.Tsunehisa@jp.fujitsu.com> | ||
48 | * Yutaka Ezaki <yutaka.ezaki@jp.fujitsu.com> | ||
49 | * Zhang Xin <xing.z.zhang@intel.com> | ||
50 | * Zhang xiantao <xiantao.zhang@intel.com> | ||
51 | * dan.magenheimer@hp.com | ||
52 | * ian.pratt@cl.cam.ac.uk | ||
53 | * michael.fetterman@cl.cam.ac.uk | ||
54 | */ | ||
55 | |||
56 | #ifndef _ASM_IA64_XEN_INTERFACE_H | ||
57 | #define _ASM_IA64_XEN_INTERFACE_H | ||
58 | |||
59 | #define __DEFINE_GUEST_HANDLE(name, type) \ | ||
60 | typedef struct { type *p; } __guest_handle_ ## name | ||
61 | |||
62 | #define DEFINE_GUEST_HANDLE_STRUCT(name) \ | ||
63 | __DEFINE_GUEST_HANDLE(name, struct name) | ||
64 | #define DEFINE_GUEST_HANDLE(name) __DEFINE_GUEST_HANDLE(name, name) | ||
65 | #define GUEST_HANDLE(name) __guest_handle_ ## name | ||
66 | #define GUEST_HANDLE_64(name) GUEST_HANDLE(name) | ||
67 | #define set_xen_guest_handle(hnd, val) do { (hnd).p = val; } while (0) | ||
68 | |||
69 | #ifndef __ASSEMBLY__ | ||
70 | /* Explicitly size integers that represent pfns in the public interface | ||
71 | * with Xen so that we could have one ABI that works for 32 and 64 bit | ||
72 | * guests. */ | ||
73 | typedef unsigned long xen_pfn_t; | ||
74 | typedef unsigned long xen_ulong_t; | ||
75 | /* Guest handles for primitive C types. */ | ||
76 | __DEFINE_GUEST_HANDLE(uchar, unsigned char); | ||
77 | __DEFINE_GUEST_HANDLE(uint, unsigned int); | ||
78 | __DEFINE_GUEST_HANDLE(ulong, unsigned long); | ||
79 | |||
80 | DEFINE_GUEST_HANDLE(char); | ||
81 | DEFINE_GUEST_HANDLE(int); | ||
82 | DEFINE_GUEST_HANDLE(long); | ||
83 | DEFINE_GUEST_HANDLE(void); | ||
84 | DEFINE_GUEST_HANDLE(uint64_t); | ||
85 | DEFINE_GUEST_HANDLE(uint32_t); | ||
86 | |||
87 | DEFINE_GUEST_HANDLE(xen_pfn_t); | ||
88 | #define PRI_xen_pfn "lx" | ||
89 | #endif | ||
90 | |||
91 | /* Arch specific VIRQs definition */ | ||
92 | #define VIRQ_ITC VIRQ_ARCH_0 /* V. Virtual itc timer */ | ||
93 | #define VIRQ_MCA_CMC VIRQ_ARCH_1 /* MCA cmc interrupt */ | ||
94 | #define VIRQ_MCA_CPE VIRQ_ARCH_2 /* MCA cpe interrupt */ | ||
95 | |||
96 | /* Maximum number of virtual CPUs in multi-processor guests. */ | ||
97 | /* keep sizeof(struct shared_page) <= PAGE_SIZE. | ||
98 | * this is checked in arch/ia64/xen/hypervisor.c. */ | ||
99 | #define MAX_VIRT_CPUS 64 | ||
100 | |||
101 | #ifndef __ASSEMBLY__ | ||
102 | |||
103 | #define INVALID_MFN (~0UL) | ||
104 | |||
105 | union vac { | ||
106 | unsigned long value; | ||
107 | struct { | ||
108 | int a_int:1; | ||
109 | int a_from_int_cr:1; | ||
110 | int a_to_int_cr:1; | ||
111 | int a_from_psr:1; | ||
112 | int a_from_cpuid:1; | ||
113 | int a_cover:1; | ||
114 | int a_bsw:1; | ||
115 | long reserved:57; | ||
116 | }; | ||
117 | }; | ||
118 | |||
119 | union vdc { | ||
120 | unsigned long value; | ||
121 | struct { | ||
122 | int d_vmsw:1; | ||
123 | int d_extint:1; | ||
124 | int d_ibr_dbr:1; | ||
125 | int d_pmc:1; | ||
126 | int d_to_pmd:1; | ||
127 | int d_itm:1; | ||
128 | long reserved:58; | ||
129 | }; | ||
130 | }; | ||
131 | |||
132 | struct mapped_regs { | ||
133 | union vac vac; | ||
134 | union vdc vdc; | ||
135 | unsigned long virt_env_vaddr; | ||
136 | unsigned long reserved1[29]; | ||
137 | unsigned long vhpi; | ||
138 | unsigned long reserved2[95]; | ||
139 | union { | ||
140 | unsigned long vgr[16]; | ||
141 | unsigned long bank1_regs[16]; /* bank1 regs (r16-r31) | ||
142 | when bank0 active */ | ||
143 | }; | ||
144 | union { | ||
145 | unsigned long vbgr[16]; | ||
146 | unsigned long bank0_regs[16]; /* bank0 regs (r16-r31) | ||
147 | when bank1 active */ | ||
148 | }; | ||
149 | unsigned long vnat; | ||
150 | unsigned long vbnat; | ||
151 | unsigned long vcpuid[5]; | ||
152 | unsigned long reserved3[11]; | ||
153 | unsigned long vpsr; | ||
154 | unsigned long vpr; | ||
155 | unsigned long reserved4[76]; | ||
156 | union { | ||
157 | unsigned long vcr[128]; | ||
158 | struct { | ||
159 | unsigned long dcr; /* CR0 */ | ||
160 | unsigned long itm; | ||
161 | unsigned long iva; | ||
162 | unsigned long rsv1[5]; | ||
163 | unsigned long pta; /* CR8 */ | ||
164 | unsigned long rsv2[7]; | ||
165 | unsigned long ipsr; /* CR16 */ | ||
166 | unsigned long isr; | ||
167 | unsigned long rsv3; | ||
168 | unsigned long iip; | ||
169 | unsigned long ifa; | ||
170 | unsigned long itir; | ||
171 | unsigned long iipa; | ||
172 | unsigned long ifs; | ||
173 | unsigned long iim; /* CR24 */ | ||
174 | unsigned long iha; | ||
175 | unsigned long rsv4[38]; | ||
176 | unsigned long lid; /* CR64 */ | ||
177 | unsigned long ivr; | ||
178 | unsigned long tpr; | ||
179 | unsigned long eoi; | ||
180 | unsigned long irr[4]; | ||
181 | unsigned long itv; /* CR72 */ | ||
182 | unsigned long pmv; | ||
183 | unsigned long cmcv; | ||
184 | unsigned long rsv5[5]; | ||
185 | unsigned long lrr0; /* CR80 */ | ||
186 | unsigned long lrr1; | ||
187 | unsigned long rsv6[46]; | ||
188 | }; | ||
189 | }; | ||
190 | union { | ||
191 | unsigned long reserved5[128]; | ||
192 | struct { | ||
193 | unsigned long precover_ifs; | ||
194 | unsigned long unat; /* not sure if this is needed | ||
195 | until NaT arch is done */ | ||
196 | int interrupt_collection_enabled; /* virtual psr.ic */ | ||
197 | |||
198 | /* virtual interrupt deliverable flag is | ||
199 | * evtchn_upcall_mask in shared info area now. | ||
200 | * interrupt_mask_addr is the address | ||
201 | * of evtchn_upcall_mask for current vcpu | ||
202 | */ | ||
203 | unsigned char *interrupt_mask_addr; | ||
204 | int pending_interruption; | ||
205 | unsigned char vpsr_pp; | ||
206 | unsigned char vpsr_dfh; | ||
207 | unsigned char hpsr_dfh; | ||
208 | unsigned char hpsr_mfh; | ||
209 | unsigned long reserved5_1[4]; | ||
210 | int metaphysical_mode; /* 1 = use metaphys mapping | ||
211 | 0 = use virtual */ | ||
212 | int banknum; /* 0 or 1, which virtual | ||
213 | register bank is active */ | ||
214 | unsigned long rrs[8]; /* region registers */ | ||
215 | unsigned long krs[8]; /* kernel registers */ | ||
216 | unsigned long tmp[16]; /* temp registers | ||
217 | (e.g. for hyperprivops) */ | ||
218 | |||
219 | /* itc paravirtualization | ||
220 | * vAR.ITC = mAR.ITC + itc_offset | ||
221 | * itc_last is one which was lastly passed to | ||
222 | * the guest OS in order to prevent it from | ||
223 | * going backwords. | ||
224 | */ | ||
225 | unsigned long itc_offset; | ||
226 | unsigned long itc_last; | ||
227 | }; | ||
228 | }; | ||
229 | }; | ||
230 | |||
231 | struct arch_vcpu_info { | ||
232 | /* nothing */ | ||
233 | }; | ||
234 | |||
235 | /* | ||
236 | * This structure is used for magic page in domain pseudo physical address | ||
237 | * space and the result of XENMEM_machine_memory_map. | ||
238 | * As the XENMEM_machine_memory_map result, | ||
239 | * xen_memory_map::nr_entries indicates the size in bytes | ||
240 | * including struct xen_ia64_memmap_info. Not the number of entries. | ||
241 | */ | ||
242 | struct xen_ia64_memmap_info { | ||
243 | uint64_t efi_memmap_size; /* size of EFI memory map */ | ||
244 | uint64_t efi_memdesc_size; /* size of an EFI memory map | ||
245 | * descriptor */ | ||
246 | uint32_t efi_memdesc_version; /* memory descriptor version */ | ||
247 | void *memdesc[0]; /* array of efi_memory_desc_t */ | ||
248 | }; | ||
249 | |||
250 | struct arch_shared_info { | ||
251 | /* PFN of the start_info page. */ | ||
252 | unsigned long start_info_pfn; | ||
253 | |||
254 | /* Interrupt vector for event channel. */ | ||
255 | int evtchn_vector; | ||
256 | |||
257 | /* PFN of memmap_info page */ | ||
258 | unsigned int memmap_info_num_pages; /* currently only = 1 case is | ||
259 | supported. */ | ||
260 | unsigned long memmap_info_pfn; | ||
261 | |||
262 | uint64_t pad[31]; | ||
263 | }; | ||
264 | |||
265 | struct xen_callback { | ||
266 | unsigned long ip; | ||
267 | }; | ||
268 | typedef struct xen_callback xen_callback_t; | ||
269 | |||
270 | #endif /* !__ASSEMBLY__ */ | ||
271 | |||
272 | #include <asm/pvclock-abi.h> | ||
273 | |||
274 | /* Size of the shared_info area (this is not related to page size). */ | ||
275 | #define XSI_SHIFT 14 | ||
276 | #define XSI_SIZE (1 << XSI_SHIFT) | ||
277 | /* Log size of mapped_regs area (64 KB - only 4KB is used). */ | ||
278 | #define XMAPPEDREGS_SHIFT 12 | ||
279 | #define XMAPPEDREGS_SIZE (1 << XMAPPEDREGS_SHIFT) | ||
280 | /* Offset of XASI (Xen arch shared info) wrt XSI_BASE. */ | ||
281 | #define XMAPPEDREGS_OFS XSI_SIZE | ||
282 | |||
283 | /* Hyperprivops. */ | ||
284 | #define HYPERPRIVOP_START 0x1 | ||
285 | #define HYPERPRIVOP_RFI (HYPERPRIVOP_START + 0x0) | ||
286 | #define HYPERPRIVOP_RSM_DT (HYPERPRIVOP_START + 0x1) | ||
287 | #define HYPERPRIVOP_SSM_DT (HYPERPRIVOP_START + 0x2) | ||
288 | #define HYPERPRIVOP_COVER (HYPERPRIVOP_START + 0x3) | ||
289 | #define HYPERPRIVOP_ITC_D (HYPERPRIVOP_START + 0x4) | ||
290 | #define HYPERPRIVOP_ITC_I (HYPERPRIVOP_START + 0x5) | ||
291 | #define HYPERPRIVOP_SSM_I (HYPERPRIVOP_START + 0x6) | ||
292 | #define HYPERPRIVOP_GET_IVR (HYPERPRIVOP_START + 0x7) | ||
293 | #define HYPERPRIVOP_GET_TPR (HYPERPRIVOP_START + 0x8) | ||
294 | #define HYPERPRIVOP_SET_TPR (HYPERPRIVOP_START + 0x9) | ||
295 | #define HYPERPRIVOP_EOI (HYPERPRIVOP_START + 0xa) | ||
296 | #define HYPERPRIVOP_SET_ITM (HYPERPRIVOP_START + 0xb) | ||
297 | #define HYPERPRIVOP_THASH (HYPERPRIVOP_START + 0xc) | ||
298 | #define HYPERPRIVOP_PTC_GA (HYPERPRIVOP_START + 0xd) | ||
299 | #define HYPERPRIVOP_ITR_D (HYPERPRIVOP_START + 0xe) | ||
300 | #define HYPERPRIVOP_GET_RR (HYPERPRIVOP_START + 0xf) | ||
301 | #define HYPERPRIVOP_SET_RR (HYPERPRIVOP_START + 0x10) | ||
302 | #define HYPERPRIVOP_SET_KR (HYPERPRIVOP_START + 0x11) | ||
303 | #define HYPERPRIVOP_FC (HYPERPRIVOP_START + 0x12) | ||
304 | #define HYPERPRIVOP_GET_CPUID (HYPERPRIVOP_START + 0x13) | ||
305 | #define HYPERPRIVOP_GET_PMD (HYPERPRIVOP_START + 0x14) | ||
306 | #define HYPERPRIVOP_GET_EFLAG (HYPERPRIVOP_START + 0x15) | ||
307 | #define HYPERPRIVOP_SET_EFLAG (HYPERPRIVOP_START + 0x16) | ||
308 | #define HYPERPRIVOP_RSM_BE (HYPERPRIVOP_START + 0x17) | ||
309 | #define HYPERPRIVOP_GET_PSR (HYPERPRIVOP_START + 0x18) | ||
310 | #define HYPERPRIVOP_SET_RR0_TO_RR4 (HYPERPRIVOP_START + 0x19) | ||
311 | #define HYPERPRIVOP_MAX (0x1a) | ||
312 | |||
313 | /* Fast and light hypercalls. */ | ||
314 | #define __HYPERVISOR_ia64_fast_eoi __HYPERVISOR_arch_1 | ||
315 | |||
316 | /* Xencomm macros. */ | ||
317 | #define XENCOMM_INLINE_MASK 0xf800000000000000UL | ||
318 | #define XENCOMM_INLINE_FLAG 0x8000000000000000UL | ||
319 | |||
320 | #ifndef __ASSEMBLY__ | ||
321 | |||
322 | /* | ||
323 | * Optimization features. | ||
324 | * The hypervisor may do some special optimizations for guests. This hypercall | ||
325 | * can be used to switch on/of these special optimizations. | ||
326 | */ | ||
327 | #define __HYPERVISOR_opt_feature 0x700UL | ||
328 | |||
329 | #define XEN_IA64_OPTF_OFF 0x0 | ||
330 | #define XEN_IA64_OPTF_ON 0x1 | ||
331 | |||
332 | /* | ||
333 | * If this feature is switched on, the hypervisor inserts the | ||
334 | * tlb entries without calling the guests traphandler. | ||
335 | * This is useful in guests using region 7 for identity mapping | ||
336 | * like the linux kernel does. | ||
337 | */ | ||
338 | #define XEN_IA64_OPTF_IDENT_MAP_REG7 1 | ||
339 | |||
340 | /* Identity mapping of region 4 addresses in HVM. */ | ||
341 | #define XEN_IA64_OPTF_IDENT_MAP_REG4 2 | ||
342 | |||
343 | /* Identity mapping of region 5 addresses in HVM. */ | ||
344 | #define XEN_IA64_OPTF_IDENT_MAP_REG5 3 | ||
345 | |||
346 | #define XEN_IA64_OPTF_IDENT_MAP_NOT_SET (0) | ||
347 | |||
348 | struct xen_ia64_opt_feature { | ||
349 | unsigned long cmd; /* Which feature */ | ||
350 | unsigned char on; /* Switch feature on/off */ | ||
351 | union { | ||
352 | struct { | ||
353 | /* The page protection bit mask of the pte. | ||
354 | * This will be or'ed with the pte. */ | ||
355 | unsigned long pgprot; | ||
356 | unsigned long key; /* A protection key for itir.*/ | ||
357 | }; | ||
358 | }; | ||
359 | }; | ||
360 | |||
361 | #endif /* __ASSEMBLY__ */ | ||
362 | |||
363 | #endif /* _ASM_IA64_XEN_INTERFACE_H */ | ||
diff --git a/arch/ia64/include/asm/xen/irq.h b/arch/ia64/include/asm/xen/irq.h deleted file mode 100644 index a90450983003..000000000000 --- a/arch/ia64/include/asm/xen/irq.h +++ /dev/null | |||
@@ -1,44 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * arch/ia64/include/asm/xen/irq.h | ||
3 | * | ||
4 | * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp> | ||
5 | * VA Linux Systems Japan K.K. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | * | ||
21 | */ | ||
22 | |||
23 | #ifndef _ASM_IA64_XEN_IRQ_H | ||
24 | #define _ASM_IA64_XEN_IRQ_H | ||
25 | |||
26 | /* | ||
27 | * The flat IRQ space is divided into two regions: | ||
28 | * 1. A one-to-one mapping of real physical IRQs. This space is only used | ||
29 | * if we have physical device-access privilege. This region is at the | ||
30 | * start of the IRQ space so that existing device drivers do not need | ||
31 | * to be modified to translate physical IRQ numbers into our IRQ space. | ||
32 | * 3. A dynamic mapping of inter-domain and Xen-sourced virtual IRQs. These | ||
33 | * are bound using the provided bind/unbind functions. | ||
34 | */ | ||
35 | |||
36 | #define XEN_PIRQ_BASE 0 | ||
37 | #define XEN_NR_PIRQS 256 | ||
38 | |||
39 | #define XEN_DYNIRQ_BASE (XEN_PIRQ_BASE + XEN_NR_PIRQS) | ||
40 | #define XEN_NR_DYNIRQS (NR_CPUS * 8) | ||
41 | |||
42 | #define XEN_NR_IRQS (XEN_NR_PIRQS + XEN_NR_DYNIRQS) | ||
43 | |||
44 | #endif /* _ASM_IA64_XEN_IRQ_H */ | ||
diff --git a/arch/ia64/include/asm/xen/minstate.h b/arch/ia64/include/asm/xen/minstate.h deleted file mode 100644 index 00cf03e0cb82..000000000000 --- a/arch/ia64/include/asm/xen/minstate.h +++ /dev/null | |||
@@ -1,143 +0,0 @@ | |||
1 | |||
2 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE | ||
3 | /* read ar.itc in advance, and use it before leaving bank 0 */ | ||
4 | #define XEN_ACCOUNT_GET_STAMP \ | ||
5 | MOV_FROM_ITC(pUStk, p6, r20, r2); | ||
6 | #else | ||
7 | #define XEN_ACCOUNT_GET_STAMP | ||
8 | #endif | ||
9 | |||
10 | /* | ||
11 | * DO_SAVE_MIN switches to the kernel stacks (if necessary) and saves | ||
12 | * the minimum state necessary that allows us to turn psr.ic back | ||
13 | * on. | ||
14 | * | ||
15 | * Assumed state upon entry: | ||
16 | * psr.ic: off | ||
17 | * r31: contains saved predicates (pr) | ||
18 | * | ||
19 | * Upon exit, the state is as follows: | ||
20 | * psr.ic: off | ||
21 | * r2 = points to &pt_regs.r16 | ||
22 | * r8 = contents of ar.ccv | ||
23 | * r9 = contents of ar.csd | ||
24 | * r10 = contents of ar.ssd | ||
25 | * r11 = FPSR_DEFAULT | ||
26 | * r12 = kernel sp (kernel virtual address) | ||
27 | * r13 = points to current task_struct (kernel virtual address) | ||
28 | * p15 = TRUE if psr.i is set in cr.ipsr | ||
29 | * predicate registers (other than p2, p3, and p15), b6, r3, r14, r15: | ||
30 | * preserved | ||
31 | * CONFIG_XEN note: p6/p7 are not preserved | ||
32 | * | ||
33 | * Note that psr.ic is NOT turned on by this macro. This is so that | ||
34 | * we can pass interruption state as arguments to a handler. | ||
35 | */ | ||
36 | #define XEN_DO_SAVE_MIN(__COVER,SAVE_IFS,EXTRA,WORKAROUND) \ | ||
37 | mov r16=IA64_KR(CURRENT); /* M */ \ | ||
38 | mov r27=ar.rsc; /* M */ \ | ||
39 | mov r20=r1; /* A */ \ | ||
40 | mov r25=ar.unat; /* M */ \ | ||
41 | MOV_FROM_IPSR(p0,r29); /* M */ \ | ||
42 | MOV_FROM_IIP(r28); /* M */ \ | ||
43 | mov r21=ar.fpsr; /* M */ \ | ||
44 | mov r26=ar.pfs; /* I */ \ | ||
45 | __COVER; /* B;; (or nothing) */ \ | ||
46 | adds r16=IA64_TASK_THREAD_ON_USTACK_OFFSET,r16; \ | ||
47 | ;; \ | ||
48 | ld1 r17=[r16]; /* load current->thread.on_ustack flag */ \ | ||
49 | st1 [r16]=r0; /* clear current->thread.on_ustack flag */ \ | ||
50 | adds r1=-IA64_TASK_THREAD_ON_USTACK_OFFSET,r16 \ | ||
51 | /* switch from user to kernel RBS: */ \ | ||
52 | ;; \ | ||
53 | invala; /* M */ \ | ||
54 | /* SAVE_IFS;*/ /* see xen special handling below */ \ | ||
55 | cmp.eq pKStk,pUStk=r0,r17; /* are we in kernel mode already? */ \ | ||
56 | ;; \ | ||
57 | (pUStk) mov ar.rsc=0; /* set enforced lazy mode, pl 0, little-endian, loadrs=0 */ \ | ||
58 | ;; \ | ||
59 | (pUStk) mov.m r24=ar.rnat; \ | ||
60 | (pUStk) addl r22=IA64_RBS_OFFSET,r1; /* compute base of RBS */ \ | ||
61 | (pKStk) mov r1=sp; /* get sp */ \ | ||
62 | ;; \ | ||
63 | (pUStk) lfetch.fault.excl.nt1 [r22]; \ | ||
64 | (pUStk) addl r1=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r1; /* compute base of memory stack */ \ | ||
65 | (pUStk) mov r23=ar.bspstore; /* save ar.bspstore */ \ | ||
66 | ;; \ | ||
67 | (pUStk) mov ar.bspstore=r22; /* switch to kernel RBS */ \ | ||
68 | (pKStk) addl r1=-IA64_PT_REGS_SIZE,r1; /* if in kernel mode, use sp (r12) */ \ | ||
69 | ;; \ | ||
70 | (pUStk) mov r18=ar.bsp; \ | ||
71 | (pUStk) mov ar.rsc=0x3; /* set eager mode, pl 0, little-endian, loadrs=0 */ \ | ||
72 | adds r17=2*L1_CACHE_BYTES,r1; /* really: biggest cache-line size */ \ | ||
73 | adds r16=PT(CR_IPSR),r1; \ | ||
74 | ;; \ | ||
75 | lfetch.fault.excl.nt1 [r17],L1_CACHE_BYTES; \ | ||
76 | st8 [r16]=r29; /* save cr.ipsr */ \ | ||
77 | ;; \ | ||
78 | lfetch.fault.excl.nt1 [r17]; \ | ||
79 | tbit.nz p15,p0=r29,IA64_PSR_I_BIT; \ | ||
80 | mov r29=b0 \ | ||
81 | ;; \ | ||
82 | WORKAROUND; \ | ||
83 | adds r16=PT(R8),r1; /* initialize first base pointer */ \ | ||
84 | adds r17=PT(R9),r1; /* initialize second base pointer */ \ | ||
85 | (pKStk) mov r18=r0; /* make sure r18 isn't NaT */ \ | ||
86 | ;; \ | ||
87 | .mem.offset 0,0; st8.spill [r16]=r8,16; \ | ||
88 | .mem.offset 8,0; st8.spill [r17]=r9,16; \ | ||
89 | ;; \ | ||
90 | .mem.offset 0,0; st8.spill [r16]=r10,24; \ | ||
91 | movl r8=XSI_PRECOVER_IFS; \ | ||
92 | .mem.offset 8,0; st8.spill [r17]=r11,24; \ | ||
93 | ;; \ | ||
94 | /* xen special handling for possibly lazy cover */ \ | ||
95 | /* SAVE_MIN case in dispatch_ia32_handler: mov r30=r0 */ \ | ||
96 | ld8 r30=[r8]; \ | ||
97 | (pUStk) sub r18=r18,r22; /* r18=RSE.ndirty*8 */ \ | ||
98 | st8 [r16]=r28,16; /* save cr.iip */ \ | ||
99 | ;; \ | ||
100 | st8 [r17]=r30,16; /* save cr.ifs */ \ | ||
101 | mov r8=ar.ccv; \ | ||
102 | mov r9=ar.csd; \ | ||
103 | mov r10=ar.ssd; \ | ||
104 | movl r11=FPSR_DEFAULT; /* L-unit */ \ | ||
105 | ;; \ | ||
106 | st8 [r16]=r25,16; /* save ar.unat */ \ | ||
107 | st8 [r17]=r26,16; /* save ar.pfs */ \ | ||
108 | shl r18=r18,16; /* compute ar.rsc to be used for "loadrs" */ \ | ||
109 | ;; \ | ||
110 | st8 [r16]=r27,16; /* save ar.rsc */ \ | ||
111 | (pUStk) st8 [r17]=r24,16; /* save ar.rnat */ \ | ||
112 | (pKStk) adds r17=16,r17; /* skip over ar_rnat field */ \ | ||
113 | ;; /* avoid RAW on r16 & r17 */ \ | ||
114 | (pUStk) st8 [r16]=r23,16; /* save ar.bspstore */ \ | ||
115 | st8 [r17]=r31,16; /* save predicates */ \ | ||
116 | (pKStk) adds r16=16,r16; /* skip over ar_bspstore field */ \ | ||
117 | ;; \ | ||
118 | st8 [r16]=r29,16; /* save b0 */ \ | ||
119 | st8 [r17]=r18,16; /* save ar.rsc value for "loadrs" */ \ | ||
120 | cmp.eq pNonSys,pSys=r0,r0 /* initialize pSys=0, pNonSys=1 */ \ | ||
121 | ;; \ | ||
122 | .mem.offset 0,0; st8.spill [r16]=r20,16; /* save original r1 */ \ | ||
123 | .mem.offset 8,0; st8.spill [r17]=r12,16; \ | ||
124 | adds r12=-16,r1; /* switch to kernel memory stack (with 16 bytes of scratch) */ \ | ||
125 | ;; \ | ||
126 | .mem.offset 0,0; st8.spill [r16]=r13,16; \ | ||
127 | .mem.offset 8,0; st8.spill [r17]=r21,16; /* save ar.fpsr */ \ | ||
128 | mov r13=IA64_KR(CURRENT); /* establish `current' */ \ | ||
129 | ;; \ | ||
130 | .mem.offset 0,0; st8.spill [r16]=r15,16; \ | ||
131 | .mem.offset 8,0; st8.spill [r17]=r14,16; \ | ||
132 | ;; \ | ||
133 | .mem.offset 0,0; st8.spill [r16]=r2,16; \ | ||
134 | .mem.offset 8,0; st8.spill [r17]=r3,16; \ | ||
135 | XEN_ACCOUNT_GET_STAMP \ | ||
136 | adds r2=IA64_PT_REGS_R16_OFFSET,r1; \ | ||
137 | ;; \ | ||
138 | EXTRA; \ | ||
139 | movl r1=__gp; /* establish kernel global pointer */ \ | ||
140 | ;; \ | ||
141 | ACCOUNT_SYS_ENTER \ | ||
142 | BSW_1(r3,r14); /* switch back to bank 1 (must be last in insn group) */ \ | ||
143 | ;; | ||
diff --git a/arch/ia64/include/asm/xen/page-coherent.h b/arch/ia64/include/asm/xen/page-coherent.h deleted file mode 100644 index 96e42f97fa1f..000000000000 --- a/arch/ia64/include/asm/xen/page-coherent.h +++ /dev/null | |||
@@ -1,38 +0,0 @@ | |||
1 | #ifndef _ASM_IA64_XEN_PAGE_COHERENT_H | ||
2 | #define _ASM_IA64_XEN_PAGE_COHERENT_H | ||
3 | |||
4 | #include <asm/page.h> | ||
5 | #include <linux/dma-attrs.h> | ||
6 | #include <linux/dma-mapping.h> | ||
7 | |||
8 | static inline void *xen_alloc_coherent_pages(struct device *hwdev, size_t size, | ||
9 | dma_addr_t *dma_handle, gfp_t flags, | ||
10 | struct dma_attrs *attrs) | ||
11 | { | ||
12 | void *vstart = (void*)__get_free_pages(flags, get_order(size)); | ||
13 | *dma_handle = virt_to_phys(vstart); | ||
14 | return vstart; | ||
15 | } | ||
16 | |||
17 | static inline void xen_free_coherent_pages(struct device *hwdev, size_t size, | ||
18 | void *cpu_addr, dma_addr_t dma_handle, | ||
19 | struct dma_attrs *attrs) | ||
20 | { | ||
21 | free_pages((unsigned long) cpu_addr, get_order(size)); | ||
22 | } | ||
23 | |||
24 | static inline void xen_dma_map_page(struct device *hwdev, struct page *page, | ||
25 | unsigned long offset, size_t size, enum dma_data_direction dir, | ||
26 | struct dma_attrs *attrs) { } | ||
27 | |||
28 | static inline void xen_dma_unmap_page(struct device *hwdev, dma_addr_t handle, | ||
29 | size_t size, enum dma_data_direction dir, | ||
30 | struct dma_attrs *attrs) { } | ||
31 | |||
32 | static inline void xen_dma_sync_single_for_cpu(struct device *hwdev, | ||
33 | dma_addr_t handle, size_t size, enum dma_data_direction dir) { } | ||
34 | |||
35 | static inline void xen_dma_sync_single_for_device(struct device *hwdev, | ||
36 | dma_addr_t handle, size_t size, enum dma_data_direction dir) { } | ||
37 | |||
38 | #endif /* _ASM_IA64_XEN_PAGE_COHERENT_H */ | ||
diff --git a/arch/ia64/include/asm/xen/page.h b/arch/ia64/include/asm/xen/page.h deleted file mode 100644 index 03441a780b5b..000000000000 --- a/arch/ia64/include/asm/xen/page.h +++ /dev/null | |||
@@ -1,65 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * arch/ia64/include/asm/xen/page.h | ||
3 | * | ||
4 | * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp> | ||
5 | * VA Linux Systems Japan K.K. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | * | ||
21 | */ | ||
22 | |||
23 | #ifndef _ASM_IA64_XEN_PAGE_H | ||
24 | #define _ASM_IA64_XEN_PAGE_H | ||
25 | |||
26 | #define INVALID_P2M_ENTRY (~0UL) | ||
27 | |||
28 | static inline unsigned long mfn_to_pfn(unsigned long mfn) | ||
29 | { | ||
30 | return mfn; | ||
31 | } | ||
32 | |||
33 | static inline unsigned long pfn_to_mfn(unsigned long pfn) | ||
34 | { | ||
35 | return pfn; | ||
36 | } | ||
37 | |||
38 | #define phys_to_machine_mapping_valid(_x) (1) | ||
39 | |||
40 | static inline void *mfn_to_virt(unsigned long mfn) | ||
41 | { | ||
42 | return __va(mfn << PAGE_SHIFT); | ||
43 | } | ||
44 | |||
45 | static inline unsigned long virt_to_mfn(void *virt) | ||
46 | { | ||
47 | return __pa(virt) >> PAGE_SHIFT; | ||
48 | } | ||
49 | |||
50 | /* for tpmfront.c */ | ||
51 | static inline unsigned long virt_to_machine(void *virt) | ||
52 | { | ||
53 | return __pa(virt); | ||
54 | } | ||
55 | |||
56 | static inline void set_phys_to_machine(unsigned long pfn, unsigned long mfn) | ||
57 | { | ||
58 | /* nothing */ | ||
59 | } | ||
60 | |||
61 | #define pte_mfn(_x) pte_pfn(_x) | ||
62 | #define mfn_pte(_x, _y) __pte_ma(0) /* unmodified use */ | ||
63 | #define __pte_ma(_x) ((pte_t) {(_x)}) /* unmodified use */ | ||
64 | |||
65 | #endif /* _ASM_IA64_XEN_PAGE_H */ | ||
diff --git a/arch/ia64/include/asm/xen/patchlist.h b/arch/ia64/include/asm/xen/patchlist.h deleted file mode 100644 index eae944e88846..000000000000 --- a/arch/ia64/include/asm/xen/patchlist.h +++ /dev/null | |||
@@ -1,38 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * arch/ia64/include/asm/xen/patchlist.h | ||
3 | * | ||
4 | * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp> | ||
5 | * VA Linux Systems Japan K.K. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | * | ||
21 | */ | ||
22 | |||
23 | #define __paravirt_start_gate_fsyscall_patchlist \ | ||
24 | __xen_start_gate_fsyscall_patchlist | ||
25 | #define __paravirt_end_gate_fsyscall_patchlist \ | ||
26 | __xen_end_gate_fsyscall_patchlist | ||
27 | #define __paravirt_start_gate_brl_fsys_bubble_down_patchlist \ | ||
28 | __xen_start_gate_brl_fsys_bubble_down_patchlist | ||
29 | #define __paravirt_end_gate_brl_fsys_bubble_down_patchlist \ | ||
30 | __xen_end_gate_brl_fsys_bubble_down_patchlist | ||
31 | #define __paravirt_start_gate_vtop_patchlist \ | ||
32 | __xen_start_gate_vtop_patchlist | ||
33 | #define __paravirt_end_gate_vtop_patchlist \ | ||
34 | __xen_end_gate_vtop_patchlist | ||
35 | #define __paravirt_start_gate_mckinley_e9_patchlist \ | ||
36 | __xen_start_gate_mckinley_e9_patchlist | ||
37 | #define __paravirt_end_gate_mckinley_e9_patchlist \ | ||
38 | __xen_end_gate_mckinley_e9_patchlist | ||
diff --git a/arch/ia64/include/asm/xen/privop.h b/arch/ia64/include/asm/xen/privop.h deleted file mode 100644 index fb4ec5e0b066..000000000000 --- a/arch/ia64/include/asm/xen/privop.h +++ /dev/null | |||
@@ -1,135 +0,0 @@ | |||
1 | #ifndef _ASM_IA64_XEN_PRIVOP_H | ||
2 | #define _ASM_IA64_XEN_PRIVOP_H | ||
3 | |||
4 | /* | ||
5 | * Copyright (C) 2005 Hewlett-Packard Co | ||
6 | * Dan Magenheimer <dan.magenheimer@hp.com> | ||
7 | * | ||
8 | * Paravirtualizations of privileged operations for Xen/ia64 | ||
9 | * | ||
10 | * | ||
11 | * inline privop and paravirt_alt support | ||
12 | * Copyright (c) 2007 Isaku Yamahata <yamahata at valinux co jp> | ||
13 | * VA Linux Systems Japan K.K. | ||
14 | * | ||
15 | */ | ||
16 | |||
17 | #ifndef __ASSEMBLY__ | ||
18 | #include <linux/types.h> /* arch-ia64.h requires uint64_t */ | ||
19 | #endif | ||
20 | #include <asm/xen/interface.h> | ||
21 | |||
22 | /* At 1 MB, before per-cpu space but still addressable using addl instead | ||
23 | of movl. */ | ||
24 | #define XSI_BASE 0xfffffffffff00000 | ||
25 | |||
26 | /* Address of mapped regs. */ | ||
27 | #define XMAPPEDREGS_BASE (XSI_BASE + XSI_SIZE) | ||
28 | |||
29 | #ifdef __ASSEMBLY__ | ||
30 | #define XEN_HYPER_RFI break HYPERPRIVOP_RFI | ||
31 | #define XEN_HYPER_RSM_PSR_DT break HYPERPRIVOP_RSM_DT | ||
32 | #define XEN_HYPER_SSM_PSR_DT break HYPERPRIVOP_SSM_DT | ||
33 | #define XEN_HYPER_COVER break HYPERPRIVOP_COVER | ||
34 | #define XEN_HYPER_ITC_D break HYPERPRIVOP_ITC_D | ||
35 | #define XEN_HYPER_ITC_I break HYPERPRIVOP_ITC_I | ||
36 | #define XEN_HYPER_SSM_I break HYPERPRIVOP_SSM_I | ||
37 | #define XEN_HYPER_GET_IVR break HYPERPRIVOP_GET_IVR | ||
38 | #define XEN_HYPER_THASH break HYPERPRIVOP_THASH | ||
39 | #define XEN_HYPER_ITR_D break HYPERPRIVOP_ITR_D | ||
40 | #define XEN_HYPER_SET_KR break HYPERPRIVOP_SET_KR | ||
41 | #define XEN_HYPER_GET_PSR break HYPERPRIVOP_GET_PSR | ||
42 | #define XEN_HYPER_SET_RR0_TO_RR4 break HYPERPRIVOP_SET_RR0_TO_RR4 | ||
43 | |||
44 | #define XSI_IFS (XSI_BASE + XSI_IFS_OFS) | ||
45 | #define XSI_PRECOVER_IFS (XSI_BASE + XSI_PRECOVER_IFS_OFS) | ||
46 | #define XSI_IFA (XSI_BASE + XSI_IFA_OFS) | ||
47 | #define XSI_ISR (XSI_BASE + XSI_ISR_OFS) | ||
48 | #define XSI_IIM (XSI_BASE + XSI_IIM_OFS) | ||
49 | #define XSI_ITIR (XSI_BASE + XSI_ITIR_OFS) | ||
50 | #define XSI_PSR_I_ADDR (XSI_BASE + XSI_PSR_I_ADDR_OFS) | ||
51 | #define XSI_PSR_IC (XSI_BASE + XSI_PSR_IC_OFS) | ||
52 | #define XSI_IPSR (XSI_BASE + XSI_IPSR_OFS) | ||
53 | #define XSI_IIP (XSI_BASE + XSI_IIP_OFS) | ||
54 | #define XSI_B1NAT (XSI_BASE + XSI_B1NATS_OFS) | ||
55 | #define XSI_BANK1_R16 (XSI_BASE + XSI_BANK1_R16_OFS) | ||
56 | #define XSI_BANKNUM (XSI_BASE + XSI_BANKNUM_OFS) | ||
57 | #define XSI_IHA (XSI_BASE + XSI_IHA_OFS) | ||
58 | #define XSI_ITC_OFFSET (XSI_BASE + XSI_ITC_OFFSET_OFS) | ||
59 | #define XSI_ITC_LAST (XSI_BASE + XSI_ITC_LAST_OFS) | ||
60 | #endif | ||
61 | |||
62 | #ifndef __ASSEMBLY__ | ||
63 | |||
64 | /************************************************/ | ||
65 | /* Instructions paravirtualized for correctness */ | ||
66 | /************************************************/ | ||
67 | |||
68 | /* "fc" and "thash" are privilege-sensitive instructions, meaning they | ||
69 | * may have different semantics depending on whether they are executed | ||
70 | * at PL0 vs PL!=0. When paravirtualized, these instructions mustn't | ||
71 | * be allowed to execute directly, lest incorrect semantics result. */ | ||
72 | extern void xen_fc(void *addr); | ||
73 | extern unsigned long xen_thash(unsigned long addr); | ||
74 | |||
75 | /* Note that "ttag" and "cover" are also privilege-sensitive; "ttag" | ||
76 | * is not currently used (though it may be in a long-format VHPT system!) | ||
77 | * and the semantics of cover only change if psr.ic is off which is very | ||
78 | * rare (and currently non-existent outside of assembly code */ | ||
79 | |||
80 | /* There are also privilege-sensitive registers. These registers are | ||
81 | * readable at any privilege level but only writable at PL0. */ | ||
82 | extern unsigned long xen_get_cpuid(int index); | ||
83 | extern unsigned long xen_get_pmd(int index); | ||
84 | |||
85 | #ifndef ASM_SUPPORTED | ||
86 | extern unsigned long xen_get_eflag(void); /* see xen_ia64_getreg */ | ||
87 | extern void xen_set_eflag(unsigned long); /* see xen_ia64_setreg */ | ||
88 | #endif | ||
89 | |||
90 | /************************************************/ | ||
91 | /* Instructions paravirtualized for performance */ | ||
92 | /************************************************/ | ||
93 | |||
94 | /* Xen uses memory-mapped virtual privileged registers for access to many | ||
95 | * performance-sensitive privileged registers. Some, like the processor | ||
96 | * status register (psr), are broken up into multiple memory locations. | ||
97 | * Others, like "pend", are abstractions based on privileged registers. | ||
98 | * "Pend" is guaranteed to be set if reading cr.ivr would return a | ||
99 | * (non-spurious) interrupt. */ | ||
100 | #define XEN_MAPPEDREGS ((struct mapped_regs *)XMAPPEDREGS_BASE) | ||
101 | |||
102 | #define XSI_PSR_I \ | ||
103 | (*XEN_MAPPEDREGS->interrupt_mask_addr) | ||
104 | #define xen_get_virtual_psr_i() \ | ||
105 | (!XSI_PSR_I) | ||
106 | #define xen_set_virtual_psr_i(_val) \ | ||
107 | ({ XSI_PSR_I = (uint8_t)(_val) ? 0 : 1; }) | ||
108 | #define xen_set_virtual_psr_ic(_val) \ | ||
109 | ({ XEN_MAPPEDREGS->interrupt_collection_enabled = _val ? 1 : 0; }) | ||
110 | #define xen_get_virtual_pend() \ | ||
111 | (*(((uint8_t *)XEN_MAPPEDREGS->interrupt_mask_addr) - 1)) | ||
112 | |||
113 | #ifndef ASM_SUPPORTED | ||
114 | /* Although all privileged operations can be left to trap and will | ||
115 | * be properly handled by Xen, some are frequent enough that we use | ||
116 | * hyperprivops for performance. */ | ||
117 | extern unsigned long xen_get_psr(void); | ||
118 | extern unsigned long xen_get_ivr(void); | ||
119 | extern unsigned long xen_get_tpr(void); | ||
120 | extern void xen_hyper_ssm_i(void); | ||
121 | extern void xen_set_itm(unsigned long); | ||
122 | extern void xen_set_tpr(unsigned long); | ||
123 | extern void xen_eoi(unsigned long); | ||
124 | extern unsigned long xen_get_rr(unsigned long index); | ||
125 | extern void xen_set_rr(unsigned long index, unsigned long val); | ||
126 | extern void xen_set_rr0_to_rr4(unsigned long val0, unsigned long val1, | ||
127 | unsigned long val2, unsigned long val3, | ||
128 | unsigned long val4); | ||
129 | extern void xen_set_kr(unsigned long index, unsigned long val); | ||
130 | extern void xen_ptcga(unsigned long addr, unsigned long size); | ||
131 | #endif /* !ASM_SUPPORTED */ | ||
132 | |||
133 | #endif /* !__ASSEMBLY__ */ | ||
134 | |||
135 | #endif /* _ASM_IA64_XEN_PRIVOP_H */ | ||
diff --git a/arch/ia64/include/asm/xen/xcom_hcall.h b/arch/ia64/include/asm/xen/xcom_hcall.h deleted file mode 100644 index 20b2950c71b6..000000000000 --- a/arch/ia64/include/asm/xen/xcom_hcall.h +++ /dev/null | |||
@@ -1,51 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2006 Tristan Gingold <tristan.gingold@bull.net>, Bull SAS | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
17 | */ | ||
18 | |||
19 | #ifndef _ASM_IA64_XEN_XCOM_HCALL_H | ||
20 | #define _ASM_IA64_XEN_XCOM_HCALL_H | ||
21 | |||
22 | /* These function creates inline or mini descriptor for the parameters and | ||
23 | calls the corresponding xencomm_arch_hypercall_X. | ||
24 | Architectures should defines HYPERVISOR_xxx as xencomm_hypercall_xxx unless | ||
25 | they want to use their own wrapper. */ | ||
26 | extern int xencomm_hypercall_console_io(int cmd, int count, char *str); | ||
27 | |||
28 | extern int xencomm_hypercall_event_channel_op(int cmd, void *op); | ||
29 | |||
30 | extern int xencomm_hypercall_xen_version(int cmd, void *arg); | ||
31 | |||
32 | extern int xencomm_hypercall_physdev_op(int cmd, void *op); | ||
33 | |||
34 | extern int xencomm_hypercall_grant_table_op(unsigned int cmd, void *op, | ||
35 | unsigned int count); | ||
36 | |||
37 | extern int xencomm_hypercall_sched_op(int cmd, void *arg); | ||
38 | |||
39 | extern int xencomm_hypercall_multicall(void *call_list, int nr_calls); | ||
40 | |||
41 | extern int xencomm_hypercall_callback_op(int cmd, void *arg); | ||
42 | |||
43 | extern int xencomm_hypercall_memory_op(unsigned int cmd, void *arg); | ||
44 | |||
45 | extern int xencomm_hypercall_suspend(unsigned long srec); | ||
46 | |||
47 | extern long xencomm_hypercall_vcpu_op(int cmd, int cpu, void *arg); | ||
48 | |||
49 | extern long xencomm_hypercall_opt_feature(void *arg); | ||
50 | |||
51 | #endif /* _ASM_IA64_XEN_XCOM_HCALL_H */ | ||
diff --git a/arch/ia64/include/asm/xen/xencomm.h b/arch/ia64/include/asm/xen/xencomm.h deleted file mode 100644 index cded677bebf2..000000000000 --- a/arch/ia64/include/asm/xen/xencomm.h +++ /dev/null | |||
@@ -1,42 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2006 Hollis Blanchard <hollisb@us.ibm.com>, IBM Corporation | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
17 | */ | ||
18 | |||
19 | #ifndef _ASM_IA64_XEN_XENCOMM_H | ||
20 | #define _ASM_IA64_XEN_XENCOMM_H | ||
21 | |||
22 | #include <xen/xencomm.h> | ||
23 | #include <asm/pgtable.h> | ||
24 | |||
25 | /* Must be called before any hypercall. */ | ||
26 | extern void xencomm_initialize(void); | ||
27 | extern int xencomm_is_initialized(void); | ||
28 | |||
29 | /* Check if virtual contiguity means physical contiguity | ||
30 | * where the passed address is a pointer value in virtual address. | ||
31 | * On ia64, identity mapping area in region 7 or the piece of region 5 | ||
32 | * that is mapped by itr[IA64_TR_KERNEL]/dtr[IA64_TR_KERNEL] | ||
33 | */ | ||
34 | static inline int xencomm_is_phys_contiguous(unsigned long addr) | ||
35 | { | ||
36 | return (PAGE_OFFSET <= addr && | ||
37 | addr < (PAGE_OFFSET + (1UL << IA64_MAX_PHYS_BITS))) || | ||
38 | (KERNEL_START <= addr && | ||
39 | addr < KERNEL_START + KERNEL_TR_PAGE_SIZE); | ||
40 | } | ||
41 | |||
42 | #endif /* _ASM_IA64_XEN_XENCOMM_H */ | ||
diff --git a/arch/ia64/include/uapi/asm/break.h b/arch/ia64/include/uapi/asm/break.h index e90c40ec9edf..f03402039896 100644 --- a/arch/ia64/include/uapi/asm/break.h +++ b/arch/ia64/include/uapi/asm/break.h | |||
@@ -20,13 +20,4 @@ | |||
20 | */ | 20 | */ |
21 | #define __IA64_BREAK_SYSCALL 0x100000 | 21 | #define __IA64_BREAK_SYSCALL 0x100000 |
22 | 22 | ||
23 | /* | ||
24 | * Xen specific break numbers: | ||
25 | */ | ||
26 | #define __IA64_XEN_HYPERCALL 0x1000 | ||
27 | /* [__IA64_XEN_HYPERPRIVOP_START, __IA64_XEN_HYPERPRIVOP_MAX] is used | ||
28 | for xen hyperprivops */ | ||
29 | #define __IA64_XEN_HYPERPRIVOP_START 0x1 | ||
30 | #define __IA64_XEN_HYPERPRIVOP_MAX 0x1a | ||
31 | |||
32 | #endif /* _ASM_IA64_BREAK_H */ | 23 | #endif /* _ASM_IA64_BREAK_H */ |
diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c index 59d52e3aef12..bfa19311e09c 100644 --- a/arch/ia64/kernel/acpi.c +++ b/arch/ia64/kernel/acpi.c | |||
@@ -53,7 +53,6 @@ | |||
53 | #include <asm/numa.h> | 53 | #include <asm/numa.h> |
54 | #include <asm/sal.h> | 54 | #include <asm/sal.h> |
55 | #include <asm/cyclone.h> | 55 | #include <asm/cyclone.h> |
56 | #include <asm/xen/hypervisor.h> | ||
57 | 56 | ||
58 | #define BAD_MADT_ENTRY(entry, end) ( \ | 57 | #define BAD_MADT_ENTRY(entry, end) ( \ |
59 | (!entry) || (unsigned long)entry + sizeof(*entry) > end || \ | 58 | (!entry) || (unsigned long)entry + sizeof(*entry) > end || \ |
@@ -120,8 +119,6 @@ acpi_get_sysname(void) | |||
120 | return "uv"; | 119 | return "uv"; |
121 | else | 120 | else |
122 | return "sn2"; | 121 | return "sn2"; |
123 | } else if (xen_pv_domain() && !strcmp(hdr->oem_id, "XEN")) { | ||
124 | return "xen"; | ||
125 | } | 122 | } |
126 | 123 | ||
127 | #ifdef CONFIG_INTEL_IOMMU | 124 | #ifdef CONFIG_INTEL_IOMMU |
diff --git a/arch/ia64/kernel/asm-offsets.c b/arch/ia64/kernel/asm-offsets.c index 46c9e3007315..60ef83e6db71 100644 --- a/arch/ia64/kernel/asm-offsets.c +++ b/arch/ia64/kernel/asm-offsets.c | |||
@@ -16,9 +16,6 @@ | |||
16 | #include <asm/sigcontext.h> | 16 | #include <asm/sigcontext.h> |
17 | #include <asm/mca.h> | 17 | #include <asm/mca.h> |
18 | 18 | ||
19 | #include <asm/xen/interface.h> | ||
20 | #include <asm/xen/hypervisor.h> | ||
21 | |||
22 | #include "../kernel/sigframe.h" | 19 | #include "../kernel/sigframe.h" |
23 | #include "../kernel/fsyscall_gtod_data.h" | 20 | #include "../kernel/fsyscall_gtod_data.h" |
24 | 21 | ||
@@ -290,33 +287,4 @@ void foo(void) | |||
290 | DEFINE(IA64_ITC_LASTCYCLE_OFFSET, | 287 | DEFINE(IA64_ITC_LASTCYCLE_OFFSET, |
291 | offsetof (struct itc_jitter_data_t, itc_lastcycle)); | 288 | offsetof (struct itc_jitter_data_t, itc_lastcycle)); |
292 | 289 | ||
293 | #ifdef CONFIG_XEN | ||
294 | BLANK(); | ||
295 | |||
296 | DEFINE(XEN_NATIVE_ASM, XEN_NATIVE); | ||
297 | DEFINE(XEN_PV_DOMAIN_ASM, XEN_PV_DOMAIN); | ||
298 | |||
299 | #define DEFINE_MAPPED_REG_OFS(sym, field) \ | ||
300 | DEFINE(sym, (XMAPPEDREGS_OFS + offsetof(struct mapped_regs, field))) | ||
301 | |||
302 | DEFINE_MAPPED_REG_OFS(XSI_PSR_I_ADDR_OFS, interrupt_mask_addr); | ||
303 | DEFINE_MAPPED_REG_OFS(XSI_IPSR_OFS, ipsr); | ||
304 | DEFINE_MAPPED_REG_OFS(XSI_IIP_OFS, iip); | ||
305 | DEFINE_MAPPED_REG_OFS(XSI_IFS_OFS, ifs); | ||
306 | DEFINE_MAPPED_REG_OFS(XSI_PRECOVER_IFS_OFS, precover_ifs); | ||
307 | DEFINE_MAPPED_REG_OFS(XSI_ISR_OFS, isr); | ||
308 | DEFINE_MAPPED_REG_OFS(XSI_IFA_OFS, ifa); | ||
309 | DEFINE_MAPPED_REG_OFS(XSI_IIPA_OFS, iipa); | ||
310 | DEFINE_MAPPED_REG_OFS(XSI_IIM_OFS, iim); | ||
311 | DEFINE_MAPPED_REG_OFS(XSI_IHA_OFS, iha); | ||
312 | DEFINE_MAPPED_REG_OFS(XSI_ITIR_OFS, itir); | ||
313 | DEFINE_MAPPED_REG_OFS(XSI_PSR_IC_OFS, interrupt_collection_enabled); | ||
314 | DEFINE_MAPPED_REG_OFS(XSI_BANKNUM_OFS, banknum); | ||
315 | DEFINE_MAPPED_REG_OFS(XSI_BANK0_R16_OFS, bank0_regs[0]); | ||
316 | DEFINE_MAPPED_REG_OFS(XSI_BANK1_R16_OFS, bank1_regs[0]); | ||
317 | DEFINE_MAPPED_REG_OFS(XSI_B0NATS_OFS, vbnat); | ||
318 | DEFINE_MAPPED_REG_OFS(XSI_B1NATS_OFS, vnat); | ||
319 | DEFINE_MAPPED_REG_OFS(XSI_ITC_OFFSET_OFS, itc_offset); | ||
320 | DEFINE_MAPPED_REG_OFS(XSI_ITC_LAST_OFS, itc_last); | ||
321 | #endif /* CONFIG_XEN */ | ||
322 | } | 290 | } |
diff --git a/arch/ia64/kernel/head.S b/arch/ia64/kernel/head.S index 991ca336b8a2..e6f80fcf013b 100644 --- a/arch/ia64/kernel/head.S +++ b/arch/ia64/kernel/head.S | |||
@@ -416,8 +416,6 @@ start_ap: | |||
416 | 416 | ||
417 | default_setup_hook = 0 // Currently nothing needs to be done. | 417 | default_setup_hook = 0 // Currently nothing needs to be done. |
418 | 418 | ||
419 | .weak xen_setup_hook | ||
420 | |||
421 | .global hypervisor_type | 419 | .global hypervisor_type |
422 | hypervisor_type: | 420 | hypervisor_type: |
423 | data8 PARAVIRT_HYPERVISOR_TYPE_DEFAULT | 421 | data8 PARAVIRT_HYPERVISOR_TYPE_DEFAULT |
@@ -426,7 +424,6 @@ hypervisor_type: | |||
426 | 424 | ||
427 | hypervisor_setup_hooks: | 425 | hypervisor_setup_hooks: |
428 | data8 default_setup_hook | 426 | data8 default_setup_hook |
429 | data8 xen_setup_hook | ||
430 | num_hypervisor_hooks = (. - hypervisor_setup_hooks) / 8 | 427 | num_hypervisor_hooks = (. - hypervisor_setup_hooks) / 8 |
431 | .previous | 428 | .previous |
432 | 429 | ||
diff --git a/arch/ia64/kernel/nr-irqs.c b/arch/ia64/kernel/nr-irqs.c index ee564575148e..f6769cd54bd9 100644 --- a/arch/ia64/kernel/nr-irqs.c +++ b/arch/ia64/kernel/nr-irqs.c | |||
@@ -10,15 +10,11 @@ | |||
10 | #include <linux/kbuild.h> | 10 | #include <linux/kbuild.h> |
11 | #include <linux/threads.h> | 11 | #include <linux/threads.h> |
12 | #include <asm/native/irq.h> | 12 | #include <asm/native/irq.h> |
13 | #include <asm/xen/irq.h> | ||
14 | 13 | ||
15 | void foo(void) | 14 | void foo(void) |
16 | { | 15 | { |
17 | union paravirt_nr_irqs_max { | 16 | union paravirt_nr_irqs_max { |
18 | char ia64_native_nr_irqs[IA64_NATIVE_NR_IRQS]; | 17 | char ia64_native_nr_irqs[IA64_NATIVE_NR_IRQS]; |
19 | #ifdef CONFIG_XEN | ||
20 | char xen_nr_irqs[XEN_NR_IRQS]; | ||
21 | #endif | ||
22 | }; | 18 | }; |
23 | 19 | ||
24 | DEFINE(NR_IRQS, sizeof (union paravirt_nr_irqs_max)); | 20 | DEFINE(NR_IRQS, sizeof (union paravirt_nr_irqs_max)); |
diff --git a/arch/ia64/kernel/paravirt_inst.h b/arch/ia64/kernel/paravirt_inst.h index 64d6d810c64b..1ad7512b5f65 100644 --- a/arch/ia64/kernel/paravirt_inst.h +++ b/arch/ia64/kernel/paravirt_inst.h | |||
@@ -22,9 +22,6 @@ | |||
22 | 22 | ||
23 | #ifdef __IA64_ASM_PARAVIRTUALIZED_PVCHECK | 23 | #ifdef __IA64_ASM_PARAVIRTUALIZED_PVCHECK |
24 | #include <asm/native/pvchk_inst.h> | 24 | #include <asm/native/pvchk_inst.h> |
25 | #elif defined(__IA64_ASM_PARAVIRTUALIZED_XEN) | ||
26 | #include <asm/xen/inst.h> | ||
27 | #include <asm/xen/minstate.h> | ||
28 | #else | 25 | #else |
29 | #include <asm/native/inst.h> | 26 | #include <asm/native/inst.h> |
30 | #endif | 27 | #endif |
diff --git a/arch/ia64/kernel/paravirt_patchlist.h b/arch/ia64/kernel/paravirt_patchlist.h index 0684aa6c6507..67cffc3643a3 100644 --- a/arch/ia64/kernel/paravirt_patchlist.h +++ b/arch/ia64/kernel/paravirt_patchlist.h | |||
@@ -20,9 +20,5 @@ | |||
20 | * | 20 | * |
21 | */ | 21 | */ |
22 | 22 | ||
23 | #if defined(__IA64_GATE_PARAVIRTUALIZED_XEN) | ||
24 | #include <asm/xen/patchlist.h> | ||
25 | #else | ||
26 | #include <asm/native/patchlist.h> | 23 | #include <asm/native/patchlist.h> |
27 | #endif | ||
28 | 24 | ||
diff --git a/arch/ia64/kernel/vmlinux.lds.S b/arch/ia64/kernel/vmlinux.lds.S index 0ccb28fab27e..84f8a52ac5ae 100644 --- a/arch/ia64/kernel/vmlinux.lds.S +++ b/arch/ia64/kernel/vmlinux.lds.S | |||
@@ -182,12 +182,6 @@ SECTIONS { | |||
182 | __start_gate_section = .; | 182 | __start_gate_section = .; |
183 | *(.data..gate) | 183 | *(.data..gate) |
184 | __stop_gate_section = .; | 184 | __stop_gate_section = .; |
185 | #ifdef CONFIG_XEN | ||
186 | . = ALIGN(PAGE_SIZE); | ||
187 | __xen_start_gate_section = .; | ||
188 | *(.data..gate.xen) | ||
189 | __xen_stop_gate_section = .; | ||
190 | #endif | ||
191 | } | 185 | } |
192 | /* | 186 | /* |
193 | * make sure the gate page doesn't expose | 187 | * make sure the gate page doesn't expose |
diff --git a/arch/ia64/mm/contig.c b/arch/ia64/mm/contig.c index da5237d636d6..52715a71aede 100644 --- a/arch/ia64/mm/contig.c +++ b/arch/ia64/mm/contig.c | |||
@@ -31,74 +31,6 @@ | |||
31 | static unsigned long max_gap; | 31 | static unsigned long max_gap; |
32 | #endif | 32 | #endif |
33 | 33 | ||
34 | /** | ||
35 | * show_mem - give short summary of memory stats | ||
36 | * | ||
37 | * Shows a simple page count of reserved and used pages in the system. | ||
38 | * For discontig machines, it does this on a per-pgdat basis. | ||
39 | */ | ||
40 | void show_mem(unsigned int filter) | ||
41 | { | ||
42 | int i, total_reserved = 0; | ||
43 | int total_shared = 0, total_cached = 0; | ||
44 | unsigned long total_present = 0; | ||
45 | pg_data_t *pgdat; | ||
46 | |||
47 | printk(KERN_INFO "Mem-info:\n"); | ||
48 | show_free_areas(filter); | ||
49 | printk(KERN_INFO "Node memory in pages:\n"); | ||
50 | if (filter & SHOW_MEM_FILTER_PAGE_COUNT) | ||
51 | return; | ||
52 | for_each_online_pgdat(pgdat) { | ||
53 | unsigned long present; | ||
54 | unsigned long flags; | ||
55 | int shared = 0, cached = 0, reserved = 0; | ||
56 | int nid = pgdat->node_id; | ||
57 | |||
58 | if (skip_free_areas_node(filter, nid)) | ||
59 | continue; | ||
60 | pgdat_resize_lock(pgdat, &flags); | ||
61 | present = pgdat->node_present_pages; | ||
62 | for(i = 0; i < pgdat->node_spanned_pages; i++) { | ||
63 | struct page *page; | ||
64 | if (unlikely(i % MAX_ORDER_NR_PAGES == 0)) | ||
65 | touch_nmi_watchdog(); | ||
66 | if (pfn_valid(pgdat->node_start_pfn + i)) | ||
67 | page = pfn_to_page(pgdat->node_start_pfn + i); | ||
68 | else { | ||
69 | #ifdef CONFIG_VIRTUAL_MEM_MAP | ||
70 | if (max_gap < LARGE_GAP) | ||
71 | continue; | ||
72 | #endif | ||
73 | i = vmemmap_find_next_valid_pfn(nid, i) - 1; | ||
74 | continue; | ||
75 | } | ||
76 | if (PageReserved(page)) | ||
77 | reserved++; | ||
78 | else if (PageSwapCache(page)) | ||
79 | cached++; | ||
80 | else if (page_count(page)) | ||
81 | shared += page_count(page)-1; | ||
82 | } | ||
83 | pgdat_resize_unlock(pgdat, &flags); | ||
84 | total_present += present; | ||
85 | total_reserved += reserved; | ||
86 | total_cached += cached; | ||
87 | total_shared += shared; | ||
88 | printk(KERN_INFO "Node %4d: RAM: %11ld, rsvd: %8d, " | ||
89 | "shrd: %10d, swpd: %10d\n", nid, | ||
90 | present, reserved, shared, cached); | ||
91 | } | ||
92 | printk(KERN_INFO "%ld pages of RAM\n", total_present); | ||
93 | printk(KERN_INFO "%d reserved pages\n", total_reserved); | ||
94 | printk(KERN_INFO "%d pages shared\n", total_shared); | ||
95 | printk(KERN_INFO "%d pages swap cached\n", total_cached); | ||
96 | printk(KERN_INFO "Total of %ld pages in page table cache\n", | ||
97 | quicklist_total_size()); | ||
98 | printk(KERN_INFO "%ld free buffer pages\n", nr_free_buffer_pages()); | ||
99 | } | ||
100 | |||
101 | |||
102 | /* physical address where the bootmem map is located */ | 34 | /* physical address where the bootmem map is located */ |
103 | unsigned long bootmap_start; | 35 | unsigned long bootmap_start; |
104 | 36 | ||
diff --git a/arch/ia64/mm/discontig.c b/arch/ia64/mm/discontig.c index 2de08f4d9930..878626805369 100644 --- a/arch/ia64/mm/discontig.c +++ b/arch/ia64/mm/discontig.c | |||
@@ -608,69 +608,6 @@ void *per_cpu_init(void) | |||
608 | #endif /* CONFIG_SMP */ | 608 | #endif /* CONFIG_SMP */ |
609 | 609 | ||
610 | /** | 610 | /** |
611 | * show_mem - give short summary of memory stats | ||
612 | * | ||
613 | * Shows a simple page count of reserved and used pages in the system. | ||
614 | * For discontig machines, it does this on a per-pgdat basis. | ||
615 | */ | ||
616 | void show_mem(unsigned int filter) | ||
617 | { | ||
618 | int i, total_reserved = 0; | ||
619 | int total_shared = 0, total_cached = 0; | ||
620 | unsigned long total_present = 0; | ||
621 | pg_data_t *pgdat; | ||
622 | |||
623 | printk(KERN_INFO "Mem-info:\n"); | ||
624 | show_free_areas(filter); | ||
625 | if (filter & SHOW_MEM_FILTER_PAGE_COUNT) | ||
626 | return; | ||
627 | printk(KERN_INFO "Node memory in pages:\n"); | ||
628 | for_each_online_pgdat(pgdat) { | ||
629 | unsigned long present; | ||
630 | unsigned long flags; | ||
631 | int shared = 0, cached = 0, reserved = 0; | ||
632 | int nid = pgdat->node_id; | ||
633 | |||
634 | if (skip_free_areas_node(filter, nid)) | ||
635 | continue; | ||
636 | pgdat_resize_lock(pgdat, &flags); | ||
637 | present = pgdat->node_present_pages; | ||
638 | for(i = 0; i < pgdat->node_spanned_pages; i++) { | ||
639 | struct page *page; | ||
640 | if (unlikely(i % MAX_ORDER_NR_PAGES == 0)) | ||
641 | touch_nmi_watchdog(); | ||
642 | if (pfn_valid(pgdat->node_start_pfn + i)) | ||
643 | page = pfn_to_page(pgdat->node_start_pfn + i); | ||
644 | else { | ||
645 | i = vmemmap_find_next_valid_pfn(nid, i) - 1; | ||
646 | continue; | ||
647 | } | ||
648 | if (PageReserved(page)) | ||
649 | reserved++; | ||
650 | else if (PageSwapCache(page)) | ||
651 | cached++; | ||
652 | else if (page_count(page)) | ||
653 | shared += page_count(page)-1; | ||
654 | } | ||
655 | pgdat_resize_unlock(pgdat, &flags); | ||
656 | total_present += present; | ||
657 | total_reserved += reserved; | ||
658 | total_cached += cached; | ||
659 | total_shared += shared; | ||
660 | printk(KERN_INFO "Node %4d: RAM: %11ld, rsvd: %8d, " | ||
661 | "shrd: %10d, swpd: %10d\n", nid, | ||
662 | present, reserved, shared, cached); | ||
663 | } | ||
664 | printk(KERN_INFO "%ld pages of RAM\n", total_present); | ||
665 | printk(KERN_INFO "%d reserved pages\n", total_reserved); | ||
666 | printk(KERN_INFO "%d pages shared\n", total_shared); | ||
667 | printk(KERN_INFO "%d pages swap cached\n", total_cached); | ||
668 | printk(KERN_INFO "Total of %ld pages in page table cache\n", | ||
669 | quicklist_total_size()); | ||
670 | printk(KERN_INFO "%ld free buffer pages\n", nr_free_buffer_pages()); | ||
671 | } | ||
672 | |||
673 | /** | ||
674 | * call_pernode_memory - use SRAT to call callback functions with node info | 611 | * call_pernode_memory - use SRAT to call callback functions with node info |
675 | * @start: physical start of range | 612 | * @start: physical start of range |
676 | * @len: length of range | 613 | * @len: length of range |
diff --git a/arch/ia64/mm/init.c b/arch/ia64/mm/init.c index 88504abf5704..25c350264a41 100644 --- a/arch/ia64/mm/init.c +++ b/arch/ia64/mm/init.c | |||
@@ -684,3 +684,51 @@ per_linux32_init(void) | |||
684 | } | 684 | } |
685 | 685 | ||
686 | __initcall(per_linux32_init); | 686 | __initcall(per_linux32_init); |
687 | |||
688 | /** | ||
689 | * show_mem - give short summary of memory stats | ||
690 | * | ||
691 | * Shows a simple page count of reserved and used pages in the system. | ||
692 | * For discontig machines, it does this on a per-pgdat basis. | ||
693 | */ | ||
694 | void show_mem(unsigned int filter) | ||
695 | { | ||
696 | int total_reserved = 0; | ||
697 | unsigned long total_present = 0; | ||
698 | pg_data_t *pgdat; | ||
699 | |||
700 | printk(KERN_INFO "Mem-info:\n"); | ||
701 | show_free_areas(filter); | ||
702 | printk(KERN_INFO "Node memory in pages:\n"); | ||
703 | for_each_online_pgdat(pgdat) { | ||
704 | unsigned long present; | ||
705 | unsigned long flags; | ||
706 | int reserved = 0; | ||
707 | int nid = pgdat->node_id; | ||
708 | int zoneid; | ||
709 | |||
710 | if (skip_free_areas_node(filter, nid)) | ||
711 | continue; | ||
712 | pgdat_resize_lock(pgdat, &flags); | ||
713 | |||
714 | for (zoneid = 0; zoneid < MAX_NR_ZONES; zoneid++) { | ||
715 | struct zone *zone = &pgdat->node_zones[zoneid]; | ||
716 | if (!populated_zone(zone)) | ||
717 | continue; | ||
718 | |||
719 | reserved += zone->present_pages - zone->managed_pages; | ||
720 | } | ||
721 | present = pgdat->node_present_pages; | ||
722 | |||
723 | pgdat_resize_unlock(pgdat, &flags); | ||
724 | total_present += present; | ||
725 | total_reserved += reserved; | ||
726 | printk(KERN_INFO "Node %4d: RAM: %11ld, rsvd: %8d, ", | ||
727 | nid, present, reserved); | ||
728 | } | ||
729 | printk(KERN_INFO "%ld pages of RAM\n", total_present); | ||
730 | printk(KERN_INFO "%d reserved pages\n", total_reserved); | ||
731 | printk(KERN_INFO "Total of %ld pages in page table cache\n", | ||
732 | quicklist_total_size()); | ||
733 | printk(KERN_INFO "%ld free buffer pages\n", nr_free_buffer_pages()); | ||
734 | } | ||
diff --git a/arch/ia64/xen/Kconfig b/arch/ia64/xen/Kconfig deleted file mode 100644 index 5d8a06b0ddf7..000000000000 --- a/arch/ia64/xen/Kconfig +++ /dev/null | |||
@@ -1,25 +0,0 @@ | |||
1 | # | ||
2 | # This Kconfig describes xen/ia64 options | ||
3 | # | ||
4 | |||
5 | config XEN | ||
6 | bool "Xen hypervisor support" | ||
7 | default y | ||
8 | depends on PARAVIRT && MCKINLEY && IA64_PAGE_SIZE_16KB | ||
9 | select XEN_XENCOMM | ||
10 | select NO_IDLE_HZ | ||
11 | # followings are required to save/restore. | ||
12 | select ARCH_SUSPEND_POSSIBLE | ||
13 | select SUSPEND | ||
14 | select PM_SLEEP | ||
15 | help | ||
16 | Enable Xen hypervisor support. Resulting kernel runs | ||
17 | both as a guest OS on Xen and natively on hardware. | ||
18 | |||
19 | config XEN_XENCOMM | ||
20 | depends on XEN | ||
21 | bool | ||
22 | |||
23 | config NO_IDLE_HZ | ||
24 | depends on XEN | ||
25 | bool | ||
diff --git a/arch/ia64/xen/Makefile b/arch/ia64/xen/Makefile deleted file mode 100644 index e6f4a0a74228..000000000000 --- a/arch/ia64/xen/Makefile +++ /dev/null | |||
@@ -1,37 +0,0 @@ | |||
1 | # | ||
2 | # Makefile for Xen components | ||
3 | # | ||
4 | |||
5 | obj-y := hypercall.o xenivt.o xensetup.o xen_pv_ops.o irq_xen.o \ | ||
6 | hypervisor.o xencomm.o xcom_hcall.o grant-table.o time.o suspend.o \ | ||
7 | gate-data.o | ||
8 | |||
9 | obj-$(CONFIG_IA64_GENERIC) += machvec.o | ||
10 | |||
11 | # The gate DSO image is built using a special linker script. | ||
12 | include $(srctree)/arch/ia64/kernel/Makefile.gate | ||
13 | |||
14 | # tell compiled for xen | ||
15 | CPPFLAGS_gate.lds += -D__IA64_GATE_PARAVIRTUALIZED_XEN | ||
16 | AFLAGS_gate.o += -D__IA64_ASM_PARAVIRTUALIZED_XEN -D__IA64_GATE_PARAVIRTUALIZED_XEN | ||
17 | |||
18 | # use same file of native. | ||
19 | $(obj)/gate.o: $(src)/../kernel/gate.S FORCE | ||
20 | $(call if_changed_dep,as_o_S) | ||
21 | $(obj)/gate.lds: $(src)/../kernel/gate.lds.S FORCE | ||
22 | $(call if_changed_dep,cpp_lds_S) | ||
23 | |||
24 | |||
25 | AFLAGS_xenivt.o += -D__IA64_ASM_PARAVIRTUALIZED_XEN | ||
26 | |||
27 | # xen multi compile | ||
28 | ASM_PARAVIRT_MULTI_COMPILE_SRCS = ivt.S entry.S fsys.S | ||
29 | ASM_PARAVIRT_OBJS = $(addprefix xen-,$(ASM_PARAVIRT_MULTI_COMPILE_SRCS:.S=.o)) | ||
30 | obj-y += $(ASM_PARAVIRT_OBJS) | ||
31 | define paravirtualized_xen | ||
32 | AFLAGS_$(1) += -D__IA64_ASM_PARAVIRTUALIZED_XEN | ||
33 | endef | ||
34 | $(foreach o,$(ASM_PARAVIRT_OBJS),$(eval $(call paravirtualized_xen,$(o)))) | ||
35 | |||
36 | $(obj)/xen-%.o: $(src)/../kernel/%.S FORCE | ||
37 | $(call if_changed_dep,as_o_S) | ||
diff --git a/arch/ia64/xen/gate-data.S b/arch/ia64/xen/gate-data.S deleted file mode 100644 index 6f95b6b32a4e..000000000000 --- a/arch/ia64/xen/gate-data.S +++ /dev/null | |||
@@ -1,3 +0,0 @@ | |||
1 | .section .data..gate.xen, "aw" | ||
2 | |||
3 | .incbin "arch/ia64/xen/gate.so" | ||
diff --git a/arch/ia64/xen/grant-table.c b/arch/ia64/xen/grant-table.c deleted file mode 100644 index c18281332f84..000000000000 --- a/arch/ia64/xen/grant-table.c +++ /dev/null | |||
@@ -1,94 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * arch/ia64/xen/grant-table.c | ||
3 | * | ||
4 | * Copyright (c) 2006 Isaku Yamahata <yamahata at valinux co jp> | ||
5 | * VA Linux Systems Japan K.K. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | * | ||
21 | */ | ||
22 | |||
23 | #include <linux/module.h> | ||
24 | #include <linux/vmalloc.h> | ||
25 | #include <linux/slab.h> | ||
26 | #include <linux/mm.h> | ||
27 | |||
28 | #include <xen/interface/xen.h> | ||
29 | #include <xen/interface/memory.h> | ||
30 | #include <xen/grant_table.h> | ||
31 | |||
32 | #include <asm/xen/hypervisor.h> | ||
33 | |||
34 | /**************************************************************************** | ||
35 | * grant table hack | ||
36 | * cmd: GNTTABOP_xxx | ||
37 | */ | ||
38 | |||
39 | int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes, | ||
40 | unsigned long max_nr_gframes, | ||
41 | struct grant_entry **__shared) | ||
42 | { | ||
43 | *__shared = __va(frames[0] << PAGE_SHIFT); | ||
44 | return 0; | ||
45 | } | ||
46 | |||
47 | void arch_gnttab_unmap_shared(struct grant_entry *shared, | ||
48 | unsigned long nr_gframes) | ||
49 | { | ||
50 | /* nothing */ | ||
51 | } | ||
52 | |||
53 | static void | ||
54 | gnttab_map_grant_ref_pre(struct gnttab_map_grant_ref *uop) | ||
55 | { | ||
56 | uint32_t flags; | ||
57 | |||
58 | flags = uop->flags; | ||
59 | |||
60 | if (flags & GNTMAP_host_map) { | ||
61 | if (flags & GNTMAP_application_map) { | ||
62 | printk(KERN_DEBUG | ||
63 | "GNTMAP_application_map is not supported yet: " | ||
64 | "flags 0x%x\n", flags); | ||
65 | BUG(); | ||
66 | } | ||
67 | if (flags & GNTMAP_contains_pte) { | ||
68 | printk(KERN_DEBUG | ||
69 | "GNTMAP_contains_pte is not supported yet: " | ||
70 | "flags 0x%x\n", flags); | ||
71 | BUG(); | ||
72 | } | ||
73 | } else if (flags & GNTMAP_device_map) { | ||
74 | printk("GNTMAP_device_map is not supported yet 0x%x\n", flags); | ||
75 | BUG(); /* not yet. actually this flag is not used. */ | ||
76 | } else { | ||
77 | BUG(); | ||
78 | } | ||
79 | } | ||
80 | |||
81 | int | ||
82 | HYPERVISOR_grant_table_op(unsigned int cmd, void *uop, unsigned int count) | ||
83 | { | ||
84 | if (cmd == GNTTABOP_map_grant_ref) { | ||
85 | unsigned int i; | ||
86 | for (i = 0; i < count; i++) { | ||
87 | gnttab_map_grant_ref_pre( | ||
88 | (struct gnttab_map_grant_ref *)uop + i); | ||
89 | } | ||
90 | } | ||
91 | return xencomm_hypercall_grant_table_op(cmd, uop, count); | ||
92 | } | ||
93 | |||
94 | EXPORT_SYMBOL(HYPERVISOR_grant_table_op); | ||
diff --git a/arch/ia64/xen/hypercall.S b/arch/ia64/xen/hypercall.S deleted file mode 100644 index 08847aa12583..000000000000 --- a/arch/ia64/xen/hypercall.S +++ /dev/null | |||
@@ -1,88 +0,0 @@ | |||
1 | /* | ||
2 | * Support routines for Xen hypercalls | ||
3 | * | ||
4 | * Copyright (C) 2005 Dan Magenheimer <dan.magenheimer@hp.com> | ||
5 | * Copyright (C) 2008 Yaozu (Eddie) Dong <eddie.dong@intel.com> | ||
6 | */ | ||
7 | |||
8 | #include <asm/asmmacro.h> | ||
9 | #include <asm/intrinsics.h> | ||
10 | #include <asm/xen/privop.h> | ||
11 | |||
12 | #ifdef __INTEL_COMPILER | ||
13 | /* | ||
14 | * Hypercalls without parameter. | ||
15 | */ | ||
16 | #define __HCALL0(name,hcall) \ | ||
17 | GLOBAL_ENTRY(name); \ | ||
18 | break hcall; \ | ||
19 | br.ret.sptk.many rp; \ | ||
20 | END(name) | ||
21 | |||
22 | /* | ||
23 | * Hypercalls with 1 parameter. | ||
24 | */ | ||
25 | #define __HCALL1(name,hcall) \ | ||
26 | GLOBAL_ENTRY(name); \ | ||
27 | mov r8=r32; \ | ||
28 | break hcall; \ | ||
29 | br.ret.sptk.many rp; \ | ||
30 | END(name) | ||
31 | |||
32 | /* | ||
33 | * Hypercalls with 2 parameters. | ||
34 | */ | ||
35 | #define __HCALL2(name,hcall) \ | ||
36 | GLOBAL_ENTRY(name); \ | ||
37 | mov r8=r32; \ | ||
38 | mov r9=r33; \ | ||
39 | break hcall; \ | ||
40 | br.ret.sptk.many rp; \ | ||
41 | END(name) | ||
42 | |||
43 | __HCALL0(xen_get_psr, HYPERPRIVOP_GET_PSR) | ||
44 | __HCALL0(xen_get_ivr, HYPERPRIVOP_GET_IVR) | ||
45 | __HCALL0(xen_get_tpr, HYPERPRIVOP_GET_TPR) | ||
46 | __HCALL0(xen_hyper_ssm_i, HYPERPRIVOP_SSM_I) | ||
47 | |||
48 | __HCALL1(xen_set_tpr, HYPERPRIVOP_SET_TPR) | ||
49 | __HCALL1(xen_eoi, HYPERPRIVOP_EOI) | ||
50 | __HCALL1(xen_thash, HYPERPRIVOP_THASH) | ||
51 | __HCALL1(xen_set_itm, HYPERPRIVOP_SET_ITM) | ||
52 | __HCALL1(xen_get_rr, HYPERPRIVOP_GET_RR) | ||
53 | __HCALL1(xen_fc, HYPERPRIVOP_FC) | ||
54 | __HCALL1(xen_get_cpuid, HYPERPRIVOP_GET_CPUID) | ||
55 | __HCALL1(xen_get_pmd, HYPERPRIVOP_GET_PMD) | ||
56 | |||
57 | __HCALL2(xen_ptcga, HYPERPRIVOP_PTC_GA) | ||
58 | __HCALL2(xen_set_rr, HYPERPRIVOP_SET_RR) | ||
59 | __HCALL2(xen_set_kr, HYPERPRIVOP_SET_KR) | ||
60 | |||
61 | GLOBAL_ENTRY(xen_set_rr0_to_rr4) | ||
62 | mov r8=r32 | ||
63 | mov r9=r33 | ||
64 | mov r10=r34 | ||
65 | mov r11=r35 | ||
66 | mov r14=r36 | ||
67 | XEN_HYPER_SET_RR0_TO_RR4 | ||
68 | br.ret.sptk.many rp | ||
69 | ;; | ||
70 | END(xen_set_rr0_to_rr4) | ||
71 | #endif | ||
72 | |||
73 | GLOBAL_ENTRY(xen_send_ipi) | ||
74 | mov r14=r32 | ||
75 | mov r15=r33 | ||
76 | mov r2=0x400 | ||
77 | break 0x1000 | ||
78 | ;; | ||
79 | br.ret.sptk.many rp | ||
80 | ;; | ||
81 | END(xen_send_ipi) | ||
82 | |||
83 | GLOBAL_ENTRY(__hypercall) | ||
84 | mov r2=r37 | ||
85 | break 0x1000 | ||
86 | br.ret.sptk.many b0 | ||
87 | ;; | ||
88 | END(__hypercall) | ||
diff --git a/arch/ia64/xen/hypervisor.c b/arch/ia64/xen/hypervisor.c deleted file mode 100644 index fab62528a80b..000000000000 --- a/arch/ia64/xen/hypervisor.c +++ /dev/null | |||
@@ -1,97 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * arch/ia64/xen/hypervisor.c | ||
3 | * | ||
4 | * Copyright (c) 2006 Isaku Yamahata <yamahata at valinux co jp> | ||
5 | * VA Linux Systems Japan K.K. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | * | ||
21 | */ | ||
22 | |||
23 | #include <linux/efi.h> | ||
24 | #include <linux/export.h> | ||
25 | #include <asm/xen/hypervisor.h> | ||
26 | #include <asm/xen/privop.h> | ||
27 | |||
28 | #include "irq_xen.h" | ||
29 | |||
30 | struct shared_info *HYPERVISOR_shared_info __read_mostly = | ||
31 | (struct shared_info *)XSI_BASE; | ||
32 | EXPORT_SYMBOL(HYPERVISOR_shared_info); | ||
33 | |||
34 | DEFINE_PER_CPU(struct vcpu_info *, xen_vcpu); | ||
35 | |||
36 | struct start_info *xen_start_info; | ||
37 | EXPORT_SYMBOL(xen_start_info); | ||
38 | |||
39 | EXPORT_SYMBOL(xen_domain_type); | ||
40 | |||
41 | EXPORT_SYMBOL(__hypercall); | ||
42 | |||
43 | /* Stolen from arch/x86/xen/enlighten.c */ | ||
44 | /* | ||
45 | * Flag to determine whether vcpu info placement is available on all | ||
46 | * VCPUs. We assume it is to start with, and then set it to zero on | ||
47 | * the first failure. This is because it can succeed on some VCPUs | ||
48 | * and not others, since it can involve hypervisor memory allocation, | ||
49 | * or because the guest failed to guarantee all the appropriate | ||
50 | * constraints on all VCPUs (ie buffer can't cross a page boundary). | ||
51 | * | ||
52 | * Note that any particular CPU may be using a placed vcpu structure, | ||
53 | * but we can only optimise if the all are. | ||
54 | * | ||
55 | * 0: not available, 1: available | ||
56 | */ | ||
57 | |||
58 | static void __init xen_vcpu_setup(int cpu) | ||
59 | { | ||
60 | /* | ||
61 | * WARNING: | ||
62 | * before changing MAX_VIRT_CPUS, | ||
63 | * check that shared_info fits on a page | ||
64 | */ | ||
65 | BUILD_BUG_ON(sizeof(struct shared_info) > PAGE_SIZE); | ||
66 | per_cpu(xen_vcpu, cpu) = &HYPERVISOR_shared_info->vcpu_info[cpu]; | ||
67 | } | ||
68 | |||
69 | void __init xen_setup_vcpu_info_placement(void) | ||
70 | { | ||
71 | int cpu; | ||
72 | |||
73 | for_each_possible_cpu(cpu) | ||
74 | xen_vcpu_setup(cpu); | ||
75 | } | ||
76 | |||
77 | void | ||
78 | xen_cpu_init(void) | ||
79 | { | ||
80 | xen_smp_intr_init(); | ||
81 | } | ||
82 | |||
83 | /************************************************************************** | ||
84 | * opt feature | ||
85 | */ | ||
86 | void | ||
87 | xen_ia64_enable_opt_feature(void) | ||
88 | { | ||
89 | /* Enable region 7 identity map optimizations in Xen */ | ||
90 | struct xen_ia64_opt_feature optf; | ||
91 | |||
92 | optf.cmd = XEN_IA64_OPTF_IDENT_MAP_REG7; | ||
93 | optf.on = XEN_IA64_OPTF_ON; | ||
94 | optf.pgprot = pgprot_val(PAGE_KERNEL); | ||
95 | optf.key = 0; /* No key on linux. */ | ||
96 | HYPERVISOR_opt_feature(&optf); | ||
97 | } | ||
diff --git a/arch/ia64/xen/irq_xen.c b/arch/ia64/xen/irq_xen.c deleted file mode 100644 index efb74dafec4d..000000000000 --- a/arch/ia64/xen/irq_xen.c +++ /dev/null | |||
@@ -1,443 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * arch/ia64/xen/irq_xen.c | ||
3 | * | ||
4 | * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp> | ||
5 | * VA Linux Systems Japan K.K. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | * | ||
21 | */ | ||
22 | |||
23 | #include <linux/cpu.h> | ||
24 | |||
25 | #include <xen/interface/xen.h> | ||
26 | #include <xen/interface/callback.h> | ||
27 | #include <xen/events.h> | ||
28 | |||
29 | #include <asm/xen/privop.h> | ||
30 | |||
31 | #include "irq_xen.h" | ||
32 | |||
33 | /*************************************************************************** | ||
34 | * pv_irq_ops | ||
35 | * irq operations | ||
36 | */ | ||
37 | |||
38 | static int | ||
39 | xen_assign_irq_vector(int irq) | ||
40 | { | ||
41 | struct physdev_irq irq_op; | ||
42 | |||
43 | irq_op.irq = irq; | ||
44 | if (HYPERVISOR_physdev_op(PHYSDEVOP_alloc_irq_vector, &irq_op)) | ||
45 | return -ENOSPC; | ||
46 | |||
47 | return irq_op.vector; | ||
48 | } | ||
49 | |||
50 | static void | ||
51 | xen_free_irq_vector(int vector) | ||
52 | { | ||
53 | struct physdev_irq irq_op; | ||
54 | |||
55 | if (vector < IA64_FIRST_DEVICE_VECTOR || | ||
56 | vector > IA64_LAST_DEVICE_VECTOR) | ||
57 | return; | ||
58 | |||
59 | irq_op.vector = vector; | ||
60 | if (HYPERVISOR_physdev_op(PHYSDEVOP_free_irq_vector, &irq_op)) | ||
61 | printk(KERN_WARNING "%s: xen_free_irq_vector fail vector=%d\n", | ||
62 | __func__, vector); | ||
63 | } | ||
64 | |||
65 | |||
66 | static DEFINE_PER_CPU(int, xen_timer_irq) = -1; | ||
67 | static DEFINE_PER_CPU(int, xen_ipi_irq) = -1; | ||
68 | static DEFINE_PER_CPU(int, xen_resched_irq) = -1; | ||
69 | static DEFINE_PER_CPU(int, xen_cmc_irq) = -1; | ||
70 | static DEFINE_PER_CPU(int, xen_cmcp_irq) = -1; | ||
71 | static DEFINE_PER_CPU(int, xen_cpep_irq) = -1; | ||
72 | #define NAME_SIZE 15 | ||
73 | static DEFINE_PER_CPU(char[NAME_SIZE], xen_timer_name); | ||
74 | static DEFINE_PER_CPU(char[NAME_SIZE], xen_ipi_name); | ||
75 | static DEFINE_PER_CPU(char[NAME_SIZE], xen_resched_name); | ||
76 | static DEFINE_PER_CPU(char[NAME_SIZE], xen_cmc_name); | ||
77 | static DEFINE_PER_CPU(char[NAME_SIZE], xen_cmcp_name); | ||
78 | static DEFINE_PER_CPU(char[NAME_SIZE], xen_cpep_name); | ||
79 | #undef NAME_SIZE | ||
80 | |||
81 | struct saved_irq { | ||
82 | unsigned int irq; | ||
83 | struct irqaction *action; | ||
84 | }; | ||
85 | /* 16 should be far optimistic value, since only several percpu irqs | ||
86 | * are registered early. | ||
87 | */ | ||
88 | #define MAX_LATE_IRQ 16 | ||
89 | static struct saved_irq saved_percpu_irqs[MAX_LATE_IRQ]; | ||
90 | static unsigned short late_irq_cnt; | ||
91 | static unsigned short saved_irq_cnt; | ||
92 | static int xen_slab_ready; | ||
93 | |||
94 | #ifdef CONFIG_SMP | ||
95 | #include <linux/sched.h> | ||
96 | |||
97 | /* Dummy stub. Though we may check XEN_RESCHEDULE_VECTOR before __do_IRQ, | ||
98 | * it ends up to issue several memory accesses upon percpu data and | ||
99 | * thus adds unnecessary traffic to other paths. | ||
100 | */ | ||
101 | static irqreturn_t | ||
102 | xen_dummy_handler(int irq, void *dev_id) | ||
103 | { | ||
104 | return IRQ_HANDLED; | ||
105 | } | ||
106 | |||
107 | static irqreturn_t | ||
108 | xen_resched_handler(int irq, void *dev_id) | ||
109 | { | ||
110 | scheduler_ipi(); | ||
111 | return IRQ_HANDLED; | ||
112 | } | ||
113 | |||
114 | static struct irqaction xen_ipi_irqaction = { | ||
115 | .handler = handle_IPI, | ||
116 | .flags = IRQF_DISABLED, | ||
117 | .name = "IPI" | ||
118 | }; | ||
119 | |||
120 | static struct irqaction xen_resched_irqaction = { | ||
121 | .handler = xen_resched_handler, | ||
122 | .flags = IRQF_DISABLED, | ||
123 | .name = "resched" | ||
124 | }; | ||
125 | |||
126 | static struct irqaction xen_tlb_irqaction = { | ||
127 | .handler = xen_dummy_handler, | ||
128 | .flags = IRQF_DISABLED, | ||
129 | .name = "tlb_flush" | ||
130 | }; | ||
131 | #endif | ||
132 | |||
133 | /* | ||
134 | * This is xen version percpu irq registration, which needs bind | ||
135 | * to xen specific evtchn sub-system. One trick here is that xen | ||
136 | * evtchn binding interface depends on kmalloc because related | ||
137 | * port needs to be freed at device/cpu down. So we cache the | ||
138 | * registration on BSP before slab is ready and then deal them | ||
139 | * at later point. For rest instances happening after slab ready, | ||
140 | * we hook them to xen evtchn immediately. | ||
141 | * | ||
142 | * FIXME: MCA is not supported by far, and thus "nomca" boot param is | ||
143 | * required. | ||
144 | */ | ||
145 | static void | ||
146 | __xen_register_percpu_irq(unsigned int cpu, unsigned int vec, | ||
147 | struct irqaction *action, int save) | ||
148 | { | ||
149 | int irq = 0; | ||
150 | |||
151 | if (xen_slab_ready) { | ||
152 | switch (vec) { | ||
153 | case IA64_TIMER_VECTOR: | ||
154 | snprintf(per_cpu(xen_timer_name, cpu), | ||
155 | sizeof(per_cpu(xen_timer_name, cpu)), | ||
156 | "%s%d", action->name, cpu); | ||
157 | irq = bind_virq_to_irqhandler(VIRQ_ITC, cpu, | ||
158 | action->handler, action->flags, | ||
159 | per_cpu(xen_timer_name, cpu), action->dev_id); | ||
160 | per_cpu(xen_timer_irq, cpu) = irq; | ||
161 | break; | ||
162 | case IA64_IPI_RESCHEDULE: | ||
163 | snprintf(per_cpu(xen_resched_name, cpu), | ||
164 | sizeof(per_cpu(xen_resched_name, cpu)), | ||
165 | "%s%d", action->name, cpu); | ||
166 | irq = bind_ipi_to_irqhandler(XEN_RESCHEDULE_VECTOR, cpu, | ||
167 | action->handler, action->flags, | ||
168 | per_cpu(xen_resched_name, cpu), action->dev_id); | ||
169 | per_cpu(xen_resched_irq, cpu) = irq; | ||
170 | break; | ||
171 | case IA64_IPI_VECTOR: | ||
172 | snprintf(per_cpu(xen_ipi_name, cpu), | ||
173 | sizeof(per_cpu(xen_ipi_name, cpu)), | ||
174 | "%s%d", action->name, cpu); | ||
175 | irq = bind_ipi_to_irqhandler(XEN_IPI_VECTOR, cpu, | ||
176 | action->handler, action->flags, | ||
177 | per_cpu(xen_ipi_name, cpu), action->dev_id); | ||
178 | per_cpu(xen_ipi_irq, cpu) = irq; | ||
179 | break; | ||
180 | case IA64_CMC_VECTOR: | ||
181 | snprintf(per_cpu(xen_cmc_name, cpu), | ||
182 | sizeof(per_cpu(xen_cmc_name, cpu)), | ||
183 | "%s%d", action->name, cpu); | ||
184 | irq = bind_virq_to_irqhandler(VIRQ_MCA_CMC, cpu, | ||
185 | action->handler, | ||
186 | action->flags, | ||
187 | per_cpu(xen_cmc_name, cpu), | ||
188 | action->dev_id); | ||
189 | per_cpu(xen_cmc_irq, cpu) = irq; | ||
190 | break; | ||
191 | case IA64_CMCP_VECTOR: | ||
192 | snprintf(per_cpu(xen_cmcp_name, cpu), | ||
193 | sizeof(per_cpu(xen_cmcp_name, cpu)), | ||
194 | "%s%d", action->name, cpu); | ||
195 | irq = bind_ipi_to_irqhandler(XEN_CMCP_VECTOR, cpu, | ||
196 | action->handler, | ||
197 | action->flags, | ||
198 | per_cpu(xen_cmcp_name, cpu), | ||
199 | action->dev_id); | ||
200 | per_cpu(xen_cmcp_irq, cpu) = irq; | ||
201 | break; | ||
202 | case IA64_CPEP_VECTOR: | ||
203 | snprintf(per_cpu(xen_cpep_name, cpu), | ||
204 | sizeof(per_cpu(xen_cpep_name, cpu)), | ||
205 | "%s%d", action->name, cpu); | ||
206 | irq = bind_ipi_to_irqhandler(XEN_CPEP_VECTOR, cpu, | ||
207 | action->handler, | ||
208 | action->flags, | ||
209 | per_cpu(xen_cpep_name, cpu), | ||
210 | action->dev_id); | ||
211 | per_cpu(xen_cpep_irq, cpu) = irq; | ||
212 | break; | ||
213 | case IA64_CPE_VECTOR: | ||
214 | case IA64_MCA_RENDEZ_VECTOR: | ||
215 | case IA64_PERFMON_VECTOR: | ||
216 | case IA64_MCA_WAKEUP_VECTOR: | ||
217 | case IA64_SPURIOUS_INT_VECTOR: | ||
218 | /* No need to complain, these aren't supported. */ | ||
219 | break; | ||
220 | default: | ||
221 | printk(KERN_WARNING "Percpu irq %d is unsupported " | ||
222 | "by xen!\n", vec); | ||
223 | break; | ||
224 | } | ||
225 | BUG_ON(irq < 0); | ||
226 | |||
227 | if (irq > 0) { | ||
228 | /* | ||
229 | * Mark percpu. Without this, migrate_irqs() will | ||
230 | * mark the interrupt for migrations and trigger it | ||
231 | * on cpu hotplug. | ||
232 | */ | ||
233 | irq_set_status_flags(irq, IRQ_PER_CPU); | ||
234 | } | ||
235 | } | ||
236 | |||
237 | /* For BSP, we cache registered percpu irqs, and then re-walk | ||
238 | * them when initializing APs | ||
239 | */ | ||
240 | if (!cpu && save) { | ||
241 | BUG_ON(saved_irq_cnt == MAX_LATE_IRQ); | ||
242 | saved_percpu_irqs[saved_irq_cnt].irq = vec; | ||
243 | saved_percpu_irqs[saved_irq_cnt].action = action; | ||
244 | saved_irq_cnt++; | ||
245 | if (!xen_slab_ready) | ||
246 | late_irq_cnt++; | ||
247 | } | ||
248 | } | ||
249 | |||
250 | static void | ||
251 | xen_register_percpu_irq(ia64_vector vec, struct irqaction *action) | ||
252 | { | ||
253 | __xen_register_percpu_irq(smp_processor_id(), vec, action, 1); | ||
254 | } | ||
255 | |||
256 | static void | ||
257 | xen_bind_early_percpu_irq(void) | ||
258 | { | ||
259 | int i; | ||
260 | |||
261 | xen_slab_ready = 1; | ||
262 | /* There's no race when accessing this cached array, since only | ||
263 | * BSP will face with such step shortly | ||
264 | */ | ||
265 | for (i = 0; i < late_irq_cnt; i++) | ||
266 | __xen_register_percpu_irq(smp_processor_id(), | ||
267 | saved_percpu_irqs[i].irq, | ||
268 | saved_percpu_irqs[i].action, 0); | ||
269 | } | ||
270 | |||
271 | /* FIXME: There's no obvious point to check whether slab is ready. So | ||
272 | * a hack is used here by utilizing a late time hook. | ||
273 | */ | ||
274 | |||
275 | #ifdef CONFIG_HOTPLUG_CPU | ||
276 | static int unbind_evtchn_callback(struct notifier_block *nfb, | ||
277 | unsigned long action, void *hcpu) | ||
278 | { | ||
279 | unsigned int cpu = (unsigned long)hcpu; | ||
280 | |||
281 | if (action == CPU_DEAD) { | ||
282 | /* Unregister evtchn. */ | ||
283 | if (per_cpu(xen_cpep_irq, cpu) >= 0) { | ||
284 | unbind_from_irqhandler(per_cpu(xen_cpep_irq, cpu), | ||
285 | NULL); | ||
286 | per_cpu(xen_cpep_irq, cpu) = -1; | ||
287 | } | ||
288 | if (per_cpu(xen_cmcp_irq, cpu) >= 0) { | ||
289 | unbind_from_irqhandler(per_cpu(xen_cmcp_irq, cpu), | ||
290 | NULL); | ||
291 | per_cpu(xen_cmcp_irq, cpu) = -1; | ||
292 | } | ||
293 | if (per_cpu(xen_cmc_irq, cpu) >= 0) { | ||
294 | unbind_from_irqhandler(per_cpu(xen_cmc_irq, cpu), NULL); | ||
295 | per_cpu(xen_cmc_irq, cpu) = -1; | ||
296 | } | ||
297 | if (per_cpu(xen_ipi_irq, cpu) >= 0) { | ||
298 | unbind_from_irqhandler(per_cpu(xen_ipi_irq, cpu), NULL); | ||
299 | per_cpu(xen_ipi_irq, cpu) = -1; | ||
300 | } | ||
301 | if (per_cpu(xen_resched_irq, cpu) >= 0) { | ||
302 | unbind_from_irqhandler(per_cpu(xen_resched_irq, cpu), | ||
303 | NULL); | ||
304 | per_cpu(xen_resched_irq, cpu) = -1; | ||
305 | } | ||
306 | if (per_cpu(xen_timer_irq, cpu) >= 0) { | ||
307 | unbind_from_irqhandler(per_cpu(xen_timer_irq, cpu), | ||
308 | NULL); | ||
309 | per_cpu(xen_timer_irq, cpu) = -1; | ||
310 | } | ||
311 | } | ||
312 | return NOTIFY_OK; | ||
313 | } | ||
314 | |||
315 | static struct notifier_block unbind_evtchn_notifier = { | ||
316 | .notifier_call = unbind_evtchn_callback, | ||
317 | .priority = 0 | ||
318 | }; | ||
319 | #endif | ||
320 | |||
321 | void xen_smp_intr_init_early(unsigned int cpu) | ||
322 | { | ||
323 | #ifdef CONFIG_SMP | ||
324 | unsigned int i; | ||
325 | |||
326 | for (i = 0; i < saved_irq_cnt; i++) | ||
327 | __xen_register_percpu_irq(cpu, saved_percpu_irqs[i].irq, | ||
328 | saved_percpu_irqs[i].action, 0); | ||
329 | #endif | ||
330 | } | ||
331 | |||
332 | void xen_smp_intr_init(void) | ||
333 | { | ||
334 | #ifdef CONFIG_SMP | ||
335 | unsigned int cpu = smp_processor_id(); | ||
336 | struct callback_register event = { | ||
337 | .type = CALLBACKTYPE_event, | ||
338 | .address = { .ip = (unsigned long)&xen_event_callback }, | ||
339 | }; | ||
340 | |||
341 | if (cpu == 0) { | ||
342 | /* Initialization was already done for boot cpu. */ | ||
343 | #ifdef CONFIG_HOTPLUG_CPU | ||
344 | /* Register the notifier only once. */ | ||
345 | register_cpu_notifier(&unbind_evtchn_notifier); | ||
346 | #endif | ||
347 | return; | ||
348 | } | ||
349 | |||
350 | /* This should be piggyback when setup vcpu guest context */ | ||
351 | BUG_ON(HYPERVISOR_callback_op(CALLBACKOP_register, &event)); | ||
352 | #endif /* CONFIG_SMP */ | ||
353 | } | ||
354 | |||
355 | void __init | ||
356 | xen_irq_init(void) | ||
357 | { | ||
358 | struct callback_register event = { | ||
359 | .type = CALLBACKTYPE_event, | ||
360 | .address = { .ip = (unsigned long)&xen_event_callback }, | ||
361 | }; | ||
362 | |||
363 | xen_init_IRQ(); | ||
364 | BUG_ON(HYPERVISOR_callback_op(CALLBACKOP_register, &event)); | ||
365 | late_time_init = xen_bind_early_percpu_irq; | ||
366 | } | ||
367 | |||
368 | void | ||
369 | xen_platform_send_ipi(int cpu, int vector, int delivery_mode, int redirect) | ||
370 | { | ||
371 | #ifdef CONFIG_SMP | ||
372 | /* TODO: we need to call vcpu_up here */ | ||
373 | if (unlikely(vector == ap_wakeup_vector)) { | ||
374 | /* XXX | ||
375 | * This should be in __cpu_up(cpu) in ia64 smpboot.c | ||
376 | * like x86. But don't want to modify it, | ||
377 | * keep it untouched. | ||
378 | */ | ||
379 | xen_smp_intr_init_early(cpu); | ||
380 | |||
381 | xen_send_ipi(cpu, vector); | ||
382 | /* vcpu_prepare_and_up(cpu); */ | ||
383 | return; | ||
384 | } | ||
385 | #endif | ||
386 | |||
387 | switch (vector) { | ||
388 | case IA64_IPI_VECTOR: | ||
389 | xen_send_IPI_one(cpu, XEN_IPI_VECTOR); | ||
390 | break; | ||
391 | case IA64_IPI_RESCHEDULE: | ||
392 | xen_send_IPI_one(cpu, XEN_RESCHEDULE_VECTOR); | ||
393 | break; | ||
394 | case IA64_CMCP_VECTOR: | ||
395 | xen_send_IPI_one(cpu, XEN_CMCP_VECTOR); | ||
396 | break; | ||
397 | case IA64_CPEP_VECTOR: | ||
398 | xen_send_IPI_one(cpu, XEN_CPEP_VECTOR); | ||
399 | break; | ||
400 | case IA64_TIMER_VECTOR: { | ||
401 | /* this is used only once by check_sal_cache_flush() | ||
402 | at boot time */ | ||
403 | static int used = 0; | ||
404 | if (!used) { | ||
405 | xen_send_ipi(cpu, IA64_TIMER_VECTOR); | ||
406 | used = 1; | ||
407 | break; | ||
408 | } | ||
409 | /* fallthrough */ | ||
410 | } | ||
411 | default: | ||
412 | printk(KERN_WARNING "Unsupported IPI type 0x%x\n", | ||
413 | vector); | ||
414 | notify_remote_via_irq(0); /* defaults to 0 irq */ | ||
415 | break; | ||
416 | } | ||
417 | } | ||
418 | |||
419 | static void __init | ||
420 | xen_register_ipi(void) | ||
421 | { | ||
422 | #ifdef CONFIG_SMP | ||
423 | register_percpu_irq(IA64_IPI_VECTOR, &xen_ipi_irqaction); | ||
424 | register_percpu_irq(IA64_IPI_RESCHEDULE, &xen_resched_irqaction); | ||
425 | register_percpu_irq(IA64_IPI_LOCAL_TLB_FLUSH, &xen_tlb_irqaction); | ||
426 | #endif | ||
427 | } | ||
428 | |||
429 | static void | ||
430 | xen_resend_irq(unsigned int vector) | ||
431 | { | ||
432 | (void)resend_irq_on_evtchn(vector); | ||
433 | } | ||
434 | |||
435 | const struct pv_irq_ops xen_irq_ops __initconst = { | ||
436 | .register_ipi = xen_register_ipi, | ||
437 | |||
438 | .assign_irq_vector = xen_assign_irq_vector, | ||
439 | .free_irq_vector = xen_free_irq_vector, | ||
440 | .register_percpu_irq = xen_register_percpu_irq, | ||
441 | |||
442 | .resend_irq = xen_resend_irq, | ||
443 | }; | ||
diff --git a/arch/ia64/xen/irq_xen.h b/arch/ia64/xen/irq_xen.h deleted file mode 100644 index 1778517b90fe..000000000000 --- a/arch/ia64/xen/irq_xen.h +++ /dev/null | |||
@@ -1,34 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * arch/ia64/xen/irq_xen.h | ||
3 | * | ||
4 | * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp> | ||
5 | * VA Linux Systems Japan K.K. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | * | ||
21 | */ | ||
22 | |||
23 | #ifndef IRQ_XEN_H | ||
24 | #define IRQ_XEN_H | ||
25 | |||
26 | extern void (*late_time_init)(void); | ||
27 | extern char xen_event_callback; | ||
28 | void __init xen_init_IRQ(void); | ||
29 | |||
30 | extern const struct pv_irq_ops xen_irq_ops __initconst; | ||
31 | extern void xen_smp_intr_init(void); | ||
32 | extern void xen_send_ipi(int cpu, int vec); | ||
33 | |||
34 | #endif /* IRQ_XEN_H */ | ||
diff --git a/arch/ia64/xen/machvec.c b/arch/ia64/xen/machvec.c deleted file mode 100644 index 4ad588a7c279..000000000000 --- a/arch/ia64/xen/machvec.c +++ /dev/null | |||
@@ -1,4 +0,0 @@ | |||
1 | #define MACHVEC_PLATFORM_NAME xen | ||
2 | #define MACHVEC_PLATFORM_HEADER <asm/machvec_xen.h> | ||
3 | #include <asm/machvec_init.h> | ||
4 | |||
diff --git a/arch/ia64/xen/suspend.c b/arch/ia64/xen/suspend.c deleted file mode 100644 index 419c8620945a..000000000000 --- a/arch/ia64/xen/suspend.c +++ /dev/null | |||
@@ -1,59 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * arch/ia64/xen/suspend.c | ||
3 | * | ||
4 | * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp> | ||
5 | * VA Linux Systems Japan K.K. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | * | ||
21 | * suspend/resume | ||
22 | */ | ||
23 | |||
24 | #include <xen/xen-ops.h> | ||
25 | #include <asm/xen/hypervisor.h> | ||
26 | #include "time.h" | ||
27 | |||
28 | void | ||
29 | xen_mm_pin_all(void) | ||
30 | { | ||
31 | /* nothing */ | ||
32 | } | ||
33 | |||
34 | void | ||
35 | xen_mm_unpin_all(void) | ||
36 | { | ||
37 | /* nothing */ | ||
38 | } | ||
39 | |||
40 | void | ||
41 | xen_arch_pre_suspend() | ||
42 | { | ||
43 | /* nothing */ | ||
44 | } | ||
45 | |||
46 | void | ||
47 | xen_arch_post_suspend(int suspend_cancelled) | ||
48 | { | ||
49 | if (suspend_cancelled) | ||
50 | return; | ||
51 | |||
52 | xen_ia64_enable_opt_feature(); | ||
53 | /* add more if necessary */ | ||
54 | } | ||
55 | |||
56 | void xen_arch_resume(void) | ||
57 | { | ||
58 | xen_timer_resume_on_aps(); | ||
59 | } | ||
diff --git a/arch/ia64/xen/time.c b/arch/ia64/xen/time.c deleted file mode 100644 index 1f8244a78bee..000000000000 --- a/arch/ia64/xen/time.c +++ /dev/null | |||
@@ -1,257 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * arch/ia64/xen/time.c | ||
3 | * | ||
4 | * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp> | ||
5 | * VA Linux Systems Japan K.K. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | * | ||
21 | */ | ||
22 | |||
23 | #include <linux/delay.h> | ||
24 | #include <linux/kernel_stat.h> | ||
25 | #include <linux/posix-timers.h> | ||
26 | #include <linux/irq.h> | ||
27 | #include <linux/clocksource.h> | ||
28 | |||
29 | #include <asm/timex.h> | ||
30 | |||
31 | #include <asm/xen/hypervisor.h> | ||
32 | |||
33 | #include <xen/interface/vcpu.h> | ||
34 | |||
35 | #include "../kernel/fsyscall_gtod_data.h" | ||
36 | |||
37 | static DEFINE_PER_CPU(struct vcpu_runstate_info, xen_runstate); | ||
38 | static DEFINE_PER_CPU(unsigned long, xen_stolen_time); | ||
39 | static DEFINE_PER_CPU(unsigned long, xen_blocked_time); | ||
40 | |||
41 | /* taken from i386/kernel/time-xen.c */ | ||
42 | static void xen_init_missing_ticks_accounting(int cpu) | ||
43 | { | ||
44 | struct vcpu_register_runstate_memory_area area; | ||
45 | struct vcpu_runstate_info *runstate = &per_cpu(xen_runstate, cpu); | ||
46 | int rc; | ||
47 | |||
48 | memset(runstate, 0, sizeof(*runstate)); | ||
49 | |||
50 | area.addr.v = runstate; | ||
51 | rc = HYPERVISOR_vcpu_op(VCPUOP_register_runstate_memory_area, cpu, | ||
52 | &area); | ||
53 | WARN_ON(rc && rc != -ENOSYS); | ||
54 | |||
55 | per_cpu(xen_blocked_time, cpu) = runstate->time[RUNSTATE_blocked]; | ||
56 | per_cpu(xen_stolen_time, cpu) = runstate->time[RUNSTATE_runnable] | ||
57 | + runstate->time[RUNSTATE_offline]; | ||
58 | } | ||
59 | |||
60 | /* | ||
61 | * Runstate accounting | ||
62 | */ | ||
63 | /* stolen from arch/x86/xen/time.c */ | ||
64 | static void get_runstate_snapshot(struct vcpu_runstate_info *res) | ||
65 | { | ||
66 | u64 state_time; | ||
67 | struct vcpu_runstate_info *state; | ||
68 | |||
69 | BUG_ON(preemptible()); | ||
70 | |||
71 | state = &__get_cpu_var(xen_runstate); | ||
72 | |||
73 | /* | ||
74 | * The runstate info is always updated by the hypervisor on | ||
75 | * the current CPU, so there's no need to use anything | ||
76 | * stronger than a compiler barrier when fetching it. | ||
77 | */ | ||
78 | do { | ||
79 | state_time = state->state_entry_time; | ||
80 | rmb(); | ||
81 | *res = *state; | ||
82 | rmb(); | ||
83 | } while (state->state_entry_time != state_time); | ||
84 | } | ||
85 | |||
86 | #define NS_PER_TICK (1000000000LL/HZ) | ||
87 | |||
88 | static unsigned long | ||
89 | consider_steal_time(unsigned long new_itm) | ||
90 | { | ||
91 | unsigned long stolen, blocked; | ||
92 | unsigned long delta_itm = 0, stolentick = 0; | ||
93 | int cpu = smp_processor_id(); | ||
94 | struct vcpu_runstate_info runstate; | ||
95 | struct task_struct *p = current; | ||
96 | |||
97 | get_runstate_snapshot(&runstate); | ||
98 | |||
99 | /* | ||
100 | * Check for vcpu migration effect | ||
101 | * In this case, itc value is reversed. | ||
102 | * This causes huge stolen value. | ||
103 | * This function just checks and reject this effect. | ||
104 | */ | ||
105 | if (!time_after_eq(runstate.time[RUNSTATE_blocked], | ||
106 | per_cpu(xen_blocked_time, cpu))) | ||
107 | blocked = 0; | ||
108 | |||
109 | if (!time_after_eq(runstate.time[RUNSTATE_runnable] + | ||
110 | runstate.time[RUNSTATE_offline], | ||
111 | per_cpu(xen_stolen_time, cpu))) | ||
112 | stolen = 0; | ||
113 | |||
114 | if (!time_after(delta_itm + new_itm, ia64_get_itc())) | ||
115 | stolentick = ia64_get_itc() - new_itm; | ||
116 | |||
117 | do_div(stolentick, NS_PER_TICK); | ||
118 | stolentick++; | ||
119 | |||
120 | do_div(stolen, NS_PER_TICK); | ||
121 | |||
122 | if (stolen > stolentick) | ||
123 | stolen = stolentick; | ||
124 | |||
125 | stolentick -= stolen; | ||
126 | do_div(blocked, NS_PER_TICK); | ||
127 | |||
128 | if (blocked > stolentick) | ||
129 | blocked = stolentick; | ||
130 | |||
131 | if (stolen > 0 || blocked > 0) { | ||
132 | account_steal_ticks(stolen); | ||
133 | account_idle_ticks(blocked); | ||
134 | run_local_timers(); | ||
135 | |||
136 | rcu_check_callbacks(cpu, user_mode(get_irq_regs())); | ||
137 | |||
138 | scheduler_tick(); | ||
139 | run_posix_cpu_timers(p); | ||
140 | delta_itm += local_cpu_data->itm_delta * (stolen + blocked); | ||
141 | |||
142 | if (cpu == time_keeper_id) | ||
143 | xtime_update(stolen + blocked); | ||
144 | |||
145 | local_cpu_data->itm_next = delta_itm + new_itm; | ||
146 | |||
147 | per_cpu(xen_stolen_time, cpu) += NS_PER_TICK * stolen; | ||
148 | per_cpu(xen_blocked_time, cpu) += NS_PER_TICK * blocked; | ||
149 | } | ||
150 | return delta_itm; | ||
151 | } | ||
152 | |||
153 | static int xen_do_steal_accounting(unsigned long *new_itm) | ||
154 | { | ||
155 | unsigned long delta_itm; | ||
156 | delta_itm = consider_steal_time(*new_itm); | ||
157 | *new_itm += delta_itm; | ||
158 | if (time_after(*new_itm, ia64_get_itc()) && delta_itm) | ||
159 | return 1; | ||
160 | |||
161 | return 0; | ||
162 | } | ||
163 | |||
164 | static void xen_itc_jitter_data_reset(void) | ||
165 | { | ||
166 | u64 lcycle, ret; | ||
167 | |||
168 | do { | ||
169 | lcycle = itc_jitter_data.itc_lastcycle; | ||
170 | ret = cmpxchg(&itc_jitter_data.itc_lastcycle, lcycle, 0); | ||
171 | } while (unlikely(ret != lcycle)); | ||
172 | } | ||
173 | |||
174 | /* based on xen_sched_clock() in arch/x86/xen/time.c. */ | ||
175 | /* | ||
176 | * This relies on HAVE_UNSTABLE_SCHED_CLOCK. If it can't be defined, | ||
177 | * something similar logic should be implemented here. | ||
178 | */ | ||
179 | /* | ||
180 | * Xen sched_clock implementation. Returns the number of unstolen | ||
181 | * nanoseconds, which is nanoseconds the VCPU spent in RUNNING+BLOCKED | ||
182 | * states. | ||
183 | */ | ||
184 | static unsigned long long xen_sched_clock(void) | ||
185 | { | ||
186 | struct vcpu_runstate_info runstate; | ||
187 | |||
188 | unsigned long long now; | ||
189 | unsigned long long offset; | ||
190 | unsigned long long ret; | ||
191 | |||
192 | /* | ||
193 | * Ideally sched_clock should be called on a per-cpu basis | ||
194 | * anyway, so preempt should already be disabled, but that's | ||
195 | * not current practice at the moment. | ||
196 | */ | ||
197 | preempt_disable(); | ||
198 | |||
199 | /* | ||
200 | * both ia64_native_sched_clock() and xen's runstate are | ||
201 | * based on mAR.ITC. So difference of them makes sense. | ||
202 | */ | ||
203 | now = ia64_native_sched_clock(); | ||
204 | |||
205 | get_runstate_snapshot(&runstate); | ||
206 | |||
207 | WARN_ON(runstate.state != RUNSTATE_running); | ||
208 | |||
209 | offset = 0; | ||
210 | if (now > runstate.state_entry_time) | ||
211 | offset = now - runstate.state_entry_time; | ||
212 | ret = runstate.time[RUNSTATE_blocked] + | ||
213 | runstate.time[RUNSTATE_running] + | ||
214 | offset; | ||
215 | |||
216 | preempt_enable(); | ||
217 | |||
218 | return ret; | ||
219 | } | ||
220 | |||
221 | struct pv_time_ops xen_time_ops __initdata = { | ||
222 | .init_missing_ticks_accounting = xen_init_missing_ticks_accounting, | ||
223 | .do_steal_accounting = xen_do_steal_accounting, | ||
224 | .clocksource_resume = xen_itc_jitter_data_reset, | ||
225 | .sched_clock = xen_sched_clock, | ||
226 | }; | ||
227 | |||
228 | /* Called after suspend, to resume time. */ | ||
229 | static void xen_local_tick_resume(void) | ||
230 | { | ||
231 | /* Just trigger a tick. */ | ||
232 | ia64_cpu_local_tick(); | ||
233 | touch_softlockup_watchdog(); | ||
234 | } | ||
235 | |||
236 | void | ||
237 | xen_timer_resume(void) | ||
238 | { | ||
239 | unsigned int cpu; | ||
240 | |||
241 | xen_local_tick_resume(); | ||
242 | |||
243 | for_each_online_cpu(cpu) | ||
244 | xen_init_missing_ticks_accounting(cpu); | ||
245 | } | ||
246 | |||
247 | static void ia64_cpu_local_tick_fn(void *unused) | ||
248 | { | ||
249 | xen_local_tick_resume(); | ||
250 | xen_init_missing_ticks_accounting(smp_processor_id()); | ||
251 | } | ||
252 | |||
253 | void | ||
254 | xen_timer_resume_on_aps(void) | ||
255 | { | ||
256 | smp_call_function(&ia64_cpu_local_tick_fn, NULL, 1); | ||
257 | } | ||
diff --git a/arch/ia64/xen/time.h b/arch/ia64/xen/time.h deleted file mode 100644 index f98d7e1a42f0..000000000000 --- a/arch/ia64/xen/time.h +++ /dev/null | |||
@@ -1,24 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * arch/ia64/xen/time.h | ||
3 | * | ||
4 | * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp> | ||
5 | * VA Linux Systems Japan K.K. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | * | ||
21 | */ | ||
22 | |||
23 | extern struct pv_time_ops xen_time_ops __initdata; | ||
24 | void xen_timer_resume_on_aps(void); | ||
diff --git a/arch/ia64/xen/xcom_hcall.c b/arch/ia64/xen/xcom_hcall.c deleted file mode 100644 index ccaf7431f7c8..000000000000 --- a/arch/ia64/xen/xcom_hcall.c +++ /dev/null | |||
@@ -1,441 +0,0 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify | ||
3 | * it under the terms of the GNU General Public License as published by | ||
4 | * the Free Software Foundation; either version 2 of the License, or | ||
5 | * (at your option) any later version. | ||
6 | * | ||
7 | * This program is distributed in the hope that it will be useful, | ||
8 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
9 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
10 | * GNU General Public License for more details. | ||
11 | * | ||
12 | * You should have received a copy of the GNU General Public License | ||
13 | * along with this program; if not, write to the Free Software | ||
14 | * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||
15 | * | ||
16 | * Tristan Gingold <tristan.gingold@bull.net> | ||
17 | * | ||
18 | * Copyright (c) 2007 | ||
19 | * Isaku Yamahata <yamahata at valinux co jp> | ||
20 | * VA Linux Systems Japan K.K. | ||
21 | * consolidate mini and inline version. | ||
22 | */ | ||
23 | |||
24 | #include <linux/module.h> | ||
25 | #include <xen/interface/xen.h> | ||
26 | #include <xen/interface/memory.h> | ||
27 | #include <xen/interface/grant_table.h> | ||
28 | #include <xen/interface/callback.h> | ||
29 | #include <xen/interface/vcpu.h> | ||
30 | #include <asm/xen/hypervisor.h> | ||
31 | #include <asm/xen/xencomm.h> | ||
32 | |||
33 | /* Xencomm notes: | ||
34 | * This file defines hypercalls to be used by xencomm. The hypercalls simply | ||
35 | * create inlines or mini descriptors for pointers and then call the raw arch | ||
36 | * hypercall xencomm_arch_hypercall_XXX | ||
37 | * | ||
38 | * If the arch wants to directly use these hypercalls, simply define macros | ||
39 | * in asm/xen/hypercall.h, eg: | ||
40 | * #define HYPERVISOR_sched_op xencomm_hypercall_sched_op | ||
41 | * | ||
42 | * The arch may also define HYPERVISOR_xxx as a function and do more operations | ||
43 | * before/after doing the hypercall. | ||
44 | * | ||
45 | * Note: because only inline or mini descriptors are created these functions | ||
46 | * must only be called with in kernel memory parameters. | ||
47 | */ | ||
48 | |||
49 | int | ||
50 | xencomm_hypercall_console_io(int cmd, int count, char *str) | ||
51 | { | ||
52 | /* xen early printk uses console io hypercall before | ||
53 | * xencomm initialization. In that case, we just ignore it. | ||
54 | */ | ||
55 | if (!xencomm_is_initialized()) | ||
56 | return 0; | ||
57 | |||
58 | return xencomm_arch_hypercall_console_io | ||
59 | (cmd, count, xencomm_map_no_alloc(str, count)); | ||
60 | } | ||
61 | EXPORT_SYMBOL_GPL(xencomm_hypercall_console_io); | ||
62 | |||
63 | int | ||
64 | xencomm_hypercall_event_channel_op(int cmd, void *op) | ||
65 | { | ||
66 | struct xencomm_handle *desc; | ||
67 | desc = xencomm_map_no_alloc(op, sizeof(struct evtchn_op)); | ||
68 | if (desc == NULL) | ||
69 | return -EINVAL; | ||
70 | |||
71 | return xencomm_arch_hypercall_event_channel_op(cmd, desc); | ||
72 | } | ||
73 | EXPORT_SYMBOL_GPL(xencomm_hypercall_event_channel_op); | ||
74 | |||
75 | int | ||
76 | xencomm_hypercall_xen_version(int cmd, void *arg) | ||
77 | { | ||
78 | struct xencomm_handle *desc; | ||
79 | unsigned int argsize; | ||
80 | |||
81 | switch (cmd) { | ||
82 | case XENVER_version: | ||
83 | /* do not actually pass an argument */ | ||
84 | return xencomm_arch_hypercall_xen_version(cmd, 0); | ||
85 | case XENVER_extraversion: | ||
86 | argsize = sizeof(struct xen_extraversion); | ||
87 | break; | ||
88 | case XENVER_compile_info: | ||
89 | argsize = sizeof(struct xen_compile_info); | ||
90 | break; | ||
91 | case XENVER_capabilities: | ||
92 | argsize = sizeof(struct xen_capabilities_info); | ||
93 | break; | ||
94 | case XENVER_changeset: | ||
95 | argsize = sizeof(struct xen_changeset_info); | ||
96 | break; | ||
97 | case XENVER_platform_parameters: | ||
98 | argsize = sizeof(struct xen_platform_parameters); | ||
99 | break; | ||
100 | case XENVER_get_features: | ||
101 | argsize = (arg == NULL) ? 0 : sizeof(struct xen_feature_info); | ||
102 | break; | ||
103 | |||
104 | default: | ||
105 | printk(KERN_DEBUG | ||
106 | "%s: unknown version op %d\n", __func__, cmd); | ||
107 | return -ENOSYS; | ||
108 | } | ||
109 | |||
110 | desc = xencomm_map_no_alloc(arg, argsize); | ||
111 | if (desc == NULL) | ||
112 | return -EINVAL; | ||
113 | |||
114 | return xencomm_arch_hypercall_xen_version(cmd, desc); | ||
115 | } | ||
116 | EXPORT_SYMBOL_GPL(xencomm_hypercall_xen_version); | ||
117 | |||
118 | int | ||
119 | xencomm_hypercall_physdev_op(int cmd, void *op) | ||
120 | { | ||
121 | unsigned int argsize; | ||
122 | |||
123 | switch (cmd) { | ||
124 | case PHYSDEVOP_apic_read: | ||
125 | case PHYSDEVOP_apic_write: | ||
126 | argsize = sizeof(struct physdev_apic); | ||
127 | break; | ||
128 | case PHYSDEVOP_alloc_irq_vector: | ||
129 | case PHYSDEVOP_free_irq_vector: | ||
130 | argsize = sizeof(struct physdev_irq); | ||
131 | break; | ||
132 | case PHYSDEVOP_irq_status_query: | ||
133 | argsize = sizeof(struct physdev_irq_status_query); | ||
134 | break; | ||
135 | |||
136 | default: | ||
137 | printk(KERN_DEBUG | ||
138 | "%s: unknown physdev op %d\n", __func__, cmd); | ||
139 | return -ENOSYS; | ||
140 | } | ||
141 | |||
142 | return xencomm_arch_hypercall_physdev_op | ||
143 | (cmd, xencomm_map_no_alloc(op, argsize)); | ||
144 | } | ||
145 | |||
146 | static int | ||
147 | xencommize_grant_table_op(struct xencomm_mini **xc_area, | ||
148 | unsigned int cmd, void *op, unsigned int count, | ||
149 | struct xencomm_handle **desc) | ||
150 | { | ||
151 | struct xencomm_handle *desc1; | ||
152 | unsigned int argsize; | ||
153 | |||
154 | switch (cmd) { | ||
155 | case GNTTABOP_map_grant_ref: | ||
156 | argsize = sizeof(struct gnttab_map_grant_ref); | ||
157 | break; | ||
158 | case GNTTABOP_unmap_grant_ref: | ||
159 | argsize = sizeof(struct gnttab_unmap_grant_ref); | ||
160 | break; | ||
161 | case GNTTABOP_setup_table: | ||
162 | { | ||
163 | struct gnttab_setup_table *setup = op; | ||
164 | |||
165 | argsize = sizeof(*setup); | ||
166 | |||
167 | if (count != 1) | ||
168 | return -EINVAL; | ||
169 | desc1 = __xencomm_map_no_alloc | ||
170 | (xen_guest_handle(setup->frame_list), | ||
171 | setup->nr_frames * | ||
172 | sizeof(*xen_guest_handle(setup->frame_list)), | ||
173 | *xc_area); | ||
174 | if (desc1 == NULL) | ||
175 | return -EINVAL; | ||
176 | (*xc_area)++; | ||
177 | set_xen_guest_handle(setup->frame_list, (void *)desc1); | ||
178 | break; | ||
179 | } | ||
180 | case GNTTABOP_dump_table: | ||
181 | argsize = sizeof(struct gnttab_dump_table); | ||
182 | break; | ||
183 | case GNTTABOP_transfer: | ||
184 | argsize = sizeof(struct gnttab_transfer); | ||
185 | break; | ||
186 | case GNTTABOP_copy: | ||
187 | argsize = sizeof(struct gnttab_copy); | ||
188 | break; | ||
189 | case GNTTABOP_query_size: | ||
190 | argsize = sizeof(struct gnttab_query_size); | ||
191 | break; | ||
192 | default: | ||
193 | printk(KERN_DEBUG "%s: unknown hypercall grant table op %d\n", | ||
194 | __func__, cmd); | ||
195 | BUG(); | ||
196 | } | ||
197 | |||
198 | *desc = __xencomm_map_no_alloc(op, count * argsize, *xc_area); | ||
199 | if (*desc == NULL) | ||
200 | return -EINVAL; | ||
201 | (*xc_area)++; | ||
202 | |||
203 | return 0; | ||
204 | } | ||
205 | |||
206 | int | ||
207 | xencomm_hypercall_grant_table_op(unsigned int cmd, void *op, | ||
208 | unsigned int count) | ||
209 | { | ||
210 | int rc; | ||
211 | struct xencomm_handle *desc; | ||
212 | XENCOMM_MINI_ALIGNED(xc_area, 2); | ||
213 | |||
214 | rc = xencommize_grant_table_op(&xc_area, cmd, op, count, &desc); | ||
215 | if (rc) | ||
216 | return rc; | ||
217 | |||
218 | return xencomm_arch_hypercall_grant_table_op(cmd, desc, count); | ||
219 | } | ||
220 | EXPORT_SYMBOL_GPL(xencomm_hypercall_grant_table_op); | ||
221 | |||
222 | int | ||
223 | xencomm_hypercall_sched_op(int cmd, void *arg) | ||
224 | { | ||
225 | struct xencomm_handle *desc; | ||
226 | unsigned int argsize; | ||
227 | |||
228 | switch (cmd) { | ||
229 | case SCHEDOP_yield: | ||
230 | case SCHEDOP_block: | ||
231 | argsize = 0; | ||
232 | break; | ||
233 | case SCHEDOP_shutdown: | ||
234 | argsize = sizeof(struct sched_shutdown); | ||
235 | break; | ||
236 | case SCHEDOP_poll: | ||
237 | { | ||
238 | struct sched_poll *poll = arg; | ||
239 | struct xencomm_handle *ports; | ||
240 | |||
241 | argsize = sizeof(struct sched_poll); | ||
242 | ports = xencomm_map_no_alloc(xen_guest_handle(poll->ports), | ||
243 | sizeof(*xen_guest_handle(poll->ports))); | ||
244 | |||
245 | set_xen_guest_handle(poll->ports, (void *)ports); | ||
246 | break; | ||
247 | } | ||
248 | default: | ||
249 | printk(KERN_DEBUG "%s: unknown sched op %d\n", __func__, cmd); | ||
250 | return -ENOSYS; | ||
251 | } | ||
252 | |||
253 | desc = xencomm_map_no_alloc(arg, argsize); | ||
254 | if (desc == NULL) | ||
255 | return -EINVAL; | ||
256 | |||
257 | return xencomm_arch_hypercall_sched_op(cmd, desc); | ||
258 | } | ||
259 | EXPORT_SYMBOL_GPL(xencomm_hypercall_sched_op); | ||
260 | |||
261 | int | ||
262 | xencomm_hypercall_multicall(void *call_list, int nr_calls) | ||
263 | { | ||
264 | int rc; | ||
265 | int i; | ||
266 | struct multicall_entry *mce; | ||
267 | struct xencomm_handle *desc; | ||
268 | XENCOMM_MINI_ALIGNED(xc_area, nr_calls * 2); | ||
269 | |||
270 | for (i = 0; i < nr_calls; i++) { | ||
271 | mce = (struct multicall_entry *)call_list + i; | ||
272 | |||
273 | switch (mce->op) { | ||
274 | case __HYPERVISOR_update_va_mapping: | ||
275 | case __HYPERVISOR_mmu_update: | ||
276 | /* No-op on ia64. */ | ||
277 | break; | ||
278 | case __HYPERVISOR_grant_table_op: | ||
279 | rc = xencommize_grant_table_op | ||
280 | (&xc_area, | ||
281 | mce->args[0], (void *)mce->args[1], | ||
282 | mce->args[2], &desc); | ||
283 | if (rc) | ||
284 | return rc; | ||
285 | mce->args[1] = (unsigned long)desc; | ||
286 | break; | ||
287 | case __HYPERVISOR_memory_op: | ||
288 | default: | ||
289 | printk(KERN_DEBUG | ||
290 | "%s: unhandled multicall op entry op %lu\n", | ||
291 | __func__, mce->op); | ||
292 | return -ENOSYS; | ||
293 | } | ||
294 | } | ||
295 | |||
296 | desc = xencomm_map_no_alloc(call_list, | ||
297 | nr_calls * sizeof(struct multicall_entry)); | ||
298 | if (desc == NULL) | ||
299 | return -EINVAL; | ||
300 | |||
301 | return xencomm_arch_hypercall_multicall(desc, nr_calls); | ||
302 | } | ||
303 | EXPORT_SYMBOL_GPL(xencomm_hypercall_multicall); | ||
304 | |||
305 | int | ||
306 | xencomm_hypercall_callback_op(int cmd, void *arg) | ||
307 | { | ||
308 | unsigned int argsize; | ||
309 | switch (cmd) { | ||
310 | case CALLBACKOP_register: | ||
311 | argsize = sizeof(struct callback_register); | ||
312 | break; | ||
313 | case CALLBACKOP_unregister: | ||
314 | argsize = sizeof(struct callback_unregister); | ||
315 | break; | ||
316 | default: | ||
317 | printk(KERN_DEBUG | ||
318 | "%s: unknown callback op %d\n", __func__, cmd); | ||
319 | return -ENOSYS; | ||
320 | } | ||
321 | |||
322 | return xencomm_arch_hypercall_callback_op | ||
323 | (cmd, xencomm_map_no_alloc(arg, argsize)); | ||
324 | } | ||
325 | |||
326 | static int | ||
327 | xencommize_memory_reservation(struct xencomm_mini *xc_area, | ||
328 | struct xen_memory_reservation *mop) | ||
329 | { | ||
330 | struct xencomm_handle *desc; | ||
331 | |||
332 | desc = __xencomm_map_no_alloc(xen_guest_handle(mop->extent_start), | ||
333 | mop->nr_extents * | ||
334 | sizeof(*xen_guest_handle(mop->extent_start)), | ||
335 | xc_area); | ||
336 | if (desc == NULL) | ||
337 | return -EINVAL; | ||
338 | |||
339 | set_xen_guest_handle(mop->extent_start, (void *)desc); | ||
340 | return 0; | ||
341 | } | ||
342 | |||
343 | int | ||
344 | xencomm_hypercall_memory_op(unsigned int cmd, void *arg) | ||
345 | { | ||
346 | GUEST_HANDLE(xen_pfn_t) extent_start_va[2] = { {NULL}, {NULL} }; | ||
347 | struct xen_memory_reservation *xmr = NULL; | ||
348 | int rc; | ||
349 | struct xencomm_handle *desc; | ||
350 | unsigned int argsize; | ||
351 | XENCOMM_MINI_ALIGNED(xc_area, 2); | ||
352 | |||
353 | switch (cmd) { | ||
354 | case XENMEM_increase_reservation: | ||
355 | case XENMEM_decrease_reservation: | ||
356 | case XENMEM_populate_physmap: | ||
357 | xmr = (struct xen_memory_reservation *)arg; | ||
358 | set_xen_guest_handle(extent_start_va[0], | ||
359 | xen_guest_handle(xmr->extent_start)); | ||
360 | |||
361 | argsize = sizeof(*xmr); | ||
362 | rc = xencommize_memory_reservation(xc_area, xmr); | ||
363 | if (rc) | ||
364 | return rc; | ||
365 | xc_area++; | ||
366 | break; | ||
367 | |||
368 | case XENMEM_maximum_ram_page: | ||
369 | argsize = 0; | ||
370 | break; | ||
371 | |||
372 | case XENMEM_add_to_physmap: | ||
373 | argsize = sizeof(struct xen_add_to_physmap); | ||
374 | break; | ||
375 | |||
376 | default: | ||
377 | printk(KERN_DEBUG "%s: unknown memory op %d\n", __func__, cmd); | ||
378 | return -ENOSYS; | ||
379 | } | ||
380 | |||
381 | desc = xencomm_map_no_alloc(arg, argsize); | ||
382 | if (desc == NULL) | ||
383 | return -EINVAL; | ||
384 | |||
385 | rc = xencomm_arch_hypercall_memory_op(cmd, desc); | ||
386 | |||
387 | switch (cmd) { | ||
388 | case XENMEM_increase_reservation: | ||
389 | case XENMEM_decrease_reservation: | ||
390 | case XENMEM_populate_physmap: | ||
391 | set_xen_guest_handle(xmr->extent_start, | ||
392 | xen_guest_handle(extent_start_va[0])); | ||
393 | break; | ||
394 | } | ||
395 | |||
396 | return rc; | ||
397 | } | ||
398 | EXPORT_SYMBOL_GPL(xencomm_hypercall_memory_op); | ||
399 | |||
400 | int | ||
401 | xencomm_hypercall_suspend(unsigned long srec) | ||
402 | { | ||
403 | struct sched_shutdown arg; | ||
404 | |||
405 | arg.reason = SHUTDOWN_suspend; | ||
406 | |||
407 | return xencomm_arch_hypercall_sched_op( | ||
408 | SCHEDOP_shutdown, xencomm_map_no_alloc(&arg, sizeof(arg))); | ||
409 | } | ||
410 | |||
411 | long | ||
412 | xencomm_hypercall_vcpu_op(int cmd, int cpu, void *arg) | ||
413 | { | ||
414 | unsigned int argsize; | ||
415 | switch (cmd) { | ||
416 | case VCPUOP_register_runstate_memory_area: { | ||
417 | struct vcpu_register_runstate_memory_area *area = | ||
418 | (struct vcpu_register_runstate_memory_area *)arg; | ||
419 | argsize = sizeof(*arg); | ||
420 | set_xen_guest_handle(area->addr.h, | ||
421 | (void *)xencomm_map_no_alloc(area->addr.v, | ||
422 | sizeof(area->addr.v))); | ||
423 | break; | ||
424 | } | ||
425 | |||
426 | default: | ||
427 | printk(KERN_DEBUG "%s: unknown vcpu op %d\n", __func__, cmd); | ||
428 | return -ENOSYS; | ||
429 | } | ||
430 | |||
431 | return xencomm_arch_hypercall_vcpu_op(cmd, cpu, | ||
432 | xencomm_map_no_alloc(arg, argsize)); | ||
433 | } | ||
434 | |||
435 | long | ||
436 | xencomm_hypercall_opt_feature(void *arg) | ||
437 | { | ||
438 | return xencomm_arch_hypercall_opt_feature( | ||
439 | xencomm_map_no_alloc(arg, | ||
440 | sizeof(struct xen_ia64_opt_feature))); | ||
441 | } | ||
diff --git a/arch/ia64/xen/xen_pv_ops.c b/arch/ia64/xen/xen_pv_ops.c deleted file mode 100644 index 3e8d350fdf39..000000000000 --- a/arch/ia64/xen/xen_pv_ops.c +++ /dev/null | |||
@@ -1,1141 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * arch/ia64/xen/xen_pv_ops.c | ||
3 | * | ||
4 | * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp> | ||
5 | * VA Linux Systems Japan K.K. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | * | ||
21 | */ | ||
22 | |||
23 | #include <linux/console.h> | ||
24 | #include <linux/irq.h> | ||
25 | #include <linux/kernel.h> | ||
26 | #include <linux/pm.h> | ||
27 | #include <linux/unistd.h> | ||
28 | |||
29 | #include <asm/xen/hypervisor.h> | ||
30 | #include <asm/xen/xencomm.h> | ||
31 | #include <asm/xen/privop.h> | ||
32 | |||
33 | #include "irq_xen.h" | ||
34 | #include "time.h" | ||
35 | |||
36 | /*************************************************************************** | ||
37 | * general info | ||
38 | */ | ||
39 | static struct pv_info xen_info __initdata = { | ||
40 | .kernel_rpl = 2, /* or 1: determin at runtime */ | ||
41 | .paravirt_enabled = 1, | ||
42 | .name = "Xen/ia64", | ||
43 | }; | ||
44 | |||
45 | #define IA64_RSC_PL_SHIFT 2 | ||
46 | #define IA64_RSC_PL_BIT_SIZE 2 | ||
47 | #define IA64_RSC_PL_MASK \ | ||
48 | (((1UL << IA64_RSC_PL_BIT_SIZE) - 1) << IA64_RSC_PL_SHIFT) | ||
49 | |||
50 | static void __init | ||
51 | xen_info_init(void) | ||
52 | { | ||
53 | /* Xenified Linux/ia64 may run on pl = 1 or 2. | ||
54 | * determin at run time. */ | ||
55 | unsigned long rsc = ia64_getreg(_IA64_REG_AR_RSC); | ||
56 | unsigned int rpl = (rsc & IA64_RSC_PL_MASK) >> IA64_RSC_PL_SHIFT; | ||
57 | xen_info.kernel_rpl = rpl; | ||
58 | } | ||
59 | |||
60 | /*************************************************************************** | ||
61 | * pv_init_ops | ||
62 | * initialization hooks. | ||
63 | */ | ||
64 | |||
65 | static void | ||
66 | xen_panic_hypercall(struct unw_frame_info *info, void *arg) | ||
67 | { | ||
68 | current->thread.ksp = (__u64)info->sw - 16; | ||
69 | HYPERVISOR_shutdown(SHUTDOWN_crash); | ||
70 | /* we're never actually going to get here... */ | ||
71 | } | ||
72 | |||
73 | static int | ||
74 | xen_panic_event(struct notifier_block *this, unsigned long event, void *ptr) | ||
75 | { | ||
76 | unw_init_running(xen_panic_hypercall, NULL); | ||
77 | /* we're never actually going to get here... */ | ||
78 | return NOTIFY_DONE; | ||
79 | } | ||
80 | |||
81 | static struct notifier_block xen_panic_block = { | ||
82 | xen_panic_event, NULL, 0 /* try to go last */ | ||
83 | }; | ||
84 | |||
85 | static void xen_pm_power_off(void) | ||
86 | { | ||
87 | local_irq_disable(); | ||
88 | HYPERVISOR_shutdown(SHUTDOWN_poweroff); | ||
89 | } | ||
90 | |||
91 | static void __init | ||
92 | xen_banner(void) | ||
93 | { | ||
94 | printk(KERN_INFO | ||
95 | "Running on Xen! pl = %d start_info_pfn=0x%lx nr_pages=%ld " | ||
96 | "flags=0x%x\n", | ||
97 | xen_info.kernel_rpl, | ||
98 | HYPERVISOR_shared_info->arch.start_info_pfn, | ||
99 | xen_start_info->nr_pages, xen_start_info->flags); | ||
100 | } | ||
101 | |||
102 | static int __init | ||
103 | xen_reserve_memory(struct rsvd_region *region) | ||
104 | { | ||
105 | region->start = (unsigned long)__va( | ||
106 | (HYPERVISOR_shared_info->arch.start_info_pfn << PAGE_SHIFT)); | ||
107 | region->end = region->start + PAGE_SIZE; | ||
108 | return 1; | ||
109 | } | ||
110 | |||
111 | static void __init | ||
112 | xen_arch_setup_early(void) | ||
113 | { | ||
114 | struct shared_info *s; | ||
115 | BUG_ON(!xen_pv_domain()); | ||
116 | |||
117 | s = HYPERVISOR_shared_info; | ||
118 | xen_start_info = __va(s->arch.start_info_pfn << PAGE_SHIFT); | ||
119 | |||
120 | /* Must be done before any hypercall. */ | ||
121 | xencomm_initialize(); | ||
122 | |||
123 | xen_setup_features(); | ||
124 | /* Register a call for panic conditions. */ | ||
125 | atomic_notifier_chain_register(&panic_notifier_list, | ||
126 | &xen_panic_block); | ||
127 | pm_power_off = xen_pm_power_off; | ||
128 | |||
129 | xen_ia64_enable_opt_feature(); | ||
130 | } | ||
131 | |||
132 | static void __init | ||
133 | xen_arch_setup_console(char **cmdline_p) | ||
134 | { | ||
135 | add_preferred_console("xenboot", 0, NULL); | ||
136 | add_preferred_console("tty", 0, NULL); | ||
137 | /* use hvc_xen */ | ||
138 | add_preferred_console("hvc", 0, NULL); | ||
139 | |||
140 | #if !defined(CONFIG_VT) || !defined(CONFIG_DUMMY_CONSOLE) | ||
141 | conswitchp = NULL; | ||
142 | #endif | ||
143 | } | ||
144 | |||
145 | static int __init | ||
146 | xen_arch_setup_nomca(void) | ||
147 | { | ||
148 | return 1; | ||
149 | } | ||
150 | |||
151 | static void __init | ||
152 | xen_post_smp_prepare_boot_cpu(void) | ||
153 | { | ||
154 | xen_setup_vcpu_info_placement(); | ||
155 | } | ||
156 | |||
157 | #ifdef ASM_SUPPORTED | ||
158 | static unsigned long __init_or_module | ||
159 | xen_patch_bundle(void *sbundle, void *ebundle, unsigned long type); | ||
160 | #endif | ||
161 | static void __init | ||
162 | xen_patch_branch(unsigned long tag, unsigned long type); | ||
163 | |||
164 | static const struct pv_init_ops xen_init_ops __initconst = { | ||
165 | .banner = xen_banner, | ||
166 | |||
167 | .reserve_memory = xen_reserve_memory, | ||
168 | |||
169 | .arch_setup_early = xen_arch_setup_early, | ||
170 | .arch_setup_console = xen_arch_setup_console, | ||
171 | .arch_setup_nomca = xen_arch_setup_nomca, | ||
172 | |||
173 | .post_smp_prepare_boot_cpu = xen_post_smp_prepare_boot_cpu, | ||
174 | #ifdef ASM_SUPPORTED | ||
175 | .patch_bundle = xen_patch_bundle, | ||
176 | #endif | ||
177 | .patch_branch = xen_patch_branch, | ||
178 | }; | ||
179 | |||
180 | /*************************************************************************** | ||
181 | * pv_fsys_data | ||
182 | * addresses for fsys | ||
183 | */ | ||
184 | |||
185 | extern unsigned long xen_fsyscall_table[NR_syscalls]; | ||
186 | extern char xen_fsys_bubble_down[]; | ||
187 | struct pv_fsys_data xen_fsys_data __initdata = { | ||
188 | .fsyscall_table = (unsigned long *)xen_fsyscall_table, | ||
189 | .fsys_bubble_down = (void *)xen_fsys_bubble_down, | ||
190 | }; | ||
191 | |||
192 | /*************************************************************************** | ||
193 | * pv_patchdata | ||
194 | * patchdata addresses | ||
195 | */ | ||
196 | |||
197 | #define DECLARE(name) \ | ||
198 | extern unsigned long __xen_start_gate_##name##_patchlist[]; \ | ||
199 | extern unsigned long __xen_end_gate_##name##_patchlist[] | ||
200 | |||
201 | DECLARE(fsyscall); | ||
202 | DECLARE(brl_fsys_bubble_down); | ||
203 | DECLARE(vtop); | ||
204 | DECLARE(mckinley_e9); | ||
205 | |||
206 | extern unsigned long __xen_start_gate_section[]; | ||
207 | |||
208 | #define ASSIGN(name) \ | ||
209 | .start_##name##_patchlist = \ | ||
210 | (unsigned long)__xen_start_gate_##name##_patchlist, \ | ||
211 | .end_##name##_patchlist = \ | ||
212 | (unsigned long)__xen_end_gate_##name##_patchlist | ||
213 | |||
214 | static struct pv_patchdata xen_patchdata __initdata = { | ||
215 | ASSIGN(fsyscall), | ||
216 | ASSIGN(brl_fsys_bubble_down), | ||
217 | ASSIGN(vtop), | ||
218 | ASSIGN(mckinley_e9), | ||
219 | |||
220 | .gate_section = (void*)__xen_start_gate_section, | ||
221 | }; | ||
222 | |||
223 | /*************************************************************************** | ||
224 | * pv_cpu_ops | ||
225 | * intrinsics hooks. | ||
226 | */ | ||
227 | |||
228 | #ifndef ASM_SUPPORTED | ||
229 | static void | ||
230 | xen_set_itm_with_offset(unsigned long val) | ||
231 | { | ||
232 | /* ia64_cpu_local_tick() calls this with interrupt enabled. */ | ||
233 | /* WARN_ON(!irqs_disabled()); */ | ||
234 | xen_set_itm(val - XEN_MAPPEDREGS->itc_offset); | ||
235 | } | ||
236 | |||
237 | static unsigned long | ||
238 | xen_get_itm_with_offset(void) | ||
239 | { | ||
240 | /* unused at this moment */ | ||
241 | printk(KERN_DEBUG "%s is called.\n", __func__); | ||
242 | |||
243 | WARN_ON(!irqs_disabled()); | ||
244 | return ia64_native_getreg(_IA64_REG_CR_ITM) + | ||
245 | XEN_MAPPEDREGS->itc_offset; | ||
246 | } | ||
247 | |||
248 | /* ia64_set_itc() is only called by | ||
249 | * cpu_init() with ia64_set_itc(0) and ia64_sync_itc(). | ||
250 | * So XEN_MAPPEDRESG->itc_offset cal be considered as almost constant. | ||
251 | */ | ||
252 | static void | ||
253 | xen_set_itc(unsigned long val) | ||
254 | { | ||
255 | unsigned long mitc; | ||
256 | |||
257 | WARN_ON(!irqs_disabled()); | ||
258 | mitc = ia64_native_getreg(_IA64_REG_AR_ITC); | ||
259 | XEN_MAPPEDREGS->itc_offset = val - mitc; | ||
260 | XEN_MAPPEDREGS->itc_last = val; | ||
261 | } | ||
262 | |||
263 | static unsigned long | ||
264 | xen_get_itc(void) | ||
265 | { | ||
266 | unsigned long res; | ||
267 | unsigned long itc_offset; | ||
268 | unsigned long itc_last; | ||
269 | unsigned long ret_itc_last; | ||
270 | |||
271 | itc_offset = XEN_MAPPEDREGS->itc_offset; | ||
272 | do { | ||
273 | itc_last = XEN_MAPPEDREGS->itc_last; | ||
274 | res = ia64_native_getreg(_IA64_REG_AR_ITC); | ||
275 | res += itc_offset; | ||
276 | if (itc_last >= res) | ||
277 | res = itc_last + 1; | ||
278 | ret_itc_last = cmpxchg(&XEN_MAPPEDREGS->itc_last, | ||
279 | itc_last, res); | ||
280 | } while (unlikely(ret_itc_last != itc_last)); | ||
281 | return res; | ||
282 | |||
283 | #if 0 | ||
284 | /* ia64_itc_udelay() calls ia64_get_itc() with interrupt enabled. | ||
285 | Should it be paravirtualized instead? */ | ||
286 | WARN_ON(!irqs_disabled()); | ||
287 | itc_offset = XEN_MAPPEDREGS->itc_offset; | ||
288 | itc_last = XEN_MAPPEDREGS->itc_last; | ||
289 | res = ia64_native_getreg(_IA64_REG_AR_ITC); | ||
290 | res += itc_offset; | ||
291 | if (itc_last >= res) | ||
292 | res = itc_last + 1; | ||
293 | XEN_MAPPEDREGS->itc_last = res; | ||
294 | return res; | ||
295 | #endif | ||
296 | } | ||
297 | |||
298 | static void xen_setreg(int regnum, unsigned long val) | ||
299 | { | ||
300 | switch (regnum) { | ||
301 | case _IA64_REG_AR_KR0 ... _IA64_REG_AR_KR7: | ||
302 | xen_set_kr(regnum - _IA64_REG_AR_KR0, val); | ||
303 | break; | ||
304 | case _IA64_REG_AR_ITC: | ||
305 | xen_set_itc(val); | ||
306 | break; | ||
307 | case _IA64_REG_CR_TPR: | ||
308 | xen_set_tpr(val); | ||
309 | break; | ||
310 | case _IA64_REG_CR_ITM: | ||
311 | xen_set_itm_with_offset(val); | ||
312 | break; | ||
313 | case _IA64_REG_CR_EOI: | ||
314 | xen_eoi(val); | ||
315 | break; | ||
316 | default: | ||
317 | ia64_native_setreg_func(regnum, val); | ||
318 | break; | ||
319 | } | ||
320 | } | ||
321 | |||
322 | static unsigned long xen_getreg(int regnum) | ||
323 | { | ||
324 | unsigned long res; | ||
325 | |||
326 | switch (regnum) { | ||
327 | case _IA64_REG_PSR: | ||
328 | res = xen_get_psr(); | ||
329 | break; | ||
330 | case _IA64_REG_AR_ITC: | ||
331 | res = xen_get_itc(); | ||
332 | break; | ||
333 | case _IA64_REG_CR_ITM: | ||
334 | res = xen_get_itm_with_offset(); | ||
335 | break; | ||
336 | case _IA64_REG_CR_IVR: | ||
337 | res = xen_get_ivr(); | ||
338 | break; | ||
339 | case _IA64_REG_CR_TPR: | ||
340 | res = xen_get_tpr(); | ||
341 | break; | ||
342 | default: | ||
343 | res = ia64_native_getreg_func(regnum); | ||
344 | break; | ||
345 | } | ||
346 | return res; | ||
347 | } | ||
348 | |||
349 | /* turning on interrupts is a bit more complicated.. write to the | ||
350 | * memory-mapped virtual psr.i bit first (to avoid race condition), | ||
351 | * then if any interrupts were pending, we have to execute a hyperprivop | ||
352 | * to ensure the pending interrupt gets delivered; else we're done! */ | ||
353 | static void | ||
354 | xen_ssm_i(void) | ||
355 | { | ||
356 | int old = xen_get_virtual_psr_i(); | ||
357 | xen_set_virtual_psr_i(1); | ||
358 | barrier(); | ||
359 | if (!old && xen_get_virtual_pend()) | ||
360 | xen_hyper_ssm_i(); | ||
361 | } | ||
362 | |||
363 | /* turning off interrupts can be paravirtualized simply by writing | ||
364 | * to a memory-mapped virtual psr.i bit (implemented as a 16-bit bool) */ | ||
365 | static void | ||
366 | xen_rsm_i(void) | ||
367 | { | ||
368 | xen_set_virtual_psr_i(0); | ||
369 | barrier(); | ||
370 | } | ||
371 | |||
372 | static unsigned long | ||
373 | xen_get_psr_i(void) | ||
374 | { | ||
375 | return xen_get_virtual_psr_i() ? IA64_PSR_I : 0; | ||
376 | } | ||
377 | |||
378 | static void | ||
379 | xen_intrin_local_irq_restore(unsigned long mask) | ||
380 | { | ||
381 | if (mask & IA64_PSR_I) | ||
382 | xen_ssm_i(); | ||
383 | else | ||
384 | xen_rsm_i(); | ||
385 | } | ||
386 | #else | ||
387 | #define __DEFINE_FUNC(name, code) \ | ||
388 | extern const char xen_ ## name ## _direct_start[]; \ | ||
389 | extern const char xen_ ## name ## _direct_end[]; \ | ||
390 | asm (".align 32\n" \ | ||
391 | ".proc xen_" #name "\n" \ | ||
392 | "xen_" #name ":\n" \ | ||
393 | "xen_" #name "_direct_start:\n" \ | ||
394 | code \ | ||
395 | "xen_" #name "_direct_end:\n" \ | ||
396 | "br.cond.sptk.many b6\n" \ | ||
397 | ".endp xen_" #name "\n") | ||
398 | |||
399 | #define DEFINE_VOID_FUNC0(name, code) \ | ||
400 | extern void \ | ||
401 | xen_ ## name (void); \ | ||
402 | __DEFINE_FUNC(name, code) | ||
403 | |||
404 | #define DEFINE_VOID_FUNC1(name, code) \ | ||
405 | extern void \ | ||
406 | xen_ ## name (unsigned long arg); \ | ||
407 | __DEFINE_FUNC(name, code) | ||
408 | |||
409 | #define DEFINE_VOID_FUNC1_VOID(name, code) \ | ||
410 | extern void \ | ||
411 | xen_ ## name (void *arg); \ | ||
412 | __DEFINE_FUNC(name, code) | ||
413 | |||
414 | #define DEFINE_VOID_FUNC2(name, code) \ | ||
415 | extern void \ | ||
416 | xen_ ## name (unsigned long arg0, \ | ||
417 | unsigned long arg1); \ | ||
418 | __DEFINE_FUNC(name, code) | ||
419 | |||
420 | #define DEFINE_FUNC0(name, code) \ | ||
421 | extern unsigned long \ | ||
422 | xen_ ## name (void); \ | ||
423 | __DEFINE_FUNC(name, code) | ||
424 | |||
425 | #define DEFINE_FUNC1(name, type, code) \ | ||
426 | extern unsigned long \ | ||
427 | xen_ ## name (type arg); \ | ||
428 | __DEFINE_FUNC(name, code) | ||
429 | |||
430 | #define XEN_PSR_I_ADDR_ADDR (XSI_BASE + XSI_PSR_I_ADDR_OFS) | ||
431 | |||
432 | /* | ||
433 | * static void xen_set_itm_with_offset(unsigned long val) | ||
434 | * xen_set_itm(val - XEN_MAPPEDREGS->itc_offset); | ||
435 | */ | ||
436 | /* 2 bundles */ | ||
437 | DEFINE_VOID_FUNC1(set_itm_with_offset, | ||
438 | "mov r2 = " __stringify(XSI_BASE) " + " | ||
439 | __stringify(XSI_ITC_OFFSET_OFS) "\n" | ||
440 | ";;\n" | ||
441 | "ld8 r3 = [r2]\n" | ||
442 | ";;\n" | ||
443 | "sub r8 = r8, r3\n" | ||
444 | "break " __stringify(HYPERPRIVOP_SET_ITM) "\n"); | ||
445 | |||
446 | /* | ||
447 | * static unsigned long xen_get_itm_with_offset(void) | ||
448 | * return ia64_native_getreg(_IA64_REG_CR_ITM) + XEN_MAPPEDREGS->itc_offset; | ||
449 | */ | ||
450 | /* 2 bundles */ | ||
451 | DEFINE_FUNC0(get_itm_with_offset, | ||
452 | "mov r2 = " __stringify(XSI_BASE) " + " | ||
453 | __stringify(XSI_ITC_OFFSET_OFS) "\n" | ||
454 | ";;\n" | ||
455 | "ld8 r3 = [r2]\n" | ||
456 | "mov r8 = cr.itm\n" | ||
457 | ";;\n" | ||
458 | "add r8 = r8, r2\n"); | ||
459 | |||
460 | /* | ||
461 | * static void xen_set_itc(unsigned long val) | ||
462 | * unsigned long mitc; | ||
463 | * | ||
464 | * WARN_ON(!irqs_disabled()); | ||
465 | * mitc = ia64_native_getreg(_IA64_REG_AR_ITC); | ||
466 | * XEN_MAPPEDREGS->itc_offset = val - mitc; | ||
467 | * XEN_MAPPEDREGS->itc_last = val; | ||
468 | */ | ||
469 | /* 2 bundles */ | ||
470 | DEFINE_VOID_FUNC1(set_itc, | ||
471 | "mov r2 = " __stringify(XSI_BASE) " + " | ||
472 | __stringify(XSI_ITC_LAST_OFS) "\n" | ||
473 | "mov r3 = ar.itc\n" | ||
474 | ";;\n" | ||
475 | "sub r3 = r8, r3\n" | ||
476 | "st8 [r2] = r8, " | ||
477 | __stringify(XSI_ITC_LAST_OFS) " - " | ||
478 | __stringify(XSI_ITC_OFFSET_OFS) "\n" | ||
479 | ";;\n" | ||
480 | "st8 [r2] = r3\n"); | ||
481 | |||
482 | /* | ||
483 | * static unsigned long xen_get_itc(void) | ||
484 | * unsigned long res; | ||
485 | * unsigned long itc_offset; | ||
486 | * unsigned long itc_last; | ||
487 | * unsigned long ret_itc_last; | ||
488 | * | ||
489 | * itc_offset = XEN_MAPPEDREGS->itc_offset; | ||
490 | * do { | ||
491 | * itc_last = XEN_MAPPEDREGS->itc_last; | ||
492 | * res = ia64_native_getreg(_IA64_REG_AR_ITC); | ||
493 | * res += itc_offset; | ||
494 | * if (itc_last >= res) | ||
495 | * res = itc_last + 1; | ||
496 | * ret_itc_last = cmpxchg(&XEN_MAPPEDREGS->itc_last, | ||
497 | * itc_last, res); | ||
498 | * } while (unlikely(ret_itc_last != itc_last)); | ||
499 | * return res; | ||
500 | */ | ||
501 | /* 5 bundles */ | ||
502 | DEFINE_FUNC0(get_itc, | ||
503 | "mov r2 = " __stringify(XSI_BASE) " + " | ||
504 | __stringify(XSI_ITC_OFFSET_OFS) "\n" | ||
505 | ";;\n" | ||
506 | "ld8 r9 = [r2], " __stringify(XSI_ITC_LAST_OFS) " - " | ||
507 | __stringify(XSI_ITC_OFFSET_OFS) "\n" | ||
508 | /* r9 = itc_offset */ | ||
509 | /* r2 = XSI_ITC_OFFSET */ | ||
510 | "888:\n" | ||
511 | "mov r8 = ar.itc\n" /* res = ar.itc */ | ||
512 | ";;\n" | ||
513 | "ld8 r3 = [r2]\n" /* r3 = itc_last */ | ||
514 | "add r8 = r8, r9\n" /* res = ar.itc + itc_offset */ | ||
515 | ";;\n" | ||
516 | "cmp.gtu p6, p0 = r3, r8\n" | ||
517 | ";;\n" | ||
518 | "(p6) add r8 = 1, r3\n" /* if (itc_last > res) itc_last + 1 */ | ||
519 | ";;\n" | ||
520 | "mov ar.ccv = r8\n" | ||
521 | ";;\n" | ||
522 | "cmpxchg8.acq r10 = [r2], r8, ar.ccv\n" | ||
523 | ";;\n" | ||
524 | "cmp.ne p6, p0 = r10, r3\n" | ||
525 | "(p6) hint @pause\n" | ||
526 | "(p6) br.cond.spnt 888b\n"); | ||
527 | |||
528 | DEFINE_VOID_FUNC1_VOID(fc, | ||
529 | "break " __stringify(HYPERPRIVOP_FC) "\n"); | ||
530 | |||
531 | /* | ||
532 | * psr_i_addr_addr = XEN_PSR_I_ADDR_ADDR | ||
533 | * masked_addr = *psr_i_addr_addr | ||
534 | * pending_intr_addr = masked_addr - 1 | ||
535 | * if (val & IA64_PSR_I) { | ||
536 | * masked = *masked_addr | ||
537 | * *masked_addr = 0:xen_set_virtual_psr_i(1) | ||
538 | * compiler barrier | ||
539 | * if (masked) { | ||
540 | * uint8_t pending = *pending_intr_addr; | ||
541 | * if (pending) | ||
542 | * XEN_HYPER_SSM_I | ||
543 | * } | ||
544 | * } else { | ||
545 | * *masked_addr = 1:xen_set_virtual_psr_i(0) | ||
546 | * } | ||
547 | */ | ||
548 | /* 6 bundles */ | ||
549 | DEFINE_VOID_FUNC1(intrin_local_irq_restore, | ||
550 | /* r8 = input value: 0 or IA64_PSR_I | ||
551 | * p6 = (flags & IA64_PSR_I) | ||
552 | * = if clause | ||
553 | * p7 = !(flags & IA64_PSR_I) | ||
554 | * = else clause | ||
555 | */ | ||
556 | "cmp.ne p6, p7 = r8, r0\n" | ||
557 | "mov r9 = " __stringify(XEN_PSR_I_ADDR_ADDR) "\n" | ||
558 | ";;\n" | ||
559 | /* r9 = XEN_PSR_I_ADDR */ | ||
560 | "ld8 r9 = [r9]\n" | ||
561 | ";;\n" | ||
562 | |||
563 | /* r10 = masked previous value */ | ||
564 | "(p6) ld1.acq r10 = [r9]\n" | ||
565 | ";;\n" | ||
566 | |||
567 | /* p8 = !masked interrupt masked previously? */ | ||
568 | "(p6) cmp.ne.unc p8, p0 = r10, r0\n" | ||
569 | |||
570 | /* p7 = else clause */ | ||
571 | "(p7) mov r11 = 1\n" | ||
572 | ";;\n" | ||
573 | /* masked = 1 */ | ||
574 | "(p7) st1.rel [r9] = r11\n" | ||
575 | |||
576 | /* p6 = if clause */ | ||
577 | /* masked = 0 | ||
578 | * r9 = masked_addr - 1 | ||
579 | * = pending_intr_addr | ||
580 | */ | ||
581 | "(p8) st1.rel [r9] = r0, -1\n" | ||
582 | ";;\n" | ||
583 | /* r8 = pending_intr */ | ||
584 | "(p8) ld1.acq r11 = [r9]\n" | ||
585 | ";;\n" | ||
586 | /* p9 = interrupt pending? */ | ||
587 | "(p8) cmp.ne.unc p9, p10 = r11, r0\n" | ||
588 | ";;\n" | ||
589 | "(p10) mf\n" | ||
590 | /* issue hypercall to trigger interrupt */ | ||
591 | "(p9) break " __stringify(HYPERPRIVOP_SSM_I) "\n"); | ||
592 | |||
593 | DEFINE_VOID_FUNC2(ptcga, | ||
594 | "break " __stringify(HYPERPRIVOP_PTC_GA) "\n"); | ||
595 | DEFINE_VOID_FUNC2(set_rr, | ||
596 | "break " __stringify(HYPERPRIVOP_SET_RR) "\n"); | ||
597 | |||
598 | /* | ||
599 | * tmp = XEN_MAPPEDREGS->interrupt_mask_addr = XEN_PSR_I_ADDR_ADDR; | ||
600 | * tmp = *tmp | ||
601 | * tmp = *tmp; | ||
602 | * psr_i = tmp? 0: IA64_PSR_I; | ||
603 | */ | ||
604 | /* 4 bundles */ | ||
605 | DEFINE_FUNC0(get_psr_i, | ||
606 | "mov r9 = " __stringify(XEN_PSR_I_ADDR_ADDR) "\n" | ||
607 | ";;\n" | ||
608 | "ld8 r9 = [r9]\n" /* r9 = XEN_PSR_I_ADDR */ | ||
609 | "mov r8 = 0\n" /* psr_i = 0 */ | ||
610 | ";;\n" | ||
611 | "ld1.acq r9 = [r9]\n" /* r9 = XEN_PSR_I */ | ||
612 | ";;\n" | ||
613 | "cmp.eq.unc p6, p0 = r9, r0\n" /* p6 = (XEN_PSR_I != 0) */ | ||
614 | ";;\n" | ||
615 | "(p6) mov r8 = " __stringify(1 << IA64_PSR_I_BIT) "\n"); | ||
616 | |||
617 | DEFINE_FUNC1(thash, unsigned long, | ||
618 | "break " __stringify(HYPERPRIVOP_THASH) "\n"); | ||
619 | DEFINE_FUNC1(get_cpuid, int, | ||
620 | "break " __stringify(HYPERPRIVOP_GET_CPUID) "\n"); | ||
621 | DEFINE_FUNC1(get_pmd, int, | ||
622 | "break " __stringify(HYPERPRIVOP_GET_PMD) "\n"); | ||
623 | DEFINE_FUNC1(get_rr, unsigned long, | ||
624 | "break " __stringify(HYPERPRIVOP_GET_RR) "\n"); | ||
625 | |||
626 | /* | ||
627 | * void xen_privop_ssm_i(void) | ||
628 | * | ||
629 | * int masked = !xen_get_virtual_psr_i(); | ||
630 | * // masked = *(*XEN_MAPPEDREGS->interrupt_mask_addr) | ||
631 | * xen_set_virtual_psr_i(1) | ||
632 | * // *(*XEN_MAPPEDREGS->interrupt_mask_addr) = 0 | ||
633 | * // compiler barrier | ||
634 | * if (masked) { | ||
635 | * uint8_t* pend_int_addr = | ||
636 | * (uint8_t*)(*XEN_MAPPEDREGS->interrupt_mask_addr) - 1; | ||
637 | * uint8_t pending = *pend_int_addr; | ||
638 | * if (pending) | ||
639 | * XEN_HYPER_SSM_I | ||
640 | * } | ||
641 | */ | ||
642 | /* 4 bundles */ | ||
643 | DEFINE_VOID_FUNC0(ssm_i, | ||
644 | "mov r8 = " __stringify(XEN_PSR_I_ADDR_ADDR) "\n" | ||
645 | ";;\n" | ||
646 | "ld8 r8 = [r8]\n" /* r8 = XEN_PSR_I_ADDR */ | ||
647 | ";;\n" | ||
648 | "ld1.acq r9 = [r8]\n" /* r9 = XEN_PSR_I */ | ||
649 | ";;\n" | ||
650 | "st1.rel [r8] = r0, -1\n" /* psr_i = 0. enable interrupt | ||
651 | * r8 = XEN_PSR_I_ADDR - 1 | ||
652 | * = pend_int_addr | ||
653 | */ | ||
654 | "cmp.eq.unc p0, p6 = r9, r0\n"/* p6 = !XEN_PSR_I | ||
655 | * previously interrupt | ||
656 | * masked? | ||
657 | */ | ||
658 | ";;\n" | ||
659 | "(p6) ld1.acq r8 = [r8]\n" /* r8 = xen_pend_int */ | ||
660 | ";;\n" | ||
661 | "(p6) cmp.eq.unc p6, p7 = r8, r0\n" /*interrupt pending?*/ | ||
662 | ";;\n" | ||
663 | /* issue hypercall to get interrupt */ | ||
664 | "(p7) break " __stringify(HYPERPRIVOP_SSM_I) "\n" | ||
665 | ";;\n"); | ||
666 | |||
667 | /* | ||
668 | * psr_i_addr_addr = XEN_MAPPEDREGS->interrupt_mask_addr | ||
669 | * = XEN_PSR_I_ADDR_ADDR; | ||
670 | * psr_i_addr = *psr_i_addr_addr; | ||
671 | * *psr_i_addr = 1; | ||
672 | */ | ||
673 | /* 2 bundles */ | ||
674 | DEFINE_VOID_FUNC0(rsm_i, | ||
675 | "mov r8 = " __stringify(XEN_PSR_I_ADDR_ADDR) "\n" | ||
676 | /* r8 = XEN_PSR_I_ADDR */ | ||
677 | "mov r9 = 1\n" | ||
678 | ";;\n" | ||
679 | "ld8 r8 = [r8]\n" /* r8 = XEN_PSR_I */ | ||
680 | ";;\n" | ||
681 | "st1.rel [r8] = r9\n"); /* XEN_PSR_I = 1 */ | ||
682 | |||
683 | extern void | ||
684 | xen_set_rr0_to_rr4(unsigned long val0, unsigned long val1, | ||
685 | unsigned long val2, unsigned long val3, | ||
686 | unsigned long val4); | ||
687 | __DEFINE_FUNC(set_rr0_to_rr4, | ||
688 | "break " __stringify(HYPERPRIVOP_SET_RR0_TO_RR4) "\n"); | ||
689 | |||
690 | |||
691 | extern unsigned long xen_getreg(int regnum); | ||
692 | #define __DEFINE_GET_REG(id, privop) \ | ||
693 | "mov r2 = " __stringify(_IA64_REG_ ## id) "\n" \ | ||
694 | ";;\n" \ | ||
695 | "cmp.eq p6, p0 = r2, r8\n" \ | ||
696 | ";;\n" \ | ||
697 | "(p6) break " __stringify(HYPERPRIVOP_GET_ ## privop) "\n" \ | ||
698 | "(p6) br.cond.sptk.many b6\n" \ | ||
699 | ";;\n" | ||
700 | |||
701 | __DEFINE_FUNC(getreg, | ||
702 | __DEFINE_GET_REG(PSR, PSR) | ||
703 | |||
704 | /* get_itc */ | ||
705 | "mov r2 = " __stringify(_IA64_REG_AR_ITC) "\n" | ||
706 | ";;\n" | ||
707 | "cmp.eq p6, p0 = r2, r8\n" | ||
708 | ";;\n" | ||
709 | "(p6) br.cond.spnt xen_get_itc\n" | ||
710 | ";;\n" | ||
711 | |||
712 | /* get itm */ | ||
713 | "mov r2 = " __stringify(_IA64_REG_CR_ITM) "\n" | ||
714 | ";;\n" | ||
715 | "cmp.eq p6, p0 = r2, r8\n" | ||
716 | ";;\n" | ||
717 | "(p6) br.cond.spnt xen_get_itm_with_offset\n" | ||
718 | ";;\n" | ||
719 | |||
720 | __DEFINE_GET_REG(CR_IVR, IVR) | ||
721 | __DEFINE_GET_REG(CR_TPR, TPR) | ||
722 | |||
723 | /* fall back */ | ||
724 | "movl r2 = ia64_native_getreg_func\n" | ||
725 | ";;\n" | ||
726 | "mov b7 = r2\n" | ||
727 | ";;\n" | ||
728 | "br.cond.sptk.many b7\n"); | ||
729 | |||
730 | extern void xen_setreg(int regnum, unsigned long val); | ||
731 | #define __DEFINE_SET_REG(id, privop) \ | ||
732 | "mov r2 = " __stringify(_IA64_REG_ ## id) "\n" \ | ||
733 | ";;\n" \ | ||
734 | "cmp.eq p6, p0 = r2, r9\n" \ | ||
735 | ";;\n" \ | ||
736 | "(p6) break " __stringify(HYPERPRIVOP_ ## privop) "\n" \ | ||
737 | "(p6) br.cond.sptk.many b6\n" \ | ||
738 | ";;\n" | ||
739 | |||
740 | __DEFINE_FUNC(setreg, | ||
741 | /* kr0 .. kr 7*/ | ||
742 | /* | ||
743 | * if (_IA64_REG_AR_KR0 <= regnum && | ||
744 | * regnum <= _IA64_REG_AR_KR7) { | ||
745 | * register __index asm ("r8") = regnum - _IA64_REG_AR_KR0 | ||
746 | * register __val asm ("r9") = val | ||
747 | * "break HYPERPRIVOP_SET_KR" | ||
748 | * } | ||
749 | */ | ||
750 | "mov r17 = r9\n" | ||
751 | "mov r2 = " __stringify(_IA64_REG_AR_KR0) "\n" | ||
752 | ";;\n" | ||
753 | "cmp.ge p6, p0 = r9, r2\n" | ||
754 | "sub r17 = r17, r2\n" | ||
755 | ";;\n" | ||
756 | "(p6) cmp.ge.unc p7, p0 = " | ||
757 | __stringify(_IA64_REG_AR_KR7) " - " __stringify(_IA64_REG_AR_KR0) | ||
758 | ", r17\n" | ||
759 | ";;\n" | ||
760 | "(p7) mov r9 = r8\n" | ||
761 | ";;\n" | ||
762 | "(p7) mov r8 = r17\n" | ||
763 | "(p7) break " __stringify(HYPERPRIVOP_SET_KR) "\n" | ||
764 | |||
765 | /* set itm */ | ||
766 | "mov r2 = " __stringify(_IA64_REG_CR_ITM) "\n" | ||
767 | ";;\n" | ||
768 | "cmp.eq p6, p0 = r2, r8\n" | ||
769 | ";;\n" | ||
770 | "(p6) br.cond.spnt xen_set_itm_with_offset\n" | ||
771 | |||
772 | /* set itc */ | ||
773 | "mov r2 = " __stringify(_IA64_REG_AR_ITC) "\n" | ||
774 | ";;\n" | ||
775 | "cmp.eq p6, p0 = r2, r8\n" | ||
776 | ";;\n" | ||
777 | "(p6) br.cond.spnt xen_set_itc\n" | ||
778 | |||
779 | __DEFINE_SET_REG(CR_TPR, SET_TPR) | ||
780 | __DEFINE_SET_REG(CR_EOI, EOI) | ||
781 | |||
782 | /* fall back */ | ||
783 | "movl r2 = ia64_native_setreg_func\n" | ||
784 | ";;\n" | ||
785 | "mov b7 = r2\n" | ||
786 | ";;\n" | ||
787 | "br.cond.sptk.many b7\n"); | ||
788 | #endif | ||
789 | |||
790 | static const struct pv_cpu_ops xen_cpu_ops __initconst = { | ||
791 | .fc = xen_fc, | ||
792 | .thash = xen_thash, | ||
793 | .get_cpuid = xen_get_cpuid, | ||
794 | .get_pmd = xen_get_pmd, | ||
795 | .getreg = xen_getreg, | ||
796 | .setreg = xen_setreg, | ||
797 | .ptcga = xen_ptcga, | ||
798 | .get_rr = xen_get_rr, | ||
799 | .set_rr = xen_set_rr, | ||
800 | .set_rr0_to_rr4 = xen_set_rr0_to_rr4, | ||
801 | .ssm_i = xen_ssm_i, | ||
802 | .rsm_i = xen_rsm_i, | ||
803 | .get_psr_i = xen_get_psr_i, | ||
804 | .intrin_local_irq_restore | ||
805 | = xen_intrin_local_irq_restore, | ||
806 | }; | ||
807 | |||
808 | /****************************************************************************** | ||
809 | * replacement of hand written assembly codes. | ||
810 | */ | ||
811 | |||
812 | extern char xen_switch_to; | ||
813 | extern char xen_leave_syscall; | ||
814 | extern char xen_work_processed_syscall; | ||
815 | extern char xen_leave_kernel; | ||
816 | |||
817 | const struct pv_cpu_asm_switch xen_cpu_asm_switch = { | ||
818 | .switch_to = (unsigned long)&xen_switch_to, | ||
819 | .leave_syscall = (unsigned long)&xen_leave_syscall, | ||
820 | .work_processed_syscall = (unsigned long)&xen_work_processed_syscall, | ||
821 | .leave_kernel = (unsigned long)&xen_leave_kernel, | ||
822 | }; | ||
823 | |||
824 | /*************************************************************************** | ||
825 | * pv_iosapic_ops | ||
826 | * iosapic read/write hooks. | ||
827 | */ | ||
828 | static void | ||
829 | xen_pcat_compat_init(void) | ||
830 | { | ||
831 | /* nothing */ | ||
832 | } | ||
833 | |||
834 | static struct irq_chip* | ||
835 | xen_iosapic_get_irq_chip(unsigned long trigger) | ||
836 | { | ||
837 | return NULL; | ||
838 | } | ||
839 | |||
840 | static unsigned int | ||
841 | xen_iosapic_read(char __iomem *iosapic, unsigned int reg) | ||
842 | { | ||
843 | struct physdev_apic apic_op; | ||
844 | int ret; | ||
845 | |||
846 | apic_op.apic_physbase = (unsigned long)iosapic - | ||
847 | __IA64_UNCACHED_OFFSET; | ||
848 | apic_op.reg = reg; | ||
849 | ret = HYPERVISOR_physdev_op(PHYSDEVOP_apic_read, &apic_op); | ||
850 | if (ret) | ||
851 | return ret; | ||
852 | return apic_op.value; | ||
853 | } | ||
854 | |||
855 | static void | ||
856 | xen_iosapic_write(char __iomem *iosapic, unsigned int reg, u32 val) | ||
857 | { | ||
858 | struct physdev_apic apic_op; | ||
859 | |||
860 | apic_op.apic_physbase = (unsigned long)iosapic - | ||
861 | __IA64_UNCACHED_OFFSET; | ||
862 | apic_op.reg = reg; | ||
863 | apic_op.value = val; | ||
864 | HYPERVISOR_physdev_op(PHYSDEVOP_apic_write, &apic_op); | ||
865 | } | ||
866 | |||
867 | static struct pv_iosapic_ops xen_iosapic_ops __initdata = { | ||
868 | .pcat_compat_init = xen_pcat_compat_init, | ||
869 | .__get_irq_chip = xen_iosapic_get_irq_chip, | ||
870 | |||
871 | .__read = xen_iosapic_read, | ||
872 | .__write = xen_iosapic_write, | ||
873 | }; | ||
874 | |||
875 | /*************************************************************************** | ||
876 | * pv_ops initialization | ||
877 | */ | ||
878 | |||
879 | void __init | ||
880 | xen_setup_pv_ops(void) | ||
881 | { | ||
882 | xen_info_init(); | ||
883 | pv_info = xen_info; | ||
884 | pv_init_ops = xen_init_ops; | ||
885 | pv_fsys_data = xen_fsys_data; | ||
886 | pv_patchdata = xen_patchdata; | ||
887 | pv_cpu_ops = xen_cpu_ops; | ||
888 | pv_iosapic_ops = xen_iosapic_ops; | ||
889 | pv_irq_ops = xen_irq_ops; | ||
890 | pv_time_ops = xen_time_ops; | ||
891 | |||
892 | paravirt_cpu_asm_init(&xen_cpu_asm_switch); | ||
893 | } | ||
894 | |||
895 | #ifdef ASM_SUPPORTED | ||
896 | /*************************************************************************** | ||
897 | * binary pacthing | ||
898 | * pv_init_ops.patch_bundle | ||
899 | */ | ||
900 | |||
901 | #define DEFINE_FUNC_GETREG(name, privop) \ | ||
902 | DEFINE_FUNC0(get_ ## name, \ | ||
903 | "break "__stringify(HYPERPRIVOP_GET_ ## privop) "\n") | ||
904 | |||
905 | DEFINE_FUNC_GETREG(psr, PSR); | ||
906 | DEFINE_FUNC_GETREG(eflag, EFLAG); | ||
907 | DEFINE_FUNC_GETREG(ivr, IVR); | ||
908 | DEFINE_FUNC_GETREG(tpr, TPR); | ||
909 | |||
910 | #define DEFINE_FUNC_SET_KR(n) \ | ||
911 | DEFINE_VOID_FUNC0(set_kr ## n, \ | ||
912 | ";;\n" \ | ||
913 | "mov r9 = r8\n" \ | ||
914 | "mov r8 = " #n "\n" \ | ||
915 | "break " __stringify(HYPERPRIVOP_SET_KR) "\n") | ||
916 | |||
917 | DEFINE_FUNC_SET_KR(0); | ||
918 | DEFINE_FUNC_SET_KR(1); | ||
919 | DEFINE_FUNC_SET_KR(2); | ||
920 | DEFINE_FUNC_SET_KR(3); | ||
921 | DEFINE_FUNC_SET_KR(4); | ||
922 | DEFINE_FUNC_SET_KR(5); | ||
923 | DEFINE_FUNC_SET_KR(6); | ||
924 | DEFINE_FUNC_SET_KR(7); | ||
925 | |||
926 | #define __DEFINE_FUNC_SETREG(name, privop) \ | ||
927 | DEFINE_VOID_FUNC0(name, \ | ||
928 | "break "__stringify(HYPERPRIVOP_ ## privop) "\n") | ||
929 | |||
930 | #define DEFINE_FUNC_SETREG(name, privop) \ | ||
931 | __DEFINE_FUNC_SETREG(set_ ## name, SET_ ## privop) | ||
932 | |||
933 | DEFINE_FUNC_SETREG(eflag, EFLAG); | ||
934 | DEFINE_FUNC_SETREG(tpr, TPR); | ||
935 | __DEFINE_FUNC_SETREG(eoi, EOI); | ||
936 | |||
937 | extern const char xen_check_events[]; | ||
938 | extern const char __xen_intrin_local_irq_restore_direct_start[]; | ||
939 | extern const char __xen_intrin_local_irq_restore_direct_end[]; | ||
940 | extern const unsigned long __xen_intrin_local_irq_restore_direct_reloc; | ||
941 | |||
942 | asm ( | ||
943 | ".align 32\n" | ||
944 | ".proc xen_check_events\n" | ||
945 | "xen_check_events:\n" | ||
946 | /* masked = 0 | ||
947 | * r9 = masked_addr - 1 | ||
948 | * = pending_intr_addr | ||
949 | */ | ||
950 | "st1.rel [r9] = r0, -1\n" | ||
951 | ";;\n" | ||
952 | /* r8 = pending_intr */ | ||
953 | "ld1.acq r11 = [r9]\n" | ||
954 | ";;\n" | ||
955 | /* p9 = interrupt pending? */ | ||
956 | "cmp.ne p9, p10 = r11, r0\n" | ||
957 | ";;\n" | ||
958 | "(p10) mf\n" | ||
959 | /* issue hypercall to trigger interrupt */ | ||
960 | "(p9) break " __stringify(HYPERPRIVOP_SSM_I) "\n" | ||
961 | "br.cond.sptk.many b6\n" | ||
962 | ".endp xen_check_events\n" | ||
963 | "\n" | ||
964 | ".align 32\n" | ||
965 | ".proc __xen_intrin_local_irq_restore_direct\n" | ||
966 | "__xen_intrin_local_irq_restore_direct:\n" | ||
967 | "__xen_intrin_local_irq_restore_direct_start:\n" | ||
968 | "1:\n" | ||
969 | "{\n" | ||
970 | "cmp.ne p6, p7 = r8, r0\n" | ||
971 | "mov r17 = ip\n" /* get ip to calc return address */ | ||
972 | "mov r9 = "__stringify(XEN_PSR_I_ADDR_ADDR) "\n" | ||
973 | ";;\n" | ||
974 | "}\n" | ||
975 | "{\n" | ||
976 | /* r9 = XEN_PSR_I_ADDR */ | ||
977 | "ld8 r9 = [r9]\n" | ||
978 | ";;\n" | ||
979 | /* r10 = masked previous value */ | ||
980 | "(p6) ld1.acq r10 = [r9]\n" | ||
981 | "adds r17 = 1f - 1b, r17\n" /* calculate return address */ | ||
982 | ";;\n" | ||
983 | "}\n" | ||
984 | "{\n" | ||
985 | /* p8 = !masked interrupt masked previously? */ | ||
986 | "(p6) cmp.ne.unc p8, p0 = r10, r0\n" | ||
987 | "\n" | ||
988 | /* p7 = else clause */ | ||
989 | "(p7) mov r11 = 1\n" | ||
990 | ";;\n" | ||
991 | "(p8) mov b6 = r17\n" /* set return address */ | ||
992 | "}\n" | ||
993 | "{\n" | ||
994 | /* masked = 1 */ | ||
995 | "(p7) st1.rel [r9] = r11\n" | ||
996 | "\n" | ||
997 | "[99:]\n" | ||
998 | "(p8) brl.cond.dptk.few xen_check_events\n" | ||
999 | "}\n" | ||
1000 | /* pv calling stub is 5 bundles. fill nop to adjust return address */ | ||
1001 | "{\n" | ||
1002 | "nop 0\n" | ||
1003 | "nop 0\n" | ||
1004 | "nop 0\n" | ||
1005 | "}\n" | ||
1006 | "1:\n" | ||
1007 | "__xen_intrin_local_irq_restore_direct_end:\n" | ||
1008 | ".endp __xen_intrin_local_irq_restore_direct\n" | ||
1009 | "\n" | ||
1010 | ".align 8\n" | ||
1011 | "__xen_intrin_local_irq_restore_direct_reloc:\n" | ||
1012 | "data8 99b\n" | ||
1013 | ); | ||
1014 | |||
1015 | static struct paravirt_patch_bundle_elem xen_patch_bundle_elems[] | ||
1016 | __initdata_or_module = | ||
1017 | { | ||
1018 | #define XEN_PATCH_BUNDLE_ELEM(name, type) \ | ||
1019 | { \ | ||
1020 | (void*)xen_ ## name ## _direct_start, \ | ||
1021 | (void*)xen_ ## name ## _direct_end, \ | ||
1022 | PARAVIRT_PATCH_TYPE_ ## type, \ | ||
1023 | } | ||
1024 | |||
1025 | XEN_PATCH_BUNDLE_ELEM(fc, FC), | ||
1026 | XEN_PATCH_BUNDLE_ELEM(thash, THASH), | ||
1027 | XEN_PATCH_BUNDLE_ELEM(get_cpuid, GET_CPUID), | ||
1028 | XEN_PATCH_BUNDLE_ELEM(get_pmd, GET_PMD), | ||
1029 | XEN_PATCH_BUNDLE_ELEM(ptcga, PTCGA), | ||
1030 | XEN_PATCH_BUNDLE_ELEM(get_rr, GET_RR), | ||
1031 | XEN_PATCH_BUNDLE_ELEM(set_rr, SET_RR), | ||
1032 | XEN_PATCH_BUNDLE_ELEM(set_rr0_to_rr4, SET_RR0_TO_RR4), | ||
1033 | XEN_PATCH_BUNDLE_ELEM(ssm_i, SSM_I), | ||
1034 | XEN_PATCH_BUNDLE_ELEM(rsm_i, RSM_I), | ||
1035 | XEN_PATCH_BUNDLE_ELEM(get_psr_i, GET_PSR_I), | ||
1036 | { | ||
1037 | (void*)__xen_intrin_local_irq_restore_direct_start, | ||
1038 | (void*)__xen_intrin_local_irq_restore_direct_end, | ||
1039 | PARAVIRT_PATCH_TYPE_INTRIN_LOCAL_IRQ_RESTORE, | ||
1040 | }, | ||
1041 | |||
1042 | #define XEN_PATCH_BUNDLE_ELEM_GETREG(name, reg) \ | ||
1043 | { \ | ||
1044 | xen_get_ ## name ## _direct_start, \ | ||
1045 | xen_get_ ## name ## _direct_end, \ | ||
1046 | PARAVIRT_PATCH_TYPE_GETREG + _IA64_REG_ ## reg, \ | ||
1047 | } | ||
1048 | |||
1049 | XEN_PATCH_BUNDLE_ELEM_GETREG(psr, PSR), | ||
1050 | XEN_PATCH_BUNDLE_ELEM_GETREG(eflag, AR_EFLAG), | ||
1051 | |||
1052 | XEN_PATCH_BUNDLE_ELEM_GETREG(ivr, CR_IVR), | ||
1053 | XEN_PATCH_BUNDLE_ELEM_GETREG(tpr, CR_TPR), | ||
1054 | |||
1055 | XEN_PATCH_BUNDLE_ELEM_GETREG(itc, AR_ITC), | ||
1056 | XEN_PATCH_BUNDLE_ELEM_GETREG(itm_with_offset, CR_ITM), | ||
1057 | |||
1058 | |||
1059 | #define __XEN_PATCH_BUNDLE_ELEM_SETREG(name, reg) \ | ||
1060 | { \ | ||
1061 | xen_ ## name ## _direct_start, \ | ||
1062 | xen_ ## name ## _direct_end, \ | ||
1063 | PARAVIRT_PATCH_TYPE_SETREG + _IA64_REG_ ## reg, \ | ||
1064 | } | ||
1065 | |||
1066 | #define XEN_PATCH_BUNDLE_ELEM_SETREG(name, reg) \ | ||
1067 | __XEN_PATCH_BUNDLE_ELEM_SETREG(set_ ## name, reg) | ||
1068 | |||
1069 | XEN_PATCH_BUNDLE_ELEM_SETREG(kr0, AR_KR0), | ||
1070 | XEN_PATCH_BUNDLE_ELEM_SETREG(kr1, AR_KR1), | ||
1071 | XEN_PATCH_BUNDLE_ELEM_SETREG(kr2, AR_KR2), | ||
1072 | XEN_PATCH_BUNDLE_ELEM_SETREG(kr3, AR_KR3), | ||
1073 | XEN_PATCH_BUNDLE_ELEM_SETREG(kr4, AR_KR4), | ||
1074 | XEN_PATCH_BUNDLE_ELEM_SETREG(kr5, AR_KR5), | ||
1075 | XEN_PATCH_BUNDLE_ELEM_SETREG(kr6, AR_KR6), | ||
1076 | XEN_PATCH_BUNDLE_ELEM_SETREG(kr7, AR_KR7), | ||
1077 | |||
1078 | XEN_PATCH_BUNDLE_ELEM_SETREG(eflag, AR_EFLAG), | ||
1079 | XEN_PATCH_BUNDLE_ELEM_SETREG(tpr, CR_TPR), | ||
1080 | __XEN_PATCH_BUNDLE_ELEM_SETREG(eoi, CR_EOI), | ||
1081 | |||
1082 | XEN_PATCH_BUNDLE_ELEM_SETREG(itc, AR_ITC), | ||
1083 | XEN_PATCH_BUNDLE_ELEM_SETREG(itm_with_offset, CR_ITM), | ||
1084 | }; | ||
1085 | |||
1086 | static unsigned long __init_or_module | ||
1087 | xen_patch_bundle(void *sbundle, void *ebundle, unsigned long type) | ||
1088 | { | ||
1089 | const unsigned long nelems = sizeof(xen_patch_bundle_elems) / | ||
1090 | sizeof(xen_patch_bundle_elems[0]); | ||
1091 | unsigned long used; | ||
1092 | const struct paravirt_patch_bundle_elem *found; | ||
1093 | |||
1094 | used = __paravirt_patch_apply_bundle(sbundle, ebundle, type, | ||
1095 | xen_patch_bundle_elems, nelems, | ||
1096 | &found); | ||
1097 | |||
1098 | if (found == NULL) | ||
1099 | /* fallback */ | ||
1100 | return ia64_native_patch_bundle(sbundle, ebundle, type); | ||
1101 | if (used == 0) | ||
1102 | return used; | ||
1103 | |||
1104 | /* relocation */ | ||
1105 | switch (type) { | ||
1106 | case PARAVIRT_PATCH_TYPE_INTRIN_LOCAL_IRQ_RESTORE: { | ||
1107 | unsigned long reloc = | ||
1108 | __xen_intrin_local_irq_restore_direct_reloc; | ||
1109 | unsigned long reloc_offset = reloc - (unsigned long) | ||
1110 | __xen_intrin_local_irq_restore_direct_start; | ||
1111 | unsigned long tag = (unsigned long)sbundle + reloc_offset; | ||
1112 | paravirt_patch_reloc_brl(tag, xen_check_events); | ||
1113 | break; | ||
1114 | } | ||
1115 | default: | ||
1116 | /* nothing */ | ||
1117 | break; | ||
1118 | } | ||
1119 | return used; | ||
1120 | } | ||
1121 | #endif /* ASM_SUPPOTED */ | ||
1122 | |||
1123 | const struct paravirt_patch_branch_target xen_branch_target[] | ||
1124 | __initconst = { | ||
1125 | #define PARAVIRT_BR_TARGET(name, type) \ | ||
1126 | { \ | ||
1127 | &xen_ ## name, \ | ||
1128 | PARAVIRT_PATCH_TYPE_BR_ ## type, \ | ||
1129 | } | ||
1130 | PARAVIRT_BR_TARGET(switch_to, SWITCH_TO), | ||
1131 | PARAVIRT_BR_TARGET(leave_syscall, LEAVE_SYSCALL), | ||
1132 | PARAVIRT_BR_TARGET(work_processed_syscall, WORK_PROCESSED_SYSCALL), | ||
1133 | PARAVIRT_BR_TARGET(leave_kernel, LEAVE_KERNEL), | ||
1134 | }; | ||
1135 | |||
1136 | static void __init | ||
1137 | xen_patch_branch(unsigned long tag, unsigned long type) | ||
1138 | { | ||
1139 | __paravirt_patch_apply_branch(tag, type, xen_branch_target, | ||
1140 | ARRAY_SIZE(xen_branch_target)); | ||
1141 | } | ||
diff --git a/arch/ia64/xen/xencomm.c b/arch/ia64/xen/xencomm.c deleted file mode 100644 index 73d903ca2d64..000000000000 --- a/arch/ia64/xen/xencomm.c +++ /dev/null | |||
@@ -1,106 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2006 Hollis Blanchard <hollisb@us.ibm.com>, IBM Corporation | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
17 | */ | ||
18 | |||
19 | #include <linux/mm.h> | ||
20 | #include <linux/err.h> | ||
21 | |||
22 | static unsigned long kernel_virtual_offset; | ||
23 | static int is_xencomm_initialized; | ||
24 | |||
25 | /* for xen early printk. It uses console io hypercall which uses xencomm. | ||
26 | * However early printk may use it before xencomm initialization. | ||
27 | */ | ||
28 | int | ||
29 | xencomm_is_initialized(void) | ||
30 | { | ||
31 | return is_xencomm_initialized; | ||
32 | } | ||
33 | |||
34 | void | ||
35 | xencomm_initialize(void) | ||
36 | { | ||
37 | kernel_virtual_offset = KERNEL_START - ia64_tpa(KERNEL_START); | ||
38 | is_xencomm_initialized = 1; | ||
39 | } | ||
40 | |||
41 | /* Translate virtual address to physical address. */ | ||
42 | unsigned long | ||
43 | xencomm_vtop(unsigned long vaddr) | ||
44 | { | ||
45 | struct page *page; | ||
46 | struct vm_area_struct *vma; | ||
47 | |||
48 | if (vaddr == 0) | ||
49 | return 0UL; | ||
50 | |||
51 | if (REGION_NUMBER(vaddr) == 5) { | ||
52 | pgd_t *pgd; | ||
53 | pud_t *pud; | ||
54 | pmd_t *pmd; | ||
55 | pte_t *ptep; | ||
56 | |||
57 | /* On ia64, TASK_SIZE refers to current. It is not initialized | ||
58 | during boot. | ||
59 | Furthermore the kernel is relocatable and __pa() doesn't | ||
60 | work on addresses. */ | ||
61 | if (vaddr >= KERNEL_START | ||
62 | && vaddr < (KERNEL_START + KERNEL_TR_PAGE_SIZE)) | ||
63 | return vaddr - kernel_virtual_offset; | ||
64 | |||
65 | /* In kernel area -- virtually mapped. */ | ||
66 | pgd = pgd_offset_k(vaddr); | ||
67 | if (pgd_none(*pgd) || pgd_bad(*pgd)) | ||
68 | return ~0UL; | ||
69 | |||
70 | pud = pud_offset(pgd, vaddr); | ||
71 | if (pud_none(*pud) || pud_bad(*pud)) | ||
72 | return ~0UL; | ||
73 | |||
74 | pmd = pmd_offset(pud, vaddr); | ||
75 | if (pmd_none(*pmd) || pmd_bad(*pmd)) | ||
76 | return ~0UL; | ||
77 | |||
78 | ptep = pte_offset_kernel(pmd, vaddr); | ||
79 | if (!ptep) | ||
80 | return ~0UL; | ||
81 | |||
82 | return (pte_val(*ptep) & _PFN_MASK) | (vaddr & ~PAGE_MASK); | ||
83 | } | ||
84 | |||
85 | if (vaddr > TASK_SIZE) { | ||
86 | /* percpu variables */ | ||
87 | if (REGION_NUMBER(vaddr) == 7 && | ||
88 | REGION_OFFSET(vaddr) >= (1ULL << IA64_MAX_PHYS_BITS)) | ||
89 | ia64_tpa(vaddr); | ||
90 | |||
91 | /* kernel address */ | ||
92 | return __pa(vaddr); | ||
93 | } | ||
94 | |||
95 | /* XXX double-check (lack of) locking */ | ||
96 | vma = find_extend_vma(current->mm, vaddr); | ||
97 | if (!vma) | ||
98 | return ~0UL; | ||
99 | |||
100 | /* We assume the page is modified. */ | ||
101 | page = follow_page(vma, vaddr, FOLL_WRITE | FOLL_TOUCH); | ||
102 | if (IS_ERR_OR_NULL(page)) | ||
103 | return ~0UL; | ||
104 | |||
105 | return (page_to_pfn(page) << PAGE_SHIFT) | (vaddr & ~PAGE_MASK); | ||
106 | } | ||
diff --git a/arch/ia64/xen/xenivt.S b/arch/ia64/xen/xenivt.S deleted file mode 100644 index 3e71d50584d9..000000000000 --- a/arch/ia64/xen/xenivt.S +++ /dev/null | |||
@@ -1,52 +0,0 @@ | |||
1 | /* | ||
2 | * arch/ia64/xen/ivt.S | ||
3 | * | ||
4 | * Copyright (C) 2005 Hewlett-Packard Co | ||
5 | * Dan Magenheimer <dan.magenheimer@hp.com> | ||
6 | * | ||
7 | * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp> | ||
8 | * VA Linux Systems Japan K.K. | ||
9 | * pv_ops. | ||
10 | */ | ||
11 | |||
12 | #include <asm/asmmacro.h> | ||
13 | #include <asm/kregs.h> | ||
14 | #include <asm/pgtable.h> | ||
15 | |||
16 | #include "../kernel/minstate.h" | ||
17 | |||
18 | .section .text,"ax" | ||
19 | GLOBAL_ENTRY(xen_event_callback) | ||
20 | mov r31=pr // prepare to save predicates | ||
21 | ;; | ||
22 | SAVE_MIN_WITH_COVER // uses r31; defines r2 and r3 | ||
23 | ;; | ||
24 | movl r3=XSI_PSR_IC | ||
25 | mov r14=1 | ||
26 | ;; | ||
27 | st4 [r3]=r14 | ||
28 | ;; | ||
29 | adds r3=8,r2 // set up second base pointer for SAVE_REST | ||
30 | srlz.i // ensure everybody knows psr.ic is back on | ||
31 | ;; | ||
32 | SAVE_REST | ||
33 | ;; | ||
34 | 1: | ||
35 | alloc r14=ar.pfs,0,0,1,0 // must be first in an insn group | ||
36 | add out0=16,sp // pass pointer to pt_regs as first arg | ||
37 | ;; | ||
38 | br.call.sptk.many b0=xen_evtchn_do_upcall | ||
39 | ;; | ||
40 | movl r20=XSI_PSR_I_ADDR | ||
41 | ;; | ||
42 | ld8 r20=[r20] | ||
43 | ;; | ||
44 | adds r20=-1,r20 // vcpu_info->evtchn_upcall_pending | ||
45 | ;; | ||
46 | ld1 r20=[r20] | ||
47 | ;; | ||
48 | cmp.ne p6,p0=r20,r0 // if there are pending events, | ||
49 | (p6) br.spnt.few 1b // call evtchn_do_upcall again. | ||
50 | br.sptk.many xen_leave_kernel // we know ia64_leave_kernel is | ||
51 | // paravirtualized as xen_leave_kernel | ||
52 | END(xen_event_callback) | ||
diff --git a/arch/ia64/xen/xensetup.S b/arch/ia64/xen/xensetup.S deleted file mode 100644 index e29519ebe2d2..000000000000 --- a/arch/ia64/xen/xensetup.S +++ /dev/null | |||
@@ -1,80 +0,0 @@ | |||
1 | /* | ||
2 | * Support routines for Xen | ||
3 | * | ||
4 | * Copyright (C) 2005 Dan Magenheimer <dan.magenheimer@hp.com> | ||
5 | */ | ||
6 | |||
7 | #include <asm/processor.h> | ||
8 | #include <asm/asmmacro.h> | ||
9 | #include <asm/pgtable.h> | ||
10 | #include <asm/paravirt.h> | ||
11 | #include <asm/xen/privop.h> | ||
12 | #include <linux/elfnote.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <xen/interface/elfnote.h> | ||
15 | |||
16 | .section .data..read_mostly | ||
17 | .align 8 | ||
18 | .global xen_domain_type | ||
19 | xen_domain_type: | ||
20 | data4 XEN_NATIVE_ASM | ||
21 | .previous | ||
22 | |||
23 | __INIT | ||
24 | ENTRY(startup_xen) | ||
25 | // Calculate load offset. | ||
26 | // The constant, LOAD_OFFSET, can't be used because the boot | ||
27 | // loader doesn't always load to the LMA specified by the vmlinux.lds. | ||
28 | mov r9=ip // must be the first instruction to make sure | ||
29 | // that r9 = the physical address of startup_xen. | ||
30 | // Usually r9 = startup_xen - LOAD_OFFSET | ||
31 | movl r8=startup_xen | ||
32 | ;; | ||
33 | sub r9=r9,r8 // Usually r9 = -LOAD_OFFSET. | ||
34 | |||
35 | mov r10=PARAVIRT_HYPERVISOR_TYPE_XEN | ||
36 | movl r11=_start | ||
37 | ;; | ||
38 | add r11=r11,r9 | ||
39 | movl r8=hypervisor_type | ||
40 | ;; | ||
41 | add r8=r8,r9 | ||
42 | mov b0=r11 | ||
43 | ;; | ||
44 | st8 [r8]=r10 | ||
45 | br.cond.sptk.many b0 | ||
46 | ;; | ||
47 | END(startup_xen) | ||
48 | |||
49 | ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS, .asciz "linux") | ||
50 | ELFNOTE(Xen, XEN_ELFNOTE_GUEST_VERSION, .asciz "2.6") | ||
51 | ELFNOTE(Xen, XEN_ELFNOTE_XEN_VERSION, .asciz "xen-3.0") | ||
52 | ELFNOTE(Xen, XEN_ELFNOTE_ENTRY, data8.ua startup_xen - LOAD_OFFSET) | ||
53 | |||
54 | #define isBP p3 // are we the Bootstrap Processor? | ||
55 | |||
56 | GLOBAL_ENTRY(xen_setup_hook) | ||
57 | mov r8=XEN_PV_DOMAIN_ASM | ||
58 | (isBP) movl r9=xen_domain_type;; | ||
59 | (isBP) st4 [r9]=r8 | ||
60 | movl r10=xen_ivt;; | ||
61 | |||
62 | mov cr.iva=r10 | ||
63 | |||
64 | /* Set xsi base. */ | ||
65 | #define FW_HYPERCALL_SET_SHARED_INFO_VA 0x600 | ||
66 | (isBP) mov r2=FW_HYPERCALL_SET_SHARED_INFO_VA | ||
67 | (isBP) movl r28=XSI_BASE;; | ||
68 | (isBP) break 0x1000;; | ||
69 | |||
70 | /* setup pv_ops */ | ||
71 | (isBP) mov r4=rp | ||
72 | ;; | ||
73 | (isBP) br.call.sptk.many rp=xen_setup_pv_ops | ||
74 | ;; | ||
75 | (isBP) mov rp=r4 | ||
76 | ;; | ||
77 | |||
78 | br.ret.sptk.many rp | ||
79 | ;; | ||
80 | END(xen_setup_hook) | ||
diff --git a/arch/m32r/include/asm/barrier.h b/arch/m32r/include/asm/barrier.h index 6976621efd3f..1a40265e8d88 100644 --- a/arch/m32r/include/asm/barrier.h +++ b/arch/m32r/include/asm/barrier.h | |||
@@ -11,84 +11,6 @@ | |||
11 | 11 | ||
12 | #define nop() __asm__ __volatile__ ("nop" : : ) | 12 | #define nop() __asm__ __volatile__ ("nop" : : ) |
13 | 13 | ||
14 | /* | 14 | #include <asm-generic/barrier.h> |
15 | * Memory barrier. | ||
16 | * | ||
17 | * mb() prevents loads and stores being reordered across this point. | ||
18 | * rmb() prevents loads being reordered across this point. | ||
19 | * wmb() prevents stores being reordered across this point. | ||
20 | */ | ||
21 | #define mb() barrier() | ||
22 | #define rmb() mb() | ||
23 | #define wmb() mb() | ||
24 | |||
25 | /** | ||
26 | * read_barrier_depends - Flush all pending reads that subsequents reads | ||
27 | * depend on. | ||
28 | * | ||
29 | * No data-dependent reads from memory-like regions are ever reordered | ||
30 | * over this barrier. All reads preceding this primitive are guaranteed | ||
31 | * to access memory (but not necessarily other CPUs' caches) before any | ||
32 | * reads following this primitive that depend on the data return by | ||
33 | * any of the preceding reads. This primitive is much lighter weight than | ||
34 | * rmb() on most CPUs, and is never heavier weight than is | ||
35 | * rmb(). | ||
36 | * | ||
37 | * These ordering constraints are respected by both the local CPU | ||
38 | * and the compiler. | ||
39 | * | ||
40 | * Ordering is not guaranteed by anything other than these primitives, | ||
41 | * not even by data dependencies. See the documentation for | ||
42 | * memory_barrier() for examples and URLs to more information. | ||
43 | * | ||
44 | * For example, the following code would force ordering (the initial | ||
45 | * value of "a" is zero, "b" is one, and "p" is "&a"): | ||
46 | * | ||
47 | * <programlisting> | ||
48 | * CPU 0 CPU 1 | ||
49 | * | ||
50 | * b = 2; | ||
51 | * memory_barrier(); | ||
52 | * p = &b; q = p; | ||
53 | * read_barrier_depends(); | ||
54 | * d = *q; | ||
55 | * </programlisting> | ||
56 | * | ||
57 | * | ||
58 | * because the read of "*q" depends on the read of "p" and these | ||
59 | * two reads are separated by a read_barrier_depends(). However, | ||
60 | * the following code, with the same initial values for "a" and "b": | ||
61 | * | ||
62 | * <programlisting> | ||
63 | * CPU 0 CPU 1 | ||
64 | * | ||
65 | * a = 2; | ||
66 | * memory_barrier(); | ||
67 | * b = 3; y = b; | ||
68 | * read_barrier_depends(); | ||
69 | * x = a; | ||
70 | * </programlisting> | ||
71 | * | ||
72 | * does not enforce ordering, since there is no data dependency between | ||
73 | * the read of "a" and the read of "b". Therefore, on some CPUs, such | ||
74 | * as Alpha, "y" could be set to 3 and "x" to 0. Use rmb() | ||
75 | * in cases like this where there are no data dependencies. | ||
76 | **/ | ||
77 | |||
78 | #define read_barrier_depends() do { } while (0) | ||
79 | |||
80 | #ifdef CONFIG_SMP | ||
81 | #define smp_mb() mb() | ||
82 | #define smp_rmb() rmb() | ||
83 | #define smp_wmb() wmb() | ||
84 | #define smp_read_barrier_depends() read_barrier_depends() | ||
85 | #define set_mb(var, value) do { (void) xchg(&var, value); } while (0) | ||
86 | #else | ||
87 | #define smp_mb() barrier() | ||
88 | #define smp_rmb() barrier() | ||
89 | #define smp_wmb() barrier() | ||
90 | #define smp_read_barrier_depends() do { } while (0) | ||
91 | #define set_mb(var, value) do { var = value; barrier(); } while (0) | ||
92 | #endif | ||
93 | 15 | ||
94 | #endif /* _ASM_M32R_BARRIER_H */ | 16 | #endif /* _ASM_M32R_BARRIER_H */ |
diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig index 75f25a8e3001..dbdd2231c75d 100644 --- a/arch/m68k/Kconfig +++ b/arch/m68k/Kconfig | |||
@@ -87,6 +87,30 @@ config MMU_SUN3 | |||
87 | bool | 87 | bool |
88 | depends on MMU && !MMU_MOTOROLA && !MMU_COLDFIRE | 88 | depends on MMU && !MMU_MOTOROLA && !MMU_COLDFIRE |
89 | 89 | ||
90 | config KEXEC | ||
91 | bool "kexec system call" | ||
92 | depends on M68KCLASSIC | ||
93 | help | ||
94 | kexec is a system call that implements the ability to shutdown your | ||
95 | current kernel, and to start another kernel. It is like a reboot | ||
96 | but it is independent of the system firmware. And like a reboot | ||
97 | you can start any kernel with it, not just Linux. | ||
98 | |||
99 | The name comes from the similarity to the exec system call. | ||
100 | |||
101 | It is an ongoing process to be certain the hardware in a machine | ||
102 | is properly shutdown, so do not be surprised if this code does not | ||
103 | initially work for you. As of this writing the exact hardware | ||
104 | interface is strongly in flux, so no good recommendation can be | ||
105 | made. | ||
106 | |||
107 | config BOOTINFO_PROC | ||
108 | bool "Export bootinfo in procfs" | ||
109 | depends on KEXEC && M68KCLASSIC | ||
110 | help | ||
111 | Say Y to export the bootinfo used to boot the kernel in a | ||
112 | "bootinfo" file in procfs. This is useful with kexec. | ||
113 | |||
90 | menu "Platform setup" | 114 | menu "Platform setup" |
91 | 115 | ||
92 | source arch/m68k/Kconfig.cpu | 116 | source arch/m68k/Kconfig.cpu |
diff --git a/arch/m68k/amiga/chipram.c b/arch/m68k/amiga/chipram.c index 99449fbf9a72..ba03cec3f711 100644 --- a/arch/m68k/amiga/chipram.c +++ b/arch/m68k/amiga/chipram.c | |||
@@ -87,7 +87,7 @@ void *amiga_chip_alloc_res(unsigned long size, struct resource *res) | |||
87 | 87 | ||
88 | atomic_sub(size, &chipavail); | 88 | atomic_sub(size, &chipavail); |
89 | pr_debug("amiga_chip_alloc_res: returning %pR\n", res); | 89 | pr_debug("amiga_chip_alloc_res: returning %pR\n", res); |
90 | return (void *)ZTWO_VADDR(res->start); | 90 | return ZTWO_VADDR(res->start); |
91 | } | 91 | } |
92 | 92 | ||
93 | void amiga_chip_free(void *ptr) | 93 | void amiga_chip_free(void *ptr) |
diff --git a/arch/m68k/amiga/config.c b/arch/m68k/amiga/config.c index b819390e29cd..9625b7132227 100644 --- a/arch/m68k/amiga/config.c +++ b/arch/m68k/amiga/config.c | |||
@@ -28,6 +28,8 @@ | |||
28 | #include <linux/keyboard.h> | 28 | #include <linux/keyboard.h> |
29 | 29 | ||
30 | #include <asm/bootinfo.h> | 30 | #include <asm/bootinfo.h> |
31 | #include <asm/bootinfo-amiga.h> | ||
32 | #include <asm/byteorder.h> | ||
31 | #include <asm/setup.h> | 33 | #include <asm/setup.h> |
32 | #include <asm/pgtable.h> | 34 | #include <asm/pgtable.h> |
33 | #include <asm/amigahw.h> | 35 | #include <asm/amigahw.h> |
@@ -140,46 +142,46 @@ static struct resource ram_resource[NUM_MEMINFO]; | |||
140 | * Parse an Amiga-specific record in the bootinfo | 142 | * Parse an Amiga-specific record in the bootinfo |
141 | */ | 143 | */ |
142 | 144 | ||
143 | int amiga_parse_bootinfo(const struct bi_record *record) | 145 | int __init amiga_parse_bootinfo(const struct bi_record *record) |
144 | { | 146 | { |
145 | int unknown = 0; | 147 | int unknown = 0; |
146 | const unsigned long *data = record->data; | 148 | const void *data = record->data; |
147 | 149 | ||
148 | switch (record->tag) { | 150 | switch (be16_to_cpu(record->tag)) { |
149 | case BI_AMIGA_MODEL: | 151 | case BI_AMIGA_MODEL: |
150 | amiga_model = *data; | 152 | amiga_model = be32_to_cpup(data); |
151 | break; | 153 | break; |
152 | 154 | ||
153 | case BI_AMIGA_ECLOCK: | 155 | case BI_AMIGA_ECLOCK: |
154 | amiga_eclock = *data; | 156 | amiga_eclock = be32_to_cpup(data); |
155 | break; | 157 | break; |
156 | 158 | ||
157 | case BI_AMIGA_CHIPSET: | 159 | case BI_AMIGA_CHIPSET: |
158 | amiga_chipset = *data; | 160 | amiga_chipset = be32_to_cpup(data); |
159 | break; | 161 | break; |
160 | 162 | ||
161 | case BI_AMIGA_CHIP_SIZE: | 163 | case BI_AMIGA_CHIP_SIZE: |
162 | amiga_chip_size = *(const int *)data; | 164 | amiga_chip_size = be32_to_cpup(data); |
163 | break; | 165 | break; |
164 | 166 | ||
165 | case BI_AMIGA_VBLANK: | 167 | case BI_AMIGA_VBLANK: |
166 | amiga_vblank = *(const unsigned char *)data; | 168 | amiga_vblank = *(const __u8 *)data; |
167 | break; | 169 | break; |
168 | 170 | ||
169 | case BI_AMIGA_PSFREQ: | 171 | case BI_AMIGA_PSFREQ: |
170 | amiga_psfreq = *(const unsigned char *)data; | 172 | amiga_psfreq = *(const __u8 *)data; |
171 | break; | 173 | break; |
172 | 174 | ||
173 | case BI_AMIGA_AUTOCON: | 175 | case BI_AMIGA_AUTOCON: |
174 | #ifdef CONFIG_ZORRO | 176 | #ifdef CONFIG_ZORRO |
175 | if (zorro_num_autocon < ZORRO_NUM_AUTO) { | 177 | if (zorro_num_autocon < ZORRO_NUM_AUTO) { |
176 | const struct ConfigDev *cd = (struct ConfigDev *)data; | 178 | const struct ConfigDev *cd = data; |
177 | struct zorro_dev *dev = &zorro_autocon[zorro_num_autocon++]; | 179 | struct zorro_dev_init *dev = &zorro_autocon_init[zorro_num_autocon++]; |
178 | dev->rom = cd->cd_Rom; | 180 | dev->rom = cd->cd_Rom; |
179 | dev->slotaddr = cd->cd_SlotAddr; | 181 | dev->slotaddr = be16_to_cpu(cd->cd_SlotAddr); |
180 | dev->slotsize = cd->cd_SlotSize; | 182 | dev->slotsize = be16_to_cpu(cd->cd_SlotSize); |
181 | dev->resource.start = (unsigned long)cd->cd_BoardAddr; | 183 | dev->boardaddr = be32_to_cpu(cd->cd_BoardAddr); |
182 | dev->resource.end = dev->resource.start + cd->cd_BoardSize - 1; | 184 | dev->boardsize = be32_to_cpu(cd->cd_BoardSize); |
183 | } else | 185 | } else |
184 | printk("amiga_parse_bootinfo: too many AutoConfig devices\n"); | 186 | printk("amiga_parse_bootinfo: too many AutoConfig devices\n"); |
185 | #endif /* CONFIG_ZORRO */ | 187 | #endif /* CONFIG_ZORRO */ |
@@ -358,6 +360,14 @@ static void __init amiga_identify(void) | |||
358 | #undef AMIGAHW_ANNOUNCE | 360 | #undef AMIGAHW_ANNOUNCE |
359 | } | 361 | } |
360 | 362 | ||
363 | |||
364 | static unsigned long amiga_random_get_entropy(void) | ||
365 | { | ||
366 | /* VPOSR/VHPOSR provide at least 17 bits of data changing at 1.79 MHz */ | ||
367 | return *(unsigned long *)&amiga_custom.vposr; | ||
368 | } | ||
369 | |||
370 | |||
361 | /* | 371 | /* |
362 | * Setup the Amiga configuration info | 372 | * Setup the Amiga configuration info |
363 | */ | 373 | */ |
@@ -395,6 +405,8 @@ void __init config_amiga(void) | |||
395 | mach_heartbeat = amiga_heartbeat; | 405 | mach_heartbeat = amiga_heartbeat; |
396 | #endif | 406 | #endif |
397 | 407 | ||
408 | mach_random_get_entropy = amiga_random_get_entropy; | ||
409 | |||
398 | /* Fill in the clock value (based on the 700 kHz E-Clock) */ | 410 | /* Fill in the clock value (based on the 700 kHz E-Clock) */ |
399 | amiga_colorclock = 5*amiga_eclock; /* 3.5 MHz */ | 411 | amiga_colorclock = 5*amiga_eclock; /* 3.5 MHz */ |
400 | 412 | ||
@@ -608,6 +620,8 @@ static void amiga_mem_console_write(struct console *co, const char *s, | |||
608 | 620 | ||
609 | static int __init amiga_savekmsg_setup(char *arg) | 621 | static int __init amiga_savekmsg_setup(char *arg) |
610 | { | 622 | { |
623 | bool registered; | ||
624 | |||
611 | if (!MACH_IS_AMIGA || strcmp(arg, "mem")) | 625 | if (!MACH_IS_AMIGA || strcmp(arg, "mem")) |
612 | return 0; | 626 | return 0; |
613 | 627 | ||
@@ -618,14 +632,16 @@ static int __init amiga_savekmsg_setup(char *arg) | |||
618 | 632 | ||
619 | /* Just steal the block, the chipram allocator isn't functional yet */ | 633 | /* Just steal the block, the chipram allocator isn't functional yet */ |
620 | amiga_chip_size -= SAVEKMSG_MAXMEM; | 634 | amiga_chip_size -= SAVEKMSG_MAXMEM; |
621 | savekmsg = (void *)ZTWO_VADDR(CHIP_PHYSADDR + amiga_chip_size); | 635 | savekmsg = ZTWO_VADDR(CHIP_PHYSADDR + amiga_chip_size); |
622 | savekmsg->magic1 = SAVEKMSG_MAGIC1; | 636 | savekmsg->magic1 = SAVEKMSG_MAGIC1; |
623 | savekmsg->magic2 = SAVEKMSG_MAGIC2; | 637 | savekmsg->magic2 = SAVEKMSG_MAGIC2; |
624 | savekmsg->magicptr = ZTWO_PADDR(savekmsg); | 638 | savekmsg->magicptr = ZTWO_PADDR(savekmsg); |
625 | savekmsg->size = 0; | 639 | savekmsg->size = 0; |
626 | 640 | ||
641 | registered = !!amiga_console_driver.write; | ||
627 | amiga_console_driver.write = amiga_mem_console_write; | 642 | amiga_console_driver.write = amiga_mem_console_write; |
628 | register_console(&amiga_console_driver); | 643 | if (!registered) |
644 | register_console(&amiga_console_driver); | ||
629 | return 0; | 645 | return 0; |
630 | } | 646 | } |
631 | 647 | ||
@@ -707,11 +723,16 @@ void amiga_serial_gets(struct console *co, char *s, int len) | |||
707 | 723 | ||
708 | static int __init amiga_debug_setup(char *arg) | 724 | static int __init amiga_debug_setup(char *arg) |
709 | { | 725 | { |
710 | if (MACH_IS_AMIGA && !strcmp(arg, "ser")) { | 726 | bool registered; |
711 | /* no initialization required (?) */ | 727 | |
712 | amiga_console_driver.write = amiga_serial_console_write; | 728 | if (!MACH_IS_AMIGA || strcmp(arg, "ser")) |
729 | return 0; | ||
730 | |||
731 | /* no initialization required (?) */ | ||
732 | registered = !!amiga_console_driver.write; | ||
733 | amiga_console_driver.write = amiga_serial_console_write; | ||
734 | if (!registered) | ||
713 | register_console(&amiga_console_driver); | 735 | register_console(&amiga_console_driver); |
714 | } | ||
715 | return 0; | 736 | return 0; |
716 | } | 737 | } |
717 | 738 | ||
diff --git a/arch/m68k/amiga/platform.c b/arch/m68k/amiga/platform.c index dacd9f911f71..d34029d7b058 100644 --- a/arch/m68k/amiga/platform.c +++ b/arch/m68k/amiga/platform.c | |||
@@ -13,6 +13,7 @@ | |||
13 | 13 | ||
14 | #include <asm/amigahw.h> | 14 | #include <asm/amigahw.h> |
15 | #include <asm/amigayle.h> | 15 | #include <asm/amigayle.h> |
16 | #include <asm/byteorder.h> | ||
16 | 17 | ||
17 | 18 | ||
18 | #ifdef CONFIG_ZORRO | 19 | #ifdef CONFIG_ZORRO |
@@ -66,10 +67,12 @@ static int __init z_dev_present(zorro_id id) | |||
66 | { | 67 | { |
67 | unsigned int i; | 68 | unsigned int i; |
68 | 69 | ||
69 | for (i = 0; i < zorro_num_autocon; i++) | 70 | for (i = 0; i < zorro_num_autocon; i++) { |
70 | if (zorro_autocon[i].rom.er_Manufacturer == ZORRO_MANUF(id) && | 71 | const struct ExpansionRom *rom = &zorro_autocon_init[i].rom; |
71 | zorro_autocon[i].rom.er_Product == ZORRO_PROD(id)) | 72 | if (be16_to_cpu(rom->er_Manufacturer) == ZORRO_MANUF(id) && |
73 | rom->er_Product == ZORRO_PROD(id)) | ||
72 | return 1; | 74 | return 1; |
75 | } | ||
73 | 76 | ||
74 | return 0; | 77 | return 0; |
75 | } | 78 | } |
diff --git a/arch/m68k/apollo/config.c b/arch/m68k/apollo/config.c index 3ea56b90e718..9268c0f96376 100644 --- a/arch/m68k/apollo/config.c +++ b/arch/m68k/apollo/config.c | |||
@@ -1,3 +1,4 @@ | |||
1 | #include <linux/init.h> | ||
1 | #include <linux/types.h> | 2 | #include <linux/types.h> |
2 | #include <linux/kernel.h> | 3 | #include <linux/kernel.h> |
3 | #include <linux/mm.h> | 4 | #include <linux/mm.h> |
@@ -9,6 +10,8 @@ | |||
9 | 10 | ||
10 | #include <asm/setup.h> | 11 | #include <asm/setup.h> |
11 | #include <asm/bootinfo.h> | 12 | #include <asm/bootinfo.h> |
13 | #include <asm/bootinfo-apollo.h> | ||
14 | #include <asm/byteorder.h> | ||
12 | #include <asm/pgtable.h> | 15 | #include <asm/pgtable.h> |
13 | #include <asm/apollohw.h> | 16 | #include <asm/apollohw.h> |
14 | #include <asm/irq.h> | 17 | #include <asm/irq.h> |
@@ -43,26 +46,25 @@ static const char *apollo_models[] = { | |||
43 | [APOLLO_DN4500-APOLLO_DN3000] = "DN4500 (Roadrunner)" | 46 | [APOLLO_DN4500-APOLLO_DN3000] = "DN4500 (Roadrunner)" |
44 | }; | 47 | }; |
45 | 48 | ||
46 | int apollo_parse_bootinfo(const struct bi_record *record) { | 49 | int __init apollo_parse_bootinfo(const struct bi_record *record) |
47 | 50 | { | |
48 | int unknown = 0; | 51 | int unknown = 0; |
49 | const unsigned long *data = record->data; | 52 | const void *data = record->data; |
50 | 53 | ||
51 | switch(record->tag) { | 54 | switch (be16_to_cpu(record->tag)) { |
52 | case BI_APOLLO_MODEL: | 55 | case BI_APOLLO_MODEL: |
53 | apollo_model=*data; | 56 | apollo_model = be32_to_cpup(data); |
54 | break; | 57 | break; |
55 | 58 | ||
56 | default: | 59 | default: |
57 | unknown=1; | 60 | unknown=1; |
58 | } | 61 | } |
59 | 62 | ||
60 | return unknown; | 63 | return unknown; |
61 | } | 64 | } |
62 | 65 | ||
63 | void dn_setup_model(void) { | 66 | static void __init dn_setup_model(void) |
64 | 67 | { | |
65 | |||
66 | printk("Apollo hardware found: "); | 68 | printk("Apollo hardware found: "); |
67 | printk("[%s]\n", apollo_models[apollo_model - APOLLO_DN3000]); | 69 | printk("[%s]\n", apollo_models[apollo_model - APOLLO_DN3000]); |
68 | 70 | ||
diff --git a/arch/m68k/atari/ataints.c b/arch/m68k/atari/ataints.c index 20cde4e9fc77..3e73a63c066f 100644 --- a/arch/m68k/atari/ataints.c +++ b/arch/m68k/atari/ataints.c | |||
@@ -333,6 +333,9 @@ void __init atari_init_IRQ(void) | |||
333 | m68k_setup_irq_controller(&atari_mfptimer_chip, handle_simple_irq, | 333 | m68k_setup_irq_controller(&atari_mfptimer_chip, handle_simple_irq, |
334 | IRQ_MFP_TIMER1, 8); | 334 | IRQ_MFP_TIMER1, 8); |
335 | 335 | ||
336 | irq_set_status_flags(IRQ_MFP_TIMER1, IRQ_IS_POLLED); | ||
337 | irq_set_status_flags(IRQ_MFP_TIMER2, IRQ_IS_POLLED); | ||
338 | |||
336 | /* prepare timer D data for use as poll interrupt */ | 339 | /* prepare timer D data for use as poll interrupt */ |
337 | /* set Timer D data Register - needs to be > 0 */ | 340 | /* set Timer D data Register - needs to be > 0 */ |
338 | st_mfp.tim_dt_d = 254; /* < 100 Hz */ | 341 | st_mfp.tim_dt_d = 254; /* < 100 Hz */ |
diff --git a/arch/m68k/atari/config.c b/arch/m68k/atari/config.c index fb2d0bd9b3ad..01a62161b08a 100644 --- a/arch/m68k/atari/config.c +++ b/arch/m68k/atari/config.c | |||
@@ -37,6 +37,8 @@ | |||
37 | #include <linux/module.h> | 37 | #include <linux/module.h> |
38 | 38 | ||
39 | #include <asm/bootinfo.h> | 39 | #include <asm/bootinfo.h> |
40 | #include <asm/bootinfo-atari.h> | ||
41 | #include <asm/byteorder.h> | ||
40 | #include <asm/setup.h> | 42 | #include <asm/setup.h> |
41 | #include <asm/atarihw.h> | 43 | #include <asm/atarihw.h> |
42 | #include <asm/atariints.h> | 44 | #include <asm/atariints.h> |
@@ -129,14 +131,14 @@ static int __init scc_test(volatile char *ctla) | |||
129 | int __init atari_parse_bootinfo(const struct bi_record *record) | 131 | int __init atari_parse_bootinfo(const struct bi_record *record) |
130 | { | 132 | { |
131 | int unknown = 0; | 133 | int unknown = 0; |
132 | const u_long *data = record->data; | 134 | const void *data = record->data; |
133 | 135 | ||
134 | switch (record->tag) { | 136 | switch (be16_to_cpu(record->tag)) { |
135 | case BI_ATARI_MCH_COOKIE: | 137 | case BI_ATARI_MCH_COOKIE: |
136 | atari_mch_cookie = *data; | 138 | atari_mch_cookie = be32_to_cpup(data); |
137 | break; | 139 | break; |
138 | case BI_ATARI_MCH_TYPE: | 140 | case BI_ATARI_MCH_TYPE: |
139 | atari_mch_type = *data; | 141 | atari_mch_type = be32_to_cpup(data); |
140 | break; | 142 | break; |
141 | default: | 143 | default: |
142 | unknown = 1; | 144 | unknown = 1; |
diff --git a/arch/m68k/atari/debug.c b/arch/m68k/atari/debug.c index a547ba9683d1..03cb5e08d7cf 100644 --- a/arch/m68k/atari/debug.c +++ b/arch/m68k/atari/debug.c | |||
@@ -287,6 +287,8 @@ static void __init atari_init_midi_port(int cflag) | |||
287 | 287 | ||
288 | static int __init atari_debug_setup(char *arg) | 288 | static int __init atari_debug_setup(char *arg) |
289 | { | 289 | { |
290 | bool registered; | ||
291 | |||
290 | if (!MACH_IS_ATARI) | 292 | if (!MACH_IS_ATARI) |
291 | return 0; | 293 | return 0; |
292 | 294 | ||
@@ -294,6 +296,7 @@ static int __init atari_debug_setup(char *arg) | |||
294 | /* defaults to ser2 for a Falcon and ser1 otherwise */ | 296 | /* defaults to ser2 for a Falcon and ser1 otherwise */ |
295 | arg = MACH_IS_FALCON ? "ser2" : "ser1"; | 297 | arg = MACH_IS_FALCON ? "ser2" : "ser1"; |
296 | 298 | ||
299 | registered = !!atari_console_driver.write; | ||
297 | if (!strcmp(arg, "ser1")) { | 300 | if (!strcmp(arg, "ser1")) { |
298 | /* ST-MFP Modem1 serial port */ | 301 | /* ST-MFP Modem1 serial port */ |
299 | atari_init_mfp_port(B9600|CS8); | 302 | atari_init_mfp_port(B9600|CS8); |
@@ -317,7 +320,7 @@ static int __init atari_debug_setup(char *arg) | |||
317 | sound_ym.wd_data = sound_ym.rd_data_reg_sel | 0x20; /* strobe H */ | 320 | sound_ym.wd_data = sound_ym.rd_data_reg_sel | 0x20; /* strobe H */ |
318 | atari_console_driver.write = atari_par_console_write; | 321 | atari_console_driver.write = atari_par_console_write; |
319 | } | 322 | } |
320 | if (atari_console_driver.write) | 323 | if (atari_console_driver.write && !registered) |
321 | register_console(&atari_console_driver); | 324 | register_console(&atari_console_driver); |
322 | 325 | ||
323 | return 0; | 326 | return 0; |
diff --git a/arch/m68k/bvme6000/config.c b/arch/m68k/bvme6000/config.c index 8943aa4c18e6..478623dbb209 100644 --- a/arch/m68k/bvme6000/config.c +++ b/arch/m68k/bvme6000/config.c | |||
@@ -28,6 +28,8 @@ | |||
28 | #include <linux/bcd.h> | 28 | #include <linux/bcd.h> |
29 | 29 | ||
30 | #include <asm/bootinfo.h> | 30 | #include <asm/bootinfo.h> |
31 | #include <asm/bootinfo-vme.h> | ||
32 | #include <asm/byteorder.h> | ||
31 | #include <asm/pgtable.h> | 33 | #include <asm/pgtable.h> |
32 | #include <asm/setup.h> | 34 | #include <asm/setup.h> |
33 | #include <asm/irq.h> | 35 | #include <asm/irq.h> |
@@ -50,9 +52,9 @@ void bvme6000_set_vectors (void); | |||
50 | static irq_handler_t tick_handler; | 52 | static irq_handler_t tick_handler; |
51 | 53 | ||
52 | 54 | ||
53 | int bvme6000_parse_bootinfo(const struct bi_record *bi) | 55 | int __init bvme6000_parse_bootinfo(const struct bi_record *bi) |
54 | { | 56 | { |
55 | if (bi->tag == BI_VME_TYPE) | 57 | if (be16_to_cpu(bi->tag) == BI_VME_TYPE) |
56 | return 0; | 58 | return 0; |
57 | else | 59 | else |
58 | return 1; | 60 | return 1; |
diff --git a/arch/m68k/configs/amiga_defconfig b/arch/m68k/configs/amiga_defconfig index 19325e117eea..559ff3af8ff7 100644 --- a/arch/m68k/configs/amiga_defconfig +++ b/arch/m68k/configs/amiga_defconfig | |||
@@ -52,7 +52,6 @@ CONFIG_IP_PNP_RARP=y | |||
52 | CONFIG_NET_IPIP=m | 52 | CONFIG_NET_IPIP=m |
53 | CONFIG_NET_IPGRE_DEMUX=m | 53 | CONFIG_NET_IPGRE_DEMUX=m |
54 | CONFIG_NET_IPGRE=m | 54 | CONFIG_NET_IPGRE=m |
55 | CONFIG_SYN_COOKIES=y | ||
56 | CONFIG_NET_IPVTI=m | 55 | CONFIG_NET_IPVTI=m |
57 | CONFIG_INET_AH=m | 56 | CONFIG_INET_AH=m |
58 | CONFIG_INET_ESP=m | 57 | CONFIG_INET_ESP=m |
@@ -63,11 +62,11 @@ CONFIG_INET_XFRM_MODE_BEET=m | |||
63 | # CONFIG_INET_LRO is not set | 62 | # CONFIG_INET_LRO is not set |
64 | CONFIG_INET_DIAG=m | 63 | CONFIG_INET_DIAG=m |
65 | CONFIG_INET_UDP_DIAG=m | 64 | CONFIG_INET_UDP_DIAG=m |
66 | CONFIG_IPV6_PRIVACY=y | ||
67 | CONFIG_IPV6_ROUTER_PREF=y | 65 | CONFIG_IPV6_ROUTER_PREF=y |
68 | CONFIG_INET6_AH=m | 66 | CONFIG_INET6_AH=m |
69 | CONFIG_INET6_ESP=m | 67 | CONFIG_INET6_ESP=m |
70 | CONFIG_INET6_IPCOMP=m | 68 | CONFIG_INET6_IPCOMP=m |
69 | CONFIG_IPV6_VTI=m | ||
71 | CONFIG_IPV6_GRE=m | 70 | CONFIG_IPV6_GRE=m |
72 | CONFIG_NETFILTER=y | 71 | CONFIG_NETFILTER=y |
73 | CONFIG_NF_CONNTRACK=m | 72 | CONFIG_NF_CONNTRACK=m |
@@ -85,6 +84,17 @@ CONFIG_NF_CONNTRACK_PPTP=m | |||
85 | CONFIG_NF_CONNTRACK_SANE=m | 84 | CONFIG_NF_CONNTRACK_SANE=m |
86 | CONFIG_NF_CONNTRACK_SIP=m | 85 | CONFIG_NF_CONNTRACK_SIP=m |
87 | CONFIG_NF_CONNTRACK_TFTP=m | 86 | CONFIG_NF_CONNTRACK_TFTP=m |
87 | CONFIG_NF_TABLES=m | ||
88 | CONFIG_NFT_EXTHDR=m | ||
89 | CONFIG_NFT_META=m | ||
90 | CONFIG_NFT_CT=m | ||
91 | CONFIG_NFT_RBTREE=m | ||
92 | CONFIG_NFT_HASH=m | ||
93 | CONFIG_NFT_COUNTER=m | ||
94 | CONFIG_NFT_LOG=m | ||
95 | CONFIG_NFT_LIMIT=m | ||
96 | CONFIG_NFT_NAT=m | ||
97 | CONFIG_NFT_COMPAT=m | ||
88 | CONFIG_NETFILTER_XT_SET=m | 98 | CONFIG_NETFILTER_XT_SET=m |
89 | CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m | 99 | CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m |
90 | CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m | 100 | CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m |
@@ -98,6 +108,7 @@ CONFIG_NETFILTER_XT_TARGET_NFLOG=m | |||
98 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m | 108 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m |
99 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m | 109 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m |
100 | CONFIG_NETFILTER_XT_TARGET_TEE=m | 110 | CONFIG_NETFILTER_XT_TARGET_TEE=m |
111 | CONFIG_NETFILTER_XT_TARGET_TPROXY=m | ||
101 | CONFIG_NETFILTER_XT_TARGET_TRACE=m | 112 | CONFIG_NETFILTER_XT_TARGET_TRACE=m |
102 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m | 113 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m |
103 | CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m | 114 | CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m |
@@ -130,6 +141,7 @@ CONFIG_NETFILTER_XT_MATCH_QUOTA=m | |||
130 | CONFIG_NETFILTER_XT_MATCH_RATEEST=m | 141 | CONFIG_NETFILTER_XT_MATCH_RATEEST=m |
131 | CONFIG_NETFILTER_XT_MATCH_REALM=m | 142 | CONFIG_NETFILTER_XT_MATCH_REALM=m |
132 | CONFIG_NETFILTER_XT_MATCH_RECENT=m | 143 | CONFIG_NETFILTER_XT_MATCH_RECENT=m |
144 | CONFIG_NETFILTER_XT_MATCH_SOCKET=m | ||
133 | CONFIG_NETFILTER_XT_MATCH_STATE=m | 145 | CONFIG_NETFILTER_XT_MATCH_STATE=m |
134 | CONFIG_NETFILTER_XT_MATCH_STATISTIC=m | 146 | CONFIG_NETFILTER_XT_MATCH_STATISTIC=m |
135 | CONFIG_NETFILTER_XT_MATCH_STRING=m | 147 | CONFIG_NETFILTER_XT_MATCH_STRING=m |
@@ -144,11 +156,18 @@ CONFIG_IP_SET_HASH_IP=m | |||
144 | CONFIG_IP_SET_HASH_IPPORT=m | 156 | CONFIG_IP_SET_HASH_IPPORT=m |
145 | CONFIG_IP_SET_HASH_IPPORTIP=m | 157 | CONFIG_IP_SET_HASH_IPPORTIP=m |
146 | CONFIG_IP_SET_HASH_IPPORTNET=m | 158 | CONFIG_IP_SET_HASH_IPPORTNET=m |
159 | CONFIG_IP_SET_HASH_NETPORTNET=m | ||
147 | CONFIG_IP_SET_HASH_NET=m | 160 | CONFIG_IP_SET_HASH_NET=m |
161 | CONFIG_IP_SET_HASH_NETNET=m | ||
148 | CONFIG_IP_SET_HASH_NETPORT=m | 162 | CONFIG_IP_SET_HASH_NETPORT=m |
149 | CONFIG_IP_SET_HASH_NETIFACE=m | 163 | CONFIG_IP_SET_HASH_NETIFACE=m |
150 | CONFIG_IP_SET_LIST_SET=m | 164 | CONFIG_IP_SET_LIST_SET=m |
151 | CONFIG_NF_CONNTRACK_IPV4=m | 165 | CONFIG_NF_CONNTRACK_IPV4=m |
166 | CONFIG_NF_TABLES_IPV4=m | ||
167 | CONFIG_NFT_REJECT_IPV4=m | ||
168 | CONFIG_NFT_CHAIN_ROUTE_IPV4=m | ||
169 | CONFIG_NFT_CHAIN_NAT_IPV4=m | ||
170 | CONFIG_NF_TABLES_ARP=m | ||
152 | CONFIG_IP_NF_IPTABLES=m | 171 | CONFIG_IP_NF_IPTABLES=m |
153 | CONFIG_IP_NF_MATCH_AH=m | 172 | CONFIG_IP_NF_MATCH_AH=m |
154 | CONFIG_IP_NF_MATCH_ECN=m | 173 | CONFIG_IP_NF_MATCH_ECN=m |
@@ -156,6 +175,7 @@ CONFIG_IP_NF_MATCH_RPFILTER=m | |||
156 | CONFIG_IP_NF_MATCH_TTL=m | 175 | CONFIG_IP_NF_MATCH_TTL=m |
157 | CONFIG_IP_NF_FILTER=m | 176 | CONFIG_IP_NF_FILTER=m |
158 | CONFIG_IP_NF_TARGET_REJECT=m | 177 | CONFIG_IP_NF_TARGET_REJECT=m |
178 | CONFIG_IP_NF_TARGET_SYNPROXY=m | ||
159 | CONFIG_IP_NF_TARGET_ULOG=m | 179 | CONFIG_IP_NF_TARGET_ULOG=m |
160 | CONFIG_NF_NAT_IPV4=m | 180 | CONFIG_NF_NAT_IPV4=m |
161 | CONFIG_IP_NF_TARGET_MASQUERADE=m | 181 | CONFIG_IP_NF_TARGET_MASQUERADE=m |
@@ -170,6 +190,9 @@ CONFIG_IP_NF_ARPTABLES=m | |||
170 | CONFIG_IP_NF_ARPFILTER=m | 190 | CONFIG_IP_NF_ARPFILTER=m |
171 | CONFIG_IP_NF_ARP_MANGLE=m | 191 | CONFIG_IP_NF_ARP_MANGLE=m |
172 | CONFIG_NF_CONNTRACK_IPV6=m | 192 | CONFIG_NF_CONNTRACK_IPV6=m |
193 | CONFIG_NF_TABLES_IPV6=m | ||
194 | CONFIG_NFT_CHAIN_ROUTE_IPV6=m | ||
195 | CONFIG_NFT_CHAIN_NAT_IPV6=m | ||
173 | CONFIG_IP6_NF_IPTABLES=m | 196 | CONFIG_IP6_NF_IPTABLES=m |
174 | CONFIG_IP6_NF_MATCH_AH=m | 197 | CONFIG_IP6_NF_MATCH_AH=m |
175 | CONFIG_IP6_NF_MATCH_EUI64=m | 198 | CONFIG_IP6_NF_MATCH_EUI64=m |
@@ -183,11 +206,13 @@ CONFIG_IP6_NF_MATCH_RT=m | |||
183 | CONFIG_IP6_NF_TARGET_HL=m | 206 | CONFIG_IP6_NF_TARGET_HL=m |
184 | CONFIG_IP6_NF_FILTER=m | 207 | CONFIG_IP6_NF_FILTER=m |
185 | CONFIG_IP6_NF_TARGET_REJECT=m | 208 | CONFIG_IP6_NF_TARGET_REJECT=m |
209 | CONFIG_IP6_NF_TARGET_SYNPROXY=m | ||
186 | CONFIG_IP6_NF_MANGLE=m | 210 | CONFIG_IP6_NF_MANGLE=m |
187 | CONFIG_IP6_NF_RAW=m | 211 | CONFIG_IP6_NF_RAW=m |
188 | CONFIG_NF_NAT_IPV6=m | 212 | CONFIG_NF_NAT_IPV6=m |
189 | CONFIG_IP6_NF_TARGET_MASQUERADE=m | 213 | CONFIG_IP6_NF_TARGET_MASQUERADE=m |
190 | CONFIG_IP6_NF_TARGET_NPT=m | 214 | CONFIG_IP6_NF_TARGET_NPT=m |
215 | CONFIG_NF_TABLES_BRIDGE=m | ||
191 | CONFIG_IP_DCCP=m | 216 | CONFIG_IP_DCCP=m |
192 | # CONFIG_IP_DCCP_CCID3 is not set | 217 | # CONFIG_IP_DCCP_CCID3 is not set |
193 | CONFIG_SCTP_COOKIE_HMAC_SHA1=y | 218 | CONFIG_SCTP_COOKIE_HMAC_SHA1=y |
@@ -195,10 +220,13 @@ CONFIG_RDS=m | |||
195 | CONFIG_RDS_TCP=m | 220 | CONFIG_RDS_TCP=m |
196 | CONFIG_L2TP=m | 221 | CONFIG_L2TP=m |
197 | CONFIG_ATALK=m | 222 | CONFIG_ATALK=m |
223 | CONFIG_DNS_RESOLVER=y | ||
198 | CONFIG_BATMAN_ADV=m | 224 | CONFIG_BATMAN_ADV=m |
199 | CONFIG_BATMAN_ADV_DAT=y | 225 | CONFIG_BATMAN_ADV_DAT=y |
226 | CONFIG_BATMAN_ADV_NC=y | ||
227 | CONFIG_NETLINK_DIAG=m | ||
228 | CONFIG_NET_MPLS_GSO=m | ||
200 | # CONFIG_WIRELESS is not set | 229 | # CONFIG_WIRELESS is not set |
201 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
202 | CONFIG_DEVTMPFS=y | 230 | CONFIG_DEVTMPFS=y |
203 | # CONFIG_FIRMWARE_IN_KERNEL is not set | 231 | # CONFIG_FIRMWARE_IN_KERNEL is not set |
204 | # CONFIG_FW_LOADER_USER_HELPER is not set | 232 | # CONFIG_FW_LOADER_USER_HELPER is not set |
@@ -216,6 +244,7 @@ CONFIG_BLK_DEV_NBD=m | |||
216 | CONFIG_BLK_DEV_RAM=y | 244 | CONFIG_BLK_DEV_RAM=y |
217 | CONFIG_CDROM_PKTCDVD=m | 245 | CONFIG_CDROM_PKTCDVD=m |
218 | CONFIG_ATA_OVER_ETH=m | 246 | CONFIG_ATA_OVER_ETH=m |
247 | CONFIG_DUMMY_IRQ=m | ||
219 | CONFIG_IDE=y | 248 | CONFIG_IDE=y |
220 | CONFIG_IDE_GD_ATAPI=y | 249 | CONFIG_IDE_GD_ATAPI=y |
221 | CONFIG_BLK_DEV_IDECD=y | 250 | CONFIG_BLK_DEV_IDECD=y |
@@ -262,6 +291,7 @@ CONFIG_EQUALIZER=m | |||
262 | CONFIG_NET_TEAM=m | 291 | CONFIG_NET_TEAM=m |
263 | CONFIG_NET_TEAM_MODE_BROADCAST=m | 292 | CONFIG_NET_TEAM_MODE_BROADCAST=m |
264 | CONFIG_NET_TEAM_MODE_ROUNDROBIN=m | 293 | CONFIG_NET_TEAM_MODE_ROUNDROBIN=m |
294 | CONFIG_NET_TEAM_MODE_RANDOM=m | ||
265 | CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m | 295 | CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m |
266 | CONFIG_NET_TEAM_MODE_LOADBALANCE=m | 296 | CONFIG_NET_TEAM_MODE_LOADBALANCE=m |
267 | CONFIG_VXLAN=m | 297 | CONFIG_VXLAN=m |
@@ -271,10 +301,10 @@ CONFIG_VETH=m | |||
271 | # CONFIG_NET_VENDOR_3COM is not set | 301 | # CONFIG_NET_VENDOR_3COM is not set |
272 | CONFIG_A2065=y | 302 | CONFIG_A2065=y |
273 | CONFIG_ARIADNE=y | 303 | CONFIG_ARIADNE=y |
304 | # CONFIG_NET_VENDOR_ARC is not set | ||
274 | # CONFIG_NET_CADENCE is not set | 305 | # CONFIG_NET_CADENCE is not set |
275 | # CONFIG_NET_VENDOR_BROADCOM is not set | 306 | # CONFIG_NET_VENDOR_BROADCOM is not set |
276 | # CONFIG_NET_VENDOR_CIRRUS is not set | 307 | # CONFIG_NET_VENDOR_CIRRUS is not set |
277 | # CONFIG_NET_VENDOR_FUJITSU is not set | ||
278 | # CONFIG_NET_VENDOR_HP is not set | 308 | # CONFIG_NET_VENDOR_HP is not set |
279 | # CONFIG_NET_VENDOR_INTEL is not set | 309 | # CONFIG_NET_VENDOR_INTEL is not set |
280 | # CONFIG_NET_VENDOR_MARVELL is not set | 310 | # CONFIG_NET_VENDOR_MARVELL is not set |
@@ -285,6 +315,7 @@ CONFIG_ZORRO8390=y | |||
285 | # CONFIG_NET_VENDOR_SEEQ is not set | 315 | # CONFIG_NET_VENDOR_SEEQ is not set |
286 | # CONFIG_NET_VENDOR_SMSC is not set | 316 | # CONFIG_NET_VENDOR_SMSC is not set |
287 | # CONFIG_NET_VENDOR_STMICRO is not set | 317 | # CONFIG_NET_VENDOR_STMICRO is not set |
318 | # CONFIG_NET_VENDOR_VIA is not set | ||
288 | # CONFIG_NET_VENDOR_WIZNET is not set | 319 | # CONFIG_NET_VENDOR_WIZNET is not set |
289 | CONFIG_PPP=m | 320 | CONFIG_PPP=m |
290 | CONFIG_PPP_BSDCOMP=m | 321 | CONFIG_PPP_BSDCOMP=m |
@@ -311,7 +342,6 @@ CONFIG_JOYSTICK_AMIGA=m | |||
311 | CONFIG_INPUT_MISC=y | 342 | CONFIG_INPUT_MISC=y |
312 | CONFIG_INPUT_M68K_BEEP=m | 343 | CONFIG_INPUT_M68K_BEEP=m |
313 | # CONFIG_SERIO is not set | 344 | # CONFIG_SERIO is not set |
314 | CONFIG_VT_HW_CONSOLE_BINDING=y | ||
315 | # CONFIG_LEGACY_PTYS is not set | 345 | # CONFIG_LEGACY_PTYS is not set |
316 | # CONFIG_DEVKMEM is not set | 346 | # CONFIG_DEVKMEM is not set |
317 | CONFIG_PRINTER=m | 347 | CONFIG_PRINTER=m |
@@ -345,10 +375,6 @@ CONFIG_HEARTBEAT=y | |||
345 | CONFIG_PROC_HARDWARE=y | 375 | CONFIG_PROC_HARDWARE=y |
346 | CONFIG_AMIGA_BUILTIN_SERIAL=y | 376 | CONFIG_AMIGA_BUILTIN_SERIAL=y |
347 | CONFIG_SERIAL_CONSOLE=y | 377 | CONFIG_SERIAL_CONSOLE=y |
348 | CONFIG_EXT2_FS=y | ||
349 | CONFIG_EXT3_FS=y | ||
350 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set | ||
351 | # CONFIG_EXT3_FS_XATTR is not set | ||
352 | CONFIG_EXT4_FS=y | 378 | CONFIG_EXT4_FS=y |
353 | CONFIG_REISERFS_FS=m | 379 | CONFIG_REISERFS_FS=m |
354 | CONFIG_JFS_FS=m | 380 | CONFIG_JFS_FS=m |
@@ -385,7 +411,7 @@ CONFIG_QNX6FS_FS=m | |||
385 | CONFIG_SYSV_FS=m | 411 | CONFIG_SYSV_FS=m |
386 | CONFIG_UFS_FS=m | 412 | CONFIG_UFS_FS=m |
387 | CONFIG_NFS_FS=y | 413 | CONFIG_NFS_FS=y |
388 | CONFIG_NFS_V4=y | 414 | CONFIG_NFS_V4=m |
389 | CONFIG_NFS_SWAP=y | 415 | CONFIG_NFS_SWAP=y |
390 | CONFIG_ROOT_NFS=y | 416 | CONFIG_ROOT_NFS=y |
391 | CONFIG_NFSD=m | 417 | CONFIG_NFSD=m |
@@ -444,10 +470,10 @@ CONFIG_NLS_MAC_TURKISH=m | |||
444 | CONFIG_DLM=m | 470 | CONFIG_DLM=m |
445 | CONFIG_MAGIC_SYSRQ=y | 471 | CONFIG_MAGIC_SYSRQ=y |
446 | CONFIG_ASYNC_RAID6_TEST=m | 472 | CONFIG_ASYNC_RAID6_TEST=m |
473 | CONFIG_TEST_STRING_HELPERS=m | ||
447 | CONFIG_ENCRYPTED_KEYS=m | 474 | CONFIG_ENCRYPTED_KEYS=m |
448 | CONFIG_CRYPTO_MANAGER=y | 475 | CONFIG_CRYPTO_MANAGER=y |
449 | CONFIG_CRYPTO_USER=m | 476 | CONFIG_CRYPTO_USER=m |
450 | CONFIG_CRYPTO_NULL=m | ||
451 | CONFIG_CRYPTO_CRYPTD=m | 477 | CONFIG_CRYPTO_CRYPTD=m |
452 | CONFIG_CRYPTO_TEST=m | 478 | CONFIG_CRYPTO_TEST=m |
453 | CONFIG_CRYPTO_CCM=m | 479 | CONFIG_CRYPTO_CCM=m |
@@ -480,6 +506,8 @@ CONFIG_CRYPTO_TEA=m | |||
480 | CONFIG_CRYPTO_TWOFISH=m | 506 | CONFIG_CRYPTO_TWOFISH=m |
481 | CONFIG_CRYPTO_ZLIB=m | 507 | CONFIG_CRYPTO_ZLIB=m |
482 | CONFIG_CRYPTO_LZO=m | 508 | CONFIG_CRYPTO_LZO=m |
509 | CONFIG_CRYPTO_LZ4=m | ||
510 | CONFIG_CRYPTO_LZ4HC=m | ||
483 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | 511 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
484 | CONFIG_CRYPTO_USER_API_HASH=m | 512 | CONFIG_CRYPTO_USER_API_HASH=m |
485 | CONFIG_CRYPTO_USER_API_SKCIPHER=m | 513 | CONFIG_CRYPTO_USER_API_SKCIPHER=m |
diff --git a/arch/m68k/configs/apollo_defconfig b/arch/m68k/configs/apollo_defconfig index 14dc6ccda7f4..cb1f55df69b6 100644 --- a/arch/m68k/configs/apollo_defconfig +++ b/arch/m68k/configs/apollo_defconfig | |||
@@ -50,7 +50,6 @@ CONFIG_IP_PNP_RARP=y | |||
50 | CONFIG_NET_IPIP=m | 50 | CONFIG_NET_IPIP=m |
51 | CONFIG_NET_IPGRE_DEMUX=m | 51 | CONFIG_NET_IPGRE_DEMUX=m |
52 | CONFIG_NET_IPGRE=m | 52 | CONFIG_NET_IPGRE=m |
53 | CONFIG_SYN_COOKIES=y | ||
54 | CONFIG_NET_IPVTI=m | 53 | CONFIG_NET_IPVTI=m |
55 | CONFIG_INET_AH=m | 54 | CONFIG_INET_AH=m |
56 | CONFIG_INET_ESP=m | 55 | CONFIG_INET_ESP=m |
@@ -61,11 +60,11 @@ CONFIG_INET_XFRM_MODE_BEET=m | |||
61 | # CONFIG_INET_LRO is not set | 60 | # CONFIG_INET_LRO is not set |
62 | CONFIG_INET_DIAG=m | 61 | CONFIG_INET_DIAG=m |
63 | CONFIG_INET_UDP_DIAG=m | 62 | CONFIG_INET_UDP_DIAG=m |
64 | CONFIG_IPV6_PRIVACY=y | ||
65 | CONFIG_IPV6_ROUTER_PREF=y | 63 | CONFIG_IPV6_ROUTER_PREF=y |
66 | CONFIG_INET6_AH=m | 64 | CONFIG_INET6_AH=m |
67 | CONFIG_INET6_ESP=m | 65 | CONFIG_INET6_ESP=m |
68 | CONFIG_INET6_IPCOMP=m | 66 | CONFIG_INET6_IPCOMP=m |
67 | CONFIG_IPV6_VTI=m | ||
69 | CONFIG_IPV6_GRE=m | 68 | CONFIG_IPV6_GRE=m |
70 | CONFIG_NETFILTER=y | 69 | CONFIG_NETFILTER=y |
71 | CONFIG_NF_CONNTRACK=m | 70 | CONFIG_NF_CONNTRACK=m |
@@ -83,6 +82,17 @@ CONFIG_NF_CONNTRACK_PPTP=m | |||
83 | CONFIG_NF_CONNTRACK_SANE=m | 82 | CONFIG_NF_CONNTRACK_SANE=m |
84 | CONFIG_NF_CONNTRACK_SIP=m | 83 | CONFIG_NF_CONNTRACK_SIP=m |
85 | CONFIG_NF_CONNTRACK_TFTP=m | 84 | CONFIG_NF_CONNTRACK_TFTP=m |
85 | CONFIG_NF_TABLES=m | ||
86 | CONFIG_NFT_EXTHDR=m | ||
87 | CONFIG_NFT_META=m | ||
88 | CONFIG_NFT_CT=m | ||
89 | CONFIG_NFT_RBTREE=m | ||
90 | CONFIG_NFT_HASH=m | ||
91 | CONFIG_NFT_COUNTER=m | ||
92 | CONFIG_NFT_LOG=m | ||
93 | CONFIG_NFT_LIMIT=m | ||
94 | CONFIG_NFT_NAT=m | ||
95 | CONFIG_NFT_COMPAT=m | ||
86 | CONFIG_NETFILTER_XT_SET=m | 96 | CONFIG_NETFILTER_XT_SET=m |
87 | CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m | 97 | CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m |
88 | CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m | 98 | CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m |
@@ -96,6 +106,7 @@ CONFIG_NETFILTER_XT_TARGET_NFLOG=m | |||
96 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m | 106 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m |
97 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m | 107 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m |
98 | CONFIG_NETFILTER_XT_TARGET_TEE=m | 108 | CONFIG_NETFILTER_XT_TARGET_TEE=m |
109 | CONFIG_NETFILTER_XT_TARGET_TPROXY=m | ||
99 | CONFIG_NETFILTER_XT_TARGET_TRACE=m | 110 | CONFIG_NETFILTER_XT_TARGET_TRACE=m |
100 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m | 111 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m |
101 | CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m | 112 | CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m |
@@ -128,6 +139,7 @@ CONFIG_NETFILTER_XT_MATCH_QUOTA=m | |||
128 | CONFIG_NETFILTER_XT_MATCH_RATEEST=m | 139 | CONFIG_NETFILTER_XT_MATCH_RATEEST=m |
129 | CONFIG_NETFILTER_XT_MATCH_REALM=m | 140 | CONFIG_NETFILTER_XT_MATCH_REALM=m |
130 | CONFIG_NETFILTER_XT_MATCH_RECENT=m | 141 | CONFIG_NETFILTER_XT_MATCH_RECENT=m |
142 | CONFIG_NETFILTER_XT_MATCH_SOCKET=m | ||
131 | CONFIG_NETFILTER_XT_MATCH_STATE=m | 143 | CONFIG_NETFILTER_XT_MATCH_STATE=m |
132 | CONFIG_NETFILTER_XT_MATCH_STATISTIC=m | 144 | CONFIG_NETFILTER_XT_MATCH_STATISTIC=m |
133 | CONFIG_NETFILTER_XT_MATCH_STRING=m | 145 | CONFIG_NETFILTER_XT_MATCH_STRING=m |
@@ -142,11 +154,18 @@ CONFIG_IP_SET_HASH_IP=m | |||
142 | CONFIG_IP_SET_HASH_IPPORT=m | 154 | CONFIG_IP_SET_HASH_IPPORT=m |
143 | CONFIG_IP_SET_HASH_IPPORTIP=m | 155 | CONFIG_IP_SET_HASH_IPPORTIP=m |
144 | CONFIG_IP_SET_HASH_IPPORTNET=m | 156 | CONFIG_IP_SET_HASH_IPPORTNET=m |
157 | CONFIG_IP_SET_HASH_NETPORTNET=m | ||
145 | CONFIG_IP_SET_HASH_NET=m | 158 | CONFIG_IP_SET_HASH_NET=m |
159 | CONFIG_IP_SET_HASH_NETNET=m | ||
146 | CONFIG_IP_SET_HASH_NETPORT=m | 160 | CONFIG_IP_SET_HASH_NETPORT=m |
147 | CONFIG_IP_SET_HASH_NETIFACE=m | 161 | CONFIG_IP_SET_HASH_NETIFACE=m |
148 | CONFIG_IP_SET_LIST_SET=m | 162 | CONFIG_IP_SET_LIST_SET=m |
149 | CONFIG_NF_CONNTRACK_IPV4=m | 163 | CONFIG_NF_CONNTRACK_IPV4=m |
164 | CONFIG_NF_TABLES_IPV4=m | ||
165 | CONFIG_NFT_REJECT_IPV4=m | ||
166 | CONFIG_NFT_CHAIN_ROUTE_IPV4=m | ||
167 | CONFIG_NFT_CHAIN_NAT_IPV4=m | ||
168 | CONFIG_NF_TABLES_ARP=m | ||
150 | CONFIG_IP_NF_IPTABLES=m | 169 | CONFIG_IP_NF_IPTABLES=m |
151 | CONFIG_IP_NF_MATCH_AH=m | 170 | CONFIG_IP_NF_MATCH_AH=m |
152 | CONFIG_IP_NF_MATCH_ECN=m | 171 | CONFIG_IP_NF_MATCH_ECN=m |
@@ -154,6 +173,7 @@ CONFIG_IP_NF_MATCH_RPFILTER=m | |||
154 | CONFIG_IP_NF_MATCH_TTL=m | 173 | CONFIG_IP_NF_MATCH_TTL=m |
155 | CONFIG_IP_NF_FILTER=m | 174 | CONFIG_IP_NF_FILTER=m |
156 | CONFIG_IP_NF_TARGET_REJECT=m | 175 | CONFIG_IP_NF_TARGET_REJECT=m |
176 | CONFIG_IP_NF_TARGET_SYNPROXY=m | ||
157 | CONFIG_IP_NF_TARGET_ULOG=m | 177 | CONFIG_IP_NF_TARGET_ULOG=m |
158 | CONFIG_NF_NAT_IPV4=m | 178 | CONFIG_NF_NAT_IPV4=m |
159 | CONFIG_IP_NF_TARGET_MASQUERADE=m | 179 | CONFIG_IP_NF_TARGET_MASQUERADE=m |
@@ -168,6 +188,9 @@ CONFIG_IP_NF_ARPTABLES=m | |||
168 | CONFIG_IP_NF_ARPFILTER=m | 188 | CONFIG_IP_NF_ARPFILTER=m |
169 | CONFIG_IP_NF_ARP_MANGLE=m | 189 | CONFIG_IP_NF_ARP_MANGLE=m |
170 | CONFIG_NF_CONNTRACK_IPV6=m | 190 | CONFIG_NF_CONNTRACK_IPV6=m |
191 | CONFIG_NF_TABLES_IPV6=m | ||
192 | CONFIG_NFT_CHAIN_ROUTE_IPV6=m | ||
193 | CONFIG_NFT_CHAIN_NAT_IPV6=m | ||
171 | CONFIG_IP6_NF_IPTABLES=m | 194 | CONFIG_IP6_NF_IPTABLES=m |
172 | CONFIG_IP6_NF_MATCH_AH=m | 195 | CONFIG_IP6_NF_MATCH_AH=m |
173 | CONFIG_IP6_NF_MATCH_EUI64=m | 196 | CONFIG_IP6_NF_MATCH_EUI64=m |
@@ -181,11 +204,13 @@ CONFIG_IP6_NF_MATCH_RT=m | |||
181 | CONFIG_IP6_NF_TARGET_HL=m | 204 | CONFIG_IP6_NF_TARGET_HL=m |
182 | CONFIG_IP6_NF_FILTER=m | 205 | CONFIG_IP6_NF_FILTER=m |
183 | CONFIG_IP6_NF_TARGET_REJECT=m | 206 | CONFIG_IP6_NF_TARGET_REJECT=m |
207 | CONFIG_IP6_NF_TARGET_SYNPROXY=m | ||
184 | CONFIG_IP6_NF_MANGLE=m | 208 | CONFIG_IP6_NF_MANGLE=m |
185 | CONFIG_IP6_NF_RAW=m | 209 | CONFIG_IP6_NF_RAW=m |
186 | CONFIG_NF_NAT_IPV6=m | 210 | CONFIG_NF_NAT_IPV6=m |
187 | CONFIG_IP6_NF_TARGET_MASQUERADE=m | 211 | CONFIG_IP6_NF_TARGET_MASQUERADE=m |
188 | CONFIG_IP6_NF_TARGET_NPT=m | 212 | CONFIG_IP6_NF_TARGET_NPT=m |
213 | CONFIG_NF_TABLES_BRIDGE=m | ||
189 | CONFIG_IP_DCCP=m | 214 | CONFIG_IP_DCCP=m |
190 | # CONFIG_IP_DCCP_CCID3 is not set | 215 | # CONFIG_IP_DCCP_CCID3 is not set |
191 | CONFIG_SCTP_COOKIE_HMAC_SHA1=y | 216 | CONFIG_SCTP_COOKIE_HMAC_SHA1=y |
@@ -193,10 +218,13 @@ CONFIG_RDS=m | |||
193 | CONFIG_RDS_TCP=m | 218 | CONFIG_RDS_TCP=m |
194 | CONFIG_L2TP=m | 219 | CONFIG_L2TP=m |
195 | CONFIG_ATALK=m | 220 | CONFIG_ATALK=m |
221 | CONFIG_DNS_RESOLVER=y | ||
196 | CONFIG_BATMAN_ADV=m | 222 | CONFIG_BATMAN_ADV=m |
197 | CONFIG_BATMAN_ADV_DAT=y | 223 | CONFIG_BATMAN_ADV_DAT=y |
224 | CONFIG_BATMAN_ADV_NC=y | ||
225 | CONFIG_NETLINK_DIAG=m | ||
226 | CONFIG_NET_MPLS_GSO=m | ||
198 | # CONFIG_WIRELESS is not set | 227 | # CONFIG_WIRELESS is not set |
199 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
200 | CONFIG_DEVTMPFS=y | 228 | CONFIG_DEVTMPFS=y |
201 | # CONFIG_FIRMWARE_IN_KERNEL is not set | 229 | # CONFIG_FIRMWARE_IN_KERNEL is not set |
202 | # CONFIG_FW_LOADER_USER_HELPER is not set | 230 | # CONFIG_FW_LOADER_USER_HELPER is not set |
@@ -208,6 +236,7 @@ CONFIG_BLK_DEV_NBD=m | |||
208 | CONFIG_BLK_DEV_RAM=y | 236 | CONFIG_BLK_DEV_RAM=y |
209 | CONFIG_CDROM_PKTCDVD=m | 237 | CONFIG_CDROM_PKTCDVD=m |
210 | CONFIG_ATA_OVER_ETH=m | 238 | CONFIG_ATA_OVER_ETH=m |
239 | CONFIG_DUMMY_IRQ=m | ||
211 | CONFIG_RAID_ATTRS=m | 240 | CONFIG_RAID_ATTRS=m |
212 | CONFIG_SCSI=y | 241 | CONFIG_SCSI=y |
213 | CONFIG_SCSI_TGT=m | 242 | CONFIG_SCSI_TGT=m |
@@ -244,12 +273,14 @@ CONFIG_EQUALIZER=m | |||
244 | CONFIG_NET_TEAM=m | 273 | CONFIG_NET_TEAM=m |
245 | CONFIG_NET_TEAM_MODE_BROADCAST=m | 274 | CONFIG_NET_TEAM_MODE_BROADCAST=m |
246 | CONFIG_NET_TEAM_MODE_ROUNDROBIN=m | 275 | CONFIG_NET_TEAM_MODE_ROUNDROBIN=m |
276 | CONFIG_NET_TEAM_MODE_RANDOM=m | ||
247 | CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m | 277 | CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m |
248 | CONFIG_NET_TEAM_MODE_LOADBALANCE=m | 278 | CONFIG_NET_TEAM_MODE_LOADBALANCE=m |
249 | CONFIG_VXLAN=m | 279 | CONFIG_VXLAN=m |
250 | CONFIG_NETCONSOLE=m | 280 | CONFIG_NETCONSOLE=m |
251 | CONFIG_NETCONSOLE_DYNAMIC=y | 281 | CONFIG_NETCONSOLE_DYNAMIC=y |
252 | CONFIG_VETH=m | 282 | CONFIG_VETH=m |
283 | # CONFIG_NET_VENDOR_ARC is not set | ||
253 | # CONFIG_NET_CADENCE is not set | 284 | # CONFIG_NET_CADENCE is not set |
254 | # CONFIG_NET_VENDOR_BROADCOM is not set | 285 | # CONFIG_NET_VENDOR_BROADCOM is not set |
255 | # CONFIG_NET_VENDOR_INTEL is not set | 286 | # CONFIG_NET_VENDOR_INTEL is not set |
@@ -258,6 +289,7 @@ CONFIG_VETH=m | |||
258 | # CONFIG_NET_VENDOR_NATSEMI is not set | 289 | # CONFIG_NET_VENDOR_NATSEMI is not set |
259 | # CONFIG_NET_VENDOR_SEEQ is not set | 290 | # CONFIG_NET_VENDOR_SEEQ is not set |
260 | # CONFIG_NET_VENDOR_STMICRO is not set | 291 | # CONFIG_NET_VENDOR_STMICRO is not set |
292 | # CONFIG_NET_VENDOR_VIA is not set | ||
261 | # CONFIG_NET_VENDOR_WIZNET is not set | 293 | # CONFIG_NET_VENDOR_WIZNET is not set |
262 | CONFIG_PPP=m | 294 | CONFIG_PPP=m |
263 | CONFIG_PPP_BSDCOMP=m | 295 | CONFIG_PPP_BSDCOMP=m |
@@ -279,7 +311,6 @@ CONFIG_INPUT_EVDEV=m | |||
279 | # CONFIG_MOUSE_PS2 is not set | 311 | # CONFIG_MOUSE_PS2 is not set |
280 | CONFIG_MOUSE_SERIAL=m | 312 | CONFIG_MOUSE_SERIAL=m |
281 | CONFIG_SERIO=m | 313 | CONFIG_SERIO=m |
282 | CONFIG_VT_HW_CONSOLE_BINDING=y | ||
283 | # CONFIG_LEGACY_PTYS is not set | 314 | # CONFIG_LEGACY_PTYS is not set |
284 | # CONFIG_DEVKMEM is not set | 315 | # CONFIG_DEVKMEM is not set |
285 | # CONFIG_HW_RANDOM is not set | 316 | # CONFIG_HW_RANDOM is not set |
@@ -302,10 +333,6 @@ CONFIG_RTC_DRV_GENERIC=m | |||
302 | # CONFIG_IOMMU_SUPPORT is not set | 333 | # CONFIG_IOMMU_SUPPORT is not set |
303 | CONFIG_HEARTBEAT=y | 334 | CONFIG_HEARTBEAT=y |
304 | CONFIG_PROC_HARDWARE=y | 335 | CONFIG_PROC_HARDWARE=y |
305 | CONFIG_EXT2_FS=y | ||
306 | CONFIG_EXT3_FS=y | ||
307 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set | ||
308 | # CONFIG_EXT3_FS_XATTR is not set | ||
309 | CONFIG_EXT4_FS=y | 336 | CONFIG_EXT4_FS=y |
310 | CONFIG_REISERFS_FS=m | 337 | CONFIG_REISERFS_FS=m |
311 | CONFIG_JFS_FS=m | 338 | CONFIG_JFS_FS=m |
@@ -342,7 +369,7 @@ CONFIG_QNX6FS_FS=m | |||
342 | CONFIG_SYSV_FS=m | 369 | CONFIG_SYSV_FS=m |
343 | CONFIG_UFS_FS=m | 370 | CONFIG_UFS_FS=m |
344 | CONFIG_NFS_FS=y | 371 | CONFIG_NFS_FS=y |
345 | CONFIG_NFS_V4=y | 372 | CONFIG_NFS_V4=m |
346 | CONFIG_NFS_SWAP=y | 373 | CONFIG_NFS_SWAP=y |
347 | CONFIG_ROOT_NFS=y | 374 | CONFIG_ROOT_NFS=y |
348 | CONFIG_NFSD=m | 375 | CONFIG_NFSD=m |
@@ -401,10 +428,10 @@ CONFIG_NLS_MAC_TURKISH=m | |||
401 | CONFIG_DLM=m | 428 | CONFIG_DLM=m |
402 | CONFIG_MAGIC_SYSRQ=y | 429 | CONFIG_MAGIC_SYSRQ=y |
403 | CONFIG_ASYNC_RAID6_TEST=m | 430 | CONFIG_ASYNC_RAID6_TEST=m |
431 | CONFIG_TEST_STRING_HELPERS=m | ||
404 | CONFIG_ENCRYPTED_KEYS=m | 432 | CONFIG_ENCRYPTED_KEYS=m |
405 | CONFIG_CRYPTO_MANAGER=y | 433 | CONFIG_CRYPTO_MANAGER=y |
406 | CONFIG_CRYPTO_USER=m | 434 | CONFIG_CRYPTO_USER=m |
407 | CONFIG_CRYPTO_NULL=m | ||
408 | CONFIG_CRYPTO_CRYPTD=m | 435 | CONFIG_CRYPTO_CRYPTD=m |
409 | CONFIG_CRYPTO_TEST=m | 436 | CONFIG_CRYPTO_TEST=m |
410 | CONFIG_CRYPTO_CCM=m | 437 | CONFIG_CRYPTO_CCM=m |
@@ -437,6 +464,8 @@ CONFIG_CRYPTO_TEA=m | |||
437 | CONFIG_CRYPTO_TWOFISH=m | 464 | CONFIG_CRYPTO_TWOFISH=m |
438 | CONFIG_CRYPTO_ZLIB=m | 465 | CONFIG_CRYPTO_ZLIB=m |
439 | CONFIG_CRYPTO_LZO=m | 466 | CONFIG_CRYPTO_LZO=m |
467 | CONFIG_CRYPTO_LZ4=m | ||
468 | CONFIG_CRYPTO_LZ4HC=m | ||
440 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | 469 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
441 | CONFIG_CRYPTO_USER_API_HASH=m | 470 | CONFIG_CRYPTO_USER_API_HASH=m |
442 | CONFIG_CRYPTO_USER_API_SKCIPHER=m | 471 | CONFIG_CRYPTO_USER_API_SKCIPHER=m |
diff --git a/arch/m68k/configs/atari_defconfig b/arch/m68k/configs/atari_defconfig index 6d5370c914b2..e880cfbb62d9 100644 --- a/arch/m68k/configs/atari_defconfig +++ b/arch/m68k/configs/atari_defconfig | |||
@@ -49,7 +49,6 @@ CONFIG_IP_PNP_RARP=y | |||
49 | CONFIG_NET_IPIP=m | 49 | CONFIG_NET_IPIP=m |
50 | CONFIG_NET_IPGRE_DEMUX=m | 50 | CONFIG_NET_IPGRE_DEMUX=m |
51 | CONFIG_NET_IPGRE=m | 51 | CONFIG_NET_IPGRE=m |
52 | CONFIG_SYN_COOKIES=y | ||
53 | CONFIG_NET_IPVTI=m | 52 | CONFIG_NET_IPVTI=m |
54 | CONFIG_INET_AH=m | 53 | CONFIG_INET_AH=m |
55 | CONFIG_INET_ESP=m | 54 | CONFIG_INET_ESP=m |
@@ -60,11 +59,11 @@ CONFIG_INET_XFRM_MODE_BEET=m | |||
60 | # CONFIG_INET_LRO is not set | 59 | # CONFIG_INET_LRO is not set |
61 | CONFIG_INET_DIAG=m | 60 | CONFIG_INET_DIAG=m |
62 | CONFIG_INET_UDP_DIAG=m | 61 | CONFIG_INET_UDP_DIAG=m |
63 | CONFIG_IPV6_PRIVACY=y | ||
64 | CONFIG_IPV6_ROUTER_PREF=y | 62 | CONFIG_IPV6_ROUTER_PREF=y |
65 | CONFIG_INET6_AH=m | 63 | CONFIG_INET6_AH=m |
66 | CONFIG_INET6_ESP=m | 64 | CONFIG_INET6_ESP=m |
67 | CONFIG_INET6_IPCOMP=m | 65 | CONFIG_INET6_IPCOMP=m |
66 | CONFIG_IPV6_VTI=m | ||
68 | CONFIG_IPV6_GRE=m | 67 | CONFIG_IPV6_GRE=m |
69 | CONFIG_NETFILTER=y | 68 | CONFIG_NETFILTER=y |
70 | CONFIG_NF_CONNTRACK=m | 69 | CONFIG_NF_CONNTRACK=m |
@@ -82,6 +81,17 @@ CONFIG_NF_CONNTRACK_PPTP=m | |||
82 | CONFIG_NF_CONNTRACK_SANE=m | 81 | CONFIG_NF_CONNTRACK_SANE=m |
83 | CONFIG_NF_CONNTRACK_SIP=m | 82 | CONFIG_NF_CONNTRACK_SIP=m |
84 | CONFIG_NF_CONNTRACK_TFTP=m | 83 | CONFIG_NF_CONNTRACK_TFTP=m |
84 | CONFIG_NF_TABLES=m | ||
85 | CONFIG_NFT_EXTHDR=m | ||
86 | CONFIG_NFT_META=m | ||
87 | CONFIG_NFT_CT=m | ||
88 | CONFIG_NFT_RBTREE=m | ||
89 | CONFIG_NFT_HASH=m | ||
90 | CONFIG_NFT_COUNTER=m | ||
91 | CONFIG_NFT_LOG=m | ||
92 | CONFIG_NFT_LIMIT=m | ||
93 | CONFIG_NFT_NAT=m | ||
94 | CONFIG_NFT_COMPAT=m | ||
85 | CONFIG_NETFILTER_XT_SET=m | 95 | CONFIG_NETFILTER_XT_SET=m |
86 | CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m | 96 | CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m |
87 | CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m | 97 | CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m |
@@ -95,6 +105,7 @@ CONFIG_NETFILTER_XT_TARGET_NFLOG=m | |||
95 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m | 105 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m |
96 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m | 106 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m |
97 | CONFIG_NETFILTER_XT_TARGET_TEE=m | 107 | CONFIG_NETFILTER_XT_TARGET_TEE=m |
108 | CONFIG_NETFILTER_XT_TARGET_TPROXY=m | ||
98 | CONFIG_NETFILTER_XT_TARGET_TRACE=m | 109 | CONFIG_NETFILTER_XT_TARGET_TRACE=m |
99 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m | 110 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m |
100 | CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m | 111 | CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m |
@@ -127,6 +138,7 @@ CONFIG_NETFILTER_XT_MATCH_QUOTA=m | |||
127 | CONFIG_NETFILTER_XT_MATCH_RATEEST=m | 138 | CONFIG_NETFILTER_XT_MATCH_RATEEST=m |
128 | CONFIG_NETFILTER_XT_MATCH_REALM=m | 139 | CONFIG_NETFILTER_XT_MATCH_REALM=m |
129 | CONFIG_NETFILTER_XT_MATCH_RECENT=m | 140 | CONFIG_NETFILTER_XT_MATCH_RECENT=m |
141 | CONFIG_NETFILTER_XT_MATCH_SOCKET=m | ||
130 | CONFIG_NETFILTER_XT_MATCH_STATE=m | 142 | CONFIG_NETFILTER_XT_MATCH_STATE=m |
131 | CONFIG_NETFILTER_XT_MATCH_STATISTIC=m | 143 | CONFIG_NETFILTER_XT_MATCH_STATISTIC=m |
132 | CONFIG_NETFILTER_XT_MATCH_STRING=m | 144 | CONFIG_NETFILTER_XT_MATCH_STRING=m |
@@ -141,11 +153,18 @@ CONFIG_IP_SET_HASH_IP=m | |||
141 | CONFIG_IP_SET_HASH_IPPORT=m | 153 | CONFIG_IP_SET_HASH_IPPORT=m |
142 | CONFIG_IP_SET_HASH_IPPORTIP=m | 154 | CONFIG_IP_SET_HASH_IPPORTIP=m |
143 | CONFIG_IP_SET_HASH_IPPORTNET=m | 155 | CONFIG_IP_SET_HASH_IPPORTNET=m |
156 | CONFIG_IP_SET_HASH_NETPORTNET=m | ||
144 | CONFIG_IP_SET_HASH_NET=m | 157 | CONFIG_IP_SET_HASH_NET=m |
158 | CONFIG_IP_SET_HASH_NETNET=m | ||
145 | CONFIG_IP_SET_HASH_NETPORT=m | 159 | CONFIG_IP_SET_HASH_NETPORT=m |
146 | CONFIG_IP_SET_HASH_NETIFACE=m | 160 | CONFIG_IP_SET_HASH_NETIFACE=m |
147 | CONFIG_IP_SET_LIST_SET=m | 161 | CONFIG_IP_SET_LIST_SET=m |
148 | CONFIG_NF_CONNTRACK_IPV4=m | 162 | CONFIG_NF_CONNTRACK_IPV4=m |
163 | CONFIG_NF_TABLES_IPV4=m | ||
164 | CONFIG_NFT_REJECT_IPV4=m | ||
165 | CONFIG_NFT_CHAIN_ROUTE_IPV4=m | ||
166 | CONFIG_NFT_CHAIN_NAT_IPV4=m | ||
167 | CONFIG_NF_TABLES_ARP=m | ||
149 | CONFIG_IP_NF_IPTABLES=m | 168 | CONFIG_IP_NF_IPTABLES=m |
150 | CONFIG_IP_NF_MATCH_AH=m | 169 | CONFIG_IP_NF_MATCH_AH=m |
151 | CONFIG_IP_NF_MATCH_ECN=m | 170 | CONFIG_IP_NF_MATCH_ECN=m |
@@ -153,6 +172,7 @@ CONFIG_IP_NF_MATCH_RPFILTER=m | |||
153 | CONFIG_IP_NF_MATCH_TTL=m | 172 | CONFIG_IP_NF_MATCH_TTL=m |
154 | CONFIG_IP_NF_FILTER=m | 173 | CONFIG_IP_NF_FILTER=m |
155 | CONFIG_IP_NF_TARGET_REJECT=m | 174 | CONFIG_IP_NF_TARGET_REJECT=m |
175 | CONFIG_IP_NF_TARGET_SYNPROXY=m | ||
156 | CONFIG_IP_NF_TARGET_ULOG=m | 176 | CONFIG_IP_NF_TARGET_ULOG=m |
157 | CONFIG_NF_NAT_IPV4=m | 177 | CONFIG_NF_NAT_IPV4=m |
158 | CONFIG_IP_NF_TARGET_MASQUERADE=m | 178 | CONFIG_IP_NF_TARGET_MASQUERADE=m |
@@ -167,6 +187,9 @@ CONFIG_IP_NF_ARPTABLES=m | |||
167 | CONFIG_IP_NF_ARPFILTER=m | 187 | CONFIG_IP_NF_ARPFILTER=m |
168 | CONFIG_IP_NF_ARP_MANGLE=m | 188 | CONFIG_IP_NF_ARP_MANGLE=m |
169 | CONFIG_NF_CONNTRACK_IPV6=m | 189 | CONFIG_NF_CONNTRACK_IPV6=m |
190 | CONFIG_NF_TABLES_IPV6=m | ||
191 | CONFIG_NFT_CHAIN_ROUTE_IPV6=m | ||
192 | CONFIG_NFT_CHAIN_NAT_IPV6=m | ||
170 | CONFIG_IP6_NF_IPTABLES=m | 193 | CONFIG_IP6_NF_IPTABLES=m |
171 | CONFIG_IP6_NF_MATCH_AH=m | 194 | CONFIG_IP6_NF_MATCH_AH=m |
172 | CONFIG_IP6_NF_MATCH_EUI64=m | 195 | CONFIG_IP6_NF_MATCH_EUI64=m |
@@ -180,11 +203,13 @@ CONFIG_IP6_NF_MATCH_RT=m | |||
180 | CONFIG_IP6_NF_TARGET_HL=m | 203 | CONFIG_IP6_NF_TARGET_HL=m |
181 | CONFIG_IP6_NF_FILTER=m | 204 | CONFIG_IP6_NF_FILTER=m |
182 | CONFIG_IP6_NF_TARGET_REJECT=m | 205 | CONFIG_IP6_NF_TARGET_REJECT=m |
206 | CONFIG_IP6_NF_TARGET_SYNPROXY=m | ||
183 | CONFIG_IP6_NF_MANGLE=m | 207 | CONFIG_IP6_NF_MANGLE=m |
184 | CONFIG_IP6_NF_RAW=m | 208 | CONFIG_IP6_NF_RAW=m |
185 | CONFIG_NF_NAT_IPV6=m | 209 | CONFIG_NF_NAT_IPV6=m |
186 | CONFIG_IP6_NF_TARGET_MASQUERADE=m | 210 | CONFIG_IP6_NF_TARGET_MASQUERADE=m |
187 | CONFIG_IP6_NF_TARGET_NPT=m | 211 | CONFIG_IP6_NF_TARGET_NPT=m |
212 | CONFIG_NF_TABLES_BRIDGE=m | ||
188 | CONFIG_IP_DCCP=m | 213 | CONFIG_IP_DCCP=m |
189 | # CONFIG_IP_DCCP_CCID3 is not set | 214 | # CONFIG_IP_DCCP_CCID3 is not set |
190 | CONFIG_SCTP_COOKIE_HMAC_SHA1=y | 215 | CONFIG_SCTP_COOKIE_HMAC_SHA1=y |
@@ -192,10 +217,13 @@ CONFIG_RDS=m | |||
192 | CONFIG_RDS_TCP=m | 217 | CONFIG_RDS_TCP=m |
193 | CONFIG_L2TP=m | 218 | CONFIG_L2TP=m |
194 | CONFIG_ATALK=m | 219 | CONFIG_ATALK=m |
220 | CONFIG_DNS_RESOLVER=y | ||
195 | CONFIG_BATMAN_ADV=m | 221 | CONFIG_BATMAN_ADV=m |
196 | CONFIG_BATMAN_ADV_DAT=y | 222 | CONFIG_BATMAN_ADV_DAT=y |
223 | CONFIG_BATMAN_ADV_NC=y | ||
224 | CONFIG_NETLINK_DIAG=m | ||
225 | CONFIG_NET_MPLS_GSO=m | ||
197 | # CONFIG_WIRELESS is not set | 226 | # CONFIG_WIRELESS is not set |
198 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
199 | CONFIG_DEVTMPFS=y | 227 | CONFIG_DEVTMPFS=y |
200 | # CONFIG_FIRMWARE_IN_KERNEL is not set | 228 | # CONFIG_FIRMWARE_IN_KERNEL is not set |
201 | # CONFIG_FW_LOADER_USER_HELPER is not set | 229 | # CONFIG_FW_LOADER_USER_HELPER is not set |
@@ -211,6 +239,7 @@ CONFIG_BLK_DEV_NBD=m | |||
211 | CONFIG_BLK_DEV_RAM=y | 239 | CONFIG_BLK_DEV_RAM=y |
212 | CONFIG_CDROM_PKTCDVD=m | 240 | CONFIG_CDROM_PKTCDVD=m |
213 | CONFIG_ATA_OVER_ETH=m | 241 | CONFIG_ATA_OVER_ETH=m |
242 | CONFIG_DUMMY_IRQ=m | ||
214 | CONFIG_IDE=y | 243 | CONFIG_IDE=y |
215 | CONFIG_IDE_GD_ATAPI=y | 244 | CONFIG_IDE_GD_ATAPI=y |
216 | CONFIG_BLK_DEV_IDECD=y | 245 | CONFIG_BLK_DEV_IDECD=y |
@@ -249,10 +278,10 @@ CONFIG_TCM_PSCSI=m | |||
249 | CONFIG_NETDEVICES=y | 278 | CONFIG_NETDEVICES=y |
250 | CONFIG_DUMMY=m | 279 | CONFIG_DUMMY=m |
251 | CONFIG_EQUALIZER=m | 280 | CONFIG_EQUALIZER=m |
252 | CONFIG_MII=y | ||
253 | CONFIG_NET_TEAM=m | 281 | CONFIG_NET_TEAM=m |
254 | CONFIG_NET_TEAM_MODE_BROADCAST=m | 282 | CONFIG_NET_TEAM_MODE_BROADCAST=m |
255 | CONFIG_NET_TEAM_MODE_ROUNDROBIN=m | 283 | CONFIG_NET_TEAM_MODE_ROUNDROBIN=m |
284 | CONFIG_NET_TEAM_MODE_RANDOM=m | ||
256 | CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m | 285 | CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m |
257 | CONFIG_NET_TEAM_MODE_LOADBALANCE=m | 286 | CONFIG_NET_TEAM_MODE_LOADBALANCE=m |
258 | CONFIG_VXLAN=m | 287 | CONFIG_VXLAN=m |
@@ -260,6 +289,7 @@ CONFIG_NETCONSOLE=m | |||
260 | CONFIG_NETCONSOLE_DYNAMIC=y | 289 | CONFIG_NETCONSOLE_DYNAMIC=y |
261 | CONFIG_VETH=m | 290 | CONFIG_VETH=m |
262 | CONFIG_ATARILANCE=y | 291 | CONFIG_ATARILANCE=y |
292 | # CONFIG_NET_VENDOR_ARC is not set | ||
263 | # CONFIG_NET_CADENCE is not set | 293 | # CONFIG_NET_CADENCE is not set |
264 | # CONFIG_NET_VENDOR_BROADCOM is not set | 294 | # CONFIG_NET_VENDOR_BROADCOM is not set |
265 | # CONFIG_NET_VENDOR_INTEL is not set | 295 | # CONFIG_NET_VENDOR_INTEL is not set |
@@ -267,6 +297,7 @@ CONFIG_ATARILANCE=y | |||
267 | # CONFIG_NET_VENDOR_MICREL is not set | 297 | # CONFIG_NET_VENDOR_MICREL is not set |
268 | # CONFIG_NET_VENDOR_SEEQ is not set | 298 | # CONFIG_NET_VENDOR_SEEQ is not set |
269 | # CONFIG_NET_VENDOR_STMICRO is not set | 299 | # CONFIG_NET_VENDOR_STMICRO is not set |
300 | # CONFIG_NET_VENDOR_VIA is not set | ||
270 | # CONFIG_NET_VENDOR_WIZNET is not set | 301 | # CONFIG_NET_VENDOR_WIZNET is not set |
271 | CONFIG_PPP=m | 302 | CONFIG_PPP=m |
272 | CONFIG_PPP_BSDCOMP=m | 303 | CONFIG_PPP_BSDCOMP=m |
@@ -291,7 +322,6 @@ CONFIG_MOUSE_ATARI=m | |||
291 | CONFIG_INPUT_MISC=y | 322 | CONFIG_INPUT_MISC=y |
292 | CONFIG_INPUT_M68K_BEEP=m | 323 | CONFIG_INPUT_M68K_BEEP=m |
293 | # CONFIG_SERIO is not set | 324 | # CONFIG_SERIO is not set |
294 | CONFIG_VT_HW_CONSOLE_BINDING=y | ||
295 | # CONFIG_LEGACY_PTYS is not set | 325 | # CONFIG_LEGACY_PTYS is not set |
296 | # CONFIG_DEVKMEM is not set | 326 | # CONFIG_DEVKMEM is not set |
297 | CONFIG_PRINTER=m | 327 | CONFIG_PRINTER=m |
@@ -320,10 +350,6 @@ CONFIG_NFBLOCK=y | |||
320 | CONFIG_NFCON=y | 350 | CONFIG_NFCON=y |
321 | CONFIG_NFETH=y | 351 | CONFIG_NFETH=y |
322 | CONFIG_ATARI_DSP56K=m | 352 | CONFIG_ATARI_DSP56K=m |
323 | CONFIG_EXT2_FS=y | ||
324 | CONFIG_EXT3_FS=y | ||
325 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set | ||
326 | # CONFIG_EXT3_FS_XATTR is not set | ||
327 | CONFIG_EXT4_FS=y | 353 | CONFIG_EXT4_FS=y |
328 | CONFIG_REISERFS_FS=m | 354 | CONFIG_REISERFS_FS=m |
329 | CONFIG_JFS_FS=m | 355 | CONFIG_JFS_FS=m |
@@ -360,7 +386,7 @@ CONFIG_QNX6FS_FS=m | |||
360 | CONFIG_SYSV_FS=m | 386 | CONFIG_SYSV_FS=m |
361 | CONFIG_UFS_FS=m | 387 | CONFIG_UFS_FS=m |
362 | CONFIG_NFS_FS=y | 388 | CONFIG_NFS_FS=y |
363 | CONFIG_NFS_V4=y | 389 | CONFIG_NFS_V4=m |
364 | CONFIG_NFS_SWAP=y | 390 | CONFIG_NFS_SWAP=y |
365 | CONFIG_ROOT_NFS=y | 391 | CONFIG_ROOT_NFS=y |
366 | CONFIG_NFSD=m | 392 | CONFIG_NFSD=m |
@@ -419,10 +445,10 @@ CONFIG_NLS_MAC_TURKISH=m | |||
419 | CONFIG_DLM=m | 445 | CONFIG_DLM=m |
420 | CONFIG_MAGIC_SYSRQ=y | 446 | CONFIG_MAGIC_SYSRQ=y |
421 | CONFIG_ASYNC_RAID6_TEST=m | 447 | CONFIG_ASYNC_RAID6_TEST=m |
448 | CONFIG_TEST_STRING_HELPERS=m | ||
422 | CONFIG_ENCRYPTED_KEYS=m | 449 | CONFIG_ENCRYPTED_KEYS=m |
423 | CONFIG_CRYPTO_MANAGER=y | 450 | CONFIG_CRYPTO_MANAGER=y |
424 | CONFIG_CRYPTO_USER=m | 451 | CONFIG_CRYPTO_USER=m |
425 | CONFIG_CRYPTO_NULL=m | ||
426 | CONFIG_CRYPTO_CRYPTD=m | 452 | CONFIG_CRYPTO_CRYPTD=m |
427 | CONFIG_CRYPTO_TEST=m | 453 | CONFIG_CRYPTO_TEST=m |
428 | CONFIG_CRYPTO_CCM=m | 454 | CONFIG_CRYPTO_CCM=m |
@@ -455,6 +481,8 @@ CONFIG_CRYPTO_TEA=m | |||
455 | CONFIG_CRYPTO_TWOFISH=m | 481 | CONFIG_CRYPTO_TWOFISH=m |
456 | CONFIG_CRYPTO_ZLIB=m | 482 | CONFIG_CRYPTO_ZLIB=m |
457 | CONFIG_CRYPTO_LZO=m | 483 | CONFIG_CRYPTO_LZO=m |
484 | CONFIG_CRYPTO_LZ4=m | ||
485 | CONFIG_CRYPTO_LZ4HC=m | ||
458 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | 486 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
459 | CONFIG_CRYPTO_USER_API_HASH=m | 487 | CONFIG_CRYPTO_USER_API_HASH=m |
460 | CONFIG_CRYPTO_USER_API_SKCIPHER=m | 488 | CONFIG_CRYPTO_USER_API_SKCIPHER=m |
diff --git a/arch/m68k/configs/bvme6000_defconfig b/arch/m68k/configs/bvme6000_defconfig index c015ddb6fd80..4aa4f45e52a8 100644 --- a/arch/m68k/configs/bvme6000_defconfig +++ b/arch/m68k/configs/bvme6000_defconfig | |||
@@ -48,7 +48,6 @@ CONFIG_IP_PNP_RARP=y | |||
48 | CONFIG_NET_IPIP=m | 48 | CONFIG_NET_IPIP=m |
49 | CONFIG_NET_IPGRE_DEMUX=m | 49 | CONFIG_NET_IPGRE_DEMUX=m |
50 | CONFIG_NET_IPGRE=m | 50 | CONFIG_NET_IPGRE=m |
51 | CONFIG_SYN_COOKIES=y | ||
52 | CONFIG_NET_IPVTI=m | 51 | CONFIG_NET_IPVTI=m |
53 | CONFIG_INET_AH=m | 52 | CONFIG_INET_AH=m |
54 | CONFIG_INET_ESP=m | 53 | CONFIG_INET_ESP=m |
@@ -59,11 +58,11 @@ CONFIG_INET_XFRM_MODE_BEET=m | |||
59 | # CONFIG_INET_LRO is not set | 58 | # CONFIG_INET_LRO is not set |
60 | CONFIG_INET_DIAG=m | 59 | CONFIG_INET_DIAG=m |
61 | CONFIG_INET_UDP_DIAG=m | 60 | CONFIG_INET_UDP_DIAG=m |
62 | CONFIG_IPV6_PRIVACY=y | ||
63 | CONFIG_IPV6_ROUTER_PREF=y | 61 | CONFIG_IPV6_ROUTER_PREF=y |
64 | CONFIG_INET6_AH=m | 62 | CONFIG_INET6_AH=m |
65 | CONFIG_INET6_ESP=m | 63 | CONFIG_INET6_ESP=m |
66 | CONFIG_INET6_IPCOMP=m | 64 | CONFIG_INET6_IPCOMP=m |
65 | CONFIG_IPV6_VTI=m | ||
67 | CONFIG_IPV6_GRE=m | 66 | CONFIG_IPV6_GRE=m |
68 | CONFIG_NETFILTER=y | 67 | CONFIG_NETFILTER=y |
69 | CONFIG_NF_CONNTRACK=m | 68 | CONFIG_NF_CONNTRACK=m |
@@ -81,6 +80,17 @@ CONFIG_NF_CONNTRACK_PPTP=m | |||
81 | CONFIG_NF_CONNTRACK_SANE=m | 80 | CONFIG_NF_CONNTRACK_SANE=m |
82 | CONFIG_NF_CONNTRACK_SIP=m | 81 | CONFIG_NF_CONNTRACK_SIP=m |
83 | CONFIG_NF_CONNTRACK_TFTP=m | 82 | CONFIG_NF_CONNTRACK_TFTP=m |
83 | CONFIG_NF_TABLES=m | ||
84 | CONFIG_NFT_EXTHDR=m | ||
85 | CONFIG_NFT_META=m | ||
86 | CONFIG_NFT_CT=m | ||
87 | CONFIG_NFT_RBTREE=m | ||
88 | CONFIG_NFT_HASH=m | ||
89 | CONFIG_NFT_COUNTER=m | ||
90 | CONFIG_NFT_LOG=m | ||
91 | CONFIG_NFT_LIMIT=m | ||
92 | CONFIG_NFT_NAT=m | ||
93 | CONFIG_NFT_COMPAT=m | ||
84 | CONFIG_NETFILTER_XT_SET=m | 94 | CONFIG_NETFILTER_XT_SET=m |
85 | CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m | 95 | CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m |
86 | CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m | 96 | CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m |
@@ -94,6 +104,7 @@ CONFIG_NETFILTER_XT_TARGET_NFLOG=m | |||
94 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m | 104 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m |
95 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m | 105 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m |
96 | CONFIG_NETFILTER_XT_TARGET_TEE=m | 106 | CONFIG_NETFILTER_XT_TARGET_TEE=m |
107 | CONFIG_NETFILTER_XT_TARGET_TPROXY=m | ||
97 | CONFIG_NETFILTER_XT_TARGET_TRACE=m | 108 | CONFIG_NETFILTER_XT_TARGET_TRACE=m |
98 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m | 109 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m |
99 | CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m | 110 | CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m |
@@ -126,6 +137,7 @@ CONFIG_NETFILTER_XT_MATCH_QUOTA=m | |||
126 | CONFIG_NETFILTER_XT_MATCH_RATEEST=m | 137 | CONFIG_NETFILTER_XT_MATCH_RATEEST=m |
127 | CONFIG_NETFILTER_XT_MATCH_REALM=m | 138 | CONFIG_NETFILTER_XT_MATCH_REALM=m |
128 | CONFIG_NETFILTER_XT_MATCH_RECENT=m | 139 | CONFIG_NETFILTER_XT_MATCH_RECENT=m |
140 | CONFIG_NETFILTER_XT_MATCH_SOCKET=m | ||
129 | CONFIG_NETFILTER_XT_MATCH_STATE=m | 141 | CONFIG_NETFILTER_XT_MATCH_STATE=m |
130 | CONFIG_NETFILTER_XT_MATCH_STATISTIC=m | 142 | CONFIG_NETFILTER_XT_MATCH_STATISTIC=m |
131 | CONFIG_NETFILTER_XT_MATCH_STRING=m | 143 | CONFIG_NETFILTER_XT_MATCH_STRING=m |
@@ -140,11 +152,18 @@ CONFIG_IP_SET_HASH_IP=m | |||
140 | CONFIG_IP_SET_HASH_IPPORT=m | 152 | CONFIG_IP_SET_HASH_IPPORT=m |
141 | CONFIG_IP_SET_HASH_IPPORTIP=m | 153 | CONFIG_IP_SET_HASH_IPPORTIP=m |
142 | CONFIG_IP_SET_HASH_IPPORTNET=m | 154 | CONFIG_IP_SET_HASH_IPPORTNET=m |
155 | CONFIG_IP_SET_HASH_NETPORTNET=m | ||
143 | CONFIG_IP_SET_HASH_NET=m | 156 | CONFIG_IP_SET_HASH_NET=m |
157 | CONFIG_IP_SET_HASH_NETNET=m | ||
144 | CONFIG_IP_SET_HASH_NETPORT=m | 158 | CONFIG_IP_SET_HASH_NETPORT=m |
145 | CONFIG_IP_SET_HASH_NETIFACE=m | 159 | CONFIG_IP_SET_HASH_NETIFACE=m |
146 | CONFIG_IP_SET_LIST_SET=m | 160 | CONFIG_IP_SET_LIST_SET=m |
147 | CONFIG_NF_CONNTRACK_IPV4=m | 161 | CONFIG_NF_CONNTRACK_IPV4=m |
162 | CONFIG_NF_TABLES_IPV4=m | ||
163 | CONFIG_NFT_REJECT_IPV4=m | ||
164 | CONFIG_NFT_CHAIN_ROUTE_IPV4=m | ||
165 | CONFIG_NFT_CHAIN_NAT_IPV4=m | ||
166 | CONFIG_NF_TABLES_ARP=m | ||
148 | CONFIG_IP_NF_IPTABLES=m | 167 | CONFIG_IP_NF_IPTABLES=m |
149 | CONFIG_IP_NF_MATCH_AH=m | 168 | CONFIG_IP_NF_MATCH_AH=m |
150 | CONFIG_IP_NF_MATCH_ECN=m | 169 | CONFIG_IP_NF_MATCH_ECN=m |
@@ -152,6 +171,7 @@ CONFIG_IP_NF_MATCH_RPFILTER=m | |||
152 | CONFIG_IP_NF_MATCH_TTL=m | 171 | CONFIG_IP_NF_MATCH_TTL=m |
153 | CONFIG_IP_NF_FILTER=m | 172 | CONFIG_IP_NF_FILTER=m |
154 | CONFIG_IP_NF_TARGET_REJECT=m | 173 | CONFIG_IP_NF_TARGET_REJECT=m |
174 | CONFIG_IP_NF_TARGET_SYNPROXY=m | ||
155 | CONFIG_IP_NF_TARGET_ULOG=m | 175 | CONFIG_IP_NF_TARGET_ULOG=m |
156 | CONFIG_NF_NAT_IPV4=m | 176 | CONFIG_NF_NAT_IPV4=m |
157 | CONFIG_IP_NF_TARGET_MASQUERADE=m | 177 | CONFIG_IP_NF_TARGET_MASQUERADE=m |
@@ -166,6 +186,9 @@ CONFIG_IP_NF_ARPTABLES=m | |||
166 | CONFIG_IP_NF_ARPFILTER=m | 186 | CONFIG_IP_NF_ARPFILTER=m |
167 | CONFIG_IP_NF_ARP_MANGLE=m | 187 | CONFIG_IP_NF_ARP_MANGLE=m |
168 | CONFIG_NF_CONNTRACK_IPV6=m | 188 | CONFIG_NF_CONNTRACK_IPV6=m |
189 | CONFIG_NF_TABLES_IPV6=m | ||
190 | CONFIG_NFT_CHAIN_ROUTE_IPV6=m | ||
191 | CONFIG_NFT_CHAIN_NAT_IPV6=m | ||
169 | CONFIG_IP6_NF_IPTABLES=m | 192 | CONFIG_IP6_NF_IPTABLES=m |
170 | CONFIG_IP6_NF_MATCH_AH=m | 193 | CONFIG_IP6_NF_MATCH_AH=m |
171 | CONFIG_IP6_NF_MATCH_EUI64=m | 194 | CONFIG_IP6_NF_MATCH_EUI64=m |
@@ -179,11 +202,13 @@ CONFIG_IP6_NF_MATCH_RT=m | |||
179 | CONFIG_IP6_NF_TARGET_HL=m | 202 | CONFIG_IP6_NF_TARGET_HL=m |
180 | CONFIG_IP6_NF_FILTER=m | 203 | CONFIG_IP6_NF_FILTER=m |
181 | CONFIG_IP6_NF_TARGET_REJECT=m | 204 | CONFIG_IP6_NF_TARGET_REJECT=m |
205 | CONFIG_IP6_NF_TARGET_SYNPROXY=m | ||
182 | CONFIG_IP6_NF_MANGLE=m | 206 | CONFIG_IP6_NF_MANGLE=m |
183 | CONFIG_IP6_NF_RAW=m | 207 | CONFIG_IP6_NF_RAW=m |
184 | CONFIG_NF_NAT_IPV6=m | 208 | CONFIG_NF_NAT_IPV6=m |
185 | CONFIG_IP6_NF_TARGET_MASQUERADE=m | 209 | CONFIG_IP6_NF_TARGET_MASQUERADE=m |
186 | CONFIG_IP6_NF_TARGET_NPT=m | 210 | CONFIG_IP6_NF_TARGET_NPT=m |
211 | CONFIG_NF_TABLES_BRIDGE=m | ||
187 | CONFIG_IP_DCCP=m | 212 | CONFIG_IP_DCCP=m |
188 | # CONFIG_IP_DCCP_CCID3 is not set | 213 | # CONFIG_IP_DCCP_CCID3 is not set |
189 | CONFIG_SCTP_COOKIE_HMAC_SHA1=y | 214 | CONFIG_SCTP_COOKIE_HMAC_SHA1=y |
@@ -191,10 +216,13 @@ CONFIG_RDS=m | |||
191 | CONFIG_RDS_TCP=m | 216 | CONFIG_RDS_TCP=m |
192 | CONFIG_L2TP=m | 217 | CONFIG_L2TP=m |
193 | CONFIG_ATALK=m | 218 | CONFIG_ATALK=m |
219 | CONFIG_DNS_RESOLVER=y | ||
194 | CONFIG_BATMAN_ADV=m | 220 | CONFIG_BATMAN_ADV=m |
195 | CONFIG_BATMAN_ADV_DAT=y | 221 | CONFIG_BATMAN_ADV_DAT=y |
222 | CONFIG_BATMAN_ADV_NC=y | ||
223 | CONFIG_NETLINK_DIAG=m | ||
224 | CONFIG_NET_MPLS_GSO=m | ||
196 | # CONFIG_WIRELESS is not set | 225 | # CONFIG_WIRELESS is not set |
197 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
198 | CONFIG_DEVTMPFS=y | 226 | CONFIG_DEVTMPFS=y |
199 | # CONFIG_FIRMWARE_IN_KERNEL is not set | 227 | # CONFIG_FIRMWARE_IN_KERNEL is not set |
200 | # CONFIG_FW_LOADER_USER_HELPER is not set | 228 | # CONFIG_FW_LOADER_USER_HELPER is not set |
@@ -206,6 +234,7 @@ CONFIG_BLK_DEV_NBD=m | |||
206 | CONFIG_BLK_DEV_RAM=y | 234 | CONFIG_BLK_DEV_RAM=y |
207 | CONFIG_CDROM_PKTCDVD=m | 235 | CONFIG_CDROM_PKTCDVD=m |
208 | CONFIG_ATA_OVER_ETH=m | 236 | CONFIG_ATA_OVER_ETH=m |
237 | CONFIG_DUMMY_IRQ=m | ||
209 | CONFIG_RAID_ATTRS=m | 238 | CONFIG_RAID_ATTRS=m |
210 | CONFIG_SCSI=y | 239 | CONFIG_SCSI=y |
211 | CONFIG_SCSI_TGT=m | 240 | CONFIG_SCSI_TGT=m |
@@ -243,12 +272,14 @@ CONFIG_EQUALIZER=m | |||
243 | CONFIG_NET_TEAM=m | 272 | CONFIG_NET_TEAM=m |
244 | CONFIG_NET_TEAM_MODE_BROADCAST=m | 273 | CONFIG_NET_TEAM_MODE_BROADCAST=m |
245 | CONFIG_NET_TEAM_MODE_ROUNDROBIN=m | 274 | CONFIG_NET_TEAM_MODE_ROUNDROBIN=m |
275 | CONFIG_NET_TEAM_MODE_RANDOM=m | ||
246 | CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m | 276 | CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m |
247 | CONFIG_NET_TEAM_MODE_LOADBALANCE=m | 277 | CONFIG_NET_TEAM_MODE_LOADBALANCE=m |
248 | CONFIG_VXLAN=m | 278 | CONFIG_VXLAN=m |
249 | CONFIG_NETCONSOLE=m | 279 | CONFIG_NETCONSOLE=m |
250 | CONFIG_NETCONSOLE_DYNAMIC=y | 280 | CONFIG_NETCONSOLE_DYNAMIC=y |
251 | CONFIG_VETH=m | 281 | CONFIG_VETH=m |
282 | # CONFIG_NET_VENDOR_ARC is not set | ||
252 | # CONFIG_NET_CADENCE is not set | 283 | # CONFIG_NET_CADENCE is not set |
253 | # CONFIG_NET_VENDOR_BROADCOM is not set | 284 | # CONFIG_NET_VENDOR_BROADCOM is not set |
254 | CONFIG_BVME6000_NET=y | 285 | CONFIG_BVME6000_NET=y |
@@ -257,6 +288,7 @@ CONFIG_BVME6000_NET=y | |||
257 | # CONFIG_NET_VENDOR_NATSEMI is not set | 288 | # CONFIG_NET_VENDOR_NATSEMI is not set |
258 | # CONFIG_NET_VENDOR_SEEQ is not set | 289 | # CONFIG_NET_VENDOR_SEEQ is not set |
259 | # CONFIG_NET_VENDOR_STMICRO is not set | 290 | # CONFIG_NET_VENDOR_STMICRO is not set |
291 | # CONFIG_NET_VENDOR_VIA is not set | ||
260 | # CONFIG_NET_VENDOR_WIZNET is not set | 292 | # CONFIG_NET_VENDOR_WIZNET is not set |
261 | CONFIG_PPP=m | 293 | CONFIG_PPP=m |
262 | CONFIG_PPP_BSDCOMP=m | 294 | CONFIG_PPP_BSDCOMP=m |
@@ -294,10 +326,6 @@ CONFIG_RTC_CLASS=y | |||
294 | CONFIG_RTC_DRV_GENERIC=m | 326 | CONFIG_RTC_DRV_GENERIC=m |
295 | # CONFIG_IOMMU_SUPPORT is not set | 327 | # CONFIG_IOMMU_SUPPORT is not set |
296 | CONFIG_PROC_HARDWARE=y | 328 | CONFIG_PROC_HARDWARE=y |
297 | CONFIG_EXT2_FS=y | ||
298 | CONFIG_EXT3_FS=y | ||
299 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set | ||
300 | # CONFIG_EXT3_FS_XATTR is not set | ||
301 | CONFIG_EXT4_FS=y | 329 | CONFIG_EXT4_FS=y |
302 | CONFIG_REISERFS_FS=m | 330 | CONFIG_REISERFS_FS=m |
303 | CONFIG_JFS_FS=m | 331 | CONFIG_JFS_FS=m |
@@ -334,7 +362,7 @@ CONFIG_QNX6FS_FS=m | |||
334 | CONFIG_SYSV_FS=m | 362 | CONFIG_SYSV_FS=m |
335 | CONFIG_UFS_FS=m | 363 | CONFIG_UFS_FS=m |
336 | CONFIG_NFS_FS=y | 364 | CONFIG_NFS_FS=y |
337 | CONFIG_NFS_V4=y | 365 | CONFIG_NFS_V4=m |
338 | CONFIG_NFS_SWAP=y | 366 | CONFIG_NFS_SWAP=y |
339 | CONFIG_ROOT_NFS=y | 367 | CONFIG_ROOT_NFS=y |
340 | CONFIG_NFSD=m | 368 | CONFIG_NFSD=m |
@@ -393,10 +421,10 @@ CONFIG_NLS_MAC_TURKISH=m | |||
393 | CONFIG_DLM=m | 421 | CONFIG_DLM=m |
394 | CONFIG_MAGIC_SYSRQ=y | 422 | CONFIG_MAGIC_SYSRQ=y |
395 | CONFIG_ASYNC_RAID6_TEST=m | 423 | CONFIG_ASYNC_RAID6_TEST=m |
424 | CONFIG_TEST_STRING_HELPERS=m | ||
396 | CONFIG_ENCRYPTED_KEYS=m | 425 | CONFIG_ENCRYPTED_KEYS=m |
397 | CONFIG_CRYPTO_MANAGER=y | 426 | CONFIG_CRYPTO_MANAGER=y |
398 | CONFIG_CRYPTO_USER=m | 427 | CONFIG_CRYPTO_USER=m |
399 | CONFIG_CRYPTO_NULL=m | ||
400 | CONFIG_CRYPTO_CRYPTD=m | 428 | CONFIG_CRYPTO_CRYPTD=m |
401 | CONFIG_CRYPTO_TEST=m | 429 | CONFIG_CRYPTO_TEST=m |
402 | CONFIG_CRYPTO_CCM=m | 430 | CONFIG_CRYPTO_CCM=m |
@@ -429,6 +457,8 @@ CONFIG_CRYPTO_TEA=m | |||
429 | CONFIG_CRYPTO_TWOFISH=m | 457 | CONFIG_CRYPTO_TWOFISH=m |
430 | CONFIG_CRYPTO_ZLIB=m | 458 | CONFIG_CRYPTO_ZLIB=m |
431 | CONFIG_CRYPTO_LZO=m | 459 | CONFIG_CRYPTO_LZO=m |
460 | CONFIG_CRYPTO_LZ4=m | ||
461 | CONFIG_CRYPTO_LZ4HC=m | ||
432 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | 462 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
433 | CONFIG_CRYPTO_USER_API_HASH=m | 463 | CONFIG_CRYPTO_USER_API_HASH=m |
434 | CONFIG_CRYPTO_USER_API_SKCIPHER=m | 464 | CONFIG_CRYPTO_USER_API_SKCIPHER=m |
diff --git a/arch/m68k/configs/hp300_defconfig b/arch/m68k/configs/hp300_defconfig index ec7382d8afff..7cd9d9f456fb 100644 --- a/arch/m68k/configs/hp300_defconfig +++ b/arch/m68k/configs/hp300_defconfig | |||
@@ -50,7 +50,6 @@ CONFIG_IP_PNP_RARP=y | |||
50 | CONFIG_NET_IPIP=m | 50 | CONFIG_NET_IPIP=m |
51 | CONFIG_NET_IPGRE_DEMUX=m | 51 | CONFIG_NET_IPGRE_DEMUX=m |
52 | CONFIG_NET_IPGRE=m | 52 | CONFIG_NET_IPGRE=m |
53 | CONFIG_SYN_COOKIES=y | ||
54 | CONFIG_NET_IPVTI=m | 53 | CONFIG_NET_IPVTI=m |
55 | CONFIG_INET_AH=m | 54 | CONFIG_INET_AH=m |
56 | CONFIG_INET_ESP=m | 55 | CONFIG_INET_ESP=m |
@@ -61,11 +60,11 @@ CONFIG_INET_XFRM_MODE_BEET=m | |||
61 | # CONFIG_INET_LRO is not set | 60 | # CONFIG_INET_LRO is not set |
62 | CONFIG_INET_DIAG=m | 61 | CONFIG_INET_DIAG=m |
63 | CONFIG_INET_UDP_DIAG=m | 62 | CONFIG_INET_UDP_DIAG=m |
64 | CONFIG_IPV6_PRIVACY=y | ||
65 | CONFIG_IPV6_ROUTER_PREF=y | 63 | CONFIG_IPV6_ROUTER_PREF=y |
66 | CONFIG_INET6_AH=m | 64 | CONFIG_INET6_AH=m |
67 | CONFIG_INET6_ESP=m | 65 | CONFIG_INET6_ESP=m |
68 | CONFIG_INET6_IPCOMP=m | 66 | CONFIG_INET6_IPCOMP=m |
67 | CONFIG_IPV6_VTI=m | ||
69 | CONFIG_IPV6_GRE=m | 68 | CONFIG_IPV6_GRE=m |
70 | CONFIG_NETFILTER=y | 69 | CONFIG_NETFILTER=y |
71 | CONFIG_NF_CONNTRACK=m | 70 | CONFIG_NF_CONNTRACK=m |
@@ -83,6 +82,17 @@ CONFIG_NF_CONNTRACK_PPTP=m | |||
83 | CONFIG_NF_CONNTRACK_SANE=m | 82 | CONFIG_NF_CONNTRACK_SANE=m |
84 | CONFIG_NF_CONNTRACK_SIP=m | 83 | CONFIG_NF_CONNTRACK_SIP=m |
85 | CONFIG_NF_CONNTRACK_TFTP=m | 84 | CONFIG_NF_CONNTRACK_TFTP=m |
85 | CONFIG_NF_TABLES=m | ||
86 | CONFIG_NFT_EXTHDR=m | ||
87 | CONFIG_NFT_META=m | ||
88 | CONFIG_NFT_CT=m | ||
89 | CONFIG_NFT_RBTREE=m | ||
90 | CONFIG_NFT_HASH=m | ||
91 | CONFIG_NFT_COUNTER=m | ||
92 | CONFIG_NFT_LOG=m | ||
93 | CONFIG_NFT_LIMIT=m | ||
94 | CONFIG_NFT_NAT=m | ||
95 | CONFIG_NFT_COMPAT=m | ||
86 | CONFIG_NETFILTER_XT_SET=m | 96 | CONFIG_NETFILTER_XT_SET=m |
87 | CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m | 97 | CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m |
88 | CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m | 98 | CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m |
@@ -96,6 +106,7 @@ CONFIG_NETFILTER_XT_TARGET_NFLOG=m | |||
96 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m | 106 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m |
97 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m | 107 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m |
98 | CONFIG_NETFILTER_XT_TARGET_TEE=m | 108 | CONFIG_NETFILTER_XT_TARGET_TEE=m |
109 | CONFIG_NETFILTER_XT_TARGET_TPROXY=m | ||
99 | CONFIG_NETFILTER_XT_TARGET_TRACE=m | 110 | CONFIG_NETFILTER_XT_TARGET_TRACE=m |
100 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m | 111 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m |
101 | CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m | 112 | CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m |
@@ -128,6 +139,7 @@ CONFIG_NETFILTER_XT_MATCH_QUOTA=m | |||
128 | CONFIG_NETFILTER_XT_MATCH_RATEEST=m | 139 | CONFIG_NETFILTER_XT_MATCH_RATEEST=m |
129 | CONFIG_NETFILTER_XT_MATCH_REALM=m | 140 | CONFIG_NETFILTER_XT_MATCH_REALM=m |
130 | CONFIG_NETFILTER_XT_MATCH_RECENT=m | 141 | CONFIG_NETFILTER_XT_MATCH_RECENT=m |
142 | CONFIG_NETFILTER_XT_MATCH_SOCKET=m | ||
131 | CONFIG_NETFILTER_XT_MATCH_STATE=m | 143 | CONFIG_NETFILTER_XT_MATCH_STATE=m |
132 | CONFIG_NETFILTER_XT_MATCH_STATISTIC=m | 144 | CONFIG_NETFILTER_XT_MATCH_STATISTIC=m |
133 | CONFIG_NETFILTER_XT_MATCH_STRING=m | 145 | CONFIG_NETFILTER_XT_MATCH_STRING=m |
@@ -142,11 +154,18 @@ CONFIG_IP_SET_HASH_IP=m | |||
142 | CONFIG_IP_SET_HASH_IPPORT=m | 154 | CONFIG_IP_SET_HASH_IPPORT=m |
143 | CONFIG_IP_SET_HASH_IPPORTIP=m | 155 | CONFIG_IP_SET_HASH_IPPORTIP=m |
144 | CONFIG_IP_SET_HASH_IPPORTNET=m | 156 | CONFIG_IP_SET_HASH_IPPORTNET=m |
157 | CONFIG_IP_SET_HASH_NETPORTNET=m | ||
145 | CONFIG_IP_SET_HASH_NET=m | 158 | CONFIG_IP_SET_HASH_NET=m |
159 | CONFIG_IP_SET_HASH_NETNET=m | ||
146 | CONFIG_IP_SET_HASH_NETPORT=m | 160 | CONFIG_IP_SET_HASH_NETPORT=m |
147 | CONFIG_IP_SET_HASH_NETIFACE=m | 161 | CONFIG_IP_SET_HASH_NETIFACE=m |
148 | CONFIG_IP_SET_LIST_SET=m | 162 | CONFIG_IP_SET_LIST_SET=m |
149 | CONFIG_NF_CONNTRACK_IPV4=m | 163 | CONFIG_NF_CONNTRACK_IPV4=m |
164 | CONFIG_NF_TABLES_IPV4=m | ||
165 | CONFIG_NFT_REJECT_IPV4=m | ||
166 | CONFIG_NFT_CHAIN_ROUTE_IPV4=m | ||
167 | CONFIG_NFT_CHAIN_NAT_IPV4=m | ||
168 | CONFIG_NF_TABLES_ARP=m | ||
150 | CONFIG_IP_NF_IPTABLES=m | 169 | CONFIG_IP_NF_IPTABLES=m |
151 | CONFIG_IP_NF_MATCH_AH=m | 170 | CONFIG_IP_NF_MATCH_AH=m |
152 | CONFIG_IP_NF_MATCH_ECN=m | 171 | CONFIG_IP_NF_MATCH_ECN=m |
@@ -154,6 +173,7 @@ CONFIG_IP_NF_MATCH_RPFILTER=m | |||
154 | CONFIG_IP_NF_MATCH_TTL=m | 173 | CONFIG_IP_NF_MATCH_TTL=m |
155 | CONFIG_IP_NF_FILTER=m | 174 | CONFIG_IP_NF_FILTER=m |
156 | CONFIG_IP_NF_TARGET_REJECT=m | 175 | CONFIG_IP_NF_TARGET_REJECT=m |
176 | CONFIG_IP_NF_TARGET_SYNPROXY=m | ||
157 | CONFIG_IP_NF_TARGET_ULOG=m | 177 | CONFIG_IP_NF_TARGET_ULOG=m |
158 | CONFIG_NF_NAT_IPV4=m | 178 | CONFIG_NF_NAT_IPV4=m |
159 | CONFIG_IP_NF_TARGET_MASQUERADE=m | 179 | CONFIG_IP_NF_TARGET_MASQUERADE=m |
@@ -168,6 +188,9 @@ CONFIG_IP_NF_ARPTABLES=m | |||
168 | CONFIG_IP_NF_ARPFILTER=m | 188 | CONFIG_IP_NF_ARPFILTER=m |
169 | CONFIG_IP_NF_ARP_MANGLE=m | 189 | CONFIG_IP_NF_ARP_MANGLE=m |
170 | CONFIG_NF_CONNTRACK_IPV6=m | 190 | CONFIG_NF_CONNTRACK_IPV6=m |
191 | CONFIG_NF_TABLES_IPV6=m | ||
192 | CONFIG_NFT_CHAIN_ROUTE_IPV6=m | ||
193 | CONFIG_NFT_CHAIN_NAT_IPV6=m | ||
171 | CONFIG_IP6_NF_IPTABLES=m | 194 | CONFIG_IP6_NF_IPTABLES=m |
172 | CONFIG_IP6_NF_MATCH_AH=m | 195 | CONFIG_IP6_NF_MATCH_AH=m |
173 | CONFIG_IP6_NF_MATCH_EUI64=m | 196 | CONFIG_IP6_NF_MATCH_EUI64=m |
@@ -181,11 +204,13 @@ CONFIG_IP6_NF_MATCH_RT=m | |||
181 | CONFIG_IP6_NF_TARGET_HL=m | 204 | CONFIG_IP6_NF_TARGET_HL=m |
182 | CONFIG_IP6_NF_FILTER=m | 205 | CONFIG_IP6_NF_FILTER=m |
183 | CONFIG_IP6_NF_TARGET_REJECT=m | 206 | CONFIG_IP6_NF_TARGET_REJECT=m |
207 | CONFIG_IP6_NF_TARGET_SYNPROXY=m | ||
184 | CONFIG_IP6_NF_MANGLE=m | 208 | CONFIG_IP6_NF_MANGLE=m |
185 | CONFIG_IP6_NF_RAW=m | 209 | CONFIG_IP6_NF_RAW=m |
186 | CONFIG_NF_NAT_IPV6=m | 210 | CONFIG_NF_NAT_IPV6=m |
187 | CONFIG_IP6_NF_TARGET_MASQUERADE=m | 211 | CONFIG_IP6_NF_TARGET_MASQUERADE=m |
188 | CONFIG_IP6_NF_TARGET_NPT=m | 212 | CONFIG_IP6_NF_TARGET_NPT=m |
213 | CONFIG_NF_TABLES_BRIDGE=m | ||
189 | CONFIG_IP_DCCP=m | 214 | CONFIG_IP_DCCP=m |
190 | # CONFIG_IP_DCCP_CCID3 is not set | 215 | # CONFIG_IP_DCCP_CCID3 is not set |
191 | CONFIG_SCTP_COOKIE_HMAC_SHA1=y | 216 | CONFIG_SCTP_COOKIE_HMAC_SHA1=y |
@@ -193,10 +218,13 @@ CONFIG_RDS=m | |||
193 | CONFIG_RDS_TCP=m | 218 | CONFIG_RDS_TCP=m |
194 | CONFIG_L2TP=m | 219 | CONFIG_L2TP=m |
195 | CONFIG_ATALK=m | 220 | CONFIG_ATALK=m |
221 | CONFIG_DNS_RESOLVER=y | ||
196 | CONFIG_BATMAN_ADV=m | 222 | CONFIG_BATMAN_ADV=m |
197 | CONFIG_BATMAN_ADV_DAT=y | 223 | CONFIG_BATMAN_ADV_DAT=y |
224 | CONFIG_BATMAN_ADV_NC=y | ||
225 | CONFIG_NETLINK_DIAG=m | ||
226 | CONFIG_NET_MPLS_GSO=m | ||
198 | # CONFIG_WIRELESS is not set | 227 | # CONFIG_WIRELESS is not set |
199 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
200 | CONFIG_DEVTMPFS=y | 228 | CONFIG_DEVTMPFS=y |
201 | # CONFIG_FIRMWARE_IN_KERNEL is not set | 229 | # CONFIG_FIRMWARE_IN_KERNEL is not set |
202 | # CONFIG_FW_LOADER_USER_HELPER is not set | 230 | # CONFIG_FW_LOADER_USER_HELPER is not set |
@@ -208,6 +236,7 @@ CONFIG_BLK_DEV_NBD=m | |||
208 | CONFIG_BLK_DEV_RAM=y | 236 | CONFIG_BLK_DEV_RAM=y |
209 | CONFIG_CDROM_PKTCDVD=m | 237 | CONFIG_CDROM_PKTCDVD=m |
210 | CONFIG_ATA_OVER_ETH=m | 238 | CONFIG_ATA_OVER_ETH=m |
239 | CONFIG_DUMMY_IRQ=m | ||
211 | CONFIG_RAID_ATTRS=m | 240 | CONFIG_RAID_ATTRS=m |
212 | CONFIG_SCSI=y | 241 | CONFIG_SCSI=y |
213 | CONFIG_SCSI_TGT=m | 242 | CONFIG_SCSI_TGT=m |
@@ -244,6 +273,7 @@ CONFIG_EQUALIZER=m | |||
244 | CONFIG_NET_TEAM=m | 273 | CONFIG_NET_TEAM=m |
245 | CONFIG_NET_TEAM_MODE_BROADCAST=m | 274 | CONFIG_NET_TEAM_MODE_BROADCAST=m |
246 | CONFIG_NET_TEAM_MODE_ROUNDROBIN=m | 275 | CONFIG_NET_TEAM_MODE_ROUNDROBIN=m |
276 | CONFIG_NET_TEAM_MODE_RANDOM=m | ||
247 | CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m | 277 | CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m |
248 | CONFIG_NET_TEAM_MODE_LOADBALANCE=m | 278 | CONFIG_NET_TEAM_MODE_LOADBALANCE=m |
249 | CONFIG_VXLAN=m | 279 | CONFIG_VXLAN=m |
@@ -251,6 +281,7 @@ CONFIG_NETCONSOLE=m | |||
251 | CONFIG_NETCONSOLE_DYNAMIC=y | 281 | CONFIG_NETCONSOLE_DYNAMIC=y |
252 | CONFIG_VETH=m | 282 | CONFIG_VETH=m |
253 | CONFIG_HPLANCE=y | 283 | CONFIG_HPLANCE=y |
284 | # CONFIG_NET_VENDOR_ARC is not set | ||
254 | # CONFIG_NET_CADENCE is not set | 285 | # CONFIG_NET_CADENCE is not set |
255 | # CONFIG_NET_VENDOR_BROADCOM is not set | 286 | # CONFIG_NET_VENDOR_BROADCOM is not set |
256 | # CONFIG_NET_VENDOR_INTEL is not set | 287 | # CONFIG_NET_VENDOR_INTEL is not set |
@@ -259,6 +290,7 @@ CONFIG_HPLANCE=y | |||
259 | # CONFIG_NET_VENDOR_NATSEMI is not set | 290 | # CONFIG_NET_VENDOR_NATSEMI is not set |
260 | # CONFIG_NET_VENDOR_SEEQ is not set | 291 | # CONFIG_NET_VENDOR_SEEQ is not set |
261 | # CONFIG_NET_VENDOR_STMICRO is not set | 292 | # CONFIG_NET_VENDOR_STMICRO is not set |
293 | # CONFIG_NET_VENDOR_VIA is not set | ||
262 | # CONFIG_NET_VENDOR_WIZNET is not set | 294 | # CONFIG_NET_VENDOR_WIZNET is not set |
263 | CONFIG_PPP=m | 295 | CONFIG_PPP=m |
264 | CONFIG_PPP_BSDCOMP=m | 296 | CONFIG_PPP_BSDCOMP=m |
@@ -282,7 +314,6 @@ CONFIG_MOUSE_SERIAL=m | |||
282 | CONFIG_INPUT_MISC=y | 314 | CONFIG_INPUT_MISC=y |
283 | CONFIG_HP_SDC_RTC=m | 315 | CONFIG_HP_SDC_RTC=m |
284 | CONFIG_SERIO_SERPORT=m | 316 | CONFIG_SERIO_SERPORT=m |
285 | CONFIG_VT_HW_CONSOLE_BINDING=y | ||
286 | # CONFIG_LEGACY_PTYS is not set | 317 | # CONFIG_LEGACY_PTYS is not set |
287 | # CONFIG_DEVKMEM is not set | 318 | # CONFIG_DEVKMEM is not set |
288 | # CONFIG_HW_RANDOM is not set | 319 | # CONFIG_HW_RANDOM is not set |
@@ -304,10 +335,6 @@ CONFIG_RTC_CLASS=y | |||
304 | CONFIG_RTC_DRV_GENERIC=m | 335 | CONFIG_RTC_DRV_GENERIC=m |
305 | # CONFIG_IOMMU_SUPPORT is not set | 336 | # CONFIG_IOMMU_SUPPORT is not set |
306 | CONFIG_PROC_HARDWARE=y | 337 | CONFIG_PROC_HARDWARE=y |
307 | CONFIG_EXT2_FS=y | ||
308 | CONFIG_EXT3_FS=y | ||
309 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set | ||
310 | # CONFIG_EXT3_FS_XATTR is not set | ||
311 | CONFIG_EXT4_FS=y | 338 | CONFIG_EXT4_FS=y |
312 | CONFIG_REISERFS_FS=m | 339 | CONFIG_REISERFS_FS=m |
313 | CONFIG_JFS_FS=m | 340 | CONFIG_JFS_FS=m |
@@ -344,7 +371,7 @@ CONFIG_QNX6FS_FS=m | |||
344 | CONFIG_SYSV_FS=m | 371 | CONFIG_SYSV_FS=m |
345 | CONFIG_UFS_FS=m | 372 | CONFIG_UFS_FS=m |
346 | CONFIG_NFS_FS=y | 373 | CONFIG_NFS_FS=y |
347 | CONFIG_NFS_V4=y | 374 | CONFIG_NFS_V4=m |
348 | CONFIG_NFS_SWAP=y | 375 | CONFIG_NFS_SWAP=y |
349 | CONFIG_ROOT_NFS=y | 376 | CONFIG_ROOT_NFS=y |
350 | CONFIG_NFSD=m | 377 | CONFIG_NFSD=m |
@@ -403,10 +430,10 @@ CONFIG_NLS_MAC_TURKISH=m | |||
403 | CONFIG_DLM=m | 430 | CONFIG_DLM=m |
404 | CONFIG_MAGIC_SYSRQ=y | 431 | CONFIG_MAGIC_SYSRQ=y |
405 | CONFIG_ASYNC_RAID6_TEST=m | 432 | CONFIG_ASYNC_RAID6_TEST=m |
433 | CONFIG_TEST_STRING_HELPERS=m | ||
406 | CONFIG_ENCRYPTED_KEYS=m | 434 | CONFIG_ENCRYPTED_KEYS=m |
407 | CONFIG_CRYPTO_MANAGER=y | 435 | CONFIG_CRYPTO_MANAGER=y |
408 | CONFIG_CRYPTO_USER=m | 436 | CONFIG_CRYPTO_USER=m |
409 | CONFIG_CRYPTO_NULL=m | ||
410 | CONFIG_CRYPTO_CRYPTD=m | 437 | CONFIG_CRYPTO_CRYPTD=m |
411 | CONFIG_CRYPTO_TEST=m | 438 | CONFIG_CRYPTO_TEST=m |
412 | CONFIG_CRYPTO_CCM=m | 439 | CONFIG_CRYPTO_CCM=m |
@@ -439,6 +466,8 @@ CONFIG_CRYPTO_TEA=m | |||
439 | CONFIG_CRYPTO_TWOFISH=m | 466 | CONFIG_CRYPTO_TWOFISH=m |
440 | CONFIG_CRYPTO_ZLIB=m | 467 | CONFIG_CRYPTO_ZLIB=m |
441 | CONFIG_CRYPTO_LZO=m | 468 | CONFIG_CRYPTO_LZO=m |
469 | CONFIG_CRYPTO_LZ4=m | ||
470 | CONFIG_CRYPTO_LZ4HC=m | ||
442 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | 471 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
443 | CONFIG_CRYPTO_USER_API_HASH=m | 472 | CONFIG_CRYPTO_USER_API_HASH=m |
444 | CONFIG_CRYPTO_USER_API_SKCIPHER=m | 473 | CONFIG_CRYPTO_USER_API_SKCIPHER=m |
diff --git a/arch/m68k/configs/mac_defconfig b/arch/m68k/configs/mac_defconfig index 7d46fbec7042..31f5bd061d14 100644 --- a/arch/m68k/configs/mac_defconfig +++ b/arch/m68k/configs/mac_defconfig | |||
@@ -49,7 +49,6 @@ CONFIG_IP_PNP_RARP=y | |||
49 | CONFIG_NET_IPIP=m | 49 | CONFIG_NET_IPIP=m |
50 | CONFIG_NET_IPGRE_DEMUX=m | 50 | CONFIG_NET_IPGRE_DEMUX=m |
51 | CONFIG_NET_IPGRE=m | 51 | CONFIG_NET_IPGRE=m |
52 | CONFIG_SYN_COOKIES=y | ||
53 | CONFIG_NET_IPVTI=m | 52 | CONFIG_NET_IPVTI=m |
54 | CONFIG_INET_AH=m | 53 | CONFIG_INET_AH=m |
55 | CONFIG_INET_ESP=m | 54 | CONFIG_INET_ESP=m |
@@ -60,11 +59,11 @@ CONFIG_INET_XFRM_MODE_BEET=m | |||
60 | # CONFIG_INET_LRO is not set | 59 | # CONFIG_INET_LRO is not set |
61 | CONFIG_INET_DIAG=m | 60 | CONFIG_INET_DIAG=m |
62 | CONFIG_INET_UDP_DIAG=m | 61 | CONFIG_INET_UDP_DIAG=m |
63 | CONFIG_IPV6_PRIVACY=y | ||
64 | CONFIG_IPV6_ROUTER_PREF=y | 62 | CONFIG_IPV6_ROUTER_PREF=y |
65 | CONFIG_INET6_AH=m | 63 | CONFIG_INET6_AH=m |
66 | CONFIG_INET6_ESP=m | 64 | CONFIG_INET6_ESP=m |
67 | CONFIG_INET6_IPCOMP=m | 65 | CONFIG_INET6_IPCOMP=m |
66 | CONFIG_IPV6_VTI=m | ||
68 | CONFIG_IPV6_GRE=m | 67 | CONFIG_IPV6_GRE=m |
69 | CONFIG_NETFILTER=y | 68 | CONFIG_NETFILTER=y |
70 | CONFIG_NF_CONNTRACK=m | 69 | CONFIG_NF_CONNTRACK=m |
@@ -82,6 +81,17 @@ CONFIG_NF_CONNTRACK_PPTP=m | |||
82 | CONFIG_NF_CONNTRACK_SANE=m | 81 | CONFIG_NF_CONNTRACK_SANE=m |
83 | CONFIG_NF_CONNTRACK_SIP=m | 82 | CONFIG_NF_CONNTRACK_SIP=m |
84 | CONFIG_NF_CONNTRACK_TFTP=m | 83 | CONFIG_NF_CONNTRACK_TFTP=m |
84 | CONFIG_NF_TABLES=m | ||
85 | CONFIG_NFT_EXTHDR=m | ||
86 | CONFIG_NFT_META=m | ||
87 | CONFIG_NFT_CT=m | ||
88 | CONFIG_NFT_RBTREE=m | ||
89 | CONFIG_NFT_HASH=m | ||
90 | CONFIG_NFT_COUNTER=m | ||
91 | CONFIG_NFT_LOG=m | ||
92 | CONFIG_NFT_LIMIT=m | ||
93 | CONFIG_NFT_NAT=m | ||
94 | CONFIG_NFT_COMPAT=m | ||
85 | CONFIG_NETFILTER_XT_SET=m | 95 | CONFIG_NETFILTER_XT_SET=m |
86 | CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m | 96 | CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m |
87 | CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m | 97 | CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m |
@@ -95,6 +105,7 @@ CONFIG_NETFILTER_XT_TARGET_NFLOG=m | |||
95 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m | 105 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m |
96 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m | 106 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m |
97 | CONFIG_NETFILTER_XT_TARGET_TEE=m | 107 | CONFIG_NETFILTER_XT_TARGET_TEE=m |
108 | CONFIG_NETFILTER_XT_TARGET_TPROXY=m | ||
98 | CONFIG_NETFILTER_XT_TARGET_TRACE=m | 109 | CONFIG_NETFILTER_XT_TARGET_TRACE=m |
99 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m | 110 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m |
100 | CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m | 111 | CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m |
@@ -127,6 +138,7 @@ CONFIG_NETFILTER_XT_MATCH_QUOTA=m | |||
127 | CONFIG_NETFILTER_XT_MATCH_RATEEST=m | 138 | CONFIG_NETFILTER_XT_MATCH_RATEEST=m |
128 | CONFIG_NETFILTER_XT_MATCH_REALM=m | 139 | CONFIG_NETFILTER_XT_MATCH_REALM=m |
129 | CONFIG_NETFILTER_XT_MATCH_RECENT=m | 140 | CONFIG_NETFILTER_XT_MATCH_RECENT=m |
141 | CONFIG_NETFILTER_XT_MATCH_SOCKET=m | ||
130 | CONFIG_NETFILTER_XT_MATCH_STATE=m | 142 | CONFIG_NETFILTER_XT_MATCH_STATE=m |
131 | CONFIG_NETFILTER_XT_MATCH_STATISTIC=m | 143 | CONFIG_NETFILTER_XT_MATCH_STATISTIC=m |
132 | CONFIG_NETFILTER_XT_MATCH_STRING=m | 144 | CONFIG_NETFILTER_XT_MATCH_STRING=m |
@@ -141,11 +153,18 @@ CONFIG_IP_SET_HASH_IP=m | |||
141 | CONFIG_IP_SET_HASH_IPPORT=m | 153 | CONFIG_IP_SET_HASH_IPPORT=m |
142 | CONFIG_IP_SET_HASH_IPPORTIP=m | 154 | CONFIG_IP_SET_HASH_IPPORTIP=m |
143 | CONFIG_IP_SET_HASH_IPPORTNET=m | 155 | CONFIG_IP_SET_HASH_IPPORTNET=m |
156 | CONFIG_IP_SET_HASH_NETPORTNET=m | ||
144 | CONFIG_IP_SET_HASH_NET=m | 157 | CONFIG_IP_SET_HASH_NET=m |
158 | CONFIG_IP_SET_HASH_NETNET=m | ||
145 | CONFIG_IP_SET_HASH_NETPORT=m | 159 | CONFIG_IP_SET_HASH_NETPORT=m |
146 | CONFIG_IP_SET_HASH_NETIFACE=m | 160 | CONFIG_IP_SET_HASH_NETIFACE=m |
147 | CONFIG_IP_SET_LIST_SET=m | 161 | CONFIG_IP_SET_LIST_SET=m |
148 | CONFIG_NF_CONNTRACK_IPV4=m | 162 | CONFIG_NF_CONNTRACK_IPV4=m |
163 | CONFIG_NF_TABLES_IPV4=m | ||
164 | CONFIG_NFT_REJECT_IPV4=m | ||
165 | CONFIG_NFT_CHAIN_ROUTE_IPV4=m | ||
166 | CONFIG_NFT_CHAIN_NAT_IPV4=m | ||
167 | CONFIG_NF_TABLES_ARP=m | ||
149 | CONFIG_IP_NF_IPTABLES=m | 168 | CONFIG_IP_NF_IPTABLES=m |
150 | CONFIG_IP_NF_MATCH_AH=m | 169 | CONFIG_IP_NF_MATCH_AH=m |
151 | CONFIG_IP_NF_MATCH_ECN=m | 170 | CONFIG_IP_NF_MATCH_ECN=m |
@@ -153,6 +172,7 @@ CONFIG_IP_NF_MATCH_RPFILTER=m | |||
153 | CONFIG_IP_NF_MATCH_TTL=m | 172 | CONFIG_IP_NF_MATCH_TTL=m |
154 | CONFIG_IP_NF_FILTER=m | 173 | CONFIG_IP_NF_FILTER=m |
155 | CONFIG_IP_NF_TARGET_REJECT=m | 174 | CONFIG_IP_NF_TARGET_REJECT=m |
175 | CONFIG_IP_NF_TARGET_SYNPROXY=m | ||
156 | CONFIG_IP_NF_TARGET_ULOG=m | 176 | CONFIG_IP_NF_TARGET_ULOG=m |
157 | CONFIG_NF_NAT_IPV4=m | 177 | CONFIG_NF_NAT_IPV4=m |
158 | CONFIG_IP_NF_TARGET_MASQUERADE=m | 178 | CONFIG_IP_NF_TARGET_MASQUERADE=m |
@@ -167,6 +187,9 @@ CONFIG_IP_NF_ARPTABLES=m | |||
167 | CONFIG_IP_NF_ARPFILTER=m | 187 | CONFIG_IP_NF_ARPFILTER=m |
168 | CONFIG_IP_NF_ARP_MANGLE=m | 188 | CONFIG_IP_NF_ARP_MANGLE=m |
169 | CONFIG_NF_CONNTRACK_IPV6=m | 189 | CONFIG_NF_CONNTRACK_IPV6=m |
190 | CONFIG_NF_TABLES_IPV6=m | ||
191 | CONFIG_NFT_CHAIN_ROUTE_IPV6=m | ||
192 | CONFIG_NFT_CHAIN_NAT_IPV6=m | ||
170 | CONFIG_IP6_NF_IPTABLES=m | 193 | CONFIG_IP6_NF_IPTABLES=m |
171 | CONFIG_IP6_NF_MATCH_AH=m | 194 | CONFIG_IP6_NF_MATCH_AH=m |
172 | CONFIG_IP6_NF_MATCH_EUI64=m | 195 | CONFIG_IP6_NF_MATCH_EUI64=m |
@@ -180,11 +203,13 @@ CONFIG_IP6_NF_MATCH_RT=m | |||
180 | CONFIG_IP6_NF_TARGET_HL=m | 203 | CONFIG_IP6_NF_TARGET_HL=m |
181 | CONFIG_IP6_NF_FILTER=m | 204 | CONFIG_IP6_NF_FILTER=m |
182 | CONFIG_IP6_NF_TARGET_REJECT=m | 205 | CONFIG_IP6_NF_TARGET_REJECT=m |
206 | CONFIG_IP6_NF_TARGET_SYNPROXY=m | ||
183 | CONFIG_IP6_NF_MANGLE=m | 207 | CONFIG_IP6_NF_MANGLE=m |
184 | CONFIG_IP6_NF_RAW=m | 208 | CONFIG_IP6_NF_RAW=m |
185 | CONFIG_NF_NAT_IPV6=m | 209 | CONFIG_NF_NAT_IPV6=m |
186 | CONFIG_IP6_NF_TARGET_MASQUERADE=m | 210 | CONFIG_IP6_NF_TARGET_MASQUERADE=m |
187 | CONFIG_IP6_NF_TARGET_NPT=m | 211 | CONFIG_IP6_NF_TARGET_NPT=m |
212 | CONFIG_NF_TABLES_BRIDGE=m | ||
188 | CONFIG_IP_DCCP=m | 213 | CONFIG_IP_DCCP=m |
189 | # CONFIG_IP_DCCP_CCID3 is not set | 214 | # CONFIG_IP_DCCP_CCID3 is not set |
190 | CONFIG_SCTP_COOKIE_HMAC_SHA1=y | 215 | CONFIG_SCTP_COOKIE_HMAC_SHA1=y |
@@ -195,11 +220,13 @@ CONFIG_ATALK=m | |||
195 | CONFIG_DEV_APPLETALK=m | 220 | CONFIG_DEV_APPLETALK=m |
196 | CONFIG_IPDDP=m | 221 | CONFIG_IPDDP=m |
197 | CONFIG_IPDDP_ENCAP=y | 222 | CONFIG_IPDDP_ENCAP=y |
198 | CONFIG_IPDDP_DECAP=y | 223 | CONFIG_DNS_RESOLVER=y |
199 | CONFIG_BATMAN_ADV=m | 224 | CONFIG_BATMAN_ADV=m |
200 | CONFIG_BATMAN_ADV_DAT=y | 225 | CONFIG_BATMAN_ADV_DAT=y |
226 | CONFIG_BATMAN_ADV_NC=y | ||
227 | CONFIG_NETLINK_DIAG=m | ||
228 | CONFIG_NET_MPLS_GSO=m | ||
201 | # CONFIG_WIRELESS is not set | 229 | # CONFIG_WIRELESS is not set |
202 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
203 | CONFIG_DEVTMPFS=y | 230 | CONFIG_DEVTMPFS=y |
204 | # CONFIG_FIRMWARE_IN_KERNEL is not set | 231 | # CONFIG_FIRMWARE_IN_KERNEL is not set |
205 | # CONFIG_FW_LOADER_USER_HELPER is not set | 232 | # CONFIG_FW_LOADER_USER_HELPER is not set |
@@ -212,6 +239,7 @@ CONFIG_BLK_DEV_NBD=m | |||
212 | CONFIG_BLK_DEV_RAM=y | 239 | CONFIG_BLK_DEV_RAM=y |
213 | CONFIG_CDROM_PKTCDVD=m | 240 | CONFIG_CDROM_PKTCDVD=m |
214 | CONFIG_ATA_OVER_ETH=m | 241 | CONFIG_ATA_OVER_ETH=m |
242 | CONFIG_DUMMY_IRQ=m | ||
215 | CONFIG_IDE=y | 243 | CONFIG_IDE=y |
216 | CONFIG_IDE_GD_ATAPI=y | 244 | CONFIG_IDE_GD_ATAPI=y |
217 | CONFIG_BLK_DEV_IDECD=y | 245 | CONFIG_BLK_DEV_IDECD=y |
@@ -261,6 +289,7 @@ CONFIG_EQUALIZER=m | |||
261 | CONFIG_NET_TEAM=m | 289 | CONFIG_NET_TEAM=m |
262 | CONFIG_NET_TEAM_MODE_BROADCAST=m | 290 | CONFIG_NET_TEAM_MODE_BROADCAST=m |
263 | CONFIG_NET_TEAM_MODE_ROUNDROBIN=m | 291 | CONFIG_NET_TEAM_MODE_ROUNDROBIN=m |
292 | CONFIG_NET_TEAM_MODE_RANDOM=m | ||
264 | CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m | 293 | CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m |
265 | CONFIG_NET_TEAM_MODE_LOADBALANCE=m | 294 | CONFIG_NET_TEAM_MODE_LOADBALANCE=m |
266 | CONFIG_VXLAN=m | 295 | CONFIG_VXLAN=m |
@@ -268,6 +297,7 @@ CONFIG_NETCONSOLE=m | |||
268 | CONFIG_NETCONSOLE_DYNAMIC=y | 297 | CONFIG_NETCONSOLE_DYNAMIC=y |
269 | CONFIG_VETH=m | 298 | CONFIG_VETH=m |
270 | CONFIG_MACMACE=y | 299 | CONFIG_MACMACE=y |
300 | # CONFIG_NET_VENDOR_ARC is not set | ||
271 | # CONFIG_NET_CADENCE is not set | 301 | # CONFIG_NET_CADENCE is not set |
272 | # CONFIG_NET_VENDOR_BROADCOM is not set | 302 | # CONFIG_NET_VENDOR_BROADCOM is not set |
273 | CONFIG_MAC89x0=y | 303 | CONFIG_MAC89x0=y |
@@ -279,6 +309,7 @@ CONFIG_MAC8390=y | |||
279 | # CONFIG_NET_VENDOR_SEEQ is not set | 309 | # CONFIG_NET_VENDOR_SEEQ is not set |
280 | # CONFIG_NET_VENDOR_SMSC is not set | 310 | # CONFIG_NET_VENDOR_SMSC is not set |
281 | # CONFIG_NET_VENDOR_STMICRO is not set | 311 | # CONFIG_NET_VENDOR_STMICRO is not set |
312 | # CONFIG_NET_VENDOR_VIA is not set | ||
282 | # CONFIG_NET_VENDOR_WIZNET is not set | 313 | # CONFIG_NET_VENDOR_WIZNET is not set |
283 | CONFIG_PPP=m | 314 | CONFIG_PPP=m |
284 | CONFIG_PPP_BSDCOMP=m | 315 | CONFIG_PPP_BSDCOMP=m |
@@ -302,7 +333,6 @@ CONFIG_MOUSE_SERIAL=m | |||
302 | CONFIG_INPUT_MISC=y | 333 | CONFIG_INPUT_MISC=y |
303 | CONFIG_INPUT_M68K_BEEP=m | 334 | CONFIG_INPUT_M68K_BEEP=m |
304 | CONFIG_SERIO=m | 335 | CONFIG_SERIO=m |
305 | CONFIG_VT_HW_CONSOLE_BINDING=y | ||
306 | # CONFIG_LEGACY_PTYS is not set | 336 | # CONFIG_LEGACY_PTYS is not set |
307 | # CONFIG_DEVKMEM is not set | 337 | # CONFIG_DEVKMEM is not set |
308 | CONFIG_SERIAL_PMACZILOG=y | 338 | CONFIG_SERIAL_PMACZILOG=y |
@@ -327,10 +357,6 @@ CONFIG_RTC_CLASS=y | |||
327 | CONFIG_RTC_DRV_GENERIC=m | 357 | CONFIG_RTC_DRV_GENERIC=m |
328 | # CONFIG_IOMMU_SUPPORT is not set | 358 | # CONFIG_IOMMU_SUPPORT is not set |
329 | CONFIG_PROC_HARDWARE=y | 359 | CONFIG_PROC_HARDWARE=y |
330 | CONFIG_EXT2_FS=y | ||
331 | CONFIG_EXT3_FS=y | ||
332 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set | ||
333 | # CONFIG_EXT3_FS_XATTR is not set | ||
334 | CONFIG_EXT4_FS=y | 360 | CONFIG_EXT4_FS=y |
335 | CONFIG_REISERFS_FS=m | 361 | CONFIG_REISERFS_FS=m |
336 | CONFIG_JFS_FS=m | 362 | CONFIG_JFS_FS=m |
@@ -367,7 +393,7 @@ CONFIG_QNX6FS_FS=m | |||
367 | CONFIG_SYSV_FS=m | 393 | CONFIG_SYSV_FS=m |
368 | CONFIG_UFS_FS=m | 394 | CONFIG_UFS_FS=m |
369 | CONFIG_NFS_FS=y | 395 | CONFIG_NFS_FS=y |
370 | CONFIG_NFS_V4=y | 396 | CONFIG_NFS_V4=m |
371 | CONFIG_NFS_SWAP=y | 397 | CONFIG_NFS_SWAP=y |
372 | CONFIG_ROOT_NFS=y | 398 | CONFIG_ROOT_NFS=y |
373 | CONFIG_NFSD=m | 399 | CONFIG_NFSD=m |
@@ -426,10 +452,11 @@ CONFIG_NLS_MAC_TURKISH=m | |||
426 | CONFIG_DLM=m | 452 | CONFIG_DLM=m |
427 | CONFIG_MAGIC_SYSRQ=y | 453 | CONFIG_MAGIC_SYSRQ=y |
428 | CONFIG_ASYNC_RAID6_TEST=m | 454 | CONFIG_ASYNC_RAID6_TEST=m |
455 | CONFIG_TEST_STRING_HELPERS=m | ||
456 | CONFIG_EARLY_PRINTK=y | ||
429 | CONFIG_ENCRYPTED_KEYS=m | 457 | CONFIG_ENCRYPTED_KEYS=m |
430 | CONFIG_CRYPTO_MANAGER=y | 458 | CONFIG_CRYPTO_MANAGER=y |
431 | CONFIG_CRYPTO_USER=m | 459 | CONFIG_CRYPTO_USER=m |
432 | CONFIG_CRYPTO_NULL=m | ||
433 | CONFIG_CRYPTO_CRYPTD=m | 460 | CONFIG_CRYPTO_CRYPTD=m |
434 | CONFIG_CRYPTO_TEST=m | 461 | CONFIG_CRYPTO_TEST=m |
435 | CONFIG_CRYPTO_CCM=m | 462 | CONFIG_CRYPTO_CCM=m |
@@ -462,6 +489,8 @@ CONFIG_CRYPTO_TEA=m | |||
462 | CONFIG_CRYPTO_TWOFISH=m | 489 | CONFIG_CRYPTO_TWOFISH=m |
463 | CONFIG_CRYPTO_ZLIB=m | 490 | CONFIG_CRYPTO_ZLIB=m |
464 | CONFIG_CRYPTO_LZO=m | 491 | CONFIG_CRYPTO_LZO=m |
492 | CONFIG_CRYPTO_LZ4=m | ||
493 | CONFIG_CRYPTO_LZ4HC=m | ||
465 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | 494 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
466 | CONFIG_CRYPTO_USER_API_HASH=m | 495 | CONFIG_CRYPTO_USER_API_HASH=m |
467 | CONFIG_CRYPTO_USER_API_SKCIPHER=m | 496 | CONFIG_CRYPTO_USER_API_SKCIPHER=m |
diff --git a/arch/m68k/configs/multi_defconfig b/arch/m68k/configs/multi_defconfig index b17a8837f0e1..4e5adff326ee 100644 --- a/arch/m68k/configs/multi_defconfig +++ b/arch/m68k/configs/multi_defconfig | |||
@@ -58,7 +58,6 @@ CONFIG_IP_PNP_RARP=y | |||
58 | CONFIG_NET_IPIP=m | 58 | CONFIG_NET_IPIP=m |
59 | CONFIG_NET_IPGRE_DEMUX=m | 59 | CONFIG_NET_IPGRE_DEMUX=m |
60 | CONFIG_NET_IPGRE=m | 60 | CONFIG_NET_IPGRE=m |
61 | CONFIG_SYN_COOKIES=y | ||
62 | CONFIG_NET_IPVTI=m | 61 | CONFIG_NET_IPVTI=m |
63 | CONFIG_INET_AH=m | 62 | CONFIG_INET_AH=m |
64 | CONFIG_INET_ESP=m | 63 | CONFIG_INET_ESP=m |
@@ -69,11 +68,11 @@ CONFIG_INET_XFRM_MODE_BEET=m | |||
69 | # CONFIG_INET_LRO is not set | 68 | # CONFIG_INET_LRO is not set |
70 | CONFIG_INET_DIAG=m | 69 | CONFIG_INET_DIAG=m |
71 | CONFIG_INET_UDP_DIAG=m | 70 | CONFIG_INET_UDP_DIAG=m |
72 | CONFIG_IPV6_PRIVACY=y | ||
73 | CONFIG_IPV6_ROUTER_PREF=y | 71 | CONFIG_IPV6_ROUTER_PREF=y |
74 | CONFIG_INET6_AH=m | 72 | CONFIG_INET6_AH=m |
75 | CONFIG_INET6_ESP=m | 73 | CONFIG_INET6_ESP=m |
76 | CONFIG_INET6_IPCOMP=m | 74 | CONFIG_INET6_IPCOMP=m |
75 | CONFIG_IPV6_VTI=m | ||
77 | CONFIG_IPV6_GRE=m | 76 | CONFIG_IPV6_GRE=m |
78 | CONFIG_NETFILTER=y | 77 | CONFIG_NETFILTER=y |
79 | CONFIG_NF_CONNTRACK=m | 78 | CONFIG_NF_CONNTRACK=m |
@@ -91,6 +90,17 @@ CONFIG_NF_CONNTRACK_PPTP=m | |||
91 | CONFIG_NF_CONNTRACK_SANE=m | 90 | CONFIG_NF_CONNTRACK_SANE=m |
92 | CONFIG_NF_CONNTRACK_SIP=m | 91 | CONFIG_NF_CONNTRACK_SIP=m |
93 | CONFIG_NF_CONNTRACK_TFTP=m | 92 | CONFIG_NF_CONNTRACK_TFTP=m |
93 | CONFIG_NF_TABLES=m | ||
94 | CONFIG_NFT_EXTHDR=m | ||
95 | CONFIG_NFT_META=m | ||
96 | CONFIG_NFT_CT=m | ||
97 | CONFIG_NFT_RBTREE=m | ||
98 | CONFIG_NFT_HASH=m | ||
99 | CONFIG_NFT_COUNTER=m | ||
100 | CONFIG_NFT_LOG=m | ||
101 | CONFIG_NFT_LIMIT=m | ||
102 | CONFIG_NFT_NAT=m | ||
103 | CONFIG_NFT_COMPAT=m | ||
94 | CONFIG_NETFILTER_XT_SET=m | 104 | CONFIG_NETFILTER_XT_SET=m |
95 | CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m | 105 | CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m |
96 | CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m | 106 | CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m |
@@ -104,6 +114,7 @@ CONFIG_NETFILTER_XT_TARGET_NFLOG=m | |||
104 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m | 114 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m |
105 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m | 115 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m |
106 | CONFIG_NETFILTER_XT_TARGET_TEE=m | 116 | CONFIG_NETFILTER_XT_TARGET_TEE=m |
117 | CONFIG_NETFILTER_XT_TARGET_TPROXY=m | ||
107 | CONFIG_NETFILTER_XT_TARGET_TRACE=m | 118 | CONFIG_NETFILTER_XT_TARGET_TRACE=m |
108 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m | 119 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m |
109 | CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m | 120 | CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m |
@@ -136,6 +147,7 @@ CONFIG_NETFILTER_XT_MATCH_QUOTA=m | |||
136 | CONFIG_NETFILTER_XT_MATCH_RATEEST=m | 147 | CONFIG_NETFILTER_XT_MATCH_RATEEST=m |
137 | CONFIG_NETFILTER_XT_MATCH_REALM=m | 148 | CONFIG_NETFILTER_XT_MATCH_REALM=m |
138 | CONFIG_NETFILTER_XT_MATCH_RECENT=m | 149 | CONFIG_NETFILTER_XT_MATCH_RECENT=m |
150 | CONFIG_NETFILTER_XT_MATCH_SOCKET=m | ||
139 | CONFIG_NETFILTER_XT_MATCH_STATE=m | 151 | CONFIG_NETFILTER_XT_MATCH_STATE=m |
140 | CONFIG_NETFILTER_XT_MATCH_STATISTIC=m | 152 | CONFIG_NETFILTER_XT_MATCH_STATISTIC=m |
141 | CONFIG_NETFILTER_XT_MATCH_STRING=m | 153 | CONFIG_NETFILTER_XT_MATCH_STRING=m |
@@ -150,11 +162,18 @@ CONFIG_IP_SET_HASH_IP=m | |||
150 | CONFIG_IP_SET_HASH_IPPORT=m | 162 | CONFIG_IP_SET_HASH_IPPORT=m |
151 | CONFIG_IP_SET_HASH_IPPORTIP=m | 163 | CONFIG_IP_SET_HASH_IPPORTIP=m |
152 | CONFIG_IP_SET_HASH_IPPORTNET=m | 164 | CONFIG_IP_SET_HASH_IPPORTNET=m |
165 | CONFIG_IP_SET_HASH_NETPORTNET=m | ||
153 | CONFIG_IP_SET_HASH_NET=m | 166 | CONFIG_IP_SET_HASH_NET=m |
167 | CONFIG_IP_SET_HASH_NETNET=m | ||
154 | CONFIG_IP_SET_HASH_NETPORT=m | 168 | CONFIG_IP_SET_HASH_NETPORT=m |
155 | CONFIG_IP_SET_HASH_NETIFACE=m | 169 | CONFIG_IP_SET_HASH_NETIFACE=m |
156 | CONFIG_IP_SET_LIST_SET=m | 170 | CONFIG_IP_SET_LIST_SET=m |
157 | CONFIG_NF_CONNTRACK_IPV4=m | 171 | CONFIG_NF_CONNTRACK_IPV4=m |
172 | CONFIG_NF_TABLES_IPV4=m | ||
173 | CONFIG_NFT_REJECT_IPV4=m | ||
174 | CONFIG_NFT_CHAIN_ROUTE_IPV4=m | ||
175 | CONFIG_NFT_CHAIN_NAT_IPV4=m | ||
176 | CONFIG_NF_TABLES_ARP=m | ||
158 | CONFIG_IP_NF_IPTABLES=m | 177 | CONFIG_IP_NF_IPTABLES=m |
159 | CONFIG_IP_NF_MATCH_AH=m | 178 | CONFIG_IP_NF_MATCH_AH=m |
160 | CONFIG_IP_NF_MATCH_ECN=m | 179 | CONFIG_IP_NF_MATCH_ECN=m |
@@ -162,6 +181,7 @@ CONFIG_IP_NF_MATCH_RPFILTER=m | |||
162 | CONFIG_IP_NF_MATCH_TTL=m | 181 | CONFIG_IP_NF_MATCH_TTL=m |
163 | CONFIG_IP_NF_FILTER=m | 182 | CONFIG_IP_NF_FILTER=m |
164 | CONFIG_IP_NF_TARGET_REJECT=m | 183 | CONFIG_IP_NF_TARGET_REJECT=m |
184 | CONFIG_IP_NF_TARGET_SYNPROXY=m | ||
165 | CONFIG_IP_NF_TARGET_ULOG=m | 185 | CONFIG_IP_NF_TARGET_ULOG=m |
166 | CONFIG_NF_NAT_IPV4=m | 186 | CONFIG_NF_NAT_IPV4=m |
167 | CONFIG_IP_NF_TARGET_MASQUERADE=m | 187 | CONFIG_IP_NF_TARGET_MASQUERADE=m |
@@ -176,6 +196,9 @@ CONFIG_IP_NF_ARPTABLES=m | |||
176 | CONFIG_IP_NF_ARPFILTER=m | 196 | CONFIG_IP_NF_ARPFILTER=m |
177 | CONFIG_IP_NF_ARP_MANGLE=m | 197 | CONFIG_IP_NF_ARP_MANGLE=m |
178 | CONFIG_NF_CONNTRACK_IPV6=m | 198 | CONFIG_NF_CONNTRACK_IPV6=m |
199 | CONFIG_NF_TABLES_IPV6=m | ||
200 | CONFIG_NFT_CHAIN_ROUTE_IPV6=m | ||
201 | CONFIG_NFT_CHAIN_NAT_IPV6=m | ||
179 | CONFIG_IP6_NF_IPTABLES=m | 202 | CONFIG_IP6_NF_IPTABLES=m |
180 | CONFIG_IP6_NF_MATCH_AH=m | 203 | CONFIG_IP6_NF_MATCH_AH=m |
181 | CONFIG_IP6_NF_MATCH_EUI64=m | 204 | CONFIG_IP6_NF_MATCH_EUI64=m |
@@ -189,11 +212,13 @@ CONFIG_IP6_NF_MATCH_RT=m | |||
189 | CONFIG_IP6_NF_TARGET_HL=m | 212 | CONFIG_IP6_NF_TARGET_HL=m |
190 | CONFIG_IP6_NF_FILTER=m | 213 | CONFIG_IP6_NF_FILTER=m |
191 | CONFIG_IP6_NF_TARGET_REJECT=m | 214 | CONFIG_IP6_NF_TARGET_REJECT=m |
215 | CONFIG_IP6_NF_TARGET_SYNPROXY=m | ||
192 | CONFIG_IP6_NF_MANGLE=m | 216 | CONFIG_IP6_NF_MANGLE=m |
193 | CONFIG_IP6_NF_RAW=m | 217 | CONFIG_IP6_NF_RAW=m |
194 | CONFIG_NF_NAT_IPV6=m | 218 | CONFIG_NF_NAT_IPV6=m |
195 | CONFIG_IP6_NF_TARGET_MASQUERADE=m | 219 | CONFIG_IP6_NF_TARGET_MASQUERADE=m |
196 | CONFIG_IP6_NF_TARGET_NPT=m | 220 | CONFIG_IP6_NF_TARGET_NPT=m |
221 | CONFIG_NF_TABLES_BRIDGE=m | ||
197 | CONFIG_IP_DCCP=m | 222 | CONFIG_IP_DCCP=m |
198 | # CONFIG_IP_DCCP_CCID3 is not set | 223 | # CONFIG_IP_DCCP_CCID3 is not set |
199 | CONFIG_SCTP_COOKIE_HMAC_SHA1=y | 224 | CONFIG_SCTP_COOKIE_HMAC_SHA1=y |
@@ -204,11 +229,13 @@ CONFIG_ATALK=m | |||
204 | CONFIG_DEV_APPLETALK=m | 229 | CONFIG_DEV_APPLETALK=m |
205 | CONFIG_IPDDP=m | 230 | CONFIG_IPDDP=m |
206 | CONFIG_IPDDP_ENCAP=y | 231 | CONFIG_IPDDP_ENCAP=y |
207 | CONFIG_IPDDP_DECAP=y | 232 | CONFIG_DNS_RESOLVER=y |
208 | CONFIG_BATMAN_ADV=m | 233 | CONFIG_BATMAN_ADV=m |
209 | CONFIG_BATMAN_ADV_DAT=y | 234 | CONFIG_BATMAN_ADV_DAT=y |
235 | CONFIG_BATMAN_ADV_NC=y | ||
236 | CONFIG_NETLINK_DIAG=m | ||
237 | CONFIG_NET_MPLS_GSO=m | ||
210 | # CONFIG_WIRELESS is not set | 238 | # CONFIG_WIRELESS is not set |
211 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
212 | CONFIG_DEVTMPFS=y | 239 | CONFIG_DEVTMPFS=y |
213 | # CONFIG_FIRMWARE_IN_KERNEL is not set | 240 | # CONFIG_FIRMWARE_IN_KERNEL is not set |
214 | # CONFIG_FW_LOADER_USER_HELPER is not set | 241 | # CONFIG_FW_LOADER_USER_HELPER is not set |
@@ -230,6 +257,7 @@ CONFIG_BLK_DEV_NBD=m | |||
230 | CONFIG_BLK_DEV_RAM=y | 257 | CONFIG_BLK_DEV_RAM=y |
231 | CONFIG_CDROM_PKTCDVD=m | 258 | CONFIG_CDROM_PKTCDVD=m |
232 | CONFIG_ATA_OVER_ETH=m | 259 | CONFIG_ATA_OVER_ETH=m |
260 | CONFIG_DUMMY_IRQ=m | ||
233 | CONFIG_IDE=y | 261 | CONFIG_IDE=y |
234 | CONFIG_IDE_GD_ATAPI=y | 262 | CONFIG_IDE_GD_ATAPI=y |
235 | CONFIG_BLK_DEV_IDECD=y | 263 | CONFIG_BLK_DEV_IDECD=y |
@@ -290,10 +318,10 @@ CONFIG_MAC_EMUMOUSEBTN=y | |||
290 | CONFIG_NETDEVICES=y | 318 | CONFIG_NETDEVICES=y |
291 | CONFIG_DUMMY=m | 319 | CONFIG_DUMMY=m |
292 | CONFIG_EQUALIZER=m | 320 | CONFIG_EQUALIZER=m |
293 | CONFIG_MII=y | ||
294 | CONFIG_NET_TEAM=m | 321 | CONFIG_NET_TEAM=m |
295 | CONFIG_NET_TEAM_MODE_BROADCAST=m | 322 | CONFIG_NET_TEAM_MODE_BROADCAST=m |
296 | CONFIG_NET_TEAM_MODE_ROUNDROBIN=m | 323 | CONFIG_NET_TEAM_MODE_ROUNDROBIN=m |
324 | CONFIG_NET_TEAM_MODE_RANDOM=m | ||
297 | CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m | 325 | CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m |
298 | CONFIG_NET_TEAM_MODE_LOADBALANCE=m | 326 | CONFIG_NET_TEAM_MODE_LOADBALANCE=m |
299 | CONFIG_VXLAN=m | 327 | CONFIG_VXLAN=m |
@@ -308,10 +336,10 @@ CONFIG_HPLANCE=y | |||
308 | CONFIG_MVME147_NET=y | 336 | CONFIG_MVME147_NET=y |
309 | CONFIG_SUN3LANCE=y | 337 | CONFIG_SUN3LANCE=y |
310 | CONFIG_MACMACE=y | 338 | CONFIG_MACMACE=y |
339 | # CONFIG_NET_VENDOR_ARC is not set | ||
311 | # CONFIG_NET_CADENCE is not set | 340 | # CONFIG_NET_CADENCE is not set |
312 | # CONFIG_NET_VENDOR_BROADCOM is not set | 341 | # CONFIG_NET_VENDOR_BROADCOM is not set |
313 | CONFIG_MAC89x0=y | 342 | CONFIG_MAC89x0=y |
314 | # CONFIG_NET_VENDOR_FUJITSU is not set | ||
315 | # CONFIG_NET_VENDOR_HP is not set | 343 | # CONFIG_NET_VENDOR_HP is not set |
316 | CONFIG_BVME6000_NET=y | 344 | CONFIG_BVME6000_NET=y |
317 | CONFIG_MVME16x_NET=y | 345 | CONFIG_MVME16x_NET=y |
@@ -325,6 +353,7 @@ CONFIG_APNE=y | |||
325 | CONFIG_ZORRO8390=y | 353 | CONFIG_ZORRO8390=y |
326 | # CONFIG_NET_VENDOR_SEEQ is not set | 354 | # CONFIG_NET_VENDOR_SEEQ is not set |
327 | # CONFIG_NET_VENDOR_STMICRO is not set | 355 | # CONFIG_NET_VENDOR_STMICRO is not set |
356 | # CONFIG_NET_VENDOR_VIA is not set | ||
328 | # CONFIG_NET_VENDOR_WIZNET is not set | 357 | # CONFIG_NET_VENDOR_WIZNET is not set |
329 | CONFIG_PLIP=m | 358 | CONFIG_PLIP=m |
330 | CONFIG_PPP=m | 359 | CONFIG_PPP=m |
@@ -357,7 +386,6 @@ CONFIG_INPUT_MISC=y | |||
357 | CONFIG_INPUT_M68K_BEEP=m | 386 | CONFIG_INPUT_M68K_BEEP=m |
358 | CONFIG_HP_SDC_RTC=m | 387 | CONFIG_HP_SDC_RTC=m |
359 | CONFIG_SERIO_Q40KBD=y | 388 | CONFIG_SERIO_Q40KBD=y |
360 | CONFIG_VT_HW_CONSOLE_BINDING=y | ||
361 | # CONFIG_LEGACY_PTYS is not set | 389 | # CONFIG_LEGACY_PTYS is not set |
362 | # CONFIG_DEVKMEM is not set | 390 | # CONFIG_DEVKMEM is not set |
363 | CONFIG_SERIAL_PMACZILOG=y | 391 | CONFIG_SERIAL_PMACZILOG=y |
@@ -405,10 +433,6 @@ CONFIG_NFETH=y | |||
405 | CONFIG_ATARI_DSP56K=m | 433 | CONFIG_ATARI_DSP56K=m |
406 | CONFIG_AMIGA_BUILTIN_SERIAL=y | 434 | CONFIG_AMIGA_BUILTIN_SERIAL=y |
407 | CONFIG_SERIAL_CONSOLE=y | 435 | CONFIG_SERIAL_CONSOLE=y |
408 | CONFIG_EXT2_FS=y | ||
409 | CONFIG_EXT3_FS=y | ||
410 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set | ||
411 | # CONFIG_EXT3_FS_XATTR is not set | ||
412 | CONFIG_EXT4_FS=y | 436 | CONFIG_EXT4_FS=y |
413 | CONFIG_REISERFS_FS=m | 437 | CONFIG_REISERFS_FS=m |
414 | CONFIG_JFS_FS=m | 438 | CONFIG_JFS_FS=m |
@@ -445,7 +469,7 @@ CONFIG_QNX6FS_FS=m | |||
445 | CONFIG_SYSV_FS=m | 469 | CONFIG_SYSV_FS=m |
446 | CONFIG_UFS_FS=m | 470 | CONFIG_UFS_FS=m |
447 | CONFIG_NFS_FS=y | 471 | CONFIG_NFS_FS=y |
448 | CONFIG_NFS_V4=y | 472 | CONFIG_NFS_V4=m |
449 | CONFIG_NFS_SWAP=y | 473 | CONFIG_NFS_SWAP=y |
450 | CONFIG_ROOT_NFS=y | 474 | CONFIG_ROOT_NFS=y |
451 | CONFIG_NFSD=m | 475 | CONFIG_NFSD=m |
@@ -504,10 +528,11 @@ CONFIG_NLS_MAC_TURKISH=m | |||
504 | CONFIG_DLM=m | 528 | CONFIG_DLM=m |
505 | CONFIG_MAGIC_SYSRQ=y | 529 | CONFIG_MAGIC_SYSRQ=y |
506 | CONFIG_ASYNC_RAID6_TEST=m | 530 | CONFIG_ASYNC_RAID6_TEST=m |
531 | CONFIG_TEST_STRING_HELPERS=m | ||
532 | CONFIG_EARLY_PRINTK=y | ||
507 | CONFIG_ENCRYPTED_KEYS=m | 533 | CONFIG_ENCRYPTED_KEYS=m |
508 | CONFIG_CRYPTO_MANAGER=y | 534 | CONFIG_CRYPTO_MANAGER=y |
509 | CONFIG_CRYPTO_USER=m | 535 | CONFIG_CRYPTO_USER=m |
510 | CONFIG_CRYPTO_NULL=m | ||
511 | CONFIG_CRYPTO_CRYPTD=m | 536 | CONFIG_CRYPTO_CRYPTD=m |
512 | CONFIG_CRYPTO_TEST=m | 537 | CONFIG_CRYPTO_TEST=m |
513 | CONFIG_CRYPTO_CCM=m | 538 | CONFIG_CRYPTO_CCM=m |
@@ -540,6 +565,8 @@ CONFIG_CRYPTO_TEA=m | |||
540 | CONFIG_CRYPTO_TWOFISH=m | 565 | CONFIG_CRYPTO_TWOFISH=m |
541 | CONFIG_CRYPTO_ZLIB=m | 566 | CONFIG_CRYPTO_ZLIB=m |
542 | CONFIG_CRYPTO_LZO=m | 567 | CONFIG_CRYPTO_LZO=m |
568 | CONFIG_CRYPTO_LZ4=m | ||
569 | CONFIG_CRYPTO_LZ4HC=m | ||
543 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | 570 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
544 | CONFIG_CRYPTO_USER_API_HASH=m | 571 | CONFIG_CRYPTO_USER_API_HASH=m |
545 | CONFIG_CRYPTO_USER_API_SKCIPHER=m | 572 | CONFIG_CRYPTO_USER_API_SKCIPHER=m |
diff --git a/arch/m68k/configs/mvme147_defconfig b/arch/m68k/configs/mvme147_defconfig index 5586c6529fce..02cdbac5565e 100644 --- a/arch/m68k/configs/mvme147_defconfig +++ b/arch/m68k/configs/mvme147_defconfig | |||
@@ -47,7 +47,6 @@ CONFIG_IP_PNP_RARP=y | |||
47 | CONFIG_NET_IPIP=m | 47 | CONFIG_NET_IPIP=m |
48 | CONFIG_NET_IPGRE_DEMUX=m | 48 | CONFIG_NET_IPGRE_DEMUX=m |
49 | CONFIG_NET_IPGRE=m | 49 | CONFIG_NET_IPGRE=m |
50 | CONFIG_SYN_COOKIES=y | ||
51 | CONFIG_NET_IPVTI=m | 50 | CONFIG_NET_IPVTI=m |
52 | CONFIG_INET_AH=m | 51 | CONFIG_INET_AH=m |
53 | CONFIG_INET_ESP=m | 52 | CONFIG_INET_ESP=m |
@@ -58,11 +57,11 @@ CONFIG_INET_XFRM_MODE_BEET=m | |||
58 | # CONFIG_INET_LRO is not set | 57 | # CONFIG_INET_LRO is not set |
59 | CONFIG_INET_DIAG=m | 58 | CONFIG_INET_DIAG=m |
60 | CONFIG_INET_UDP_DIAG=m | 59 | CONFIG_INET_UDP_DIAG=m |
61 | CONFIG_IPV6_PRIVACY=y | ||
62 | CONFIG_IPV6_ROUTER_PREF=y | 60 | CONFIG_IPV6_ROUTER_PREF=y |
63 | CONFIG_INET6_AH=m | 61 | CONFIG_INET6_AH=m |
64 | CONFIG_INET6_ESP=m | 62 | CONFIG_INET6_ESP=m |
65 | CONFIG_INET6_IPCOMP=m | 63 | CONFIG_INET6_IPCOMP=m |
64 | CONFIG_IPV6_VTI=m | ||
66 | CONFIG_IPV6_GRE=m | 65 | CONFIG_IPV6_GRE=m |
67 | CONFIG_NETFILTER=y | 66 | CONFIG_NETFILTER=y |
68 | CONFIG_NF_CONNTRACK=m | 67 | CONFIG_NF_CONNTRACK=m |
@@ -80,6 +79,17 @@ CONFIG_NF_CONNTRACK_PPTP=m | |||
80 | CONFIG_NF_CONNTRACK_SANE=m | 79 | CONFIG_NF_CONNTRACK_SANE=m |
81 | CONFIG_NF_CONNTRACK_SIP=m | 80 | CONFIG_NF_CONNTRACK_SIP=m |
82 | CONFIG_NF_CONNTRACK_TFTP=m | 81 | CONFIG_NF_CONNTRACK_TFTP=m |
82 | CONFIG_NF_TABLES=m | ||
83 | CONFIG_NFT_EXTHDR=m | ||
84 | CONFIG_NFT_META=m | ||
85 | CONFIG_NFT_CT=m | ||
86 | CONFIG_NFT_RBTREE=m | ||
87 | CONFIG_NFT_HASH=m | ||
88 | CONFIG_NFT_COUNTER=m | ||
89 | CONFIG_NFT_LOG=m | ||
90 | CONFIG_NFT_LIMIT=m | ||
91 | CONFIG_NFT_NAT=m | ||
92 | CONFIG_NFT_COMPAT=m | ||
83 | CONFIG_NETFILTER_XT_SET=m | 93 | CONFIG_NETFILTER_XT_SET=m |
84 | CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m | 94 | CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m |
85 | CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m | 95 | CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m |
@@ -93,6 +103,7 @@ CONFIG_NETFILTER_XT_TARGET_NFLOG=m | |||
93 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m | 103 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m |
94 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m | 104 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m |
95 | CONFIG_NETFILTER_XT_TARGET_TEE=m | 105 | CONFIG_NETFILTER_XT_TARGET_TEE=m |
106 | CONFIG_NETFILTER_XT_TARGET_TPROXY=m | ||
96 | CONFIG_NETFILTER_XT_TARGET_TRACE=m | 107 | CONFIG_NETFILTER_XT_TARGET_TRACE=m |
97 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m | 108 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m |
98 | CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m | 109 | CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m |
@@ -125,6 +136,7 @@ CONFIG_NETFILTER_XT_MATCH_QUOTA=m | |||
125 | CONFIG_NETFILTER_XT_MATCH_RATEEST=m | 136 | CONFIG_NETFILTER_XT_MATCH_RATEEST=m |
126 | CONFIG_NETFILTER_XT_MATCH_REALM=m | 137 | CONFIG_NETFILTER_XT_MATCH_REALM=m |
127 | CONFIG_NETFILTER_XT_MATCH_RECENT=m | 138 | CONFIG_NETFILTER_XT_MATCH_RECENT=m |
139 | CONFIG_NETFILTER_XT_MATCH_SOCKET=m | ||
128 | CONFIG_NETFILTER_XT_MATCH_STATE=m | 140 | CONFIG_NETFILTER_XT_MATCH_STATE=m |
129 | CONFIG_NETFILTER_XT_MATCH_STATISTIC=m | 141 | CONFIG_NETFILTER_XT_MATCH_STATISTIC=m |
130 | CONFIG_NETFILTER_XT_MATCH_STRING=m | 142 | CONFIG_NETFILTER_XT_MATCH_STRING=m |
@@ -139,11 +151,18 @@ CONFIG_IP_SET_HASH_IP=m | |||
139 | CONFIG_IP_SET_HASH_IPPORT=m | 151 | CONFIG_IP_SET_HASH_IPPORT=m |
140 | CONFIG_IP_SET_HASH_IPPORTIP=m | 152 | CONFIG_IP_SET_HASH_IPPORTIP=m |
141 | CONFIG_IP_SET_HASH_IPPORTNET=m | 153 | CONFIG_IP_SET_HASH_IPPORTNET=m |
154 | CONFIG_IP_SET_HASH_NETPORTNET=m | ||
142 | CONFIG_IP_SET_HASH_NET=m | 155 | CONFIG_IP_SET_HASH_NET=m |
156 | CONFIG_IP_SET_HASH_NETNET=m | ||
143 | CONFIG_IP_SET_HASH_NETPORT=m | 157 | CONFIG_IP_SET_HASH_NETPORT=m |
144 | CONFIG_IP_SET_HASH_NETIFACE=m | 158 | CONFIG_IP_SET_HASH_NETIFACE=m |
145 | CONFIG_IP_SET_LIST_SET=m | 159 | CONFIG_IP_SET_LIST_SET=m |
146 | CONFIG_NF_CONNTRACK_IPV4=m | 160 | CONFIG_NF_CONNTRACK_IPV4=m |
161 | CONFIG_NF_TABLES_IPV4=m | ||
162 | CONFIG_NFT_REJECT_IPV4=m | ||
163 | CONFIG_NFT_CHAIN_ROUTE_IPV4=m | ||
164 | CONFIG_NFT_CHAIN_NAT_IPV4=m | ||
165 | CONFIG_NF_TABLES_ARP=m | ||
147 | CONFIG_IP_NF_IPTABLES=m | 166 | CONFIG_IP_NF_IPTABLES=m |
148 | CONFIG_IP_NF_MATCH_AH=m | 167 | CONFIG_IP_NF_MATCH_AH=m |
149 | CONFIG_IP_NF_MATCH_ECN=m | 168 | CONFIG_IP_NF_MATCH_ECN=m |
@@ -151,6 +170,7 @@ CONFIG_IP_NF_MATCH_RPFILTER=m | |||
151 | CONFIG_IP_NF_MATCH_TTL=m | 170 | CONFIG_IP_NF_MATCH_TTL=m |
152 | CONFIG_IP_NF_FILTER=m | 171 | CONFIG_IP_NF_FILTER=m |
153 | CONFIG_IP_NF_TARGET_REJECT=m | 172 | CONFIG_IP_NF_TARGET_REJECT=m |
173 | CONFIG_IP_NF_TARGET_SYNPROXY=m | ||
154 | CONFIG_IP_NF_TARGET_ULOG=m | 174 | CONFIG_IP_NF_TARGET_ULOG=m |
155 | CONFIG_NF_NAT_IPV4=m | 175 | CONFIG_NF_NAT_IPV4=m |
156 | CONFIG_IP_NF_TARGET_MASQUERADE=m | 176 | CONFIG_IP_NF_TARGET_MASQUERADE=m |
@@ -165,6 +185,9 @@ CONFIG_IP_NF_ARPTABLES=m | |||
165 | CONFIG_IP_NF_ARPFILTER=m | 185 | CONFIG_IP_NF_ARPFILTER=m |
166 | CONFIG_IP_NF_ARP_MANGLE=m | 186 | CONFIG_IP_NF_ARP_MANGLE=m |
167 | CONFIG_NF_CONNTRACK_IPV6=m | 187 | CONFIG_NF_CONNTRACK_IPV6=m |
188 | CONFIG_NF_TABLES_IPV6=m | ||
189 | CONFIG_NFT_CHAIN_ROUTE_IPV6=m | ||
190 | CONFIG_NFT_CHAIN_NAT_IPV6=m | ||
168 | CONFIG_IP6_NF_IPTABLES=m | 191 | CONFIG_IP6_NF_IPTABLES=m |
169 | CONFIG_IP6_NF_MATCH_AH=m | 192 | CONFIG_IP6_NF_MATCH_AH=m |
170 | CONFIG_IP6_NF_MATCH_EUI64=m | 193 | CONFIG_IP6_NF_MATCH_EUI64=m |
@@ -178,11 +201,13 @@ CONFIG_IP6_NF_MATCH_RT=m | |||
178 | CONFIG_IP6_NF_TARGET_HL=m | 201 | CONFIG_IP6_NF_TARGET_HL=m |
179 | CONFIG_IP6_NF_FILTER=m | 202 | CONFIG_IP6_NF_FILTER=m |
180 | CONFIG_IP6_NF_TARGET_REJECT=m | 203 | CONFIG_IP6_NF_TARGET_REJECT=m |
204 | CONFIG_IP6_NF_TARGET_SYNPROXY=m | ||
181 | CONFIG_IP6_NF_MANGLE=m | 205 | CONFIG_IP6_NF_MANGLE=m |
182 | CONFIG_IP6_NF_RAW=m | 206 | CONFIG_IP6_NF_RAW=m |
183 | CONFIG_NF_NAT_IPV6=m | 207 | CONFIG_NF_NAT_IPV6=m |
184 | CONFIG_IP6_NF_TARGET_MASQUERADE=m | 208 | CONFIG_IP6_NF_TARGET_MASQUERADE=m |
185 | CONFIG_IP6_NF_TARGET_NPT=m | 209 | CONFIG_IP6_NF_TARGET_NPT=m |
210 | CONFIG_NF_TABLES_BRIDGE=m | ||
186 | CONFIG_IP_DCCP=m | 211 | CONFIG_IP_DCCP=m |
187 | # CONFIG_IP_DCCP_CCID3 is not set | 212 | # CONFIG_IP_DCCP_CCID3 is not set |
188 | CONFIG_SCTP_COOKIE_HMAC_SHA1=y | 213 | CONFIG_SCTP_COOKIE_HMAC_SHA1=y |
@@ -190,10 +215,13 @@ CONFIG_RDS=m | |||
190 | CONFIG_RDS_TCP=m | 215 | CONFIG_RDS_TCP=m |
191 | CONFIG_L2TP=m | 216 | CONFIG_L2TP=m |
192 | CONFIG_ATALK=m | 217 | CONFIG_ATALK=m |
218 | CONFIG_DNS_RESOLVER=y | ||
193 | CONFIG_BATMAN_ADV=m | 219 | CONFIG_BATMAN_ADV=m |
194 | CONFIG_BATMAN_ADV_DAT=y | 220 | CONFIG_BATMAN_ADV_DAT=y |
221 | CONFIG_BATMAN_ADV_NC=y | ||
222 | CONFIG_NETLINK_DIAG=m | ||
223 | CONFIG_NET_MPLS_GSO=m | ||
195 | # CONFIG_WIRELESS is not set | 224 | # CONFIG_WIRELESS is not set |
196 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
197 | CONFIG_DEVTMPFS=y | 225 | CONFIG_DEVTMPFS=y |
198 | # CONFIG_FIRMWARE_IN_KERNEL is not set | 226 | # CONFIG_FIRMWARE_IN_KERNEL is not set |
199 | # CONFIG_FW_LOADER_USER_HELPER is not set | 227 | # CONFIG_FW_LOADER_USER_HELPER is not set |
@@ -205,6 +233,7 @@ CONFIG_BLK_DEV_NBD=m | |||
205 | CONFIG_BLK_DEV_RAM=y | 233 | CONFIG_BLK_DEV_RAM=y |
206 | CONFIG_CDROM_PKTCDVD=m | 234 | CONFIG_CDROM_PKTCDVD=m |
207 | CONFIG_ATA_OVER_ETH=m | 235 | CONFIG_ATA_OVER_ETH=m |
236 | CONFIG_DUMMY_IRQ=m | ||
208 | CONFIG_RAID_ATTRS=m | 237 | CONFIG_RAID_ATTRS=m |
209 | CONFIG_SCSI=y | 238 | CONFIG_SCSI=y |
210 | CONFIG_SCSI_TGT=m | 239 | CONFIG_SCSI_TGT=m |
@@ -242,6 +271,7 @@ CONFIG_EQUALIZER=m | |||
242 | CONFIG_NET_TEAM=m | 271 | CONFIG_NET_TEAM=m |
243 | CONFIG_NET_TEAM_MODE_BROADCAST=m | 272 | CONFIG_NET_TEAM_MODE_BROADCAST=m |
244 | CONFIG_NET_TEAM_MODE_ROUNDROBIN=m | 273 | CONFIG_NET_TEAM_MODE_ROUNDROBIN=m |
274 | CONFIG_NET_TEAM_MODE_RANDOM=m | ||
245 | CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m | 275 | CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m |
246 | CONFIG_NET_TEAM_MODE_LOADBALANCE=m | 276 | CONFIG_NET_TEAM_MODE_LOADBALANCE=m |
247 | CONFIG_VXLAN=m | 277 | CONFIG_VXLAN=m |
@@ -249,6 +279,7 @@ CONFIG_NETCONSOLE=m | |||
249 | CONFIG_NETCONSOLE_DYNAMIC=y | 279 | CONFIG_NETCONSOLE_DYNAMIC=y |
250 | CONFIG_VETH=m | 280 | CONFIG_VETH=m |
251 | CONFIG_MVME147_NET=y | 281 | CONFIG_MVME147_NET=y |
282 | # CONFIG_NET_VENDOR_ARC is not set | ||
252 | # CONFIG_NET_CADENCE is not set | 283 | # CONFIG_NET_CADENCE is not set |
253 | # CONFIG_NET_VENDOR_BROADCOM is not set | 284 | # CONFIG_NET_VENDOR_BROADCOM is not set |
254 | # CONFIG_NET_VENDOR_INTEL is not set | 285 | # CONFIG_NET_VENDOR_INTEL is not set |
@@ -257,6 +288,7 @@ CONFIG_MVME147_NET=y | |||
257 | # CONFIG_NET_VENDOR_NATSEMI is not set | 288 | # CONFIG_NET_VENDOR_NATSEMI is not set |
258 | # CONFIG_NET_VENDOR_SEEQ is not set | 289 | # CONFIG_NET_VENDOR_SEEQ is not set |
259 | # CONFIG_NET_VENDOR_STMICRO is not set | 290 | # CONFIG_NET_VENDOR_STMICRO is not set |
291 | # CONFIG_NET_VENDOR_VIA is not set | ||
260 | # CONFIG_NET_VENDOR_WIZNET is not set | 292 | # CONFIG_NET_VENDOR_WIZNET is not set |
261 | CONFIG_PPP=m | 293 | CONFIG_PPP=m |
262 | CONFIG_PPP_BSDCOMP=m | 294 | CONFIG_PPP_BSDCOMP=m |
@@ -294,10 +326,6 @@ CONFIG_RTC_CLASS=y | |||
294 | CONFIG_RTC_DRV_GENERIC=m | 326 | CONFIG_RTC_DRV_GENERIC=m |
295 | # CONFIG_IOMMU_SUPPORT is not set | 327 | # CONFIG_IOMMU_SUPPORT is not set |
296 | CONFIG_PROC_HARDWARE=y | 328 | CONFIG_PROC_HARDWARE=y |
297 | CONFIG_EXT2_FS=y | ||
298 | CONFIG_EXT3_FS=y | ||
299 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set | ||
300 | # CONFIG_EXT3_FS_XATTR is not set | ||
301 | CONFIG_EXT4_FS=y | 329 | CONFIG_EXT4_FS=y |
302 | CONFIG_REISERFS_FS=m | 330 | CONFIG_REISERFS_FS=m |
303 | CONFIG_JFS_FS=m | 331 | CONFIG_JFS_FS=m |
@@ -334,7 +362,7 @@ CONFIG_QNX6FS_FS=m | |||
334 | CONFIG_SYSV_FS=m | 362 | CONFIG_SYSV_FS=m |
335 | CONFIG_UFS_FS=m | 363 | CONFIG_UFS_FS=m |
336 | CONFIG_NFS_FS=y | 364 | CONFIG_NFS_FS=y |
337 | CONFIG_NFS_V4=y | 365 | CONFIG_NFS_V4=m |
338 | CONFIG_NFS_SWAP=y | 366 | CONFIG_NFS_SWAP=y |
339 | CONFIG_ROOT_NFS=y | 367 | CONFIG_ROOT_NFS=y |
340 | CONFIG_NFSD=m | 368 | CONFIG_NFSD=m |
@@ -393,10 +421,10 @@ CONFIG_NLS_MAC_TURKISH=m | |||
393 | CONFIG_DLM=m | 421 | CONFIG_DLM=m |
394 | CONFIG_MAGIC_SYSRQ=y | 422 | CONFIG_MAGIC_SYSRQ=y |
395 | CONFIG_ASYNC_RAID6_TEST=m | 423 | CONFIG_ASYNC_RAID6_TEST=m |
424 | CONFIG_TEST_STRING_HELPERS=m | ||
396 | CONFIG_ENCRYPTED_KEYS=m | 425 | CONFIG_ENCRYPTED_KEYS=m |
397 | CONFIG_CRYPTO_MANAGER=y | 426 | CONFIG_CRYPTO_MANAGER=y |
398 | CONFIG_CRYPTO_USER=m | 427 | CONFIG_CRYPTO_USER=m |
399 | CONFIG_CRYPTO_NULL=m | ||
400 | CONFIG_CRYPTO_CRYPTD=m | 428 | CONFIG_CRYPTO_CRYPTD=m |
401 | CONFIG_CRYPTO_TEST=m | 429 | CONFIG_CRYPTO_TEST=m |
402 | CONFIG_CRYPTO_CCM=m | 430 | CONFIG_CRYPTO_CCM=m |
@@ -429,6 +457,8 @@ CONFIG_CRYPTO_TEA=m | |||
429 | CONFIG_CRYPTO_TWOFISH=m | 457 | CONFIG_CRYPTO_TWOFISH=m |
430 | CONFIG_CRYPTO_ZLIB=m | 458 | CONFIG_CRYPTO_ZLIB=m |
431 | CONFIG_CRYPTO_LZO=m | 459 | CONFIG_CRYPTO_LZO=m |
460 | CONFIG_CRYPTO_LZ4=m | ||
461 | CONFIG_CRYPTO_LZ4HC=m | ||
432 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | 462 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
433 | CONFIG_CRYPTO_USER_API_HASH=m | 463 | CONFIG_CRYPTO_USER_API_HASH=m |
434 | CONFIG_CRYPTO_USER_API_SKCIPHER=m | 464 | CONFIG_CRYPTO_USER_API_SKCIPHER=m |
diff --git a/arch/m68k/configs/mvme16x_defconfig b/arch/m68k/configs/mvme16x_defconfig index e5e8262bbacd..05a990a9dbd4 100644 --- a/arch/m68k/configs/mvme16x_defconfig +++ b/arch/m68k/configs/mvme16x_defconfig | |||
@@ -48,7 +48,6 @@ CONFIG_IP_PNP_RARP=y | |||
48 | CONFIG_NET_IPIP=m | 48 | CONFIG_NET_IPIP=m |
49 | CONFIG_NET_IPGRE_DEMUX=m | 49 | CONFIG_NET_IPGRE_DEMUX=m |
50 | CONFIG_NET_IPGRE=m | 50 | CONFIG_NET_IPGRE=m |
51 | CONFIG_SYN_COOKIES=y | ||
52 | CONFIG_NET_IPVTI=m | 51 | CONFIG_NET_IPVTI=m |
53 | CONFIG_INET_AH=m | 52 | CONFIG_INET_AH=m |
54 | CONFIG_INET_ESP=m | 53 | CONFIG_INET_ESP=m |
@@ -59,11 +58,11 @@ CONFIG_INET_XFRM_MODE_BEET=m | |||
59 | # CONFIG_INET_LRO is not set | 58 | # CONFIG_INET_LRO is not set |
60 | CONFIG_INET_DIAG=m | 59 | CONFIG_INET_DIAG=m |
61 | CONFIG_INET_UDP_DIAG=m | 60 | CONFIG_INET_UDP_DIAG=m |
62 | CONFIG_IPV6_PRIVACY=y | ||
63 | CONFIG_IPV6_ROUTER_PREF=y | 61 | CONFIG_IPV6_ROUTER_PREF=y |
64 | CONFIG_INET6_AH=m | 62 | CONFIG_INET6_AH=m |
65 | CONFIG_INET6_ESP=m | 63 | CONFIG_INET6_ESP=m |
66 | CONFIG_INET6_IPCOMP=m | 64 | CONFIG_INET6_IPCOMP=m |
65 | CONFIG_IPV6_VTI=m | ||
67 | CONFIG_IPV6_GRE=m | 66 | CONFIG_IPV6_GRE=m |
68 | CONFIG_NETFILTER=y | 67 | CONFIG_NETFILTER=y |
69 | CONFIG_NF_CONNTRACK=m | 68 | CONFIG_NF_CONNTRACK=m |
@@ -81,6 +80,17 @@ CONFIG_NF_CONNTRACK_PPTP=m | |||
81 | CONFIG_NF_CONNTRACK_SANE=m | 80 | CONFIG_NF_CONNTRACK_SANE=m |
82 | CONFIG_NF_CONNTRACK_SIP=m | 81 | CONFIG_NF_CONNTRACK_SIP=m |
83 | CONFIG_NF_CONNTRACK_TFTP=m | 82 | CONFIG_NF_CONNTRACK_TFTP=m |
83 | CONFIG_NF_TABLES=m | ||
84 | CONFIG_NFT_EXTHDR=m | ||
85 | CONFIG_NFT_META=m | ||
86 | CONFIG_NFT_CT=m | ||
87 | CONFIG_NFT_RBTREE=m | ||
88 | CONFIG_NFT_HASH=m | ||
89 | CONFIG_NFT_COUNTER=m | ||
90 | CONFIG_NFT_LOG=m | ||
91 | CONFIG_NFT_LIMIT=m | ||
92 | CONFIG_NFT_NAT=m | ||
93 | CONFIG_NFT_COMPAT=m | ||
84 | CONFIG_NETFILTER_XT_SET=m | 94 | CONFIG_NETFILTER_XT_SET=m |
85 | CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m | 95 | CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m |
86 | CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m | 96 | CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m |
@@ -94,6 +104,7 @@ CONFIG_NETFILTER_XT_TARGET_NFLOG=m | |||
94 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m | 104 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m |
95 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m | 105 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m |
96 | CONFIG_NETFILTER_XT_TARGET_TEE=m | 106 | CONFIG_NETFILTER_XT_TARGET_TEE=m |
107 | CONFIG_NETFILTER_XT_TARGET_TPROXY=m | ||
97 | CONFIG_NETFILTER_XT_TARGET_TRACE=m | 108 | CONFIG_NETFILTER_XT_TARGET_TRACE=m |
98 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m | 109 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m |
99 | CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m | 110 | CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m |
@@ -126,6 +137,7 @@ CONFIG_NETFILTER_XT_MATCH_QUOTA=m | |||
126 | CONFIG_NETFILTER_XT_MATCH_RATEEST=m | 137 | CONFIG_NETFILTER_XT_MATCH_RATEEST=m |
127 | CONFIG_NETFILTER_XT_MATCH_REALM=m | 138 | CONFIG_NETFILTER_XT_MATCH_REALM=m |
128 | CONFIG_NETFILTER_XT_MATCH_RECENT=m | 139 | CONFIG_NETFILTER_XT_MATCH_RECENT=m |
140 | CONFIG_NETFILTER_XT_MATCH_SOCKET=m | ||
129 | CONFIG_NETFILTER_XT_MATCH_STATE=m | 141 | CONFIG_NETFILTER_XT_MATCH_STATE=m |
130 | CONFIG_NETFILTER_XT_MATCH_STATISTIC=m | 142 | CONFIG_NETFILTER_XT_MATCH_STATISTIC=m |
131 | CONFIG_NETFILTER_XT_MATCH_STRING=m | 143 | CONFIG_NETFILTER_XT_MATCH_STRING=m |
@@ -140,11 +152,18 @@ CONFIG_IP_SET_HASH_IP=m | |||
140 | CONFIG_IP_SET_HASH_IPPORT=m | 152 | CONFIG_IP_SET_HASH_IPPORT=m |
141 | CONFIG_IP_SET_HASH_IPPORTIP=m | 153 | CONFIG_IP_SET_HASH_IPPORTIP=m |
142 | CONFIG_IP_SET_HASH_IPPORTNET=m | 154 | CONFIG_IP_SET_HASH_IPPORTNET=m |
155 | CONFIG_IP_SET_HASH_NETPORTNET=m | ||
143 | CONFIG_IP_SET_HASH_NET=m | 156 | CONFIG_IP_SET_HASH_NET=m |
157 | CONFIG_IP_SET_HASH_NETNET=m | ||
144 | CONFIG_IP_SET_HASH_NETPORT=m | 158 | CONFIG_IP_SET_HASH_NETPORT=m |
145 | CONFIG_IP_SET_HASH_NETIFACE=m | 159 | CONFIG_IP_SET_HASH_NETIFACE=m |
146 | CONFIG_IP_SET_LIST_SET=m | 160 | CONFIG_IP_SET_LIST_SET=m |
147 | CONFIG_NF_CONNTRACK_IPV4=m | 161 | CONFIG_NF_CONNTRACK_IPV4=m |
162 | CONFIG_NF_TABLES_IPV4=m | ||
163 | CONFIG_NFT_REJECT_IPV4=m | ||
164 | CONFIG_NFT_CHAIN_ROUTE_IPV4=m | ||
165 | CONFIG_NFT_CHAIN_NAT_IPV4=m | ||
166 | CONFIG_NF_TABLES_ARP=m | ||
148 | CONFIG_IP_NF_IPTABLES=m | 167 | CONFIG_IP_NF_IPTABLES=m |
149 | CONFIG_IP_NF_MATCH_AH=m | 168 | CONFIG_IP_NF_MATCH_AH=m |
150 | CONFIG_IP_NF_MATCH_ECN=m | 169 | CONFIG_IP_NF_MATCH_ECN=m |
@@ -152,6 +171,7 @@ CONFIG_IP_NF_MATCH_RPFILTER=m | |||
152 | CONFIG_IP_NF_MATCH_TTL=m | 171 | CONFIG_IP_NF_MATCH_TTL=m |
153 | CONFIG_IP_NF_FILTER=m | 172 | CONFIG_IP_NF_FILTER=m |
154 | CONFIG_IP_NF_TARGET_REJECT=m | 173 | CONFIG_IP_NF_TARGET_REJECT=m |
174 | CONFIG_IP_NF_TARGET_SYNPROXY=m | ||
155 | CONFIG_IP_NF_TARGET_ULOG=m | 175 | CONFIG_IP_NF_TARGET_ULOG=m |
156 | CONFIG_NF_NAT_IPV4=m | 176 | CONFIG_NF_NAT_IPV4=m |
157 | CONFIG_IP_NF_TARGET_MASQUERADE=m | 177 | CONFIG_IP_NF_TARGET_MASQUERADE=m |
@@ -166,6 +186,9 @@ CONFIG_IP_NF_ARPTABLES=m | |||
166 | CONFIG_IP_NF_ARPFILTER=m | 186 | CONFIG_IP_NF_ARPFILTER=m |
167 | CONFIG_IP_NF_ARP_MANGLE=m | 187 | CONFIG_IP_NF_ARP_MANGLE=m |
168 | CONFIG_NF_CONNTRACK_IPV6=m | 188 | CONFIG_NF_CONNTRACK_IPV6=m |
189 | CONFIG_NF_TABLES_IPV6=m | ||
190 | CONFIG_NFT_CHAIN_ROUTE_IPV6=m | ||
191 | CONFIG_NFT_CHAIN_NAT_IPV6=m | ||
169 | CONFIG_IP6_NF_IPTABLES=m | 192 | CONFIG_IP6_NF_IPTABLES=m |
170 | CONFIG_IP6_NF_MATCH_AH=m | 193 | CONFIG_IP6_NF_MATCH_AH=m |
171 | CONFIG_IP6_NF_MATCH_EUI64=m | 194 | CONFIG_IP6_NF_MATCH_EUI64=m |
@@ -179,11 +202,13 @@ CONFIG_IP6_NF_MATCH_RT=m | |||
179 | CONFIG_IP6_NF_TARGET_HL=m | 202 | CONFIG_IP6_NF_TARGET_HL=m |
180 | CONFIG_IP6_NF_FILTER=m | 203 | CONFIG_IP6_NF_FILTER=m |
181 | CONFIG_IP6_NF_TARGET_REJECT=m | 204 | CONFIG_IP6_NF_TARGET_REJECT=m |
205 | CONFIG_IP6_NF_TARGET_SYNPROXY=m | ||
182 | CONFIG_IP6_NF_MANGLE=m | 206 | CONFIG_IP6_NF_MANGLE=m |
183 | CONFIG_IP6_NF_RAW=m | 207 | CONFIG_IP6_NF_RAW=m |
184 | CONFIG_NF_NAT_IPV6=m | 208 | CONFIG_NF_NAT_IPV6=m |
185 | CONFIG_IP6_NF_TARGET_MASQUERADE=m | 209 | CONFIG_IP6_NF_TARGET_MASQUERADE=m |
186 | CONFIG_IP6_NF_TARGET_NPT=m | 210 | CONFIG_IP6_NF_TARGET_NPT=m |
211 | CONFIG_NF_TABLES_BRIDGE=m | ||
187 | CONFIG_IP_DCCP=m | 212 | CONFIG_IP_DCCP=m |
188 | # CONFIG_IP_DCCP_CCID3 is not set | 213 | # CONFIG_IP_DCCP_CCID3 is not set |
189 | CONFIG_SCTP_COOKIE_HMAC_SHA1=y | 214 | CONFIG_SCTP_COOKIE_HMAC_SHA1=y |
@@ -191,10 +216,13 @@ CONFIG_RDS=m | |||
191 | CONFIG_RDS_TCP=m | 216 | CONFIG_RDS_TCP=m |
192 | CONFIG_L2TP=m | 217 | CONFIG_L2TP=m |
193 | CONFIG_ATALK=m | 218 | CONFIG_ATALK=m |
219 | CONFIG_DNS_RESOLVER=y | ||
194 | CONFIG_BATMAN_ADV=m | 220 | CONFIG_BATMAN_ADV=m |
195 | CONFIG_BATMAN_ADV_DAT=y | 221 | CONFIG_BATMAN_ADV_DAT=y |
222 | CONFIG_BATMAN_ADV_NC=y | ||
223 | CONFIG_NETLINK_DIAG=m | ||
224 | CONFIG_NET_MPLS_GSO=m | ||
196 | # CONFIG_WIRELESS is not set | 225 | # CONFIG_WIRELESS is not set |
197 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
198 | CONFIG_DEVTMPFS=y | 226 | CONFIG_DEVTMPFS=y |
199 | # CONFIG_FIRMWARE_IN_KERNEL is not set | 227 | # CONFIG_FIRMWARE_IN_KERNEL is not set |
200 | # CONFIG_FW_LOADER_USER_HELPER is not set | 228 | # CONFIG_FW_LOADER_USER_HELPER is not set |
@@ -206,6 +234,7 @@ CONFIG_BLK_DEV_NBD=m | |||
206 | CONFIG_BLK_DEV_RAM=y | 234 | CONFIG_BLK_DEV_RAM=y |
207 | CONFIG_CDROM_PKTCDVD=m | 235 | CONFIG_CDROM_PKTCDVD=m |
208 | CONFIG_ATA_OVER_ETH=m | 236 | CONFIG_ATA_OVER_ETH=m |
237 | CONFIG_DUMMY_IRQ=m | ||
209 | CONFIG_RAID_ATTRS=m | 238 | CONFIG_RAID_ATTRS=m |
210 | CONFIG_SCSI=y | 239 | CONFIG_SCSI=y |
211 | CONFIG_SCSI_TGT=m | 240 | CONFIG_SCSI_TGT=m |
@@ -243,12 +272,14 @@ CONFIG_EQUALIZER=m | |||
243 | CONFIG_NET_TEAM=m | 272 | CONFIG_NET_TEAM=m |
244 | CONFIG_NET_TEAM_MODE_BROADCAST=m | 273 | CONFIG_NET_TEAM_MODE_BROADCAST=m |
245 | CONFIG_NET_TEAM_MODE_ROUNDROBIN=m | 274 | CONFIG_NET_TEAM_MODE_ROUNDROBIN=m |
275 | CONFIG_NET_TEAM_MODE_RANDOM=m | ||
246 | CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m | 276 | CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m |
247 | CONFIG_NET_TEAM_MODE_LOADBALANCE=m | 277 | CONFIG_NET_TEAM_MODE_LOADBALANCE=m |
248 | CONFIG_VXLAN=m | 278 | CONFIG_VXLAN=m |
249 | CONFIG_NETCONSOLE=m | 279 | CONFIG_NETCONSOLE=m |
250 | CONFIG_NETCONSOLE_DYNAMIC=y | 280 | CONFIG_NETCONSOLE_DYNAMIC=y |
251 | CONFIG_VETH=m | 281 | CONFIG_VETH=m |
282 | # CONFIG_NET_VENDOR_ARC is not set | ||
252 | # CONFIG_NET_CADENCE is not set | 283 | # CONFIG_NET_CADENCE is not set |
253 | # CONFIG_NET_VENDOR_BROADCOM is not set | 284 | # CONFIG_NET_VENDOR_BROADCOM is not set |
254 | CONFIG_MVME16x_NET=y | 285 | CONFIG_MVME16x_NET=y |
@@ -257,6 +288,7 @@ CONFIG_MVME16x_NET=y | |||
257 | # CONFIG_NET_VENDOR_NATSEMI is not set | 288 | # CONFIG_NET_VENDOR_NATSEMI is not set |
258 | # CONFIG_NET_VENDOR_SEEQ is not set | 289 | # CONFIG_NET_VENDOR_SEEQ is not set |
259 | # CONFIG_NET_VENDOR_STMICRO is not set | 290 | # CONFIG_NET_VENDOR_STMICRO is not set |
291 | # CONFIG_NET_VENDOR_VIA is not set | ||
260 | # CONFIG_NET_VENDOR_WIZNET is not set | 292 | # CONFIG_NET_VENDOR_WIZNET is not set |
261 | CONFIG_PPP=m | 293 | CONFIG_PPP=m |
262 | CONFIG_PPP_BSDCOMP=m | 294 | CONFIG_PPP_BSDCOMP=m |
@@ -294,10 +326,6 @@ CONFIG_RTC_CLASS=y | |||
294 | CONFIG_RTC_DRV_GENERIC=m | 326 | CONFIG_RTC_DRV_GENERIC=m |
295 | # CONFIG_IOMMU_SUPPORT is not set | 327 | # CONFIG_IOMMU_SUPPORT is not set |
296 | CONFIG_PROC_HARDWARE=y | 328 | CONFIG_PROC_HARDWARE=y |
297 | CONFIG_EXT2_FS=y | ||
298 | CONFIG_EXT3_FS=y | ||
299 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set | ||
300 | # CONFIG_EXT3_FS_XATTR is not set | ||
301 | CONFIG_EXT4_FS=y | 329 | CONFIG_EXT4_FS=y |
302 | CONFIG_REISERFS_FS=m | 330 | CONFIG_REISERFS_FS=m |
303 | CONFIG_JFS_FS=m | 331 | CONFIG_JFS_FS=m |
@@ -334,7 +362,7 @@ CONFIG_QNX6FS_FS=m | |||
334 | CONFIG_SYSV_FS=m | 362 | CONFIG_SYSV_FS=m |
335 | CONFIG_UFS_FS=m | 363 | CONFIG_UFS_FS=m |
336 | CONFIG_NFS_FS=y | 364 | CONFIG_NFS_FS=y |
337 | CONFIG_NFS_V4=y | 365 | CONFIG_NFS_V4=m |
338 | CONFIG_NFS_SWAP=y | 366 | CONFIG_NFS_SWAP=y |
339 | CONFIG_ROOT_NFS=y | 367 | CONFIG_ROOT_NFS=y |
340 | CONFIG_NFSD=m | 368 | CONFIG_NFSD=m |
@@ -393,10 +421,11 @@ CONFIG_NLS_MAC_TURKISH=m | |||
393 | CONFIG_DLM=m | 421 | CONFIG_DLM=m |
394 | CONFIG_MAGIC_SYSRQ=y | 422 | CONFIG_MAGIC_SYSRQ=y |
395 | CONFIG_ASYNC_RAID6_TEST=m | 423 | CONFIG_ASYNC_RAID6_TEST=m |
424 | CONFIG_TEST_STRING_HELPERS=m | ||
425 | CONFIG_EARLY_PRINTK=y | ||
396 | CONFIG_ENCRYPTED_KEYS=m | 426 | CONFIG_ENCRYPTED_KEYS=m |
397 | CONFIG_CRYPTO_MANAGER=y | 427 | CONFIG_CRYPTO_MANAGER=y |
398 | CONFIG_CRYPTO_USER=m | 428 | CONFIG_CRYPTO_USER=m |
399 | CONFIG_CRYPTO_NULL=m | ||
400 | CONFIG_CRYPTO_CRYPTD=m | 429 | CONFIG_CRYPTO_CRYPTD=m |
401 | CONFIG_CRYPTO_TEST=m | 430 | CONFIG_CRYPTO_TEST=m |
402 | CONFIG_CRYPTO_CCM=m | 431 | CONFIG_CRYPTO_CCM=m |
@@ -429,6 +458,8 @@ CONFIG_CRYPTO_TEA=m | |||
429 | CONFIG_CRYPTO_TWOFISH=m | 458 | CONFIG_CRYPTO_TWOFISH=m |
430 | CONFIG_CRYPTO_ZLIB=m | 459 | CONFIG_CRYPTO_ZLIB=m |
431 | CONFIG_CRYPTO_LZO=m | 460 | CONFIG_CRYPTO_LZO=m |
461 | CONFIG_CRYPTO_LZ4=m | ||
462 | CONFIG_CRYPTO_LZ4HC=m | ||
432 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | 463 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
433 | CONFIG_CRYPTO_USER_API_HASH=m | 464 | CONFIG_CRYPTO_USER_API_HASH=m |
434 | CONFIG_CRYPTO_USER_API_SKCIPHER=m | 465 | CONFIG_CRYPTO_USER_API_SKCIPHER=m |
diff --git a/arch/m68k/configs/q40_defconfig b/arch/m68k/configs/q40_defconfig index be1496ed9b66..568e2a98f976 100644 --- a/arch/m68k/configs/q40_defconfig +++ b/arch/m68k/configs/q40_defconfig | |||
@@ -48,7 +48,6 @@ CONFIG_IP_PNP_RARP=y | |||
48 | CONFIG_NET_IPIP=m | 48 | CONFIG_NET_IPIP=m |
49 | CONFIG_NET_IPGRE_DEMUX=m | 49 | CONFIG_NET_IPGRE_DEMUX=m |
50 | CONFIG_NET_IPGRE=m | 50 | CONFIG_NET_IPGRE=m |
51 | CONFIG_SYN_COOKIES=y | ||
52 | CONFIG_NET_IPVTI=m | 51 | CONFIG_NET_IPVTI=m |
53 | CONFIG_INET_AH=m | 52 | CONFIG_INET_AH=m |
54 | CONFIG_INET_ESP=m | 53 | CONFIG_INET_ESP=m |
@@ -59,11 +58,11 @@ CONFIG_INET_XFRM_MODE_BEET=m | |||
59 | # CONFIG_INET_LRO is not set | 58 | # CONFIG_INET_LRO is not set |
60 | CONFIG_INET_DIAG=m | 59 | CONFIG_INET_DIAG=m |
61 | CONFIG_INET_UDP_DIAG=m | 60 | CONFIG_INET_UDP_DIAG=m |
62 | CONFIG_IPV6_PRIVACY=y | ||
63 | CONFIG_IPV6_ROUTER_PREF=y | 61 | CONFIG_IPV6_ROUTER_PREF=y |
64 | CONFIG_INET6_AH=m | 62 | CONFIG_INET6_AH=m |
65 | CONFIG_INET6_ESP=m | 63 | CONFIG_INET6_ESP=m |
66 | CONFIG_INET6_IPCOMP=m | 64 | CONFIG_INET6_IPCOMP=m |
65 | CONFIG_IPV6_VTI=m | ||
67 | CONFIG_IPV6_GRE=m | 66 | CONFIG_IPV6_GRE=m |
68 | CONFIG_NETFILTER=y | 67 | CONFIG_NETFILTER=y |
69 | CONFIG_NF_CONNTRACK=m | 68 | CONFIG_NF_CONNTRACK=m |
@@ -81,6 +80,17 @@ CONFIG_NF_CONNTRACK_PPTP=m | |||
81 | CONFIG_NF_CONNTRACK_SANE=m | 80 | CONFIG_NF_CONNTRACK_SANE=m |
82 | CONFIG_NF_CONNTRACK_SIP=m | 81 | CONFIG_NF_CONNTRACK_SIP=m |
83 | CONFIG_NF_CONNTRACK_TFTP=m | 82 | CONFIG_NF_CONNTRACK_TFTP=m |
83 | CONFIG_NF_TABLES=m | ||
84 | CONFIG_NFT_EXTHDR=m | ||
85 | CONFIG_NFT_META=m | ||
86 | CONFIG_NFT_CT=m | ||
87 | CONFIG_NFT_RBTREE=m | ||
88 | CONFIG_NFT_HASH=m | ||
89 | CONFIG_NFT_COUNTER=m | ||
90 | CONFIG_NFT_LOG=m | ||
91 | CONFIG_NFT_LIMIT=m | ||
92 | CONFIG_NFT_NAT=m | ||
93 | CONFIG_NFT_COMPAT=m | ||
84 | CONFIG_NETFILTER_XT_SET=m | 94 | CONFIG_NETFILTER_XT_SET=m |
85 | CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m | 95 | CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m |
86 | CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m | 96 | CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m |
@@ -94,6 +104,7 @@ CONFIG_NETFILTER_XT_TARGET_NFLOG=m | |||
94 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m | 104 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m |
95 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m | 105 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m |
96 | CONFIG_NETFILTER_XT_TARGET_TEE=m | 106 | CONFIG_NETFILTER_XT_TARGET_TEE=m |
107 | CONFIG_NETFILTER_XT_TARGET_TPROXY=m | ||
97 | CONFIG_NETFILTER_XT_TARGET_TRACE=m | 108 | CONFIG_NETFILTER_XT_TARGET_TRACE=m |
98 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m | 109 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m |
99 | CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m | 110 | CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m |
@@ -126,6 +137,7 @@ CONFIG_NETFILTER_XT_MATCH_QUOTA=m | |||
126 | CONFIG_NETFILTER_XT_MATCH_RATEEST=m | 137 | CONFIG_NETFILTER_XT_MATCH_RATEEST=m |
127 | CONFIG_NETFILTER_XT_MATCH_REALM=m | 138 | CONFIG_NETFILTER_XT_MATCH_REALM=m |
128 | CONFIG_NETFILTER_XT_MATCH_RECENT=m | 139 | CONFIG_NETFILTER_XT_MATCH_RECENT=m |
140 | CONFIG_NETFILTER_XT_MATCH_SOCKET=m | ||
129 | CONFIG_NETFILTER_XT_MATCH_STATE=m | 141 | CONFIG_NETFILTER_XT_MATCH_STATE=m |
130 | CONFIG_NETFILTER_XT_MATCH_STATISTIC=m | 142 | CONFIG_NETFILTER_XT_MATCH_STATISTIC=m |
131 | CONFIG_NETFILTER_XT_MATCH_STRING=m | 143 | CONFIG_NETFILTER_XT_MATCH_STRING=m |
@@ -140,11 +152,18 @@ CONFIG_IP_SET_HASH_IP=m | |||
140 | CONFIG_IP_SET_HASH_IPPORT=m | 152 | CONFIG_IP_SET_HASH_IPPORT=m |
141 | CONFIG_IP_SET_HASH_IPPORTIP=m | 153 | CONFIG_IP_SET_HASH_IPPORTIP=m |
142 | CONFIG_IP_SET_HASH_IPPORTNET=m | 154 | CONFIG_IP_SET_HASH_IPPORTNET=m |
155 | CONFIG_IP_SET_HASH_NETPORTNET=m | ||
143 | CONFIG_IP_SET_HASH_NET=m | 156 | CONFIG_IP_SET_HASH_NET=m |
157 | CONFIG_IP_SET_HASH_NETNET=m | ||
144 | CONFIG_IP_SET_HASH_NETPORT=m | 158 | CONFIG_IP_SET_HASH_NETPORT=m |
145 | CONFIG_IP_SET_HASH_NETIFACE=m | 159 | CONFIG_IP_SET_HASH_NETIFACE=m |
146 | CONFIG_IP_SET_LIST_SET=m | 160 | CONFIG_IP_SET_LIST_SET=m |
147 | CONFIG_NF_CONNTRACK_IPV4=m | 161 | CONFIG_NF_CONNTRACK_IPV4=m |
162 | CONFIG_NF_TABLES_IPV4=m | ||
163 | CONFIG_NFT_REJECT_IPV4=m | ||
164 | CONFIG_NFT_CHAIN_ROUTE_IPV4=m | ||
165 | CONFIG_NFT_CHAIN_NAT_IPV4=m | ||
166 | CONFIG_NF_TABLES_ARP=m | ||
148 | CONFIG_IP_NF_IPTABLES=m | 167 | CONFIG_IP_NF_IPTABLES=m |
149 | CONFIG_IP_NF_MATCH_AH=m | 168 | CONFIG_IP_NF_MATCH_AH=m |
150 | CONFIG_IP_NF_MATCH_ECN=m | 169 | CONFIG_IP_NF_MATCH_ECN=m |
@@ -152,6 +171,7 @@ CONFIG_IP_NF_MATCH_RPFILTER=m | |||
152 | CONFIG_IP_NF_MATCH_TTL=m | 171 | CONFIG_IP_NF_MATCH_TTL=m |
153 | CONFIG_IP_NF_FILTER=m | 172 | CONFIG_IP_NF_FILTER=m |
154 | CONFIG_IP_NF_TARGET_REJECT=m | 173 | CONFIG_IP_NF_TARGET_REJECT=m |
174 | CONFIG_IP_NF_TARGET_SYNPROXY=m | ||
155 | CONFIG_IP_NF_TARGET_ULOG=m | 175 | CONFIG_IP_NF_TARGET_ULOG=m |
156 | CONFIG_NF_NAT_IPV4=m | 176 | CONFIG_NF_NAT_IPV4=m |
157 | CONFIG_IP_NF_TARGET_MASQUERADE=m | 177 | CONFIG_IP_NF_TARGET_MASQUERADE=m |
@@ -166,6 +186,9 @@ CONFIG_IP_NF_ARPTABLES=m | |||
166 | CONFIG_IP_NF_ARPFILTER=m | 186 | CONFIG_IP_NF_ARPFILTER=m |
167 | CONFIG_IP_NF_ARP_MANGLE=m | 187 | CONFIG_IP_NF_ARP_MANGLE=m |
168 | CONFIG_NF_CONNTRACK_IPV6=m | 188 | CONFIG_NF_CONNTRACK_IPV6=m |
189 | CONFIG_NF_TABLES_IPV6=m | ||
190 | CONFIG_NFT_CHAIN_ROUTE_IPV6=m | ||
191 | CONFIG_NFT_CHAIN_NAT_IPV6=m | ||
169 | CONFIG_IP6_NF_IPTABLES=m | 192 | CONFIG_IP6_NF_IPTABLES=m |
170 | CONFIG_IP6_NF_MATCH_AH=m | 193 | CONFIG_IP6_NF_MATCH_AH=m |
171 | CONFIG_IP6_NF_MATCH_EUI64=m | 194 | CONFIG_IP6_NF_MATCH_EUI64=m |
@@ -179,11 +202,13 @@ CONFIG_IP6_NF_MATCH_RT=m | |||
179 | CONFIG_IP6_NF_TARGET_HL=m | 202 | CONFIG_IP6_NF_TARGET_HL=m |
180 | CONFIG_IP6_NF_FILTER=m | 203 | CONFIG_IP6_NF_FILTER=m |
181 | CONFIG_IP6_NF_TARGET_REJECT=m | 204 | CONFIG_IP6_NF_TARGET_REJECT=m |
205 | CONFIG_IP6_NF_TARGET_SYNPROXY=m | ||
182 | CONFIG_IP6_NF_MANGLE=m | 206 | CONFIG_IP6_NF_MANGLE=m |
183 | CONFIG_IP6_NF_RAW=m | 207 | CONFIG_IP6_NF_RAW=m |
184 | CONFIG_NF_NAT_IPV6=m | 208 | CONFIG_NF_NAT_IPV6=m |
185 | CONFIG_IP6_NF_TARGET_MASQUERADE=m | 209 | CONFIG_IP6_NF_TARGET_MASQUERADE=m |
186 | CONFIG_IP6_NF_TARGET_NPT=m | 210 | CONFIG_IP6_NF_TARGET_NPT=m |
211 | CONFIG_NF_TABLES_BRIDGE=m | ||
187 | CONFIG_IP_DCCP=m | 212 | CONFIG_IP_DCCP=m |
188 | # CONFIG_IP_DCCP_CCID3 is not set | 213 | # CONFIG_IP_DCCP_CCID3 is not set |
189 | CONFIG_SCTP_COOKIE_HMAC_SHA1=y | 214 | CONFIG_SCTP_COOKIE_HMAC_SHA1=y |
@@ -191,10 +216,13 @@ CONFIG_RDS=m | |||
191 | CONFIG_RDS_TCP=m | 216 | CONFIG_RDS_TCP=m |
192 | CONFIG_L2TP=m | 217 | CONFIG_L2TP=m |
193 | CONFIG_ATALK=m | 218 | CONFIG_ATALK=m |
219 | CONFIG_DNS_RESOLVER=y | ||
194 | CONFIG_BATMAN_ADV=m | 220 | CONFIG_BATMAN_ADV=m |
195 | CONFIG_BATMAN_ADV_DAT=y | 221 | CONFIG_BATMAN_ADV_DAT=y |
222 | CONFIG_BATMAN_ADV_NC=y | ||
223 | CONFIG_NETLINK_DIAG=m | ||
224 | CONFIG_NET_MPLS_GSO=m | ||
196 | # CONFIG_WIRELESS is not set | 225 | # CONFIG_WIRELESS is not set |
197 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
198 | CONFIG_DEVTMPFS=y | 226 | CONFIG_DEVTMPFS=y |
199 | # CONFIG_FIRMWARE_IN_KERNEL is not set | 227 | # CONFIG_FIRMWARE_IN_KERNEL is not set |
200 | # CONFIG_FW_LOADER_USER_HELPER is not set | 228 | # CONFIG_FW_LOADER_USER_HELPER is not set |
@@ -209,6 +237,7 @@ CONFIG_BLK_DEV_NBD=m | |||
209 | CONFIG_BLK_DEV_RAM=y | 237 | CONFIG_BLK_DEV_RAM=y |
210 | CONFIG_CDROM_PKTCDVD=m | 238 | CONFIG_CDROM_PKTCDVD=m |
211 | CONFIG_ATA_OVER_ETH=m | 239 | CONFIG_ATA_OVER_ETH=m |
240 | CONFIG_DUMMY_IRQ=m | ||
212 | CONFIG_IDE=y | 241 | CONFIG_IDE=y |
213 | CONFIG_IDE_GD_ATAPI=y | 242 | CONFIG_IDE_GD_ATAPI=y |
214 | CONFIG_BLK_DEV_IDECD=y | 243 | CONFIG_BLK_DEV_IDECD=y |
@@ -249,6 +278,7 @@ CONFIG_EQUALIZER=m | |||
249 | CONFIG_NET_TEAM=m | 278 | CONFIG_NET_TEAM=m |
250 | CONFIG_NET_TEAM_MODE_BROADCAST=m | 279 | CONFIG_NET_TEAM_MODE_BROADCAST=m |
251 | CONFIG_NET_TEAM_MODE_ROUNDROBIN=m | 280 | CONFIG_NET_TEAM_MODE_ROUNDROBIN=m |
281 | CONFIG_NET_TEAM_MODE_RANDOM=m | ||
252 | CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m | 282 | CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m |
253 | CONFIG_NET_TEAM_MODE_LOADBALANCE=m | 283 | CONFIG_NET_TEAM_MODE_LOADBALANCE=m |
254 | CONFIG_VXLAN=m | 284 | CONFIG_VXLAN=m |
@@ -257,10 +287,10 @@ CONFIG_NETCONSOLE_DYNAMIC=y | |||
257 | CONFIG_VETH=m | 287 | CONFIG_VETH=m |
258 | # CONFIG_NET_VENDOR_3COM is not set | 288 | # CONFIG_NET_VENDOR_3COM is not set |
259 | # CONFIG_NET_VENDOR_AMD is not set | 289 | # CONFIG_NET_VENDOR_AMD is not set |
290 | # CONFIG_NET_VENDOR_ARC is not set | ||
260 | # CONFIG_NET_CADENCE is not set | 291 | # CONFIG_NET_CADENCE is not set |
261 | # CONFIG_NET_VENDOR_BROADCOM is not set | 292 | # CONFIG_NET_VENDOR_BROADCOM is not set |
262 | # CONFIG_NET_VENDOR_CIRRUS is not set | 293 | # CONFIG_NET_VENDOR_CIRRUS is not set |
263 | # CONFIG_NET_VENDOR_FUJITSU is not set | ||
264 | # CONFIG_NET_VENDOR_HP is not set | 294 | # CONFIG_NET_VENDOR_HP is not set |
265 | # CONFIG_NET_VENDOR_INTEL is not set | 295 | # CONFIG_NET_VENDOR_INTEL is not set |
266 | # CONFIG_NET_VENDOR_MARVELL is not set | 296 | # CONFIG_NET_VENDOR_MARVELL is not set |
@@ -269,6 +299,7 @@ CONFIG_NE2000=m | |||
269 | # CONFIG_NET_VENDOR_SEEQ is not set | 299 | # CONFIG_NET_VENDOR_SEEQ is not set |
270 | # CONFIG_NET_VENDOR_SMSC is not set | 300 | # CONFIG_NET_VENDOR_SMSC is not set |
271 | # CONFIG_NET_VENDOR_STMICRO is not set | 301 | # CONFIG_NET_VENDOR_STMICRO is not set |
302 | # CONFIG_NET_VENDOR_VIA is not set | ||
272 | # CONFIG_NET_VENDOR_WIZNET is not set | 303 | # CONFIG_NET_VENDOR_WIZNET is not set |
273 | CONFIG_PLIP=m | 304 | CONFIG_PLIP=m |
274 | CONFIG_PPP=m | 305 | CONFIG_PPP=m |
@@ -293,7 +324,6 @@ CONFIG_MOUSE_SERIAL=m | |||
293 | CONFIG_INPUT_MISC=y | 324 | CONFIG_INPUT_MISC=y |
294 | CONFIG_INPUT_M68K_BEEP=m | 325 | CONFIG_INPUT_M68K_BEEP=m |
295 | CONFIG_SERIO_Q40KBD=y | 326 | CONFIG_SERIO_Q40KBD=y |
296 | CONFIG_VT_HW_CONSOLE_BINDING=y | ||
297 | # CONFIG_LEGACY_PTYS is not set | 327 | # CONFIG_LEGACY_PTYS is not set |
298 | # CONFIG_DEVKMEM is not set | 328 | # CONFIG_DEVKMEM is not set |
299 | CONFIG_PRINTER=m | 329 | CONFIG_PRINTER=m |
@@ -318,10 +348,6 @@ CONFIG_RTC_DRV_GENERIC=m | |||
318 | # CONFIG_IOMMU_SUPPORT is not set | 348 | # CONFIG_IOMMU_SUPPORT is not set |
319 | CONFIG_HEARTBEAT=y | 349 | CONFIG_HEARTBEAT=y |
320 | CONFIG_PROC_HARDWARE=y | 350 | CONFIG_PROC_HARDWARE=y |
321 | CONFIG_EXT2_FS=y | ||
322 | CONFIG_EXT3_FS=y | ||
323 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set | ||
324 | # CONFIG_EXT3_FS_XATTR is not set | ||
325 | CONFIG_EXT4_FS=y | 351 | CONFIG_EXT4_FS=y |
326 | CONFIG_REISERFS_FS=m | 352 | CONFIG_REISERFS_FS=m |
327 | CONFIG_JFS_FS=m | 353 | CONFIG_JFS_FS=m |
@@ -358,7 +384,7 @@ CONFIG_QNX6FS_FS=m | |||
358 | CONFIG_SYSV_FS=m | 384 | CONFIG_SYSV_FS=m |
359 | CONFIG_UFS_FS=m | 385 | CONFIG_UFS_FS=m |
360 | CONFIG_NFS_FS=y | 386 | CONFIG_NFS_FS=y |
361 | CONFIG_NFS_V4=y | 387 | CONFIG_NFS_V4=m |
362 | CONFIG_NFS_SWAP=y | 388 | CONFIG_NFS_SWAP=y |
363 | CONFIG_ROOT_NFS=y | 389 | CONFIG_ROOT_NFS=y |
364 | CONFIG_NFSD=m | 390 | CONFIG_NFSD=m |
@@ -417,10 +443,10 @@ CONFIG_NLS_MAC_TURKISH=m | |||
417 | CONFIG_DLM=m | 443 | CONFIG_DLM=m |
418 | CONFIG_MAGIC_SYSRQ=y | 444 | CONFIG_MAGIC_SYSRQ=y |
419 | CONFIG_ASYNC_RAID6_TEST=m | 445 | CONFIG_ASYNC_RAID6_TEST=m |
446 | CONFIG_TEST_STRING_HELPERS=m | ||
420 | CONFIG_ENCRYPTED_KEYS=m | 447 | CONFIG_ENCRYPTED_KEYS=m |
421 | CONFIG_CRYPTO_MANAGER=y | 448 | CONFIG_CRYPTO_MANAGER=y |
422 | CONFIG_CRYPTO_USER=m | 449 | CONFIG_CRYPTO_USER=m |
423 | CONFIG_CRYPTO_NULL=m | ||
424 | CONFIG_CRYPTO_CRYPTD=m | 450 | CONFIG_CRYPTO_CRYPTD=m |
425 | CONFIG_CRYPTO_TEST=m | 451 | CONFIG_CRYPTO_TEST=m |
426 | CONFIG_CRYPTO_CCM=m | 452 | CONFIG_CRYPTO_CCM=m |
@@ -453,6 +479,8 @@ CONFIG_CRYPTO_TEA=m | |||
453 | CONFIG_CRYPTO_TWOFISH=m | 479 | CONFIG_CRYPTO_TWOFISH=m |
454 | CONFIG_CRYPTO_ZLIB=m | 480 | CONFIG_CRYPTO_ZLIB=m |
455 | CONFIG_CRYPTO_LZO=m | 481 | CONFIG_CRYPTO_LZO=m |
482 | CONFIG_CRYPTO_LZ4=m | ||
483 | CONFIG_CRYPTO_LZ4HC=m | ||
456 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | 484 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
457 | CONFIG_CRYPTO_USER_API_HASH=m | 485 | CONFIG_CRYPTO_USER_API_HASH=m |
458 | CONFIG_CRYPTO_USER_API_SKCIPHER=m | 486 | CONFIG_CRYPTO_USER_API_SKCIPHER=m |
diff --git a/arch/m68k/configs/sun3_defconfig b/arch/m68k/configs/sun3_defconfig index 54674d61e001..60b0aeac5742 100644 --- a/arch/m68k/configs/sun3_defconfig +++ b/arch/m68k/configs/sun3_defconfig | |||
@@ -45,7 +45,6 @@ CONFIG_IP_PNP_RARP=y | |||
45 | CONFIG_NET_IPIP=m | 45 | CONFIG_NET_IPIP=m |
46 | CONFIG_NET_IPGRE_DEMUX=m | 46 | CONFIG_NET_IPGRE_DEMUX=m |
47 | CONFIG_NET_IPGRE=m | 47 | CONFIG_NET_IPGRE=m |
48 | CONFIG_SYN_COOKIES=y | ||
49 | CONFIG_NET_IPVTI=m | 48 | CONFIG_NET_IPVTI=m |
50 | CONFIG_INET_AH=m | 49 | CONFIG_INET_AH=m |
51 | CONFIG_INET_ESP=m | 50 | CONFIG_INET_ESP=m |
@@ -56,11 +55,11 @@ CONFIG_INET_XFRM_MODE_BEET=m | |||
56 | # CONFIG_INET_LRO is not set | 55 | # CONFIG_INET_LRO is not set |
57 | CONFIG_INET_DIAG=m | 56 | CONFIG_INET_DIAG=m |
58 | CONFIG_INET_UDP_DIAG=m | 57 | CONFIG_INET_UDP_DIAG=m |
59 | CONFIG_IPV6_PRIVACY=y | ||
60 | CONFIG_IPV6_ROUTER_PREF=y | 58 | CONFIG_IPV6_ROUTER_PREF=y |
61 | CONFIG_INET6_AH=m | 59 | CONFIG_INET6_AH=m |
62 | CONFIG_INET6_ESP=m | 60 | CONFIG_INET6_ESP=m |
63 | CONFIG_INET6_IPCOMP=m | 61 | CONFIG_INET6_IPCOMP=m |
62 | CONFIG_IPV6_VTI=m | ||
64 | CONFIG_IPV6_GRE=m | 63 | CONFIG_IPV6_GRE=m |
65 | CONFIG_NETFILTER=y | 64 | CONFIG_NETFILTER=y |
66 | CONFIG_NF_CONNTRACK=m | 65 | CONFIG_NF_CONNTRACK=m |
@@ -78,6 +77,17 @@ CONFIG_NF_CONNTRACK_PPTP=m | |||
78 | CONFIG_NF_CONNTRACK_SANE=m | 77 | CONFIG_NF_CONNTRACK_SANE=m |
79 | CONFIG_NF_CONNTRACK_SIP=m | 78 | CONFIG_NF_CONNTRACK_SIP=m |
80 | CONFIG_NF_CONNTRACK_TFTP=m | 79 | CONFIG_NF_CONNTRACK_TFTP=m |
80 | CONFIG_NF_TABLES=m | ||
81 | CONFIG_NFT_EXTHDR=m | ||
82 | CONFIG_NFT_META=m | ||
83 | CONFIG_NFT_CT=m | ||
84 | CONFIG_NFT_RBTREE=m | ||
85 | CONFIG_NFT_HASH=m | ||
86 | CONFIG_NFT_COUNTER=m | ||
87 | CONFIG_NFT_LOG=m | ||
88 | CONFIG_NFT_LIMIT=m | ||
89 | CONFIG_NFT_NAT=m | ||
90 | CONFIG_NFT_COMPAT=m | ||
81 | CONFIG_NETFILTER_XT_SET=m | 91 | CONFIG_NETFILTER_XT_SET=m |
82 | CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m | 92 | CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m |
83 | CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m | 93 | CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m |
@@ -91,6 +101,7 @@ CONFIG_NETFILTER_XT_TARGET_NFLOG=m | |||
91 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m | 101 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m |
92 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m | 102 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m |
93 | CONFIG_NETFILTER_XT_TARGET_TEE=m | 103 | CONFIG_NETFILTER_XT_TARGET_TEE=m |
104 | CONFIG_NETFILTER_XT_TARGET_TPROXY=m | ||
94 | CONFIG_NETFILTER_XT_TARGET_TRACE=m | 105 | CONFIG_NETFILTER_XT_TARGET_TRACE=m |
95 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m | 106 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m |
96 | CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m | 107 | CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m |
@@ -123,6 +134,7 @@ CONFIG_NETFILTER_XT_MATCH_QUOTA=m | |||
123 | CONFIG_NETFILTER_XT_MATCH_RATEEST=m | 134 | CONFIG_NETFILTER_XT_MATCH_RATEEST=m |
124 | CONFIG_NETFILTER_XT_MATCH_REALM=m | 135 | CONFIG_NETFILTER_XT_MATCH_REALM=m |
125 | CONFIG_NETFILTER_XT_MATCH_RECENT=m | 136 | CONFIG_NETFILTER_XT_MATCH_RECENT=m |
137 | CONFIG_NETFILTER_XT_MATCH_SOCKET=m | ||
126 | CONFIG_NETFILTER_XT_MATCH_STATE=m | 138 | CONFIG_NETFILTER_XT_MATCH_STATE=m |
127 | CONFIG_NETFILTER_XT_MATCH_STATISTIC=m | 139 | CONFIG_NETFILTER_XT_MATCH_STATISTIC=m |
128 | CONFIG_NETFILTER_XT_MATCH_STRING=m | 140 | CONFIG_NETFILTER_XT_MATCH_STRING=m |
@@ -137,11 +149,18 @@ CONFIG_IP_SET_HASH_IP=m | |||
137 | CONFIG_IP_SET_HASH_IPPORT=m | 149 | CONFIG_IP_SET_HASH_IPPORT=m |
138 | CONFIG_IP_SET_HASH_IPPORTIP=m | 150 | CONFIG_IP_SET_HASH_IPPORTIP=m |
139 | CONFIG_IP_SET_HASH_IPPORTNET=m | 151 | CONFIG_IP_SET_HASH_IPPORTNET=m |
152 | CONFIG_IP_SET_HASH_NETPORTNET=m | ||
140 | CONFIG_IP_SET_HASH_NET=m | 153 | CONFIG_IP_SET_HASH_NET=m |
154 | CONFIG_IP_SET_HASH_NETNET=m | ||
141 | CONFIG_IP_SET_HASH_NETPORT=m | 155 | CONFIG_IP_SET_HASH_NETPORT=m |
142 | CONFIG_IP_SET_HASH_NETIFACE=m | 156 | CONFIG_IP_SET_HASH_NETIFACE=m |
143 | CONFIG_IP_SET_LIST_SET=m | 157 | CONFIG_IP_SET_LIST_SET=m |
144 | CONFIG_NF_CONNTRACK_IPV4=m | 158 | CONFIG_NF_CONNTRACK_IPV4=m |
159 | CONFIG_NF_TABLES_IPV4=m | ||
160 | CONFIG_NFT_REJECT_IPV4=m | ||
161 | CONFIG_NFT_CHAIN_ROUTE_IPV4=m | ||
162 | CONFIG_NFT_CHAIN_NAT_IPV4=m | ||
163 | CONFIG_NF_TABLES_ARP=m | ||
145 | CONFIG_IP_NF_IPTABLES=m | 164 | CONFIG_IP_NF_IPTABLES=m |
146 | CONFIG_IP_NF_MATCH_AH=m | 165 | CONFIG_IP_NF_MATCH_AH=m |
147 | CONFIG_IP_NF_MATCH_ECN=m | 166 | CONFIG_IP_NF_MATCH_ECN=m |
@@ -149,6 +168,7 @@ CONFIG_IP_NF_MATCH_RPFILTER=m | |||
149 | CONFIG_IP_NF_MATCH_TTL=m | 168 | CONFIG_IP_NF_MATCH_TTL=m |
150 | CONFIG_IP_NF_FILTER=m | 169 | CONFIG_IP_NF_FILTER=m |
151 | CONFIG_IP_NF_TARGET_REJECT=m | 170 | CONFIG_IP_NF_TARGET_REJECT=m |
171 | CONFIG_IP_NF_TARGET_SYNPROXY=m | ||
152 | CONFIG_IP_NF_TARGET_ULOG=m | 172 | CONFIG_IP_NF_TARGET_ULOG=m |
153 | CONFIG_NF_NAT_IPV4=m | 173 | CONFIG_NF_NAT_IPV4=m |
154 | CONFIG_IP_NF_TARGET_MASQUERADE=m | 174 | CONFIG_IP_NF_TARGET_MASQUERADE=m |
@@ -163,6 +183,9 @@ CONFIG_IP_NF_ARPTABLES=m | |||
163 | CONFIG_IP_NF_ARPFILTER=m | 183 | CONFIG_IP_NF_ARPFILTER=m |
164 | CONFIG_IP_NF_ARP_MANGLE=m | 184 | CONFIG_IP_NF_ARP_MANGLE=m |
165 | CONFIG_NF_CONNTRACK_IPV6=m | 185 | CONFIG_NF_CONNTRACK_IPV6=m |
186 | CONFIG_NF_TABLES_IPV6=m | ||
187 | CONFIG_NFT_CHAIN_ROUTE_IPV6=m | ||
188 | CONFIG_NFT_CHAIN_NAT_IPV6=m | ||
166 | CONFIG_IP6_NF_IPTABLES=m | 189 | CONFIG_IP6_NF_IPTABLES=m |
167 | CONFIG_IP6_NF_MATCH_AH=m | 190 | CONFIG_IP6_NF_MATCH_AH=m |
168 | CONFIG_IP6_NF_MATCH_EUI64=m | 191 | CONFIG_IP6_NF_MATCH_EUI64=m |
@@ -176,11 +199,13 @@ CONFIG_IP6_NF_MATCH_RT=m | |||
176 | CONFIG_IP6_NF_TARGET_HL=m | 199 | CONFIG_IP6_NF_TARGET_HL=m |
177 | CONFIG_IP6_NF_FILTER=m | 200 | CONFIG_IP6_NF_FILTER=m |
178 | CONFIG_IP6_NF_TARGET_REJECT=m | 201 | CONFIG_IP6_NF_TARGET_REJECT=m |
202 | CONFIG_IP6_NF_TARGET_SYNPROXY=m | ||
179 | CONFIG_IP6_NF_MANGLE=m | 203 | CONFIG_IP6_NF_MANGLE=m |
180 | CONFIG_IP6_NF_RAW=m | 204 | CONFIG_IP6_NF_RAW=m |
181 | CONFIG_NF_NAT_IPV6=m | 205 | CONFIG_NF_NAT_IPV6=m |
182 | CONFIG_IP6_NF_TARGET_MASQUERADE=m | 206 | CONFIG_IP6_NF_TARGET_MASQUERADE=m |
183 | CONFIG_IP6_NF_TARGET_NPT=m | 207 | CONFIG_IP6_NF_TARGET_NPT=m |
208 | CONFIG_NF_TABLES_BRIDGE=m | ||
184 | CONFIG_IP_DCCP=m | 209 | CONFIG_IP_DCCP=m |
185 | # CONFIG_IP_DCCP_CCID3 is not set | 210 | # CONFIG_IP_DCCP_CCID3 is not set |
186 | CONFIG_SCTP_COOKIE_HMAC_SHA1=y | 211 | CONFIG_SCTP_COOKIE_HMAC_SHA1=y |
@@ -188,10 +213,13 @@ CONFIG_RDS=m | |||
188 | CONFIG_RDS_TCP=m | 213 | CONFIG_RDS_TCP=m |
189 | CONFIG_L2TP=m | 214 | CONFIG_L2TP=m |
190 | CONFIG_ATALK=m | 215 | CONFIG_ATALK=m |
216 | CONFIG_DNS_RESOLVER=y | ||
191 | CONFIG_BATMAN_ADV=m | 217 | CONFIG_BATMAN_ADV=m |
192 | CONFIG_BATMAN_ADV_DAT=y | 218 | CONFIG_BATMAN_ADV_DAT=y |
219 | CONFIG_BATMAN_ADV_NC=y | ||
220 | CONFIG_NETLINK_DIAG=m | ||
221 | CONFIG_NET_MPLS_GSO=m | ||
193 | # CONFIG_WIRELESS is not set | 222 | # CONFIG_WIRELESS is not set |
194 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
195 | CONFIG_DEVTMPFS=y | 223 | CONFIG_DEVTMPFS=y |
196 | # CONFIG_FIRMWARE_IN_KERNEL is not set | 224 | # CONFIG_FIRMWARE_IN_KERNEL is not set |
197 | # CONFIG_FW_LOADER_USER_HELPER is not set | 225 | # CONFIG_FW_LOADER_USER_HELPER is not set |
@@ -203,6 +231,7 @@ CONFIG_BLK_DEV_NBD=m | |||
203 | CONFIG_BLK_DEV_RAM=y | 231 | CONFIG_BLK_DEV_RAM=y |
204 | CONFIG_CDROM_PKTCDVD=m | 232 | CONFIG_CDROM_PKTCDVD=m |
205 | CONFIG_ATA_OVER_ETH=m | 233 | CONFIG_ATA_OVER_ETH=m |
234 | CONFIG_DUMMY_IRQ=m | ||
206 | CONFIG_RAID_ATTRS=m | 235 | CONFIG_RAID_ATTRS=m |
207 | CONFIG_SCSI=y | 236 | CONFIG_SCSI=y |
208 | CONFIG_SCSI_TGT=m | 237 | CONFIG_SCSI_TGT=m |
@@ -240,6 +269,7 @@ CONFIG_EQUALIZER=m | |||
240 | CONFIG_NET_TEAM=m | 269 | CONFIG_NET_TEAM=m |
241 | CONFIG_NET_TEAM_MODE_BROADCAST=m | 270 | CONFIG_NET_TEAM_MODE_BROADCAST=m |
242 | CONFIG_NET_TEAM_MODE_ROUNDROBIN=m | 271 | CONFIG_NET_TEAM_MODE_ROUNDROBIN=m |
272 | CONFIG_NET_TEAM_MODE_RANDOM=m | ||
243 | CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m | 273 | CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m |
244 | CONFIG_NET_TEAM_MODE_LOADBALANCE=m | 274 | CONFIG_NET_TEAM_MODE_LOADBALANCE=m |
245 | CONFIG_VXLAN=m | 275 | CONFIG_VXLAN=m |
@@ -247,6 +277,7 @@ CONFIG_NETCONSOLE=m | |||
247 | CONFIG_NETCONSOLE_DYNAMIC=y | 277 | CONFIG_NETCONSOLE_DYNAMIC=y |
248 | CONFIG_VETH=m | 278 | CONFIG_VETH=m |
249 | CONFIG_SUN3LANCE=y | 279 | CONFIG_SUN3LANCE=y |
280 | # CONFIG_NET_VENDOR_ARC is not set | ||
250 | # CONFIG_NET_CADENCE is not set | 281 | # CONFIG_NET_CADENCE is not set |
251 | CONFIG_SUN3_82586=y | 282 | CONFIG_SUN3_82586=y |
252 | # CONFIG_NET_VENDOR_MARVELL is not set | 283 | # CONFIG_NET_VENDOR_MARVELL is not set |
@@ -255,6 +286,7 @@ CONFIG_SUN3_82586=y | |||
255 | # CONFIG_NET_VENDOR_SEEQ is not set | 286 | # CONFIG_NET_VENDOR_SEEQ is not set |
256 | # CONFIG_NET_VENDOR_STMICRO is not set | 287 | # CONFIG_NET_VENDOR_STMICRO is not set |
257 | # CONFIG_NET_VENDOR_SUN is not set | 288 | # CONFIG_NET_VENDOR_SUN is not set |
289 | # CONFIG_NET_VENDOR_VIA is not set | ||
258 | # CONFIG_NET_VENDOR_WIZNET is not set | 290 | # CONFIG_NET_VENDOR_WIZNET is not set |
259 | CONFIG_PPP=m | 291 | CONFIG_PPP=m |
260 | CONFIG_PPP_BSDCOMP=m | 292 | CONFIG_PPP_BSDCOMP=m |
@@ -276,7 +308,6 @@ CONFIG_INPUT_EVDEV=m | |||
276 | CONFIG_KEYBOARD_SUNKBD=y | 308 | CONFIG_KEYBOARD_SUNKBD=y |
277 | # CONFIG_MOUSE_PS2 is not set | 309 | # CONFIG_MOUSE_PS2 is not set |
278 | CONFIG_MOUSE_SERIAL=m | 310 | CONFIG_MOUSE_SERIAL=m |
279 | CONFIG_VT_HW_CONSOLE_BINDING=y | ||
280 | # CONFIG_LEGACY_PTYS is not set | 311 | # CONFIG_LEGACY_PTYS is not set |
281 | # CONFIG_DEVKMEM is not set | 312 | # CONFIG_DEVKMEM is not set |
282 | # CONFIG_HW_RANDOM is not set | 313 | # CONFIG_HW_RANDOM is not set |
@@ -296,10 +327,6 @@ CONFIG_RTC_CLASS=y | |||
296 | CONFIG_RTC_DRV_GENERIC=m | 327 | CONFIG_RTC_DRV_GENERIC=m |
297 | # CONFIG_IOMMU_SUPPORT is not set | 328 | # CONFIG_IOMMU_SUPPORT is not set |
298 | CONFIG_PROC_HARDWARE=y | 329 | CONFIG_PROC_HARDWARE=y |
299 | CONFIG_EXT2_FS=y | ||
300 | CONFIG_EXT3_FS=y | ||
301 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set | ||
302 | # CONFIG_EXT3_FS_XATTR is not set | ||
303 | CONFIG_EXT4_FS=y | 330 | CONFIG_EXT4_FS=y |
304 | CONFIG_REISERFS_FS=m | 331 | CONFIG_REISERFS_FS=m |
305 | CONFIG_JFS_FS=m | 332 | CONFIG_JFS_FS=m |
@@ -336,7 +363,7 @@ CONFIG_QNX6FS_FS=m | |||
336 | CONFIG_SYSV_FS=m | 363 | CONFIG_SYSV_FS=m |
337 | CONFIG_UFS_FS=m | 364 | CONFIG_UFS_FS=m |
338 | CONFIG_NFS_FS=y | 365 | CONFIG_NFS_FS=y |
339 | CONFIG_NFS_V4=y | 366 | CONFIG_NFS_V4=m |
340 | CONFIG_NFS_SWAP=y | 367 | CONFIG_NFS_SWAP=y |
341 | CONFIG_ROOT_NFS=y | 368 | CONFIG_ROOT_NFS=y |
342 | CONFIG_NFSD=m | 369 | CONFIG_NFSD=m |
@@ -395,10 +422,10 @@ CONFIG_NLS_MAC_TURKISH=m | |||
395 | CONFIG_DLM=m | 422 | CONFIG_DLM=m |
396 | CONFIG_MAGIC_SYSRQ=y | 423 | CONFIG_MAGIC_SYSRQ=y |
397 | CONFIG_ASYNC_RAID6_TEST=m | 424 | CONFIG_ASYNC_RAID6_TEST=m |
425 | CONFIG_TEST_STRING_HELPERS=m | ||
398 | CONFIG_ENCRYPTED_KEYS=m | 426 | CONFIG_ENCRYPTED_KEYS=m |
399 | CONFIG_CRYPTO_MANAGER=y | 427 | CONFIG_CRYPTO_MANAGER=y |
400 | CONFIG_CRYPTO_USER=m | 428 | CONFIG_CRYPTO_USER=m |
401 | CONFIG_CRYPTO_NULL=m | ||
402 | CONFIG_CRYPTO_CRYPTD=m | 429 | CONFIG_CRYPTO_CRYPTD=m |
403 | CONFIG_CRYPTO_TEST=m | 430 | CONFIG_CRYPTO_TEST=m |
404 | CONFIG_CRYPTO_CCM=m | 431 | CONFIG_CRYPTO_CCM=m |
@@ -431,6 +458,8 @@ CONFIG_CRYPTO_TEA=m | |||
431 | CONFIG_CRYPTO_TWOFISH=m | 458 | CONFIG_CRYPTO_TWOFISH=m |
432 | CONFIG_CRYPTO_ZLIB=m | 459 | CONFIG_CRYPTO_ZLIB=m |
433 | CONFIG_CRYPTO_LZO=m | 460 | CONFIG_CRYPTO_LZO=m |
461 | CONFIG_CRYPTO_LZ4=m | ||
462 | CONFIG_CRYPTO_LZ4HC=m | ||
434 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | 463 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
435 | CONFIG_CRYPTO_USER_API_HASH=m | 464 | CONFIG_CRYPTO_USER_API_HASH=m |
436 | CONFIG_CRYPTO_USER_API_SKCIPHER=m | 465 | CONFIG_CRYPTO_USER_API_SKCIPHER=m |
diff --git a/arch/m68k/configs/sun3x_defconfig b/arch/m68k/configs/sun3x_defconfig index 832d9539f441..21bda331eebb 100644 --- a/arch/m68k/configs/sun3x_defconfig +++ b/arch/m68k/configs/sun3x_defconfig | |||
@@ -45,7 +45,6 @@ CONFIG_IP_PNP_RARP=y | |||
45 | CONFIG_NET_IPIP=m | 45 | CONFIG_NET_IPIP=m |
46 | CONFIG_NET_IPGRE_DEMUX=m | 46 | CONFIG_NET_IPGRE_DEMUX=m |
47 | CONFIG_NET_IPGRE=m | 47 | CONFIG_NET_IPGRE=m |
48 | CONFIG_SYN_COOKIES=y | ||
49 | CONFIG_NET_IPVTI=m | 48 | CONFIG_NET_IPVTI=m |
50 | CONFIG_INET_AH=m | 49 | CONFIG_INET_AH=m |
51 | CONFIG_INET_ESP=m | 50 | CONFIG_INET_ESP=m |
@@ -56,11 +55,11 @@ CONFIG_INET_XFRM_MODE_BEET=m | |||
56 | # CONFIG_INET_LRO is not set | 55 | # CONFIG_INET_LRO is not set |
57 | CONFIG_INET_DIAG=m | 56 | CONFIG_INET_DIAG=m |
58 | CONFIG_INET_UDP_DIAG=m | 57 | CONFIG_INET_UDP_DIAG=m |
59 | CONFIG_IPV6_PRIVACY=y | ||
60 | CONFIG_IPV6_ROUTER_PREF=y | 58 | CONFIG_IPV6_ROUTER_PREF=y |
61 | CONFIG_INET6_AH=m | 59 | CONFIG_INET6_AH=m |
62 | CONFIG_INET6_ESP=m | 60 | CONFIG_INET6_ESP=m |
63 | CONFIG_INET6_IPCOMP=m | 61 | CONFIG_INET6_IPCOMP=m |
62 | CONFIG_IPV6_VTI=m | ||
64 | CONFIG_IPV6_GRE=m | 63 | CONFIG_IPV6_GRE=m |
65 | CONFIG_NETFILTER=y | 64 | CONFIG_NETFILTER=y |
66 | CONFIG_NF_CONNTRACK=m | 65 | CONFIG_NF_CONNTRACK=m |
@@ -78,6 +77,17 @@ CONFIG_NF_CONNTRACK_PPTP=m | |||
78 | CONFIG_NF_CONNTRACK_SANE=m | 77 | CONFIG_NF_CONNTRACK_SANE=m |
79 | CONFIG_NF_CONNTRACK_SIP=m | 78 | CONFIG_NF_CONNTRACK_SIP=m |
80 | CONFIG_NF_CONNTRACK_TFTP=m | 79 | CONFIG_NF_CONNTRACK_TFTP=m |
80 | CONFIG_NF_TABLES=m | ||
81 | CONFIG_NFT_EXTHDR=m | ||
82 | CONFIG_NFT_META=m | ||
83 | CONFIG_NFT_CT=m | ||
84 | CONFIG_NFT_RBTREE=m | ||
85 | CONFIG_NFT_HASH=m | ||
86 | CONFIG_NFT_COUNTER=m | ||
87 | CONFIG_NFT_LOG=m | ||
88 | CONFIG_NFT_LIMIT=m | ||
89 | CONFIG_NFT_NAT=m | ||
90 | CONFIG_NFT_COMPAT=m | ||
81 | CONFIG_NETFILTER_XT_SET=m | 91 | CONFIG_NETFILTER_XT_SET=m |
82 | CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m | 92 | CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m |
83 | CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m | 93 | CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m |
@@ -91,6 +101,7 @@ CONFIG_NETFILTER_XT_TARGET_NFLOG=m | |||
91 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m | 101 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m |
92 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m | 102 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m |
93 | CONFIG_NETFILTER_XT_TARGET_TEE=m | 103 | CONFIG_NETFILTER_XT_TARGET_TEE=m |
104 | CONFIG_NETFILTER_XT_TARGET_TPROXY=m | ||
94 | CONFIG_NETFILTER_XT_TARGET_TRACE=m | 105 | CONFIG_NETFILTER_XT_TARGET_TRACE=m |
95 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m | 106 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m |
96 | CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m | 107 | CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m |
@@ -123,6 +134,7 @@ CONFIG_NETFILTER_XT_MATCH_QUOTA=m | |||
123 | CONFIG_NETFILTER_XT_MATCH_RATEEST=m | 134 | CONFIG_NETFILTER_XT_MATCH_RATEEST=m |
124 | CONFIG_NETFILTER_XT_MATCH_REALM=m | 135 | CONFIG_NETFILTER_XT_MATCH_REALM=m |
125 | CONFIG_NETFILTER_XT_MATCH_RECENT=m | 136 | CONFIG_NETFILTER_XT_MATCH_RECENT=m |
137 | CONFIG_NETFILTER_XT_MATCH_SOCKET=m | ||
126 | CONFIG_NETFILTER_XT_MATCH_STATE=m | 138 | CONFIG_NETFILTER_XT_MATCH_STATE=m |
127 | CONFIG_NETFILTER_XT_MATCH_STATISTIC=m | 139 | CONFIG_NETFILTER_XT_MATCH_STATISTIC=m |
128 | CONFIG_NETFILTER_XT_MATCH_STRING=m | 140 | CONFIG_NETFILTER_XT_MATCH_STRING=m |
@@ -137,11 +149,18 @@ CONFIG_IP_SET_HASH_IP=m | |||
137 | CONFIG_IP_SET_HASH_IPPORT=m | 149 | CONFIG_IP_SET_HASH_IPPORT=m |
138 | CONFIG_IP_SET_HASH_IPPORTIP=m | 150 | CONFIG_IP_SET_HASH_IPPORTIP=m |
139 | CONFIG_IP_SET_HASH_IPPORTNET=m | 151 | CONFIG_IP_SET_HASH_IPPORTNET=m |
152 | CONFIG_IP_SET_HASH_NETPORTNET=m | ||
140 | CONFIG_IP_SET_HASH_NET=m | 153 | CONFIG_IP_SET_HASH_NET=m |
154 | CONFIG_IP_SET_HASH_NETNET=m | ||
141 | CONFIG_IP_SET_HASH_NETPORT=m | 155 | CONFIG_IP_SET_HASH_NETPORT=m |
142 | CONFIG_IP_SET_HASH_NETIFACE=m | 156 | CONFIG_IP_SET_HASH_NETIFACE=m |
143 | CONFIG_IP_SET_LIST_SET=m | 157 | CONFIG_IP_SET_LIST_SET=m |
144 | CONFIG_NF_CONNTRACK_IPV4=m | 158 | CONFIG_NF_CONNTRACK_IPV4=m |
159 | CONFIG_NF_TABLES_IPV4=m | ||
160 | CONFIG_NFT_REJECT_IPV4=m | ||
161 | CONFIG_NFT_CHAIN_ROUTE_IPV4=m | ||
162 | CONFIG_NFT_CHAIN_NAT_IPV4=m | ||
163 | CONFIG_NF_TABLES_ARP=m | ||
145 | CONFIG_IP_NF_IPTABLES=m | 164 | CONFIG_IP_NF_IPTABLES=m |
146 | CONFIG_IP_NF_MATCH_AH=m | 165 | CONFIG_IP_NF_MATCH_AH=m |
147 | CONFIG_IP_NF_MATCH_ECN=m | 166 | CONFIG_IP_NF_MATCH_ECN=m |
@@ -149,6 +168,7 @@ CONFIG_IP_NF_MATCH_RPFILTER=m | |||
149 | CONFIG_IP_NF_MATCH_TTL=m | 168 | CONFIG_IP_NF_MATCH_TTL=m |
150 | CONFIG_IP_NF_FILTER=m | 169 | CONFIG_IP_NF_FILTER=m |
151 | CONFIG_IP_NF_TARGET_REJECT=m | 170 | CONFIG_IP_NF_TARGET_REJECT=m |
171 | CONFIG_IP_NF_TARGET_SYNPROXY=m | ||
152 | CONFIG_IP_NF_TARGET_ULOG=m | 172 | CONFIG_IP_NF_TARGET_ULOG=m |
153 | CONFIG_NF_NAT_IPV4=m | 173 | CONFIG_NF_NAT_IPV4=m |
154 | CONFIG_IP_NF_TARGET_MASQUERADE=m | 174 | CONFIG_IP_NF_TARGET_MASQUERADE=m |
@@ -163,6 +183,9 @@ CONFIG_IP_NF_ARPTABLES=m | |||
163 | CONFIG_IP_NF_ARPFILTER=m | 183 | CONFIG_IP_NF_ARPFILTER=m |
164 | CONFIG_IP_NF_ARP_MANGLE=m | 184 | CONFIG_IP_NF_ARP_MANGLE=m |
165 | CONFIG_NF_CONNTRACK_IPV6=m | 185 | CONFIG_NF_CONNTRACK_IPV6=m |
186 | CONFIG_NF_TABLES_IPV6=m | ||
187 | CONFIG_NFT_CHAIN_ROUTE_IPV6=m | ||
188 | CONFIG_NFT_CHAIN_NAT_IPV6=m | ||
166 | CONFIG_IP6_NF_IPTABLES=m | 189 | CONFIG_IP6_NF_IPTABLES=m |
167 | CONFIG_IP6_NF_MATCH_AH=m | 190 | CONFIG_IP6_NF_MATCH_AH=m |
168 | CONFIG_IP6_NF_MATCH_EUI64=m | 191 | CONFIG_IP6_NF_MATCH_EUI64=m |
@@ -176,11 +199,13 @@ CONFIG_IP6_NF_MATCH_RT=m | |||
176 | CONFIG_IP6_NF_TARGET_HL=m | 199 | CONFIG_IP6_NF_TARGET_HL=m |
177 | CONFIG_IP6_NF_FILTER=m | 200 | CONFIG_IP6_NF_FILTER=m |
178 | CONFIG_IP6_NF_TARGET_REJECT=m | 201 | CONFIG_IP6_NF_TARGET_REJECT=m |
202 | CONFIG_IP6_NF_TARGET_SYNPROXY=m | ||
179 | CONFIG_IP6_NF_MANGLE=m | 203 | CONFIG_IP6_NF_MANGLE=m |
180 | CONFIG_IP6_NF_RAW=m | 204 | CONFIG_IP6_NF_RAW=m |
181 | CONFIG_NF_NAT_IPV6=m | 205 | CONFIG_NF_NAT_IPV6=m |
182 | CONFIG_IP6_NF_TARGET_MASQUERADE=m | 206 | CONFIG_IP6_NF_TARGET_MASQUERADE=m |
183 | CONFIG_IP6_NF_TARGET_NPT=m | 207 | CONFIG_IP6_NF_TARGET_NPT=m |
208 | CONFIG_NF_TABLES_BRIDGE=m | ||
184 | CONFIG_IP_DCCP=m | 209 | CONFIG_IP_DCCP=m |
185 | # CONFIG_IP_DCCP_CCID3 is not set | 210 | # CONFIG_IP_DCCP_CCID3 is not set |
186 | CONFIG_SCTP_COOKIE_HMAC_SHA1=y | 211 | CONFIG_SCTP_COOKIE_HMAC_SHA1=y |
@@ -188,10 +213,13 @@ CONFIG_RDS=m | |||
188 | CONFIG_RDS_TCP=m | 213 | CONFIG_RDS_TCP=m |
189 | CONFIG_L2TP=m | 214 | CONFIG_L2TP=m |
190 | CONFIG_ATALK=m | 215 | CONFIG_ATALK=m |
216 | CONFIG_DNS_RESOLVER=y | ||
191 | CONFIG_BATMAN_ADV=m | 217 | CONFIG_BATMAN_ADV=m |
192 | CONFIG_BATMAN_ADV_DAT=y | 218 | CONFIG_BATMAN_ADV_DAT=y |
219 | CONFIG_BATMAN_ADV_NC=y | ||
220 | CONFIG_NETLINK_DIAG=m | ||
221 | CONFIG_NET_MPLS_GSO=m | ||
193 | # CONFIG_WIRELESS is not set | 222 | # CONFIG_WIRELESS is not set |
194 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
195 | CONFIG_DEVTMPFS=y | 223 | CONFIG_DEVTMPFS=y |
196 | # CONFIG_FIRMWARE_IN_KERNEL is not set | 224 | # CONFIG_FIRMWARE_IN_KERNEL is not set |
197 | # CONFIG_FW_LOADER_USER_HELPER is not set | 225 | # CONFIG_FW_LOADER_USER_HELPER is not set |
@@ -203,6 +231,7 @@ CONFIG_BLK_DEV_NBD=m | |||
203 | CONFIG_BLK_DEV_RAM=y | 231 | CONFIG_BLK_DEV_RAM=y |
204 | CONFIG_CDROM_PKTCDVD=m | 232 | CONFIG_CDROM_PKTCDVD=m |
205 | CONFIG_ATA_OVER_ETH=m | 233 | CONFIG_ATA_OVER_ETH=m |
234 | CONFIG_DUMMY_IRQ=m | ||
206 | CONFIG_RAID_ATTRS=m | 235 | CONFIG_RAID_ATTRS=m |
207 | CONFIG_SCSI=y | 236 | CONFIG_SCSI=y |
208 | CONFIG_SCSI_TGT=m | 237 | CONFIG_SCSI_TGT=m |
@@ -240,6 +269,7 @@ CONFIG_EQUALIZER=m | |||
240 | CONFIG_NET_TEAM=m | 269 | CONFIG_NET_TEAM=m |
241 | CONFIG_NET_TEAM_MODE_BROADCAST=m | 270 | CONFIG_NET_TEAM_MODE_BROADCAST=m |
242 | CONFIG_NET_TEAM_MODE_ROUNDROBIN=m | 271 | CONFIG_NET_TEAM_MODE_ROUNDROBIN=m |
272 | CONFIG_NET_TEAM_MODE_RANDOM=m | ||
243 | CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m | 273 | CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m |
244 | CONFIG_NET_TEAM_MODE_LOADBALANCE=m | 274 | CONFIG_NET_TEAM_MODE_LOADBALANCE=m |
245 | CONFIG_VXLAN=m | 275 | CONFIG_VXLAN=m |
@@ -247,6 +277,7 @@ CONFIG_NETCONSOLE=m | |||
247 | CONFIG_NETCONSOLE_DYNAMIC=y | 277 | CONFIG_NETCONSOLE_DYNAMIC=y |
248 | CONFIG_VETH=m | 278 | CONFIG_VETH=m |
249 | CONFIG_SUN3LANCE=y | 279 | CONFIG_SUN3LANCE=y |
280 | # CONFIG_NET_VENDOR_ARC is not set | ||
250 | # CONFIG_NET_CADENCE is not set | 281 | # CONFIG_NET_CADENCE is not set |
251 | # CONFIG_NET_VENDOR_BROADCOM is not set | 282 | # CONFIG_NET_VENDOR_BROADCOM is not set |
252 | # CONFIG_NET_VENDOR_INTEL is not set | 283 | # CONFIG_NET_VENDOR_INTEL is not set |
@@ -255,6 +286,7 @@ CONFIG_SUN3LANCE=y | |||
255 | # CONFIG_NET_VENDOR_NATSEMI is not set | 286 | # CONFIG_NET_VENDOR_NATSEMI is not set |
256 | # CONFIG_NET_VENDOR_SEEQ is not set | 287 | # CONFIG_NET_VENDOR_SEEQ is not set |
257 | # CONFIG_NET_VENDOR_STMICRO is not set | 288 | # CONFIG_NET_VENDOR_STMICRO is not set |
289 | # CONFIG_NET_VENDOR_VIA is not set | ||
258 | # CONFIG_NET_VENDOR_WIZNET is not set | 290 | # CONFIG_NET_VENDOR_WIZNET is not set |
259 | CONFIG_PPP=m | 291 | CONFIG_PPP=m |
260 | CONFIG_PPP_BSDCOMP=m | 292 | CONFIG_PPP_BSDCOMP=m |
@@ -276,7 +308,6 @@ CONFIG_INPUT_EVDEV=m | |||
276 | CONFIG_KEYBOARD_SUNKBD=y | 308 | CONFIG_KEYBOARD_SUNKBD=y |
277 | # CONFIG_MOUSE_PS2 is not set | 309 | # CONFIG_MOUSE_PS2 is not set |
278 | CONFIG_MOUSE_SERIAL=m | 310 | CONFIG_MOUSE_SERIAL=m |
279 | CONFIG_VT_HW_CONSOLE_BINDING=y | ||
280 | # CONFIG_LEGACY_PTYS is not set | 311 | # CONFIG_LEGACY_PTYS is not set |
281 | # CONFIG_DEVKMEM is not set | 312 | # CONFIG_DEVKMEM is not set |
282 | # CONFIG_HW_RANDOM is not set | 313 | # CONFIG_HW_RANDOM is not set |
@@ -296,10 +327,6 @@ CONFIG_RTC_CLASS=y | |||
296 | CONFIG_RTC_DRV_GENERIC=m | 327 | CONFIG_RTC_DRV_GENERIC=m |
297 | # CONFIG_IOMMU_SUPPORT is not set | 328 | # CONFIG_IOMMU_SUPPORT is not set |
298 | CONFIG_PROC_HARDWARE=y | 329 | CONFIG_PROC_HARDWARE=y |
299 | CONFIG_EXT2_FS=y | ||
300 | CONFIG_EXT3_FS=y | ||
301 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set | ||
302 | # CONFIG_EXT3_FS_XATTR is not set | ||
303 | CONFIG_EXT4_FS=y | 330 | CONFIG_EXT4_FS=y |
304 | CONFIG_REISERFS_FS=m | 331 | CONFIG_REISERFS_FS=m |
305 | CONFIG_JFS_FS=m | 332 | CONFIG_JFS_FS=m |
@@ -336,7 +363,7 @@ CONFIG_QNX6FS_FS=m | |||
336 | CONFIG_SYSV_FS=m | 363 | CONFIG_SYSV_FS=m |
337 | CONFIG_UFS_FS=m | 364 | CONFIG_UFS_FS=m |
338 | CONFIG_NFS_FS=y | 365 | CONFIG_NFS_FS=y |
339 | CONFIG_NFS_V4=y | 366 | CONFIG_NFS_V4=m |
340 | CONFIG_NFS_SWAP=y | 367 | CONFIG_NFS_SWAP=y |
341 | CONFIG_ROOT_NFS=y | 368 | CONFIG_ROOT_NFS=y |
342 | CONFIG_NFSD=m | 369 | CONFIG_NFSD=m |
@@ -395,10 +422,10 @@ CONFIG_NLS_MAC_TURKISH=m | |||
395 | CONFIG_DLM=m | 422 | CONFIG_DLM=m |
396 | CONFIG_MAGIC_SYSRQ=y | 423 | CONFIG_MAGIC_SYSRQ=y |
397 | CONFIG_ASYNC_RAID6_TEST=m | 424 | CONFIG_ASYNC_RAID6_TEST=m |
425 | CONFIG_TEST_STRING_HELPERS=m | ||
398 | CONFIG_ENCRYPTED_KEYS=m | 426 | CONFIG_ENCRYPTED_KEYS=m |
399 | CONFIG_CRYPTO_MANAGER=y | 427 | CONFIG_CRYPTO_MANAGER=y |
400 | CONFIG_CRYPTO_USER=m | 428 | CONFIG_CRYPTO_USER=m |
401 | CONFIG_CRYPTO_NULL=m | ||
402 | CONFIG_CRYPTO_CRYPTD=m | 429 | CONFIG_CRYPTO_CRYPTD=m |
403 | CONFIG_CRYPTO_TEST=m | 430 | CONFIG_CRYPTO_TEST=m |
404 | CONFIG_CRYPTO_CCM=m | 431 | CONFIG_CRYPTO_CCM=m |
@@ -431,6 +458,8 @@ CONFIG_CRYPTO_TEA=m | |||
431 | CONFIG_CRYPTO_TWOFISH=m | 458 | CONFIG_CRYPTO_TWOFISH=m |
432 | CONFIG_CRYPTO_ZLIB=m | 459 | CONFIG_CRYPTO_ZLIB=m |
433 | CONFIG_CRYPTO_LZO=m | 460 | CONFIG_CRYPTO_LZO=m |
461 | CONFIG_CRYPTO_LZ4=m | ||
462 | CONFIG_CRYPTO_LZ4HC=m | ||
434 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | 463 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
435 | CONFIG_CRYPTO_USER_API_HASH=m | 464 | CONFIG_CRYPTO_USER_API_HASH=m |
436 | CONFIG_CRYPTO_USER_API_SKCIPHER=m | 465 | CONFIG_CRYPTO_USER_API_SKCIPHER=m |
diff --git a/arch/m68k/emu/natfeat.c b/arch/m68k/emu/natfeat.c index 121a6660ad4e..71b78ecee75c 100644 --- a/arch/m68k/emu/natfeat.c +++ b/arch/m68k/emu/natfeat.c | |||
@@ -9,6 +9,7 @@ | |||
9 | * the GNU General Public License (GPL), incorporated herein by reference. | 9 | * the GNU General Public License (GPL), incorporated herein by reference. |
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <linux/init.h> | ||
12 | #include <linux/types.h> | 13 | #include <linux/types.h> |
13 | #include <linux/console.h> | 14 | #include <linux/console.h> |
14 | #include <linux/string.h> | 15 | #include <linux/string.h> |
@@ -70,7 +71,7 @@ static void nf_poweroff(void) | |||
70 | nf_call(id); | 71 | nf_call(id); |
71 | } | 72 | } |
72 | 73 | ||
73 | void nf_init(void) | 74 | void __init nf_init(void) |
74 | { | 75 | { |
75 | unsigned long id, version; | 76 | unsigned long id, version; |
76 | char buf[256]; | 77 | char buf[256]; |
diff --git a/arch/m68k/hp300/config.c b/arch/m68k/hp300/config.c index b7609f791522..2e5a787ea11b 100644 --- a/arch/m68k/hp300/config.c +++ b/arch/m68k/hp300/config.c | |||
@@ -14,6 +14,8 @@ | |||
14 | #include <linux/console.h> | 14 | #include <linux/console.h> |
15 | 15 | ||
16 | #include <asm/bootinfo.h> | 16 | #include <asm/bootinfo.h> |
17 | #include <asm/bootinfo-hp300.h> | ||
18 | #include <asm/byteorder.h> | ||
17 | #include <asm/machdep.h> | 19 | #include <asm/machdep.h> |
18 | #include <asm/blinken.h> | 20 | #include <asm/blinken.h> |
19 | #include <asm/io.h> /* readb() and writeb() */ | 21 | #include <asm/io.h> /* readb() and writeb() */ |
@@ -70,15 +72,15 @@ extern int hp300_setup_serial_console(void) __init; | |||
70 | int __init hp300_parse_bootinfo(const struct bi_record *record) | 72 | int __init hp300_parse_bootinfo(const struct bi_record *record) |
71 | { | 73 | { |
72 | int unknown = 0; | 74 | int unknown = 0; |
73 | const unsigned long *data = record->data; | 75 | const void *data = record->data; |
74 | 76 | ||
75 | switch (record->tag) { | 77 | switch (be16_to_cpu(record->tag)) { |
76 | case BI_HP300_MODEL: | 78 | case BI_HP300_MODEL: |
77 | hp300_model = *data; | 79 | hp300_model = be32_to_cpup(data); |
78 | break; | 80 | break; |
79 | 81 | ||
80 | case BI_HP300_UART_SCODE: | 82 | case BI_HP300_UART_SCODE: |
81 | hp300_uart_scode = *data; | 83 | hp300_uart_scode = be32_to_cpup(data); |
82 | break; | 84 | break; |
83 | 85 | ||
84 | case BI_HP300_UART_ADDR: | 86 | case BI_HP300_UART_ADDR: |
diff --git a/arch/m68k/include/asm/amigahw.h b/arch/m68k/include/asm/amigahw.h index 7a19b5686a4a..5ad568110f17 100644 --- a/arch/m68k/include/asm/amigahw.h +++ b/arch/m68k/include/asm/amigahw.h | |||
@@ -18,26 +18,7 @@ | |||
18 | 18 | ||
19 | #include <linux/ioport.h> | 19 | #include <linux/ioport.h> |
20 | 20 | ||
21 | /* | 21 | #include <asm/bootinfo-amiga.h> |
22 | * Different Amiga models | ||
23 | */ | ||
24 | |||
25 | #define AMI_UNKNOWN (0) | ||
26 | #define AMI_500 (1) | ||
27 | #define AMI_500PLUS (2) | ||
28 | #define AMI_600 (3) | ||
29 | #define AMI_1000 (4) | ||
30 | #define AMI_1200 (5) | ||
31 | #define AMI_2000 (6) | ||
32 | #define AMI_2500 (7) | ||
33 | #define AMI_3000 (8) | ||
34 | #define AMI_3000T (9) | ||
35 | #define AMI_3000PLUS (10) | ||
36 | #define AMI_4000 (11) | ||
37 | #define AMI_4000T (12) | ||
38 | #define AMI_CDTV (13) | ||
39 | #define AMI_CD32 (14) | ||
40 | #define AMI_DRACO (15) | ||
41 | 22 | ||
42 | 23 | ||
43 | /* | 24 | /* |
@@ -46,11 +27,6 @@ | |||
46 | 27 | ||
47 | extern unsigned long amiga_chipset; | 28 | extern unsigned long amiga_chipset; |
48 | 29 | ||
49 | #define CS_STONEAGE (0) | ||
50 | #define CS_OCS (1) | ||
51 | #define CS_ECS (2) | ||
52 | #define CS_AGA (3) | ||
53 | |||
54 | 30 | ||
55 | /* | 31 | /* |
56 | * Miscellaneous | 32 | * Miscellaneous |
@@ -266,7 +242,7 @@ struct CIA { | |||
266 | 242 | ||
267 | #define zTwoBase (0x80000000) | 243 | #define zTwoBase (0x80000000) |
268 | #define ZTWO_PADDR(x) (((unsigned long)(x))-zTwoBase) | 244 | #define ZTWO_PADDR(x) (((unsigned long)(x))-zTwoBase) |
269 | #define ZTWO_VADDR(x) (((unsigned long)(x))+zTwoBase) | 245 | #define ZTWO_VADDR(x) ((void __iomem *)(((unsigned long)(x))+zTwoBase)) |
270 | 246 | ||
271 | #define CUSTOM_PHYSADDR (0xdff000) | 247 | #define CUSTOM_PHYSADDR (0xdff000) |
272 | #define amiga_custom ((*(volatile struct CUSTOM *)(zTwoBase+CUSTOM_PHYSADDR))) | 248 | #define amiga_custom ((*(volatile struct CUSTOM *)(zTwoBase+CUSTOM_PHYSADDR))) |
diff --git a/arch/m68k/include/asm/apollohw.h b/arch/m68k/include/asm/apollohw.h index 6c19e0c22411..87fc899d32ee 100644 --- a/arch/m68k/include/asm/apollohw.h +++ b/arch/m68k/include/asm/apollohw.h | |||
@@ -5,18 +5,11 @@ | |||
5 | 5 | ||
6 | #include <linux/types.h> | 6 | #include <linux/types.h> |
7 | 7 | ||
8 | /* | 8 | #include <asm/bootinfo-apollo.h> |
9 | apollo models | 9 | |
10 | */ | ||
11 | 10 | ||
12 | extern u_long apollo_model; | 11 | extern u_long apollo_model; |
13 | 12 | ||
14 | #define APOLLO_UNKNOWN (0) | ||
15 | #define APOLLO_DN3000 (1) | ||
16 | #define APOLLO_DN3010 (2) | ||
17 | #define APOLLO_DN3500 (3) | ||
18 | #define APOLLO_DN4000 (4) | ||
19 | #define APOLLO_DN4500 (5) | ||
20 | 13 | ||
21 | /* | 14 | /* |
22 | see scn2681 data sheet for more info. | 15 | see scn2681 data sheet for more info. |
diff --git a/arch/m68k/include/asm/atarihw.h b/arch/m68k/include/asm/atarihw.h index d887050e6da6..972c8f33f055 100644 --- a/arch/m68k/include/asm/atarihw.h +++ b/arch/m68k/include/asm/atarihw.h | |||
@@ -21,7 +21,7 @@ | |||
21 | #define _LINUX_ATARIHW_H_ | 21 | #define _LINUX_ATARIHW_H_ |
22 | 22 | ||
23 | #include <linux/types.h> | 23 | #include <linux/types.h> |
24 | #include <asm/bootinfo.h> | 24 | #include <asm/bootinfo-atari.h> |
25 | #include <asm/raw_io.h> | 25 | #include <asm/raw_io.h> |
26 | 26 | ||
27 | extern u_long atari_mch_cookie; | 27 | extern u_long atari_mch_cookie; |
diff --git a/arch/m68k/include/asm/barrier.h b/arch/m68k/include/asm/barrier.h index 445ce22c23cb..15c5f77c1614 100644 --- a/arch/m68k/include/asm/barrier.h +++ b/arch/m68k/include/asm/barrier.h | |||
@@ -1,20 +1,8 @@ | |||
1 | #ifndef _M68K_BARRIER_H | 1 | #ifndef _M68K_BARRIER_H |
2 | #define _M68K_BARRIER_H | 2 | #define _M68K_BARRIER_H |
3 | 3 | ||
4 | /* | ||
5 | * Force strict CPU ordering. | ||
6 | * Not really required on m68k... | ||
7 | */ | ||
8 | #define nop() do { asm volatile ("nop"); barrier(); } while (0) | 4 | #define nop() do { asm volatile ("nop"); barrier(); } while (0) |
9 | #define mb() barrier() | ||
10 | #define rmb() barrier() | ||
11 | #define wmb() barrier() | ||
12 | #define read_barrier_depends() ((void)0) | ||
13 | #define set_mb(var, value) ({ (var) = (value); wmb(); }) | ||
14 | 5 | ||
15 | #define smp_mb() barrier() | 6 | #include <asm-generic/barrier.h> |
16 | #define smp_rmb() barrier() | ||
17 | #define smp_wmb() barrier() | ||
18 | #define smp_read_barrier_depends() ((void)0) | ||
19 | 7 | ||
20 | #endif /* _M68K_BARRIER_H */ | 8 | #endif /* _M68K_BARRIER_H */ |
diff --git a/arch/m68k/include/asm/bootinfo.h b/arch/m68k/include/asm/bootinfo.h index 67e7a78ad96b..8e213267f8e7 100644 --- a/arch/m68k/include/asm/bootinfo.h +++ b/arch/m68k/include/asm/bootinfo.h | |||
@@ -6,373 +6,23 @@ | |||
6 | ** This file is subject to the terms and conditions of the GNU General Public | 6 | ** This file is subject to the terms and conditions of the GNU General Public |
7 | ** License. See the file COPYING in the main directory of this archive | 7 | ** License. See the file COPYING in the main directory of this archive |
8 | ** for more details. | 8 | ** for more details. |
9 | ** | ||
10 | ** Created 09/29/92 by Greg Harp | ||
11 | ** | ||
12 | ** 5/2/94 Roman Hodek: | ||
13 | ** Added bi_atari part of the machine dependent union bi_un; for now it | ||
14 | ** contains just a model field to distinguish between TT and Falcon. | ||
15 | ** 26/7/96 Roman Zippel: | ||
16 | ** Renamed to setup.h; added some useful macros to allow gcc some | ||
17 | ** optimizations if possible. | ||
18 | ** 5/10/96 Geert Uytterhoeven: | ||
19 | ** Redesign of the boot information structure; renamed to bootinfo.h again | ||
20 | ** 27/11/96 Geert Uytterhoeven: | ||
21 | ** Backwards compatibility with bootinfo interface version 1.0 | ||
22 | */ | 9 | */ |
23 | 10 | ||
24 | #ifndef _M68K_BOOTINFO_H | 11 | #ifndef _M68K_BOOTINFO_H |
25 | #define _M68K_BOOTINFO_H | 12 | #define _M68K_BOOTINFO_H |
26 | 13 | ||
14 | #include <uapi/asm/bootinfo.h> | ||
27 | 15 | ||
28 | /* | ||
29 | * Bootinfo definitions | ||
30 | * | ||
31 | * This is an easily parsable and extendable structure containing all | ||
32 | * information to be passed from the bootstrap to the kernel. | ||
33 | * | ||
34 | * This way I hope to keep all future changes back/forewards compatible. | ||
35 | * Thus, keep your fingers crossed... | ||
36 | * | ||
37 | * This structure is copied right after the kernel bss by the bootstrap | ||
38 | * routine. | ||
39 | */ | ||
40 | 16 | ||
41 | #ifndef __ASSEMBLY__ | 17 | #ifndef __ASSEMBLY__ |
42 | 18 | ||
43 | struct bi_record { | 19 | #ifdef CONFIG_BOOTINFO_PROC |
44 | unsigned short tag; /* tag ID */ | 20 | extern void save_bootinfo(const struct bi_record *bi); |
45 | unsigned short size; /* size of record (in bytes) */ | 21 | #else |
46 | unsigned long data[0]; /* data */ | 22 | static inline void save_bootinfo(const struct bi_record *bi) {} |
47 | }; | ||
48 | |||
49 | #endif /* __ASSEMBLY__ */ | ||
50 | |||
51 | |||
52 | /* | ||
53 | * Tag Definitions | ||
54 | * | ||
55 | * Machine independent tags start counting from 0x0000 | ||
56 | * Machine dependent tags start counting from 0x8000 | ||
57 | */ | ||
58 | |||
59 | #define BI_LAST 0x0000 /* last record (sentinel) */ | ||
60 | #define BI_MACHTYPE 0x0001 /* machine type (u_long) */ | ||
61 | #define BI_CPUTYPE 0x0002 /* cpu type (u_long) */ | ||
62 | #define BI_FPUTYPE 0x0003 /* fpu type (u_long) */ | ||
63 | #define BI_MMUTYPE 0x0004 /* mmu type (u_long) */ | ||
64 | #define BI_MEMCHUNK 0x0005 /* memory chunk address and size */ | ||
65 | /* (struct mem_info) */ | ||
66 | #define BI_RAMDISK 0x0006 /* ramdisk address and size */ | ||
67 | /* (struct mem_info) */ | ||
68 | #define BI_COMMAND_LINE 0x0007 /* kernel command line parameters */ | ||
69 | /* (string) */ | ||
70 | |||
71 | /* | ||
72 | * Amiga-specific tags | ||
73 | */ | ||
74 | |||
75 | #define BI_AMIGA_MODEL 0x8000 /* model (u_long) */ | ||
76 | #define BI_AMIGA_AUTOCON 0x8001 /* AutoConfig device */ | ||
77 | /* (struct ConfigDev) */ | ||
78 | #define BI_AMIGA_CHIP_SIZE 0x8002 /* size of Chip RAM (u_long) */ | ||
79 | #define BI_AMIGA_VBLANK 0x8003 /* VBLANK frequency (u_char) */ | ||
80 | #define BI_AMIGA_PSFREQ 0x8004 /* power supply frequency (u_char) */ | ||
81 | #define BI_AMIGA_ECLOCK 0x8005 /* EClock frequency (u_long) */ | ||
82 | #define BI_AMIGA_CHIPSET 0x8006 /* native chipset present (u_long) */ | ||
83 | #define BI_AMIGA_SERPER 0x8007 /* serial port period (u_short) */ | ||
84 | |||
85 | /* | ||
86 | * Atari-specific tags | ||
87 | */ | ||
88 | |||
89 | #define BI_ATARI_MCH_COOKIE 0x8000 /* _MCH cookie from TOS (u_long) */ | ||
90 | #define BI_ATARI_MCH_TYPE 0x8001 /* special machine type (u_long) */ | ||
91 | /* (values are ATARI_MACH_* defines */ | ||
92 | |||
93 | /* mch_cookie values (upper word) */ | ||
94 | #define ATARI_MCH_ST 0 | ||
95 | #define ATARI_MCH_STE 1 | ||
96 | #define ATARI_MCH_TT 2 | ||
97 | #define ATARI_MCH_FALCON 3 | ||
98 | |||
99 | /* mch_type values */ | ||
100 | #define ATARI_MACH_NORMAL 0 /* no special machine type */ | ||
101 | #define ATARI_MACH_MEDUSA 1 /* Medusa 040 */ | ||
102 | #define ATARI_MACH_HADES 2 /* Hades 040 or 060 */ | ||
103 | #define ATARI_MACH_AB40 3 /* Afterburner040 on Falcon */ | ||
104 | |||
105 | /* | ||
106 | * VME-specific tags | ||
107 | */ | ||
108 | |||
109 | #define BI_VME_TYPE 0x8000 /* VME sub-architecture (u_long) */ | ||
110 | #define BI_VME_BRDINFO 0x8001 /* VME board information (struct) */ | ||
111 | |||
112 | /* BI_VME_TYPE codes */ | ||
113 | #define VME_TYPE_TP34V 0x0034 /* Tadpole TP34V */ | ||
114 | #define VME_TYPE_MVME147 0x0147 /* Motorola MVME147 */ | ||
115 | #define VME_TYPE_MVME162 0x0162 /* Motorola MVME162 */ | ||
116 | #define VME_TYPE_MVME166 0x0166 /* Motorola MVME166 */ | ||
117 | #define VME_TYPE_MVME167 0x0167 /* Motorola MVME167 */ | ||
118 | #define VME_TYPE_MVME172 0x0172 /* Motorola MVME172 */ | ||
119 | #define VME_TYPE_MVME177 0x0177 /* Motorola MVME177 */ | ||
120 | #define VME_TYPE_BVME4000 0x4000 /* BVM Ltd. BVME4000 */ | ||
121 | #define VME_TYPE_BVME6000 0x6000 /* BVM Ltd. BVME6000 */ | ||
122 | |||
123 | /* BI_VME_BRDINFO is a 32 byte struct as returned by the Bug code on | ||
124 | * Motorola VME boards. Contains board number, Bug version, board | ||
125 | * configuration options, etc. See include/asm/mvme16xhw.h for details. | ||
126 | */ | ||
127 | |||
128 | |||
129 | /* | ||
130 | * Macintosh-specific tags (all u_long) | ||
131 | */ | ||
132 | |||
133 | #define BI_MAC_MODEL 0x8000 /* Mac Gestalt ID (model type) */ | ||
134 | #define BI_MAC_VADDR 0x8001 /* Mac video base address */ | ||
135 | #define BI_MAC_VDEPTH 0x8002 /* Mac video depth */ | ||
136 | #define BI_MAC_VROW 0x8003 /* Mac video rowbytes */ | ||
137 | #define BI_MAC_VDIM 0x8004 /* Mac video dimensions */ | ||
138 | #define BI_MAC_VLOGICAL 0x8005 /* Mac video logical base */ | ||
139 | #define BI_MAC_SCCBASE 0x8006 /* Mac SCC base address */ | ||
140 | #define BI_MAC_BTIME 0x8007 /* Mac boot time */ | ||
141 | #define BI_MAC_GMTBIAS 0x8008 /* Mac GMT timezone offset */ | ||
142 | #define BI_MAC_MEMSIZE 0x8009 /* Mac RAM size (sanity check) */ | ||
143 | #define BI_MAC_CPUID 0x800a /* Mac CPU type (sanity check) */ | ||
144 | #define BI_MAC_ROMBASE 0x800b /* Mac system ROM base address */ | ||
145 | |||
146 | /* | ||
147 | * Macintosh hardware profile data - unused, see macintosh.h for | ||
148 | * reasonable type values | ||
149 | */ | ||
150 | |||
151 | #define BI_MAC_VIA1BASE 0x8010 /* Mac VIA1 base address (always present) */ | ||
152 | #define BI_MAC_VIA2BASE 0x8011 /* Mac VIA2 base address (type varies) */ | ||
153 | #define BI_MAC_VIA2TYPE 0x8012 /* Mac VIA2 type (VIA, RBV, OSS) */ | ||
154 | #define BI_MAC_ADBTYPE 0x8013 /* Mac ADB interface type */ | ||
155 | #define BI_MAC_ASCBASE 0x8014 /* Mac Apple Sound Chip base address */ | ||
156 | #define BI_MAC_SCSI5380 0x8015 /* Mac NCR 5380 SCSI (base address, multi) */ | ||
157 | #define BI_MAC_SCSIDMA 0x8016 /* Mac SCSI DMA (base address) */ | ||
158 | #define BI_MAC_SCSI5396 0x8017 /* Mac NCR 53C96 SCSI (base address, multi) */ | ||
159 | #define BI_MAC_IDETYPE 0x8018 /* Mac IDE interface type */ | ||
160 | #define BI_MAC_IDEBASE 0x8019 /* Mac IDE interface base address */ | ||
161 | #define BI_MAC_NUBUS 0x801a /* Mac Nubus type (none, regular, pseudo) */ | ||
162 | #define BI_MAC_SLOTMASK 0x801b /* Mac Nubus slots present */ | ||
163 | #define BI_MAC_SCCTYPE 0x801c /* Mac SCC serial type (normal, IOP) */ | ||
164 | #define BI_MAC_ETHTYPE 0x801d /* Mac builtin ethernet type (Sonic, MACE */ | ||
165 | #define BI_MAC_ETHBASE 0x801e /* Mac builtin ethernet base address */ | ||
166 | #define BI_MAC_PMU 0x801f /* Mac power management / poweroff hardware */ | ||
167 | #define BI_MAC_IOP_SWIM 0x8020 /* Mac SWIM floppy IOP */ | ||
168 | #define BI_MAC_IOP_ADB 0x8021 /* Mac ADB IOP */ | ||
169 | |||
170 | /* | ||
171 | * Mac: compatibility with old booter data format (temporarily) | ||
172 | * Fields unused with the new bootinfo can be deleted now; instead of | ||
173 | * adding new fields the struct might be splitted into a hardware address | ||
174 | * part and a hardware type part | ||
175 | */ | ||
176 | |||
177 | #ifndef __ASSEMBLY__ | ||
178 | |||
179 | struct mac_booter_data | ||
180 | { | ||
181 | unsigned long videoaddr; | ||
182 | unsigned long videorow; | ||
183 | unsigned long videodepth; | ||
184 | unsigned long dimensions; | ||
185 | unsigned long args; | ||
186 | unsigned long boottime; | ||
187 | unsigned long gmtbias; | ||
188 | unsigned long bootver; | ||
189 | unsigned long videological; | ||
190 | unsigned long sccbase; | ||
191 | unsigned long id; | ||
192 | unsigned long memsize; | ||
193 | unsigned long serialmf; | ||
194 | unsigned long serialhsk; | ||
195 | unsigned long serialgpi; | ||
196 | unsigned long printmf; | ||
197 | unsigned long printhsk; | ||
198 | unsigned long printgpi; | ||
199 | unsigned long cpuid; | ||
200 | unsigned long rombase; | ||
201 | unsigned long adbdelay; | ||
202 | unsigned long timedbra; | ||
203 | }; | ||
204 | |||
205 | extern struct mac_booter_data | ||
206 | mac_bi_data; | ||
207 | |||
208 | #endif | 23 | #endif |
209 | 24 | ||
210 | /* | ||
211 | * Apollo-specific tags | ||
212 | */ | ||
213 | |||
214 | #define BI_APOLLO_MODEL 0x8000 /* model (u_long) */ | ||
215 | |||
216 | /* | ||
217 | * HP300-specific tags | ||
218 | */ | ||
219 | |||
220 | #define BI_HP300_MODEL 0x8000 /* model (u_long) */ | ||
221 | #define BI_HP300_UART_SCODE 0x8001 /* UART select code (u_long) */ | ||
222 | #define BI_HP300_UART_ADDR 0x8002 /* phys. addr of UART (u_long) */ | ||
223 | |||
224 | /* | ||
225 | * Stuff for bootinfo interface versioning | ||
226 | * | ||
227 | * At the start of kernel code, a 'struct bootversion' is located. | ||
228 | * bootstrap checks for a matching version of the interface before booting | ||
229 | * a kernel, to avoid user confusion if kernel and bootstrap don't work | ||
230 | * together :-) | ||
231 | * | ||
232 | * If incompatible changes are made to the bootinfo interface, the major | ||
233 | * number below should be stepped (and the minor reset to 0) for the | ||
234 | * appropriate machine. If a change is backward-compatible, the minor | ||
235 | * should be stepped. "Backwards-compatible" means that booting will work, | ||
236 | * but certain features may not. | ||
237 | */ | ||
238 | |||
239 | #define BOOTINFOV_MAGIC 0x4249561A /* 'BIV^Z' */ | ||
240 | #define MK_BI_VERSION(major,minor) (((major)<<16)+(minor)) | ||
241 | #define BI_VERSION_MAJOR(v) (((v) >> 16) & 0xffff) | ||
242 | #define BI_VERSION_MINOR(v) ((v) & 0xffff) | ||
243 | |||
244 | #ifndef __ASSEMBLY__ | ||
245 | |||
246 | struct bootversion { | ||
247 | unsigned short branch; | ||
248 | unsigned long magic; | ||
249 | struct { | ||
250 | unsigned long machtype; | ||
251 | unsigned long version; | ||
252 | } machversions[0]; | ||
253 | }; | ||
254 | |||
255 | #endif /* __ASSEMBLY__ */ | 25 | #endif /* __ASSEMBLY__ */ |
256 | 26 | ||
257 | #define AMIGA_BOOTI_VERSION MK_BI_VERSION( 2, 0 ) | ||
258 | #define ATARI_BOOTI_VERSION MK_BI_VERSION( 2, 1 ) | ||
259 | #define MAC_BOOTI_VERSION MK_BI_VERSION( 2, 0 ) | ||
260 | #define MVME147_BOOTI_VERSION MK_BI_VERSION( 2, 0 ) | ||
261 | #define MVME16x_BOOTI_VERSION MK_BI_VERSION( 2, 0 ) | ||
262 | #define BVME6000_BOOTI_VERSION MK_BI_VERSION( 2, 0 ) | ||
263 | #define Q40_BOOTI_VERSION MK_BI_VERSION( 2, 0 ) | ||
264 | #define HP300_BOOTI_VERSION MK_BI_VERSION( 2, 0 ) | ||
265 | |||
266 | #ifdef BOOTINFO_COMPAT_1_0 | ||
267 | |||
268 | /* | ||
269 | * Backwards compatibility with bootinfo interface version 1.0 | ||
270 | */ | ||
271 | |||
272 | #define COMPAT_AMIGA_BOOTI_VERSION MK_BI_VERSION( 1, 0 ) | ||
273 | #define COMPAT_ATARI_BOOTI_VERSION MK_BI_VERSION( 1, 0 ) | ||
274 | #define COMPAT_MAC_BOOTI_VERSION MK_BI_VERSION( 1, 0 ) | ||
275 | |||
276 | #include <linux/zorro.h> | ||
277 | |||
278 | #define COMPAT_NUM_AUTO 16 | ||
279 | |||
280 | struct compat_bi_Amiga { | ||
281 | int model; | ||
282 | int num_autocon; | ||
283 | struct ConfigDev autocon[COMPAT_NUM_AUTO]; | ||
284 | unsigned long chip_size; | ||
285 | unsigned char vblank; | ||
286 | unsigned char psfreq; | ||
287 | unsigned long eclock; | ||
288 | unsigned long chipset; | ||
289 | unsigned long hw_present; | ||
290 | }; | ||
291 | |||
292 | struct compat_bi_Atari { | ||
293 | unsigned long hw_present; | ||
294 | unsigned long mch_cookie; | ||
295 | }; | ||
296 | |||
297 | #ifndef __ASSEMBLY__ | ||
298 | |||
299 | struct compat_bi_Macintosh | ||
300 | { | ||
301 | unsigned long videoaddr; | ||
302 | unsigned long videorow; | ||
303 | unsigned long videodepth; | ||
304 | unsigned long dimensions; | ||
305 | unsigned long args; | ||
306 | unsigned long boottime; | ||
307 | unsigned long gmtbias; | ||
308 | unsigned long bootver; | ||
309 | unsigned long videological; | ||
310 | unsigned long sccbase; | ||
311 | unsigned long id; | ||
312 | unsigned long memsize; | ||
313 | unsigned long serialmf; | ||
314 | unsigned long serialhsk; | ||
315 | unsigned long serialgpi; | ||
316 | unsigned long printmf; | ||
317 | unsigned long printhsk; | ||
318 | unsigned long printgpi; | ||
319 | unsigned long cpuid; | ||
320 | unsigned long rombase; | ||
321 | unsigned long adbdelay; | ||
322 | unsigned long timedbra; | ||
323 | }; | ||
324 | |||
325 | #endif | ||
326 | |||
327 | struct compat_mem_info { | ||
328 | unsigned long addr; | ||
329 | unsigned long size; | ||
330 | }; | ||
331 | |||
332 | #define COMPAT_NUM_MEMINFO 4 | ||
333 | |||
334 | #define COMPAT_CPUB_68020 0 | ||
335 | #define COMPAT_CPUB_68030 1 | ||
336 | #define COMPAT_CPUB_68040 2 | ||
337 | #define COMPAT_CPUB_68060 3 | ||
338 | #define COMPAT_FPUB_68881 5 | ||
339 | #define COMPAT_FPUB_68882 6 | ||
340 | #define COMPAT_FPUB_68040 7 | ||
341 | #define COMPAT_FPUB_68060 8 | ||
342 | |||
343 | #define COMPAT_CPU_68020 (1<<COMPAT_CPUB_68020) | ||
344 | #define COMPAT_CPU_68030 (1<<COMPAT_CPUB_68030) | ||
345 | #define COMPAT_CPU_68040 (1<<COMPAT_CPUB_68040) | ||
346 | #define COMPAT_CPU_68060 (1<<COMPAT_CPUB_68060) | ||
347 | #define COMPAT_CPU_MASK (31) | ||
348 | #define COMPAT_FPU_68881 (1<<COMPAT_FPUB_68881) | ||
349 | #define COMPAT_FPU_68882 (1<<COMPAT_FPUB_68882) | ||
350 | #define COMPAT_FPU_68040 (1<<COMPAT_FPUB_68040) | ||
351 | #define COMPAT_FPU_68060 (1<<COMPAT_FPUB_68060) | ||
352 | #define COMPAT_FPU_MASK (0xfe0) | ||
353 | |||
354 | #define COMPAT_CL_SIZE (256) | ||
355 | |||
356 | struct compat_bootinfo { | ||
357 | unsigned long machtype; | ||
358 | unsigned long cputype; | ||
359 | struct compat_mem_info memory[COMPAT_NUM_MEMINFO]; | ||
360 | int num_memory; | ||
361 | unsigned long ramdisk_size; | ||
362 | unsigned long ramdisk_addr; | ||
363 | char command_line[COMPAT_CL_SIZE]; | ||
364 | union { | ||
365 | struct compat_bi_Amiga bi_ami; | ||
366 | struct compat_bi_Atari bi_ata; | ||
367 | struct compat_bi_Macintosh bi_mac; | ||
368 | } bi_un; | ||
369 | }; | ||
370 | |||
371 | #define bi_amiga bi_un.bi_ami | ||
372 | #define bi_atari bi_un.bi_ata | ||
373 | #define bi_mac bi_un.bi_mac | ||
374 | |||
375 | #endif /* BOOTINFO_COMPAT_1_0 */ | ||
376 | |||
377 | 27 | ||
378 | #endif /* _M68K_BOOTINFO_H */ | 28 | #endif /* _M68K_BOOTINFO_H */ |
diff --git a/arch/m68k/include/asm/hp300hw.h b/arch/m68k/include/asm/hp300hw.h index d998ea67c19c..64f5271dd7be 100644 --- a/arch/m68k/include/asm/hp300hw.h +++ b/arch/m68k/include/asm/hp300hw.h | |||
@@ -1,25 +1,9 @@ | |||
1 | #ifndef _M68K_HP300HW_H | 1 | #ifndef _M68K_HP300HW_H |
2 | #define _M68K_HP300HW_H | 2 | #define _M68K_HP300HW_H |
3 | 3 | ||
4 | extern unsigned long hp300_model; | 4 | #include <asm/bootinfo-hp300.h> |
5 | 5 | ||
6 | /* This information was taken from NetBSD */ | ||
7 | #define HP_320 (0) /* 16MHz 68020+HP MMU+16K external cache */ | ||
8 | #define HP_330 (1) /* 16MHz 68020+68851 MMU */ | ||
9 | #define HP_340 (2) /* 16MHz 68030 */ | ||
10 | #define HP_345 (3) /* 50MHz 68030+32K external cache */ | ||
11 | #define HP_350 (4) /* 25MHz 68020+HP MMU+32K external cache */ | ||
12 | #define HP_360 (5) /* 25MHz 68030 */ | ||
13 | #define HP_370 (6) /* 33MHz 68030+64K external cache */ | ||
14 | #define HP_375 (7) /* 50MHz 68030+32K external cache */ | ||
15 | #define HP_380 (8) /* 25MHz 68040 */ | ||
16 | #define HP_385 (9) /* 33MHz 68040 */ | ||
17 | 6 | ||
18 | #define HP_400 (10) /* 50MHz 68030+32K external cache */ | 7 | extern unsigned long hp300_model; |
19 | #define HP_425T (11) /* 25MHz 68040 - model 425t */ | ||
20 | #define HP_425S (12) /* 25MHz 68040 - model 425s */ | ||
21 | #define HP_425E (13) /* 25MHz 68040 - model 425e */ | ||
22 | #define HP_433T (14) /* 33MHz 68040 - model 433t */ | ||
23 | #define HP_433S (15) /* 33MHz 68040 - model 433s */ | ||
24 | 8 | ||
25 | #endif /* _M68K_HP300HW_H */ | 9 | #endif /* _M68K_HP300HW_H */ |
diff --git a/arch/m68k/include/asm/kexec.h b/arch/m68k/include/asm/kexec.h new file mode 100644 index 000000000000..3df97abac147 --- /dev/null +++ b/arch/m68k/include/asm/kexec.h | |||
@@ -0,0 +1,29 @@ | |||
1 | #ifndef _ASM_M68K_KEXEC_H | ||
2 | #define _ASM_M68K_KEXEC_H | ||
3 | |||
4 | #ifdef CONFIG_KEXEC | ||
5 | |||
6 | /* Maximum physical address we can use pages from */ | ||
7 | #define KEXEC_SOURCE_MEMORY_LIMIT (-1UL) | ||
8 | /* Maximum address we can reach in physical address mode */ | ||
9 | #define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL) | ||
10 | /* Maximum address we can use for the control code buffer */ | ||
11 | #define KEXEC_CONTROL_MEMORY_LIMIT (-1UL) | ||
12 | |||
13 | #define KEXEC_CONTROL_PAGE_SIZE 4096 | ||
14 | |||
15 | #define KEXEC_ARCH KEXEC_ARCH_68K | ||
16 | |||
17 | #ifndef __ASSEMBLY__ | ||
18 | |||
19 | static inline void crash_setup_regs(struct pt_regs *newregs, | ||
20 | struct pt_regs *oldregs) | ||
21 | { | ||
22 | /* Dummy implementation for now */ | ||
23 | } | ||
24 | |||
25 | #endif /* __ASSEMBLY__ */ | ||
26 | |||
27 | #endif /* CONFIG_KEXEC */ | ||
28 | |||
29 | #endif /* _ASM_M68K_KEXEC_H */ | ||
diff --git a/arch/m68k/include/asm/mac_via.h b/arch/m68k/include/asm/mac_via.h index aeeedf8b2d25..fe3fc9ae1b69 100644 --- a/arch/m68k/include/asm/mac_via.h +++ b/arch/m68k/include/asm/mac_via.h | |||
@@ -254,6 +254,8 @@ | |||
254 | extern volatile __u8 *via1,*via2; | 254 | extern volatile __u8 *via1,*via2; |
255 | extern int rbv_present,via_alt_mapping; | 255 | extern int rbv_present,via_alt_mapping; |
256 | 256 | ||
257 | struct irq_desc; | ||
258 | |||
257 | extern void via_register_interrupts(void); | 259 | extern void via_register_interrupts(void); |
258 | extern void via_irq_enable(int); | 260 | extern void via_irq_enable(int); |
259 | extern void via_irq_disable(int); | 261 | extern void via_irq_disable(int); |
diff --git a/arch/m68k/include/asm/macintosh.h b/arch/m68k/include/asm/macintosh.h index 682a1a2ff55f..d323b2c2d07d 100644 --- a/arch/m68k/include/asm/macintosh.h +++ b/arch/m68k/include/asm/macintosh.h | |||
@@ -4,6 +4,9 @@ | |||
4 | #include <linux/seq_file.h> | 4 | #include <linux/seq_file.h> |
5 | #include <linux/interrupt.h> | 5 | #include <linux/interrupt.h> |
6 | 6 | ||
7 | #include <asm/bootinfo-mac.h> | ||
8 | |||
9 | |||
7 | /* | 10 | /* |
8 | * Apple Macintoshisms | 11 | * Apple Macintoshisms |
9 | */ | 12 | */ |
@@ -74,65 +77,29 @@ struct mac_model | |||
74 | #define MAC_FLOPPY_SWIM_IOP 3 | 77 | #define MAC_FLOPPY_SWIM_IOP 3 |
75 | #define MAC_FLOPPY_AV 4 | 78 | #define MAC_FLOPPY_AV 4 |
76 | 79 | ||
77 | /* | 80 | extern struct mac_model *macintosh_config; |
78 | * Gestalt numbers | ||
79 | */ | ||
80 | 81 | ||
81 | #define MAC_MODEL_II 6 | ||
82 | #define MAC_MODEL_IIX 7 | ||
83 | #define MAC_MODEL_IICX 8 | ||
84 | #define MAC_MODEL_SE30 9 | ||
85 | #define MAC_MODEL_IICI 11 | ||
86 | #define MAC_MODEL_IIFX 13 /* And well numbered it is too */ | ||
87 | #define MAC_MODEL_IISI 18 | ||
88 | #define MAC_MODEL_LC 19 | ||
89 | #define MAC_MODEL_Q900 20 | ||
90 | #define MAC_MODEL_PB170 21 | ||
91 | #define MAC_MODEL_Q700 22 | ||
92 | #define MAC_MODEL_CLII 23 /* aka: P200 */ | ||
93 | #define MAC_MODEL_PB140 25 | ||
94 | #define MAC_MODEL_Q950 26 /* aka: WGS95 */ | ||
95 | #define MAC_MODEL_LCIII 27 /* aka: P450 */ | ||
96 | #define MAC_MODEL_PB210 29 | ||
97 | #define MAC_MODEL_C650 30 | ||
98 | #define MAC_MODEL_PB230 32 | ||
99 | #define MAC_MODEL_PB180 33 | ||
100 | #define MAC_MODEL_PB160 34 | ||
101 | #define MAC_MODEL_Q800 35 /* aka: WGS80 */ | ||
102 | #define MAC_MODEL_Q650 36 | ||
103 | #define MAC_MODEL_LCII 37 /* aka: P400/405/410/430 */ | ||
104 | #define MAC_MODEL_PB250 38 | ||
105 | #define MAC_MODEL_IIVI 44 | ||
106 | #define MAC_MODEL_P600 45 /* aka: P600CD */ | ||
107 | #define MAC_MODEL_IIVX 48 | ||
108 | #define MAC_MODEL_CCL 49 /* aka: P250 */ | ||
109 | #define MAC_MODEL_PB165C 50 | ||
110 | #define MAC_MODEL_C610 52 /* aka: WGS60 */ | ||
111 | #define MAC_MODEL_Q610 53 | ||
112 | #define MAC_MODEL_PB145 54 /* aka: PB145B */ | ||
113 | #define MAC_MODEL_P520 56 /* aka: LC520 */ | ||
114 | #define MAC_MODEL_C660 60 | ||
115 | #define MAC_MODEL_P460 62 /* aka: LCIII+, P466/P467 */ | ||
116 | #define MAC_MODEL_PB180C 71 | ||
117 | #define MAC_MODEL_PB520 72 /* aka: PB520C, PB540, PB540C, PB550C */ | ||
118 | #define MAC_MODEL_PB270C 77 | ||
119 | #define MAC_MODEL_Q840 78 | ||
120 | #define MAC_MODEL_P550 80 /* aka: LC550, P560 */ | ||
121 | #define MAC_MODEL_CCLII 83 /* aka: P275 */ | ||
122 | #define MAC_MODEL_PB165 84 | ||
123 | #define MAC_MODEL_PB190 85 /* aka: PB190CS */ | ||
124 | #define MAC_MODEL_TV 88 | ||
125 | #define MAC_MODEL_P475 89 /* aka: LC475, P476 */ | ||
126 | #define MAC_MODEL_P475F 90 /* aka: P475 w/ FPU (no LC040) */ | ||
127 | #define MAC_MODEL_P575 92 /* aka: LC575, P577/P578 */ | ||
128 | #define MAC_MODEL_Q605 94 | ||
129 | #define MAC_MODEL_Q605_ACC 95 /* Q605 accelerated to 33 MHz */ | ||
130 | #define MAC_MODEL_Q630 98 /* aka: LC630, P630/631/635/636/637/638/640 */ | ||
131 | #define MAC_MODEL_P588 99 /* aka: LC580, P580 */ | ||
132 | #define MAC_MODEL_PB280 102 | ||
133 | #define MAC_MODEL_PB280C 103 | ||
134 | #define MAC_MODEL_PB150 115 | ||
135 | 82 | ||
136 | extern struct mac_model *macintosh_config; | 83 | /* |
84 | * Internal representation of the Mac hardware, filled in from bootinfo | ||
85 | */ | ||
86 | |||
87 | struct mac_booter_data | ||
88 | { | ||
89 | unsigned long videoaddr; | ||
90 | unsigned long videorow; | ||
91 | unsigned long videodepth; | ||
92 | unsigned long dimensions; | ||
93 | unsigned long boottime; | ||
94 | unsigned long gmtbias; | ||
95 | unsigned long videological; | ||
96 | unsigned long sccbase; | ||
97 | unsigned long id; | ||
98 | unsigned long memsize; | ||
99 | unsigned long cpuid; | ||
100 | unsigned long rombase; | ||
101 | }; | ||
102 | |||
103 | extern struct mac_booter_data mac_bi_data; | ||
137 | 104 | ||
138 | #endif | 105 | #endif |
diff --git a/arch/m68k/include/asm/mc146818rtc.h b/arch/m68k/include/asm/mc146818rtc.h index 9f70a01f73dc..05b43bf5cdf3 100644 --- a/arch/m68k/include/asm/mc146818rtc.h +++ b/arch/m68k/include/asm/mc146818rtc.h | |||
@@ -10,16 +10,16 @@ | |||
10 | 10 | ||
11 | #include <asm/atarihw.h> | 11 | #include <asm/atarihw.h> |
12 | 12 | ||
13 | #define RTC_PORT(x) (TT_RTC_BAS + 2*(x)) | 13 | #define ATARI_RTC_PORT(x) (TT_RTC_BAS + 2*(x)) |
14 | #define RTC_ALWAYS_BCD 0 | 14 | #define RTC_ALWAYS_BCD 0 |
15 | 15 | ||
16 | #define CMOS_READ(addr) ({ \ | 16 | #define CMOS_READ(addr) ({ \ |
17 | atari_outb_p((addr),RTC_PORT(0)); \ | 17 | atari_outb_p((addr), ATARI_RTC_PORT(0)); \ |
18 | atari_inb_p(RTC_PORT(1)); \ | 18 | atari_inb_p(ATARI_RTC_PORT(1)); \ |
19 | }) | 19 | }) |
20 | #define CMOS_WRITE(val, addr) ({ \ | 20 | #define CMOS_WRITE(val, addr) ({ \ |
21 | atari_outb_p((addr),RTC_PORT(0)); \ | 21 | atari_outb_p((addr), ATARI_RTC_PORT(0)); \ |
22 | atari_outb_p((val),RTC_PORT(1)); \ | 22 | atari_outb_p((val), ATARI_RTC_PORT(1)); \ |
23 | }) | 23 | }) |
24 | #endif /* CONFIG_ATARI */ | 24 | #endif /* CONFIG_ATARI */ |
25 | 25 | ||
diff --git a/arch/m68k/include/asm/mvme16xhw.h b/arch/m68k/include/asm/mvme16xhw.h index 6117f56653d2..1eb89de631e5 100644 --- a/arch/m68k/include/asm/mvme16xhw.h +++ b/arch/m68k/include/asm/mvme16xhw.h | |||
@@ -3,23 +3,6 @@ | |||
3 | 3 | ||
4 | #include <asm/irq.h> | 4 | #include <asm/irq.h> |
5 | 5 | ||
6 | /* Board ID data structure - pointer to this retrieved from Bug by head.S */ | ||
7 | |||
8 | /* Note, bytes 12 and 13 are board no in BCD (0162,0166,0167,0177,etc) */ | ||
9 | |||
10 | extern long mvme_bdid_ptr; | ||
11 | |||
12 | typedef struct { | ||
13 | char bdid[4]; | ||
14 | u_char rev, mth, day, yr; | ||
15 | u_short size, reserved; | ||
16 | u_short brdno; | ||
17 | char brdsuffix[2]; | ||
18 | u_long options; | ||
19 | u_short clun, dlun, ctype, dnum; | ||
20 | u_long option2; | ||
21 | } t_bdid, *p_bdid; | ||
22 | |||
23 | 6 | ||
24 | typedef struct { | 7 | typedef struct { |
25 | u_char ack_icr, | 8 | u_char ack_icr, |
diff --git a/arch/m68k/include/asm/setup.h b/arch/m68k/include/asm/setup.h index 65e78a2dad64..8f2023f8c1c4 100644 --- a/arch/m68k/include/asm/setup.h +++ b/arch/m68k/include/asm/setup.h | |||
@@ -22,6 +22,7 @@ | |||
22 | #ifndef _M68K_SETUP_H | 22 | #ifndef _M68K_SETUP_H |
23 | #define _M68K_SETUP_H | 23 | #define _M68K_SETUP_H |
24 | 24 | ||
25 | #include <uapi/asm/bootinfo.h> | ||
25 | #include <uapi/asm/setup.h> | 26 | #include <uapi/asm/setup.h> |
26 | 27 | ||
27 | 28 | ||
@@ -297,14 +298,14 @@ extern int m68k_is040or060; | |||
297 | #define NUM_MEMINFO 4 | 298 | #define NUM_MEMINFO 4 |
298 | 299 | ||
299 | #ifndef __ASSEMBLY__ | 300 | #ifndef __ASSEMBLY__ |
300 | struct mem_info { | 301 | struct m68k_mem_info { |
301 | unsigned long addr; /* physical address of memory chunk */ | 302 | unsigned long addr; /* physical address of memory chunk */ |
302 | unsigned long size; /* length of memory chunk (in bytes) */ | 303 | unsigned long size; /* length of memory chunk (in bytes) */ |
303 | }; | 304 | }; |
304 | 305 | ||
305 | extern int m68k_num_memory; /* # of memory blocks found (and used) */ | 306 | extern int m68k_num_memory; /* # of memory blocks found (and used) */ |
306 | extern int m68k_realnum_memory; /* real # of memory blocks found */ | 307 | extern int m68k_realnum_memory; /* real # of memory blocks found */ |
307 | extern struct mem_info m68k_memory[NUM_MEMINFO];/* memory description */ | 308 | extern struct m68k_mem_info m68k_memory[NUM_MEMINFO];/* memory description */ |
308 | #endif | 309 | #endif |
309 | 310 | ||
310 | #endif /* _M68K_SETUP_H */ | 311 | #endif /* _M68K_SETUP_H */ |
diff --git a/arch/m68k/include/asm/timex.h b/arch/m68k/include/asm/timex.h index 6759dad954f6..efc1f4892357 100644 --- a/arch/m68k/include/asm/timex.h +++ b/arch/m68k/include/asm/timex.h | |||
@@ -28,4 +28,14 @@ static inline cycles_t get_cycles(void) | |||
28 | return 0; | 28 | return 0; |
29 | } | 29 | } |
30 | 30 | ||
31 | extern unsigned long (*mach_random_get_entropy)(void); | ||
32 | |||
33 | static inline unsigned long random_get_entropy(void) | ||
34 | { | ||
35 | if (mach_random_get_entropy) | ||
36 | return mach_random_get_entropy(); | ||
37 | return 0; | ||
38 | } | ||
39 | #define random_get_entropy random_get_entropy | ||
40 | |||
31 | #endif | 41 | #endif |
diff --git a/arch/m68k/include/uapi/asm/Kbuild b/arch/m68k/include/uapi/asm/Kbuild index 1fef45ada097..6a2d257bdfb2 100644 --- a/arch/m68k/include/uapi/asm/Kbuild +++ b/arch/m68k/include/uapi/asm/Kbuild | |||
@@ -11,6 +11,14 @@ generic-y += termbits.h | |||
11 | generic-y += termios.h | 11 | generic-y += termios.h |
12 | 12 | ||
13 | header-y += a.out.h | 13 | header-y += a.out.h |
14 | header-y += bootinfo.h | ||
15 | header-y += bootinfo-amiga.h | ||
16 | header-y += bootinfo-apollo.h | ||
17 | header-y += bootinfo-atari.h | ||
18 | header-y += bootinfo-hp300.h | ||
19 | header-y += bootinfo-mac.h | ||
20 | header-y += bootinfo-q40.h | ||
21 | header-y += bootinfo-vme.h | ||
14 | header-y += byteorder.h | 22 | header-y += byteorder.h |
15 | header-y += cachectl.h | 23 | header-y += cachectl.h |
16 | header-y += fcntl.h | 24 | header-y += fcntl.h |
diff --git a/arch/m68k/include/uapi/asm/bootinfo-amiga.h b/arch/m68k/include/uapi/asm/bootinfo-amiga.h new file mode 100644 index 000000000000..daad3c58d2da --- /dev/null +++ b/arch/m68k/include/uapi/asm/bootinfo-amiga.h | |||
@@ -0,0 +1,63 @@ | |||
1 | /* | ||
2 | ** asm/bootinfo-amiga.h -- Amiga-specific boot information definitions | ||
3 | */ | ||
4 | |||
5 | #ifndef _UAPI_ASM_M68K_BOOTINFO_AMIGA_H | ||
6 | #define _UAPI_ASM_M68K_BOOTINFO_AMIGA_H | ||
7 | |||
8 | |||
9 | /* | ||
10 | * Amiga-specific tags | ||
11 | */ | ||
12 | |||
13 | #define BI_AMIGA_MODEL 0x8000 /* model (__be32) */ | ||
14 | #define BI_AMIGA_AUTOCON 0x8001 /* AutoConfig device */ | ||
15 | /* (AmigaOS struct ConfigDev) */ | ||
16 | #define BI_AMIGA_CHIP_SIZE 0x8002 /* size of Chip RAM (__be32) */ | ||
17 | #define BI_AMIGA_VBLANK 0x8003 /* VBLANK frequency (__u8) */ | ||
18 | #define BI_AMIGA_PSFREQ 0x8004 /* power supply frequency (__u8) */ | ||
19 | #define BI_AMIGA_ECLOCK 0x8005 /* EClock frequency (__be32) */ | ||
20 | #define BI_AMIGA_CHIPSET 0x8006 /* native chipset present (__be32) */ | ||
21 | #define BI_AMIGA_SERPER 0x8007 /* serial port period (__be16) */ | ||
22 | |||
23 | |||
24 | /* | ||
25 | * Amiga models (BI_AMIGA_MODEL) | ||
26 | */ | ||
27 | |||
28 | #define AMI_UNKNOWN 0 | ||
29 | #define AMI_500 1 | ||
30 | #define AMI_500PLUS 2 | ||
31 | #define AMI_600 3 | ||
32 | #define AMI_1000 4 | ||
33 | #define AMI_1200 5 | ||
34 | #define AMI_2000 6 | ||
35 | #define AMI_2500 7 | ||
36 | #define AMI_3000 8 | ||
37 | #define AMI_3000T 9 | ||
38 | #define AMI_3000PLUS 10 | ||
39 | #define AMI_4000 11 | ||
40 | #define AMI_4000T 12 | ||
41 | #define AMI_CDTV 13 | ||
42 | #define AMI_CD32 14 | ||
43 | #define AMI_DRACO 15 | ||
44 | |||
45 | |||
46 | /* | ||
47 | * Amiga chipsets (BI_AMIGA_CHIPSET) | ||
48 | */ | ||
49 | |||
50 | #define CS_STONEAGE 0 | ||
51 | #define CS_OCS 1 | ||
52 | #define CS_ECS 2 | ||
53 | #define CS_AGA 3 | ||
54 | |||
55 | |||
56 | /* | ||
57 | * Latest Amiga bootinfo version | ||
58 | */ | ||
59 | |||
60 | #define AMIGA_BOOTI_VERSION MK_BI_VERSION(2, 0) | ||
61 | |||
62 | |||
63 | #endif /* _UAPI_ASM_M68K_BOOTINFO_AMIGA_H */ | ||
diff --git a/arch/m68k/include/uapi/asm/bootinfo-apollo.h b/arch/m68k/include/uapi/asm/bootinfo-apollo.h new file mode 100644 index 000000000000..a93e0af1c6fe --- /dev/null +++ b/arch/m68k/include/uapi/asm/bootinfo-apollo.h | |||
@@ -0,0 +1,28 @@ | |||
1 | /* | ||
2 | ** asm/bootinfo-apollo.h -- Apollo-specific boot information definitions | ||
3 | */ | ||
4 | |||
5 | #ifndef _UAPI_ASM_M68K_BOOTINFO_APOLLO_H | ||
6 | #define _UAPI_ASM_M68K_BOOTINFO_APOLLO_H | ||
7 | |||
8 | |||
9 | /* | ||
10 | * Apollo-specific tags | ||
11 | */ | ||
12 | |||
13 | #define BI_APOLLO_MODEL 0x8000 /* model (__be32) */ | ||
14 | |||
15 | |||
16 | /* | ||
17 | * Apollo models (BI_APOLLO_MODEL) | ||
18 | */ | ||
19 | |||
20 | #define APOLLO_UNKNOWN 0 | ||
21 | #define APOLLO_DN3000 1 | ||
22 | #define APOLLO_DN3010 2 | ||
23 | #define APOLLO_DN3500 3 | ||
24 | #define APOLLO_DN4000 4 | ||
25 | #define APOLLO_DN4500 5 | ||
26 | |||
27 | |||
28 | #endif /* _UAPI_ASM_M68K_BOOTINFO_APOLLO_H */ | ||
diff --git a/arch/m68k/include/uapi/asm/bootinfo-atari.h b/arch/m68k/include/uapi/asm/bootinfo-atari.h new file mode 100644 index 000000000000..a817854049bb --- /dev/null +++ b/arch/m68k/include/uapi/asm/bootinfo-atari.h | |||
@@ -0,0 +1,44 @@ | |||
1 | /* | ||
2 | ** asm/bootinfo-atari.h -- Atari-specific boot information definitions | ||
3 | */ | ||
4 | |||
5 | #ifndef _UAPI_ASM_M68K_BOOTINFO_ATARI_H | ||
6 | #define _UAPI_ASM_M68K_BOOTINFO_ATARI_H | ||
7 | |||
8 | |||
9 | /* | ||
10 | * Atari-specific tags | ||
11 | */ | ||
12 | |||
13 | #define BI_ATARI_MCH_COOKIE 0x8000 /* _MCH cookie from TOS (__be32) */ | ||
14 | #define BI_ATARI_MCH_TYPE 0x8001 /* special machine type (__be32) */ | ||
15 | |||
16 | |||
17 | /* | ||
18 | * mch_cookie values (upper word of BI_ATARI_MCH_COOKIE) | ||
19 | */ | ||
20 | |||
21 | #define ATARI_MCH_ST 0 | ||
22 | #define ATARI_MCH_STE 1 | ||
23 | #define ATARI_MCH_TT 2 | ||
24 | #define ATARI_MCH_FALCON 3 | ||
25 | |||
26 | |||
27 | /* | ||
28 | * Atari machine types (BI_ATARI_MCH_TYPE) | ||
29 | */ | ||
30 | |||
31 | #define ATARI_MACH_NORMAL 0 /* no special machine type */ | ||
32 | #define ATARI_MACH_MEDUSA 1 /* Medusa 040 */ | ||
33 | #define ATARI_MACH_HADES 2 /* Hades 040 or 060 */ | ||
34 | #define ATARI_MACH_AB40 3 /* Afterburner040 on Falcon */ | ||
35 | |||
36 | |||
37 | /* | ||
38 | * Latest Atari bootinfo version | ||
39 | */ | ||
40 | |||
41 | #define ATARI_BOOTI_VERSION MK_BI_VERSION(2, 1) | ||
42 | |||
43 | |||
44 | #endif /* _UAPI_ASM_M68K_BOOTINFO_ATARI_H */ | ||
diff --git a/arch/m68k/include/uapi/asm/bootinfo-hp300.h b/arch/m68k/include/uapi/asm/bootinfo-hp300.h new file mode 100644 index 000000000000..c90cb71ed89a --- /dev/null +++ b/arch/m68k/include/uapi/asm/bootinfo-hp300.h | |||
@@ -0,0 +1,50 @@ | |||
1 | /* | ||
2 | ** asm/bootinfo-hp300.h -- HP9000/300-specific boot information definitions | ||
3 | */ | ||
4 | |||
5 | #ifndef _UAPI_ASM_M68K_BOOTINFO_HP300_H | ||
6 | #define _UAPI_ASM_M68K_BOOTINFO_HP300_H | ||
7 | |||
8 | |||
9 | /* | ||
10 | * HP9000/300-specific tags | ||
11 | */ | ||
12 | |||
13 | #define BI_HP300_MODEL 0x8000 /* model (__be32) */ | ||
14 | #define BI_HP300_UART_SCODE 0x8001 /* UART select code (__be32) */ | ||
15 | #define BI_HP300_UART_ADDR 0x8002 /* phys. addr of UART (__be32) */ | ||
16 | |||
17 | |||
18 | /* | ||
19 | * HP9000/300 and /400 models (BI_HP300_MODEL) | ||
20 | * | ||
21 | * This information was taken from NetBSD | ||
22 | */ | ||
23 | |||
24 | #define HP_320 0 /* 16MHz 68020+HP MMU+16K external cache */ | ||
25 | #define HP_330 1 /* 16MHz 68020+68851 MMU */ | ||
26 | #define HP_340 2 /* 16MHz 68030 */ | ||
27 | #define HP_345 3 /* 50MHz 68030+32K external cache */ | ||
28 | #define HP_350 4 /* 25MHz 68020+HP MMU+32K external cache */ | ||
29 | #define HP_360 5 /* 25MHz 68030 */ | ||
30 | #define HP_370 6 /* 33MHz 68030+64K external cache */ | ||
31 | #define HP_375 7 /* 50MHz 68030+32K external cache */ | ||
32 | #define HP_380 8 /* 25MHz 68040 */ | ||
33 | #define HP_385 9 /* 33MHz 68040 */ | ||
34 | |||
35 | #define HP_400 10 /* 50MHz 68030+32K external cache */ | ||
36 | #define HP_425T 11 /* 25MHz 68040 - model 425t */ | ||
37 | #define HP_425S 12 /* 25MHz 68040 - model 425s */ | ||
38 | #define HP_425E 13 /* 25MHz 68040 - model 425e */ | ||
39 | #define HP_433T 14 /* 33MHz 68040 - model 433t */ | ||
40 | #define HP_433S 15 /* 33MHz 68040 - model 433s */ | ||
41 | |||
42 | |||
43 | /* | ||
44 | * Latest HP9000/300 bootinfo version | ||
45 | */ | ||
46 | |||
47 | #define HP300_BOOTI_VERSION MK_BI_VERSION(2, 0) | ||
48 | |||
49 | |||
50 | #endif /* _UAPI_ASM_M68K_BOOTINFO_HP300_H */ | ||
diff --git a/arch/m68k/include/uapi/asm/bootinfo-mac.h b/arch/m68k/include/uapi/asm/bootinfo-mac.h new file mode 100644 index 000000000000..b44ff73898a9 --- /dev/null +++ b/arch/m68k/include/uapi/asm/bootinfo-mac.h | |||
@@ -0,0 +1,119 @@ | |||
1 | /* | ||
2 | ** asm/bootinfo-mac.h -- Macintosh-specific boot information definitions | ||
3 | */ | ||
4 | |||
5 | #ifndef _UAPI_ASM_M68K_BOOTINFO_MAC_H | ||
6 | #define _UAPI_ASM_M68K_BOOTINFO_MAC_H | ||
7 | |||
8 | |||
9 | /* | ||
10 | * Macintosh-specific tags (all __be32) | ||
11 | */ | ||
12 | |||
13 | #define BI_MAC_MODEL 0x8000 /* Mac Gestalt ID (model type) */ | ||
14 | #define BI_MAC_VADDR 0x8001 /* Mac video base address */ | ||
15 | #define BI_MAC_VDEPTH 0x8002 /* Mac video depth */ | ||
16 | #define BI_MAC_VROW 0x8003 /* Mac video rowbytes */ | ||
17 | #define BI_MAC_VDIM 0x8004 /* Mac video dimensions */ | ||
18 | #define BI_MAC_VLOGICAL 0x8005 /* Mac video logical base */ | ||
19 | #define BI_MAC_SCCBASE 0x8006 /* Mac SCC base address */ | ||
20 | #define BI_MAC_BTIME 0x8007 /* Mac boot time */ | ||
21 | #define BI_MAC_GMTBIAS 0x8008 /* Mac GMT timezone offset */ | ||
22 | #define BI_MAC_MEMSIZE 0x8009 /* Mac RAM size (sanity check) */ | ||
23 | #define BI_MAC_CPUID 0x800a /* Mac CPU type (sanity check) */ | ||
24 | #define BI_MAC_ROMBASE 0x800b /* Mac system ROM base address */ | ||
25 | |||
26 | |||
27 | /* | ||
28 | * Macintosh hardware profile data - unused, see macintosh.h for | ||
29 | * reasonable type values | ||
30 | */ | ||
31 | |||
32 | #define BI_MAC_VIA1BASE 0x8010 /* Mac VIA1 base address (always present) */ | ||
33 | #define BI_MAC_VIA2BASE 0x8011 /* Mac VIA2 base address (type varies) */ | ||
34 | #define BI_MAC_VIA2TYPE 0x8012 /* Mac VIA2 type (VIA, RBV, OSS) */ | ||
35 | #define BI_MAC_ADBTYPE 0x8013 /* Mac ADB interface type */ | ||
36 | #define BI_MAC_ASCBASE 0x8014 /* Mac Apple Sound Chip base address */ | ||
37 | #define BI_MAC_SCSI5380 0x8015 /* Mac NCR 5380 SCSI (base address, multi) */ | ||
38 | #define BI_MAC_SCSIDMA 0x8016 /* Mac SCSI DMA (base address) */ | ||
39 | #define BI_MAC_SCSI5396 0x8017 /* Mac NCR 53C96 SCSI (base address, multi) */ | ||
40 | #define BI_MAC_IDETYPE 0x8018 /* Mac IDE interface type */ | ||
41 | #define BI_MAC_IDEBASE 0x8019 /* Mac IDE interface base address */ | ||
42 | #define BI_MAC_NUBUS 0x801a /* Mac Nubus type (none, regular, pseudo) */ | ||
43 | #define BI_MAC_SLOTMASK 0x801b /* Mac Nubus slots present */ | ||
44 | #define BI_MAC_SCCTYPE 0x801c /* Mac SCC serial type (normal, IOP) */ | ||
45 | #define BI_MAC_ETHTYPE 0x801d /* Mac builtin ethernet type (Sonic, MACE */ | ||
46 | #define BI_MAC_ETHBASE 0x801e /* Mac builtin ethernet base address */ | ||
47 | #define BI_MAC_PMU 0x801f /* Mac power management / poweroff hardware */ | ||
48 | #define BI_MAC_IOP_SWIM 0x8020 /* Mac SWIM floppy IOP */ | ||
49 | #define BI_MAC_IOP_ADB 0x8021 /* Mac ADB IOP */ | ||
50 | |||
51 | |||
52 | /* | ||
53 | * Macintosh Gestalt numbers (BI_MAC_MODEL) | ||
54 | */ | ||
55 | |||
56 | #define MAC_MODEL_II 6 | ||
57 | #define MAC_MODEL_IIX 7 | ||
58 | #define MAC_MODEL_IICX 8 | ||
59 | #define MAC_MODEL_SE30 9 | ||
60 | #define MAC_MODEL_IICI 11 | ||
61 | #define MAC_MODEL_IIFX 13 /* And well numbered it is too */ | ||
62 | #define MAC_MODEL_IISI 18 | ||
63 | #define MAC_MODEL_LC 19 | ||
64 | #define MAC_MODEL_Q900 20 | ||
65 | #define MAC_MODEL_PB170 21 | ||
66 | #define MAC_MODEL_Q700 22 | ||
67 | #define MAC_MODEL_CLII 23 /* aka: P200 */ | ||
68 | #define MAC_MODEL_PB140 25 | ||
69 | #define MAC_MODEL_Q950 26 /* aka: WGS95 */ | ||
70 | #define MAC_MODEL_LCIII 27 /* aka: P450 */ | ||
71 | #define MAC_MODEL_PB210 29 | ||
72 | #define MAC_MODEL_C650 30 | ||
73 | #define MAC_MODEL_PB230 32 | ||
74 | #define MAC_MODEL_PB180 33 | ||
75 | #define MAC_MODEL_PB160 34 | ||
76 | #define MAC_MODEL_Q800 35 /* aka: WGS80 */ | ||
77 | #define MAC_MODEL_Q650 36 | ||
78 | #define MAC_MODEL_LCII 37 /* aka: P400/405/410/430 */ | ||
79 | #define MAC_MODEL_PB250 38 | ||
80 | #define MAC_MODEL_IIVI 44 | ||
81 | #define MAC_MODEL_P600 45 /* aka: P600CD */ | ||
82 | #define MAC_MODEL_IIVX 48 | ||
83 | #define MAC_MODEL_CCL 49 /* aka: P250 */ | ||
84 | #define MAC_MODEL_PB165C 50 | ||
85 | #define MAC_MODEL_C610 52 /* aka: WGS60 */ | ||
86 | #define MAC_MODEL_Q610 53 | ||
87 | #define MAC_MODEL_PB145 54 /* aka: PB145B */ | ||
88 | #define MAC_MODEL_P520 56 /* aka: LC520 */ | ||
89 | #define MAC_MODEL_C660 60 | ||
90 | #define MAC_MODEL_P460 62 /* aka: LCIII+, P466/P467 */ | ||
91 | #define MAC_MODEL_PB180C 71 | ||
92 | #define MAC_MODEL_PB520 72 /* aka: PB520C, PB540, PB540C, PB550C */ | ||
93 | #define MAC_MODEL_PB270C 77 | ||
94 | #define MAC_MODEL_Q840 78 | ||
95 | #define MAC_MODEL_P550 80 /* aka: LC550, P560 */ | ||
96 | #define MAC_MODEL_CCLII 83 /* aka: P275 */ | ||
97 | #define MAC_MODEL_PB165 84 | ||
98 | #define MAC_MODEL_PB190 85 /* aka: PB190CS */ | ||
99 | #define MAC_MODEL_TV 88 | ||
100 | #define MAC_MODEL_P475 89 /* aka: LC475, P476 */ | ||
101 | #define MAC_MODEL_P475F 90 /* aka: P475 w/ FPU (no LC040) */ | ||
102 | #define MAC_MODEL_P575 92 /* aka: LC575, P577/P578 */ | ||
103 | #define MAC_MODEL_Q605 94 | ||
104 | #define MAC_MODEL_Q605_ACC 95 /* Q605 accelerated to 33 MHz */ | ||
105 | #define MAC_MODEL_Q630 98 /* aka: LC630, P630/631/635/636/637/638/640 */ | ||
106 | #define MAC_MODEL_P588 99 /* aka: LC580, P580 */ | ||
107 | #define MAC_MODEL_PB280 102 | ||
108 | #define MAC_MODEL_PB280C 103 | ||
109 | #define MAC_MODEL_PB150 115 | ||
110 | |||
111 | |||
112 | /* | ||
113 | * Latest Macintosh bootinfo version | ||
114 | */ | ||
115 | |||
116 | #define MAC_BOOTI_VERSION MK_BI_VERSION(2, 0) | ||
117 | |||
118 | |||
119 | #endif /* _UAPI_ASM_M68K_BOOTINFO_MAC_H */ | ||
diff --git a/arch/m68k/include/uapi/asm/bootinfo-q40.h b/arch/m68k/include/uapi/asm/bootinfo-q40.h new file mode 100644 index 000000000000..c79fea7e555b --- /dev/null +++ b/arch/m68k/include/uapi/asm/bootinfo-q40.h | |||
@@ -0,0 +1,16 @@ | |||
1 | /* | ||
2 | ** asm/bootinfo-q40.h -- Q40-specific boot information definitions | ||
3 | */ | ||
4 | |||
5 | #ifndef _UAPI_ASM_M68K_BOOTINFO_Q40_H | ||
6 | #define _UAPI_ASM_M68K_BOOTINFO_Q40_H | ||
7 | |||
8 | |||
9 | /* | ||
10 | * Latest Q40 bootinfo version | ||
11 | */ | ||
12 | |||
13 | #define Q40_BOOTI_VERSION MK_BI_VERSION(2, 0) | ||
14 | |||
15 | |||
16 | #endif /* _UAPI_ASM_M68K_BOOTINFO_Q40_H */ | ||
diff --git a/arch/m68k/include/uapi/asm/bootinfo-vme.h b/arch/m68k/include/uapi/asm/bootinfo-vme.h new file mode 100644 index 000000000000..a135eb41d672 --- /dev/null +++ b/arch/m68k/include/uapi/asm/bootinfo-vme.h | |||
@@ -0,0 +1,70 @@ | |||
1 | /* | ||
2 | ** asm/bootinfo-vme.h -- VME-specific boot information definitions | ||
3 | */ | ||
4 | |||
5 | #ifndef _UAPI_ASM_M68K_BOOTINFO_VME_H | ||
6 | #define _UAPI_ASM_M68K_BOOTINFO_VME_H | ||
7 | |||
8 | |||
9 | #include <linux/types.h> | ||
10 | |||
11 | |||
12 | /* | ||
13 | * VME-specific tags | ||
14 | */ | ||
15 | |||
16 | #define BI_VME_TYPE 0x8000 /* VME sub-architecture (__be32) */ | ||
17 | #define BI_VME_BRDINFO 0x8001 /* VME board information (struct) */ | ||
18 | |||
19 | |||
20 | /* | ||
21 | * VME models (BI_VME_TYPE) | ||
22 | */ | ||
23 | |||
24 | #define VME_TYPE_TP34V 0x0034 /* Tadpole TP34V */ | ||
25 | #define VME_TYPE_MVME147 0x0147 /* Motorola MVME147 */ | ||
26 | #define VME_TYPE_MVME162 0x0162 /* Motorola MVME162 */ | ||
27 | #define VME_TYPE_MVME166 0x0166 /* Motorola MVME166 */ | ||
28 | #define VME_TYPE_MVME167 0x0167 /* Motorola MVME167 */ | ||
29 | #define VME_TYPE_MVME172 0x0172 /* Motorola MVME172 */ | ||
30 | #define VME_TYPE_MVME177 0x0177 /* Motorola MVME177 */ | ||
31 | #define VME_TYPE_BVME4000 0x4000 /* BVM Ltd. BVME4000 */ | ||
32 | #define VME_TYPE_BVME6000 0x6000 /* BVM Ltd. BVME6000 */ | ||
33 | |||
34 | |||
35 | #ifndef __ASSEMBLY__ | ||
36 | |||
37 | /* | ||
38 | * Board ID data structure - pointer to this retrieved from Bug by head.S | ||
39 | * | ||
40 | * BI_VME_BRDINFO is a 32 byte struct as returned by the Bug code on | ||
41 | * Motorola VME boards. Contains board number, Bug version, board | ||
42 | * configuration options, etc. | ||
43 | * | ||
44 | * Note, bytes 12 and 13 are board no in BCD (0162,0166,0167,0177,etc) | ||
45 | */ | ||
46 | |||
47 | typedef struct { | ||
48 | char bdid[4]; | ||
49 | __u8 rev, mth, day, yr; | ||
50 | __be16 size, reserved; | ||
51 | __be16 brdno; | ||
52 | char brdsuffix[2]; | ||
53 | __be32 options; | ||
54 | __be16 clun, dlun, ctype, dnum; | ||
55 | __be32 option2; | ||
56 | } t_bdid, *p_bdid; | ||
57 | |||
58 | #endif /* __ASSEMBLY__ */ | ||
59 | |||
60 | |||
61 | /* | ||
62 | * Latest VME bootinfo versions | ||
63 | */ | ||
64 | |||
65 | #define MVME147_BOOTI_VERSION MK_BI_VERSION(2, 0) | ||
66 | #define MVME16x_BOOTI_VERSION MK_BI_VERSION(2, 0) | ||
67 | #define BVME6000_BOOTI_VERSION MK_BI_VERSION(2, 0) | ||
68 | |||
69 | |||
70 | #endif /* _UAPI_ASM_M68K_BOOTINFO_VME_H */ | ||
diff --git a/arch/m68k/include/uapi/asm/bootinfo.h b/arch/m68k/include/uapi/asm/bootinfo.h new file mode 100644 index 000000000000..cdeb26a015b0 --- /dev/null +++ b/arch/m68k/include/uapi/asm/bootinfo.h | |||
@@ -0,0 +1,174 @@ | |||
1 | /* | ||
2 | * asm/bootinfo.h -- Definition of the Linux/m68k boot information structure | ||
3 | * | ||
4 | * Copyright 1992 by Greg Harp | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file COPYING in the main directory of this archive | ||
8 | * for more details. | ||
9 | */ | ||
10 | |||
11 | #ifndef _UAPI_ASM_M68K_BOOTINFO_H | ||
12 | #define _UAPI_ASM_M68K_BOOTINFO_H | ||
13 | |||
14 | |||
15 | #include <linux/types.h> | ||
16 | |||
17 | |||
18 | #ifndef __ASSEMBLY__ | ||
19 | |||
20 | /* | ||
21 | * Bootinfo definitions | ||
22 | * | ||
23 | * This is an easily parsable and extendable structure containing all | ||
24 | * information to be passed from the bootstrap to the kernel. | ||
25 | * | ||
26 | * This way I hope to keep all future changes back/forewards compatible. | ||
27 | * Thus, keep your fingers crossed... | ||
28 | * | ||
29 | * This structure is copied right after the kernel by the bootstrap | ||
30 | * routine. | ||
31 | */ | ||
32 | |||
33 | struct bi_record { | ||
34 | __be16 tag; /* tag ID */ | ||
35 | __be16 size; /* size of record (in bytes) */ | ||
36 | __be32 data[0]; /* data */ | ||
37 | }; | ||
38 | |||
39 | |||
40 | struct mem_info { | ||
41 | __be32 addr; /* physical address of memory chunk */ | ||
42 | __be32 size; /* length of memory chunk (in bytes) */ | ||
43 | }; | ||
44 | |||
45 | #endif /* __ASSEMBLY__ */ | ||
46 | |||
47 | |||
48 | /* | ||
49 | * Tag Definitions | ||
50 | * | ||
51 | * Machine independent tags start counting from 0x0000 | ||
52 | * Machine dependent tags start counting from 0x8000 | ||
53 | */ | ||
54 | |||
55 | #define BI_LAST 0x0000 /* last record (sentinel) */ | ||
56 | #define BI_MACHTYPE 0x0001 /* machine type (__be32) */ | ||
57 | #define BI_CPUTYPE 0x0002 /* cpu type (__be32) */ | ||
58 | #define BI_FPUTYPE 0x0003 /* fpu type (__be32) */ | ||
59 | #define BI_MMUTYPE 0x0004 /* mmu type (__be32) */ | ||
60 | #define BI_MEMCHUNK 0x0005 /* memory chunk address and size */ | ||
61 | /* (struct mem_info) */ | ||
62 | #define BI_RAMDISK 0x0006 /* ramdisk address and size */ | ||
63 | /* (struct mem_info) */ | ||
64 | #define BI_COMMAND_LINE 0x0007 /* kernel command line parameters */ | ||
65 | /* (string) */ | ||
66 | |||
67 | |||
68 | /* | ||
69 | * Linux/m68k Architectures (BI_MACHTYPE) | ||
70 | */ | ||
71 | |||
72 | #define MACH_AMIGA 1 | ||
73 | #define MACH_ATARI 2 | ||
74 | #define MACH_MAC 3 | ||
75 | #define MACH_APOLLO 4 | ||
76 | #define MACH_SUN3 5 | ||
77 | #define MACH_MVME147 6 | ||
78 | #define MACH_MVME16x 7 | ||
79 | #define MACH_BVME6000 8 | ||
80 | #define MACH_HP300 9 | ||
81 | #define MACH_Q40 10 | ||
82 | #define MACH_SUN3X 11 | ||
83 | #define MACH_M54XX 12 | ||
84 | |||
85 | |||
86 | /* | ||
87 | * CPU, FPU and MMU types (BI_CPUTYPE, BI_FPUTYPE, BI_MMUTYPE) | ||
88 | * | ||
89 | * Note: we may rely on the following equalities: | ||
90 | * | ||
91 | * CPU_68020 == MMU_68851 | ||
92 | * CPU_68030 == MMU_68030 | ||
93 | * CPU_68040 == FPU_68040 == MMU_68040 | ||
94 | * CPU_68060 == FPU_68060 == MMU_68060 | ||
95 | */ | ||
96 | |||
97 | #define CPUB_68020 0 | ||
98 | #define CPUB_68030 1 | ||
99 | #define CPUB_68040 2 | ||
100 | #define CPUB_68060 3 | ||
101 | #define CPUB_COLDFIRE 4 | ||
102 | |||
103 | #define CPU_68020 (1 << CPUB_68020) | ||
104 | #define CPU_68030 (1 << CPUB_68030) | ||
105 | #define CPU_68040 (1 << CPUB_68040) | ||
106 | #define CPU_68060 (1 << CPUB_68060) | ||
107 | #define CPU_COLDFIRE (1 << CPUB_COLDFIRE) | ||
108 | |||
109 | #define FPUB_68881 0 | ||
110 | #define FPUB_68882 1 | ||
111 | #define FPUB_68040 2 /* Internal FPU */ | ||
112 | #define FPUB_68060 3 /* Internal FPU */ | ||
113 | #define FPUB_SUNFPA 4 /* Sun-3 FPA */ | ||
114 | #define FPUB_COLDFIRE 5 /* ColdFire FPU */ | ||
115 | |||
116 | #define FPU_68881 (1 << FPUB_68881) | ||
117 | #define FPU_68882 (1 << FPUB_68882) | ||
118 | #define FPU_68040 (1 << FPUB_68040) | ||
119 | #define FPU_68060 (1 << FPUB_68060) | ||
120 | #define FPU_SUNFPA (1 << FPUB_SUNFPA) | ||
121 | #define FPU_COLDFIRE (1 << FPUB_COLDFIRE) | ||
122 | |||
123 | #define MMUB_68851 0 | ||
124 | #define MMUB_68030 1 /* Internal MMU */ | ||
125 | #define MMUB_68040 2 /* Internal MMU */ | ||
126 | #define MMUB_68060 3 /* Internal MMU */ | ||
127 | #define MMUB_APOLLO 4 /* Custom Apollo */ | ||
128 | #define MMUB_SUN3 5 /* Custom Sun-3 */ | ||
129 | #define MMUB_COLDFIRE 6 /* Internal MMU */ | ||
130 | |||
131 | #define MMU_68851 (1 << MMUB_68851) | ||
132 | #define MMU_68030 (1 << MMUB_68030) | ||
133 | #define MMU_68040 (1 << MMUB_68040) | ||
134 | #define MMU_68060 (1 << MMUB_68060) | ||
135 | #define MMU_SUN3 (1 << MMUB_SUN3) | ||
136 | #define MMU_APOLLO (1 << MMUB_APOLLO) | ||
137 | #define MMU_COLDFIRE (1 << MMUB_COLDFIRE) | ||
138 | |||
139 | |||
140 | /* | ||
141 | * Stuff for bootinfo interface versioning | ||
142 | * | ||
143 | * At the start of kernel code, a 'struct bootversion' is located. | ||
144 | * bootstrap checks for a matching version of the interface before booting | ||
145 | * a kernel, to avoid user confusion if kernel and bootstrap don't work | ||
146 | * together :-) | ||
147 | * | ||
148 | * If incompatible changes are made to the bootinfo interface, the major | ||
149 | * number below should be stepped (and the minor reset to 0) for the | ||
150 | * appropriate machine. If a change is backward-compatible, the minor | ||
151 | * should be stepped. "Backwards-compatible" means that booting will work, | ||
152 | * but certain features may not. | ||
153 | */ | ||
154 | |||
155 | #define BOOTINFOV_MAGIC 0x4249561A /* 'BIV^Z' */ | ||
156 | #define MK_BI_VERSION(major, minor) (((major) << 16) + (minor)) | ||
157 | #define BI_VERSION_MAJOR(v) (((v) >> 16) & 0xffff) | ||
158 | #define BI_VERSION_MINOR(v) ((v) & 0xffff) | ||
159 | |||
160 | #ifndef __ASSEMBLY__ | ||
161 | |||
162 | struct bootversion { | ||
163 | __be16 branch; | ||
164 | __be32 magic; | ||
165 | struct { | ||
166 | __be32 machtype; | ||
167 | __be32 version; | ||
168 | } machversions[0]; | ||
169 | } __packed; | ||
170 | |||
171 | #endif /* __ASSEMBLY__ */ | ||
172 | |||
173 | |||
174 | #endif /* _UAPI_ASM_M68K_BOOTINFO_H */ | ||
diff --git a/arch/m68k/include/uapi/asm/setup.h b/arch/m68k/include/uapi/asm/setup.h index 85579bff455c..6a6dc636761e 100644 --- a/arch/m68k/include/uapi/asm/setup.h +++ b/arch/m68k/include/uapi/asm/setup.h | |||
@@ -6,98 +6,11 @@ | |||
6 | ** This file is subject to the terms and conditions of the GNU General Public | 6 | ** This file is subject to the terms and conditions of the GNU General Public |
7 | ** License. See the file COPYING in the main directory of this archive | 7 | ** License. See the file COPYING in the main directory of this archive |
8 | ** for more details. | 8 | ** for more details. |
9 | ** | ||
10 | ** Created 09/29/92 by Greg Harp | ||
11 | ** | ||
12 | ** 5/2/94 Roman Hodek: | ||
13 | ** Added bi_atari part of the machine dependent union bi_un; for now it | ||
14 | ** contains just a model field to distinguish between TT and Falcon. | ||
15 | ** 26/7/96 Roman Zippel: | ||
16 | ** Renamed to setup.h; added some useful macros to allow gcc some | ||
17 | ** optimizations if possible. | ||
18 | ** 5/10/96 Geert Uytterhoeven: | ||
19 | ** Redesign of the boot information structure; moved boot information | ||
20 | ** structure to bootinfo.h | ||
21 | */ | 9 | */ |
22 | 10 | ||
23 | #ifndef _UAPI_M68K_SETUP_H | 11 | #ifndef _UAPI_M68K_SETUP_H |
24 | #define _UAPI_M68K_SETUP_H | 12 | #define _UAPI_M68K_SETUP_H |
25 | 13 | ||
26 | |||
27 | |||
28 | /* | ||
29 | * Linux/m68k Architectures | ||
30 | */ | ||
31 | |||
32 | #define MACH_AMIGA 1 | ||
33 | #define MACH_ATARI 2 | ||
34 | #define MACH_MAC 3 | ||
35 | #define MACH_APOLLO 4 | ||
36 | #define MACH_SUN3 5 | ||
37 | #define MACH_MVME147 6 | ||
38 | #define MACH_MVME16x 7 | ||
39 | #define MACH_BVME6000 8 | ||
40 | #define MACH_HP300 9 | ||
41 | #define MACH_Q40 10 | ||
42 | #define MACH_SUN3X 11 | ||
43 | #define MACH_M54XX 12 | ||
44 | |||
45 | #define COMMAND_LINE_SIZE 256 | 14 | #define COMMAND_LINE_SIZE 256 |
46 | 15 | ||
47 | |||
48 | |||
49 | /* | ||
50 | * CPU, FPU and MMU types | ||
51 | * | ||
52 | * Note: we may rely on the following equalities: | ||
53 | * | ||
54 | * CPU_68020 == MMU_68851 | ||
55 | * CPU_68030 == MMU_68030 | ||
56 | * CPU_68040 == FPU_68040 == MMU_68040 | ||
57 | * CPU_68060 == FPU_68060 == MMU_68060 | ||
58 | */ | ||
59 | |||
60 | #define CPUB_68020 0 | ||
61 | #define CPUB_68030 1 | ||
62 | #define CPUB_68040 2 | ||
63 | #define CPUB_68060 3 | ||
64 | #define CPUB_COLDFIRE 4 | ||
65 | |||
66 | #define CPU_68020 (1<<CPUB_68020) | ||
67 | #define CPU_68030 (1<<CPUB_68030) | ||
68 | #define CPU_68040 (1<<CPUB_68040) | ||
69 | #define CPU_68060 (1<<CPUB_68060) | ||
70 | #define CPU_COLDFIRE (1<<CPUB_COLDFIRE) | ||
71 | |||
72 | #define FPUB_68881 0 | ||
73 | #define FPUB_68882 1 | ||
74 | #define FPUB_68040 2 /* Internal FPU */ | ||
75 | #define FPUB_68060 3 /* Internal FPU */ | ||
76 | #define FPUB_SUNFPA 4 /* Sun-3 FPA */ | ||
77 | #define FPUB_COLDFIRE 5 /* ColdFire FPU */ | ||
78 | |||
79 | #define FPU_68881 (1<<FPUB_68881) | ||
80 | #define FPU_68882 (1<<FPUB_68882) | ||
81 | #define FPU_68040 (1<<FPUB_68040) | ||
82 | #define FPU_68060 (1<<FPUB_68060) | ||
83 | #define FPU_SUNFPA (1<<FPUB_SUNFPA) | ||
84 | #define FPU_COLDFIRE (1<<FPUB_COLDFIRE) | ||
85 | |||
86 | #define MMUB_68851 0 | ||
87 | #define MMUB_68030 1 /* Internal MMU */ | ||
88 | #define MMUB_68040 2 /* Internal MMU */ | ||
89 | #define MMUB_68060 3 /* Internal MMU */ | ||
90 | #define MMUB_APOLLO 4 /* Custom Apollo */ | ||
91 | #define MMUB_SUN3 5 /* Custom Sun-3 */ | ||
92 | #define MMUB_COLDFIRE 6 /* Internal MMU */ | ||
93 | |||
94 | #define MMU_68851 (1<<MMUB_68851) | ||
95 | #define MMU_68030 (1<<MMUB_68030) | ||
96 | #define MMU_68040 (1<<MMUB_68040) | ||
97 | #define MMU_68060 (1<<MMUB_68060) | ||
98 | #define MMU_SUN3 (1<<MMUB_SUN3) | ||
99 | #define MMU_APOLLO (1<<MMUB_APOLLO) | ||
100 | #define MMU_COLDFIRE (1<<MMUB_COLDFIRE) | ||
101 | |||
102 | |||
103 | #endif /* _UAPI_M68K_SETUP_H */ | 16 | #endif /* _UAPI_M68K_SETUP_H */ |
diff --git a/arch/m68k/kernel/Makefile b/arch/m68k/kernel/Makefile index 655347d80780..2d5d9be16273 100644 --- a/arch/m68k/kernel/Makefile +++ b/arch/m68k/kernel/Makefile | |||
@@ -22,3 +22,6 @@ obj-$(CONFIG_PCI) += pcibios.o | |||
22 | 22 | ||
23 | obj-$(CONFIG_HAS_DMA) += dma.o | 23 | obj-$(CONFIG_HAS_DMA) += dma.o |
24 | 24 | ||
25 | obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o | ||
26 | obj-$(CONFIG_BOOTINFO_PROC) += bootinfo_proc.o | ||
27 | |||
diff --git a/arch/m68k/kernel/asm-offsets.c b/arch/m68k/kernel/asm-offsets.c index 8b7b22846366..3a386341aa6e 100644 --- a/arch/m68k/kernel/asm-offsets.c +++ b/arch/m68k/kernel/asm-offsets.c | |||
@@ -98,6 +98,9 @@ int main(void) | |||
98 | DEFINE(CIABBASE, &ciab); | 98 | DEFINE(CIABBASE, &ciab); |
99 | DEFINE(C_PRA, offsetof(struct CIA, pra)); | 99 | DEFINE(C_PRA, offsetof(struct CIA, pra)); |
100 | DEFINE(ZTWOBASE, zTwoBase); | 100 | DEFINE(ZTWOBASE, zTwoBase); |
101 | |||
102 | /* enum m68k_fixup_type */ | ||
103 | DEFINE(M68K_FIXUP_MEMOFFSET, m68k_fixup_memoffset); | ||
101 | #endif | 104 | #endif |
102 | 105 | ||
103 | return 0; | 106 | return 0; |
diff --git a/arch/m68k/kernel/bootinfo_proc.c b/arch/m68k/kernel/bootinfo_proc.c new file mode 100644 index 000000000000..7ee853e1432b --- /dev/null +++ b/arch/m68k/kernel/bootinfo_proc.c | |||
@@ -0,0 +1,80 @@ | |||
1 | /* | ||
2 | * Based on arch/arm/kernel/atags_proc.c | ||
3 | */ | ||
4 | |||
5 | #include <linux/fs.h> | ||
6 | #include <linux/init.h> | ||
7 | #include <linux/printk.h> | ||
8 | #include <linux/proc_fs.h> | ||
9 | #include <linux/slab.h> | ||
10 | #include <linux/string.h> | ||
11 | |||
12 | #include <asm/bootinfo.h> | ||
13 | #include <asm/byteorder.h> | ||
14 | |||
15 | |||
16 | static char bootinfo_tmp[1536] __initdata; | ||
17 | |||
18 | static void *bootinfo_copy; | ||
19 | static size_t bootinfo_size; | ||
20 | |||
21 | static ssize_t bootinfo_read(struct file *file, char __user *buf, | ||
22 | size_t count, loff_t *ppos) | ||
23 | { | ||
24 | return simple_read_from_buffer(buf, count, ppos, bootinfo_copy, | ||
25 | bootinfo_size); | ||
26 | } | ||
27 | |||
28 | static const struct file_operations bootinfo_fops = { | ||
29 | .read = bootinfo_read, | ||
30 | .llseek = default_llseek, | ||
31 | }; | ||
32 | |||
33 | void __init save_bootinfo(const struct bi_record *bi) | ||
34 | { | ||
35 | const void *start = bi; | ||
36 | size_t size = sizeof(bi->tag); | ||
37 | |||
38 | while (be16_to_cpu(bi->tag) != BI_LAST) { | ||
39 | uint16_t n = be16_to_cpu(bi->size); | ||
40 | size += n; | ||
41 | bi = (struct bi_record *)((unsigned long)bi + n); | ||
42 | } | ||
43 | |||
44 | if (size > sizeof(bootinfo_tmp)) { | ||
45 | pr_err("Cannot save %zu bytes of bootinfo\n", size); | ||
46 | return; | ||
47 | } | ||
48 | |||
49 | pr_info("Saving %zu bytes of bootinfo\n", size); | ||
50 | memcpy(bootinfo_tmp, start, size); | ||
51 | bootinfo_size = size; | ||
52 | } | ||
53 | |||
54 | static int __init init_bootinfo_procfs(void) | ||
55 | { | ||
56 | /* | ||
57 | * This cannot go into save_bootinfo() because kmalloc and proc don't | ||
58 | * work yet when it is called. | ||
59 | */ | ||
60 | struct proc_dir_entry *pde; | ||
61 | |||
62 | if (!bootinfo_size) | ||
63 | return -EINVAL; | ||
64 | |||
65 | bootinfo_copy = kmalloc(bootinfo_size, GFP_KERNEL); | ||
66 | if (!bootinfo_copy) | ||
67 | return -ENOMEM; | ||
68 | |||
69 | memcpy(bootinfo_copy, bootinfo_tmp, bootinfo_size); | ||
70 | |||
71 | pde = proc_create_data("bootinfo", 0400, NULL, &bootinfo_fops, NULL); | ||
72 | if (!pde) { | ||
73 | kfree(bootinfo_copy); | ||
74 | return -ENOMEM; | ||
75 | } | ||
76 | |||
77 | return 0; | ||
78 | } | ||
79 | |||
80 | arch_initcall(init_bootinfo_procfs); | ||
diff --git a/arch/m68k/kernel/head.S b/arch/m68k/kernel/head.S index ac85f16534af..4c99bab7e664 100644 --- a/arch/m68k/kernel/head.S +++ b/arch/m68k/kernel/head.S | |||
@@ -23,7 +23,7 @@ | |||
23 | ** 98/04/25 Phil Blundell: added HP300 support | 23 | ** 98/04/25 Phil Blundell: added HP300 support |
24 | ** 1998/08/30 David Kilzer: Added support for font_desc structures | 24 | ** 1998/08/30 David Kilzer: Added support for font_desc structures |
25 | ** for linux-2.1.115 | 25 | ** for linux-2.1.115 |
26 | ** 9/02/11 Richard Zidlicky: added Q40 support (initial vesion 99/01/01) | 26 | ** 1999/02/11 Richard Zidlicky: added Q40 support (initial version 99/01/01) |
27 | ** 2004/05/13 Kars de Jong: Finalised HP300 support | 27 | ** 2004/05/13 Kars de Jong: Finalised HP300 support |
28 | ** | 28 | ** |
29 | ** This file is subject to the terms and conditions of the GNU General Public | 29 | ** This file is subject to the terms and conditions of the GNU General Public |
@@ -257,6 +257,12 @@ | |||
257 | #include <linux/linkage.h> | 257 | #include <linux/linkage.h> |
258 | #include <linux/init.h> | 258 | #include <linux/init.h> |
259 | #include <asm/bootinfo.h> | 259 | #include <asm/bootinfo.h> |
260 | #include <asm/bootinfo-amiga.h> | ||
261 | #include <asm/bootinfo-atari.h> | ||
262 | #include <asm/bootinfo-hp300.h> | ||
263 | #include <asm/bootinfo-mac.h> | ||
264 | #include <asm/bootinfo-q40.h> | ||
265 | #include <asm/bootinfo-vme.h> | ||
260 | #include <asm/setup.h> | 266 | #include <asm/setup.h> |
261 | #include <asm/entry.h> | 267 | #include <asm/entry.h> |
262 | #include <asm/pgtable.h> | 268 | #include <asm/pgtable.h> |
@@ -1532,7 +1538,7 @@ L(cache_done): | |||
1532 | 1538 | ||
1533 | /* | 1539 | /* |
1534 | * Find a tag record in the bootinfo structure | 1540 | * Find a tag record in the bootinfo structure |
1535 | * The bootinfo structure is located right after the kernel bss | 1541 | * The bootinfo structure is located right after the kernel |
1536 | * Returns: d0: size (-1 if not found) | 1542 | * Returns: d0: size (-1 if not found) |
1537 | * a0: data pointer (end-of-records if not found) | 1543 | * a0: data pointer (end-of-records if not found) |
1538 | */ | 1544 | */ |
@@ -2909,7 +2915,9 @@ func_start serial_init,%d0/%d1/%a0/%a1 | |||
2909 | 2915 | ||
2910 | #if defined(MAC_USE_SCC_A) || defined(MAC_USE_SCC_B) | 2916 | #if defined(MAC_USE_SCC_A) || defined(MAC_USE_SCC_B) |
2911 | movel %pc@(L(mac_sccbase)),%a0 | 2917 | movel %pc@(L(mac_sccbase)),%a0 |
2912 | /* Reset SCC device */ | 2918 | /* Reset SCC register pointer */ |
2919 | moveb %a0@(mac_scc_cha_a_ctrl_offset),%d0 | ||
2920 | /* Reset SCC device: write register pointer then register value */ | ||
2913 | moveb #9,%a0@(mac_scc_cha_a_ctrl_offset) | 2921 | moveb #9,%a0@(mac_scc_cha_a_ctrl_offset) |
2914 | moveb #0xc0,%a0@(mac_scc_cha_a_ctrl_offset) | 2922 | moveb #0xc0,%a0@(mac_scc_cha_a_ctrl_offset) |
2915 | /* Wait for 5 PCLK cycles, which is about 68 CPU cycles */ | 2923 | /* Wait for 5 PCLK cycles, which is about 68 CPU cycles */ |
@@ -3896,8 +3904,6 @@ BVME_SCC_DATA_A = 0xffb0000f | |||
3896 | #endif | 3904 | #endif |
3897 | 3905 | ||
3898 | #if defined(CONFIG_MAC) | 3906 | #if defined(CONFIG_MAC) |
3899 | L(mac_booter_data): | ||
3900 | .long 0 | ||
3901 | L(mac_videobase): | 3907 | L(mac_videobase): |
3902 | .long 0 | 3908 | .long 0 |
3903 | L(mac_videodepth): | 3909 | L(mac_videodepth): |
diff --git a/arch/m68k/kernel/machine_kexec.c b/arch/m68k/kernel/machine_kexec.c new file mode 100644 index 000000000000..d4affc917d9d --- /dev/null +++ b/arch/m68k/kernel/machine_kexec.c | |||
@@ -0,0 +1,58 @@ | |||
1 | /* | ||
2 | * machine_kexec.c - handle transition of Linux booting another kernel | ||
3 | */ | ||
4 | #include <linux/compiler.h> | ||
5 | #include <linux/kexec.h> | ||
6 | #include <linux/mm.h> | ||
7 | #include <linux/delay.h> | ||
8 | |||
9 | #include <asm/cacheflush.h> | ||
10 | #include <asm/page.h> | ||
11 | #include <asm/setup.h> | ||
12 | |||
13 | extern const unsigned char relocate_new_kernel[]; | ||
14 | extern const size_t relocate_new_kernel_size; | ||
15 | |||
16 | int machine_kexec_prepare(struct kimage *kimage) | ||
17 | { | ||
18 | return 0; | ||
19 | } | ||
20 | |||
21 | void machine_kexec_cleanup(struct kimage *kimage) | ||
22 | { | ||
23 | } | ||
24 | |||
25 | void machine_shutdown(void) | ||
26 | { | ||
27 | } | ||
28 | |||
29 | void machine_crash_shutdown(struct pt_regs *regs) | ||
30 | { | ||
31 | } | ||
32 | |||
33 | typedef void (*relocate_kernel_t)(unsigned long ptr, | ||
34 | unsigned long start, | ||
35 | unsigned long cpu_mmu_flags) __noreturn; | ||
36 | |||
37 | void machine_kexec(struct kimage *image) | ||
38 | { | ||
39 | void *reboot_code_buffer; | ||
40 | unsigned long cpu_mmu_flags; | ||
41 | |||
42 | reboot_code_buffer = page_address(image->control_code_page); | ||
43 | |||
44 | memcpy(reboot_code_buffer, relocate_new_kernel, | ||
45 | relocate_new_kernel_size); | ||
46 | |||
47 | /* | ||
48 | * we do not want to be bothered. | ||
49 | */ | ||
50 | local_irq_disable(); | ||
51 | |||
52 | pr_info("Will call new kernel at 0x%08lx. Bye...\n", image->start); | ||
53 | __flush_cache_all(); | ||
54 | cpu_mmu_flags = m68k_cputype | m68k_mmutype << 8; | ||
55 | ((relocate_kernel_t) reboot_code_buffer)(image->head & PAGE_MASK, | ||
56 | image->start, | ||
57 | cpu_mmu_flags); | ||
58 | } | ||
diff --git a/arch/m68k/kernel/relocate_kernel.S b/arch/m68k/kernel/relocate_kernel.S new file mode 100644 index 000000000000..3e09a89067ad --- /dev/null +++ b/arch/m68k/kernel/relocate_kernel.S | |||
@@ -0,0 +1,159 @@ | |||
1 | #include <linux/linkage.h> | ||
2 | |||
3 | #include <asm/asm-offsets.h> | ||
4 | #include <asm/page.h> | ||
5 | #include <asm/setup.h> | ||
6 | |||
7 | |||
8 | #define MMU_BASE 8 /* MMU flags base in cpu_mmu_flags */ | ||
9 | |||
10 | .text | ||
11 | |||
12 | ENTRY(relocate_new_kernel) | ||
13 | movel %sp@(4),%a0 /* a0 = ptr */ | ||
14 | movel %sp@(8),%a1 /* a1 = start */ | ||
15 | movel %sp@(12),%d1 /* d1 = cpu_mmu_flags */ | ||
16 | movew #PAGE_MASK,%d2 /* d2 = PAGE_MASK */ | ||
17 | |||
18 | /* Disable MMU */ | ||
19 | |||
20 | btst #MMU_BASE + MMUB_68851,%d1 | ||
21 | jeq 3f | ||
22 | |||
23 | 1: /* 68851 or 68030 */ | ||
24 | |||
25 | lea %pc@(.Lcopy),%a4 | ||
26 | 2: addl #0x00000000,%a4 /* virt_to_phys() */ | ||
27 | |||
28 | .section ".m68k_fixup","aw" | ||
29 | .long M68K_FIXUP_MEMOFFSET, 2b+2 | ||
30 | .previous | ||
31 | |||
32 | .chip 68030 | ||
33 | pmove %tc,%d0 /* Disable MMU */ | ||
34 | bclr #7,%d0 | ||
35 | pmove %d0,%tc | ||
36 | jmp %a4@ /* Jump to physical .Lcopy */ | ||
37 | .chip 68k | ||
38 | |||
39 | 3: | ||
40 | btst #MMU_BASE + MMUB_68030,%d1 | ||
41 | jne 1b | ||
42 | |||
43 | btst #MMU_BASE + MMUB_68040,%d1 | ||
44 | jeq 6f | ||
45 | |||
46 | 4: /* 68040 or 68060 */ | ||
47 | |||
48 | lea %pc@(.Lcont040),%a4 | ||
49 | 5: addl #0x00000000,%a4 /* virt_to_phys() */ | ||
50 | |||
51 | .section ".m68k_fixup","aw" | ||
52 | .long M68K_FIXUP_MEMOFFSET, 5b+2 | ||
53 | .previous | ||
54 | |||
55 | movel %a4,%d0 | ||
56 | andl #0xff000000,%d0 | ||
57 | orw #0xe020,%d0 /* Map 16 MiB, enable, cacheable */ | ||
58 | .chip 68040 | ||
59 | movec %d0,%itt0 | ||
60 | movec %d0,%dtt0 | ||
61 | .chip 68k | ||
62 | jmp %a4@ /* Jump to physical .Lcont040 */ | ||
63 | |||
64 | .Lcont040: | ||
65 | moveq #0,%d0 | ||
66 | .chip 68040 | ||
67 | movec %d0,%tc /* Disable MMU */ | ||
68 | movec %d0,%itt0 | ||
69 | movec %d0,%itt1 | ||
70 | movec %d0,%dtt0 | ||
71 | movec %d0,%dtt1 | ||
72 | .chip 68k | ||
73 | jra .Lcopy | ||
74 | |||
75 | 6: | ||
76 | btst #MMU_BASE + MMUB_68060,%d1 | ||
77 | jne 4b | ||
78 | |||
79 | .Lcopy: | ||
80 | movel %a0@+,%d0 /* d0 = entry = *ptr */ | ||
81 | jeq .Lflush | ||
82 | |||
83 | btst #2,%d0 /* entry & IND_DONE? */ | ||
84 | jne .Lflush | ||
85 | |||
86 | btst #1,%d0 /* entry & IND_INDIRECTION? */ | ||
87 | jeq 1f | ||
88 | andw %d2,%d0 | ||
89 | movel %d0,%a0 /* ptr = entry & PAGE_MASK */ | ||
90 | jra .Lcopy | ||
91 | |||
92 | 1: | ||
93 | btst #0,%d0 /* entry & IND_DESTINATION? */ | ||
94 | jeq 2f | ||
95 | andw %d2,%d0 | ||
96 | movel %d0,%a2 /* a2 = dst = entry & PAGE_MASK */ | ||
97 | jra .Lcopy | ||
98 | |||
99 | 2: | ||
100 | btst #3,%d0 /* entry & IND_SOURCE? */ | ||
101 | jeq .Lcopy | ||
102 | |||
103 | andw %d2,%d0 | ||
104 | movel %d0,%a3 /* a3 = src = entry & PAGE_MASK */ | ||
105 | movew #PAGE_SIZE/32 - 1,%d0 /* d0 = PAGE_SIZE/32 - 1 */ | ||
106 | 3: | ||
107 | movel %a3@+,%a2@+ /* *dst++ = *src++ */ | ||
108 | movel %a3@+,%a2@+ /* *dst++ = *src++ */ | ||
109 | movel %a3@+,%a2@+ /* *dst++ = *src++ */ | ||
110 | movel %a3@+,%a2@+ /* *dst++ = *src++ */ | ||
111 | movel %a3@+,%a2@+ /* *dst++ = *src++ */ | ||
112 | movel %a3@+,%a2@+ /* *dst++ = *src++ */ | ||
113 | movel %a3@+,%a2@+ /* *dst++ = *src++ */ | ||
114 | movel %a3@+,%a2@+ /* *dst++ = *src++ */ | ||
115 | dbf %d0, 3b | ||
116 | jra .Lcopy | ||
117 | |||
118 | .Lflush: | ||
119 | /* Flush all caches */ | ||
120 | |||
121 | btst #CPUB_68020,%d1 | ||
122 | jeq 2f | ||
123 | |||
124 | 1: /* 68020 or 68030 */ | ||
125 | .chip 68030 | ||
126 | movec %cacr,%d0 | ||
127 | orw #0x808,%d0 | ||
128 | movec %d0,%cacr | ||
129 | .chip 68k | ||
130 | jra .Lreincarnate | ||
131 | |||
132 | 2: | ||
133 | btst #CPUB_68030,%d1 | ||
134 | jne 1b | ||
135 | |||
136 | btst #CPUB_68040,%d1 | ||
137 | jeq 4f | ||
138 | |||
139 | 3: /* 68040 or 68060 */ | ||
140 | .chip 68040 | ||
141 | nop | ||
142 | cpusha %bc | ||
143 | nop | ||
144 | cinva %bc | ||
145 | nop | ||
146 | .chip 68k | ||
147 | jra .Lreincarnate | ||
148 | |||
149 | 4: | ||
150 | btst #CPUB_68060,%d1 | ||
151 | jne 3b | ||
152 | |||
153 | .Lreincarnate: | ||
154 | jmp %a1@ | ||
155 | |||
156 | relocate_new_kernel_end: | ||
157 | |||
158 | ENTRY(relocate_new_kernel_size) | ||
159 | .long relocate_new_kernel_end - relocate_new_kernel | ||
diff --git a/arch/m68k/kernel/setup_mm.c b/arch/m68k/kernel/setup_mm.c index e67e53159573..5b8ec4d5f8e8 100644 --- a/arch/m68k/kernel/setup_mm.c +++ b/arch/m68k/kernel/setup_mm.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/initrd.h> | 26 | #include <linux/initrd.h> |
27 | 27 | ||
28 | #include <asm/bootinfo.h> | 28 | #include <asm/bootinfo.h> |
29 | #include <asm/byteorder.h> | ||
29 | #include <asm/sections.h> | 30 | #include <asm/sections.h> |
30 | #include <asm/setup.h> | 31 | #include <asm/setup.h> |
31 | #include <asm/fpu.h> | 32 | #include <asm/fpu.h> |
@@ -71,12 +72,12 @@ EXPORT_SYMBOL(m68k_num_memory); | |||
71 | int m68k_realnum_memory; | 72 | int m68k_realnum_memory; |
72 | EXPORT_SYMBOL(m68k_realnum_memory); | 73 | EXPORT_SYMBOL(m68k_realnum_memory); |
73 | unsigned long m68k_memoffset; | 74 | unsigned long m68k_memoffset; |
74 | struct mem_info m68k_memory[NUM_MEMINFO]; | 75 | struct m68k_mem_info m68k_memory[NUM_MEMINFO]; |
75 | EXPORT_SYMBOL(m68k_memory); | 76 | EXPORT_SYMBOL(m68k_memory); |
76 | 77 | ||
77 | struct mem_info m68k_ramdisk; | 78 | static struct m68k_mem_info m68k_ramdisk __initdata; |
78 | 79 | ||
79 | static char m68k_command_line[CL_SIZE]; | 80 | static char m68k_command_line[CL_SIZE] __initdata; |
80 | 81 | ||
81 | void (*mach_sched_init) (irq_handler_t handler) __initdata = NULL; | 82 | void (*mach_sched_init) (irq_handler_t handler) __initdata = NULL; |
82 | /* machine dependent irq functions */ | 83 | /* machine dependent irq functions */ |
@@ -143,11 +144,16 @@ extern void paging_init(void); | |||
143 | 144 | ||
144 | static void __init m68k_parse_bootinfo(const struct bi_record *record) | 145 | static void __init m68k_parse_bootinfo(const struct bi_record *record) |
145 | { | 146 | { |
146 | while (record->tag != BI_LAST) { | 147 | uint16_t tag; |
148 | |||
149 | save_bootinfo(record); | ||
150 | |||
151 | while ((tag = be16_to_cpu(record->tag)) != BI_LAST) { | ||
147 | int unknown = 0; | 152 | int unknown = 0; |
148 | const unsigned long *data = record->data; | 153 | const void *data = record->data; |
154 | uint16_t size = be16_to_cpu(record->size); | ||
149 | 155 | ||
150 | switch (record->tag) { | 156 | switch (tag) { |
151 | case BI_MACHTYPE: | 157 | case BI_MACHTYPE: |
152 | case BI_CPUTYPE: | 158 | case BI_CPUTYPE: |
153 | case BI_FPUTYPE: | 159 | case BI_FPUTYPE: |
@@ -157,20 +163,27 @@ static void __init m68k_parse_bootinfo(const struct bi_record *record) | |||
157 | 163 | ||
158 | case BI_MEMCHUNK: | 164 | case BI_MEMCHUNK: |
159 | if (m68k_num_memory < NUM_MEMINFO) { | 165 | if (m68k_num_memory < NUM_MEMINFO) { |
160 | m68k_memory[m68k_num_memory].addr = data[0]; | 166 | const struct mem_info *m = data; |
161 | m68k_memory[m68k_num_memory].size = data[1]; | 167 | m68k_memory[m68k_num_memory].addr = |
168 | be32_to_cpu(m->addr); | ||
169 | m68k_memory[m68k_num_memory].size = | ||
170 | be32_to_cpu(m->size); | ||
162 | m68k_num_memory++; | 171 | m68k_num_memory++; |
163 | } else | 172 | } else |
164 | printk("m68k_parse_bootinfo: too many memory chunks\n"); | 173 | pr_warn("%s: too many memory chunks\n", |
174 | __func__); | ||
165 | break; | 175 | break; |
166 | 176 | ||
167 | case BI_RAMDISK: | 177 | case BI_RAMDISK: |
168 | m68k_ramdisk.addr = data[0]; | 178 | { |
169 | m68k_ramdisk.size = data[1]; | 179 | const struct mem_info *m = data; |
180 | m68k_ramdisk.addr = be32_to_cpu(m->addr); | ||
181 | m68k_ramdisk.size = be32_to_cpu(m->size); | ||
182 | } | ||
170 | break; | 183 | break; |
171 | 184 | ||
172 | case BI_COMMAND_LINE: | 185 | case BI_COMMAND_LINE: |
173 | strlcpy(m68k_command_line, (const char *)data, | 186 | strlcpy(m68k_command_line, data, |
174 | sizeof(m68k_command_line)); | 187 | sizeof(m68k_command_line)); |
175 | break; | 188 | break; |
176 | 189 | ||
@@ -197,17 +210,16 @@ static void __init m68k_parse_bootinfo(const struct bi_record *record) | |||
197 | unknown = 1; | 210 | unknown = 1; |
198 | } | 211 | } |
199 | if (unknown) | 212 | if (unknown) |
200 | printk("m68k_parse_bootinfo: unknown tag 0x%04x ignored\n", | 213 | pr_warn("%s: unknown tag 0x%04x ignored\n", __func__, |
201 | record->tag); | 214 | tag); |
202 | record = (struct bi_record *)((unsigned long)record + | 215 | record = (struct bi_record *)((unsigned long)record + size); |
203 | record->size); | ||
204 | } | 216 | } |
205 | 217 | ||
206 | m68k_realnum_memory = m68k_num_memory; | 218 | m68k_realnum_memory = m68k_num_memory; |
207 | #ifdef CONFIG_SINGLE_MEMORY_CHUNK | 219 | #ifdef CONFIG_SINGLE_MEMORY_CHUNK |
208 | if (m68k_num_memory > 1) { | 220 | if (m68k_num_memory > 1) { |
209 | printk("Ignoring last %i chunks of physical memory\n", | 221 | pr_warn("%s: ignoring last %i chunks of physical memory\n", |
210 | (m68k_num_memory - 1)); | 222 | __func__, (m68k_num_memory - 1)); |
211 | m68k_num_memory = 1; | 223 | m68k_num_memory = 1; |
212 | } | 224 | } |
213 | #endif | 225 | #endif |
@@ -219,7 +231,7 @@ void __init setup_arch(char **cmdline_p) | |||
219 | int i; | 231 | int i; |
220 | #endif | 232 | #endif |
221 | 233 | ||
222 | /* The bootinfo is located right after the kernel bss */ | 234 | /* The bootinfo is located right after the kernel */ |
223 | if (!CPU_IS_COLDFIRE) | 235 | if (!CPU_IS_COLDFIRE) |
224 | m68k_parse_bootinfo((const struct bi_record *)_end); | 236 | m68k_parse_bootinfo((const struct bi_record *)_end); |
225 | 237 | ||
@@ -247,7 +259,7 @@ void __init setup_arch(char **cmdline_p) | |||
247 | asm (".chip 68060; movec %%pcr,%0; .chip 68k" | 259 | asm (".chip 68060; movec %%pcr,%0; .chip 68k" |
248 | : "=d" (pcr)); | 260 | : "=d" (pcr)); |
249 | if (((pcr >> 8) & 0xff) <= 5) { | 261 | if (((pcr >> 8) & 0xff) <= 5) { |
250 | printk("Enabling workaround for errata I14\n"); | 262 | pr_warn("Enabling workaround for errata I14\n"); |
251 | asm (".chip 68060; movec %0,%%pcr; .chip 68k" | 263 | asm (".chip 68060; movec %0,%%pcr; .chip 68k" |
252 | : : "d" (pcr | 0x20)); | 264 | : : "d" (pcr | 0x20)); |
253 | } | 265 | } |
@@ -336,12 +348,12 @@ void __init setup_arch(char **cmdline_p) | |||
336 | panic("No configuration setup"); | 348 | panic("No configuration setup"); |
337 | } | 349 | } |
338 | 350 | ||
351 | paging_init(); | ||
352 | |||
339 | #ifdef CONFIG_NATFEAT | 353 | #ifdef CONFIG_NATFEAT |
340 | nf_init(); | 354 | nf_init(); |
341 | #endif | 355 | #endif |
342 | 356 | ||
343 | paging_init(); | ||
344 | |||
345 | #ifndef CONFIG_SUN3 | 357 | #ifndef CONFIG_SUN3 |
346 | for (i = 1; i < m68k_num_memory; i++) | 358 | for (i = 1; i < m68k_num_memory; i++) |
347 | free_bootmem_node(NODE_DATA(i), m68k_memory[i].addr, | 359 | free_bootmem_node(NODE_DATA(i), m68k_memory[i].addr, |
@@ -353,7 +365,7 @@ void __init setup_arch(char **cmdline_p) | |||
353 | BOOTMEM_DEFAULT); | 365 | BOOTMEM_DEFAULT); |
354 | initrd_start = (unsigned long)phys_to_virt(m68k_ramdisk.addr); | 366 | initrd_start = (unsigned long)phys_to_virt(m68k_ramdisk.addr); |
355 | initrd_end = initrd_start + m68k_ramdisk.size; | 367 | initrd_end = initrd_start + m68k_ramdisk.size; |
356 | printk("initrd: %08lx - %08lx\n", initrd_start, initrd_end); | 368 | pr_info("initrd: %08lx - %08lx\n", initrd_start, initrd_end); |
357 | } | 369 | } |
358 | #endif | 370 | #endif |
359 | 371 | ||
@@ -538,9 +550,9 @@ void check_bugs(void) | |||
538 | { | 550 | { |
539 | #ifndef CONFIG_M68KFPU_EMU | 551 | #ifndef CONFIG_M68KFPU_EMU |
540 | if (m68k_fputype == 0) { | 552 | if (m68k_fputype == 0) { |
541 | printk(KERN_EMERG "*** YOU DO NOT HAVE A FLOATING POINT UNIT, " | 553 | pr_emerg("*** YOU DO NOT HAVE A FLOATING POINT UNIT, " |
542 | "WHICH IS REQUIRED BY LINUX/M68K ***\n"); | 554 | "WHICH IS REQUIRED BY LINUX/M68K ***\n"); |
543 | printk(KERN_EMERG "Upgrade your hardware or join the FPU " | 555 | pr_emerg("Upgrade your hardware or join the FPU " |
544 | "emulation project\n"); | 556 | "emulation project\n"); |
545 | panic("no FPU"); | 557 | panic("no FPU"); |
546 | } | 558 | } |
diff --git a/arch/m68k/kernel/time.c b/arch/m68k/kernel/time.c index 7eb9792009f8..958f1adb9d0c 100644 --- a/arch/m68k/kernel/time.c +++ b/arch/m68k/kernel/time.c | |||
@@ -28,6 +28,10 @@ | |||
28 | #include <linux/timex.h> | 28 | #include <linux/timex.h> |
29 | #include <linux/profile.h> | 29 | #include <linux/profile.h> |
30 | 30 | ||
31 | |||
32 | unsigned long (*mach_random_get_entropy)(void); | ||
33 | |||
34 | |||
31 | /* | 35 | /* |
32 | * timer_interrupt() needs to keep up the real-time clock, | 36 | * timer_interrupt() needs to keep up the real-time clock, |
33 | * as well as call the "xtime_update()" routine every clocktick | 37 | * as well as call the "xtime_update()" routine every clocktick |
diff --git a/arch/m68k/kernel/traps.c b/arch/m68k/kernel/traps.c index 88fcd8c70e7b..6c9ca24830e9 100644 --- a/arch/m68k/kernel/traps.c +++ b/arch/m68k/kernel/traps.c | |||
@@ -133,9 +133,7 @@ static inline void access_error060 (struct frame *fp) | |||
133 | { | 133 | { |
134 | unsigned long fslw = fp->un.fmt4.pc; /* is really FSLW for access error */ | 134 | unsigned long fslw = fp->un.fmt4.pc; /* is really FSLW for access error */ |
135 | 135 | ||
136 | #ifdef DEBUG | 136 | pr_debug("fslw=%#lx, fa=%#lx\n", fslw, fp->un.fmt4.effaddr); |
137 | printk("fslw=%#lx, fa=%#lx\n", fslw, fp->un.fmt4.effaddr); | ||
138 | #endif | ||
139 | 137 | ||
140 | if (fslw & MMU060_BPE) { | 138 | if (fslw & MMU060_BPE) { |
141 | /* branch prediction error -> clear branch cache */ | 139 | /* branch prediction error -> clear branch cache */ |
@@ -162,9 +160,7 @@ static inline void access_error060 (struct frame *fp) | |||
162 | } | 160 | } |
163 | if (fslw & MMU060_W) | 161 | if (fslw & MMU060_W) |
164 | errorcode |= 2; | 162 | errorcode |= 2; |
165 | #ifdef DEBUG | 163 | pr_debug("errorcode = %ld\n", errorcode); |
166 | printk("errorcode = %d\n", errorcode ); | ||
167 | #endif | ||
168 | do_page_fault(&fp->ptregs, addr, errorcode); | 164 | do_page_fault(&fp->ptregs, addr, errorcode); |
169 | } else if (fslw & (MMU060_SEE)){ | 165 | } else if (fslw & (MMU060_SEE)){ |
170 | /* Software Emulation Error. | 166 | /* Software Emulation Error. |
@@ -173,8 +169,9 @@ static inline void access_error060 (struct frame *fp) | |||
173 | send_fault_sig(&fp->ptregs); | 169 | send_fault_sig(&fp->ptregs); |
174 | } else if (!(fslw & (MMU060_RE|MMU060_WE)) || | 170 | } else if (!(fslw & (MMU060_RE|MMU060_WE)) || |
175 | send_fault_sig(&fp->ptregs) > 0) { | 171 | send_fault_sig(&fp->ptregs) > 0) { |
176 | printk("pc=%#lx, fa=%#lx\n", fp->ptregs.pc, fp->un.fmt4.effaddr); | 172 | pr_err("pc=%#lx, fa=%#lx\n", fp->ptregs.pc, |
177 | printk( "68060 access error, fslw=%lx\n", fslw ); | 173 | fp->un.fmt4.effaddr); |
174 | pr_err("68060 access error, fslw=%lx\n", fslw); | ||
178 | trap_c( fp ); | 175 | trap_c( fp ); |
179 | } | 176 | } |
180 | } | 177 | } |
@@ -225,9 +222,7 @@ static inline int do_040writeback1(unsigned short wbs, unsigned long wba, | |||
225 | set_fs(old_fs); | 222 | set_fs(old_fs); |
226 | 223 | ||
227 | 224 | ||
228 | #ifdef DEBUG | 225 | pr_debug("do_040writeback1, res=%d\n", res); |
229 | printk("do_040writeback1, res=%d\n",res); | ||
230 | #endif | ||
231 | 226 | ||
232 | return res; | 227 | return res; |
233 | } | 228 | } |
@@ -249,7 +244,7 @@ static inline void do_040writebacks(struct frame *fp) | |||
249 | int res = 0; | 244 | int res = 0; |
250 | #if 0 | 245 | #if 0 |
251 | if (fp->un.fmt7.wb1s & WBV_040) | 246 | if (fp->un.fmt7.wb1s & WBV_040) |
252 | printk("access_error040: cannot handle 1st writeback. oops.\n"); | 247 | pr_err("access_error040: cannot handle 1st writeback. oops.\n"); |
253 | #endif | 248 | #endif |
254 | 249 | ||
255 | if ((fp->un.fmt7.wb2s & WBV_040) && | 250 | if ((fp->un.fmt7.wb2s & WBV_040) && |
@@ -302,14 +297,12 @@ static inline void access_error040(struct frame *fp) | |||
302 | unsigned short ssw = fp->un.fmt7.ssw; | 297 | unsigned short ssw = fp->un.fmt7.ssw; |
303 | unsigned long mmusr; | 298 | unsigned long mmusr; |
304 | 299 | ||
305 | #ifdef DEBUG | 300 | pr_debug("ssw=%#x, fa=%#lx\n", ssw, fp->un.fmt7.faddr); |
306 | printk("ssw=%#x, fa=%#lx\n", ssw, fp->un.fmt7.faddr); | 301 | pr_debug("wb1s=%#x, wb2s=%#x, wb3s=%#x\n", fp->un.fmt7.wb1s, |
307 | printk("wb1s=%#x, wb2s=%#x, wb3s=%#x\n", fp->un.fmt7.wb1s, | ||
308 | fp->un.fmt7.wb2s, fp->un.fmt7.wb3s); | 302 | fp->un.fmt7.wb2s, fp->un.fmt7.wb3s); |
309 | printk ("wb2a=%lx, wb3a=%lx, wb2d=%lx, wb3d=%lx\n", | 303 | pr_debug("wb2a=%lx, wb3a=%lx, wb2d=%lx, wb3d=%lx\n", |
310 | fp->un.fmt7.wb2a, fp->un.fmt7.wb3a, | 304 | fp->un.fmt7.wb2a, fp->un.fmt7.wb3a, |
311 | fp->un.fmt7.wb2d, fp->un.fmt7.wb3d); | 305 | fp->un.fmt7.wb2d, fp->un.fmt7.wb3d); |
312 | #endif | ||
313 | 306 | ||
314 | if (ssw & ATC_040) { | 307 | if (ssw & ATC_040) { |
315 | unsigned long addr = fp->un.fmt7.faddr; | 308 | unsigned long addr = fp->un.fmt7.faddr; |
@@ -324,9 +317,7 @@ static inline void access_error040(struct frame *fp) | |||
324 | 317 | ||
325 | /* MMU error, get the MMUSR info for this access */ | 318 | /* MMU error, get the MMUSR info for this access */ |
326 | mmusr = probe040(!(ssw & RW_040), addr, ssw); | 319 | mmusr = probe040(!(ssw & RW_040), addr, ssw); |
327 | #ifdef DEBUG | 320 | pr_debug("mmusr = %lx\n", mmusr); |
328 | printk("mmusr = %lx\n", mmusr); | ||
329 | #endif | ||
330 | errorcode = 1; | 321 | errorcode = 1; |
331 | if (!(mmusr & MMU_R_040)) { | 322 | if (!(mmusr & MMU_R_040)) { |
332 | /* clear the invalid atc entry */ | 323 | /* clear the invalid atc entry */ |
@@ -340,14 +331,10 @@ static inline void access_error040(struct frame *fp) | |||
340 | errorcode |= 2; | 331 | errorcode |= 2; |
341 | 332 | ||
342 | if (do_page_fault(&fp->ptregs, addr, errorcode)) { | 333 | if (do_page_fault(&fp->ptregs, addr, errorcode)) { |
343 | #ifdef DEBUG | 334 | pr_debug("do_page_fault() !=0\n"); |
344 | printk("do_page_fault() !=0\n"); | ||
345 | #endif | ||
346 | if (user_mode(&fp->ptregs)){ | 335 | if (user_mode(&fp->ptregs)){ |
347 | /* delay writebacks after signal delivery */ | 336 | /* delay writebacks after signal delivery */ |
348 | #ifdef DEBUG | 337 | pr_debug(".. was usermode - return\n"); |
349 | printk(".. was usermode - return\n"); | ||
350 | #endif | ||
351 | return; | 338 | return; |
352 | } | 339 | } |
353 | /* disable writeback into user space from kernel | 340 | /* disable writeback into user space from kernel |
@@ -355,9 +342,7 @@ static inline void access_error040(struct frame *fp) | |||
355 | * the writeback won't do good) | 342 | * the writeback won't do good) |
356 | */ | 343 | */ |
357 | disable_wb: | 344 | disable_wb: |
358 | #ifdef DEBUG | 345 | pr_debug(".. disabling wb2\n"); |
359 | printk(".. disabling wb2\n"); | ||
360 | #endif | ||
361 | if (fp->un.fmt7.wb2a == fp->un.fmt7.faddr) | 346 | if (fp->un.fmt7.wb2a == fp->un.fmt7.faddr) |
362 | fp->un.fmt7.wb2s &= ~WBV_040; | 347 | fp->un.fmt7.wb2s &= ~WBV_040; |
363 | if (fp->un.fmt7.wb3a == fp->un.fmt7.faddr) | 348 | if (fp->un.fmt7.wb3a == fp->un.fmt7.faddr) |
@@ -371,7 +356,7 @@ disable_wb: | |||
371 | current->thread.signo = SIGBUS; | 356 | current->thread.signo = SIGBUS; |
372 | current->thread.faddr = fp->un.fmt7.faddr; | 357 | current->thread.faddr = fp->un.fmt7.faddr; |
373 | if (send_fault_sig(&fp->ptregs) >= 0) | 358 | if (send_fault_sig(&fp->ptregs) >= 0) |
374 | printk("68040 bus error (ssw=%x, faddr=%lx)\n", ssw, | 359 | pr_err("68040 bus error (ssw=%x, faddr=%lx)\n", ssw, |
375 | fp->un.fmt7.faddr); | 360 | fp->un.fmt7.faddr); |
376 | goto disable_wb; | 361 | goto disable_wb; |
377 | } | 362 | } |
@@ -394,19 +379,17 @@ static inline void bus_error030 (struct frame *fp) | |||
394 | unsigned short ssw = fp->un.fmtb.ssw; | 379 | unsigned short ssw = fp->un.fmtb.ssw; |
395 | extern unsigned long _sun3_map_test_start, _sun3_map_test_end; | 380 | extern unsigned long _sun3_map_test_start, _sun3_map_test_end; |
396 | 381 | ||
397 | #ifdef DEBUG | ||
398 | if (ssw & (FC | FB)) | 382 | if (ssw & (FC | FB)) |
399 | printk ("Instruction fault at %#010lx\n", | 383 | pr_debug("Instruction fault at %#010lx\n", |
400 | ssw & FC ? | 384 | ssw & FC ? |
401 | fp->ptregs.format == 0xa ? fp->ptregs.pc + 2 : fp->un.fmtb.baddr - 2 | 385 | fp->ptregs.format == 0xa ? fp->ptregs.pc + 2 : fp->un.fmtb.baddr - 2 |
402 | : | 386 | : |
403 | fp->ptregs.format == 0xa ? fp->ptregs.pc + 4 : fp->un.fmtb.baddr); | 387 | fp->ptregs.format == 0xa ? fp->ptregs.pc + 4 : fp->un.fmtb.baddr); |
404 | if (ssw & DF) | 388 | if (ssw & DF) |
405 | printk ("Data %s fault at %#010lx in %s (pc=%#lx)\n", | 389 | pr_debug("Data %s fault at %#010lx in %s (pc=%#lx)\n", |
406 | ssw & RW ? "read" : "write", | 390 | ssw & RW ? "read" : "write", |
407 | fp->un.fmtb.daddr, | 391 | fp->un.fmtb.daddr, |
408 | space_names[ssw & DFC], fp->ptregs.pc); | 392 | space_names[ssw & DFC], fp->ptregs.pc); |
409 | #endif | ||
410 | 393 | ||
411 | /* | 394 | /* |
412 | * Check if this page should be demand-mapped. This needs to go before | 395 | * Check if this page should be demand-mapped. This needs to go before |
@@ -429,7 +412,7 @@ static inline void bus_error030 (struct frame *fp) | |||
429 | return; | 412 | return; |
430 | /* instruction fault or kernel data fault! */ | 413 | /* instruction fault or kernel data fault! */ |
431 | if (ssw & (FC | FB)) | 414 | if (ssw & (FC | FB)) |
432 | printk ("Instruction fault at %#010lx\n", | 415 | pr_err("Instruction fault at %#010lx\n", |
433 | fp->ptregs.pc); | 416 | fp->ptregs.pc); |
434 | if (ssw & DF) { | 417 | if (ssw & DF) { |
435 | /* was this fault incurred testing bus mappings? */ | 418 | /* was this fault incurred testing bus mappings? */ |
@@ -439,12 +422,12 @@ static inline void bus_error030 (struct frame *fp) | |||
439 | return; | 422 | return; |
440 | } | 423 | } |
441 | 424 | ||
442 | printk ("Data %s fault at %#010lx in %s (pc=%#lx)\n", | 425 | pr_err("Data %s fault at %#010lx in %s (pc=%#lx)\n", |
443 | ssw & RW ? "read" : "write", | 426 | ssw & RW ? "read" : "write", |
444 | fp->un.fmtb.daddr, | 427 | fp->un.fmtb.daddr, |
445 | space_names[ssw & DFC], fp->ptregs.pc); | 428 | space_names[ssw & DFC], fp->ptregs.pc); |
446 | } | 429 | } |
447 | printk ("BAD KERNEL BUSERR\n"); | 430 | pr_err("BAD KERNEL BUSERR\n"); |
448 | 431 | ||
449 | die_if_kernel("Oops", &fp->ptregs,0); | 432 | die_if_kernel("Oops", &fp->ptregs,0); |
450 | force_sig(SIGKILL, current); | 433 | force_sig(SIGKILL, current); |
@@ -473,12 +456,11 @@ static inline void bus_error030 (struct frame *fp) | |||
473 | else if (buserr_type & SUN3_BUSERR_INVALID) | 456 | else if (buserr_type & SUN3_BUSERR_INVALID) |
474 | errorcode = 0x00; | 457 | errorcode = 0x00; |
475 | else { | 458 | else { |
476 | #ifdef DEBUG | 459 | pr_debug("*** unexpected busfault type=%#04x\n", |
477 | printk ("*** unexpected busfault type=%#04x\n", buserr_type); | 460 | buserr_type); |
478 | printk ("invalid %s access at %#lx from pc %#lx\n", | 461 | pr_debug("invalid %s access at %#lx from pc %#lx\n", |
479 | !(ssw & RW) ? "write" : "read", addr, | 462 | !(ssw & RW) ? "write" : "read", addr, |
480 | fp->ptregs.pc); | 463 | fp->ptregs.pc); |
481 | #endif | ||
482 | die_if_kernel ("Oops", &fp->ptregs, buserr_type); | 464 | die_if_kernel ("Oops", &fp->ptregs, buserr_type); |
483 | force_sig (SIGBUS, current); | 465 | force_sig (SIGBUS, current); |
484 | return; | 466 | return; |
@@ -509,9 +491,7 @@ static inline void bus_error030 (struct frame *fp) | |||
509 | if (!mmu_emu_handle_fault(addr, 1, 0)) | 491 | if (!mmu_emu_handle_fault(addr, 1, 0)) |
510 | do_page_fault (&fp->ptregs, addr, 0); | 492 | do_page_fault (&fp->ptregs, addr, 0); |
511 | } else { | 493 | } else { |
512 | #ifdef DEBUG | 494 | pr_debug("protection fault on insn access (segv).\n"); |
513 | printk ("protection fault on insn access (segv).\n"); | ||
514 | #endif | ||
515 | force_sig (SIGSEGV, current); | 495 | force_sig (SIGSEGV, current); |
516 | } | 496 | } |
517 | } | 497 | } |
@@ -525,22 +505,22 @@ static inline void bus_error030 (struct frame *fp) | |||
525 | unsigned short ssw = fp->un.fmtb.ssw; | 505 | unsigned short ssw = fp->un.fmtb.ssw; |
526 | #ifdef DEBUG | 506 | #ifdef DEBUG |
527 | unsigned long desc; | 507 | unsigned long desc; |
508 | #endif | ||
528 | 509 | ||
529 | printk ("pid = %x ", current->pid); | 510 | pr_debug("pid = %x ", current->pid); |
530 | printk ("SSW=%#06x ", ssw); | 511 | pr_debug("SSW=%#06x ", ssw); |
531 | 512 | ||
532 | if (ssw & (FC | FB)) | 513 | if (ssw & (FC | FB)) |
533 | printk ("Instruction fault at %#010lx\n", | 514 | pr_debug("Instruction fault at %#010lx\n", |
534 | ssw & FC ? | 515 | ssw & FC ? |
535 | fp->ptregs.format == 0xa ? fp->ptregs.pc + 2 : fp->un.fmtb.baddr - 2 | 516 | fp->ptregs.format == 0xa ? fp->ptregs.pc + 2 : fp->un.fmtb.baddr - 2 |
536 | : | 517 | : |
537 | fp->ptregs.format == 0xa ? fp->ptregs.pc + 4 : fp->un.fmtb.baddr); | 518 | fp->ptregs.format == 0xa ? fp->ptregs.pc + 4 : fp->un.fmtb.baddr); |
538 | if (ssw & DF) | 519 | if (ssw & DF) |
539 | printk ("Data %s fault at %#010lx in %s (pc=%#lx)\n", | 520 | pr_debug("Data %s fault at %#010lx in %s (pc=%#lx)\n", |
540 | ssw & RW ? "read" : "write", | 521 | ssw & RW ? "read" : "write", |
541 | fp->un.fmtb.daddr, | 522 | fp->un.fmtb.daddr, |
542 | space_names[ssw & DFC], fp->ptregs.pc); | 523 | space_names[ssw & DFC], fp->ptregs.pc); |
543 | #endif | ||
544 | 524 | ||
545 | /* ++andreas: If a data fault and an instruction fault happen | 525 | /* ++andreas: If a data fault and an instruction fault happen |
546 | at the same time map in both pages. */ | 526 | at the same time map in both pages. */ |
@@ -554,27 +534,23 @@ static inline void bus_error030 (struct frame *fp) | |||
554 | "pmove %%psr,%1" | 534 | "pmove %%psr,%1" |
555 | : "=a&" (desc), "=m" (temp) | 535 | : "=a&" (desc), "=m" (temp) |
556 | : "a" (addr), "d" (ssw)); | 536 | : "a" (addr), "d" (ssw)); |
537 | pr_debug("mmusr is %#x for addr %#lx in task %p\n", | ||
538 | temp, addr, current); | ||
539 | pr_debug("descriptor address is 0x%p, contents %#lx\n", | ||
540 | __va(desc), *(unsigned long *)__va(desc)); | ||
557 | #else | 541 | #else |
558 | asm volatile ("ptestr %2,%1@,#7\n\t" | 542 | asm volatile ("ptestr %2,%1@,#7\n\t" |
559 | "pmove %%psr,%0" | 543 | "pmove %%psr,%0" |
560 | : "=m" (temp) : "a" (addr), "d" (ssw)); | 544 | : "=m" (temp) : "a" (addr), "d" (ssw)); |
561 | #endif | 545 | #endif |
562 | mmusr = temp; | 546 | mmusr = temp; |
563 | |||
564 | #ifdef DEBUG | ||
565 | printk("mmusr is %#x for addr %#lx in task %p\n", | ||
566 | mmusr, addr, current); | ||
567 | printk("descriptor address is %#lx, contents %#lx\n", | ||
568 | __va(desc), *(unsigned long *)__va(desc)); | ||
569 | #endif | ||
570 | |||
571 | errorcode = (mmusr & MMU_I) ? 0 : 1; | 547 | errorcode = (mmusr & MMU_I) ? 0 : 1; |
572 | if (!(ssw & RW) || (ssw & RM)) | 548 | if (!(ssw & RW) || (ssw & RM)) |
573 | errorcode |= 2; | 549 | errorcode |= 2; |
574 | 550 | ||
575 | if (mmusr & (MMU_I | MMU_WP)) { | 551 | if (mmusr & (MMU_I | MMU_WP)) { |
576 | if (ssw & 4) { | 552 | if (ssw & 4) { |
577 | printk("Data %s fault at %#010lx in %s (pc=%#lx)\n", | 553 | pr_err("Data %s fault at %#010lx in %s (pc=%#lx)\n", |
578 | ssw & RW ? "read" : "write", | 554 | ssw & RW ? "read" : "write", |
579 | fp->un.fmtb.daddr, | 555 | fp->un.fmtb.daddr, |
580 | space_names[ssw & DFC], fp->ptregs.pc); | 556 | space_names[ssw & DFC], fp->ptregs.pc); |
@@ -587,9 +563,10 @@ static inline void bus_error030 (struct frame *fp) | |||
587 | } else if (!(mmusr & MMU_I)) { | 563 | } else if (!(mmusr & MMU_I)) { |
588 | /* probably a 020 cas fault */ | 564 | /* probably a 020 cas fault */ |
589 | if (!(ssw & RM) && send_fault_sig(&fp->ptregs) > 0) | 565 | if (!(ssw & RM) && send_fault_sig(&fp->ptregs) > 0) |
590 | printk("unexpected bus error (%#x,%#x)\n", ssw, mmusr); | 566 | pr_err("unexpected bus error (%#x,%#x)\n", ssw, |
567 | mmusr); | ||
591 | } else if (mmusr & (MMU_B|MMU_L|MMU_S)) { | 568 | } else if (mmusr & (MMU_B|MMU_L|MMU_S)) { |
592 | printk("invalid %s access at %#lx from pc %#lx\n", | 569 | pr_err("invalid %s access at %#lx from pc %#lx\n", |
593 | !(ssw & RW) ? "write" : "read", addr, | 570 | !(ssw & RW) ? "write" : "read", addr, |
594 | fp->ptregs.pc); | 571 | fp->ptregs.pc); |
595 | die_if_kernel("Oops",&fp->ptregs,mmusr); | 572 | die_if_kernel("Oops",&fp->ptregs,mmusr); |
@@ -600,7 +577,7 @@ static inline void bus_error030 (struct frame *fp) | |||
600 | static volatile long tlong; | 577 | static volatile long tlong; |
601 | #endif | 578 | #endif |
602 | 579 | ||
603 | printk("weird %s access at %#lx from pc %#lx (ssw is %#x)\n", | 580 | pr_err("weird %s access at %#lx from pc %#lx (ssw is %#x)\n", |
604 | !(ssw & RW) ? "write" : "read", addr, | 581 | !(ssw & RW) ? "write" : "read", addr, |
605 | fp->ptregs.pc, ssw); | 582 | fp->ptregs.pc, ssw); |
606 | asm volatile ("ptestr #1,%1@,#0\n\t" | 583 | asm volatile ("ptestr #1,%1@,#0\n\t" |
@@ -609,18 +586,16 @@ static inline void bus_error030 (struct frame *fp) | |||
609 | : "a" (addr)); | 586 | : "a" (addr)); |
610 | mmusr = temp; | 587 | mmusr = temp; |
611 | 588 | ||
612 | printk ("level 0 mmusr is %#x\n", mmusr); | 589 | pr_err("level 0 mmusr is %#x\n", mmusr); |
613 | #if 0 | 590 | #if 0 |
614 | asm volatile ("pmove %%tt0,%0" | 591 | asm volatile ("pmove %%tt0,%0" |
615 | : "=m" (tlong)); | 592 | : "=m" (tlong)); |
616 | printk("tt0 is %#lx, ", tlong); | 593 | pr_debug("tt0 is %#lx, ", tlong); |
617 | asm volatile ("pmove %%tt1,%0" | 594 | asm volatile ("pmove %%tt1,%0" |
618 | : "=m" (tlong)); | 595 | : "=m" (tlong)); |
619 | printk("tt1 is %#lx\n", tlong); | 596 | pr_debug("tt1 is %#lx\n", tlong); |
620 | #endif | ||
621 | #ifdef DEBUG | ||
622 | printk("Unknown SIGSEGV - 1\n"); | ||
623 | #endif | 597 | #endif |
598 | pr_debug("Unknown SIGSEGV - 1\n"); | ||
624 | die_if_kernel("Oops",&fp->ptregs,mmusr); | 599 | die_if_kernel("Oops",&fp->ptregs,mmusr); |
625 | force_sig(SIGSEGV, current); | 600 | force_sig(SIGSEGV, current); |
626 | return; | 601 | return; |
@@ -641,10 +616,9 @@ static inline void bus_error030 (struct frame *fp) | |||
641 | return; | 616 | return; |
642 | 617 | ||
643 | if (fp->ptregs.sr & PS_S) { | 618 | if (fp->ptregs.sr & PS_S) { |
644 | printk("Instruction fault at %#010lx\n", | 619 | pr_err("Instruction fault at %#010lx\n", fp->ptregs.pc); |
645 | fp->ptregs.pc); | ||
646 | buserr: | 620 | buserr: |
647 | printk ("BAD KERNEL BUSERR\n"); | 621 | pr_err("BAD KERNEL BUSERR\n"); |
648 | die_if_kernel("Oops",&fp->ptregs,0); | 622 | die_if_kernel("Oops",&fp->ptregs,0); |
649 | force_sig(SIGKILL, current); | 623 | force_sig(SIGKILL, current); |
650 | return; | 624 | return; |
@@ -668,28 +642,22 @@ static inline void bus_error030 (struct frame *fp) | |||
668 | "pmove %%psr,%1" | 642 | "pmove %%psr,%1" |
669 | : "=a&" (desc), "=m" (temp) | 643 | : "=a&" (desc), "=m" (temp) |
670 | : "a" (addr)); | 644 | : "a" (addr)); |
645 | pr_debug("mmusr is %#x for addr %#lx in task %p\n", | ||
646 | temp, addr, current); | ||
647 | pr_debug("descriptor address is 0x%p, contents %#lx\n", | ||
648 | __va(desc), *(unsigned long *)__va(desc)); | ||
671 | #else | 649 | #else |
672 | asm volatile ("ptestr #1,%1@,#7\n\t" | 650 | asm volatile ("ptestr #1,%1@,#7\n\t" |
673 | "pmove %%psr,%0" | 651 | "pmove %%psr,%0" |
674 | : "=m" (temp) : "a" (addr)); | 652 | : "=m" (temp) : "a" (addr)); |
675 | #endif | 653 | #endif |
676 | mmusr = temp; | 654 | mmusr = temp; |
677 | |||
678 | #ifdef DEBUG | ||
679 | printk ("mmusr is %#x for addr %#lx in task %p\n", | ||
680 | mmusr, addr, current); | ||
681 | printk ("descriptor address is %#lx, contents %#lx\n", | ||
682 | __va(desc), *(unsigned long *)__va(desc)); | ||
683 | #endif | ||
684 | |||
685 | if (mmusr & MMU_I) | 655 | if (mmusr & MMU_I) |
686 | do_page_fault (&fp->ptregs, addr, 0); | 656 | do_page_fault (&fp->ptregs, addr, 0); |
687 | else if (mmusr & (MMU_B|MMU_L|MMU_S)) { | 657 | else if (mmusr & (MMU_B|MMU_L|MMU_S)) { |
688 | printk ("invalid insn access at %#lx from pc %#lx\n", | 658 | pr_err("invalid insn access at %#lx from pc %#lx\n", |
689 | addr, fp->ptregs.pc); | 659 | addr, fp->ptregs.pc); |
690 | #ifdef DEBUG | 660 | pr_debug("Unknown SIGSEGV - 2\n"); |
691 | printk("Unknown SIGSEGV - 2\n"); | ||
692 | #endif | ||
693 | die_if_kernel("Oops",&fp->ptregs,mmusr); | 661 | die_if_kernel("Oops",&fp->ptregs,mmusr); |
694 | force_sig(SIGSEGV, current); | 662 | force_sig(SIGSEGV, current); |
695 | return; | 663 | return; |
@@ -791,9 +759,7 @@ asmlinkage void buserr_c(struct frame *fp) | |||
791 | if (user_mode(&fp->ptregs)) | 759 | if (user_mode(&fp->ptregs)) |
792 | current->thread.esp0 = (unsigned long) fp; | 760 | current->thread.esp0 = (unsigned long) fp; |
793 | 761 | ||
794 | #ifdef DEBUG | 762 | pr_debug("*** Bus Error *** Format is %x\n", fp->ptregs.format); |
795 | printk ("*** Bus Error *** Format is %x\n", fp->ptregs.format); | ||
796 | #endif | ||
797 | 763 | ||
798 | #if defined(CONFIG_COLDFIRE) && defined(CONFIG_MMU) | 764 | #if defined(CONFIG_COLDFIRE) && defined(CONFIG_MMU) |
799 | if (CPU_IS_COLDFIRE) { | 765 | if (CPU_IS_COLDFIRE) { |
@@ -836,9 +802,7 @@ asmlinkage void buserr_c(struct frame *fp) | |||
836 | #endif | 802 | #endif |
837 | default: | 803 | default: |
838 | die_if_kernel("bad frame format",&fp->ptregs,0); | 804 | die_if_kernel("bad frame format",&fp->ptregs,0); |
839 | #ifdef DEBUG | 805 | pr_debug("Unknown SIGSEGV - 4\n"); |
840 | printk("Unknown SIGSEGV - 4\n"); | ||
841 | #endif | ||
842 | force_sig(SIGSEGV, current); | 806 | force_sig(SIGSEGV, current); |
843 | } | 807 | } |
844 | } | 808 | } |
@@ -852,7 +816,7 @@ void show_trace(unsigned long *stack) | |||
852 | unsigned long addr; | 816 | unsigned long addr; |
853 | int i; | 817 | int i; |
854 | 818 | ||
855 | printk("Call Trace:"); | 819 | pr_info("Call Trace:"); |
856 | addr = (unsigned long)stack + THREAD_SIZE - 1; | 820 | addr = (unsigned long)stack + THREAD_SIZE - 1; |
857 | endstack = (unsigned long *)(addr & -THREAD_SIZE); | 821 | endstack = (unsigned long *)(addr & -THREAD_SIZE); |
858 | i = 0; | 822 | i = 0; |
@@ -869,13 +833,13 @@ void show_trace(unsigned long *stack) | |||
869 | if (__kernel_text_address(addr)) { | 833 | if (__kernel_text_address(addr)) { |
870 | #ifndef CONFIG_KALLSYMS | 834 | #ifndef CONFIG_KALLSYMS |
871 | if (i % 5 == 0) | 835 | if (i % 5 == 0) |
872 | printk("\n "); | 836 | pr_cont("\n "); |
873 | #endif | 837 | #endif |
874 | printk(" [<%08lx>] %pS\n", addr, (void *)addr); | 838 | pr_cont(" [<%08lx>] %pS\n", addr, (void *)addr); |
875 | i++; | 839 | i++; |
876 | } | 840 | } |
877 | } | 841 | } |
878 | printk("\n"); | 842 | pr_cont("\n"); |
879 | } | 843 | } |
880 | 844 | ||
881 | void show_registers(struct pt_regs *regs) | 845 | void show_registers(struct pt_regs *regs) |
@@ -887,81 +851,87 @@ void show_registers(struct pt_regs *regs) | |||
887 | int i; | 851 | int i; |
888 | 852 | ||
889 | print_modules(); | 853 | print_modules(); |
890 | printk("PC: [<%08lx>] %pS\n", regs->pc, (void *)regs->pc); | 854 | pr_info("PC: [<%08lx>] %pS\n", regs->pc, (void *)regs->pc); |
891 | printk("SR: %04x SP: %p a2: %08lx\n", regs->sr, regs, regs->a2); | 855 | pr_info("SR: %04x SP: %p a2: %08lx\n", regs->sr, regs, regs->a2); |
892 | printk("d0: %08lx d1: %08lx d2: %08lx d3: %08lx\n", | 856 | pr_info("d0: %08lx d1: %08lx d2: %08lx d3: %08lx\n", |
893 | regs->d0, regs->d1, regs->d2, regs->d3); | 857 | regs->d0, regs->d1, regs->d2, regs->d3); |
894 | printk("d4: %08lx d5: %08lx a0: %08lx a1: %08lx\n", | 858 | pr_info("d4: %08lx d5: %08lx a0: %08lx a1: %08lx\n", |
895 | regs->d4, regs->d5, regs->a0, regs->a1); | 859 | regs->d4, regs->d5, regs->a0, regs->a1); |
896 | 860 | ||
897 | printk("Process %s (pid: %d, task=%p)\n", | 861 | pr_info("Process %s (pid: %d, task=%p)\n", |
898 | current->comm, task_pid_nr(current), current); | 862 | current->comm, task_pid_nr(current), current); |
899 | addr = (unsigned long)&fp->un; | 863 | addr = (unsigned long)&fp->un; |
900 | printk("Frame format=%X ", regs->format); | 864 | pr_info("Frame format=%X ", regs->format); |
901 | switch (regs->format) { | 865 | switch (regs->format) { |
902 | case 0x2: | 866 | case 0x2: |
903 | printk("instr addr=%08lx\n", fp->un.fmt2.iaddr); | 867 | pr_cont("instr addr=%08lx\n", fp->un.fmt2.iaddr); |
904 | addr += sizeof(fp->un.fmt2); | 868 | addr += sizeof(fp->un.fmt2); |
905 | break; | 869 | break; |
906 | case 0x3: | 870 | case 0x3: |
907 | printk("eff addr=%08lx\n", fp->un.fmt3.effaddr); | 871 | pr_cont("eff addr=%08lx\n", fp->un.fmt3.effaddr); |
908 | addr += sizeof(fp->un.fmt3); | 872 | addr += sizeof(fp->un.fmt3); |
909 | break; | 873 | break; |
910 | case 0x4: | 874 | case 0x4: |
911 | printk((CPU_IS_060 ? "fault addr=%08lx fslw=%08lx\n" | 875 | if (CPU_IS_060) |
912 | : "eff addr=%08lx pc=%08lx\n"), | 876 | pr_cont("fault addr=%08lx fslw=%08lx\n", |
913 | fp->un.fmt4.effaddr, fp->un.fmt4.pc); | 877 | fp->un.fmt4.effaddr, fp->un.fmt4.pc); |
878 | else | ||
879 | pr_cont("eff addr=%08lx pc=%08lx\n", | ||
880 | fp->un.fmt4.effaddr, fp->un.fmt4.pc); | ||
914 | addr += sizeof(fp->un.fmt4); | 881 | addr += sizeof(fp->un.fmt4); |
915 | break; | 882 | break; |
916 | case 0x7: | 883 | case 0x7: |
917 | printk("eff addr=%08lx ssw=%04x faddr=%08lx\n", | 884 | pr_cont("eff addr=%08lx ssw=%04x faddr=%08lx\n", |
918 | fp->un.fmt7.effaddr, fp->un.fmt7.ssw, fp->un.fmt7.faddr); | 885 | fp->un.fmt7.effaddr, fp->un.fmt7.ssw, fp->un.fmt7.faddr); |
919 | printk("wb 1 stat/addr/data: %04x %08lx %08lx\n", | 886 | pr_info("wb 1 stat/addr/data: %04x %08lx %08lx\n", |
920 | fp->un.fmt7.wb1s, fp->un.fmt7.wb1a, fp->un.fmt7.wb1dpd0); | 887 | fp->un.fmt7.wb1s, fp->un.fmt7.wb1a, fp->un.fmt7.wb1dpd0); |
921 | printk("wb 2 stat/addr/data: %04x %08lx %08lx\n", | 888 | pr_info("wb 2 stat/addr/data: %04x %08lx %08lx\n", |
922 | fp->un.fmt7.wb2s, fp->un.fmt7.wb2a, fp->un.fmt7.wb2d); | 889 | fp->un.fmt7.wb2s, fp->un.fmt7.wb2a, fp->un.fmt7.wb2d); |
923 | printk("wb 3 stat/addr/data: %04x %08lx %08lx\n", | 890 | pr_info("wb 3 stat/addr/data: %04x %08lx %08lx\n", |
924 | fp->un.fmt7.wb3s, fp->un.fmt7.wb3a, fp->un.fmt7.wb3d); | 891 | fp->un.fmt7.wb3s, fp->un.fmt7.wb3a, fp->un.fmt7.wb3d); |
925 | printk("push data: %08lx %08lx %08lx %08lx\n", | 892 | pr_info("push data: %08lx %08lx %08lx %08lx\n", |
926 | fp->un.fmt7.wb1dpd0, fp->un.fmt7.pd1, fp->un.fmt7.pd2, | 893 | fp->un.fmt7.wb1dpd0, fp->un.fmt7.pd1, fp->un.fmt7.pd2, |
927 | fp->un.fmt7.pd3); | 894 | fp->un.fmt7.pd3); |
928 | addr += sizeof(fp->un.fmt7); | 895 | addr += sizeof(fp->un.fmt7); |
929 | break; | 896 | break; |
930 | case 0x9: | 897 | case 0x9: |
931 | printk("instr addr=%08lx\n", fp->un.fmt9.iaddr); | 898 | pr_cont("instr addr=%08lx\n", fp->un.fmt9.iaddr); |
932 | addr += sizeof(fp->un.fmt9); | 899 | addr += sizeof(fp->un.fmt9); |
933 | break; | 900 | break; |
934 | case 0xa: | 901 | case 0xa: |
935 | printk("ssw=%04x isc=%04x isb=%04x daddr=%08lx dobuf=%08lx\n", | 902 | pr_cont("ssw=%04x isc=%04x isb=%04x daddr=%08lx dobuf=%08lx\n", |
936 | fp->un.fmta.ssw, fp->un.fmta.isc, fp->un.fmta.isb, | 903 | fp->un.fmta.ssw, fp->un.fmta.isc, fp->un.fmta.isb, |
937 | fp->un.fmta.daddr, fp->un.fmta.dobuf); | 904 | fp->un.fmta.daddr, fp->un.fmta.dobuf); |
938 | addr += sizeof(fp->un.fmta); | 905 | addr += sizeof(fp->un.fmta); |
939 | break; | 906 | break; |
940 | case 0xb: | 907 | case 0xb: |
941 | printk("ssw=%04x isc=%04x isb=%04x daddr=%08lx dobuf=%08lx\n", | 908 | pr_cont("ssw=%04x isc=%04x isb=%04x daddr=%08lx dobuf=%08lx\n", |
942 | fp->un.fmtb.ssw, fp->un.fmtb.isc, fp->un.fmtb.isb, | 909 | fp->un.fmtb.ssw, fp->un.fmtb.isc, fp->un.fmtb.isb, |
943 | fp->un.fmtb.daddr, fp->un.fmtb.dobuf); | 910 | fp->un.fmtb.daddr, fp->un.fmtb.dobuf); |
944 | printk("baddr=%08lx dibuf=%08lx ver=%x\n", | 911 | pr_info("baddr=%08lx dibuf=%08lx ver=%x\n", |
945 | fp->un.fmtb.baddr, fp->un.fmtb.dibuf, fp->un.fmtb.ver); | 912 | fp->un.fmtb.baddr, fp->un.fmtb.dibuf, fp->un.fmtb.ver); |
946 | addr += sizeof(fp->un.fmtb); | 913 | addr += sizeof(fp->un.fmtb); |
947 | break; | 914 | break; |
948 | default: | 915 | default: |
949 | printk("\n"); | 916 | pr_cont("\n"); |
950 | } | 917 | } |
951 | show_stack(NULL, (unsigned long *)addr); | 918 | show_stack(NULL, (unsigned long *)addr); |
952 | 919 | ||
953 | printk("Code:"); | 920 | pr_info("Code:"); |
954 | set_fs(KERNEL_DS); | 921 | set_fs(KERNEL_DS); |
955 | cp = (u16 *)regs->pc; | 922 | cp = (u16 *)regs->pc; |
956 | for (i = -8; i < 16; i++) { | 923 | for (i = -8; i < 16; i++) { |
957 | if (get_user(c, cp + i) && i >= 0) { | 924 | if (get_user(c, cp + i) && i >= 0) { |
958 | printk(" Bad PC value."); | 925 | pr_cont(" Bad PC value."); |
959 | break; | 926 | break; |
960 | } | 927 | } |
961 | printk(i ? " %04x" : " <%04x>", c); | 928 | if (i) |
929 | pr_cont(" %04x", c); | ||
930 | else | ||
931 | pr_cont(" <%04x>", c); | ||
962 | } | 932 | } |
963 | set_fs(old_fs); | 933 | set_fs(old_fs); |
964 | printk ("\n"); | 934 | pr_cont("\n"); |
965 | } | 935 | } |
966 | 936 | ||
967 | void show_stack(struct task_struct *task, unsigned long *stack) | 937 | void show_stack(struct task_struct *task, unsigned long *stack) |
@@ -978,16 +948,16 @@ void show_stack(struct task_struct *task, unsigned long *stack) | |||
978 | } | 948 | } |
979 | endstack = (unsigned long *)(((unsigned long)stack + THREAD_SIZE - 1) & -THREAD_SIZE); | 949 | endstack = (unsigned long *)(((unsigned long)stack + THREAD_SIZE - 1) & -THREAD_SIZE); |
980 | 950 | ||
981 | printk("Stack from %08lx:", (unsigned long)stack); | 951 | pr_info("Stack from %08lx:", (unsigned long)stack); |
982 | p = stack; | 952 | p = stack; |
983 | for (i = 0; i < kstack_depth_to_print; i++) { | 953 | for (i = 0; i < kstack_depth_to_print; i++) { |
984 | if (p + 1 > endstack) | 954 | if (p + 1 > endstack) |
985 | break; | 955 | break; |
986 | if (i % 8 == 0) | 956 | if (i % 8 == 0) |
987 | printk("\n "); | 957 | pr_cont("\n "); |
988 | printk(" %08lx", *p++); | 958 | pr_cont(" %08lx", *p++); |
989 | } | 959 | } |
990 | printk("\n"); | 960 | pr_cont("\n"); |
991 | show_trace(stack); | 961 | show_trace(stack); |
992 | } | 962 | } |
993 | 963 | ||
@@ -1005,32 +975,32 @@ void bad_super_trap (struct frame *fp) | |||
1005 | 975 | ||
1006 | console_verbose(); | 976 | console_verbose(); |
1007 | if (vector < ARRAY_SIZE(vec_names)) | 977 | if (vector < ARRAY_SIZE(vec_names)) |
1008 | printk ("*** %s *** FORMAT=%X\n", | 978 | pr_err("*** %s *** FORMAT=%X\n", |
1009 | vec_names[vector], | 979 | vec_names[vector], |
1010 | fp->ptregs.format); | 980 | fp->ptregs.format); |
1011 | else | 981 | else |
1012 | printk ("*** Exception %d *** FORMAT=%X\n", | 982 | pr_err("*** Exception %d *** FORMAT=%X\n", |
1013 | vector, fp->ptregs.format); | 983 | vector, fp->ptregs.format); |
1014 | if (vector == VEC_ADDRERR && CPU_IS_020_OR_030) { | 984 | if (vector == VEC_ADDRERR && CPU_IS_020_OR_030) { |
1015 | unsigned short ssw = fp->un.fmtb.ssw; | 985 | unsigned short ssw = fp->un.fmtb.ssw; |
1016 | 986 | ||
1017 | printk ("SSW=%#06x ", ssw); | 987 | pr_err("SSW=%#06x ", ssw); |
1018 | 988 | ||
1019 | if (ssw & RC) | 989 | if (ssw & RC) |
1020 | printk ("Pipe stage C instruction fault at %#010lx\n", | 990 | pr_err("Pipe stage C instruction fault at %#010lx\n", |
1021 | (fp->ptregs.format) == 0xA ? | 991 | (fp->ptregs.format) == 0xA ? |
1022 | fp->ptregs.pc + 2 : fp->un.fmtb.baddr - 2); | 992 | fp->ptregs.pc + 2 : fp->un.fmtb.baddr - 2); |
1023 | if (ssw & RB) | 993 | if (ssw & RB) |
1024 | printk ("Pipe stage B instruction fault at %#010lx\n", | 994 | pr_err("Pipe stage B instruction fault at %#010lx\n", |
1025 | (fp->ptregs.format) == 0xA ? | 995 | (fp->ptregs.format) == 0xA ? |
1026 | fp->ptregs.pc + 4 : fp->un.fmtb.baddr); | 996 | fp->ptregs.pc + 4 : fp->un.fmtb.baddr); |
1027 | if (ssw & DF) | 997 | if (ssw & DF) |
1028 | printk ("Data %s fault at %#010lx in %s (pc=%#lx)\n", | 998 | pr_err("Data %s fault at %#010lx in %s (pc=%#lx)\n", |
1029 | ssw & RW ? "read" : "write", | 999 | ssw & RW ? "read" : "write", |
1030 | fp->un.fmtb.daddr, space_names[ssw & DFC], | 1000 | fp->un.fmtb.daddr, space_names[ssw & DFC], |
1031 | fp->ptregs.pc); | 1001 | fp->ptregs.pc); |
1032 | } | 1002 | } |
1033 | printk ("Current process id is %d\n", task_pid_nr(current)); | 1003 | pr_err("Current process id is %d\n", task_pid_nr(current)); |
1034 | die_if_kernel("BAD KERNEL TRAP", &fp->ptregs, 0); | 1004 | die_if_kernel("BAD KERNEL TRAP", &fp->ptregs, 0); |
1035 | } | 1005 | } |
1036 | 1006 | ||
@@ -1162,7 +1132,7 @@ void die_if_kernel (char *str, struct pt_regs *fp, int nr) | |||
1162 | return; | 1132 | return; |
1163 | 1133 | ||
1164 | console_verbose(); | 1134 | console_verbose(); |
1165 | printk("%s: %08x\n",str,nr); | 1135 | pr_crit("%s: %08x\n", str, nr); |
1166 | show_registers(fp); | 1136 | show_registers(fp); |
1167 | add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE); | 1137 | add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE); |
1168 | do_exit(SIGSEGV); | 1138 | do_exit(SIGSEGV); |
diff --git a/arch/m68k/mac/config.c b/arch/m68k/mac/config.c index afb95d5fb26b..982c3fe73c4a 100644 --- a/arch/m68k/mac/config.c +++ b/arch/m68k/mac/config.c | |||
@@ -26,9 +26,10 @@ | |||
26 | #include <linux/adb.h> | 26 | #include <linux/adb.h> |
27 | #include <linux/cuda.h> | 27 | #include <linux/cuda.h> |
28 | 28 | ||
29 | #define BOOTINFO_COMPAT_1_0 | ||
30 | #include <asm/setup.h> | 29 | #include <asm/setup.h> |
31 | #include <asm/bootinfo.h> | 30 | #include <asm/bootinfo.h> |
31 | #include <asm/bootinfo-mac.h> | ||
32 | #include <asm/byteorder.h> | ||
32 | 33 | ||
33 | #include <asm/io.h> | 34 | #include <asm/io.h> |
34 | #include <asm/irq.h> | 35 | #include <asm/irq.h> |
@@ -107,45 +108,46 @@ static void __init mac_sched_init(irq_handler_t vector) | |||
107 | int __init mac_parse_bootinfo(const struct bi_record *record) | 108 | int __init mac_parse_bootinfo(const struct bi_record *record) |
108 | { | 109 | { |
109 | int unknown = 0; | 110 | int unknown = 0; |
110 | const u_long *data = record->data; | 111 | const void *data = record->data; |
111 | 112 | ||
112 | switch (record->tag) { | 113 | switch (be16_to_cpu(record->tag)) { |
113 | case BI_MAC_MODEL: | 114 | case BI_MAC_MODEL: |
114 | mac_bi_data.id = *data; | 115 | mac_bi_data.id = be32_to_cpup(data); |
115 | break; | 116 | break; |
116 | case BI_MAC_VADDR: | 117 | case BI_MAC_VADDR: |
117 | mac_bi_data.videoaddr = *data; | 118 | mac_bi_data.videoaddr = be32_to_cpup(data); |
118 | break; | 119 | break; |
119 | case BI_MAC_VDEPTH: | 120 | case BI_MAC_VDEPTH: |
120 | mac_bi_data.videodepth = *data; | 121 | mac_bi_data.videodepth = be32_to_cpup(data); |
121 | break; | 122 | break; |
122 | case BI_MAC_VROW: | 123 | case BI_MAC_VROW: |
123 | mac_bi_data.videorow = *data; | 124 | mac_bi_data.videorow = be32_to_cpup(data); |
124 | break; | 125 | break; |
125 | case BI_MAC_VDIM: | 126 | case BI_MAC_VDIM: |
126 | mac_bi_data.dimensions = *data; | 127 | mac_bi_data.dimensions = be32_to_cpup(data); |
127 | break; | 128 | break; |
128 | case BI_MAC_VLOGICAL: | 129 | case BI_MAC_VLOGICAL: |
129 | mac_bi_data.videological = VIDEOMEMBASE + (*data & ~VIDEOMEMMASK); | 130 | mac_orig_videoaddr = be32_to_cpup(data); |
130 | mac_orig_videoaddr = *data; | 131 | mac_bi_data.videological = |
132 | VIDEOMEMBASE + (mac_orig_videoaddr & ~VIDEOMEMMASK); | ||
131 | break; | 133 | break; |
132 | case BI_MAC_SCCBASE: | 134 | case BI_MAC_SCCBASE: |
133 | mac_bi_data.sccbase = *data; | 135 | mac_bi_data.sccbase = be32_to_cpup(data); |
134 | break; | 136 | break; |
135 | case BI_MAC_BTIME: | 137 | case BI_MAC_BTIME: |
136 | mac_bi_data.boottime = *data; | 138 | mac_bi_data.boottime = be32_to_cpup(data); |
137 | break; | 139 | break; |
138 | case BI_MAC_GMTBIAS: | 140 | case BI_MAC_GMTBIAS: |
139 | mac_bi_data.gmtbias = *data; | 141 | mac_bi_data.gmtbias = be32_to_cpup(data); |
140 | break; | 142 | break; |
141 | case BI_MAC_MEMSIZE: | 143 | case BI_MAC_MEMSIZE: |
142 | mac_bi_data.memsize = *data; | 144 | mac_bi_data.memsize = be32_to_cpup(data); |
143 | break; | 145 | break; |
144 | case BI_MAC_CPUID: | 146 | case BI_MAC_CPUID: |
145 | mac_bi_data.cpuid = *data; | 147 | mac_bi_data.cpuid = be32_to_cpup(data); |
146 | break; | 148 | break; |
147 | case BI_MAC_ROMBASE: | 149 | case BI_MAC_ROMBASE: |
148 | mac_bi_data.rombase = *data; | 150 | mac_bi_data.rombase = be32_to_cpup(data); |
149 | break; | 151 | break; |
150 | default: | 152 | default: |
151 | unknown = 1; | 153 | unknown = 1; |
diff --git a/arch/m68k/mac/iop.c b/arch/m68k/mac/iop.c index 7d8d46127ad9..4d2adfb32a2a 100644 --- a/arch/m68k/mac/iop.c +++ b/arch/m68k/mac/iop.c | |||
@@ -111,16 +111,15 @@ | |||
111 | #include <linux/init.h> | 111 | #include <linux/init.h> |
112 | #include <linux/interrupt.h> | 112 | #include <linux/interrupt.h> |
113 | 113 | ||
114 | #include <asm/bootinfo.h> | ||
115 | #include <asm/macintosh.h> | 114 | #include <asm/macintosh.h> |
116 | #include <asm/macints.h> | 115 | #include <asm/macints.h> |
117 | #include <asm/mac_iop.h> | 116 | #include <asm/mac_iop.h> |
118 | 117 | ||
119 | /*#define DEBUG_IOP*/ | 118 | /*#define DEBUG_IOP*/ |
120 | 119 | ||
121 | /* Set to non-zero if the IOPs are present. Set by iop_init() */ | 120 | /* Non-zero if the IOPs are present */ |
122 | 121 | ||
123 | int iop_scc_present,iop_ism_present; | 122 | int iop_scc_present, iop_ism_present; |
124 | 123 | ||
125 | /* structure for tracking channel listeners */ | 124 | /* structure for tracking channel listeners */ |
126 | 125 | ||
diff --git a/arch/m68k/mac/misc.c b/arch/m68k/mac/misc.c index 5e085554ac7f..707b61aea203 100644 --- a/arch/m68k/mac/misc.c +++ b/arch/m68k/mac/misc.c | |||
@@ -25,8 +25,6 @@ | |||
25 | #include <asm/mac_via.h> | 25 | #include <asm/mac_via.h> |
26 | #include <asm/mac_oss.h> | 26 | #include <asm/mac_oss.h> |
27 | 27 | ||
28 | #define BOOTINFO_COMPAT_1_0 | ||
29 | #include <asm/bootinfo.h> | ||
30 | #include <asm/machdep.h> | 28 | #include <asm/machdep.h> |
31 | 29 | ||
32 | /* Offset between Unix time (1970-based) and Mac time (1904-based) */ | 30 | /* Offset between Unix time (1970-based) and Mac time (1904-based) */ |
diff --git a/arch/m68k/mac/oss.c b/arch/m68k/mac/oss.c index 6c4c882c126e..54037125ebf8 100644 --- a/arch/m68k/mac/oss.c +++ b/arch/m68k/mac/oss.c | |||
@@ -21,7 +21,6 @@ | |||
21 | #include <linux/init.h> | 21 | #include <linux/init.h> |
22 | #include <linux/irq.h> | 22 | #include <linux/irq.h> |
23 | 23 | ||
24 | #include <asm/bootinfo.h> | ||
25 | #include <asm/macintosh.h> | 24 | #include <asm/macintosh.h> |
26 | #include <asm/macints.h> | 25 | #include <asm/macints.h> |
27 | #include <asm/mac_via.h> | 26 | #include <asm/mac_via.h> |
diff --git a/arch/m68k/mac/psc.c b/arch/m68k/mac/psc.c index 6f026fc302fa..835fa04511c8 100644 --- a/arch/m68k/mac/psc.c +++ b/arch/m68k/mac/psc.c | |||
@@ -21,7 +21,6 @@ | |||
21 | #include <linux/irq.h> | 21 | #include <linux/irq.h> |
22 | 22 | ||
23 | #include <asm/traps.h> | 23 | #include <asm/traps.h> |
24 | #include <asm/bootinfo.h> | ||
25 | #include <asm/macintosh.h> | 24 | #include <asm/macintosh.h> |
26 | #include <asm/macints.h> | 25 | #include <asm/macints.h> |
27 | #include <asm/mac_psc.h> | 26 | #include <asm/mac_psc.h> |
@@ -54,7 +53,7 @@ static void psc_debug_dump(void) | |||
54 | * expanded to cover what I think are the other 7 channels. | 53 | * expanded to cover what I think are the other 7 channels. |
55 | */ | 54 | */ |
56 | 55 | ||
57 | static void psc_dma_die_die_die(void) | 56 | static __init void psc_dma_die_die_die(void) |
58 | { | 57 | { |
59 | int i; | 58 | int i; |
60 | 59 | ||
diff --git a/arch/m68k/mac/via.c b/arch/m68k/mac/via.c index 5d1458bb871b..e198dec868e4 100644 --- a/arch/m68k/mac/via.c +++ b/arch/m68k/mac/via.c | |||
@@ -30,7 +30,6 @@ | |||
30 | #include <linux/module.h> | 30 | #include <linux/module.h> |
31 | #include <linux/irq.h> | 31 | #include <linux/irq.h> |
32 | 32 | ||
33 | #include <asm/bootinfo.h> | ||
34 | #include <asm/macintosh.h> | 33 | #include <asm/macintosh.h> |
35 | #include <asm/macints.h> | 34 | #include <asm/macints.h> |
36 | #include <asm/mac_via.h> | 35 | #include <asm/mac_via.h> |
diff --git a/arch/m68k/mm/fault.c b/arch/m68k/mm/fault.c index eb1d61f68725..2bd7487440c4 100644 --- a/arch/m68k/mm/fault.c +++ b/arch/m68k/mm/fault.c | |||
@@ -25,9 +25,8 @@ int send_fault_sig(struct pt_regs *regs) | |||
25 | siginfo.si_signo = current->thread.signo; | 25 | siginfo.si_signo = current->thread.signo; |
26 | siginfo.si_code = current->thread.code; | 26 | siginfo.si_code = current->thread.code; |
27 | siginfo.si_addr = (void *)current->thread.faddr; | 27 | siginfo.si_addr = (void *)current->thread.faddr; |
28 | #ifdef DEBUG | 28 | pr_debug("send_fault_sig: %p,%d,%d\n", siginfo.si_addr, |
29 | printk("send_fault_sig: %p,%d,%d\n", siginfo.si_addr, siginfo.si_signo, siginfo.si_code); | 29 | siginfo.si_signo, siginfo.si_code); |
30 | #endif | ||
31 | 30 | ||
32 | if (user_mode(regs)) { | 31 | if (user_mode(regs)) { |
33 | force_sig_info(siginfo.si_signo, | 32 | force_sig_info(siginfo.si_signo, |
@@ -45,10 +44,10 @@ int send_fault_sig(struct pt_regs *regs) | |||
45 | * terminate things with extreme prejudice. | 44 | * terminate things with extreme prejudice. |
46 | */ | 45 | */ |
47 | if ((unsigned long)siginfo.si_addr < PAGE_SIZE) | 46 | if ((unsigned long)siginfo.si_addr < PAGE_SIZE) |
48 | printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference"); | 47 | pr_alert("Unable to handle kernel NULL pointer dereference"); |
49 | else | 48 | else |
50 | printk(KERN_ALERT "Unable to handle kernel access"); | 49 | pr_alert("Unable to handle kernel access"); |
51 | printk(" at virtual address %p\n", siginfo.si_addr); | 50 | pr_cont(" at virtual address %p\n", siginfo.si_addr); |
52 | die_if_kernel("Oops", regs, 0 /*error_code*/); | 51 | die_if_kernel("Oops", regs, 0 /*error_code*/); |
53 | do_exit(SIGKILL); | 52 | do_exit(SIGKILL); |
54 | } | 53 | } |
@@ -75,11 +74,8 @@ int do_page_fault(struct pt_regs *regs, unsigned long address, | |||
75 | int fault; | 74 | int fault; |
76 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; | 75 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; |
77 | 76 | ||
78 | #ifdef DEBUG | 77 | pr_debug("do page fault:\nregs->sr=%#x, regs->pc=%#lx, address=%#lx, %ld, %p\n", |
79 | printk ("do page fault:\nregs->sr=%#x, regs->pc=%#lx, address=%#lx, %ld, %p\n", | 78 | regs->sr, regs->pc, address, error_code, mm ? mm->pgd : NULL); |
80 | regs->sr, regs->pc, address, error_code, | ||
81 | current->mm->pgd); | ||
82 | #endif | ||
83 | 79 | ||
84 | /* | 80 | /* |
85 | * If we're in an interrupt or have no user | 81 | * If we're in an interrupt or have no user |
@@ -118,9 +114,7 @@ retry: | |||
118 | * we can handle it.. | 114 | * we can handle it.. |
119 | */ | 115 | */ |
120 | good_area: | 116 | good_area: |
121 | #ifdef DEBUG | 117 | pr_debug("do_page_fault: good_area\n"); |
122 | printk("do_page_fault: good_area\n"); | ||
123 | #endif | ||
124 | switch (error_code & 3) { | 118 | switch (error_code & 3) { |
125 | default: /* 3: write, present */ | 119 | default: /* 3: write, present */ |
126 | /* fall through */ | 120 | /* fall through */ |
@@ -143,9 +137,7 @@ good_area: | |||
143 | */ | 137 | */ |
144 | 138 | ||
145 | fault = handle_mm_fault(mm, vma, address, flags); | 139 | fault = handle_mm_fault(mm, vma, address, flags); |
146 | #ifdef DEBUG | 140 | pr_debug("handle_mm_fault returns %d\n", fault); |
147 | printk("handle_mm_fault returns %d\n",fault); | ||
148 | #endif | ||
149 | 141 | ||
150 | if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) | 142 | if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) |
151 | return 0; | 143 | return 0; |
diff --git a/arch/m68k/mm/init.c b/arch/m68k/mm/init.c index 6b4baa6e4d31..acaff6a49e35 100644 --- a/arch/m68k/mm/init.c +++ b/arch/m68k/mm/init.c | |||
@@ -59,7 +59,7 @@ EXPORT_SYMBOL(pg_data_table); | |||
59 | void __init m68k_setup_node(int node) | 59 | void __init m68k_setup_node(int node) |
60 | { | 60 | { |
61 | #ifndef CONFIG_SINGLE_MEMORY_CHUNK | 61 | #ifndef CONFIG_SINGLE_MEMORY_CHUNK |
62 | struct mem_info *info = m68k_memory + node; | 62 | struct m68k_mem_info *info = m68k_memory + node; |
63 | int i, end; | 63 | int i, end; |
64 | 64 | ||
65 | i = (unsigned long)phys_to_virt(info->addr) >> __virt_to_node_shift(); | 65 | i = (unsigned long)phys_to_virt(info->addr) >> __virt_to_node_shift(); |
diff --git a/arch/m68k/mm/kmap.c b/arch/m68k/mm/kmap.c index 568cfad3ceb8..6e4955bc542b 100644 --- a/arch/m68k/mm/kmap.c +++ b/arch/m68k/mm/kmap.c | |||
@@ -27,9 +27,9 @@ | |||
27 | 27 | ||
28 | /* | 28 | /* |
29 | * For 040/060 we can use the virtual memory area like other architectures, | 29 | * For 040/060 we can use the virtual memory area like other architectures, |
30 | * but for 020/030 we want to use early termination page descriptor and we | 30 | * but for 020/030 we want to use early termination page descriptors and we |
31 | * can't mix this with normal page descriptors, so we have to copy that code | 31 | * can't mix this with normal page descriptors, so we have to copy that code |
32 | * (mm/vmalloc.c) and return appriorate aligned addresses. | 32 | * (mm/vmalloc.c) and return appropriately aligned addresses. |
33 | */ | 33 | */ |
34 | 34 | ||
35 | #ifdef CPU_M68040_OR_M68060_ONLY | 35 | #ifdef CPU_M68040_OR_M68060_ONLY |
@@ -224,7 +224,7 @@ void __iomem *__ioremap(unsigned long physaddr, unsigned long size, int cachefla | |||
224 | EXPORT_SYMBOL(__ioremap); | 224 | EXPORT_SYMBOL(__ioremap); |
225 | 225 | ||
226 | /* | 226 | /* |
227 | * Unmap a ioremap()ed region again | 227 | * Unmap an ioremap()ed region again |
228 | */ | 228 | */ |
229 | void iounmap(void __iomem *addr) | 229 | void iounmap(void __iomem *addr) |
230 | { | 230 | { |
@@ -241,8 +241,8 @@ EXPORT_SYMBOL(iounmap); | |||
241 | 241 | ||
242 | /* | 242 | /* |
243 | * __iounmap unmaps nearly everything, so be careful | 243 | * __iounmap unmaps nearly everything, so be careful |
244 | * it doesn't free currently pointer/page tables anymore but it | 244 | * Currently it doesn't free pointer/page tables anymore but this |
245 | * wans't used anyway and might be added later. | 245 | * wasn't used anyway and might be added later. |
246 | */ | 246 | */ |
247 | void __iounmap(void *addr, unsigned long size) | 247 | void __iounmap(void *addr, unsigned long size) |
248 | { | 248 | { |
diff --git a/arch/m68k/mm/motorola.c b/arch/m68k/mm/motorola.c index 251c5437787b..7d4024432163 100644 --- a/arch/m68k/mm/motorola.c +++ b/arch/m68k/mm/motorola.c | |||
@@ -233,7 +233,7 @@ void __init paging_init(void) | |||
233 | printk("Fix your bootloader or use a memfile to make use of this area!\n"); | 233 | printk("Fix your bootloader or use a memfile to make use of this area!\n"); |
234 | m68k_num_memory--; | 234 | m68k_num_memory--; |
235 | memmove(m68k_memory + i, m68k_memory + i + 1, | 235 | memmove(m68k_memory + i, m68k_memory + i + 1, |
236 | (m68k_num_memory - i) * sizeof(struct mem_info)); | 236 | (m68k_num_memory - i) * sizeof(struct m68k_mem_info)); |
237 | continue; | 237 | continue; |
238 | } | 238 | } |
239 | addr = m68k_memory[i].addr + m68k_memory[i].size; | 239 | addr = m68k_memory[i].addr + m68k_memory[i].size; |
diff --git a/arch/m68k/mvme147/config.c b/arch/m68k/mvme147/config.c index 1c6262803b94..1bb3ce6634d3 100644 --- a/arch/m68k/mvme147/config.c +++ b/arch/m68k/mvme147/config.c | |||
@@ -26,6 +26,8 @@ | |||
26 | #include <linux/interrupt.h> | 26 | #include <linux/interrupt.h> |
27 | 27 | ||
28 | #include <asm/bootinfo.h> | 28 | #include <asm/bootinfo.h> |
29 | #include <asm/bootinfo-vme.h> | ||
30 | #include <asm/byteorder.h> | ||
29 | #include <asm/pgtable.h> | 31 | #include <asm/pgtable.h> |
30 | #include <asm/setup.h> | 32 | #include <asm/setup.h> |
31 | #include <asm/irq.h> | 33 | #include <asm/irq.h> |
@@ -51,9 +53,10 @@ static int bcd2int (unsigned char b); | |||
51 | irq_handler_t tick_handler; | 53 | irq_handler_t tick_handler; |
52 | 54 | ||
53 | 55 | ||
54 | int mvme147_parse_bootinfo(const struct bi_record *bi) | 56 | int __init mvme147_parse_bootinfo(const struct bi_record *bi) |
55 | { | 57 | { |
56 | if (bi->tag == BI_VME_TYPE || bi->tag == BI_VME_BRDINFO) | 58 | uint16_t tag = be16_to_cpu(bi->tag); |
59 | if (tag == BI_VME_TYPE || tag == BI_VME_BRDINFO) | ||
57 | return 0; | 60 | return 0; |
58 | else | 61 | else |
59 | return 1; | 62 | return 1; |
diff --git a/arch/m68k/mvme16x/config.c b/arch/m68k/mvme16x/config.c index 080a342458a1..eab7d342757e 100644 --- a/arch/m68k/mvme16x/config.c +++ b/arch/m68k/mvme16x/config.c | |||
@@ -29,6 +29,8 @@ | |||
29 | #include <linux/module.h> | 29 | #include <linux/module.h> |
30 | 30 | ||
31 | #include <asm/bootinfo.h> | 31 | #include <asm/bootinfo.h> |
32 | #include <asm/bootinfo-vme.h> | ||
33 | #include <asm/byteorder.h> | ||
32 | #include <asm/pgtable.h> | 34 | #include <asm/pgtable.h> |
33 | #include <asm/setup.h> | 35 | #include <asm/setup.h> |
34 | #include <asm/irq.h> | 36 | #include <asm/irq.h> |
@@ -60,9 +62,10 @@ unsigned short mvme16x_config; | |||
60 | EXPORT_SYMBOL(mvme16x_config); | 62 | EXPORT_SYMBOL(mvme16x_config); |
61 | 63 | ||
62 | 64 | ||
63 | int mvme16x_parse_bootinfo(const struct bi_record *bi) | 65 | int __init mvme16x_parse_bootinfo(const struct bi_record *bi) |
64 | { | 66 | { |
65 | if (bi->tag == BI_VME_TYPE || bi->tag == BI_VME_BRDINFO) | 67 | uint16_t tag = be16_to_cpu(bi->tag); |
68 | if (tag == BI_VME_TYPE || tag == BI_VME_BRDINFO) | ||
66 | return 0; | 69 | return 0; |
67 | else | 70 | else |
68 | return 1; | 71 | return 1; |
@@ -87,15 +90,15 @@ static void mvme16x_get_model(char *model) | |||
87 | suf[3] = '\0'; | 90 | suf[3] = '\0'; |
88 | suf[0] = suf[1] ? '-' : '\0'; | 91 | suf[0] = suf[1] ? '-' : '\0'; |
89 | 92 | ||
90 | sprintf(model, "Motorola MVME%x%s", p->brdno, suf); | 93 | sprintf(model, "Motorola MVME%x%s", be16_to_cpu(p->brdno), suf); |
91 | } | 94 | } |
92 | 95 | ||
93 | 96 | ||
94 | static void mvme16x_get_hardware_list(struct seq_file *m) | 97 | static void mvme16x_get_hardware_list(struct seq_file *m) |
95 | { | 98 | { |
96 | p_bdid p = &mvme_bdid; | 99 | uint16_t brdno = be16_to_cpu(mvme_bdid.brdno); |
97 | 100 | ||
98 | if (p->brdno == 0x0162 || p->brdno == 0x0172) | 101 | if (brdno == 0x0162 || brdno == 0x0172) |
99 | { | 102 | { |
100 | unsigned char rev = *(unsigned char *)MVME162_VERSION_REG; | 103 | unsigned char rev = *(unsigned char *)MVME162_VERSION_REG; |
101 | 104 | ||
@@ -285,6 +288,7 @@ void __init config_mvme16x(void) | |||
285 | { | 288 | { |
286 | p_bdid p = &mvme_bdid; | 289 | p_bdid p = &mvme_bdid; |
287 | char id[40]; | 290 | char id[40]; |
291 | uint16_t brdno = be16_to_cpu(p->brdno); | ||
288 | 292 | ||
289 | mach_max_dma_address = 0xffffffff; | 293 | mach_max_dma_address = 0xffffffff; |
290 | mach_sched_init = mvme16x_sched_init; | 294 | mach_sched_init = mvme16x_sched_init; |
@@ -306,18 +310,18 @@ void __init config_mvme16x(void) | |||
306 | } | 310 | } |
307 | /* Board type is only set by newer versions of vmelilo/tftplilo */ | 311 | /* Board type is only set by newer versions of vmelilo/tftplilo */ |
308 | if (vme_brdtype == 0) | 312 | if (vme_brdtype == 0) |
309 | vme_brdtype = p->brdno; | 313 | vme_brdtype = brdno; |
310 | 314 | ||
311 | mvme16x_get_model(id); | 315 | mvme16x_get_model(id); |
312 | printk ("\nBRD_ID: %s BUG %x.%x %02x/%02x/%02x\n", id, p->rev>>4, | 316 | printk ("\nBRD_ID: %s BUG %x.%x %02x/%02x/%02x\n", id, p->rev>>4, |
313 | p->rev&0xf, p->yr, p->mth, p->day); | 317 | p->rev&0xf, p->yr, p->mth, p->day); |
314 | if (p->brdno == 0x0162 || p->brdno == 0x172) | 318 | if (brdno == 0x0162 || brdno == 0x172) |
315 | { | 319 | { |
316 | unsigned char rev = *(unsigned char *)MVME162_VERSION_REG; | 320 | unsigned char rev = *(unsigned char *)MVME162_VERSION_REG; |
317 | 321 | ||
318 | mvme16x_config = rev | MVME16x_CONFIG_GOT_SCCA; | 322 | mvme16x_config = rev | MVME16x_CONFIG_GOT_SCCA; |
319 | 323 | ||
320 | printk ("MVME%x Hardware status:\n", p->brdno); | 324 | printk ("MVME%x Hardware status:\n", brdno); |
321 | printk (" CPU Type 68%s040\n", | 325 | printk (" CPU Type 68%s040\n", |
322 | rev & MVME16x_CONFIG_GOT_FPU ? "" : "LC"); | 326 | rev & MVME16x_CONFIG_GOT_FPU ? "" : "LC"); |
323 | printk (" CPU clock %dMHz\n", | 327 | printk (" CPU clock %dMHz\n", |
@@ -347,12 +351,12 @@ void __init config_mvme16x(void) | |||
347 | 351 | ||
348 | static irqreturn_t mvme16x_abort_int (int irq, void *dev_id) | 352 | static irqreturn_t mvme16x_abort_int (int irq, void *dev_id) |
349 | { | 353 | { |
350 | p_bdid p = &mvme_bdid; | ||
351 | unsigned long *new = (unsigned long *)vectors; | 354 | unsigned long *new = (unsigned long *)vectors; |
352 | unsigned long *old = (unsigned long *)0xffe00000; | 355 | unsigned long *old = (unsigned long *)0xffe00000; |
353 | volatile unsigned char uc, *ucp; | 356 | volatile unsigned char uc, *ucp; |
357 | uint16_t brdno = be16_to_cpu(mvme_bdid.brdno); | ||
354 | 358 | ||
355 | if (p->brdno == 0x0162 || p->brdno == 0x172) | 359 | if (brdno == 0x0162 || brdno == 0x172) |
356 | { | 360 | { |
357 | ucp = (volatile unsigned char *)0xfff42043; | 361 | ucp = (volatile unsigned char *)0xfff42043; |
358 | uc = *ucp | 8; | 362 | uc = *ucp | 8; |
@@ -366,7 +370,7 @@ static irqreturn_t mvme16x_abort_int (int irq, void *dev_id) | |||
366 | *(new+9) = *(old+9); /* Trace */ | 370 | *(new+9) = *(old+9); /* Trace */ |
367 | *(new+47) = *(old+47); /* Trap #15 */ | 371 | *(new+47) = *(old+47); /* Trap #15 */ |
368 | 372 | ||
369 | if (p->brdno == 0x0162 || p->brdno == 0x172) | 373 | if (brdno == 0x0162 || brdno == 0x172) |
370 | *(new+0x5e) = *(old+0x5e); /* ABORT switch */ | 374 | *(new+0x5e) = *(old+0x5e); /* ABORT switch */ |
371 | else | 375 | else |
372 | *(new+0x6e) = *(old+0x6e); /* ABORT switch */ | 376 | *(new+0x6e) = *(old+0x6e); /* ABORT switch */ |
@@ -381,7 +385,7 @@ static irqreturn_t mvme16x_timer_int (int irq, void *dev_id) | |||
381 | 385 | ||
382 | void mvme16x_sched_init (irq_handler_t timer_routine) | 386 | void mvme16x_sched_init (irq_handler_t timer_routine) |
383 | { | 387 | { |
384 | p_bdid p = &mvme_bdid; | 388 | uint16_t brdno = be16_to_cpu(mvme_bdid.brdno); |
385 | int irq; | 389 | int irq; |
386 | 390 | ||
387 | tick_handler = timer_routine; | 391 | tick_handler = timer_routine; |
@@ -394,7 +398,7 @@ void mvme16x_sched_init (irq_handler_t timer_routine) | |||
394 | "timer", mvme16x_timer_int)) | 398 | "timer", mvme16x_timer_int)) |
395 | panic ("Couldn't register timer int"); | 399 | panic ("Couldn't register timer int"); |
396 | 400 | ||
397 | if (p->brdno == 0x0162 || p->brdno == 0x172) | 401 | if (brdno == 0x0162 || brdno == 0x172) |
398 | irq = MVME162_IRQ_ABORT; | 402 | irq = MVME162_IRQ_ABORT; |
399 | else | 403 | else |
400 | irq = MVME167_IRQ_ABORT; | 404 | irq = MVME167_IRQ_ABORT; |
diff --git a/arch/m68k/q40/config.c b/arch/m68k/q40/config.c index 078bb744b5fe..e90fe903613e 100644 --- a/arch/m68k/q40/config.c +++ b/arch/m68k/q40/config.c | |||
@@ -154,7 +154,7 @@ static unsigned int serports[] = | |||
154 | 0x3f8,0x2f8,0x3e8,0x2e8,0 | 154 | 0x3f8,0x2f8,0x3e8,0x2e8,0 |
155 | }; | 155 | }; |
156 | 156 | ||
157 | static void q40_disable_irqs(void) | 157 | static void __init q40_disable_irqs(void) |
158 | { | 158 | { |
159 | unsigned i, j; | 159 | unsigned i, j; |
160 | 160 | ||
@@ -198,7 +198,7 @@ void __init config_q40(void) | |||
198 | } | 198 | } |
199 | 199 | ||
200 | 200 | ||
201 | int q40_parse_bootinfo(const struct bi_record *rec) | 201 | int __init q40_parse_bootinfo(const struct bi_record *rec) |
202 | { | 202 | { |
203 | return 1; | 203 | return 1; |
204 | } | 204 | } |
diff --git a/arch/m68k/sun3/dvma.c b/arch/m68k/sun3/dvma.c index d522eaab4551..d95506e06c2a 100644 --- a/arch/m68k/sun3/dvma.c +++ b/arch/m68k/sun3/dvma.c | |||
@@ -7,6 +7,7 @@ | |||
7 | * | 7 | * |
8 | */ | 8 | */ |
9 | 9 | ||
10 | #include <linux/init.h> | ||
10 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
11 | #include <linux/mm.h> | 12 | #include <linux/mm.h> |
12 | #include <linux/bootmem.h> | 13 | #include <linux/bootmem.h> |
@@ -62,10 +63,7 @@ int dvma_map_iommu(unsigned long kaddr, unsigned long baddr, | |||
62 | 63 | ||
63 | } | 64 | } |
64 | 65 | ||
65 | void sun3_dvma_init(void) | 66 | void __init sun3_dvma_init(void) |
66 | { | 67 | { |
67 | |||
68 | memset(ptelist, 0, sizeof(ptelist)); | 68 | memset(ptelist, 0, sizeof(ptelist)); |
69 | |||
70 | |||
71 | } | 69 | } |
diff --git a/arch/m68k/sun3/mmu_emu.c b/arch/m68k/sun3/mmu_emu.c index 8edc510a21be..3f258e230ba5 100644 --- a/arch/m68k/sun3/mmu_emu.c +++ b/arch/m68k/sun3/mmu_emu.c | |||
@@ -6,6 +6,7 @@ | |||
6 | ** Started 1/16/98 @ 2:22 am | 6 | ** Started 1/16/98 @ 2:22 am |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #include <linux/init.h> | ||
9 | #include <linux/mman.h> | 10 | #include <linux/mman.h> |
10 | #include <linux/mm.h> | 11 | #include <linux/mm.h> |
11 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
@@ -122,7 +123,7 @@ void print_pte_vaddr (unsigned long vaddr) | |||
122 | /* | 123 | /* |
123 | * Initialise the MMU emulator. | 124 | * Initialise the MMU emulator. |
124 | */ | 125 | */ |
125 | void mmu_emu_init(unsigned long bootmem_end) | 126 | void __init mmu_emu_init(unsigned long bootmem_end) |
126 | { | 127 | { |
127 | unsigned long seg, num; | 128 | unsigned long seg, num; |
128 | int i,j; | 129 | int i,j; |
diff --git a/arch/m68k/sun3/sun3dvma.c b/arch/m68k/sun3/sun3dvma.c index cab54482ca34..b37521a5259d 100644 --- a/arch/m68k/sun3/sun3dvma.c +++ b/arch/m68k/sun3/sun3dvma.c | |||
@@ -6,6 +6,8 @@ | |||
6 | * Contains common routines for sun3/sun3x DVMA management. | 6 | * Contains common routines for sun3/sun3x DVMA management. |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #include <linux/bootmem.h> | ||
10 | #include <linux/init.h> | ||
9 | #include <linux/module.h> | 11 | #include <linux/module.h> |
10 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
11 | #include <linux/gfp.h> | 13 | #include <linux/gfp.h> |
@@ -30,7 +32,7 @@ static inline void dvma_unmap_iommu(unsigned long a, int b) | |||
30 | extern void sun3_dvma_init(void); | 32 | extern void sun3_dvma_init(void); |
31 | #endif | 33 | #endif |
32 | 34 | ||
33 | static unsigned long iommu_use[IOMMU_TOTAL_ENTRIES]; | 35 | static unsigned long *iommu_use; |
34 | 36 | ||
35 | #define dvma_index(baddr) ((baddr - DVMA_START) >> DVMA_PAGE_SHIFT) | 37 | #define dvma_index(baddr) ((baddr - DVMA_START) >> DVMA_PAGE_SHIFT) |
36 | 38 | ||
@@ -245,7 +247,7 @@ static inline int free_baddr(unsigned long baddr) | |||
245 | 247 | ||
246 | } | 248 | } |
247 | 249 | ||
248 | void dvma_init(void) | 250 | void __init dvma_init(void) |
249 | { | 251 | { |
250 | 252 | ||
251 | struct hole *hole; | 253 | struct hole *hole; |
@@ -265,7 +267,7 @@ void dvma_init(void) | |||
265 | 267 | ||
266 | list_add(&(hole->list), &hole_list); | 268 | list_add(&(hole->list), &hole_list); |
267 | 269 | ||
268 | memset(iommu_use, 0, sizeof(iommu_use)); | 270 | iommu_use = alloc_bootmem(IOMMU_TOTAL_ENTRIES * sizeof(unsigned long)); |
269 | 271 | ||
270 | dvma_unmap_iommu(DVMA_START, DVMA_SIZE); | 272 | dvma_unmap_iommu(DVMA_START, DVMA_SIZE); |
271 | 273 | ||
diff --git a/arch/m68k/sun3x/prom.c b/arch/m68k/sun3x/prom.c index a7b7e818d627..0898c3f81508 100644 --- a/arch/m68k/sun3x/prom.c +++ b/arch/m68k/sun3x/prom.c | |||
@@ -10,7 +10,6 @@ | |||
10 | 10 | ||
11 | #include <asm/page.h> | 11 | #include <asm/page.h> |
12 | #include <asm/pgtable.h> | 12 | #include <asm/pgtable.h> |
13 | #include <asm/bootinfo.h> | ||
14 | #include <asm/setup.h> | 13 | #include <asm/setup.h> |
15 | #include <asm/traps.h> | 14 | #include <asm/traps.h> |
16 | #include <asm/sun3xprom.h> | 15 | #include <asm/sun3xprom.h> |
diff --git a/arch/metag/include/asm/barrier.h b/arch/metag/include/asm/barrier.h index c90bfc6bf648..5d6b4b407dda 100644 --- a/arch/metag/include/asm/barrier.h +++ b/arch/metag/include/asm/barrier.h | |||
@@ -82,4 +82,19 @@ static inline void fence(void) | |||
82 | #define smp_read_barrier_depends() do { } while (0) | 82 | #define smp_read_barrier_depends() do { } while (0) |
83 | #define set_mb(var, value) do { var = value; smp_mb(); } while (0) | 83 | #define set_mb(var, value) do { var = value; smp_mb(); } while (0) |
84 | 84 | ||
85 | #define smp_store_release(p, v) \ | ||
86 | do { \ | ||
87 | compiletime_assert_atomic_type(*p); \ | ||
88 | smp_mb(); \ | ||
89 | ACCESS_ONCE(*p) = (v); \ | ||
90 | } while (0) | ||
91 | |||
92 | #define smp_load_acquire(p) \ | ||
93 | ({ \ | ||
94 | typeof(*p) ___p1 = ACCESS_ONCE(*p); \ | ||
95 | compiletime_assert_atomic_type(*p); \ | ||
96 | smp_mb(); \ | ||
97 | ___p1; \ | ||
98 | }) | ||
99 | |||
85 | #endif /* _ASM_METAG_BARRIER_H */ | 100 | #endif /* _ASM_METAG_BARRIER_H */ |
diff --git a/arch/metag/include/asm/smp.h b/arch/metag/include/asm/smp.h index e0373f81a117..1d7e770f7a54 100644 --- a/arch/metag/include/asm/smp.h +++ b/arch/metag/include/asm/smp.h | |||
@@ -7,13 +7,11 @@ | |||
7 | 7 | ||
8 | enum ipi_msg_type { | 8 | enum ipi_msg_type { |
9 | IPI_CALL_FUNC, | 9 | IPI_CALL_FUNC, |
10 | IPI_CALL_FUNC_SINGLE, | ||
11 | IPI_RESCHEDULE, | 10 | IPI_RESCHEDULE, |
12 | }; | 11 | }; |
13 | 12 | ||
14 | extern void arch_send_call_function_single_ipi(int cpu); | 13 | extern void arch_send_call_function_single_ipi(int cpu); |
15 | extern void arch_send_call_function_ipi_mask(const struct cpumask *mask); | 14 | extern void arch_send_call_function_ipi_mask(const struct cpumask *mask); |
16 | #define arch_send_call_function_ipi_mask arch_send_call_function_ipi_mask | ||
17 | 15 | ||
18 | asmlinkage void secondary_start_kernel(void); | 16 | asmlinkage void secondary_start_kernel(void); |
19 | 17 | ||
diff --git a/arch/metag/kernel/dma.c b/arch/metag/kernel/dma.c index db589ad5dbc4..c700d625067a 100644 --- a/arch/metag/kernel/dma.c +++ b/arch/metag/kernel/dma.c | |||
@@ -399,11 +399,6 @@ static int __init dma_alloc_init(void) | |||
399 | pgd = pgd_offset(&init_mm, CONSISTENT_START); | 399 | pgd = pgd_offset(&init_mm, CONSISTENT_START); |
400 | pud = pud_alloc(&init_mm, pgd, CONSISTENT_START); | 400 | pud = pud_alloc(&init_mm, pgd, CONSISTENT_START); |
401 | pmd = pmd_alloc(&init_mm, pud, CONSISTENT_START); | 401 | pmd = pmd_alloc(&init_mm, pud, CONSISTENT_START); |
402 | if (!pmd) { | ||
403 | pr_err("%s: no pmd tables\n", __func__); | ||
404 | ret = -ENOMEM; | ||
405 | break; | ||
406 | } | ||
407 | WARN_ON(!pmd_none(*pmd)); | 402 | WARN_ON(!pmd_none(*pmd)); |
408 | 403 | ||
409 | pte = pte_alloc_kernel(pmd, CONSISTENT_START); | 404 | pte = pte_alloc_kernel(pmd, CONSISTENT_START); |
diff --git a/arch/metag/kernel/smp.c b/arch/metag/kernel/smp.c index 7c0113142981..f006d2276f40 100644 --- a/arch/metag/kernel/smp.c +++ b/arch/metag/kernel/smp.c | |||
@@ -68,7 +68,7 @@ static DECLARE_COMPLETION(cpu_running); | |||
68 | /* | 68 | /* |
69 | * "thread" is assumed to be a valid Meta hardware thread ID. | 69 | * "thread" is assumed to be a valid Meta hardware thread ID. |
70 | */ | 70 | */ |
71 | int boot_secondary(unsigned int thread, struct task_struct *idle) | 71 | static int boot_secondary(unsigned int thread, struct task_struct *idle) |
72 | { | 72 | { |
73 | u32 val; | 73 | u32 val; |
74 | 74 | ||
@@ -491,7 +491,7 @@ void arch_send_call_function_ipi_mask(const struct cpumask *mask) | |||
491 | 491 | ||
492 | void arch_send_call_function_single_ipi(int cpu) | 492 | void arch_send_call_function_single_ipi(int cpu) |
493 | { | 493 | { |
494 | send_ipi_message(cpumask_of(cpu), IPI_CALL_FUNC_SINGLE); | 494 | send_ipi_message(cpumask_of(cpu), IPI_CALL_FUNC); |
495 | } | 495 | } |
496 | 496 | ||
497 | void show_ipi_list(struct seq_file *p) | 497 | void show_ipi_list(struct seq_file *p) |
@@ -517,11 +517,10 @@ static DEFINE_SPINLOCK(stop_lock); | |||
517 | * | 517 | * |
518 | * Bit 0 - Inter-processor function call | 518 | * Bit 0 - Inter-processor function call |
519 | */ | 519 | */ |
520 | static int do_IPI(struct pt_regs *regs) | 520 | static int do_IPI(void) |
521 | { | 521 | { |
522 | unsigned int cpu = smp_processor_id(); | 522 | unsigned int cpu = smp_processor_id(); |
523 | struct ipi_data *ipi = &per_cpu(ipi_data, cpu); | 523 | struct ipi_data *ipi = &per_cpu(ipi_data, cpu); |
524 | struct pt_regs *old_regs = set_irq_regs(regs); | ||
525 | unsigned long msgs, nextmsg; | 524 | unsigned long msgs, nextmsg; |
526 | int handled = 0; | 525 | int handled = 0; |
527 | 526 | ||
@@ -546,10 +545,6 @@ static int do_IPI(struct pt_regs *regs) | |||
546 | generic_smp_call_function_interrupt(); | 545 | generic_smp_call_function_interrupt(); |
547 | break; | 546 | break; |
548 | 547 | ||
549 | case IPI_CALL_FUNC_SINGLE: | ||
550 | generic_smp_call_function_single_interrupt(); | ||
551 | break; | ||
552 | |||
553 | default: | 548 | default: |
554 | pr_crit("CPU%u: Unknown IPI message 0x%lx\n", | 549 | pr_crit("CPU%u: Unknown IPI message 0x%lx\n", |
555 | cpu, nextmsg); | 550 | cpu, nextmsg); |
@@ -557,8 +552,6 @@ static int do_IPI(struct pt_regs *regs) | |||
557 | } | 552 | } |
558 | } | 553 | } |
559 | 554 | ||
560 | set_irq_regs(old_regs); | ||
561 | |||
562 | return handled; | 555 | return handled; |
563 | } | 556 | } |
564 | 557 | ||
@@ -624,7 +617,7 @@ static void kick_raise_softirq(cpumask_t callmap, unsigned int irq) | |||
624 | static TBIRES ipi_handler(TBIRES State, int SigNum, int Triggers, | 617 | static TBIRES ipi_handler(TBIRES State, int SigNum, int Triggers, |
625 | int Inst, PTBI pTBI, int *handled) | 618 | int Inst, PTBI pTBI, int *handled) |
626 | { | 619 | { |
627 | *handled = do_IPI((struct pt_regs *)State.Sig.pCtx); | 620 | *handled = do_IPI(); |
628 | 621 | ||
629 | return State; | 622 | return State; |
630 | } | 623 | } |
diff --git a/arch/metag/kernel/topology.c b/arch/metag/kernel/topology.c index bec3dec4922e..4ba595701f7d 100644 --- a/arch/metag/kernel/topology.c +++ b/arch/metag/kernel/topology.c | |||
@@ -19,6 +19,7 @@ | |||
19 | DEFINE_PER_CPU(struct cpuinfo_metag, cpu_data); | 19 | DEFINE_PER_CPU(struct cpuinfo_metag, cpu_data); |
20 | 20 | ||
21 | cpumask_t cpu_core_map[NR_CPUS]; | 21 | cpumask_t cpu_core_map[NR_CPUS]; |
22 | EXPORT_SYMBOL(cpu_core_map); | ||
22 | 23 | ||
23 | static cpumask_t cpu_coregroup_map(unsigned int cpu) | 24 | static cpumask_t cpu_coregroup_map(unsigned int cpu) |
24 | { | 25 | { |
diff --git a/arch/metag/mm/init.c b/arch/metag/mm/init.c index 3cd6288f65c2..11fa51c89617 100644 --- a/arch/metag/mm/init.c +++ b/arch/metag/mm/init.c | |||
@@ -204,7 +204,8 @@ static void __init do_init_bootmem(void) | |||
204 | start_pfn = memblock_region_memory_base_pfn(reg); | 204 | start_pfn = memblock_region_memory_base_pfn(reg); |
205 | end_pfn = memblock_region_memory_end_pfn(reg); | 205 | end_pfn = memblock_region_memory_end_pfn(reg); |
206 | memblock_set_node(PFN_PHYS(start_pfn), | 206 | memblock_set_node(PFN_PHYS(start_pfn), |
207 | PFN_PHYS(end_pfn - start_pfn), 0); | 207 | PFN_PHYS(end_pfn - start_pfn), |
208 | &memblock.memory, 0); | ||
208 | } | 209 | } |
209 | 210 | ||
210 | /* All of system RAM sits in node 0 for the non-NUMA case */ | 211 | /* All of system RAM sits in node 0 for the non-NUMA case */ |
diff --git a/arch/metag/mm/numa.c b/arch/metag/mm/numa.c index b172aa45fcf8..67b46c295072 100644 --- a/arch/metag/mm/numa.c +++ b/arch/metag/mm/numa.c | |||
@@ -42,7 +42,8 @@ void __init setup_bootmem_node(int nid, unsigned long start, unsigned long end) | |||
42 | memblock_add(start, end - start); | 42 | memblock_add(start, end - start); |
43 | 43 | ||
44 | memblock_set_node(PFN_PHYS(start_pfn), | 44 | memblock_set_node(PFN_PHYS(start_pfn), |
45 | PFN_PHYS(end_pfn - start_pfn), nid); | 45 | PFN_PHYS(end_pfn - start_pfn), |
46 | &memblock.memory, nid); | ||
46 | 47 | ||
47 | /* Node-local pgdat */ | 48 | /* Node-local pgdat */ |
48 | pgdat_paddr = memblock_alloc_base(sizeof(struct pglist_data), | 49 | pgdat_paddr = memblock_alloc_base(sizeof(struct pglist_data), |
diff --git a/arch/microblaze/include/asm/Kbuild b/arch/microblaze/include/asm/Kbuild index ce0bbf8f5640..a82426589fff 100644 --- a/arch/microblaze/include/asm/Kbuild +++ b/arch/microblaze/include/asm/Kbuild | |||
@@ -1,4 +1,5 @@ | |||
1 | 1 | ||
2 | generic-y += barrier.h | ||
2 | generic-y += clkdev.h | 3 | generic-y += clkdev.h |
3 | generic-y += exec.h | 4 | generic-y += exec.h |
4 | generic-y += trace_clock.h | 5 | generic-y += trace_clock.h |
diff --git a/arch/microblaze/include/asm/barrier.h b/arch/microblaze/include/asm/barrier.h deleted file mode 100644 index df5be3e87044..000000000000 --- a/arch/microblaze/include/asm/barrier.h +++ /dev/null | |||
@@ -1,27 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2006 Atmark Techno, Inc. | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | */ | ||
8 | |||
9 | #ifndef _ASM_MICROBLAZE_BARRIER_H | ||
10 | #define _ASM_MICROBLAZE_BARRIER_H | ||
11 | |||
12 | #define nop() asm volatile ("nop") | ||
13 | |||
14 | #define smp_read_barrier_depends() do {} while (0) | ||
15 | #define read_barrier_depends() do {} while (0) | ||
16 | |||
17 | #define mb() barrier() | ||
18 | #define rmb() mb() | ||
19 | #define wmb() mb() | ||
20 | #define set_mb(var, value) do { var = value; mb(); } while (0) | ||
21 | #define set_wmb(var, value) do { var = value; wmb(); } while (0) | ||
22 | |||
23 | #define smp_mb() mb() | ||
24 | #define smp_rmb() rmb() | ||
25 | #define smp_wmb() wmb() | ||
26 | |||
27 | #endif /* _ASM_MICROBLAZE_BARRIER_H */ | ||
diff --git a/arch/microblaze/mm/init.c b/arch/microblaze/mm/init.c index 74c7bcc1e82d..89077d346714 100644 --- a/arch/microblaze/mm/init.c +++ b/arch/microblaze/mm/init.c | |||
@@ -192,7 +192,8 @@ void __init setup_memory(void) | |||
192 | start_pfn = memblock_region_memory_base_pfn(reg); | 192 | start_pfn = memblock_region_memory_base_pfn(reg); |
193 | end_pfn = memblock_region_memory_end_pfn(reg); | 193 | end_pfn = memblock_region_memory_end_pfn(reg); |
194 | memblock_set_node(start_pfn << PAGE_SHIFT, | 194 | memblock_set_node(start_pfn << PAGE_SHIFT, |
195 | (end_pfn - start_pfn) << PAGE_SHIFT, 0); | 195 | (end_pfn - start_pfn) << PAGE_SHIFT, |
196 | &memblock.memory, 0); | ||
196 | } | 197 | } |
197 | 198 | ||
198 | /* free bootmem is whole main memory */ | 199 | /* free bootmem is whole main memory */ |
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 650de3976e7a..c93d92beb3d6 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
@@ -47,6 +47,7 @@ config MIPS | |||
47 | select MODULES_USE_ELF_RELA if MODULES && 64BIT | 47 | select MODULES_USE_ELF_RELA if MODULES && 64BIT |
48 | select CLONE_BACKWARDS | 48 | select CLONE_BACKWARDS |
49 | select HAVE_DEBUG_STACKOVERFLOW | 49 | select HAVE_DEBUG_STACKOVERFLOW |
50 | select HAVE_CC_STACKPROTECTOR | ||
50 | 51 | ||
51 | menu "Machine selection" | 52 | menu "Machine selection" |
52 | 53 | ||
@@ -2322,19 +2323,6 @@ config SECCOMP | |||
2322 | 2323 | ||
2323 | If unsure, say Y. Only embedded should say N here. | 2324 | If unsure, say Y. Only embedded should say N here. |
2324 | 2325 | ||
2325 | config CC_STACKPROTECTOR | ||
2326 | bool "Enable -fstack-protector buffer overflow detection (EXPERIMENTAL)" | ||
2327 | help | ||
2328 | This option turns on the -fstack-protector GCC feature. This | ||
2329 | feature puts, at the beginning of functions, a canary value on | ||
2330 | the stack just before the return address, and validates | ||
2331 | the value just before actually returning. Stack based buffer | ||
2332 | overflows (that need to overwrite this return address) now also | ||
2333 | overwrite the canary, which gets detected and the attack is then | ||
2334 | neutralized via a kernel panic. | ||
2335 | |||
2336 | This feature requires gcc version 4.2 or above. | ||
2337 | |||
2338 | config USE_OF | 2326 | config USE_OF |
2339 | bool | 2327 | bool |
2340 | select OF | 2328 | select OF |
diff --git a/arch/mips/Makefile b/arch/mips/Makefile index de300b993607..efe50787cd89 100644 --- a/arch/mips/Makefile +++ b/arch/mips/Makefile | |||
@@ -232,10 +232,6 @@ bootvars-y = VMLINUX_LOAD_ADDRESS=$(load-y) \ | |||
232 | 232 | ||
233 | LDFLAGS += -m $(ld-emul) | 233 | LDFLAGS += -m $(ld-emul) |
234 | 234 | ||
235 | ifdef CONFIG_CC_STACKPROTECTOR | ||
236 | KBUILD_CFLAGS += -fstack-protector | ||
237 | endif | ||
238 | |||
239 | ifdef CONFIG_MIPS | 235 | ifdef CONFIG_MIPS |
240 | CHECKFLAGS += $(shell $(CC) $(KBUILD_CFLAGS) -dM -E -x c /dev/null | \ | 236 | CHECKFLAGS += $(shell $(CC) $(KBUILD_CFLAGS) -dM -E -x c /dev/null | \ |
241 | egrep -vw '__GNUC_(|MINOR_|PATCHLEVEL_)_' | \ | 237 | egrep -vw '__GNUC_(|MINOR_|PATCHLEVEL_)_' | \ |
diff --git a/arch/mips/ar7/setup.c b/arch/mips/ar7/setup.c index 9a357fffcfbe..820b7a313d9b 100644 --- a/arch/mips/ar7/setup.c +++ b/arch/mips/ar7/setup.c | |||
@@ -92,7 +92,6 @@ void __init plat_mem_setup(void) | |||
92 | _machine_restart = ar7_machine_restart; | 92 | _machine_restart = ar7_machine_restart; |
93 | _machine_halt = ar7_machine_halt; | 93 | _machine_halt = ar7_machine_halt; |
94 | pm_power_off = ar7_machine_power_off; | 94 | pm_power_off = ar7_machine_power_off; |
95 | panic_timeout = 3; | ||
96 | 95 | ||
97 | io_base = (unsigned long)ioremap(AR7_REGS_BASE, 0x10000); | 96 | io_base = (unsigned long)ioremap(AR7_REGS_BASE, 0x10000); |
98 | if (!io_base) | 97 | if (!io_base) |
diff --git a/arch/mips/emma/markeins/setup.c b/arch/mips/emma/markeins/setup.c index d71005835c00..9100122e5cef 100644 --- a/arch/mips/emma/markeins/setup.c +++ b/arch/mips/emma/markeins/setup.c | |||
@@ -111,9 +111,6 @@ void __init plat_mem_setup(void) | |||
111 | iomem_resource.start = EMMA2RH_IO_BASE; | 111 | iomem_resource.start = EMMA2RH_IO_BASE; |
112 | iomem_resource.end = EMMA2RH_ROM_BASE - 1; | 112 | iomem_resource.end = EMMA2RH_ROM_BASE - 1; |
113 | 113 | ||
114 | /* Reboot on panic */ | ||
115 | panic_timeout = 180; | ||
116 | |||
117 | markeins_sio_setup(); | 114 | markeins_sio_setup(); |
118 | } | 115 | } |
119 | 116 | ||
diff --git a/arch/mips/include/asm/barrier.h b/arch/mips/include/asm/barrier.h index f26d8e1bf3c3..e1aa4e4c2984 100644 --- a/arch/mips/include/asm/barrier.h +++ b/arch/mips/include/asm/barrier.h | |||
@@ -180,4 +180,19 @@ | |||
180 | #define nudge_writes() mb() | 180 | #define nudge_writes() mb() |
181 | #endif | 181 | #endif |
182 | 182 | ||
183 | #define smp_store_release(p, v) \ | ||
184 | do { \ | ||
185 | compiletime_assert_atomic_type(*p); \ | ||
186 | smp_mb(); \ | ||
187 | ACCESS_ONCE(*p) = (v); \ | ||
188 | } while (0) | ||
189 | |||
190 | #define smp_load_acquire(p) \ | ||
191 | ({ \ | ||
192 | typeof(*p) ___p1 = ACCESS_ONCE(*p); \ | ||
193 | compiletime_assert_atomic_type(*p); \ | ||
194 | smp_mb(); \ | ||
195 | ___p1; \ | ||
196 | }) | ||
197 | |||
183 | #endif /* __ASM_BARRIER_H */ | 198 | #endif /* __ASM_BARRIER_H */ |
diff --git a/arch/mips/include/asm/cacheops.h b/arch/mips/include/asm/cacheops.h index c75025f27c20..06b9bc7ea14b 100644 --- a/arch/mips/include/asm/cacheops.h +++ b/arch/mips/include/asm/cacheops.h | |||
@@ -83,6 +83,6 @@ | |||
83 | /* | 83 | /* |
84 | * Loongson2-specific cacheops | 84 | * Loongson2-specific cacheops |
85 | */ | 85 | */ |
86 | #define Hit_Invalidate_I_Loongson23 0x00 | 86 | #define Hit_Invalidate_I_Loongson2 0x00 |
87 | 87 | ||
88 | #endif /* __ASM_CACHEOPS_H */ | 88 | #endif /* __ASM_CACHEOPS_H */ |
diff --git a/arch/mips/include/asm/r4kcache.h b/arch/mips/include/asm/r4kcache.h index 34d1a1917125..c84caddb8bde 100644 --- a/arch/mips/include/asm/r4kcache.h +++ b/arch/mips/include/asm/r4kcache.h | |||
@@ -165,7 +165,7 @@ static inline void flush_icache_line(unsigned long addr) | |||
165 | __iflush_prologue | 165 | __iflush_prologue |
166 | switch (boot_cpu_type()) { | 166 | switch (boot_cpu_type()) { |
167 | case CPU_LOONGSON2: | 167 | case CPU_LOONGSON2: |
168 | cache_op(Hit_Invalidate_I_Loongson23, addr); | 168 | cache_op(Hit_Invalidate_I_Loongson2, addr); |
169 | break; | 169 | break; |
170 | 170 | ||
171 | default: | 171 | default: |
@@ -219,7 +219,7 @@ static inline void protected_flush_icache_line(unsigned long addr) | |||
219 | { | 219 | { |
220 | switch (boot_cpu_type()) { | 220 | switch (boot_cpu_type()) { |
221 | case CPU_LOONGSON2: | 221 | case CPU_LOONGSON2: |
222 | protected_cache_op(Hit_Invalidate_I_Loongson23, addr); | 222 | protected_cache_op(Hit_Invalidate_I_Loongson2, addr); |
223 | break; | 223 | break; |
224 | 224 | ||
225 | default: | 225 | default: |
@@ -357,8 +357,8 @@ static inline void invalidate_tcache_page(unsigned long addr) | |||
357 | "i" (op)); | 357 | "i" (op)); |
358 | 358 | ||
359 | /* build blast_xxx, blast_xxx_page, blast_xxx_page_indexed */ | 359 | /* build blast_xxx, blast_xxx_page, blast_xxx_page_indexed */ |
360 | #define __BUILD_BLAST_CACHE(pfx, desc, indexop, hitop, lsize) \ | 360 | #define __BUILD_BLAST_CACHE(pfx, desc, indexop, hitop, lsize, extra) \ |
361 | static inline void blast_##pfx##cache##lsize(void) \ | 361 | static inline void extra##blast_##pfx##cache##lsize(void) \ |
362 | { \ | 362 | { \ |
363 | unsigned long start = INDEX_BASE; \ | 363 | unsigned long start = INDEX_BASE; \ |
364 | unsigned long end = start + current_cpu_data.desc.waysize; \ | 364 | unsigned long end = start + current_cpu_data.desc.waysize; \ |
@@ -376,7 +376,7 @@ static inline void blast_##pfx##cache##lsize(void) \ | |||
376 | __##pfx##flush_epilogue \ | 376 | __##pfx##flush_epilogue \ |
377 | } \ | 377 | } \ |
378 | \ | 378 | \ |
379 | static inline void blast_##pfx##cache##lsize##_page(unsigned long page) \ | 379 | static inline void extra##blast_##pfx##cache##lsize##_page(unsigned long page) \ |
380 | { \ | 380 | { \ |
381 | unsigned long start = page; \ | 381 | unsigned long start = page; \ |
382 | unsigned long end = page + PAGE_SIZE; \ | 382 | unsigned long end = page + PAGE_SIZE; \ |
@@ -391,7 +391,7 @@ static inline void blast_##pfx##cache##lsize##_page(unsigned long page) \ | |||
391 | __##pfx##flush_epilogue \ | 391 | __##pfx##flush_epilogue \ |
392 | } \ | 392 | } \ |
393 | \ | 393 | \ |
394 | static inline void blast_##pfx##cache##lsize##_page_indexed(unsigned long page) \ | 394 | static inline void extra##blast_##pfx##cache##lsize##_page_indexed(unsigned long page) \ |
395 | { \ | 395 | { \ |
396 | unsigned long indexmask = current_cpu_data.desc.waysize - 1; \ | 396 | unsigned long indexmask = current_cpu_data.desc.waysize - 1; \ |
397 | unsigned long start = INDEX_BASE + (page & indexmask); \ | 397 | unsigned long start = INDEX_BASE + (page & indexmask); \ |
@@ -410,23 +410,24 @@ static inline void blast_##pfx##cache##lsize##_page_indexed(unsigned long page) | |||
410 | __##pfx##flush_epilogue \ | 410 | __##pfx##flush_epilogue \ |
411 | } | 411 | } |
412 | 412 | ||
413 | __BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 16) | 413 | __BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 16, ) |
414 | __BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 16) | 414 | __BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 16, ) |
415 | __BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 16) | 415 | __BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 16, ) |
416 | __BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 32) | 416 | __BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 32, ) |
417 | __BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 32) | 417 | __BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 32, ) |
418 | __BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 32) | 418 | __BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I_Loongson2, 32, loongson2_) |
419 | __BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 64) | 419 | __BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 32, ) |
420 | __BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 64) | 420 | __BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 64, ) |
421 | __BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 64) | 421 | __BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 64, ) |
422 | __BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 128) | 422 | __BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 64, ) |
423 | 423 | __BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 128, ) | |
424 | __BUILD_BLAST_CACHE(inv_d, dcache, Index_Writeback_Inv_D, Hit_Invalidate_D, 16) | 424 | |
425 | __BUILD_BLAST_CACHE(inv_d, dcache, Index_Writeback_Inv_D, Hit_Invalidate_D, 32) | 425 | __BUILD_BLAST_CACHE(inv_d, dcache, Index_Writeback_Inv_D, Hit_Invalidate_D, 16, ) |
426 | __BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 16) | 426 | __BUILD_BLAST_CACHE(inv_d, dcache, Index_Writeback_Inv_D, Hit_Invalidate_D, 32, ) |
427 | __BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 32) | 427 | __BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 16, ) |
428 | __BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 64) | 428 | __BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 32, ) |
429 | __BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 128) | 429 | __BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 64, ) |
430 | __BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 128, ) | ||
430 | 431 | ||
431 | /* build blast_xxx_range, protected_blast_xxx_range */ | 432 | /* build blast_xxx_range, protected_blast_xxx_range */ |
432 | #define __BUILD_BLAST_CACHE_RANGE(pfx, desc, hitop, prot, extra) \ | 433 | #define __BUILD_BLAST_CACHE_RANGE(pfx, desc, hitop, prot, extra) \ |
@@ -452,8 +453,8 @@ static inline void prot##extra##blast_##pfx##cache##_range(unsigned long start, | |||
452 | __BUILD_BLAST_CACHE_RANGE(d, dcache, Hit_Writeback_Inv_D, protected_, ) | 453 | __BUILD_BLAST_CACHE_RANGE(d, dcache, Hit_Writeback_Inv_D, protected_, ) |
453 | __BUILD_BLAST_CACHE_RANGE(s, scache, Hit_Writeback_Inv_SD, protected_, ) | 454 | __BUILD_BLAST_CACHE_RANGE(s, scache, Hit_Writeback_Inv_SD, protected_, ) |
454 | __BUILD_BLAST_CACHE_RANGE(i, icache, Hit_Invalidate_I, protected_, ) | 455 | __BUILD_BLAST_CACHE_RANGE(i, icache, Hit_Invalidate_I, protected_, ) |
455 | __BUILD_BLAST_CACHE_RANGE(i, icache, Hit_Invalidate_I_Loongson23, \ | 456 | __BUILD_BLAST_CACHE_RANGE(i, icache, Hit_Invalidate_I_Loongson2, \ |
456 | protected_, loongson23_) | 457 | protected_, loongson2_) |
457 | __BUILD_BLAST_CACHE_RANGE(d, dcache, Hit_Writeback_Inv_D, , ) | 458 | __BUILD_BLAST_CACHE_RANGE(d, dcache, Hit_Writeback_Inv_D, , ) |
458 | __BUILD_BLAST_CACHE_RANGE(s, scache, Hit_Writeback_Inv_SD, , ) | 459 | __BUILD_BLAST_CACHE_RANGE(s, scache, Hit_Writeback_Inv_SD, , ) |
459 | /* blast_inv_dcache_range */ | 460 | /* blast_inv_dcache_range */ |
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c index 62ffd20ea869..49e572d879e1 100644 --- a/arch/mips/mm/c-r4k.c +++ b/arch/mips/mm/c-r4k.c | |||
@@ -237,6 +237,8 @@ static void r4k_blast_icache_page_setup(void) | |||
237 | r4k_blast_icache_page = (void *)cache_noop; | 237 | r4k_blast_icache_page = (void *)cache_noop; |
238 | else if (ic_lsize == 16) | 238 | else if (ic_lsize == 16) |
239 | r4k_blast_icache_page = blast_icache16_page; | 239 | r4k_blast_icache_page = blast_icache16_page; |
240 | else if (ic_lsize == 32 && current_cpu_type() == CPU_LOONGSON2) | ||
241 | r4k_blast_icache_page = loongson2_blast_icache32_page; | ||
240 | else if (ic_lsize == 32) | 242 | else if (ic_lsize == 32) |
241 | r4k_blast_icache_page = blast_icache32_page; | 243 | r4k_blast_icache_page = blast_icache32_page; |
242 | else if (ic_lsize == 64) | 244 | else if (ic_lsize == 64) |
@@ -261,6 +263,9 @@ static void r4k_blast_icache_page_indexed_setup(void) | |||
261 | else if (TX49XX_ICACHE_INDEX_INV_WAR) | 263 | else if (TX49XX_ICACHE_INDEX_INV_WAR) |
262 | r4k_blast_icache_page_indexed = | 264 | r4k_blast_icache_page_indexed = |
263 | tx49_blast_icache32_page_indexed; | 265 | tx49_blast_icache32_page_indexed; |
266 | else if (current_cpu_type() == CPU_LOONGSON2) | ||
267 | r4k_blast_icache_page_indexed = | ||
268 | loongson2_blast_icache32_page_indexed; | ||
264 | else | 269 | else |
265 | r4k_blast_icache_page_indexed = | 270 | r4k_blast_icache_page_indexed = |
266 | blast_icache32_page_indexed; | 271 | blast_icache32_page_indexed; |
@@ -284,6 +289,8 @@ static void r4k_blast_icache_setup(void) | |||
284 | r4k_blast_icache = blast_r4600_v1_icache32; | 289 | r4k_blast_icache = blast_r4600_v1_icache32; |
285 | else if (TX49XX_ICACHE_INDEX_INV_WAR) | 290 | else if (TX49XX_ICACHE_INDEX_INV_WAR) |
286 | r4k_blast_icache = tx49_blast_icache32; | 291 | r4k_blast_icache = tx49_blast_icache32; |
292 | else if (current_cpu_type() == CPU_LOONGSON2) | ||
293 | r4k_blast_icache = loongson2_blast_icache32; | ||
287 | else | 294 | else |
288 | r4k_blast_icache = blast_icache32; | 295 | r4k_blast_icache = blast_icache32; |
289 | } else if (ic_lsize == 64) | 296 | } else if (ic_lsize == 64) |
@@ -580,11 +587,11 @@ static inline void local_r4k_flush_icache_range(unsigned long start, unsigned lo | |||
580 | else { | 587 | else { |
581 | switch (boot_cpu_type()) { | 588 | switch (boot_cpu_type()) { |
582 | case CPU_LOONGSON2: | 589 | case CPU_LOONGSON2: |
583 | protected_blast_icache_range(start, end); | 590 | protected_loongson2_blast_icache_range(start, end); |
584 | break; | 591 | break; |
585 | 592 | ||
586 | default: | 593 | default: |
587 | protected_loongson23_blast_icache_range(start, end); | 594 | protected_blast_icache_range(start, end); |
588 | break; | 595 | break; |
589 | } | 596 | } |
590 | } | 597 | } |
diff --git a/arch/mips/netlogic/xlp/setup.c b/arch/mips/netlogic/xlp/setup.c index 6d981bb337ec..54e75c77184b 100644 --- a/arch/mips/netlogic/xlp/setup.c +++ b/arch/mips/netlogic/xlp/setup.c | |||
@@ -92,7 +92,6 @@ static void __init xlp_init_mem_from_bars(void) | |||
92 | 92 | ||
93 | void __init plat_mem_setup(void) | 93 | void __init plat_mem_setup(void) |
94 | { | 94 | { |
95 | panic_timeout = 5; | ||
96 | _machine_restart = (void (*)(char *))nlm_linux_exit; | 95 | _machine_restart = (void (*)(char *))nlm_linux_exit; |
97 | _machine_halt = nlm_linux_exit; | 96 | _machine_halt = nlm_linux_exit; |
98 | pm_power_off = nlm_linux_exit; | 97 | pm_power_off = nlm_linux_exit; |
diff --git a/arch/mips/netlogic/xlr/setup.c b/arch/mips/netlogic/xlr/setup.c index 214d123b79fa..921be5f77797 100644 --- a/arch/mips/netlogic/xlr/setup.c +++ b/arch/mips/netlogic/xlr/setup.c | |||
@@ -92,7 +92,6 @@ static void nlm_linux_exit(void) | |||
92 | 92 | ||
93 | void __init plat_mem_setup(void) | 93 | void __init plat_mem_setup(void) |
94 | { | 94 | { |
95 | panic_timeout = 5; | ||
96 | _machine_restart = (void (*)(char *))nlm_linux_exit; | 95 | _machine_restart = (void (*)(char *))nlm_linux_exit; |
97 | _machine_halt = nlm_linux_exit; | 96 | _machine_halt = nlm_linux_exit; |
98 | pm_power_off = nlm_linux_exit; | 97 | pm_power_off = nlm_linux_exit; |
diff --git a/arch/mips/sibyte/swarm/setup.c b/arch/mips/sibyte/swarm/setup.c index 41707a245dea..3462c831d0ea 100644 --- a/arch/mips/sibyte/swarm/setup.c +++ b/arch/mips/sibyte/swarm/setup.c | |||
@@ -134,8 +134,6 @@ void __init plat_mem_setup(void) | |||
134 | #error invalid SiByte board configuration | 134 | #error invalid SiByte board configuration |
135 | #endif | 135 | #endif |
136 | 136 | ||
137 | panic_timeout = 5; /* For debug. */ | ||
138 | |||
139 | board_be_handler = swarm_be_handler; | 137 | board_be_handler = swarm_be_handler; |
140 | 138 | ||
141 | if (xicor_probe()) | 139 | if (xicor_probe()) |
diff --git a/arch/mn10300/include/asm/Kbuild b/arch/mn10300/include/asm/Kbuild index 74742dc6a3da..032143ec2324 100644 --- a/arch/mn10300/include/asm/Kbuild +++ b/arch/mn10300/include/asm/Kbuild | |||
@@ -1,4 +1,5 @@ | |||
1 | 1 | ||
2 | generic-y += barrier.h | ||
2 | generic-y += clkdev.h | 3 | generic-y += clkdev.h |
3 | generic-y += exec.h | 4 | generic-y += exec.h |
4 | generic-y += trace_clock.h | 5 | generic-y += trace_clock.h |
diff --git a/arch/mn10300/include/asm/barrier.h b/arch/mn10300/include/asm/barrier.h deleted file mode 100644 index 2bd97a5c8af7..000000000000 --- a/arch/mn10300/include/asm/barrier.h +++ /dev/null | |||
@@ -1,37 +0,0 @@ | |||
1 | /* MN10300 memory barrier definitions | ||
2 | * | ||
3 | * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public Licence | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the Licence, or (at your option) any later version. | ||
10 | */ | ||
11 | #ifndef _ASM_BARRIER_H | ||
12 | #define _ASM_BARRIER_H | ||
13 | |||
14 | #define nop() asm volatile ("nop") | ||
15 | |||
16 | #define mb() asm volatile ("": : :"memory") | ||
17 | #define rmb() mb() | ||
18 | #define wmb() asm volatile ("": : :"memory") | ||
19 | |||
20 | #ifdef CONFIG_SMP | ||
21 | #define smp_mb() mb() | ||
22 | #define smp_rmb() rmb() | ||
23 | #define smp_wmb() wmb() | ||
24 | #define set_mb(var, value) do { xchg(&var, value); } while (0) | ||
25 | #else /* CONFIG_SMP */ | ||
26 | #define smp_mb() barrier() | ||
27 | #define smp_rmb() barrier() | ||
28 | #define smp_wmb() barrier() | ||
29 | #define set_mb(var, value) do { var = value; mb(); } while (0) | ||
30 | #endif /* CONFIG_SMP */ | ||
31 | |||
32 | #define set_wmb(var, value) do { var = value; wmb(); } while (0) | ||
33 | |||
34 | #define read_barrier_depends() do {} while (0) | ||
35 | #define smp_read_barrier_depends() do {} while (0) | ||
36 | |||
37 | #endif /* _ASM_BARRIER_H */ | ||
diff --git a/arch/parisc/configs/c3000_defconfig b/arch/parisc/configs/c3000_defconfig index ec1b014952b6..acacd348df89 100644 --- a/arch/parisc/configs/c3000_defconfig +++ b/arch/parisc/configs/c3000_defconfig | |||
@@ -50,7 +50,7 @@ CONFIG_BLK_DEV_CRYPTOLOOP=m | |||
50 | CONFIG_IDE=y | 50 | CONFIG_IDE=y |
51 | CONFIG_BLK_DEV_IDECD=y | 51 | CONFIG_BLK_DEV_IDECD=y |
52 | CONFIG_BLK_DEV_NS87415=y | 52 | CONFIG_BLK_DEV_NS87415=y |
53 | CONFIG_BLK_DEV_SIIMAGE=m | 53 | CONFIG_PATA_SIL680=m |
54 | CONFIG_SCSI=y | 54 | CONFIG_SCSI=y |
55 | CONFIG_BLK_DEV_SD=y | 55 | CONFIG_BLK_DEV_SD=y |
56 | CONFIG_CHR_DEV_ST=y | 56 | CONFIG_CHR_DEV_ST=y |
diff --git a/arch/parisc/configs/c8000_defconfig b/arch/parisc/configs/c8000_defconfig index e1c8d2015c89..8249ac9d9cfc 100644 --- a/arch/parisc/configs/c8000_defconfig +++ b/arch/parisc/configs/c8000_defconfig | |||
@@ -20,7 +20,6 @@ CONFIG_MODULE_FORCE_UNLOAD=y | |||
20 | CONFIG_MODVERSIONS=y | 20 | CONFIG_MODVERSIONS=y |
21 | CONFIG_BLK_DEV_INTEGRITY=y | 21 | CONFIG_BLK_DEV_INTEGRITY=y |
22 | CONFIG_PA8X00=y | 22 | CONFIG_PA8X00=y |
23 | CONFIG_MLONGCALLS=y | ||
24 | CONFIG_64BIT=y | 23 | CONFIG_64BIT=y |
25 | CONFIG_SMP=y | 24 | CONFIG_SMP=y |
26 | CONFIG_PREEMPT=y | 25 | CONFIG_PREEMPT=y |
@@ -81,8 +80,6 @@ CONFIG_IDE=y | |||
81 | CONFIG_BLK_DEV_IDECD=y | 80 | CONFIG_BLK_DEV_IDECD=y |
82 | CONFIG_BLK_DEV_PLATFORM=y | 81 | CONFIG_BLK_DEV_PLATFORM=y |
83 | CONFIG_BLK_DEV_GENERIC=y | 82 | CONFIG_BLK_DEV_GENERIC=y |
84 | CONFIG_BLK_DEV_SIIMAGE=y | ||
85 | CONFIG_SCSI=y | ||
86 | CONFIG_BLK_DEV_SD=y | 83 | CONFIG_BLK_DEV_SD=y |
87 | CONFIG_CHR_DEV_ST=m | 84 | CONFIG_CHR_DEV_ST=m |
88 | CONFIG_BLK_DEV_SR=m | 85 | CONFIG_BLK_DEV_SR=m |
@@ -94,6 +91,8 @@ CONFIG_SCSI_FC_ATTRS=y | |||
94 | CONFIG_SCSI_SAS_LIBSAS=m | 91 | CONFIG_SCSI_SAS_LIBSAS=m |
95 | CONFIG_ISCSI_TCP=m | 92 | CONFIG_ISCSI_TCP=m |
96 | CONFIG_ISCSI_BOOT_SYSFS=m | 93 | CONFIG_ISCSI_BOOT_SYSFS=m |
94 | CONFIG_ATA=y | ||
95 | CONFIG_PATA_SIL680=y | ||
97 | CONFIG_FUSION=y | 96 | CONFIG_FUSION=y |
98 | CONFIG_FUSION_SPI=y | 97 | CONFIG_FUSION_SPI=y |
99 | CONFIG_FUSION_SAS=y | 98 | CONFIG_FUSION_SAS=y |
@@ -114,9 +113,8 @@ CONFIG_INPUT_FF_MEMLESS=m | |||
114 | # CONFIG_KEYBOARD_ATKBD is not set | 113 | # CONFIG_KEYBOARD_ATKBD is not set |
115 | # CONFIG_KEYBOARD_HIL_OLD is not set | 114 | # CONFIG_KEYBOARD_HIL_OLD is not set |
116 | # CONFIG_KEYBOARD_HIL is not set | 115 | # CONFIG_KEYBOARD_HIL is not set |
117 | CONFIG_MOUSE_PS2=m | 116 | # CONFIG_MOUSE_PS2 is not set |
118 | CONFIG_INPUT_MISC=y | 117 | CONFIG_INPUT_MISC=y |
119 | CONFIG_INPUT_CM109=m | ||
120 | CONFIG_SERIO_SERPORT=m | 118 | CONFIG_SERIO_SERPORT=m |
121 | CONFIG_SERIO_PARKBD=m | 119 | CONFIG_SERIO_PARKBD=m |
122 | CONFIG_SERIO_GSCPS2=m | 120 | CONFIG_SERIO_GSCPS2=m |
@@ -167,34 +165,6 @@ CONFIG_SND_VERBOSE_PRINTK=y | |||
167 | CONFIG_SND_AD1889=m | 165 | CONFIG_SND_AD1889=m |
168 | # CONFIG_SND_USB is not set | 166 | # CONFIG_SND_USB is not set |
169 | # CONFIG_SND_GSC is not set | 167 | # CONFIG_SND_GSC is not set |
170 | CONFIG_HID_A4TECH=m | ||
171 | CONFIG_HID_APPLE=m | ||
172 | CONFIG_HID_BELKIN=m | ||
173 | CONFIG_HID_CHERRY=m | ||
174 | CONFIG_HID_CHICONY=m | ||
175 | CONFIG_HID_CYPRESS=m | ||
176 | CONFIG_HID_DRAGONRISE=m | ||
177 | CONFIG_HID_EZKEY=m | ||
178 | CONFIG_HID_KYE=m | ||
179 | CONFIG_HID_GYRATION=m | ||
180 | CONFIG_HID_TWINHAN=m | ||
181 | CONFIG_HID_KENSINGTON=m | ||
182 | CONFIG_HID_LOGITECH=m | ||
183 | CONFIG_HID_LOGITECH_DJ=m | ||
184 | CONFIG_HID_MICROSOFT=m | ||
185 | CONFIG_HID_MONTEREY=m | ||
186 | CONFIG_HID_NTRIG=m | ||
187 | CONFIG_HID_ORTEK=m | ||
188 | CONFIG_HID_PANTHERLORD=m | ||
189 | CONFIG_HID_PETALYNX=m | ||
190 | CONFIG_HID_SAMSUNG=m | ||
191 | CONFIG_HID_SUNPLUS=m | ||
192 | CONFIG_HID_GREENASIA=m | ||
193 | CONFIG_HID_SMARTJOYPLUS=m | ||
194 | CONFIG_HID_TOPSEED=m | ||
195 | CONFIG_HID_THRUSTMASTER=m | ||
196 | CONFIG_HID_ZEROPLUS=m | ||
197 | CONFIG_USB_HID=m | ||
198 | CONFIG_USB=y | 168 | CONFIG_USB=y |
199 | CONFIG_USB_OHCI_HCD=y | 169 | CONFIG_USB_OHCI_HCD=y |
200 | CONFIG_USB_STORAGE=y | 170 | CONFIG_USB_STORAGE=y |
diff --git a/arch/parisc/configs/generic-64bit_defconfig b/arch/parisc/configs/generic-64bit_defconfig index 5874cebee077..28c1b5de044e 100644 --- a/arch/parisc/configs/generic-64bit_defconfig +++ b/arch/parisc/configs/generic-64bit_defconfig | |||
@@ -24,7 +24,6 @@ CONFIG_MODVERSIONS=y | |||
24 | CONFIG_BLK_DEV_INTEGRITY=y | 24 | CONFIG_BLK_DEV_INTEGRITY=y |
25 | # CONFIG_IOSCHED_DEADLINE is not set | 25 | # CONFIG_IOSCHED_DEADLINE is not set |
26 | CONFIG_PA8X00=y | 26 | CONFIG_PA8X00=y |
27 | CONFIG_MLONGCALLS=y | ||
28 | CONFIG_64BIT=y | 27 | CONFIG_64BIT=y |
29 | CONFIG_SMP=y | 28 | CONFIG_SMP=y |
30 | # CONFIG_COMPACTION is not set | 29 | # CONFIG_COMPACTION is not set |
@@ -68,7 +67,6 @@ CONFIG_IDE_GD=m | |||
68 | CONFIG_IDE_GD_ATAPI=y | 67 | CONFIG_IDE_GD_ATAPI=y |
69 | CONFIG_BLK_DEV_IDECD=m | 68 | CONFIG_BLK_DEV_IDECD=m |
70 | CONFIG_BLK_DEV_NS87415=y | 69 | CONFIG_BLK_DEV_NS87415=y |
71 | CONFIG_BLK_DEV_SIIMAGE=y | ||
72 | # CONFIG_SCSI_PROC_FS is not set | 70 | # CONFIG_SCSI_PROC_FS is not set |
73 | CONFIG_BLK_DEV_SD=y | 71 | CONFIG_BLK_DEV_SD=y |
74 | CONFIG_BLK_DEV_SR=y | 72 | CONFIG_BLK_DEV_SR=y |
@@ -82,6 +80,7 @@ CONFIG_SCSI_ZALON=y | |||
82 | CONFIG_SCSI_QLA_ISCSI=m | 80 | CONFIG_SCSI_QLA_ISCSI=m |
83 | CONFIG_SCSI_DH=y | 81 | CONFIG_SCSI_DH=y |
84 | CONFIG_ATA=y | 82 | CONFIG_ATA=y |
83 | CONFIG_PATA_SIL680=y | ||
85 | CONFIG_ATA_GENERIC=y | 84 | CONFIG_ATA_GENERIC=y |
86 | CONFIG_MD=y | 85 | CONFIG_MD=y |
87 | CONFIG_MD_LINEAR=m | 86 | CONFIG_MD_LINEAR=m |
@@ -162,7 +161,7 @@ CONFIG_SLIP_MODE_SLIP6=y | |||
162 | CONFIG_INPUT_EVDEV=y | 161 | CONFIG_INPUT_EVDEV=y |
163 | # CONFIG_KEYBOARD_HIL_OLD is not set | 162 | # CONFIG_KEYBOARD_HIL_OLD is not set |
164 | # CONFIG_KEYBOARD_HIL is not set | 163 | # CONFIG_KEYBOARD_HIL is not set |
165 | # CONFIG_INPUT_MOUSE is not set | 164 | # CONFIG_MOUSE_PS2 is not set |
166 | CONFIG_INPUT_MISC=y | 165 | CONFIG_INPUT_MISC=y |
167 | CONFIG_SERIO_SERPORT=m | 166 | CONFIG_SERIO_SERPORT=m |
168 | # CONFIG_HP_SDC is not set | 167 | # CONFIG_HP_SDC is not set |
@@ -216,32 +215,7 @@ CONFIG_BACKLIGHT_LCD_SUPPORT=y | |||
216 | CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y | 215 | CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y |
217 | CONFIG_LOGO=y | 216 | CONFIG_LOGO=y |
218 | # CONFIG_LOGO_LINUX_MONO is not set | 217 | # CONFIG_LOGO_LINUX_MONO is not set |
219 | CONFIG_HID=m | ||
220 | CONFIG_HIDRAW=y | 218 | CONFIG_HIDRAW=y |
221 | CONFIG_HID_DRAGONRISE=m | ||
222 | CONFIG_DRAGONRISE_FF=y | ||
223 | CONFIG_HID_KYE=m | ||
224 | CONFIG_HID_GYRATION=m | ||
225 | CONFIG_HID_TWINHAN=m | ||
226 | CONFIG_LOGITECH_FF=y | ||
227 | CONFIG_LOGIRUMBLEPAD2_FF=y | ||
228 | CONFIG_HID_NTRIG=m | ||
229 | CONFIG_HID_PANTHERLORD=m | ||
230 | CONFIG_PANTHERLORD_FF=y | ||
231 | CONFIG_HID_PETALYNX=m | ||
232 | CONFIG_HID_SAMSUNG=m | ||
233 | CONFIG_HID_SONY=m | ||
234 | CONFIG_HID_SUNPLUS=m | ||
235 | CONFIG_HID_GREENASIA=m | ||
236 | CONFIG_GREENASIA_FF=y | ||
237 | CONFIG_HID_SMARTJOYPLUS=m | ||
238 | CONFIG_SMARTJOYPLUS_FF=y | ||
239 | CONFIG_HID_TOPSEED=m | ||
240 | CONFIG_HID_THRUSTMASTER=m | ||
241 | CONFIG_THRUSTMASTER_FF=y | ||
242 | CONFIG_HID_ZEROPLUS=m | ||
243 | CONFIG_ZEROPLUS_FF=y | ||
244 | CONFIG_USB_HID=m | ||
245 | CONFIG_HID_PID=y | 219 | CONFIG_HID_PID=y |
246 | CONFIG_USB_HIDDEV=y | 220 | CONFIG_USB_HIDDEV=y |
247 | CONFIG_USB=y | 221 | CONFIG_USB=y |
@@ -251,13 +225,8 @@ CONFIG_USB_DYNAMIC_MINORS=y | |||
251 | CONFIG_USB_MON=m | 225 | CONFIG_USB_MON=m |
252 | CONFIG_USB_WUSB_CBAF=m | 226 | CONFIG_USB_WUSB_CBAF=m |
253 | CONFIG_USB_XHCI_HCD=m | 227 | CONFIG_USB_XHCI_HCD=m |
254 | CONFIG_USB_EHCI_HCD=m | 228 | CONFIG_USB_EHCI_HCD=y |
255 | CONFIG_USB_OHCI_HCD=m | 229 | CONFIG_USB_OHCI_HCD=y |
256 | CONFIG_USB_R8A66597_HCD=m | ||
257 | CONFIG_USB_ACM=m | ||
258 | CONFIG_USB_PRINTER=m | ||
259 | CONFIG_USB_WDM=m | ||
260 | CONFIG_USB_TMC=m | ||
261 | CONFIG_NEW_LEDS=y | 230 | CONFIG_NEW_LEDS=y |
262 | CONFIG_LEDS_CLASS=y | 231 | CONFIG_LEDS_CLASS=y |
263 | CONFIG_LEDS_TRIGGERS=y | 232 | CONFIG_LEDS_TRIGGERS=y |
diff --git a/arch/parisc/include/asm/Kbuild b/arch/parisc/include/asm/Kbuild index a603b9ebe54c..34b0be4ca52d 100644 --- a/arch/parisc/include/asm/Kbuild +++ b/arch/parisc/include/asm/Kbuild | |||
@@ -1,4 +1,5 @@ | |||
1 | 1 | ||
2 | generic-y += barrier.h | ||
2 | generic-y += word-at-a-time.h auxvec.h user.h cputime.h emergency-restart.h \ | 3 | generic-y += word-at-a-time.h auxvec.h user.h cputime.h emergency-restart.h \ |
3 | segment.h topology.h vga.h device.h percpu.h hw_irq.h mutex.h \ | 4 | segment.h topology.h vga.h device.h percpu.h hw_irq.h mutex.h \ |
4 | div64.h irq_regs.h kdebug.h kvm_para.h local64.h local.h param.h \ | 5 | div64.h irq_regs.h kdebug.h kvm_para.h local64.h local.h param.h \ |
diff --git a/arch/parisc/include/asm/barrier.h b/arch/parisc/include/asm/barrier.h deleted file mode 100644 index e77d834aa803..000000000000 --- a/arch/parisc/include/asm/barrier.h +++ /dev/null | |||
@@ -1,35 +0,0 @@ | |||
1 | #ifndef __PARISC_BARRIER_H | ||
2 | #define __PARISC_BARRIER_H | ||
3 | |||
4 | /* | ||
5 | ** This is simply the barrier() macro from linux/kernel.h but when serial.c | ||
6 | ** uses tqueue.h uses smp_mb() defined using barrier(), linux/kernel.h | ||
7 | ** hasn't yet been included yet so it fails, thus repeating the macro here. | ||
8 | ** | ||
9 | ** PA-RISC architecture allows for weakly ordered memory accesses although | ||
10 | ** none of the processors use it. There is a strong ordered bit that is | ||
11 | ** set in the O-bit of the page directory entry. Operating systems that | ||
12 | ** can not tolerate out of order accesses should set this bit when mapping | ||
13 | ** pages. The O-bit of the PSW should also be set to 1 (I don't believe any | ||
14 | ** of the processor implemented the PSW O-bit). The PCX-W ERS states that | ||
15 | ** the TLB O-bit is not implemented so the page directory does not need to | ||
16 | ** have the O-bit set when mapping pages (section 3.1). This section also | ||
17 | ** states that the PSW Y, Z, G, and O bits are not implemented. | ||
18 | ** So it looks like nothing needs to be done for parisc-linux (yet). | ||
19 | ** (thanks to chada for the above comment -ggg) | ||
20 | ** | ||
21 | ** The __asm__ op below simple prevents gcc/ld from reordering | ||
22 | ** instructions across the mb() "call". | ||
23 | */ | ||
24 | #define mb() __asm__ __volatile__("":::"memory") /* barrier() */ | ||
25 | #define rmb() mb() | ||
26 | #define wmb() mb() | ||
27 | #define smp_mb() mb() | ||
28 | #define smp_rmb() mb() | ||
29 | #define smp_wmb() mb() | ||
30 | #define smp_read_barrier_depends() do { } while(0) | ||
31 | #define read_barrier_depends() do { } while(0) | ||
32 | |||
33 | #define set_mb(var, value) do { var = value; mb(); } while (0) | ||
34 | |||
35 | #endif /* __PARISC_BARRIER_H */ | ||
diff --git a/arch/parisc/include/asm/cacheflush.h b/arch/parisc/include/asm/cacheflush.h index f0e2784e7cca..2f9b751878ba 100644 --- a/arch/parisc/include/asm/cacheflush.h +++ b/arch/parisc/include/asm/cacheflush.h | |||
@@ -125,42 +125,38 @@ flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vma | |||
125 | void mark_rodata_ro(void); | 125 | void mark_rodata_ro(void); |
126 | #endif | 126 | #endif |
127 | 127 | ||
128 | #ifdef CONFIG_PA8X00 | ||
129 | /* Only pa8800, pa8900 needs this */ | ||
130 | |||
131 | #include <asm/kmap_types.h> | 128 | #include <asm/kmap_types.h> |
132 | 129 | ||
133 | #define ARCH_HAS_KMAP | 130 | #define ARCH_HAS_KMAP |
134 | 131 | ||
135 | void kunmap_parisc(void *addr); | ||
136 | |||
137 | static inline void *kmap(struct page *page) | 132 | static inline void *kmap(struct page *page) |
138 | { | 133 | { |
139 | might_sleep(); | 134 | might_sleep(); |
135 | flush_dcache_page(page); | ||
140 | return page_address(page); | 136 | return page_address(page); |
141 | } | 137 | } |
142 | 138 | ||
143 | static inline void kunmap(struct page *page) | 139 | static inline void kunmap(struct page *page) |
144 | { | 140 | { |
145 | kunmap_parisc(page_address(page)); | 141 | flush_kernel_dcache_page_addr(page_address(page)); |
146 | } | 142 | } |
147 | 143 | ||
148 | static inline void *kmap_atomic(struct page *page) | 144 | static inline void *kmap_atomic(struct page *page) |
149 | { | 145 | { |
150 | pagefault_disable(); | 146 | pagefault_disable(); |
147 | flush_dcache_page(page); | ||
151 | return page_address(page); | 148 | return page_address(page); |
152 | } | 149 | } |
153 | 150 | ||
154 | static inline void __kunmap_atomic(void *addr) | 151 | static inline void __kunmap_atomic(void *addr) |
155 | { | 152 | { |
156 | kunmap_parisc(addr); | 153 | flush_kernel_dcache_page_addr(addr); |
157 | pagefault_enable(); | 154 | pagefault_enable(); |
158 | } | 155 | } |
159 | 156 | ||
160 | #define kmap_atomic_prot(page, prot) kmap_atomic(page) | 157 | #define kmap_atomic_prot(page, prot) kmap_atomic(page) |
161 | #define kmap_atomic_pfn(pfn) kmap_atomic(pfn_to_page(pfn)) | 158 | #define kmap_atomic_pfn(pfn) kmap_atomic(pfn_to_page(pfn)) |
162 | #define kmap_atomic_to_page(ptr) virt_to_page(ptr) | 159 | #define kmap_atomic_to_page(ptr) virt_to_page(ptr) |
163 | #endif | ||
164 | 160 | ||
165 | #endif /* _PARISC_CACHEFLUSH_H */ | 161 | #endif /* _PARISC_CACHEFLUSH_H */ |
166 | 162 | ||
diff --git a/arch/parisc/include/asm/page.h b/arch/parisc/include/asm/page.h index b7adb2ac049c..c53fc63149e8 100644 --- a/arch/parisc/include/asm/page.h +++ b/arch/parisc/include/asm/page.h | |||
@@ -28,9 +28,8 @@ struct page; | |||
28 | 28 | ||
29 | void clear_page_asm(void *page); | 29 | void clear_page_asm(void *page); |
30 | void copy_page_asm(void *to, void *from); | 30 | void copy_page_asm(void *to, void *from); |
31 | void clear_user_page(void *vto, unsigned long vaddr, struct page *pg); | 31 | #define clear_user_page(vto, vaddr, page) clear_page_asm(vto) |
32 | void copy_user_page(void *vto, void *vfrom, unsigned long vaddr, | 32 | #define copy_user_page(vto, vfrom, vaddr, page) copy_page_asm(vto, vfrom) |
33 | struct page *pg); | ||
34 | 33 | ||
35 | /* #define CONFIG_PARISC_TMPALIAS */ | 34 | /* #define CONFIG_PARISC_TMPALIAS */ |
36 | 35 | ||
diff --git a/arch/parisc/include/asm/serial.h b/arch/parisc/include/asm/serial.h index d7e3cc60dbc3..77e9b67c87ee 100644 --- a/arch/parisc/include/asm/serial.h +++ b/arch/parisc/include/asm/serial.h | |||
@@ -6,5 +6,3 @@ | |||
6 | * This is used for 16550-compatible UARTs | 6 | * This is used for 16550-compatible UARTs |
7 | */ | 7 | */ |
8 | #define BASE_BAUD ( 1843200 / 16 ) | 8 | #define BASE_BAUD ( 1843200 / 16 ) |
9 | |||
10 | #define SERIAL_PORT_DFNS | ||
diff --git a/arch/parisc/include/uapi/asm/socket.h b/arch/parisc/include/uapi/asm/socket.h index f33113a6141e..70b3674dac4e 100644 --- a/arch/parisc/include/uapi/asm/socket.h +++ b/arch/parisc/include/uapi/asm/socket.h | |||
@@ -75,6 +75,6 @@ | |||
75 | 75 | ||
76 | #define SO_BUSY_POLL 0x4027 | 76 | #define SO_BUSY_POLL 0x4027 |
77 | 77 | ||
78 | #define SO_MAX_PACING_RATE 0x4048 | 78 | #define SO_MAX_PACING_RATE 0x4028 |
79 | 79 | ||
80 | #endif /* _UAPI_ASM_SOCKET_H */ | 80 | #endif /* _UAPI_ASM_SOCKET_H */ |
diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c index c035673209f7..a72545554a31 100644 --- a/arch/parisc/kernel/cache.c +++ b/arch/parisc/kernel/cache.c | |||
@@ -388,41 +388,6 @@ void flush_kernel_dcache_page_addr(void *addr) | |||
388 | } | 388 | } |
389 | EXPORT_SYMBOL(flush_kernel_dcache_page_addr); | 389 | EXPORT_SYMBOL(flush_kernel_dcache_page_addr); |
390 | 390 | ||
391 | void clear_user_page(void *vto, unsigned long vaddr, struct page *page) | ||
392 | { | ||
393 | clear_page_asm(vto); | ||
394 | if (!parisc_requires_coherency()) | ||
395 | flush_kernel_dcache_page_asm(vto); | ||
396 | } | ||
397 | EXPORT_SYMBOL(clear_user_page); | ||
398 | |||
399 | void copy_user_page(void *vto, void *vfrom, unsigned long vaddr, | ||
400 | struct page *pg) | ||
401 | { | ||
402 | /* Copy using kernel mapping. No coherency is needed | ||
403 | (all in kmap/kunmap) on machines that don't support | ||
404 | non-equivalent aliasing. However, the `from' page | ||
405 | needs to be flushed before it can be accessed through | ||
406 | the kernel mapping. */ | ||
407 | preempt_disable(); | ||
408 | flush_dcache_page_asm(__pa(vfrom), vaddr); | ||
409 | preempt_enable(); | ||
410 | copy_page_asm(vto, vfrom); | ||
411 | if (!parisc_requires_coherency()) | ||
412 | flush_kernel_dcache_page_asm(vto); | ||
413 | } | ||
414 | EXPORT_SYMBOL(copy_user_page); | ||
415 | |||
416 | #ifdef CONFIG_PA8X00 | ||
417 | |||
418 | void kunmap_parisc(void *addr) | ||
419 | { | ||
420 | if (parisc_requires_coherency()) | ||
421 | flush_kernel_dcache_page_addr(addr); | ||
422 | } | ||
423 | EXPORT_SYMBOL(kunmap_parisc); | ||
424 | #endif | ||
425 | |||
426 | void purge_tlb_entries(struct mm_struct *mm, unsigned long addr) | 391 | void purge_tlb_entries(struct mm_struct *mm, unsigned long addr) |
427 | { | 392 | { |
428 | unsigned long flags; | 393 | unsigned long flags; |
diff --git a/arch/parisc/kernel/hardware.c b/arch/parisc/kernel/hardware.c index 06cb3992907e..608716f8496b 100644 --- a/arch/parisc/kernel/hardware.c +++ b/arch/parisc/kernel/hardware.c | |||
@@ -36,6 +36,9 @@ | |||
36 | * HP PARISC Hardware Database | 36 | * HP PARISC Hardware Database |
37 | * Access to this database is only possible during bootup | 37 | * Access to this database is only possible during bootup |
38 | * so don't reference this table after starting the init process | 38 | * so don't reference this table after starting the init process |
39 | * | ||
40 | * NOTE: Product names which are listed here and ends with a '?' | ||
41 | * are guessed. If you know the correct name, please let us know. | ||
39 | */ | 42 | */ |
40 | 43 | ||
41 | static struct hp_hardware hp_hardware_list[] = { | 44 | static struct hp_hardware hp_hardware_list[] = { |
@@ -222,7 +225,7 @@ static struct hp_hardware hp_hardware_list[] = { | |||
222 | {HPHW_NPROC,0x5DD,0x4,0x81,"Duet W2"}, | 225 | {HPHW_NPROC,0x5DD,0x4,0x81,"Duet W2"}, |
223 | {HPHW_NPROC,0x5DE,0x4,0x81,"Piccolo W+"}, | 226 | {HPHW_NPROC,0x5DE,0x4,0x81,"Piccolo W+"}, |
224 | {HPHW_NPROC,0x5DF,0x4,0x81,"Cantata W2"}, | 227 | {HPHW_NPROC,0x5DF,0x4,0x81,"Cantata W2"}, |
225 | {HPHW_NPROC,0x5DF,0x0,0x00,"Marcato W+? (rp5470)"}, | 228 | {HPHW_NPROC,0x5DF,0x0,0x00,"Marcato W+ (rp5470)?"}, |
226 | {HPHW_NPROC,0x5E0,0x4,0x91,"Cantata DC- W2"}, | 229 | {HPHW_NPROC,0x5E0,0x4,0x91,"Cantata DC- W2"}, |
227 | {HPHW_NPROC,0x5E1,0x4,0x91,"Crescendo DC- W2"}, | 230 | {HPHW_NPROC,0x5E1,0x4,0x91,"Crescendo DC- W2"}, |
228 | {HPHW_NPROC,0x5E2,0x4,0x91,"Crescendo 650 W2"}, | 231 | {HPHW_NPROC,0x5E2,0x4,0x91,"Crescendo 650 W2"}, |
@@ -276,9 +279,11 @@ static struct hp_hardware hp_hardware_list[] = { | |||
276 | {HPHW_NPROC,0x888,0x4,0x91,"Storm Peak Fast DC-"}, | 279 | {HPHW_NPROC,0x888,0x4,0x91,"Storm Peak Fast DC-"}, |
277 | {HPHW_NPROC,0x889,0x4,0x91,"Storm Peak Fast"}, | 280 | {HPHW_NPROC,0x889,0x4,0x91,"Storm Peak Fast"}, |
278 | {HPHW_NPROC,0x88A,0x4,0x91,"Crestone Peak Slow"}, | 281 | {HPHW_NPROC,0x88A,0x4,0x91,"Crestone Peak Slow"}, |
282 | {HPHW_NPROC,0x88B,0x4,0x91,"Crestone Peak Fast?"}, | ||
279 | {HPHW_NPROC,0x88C,0x4,0x91,"Orca Mako+"}, | 283 | {HPHW_NPROC,0x88C,0x4,0x91,"Orca Mako+"}, |
280 | {HPHW_NPROC,0x88D,0x4,0x91,"Rainier/Medel Mako+ Slow"}, | 284 | {HPHW_NPROC,0x88D,0x4,0x91,"Rainier/Medel Mako+ Slow"}, |
281 | {HPHW_NPROC,0x88E,0x4,0x91,"Rainier/Medel Mako+ Fast"}, | 285 | {HPHW_NPROC,0x88E,0x4,0x91,"Rainier/Medel Mako+ Fast"}, |
286 | {HPHW_NPROC,0x892,0x4,0x91,"Mt. Hamilton Slow Mako+?"}, | ||
282 | {HPHW_NPROC,0x894,0x4,0x91,"Mt. Hamilton Fast Mako+"}, | 287 | {HPHW_NPROC,0x894,0x4,0x91,"Mt. Hamilton Fast Mako+"}, |
283 | {HPHW_NPROC,0x895,0x4,0x91,"Storm Peak Slow Mako+"}, | 288 | {HPHW_NPROC,0x895,0x4,0x91,"Storm Peak Slow Mako+"}, |
284 | {HPHW_NPROC,0x896,0x4,0x91,"Storm Peak Fast Mako+"}, | 289 | {HPHW_NPROC,0x896,0x4,0x91,"Storm Peak Fast Mako+"}, |
diff --git a/arch/parisc/kernel/head.S b/arch/parisc/kernel/head.S index d2d58258aea6..d4dc588c0dc1 100644 --- a/arch/parisc/kernel/head.S +++ b/arch/parisc/kernel/head.S | |||
@@ -41,9 +41,7 @@ END(boot_args) | |||
41 | .import fault_vector_11,code /* IVA parisc 1.1 32 bit */ | 41 | .import fault_vector_11,code /* IVA parisc 1.1 32 bit */ |
42 | .import $global$ /* forward declaration */ | 42 | .import $global$ /* forward declaration */ |
43 | #endif /*!CONFIG_64BIT*/ | 43 | #endif /*!CONFIG_64BIT*/ |
44 | .export _stext,data /* Kernel want it this way! */ | 44 | ENTRY(parisc_kernel_start) |
45 | _stext: | ||
46 | ENTRY(stext) | ||
47 | .proc | 45 | .proc |
48 | .callinfo | 46 | .callinfo |
49 | 47 | ||
@@ -347,7 +345,7 @@ smp_slave_stext: | |||
347 | .procend | 345 | .procend |
348 | #endif /* CONFIG_SMP */ | 346 | #endif /* CONFIG_SMP */ |
349 | 347 | ||
350 | ENDPROC(stext) | 348 | ENDPROC(parisc_kernel_start) |
351 | 349 | ||
352 | #ifndef CONFIG_64BIT | 350 | #ifndef CONFIG_64BIT |
353 | .section .data..read_mostly | 351 | .section .data..read_mostly |
diff --git a/arch/parisc/kernel/sys_parisc.c b/arch/parisc/kernel/sys_parisc.c index 5dfd248e3f1a..0d3a9d4927b5 100644 --- a/arch/parisc/kernel/sys_parisc.c +++ b/arch/parisc/kernel/sys_parisc.c | |||
@@ -61,8 +61,15 @@ static int get_offset(struct address_space *mapping) | |||
61 | return (unsigned long) mapping >> 8; | 61 | return (unsigned long) mapping >> 8; |
62 | } | 62 | } |
63 | 63 | ||
64 | static unsigned long get_shared_area(struct address_space *mapping, | 64 | static unsigned long shared_align_offset(struct file *filp, unsigned long pgoff) |
65 | unsigned long addr, unsigned long len, unsigned long pgoff) | 65 | { |
66 | struct address_space *mapping = filp ? filp->f_mapping : NULL; | ||
67 | |||
68 | return (get_offset(mapping) + pgoff) << PAGE_SHIFT; | ||
69 | } | ||
70 | |||
71 | static unsigned long get_shared_area(struct file *filp, unsigned long addr, | ||
72 | unsigned long len, unsigned long pgoff) | ||
66 | { | 73 | { |
67 | struct vm_unmapped_area_info info; | 74 | struct vm_unmapped_area_info info; |
68 | 75 | ||
@@ -71,7 +78,7 @@ static unsigned long get_shared_area(struct address_space *mapping, | |||
71 | info.low_limit = PAGE_ALIGN(addr); | 78 | info.low_limit = PAGE_ALIGN(addr); |
72 | info.high_limit = TASK_SIZE; | 79 | info.high_limit = TASK_SIZE; |
73 | info.align_mask = PAGE_MASK & (SHMLBA - 1); | 80 | info.align_mask = PAGE_MASK & (SHMLBA - 1); |
74 | info.align_offset = (get_offset(mapping) + pgoff) << PAGE_SHIFT; | 81 | info.align_offset = shared_align_offset(filp, pgoff); |
75 | return vm_unmapped_area(&info); | 82 | return vm_unmapped_area(&info); |
76 | } | 83 | } |
77 | 84 | ||
@@ -82,20 +89,18 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, | |||
82 | return -ENOMEM; | 89 | return -ENOMEM; |
83 | if (flags & MAP_FIXED) { | 90 | if (flags & MAP_FIXED) { |
84 | if ((flags & MAP_SHARED) && | 91 | if ((flags & MAP_SHARED) && |
85 | (addr - (pgoff << PAGE_SHIFT)) & (SHMLBA - 1)) | 92 | (addr - shared_align_offset(filp, pgoff)) & (SHMLBA - 1)) |
86 | return -EINVAL; | 93 | return -EINVAL; |
87 | return addr; | 94 | return addr; |
88 | } | 95 | } |
89 | if (!addr) | 96 | if (!addr) |
90 | addr = TASK_UNMAPPED_BASE; | 97 | addr = TASK_UNMAPPED_BASE; |
91 | 98 | ||
92 | if (filp) { | 99 | if (filp || (flags & MAP_SHARED)) |
93 | addr = get_shared_area(filp->f_mapping, addr, len, pgoff); | 100 | addr = get_shared_area(filp, addr, len, pgoff); |
94 | } else if(flags & MAP_SHARED) { | 101 | else |
95 | addr = get_shared_area(NULL, addr, len, pgoff); | ||
96 | } else { | ||
97 | addr = get_unshared_area(addr, len); | 102 | addr = get_unshared_area(addr, len); |
98 | } | 103 | |
99 | return addr; | 104 | return addr; |
100 | } | 105 | } |
101 | 106 | ||
diff --git a/arch/parisc/kernel/unwind.c b/arch/parisc/kernel/unwind.c index 76ed62ed785b..ddd988b267a9 100644 --- a/arch/parisc/kernel/unwind.c +++ b/arch/parisc/kernel/unwind.c | |||
@@ -168,7 +168,7 @@ void unwind_table_remove(struct unwind_table *table) | |||
168 | } | 168 | } |
169 | 169 | ||
170 | /* Called from setup_arch to import the kernel unwind info */ | 170 | /* Called from setup_arch to import the kernel unwind info */ |
171 | int unwind_init(void) | 171 | int __init unwind_init(void) |
172 | { | 172 | { |
173 | long start, stop; | 173 | long start, stop; |
174 | register unsigned long gp __asm__ ("r27"); | 174 | register unsigned long gp __asm__ ("r27"); |
@@ -233,7 +233,6 @@ static void unwind_frame_regs(struct unwind_frame_info *info) | |||
233 | e = find_unwind_entry(info->ip); | 233 | e = find_unwind_entry(info->ip); |
234 | if (e == NULL) { | 234 | if (e == NULL) { |
235 | unsigned long sp; | 235 | unsigned long sp; |
236 | extern char _stext[], _etext[]; | ||
237 | 236 | ||
238 | dbg("Cannot find unwind entry for 0x%lx; forced unwinding\n", info->ip); | 237 | dbg("Cannot find unwind entry for 0x%lx; forced unwinding\n", info->ip); |
239 | 238 | ||
@@ -281,8 +280,7 @@ static void unwind_frame_regs(struct unwind_frame_info *info) | |||
281 | break; | 280 | break; |
282 | info->prev_ip = tmp; | 281 | info->prev_ip = tmp; |
283 | sp = info->prev_sp; | 282 | sp = info->prev_sp; |
284 | } while (info->prev_ip < (unsigned long)_stext || | 283 | } while (!kernel_text_address(info->prev_ip)); |
285 | info->prev_ip > (unsigned long)_etext); | ||
286 | 284 | ||
287 | info->rp = 0; | 285 | info->rp = 0; |
288 | 286 | ||
@@ -435,9 +433,8 @@ unsigned long return_address(unsigned int level) | |||
435 | do { | 433 | do { |
436 | if (unwind_once(&info) < 0 || info.ip == 0) | 434 | if (unwind_once(&info) < 0 || info.ip == 0) |
437 | return 0; | 435 | return 0; |
438 | if (!__kernel_text_address(info.ip)) { | 436 | if (!kernel_text_address(info.ip)) |
439 | return 0; | 437 | return 0; |
440 | } | ||
441 | } while (info.ip && level--); | 438 | } while (info.ip && level--); |
442 | 439 | ||
443 | return info.ip; | 440 | return info.ip; |
diff --git a/arch/parisc/kernel/vmlinux.lds.S b/arch/parisc/kernel/vmlinux.lds.S index 4bb095a2f6fc..0dacc5ca555a 100644 --- a/arch/parisc/kernel/vmlinux.lds.S +++ b/arch/parisc/kernel/vmlinux.lds.S | |||
@@ -6,24 +6,19 @@ | |||
6 | * Copyright (C) 2000 Michael Ang <mang with subcarrier.org> | 6 | * Copyright (C) 2000 Michael Ang <mang with subcarrier.org> |
7 | * Copyright (C) 2002 Randolph Chung <tausq with parisc-linux.org> | 7 | * Copyright (C) 2002 Randolph Chung <tausq with parisc-linux.org> |
8 | * Copyright (C) 2003 James Bottomley <jejb with parisc-linux.org> | 8 | * Copyright (C) 2003 James Bottomley <jejb with parisc-linux.org> |
9 | * Copyright (C) 2006 Helge Deller <deller@gmx.de> | 9 | * Copyright (C) 2006-2013 Helge Deller <deller@gmx.de> |
10 | * | 10 | */ |
11 | * | 11 | |
12 | * This program is free software; you can redistribute it and/or modify | 12 | /* |
13 | * it under the terms of the GNU General Public License as published by | 13 | * Put page table entries (swapper_pg_dir) as the first thing in .bss. This |
14 | * the Free Software Foundation; either version 2 of the License, or | 14 | * will ensure that it has .bss alignment (PAGE_SIZE). |
15 | * (at your option) any later version. | ||
16 | * | ||
17 | * This program is distributed in the hope that it will be useful, | ||
18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
20 | * GNU General Public License for more details. | ||
21 | * | ||
22 | * You should have received a copy of the GNU General Public License | ||
23 | * along with this program; if not, write to the Free Software | ||
24 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
25 | */ | 15 | */ |
16 | #define BSS_FIRST_SECTIONS *(.data..vm0.pmd) \ | ||
17 | *(.data..vm0.pgd) \ | ||
18 | *(.data..vm0.pte) | ||
19 | |||
26 | #include <asm-generic/vmlinux.lds.h> | 20 | #include <asm-generic/vmlinux.lds.h> |
21 | |||
27 | /* needed for the processor specific cache alignment size */ | 22 | /* needed for the processor specific cache alignment size */ |
28 | #include <asm/cache.h> | 23 | #include <asm/cache.h> |
29 | #include <asm/page.h> | 24 | #include <asm/page.h> |
@@ -39,7 +34,7 @@ OUTPUT_FORMAT("elf64-hppa-linux") | |||
39 | OUTPUT_ARCH(hppa:hppa2.0w) | 34 | OUTPUT_ARCH(hppa:hppa2.0w) |
40 | #endif | 35 | #endif |
41 | 36 | ||
42 | ENTRY(_stext) | 37 | ENTRY(parisc_kernel_start) |
43 | #ifndef CONFIG_64BIT | 38 | #ifndef CONFIG_64BIT |
44 | jiffies = jiffies_64 + 4; | 39 | jiffies = jiffies_64 + 4; |
45 | #else | 40 | #else |
@@ -49,11 +44,29 @@ SECTIONS | |||
49 | { | 44 | { |
50 | . = KERNEL_BINARY_TEXT_START; | 45 | . = KERNEL_BINARY_TEXT_START; |
51 | 46 | ||
47 | __init_begin = .; | ||
48 | HEAD_TEXT_SECTION | ||
49 | INIT_TEXT_SECTION(8) | ||
50 | |||
51 | . = ALIGN(PAGE_SIZE); | ||
52 | INIT_DATA_SECTION(PAGE_SIZE) | ||
53 | /* we have to discard exit text and such at runtime, not link time */ | ||
54 | .exit.text : | ||
55 | { | ||
56 | EXIT_TEXT | ||
57 | } | ||
58 | .exit.data : | ||
59 | { | ||
60 | EXIT_DATA | ||
61 | } | ||
62 | PERCPU_SECTION(8) | ||
63 | . = ALIGN(PAGE_SIZE); | ||
64 | __init_end = .; | ||
65 | /* freed after init ends here */ | ||
66 | |||
52 | _text = .; /* Text and read-only data */ | 67 | _text = .; /* Text and read-only data */ |
53 | .head ALIGN(16) : { | 68 | _stext = .; |
54 | HEAD_TEXT | 69 | .text ALIGN(PAGE_SIZE) : { |
55 | } = 0 | ||
56 | .text ALIGN(16) : { | ||
57 | TEXT_TEXT | 70 | TEXT_TEXT |
58 | SCHED_TEXT | 71 | SCHED_TEXT |
59 | LOCK_TEXT | 72 | LOCK_TEXT |
@@ -68,21 +81,28 @@ SECTIONS | |||
68 | *(.lock.text) /* out-of-line lock text */ | 81 | *(.lock.text) /* out-of-line lock text */ |
69 | *(.gnu.warning) | 82 | *(.gnu.warning) |
70 | } | 83 | } |
71 | /* End of text section */ | 84 | . = ALIGN(PAGE_SIZE); |
72 | _etext = .; | 85 | _etext = .; |
86 | /* End of text section */ | ||
73 | 87 | ||
74 | /* Start of data section */ | 88 | /* Start of data section */ |
75 | _sdata = .; | 89 | _sdata = .; |
76 | 90 | ||
77 | RODATA | 91 | RO_DATA_SECTION(8) |
78 | 92 | ||
79 | /* writeable */ | 93 | #ifdef CONFIG_64BIT |
80 | /* Make sure this is page aligned so | 94 | . = ALIGN(16); |
81 | * that we can properly leave these | 95 | /* Linkage tables */ |
82 | * as writable | 96 | .opd : { |
83 | */ | 97 | *(.opd) |
84 | . = ALIGN(PAGE_SIZE); | 98 | } PROVIDE (__gp = .); |
85 | data_start = .; | 99 | .plt : { |
100 | *(.plt) | ||
101 | } | ||
102 | .dlt : { | ||
103 | *(.dlt) | ||
104 | } | ||
105 | #endif | ||
86 | 106 | ||
87 | /* unwind info */ | 107 | /* unwind info */ |
88 | .PARISC.unwind : { | 108 | .PARISC.unwind : { |
@@ -91,7 +111,15 @@ SECTIONS | |||
91 | __stop___unwind = .; | 111 | __stop___unwind = .; |
92 | } | 112 | } |
93 | 113 | ||
94 | EXCEPTION_TABLE(16) | 114 | /* writeable */ |
115 | /* Make sure this is page aligned so | ||
116 | * that we can properly leave these | ||
117 | * as writable | ||
118 | */ | ||
119 | . = ALIGN(PAGE_SIZE); | ||
120 | data_start = .; | ||
121 | |||
122 | EXCEPTION_TABLE(8) | ||
95 | NOTES | 123 | NOTES |
96 | 124 | ||
97 | /* Data */ | 125 | /* Data */ |
@@ -107,54 +135,8 @@ SECTIONS | |||
107 | _edata = .; | 135 | _edata = .; |
108 | 136 | ||
109 | /* BSS */ | 137 | /* BSS */ |
110 | __bss_start = .; | 138 | BSS_SECTION(PAGE_SIZE, PAGE_SIZE, 8) |
111 | /* page table entries need to be PAGE_SIZE aligned */ | ||
112 | . = ALIGN(PAGE_SIZE); | ||
113 | .data..vmpages : { | ||
114 | *(.data..vm0.pmd) | ||
115 | *(.data..vm0.pgd) | ||
116 | *(.data..vm0.pte) | ||
117 | } | ||
118 | .bss : { | ||
119 | *(.bss) | ||
120 | *(COMMON) | ||
121 | } | ||
122 | __bss_stop = .; | ||
123 | |||
124 | #ifdef CONFIG_64BIT | ||
125 | . = ALIGN(16); | ||
126 | /* Linkage tables */ | ||
127 | .opd : { | ||
128 | *(.opd) | ||
129 | } PROVIDE (__gp = .); | ||
130 | .plt : { | ||
131 | *(.plt) | ||
132 | } | ||
133 | .dlt : { | ||
134 | *(.dlt) | ||
135 | } | ||
136 | #endif | ||
137 | 139 | ||
138 | /* reserve space for interrupt stack by aligning __init* to 16k */ | ||
139 | . = ALIGN(16384); | ||
140 | __init_begin = .; | ||
141 | INIT_TEXT_SECTION(16384) | ||
142 | . = ALIGN(PAGE_SIZE); | ||
143 | INIT_DATA_SECTION(16) | ||
144 | /* we have to discard exit text and such at runtime, not link time */ | ||
145 | .exit.text : | ||
146 | { | ||
147 | EXIT_TEXT | ||
148 | } | ||
149 | .exit.data : | ||
150 | { | ||
151 | EXIT_DATA | ||
152 | } | ||
153 | |||
154 | PERCPU_SECTION(L1_CACHE_BYTES) | ||
155 | . = ALIGN(PAGE_SIZE); | ||
156 | __init_end = .; | ||
157 | /* freed after init ends here */ | ||
158 | _end = . ; | 140 | _end = . ; |
159 | 141 | ||
160 | STABS_DEBUG | 142 | STABS_DEBUG |
diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c index b0f96c0e6316..ae085ad0fba0 100644 --- a/arch/parisc/mm/init.c +++ b/arch/parisc/mm/init.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <asm/sections.h> | 32 | #include <asm/sections.h> |
33 | 33 | ||
34 | extern int data_start; | 34 | extern int data_start; |
35 | extern void parisc_kernel_start(void); /* Kernel entry point in head.S */ | ||
35 | 36 | ||
36 | #if PT_NLEVELS == 3 | 37 | #if PT_NLEVELS == 3 |
37 | /* NOTE: This layout exactly conforms to the hybrid L2/L3 page table layout | 38 | /* NOTE: This layout exactly conforms to the hybrid L2/L3 page table layout |
@@ -324,8 +325,9 @@ static void __init setup_bootmem(void) | |||
324 | reserve_bootmem_node(NODE_DATA(0), 0UL, | 325 | reserve_bootmem_node(NODE_DATA(0), 0UL, |
325 | (unsigned long)(PAGE0->mem_free + | 326 | (unsigned long)(PAGE0->mem_free + |
326 | PDC_CONSOLE_IO_IODC_SIZE), BOOTMEM_DEFAULT); | 327 | PDC_CONSOLE_IO_IODC_SIZE), BOOTMEM_DEFAULT); |
327 | reserve_bootmem_node(NODE_DATA(0), __pa((unsigned long)_text), | 328 | reserve_bootmem_node(NODE_DATA(0), __pa(KERNEL_BINARY_TEXT_START), |
328 | (unsigned long)(_end - _text), BOOTMEM_DEFAULT); | 329 | (unsigned long)(_end - KERNEL_BINARY_TEXT_START), |
330 | BOOTMEM_DEFAULT); | ||
329 | reserve_bootmem_node(NODE_DATA(0), (bootmap_start_pfn << PAGE_SHIFT), | 331 | reserve_bootmem_node(NODE_DATA(0), (bootmap_start_pfn << PAGE_SHIFT), |
330 | ((bootmap_pfn - bootmap_start_pfn) << PAGE_SHIFT), | 332 | ((bootmap_pfn - bootmap_start_pfn) << PAGE_SHIFT), |
331 | BOOTMEM_DEFAULT); | 333 | BOOTMEM_DEFAULT); |
@@ -378,6 +380,17 @@ static void __init setup_bootmem(void) | |||
378 | request_resource(&sysram_resources[0], &pdcdata_resource); | 380 | request_resource(&sysram_resources[0], &pdcdata_resource); |
379 | } | 381 | } |
380 | 382 | ||
383 | static int __init parisc_text_address(unsigned long vaddr) | ||
384 | { | ||
385 | static unsigned long head_ptr __initdata; | ||
386 | |||
387 | if (!head_ptr) | ||
388 | head_ptr = PAGE_MASK & (unsigned long) | ||
389 | dereference_function_descriptor(&parisc_kernel_start); | ||
390 | |||
391 | return core_kernel_text(vaddr) || vaddr == head_ptr; | ||
392 | } | ||
393 | |||
381 | static void __init map_pages(unsigned long start_vaddr, | 394 | static void __init map_pages(unsigned long start_vaddr, |
382 | unsigned long start_paddr, unsigned long size, | 395 | unsigned long start_paddr, unsigned long size, |
383 | pgprot_t pgprot, int force) | 396 | pgprot_t pgprot, int force) |
@@ -466,7 +479,7 @@ static void __init map_pages(unsigned long start_vaddr, | |||
466 | */ | 479 | */ |
467 | if (force) | 480 | if (force) |
468 | pte = __mk_pte(address, pgprot); | 481 | pte = __mk_pte(address, pgprot); |
469 | else if (core_kernel_text(vaddr) && | 482 | else if (parisc_text_address(vaddr) && |
470 | address != fv_addr) | 483 | address != fv_addr) |
471 | pte = __mk_pte(address, PAGE_KERNEL_EXEC); | 484 | pte = __mk_pte(address, PAGE_KERNEL_EXEC); |
472 | else | 485 | else |
@@ -632,55 +645,30 @@ EXPORT_SYMBOL(empty_zero_page); | |||
632 | 645 | ||
633 | void show_mem(unsigned int filter) | 646 | void show_mem(unsigned int filter) |
634 | { | 647 | { |
635 | int i,free = 0,total = 0,reserved = 0; | 648 | int total = 0,reserved = 0; |
636 | int shared = 0, cached = 0; | 649 | pg_data_t *pgdat; |
637 | 650 | ||
638 | printk(KERN_INFO "Mem-info:\n"); | 651 | printk(KERN_INFO "Mem-info:\n"); |
639 | show_free_areas(filter); | 652 | show_free_areas(filter); |
640 | if (filter & SHOW_MEM_FILTER_PAGE_COUNT) | ||
641 | return; | ||
642 | #ifndef CONFIG_DISCONTIGMEM | ||
643 | i = max_mapnr; | ||
644 | while (i-- > 0) { | ||
645 | total++; | ||
646 | if (PageReserved(mem_map+i)) | ||
647 | reserved++; | ||
648 | else if (PageSwapCache(mem_map+i)) | ||
649 | cached++; | ||
650 | else if (!page_count(&mem_map[i])) | ||
651 | free++; | ||
652 | else | ||
653 | shared += page_count(&mem_map[i]) - 1; | ||
654 | } | ||
655 | #else | ||
656 | for (i = 0; i < npmem_ranges; i++) { | ||
657 | int j; | ||
658 | 653 | ||
659 | for (j = node_start_pfn(i); j < node_end_pfn(i); j++) { | 654 | for_each_online_pgdat(pgdat) { |
660 | struct page *p; | 655 | unsigned long flags; |
661 | unsigned long flags; | 656 | int zoneid; |
662 | 657 | ||
663 | pgdat_resize_lock(NODE_DATA(i), &flags); | 658 | pgdat_resize_lock(pgdat, &flags); |
664 | p = nid_page_nr(i, j) - node_start_pfn(i); | 659 | for (zoneid = 0; zoneid < MAX_NR_ZONES; zoneid++) { |
665 | 660 | struct zone *zone = &pgdat->node_zones[zoneid]; | |
666 | total++; | 661 | if (!populated_zone(zone)) |
667 | if (PageReserved(p)) | 662 | continue; |
668 | reserved++; | 663 | |
669 | else if (PageSwapCache(p)) | 664 | total += zone->present_pages; |
670 | cached++; | 665 | reserved = zone->present_pages - zone->managed_pages; |
671 | else if (!page_count(p)) | 666 | } |
672 | free++; | 667 | pgdat_resize_unlock(pgdat, &flags); |
673 | else | ||
674 | shared += page_count(p) - 1; | ||
675 | pgdat_resize_unlock(NODE_DATA(i), &flags); | ||
676 | } | ||
677 | } | 668 | } |
678 | #endif | 669 | |
679 | printk(KERN_INFO "%d pages of RAM\n", total); | 670 | printk(KERN_INFO "%d pages of RAM\n", total); |
680 | printk(KERN_INFO "%d reserved pages\n", reserved); | 671 | printk(KERN_INFO "%d reserved pages\n", reserved); |
681 | printk(KERN_INFO "%d pages shared\n", shared); | ||
682 | printk(KERN_INFO "%d pages swap cached\n", cached); | ||
683 | |||
684 | 672 | ||
685 | #ifdef CONFIG_DISCONTIGMEM | 673 | #ifdef CONFIG_DISCONTIGMEM |
686 | { | 674 | { |
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index b44b52c0a8f0..b2be8e8cb5c7 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
@@ -147,6 +147,10 @@ config EARLY_PRINTK | |||
147 | bool | 147 | bool |
148 | default y | 148 | default y |
149 | 149 | ||
150 | config PANIC_TIMEOUT | ||
151 | int | ||
152 | default 180 | ||
153 | |||
150 | config COMPAT | 154 | config COMPAT |
151 | bool | 155 | bool |
152 | default y if PPC64 | 156 | default y if PPC64 |
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile index 8a2463670a5b..0f4344e6fbca 100644 --- a/arch/powerpc/Makefile +++ b/arch/powerpc/Makefile | |||
@@ -75,8 +75,10 @@ LDEMULATION := lppc | |||
75 | GNUTARGET := powerpcle | 75 | GNUTARGET := powerpcle |
76 | MULTIPLEWORD := -mno-multiple | 76 | MULTIPLEWORD := -mno-multiple |
77 | else | 77 | else |
78 | ifeq ($(call cc-option-yn,-mbig-endian),y) | ||
78 | override CC += -mbig-endian | 79 | override CC += -mbig-endian |
79 | override AS += -mbig-endian | 80 | override AS += -mbig-endian |
81 | endif | ||
80 | override LD += -EB | 82 | override LD += -EB |
81 | LDEMULATION := ppc | 83 | LDEMULATION := ppc |
82 | GNUTARGET := powerpc | 84 | GNUTARGET := powerpc |
@@ -128,7 +130,12 @@ CFLAGS-$(CONFIG_POWER5_CPU) += $(call cc-option,-mcpu=power5) | |||
128 | CFLAGS-$(CONFIG_POWER6_CPU) += $(call cc-option,-mcpu=power6) | 130 | CFLAGS-$(CONFIG_POWER6_CPU) += $(call cc-option,-mcpu=power6) |
129 | CFLAGS-$(CONFIG_POWER7_CPU) += $(call cc-option,-mcpu=power7) | 131 | CFLAGS-$(CONFIG_POWER7_CPU) += $(call cc-option,-mcpu=power7) |
130 | 132 | ||
133 | # Altivec option not allowed with e500mc64 in GCC. | ||
134 | ifeq ($(CONFIG_ALTIVEC),y) | ||
135 | E5500_CPU := -mcpu=powerpc64 | ||
136 | else | ||
131 | E5500_CPU := $(call cc-option,-mcpu=e500mc64,-mcpu=powerpc64) | 137 | E5500_CPU := $(call cc-option,-mcpu=e500mc64,-mcpu=powerpc64) |
138 | endif | ||
132 | CFLAGS-$(CONFIG_E5500_CPU) += $(E5500_CPU) | 139 | CFLAGS-$(CONFIG_E5500_CPU) += $(E5500_CPU) |
133 | CFLAGS-$(CONFIG_E6500_CPU) += $(call cc-option,-mcpu=e6500,$(E5500_CPU)) | 140 | CFLAGS-$(CONFIG_E6500_CPU) += $(call cc-option,-mcpu=e6500,$(E5500_CPU)) |
134 | 141 | ||
diff --git a/arch/powerpc/boot/dts/mpc5121.dtsi b/arch/powerpc/boot/dts/mpc5121.dtsi index bd14c00e5146..2d7cb04ac962 100644 --- a/arch/powerpc/boot/dts/mpc5121.dtsi +++ b/arch/powerpc/boot/dts/mpc5121.dtsi | |||
@@ -77,7 +77,6 @@ | |||
77 | compatible = "fsl,mpc5121-immr"; | 77 | compatible = "fsl,mpc5121-immr"; |
78 | #address-cells = <1>; | 78 | #address-cells = <1>; |
79 | #size-cells = <1>; | 79 | #size-cells = <1>; |
80 | #interrupt-cells = <2>; | ||
81 | ranges = <0x0 0x80000000 0x400000>; | 80 | ranges = <0x0 0x80000000 0x400000>; |
82 | reg = <0x80000000 0x400000>; | 81 | reg = <0x80000000 0x400000>; |
83 | bus-frequency = <66000000>; /* 66 MHz ips bus */ | 82 | bus-frequency = <66000000>; /* 66 MHz ips bus */ |
diff --git a/arch/powerpc/boot/dts/mpc5125twr.dts b/arch/powerpc/boot/dts/mpc5125twr.dts index 4177b62240c2..a618dfc13e4c 100644 --- a/arch/powerpc/boot/dts/mpc5125twr.dts +++ b/arch/powerpc/boot/dts/mpc5125twr.dts | |||
@@ -58,7 +58,6 @@ | |||
58 | compatible = "fsl,mpc5121-immr"; | 58 | compatible = "fsl,mpc5121-immr"; |
59 | #address-cells = <1>; | 59 | #address-cells = <1>; |
60 | #size-cells = <1>; | 60 | #size-cells = <1>; |
61 | #interrupt-cells = <2>; | ||
62 | ranges = <0x0 0x80000000 0x400000>; | 61 | ranges = <0x0 0x80000000 0x400000>; |
63 | reg = <0x80000000 0x400000>; | 62 | reg = <0x80000000 0x400000>; |
64 | bus-frequency = <66000000>; // 66 MHz ips bus | 63 | bus-frequency = <66000000>; // 66 MHz ips bus |
@@ -189,6 +188,10 @@ | |||
189 | reg = <0xA000 0x1000>; | 188 | reg = <0xA000 0x1000>; |
190 | }; | 189 | }; |
191 | 190 | ||
191 | // disable USB1 port | ||
192 | // TODO: | ||
193 | // correct pinmux config and fix USB3320 ulpi dependency | ||
194 | // before re-enabling it | ||
192 | usb@3000 { | 195 | usb@3000 { |
193 | compatible = "fsl,mpc5121-usb2-dr"; | 196 | compatible = "fsl,mpc5121-usb2-dr"; |
194 | reg = <0x3000 0x400>; | 197 | reg = <0x3000 0x400>; |
@@ -197,6 +200,7 @@ | |||
197 | interrupts = <43 0x8>; | 200 | interrupts = <43 0x8>; |
198 | dr_mode = "host"; | 201 | dr_mode = "host"; |
199 | phy_type = "ulpi"; | 202 | phy_type = "ulpi"; |
203 | status = "disabled"; | ||
200 | }; | 204 | }; |
201 | 205 | ||
202 | // 5125 PSCs are not 52xx or 5121 PSC compatible | 206 | // 5125 PSCs are not 52xx or 5121 PSC compatible |
diff --git a/arch/powerpc/boot/dts/xcalibur1501.dts b/arch/powerpc/boot/dts/xcalibur1501.dts index cc00f4ddd9a7..c409cbafb126 100644 --- a/arch/powerpc/boot/dts/xcalibur1501.dts +++ b/arch/powerpc/boot/dts/xcalibur1501.dts | |||
@@ -637,14 +637,14 @@ | |||
637 | tlu@2f000 { | 637 | tlu@2f000 { |
638 | compatible = "fsl,mpc8572-tlu", "fsl_tlu"; | 638 | compatible = "fsl,mpc8572-tlu", "fsl_tlu"; |
639 | reg = <0x2f000 0x1000>; | 639 | reg = <0x2f000 0x1000>; |
640 | interupts = <61 2 >; | 640 | interrupts = <61 2>; |
641 | interrupt-parent = <&mpic>; | 641 | interrupt-parent = <&mpic>; |
642 | }; | 642 | }; |
643 | 643 | ||
644 | tlu@15000 { | 644 | tlu@15000 { |
645 | compatible = "fsl,mpc8572-tlu", "fsl_tlu"; | 645 | compatible = "fsl,mpc8572-tlu", "fsl_tlu"; |
646 | reg = <0x15000 0x1000>; | 646 | reg = <0x15000 0x1000>; |
647 | interupts = <75 2>; | 647 | interrupts = <75 2>; |
648 | interrupt-parent = <&mpic>; | 648 | interrupt-parent = <&mpic>; |
649 | }; | 649 | }; |
650 | }; | 650 | }; |
diff --git a/arch/powerpc/boot/dts/xpedite5301.dts b/arch/powerpc/boot/dts/xpedite5301.dts index 53c1c6a9752f..04cb410da48b 100644 --- a/arch/powerpc/boot/dts/xpedite5301.dts +++ b/arch/powerpc/boot/dts/xpedite5301.dts | |||
@@ -547,14 +547,14 @@ | |||
547 | tlu@2f000 { | 547 | tlu@2f000 { |
548 | compatible = "fsl,mpc8572-tlu", "fsl_tlu"; | 548 | compatible = "fsl,mpc8572-tlu", "fsl_tlu"; |
549 | reg = <0x2f000 0x1000>; | 549 | reg = <0x2f000 0x1000>; |
550 | interupts = <61 2 >; | 550 | interrupts = <61 2>; |
551 | interrupt-parent = <&mpic>; | 551 | interrupt-parent = <&mpic>; |
552 | }; | 552 | }; |
553 | 553 | ||
554 | tlu@15000 { | 554 | tlu@15000 { |
555 | compatible = "fsl,mpc8572-tlu", "fsl_tlu"; | 555 | compatible = "fsl,mpc8572-tlu", "fsl_tlu"; |
556 | reg = <0x15000 0x1000>; | 556 | reg = <0x15000 0x1000>; |
557 | interupts = <75 2>; | 557 | interrupts = <75 2>; |
558 | interrupt-parent = <&mpic>; | 558 | interrupt-parent = <&mpic>; |
559 | }; | 559 | }; |
560 | }; | 560 | }; |
diff --git a/arch/powerpc/boot/dts/xpedite5330.dts b/arch/powerpc/boot/dts/xpedite5330.dts index 215225983150..73f8620f1ce7 100644 --- a/arch/powerpc/boot/dts/xpedite5330.dts +++ b/arch/powerpc/boot/dts/xpedite5330.dts | |||
@@ -583,14 +583,14 @@ | |||
583 | tlu@2f000 { | 583 | tlu@2f000 { |
584 | compatible = "fsl,mpc8572-tlu", "fsl_tlu"; | 584 | compatible = "fsl,mpc8572-tlu", "fsl_tlu"; |
585 | reg = <0x2f000 0x1000>; | 585 | reg = <0x2f000 0x1000>; |
586 | interupts = <61 2 >; | 586 | interrupts = <61 2>; |
587 | interrupt-parent = <&mpic>; | 587 | interrupt-parent = <&mpic>; |
588 | }; | 588 | }; |
589 | 589 | ||
590 | tlu@15000 { | 590 | tlu@15000 { |
591 | compatible = "fsl,mpc8572-tlu", "fsl_tlu"; | 591 | compatible = "fsl,mpc8572-tlu", "fsl_tlu"; |
592 | reg = <0x15000 0x1000>; | 592 | reg = <0x15000 0x1000>; |
593 | interupts = <75 2>; | 593 | interrupts = <75 2>; |
594 | interrupt-parent = <&mpic>; | 594 | interrupt-parent = <&mpic>; |
595 | }; | 595 | }; |
596 | }; | 596 | }; |
diff --git a/arch/powerpc/boot/dts/xpedite5370.dts b/arch/powerpc/boot/dts/xpedite5370.dts index 11dbda10d756..cd0ea2b99362 100644 --- a/arch/powerpc/boot/dts/xpedite5370.dts +++ b/arch/powerpc/boot/dts/xpedite5370.dts | |||
@@ -545,14 +545,14 @@ | |||
545 | tlu@2f000 { | 545 | tlu@2f000 { |
546 | compatible = "fsl,mpc8572-tlu", "fsl_tlu"; | 546 | compatible = "fsl,mpc8572-tlu", "fsl_tlu"; |
547 | reg = <0x2f000 0x1000>; | 547 | reg = <0x2f000 0x1000>; |
548 | interupts = <61 2 >; | 548 | interrupts = <61 2>; |
549 | interrupt-parent = <&mpic>; | 549 | interrupt-parent = <&mpic>; |
550 | }; | 550 | }; |
551 | 551 | ||
552 | tlu@15000 { | 552 | tlu@15000 { |
553 | compatible = "fsl,mpc8572-tlu", "fsl_tlu"; | 553 | compatible = "fsl,mpc8572-tlu", "fsl_tlu"; |
554 | reg = <0x15000 0x1000>; | 554 | reg = <0x15000 0x1000>; |
555 | interupts = <75 2>; | 555 | interrupts = <75 2>; |
556 | interrupt-parent = <&mpic>; | 556 | interrupt-parent = <&mpic>; |
557 | }; | 557 | }; |
558 | }; | 558 | }; |
diff --git a/arch/powerpc/boot/util.S b/arch/powerpc/boot/util.S index 5143228e3e5f..6636b1d7821b 100644 --- a/arch/powerpc/boot/util.S +++ b/arch/powerpc/boot/util.S | |||
@@ -71,18 +71,32 @@ udelay: | |||
71 | add r4,r4,r5 | 71 | add r4,r4,r5 |
72 | addi r4,r4,-1 | 72 | addi r4,r4,-1 |
73 | divw r4,r4,r5 /* BUS ticks */ | 73 | divw r4,r4,r5 /* BUS ticks */ |
74 | #ifdef CONFIG_8xx | ||
75 | 1: mftbu r5 | ||
76 | mftb r6 | ||
77 | mftbu r7 | ||
78 | #else | ||
74 | 1: mfspr r5, SPRN_TBRU | 79 | 1: mfspr r5, SPRN_TBRU |
75 | mfspr r6, SPRN_TBRL | 80 | mfspr r6, SPRN_TBRL |
76 | mfspr r7, SPRN_TBRU | 81 | mfspr r7, SPRN_TBRU |
82 | #endif | ||
77 | cmpw 0,r5,r7 | 83 | cmpw 0,r5,r7 |
78 | bne 1b /* Get [synced] base time */ | 84 | bne 1b /* Get [synced] base time */ |
79 | addc r9,r6,r4 /* Compute end time */ | 85 | addc r9,r6,r4 /* Compute end time */ |
80 | addze r8,r5 | 86 | addze r8,r5 |
87 | #ifdef CONFIG_8xx | ||
88 | 2: mftbu r5 | ||
89 | #else | ||
81 | 2: mfspr r5, SPRN_TBRU | 90 | 2: mfspr r5, SPRN_TBRU |
91 | #endif | ||
82 | cmpw 0,r5,r8 | 92 | cmpw 0,r5,r8 |
83 | blt 2b | 93 | blt 2b |
84 | bgt 3f | 94 | bgt 3f |
95 | #ifdef CONFIG_8xx | ||
96 | mftb r6 | ||
97 | #else | ||
85 | mfspr r6, SPRN_TBRL | 98 | mfspr r6, SPRN_TBRL |
99 | #endif | ||
86 | cmpw 0,r6,r9 | 100 | cmpw 0,r6,r9 |
87 | blt 2b | 101 | blt 2b |
88 | 3: blr | 102 | 3: blr |
diff --git a/arch/powerpc/configs/52xx/cm5200_defconfig b/arch/powerpc/configs/52xx/cm5200_defconfig index 69b57daf402e..0b88c7b30bb9 100644 --- a/arch/powerpc/configs/52xx/cm5200_defconfig +++ b/arch/powerpc/configs/52xx/cm5200_defconfig | |||
@@ -12,7 +12,6 @@ CONFIG_EXPERT=y | |||
12 | CONFIG_PPC_MPC52xx=y | 12 | CONFIG_PPC_MPC52xx=y |
13 | CONFIG_PPC_MPC5200_SIMPLE=y | 13 | CONFIG_PPC_MPC5200_SIMPLE=y |
14 | # CONFIG_PPC_PMAC is not set | 14 | # CONFIG_PPC_PMAC is not set |
15 | CONFIG_PPC_BESTCOMM=y | ||
16 | CONFIG_SPARSE_IRQ=y | 15 | CONFIG_SPARSE_IRQ=y |
17 | CONFIG_PM=y | 16 | CONFIG_PM=y |
18 | # CONFIG_PCI is not set | 17 | # CONFIG_PCI is not set |
@@ -71,6 +70,8 @@ CONFIG_USB_DEVICEFS=y | |||
71 | CONFIG_USB_OHCI_HCD=y | 70 | CONFIG_USB_OHCI_HCD=y |
72 | CONFIG_USB_OHCI_HCD_PPC_OF_BE=y | 71 | CONFIG_USB_OHCI_HCD_PPC_OF_BE=y |
73 | CONFIG_USB_STORAGE=y | 72 | CONFIG_USB_STORAGE=y |
73 | CONFIG_DMADEVICES=y | ||
74 | CONFIG_PPC_BESTCOMM=y | ||
74 | CONFIG_EXT2_FS=y | 75 | CONFIG_EXT2_FS=y |
75 | CONFIG_EXT3_FS=y | 76 | CONFIG_EXT3_FS=y |
76 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set | 77 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set |
diff --git a/arch/powerpc/configs/52xx/lite5200b_defconfig b/arch/powerpc/configs/52xx/lite5200b_defconfig index f3638ae0a627..104a332e79ab 100644 --- a/arch/powerpc/configs/52xx/lite5200b_defconfig +++ b/arch/powerpc/configs/52xx/lite5200b_defconfig | |||
@@ -15,7 +15,6 @@ CONFIG_PPC_MPC52xx=y | |||
15 | CONFIG_PPC_MPC5200_SIMPLE=y | 15 | CONFIG_PPC_MPC5200_SIMPLE=y |
16 | CONFIG_PPC_LITE5200=y | 16 | CONFIG_PPC_LITE5200=y |
17 | # CONFIG_PPC_PMAC is not set | 17 | # CONFIG_PPC_PMAC is not set |
18 | CONFIG_PPC_BESTCOMM=y | ||
19 | CONFIG_NO_HZ=y | 18 | CONFIG_NO_HZ=y |
20 | CONFIG_HIGH_RES_TIMERS=y | 19 | CONFIG_HIGH_RES_TIMERS=y |
21 | CONFIG_SPARSE_IRQ=y | 20 | CONFIG_SPARSE_IRQ=y |
@@ -59,6 +58,8 @@ CONFIG_I2C_CHARDEV=y | |||
59 | CONFIG_I2C_MPC=y | 58 | CONFIG_I2C_MPC=y |
60 | # CONFIG_HWMON is not set | 59 | # CONFIG_HWMON is not set |
61 | CONFIG_VIDEO_OUTPUT_CONTROL=m | 60 | CONFIG_VIDEO_OUTPUT_CONTROL=m |
61 | CONFIG_DMADEVICES=y | ||
62 | CONFIG_PPC_BESTCOMM=y | ||
62 | CONFIG_EXT2_FS=y | 63 | CONFIG_EXT2_FS=y |
63 | CONFIG_EXT3_FS=y | 64 | CONFIG_EXT3_FS=y |
64 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set | 65 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set |
diff --git a/arch/powerpc/configs/52xx/motionpro_defconfig b/arch/powerpc/configs/52xx/motionpro_defconfig index 0c7de9620ea6..0d13ad7e4478 100644 --- a/arch/powerpc/configs/52xx/motionpro_defconfig +++ b/arch/powerpc/configs/52xx/motionpro_defconfig | |||
@@ -12,7 +12,6 @@ CONFIG_EXPERT=y | |||
12 | CONFIG_PPC_MPC52xx=y | 12 | CONFIG_PPC_MPC52xx=y |
13 | CONFIG_PPC_MPC5200_SIMPLE=y | 13 | CONFIG_PPC_MPC5200_SIMPLE=y |
14 | # CONFIG_PPC_PMAC is not set | 14 | # CONFIG_PPC_PMAC is not set |
15 | CONFIG_PPC_BESTCOMM=y | ||
16 | CONFIG_SPARSE_IRQ=y | 15 | CONFIG_SPARSE_IRQ=y |
17 | CONFIG_PM=y | 16 | CONFIG_PM=y |
18 | # CONFIG_PCI is not set | 17 | # CONFIG_PCI is not set |
@@ -84,6 +83,8 @@ CONFIG_LEDS_TRIGGERS=y | |||
84 | CONFIG_LEDS_TRIGGER_TIMER=y | 83 | CONFIG_LEDS_TRIGGER_TIMER=y |
85 | CONFIG_RTC_CLASS=y | 84 | CONFIG_RTC_CLASS=y |
86 | CONFIG_RTC_DRV_DS1307=y | 85 | CONFIG_RTC_DRV_DS1307=y |
86 | CONFIG_DMADEVICES=y | ||
87 | CONFIG_PPC_BESTCOMM=y | ||
87 | CONFIG_EXT2_FS=y | 88 | CONFIG_EXT2_FS=y |
88 | CONFIG_EXT3_FS=y | 89 | CONFIG_EXT3_FS=y |
89 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set | 90 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set |
diff --git a/arch/powerpc/configs/52xx/pcm030_defconfig b/arch/powerpc/configs/52xx/pcm030_defconfig index 22e719575c60..430aa182fa1c 100644 --- a/arch/powerpc/configs/52xx/pcm030_defconfig +++ b/arch/powerpc/configs/52xx/pcm030_defconfig | |||
@@ -21,7 +21,6 @@ CONFIG_MODULE_UNLOAD=y | |||
21 | CONFIG_PPC_MPC52xx=y | 21 | CONFIG_PPC_MPC52xx=y |
22 | CONFIG_PPC_MPC5200_SIMPLE=y | 22 | CONFIG_PPC_MPC5200_SIMPLE=y |
23 | # CONFIG_PPC_PMAC is not set | 23 | # CONFIG_PPC_PMAC is not set |
24 | CONFIG_PPC_BESTCOMM=y | ||
25 | CONFIG_NO_HZ=y | 24 | CONFIG_NO_HZ=y |
26 | CONFIG_HIGH_RES_TIMERS=y | 25 | CONFIG_HIGH_RES_TIMERS=y |
27 | CONFIG_HZ_100=y | 26 | CONFIG_HZ_100=y |
@@ -87,6 +86,8 @@ CONFIG_USB_OHCI_HCD_PPC_OF_BE=y | |||
87 | CONFIG_USB_STORAGE=m | 86 | CONFIG_USB_STORAGE=m |
88 | CONFIG_RTC_CLASS=y | 87 | CONFIG_RTC_CLASS=y |
89 | CONFIG_RTC_DRV_PCF8563=m | 88 | CONFIG_RTC_DRV_PCF8563=m |
89 | CONFIG_DMADEVICES=y | ||
90 | CONFIG_PPC_BESTCOMM=y | ||
90 | CONFIG_EXT2_FS=m | 91 | CONFIG_EXT2_FS=m |
91 | CONFIG_EXT3_FS=m | 92 | CONFIG_EXT3_FS=m |
92 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set | 93 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set |
diff --git a/arch/powerpc/configs/52xx/tqm5200_defconfig b/arch/powerpc/configs/52xx/tqm5200_defconfig index 716a37be16e3..7af4c5bb7c63 100644 --- a/arch/powerpc/configs/52xx/tqm5200_defconfig +++ b/arch/powerpc/configs/52xx/tqm5200_defconfig | |||
@@ -17,7 +17,6 @@ CONFIG_PPC_MPC52xx=y | |||
17 | CONFIG_PPC_MPC5200_SIMPLE=y | 17 | CONFIG_PPC_MPC5200_SIMPLE=y |
18 | CONFIG_PPC_MPC5200_BUGFIX=y | 18 | CONFIG_PPC_MPC5200_BUGFIX=y |
19 | # CONFIG_PPC_PMAC is not set | 19 | # CONFIG_PPC_PMAC is not set |
20 | CONFIG_PPC_BESTCOMM=y | ||
21 | CONFIG_PM=y | 20 | CONFIG_PM=y |
22 | # CONFIG_PCI is not set | 21 | # CONFIG_PCI is not set |
23 | CONFIG_NET=y | 22 | CONFIG_NET=y |
@@ -86,6 +85,8 @@ CONFIG_USB_STORAGE=y | |||
86 | CONFIG_RTC_CLASS=y | 85 | CONFIG_RTC_CLASS=y |
87 | CONFIG_RTC_DRV_DS1307=y | 86 | CONFIG_RTC_DRV_DS1307=y |
88 | CONFIG_RTC_DRV_DS1374=y | 87 | CONFIG_RTC_DRV_DS1374=y |
88 | CONFIG_DMADEVICES=y | ||
89 | CONFIG_PPC_BESTCOMM=y | ||
89 | CONFIG_EXT2_FS=y | 90 | CONFIG_EXT2_FS=y |
90 | CONFIG_EXT3_FS=y | 91 | CONFIG_EXT3_FS=y |
91 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set | 92 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set |
diff --git a/arch/powerpc/configs/mpc5200_defconfig b/arch/powerpc/configs/mpc5200_defconfig index 6640a35bebb7..8b682d1cf4d6 100644 --- a/arch/powerpc/configs/mpc5200_defconfig +++ b/arch/powerpc/configs/mpc5200_defconfig | |||
@@ -15,7 +15,6 @@ CONFIG_PPC_MEDIA5200=y | |||
15 | CONFIG_PPC_MPC5200_BUGFIX=y | 15 | CONFIG_PPC_MPC5200_BUGFIX=y |
16 | CONFIG_PPC_MPC5200_LPBFIFO=m | 16 | CONFIG_PPC_MPC5200_LPBFIFO=m |
17 | # CONFIG_PPC_PMAC is not set | 17 | # CONFIG_PPC_PMAC is not set |
18 | CONFIG_PPC_BESTCOMM=y | ||
19 | CONFIG_SIMPLE_GPIO=y | 18 | CONFIG_SIMPLE_GPIO=y |
20 | CONFIG_NO_HZ=y | 19 | CONFIG_NO_HZ=y |
21 | CONFIG_HIGH_RES_TIMERS=y | 20 | CONFIG_HIGH_RES_TIMERS=y |
@@ -125,6 +124,8 @@ CONFIG_RTC_CLASS=y | |||
125 | CONFIG_RTC_DRV_DS1307=y | 124 | CONFIG_RTC_DRV_DS1307=y |
126 | CONFIG_RTC_DRV_DS1374=y | 125 | CONFIG_RTC_DRV_DS1374=y |
127 | CONFIG_RTC_DRV_PCF8563=m | 126 | CONFIG_RTC_DRV_PCF8563=m |
127 | CONFIG_DMADEVICES=y | ||
128 | CONFIG_PPC_BESTCOMM=y | ||
128 | CONFIG_EXT2_FS=y | 129 | CONFIG_EXT2_FS=y |
129 | CONFIG_EXT3_FS=y | 130 | CONFIG_EXT3_FS=y |
130 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set | 131 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set |
diff --git a/arch/powerpc/configs/pasemi_defconfig b/arch/powerpc/configs/pasemi_defconfig index bd8a6f71944f..cec044a3ff69 100644 --- a/arch/powerpc/configs/pasemi_defconfig +++ b/arch/powerpc/configs/pasemi_defconfig | |||
@@ -2,7 +2,6 @@ CONFIG_PPC64=y | |||
2 | CONFIG_ALTIVEC=y | 2 | CONFIG_ALTIVEC=y |
3 | CONFIG_SMP=y | 3 | CONFIG_SMP=y |
4 | CONFIG_NR_CPUS=2 | 4 | CONFIG_NR_CPUS=2 |
5 | CONFIG_EXPERIMENTAL=y | ||
6 | CONFIG_SYSVIPC=y | 5 | CONFIG_SYSVIPC=y |
7 | CONFIG_NO_HZ=y | 6 | CONFIG_NO_HZ=y |
8 | CONFIG_HIGH_RES_TIMERS=y | 7 | CONFIG_HIGH_RES_TIMERS=y |
@@ -45,8 +44,9 @@ CONFIG_INET_AH=y | |||
45 | CONFIG_INET_ESP=y | 44 | CONFIG_INET_ESP=y |
46 | # CONFIG_IPV6 is not set | 45 | # CONFIG_IPV6 is not set |
47 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 46 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
47 | CONFIG_DEVTMPFS=y | ||
48 | CONFIG_DEVTMPFS_MOUNT=y | ||
48 | CONFIG_MTD=y | 49 | CONFIG_MTD=y |
49 | CONFIG_MTD_CHAR=y | ||
50 | CONFIG_MTD_BLOCK=y | 50 | CONFIG_MTD_BLOCK=y |
51 | CONFIG_MTD_SLRAM=y | 51 | CONFIG_MTD_SLRAM=y |
52 | CONFIG_MTD_PHRAM=y | 52 | CONFIG_MTD_PHRAM=y |
@@ -88,7 +88,6 @@ CONFIG_BLK_DEV_DM=y | |||
88 | CONFIG_DM_CRYPT=y | 88 | CONFIG_DM_CRYPT=y |
89 | CONFIG_NETDEVICES=y | 89 | CONFIG_NETDEVICES=y |
90 | CONFIG_DUMMY=y | 90 | CONFIG_DUMMY=y |
91 | CONFIG_MII=y | ||
92 | CONFIG_TIGON3=y | 91 | CONFIG_TIGON3=y |
93 | CONFIG_E1000=y | 92 | CONFIG_E1000=y |
94 | CONFIG_PASEMI_MAC=y | 93 | CONFIG_PASEMI_MAC=y |
@@ -174,8 +173,8 @@ CONFIG_NLS_CODEPAGE_437=y | |||
174 | CONFIG_NLS_ISO8859_1=y | 173 | CONFIG_NLS_ISO8859_1=y |
175 | CONFIG_CRC_CCITT=y | 174 | CONFIG_CRC_CCITT=y |
176 | CONFIG_PRINTK_TIME=y | 175 | CONFIG_PRINTK_TIME=y |
177 | CONFIG_MAGIC_SYSRQ=y | ||
178 | CONFIG_DEBUG_FS=y | 176 | CONFIG_DEBUG_FS=y |
177 | CONFIG_MAGIC_SYSRQ=y | ||
179 | CONFIG_DEBUG_KERNEL=y | 178 | CONFIG_DEBUG_KERNEL=y |
180 | CONFIG_DETECT_HUNG_TASK=y | 179 | CONFIG_DETECT_HUNG_TASK=y |
181 | # CONFIG_SCHED_DEBUG is not set | 180 | # CONFIG_SCHED_DEBUG is not set |
diff --git a/arch/powerpc/include/asm/barrier.h b/arch/powerpc/include/asm/barrier.h index ae782254e731..f89da808ce31 100644 --- a/arch/powerpc/include/asm/barrier.h +++ b/arch/powerpc/include/asm/barrier.h | |||
@@ -45,11 +45,15 @@ | |||
45 | # define SMPWMB eieio | 45 | # define SMPWMB eieio |
46 | #endif | 46 | #endif |
47 | 47 | ||
48 | #define __lwsync() __asm__ __volatile__ (stringify_in_c(LWSYNC) : : :"memory") | ||
49 | |||
48 | #define smp_mb() mb() | 50 | #define smp_mb() mb() |
49 | #define smp_rmb() __asm__ __volatile__ (stringify_in_c(LWSYNC) : : :"memory") | 51 | #define smp_rmb() __lwsync() |
50 | #define smp_wmb() __asm__ __volatile__ (stringify_in_c(SMPWMB) : : :"memory") | 52 | #define smp_wmb() __asm__ __volatile__ (stringify_in_c(SMPWMB) : : :"memory") |
51 | #define smp_read_barrier_depends() read_barrier_depends() | 53 | #define smp_read_barrier_depends() read_barrier_depends() |
52 | #else | 54 | #else |
55 | #define __lwsync() barrier() | ||
56 | |||
53 | #define smp_mb() barrier() | 57 | #define smp_mb() barrier() |
54 | #define smp_rmb() barrier() | 58 | #define smp_rmb() barrier() |
55 | #define smp_wmb() barrier() | 59 | #define smp_wmb() barrier() |
@@ -65,4 +69,19 @@ | |||
65 | #define data_barrier(x) \ | 69 | #define data_barrier(x) \ |
66 | asm volatile("twi 0,%0,0; isync" : : "r" (x) : "memory"); | 70 | asm volatile("twi 0,%0,0; isync" : : "r" (x) : "memory"); |
67 | 71 | ||
72 | #define smp_store_release(p, v) \ | ||
73 | do { \ | ||
74 | compiletime_assert_atomic_type(*p); \ | ||
75 | __lwsync(); \ | ||
76 | ACCESS_ONCE(*p) = (v); \ | ||
77 | } while (0) | ||
78 | |||
79 | #define smp_load_acquire(p) \ | ||
80 | ({ \ | ||
81 | typeof(*p) ___p1 = ACCESS_ONCE(*p); \ | ||
82 | compiletime_assert_atomic_type(*p); \ | ||
83 | __lwsync(); \ | ||
84 | ___p1; \ | ||
85 | }) | ||
86 | |||
68 | #endif /* _ASM_POWERPC_BARRIER_H */ | 87 | #endif /* _ASM_POWERPC_BARRIER_H */ |
diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h index 894662a5d4d5..243ce69ad685 100644 --- a/arch/powerpc/include/asm/exception-64s.h +++ b/arch/powerpc/include/asm/exception-64s.h | |||
@@ -284,7 +284,7 @@ do_kvm_##n: \ | |||
284 | subi r1,r1,INT_FRAME_SIZE; /* alloc frame on kernel stack */ \ | 284 | subi r1,r1,INT_FRAME_SIZE; /* alloc frame on kernel stack */ \ |
285 | beq- 1f; \ | 285 | beq- 1f; \ |
286 | ld r1,PACAKSAVE(r13); /* kernel stack to use */ \ | 286 | ld r1,PACAKSAVE(r13); /* kernel stack to use */ \ |
287 | 1: cmpdi cr1,r1,0; /* check if r1 is in userspace */ \ | 287 | 1: cmpdi cr1,r1,-INT_FRAME_SIZE; /* check if r1 is in userspace */ \ |
288 | blt+ cr1,3f; /* abort if it is */ \ | 288 | blt+ cr1,3f; /* abort if it is */ \ |
289 | li r1,(n); /* will be reloaded later */ \ | 289 | li r1,(n); /* will be reloaded later */ \ |
290 | sth r1,PACA_TRAP_SAVE(r13); \ | 290 | sth r1,PACA_TRAP_SAVE(r13); \ |
diff --git a/arch/powerpc/include/asm/kvm_book3s.h b/arch/powerpc/include/asm/kvm_book3s.h index 4a594b76674d..bc23b1ba7980 100644 --- a/arch/powerpc/include/asm/kvm_book3s.h +++ b/arch/powerpc/include/asm/kvm_book3s.h | |||
@@ -192,6 +192,10 @@ extern void kvmppc_load_up_vsx(void); | |||
192 | extern u32 kvmppc_alignment_dsisr(struct kvm_vcpu *vcpu, unsigned int inst); | 192 | extern u32 kvmppc_alignment_dsisr(struct kvm_vcpu *vcpu, unsigned int inst); |
193 | extern ulong kvmppc_alignment_dar(struct kvm_vcpu *vcpu, unsigned int inst); | 193 | extern ulong kvmppc_alignment_dar(struct kvm_vcpu *vcpu, unsigned int inst); |
194 | extern int kvmppc_h_pr(struct kvm_vcpu *vcpu, unsigned long cmd); | 194 | extern int kvmppc_h_pr(struct kvm_vcpu *vcpu, unsigned long cmd); |
195 | extern void kvmppc_copy_to_svcpu(struct kvmppc_book3s_shadow_vcpu *svcpu, | ||
196 | struct kvm_vcpu *vcpu); | ||
197 | extern void kvmppc_copy_from_svcpu(struct kvm_vcpu *vcpu, | ||
198 | struct kvmppc_book3s_shadow_vcpu *svcpu); | ||
195 | 199 | ||
196 | static inline struct kvmppc_vcpu_book3s *to_book3s(struct kvm_vcpu *vcpu) | 200 | static inline struct kvmppc_vcpu_book3s *to_book3s(struct kvm_vcpu *vcpu) |
197 | { | 201 | { |
diff --git a/arch/powerpc/include/asm/kvm_book3s_asm.h b/arch/powerpc/include/asm/kvm_book3s_asm.h index 0bd9348a4db9..192917d2239c 100644 --- a/arch/powerpc/include/asm/kvm_book3s_asm.h +++ b/arch/powerpc/include/asm/kvm_book3s_asm.h | |||
@@ -79,6 +79,7 @@ struct kvmppc_host_state { | |||
79 | ulong vmhandler; | 79 | ulong vmhandler; |
80 | ulong scratch0; | 80 | ulong scratch0; |
81 | ulong scratch1; | 81 | ulong scratch1; |
82 | ulong scratch2; | ||
82 | u8 in_guest; | 83 | u8 in_guest; |
83 | u8 restore_hid5; | 84 | u8 restore_hid5; |
84 | u8 napping; | 85 | u8 napping; |
@@ -106,6 +107,7 @@ struct kvmppc_host_state { | |||
106 | }; | 107 | }; |
107 | 108 | ||
108 | struct kvmppc_book3s_shadow_vcpu { | 109 | struct kvmppc_book3s_shadow_vcpu { |
110 | bool in_use; | ||
109 | ulong gpr[14]; | 111 | ulong gpr[14]; |
110 | u32 cr; | 112 | u32 cr; |
111 | u32 xer; | 113 | u32 xer; |
diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h index 033c06be1d84..7bdcf340016c 100644 --- a/arch/powerpc/include/asm/opal.h +++ b/arch/powerpc/include/asm/opal.h | |||
@@ -720,13 +720,13 @@ int64_t opal_pci_next_error(uint64_t phb_id, uint64_t *first_frozen_pe, | |||
720 | int64_t opal_pci_poll(uint64_t phb_id); | 720 | int64_t opal_pci_poll(uint64_t phb_id); |
721 | int64_t opal_return_cpu(void); | 721 | int64_t opal_return_cpu(void); |
722 | 722 | ||
723 | int64_t opal_xscom_read(uint32_t gcid, uint32_t pcb_addr, uint64_t *val); | 723 | int64_t opal_xscom_read(uint32_t gcid, uint32_t pcb_addr, __be64 *val); |
724 | int64_t opal_xscom_write(uint32_t gcid, uint32_t pcb_addr, uint64_t val); | 724 | int64_t opal_xscom_write(uint32_t gcid, uint32_t pcb_addr, uint64_t val); |
725 | 725 | ||
726 | int64_t opal_lpc_write(uint32_t chip_id, enum OpalLPCAddressType addr_type, | 726 | int64_t opal_lpc_write(uint32_t chip_id, enum OpalLPCAddressType addr_type, |
727 | uint32_t addr, uint32_t data, uint32_t sz); | 727 | uint32_t addr, uint32_t data, uint32_t sz); |
728 | int64_t opal_lpc_read(uint32_t chip_id, enum OpalLPCAddressType addr_type, | 728 | int64_t opal_lpc_read(uint32_t chip_id, enum OpalLPCAddressType addr_type, |
729 | uint32_t addr, uint32_t *data, uint32_t sz); | 729 | uint32_t addr, __be32 *data, uint32_t sz); |
730 | int64_t opal_validate_flash(uint64_t buffer, uint32_t *size, uint32_t *result); | 730 | int64_t opal_validate_flash(uint64_t buffer, uint32_t *size, uint32_t *result); |
731 | int64_t opal_manage_flash(uint8_t op); | 731 | int64_t opal_manage_flash(uint8_t op); |
732 | int64_t opal_update_flash(uint64_t blk_list); | 732 | int64_t opal_update_flash(uint64_t blk_list); |
diff --git a/arch/powerpc/include/asm/pgalloc-32.h b/arch/powerpc/include/asm/pgalloc-32.h index 27b2386f738a..842846c1b711 100644 --- a/arch/powerpc/include/asm/pgalloc-32.h +++ b/arch/powerpc/include/asm/pgalloc-32.h | |||
@@ -84,10 +84,8 @@ static inline void pgtable_free_tlb(struct mmu_gather *tlb, | |||
84 | static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table, | 84 | static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table, |
85 | unsigned long address) | 85 | unsigned long address) |
86 | { | 86 | { |
87 | struct page *page = page_address(table); | ||
88 | |||
89 | tlb_flush_pgtable(tlb, address); | 87 | tlb_flush_pgtable(tlb, address); |
90 | pgtable_page_dtor(page); | 88 | pgtable_page_dtor(table); |
91 | pgtable_free_tlb(tlb, page, 0); | 89 | pgtable_free_tlb(tlb, page_address(table), 0); |
92 | } | 90 | } |
93 | #endif /* _ASM_POWERPC_PGALLOC_32_H */ | 91 | #endif /* _ASM_POWERPC_PGALLOC_32_H */ |
diff --git a/arch/powerpc/include/asm/pgalloc-64.h b/arch/powerpc/include/asm/pgalloc-64.h index 16cb92d215d2..4b0be20fcbfd 100644 --- a/arch/powerpc/include/asm/pgalloc-64.h +++ b/arch/powerpc/include/asm/pgalloc-64.h | |||
@@ -16,6 +16,7 @@ struct vmemmap_backing { | |||
16 | unsigned long phys; | 16 | unsigned long phys; |
17 | unsigned long virt_addr; | 17 | unsigned long virt_addr; |
18 | }; | 18 | }; |
19 | extern struct vmemmap_backing *vmemmap_list; | ||
19 | 20 | ||
20 | /* | 21 | /* |
21 | * Functions that deal with pagetables that could be at any level of | 22 | * Functions that deal with pagetables that could be at any level of |
@@ -147,11 +148,9 @@ static inline void pgtable_free_tlb(struct mmu_gather *tlb, | |||
147 | static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table, | 148 | static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table, |
148 | unsigned long address) | 149 | unsigned long address) |
149 | { | 150 | { |
150 | struct page *page = page_address(table); | ||
151 | |||
152 | tlb_flush_pgtable(tlb, address); | 151 | tlb_flush_pgtable(tlb, address); |
153 | pgtable_page_dtor(page); | 152 | pgtable_page_dtor(table); |
154 | pgtable_free_tlb(tlb, page, 0); | 153 | pgtable_free_tlb(tlb, page_address(table), 0); |
155 | } | 154 | } |
156 | 155 | ||
157 | #else /* if CONFIG_PPC_64K_PAGES */ | 156 | #else /* if CONFIG_PPC_64K_PAGES */ |
diff --git a/arch/powerpc/include/asm/ppc_asm.h b/arch/powerpc/include/asm/ppc_asm.h index 3c1acc31a092..f595b98079ee 100644 --- a/arch/powerpc/include/asm/ppc_asm.h +++ b/arch/powerpc/include/asm/ppc_asm.h | |||
@@ -366,6 +366,8 @@ BEGIN_FTR_SECTION_NESTED(96); \ | |||
366 | cmpwi dest,0; \ | 366 | cmpwi dest,0; \ |
367 | beq- 90b; \ | 367 | beq- 90b; \ |
368 | END_FTR_SECTION_NESTED(CPU_FTR_CELL_TB_BUG, CPU_FTR_CELL_TB_BUG, 96) | 368 | END_FTR_SECTION_NESTED(CPU_FTR_CELL_TB_BUG, CPU_FTR_CELL_TB_BUG, 96) |
369 | #elif defined(CONFIG_8xx) | ||
370 | #define MFTB(dest) mftb dest | ||
369 | #else | 371 | #else |
370 | #define MFTB(dest) mfspr dest, SPRN_TBRL | 372 | #define MFTB(dest) mfspr dest, SPRN_TBRL |
371 | #endif | 373 | #endif |
diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h index 5c45787d551e..fa8388ed94c5 100644 --- a/arch/powerpc/include/asm/reg.h +++ b/arch/powerpc/include/asm/reg.h | |||
@@ -1174,12 +1174,19 @@ | |||
1174 | 1174 | ||
1175 | #else /* __powerpc64__ */ | 1175 | #else /* __powerpc64__ */ |
1176 | 1176 | ||
1177 | #if defined(CONFIG_8xx) | ||
1178 | #define mftbl() ({unsigned long rval; \ | ||
1179 | asm volatile("mftbl %0" : "=r" (rval)); rval;}) | ||
1180 | #define mftbu() ({unsigned long rval; \ | ||
1181 | asm volatile("mftbu %0" : "=r" (rval)); rval;}) | ||
1182 | #else | ||
1177 | #define mftbl() ({unsigned long rval; \ | 1183 | #define mftbl() ({unsigned long rval; \ |
1178 | asm volatile("mfspr %0, %1" : "=r" (rval) : \ | 1184 | asm volatile("mfspr %0, %1" : "=r" (rval) : \ |
1179 | "i" (SPRN_TBRL)); rval;}) | 1185 | "i" (SPRN_TBRL)); rval;}) |
1180 | #define mftbu() ({unsigned long rval; \ | 1186 | #define mftbu() ({unsigned long rval; \ |
1181 | asm volatile("mfspr %0, %1" : "=r" (rval) : \ | 1187 | asm volatile("mfspr %0, %1" : "=r" (rval) : \ |
1182 | "i" (SPRN_TBRU)); rval;}) | 1188 | "i" (SPRN_TBRU)); rval;}) |
1189 | #endif | ||
1183 | #endif /* !__powerpc64__ */ | 1190 | #endif /* !__powerpc64__ */ |
1184 | 1191 | ||
1185 | #define mttbl(v) asm volatile("mttbl %0":: "r"(v)) | 1192 | #define mttbl(v) asm volatile("mttbl %0":: "r"(v)) |
diff --git a/arch/powerpc/include/asm/setup.h b/arch/powerpc/include/asm/setup.h index 703a8412dac2..11ba86e17631 100644 --- a/arch/powerpc/include/asm/setup.h +++ b/arch/powerpc/include/asm/setup.h | |||
@@ -26,6 +26,7 @@ extern void reloc_got2(unsigned long); | |||
26 | void check_for_initrd(void); | 26 | void check_for_initrd(void); |
27 | void do_init_bootmem(void); | 27 | void do_init_bootmem(void); |
28 | void setup_panic(void); | 28 | void setup_panic(void); |
29 | #define ARCH_PANIC_TIMEOUT 180 | ||
29 | 30 | ||
30 | #endif /* !__ASSEMBLY__ */ | 31 | #endif /* !__ASSEMBLY__ */ |
31 | 32 | ||
diff --git a/arch/powerpc/include/asm/spinlock.h b/arch/powerpc/include/asm/spinlock.h index 5f54a744dcc5..f6e78d63fb6a 100644 --- a/arch/powerpc/include/asm/spinlock.h +++ b/arch/powerpc/include/asm/spinlock.h | |||
@@ -28,6 +28,8 @@ | |||
28 | #include <asm/synch.h> | 28 | #include <asm/synch.h> |
29 | #include <asm/ppc-opcode.h> | 29 | #include <asm/ppc-opcode.h> |
30 | 30 | ||
31 | #define smp_mb__after_unlock_lock() smp_mb() /* Full ordering for lock. */ | ||
32 | |||
31 | #define arch_spin_is_locked(x) ((x)->slock != 0) | 33 | #define arch_spin_is_locked(x) ((x)->slock != 0) |
32 | 34 | ||
33 | #ifdef CONFIG_PPC64 | 35 | #ifdef CONFIG_PPC64 |
diff --git a/arch/powerpc/include/asm/switch_to.h b/arch/powerpc/include/asm/switch_to.h index 9ee12610af02..aace90547614 100644 --- a/arch/powerpc/include/asm/switch_to.h +++ b/arch/powerpc/include/asm/switch_to.h | |||
@@ -35,7 +35,7 @@ extern void giveup_vsx(struct task_struct *); | |||
35 | extern void enable_kernel_spe(void); | 35 | extern void enable_kernel_spe(void); |
36 | extern void giveup_spe(struct task_struct *); | 36 | extern void giveup_spe(struct task_struct *); |
37 | extern void load_up_spe(struct task_struct *); | 37 | extern void load_up_spe(struct task_struct *); |
38 | extern void switch_booke_debug_regs(struct thread_struct *new_thread); | 38 | extern void switch_booke_debug_regs(struct debug_reg *new_debug); |
39 | 39 | ||
40 | #ifndef CONFIG_SMP | 40 | #ifndef CONFIG_SMP |
41 | extern void discard_lazy_cpu_state(void); | 41 | extern void discard_lazy_cpu_state(void); |
diff --git a/arch/powerpc/include/asm/timex.h b/arch/powerpc/include/asm/timex.h index 18908caa1f3b..2cf846edb3fc 100644 --- a/arch/powerpc/include/asm/timex.h +++ b/arch/powerpc/include/asm/timex.h | |||
@@ -29,7 +29,11 @@ static inline cycles_t get_cycles(void) | |||
29 | ret = 0; | 29 | ret = 0; |
30 | 30 | ||
31 | __asm__ __volatile__( | 31 | __asm__ __volatile__( |
32 | #ifdef CONFIG_8xx | ||
33 | "97: mftb %0\n" | ||
34 | #else | ||
32 | "97: mfspr %0, %2\n" | 35 | "97: mfspr %0, %2\n" |
36 | #endif | ||
33 | "99:\n" | 37 | "99:\n" |
34 | ".section __ftr_fixup,\"a\"\n" | 38 | ".section __ftr_fixup,\"a\"\n" |
35 | ".align 2\n" | 39 | ".align 2\n" |
@@ -41,7 +45,11 @@ static inline cycles_t get_cycles(void) | |||
41 | " .long 0\n" | 45 | " .long 0\n" |
42 | " .long 0\n" | 46 | " .long 0\n" |
43 | ".previous" | 47 | ".previous" |
48 | #ifdef CONFIG_8xx | ||
49 | : "=r" (ret) : "i" (CPU_FTR_601)); | ||
50 | #else | ||
44 | : "=r" (ret) : "i" (CPU_FTR_601), "i" (SPRN_TBRL)); | 51 | : "=r" (ret) : "i" (CPU_FTR_601), "i" (SPRN_TBRL)); |
52 | #endif | ||
45 | return ret; | 53 | return ret; |
46 | #endif | 54 | #endif |
47 | } | 55 | } |
diff --git a/arch/powerpc/include/asm/unaligned.h b/arch/powerpc/include/asm/unaligned.h index 5f1b1e3c2137..8296381ae432 100644 --- a/arch/powerpc/include/asm/unaligned.h +++ b/arch/powerpc/include/asm/unaligned.h | |||
@@ -4,13 +4,18 @@ | |||
4 | #ifdef __KERNEL__ | 4 | #ifdef __KERNEL__ |
5 | 5 | ||
6 | /* | 6 | /* |
7 | * The PowerPC can do unaligned accesses itself in big endian mode. | 7 | * The PowerPC can do unaligned accesses itself based on its endian mode. |
8 | */ | 8 | */ |
9 | #include <linux/unaligned/access_ok.h> | 9 | #include <linux/unaligned/access_ok.h> |
10 | #include <linux/unaligned/generic.h> | 10 | #include <linux/unaligned/generic.h> |
11 | 11 | ||
12 | #ifdef __LITTLE_ENDIAN__ | ||
13 | #define get_unaligned __get_unaligned_le | ||
14 | #define put_unaligned __put_unaligned_le | ||
15 | #else | ||
12 | #define get_unaligned __get_unaligned_be | 16 | #define get_unaligned __get_unaligned_be |
13 | #define put_unaligned __put_unaligned_be | 17 | #define put_unaligned __put_unaligned_be |
18 | #endif | ||
14 | 19 | ||
15 | #endif /* __KERNEL__ */ | 20 | #endif /* __KERNEL__ */ |
16 | #endif /* _ASM_POWERPC_UNALIGNED_H */ | 21 | #endif /* _ASM_POWERPC_UNALIGNED_H */ |
diff --git a/arch/powerpc/include/asm/uprobes.h b/arch/powerpc/include/asm/uprobes.h index 75c6ecdb8f37..7422a999a39a 100644 --- a/arch/powerpc/include/asm/uprobes.h +++ b/arch/powerpc/include/asm/uprobes.h | |||
@@ -36,9 +36,8 @@ typedef ppc_opcode_t uprobe_opcode_t; | |||
36 | 36 | ||
37 | struct arch_uprobe { | 37 | struct arch_uprobe { |
38 | union { | 38 | union { |
39 | u8 insn[MAX_UINSN_BYTES]; | 39 | u32 insn; |
40 | u8 ixol[MAX_UINSN_BYTES]; | 40 | u32 ixol; |
41 | u32 ainsn; | ||
42 | }; | 41 | }; |
43 | }; | 42 | }; |
44 | 43 | ||
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c index 2ea5cc033ec8..d3de01066f7d 100644 --- a/arch/powerpc/kernel/asm-offsets.c +++ b/arch/powerpc/kernel/asm-offsets.c | |||
@@ -576,6 +576,7 @@ int main(void) | |||
576 | HSTATE_FIELD(HSTATE_VMHANDLER, vmhandler); | 576 | HSTATE_FIELD(HSTATE_VMHANDLER, vmhandler); |
577 | HSTATE_FIELD(HSTATE_SCRATCH0, scratch0); | 577 | HSTATE_FIELD(HSTATE_SCRATCH0, scratch0); |
578 | HSTATE_FIELD(HSTATE_SCRATCH1, scratch1); | 578 | HSTATE_FIELD(HSTATE_SCRATCH1, scratch1); |
579 | HSTATE_FIELD(HSTATE_SCRATCH2, scratch2); | ||
579 | HSTATE_FIELD(HSTATE_IN_GUEST, in_guest); | 580 | HSTATE_FIELD(HSTATE_IN_GUEST, in_guest); |
580 | HSTATE_FIELD(HSTATE_RESTORE_HID5, restore_hid5); | 581 | HSTATE_FIELD(HSTATE_RESTORE_HID5, restore_hid5); |
581 | HSTATE_FIELD(HSTATE_NAPPING, napping); | 582 | HSTATE_FIELD(HSTATE_NAPPING, napping); |
diff --git a/arch/powerpc/kernel/crash_dump.c b/arch/powerpc/kernel/crash_dump.c index 779a78c26435..11c1d069d920 100644 --- a/arch/powerpc/kernel/crash_dump.c +++ b/arch/powerpc/kernel/crash_dump.c | |||
@@ -124,15 +124,15 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf, | |||
124 | void crash_free_reserved_phys_range(unsigned long begin, unsigned long end) | 124 | void crash_free_reserved_phys_range(unsigned long begin, unsigned long end) |
125 | { | 125 | { |
126 | unsigned long addr; | 126 | unsigned long addr; |
127 | const u32 *basep, *sizep; | 127 | const __be32 *basep, *sizep; |
128 | unsigned int rtas_start = 0, rtas_end = 0; | 128 | unsigned int rtas_start = 0, rtas_end = 0; |
129 | 129 | ||
130 | basep = of_get_property(rtas.dev, "linux,rtas-base", NULL); | 130 | basep = of_get_property(rtas.dev, "linux,rtas-base", NULL); |
131 | sizep = of_get_property(rtas.dev, "rtas-size", NULL); | 131 | sizep = of_get_property(rtas.dev, "rtas-size", NULL); |
132 | 132 | ||
133 | if (basep && sizep) { | 133 | if (basep && sizep) { |
134 | rtas_start = *basep; | 134 | rtas_start = be32_to_cpup(basep); |
135 | rtas_end = *basep + *sizep; | 135 | rtas_end = rtas_start + be32_to_cpup(sizep); |
136 | } | 136 | } |
137 | 137 | ||
138 | for (addr = begin; addr < end; addr += PAGE_SIZE) { | 138 | for (addr = begin; addr < end; addr += PAGE_SIZE) { |
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S index 2ae41aba4053..4f0946de2d5c 100644 --- a/arch/powerpc/kernel/head_64.S +++ b/arch/powerpc/kernel/head_64.S | |||
@@ -80,6 +80,7 @@ END_FTR_SECTION(0, 1) | |||
80 | * of the function that the cpu should jump to to continue | 80 | * of the function that the cpu should jump to to continue |
81 | * initialization. | 81 | * initialization. |
82 | */ | 82 | */ |
83 | .balign 8 | ||
83 | .globl __secondary_hold_spinloop | 84 | .globl __secondary_hold_spinloop |
84 | __secondary_hold_spinloop: | 85 | __secondary_hold_spinloop: |
85 | .llong 0x0 | 86 | .llong 0x0 |
@@ -470,6 +471,7 @@ _STATIC(__after_prom_start) | |||
470 | mtctr r8 | 471 | mtctr r8 |
471 | bctr | 472 | bctr |
472 | 473 | ||
474 | .balign 8 | ||
473 | p_end: .llong _end - _stext | 475 | p_end: .llong _end - _stext |
474 | 476 | ||
475 | 4: /* Now copy the rest of the kernel up to _end */ | 477 | 4: /* Now copy the rest of the kernel up to _end */ |
diff --git a/arch/powerpc/kernel/machine_kexec.c b/arch/powerpc/kernel/machine_kexec.c index e1ec57e87b3b..75d4f7340da8 100644 --- a/arch/powerpc/kernel/machine_kexec.c +++ b/arch/powerpc/kernel/machine_kexec.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/ftrace.h> | 18 | #include <linux/ftrace.h> |
19 | 19 | ||
20 | #include <asm/machdep.h> | 20 | #include <asm/machdep.h> |
21 | #include <asm/pgalloc.h> | ||
21 | #include <asm/prom.h> | 22 | #include <asm/prom.h> |
22 | #include <asm/sections.h> | 23 | #include <asm/sections.h> |
23 | 24 | ||
@@ -75,6 +76,17 @@ void arch_crash_save_vmcoreinfo(void) | |||
75 | #ifndef CONFIG_NEED_MULTIPLE_NODES | 76 | #ifndef CONFIG_NEED_MULTIPLE_NODES |
76 | VMCOREINFO_SYMBOL(contig_page_data); | 77 | VMCOREINFO_SYMBOL(contig_page_data); |
77 | #endif | 78 | #endif |
79 | #if defined(CONFIG_PPC64) && defined(CONFIG_SPARSEMEM_VMEMMAP) | ||
80 | VMCOREINFO_SYMBOL(vmemmap_list); | ||
81 | VMCOREINFO_SYMBOL(mmu_vmemmap_psize); | ||
82 | VMCOREINFO_SYMBOL(mmu_psize_defs); | ||
83 | VMCOREINFO_STRUCT_SIZE(vmemmap_backing); | ||
84 | VMCOREINFO_OFFSET(vmemmap_backing, list); | ||
85 | VMCOREINFO_OFFSET(vmemmap_backing, phys); | ||
86 | VMCOREINFO_OFFSET(vmemmap_backing, virt_addr); | ||
87 | VMCOREINFO_STRUCT_SIZE(mmu_psize_def); | ||
88 | VMCOREINFO_OFFSET(mmu_psize_def, shift); | ||
89 | #endif | ||
78 | } | 90 | } |
79 | 91 | ||
80 | /* | 92 | /* |
@@ -136,7 +148,7 @@ void __init reserve_crashkernel(void) | |||
136 | * a small SLB (128MB) since the crash kernel needs to place | 148 | * a small SLB (128MB) since the crash kernel needs to place |
137 | * itself and some stacks to be in the first segment. | 149 | * itself and some stacks to be in the first segment. |
138 | */ | 150 | */ |
139 | crashk_res.start = min(0x80000000ULL, (ppc64_rma_size / 2)); | 151 | crashk_res.start = min(0x8000000ULL, (ppc64_rma_size / 2)); |
140 | #else | 152 | #else |
141 | crashk_res.start = KDUMP_KERNELBASE; | 153 | crashk_res.start = KDUMP_KERNELBASE; |
142 | #endif | 154 | #endif |
diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S index e59caf874d05..64bf8db12b15 100644 --- a/arch/powerpc/kernel/misc_64.S +++ b/arch/powerpc/kernel/misc_64.S | |||
@@ -246,8 +246,8 @@ _GLOBAL(__bswapdi2) | |||
246 | or r3,r7,r9 | 246 | or r3,r7,r9 |
247 | blr | 247 | blr |
248 | 248 | ||
249 | #if defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE) | ||
250 | 249 | ||
250 | #ifdef CONFIG_PPC_EARLY_DEBUG_BOOTX | ||
251 | _GLOBAL(rmci_on) | 251 | _GLOBAL(rmci_on) |
252 | sync | 252 | sync |
253 | isync | 253 | isync |
@@ -277,6 +277,9 @@ _GLOBAL(rmci_off) | |||
277 | isync | 277 | isync |
278 | sync | 278 | sync |
279 | blr | 279 | blr |
280 | #endif /* CONFIG_PPC_EARLY_DEBUG_BOOTX */ | ||
281 | |||
282 | #if defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE) | ||
280 | 283 | ||
281 | /* | 284 | /* |
282 | * Do an IO access in real mode | 285 | * Do an IO access in real mode |
diff --git a/arch/powerpc/kernel/nvram_64.c b/arch/powerpc/kernel/nvram_64.c index fd82c289ab1c..28b898e68185 100644 --- a/arch/powerpc/kernel/nvram_64.c +++ b/arch/powerpc/kernel/nvram_64.c | |||
@@ -210,7 +210,7 @@ static void __init nvram_print_partitions(char * label) | |||
210 | printk(KERN_WARNING "--------%s---------\n", label); | 210 | printk(KERN_WARNING "--------%s---------\n", label); |
211 | printk(KERN_WARNING "indx\t\tsig\tchks\tlen\tname\n"); | 211 | printk(KERN_WARNING "indx\t\tsig\tchks\tlen\tname\n"); |
212 | list_for_each_entry(tmp_part, &nvram_partitions, partition) { | 212 | list_for_each_entry(tmp_part, &nvram_partitions, partition) { |
213 | printk(KERN_WARNING "%4d \t%02x\t%02x\t%d\t%12s\n", | 213 | printk(KERN_WARNING "%4d \t%02x\t%02x\t%d\t%12.12s\n", |
214 | tmp_part->index, tmp_part->header.signature, | 214 | tmp_part->index, tmp_part->header.signature, |
215 | tmp_part->header.checksum, tmp_part->header.length, | 215 | tmp_part->header.checksum, tmp_part->header.length, |
216 | tmp_part->header.name); | 216 | tmp_part->header.name); |
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index 3386d8ab7eb0..4a96556fd2d4 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c | |||
@@ -339,7 +339,7 @@ static void set_debug_reg_defaults(struct thread_struct *thread) | |||
339 | #endif | 339 | #endif |
340 | } | 340 | } |
341 | 341 | ||
342 | static void prime_debug_regs(struct thread_struct *thread) | 342 | static void prime_debug_regs(struct debug_reg *debug) |
343 | { | 343 | { |
344 | /* | 344 | /* |
345 | * We could have inherited MSR_DE from userspace, since | 345 | * We could have inherited MSR_DE from userspace, since |
@@ -348,22 +348,22 @@ static void prime_debug_regs(struct thread_struct *thread) | |||
348 | */ | 348 | */ |
349 | mtmsr(mfmsr() & ~MSR_DE); | 349 | mtmsr(mfmsr() & ~MSR_DE); |
350 | 350 | ||
351 | mtspr(SPRN_IAC1, thread->debug.iac1); | 351 | mtspr(SPRN_IAC1, debug->iac1); |
352 | mtspr(SPRN_IAC2, thread->debug.iac2); | 352 | mtspr(SPRN_IAC2, debug->iac2); |
353 | #if CONFIG_PPC_ADV_DEBUG_IACS > 2 | 353 | #if CONFIG_PPC_ADV_DEBUG_IACS > 2 |
354 | mtspr(SPRN_IAC3, thread->debug.iac3); | 354 | mtspr(SPRN_IAC3, debug->iac3); |
355 | mtspr(SPRN_IAC4, thread->debug.iac4); | 355 | mtspr(SPRN_IAC4, debug->iac4); |
356 | #endif | 356 | #endif |
357 | mtspr(SPRN_DAC1, thread->debug.dac1); | 357 | mtspr(SPRN_DAC1, debug->dac1); |
358 | mtspr(SPRN_DAC2, thread->debug.dac2); | 358 | mtspr(SPRN_DAC2, debug->dac2); |
359 | #if CONFIG_PPC_ADV_DEBUG_DVCS > 0 | 359 | #if CONFIG_PPC_ADV_DEBUG_DVCS > 0 |
360 | mtspr(SPRN_DVC1, thread->debug.dvc1); | 360 | mtspr(SPRN_DVC1, debug->dvc1); |
361 | mtspr(SPRN_DVC2, thread->debug.dvc2); | 361 | mtspr(SPRN_DVC2, debug->dvc2); |
362 | #endif | 362 | #endif |
363 | mtspr(SPRN_DBCR0, thread->debug.dbcr0); | 363 | mtspr(SPRN_DBCR0, debug->dbcr0); |
364 | mtspr(SPRN_DBCR1, thread->debug.dbcr1); | 364 | mtspr(SPRN_DBCR1, debug->dbcr1); |
365 | #ifdef CONFIG_BOOKE | 365 | #ifdef CONFIG_BOOKE |
366 | mtspr(SPRN_DBCR2, thread->debug.dbcr2); | 366 | mtspr(SPRN_DBCR2, debug->dbcr2); |
367 | #endif | 367 | #endif |
368 | } | 368 | } |
369 | /* | 369 | /* |
@@ -371,11 +371,11 @@ static void prime_debug_regs(struct thread_struct *thread) | |||
371 | * debug registers, set the debug registers from the values | 371 | * debug registers, set the debug registers from the values |
372 | * stored in the new thread. | 372 | * stored in the new thread. |
373 | */ | 373 | */ |
374 | void switch_booke_debug_regs(struct thread_struct *new_thread) | 374 | void switch_booke_debug_regs(struct debug_reg *new_debug) |
375 | { | 375 | { |
376 | if ((current->thread.debug.dbcr0 & DBCR0_IDM) | 376 | if ((current->thread.debug.dbcr0 & DBCR0_IDM) |
377 | || (new_thread->debug.dbcr0 & DBCR0_IDM)) | 377 | || (new_debug->dbcr0 & DBCR0_IDM)) |
378 | prime_debug_regs(new_thread); | 378 | prime_debug_regs(new_debug); |
379 | } | 379 | } |
380 | EXPORT_SYMBOL_GPL(switch_booke_debug_regs); | 380 | EXPORT_SYMBOL_GPL(switch_booke_debug_regs); |
381 | #else /* !CONFIG_PPC_ADV_DEBUG_REGS */ | 381 | #else /* !CONFIG_PPC_ADV_DEBUG_REGS */ |
@@ -683,7 +683,7 @@ struct task_struct *__switch_to(struct task_struct *prev, | |||
683 | #endif /* CONFIG_SMP */ | 683 | #endif /* CONFIG_SMP */ |
684 | 684 | ||
685 | #ifdef CONFIG_PPC_ADV_DEBUG_REGS | 685 | #ifdef CONFIG_PPC_ADV_DEBUG_REGS |
686 | switch_booke_debug_regs(&new->thread); | 686 | switch_booke_debug_regs(&new->thread.debug); |
687 | #else | 687 | #else |
688 | /* | 688 | /* |
689 | * For PPC_BOOK3S_64, we use the hw-breakpoint interfaces that would | 689 | * For PPC_BOOK3S_64, we use the hw-breakpoint interfaces that would |
diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c index cb64a6e1dc51..078145acf7fb 100644 --- a/arch/powerpc/kernel/prom_init.c +++ b/arch/powerpc/kernel/prom_init.c | |||
@@ -1986,19 +1986,23 @@ static void __init prom_init_stdout(void) | |||
1986 | /* Get the full OF pathname of the stdout device */ | 1986 | /* Get the full OF pathname of the stdout device */ |
1987 | memset(path, 0, 256); | 1987 | memset(path, 0, 256); |
1988 | call_prom("instance-to-path", 3, 1, prom.stdout, path, 255); | 1988 | call_prom("instance-to-path", 3, 1, prom.stdout, path, 255); |
1989 | stdout_node = call_prom("instance-to-package", 1, 1, prom.stdout); | ||
1990 | val = cpu_to_be32(stdout_node); | ||
1991 | prom_setprop(prom.chosen, "/chosen", "linux,stdout-package", | ||
1992 | &val, sizeof(val)); | ||
1993 | prom_printf("OF stdout device is: %s\n", of_stdout_device); | 1989 | prom_printf("OF stdout device is: %s\n", of_stdout_device); |
1994 | prom_setprop(prom.chosen, "/chosen", "linux,stdout-path", | 1990 | prom_setprop(prom.chosen, "/chosen", "linux,stdout-path", |
1995 | path, strlen(path) + 1); | 1991 | path, strlen(path) + 1); |
1996 | 1992 | ||
1997 | /* If it's a display, note it */ | 1993 | /* instance-to-package fails on PA-Semi */ |
1998 | memset(type, 0, sizeof(type)); | 1994 | stdout_node = call_prom("instance-to-package", 1, 1, prom.stdout); |
1999 | prom_getprop(stdout_node, "device_type", type, sizeof(type)); | 1995 | if (stdout_node != PROM_ERROR) { |
2000 | if (strcmp(type, "display") == 0) | 1996 | val = cpu_to_be32(stdout_node); |
2001 | prom_setprop(stdout_node, path, "linux,boot-display", NULL, 0); | 1997 | prom_setprop(prom.chosen, "/chosen", "linux,stdout-package", |
1998 | &val, sizeof(val)); | ||
1999 | |||
2000 | /* If it's a display, note it */ | ||
2001 | memset(type, 0, sizeof(type)); | ||
2002 | prom_getprop(stdout_node, "device_type", type, sizeof(type)); | ||
2003 | if (strcmp(type, "display") == 0) | ||
2004 | prom_setprop(stdout_node, path, "linux,boot-display", NULL, 0); | ||
2005 | } | ||
2002 | } | 2006 | } |
2003 | 2007 | ||
2004 | static int __init prom_find_machine_type(void) | 2008 | static int __init prom_find_machine_type(void) |
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c index 75fb40498b41..2e3d2bf536c5 100644 --- a/arch/powerpc/kernel/ptrace.c +++ b/arch/powerpc/kernel/ptrace.c | |||
@@ -1555,7 +1555,7 @@ long arch_ptrace(struct task_struct *child, long request, | |||
1555 | 1555 | ||
1556 | flush_fp_to_thread(child); | 1556 | flush_fp_to_thread(child); |
1557 | if (fpidx < (PT_FPSCR - PT_FPR0)) | 1557 | if (fpidx < (PT_FPSCR - PT_FPR0)) |
1558 | memcpy(&tmp, &child->thread.fp_state.fpr, | 1558 | memcpy(&tmp, &child->thread.TS_FPR(fpidx), |
1559 | sizeof(long)); | 1559 | sizeof(long)); |
1560 | else | 1560 | else |
1561 | tmp = child->thread.fp_state.fpscr; | 1561 | tmp = child->thread.fp_state.fpscr; |
@@ -1588,7 +1588,7 @@ long arch_ptrace(struct task_struct *child, long request, | |||
1588 | 1588 | ||
1589 | flush_fp_to_thread(child); | 1589 | flush_fp_to_thread(child); |
1590 | if (fpidx < (PT_FPSCR - PT_FPR0)) | 1590 | if (fpidx < (PT_FPSCR - PT_FPR0)) |
1591 | memcpy(&child->thread.fp_state.fpr, &data, | 1591 | memcpy(&child->thread.TS_FPR(fpidx), &data, |
1592 | sizeof(long)); | 1592 | sizeof(long)); |
1593 | else | 1593 | else |
1594 | child->thread.fp_state.fpscr = data; | 1594 | child->thread.fp_state.fpscr = data; |
diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c index febc80445d25..bc76cc6b419c 100644 --- a/arch/powerpc/kernel/setup-common.c +++ b/arch/powerpc/kernel/setup-common.c | |||
@@ -479,7 +479,7 @@ void __init smp_setup_cpu_maps(void) | |||
479 | if (machine_is(pseries) && firmware_has_feature(FW_FEATURE_LPAR) && | 479 | if (machine_is(pseries) && firmware_has_feature(FW_FEATURE_LPAR) && |
480 | (dn = of_find_node_by_path("/rtas"))) { | 480 | (dn = of_find_node_by_path("/rtas"))) { |
481 | int num_addr_cell, num_size_cell, maxcpus; | 481 | int num_addr_cell, num_size_cell, maxcpus; |
482 | const unsigned int *ireg; | 482 | const __be32 *ireg; |
483 | 483 | ||
484 | num_addr_cell = of_n_addr_cells(dn); | 484 | num_addr_cell = of_n_addr_cells(dn); |
485 | num_size_cell = of_n_size_cells(dn); | 485 | num_size_cell = of_n_size_cells(dn); |
@@ -489,7 +489,7 @@ void __init smp_setup_cpu_maps(void) | |||
489 | if (!ireg) | 489 | if (!ireg) |
490 | goto out; | 490 | goto out; |
491 | 491 | ||
492 | maxcpus = ireg[num_addr_cell + num_size_cell]; | 492 | maxcpus = be32_to_cpup(ireg + num_addr_cell + num_size_cell); |
493 | 493 | ||
494 | /* Double maxcpus for processors which have SMT capability */ | 494 | /* Double maxcpus for processors which have SMT capability */ |
495 | if (cpu_has_feature(CPU_FTR_SMT)) | 495 | if (cpu_has_feature(CPU_FTR_SMT)) |
diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c index b903dc5cf944..2b0da27eaee4 100644 --- a/arch/powerpc/kernel/setup_32.c +++ b/arch/powerpc/kernel/setup_32.c | |||
@@ -296,9 +296,6 @@ void __init setup_arch(char **cmdline_p) | |||
296 | if (cpu_has_feature(CPU_FTR_UNIFIED_ID_CACHE)) | 296 | if (cpu_has_feature(CPU_FTR_UNIFIED_ID_CACHE)) |
297 | ucache_bsize = icache_bsize = dcache_bsize; | 297 | ucache_bsize = icache_bsize = dcache_bsize; |
298 | 298 | ||
299 | /* reboot on panic */ | ||
300 | panic_timeout = 180; | ||
301 | |||
302 | if (ppc_md.panic) | 299 | if (ppc_md.panic) |
303 | setup_panic(); | 300 | setup_panic(); |
304 | 301 | ||
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index 4085aaa9478f..856dd4e99bfe 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c | |||
@@ -588,9 +588,6 @@ void __init setup_arch(char **cmdline_p) | |||
588 | dcache_bsize = ppc64_caches.dline_size; | 588 | dcache_bsize = ppc64_caches.dline_size; |
589 | icache_bsize = ppc64_caches.iline_size; | 589 | icache_bsize = ppc64_caches.iline_size; |
590 | 590 | ||
591 | /* reboot on panic */ | ||
592 | panic_timeout = 180; | ||
593 | |||
594 | if (ppc_md.panic) | 591 | if (ppc_md.panic) |
595 | setup_panic(); | 592 | setup_panic(); |
596 | 593 | ||
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c index 1844298f5ea4..68027bfa5f8e 100644 --- a/arch/powerpc/kernel/signal_32.c +++ b/arch/powerpc/kernel/signal_32.c | |||
@@ -445,6 +445,12 @@ static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame, | |||
445 | #endif /* CONFIG_ALTIVEC */ | 445 | #endif /* CONFIG_ALTIVEC */ |
446 | if (copy_fpr_to_user(&frame->mc_fregs, current)) | 446 | if (copy_fpr_to_user(&frame->mc_fregs, current)) |
447 | return 1; | 447 | return 1; |
448 | |||
449 | /* | ||
450 | * Clear the MSR VSX bit to indicate there is no valid state attached | ||
451 | * to this context, except in the specific case below where we set it. | ||
452 | */ | ||
453 | msr &= ~MSR_VSX; | ||
448 | #ifdef CONFIG_VSX | 454 | #ifdef CONFIG_VSX |
449 | /* | 455 | /* |
450 | * Copy VSR 0-31 upper half from thread_struct to local | 456 | * Copy VSR 0-31 upper half from thread_struct to local |
@@ -457,15 +463,7 @@ static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame, | |||
457 | if (copy_vsx_to_user(&frame->mc_vsregs, current)) | 463 | if (copy_vsx_to_user(&frame->mc_vsregs, current)) |
458 | return 1; | 464 | return 1; |
459 | msr |= MSR_VSX; | 465 | msr |= MSR_VSX; |
460 | } else if (!ctx_has_vsx_region) | 466 | } |
461 | /* | ||
462 | * With a small context structure we can't hold the VSX | ||
463 | * registers, hence clear the MSR value to indicate the state | ||
464 | * was not saved. | ||
465 | */ | ||
466 | msr &= ~MSR_VSX; | ||
467 | |||
468 | |||
469 | #endif /* CONFIG_VSX */ | 467 | #endif /* CONFIG_VSX */ |
470 | #ifdef CONFIG_SPE | 468 | #ifdef CONFIG_SPE |
471 | /* save spe registers */ | 469 | /* save spe registers */ |
diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c index e66f67b8b9e6..42991045349f 100644 --- a/arch/powerpc/kernel/signal_64.c +++ b/arch/powerpc/kernel/signal_64.c | |||
@@ -122,6 +122,12 @@ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, | |||
122 | flush_fp_to_thread(current); | 122 | flush_fp_to_thread(current); |
123 | /* copy fpr regs and fpscr */ | 123 | /* copy fpr regs and fpscr */ |
124 | err |= copy_fpr_to_user(&sc->fp_regs, current); | 124 | err |= copy_fpr_to_user(&sc->fp_regs, current); |
125 | |||
126 | /* | ||
127 | * Clear the MSR VSX bit to indicate there is no valid state attached | ||
128 | * to this context, except in the specific case below where we set it. | ||
129 | */ | ||
130 | msr &= ~MSR_VSX; | ||
125 | #ifdef CONFIG_VSX | 131 | #ifdef CONFIG_VSX |
126 | /* | 132 | /* |
127 | * Copy VSX low doubleword to local buffer for formatting, | 133 | * Copy VSX low doubleword to local buffer for formatting, |
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index a3b64f3bf9a2..c1cf4a1522d9 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c | |||
@@ -580,7 +580,7 @@ int __cpu_up(unsigned int cpu, struct task_struct *tidle) | |||
580 | int cpu_to_core_id(int cpu) | 580 | int cpu_to_core_id(int cpu) |
581 | { | 581 | { |
582 | struct device_node *np; | 582 | struct device_node *np; |
583 | const int *reg; | 583 | const __be32 *reg; |
584 | int id = -1; | 584 | int id = -1; |
585 | 585 | ||
586 | np = of_get_cpu_node(cpu, NULL); | 586 | np = of_get_cpu_node(cpu, NULL); |
@@ -591,7 +591,7 @@ int cpu_to_core_id(int cpu) | |||
591 | if (!reg) | 591 | if (!reg) |
592 | goto out; | 592 | goto out; |
593 | 593 | ||
594 | id = *reg; | 594 | id = be32_to_cpup(reg); |
595 | out: | 595 | out: |
596 | of_node_put(np); | 596 | of_node_put(np); |
597 | return id; | 597 | return id; |
diff --git a/arch/powerpc/kernel/uprobes.c b/arch/powerpc/kernel/uprobes.c index 59f419b935f2..003b20964ea0 100644 --- a/arch/powerpc/kernel/uprobes.c +++ b/arch/powerpc/kernel/uprobes.c | |||
@@ -186,7 +186,7 @@ bool arch_uprobe_skip_sstep(struct arch_uprobe *auprobe, struct pt_regs *regs) | |||
186 | * emulate_step() returns 1 if the insn was successfully emulated. | 186 | * emulate_step() returns 1 if the insn was successfully emulated. |
187 | * For all other cases, we need to single-step in hardware. | 187 | * For all other cases, we need to single-step in hardware. |
188 | */ | 188 | */ |
189 | ret = emulate_step(regs, auprobe->ainsn); | 189 | ret = emulate_step(regs, auprobe->insn); |
190 | if (ret > 0) | 190 | if (ret > 0) |
191 | return true; | 191 | return true; |
192 | 192 | ||
diff --git a/arch/powerpc/kernel/vdso32/gettimeofday.S b/arch/powerpc/kernel/vdso32/gettimeofday.S index 6b1f2a6d5517..6b2b69616e77 100644 --- a/arch/powerpc/kernel/vdso32/gettimeofday.S +++ b/arch/powerpc/kernel/vdso32/gettimeofday.S | |||
@@ -232,9 +232,15 @@ __do_get_tspec: | |||
232 | lwz r6,(CFG_TB_ORIG_STAMP+4)(r9) | 232 | lwz r6,(CFG_TB_ORIG_STAMP+4)(r9) |
233 | 233 | ||
234 | /* Get a stable TB value */ | 234 | /* Get a stable TB value */ |
235 | #ifdef CONFIG_8xx | ||
236 | 2: mftbu r3 | ||
237 | mftbl r4 | ||
238 | mftbu r0 | ||
239 | #else | ||
235 | 2: mfspr r3, SPRN_TBRU | 240 | 2: mfspr r3, SPRN_TBRU |
236 | mfspr r4, SPRN_TBRL | 241 | mfspr r4, SPRN_TBRL |
237 | mfspr r0, SPRN_TBRU | 242 | mfspr r0, SPRN_TBRU |
243 | #endif | ||
238 | cmplw cr0,r3,r0 | 244 | cmplw cr0,r3,r0 |
239 | bne- 2b | 245 | bne- 2b |
240 | 246 | ||
diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c index f3ff587a8b7d..c5d148434c08 100644 --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c | |||
@@ -469,11 +469,14 @@ static int kvmppc_mmu_book3s_64_hv_xlate(struct kvm_vcpu *vcpu, gva_t eaddr, | |||
469 | slb_v = vcpu->kvm->arch.vrma_slb_v; | 469 | slb_v = vcpu->kvm->arch.vrma_slb_v; |
470 | } | 470 | } |
471 | 471 | ||
472 | preempt_disable(); | ||
472 | /* Find the HPTE in the hash table */ | 473 | /* Find the HPTE in the hash table */ |
473 | index = kvmppc_hv_find_lock_hpte(kvm, eaddr, slb_v, | 474 | index = kvmppc_hv_find_lock_hpte(kvm, eaddr, slb_v, |
474 | HPTE_V_VALID | HPTE_V_ABSENT); | 475 | HPTE_V_VALID | HPTE_V_ABSENT); |
475 | if (index < 0) | 476 | if (index < 0) { |
477 | preempt_enable(); | ||
476 | return -ENOENT; | 478 | return -ENOENT; |
479 | } | ||
477 | hptep = (unsigned long *)(kvm->arch.hpt_virt + (index << 4)); | 480 | hptep = (unsigned long *)(kvm->arch.hpt_virt + (index << 4)); |
478 | v = hptep[0] & ~HPTE_V_HVLOCK; | 481 | v = hptep[0] & ~HPTE_V_HVLOCK; |
479 | gr = kvm->arch.revmap[index].guest_rpte; | 482 | gr = kvm->arch.revmap[index].guest_rpte; |
@@ -481,6 +484,7 @@ static int kvmppc_mmu_book3s_64_hv_xlate(struct kvm_vcpu *vcpu, gva_t eaddr, | |||
481 | /* Unlock the HPTE */ | 484 | /* Unlock the HPTE */ |
482 | asm volatile("lwsync" : : : "memory"); | 485 | asm volatile("lwsync" : : : "memory"); |
483 | hptep[0] = v; | 486 | hptep[0] = v; |
487 | preempt_enable(); | ||
484 | 488 | ||
485 | gpte->eaddr = eaddr; | 489 | gpte->eaddr = eaddr; |
486 | gpte->vpage = ((v & HPTE_V_AVPN) << 4) | ((eaddr >> 12) & 0xfff); | 490 | gpte->vpage = ((v & HPTE_V_AVPN) << 4) | ((eaddr >> 12) & 0xfff); |
@@ -665,6 +669,7 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
665 | return -EFAULT; | 669 | return -EFAULT; |
666 | } else { | 670 | } else { |
667 | page = pages[0]; | 671 | page = pages[0]; |
672 | pfn = page_to_pfn(page); | ||
668 | if (PageHuge(page)) { | 673 | if (PageHuge(page)) { |
669 | page = compound_head(page); | 674 | page = compound_head(page); |
670 | pte_size <<= compound_order(page); | 675 | pte_size <<= compound_order(page); |
@@ -689,7 +694,6 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
689 | } | 694 | } |
690 | rcu_read_unlock_sched(); | 695 | rcu_read_unlock_sched(); |
691 | } | 696 | } |
692 | pfn = page_to_pfn(page); | ||
693 | } | 697 | } |
694 | 698 | ||
695 | ret = -EFAULT; | 699 | ret = -EFAULT; |
@@ -707,8 +711,14 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
707 | r = (r & ~(HPTE_R_W|HPTE_R_I|HPTE_R_G)) | HPTE_R_M; | 711 | r = (r & ~(HPTE_R_W|HPTE_R_I|HPTE_R_G)) | HPTE_R_M; |
708 | } | 712 | } |
709 | 713 | ||
710 | /* Set the HPTE to point to pfn */ | 714 | /* |
711 | r = (r & ~(HPTE_R_PP0 - pte_size)) | (pfn << PAGE_SHIFT); | 715 | * Set the HPTE to point to pfn. |
716 | * Since the pfn is at PAGE_SIZE granularity, make sure we | ||
717 | * don't mask out lower-order bits if psize < PAGE_SIZE. | ||
718 | */ | ||
719 | if (psize < PAGE_SIZE) | ||
720 | psize = PAGE_SIZE; | ||
721 | r = (r & ~(HPTE_R_PP0 - psize)) | ((pfn << PAGE_SHIFT) & ~(psize - 1)); | ||
712 | if (hpte_is_writable(r) && !write_ok) | 722 | if (hpte_is_writable(r) && !write_ok) |
713 | r = hpte_make_readonly(r); | 723 | r = hpte_make_readonly(r); |
714 | ret = RESUME_GUEST; | 724 | ret = RESUME_GUEST; |
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c index 072287f1c3bc..b51d5db78068 100644 --- a/arch/powerpc/kvm/book3s_hv.c +++ b/arch/powerpc/kvm/book3s_hv.c | |||
@@ -131,8 +131,9 @@ static void kvmppc_fast_vcpu_kick_hv(struct kvm_vcpu *vcpu) | |||
131 | static void kvmppc_core_vcpu_load_hv(struct kvm_vcpu *vcpu, int cpu) | 131 | static void kvmppc_core_vcpu_load_hv(struct kvm_vcpu *vcpu, int cpu) |
132 | { | 132 | { |
133 | struct kvmppc_vcore *vc = vcpu->arch.vcore; | 133 | struct kvmppc_vcore *vc = vcpu->arch.vcore; |
134 | unsigned long flags; | ||
134 | 135 | ||
135 | spin_lock(&vcpu->arch.tbacct_lock); | 136 | spin_lock_irqsave(&vcpu->arch.tbacct_lock, flags); |
136 | if (vc->runner == vcpu && vc->vcore_state != VCORE_INACTIVE && | 137 | if (vc->runner == vcpu && vc->vcore_state != VCORE_INACTIVE && |
137 | vc->preempt_tb != TB_NIL) { | 138 | vc->preempt_tb != TB_NIL) { |
138 | vc->stolen_tb += mftb() - vc->preempt_tb; | 139 | vc->stolen_tb += mftb() - vc->preempt_tb; |
@@ -143,19 +144,20 @@ static void kvmppc_core_vcpu_load_hv(struct kvm_vcpu *vcpu, int cpu) | |||
143 | vcpu->arch.busy_stolen += mftb() - vcpu->arch.busy_preempt; | 144 | vcpu->arch.busy_stolen += mftb() - vcpu->arch.busy_preempt; |
144 | vcpu->arch.busy_preempt = TB_NIL; | 145 | vcpu->arch.busy_preempt = TB_NIL; |
145 | } | 146 | } |
146 | spin_unlock(&vcpu->arch.tbacct_lock); | 147 | spin_unlock_irqrestore(&vcpu->arch.tbacct_lock, flags); |
147 | } | 148 | } |
148 | 149 | ||
149 | static void kvmppc_core_vcpu_put_hv(struct kvm_vcpu *vcpu) | 150 | static void kvmppc_core_vcpu_put_hv(struct kvm_vcpu *vcpu) |
150 | { | 151 | { |
151 | struct kvmppc_vcore *vc = vcpu->arch.vcore; | 152 | struct kvmppc_vcore *vc = vcpu->arch.vcore; |
153 | unsigned long flags; | ||
152 | 154 | ||
153 | spin_lock(&vcpu->arch.tbacct_lock); | 155 | spin_lock_irqsave(&vcpu->arch.tbacct_lock, flags); |
154 | if (vc->runner == vcpu && vc->vcore_state != VCORE_INACTIVE) | 156 | if (vc->runner == vcpu && vc->vcore_state != VCORE_INACTIVE) |
155 | vc->preempt_tb = mftb(); | 157 | vc->preempt_tb = mftb(); |
156 | if (vcpu->arch.state == KVMPPC_VCPU_BUSY_IN_HOST) | 158 | if (vcpu->arch.state == KVMPPC_VCPU_BUSY_IN_HOST) |
157 | vcpu->arch.busy_preempt = mftb(); | 159 | vcpu->arch.busy_preempt = mftb(); |
158 | spin_unlock(&vcpu->arch.tbacct_lock); | 160 | spin_unlock_irqrestore(&vcpu->arch.tbacct_lock, flags); |
159 | } | 161 | } |
160 | 162 | ||
161 | static void kvmppc_set_msr_hv(struct kvm_vcpu *vcpu, u64 msr) | 163 | static void kvmppc_set_msr_hv(struct kvm_vcpu *vcpu, u64 msr) |
@@ -486,11 +488,11 @@ static u64 vcore_stolen_time(struct kvmppc_vcore *vc, u64 now) | |||
486 | */ | 488 | */ |
487 | if (vc->vcore_state != VCORE_INACTIVE && | 489 | if (vc->vcore_state != VCORE_INACTIVE && |
488 | vc->runner->arch.run_task != current) { | 490 | vc->runner->arch.run_task != current) { |
489 | spin_lock(&vc->runner->arch.tbacct_lock); | 491 | spin_lock_irq(&vc->runner->arch.tbacct_lock); |
490 | p = vc->stolen_tb; | 492 | p = vc->stolen_tb; |
491 | if (vc->preempt_tb != TB_NIL) | 493 | if (vc->preempt_tb != TB_NIL) |
492 | p += now - vc->preempt_tb; | 494 | p += now - vc->preempt_tb; |
493 | spin_unlock(&vc->runner->arch.tbacct_lock); | 495 | spin_unlock_irq(&vc->runner->arch.tbacct_lock); |
494 | } else { | 496 | } else { |
495 | p = vc->stolen_tb; | 497 | p = vc->stolen_tb; |
496 | } | 498 | } |
@@ -512,10 +514,10 @@ static void kvmppc_create_dtl_entry(struct kvm_vcpu *vcpu, | |||
512 | core_stolen = vcore_stolen_time(vc, now); | 514 | core_stolen = vcore_stolen_time(vc, now); |
513 | stolen = core_stolen - vcpu->arch.stolen_logged; | 515 | stolen = core_stolen - vcpu->arch.stolen_logged; |
514 | vcpu->arch.stolen_logged = core_stolen; | 516 | vcpu->arch.stolen_logged = core_stolen; |
515 | spin_lock(&vcpu->arch.tbacct_lock); | 517 | spin_lock_irq(&vcpu->arch.tbacct_lock); |
516 | stolen += vcpu->arch.busy_stolen; | 518 | stolen += vcpu->arch.busy_stolen; |
517 | vcpu->arch.busy_stolen = 0; | 519 | vcpu->arch.busy_stolen = 0; |
518 | spin_unlock(&vcpu->arch.tbacct_lock); | 520 | spin_unlock_irq(&vcpu->arch.tbacct_lock); |
519 | if (!dt || !vpa) | 521 | if (!dt || !vpa) |
520 | return; | 522 | return; |
521 | memset(dt, 0, sizeof(struct dtl_entry)); | 523 | memset(dt, 0, sizeof(struct dtl_entry)); |
@@ -589,7 +591,9 @@ int kvmppc_pseries_do_hcall(struct kvm_vcpu *vcpu) | |||
589 | if (list_empty(&vcpu->kvm->arch.rtas_tokens)) | 591 | if (list_empty(&vcpu->kvm->arch.rtas_tokens)) |
590 | return RESUME_HOST; | 592 | return RESUME_HOST; |
591 | 593 | ||
594 | idx = srcu_read_lock(&vcpu->kvm->srcu); | ||
592 | rc = kvmppc_rtas_hcall(vcpu); | 595 | rc = kvmppc_rtas_hcall(vcpu); |
596 | srcu_read_unlock(&vcpu->kvm->srcu, idx); | ||
593 | 597 | ||
594 | if (rc == -ENOENT) | 598 | if (rc == -ENOENT) |
595 | return RESUME_HOST; | 599 | return RESUME_HOST; |
@@ -1115,13 +1119,13 @@ static void kvmppc_remove_runnable(struct kvmppc_vcore *vc, | |||
1115 | 1119 | ||
1116 | if (vcpu->arch.state != KVMPPC_VCPU_RUNNABLE) | 1120 | if (vcpu->arch.state != KVMPPC_VCPU_RUNNABLE) |
1117 | return; | 1121 | return; |
1118 | spin_lock(&vcpu->arch.tbacct_lock); | 1122 | spin_lock_irq(&vcpu->arch.tbacct_lock); |
1119 | now = mftb(); | 1123 | now = mftb(); |
1120 | vcpu->arch.busy_stolen += vcore_stolen_time(vc, now) - | 1124 | vcpu->arch.busy_stolen += vcore_stolen_time(vc, now) - |
1121 | vcpu->arch.stolen_logged; | 1125 | vcpu->arch.stolen_logged; |
1122 | vcpu->arch.busy_preempt = now; | 1126 | vcpu->arch.busy_preempt = now; |
1123 | vcpu->arch.state = KVMPPC_VCPU_BUSY_IN_HOST; | 1127 | vcpu->arch.state = KVMPPC_VCPU_BUSY_IN_HOST; |
1124 | spin_unlock(&vcpu->arch.tbacct_lock); | 1128 | spin_unlock_irq(&vcpu->arch.tbacct_lock); |
1125 | --vc->n_runnable; | 1129 | --vc->n_runnable; |
1126 | list_del(&vcpu->arch.run_list); | 1130 | list_del(&vcpu->arch.run_list); |
1127 | } | 1131 | } |
diff --git a/arch/powerpc/kvm/book3s_hv_rm_mmu.c b/arch/powerpc/kvm/book3s_hv_rm_mmu.c index 9c515440ad1a..8689e2e30857 100644 --- a/arch/powerpc/kvm/book3s_hv_rm_mmu.c +++ b/arch/powerpc/kvm/book3s_hv_rm_mmu.c | |||
@@ -225,6 +225,7 @@ long kvmppc_do_h_enter(struct kvm *kvm, unsigned long flags, | |||
225 | is_io = pa & (HPTE_R_I | HPTE_R_W); | 225 | is_io = pa & (HPTE_R_I | HPTE_R_W); |
226 | pte_size = PAGE_SIZE << (pa & KVMPPC_PAGE_ORDER_MASK); | 226 | pte_size = PAGE_SIZE << (pa & KVMPPC_PAGE_ORDER_MASK); |
227 | pa &= PAGE_MASK; | 227 | pa &= PAGE_MASK; |
228 | pa |= gpa & ~PAGE_MASK; | ||
228 | } else { | 229 | } else { |
229 | /* Translate to host virtual address */ | 230 | /* Translate to host virtual address */ |
230 | hva = __gfn_to_hva_memslot(memslot, gfn); | 231 | hva = __gfn_to_hva_memslot(memslot, gfn); |
@@ -238,13 +239,13 @@ long kvmppc_do_h_enter(struct kvm *kvm, unsigned long flags, | |||
238 | ptel = hpte_make_readonly(ptel); | 239 | ptel = hpte_make_readonly(ptel); |
239 | is_io = hpte_cache_bits(pte_val(pte)); | 240 | is_io = hpte_cache_bits(pte_val(pte)); |
240 | pa = pte_pfn(pte) << PAGE_SHIFT; | 241 | pa = pte_pfn(pte) << PAGE_SHIFT; |
242 | pa |= hva & (pte_size - 1); | ||
243 | pa |= gpa & ~PAGE_MASK; | ||
241 | } | 244 | } |
242 | } | 245 | } |
243 | 246 | ||
244 | if (pte_size < psize) | 247 | if (pte_size < psize) |
245 | return H_PARAMETER; | 248 | return H_PARAMETER; |
246 | if (pa && pte_size > psize) | ||
247 | pa |= gpa & (pte_size - 1); | ||
248 | 249 | ||
249 | ptel &= ~(HPTE_R_PP0 - psize); | 250 | ptel &= ~(HPTE_R_PP0 - psize); |
250 | ptel |= pa; | 251 | ptel |= pa; |
@@ -749,6 +750,10 @@ static int slb_base_page_shift[4] = { | |||
749 | 20, /* 1M, unsupported */ | 750 | 20, /* 1M, unsupported */ |
750 | }; | 751 | }; |
751 | 752 | ||
753 | /* When called from virtmode, this func should be protected by | ||
754 | * preempt_disable(), otherwise, the holding of HPTE_V_HVLOCK | ||
755 | * can trigger deadlock issue. | ||
756 | */ | ||
752 | long kvmppc_hv_find_lock_hpte(struct kvm *kvm, gva_t eaddr, unsigned long slb_v, | 757 | long kvmppc_hv_find_lock_hpte(struct kvm *kvm, gva_t eaddr, unsigned long slb_v, |
753 | unsigned long valid) | 758 | unsigned long valid) |
754 | { | 759 | { |
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S index bc8de75b1925..be4fa04a37c9 100644 --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S | |||
@@ -153,7 +153,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_206) | |||
153 | 153 | ||
154 | 13: b machine_check_fwnmi | 154 | 13: b machine_check_fwnmi |
155 | 155 | ||
156 | |||
157 | /* | 156 | /* |
158 | * We come in here when wakened from nap mode on a secondary hw thread. | 157 | * We come in here when wakened from nap mode on a secondary hw thread. |
159 | * Relocation is off and most register values are lost. | 158 | * Relocation is off and most register values are lost. |
@@ -224,6 +223,11 @@ kvm_start_guest: | |||
224 | /* Clear our vcpu pointer so we don't come back in early */ | 223 | /* Clear our vcpu pointer so we don't come back in early */ |
225 | li r0, 0 | 224 | li r0, 0 |
226 | std r0, HSTATE_KVM_VCPU(r13) | 225 | std r0, HSTATE_KVM_VCPU(r13) |
226 | /* | ||
227 | * Make sure we clear HSTATE_KVM_VCPU(r13) before incrementing | ||
228 | * the nap_count, because once the increment to nap_count is | ||
229 | * visible we could be given another vcpu. | ||
230 | */ | ||
227 | lwsync | 231 | lwsync |
228 | /* Clear any pending IPI - we're an offline thread */ | 232 | /* Clear any pending IPI - we're an offline thread */ |
229 | ld r5, HSTATE_XICS_PHYS(r13) | 233 | ld r5, HSTATE_XICS_PHYS(r13) |
@@ -241,7 +245,6 @@ kvm_start_guest: | |||
241 | /* increment the nap count and then go to nap mode */ | 245 | /* increment the nap count and then go to nap mode */ |
242 | ld r4, HSTATE_KVM_VCORE(r13) | 246 | ld r4, HSTATE_KVM_VCORE(r13) |
243 | addi r4, r4, VCORE_NAP_COUNT | 247 | addi r4, r4, VCORE_NAP_COUNT |
244 | lwsync /* make previous updates visible */ | ||
245 | 51: lwarx r3, 0, r4 | 248 | 51: lwarx r3, 0, r4 |
246 | addi r3, r3, 1 | 249 | addi r3, r3, 1 |
247 | stwcx. r3, 0, r4 | 250 | stwcx. r3, 0, r4 |
@@ -751,15 +754,14 @@ kvmppc_interrupt_hv: | |||
751 | * guest CR, R12 saved in shadow VCPU SCRATCH1/0 | 754 | * guest CR, R12 saved in shadow VCPU SCRATCH1/0 |
752 | * guest R13 saved in SPRN_SCRATCH0 | 755 | * guest R13 saved in SPRN_SCRATCH0 |
753 | */ | 756 | */ |
754 | /* abuse host_r2 as third scratch area; we get r2 from PACATOC(r13) */ | 757 | std r9, HSTATE_SCRATCH2(r13) |
755 | std r9, HSTATE_HOST_R2(r13) | ||
756 | 758 | ||
757 | lbz r9, HSTATE_IN_GUEST(r13) | 759 | lbz r9, HSTATE_IN_GUEST(r13) |
758 | cmpwi r9, KVM_GUEST_MODE_HOST_HV | 760 | cmpwi r9, KVM_GUEST_MODE_HOST_HV |
759 | beq kvmppc_bad_host_intr | 761 | beq kvmppc_bad_host_intr |
760 | #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE | 762 | #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE |
761 | cmpwi r9, KVM_GUEST_MODE_GUEST | 763 | cmpwi r9, KVM_GUEST_MODE_GUEST |
762 | ld r9, HSTATE_HOST_R2(r13) | 764 | ld r9, HSTATE_SCRATCH2(r13) |
763 | beq kvmppc_interrupt_pr | 765 | beq kvmppc_interrupt_pr |
764 | #endif | 766 | #endif |
765 | /* We're now back in the host but in guest MMU context */ | 767 | /* We're now back in the host but in guest MMU context */ |
@@ -779,7 +781,7 @@ kvmppc_interrupt_hv: | |||
779 | std r6, VCPU_GPR(R6)(r9) | 781 | std r6, VCPU_GPR(R6)(r9) |
780 | std r7, VCPU_GPR(R7)(r9) | 782 | std r7, VCPU_GPR(R7)(r9) |
781 | std r8, VCPU_GPR(R8)(r9) | 783 | std r8, VCPU_GPR(R8)(r9) |
782 | ld r0, HSTATE_HOST_R2(r13) | 784 | ld r0, HSTATE_SCRATCH2(r13) |
783 | std r0, VCPU_GPR(R9)(r9) | 785 | std r0, VCPU_GPR(R9)(r9) |
784 | std r10, VCPU_GPR(R10)(r9) | 786 | std r10, VCPU_GPR(R10)(r9) |
785 | std r11, VCPU_GPR(R11)(r9) | 787 | std r11, VCPU_GPR(R11)(r9) |
@@ -990,14 +992,13 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201) | |||
990 | */ | 992 | */ |
991 | /* Increment the threads-exiting-guest count in the 0xff00 | 993 | /* Increment the threads-exiting-guest count in the 0xff00 |
992 | bits of vcore->entry_exit_count */ | 994 | bits of vcore->entry_exit_count */ |
993 | lwsync | ||
994 | ld r5,HSTATE_KVM_VCORE(r13) | 995 | ld r5,HSTATE_KVM_VCORE(r13) |
995 | addi r6,r5,VCORE_ENTRY_EXIT | 996 | addi r6,r5,VCORE_ENTRY_EXIT |
996 | 41: lwarx r3,0,r6 | 997 | 41: lwarx r3,0,r6 |
997 | addi r0,r3,0x100 | 998 | addi r0,r3,0x100 |
998 | stwcx. r0,0,r6 | 999 | stwcx. r0,0,r6 |
999 | bne 41b | 1000 | bne 41b |
1000 | lwsync | 1001 | isync /* order stwcx. vs. reading napping_threads */ |
1001 | 1002 | ||
1002 | /* | 1003 | /* |
1003 | * At this point we have an interrupt that we have to pass | 1004 | * At this point we have an interrupt that we have to pass |
@@ -1030,6 +1031,8 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201) | |||
1030 | sld r0,r0,r4 | 1031 | sld r0,r0,r4 |
1031 | andc. r3,r3,r0 /* no sense IPI'ing ourselves */ | 1032 | andc. r3,r3,r0 /* no sense IPI'ing ourselves */ |
1032 | beq 43f | 1033 | beq 43f |
1034 | /* Order entry/exit update vs. IPIs */ | ||
1035 | sync | ||
1033 | mulli r4,r4,PACA_SIZE /* get paca for thread 0 */ | 1036 | mulli r4,r4,PACA_SIZE /* get paca for thread 0 */ |
1034 | subf r6,r4,r13 | 1037 | subf r6,r4,r13 |
1035 | 42: andi. r0,r3,1 | 1038 | 42: andi. r0,r3,1 |
@@ -1638,10 +1641,10 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_206) | |||
1638 | bge kvm_cede_exit | 1641 | bge kvm_cede_exit |
1639 | stwcx. r4,0,r6 | 1642 | stwcx. r4,0,r6 |
1640 | bne 31b | 1643 | bne 31b |
1644 | /* order napping_threads update vs testing entry_exit_count */ | ||
1645 | isync | ||
1641 | li r0,1 | 1646 | li r0,1 |
1642 | stb r0,HSTATE_NAPPING(r13) | 1647 | stb r0,HSTATE_NAPPING(r13) |
1643 | /* order napping_threads update vs testing entry_exit_count */ | ||
1644 | lwsync | ||
1645 | mr r4,r3 | 1648 | mr r4,r3 |
1646 | lwz r7,VCORE_ENTRY_EXIT(r5) | 1649 | lwz r7,VCORE_ENTRY_EXIT(r5) |
1647 | cmpwi r7,0x100 | 1650 | cmpwi r7,0x100 |
diff --git a/arch/powerpc/kvm/book3s_interrupts.S b/arch/powerpc/kvm/book3s_interrupts.S index f4dd041c14ea..f779450cb07c 100644 --- a/arch/powerpc/kvm/book3s_interrupts.S +++ b/arch/powerpc/kvm/book3s_interrupts.S | |||
@@ -129,29 +129,32 @@ kvm_start_lightweight: | |||
129 | * R12 = exit handler id | 129 | * R12 = exit handler id |
130 | * R13 = PACA | 130 | * R13 = PACA |
131 | * SVCPU.* = guest * | 131 | * SVCPU.* = guest * |
132 | * MSR.EE = 1 | ||
132 | * | 133 | * |
133 | */ | 134 | */ |
134 | 135 | ||
136 | PPC_LL r3, GPR4(r1) /* vcpu pointer */ | ||
137 | |||
138 | /* | ||
139 | * kvmppc_copy_from_svcpu can clobber volatile registers, save | ||
140 | * the exit handler id to the vcpu and restore it from there later. | ||
141 | */ | ||
142 | stw r12, VCPU_TRAP(r3) | ||
143 | |||
135 | /* Transfer reg values from shadow vcpu back to vcpu struct */ | 144 | /* Transfer reg values from shadow vcpu back to vcpu struct */ |
136 | /* On 64-bit, interrupts are still off at this point */ | 145 | /* On 64-bit, interrupts are still off at this point */ |
137 | PPC_LL r3, GPR4(r1) /* vcpu pointer */ | 146 | |
138 | GET_SHADOW_VCPU(r4) | 147 | GET_SHADOW_VCPU(r4) |
139 | bl FUNC(kvmppc_copy_from_svcpu) | 148 | bl FUNC(kvmppc_copy_from_svcpu) |
140 | nop | 149 | nop |
141 | 150 | ||
142 | #ifdef CONFIG_PPC_BOOK3S_64 | 151 | #ifdef CONFIG_PPC_BOOK3S_64 |
143 | /* Re-enable interrupts */ | ||
144 | ld r3, HSTATE_HOST_MSR(r13) | ||
145 | ori r3, r3, MSR_EE | ||
146 | MTMSR_EERI(r3) | ||
147 | |||
148 | /* | 152 | /* |
149 | * Reload kernel SPRG3 value. | 153 | * Reload kernel SPRG3 value. |
150 | * No need to save guest value as usermode can't modify SPRG3. | 154 | * No need to save guest value as usermode can't modify SPRG3. |
151 | */ | 155 | */ |
152 | ld r3, PACA_SPRG3(r13) | 156 | ld r3, PACA_SPRG3(r13) |
153 | mtspr SPRN_SPRG3, r3 | 157 | mtspr SPRN_SPRG3, r3 |
154 | |||
155 | #endif /* CONFIG_PPC_BOOK3S_64 */ | 158 | #endif /* CONFIG_PPC_BOOK3S_64 */ |
156 | 159 | ||
157 | /* R7 = vcpu */ | 160 | /* R7 = vcpu */ |
@@ -177,7 +180,7 @@ kvm_start_lightweight: | |||
177 | PPC_STL r31, VCPU_GPR(R31)(r7) | 180 | PPC_STL r31, VCPU_GPR(R31)(r7) |
178 | 181 | ||
179 | /* Pass the exit number as 3rd argument to kvmppc_handle_exit */ | 182 | /* Pass the exit number as 3rd argument to kvmppc_handle_exit */ |
180 | mr r5, r12 | 183 | lwz r5, VCPU_TRAP(r7) |
181 | 184 | ||
182 | /* Restore r3 (kvm_run) and r4 (vcpu) */ | 185 | /* Restore r3 (kvm_run) and r4 (vcpu) */ |
183 | REST_2GPRS(3, r1) | 186 | REST_2GPRS(3, r1) |
diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c index fe14ca3dd171..5b9e9063cfaf 100644 --- a/arch/powerpc/kvm/book3s_pr.c +++ b/arch/powerpc/kvm/book3s_pr.c | |||
@@ -66,6 +66,7 @@ static void kvmppc_core_vcpu_load_pr(struct kvm_vcpu *vcpu, int cpu) | |||
66 | struct kvmppc_book3s_shadow_vcpu *svcpu = svcpu_get(vcpu); | 66 | struct kvmppc_book3s_shadow_vcpu *svcpu = svcpu_get(vcpu); |
67 | memcpy(svcpu->slb, to_book3s(vcpu)->slb_shadow, sizeof(svcpu->slb)); | 67 | memcpy(svcpu->slb, to_book3s(vcpu)->slb_shadow, sizeof(svcpu->slb)); |
68 | svcpu->slb_max = to_book3s(vcpu)->slb_shadow_max; | 68 | svcpu->slb_max = to_book3s(vcpu)->slb_shadow_max; |
69 | svcpu->in_use = 0; | ||
69 | svcpu_put(svcpu); | 70 | svcpu_put(svcpu); |
70 | #endif | 71 | #endif |
71 | vcpu->cpu = smp_processor_id(); | 72 | vcpu->cpu = smp_processor_id(); |
@@ -78,6 +79,9 @@ static void kvmppc_core_vcpu_put_pr(struct kvm_vcpu *vcpu) | |||
78 | { | 79 | { |
79 | #ifdef CONFIG_PPC_BOOK3S_64 | 80 | #ifdef CONFIG_PPC_BOOK3S_64 |
80 | struct kvmppc_book3s_shadow_vcpu *svcpu = svcpu_get(vcpu); | 81 | struct kvmppc_book3s_shadow_vcpu *svcpu = svcpu_get(vcpu); |
82 | if (svcpu->in_use) { | ||
83 | kvmppc_copy_from_svcpu(vcpu, svcpu); | ||
84 | } | ||
81 | memcpy(to_book3s(vcpu)->slb_shadow, svcpu->slb, sizeof(svcpu->slb)); | 85 | memcpy(to_book3s(vcpu)->slb_shadow, svcpu->slb, sizeof(svcpu->slb)); |
82 | to_book3s(vcpu)->slb_shadow_max = svcpu->slb_max; | 86 | to_book3s(vcpu)->slb_shadow_max = svcpu->slb_max; |
83 | svcpu_put(svcpu); | 87 | svcpu_put(svcpu); |
@@ -110,12 +114,26 @@ void kvmppc_copy_to_svcpu(struct kvmppc_book3s_shadow_vcpu *svcpu, | |||
110 | svcpu->ctr = vcpu->arch.ctr; | 114 | svcpu->ctr = vcpu->arch.ctr; |
111 | svcpu->lr = vcpu->arch.lr; | 115 | svcpu->lr = vcpu->arch.lr; |
112 | svcpu->pc = vcpu->arch.pc; | 116 | svcpu->pc = vcpu->arch.pc; |
117 | svcpu->in_use = true; | ||
113 | } | 118 | } |
114 | 119 | ||
115 | /* Copy data touched by real-mode code from shadow vcpu back to vcpu */ | 120 | /* Copy data touched by real-mode code from shadow vcpu back to vcpu */ |
116 | void kvmppc_copy_from_svcpu(struct kvm_vcpu *vcpu, | 121 | void kvmppc_copy_from_svcpu(struct kvm_vcpu *vcpu, |
117 | struct kvmppc_book3s_shadow_vcpu *svcpu) | 122 | struct kvmppc_book3s_shadow_vcpu *svcpu) |
118 | { | 123 | { |
124 | /* | ||
125 | * vcpu_put would just call us again because in_use hasn't | ||
126 | * been updated yet. | ||
127 | */ | ||
128 | preempt_disable(); | ||
129 | |||
130 | /* | ||
131 | * Maybe we were already preempted and synced the svcpu from | ||
132 | * our preempt notifiers. Don't bother touching this svcpu then. | ||
133 | */ | ||
134 | if (!svcpu->in_use) | ||
135 | goto out; | ||
136 | |||
119 | vcpu->arch.gpr[0] = svcpu->gpr[0]; | 137 | vcpu->arch.gpr[0] = svcpu->gpr[0]; |
120 | vcpu->arch.gpr[1] = svcpu->gpr[1]; | 138 | vcpu->arch.gpr[1] = svcpu->gpr[1]; |
121 | vcpu->arch.gpr[2] = svcpu->gpr[2]; | 139 | vcpu->arch.gpr[2] = svcpu->gpr[2]; |
@@ -139,6 +157,10 @@ void kvmppc_copy_from_svcpu(struct kvm_vcpu *vcpu, | |||
139 | vcpu->arch.fault_dar = svcpu->fault_dar; | 157 | vcpu->arch.fault_dar = svcpu->fault_dar; |
140 | vcpu->arch.fault_dsisr = svcpu->fault_dsisr; | 158 | vcpu->arch.fault_dsisr = svcpu->fault_dsisr; |
141 | vcpu->arch.last_inst = svcpu->last_inst; | 159 | vcpu->arch.last_inst = svcpu->last_inst; |
160 | svcpu->in_use = false; | ||
161 | |||
162 | out: | ||
163 | preempt_enable(); | ||
142 | } | 164 | } |
143 | 165 | ||
144 | static int kvmppc_core_check_requests_pr(struct kvm_vcpu *vcpu) | 166 | static int kvmppc_core_check_requests_pr(struct kvm_vcpu *vcpu) |
diff --git a/arch/powerpc/kvm/book3s_rmhandlers.S b/arch/powerpc/kvm/book3s_rmhandlers.S index a38c4c9edab8..c3c5231adade 100644 --- a/arch/powerpc/kvm/book3s_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_rmhandlers.S | |||
@@ -153,15 +153,11 @@ _GLOBAL(kvmppc_entry_trampoline) | |||
153 | 153 | ||
154 | li r6, MSR_IR | MSR_DR | 154 | li r6, MSR_IR | MSR_DR |
155 | andc r6, r5, r6 /* Clear DR and IR in MSR value */ | 155 | andc r6, r5, r6 /* Clear DR and IR in MSR value */ |
156 | #ifdef CONFIG_PPC_BOOK3S_32 | ||
157 | /* | 156 | /* |
158 | * Set EE in HOST_MSR so that it's enabled when we get into our | 157 | * Set EE in HOST_MSR so that it's enabled when we get into our |
159 | * C exit handler function. On 64-bit we delay enabling | 158 | * C exit handler function. |
160 | * interrupts until we have finished transferring stuff | ||
161 | * to or from the PACA. | ||
162 | */ | 159 | */ |
163 | ori r5, r5, MSR_EE | 160 | ori r5, r5, MSR_EE |
164 | #endif | ||
165 | mtsrr0 r7 | 161 | mtsrr0 r7 |
166 | mtsrr1 r6 | 162 | mtsrr1 r6 |
167 | RFI | 163 | RFI |
diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c index 53e65a210b9a..0591e05db74b 100644 --- a/arch/powerpc/kvm/booke.c +++ b/arch/powerpc/kvm/booke.c | |||
@@ -681,7 +681,7 @@ int kvmppc_core_check_requests(struct kvm_vcpu *vcpu) | |||
681 | int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) | 681 | int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) |
682 | { | 682 | { |
683 | int ret, s; | 683 | int ret, s; |
684 | struct thread_struct thread; | 684 | struct debug_reg debug; |
685 | #ifdef CONFIG_PPC_FPU | 685 | #ifdef CONFIG_PPC_FPU |
686 | struct thread_fp_state fp; | 686 | struct thread_fp_state fp; |
687 | int fpexc_mode; | 687 | int fpexc_mode; |
@@ -723,9 +723,9 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) | |||
723 | #endif | 723 | #endif |
724 | 724 | ||
725 | /* Switch to guest debug context */ | 725 | /* Switch to guest debug context */ |
726 | thread.debug = vcpu->arch.shadow_dbg_reg; | 726 | debug = vcpu->arch.shadow_dbg_reg; |
727 | switch_booke_debug_regs(&thread); | 727 | switch_booke_debug_regs(&debug); |
728 | thread.debug = current->thread.debug; | 728 | debug = current->thread.debug; |
729 | current->thread.debug = vcpu->arch.shadow_dbg_reg; | 729 | current->thread.debug = vcpu->arch.shadow_dbg_reg; |
730 | 730 | ||
731 | kvmppc_fix_ee_before_entry(); | 731 | kvmppc_fix_ee_before_entry(); |
@@ -736,8 +736,8 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) | |||
736 | We also get here with interrupts enabled. */ | 736 | We also get here with interrupts enabled. */ |
737 | 737 | ||
738 | /* Switch back to user space debug context */ | 738 | /* Switch back to user space debug context */ |
739 | switch_booke_debug_regs(&thread); | 739 | switch_booke_debug_regs(&debug); |
740 | current->thread.debug = thread.debug; | 740 | current->thread.debug = debug; |
741 | 741 | ||
742 | #ifdef CONFIG_PPC_FPU | 742 | #ifdef CONFIG_PPC_FPU |
743 | kvmppc_save_guest_fp(vcpu); | 743 | kvmppc_save_guest_fp(vcpu); |
diff --git a/arch/powerpc/lib/copyuser_64.S b/arch/powerpc/lib/copyuser_64.S index d73a59014900..596a285c0755 100644 --- a/arch/powerpc/lib/copyuser_64.S +++ b/arch/powerpc/lib/copyuser_64.S | |||
@@ -9,6 +9,14 @@ | |||
9 | #include <asm/processor.h> | 9 | #include <asm/processor.h> |
10 | #include <asm/ppc_asm.h> | 10 | #include <asm/ppc_asm.h> |
11 | 11 | ||
12 | #ifdef __BIG_ENDIAN__ | ||
13 | #define sLd sld /* Shift towards low-numbered address. */ | ||
14 | #define sHd srd /* Shift towards high-numbered address. */ | ||
15 | #else | ||
16 | #define sLd srd /* Shift towards low-numbered address. */ | ||
17 | #define sHd sld /* Shift towards high-numbered address. */ | ||
18 | #endif | ||
19 | |||
12 | .align 7 | 20 | .align 7 |
13 | _GLOBAL(__copy_tofrom_user) | 21 | _GLOBAL(__copy_tofrom_user) |
14 | BEGIN_FTR_SECTION | 22 | BEGIN_FTR_SECTION |
@@ -118,10 +126,10 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_LD_STD) | |||
118 | 126 | ||
119 | 24: ld r9,0(r4) /* 3+2n loads, 2+2n stores */ | 127 | 24: ld r9,0(r4) /* 3+2n loads, 2+2n stores */ |
120 | 25: ld r0,8(r4) | 128 | 25: ld r0,8(r4) |
121 | sld r6,r9,r10 | 129 | sLd r6,r9,r10 |
122 | 26: ldu r9,16(r4) | 130 | 26: ldu r9,16(r4) |
123 | srd r7,r0,r11 | 131 | sHd r7,r0,r11 |
124 | sld r8,r0,r10 | 132 | sLd r8,r0,r10 |
125 | or r7,r7,r6 | 133 | or r7,r7,r6 |
126 | blt cr6,79f | 134 | blt cr6,79f |
127 | 27: ld r0,8(r4) | 135 | 27: ld r0,8(r4) |
@@ -129,35 +137,35 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_LD_STD) | |||
129 | 137 | ||
130 | 28: ld r0,0(r4) /* 4+2n loads, 3+2n stores */ | 138 | 28: ld r0,0(r4) /* 4+2n loads, 3+2n stores */ |
131 | 29: ldu r9,8(r4) | 139 | 29: ldu r9,8(r4) |
132 | sld r8,r0,r10 | 140 | sLd r8,r0,r10 |
133 | addi r3,r3,-8 | 141 | addi r3,r3,-8 |
134 | blt cr6,5f | 142 | blt cr6,5f |
135 | 30: ld r0,8(r4) | 143 | 30: ld r0,8(r4) |
136 | srd r12,r9,r11 | 144 | sHd r12,r9,r11 |
137 | sld r6,r9,r10 | 145 | sLd r6,r9,r10 |
138 | 31: ldu r9,16(r4) | 146 | 31: ldu r9,16(r4) |
139 | or r12,r8,r12 | 147 | or r12,r8,r12 |
140 | srd r7,r0,r11 | 148 | sHd r7,r0,r11 |
141 | sld r8,r0,r10 | 149 | sLd r8,r0,r10 |
142 | addi r3,r3,16 | 150 | addi r3,r3,16 |
143 | beq cr6,78f | 151 | beq cr6,78f |
144 | 152 | ||
145 | 1: or r7,r7,r6 | 153 | 1: or r7,r7,r6 |
146 | 32: ld r0,8(r4) | 154 | 32: ld r0,8(r4) |
147 | 76: std r12,8(r3) | 155 | 76: std r12,8(r3) |
148 | 2: srd r12,r9,r11 | 156 | 2: sHd r12,r9,r11 |
149 | sld r6,r9,r10 | 157 | sLd r6,r9,r10 |
150 | 33: ldu r9,16(r4) | 158 | 33: ldu r9,16(r4) |
151 | or r12,r8,r12 | 159 | or r12,r8,r12 |
152 | 77: stdu r7,16(r3) | 160 | 77: stdu r7,16(r3) |
153 | srd r7,r0,r11 | 161 | sHd r7,r0,r11 |
154 | sld r8,r0,r10 | 162 | sLd r8,r0,r10 |
155 | bdnz 1b | 163 | bdnz 1b |
156 | 164 | ||
157 | 78: std r12,8(r3) | 165 | 78: std r12,8(r3) |
158 | or r7,r7,r6 | 166 | or r7,r7,r6 |
159 | 79: std r7,16(r3) | 167 | 79: std r7,16(r3) |
160 | 5: srd r12,r9,r11 | 168 | 5: sHd r12,r9,r11 |
161 | or r12,r8,r12 | 169 | or r12,r8,r12 |
162 | 80: std r12,24(r3) | 170 | 80: std r12,24(r3) |
163 | bne 6f | 171 | bne 6f |
@@ -165,23 +173,38 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_LD_STD) | |||
165 | blr | 173 | blr |
166 | 6: cmpwi cr1,r5,8 | 174 | 6: cmpwi cr1,r5,8 |
167 | addi r3,r3,32 | 175 | addi r3,r3,32 |
168 | sld r9,r9,r10 | 176 | sLd r9,r9,r10 |
169 | ble cr1,7f | 177 | ble cr1,7f |
170 | 34: ld r0,8(r4) | 178 | 34: ld r0,8(r4) |
171 | srd r7,r0,r11 | 179 | sHd r7,r0,r11 |
172 | or r9,r7,r9 | 180 | or r9,r7,r9 |
173 | 7: | 181 | 7: |
174 | bf cr7*4+1,1f | 182 | bf cr7*4+1,1f |
183 | #ifdef __BIG_ENDIAN__ | ||
175 | rotldi r9,r9,32 | 184 | rotldi r9,r9,32 |
185 | #endif | ||
176 | 94: stw r9,0(r3) | 186 | 94: stw r9,0(r3) |
187 | #ifdef __LITTLE_ENDIAN__ | ||
188 | rotrdi r9,r9,32 | ||
189 | #endif | ||
177 | addi r3,r3,4 | 190 | addi r3,r3,4 |
178 | 1: bf cr7*4+2,2f | 191 | 1: bf cr7*4+2,2f |
192 | #ifdef __BIG_ENDIAN__ | ||
179 | rotldi r9,r9,16 | 193 | rotldi r9,r9,16 |
194 | #endif | ||
180 | 95: sth r9,0(r3) | 195 | 95: sth r9,0(r3) |
196 | #ifdef __LITTLE_ENDIAN__ | ||
197 | rotrdi r9,r9,16 | ||
198 | #endif | ||
181 | addi r3,r3,2 | 199 | addi r3,r3,2 |
182 | 2: bf cr7*4+3,3f | 200 | 2: bf cr7*4+3,3f |
201 | #ifdef __BIG_ENDIAN__ | ||
183 | rotldi r9,r9,8 | 202 | rotldi r9,r9,8 |
203 | #endif | ||
184 | 96: stb r9,0(r3) | 204 | 96: stb r9,0(r3) |
205 | #ifdef __LITTLE_ENDIAN__ | ||
206 | rotrdi r9,r9,8 | ||
207 | #endif | ||
185 | 3: li r3,0 | 208 | 3: li r3,0 |
186 | blr | 209 | blr |
187 | 210 | ||
diff --git a/arch/powerpc/mm/hugetlbpage-book3e.c b/arch/powerpc/mm/hugetlbpage-book3e.c index 3bc700655fc8..74551b5e41e5 100644 --- a/arch/powerpc/mm/hugetlbpage-book3e.c +++ b/arch/powerpc/mm/hugetlbpage-book3e.c | |||
@@ -117,6 +117,5 @@ void flush_hugetlb_page(struct vm_area_struct *vma, unsigned long vmaddr) | |||
117 | struct hstate *hstate = hstate_file(vma->vm_file); | 117 | struct hstate *hstate = hstate_file(vma->vm_file); |
118 | unsigned long tsize = huge_page_shift(hstate) - 10; | 118 | unsigned long tsize = huge_page_shift(hstate) - 10; |
119 | 119 | ||
120 | __flush_tlb_page(vma ? vma->vm_mm : NULL, vmaddr, tsize, 0); | 120 | __flush_tlb_page(vma->vm_mm, vmaddr, tsize, 0); |
121 | |||
122 | } | 121 | } |
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index 3fa93dc7fe75..8c1dd23652a1 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c | |||
@@ -209,7 +209,7 @@ void __init do_init_bootmem(void) | |||
209 | /* Place all memblock_regions in the same node and merge contiguous | 209 | /* Place all memblock_regions in the same node and merge contiguous |
210 | * memblock_regions | 210 | * memblock_regions |
211 | */ | 211 | */ |
212 | memblock_set_node(0, (phys_addr_t)ULLONG_MAX, 0); | 212 | memblock_set_node(0, (phys_addr_t)ULLONG_MAX, &memblock.memory, 0); |
213 | 213 | ||
214 | /* Add all physical memory to the bootmem map, mark each area | 214 | /* Add all physical memory to the bootmem map, mark each area |
215 | * present. | 215 | * present. |
diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c index 078d3e00a616..5a944f25e94f 100644 --- a/arch/powerpc/mm/numa.c +++ b/arch/powerpc/mm/numa.c | |||
@@ -670,7 +670,8 @@ static void __init parse_drconf_memory(struct device_node *memory) | |||
670 | node_set_online(nid); | 670 | node_set_online(nid); |
671 | sz = numa_enforce_memory_limit(base, size); | 671 | sz = numa_enforce_memory_limit(base, size); |
672 | if (sz) | 672 | if (sz) |
673 | memblock_set_node(base, sz, nid); | 673 | memblock_set_node(base, sz, |
674 | &memblock.memory, nid); | ||
674 | } while (--ranges); | 675 | } while (--ranges); |
675 | } | 676 | } |
676 | } | 677 | } |
@@ -760,7 +761,7 @@ new_range: | |||
760 | continue; | 761 | continue; |
761 | } | 762 | } |
762 | 763 | ||
763 | memblock_set_node(start, size, nid); | 764 | memblock_set_node(start, size, &memblock.memory, nid); |
764 | 765 | ||
765 | if (--ranges) | 766 | if (--ranges) |
766 | goto new_range; | 767 | goto new_range; |
@@ -797,7 +798,8 @@ static void __init setup_nonnuma(void) | |||
797 | 798 | ||
798 | fake_numa_create_new_node(end_pfn, &nid); | 799 | fake_numa_create_new_node(end_pfn, &nid); |
799 | memblock_set_node(PFN_PHYS(start_pfn), | 800 | memblock_set_node(PFN_PHYS(start_pfn), |
800 | PFN_PHYS(end_pfn - start_pfn), nid); | 801 | PFN_PHYS(end_pfn - start_pfn), |
802 | &memblock.memory, nid); | ||
801 | node_set_online(nid); | 803 | node_set_online(nid); |
802 | } | 804 | } |
803 | } | 805 | } |
diff --git a/arch/powerpc/mm/tlb_nohash.c b/arch/powerpc/mm/tlb_nohash.c index 41cd68dee681..358d74303138 100644 --- a/arch/powerpc/mm/tlb_nohash.c +++ b/arch/powerpc/mm/tlb_nohash.c | |||
@@ -305,7 +305,7 @@ void __flush_tlb_page(struct mm_struct *mm, unsigned long vmaddr, | |||
305 | void flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr) | 305 | void flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr) |
306 | { | 306 | { |
307 | #ifdef CONFIG_HUGETLB_PAGE | 307 | #ifdef CONFIG_HUGETLB_PAGE |
308 | if (is_vm_hugetlb_page(vma)) | 308 | if (vma && is_vm_hugetlb_page(vma)) |
309 | flush_hugetlb_page(vma, vmaddr); | 309 | flush_hugetlb_page(vma, vmaddr); |
310 | #endif | 310 | #endif |
311 | 311 | ||
diff --git a/arch/powerpc/net/bpf_jit_comp.c b/arch/powerpc/net/bpf_jit_comp.c index ac3c2a10dafd..555034f8505e 100644 --- a/arch/powerpc/net/bpf_jit_comp.c +++ b/arch/powerpc/net/bpf_jit_comp.c | |||
@@ -223,10 +223,11 @@ static int bpf_jit_build_body(struct sk_filter *fp, u32 *image, | |||
223 | } | 223 | } |
224 | PPC_DIVWU(r_A, r_A, r_X); | 224 | PPC_DIVWU(r_A, r_A, r_X); |
225 | break; | 225 | break; |
226 | case BPF_S_ALU_DIV_K: /* A = reciprocal_divide(A, K); */ | 226 | case BPF_S_ALU_DIV_K: /* A /= K */ |
227 | if (K == 1) | ||
228 | break; | ||
227 | PPC_LI32(r_scratch1, K); | 229 | PPC_LI32(r_scratch1, K); |
228 | /* Top 32 bits of 64bit result -> A */ | 230 | PPC_DIVWU(r_A, r_A, r_scratch1); |
229 | PPC_MULHWU(r_A, r_A, r_scratch1); | ||
230 | break; | 231 | break; |
231 | case BPF_S_ALU_AND_X: | 232 | case BPF_S_ALU_AND_X: |
232 | ctx->seen |= SEEN_XREG; | 233 | ctx->seen |= SEEN_XREG; |
diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype index 132f8726a257..bca2465a9c34 100644 --- a/arch/powerpc/platforms/Kconfig.cputype +++ b/arch/powerpc/platforms/Kconfig.cputype | |||
@@ -404,13 +404,27 @@ config PPC_DOORBELL | |||
404 | 404 | ||
405 | endmenu | 405 | endmenu |
406 | 406 | ||
407 | config CPU_LITTLE_ENDIAN | 407 | choice |
408 | bool "Build little endian kernel" | 408 | prompt "Endianness selection" |
409 | default n | 409 | default CPU_BIG_ENDIAN |
410 | help | 410 | help |
411 | This option selects whether a big endian or little endian kernel will | 411 | This option selects whether a big endian or little endian kernel will |
412 | be built. | 412 | be built. |
413 | 413 | ||
414 | config CPU_BIG_ENDIAN | ||
415 | bool "Build big endian kernel" | ||
416 | help | ||
417 | Build a big endian kernel. | ||
418 | |||
419 | If unsure, select this option. | ||
420 | |||
421 | config CPU_LITTLE_ENDIAN | ||
422 | bool "Build little endian kernel" | ||
423 | help | ||
424 | Build a little endian kernel. | ||
425 | |||
414 | Note that if cross compiling a little endian kernel, | 426 | Note that if cross compiling a little endian kernel, |
415 | CROSS_COMPILE must point to a toolchain capable of targeting | 427 | CROSS_COMPILE must point to a toolchain capable of targeting |
416 | little endian powerpc. | 428 | little endian powerpc. |
429 | |||
430 | endchoice | ||
diff --git a/arch/powerpc/platforms/powernv/eeh-ioda.c b/arch/powerpc/platforms/powernv/eeh-ioda.c index 02245cee7818..d7ddcee7feb8 100644 --- a/arch/powerpc/platforms/powernv/eeh-ioda.c +++ b/arch/powerpc/platforms/powernv/eeh-ioda.c | |||
@@ -36,7 +36,6 @@ | |||
36 | #include "powernv.h" | 36 | #include "powernv.h" |
37 | #include "pci.h" | 37 | #include "pci.h" |
38 | 38 | ||
39 | static char *hub_diag = NULL; | ||
40 | static int ioda_eeh_nb_init = 0; | 39 | static int ioda_eeh_nb_init = 0; |
41 | 40 | ||
42 | static int ioda_eeh_event(struct notifier_block *nb, | 41 | static int ioda_eeh_event(struct notifier_block *nb, |
@@ -140,15 +139,6 @@ static int ioda_eeh_post_init(struct pci_controller *hose) | |||
140 | ioda_eeh_nb_init = 1; | 139 | ioda_eeh_nb_init = 1; |
141 | } | 140 | } |
142 | 141 | ||
143 | /* We needn't HUB diag-data on PHB3 */ | ||
144 | if (phb->type == PNV_PHB_IODA1 && !hub_diag) { | ||
145 | hub_diag = (char *)__get_free_page(GFP_KERNEL | __GFP_ZERO); | ||
146 | if (!hub_diag) { | ||
147 | pr_err("%s: Out of memory !\n", __func__); | ||
148 | return -ENOMEM; | ||
149 | } | ||
150 | } | ||
151 | |||
152 | #ifdef CONFIG_DEBUG_FS | 142 | #ifdef CONFIG_DEBUG_FS |
153 | if (phb->dbgfs) { | 143 | if (phb->dbgfs) { |
154 | debugfs_create_file("err_injct_outbound", 0600, | 144 | debugfs_create_file("err_injct_outbound", 0600, |
@@ -633,11 +623,10 @@ static void ioda_eeh_hub_diag_common(struct OpalIoP7IOCErrorData *data) | |||
633 | static void ioda_eeh_hub_diag(struct pci_controller *hose) | 623 | static void ioda_eeh_hub_diag(struct pci_controller *hose) |
634 | { | 624 | { |
635 | struct pnv_phb *phb = hose->private_data; | 625 | struct pnv_phb *phb = hose->private_data; |
636 | struct OpalIoP7IOCErrorData *data; | 626 | struct OpalIoP7IOCErrorData *data = &phb->diag.hub_diag; |
637 | long rc; | 627 | long rc; |
638 | 628 | ||
639 | data = (struct OpalIoP7IOCErrorData *)ioda_eeh_hub_diag; | 629 | rc = opal_pci_get_hub_diag_data(phb->hub_id, data, sizeof(*data)); |
640 | rc = opal_pci_get_hub_diag_data(phb->hub_id, data, PAGE_SIZE); | ||
641 | if (rc != OPAL_SUCCESS) { | 630 | if (rc != OPAL_SUCCESS) { |
642 | pr_warning("%s: Failed to get HUB#%llx diag-data (%ld)\n", | 631 | pr_warning("%s: Failed to get HUB#%llx diag-data (%ld)\n", |
643 | __func__, phb->hub_id, rc); | 632 | __func__, phb->hub_id, rc); |
@@ -820,14 +809,15 @@ static void ioda_eeh_phb_diag(struct pci_controller *hose) | |||
820 | struct OpalIoPhbErrorCommon *common; | 809 | struct OpalIoPhbErrorCommon *common; |
821 | long rc; | 810 | long rc; |
822 | 811 | ||
823 | common = (struct OpalIoPhbErrorCommon *)phb->diag.blob; | 812 | rc = opal_pci_get_phb_diag_data2(phb->opal_id, phb->diag.blob, |
824 | rc = opal_pci_get_phb_diag_data2(phb->opal_id, common, PAGE_SIZE); | 813 | PNV_PCI_DIAG_BUF_SIZE); |
825 | if (rc != OPAL_SUCCESS) { | 814 | if (rc != OPAL_SUCCESS) { |
826 | pr_warning("%s: Failed to get diag-data for PHB#%x (%ld)\n", | 815 | pr_warning("%s: Failed to get diag-data for PHB#%x (%ld)\n", |
827 | __func__, hose->global_number, rc); | 816 | __func__, hose->global_number, rc); |
828 | return; | 817 | return; |
829 | } | 818 | } |
830 | 819 | ||
820 | common = (struct OpalIoPhbErrorCommon *)phb->diag.blob; | ||
831 | switch (common->ioType) { | 821 | switch (common->ioType) { |
832 | case OPAL_PHB_ERROR_DATA_TYPE_P7IOC: | 822 | case OPAL_PHB_ERROR_DATA_TYPE_P7IOC: |
833 | ioda_eeh_p7ioc_phb_diag(hose, common); | 823 | ioda_eeh_p7ioc_phb_diag(hose, common); |
diff --git a/arch/powerpc/platforms/powernv/opal-lpc.c b/arch/powerpc/platforms/powernv/opal-lpc.c index e7e59e4f9892..79d83cad3d67 100644 --- a/arch/powerpc/platforms/powernv/opal-lpc.c +++ b/arch/powerpc/platforms/powernv/opal-lpc.c | |||
@@ -24,25 +24,25 @@ static int opal_lpc_chip_id = -1; | |||
24 | static u8 opal_lpc_inb(unsigned long port) | 24 | static u8 opal_lpc_inb(unsigned long port) |
25 | { | 25 | { |
26 | int64_t rc; | 26 | int64_t rc; |
27 | uint32_t data; | 27 | __be32 data; |
28 | 28 | ||
29 | if (opal_lpc_chip_id < 0 || port > 0xffff) | 29 | if (opal_lpc_chip_id < 0 || port > 0xffff) |
30 | return 0xff; | 30 | return 0xff; |
31 | rc = opal_lpc_read(opal_lpc_chip_id, OPAL_LPC_IO, port, &data, 1); | 31 | rc = opal_lpc_read(opal_lpc_chip_id, OPAL_LPC_IO, port, &data, 1); |
32 | return rc ? 0xff : data; | 32 | return rc ? 0xff : be32_to_cpu(data); |
33 | } | 33 | } |
34 | 34 | ||
35 | static __le16 __opal_lpc_inw(unsigned long port) | 35 | static __le16 __opal_lpc_inw(unsigned long port) |
36 | { | 36 | { |
37 | int64_t rc; | 37 | int64_t rc; |
38 | uint32_t data; | 38 | __be32 data; |
39 | 39 | ||
40 | if (opal_lpc_chip_id < 0 || port > 0xfffe) | 40 | if (opal_lpc_chip_id < 0 || port > 0xfffe) |
41 | return 0xffff; | 41 | return 0xffff; |
42 | if (port & 1) | 42 | if (port & 1) |
43 | return (__le16)opal_lpc_inb(port) << 8 | opal_lpc_inb(port + 1); | 43 | return (__le16)opal_lpc_inb(port) << 8 | opal_lpc_inb(port + 1); |
44 | rc = opal_lpc_read(opal_lpc_chip_id, OPAL_LPC_IO, port, &data, 2); | 44 | rc = opal_lpc_read(opal_lpc_chip_id, OPAL_LPC_IO, port, &data, 2); |
45 | return rc ? 0xffff : data; | 45 | return rc ? 0xffff : be32_to_cpu(data); |
46 | } | 46 | } |
47 | static u16 opal_lpc_inw(unsigned long port) | 47 | static u16 opal_lpc_inw(unsigned long port) |
48 | { | 48 | { |
@@ -52,7 +52,7 @@ static u16 opal_lpc_inw(unsigned long port) | |||
52 | static __le32 __opal_lpc_inl(unsigned long port) | 52 | static __le32 __opal_lpc_inl(unsigned long port) |
53 | { | 53 | { |
54 | int64_t rc; | 54 | int64_t rc; |
55 | uint32_t data; | 55 | __be32 data; |
56 | 56 | ||
57 | if (opal_lpc_chip_id < 0 || port > 0xfffc) | 57 | if (opal_lpc_chip_id < 0 || port > 0xfffc) |
58 | return 0xffffffff; | 58 | return 0xffffffff; |
@@ -62,7 +62,7 @@ static __le32 __opal_lpc_inl(unsigned long port) | |||
62 | (__le32)opal_lpc_inb(port + 2) << 8 | | 62 | (__le32)opal_lpc_inb(port + 2) << 8 | |
63 | opal_lpc_inb(port + 3); | 63 | opal_lpc_inb(port + 3); |
64 | rc = opal_lpc_read(opal_lpc_chip_id, OPAL_LPC_IO, port, &data, 4); | 64 | rc = opal_lpc_read(opal_lpc_chip_id, OPAL_LPC_IO, port, &data, 4); |
65 | return rc ? 0xffffffff : data; | 65 | return rc ? 0xffffffff : be32_to_cpu(data); |
66 | } | 66 | } |
67 | 67 | ||
68 | static u32 opal_lpc_inl(unsigned long port) | 68 | static u32 opal_lpc_inl(unsigned long port) |
diff --git a/arch/powerpc/platforms/powernv/opal-xscom.c b/arch/powerpc/platforms/powernv/opal-xscom.c index 4d99a8fd55ac..4fbf276ac99e 100644 --- a/arch/powerpc/platforms/powernv/opal-xscom.c +++ b/arch/powerpc/platforms/powernv/opal-xscom.c | |||
@@ -96,9 +96,11 @@ static int opal_scom_read(scom_map_t map, u64 reg, u64 *value) | |||
96 | { | 96 | { |
97 | struct opal_scom_map *m = map; | 97 | struct opal_scom_map *m = map; |
98 | int64_t rc; | 98 | int64_t rc; |
99 | __be64 v; | ||
99 | 100 | ||
100 | reg = opal_scom_unmangle(reg); | 101 | reg = opal_scom_unmangle(reg); |
101 | rc = opal_xscom_read(m->chip, m->addr + reg, (uint64_t *)__pa(value)); | 102 | rc = opal_xscom_read(m->chip, m->addr + reg, (__be64 *)__pa(&v)); |
103 | *value = be64_to_cpu(v); | ||
102 | return opal_xscom_err_xlate(rc); | 104 | return opal_xscom_err_xlate(rc); |
103 | } | 105 | } |
104 | 106 | ||
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c index 084cdfa40682..2c6d173842b2 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda.c +++ b/arch/powerpc/platforms/powernv/pci-ioda.c | |||
@@ -720,6 +720,7 @@ static void pnv_pci_ioda2_setup_dma_pe(struct pnv_phb *phb, | |||
720 | tbl->it_type = TCE_PCI_SWINV_CREATE | TCE_PCI_SWINV_FREE; | 720 | tbl->it_type = TCE_PCI_SWINV_CREATE | TCE_PCI_SWINV_FREE; |
721 | } | 721 | } |
722 | iommu_init_table(tbl, phb->hose->node); | 722 | iommu_init_table(tbl, phb->hose->node); |
723 | iommu_register_group(tbl, pci_domain_nr(pe->pbus), pe->pe_number); | ||
723 | 724 | ||
724 | if (pe->pdev) | 725 | if (pe->pdev) |
725 | set_iommu_table_base(&pe->pdev->dev, tbl); | 726 | set_iommu_table_base(&pe->pdev->dev, tbl); |
diff --git a/arch/powerpc/platforms/powernv/pci.h b/arch/powerpc/platforms/powernv/pci.h index 911c24ef033e..1ed8d5f40f5a 100644 --- a/arch/powerpc/platforms/powernv/pci.h +++ b/arch/powerpc/platforms/powernv/pci.h | |||
@@ -172,11 +172,13 @@ struct pnv_phb { | |||
172 | } ioda; | 172 | } ioda; |
173 | }; | 173 | }; |
174 | 174 | ||
175 | /* PHB status structure */ | 175 | /* PHB and hub status structure */ |
176 | union { | 176 | union { |
177 | unsigned char blob[PNV_PCI_DIAG_BUF_SIZE]; | 177 | unsigned char blob[PNV_PCI_DIAG_BUF_SIZE]; |
178 | struct OpalIoP7IOCPhbErrorData p7ioc; | 178 | struct OpalIoP7IOCPhbErrorData p7ioc; |
179 | struct OpalIoP7IOCErrorData hub_diag; | ||
179 | } diag; | 180 | } diag; |
181 | |||
180 | }; | 182 | }; |
181 | 183 | ||
182 | extern struct pci_ops pnv_pci_ops; | 184 | extern struct pci_ops pnv_pci_ops; |
diff --git a/arch/powerpc/platforms/pseries/lparcfg.c b/arch/powerpc/platforms/pseries/lparcfg.c index e738007eae64..c9fecf09b8fa 100644 --- a/arch/powerpc/platforms/pseries/lparcfg.c +++ b/arch/powerpc/platforms/pseries/lparcfg.c | |||
@@ -157,7 +157,7 @@ static void parse_ppp_data(struct seq_file *m) | |||
157 | { | 157 | { |
158 | struct hvcall_ppp_data ppp_data; | 158 | struct hvcall_ppp_data ppp_data; |
159 | struct device_node *root; | 159 | struct device_node *root; |
160 | const int *perf_level; | 160 | const __be32 *perf_level; |
161 | int rc; | 161 | int rc; |
162 | 162 | ||
163 | rc = h_get_ppp(&ppp_data); | 163 | rc = h_get_ppp(&ppp_data); |
@@ -201,7 +201,7 @@ static void parse_ppp_data(struct seq_file *m) | |||
201 | perf_level = of_get_property(root, | 201 | perf_level = of_get_property(root, |
202 | "ibm,partition-performance-parameters-level", | 202 | "ibm,partition-performance-parameters-level", |
203 | NULL); | 203 | NULL); |
204 | if (perf_level && (*perf_level >= 1)) { | 204 | if (perf_level && (be32_to_cpup(perf_level) >= 1)) { |
205 | seq_printf(m, | 205 | seq_printf(m, |
206 | "physical_procs_allocated_to_virtualization=%d\n", | 206 | "physical_procs_allocated_to_virtualization=%d\n", |
207 | ppp_data.phys_platform_procs); | 207 | ppp_data.phys_platform_procs); |
@@ -435,7 +435,7 @@ static int pseries_lparcfg_data(struct seq_file *m, void *v) | |||
435 | int partition_potential_processors; | 435 | int partition_potential_processors; |
436 | int partition_active_processors; | 436 | int partition_active_processors; |
437 | struct device_node *rtas_node; | 437 | struct device_node *rtas_node; |
438 | const int *lrdrp = NULL; | 438 | const __be32 *lrdrp = NULL; |
439 | 439 | ||
440 | rtas_node = of_find_node_by_path("/rtas"); | 440 | rtas_node = of_find_node_by_path("/rtas"); |
441 | if (rtas_node) | 441 | if (rtas_node) |
@@ -444,7 +444,7 @@ static int pseries_lparcfg_data(struct seq_file *m, void *v) | |||
444 | if (lrdrp == NULL) { | 444 | if (lrdrp == NULL) { |
445 | partition_potential_processors = vdso_data->processorCount; | 445 | partition_potential_processors = vdso_data->processorCount; |
446 | } else { | 446 | } else { |
447 | partition_potential_processors = *(lrdrp + 4); | 447 | partition_potential_processors = be32_to_cpup(lrdrp + 4); |
448 | } | 448 | } |
449 | of_node_put(rtas_node); | 449 | of_node_put(rtas_node); |
450 | 450 | ||
@@ -654,7 +654,7 @@ static int lparcfg_data(struct seq_file *m, void *v) | |||
654 | const char *model = ""; | 654 | const char *model = ""; |
655 | const char *system_id = ""; | 655 | const char *system_id = ""; |
656 | const char *tmp; | 656 | const char *tmp; |
657 | const unsigned int *lp_index_ptr; | 657 | const __be32 *lp_index_ptr; |
658 | unsigned int lp_index = 0; | 658 | unsigned int lp_index = 0; |
659 | 659 | ||
660 | seq_printf(m, "%s %s\n", MODULE_NAME, MODULE_VERS); | 660 | seq_printf(m, "%s %s\n", MODULE_NAME, MODULE_VERS); |
@@ -670,7 +670,7 @@ static int lparcfg_data(struct seq_file *m, void *v) | |||
670 | lp_index_ptr = of_get_property(rootdn, "ibm,partition-no", | 670 | lp_index_ptr = of_get_property(rootdn, "ibm,partition-no", |
671 | NULL); | 671 | NULL); |
672 | if (lp_index_ptr) | 672 | if (lp_index_ptr) |
673 | lp_index = *lp_index_ptr; | 673 | lp_index = be32_to_cpup(lp_index_ptr); |
674 | of_node_put(rootdn); | 674 | of_node_put(rootdn); |
675 | } | 675 | } |
676 | seq_printf(m, "serial_number=%s\n", system_id); | 676 | seq_printf(m, "serial_number=%s\n", system_id); |
diff --git a/arch/powerpc/platforms/pseries/msi.c b/arch/powerpc/platforms/pseries/msi.c index 6d2f0abce6fa..0c882e83c4ce 100644 --- a/arch/powerpc/platforms/pseries/msi.c +++ b/arch/powerpc/platforms/pseries/msi.c | |||
@@ -130,7 +130,8 @@ static int check_req(struct pci_dev *pdev, int nvec, char *prop_name) | |||
130 | { | 130 | { |
131 | struct device_node *dn; | 131 | struct device_node *dn; |
132 | struct pci_dn *pdn; | 132 | struct pci_dn *pdn; |
133 | const u32 *req_msi; | 133 | const __be32 *p; |
134 | u32 req_msi; | ||
134 | 135 | ||
135 | pdn = pci_get_pdn(pdev); | 136 | pdn = pci_get_pdn(pdev); |
136 | if (!pdn) | 137 | if (!pdn) |
@@ -138,19 +139,20 @@ static int check_req(struct pci_dev *pdev, int nvec, char *prop_name) | |||
138 | 139 | ||
139 | dn = pdn->node; | 140 | dn = pdn->node; |
140 | 141 | ||
141 | req_msi = of_get_property(dn, prop_name, NULL); | 142 | p = of_get_property(dn, prop_name, NULL); |
142 | if (!req_msi) { | 143 | if (!p) { |
143 | pr_debug("rtas_msi: No %s on %s\n", prop_name, dn->full_name); | 144 | pr_debug("rtas_msi: No %s on %s\n", prop_name, dn->full_name); |
144 | return -ENOENT; | 145 | return -ENOENT; |
145 | } | 146 | } |
146 | 147 | ||
147 | if (*req_msi < nvec) { | 148 | req_msi = be32_to_cpup(p); |
149 | if (req_msi < nvec) { | ||
148 | pr_debug("rtas_msi: %s requests < %d MSIs\n", prop_name, nvec); | 150 | pr_debug("rtas_msi: %s requests < %d MSIs\n", prop_name, nvec); |
149 | 151 | ||
150 | if (*req_msi == 0) /* Be paranoid */ | 152 | if (req_msi == 0) /* Be paranoid */ |
151 | return -ENOSPC; | 153 | return -ENOSPC; |
152 | 154 | ||
153 | return *req_msi; | 155 | return req_msi; |
154 | } | 156 | } |
155 | 157 | ||
156 | return 0; | 158 | return 0; |
@@ -171,7 +173,7 @@ static int check_req_msix(struct pci_dev *pdev, int nvec) | |||
171 | static struct device_node *find_pe_total_msi(struct pci_dev *dev, int *total) | 173 | static struct device_node *find_pe_total_msi(struct pci_dev *dev, int *total) |
172 | { | 174 | { |
173 | struct device_node *dn; | 175 | struct device_node *dn; |
174 | const u32 *p; | 176 | const __be32 *p; |
175 | 177 | ||
176 | dn = of_node_get(pci_device_to_OF_node(dev)); | 178 | dn = of_node_get(pci_device_to_OF_node(dev)); |
177 | while (dn) { | 179 | while (dn) { |
@@ -179,7 +181,7 @@ static struct device_node *find_pe_total_msi(struct pci_dev *dev, int *total) | |||
179 | if (p) { | 181 | if (p) { |
180 | pr_debug("rtas_msi: found prop on dn %s\n", | 182 | pr_debug("rtas_msi: found prop on dn %s\n", |
181 | dn->full_name); | 183 | dn->full_name); |
182 | *total = *p; | 184 | *total = be32_to_cpup(p); |
183 | return dn; | 185 | return dn; |
184 | } | 186 | } |
185 | 187 | ||
@@ -232,13 +234,13 @@ struct msi_counts { | |||
232 | static void *count_non_bridge_devices(struct device_node *dn, void *data) | 234 | static void *count_non_bridge_devices(struct device_node *dn, void *data) |
233 | { | 235 | { |
234 | struct msi_counts *counts = data; | 236 | struct msi_counts *counts = data; |
235 | const u32 *p; | 237 | const __be32 *p; |
236 | u32 class; | 238 | u32 class; |
237 | 239 | ||
238 | pr_debug("rtas_msi: counting %s\n", dn->full_name); | 240 | pr_debug("rtas_msi: counting %s\n", dn->full_name); |
239 | 241 | ||
240 | p = of_get_property(dn, "class-code", NULL); | 242 | p = of_get_property(dn, "class-code", NULL); |
241 | class = p ? *p : 0; | 243 | class = p ? be32_to_cpup(p) : 0; |
242 | 244 | ||
243 | if ((class >> 8) != PCI_CLASS_BRIDGE_PCI) | 245 | if ((class >> 8) != PCI_CLASS_BRIDGE_PCI) |
244 | counts->num_devices++; | 246 | counts->num_devices++; |
@@ -249,7 +251,7 @@ static void *count_non_bridge_devices(struct device_node *dn, void *data) | |||
249 | static void *count_spare_msis(struct device_node *dn, void *data) | 251 | static void *count_spare_msis(struct device_node *dn, void *data) |
250 | { | 252 | { |
251 | struct msi_counts *counts = data; | 253 | struct msi_counts *counts = data; |
252 | const u32 *p; | 254 | const __be32 *p; |
253 | int req; | 255 | int req; |
254 | 256 | ||
255 | if (dn == counts->requestor) | 257 | if (dn == counts->requestor) |
@@ -260,11 +262,11 @@ static void *count_spare_msis(struct device_node *dn, void *data) | |||
260 | req = 0; | 262 | req = 0; |
261 | p = of_get_property(dn, "ibm,req#msi", NULL); | 263 | p = of_get_property(dn, "ibm,req#msi", NULL); |
262 | if (p) | 264 | if (p) |
263 | req = *p; | 265 | req = be32_to_cpup(p); |
264 | 266 | ||
265 | p = of_get_property(dn, "ibm,req#msi-x", NULL); | 267 | p = of_get_property(dn, "ibm,req#msi-x", NULL); |
266 | if (p) | 268 | if (p) |
267 | req = max(req, (int)*p); | 269 | req = max(req, (int)be32_to_cpup(p)); |
268 | } | 270 | } |
269 | 271 | ||
270 | if (req < counts->quota) | 272 | if (req < counts->quota) |
diff --git a/arch/powerpc/platforms/pseries/nvram.c b/arch/powerpc/platforms/pseries/nvram.c index 7bfaf58d4664..d7096f2f7751 100644 --- a/arch/powerpc/platforms/pseries/nvram.c +++ b/arch/powerpc/platforms/pseries/nvram.c | |||
@@ -43,8 +43,8 @@ static char nvram_buf[NVRW_CNT]; /* assume this is in the first 4GB */ | |||
43 | static DEFINE_SPINLOCK(nvram_lock); | 43 | static DEFINE_SPINLOCK(nvram_lock); |
44 | 44 | ||
45 | struct err_log_info { | 45 | struct err_log_info { |
46 | int error_type; | 46 | __be32 error_type; |
47 | unsigned int seq_num; | 47 | __be32 seq_num; |
48 | }; | 48 | }; |
49 | 49 | ||
50 | struct nvram_os_partition { | 50 | struct nvram_os_partition { |
@@ -79,9 +79,9 @@ static const char *pseries_nvram_os_partitions[] = { | |||
79 | }; | 79 | }; |
80 | 80 | ||
81 | struct oops_log_info { | 81 | struct oops_log_info { |
82 | u16 version; | 82 | __be16 version; |
83 | u16 report_length; | 83 | __be16 report_length; |
84 | u64 timestamp; | 84 | __be64 timestamp; |
85 | } __attribute__((packed)); | 85 | } __attribute__((packed)); |
86 | 86 | ||
87 | static void oops_to_nvram(struct kmsg_dumper *dumper, | 87 | static void oops_to_nvram(struct kmsg_dumper *dumper, |
@@ -291,8 +291,8 @@ int nvram_write_os_partition(struct nvram_os_partition *part, char * buff, | |||
291 | length = part->size; | 291 | length = part->size; |
292 | } | 292 | } |
293 | 293 | ||
294 | info.error_type = err_type; | 294 | info.error_type = cpu_to_be32(err_type); |
295 | info.seq_num = error_log_cnt; | 295 | info.seq_num = cpu_to_be32(error_log_cnt); |
296 | 296 | ||
297 | tmp_index = part->index; | 297 | tmp_index = part->index; |
298 | 298 | ||
@@ -364,8 +364,8 @@ int nvram_read_partition(struct nvram_os_partition *part, char *buff, | |||
364 | } | 364 | } |
365 | 365 | ||
366 | if (part->os_partition) { | 366 | if (part->os_partition) { |
367 | *error_log_cnt = info.seq_num; | 367 | *error_log_cnt = be32_to_cpu(info.seq_num); |
368 | *err_type = info.error_type; | 368 | *err_type = be32_to_cpu(info.error_type); |
369 | } | 369 | } |
370 | 370 | ||
371 | return 0; | 371 | return 0; |
@@ -529,9 +529,9 @@ static int zip_oops(size_t text_len) | |||
529 | pr_err("nvram: logging uncompressed oops/panic report\n"); | 529 | pr_err("nvram: logging uncompressed oops/panic report\n"); |
530 | return -1; | 530 | return -1; |
531 | } | 531 | } |
532 | oops_hdr->version = OOPS_HDR_VERSION; | 532 | oops_hdr->version = cpu_to_be16(OOPS_HDR_VERSION); |
533 | oops_hdr->report_length = (u16) zipped_len; | 533 | oops_hdr->report_length = cpu_to_be16(zipped_len); |
534 | oops_hdr->timestamp = get_seconds(); | 534 | oops_hdr->timestamp = cpu_to_be64(get_seconds()); |
535 | return 0; | 535 | return 0; |
536 | } | 536 | } |
537 | 537 | ||
@@ -574,9 +574,9 @@ static int nvram_pstore_write(enum pstore_type_id type, | |||
574 | clobbering_unread_rtas_event()) | 574 | clobbering_unread_rtas_event()) |
575 | return -1; | 575 | return -1; |
576 | 576 | ||
577 | oops_hdr->version = OOPS_HDR_VERSION; | 577 | oops_hdr->version = cpu_to_be16(OOPS_HDR_VERSION); |
578 | oops_hdr->report_length = (u16) size; | 578 | oops_hdr->report_length = cpu_to_be16(size); |
579 | oops_hdr->timestamp = get_seconds(); | 579 | oops_hdr->timestamp = cpu_to_be64(get_seconds()); |
580 | 580 | ||
581 | if (compressed) | 581 | if (compressed) |
582 | err_type = ERR_TYPE_KERNEL_PANIC_GZ; | 582 | err_type = ERR_TYPE_KERNEL_PANIC_GZ; |
@@ -670,16 +670,16 @@ static ssize_t nvram_pstore_read(u64 *id, enum pstore_type_id *type, | |||
670 | size_t length, hdr_size; | 670 | size_t length, hdr_size; |
671 | 671 | ||
672 | oops_hdr = (struct oops_log_info *)buff; | 672 | oops_hdr = (struct oops_log_info *)buff; |
673 | if (oops_hdr->version < OOPS_HDR_VERSION) { | 673 | if (be16_to_cpu(oops_hdr->version) < OOPS_HDR_VERSION) { |
674 | /* Old format oops header had 2-byte record size */ | 674 | /* Old format oops header had 2-byte record size */ |
675 | hdr_size = sizeof(u16); | 675 | hdr_size = sizeof(u16); |
676 | length = oops_hdr->version; | 676 | length = be16_to_cpu(oops_hdr->version); |
677 | time->tv_sec = 0; | 677 | time->tv_sec = 0; |
678 | time->tv_nsec = 0; | 678 | time->tv_nsec = 0; |
679 | } else { | 679 | } else { |
680 | hdr_size = sizeof(*oops_hdr); | 680 | hdr_size = sizeof(*oops_hdr); |
681 | length = oops_hdr->report_length; | 681 | length = be16_to_cpu(oops_hdr->report_length); |
682 | time->tv_sec = oops_hdr->timestamp; | 682 | time->tv_sec = be64_to_cpu(oops_hdr->timestamp); |
683 | time->tv_nsec = 0; | 683 | time->tv_nsec = 0; |
684 | } | 684 | } |
685 | *buf = kmalloc(length, GFP_KERNEL); | 685 | *buf = kmalloc(length, GFP_KERNEL); |
@@ -889,13 +889,13 @@ static void oops_to_nvram(struct kmsg_dumper *dumper, | |||
889 | kmsg_dump_get_buffer(dumper, false, | 889 | kmsg_dump_get_buffer(dumper, false, |
890 | oops_data, oops_data_sz, &text_len); | 890 | oops_data, oops_data_sz, &text_len); |
891 | err_type = ERR_TYPE_KERNEL_PANIC; | 891 | err_type = ERR_TYPE_KERNEL_PANIC; |
892 | oops_hdr->version = OOPS_HDR_VERSION; | 892 | oops_hdr->version = cpu_to_be16(OOPS_HDR_VERSION); |
893 | oops_hdr->report_length = (u16) text_len; | 893 | oops_hdr->report_length = cpu_to_be16(text_len); |
894 | oops_hdr->timestamp = get_seconds(); | 894 | oops_hdr->timestamp = cpu_to_be64(get_seconds()); |
895 | } | 895 | } |
896 | 896 | ||
897 | (void) nvram_write_os_partition(&oops_log_partition, oops_buf, | 897 | (void) nvram_write_os_partition(&oops_log_partition, oops_buf, |
898 | (int) (sizeof(*oops_hdr) + oops_hdr->report_length), err_type, | 898 | (int) (sizeof(*oops_hdr) + text_len), err_type, |
899 | ++oops_count); | 899 | ++oops_count); |
900 | 900 | ||
901 | spin_unlock_irqrestore(&lock, flags); | 901 | spin_unlock_irqrestore(&lock, flags); |
diff --git a/arch/powerpc/platforms/pseries/pci.c b/arch/powerpc/platforms/pseries/pci.c index 5f93856cdf47..70670a2d9cf2 100644 --- a/arch/powerpc/platforms/pseries/pci.c +++ b/arch/powerpc/platforms/pseries/pci.c | |||
@@ -113,7 +113,7 @@ int pseries_root_bridge_prepare(struct pci_host_bridge *bridge) | |||
113 | { | 113 | { |
114 | struct device_node *dn, *pdn; | 114 | struct device_node *dn, *pdn; |
115 | struct pci_bus *bus; | 115 | struct pci_bus *bus; |
116 | const uint32_t *pcie_link_speed_stats; | 116 | const __be32 *pcie_link_speed_stats; |
117 | 117 | ||
118 | bus = bridge->bus; | 118 | bus = bridge->bus; |
119 | 119 | ||
@@ -122,7 +122,7 @@ int pseries_root_bridge_prepare(struct pci_host_bridge *bridge) | |||
122 | return 0; | 122 | return 0; |
123 | 123 | ||
124 | for (pdn = dn; pdn != NULL; pdn = of_get_next_parent(pdn)) { | 124 | for (pdn = dn; pdn != NULL; pdn = of_get_next_parent(pdn)) { |
125 | pcie_link_speed_stats = (const uint32_t *) of_get_property(pdn, | 125 | pcie_link_speed_stats = of_get_property(pdn, |
126 | "ibm,pcie-link-speed-stats", NULL); | 126 | "ibm,pcie-link-speed-stats", NULL); |
127 | if (pcie_link_speed_stats) | 127 | if (pcie_link_speed_stats) |
128 | break; | 128 | break; |
@@ -135,7 +135,7 @@ int pseries_root_bridge_prepare(struct pci_host_bridge *bridge) | |||
135 | return 0; | 135 | return 0; |
136 | } | 136 | } |
137 | 137 | ||
138 | switch (pcie_link_speed_stats[0]) { | 138 | switch (be32_to_cpup(pcie_link_speed_stats)) { |
139 | case 0x01: | 139 | case 0x01: |
140 | bus->max_bus_speed = PCIE_SPEED_2_5GT; | 140 | bus->max_bus_speed = PCIE_SPEED_2_5GT; |
141 | break; | 141 | break; |
@@ -147,7 +147,7 @@ int pseries_root_bridge_prepare(struct pci_host_bridge *bridge) | |||
147 | break; | 147 | break; |
148 | } | 148 | } |
149 | 149 | ||
150 | switch (pcie_link_speed_stats[1]) { | 150 | switch (be32_to_cpup(pcie_link_speed_stats)) { |
151 | case 0x01: | 151 | case 0x01: |
152 | bus->cur_bus_speed = PCIE_SPEED_2_5GT; | 152 | bus->cur_bus_speed = PCIE_SPEED_2_5GT; |
153 | break; | 153 | break; |
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index c1f190858701..6f76ae417f47 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c | |||
@@ -470,7 +470,7 @@ static long pseries_little_endian_exceptions(void) | |||
470 | 470 | ||
471 | static void __init pSeries_setup_arch(void) | 471 | static void __init pSeries_setup_arch(void) |
472 | { | 472 | { |
473 | panic_timeout = 10; | 473 | set_arch_panic_timeout(10, ARCH_PANIC_TIMEOUT); |
474 | 474 | ||
475 | /* Discover PIC type and setup ppc_md accordingly */ | 475 | /* Discover PIC type and setup ppc_md accordingly */ |
476 | pseries_discover_pic(); | 476 | pseries_discover_pic(); |
diff --git a/arch/powerpc/sysdev/ppc4xx_ocm.c b/arch/powerpc/sysdev/ppc4xx_ocm.c index b7c43453236d..85d9e37f5ccb 100644 --- a/arch/powerpc/sysdev/ppc4xx_ocm.c +++ b/arch/powerpc/sysdev/ppc4xx_ocm.c | |||
@@ -339,7 +339,7 @@ void *ppc4xx_ocm_alloc(phys_addr_t *phys, int size, int align, | |||
339 | if (IS_ERR_VALUE(offset)) | 339 | if (IS_ERR_VALUE(offset)) |
340 | continue; | 340 | continue; |
341 | 341 | ||
342 | ocm_blk = kzalloc(sizeof(struct ocm_block *), GFP_KERNEL); | 342 | ocm_blk = kzalloc(sizeof(struct ocm_block), GFP_KERNEL); |
343 | if (!ocm_blk) { | 343 | if (!ocm_blk) { |
344 | printk(KERN_ERR "PPC4XX OCM: could not allocate ocm block"); | 344 | printk(KERN_ERR "PPC4XX OCM: could not allocate ocm block"); |
345 | rh_free(ocm_reg->rh, offset); | 345 | rh_free(ocm_reg->rh, offset); |
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index 314fced4fc14..e9f312532526 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
@@ -101,7 +101,7 @@ config S390 | |||
101 | select GENERIC_CPU_DEVICES if !SMP | 101 | select GENERIC_CPU_DEVICES if !SMP |
102 | select GENERIC_FIND_FIRST_BIT | 102 | select GENERIC_FIND_FIRST_BIT |
103 | select GENERIC_SMP_IDLE_THREAD | 103 | select GENERIC_SMP_IDLE_THREAD |
104 | select GENERIC_TIME_VSYSCALL_OLD | 104 | select GENERIC_TIME_VSYSCALL |
105 | select HAVE_ALIGNED_STRUCT_PAGE if SLUB | 105 | select HAVE_ALIGNED_STRUCT_PAGE if SLUB |
106 | select HAVE_ARCH_JUMP_LABEL if !MARCH_G5 | 106 | select HAVE_ARCH_JUMP_LABEL if !MARCH_G5 |
107 | select HAVE_ARCH_SECCOMP_FILTER | 107 | select HAVE_ARCH_SECCOMP_FILTER |
@@ -135,7 +135,6 @@ config S390 | |||
135 | select HAVE_SYSCALL_TRACEPOINTS | 135 | select HAVE_SYSCALL_TRACEPOINTS |
136 | select HAVE_UID16 if 32BIT | 136 | select HAVE_UID16 if 32BIT |
137 | select HAVE_VIRT_CPU_ACCOUNTING | 137 | select HAVE_VIRT_CPU_ACCOUNTING |
138 | select INIT_ALL_POSSIBLE | ||
139 | select KTIME_SCALAR if 32BIT | 138 | select KTIME_SCALAR if 32BIT |
140 | select MODULES_USE_ELF_RELA | 139 | select MODULES_USE_ELF_RELA |
141 | select OLD_SIGACTION | 140 | select OLD_SIGACTION |
@@ -347,14 +346,14 @@ config SMP | |||
347 | Even if you don't know what to do here, say Y. | 346 | Even if you don't know what to do here, say Y. |
348 | 347 | ||
349 | config NR_CPUS | 348 | config NR_CPUS |
350 | int "Maximum number of CPUs (2-64)" | 349 | int "Maximum number of CPUs (2-256)" |
351 | range 2 64 | 350 | range 2 256 |
352 | depends on SMP | 351 | depends on SMP |
353 | default "32" if !64BIT | 352 | default "32" if !64BIT |
354 | default "64" if 64BIT | 353 | default "64" if 64BIT |
355 | help | 354 | help |
356 | This allows you to specify the maximum number of CPUs which this | 355 | This allows you to specify the maximum number of CPUs which this |
357 | kernel will support. The maximum supported value is 64 and the | 356 | kernel will support. The maximum supported value is 256 and the |
358 | minimum value which makes sense is 2. | 357 | minimum value which makes sense is 2. |
359 | 358 | ||
360 | This is purely to save memory - each supported CPU adds | 359 | This is purely to save memory - each supported CPU adds |
diff --git a/arch/s390/crypto/aes_s390.c b/arch/s390/crypto/aes_s390.c index 46cae138ece2..b3feabd39f31 100644 --- a/arch/s390/crypto/aes_s390.c +++ b/arch/s390/crypto/aes_s390.c | |||
@@ -35,7 +35,6 @@ static u8 *ctrblk; | |||
35 | static char keylen_flag; | 35 | static char keylen_flag; |
36 | 36 | ||
37 | struct s390_aes_ctx { | 37 | struct s390_aes_ctx { |
38 | u8 iv[AES_BLOCK_SIZE]; | ||
39 | u8 key[AES_MAX_KEY_SIZE]; | 38 | u8 key[AES_MAX_KEY_SIZE]; |
40 | long enc; | 39 | long enc; |
41 | long dec; | 40 | long dec; |
@@ -56,8 +55,7 @@ struct pcc_param { | |||
56 | 55 | ||
57 | struct s390_xts_ctx { | 56 | struct s390_xts_ctx { |
58 | u8 key[32]; | 57 | u8 key[32]; |
59 | u8 xts_param[16]; | 58 | u8 pcc_key[32]; |
60 | struct pcc_param pcc; | ||
61 | long enc; | 59 | long enc; |
62 | long dec; | 60 | long dec; |
63 | int key_len; | 61 | int key_len; |
@@ -441,30 +439,36 @@ static int cbc_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, | |||
441 | return aes_set_key(tfm, in_key, key_len); | 439 | return aes_set_key(tfm, in_key, key_len); |
442 | } | 440 | } |
443 | 441 | ||
444 | static int cbc_aes_crypt(struct blkcipher_desc *desc, long func, void *param, | 442 | static int cbc_aes_crypt(struct blkcipher_desc *desc, long func, |
445 | struct blkcipher_walk *walk) | 443 | struct blkcipher_walk *walk) |
446 | { | 444 | { |
445 | struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); | ||
447 | int ret = blkcipher_walk_virt(desc, walk); | 446 | int ret = blkcipher_walk_virt(desc, walk); |
448 | unsigned int nbytes = walk->nbytes; | 447 | unsigned int nbytes = walk->nbytes; |
448 | struct { | ||
449 | u8 iv[AES_BLOCK_SIZE]; | ||
450 | u8 key[AES_MAX_KEY_SIZE]; | ||
451 | } param; | ||
449 | 452 | ||
450 | if (!nbytes) | 453 | if (!nbytes) |
451 | goto out; | 454 | goto out; |
452 | 455 | ||
453 | memcpy(param, walk->iv, AES_BLOCK_SIZE); | 456 | memcpy(param.iv, walk->iv, AES_BLOCK_SIZE); |
457 | memcpy(param.key, sctx->key, sctx->key_len); | ||
454 | do { | 458 | do { |
455 | /* only use complete blocks */ | 459 | /* only use complete blocks */ |
456 | unsigned int n = nbytes & ~(AES_BLOCK_SIZE - 1); | 460 | unsigned int n = nbytes & ~(AES_BLOCK_SIZE - 1); |
457 | u8 *out = walk->dst.virt.addr; | 461 | u8 *out = walk->dst.virt.addr; |
458 | u8 *in = walk->src.virt.addr; | 462 | u8 *in = walk->src.virt.addr; |
459 | 463 | ||
460 | ret = crypt_s390_kmc(func, param, out, in, n); | 464 | ret = crypt_s390_kmc(func, ¶m, out, in, n); |
461 | if (ret < 0 || ret != n) | 465 | if (ret < 0 || ret != n) |
462 | return -EIO; | 466 | return -EIO; |
463 | 467 | ||
464 | nbytes &= AES_BLOCK_SIZE - 1; | 468 | nbytes &= AES_BLOCK_SIZE - 1; |
465 | ret = blkcipher_walk_done(desc, walk, nbytes); | 469 | ret = blkcipher_walk_done(desc, walk, nbytes); |
466 | } while ((nbytes = walk->nbytes)); | 470 | } while ((nbytes = walk->nbytes)); |
467 | memcpy(walk->iv, param, AES_BLOCK_SIZE); | 471 | memcpy(walk->iv, param.iv, AES_BLOCK_SIZE); |
468 | 472 | ||
469 | out: | 473 | out: |
470 | return ret; | 474 | return ret; |
@@ -481,7 +485,7 @@ static int cbc_aes_encrypt(struct blkcipher_desc *desc, | |||
481 | return fallback_blk_enc(desc, dst, src, nbytes); | 485 | return fallback_blk_enc(desc, dst, src, nbytes); |
482 | 486 | ||
483 | blkcipher_walk_init(&walk, dst, src, nbytes); | 487 | blkcipher_walk_init(&walk, dst, src, nbytes); |
484 | return cbc_aes_crypt(desc, sctx->enc, sctx->iv, &walk); | 488 | return cbc_aes_crypt(desc, sctx->enc, &walk); |
485 | } | 489 | } |
486 | 490 | ||
487 | static int cbc_aes_decrypt(struct blkcipher_desc *desc, | 491 | static int cbc_aes_decrypt(struct blkcipher_desc *desc, |
@@ -495,7 +499,7 @@ static int cbc_aes_decrypt(struct blkcipher_desc *desc, | |||
495 | return fallback_blk_dec(desc, dst, src, nbytes); | 499 | return fallback_blk_dec(desc, dst, src, nbytes); |
496 | 500 | ||
497 | blkcipher_walk_init(&walk, dst, src, nbytes); | 501 | blkcipher_walk_init(&walk, dst, src, nbytes); |
498 | return cbc_aes_crypt(desc, sctx->dec, sctx->iv, &walk); | 502 | return cbc_aes_crypt(desc, sctx->dec, &walk); |
499 | } | 503 | } |
500 | 504 | ||
501 | static struct crypto_alg cbc_aes_alg = { | 505 | static struct crypto_alg cbc_aes_alg = { |
@@ -586,7 +590,7 @@ static int xts_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, | |||
586 | xts_ctx->enc = KM_XTS_128_ENCRYPT; | 590 | xts_ctx->enc = KM_XTS_128_ENCRYPT; |
587 | xts_ctx->dec = KM_XTS_128_DECRYPT; | 591 | xts_ctx->dec = KM_XTS_128_DECRYPT; |
588 | memcpy(xts_ctx->key + 16, in_key, 16); | 592 | memcpy(xts_ctx->key + 16, in_key, 16); |
589 | memcpy(xts_ctx->pcc.key + 16, in_key + 16, 16); | 593 | memcpy(xts_ctx->pcc_key + 16, in_key + 16, 16); |
590 | break; | 594 | break; |
591 | case 48: | 595 | case 48: |
592 | xts_ctx->enc = 0; | 596 | xts_ctx->enc = 0; |
@@ -597,7 +601,7 @@ static int xts_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, | |||
597 | xts_ctx->enc = KM_XTS_256_ENCRYPT; | 601 | xts_ctx->enc = KM_XTS_256_ENCRYPT; |
598 | xts_ctx->dec = KM_XTS_256_DECRYPT; | 602 | xts_ctx->dec = KM_XTS_256_DECRYPT; |
599 | memcpy(xts_ctx->key, in_key, 32); | 603 | memcpy(xts_ctx->key, in_key, 32); |
600 | memcpy(xts_ctx->pcc.key, in_key + 32, 32); | 604 | memcpy(xts_ctx->pcc_key, in_key + 32, 32); |
601 | break; | 605 | break; |
602 | default: | 606 | default: |
603 | *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; | 607 | *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; |
@@ -616,29 +620,33 @@ static int xts_aes_crypt(struct blkcipher_desc *desc, long func, | |||
616 | unsigned int nbytes = walk->nbytes; | 620 | unsigned int nbytes = walk->nbytes; |
617 | unsigned int n; | 621 | unsigned int n; |
618 | u8 *in, *out; | 622 | u8 *in, *out; |
619 | void *param; | 623 | struct pcc_param pcc_param; |
624 | struct { | ||
625 | u8 key[32]; | ||
626 | u8 init[16]; | ||
627 | } xts_param; | ||
620 | 628 | ||
621 | if (!nbytes) | 629 | if (!nbytes) |
622 | goto out; | 630 | goto out; |
623 | 631 | ||
624 | memset(xts_ctx->pcc.block, 0, sizeof(xts_ctx->pcc.block)); | 632 | memset(pcc_param.block, 0, sizeof(pcc_param.block)); |
625 | memset(xts_ctx->pcc.bit, 0, sizeof(xts_ctx->pcc.bit)); | 633 | memset(pcc_param.bit, 0, sizeof(pcc_param.bit)); |
626 | memset(xts_ctx->pcc.xts, 0, sizeof(xts_ctx->pcc.xts)); | 634 | memset(pcc_param.xts, 0, sizeof(pcc_param.xts)); |
627 | memcpy(xts_ctx->pcc.tweak, walk->iv, sizeof(xts_ctx->pcc.tweak)); | 635 | memcpy(pcc_param.tweak, walk->iv, sizeof(pcc_param.tweak)); |
628 | param = xts_ctx->pcc.key + offset; | 636 | memcpy(pcc_param.key, xts_ctx->pcc_key, 32); |
629 | ret = crypt_s390_pcc(func, param); | 637 | ret = crypt_s390_pcc(func, &pcc_param.key[offset]); |
630 | if (ret < 0) | 638 | if (ret < 0) |
631 | return -EIO; | 639 | return -EIO; |
632 | 640 | ||
633 | memcpy(xts_ctx->xts_param, xts_ctx->pcc.xts, 16); | 641 | memcpy(xts_param.key, xts_ctx->key, 32); |
634 | param = xts_ctx->key + offset; | 642 | memcpy(xts_param.init, pcc_param.xts, 16); |
635 | do { | 643 | do { |
636 | /* only use complete blocks */ | 644 | /* only use complete blocks */ |
637 | n = nbytes & ~(AES_BLOCK_SIZE - 1); | 645 | n = nbytes & ~(AES_BLOCK_SIZE - 1); |
638 | out = walk->dst.virt.addr; | 646 | out = walk->dst.virt.addr; |
639 | in = walk->src.virt.addr; | 647 | in = walk->src.virt.addr; |
640 | 648 | ||
641 | ret = crypt_s390_km(func, param, out, in, n); | 649 | ret = crypt_s390_km(func, &xts_param.key[offset], out, in, n); |
642 | if (ret < 0 || ret != n) | 650 | if (ret < 0 || ret != n) |
643 | return -EIO; | 651 | return -EIO; |
644 | 652 | ||
diff --git a/arch/s390/include/asm/barrier.h b/arch/s390/include/asm/barrier.h index 16760eeb79b0..578680f6207a 100644 --- a/arch/s390/include/asm/barrier.h +++ b/arch/s390/include/asm/barrier.h | |||
@@ -32,4 +32,19 @@ | |||
32 | 32 | ||
33 | #define set_mb(var, value) do { var = value; mb(); } while (0) | 33 | #define set_mb(var, value) do { var = value; mb(); } while (0) |
34 | 34 | ||
35 | #define smp_store_release(p, v) \ | ||
36 | do { \ | ||
37 | compiletime_assert_atomic_type(*p); \ | ||
38 | barrier(); \ | ||
39 | ACCESS_ONCE(*p) = (v); \ | ||
40 | } while (0) | ||
41 | |||
42 | #define smp_load_acquire(p) \ | ||
43 | ({ \ | ||
44 | typeof(*p) ___p1 = ACCESS_ONCE(*p); \ | ||
45 | compiletime_assert_atomic_type(*p); \ | ||
46 | barrier(); \ | ||
47 | ___p1; \ | ||
48 | }) | ||
49 | |||
35 | #endif /* __ASM_BARRIER_H */ | 50 | #endif /* __ASM_BARRIER_H */ |
diff --git a/arch/s390/include/asm/compat.h b/arch/s390/include/asm/compat.h index 4bf9da03591e..5d7e8cf83bd6 100644 --- a/arch/s390/include/asm/compat.h +++ b/arch/s390/include/asm/compat.h | |||
@@ -38,7 +38,8 @@ | |||
38 | 38 | ||
39 | #define PSW32_USER_BITS (PSW32_MASK_DAT | PSW32_MASK_IO | PSW32_MASK_EXT | \ | 39 | #define PSW32_USER_BITS (PSW32_MASK_DAT | PSW32_MASK_IO | PSW32_MASK_EXT | \ |
40 | PSW32_DEFAULT_KEY | PSW32_MASK_BASE | \ | 40 | PSW32_DEFAULT_KEY | PSW32_MASK_BASE | \ |
41 | PSW32_MASK_MCHECK | PSW32_MASK_PSTATE | PSW32_ASC_HOME) | 41 | PSW32_MASK_MCHECK | PSW32_MASK_PSTATE | \ |
42 | PSW32_ASC_PRIMARY) | ||
42 | 43 | ||
43 | #define COMPAT_USER_HZ 100 | 44 | #define COMPAT_USER_HZ 100 |
44 | #define COMPAT_UTS_MACHINE "s390\0\0\0\0" | 45 | #define COMPAT_UTS_MACHINE "s390\0\0\0\0" |
diff --git a/arch/s390/include/asm/cpu_mf.h b/arch/s390/include/asm/cpu_mf.h index c879fad404c8..cb700d54bd83 100644 --- a/arch/s390/include/asm/cpu_mf.h +++ b/arch/s390/include/asm/cpu_mf.h | |||
@@ -56,6 +56,96 @@ struct cpumf_ctr_info { | |||
56 | u32 reserved2[12]; | 56 | u32 reserved2[12]; |
57 | } __packed; | 57 | } __packed; |
58 | 58 | ||
59 | /* QUERY SAMPLING INFORMATION block */ | ||
60 | struct hws_qsi_info_block { /* Bit(s) */ | ||
61 | unsigned int b0_13:14; /* 0-13: zeros */ | ||
62 | unsigned int as:1; /* 14: basic-sampling authorization */ | ||
63 | unsigned int ad:1; /* 15: diag-sampling authorization */ | ||
64 | unsigned int b16_21:6; /* 16-21: zeros */ | ||
65 | unsigned int es:1; /* 22: basic-sampling enable control */ | ||
66 | unsigned int ed:1; /* 23: diag-sampling enable control */ | ||
67 | unsigned int b24_29:6; /* 24-29: zeros */ | ||
68 | unsigned int cs:1; /* 30: basic-sampling activation control */ | ||
69 | unsigned int cd:1; /* 31: diag-sampling activation control */ | ||
70 | unsigned int bsdes:16; /* 4-5: size of basic sampling entry */ | ||
71 | unsigned int dsdes:16; /* 6-7: size of diagnostic sampling entry */ | ||
72 | unsigned long min_sampl_rate; /* 8-15: minimum sampling interval */ | ||
73 | unsigned long max_sampl_rate; /* 16-23: maximum sampling interval*/ | ||
74 | unsigned long tear; /* 24-31: TEAR contents */ | ||
75 | unsigned long dear; /* 32-39: DEAR contents */ | ||
76 | unsigned int rsvrd0; /* 40-43: reserved */ | ||
77 | unsigned int cpu_speed; /* 44-47: CPU speed */ | ||
78 | unsigned long long rsvrd1; /* 48-55: reserved */ | ||
79 | unsigned long long rsvrd2; /* 56-63: reserved */ | ||
80 | } __packed; | ||
81 | |||
82 | /* SET SAMPLING CONTROLS request block */ | ||
83 | struct hws_lsctl_request_block { | ||
84 | unsigned int s:1; /* 0: maximum buffer indicator */ | ||
85 | unsigned int h:1; /* 1: part. level reserved for VM use*/ | ||
86 | unsigned long long b2_53:52;/* 2-53: zeros */ | ||
87 | unsigned int es:1; /* 54: basic-sampling enable control */ | ||
88 | unsigned int ed:1; /* 55: diag-sampling enable control */ | ||
89 | unsigned int b56_61:6; /* 56-61: - zeros */ | ||
90 | unsigned int cs:1; /* 62: basic-sampling activation control */ | ||
91 | unsigned int cd:1; /* 63: diag-sampling activation control */ | ||
92 | unsigned long interval; /* 8-15: sampling interval */ | ||
93 | unsigned long tear; /* 16-23: TEAR contents */ | ||
94 | unsigned long dear; /* 24-31: DEAR contents */ | ||
95 | /* 32-63: */ | ||
96 | unsigned long rsvrd1; /* reserved */ | ||
97 | unsigned long rsvrd2; /* reserved */ | ||
98 | unsigned long rsvrd3; /* reserved */ | ||
99 | unsigned long rsvrd4; /* reserved */ | ||
100 | } __packed; | ||
101 | |||
102 | struct hws_basic_entry { | ||
103 | unsigned int def:16; /* 0-15 Data Entry Format */ | ||
104 | unsigned int R:4; /* 16-19 reserved */ | ||
105 | unsigned int U:4; /* 20-23 Number of unique instruct. */ | ||
106 | unsigned int z:2; /* zeros */ | ||
107 | unsigned int T:1; /* 26 PSW DAT mode */ | ||
108 | unsigned int W:1; /* 27 PSW wait state */ | ||
109 | unsigned int P:1; /* 28 PSW Problem state */ | ||
110 | unsigned int AS:2; /* 29-30 PSW address-space control */ | ||
111 | unsigned int I:1; /* 31 entry valid or invalid */ | ||
112 | unsigned int:16; | ||
113 | unsigned int prim_asn:16; /* primary ASN */ | ||
114 | unsigned long long ia; /* Instruction Address */ | ||
115 | unsigned long long gpp; /* Guest Program Parameter */ | ||
116 | unsigned long long hpp; /* Host Program Parameter */ | ||
117 | } __packed; | ||
118 | |||
119 | struct hws_diag_entry { | ||
120 | unsigned int def:16; /* 0-15 Data Entry Format */ | ||
121 | unsigned int R:14; /* 16-19 and 20-30 reserved */ | ||
122 | unsigned int I:1; /* 31 entry valid or invalid */ | ||
123 | u8 data[]; /* Machine-dependent sample data */ | ||
124 | } __packed; | ||
125 | |||
126 | struct hws_combined_entry { | ||
127 | struct hws_basic_entry basic; /* Basic-sampling data entry */ | ||
128 | struct hws_diag_entry diag; /* Diagnostic-sampling data entry */ | ||
129 | } __packed; | ||
130 | |||
131 | struct hws_trailer_entry { | ||
132 | union { | ||
133 | struct { | ||
134 | unsigned int f:1; /* 0 - Block Full Indicator */ | ||
135 | unsigned int a:1; /* 1 - Alert request control */ | ||
136 | unsigned int t:1; /* 2 - Timestamp format */ | ||
137 | unsigned long long:61; /* 3 - 63: Reserved */ | ||
138 | }; | ||
139 | unsigned long long flags; /* 0 - 63: All indicators */ | ||
140 | }; | ||
141 | unsigned long long overflow; /* 64 - sample Overflow count */ | ||
142 | unsigned char timestamp[16]; /* 16 - 31 timestamp */ | ||
143 | unsigned long long reserved1; /* 32 -Reserved */ | ||
144 | unsigned long long reserved2; /* */ | ||
145 | unsigned long long progusage1; /* 48 - reserved for programming use */ | ||
146 | unsigned long long progusage2; /* */ | ||
147 | } __packed; | ||
148 | |||
59 | /* Query counter information */ | 149 | /* Query counter information */ |
60 | static inline int qctri(struct cpumf_ctr_info *info) | 150 | static inline int qctri(struct cpumf_ctr_info *info) |
61 | { | 151 | { |
@@ -99,4 +189,95 @@ static inline int ecctr(u64 ctr, u64 *val) | |||
99 | return cc; | 189 | return cc; |
100 | } | 190 | } |
101 | 191 | ||
192 | /* Query sampling information */ | ||
193 | static inline int qsi(struct hws_qsi_info_block *info) | ||
194 | { | ||
195 | int cc; | ||
196 | cc = 1; | ||
197 | |||
198 | asm volatile( | ||
199 | "0: .insn s,0xb2860000,0(%1)\n" | ||
200 | "1: lhi %0,0\n" | ||
201 | "2:\n" | ||
202 | EX_TABLE(0b, 2b) EX_TABLE(1b, 2b) | ||
203 | : "=d" (cc), "+a" (info) | ||
204 | : "m" (*info) | ||
205 | : "cc", "memory"); | ||
206 | |||
207 | return cc ? -EINVAL : 0; | ||
208 | } | ||
209 | |||
210 | /* Load sampling controls */ | ||
211 | static inline int lsctl(struct hws_lsctl_request_block *req) | ||
212 | { | ||
213 | int cc; | ||
214 | |||
215 | cc = 1; | ||
216 | asm volatile( | ||
217 | "0: .insn s,0xb2870000,0(%1)\n" | ||
218 | "1: ipm %0\n" | ||
219 | " srl %0,28\n" | ||
220 | "2:\n" | ||
221 | EX_TABLE(0b, 2b) EX_TABLE(1b, 2b) | ||
222 | : "+d" (cc), "+a" (req) | ||
223 | : "m" (*req) | ||
224 | : "cc", "memory"); | ||
225 | |||
226 | return cc ? -EINVAL : 0; | ||
227 | } | ||
228 | |||
229 | /* Sampling control helper functions */ | ||
230 | |||
231 | #include <linux/time.h> | ||
232 | |||
233 | static inline unsigned long freq_to_sample_rate(struct hws_qsi_info_block *qsi, | ||
234 | unsigned long freq) | ||
235 | { | ||
236 | return (USEC_PER_SEC / freq) * qsi->cpu_speed; | ||
237 | } | ||
238 | |||
239 | static inline unsigned long sample_rate_to_freq(struct hws_qsi_info_block *qsi, | ||
240 | unsigned long rate) | ||
241 | { | ||
242 | return USEC_PER_SEC * qsi->cpu_speed / rate; | ||
243 | } | ||
244 | |||
245 | #define SDB_TE_ALERT_REQ_MASK 0x4000000000000000UL | ||
246 | #define SDB_TE_BUFFER_FULL_MASK 0x8000000000000000UL | ||
247 | |||
248 | /* Return TOD timestamp contained in an trailer entry */ | ||
249 | static inline unsigned long long trailer_timestamp(struct hws_trailer_entry *te) | ||
250 | { | ||
251 | /* TOD in STCKE format */ | ||
252 | if (te->t) | ||
253 | return *((unsigned long long *) &te->timestamp[1]); | ||
254 | |||
255 | /* TOD in STCK format */ | ||
256 | return *((unsigned long long *) &te->timestamp[0]); | ||
257 | } | ||
258 | |||
259 | /* Return pointer to trailer entry of an sample data block */ | ||
260 | static inline unsigned long *trailer_entry_ptr(unsigned long v) | ||
261 | { | ||
262 | void *ret; | ||
263 | |||
264 | ret = (void *) v; | ||
265 | ret += PAGE_SIZE; | ||
266 | ret -= sizeof(struct hws_trailer_entry); | ||
267 | |||
268 | return (unsigned long *) ret; | ||
269 | } | ||
270 | |||
271 | /* Return if the entry in the sample data block table (sdbt) | ||
272 | * is a link to the next sdbt */ | ||
273 | static inline int is_link_entry(unsigned long *s) | ||
274 | { | ||
275 | return *s & 0x1ul ? 1 : 0; | ||
276 | } | ||
277 | |||
278 | /* Return pointer to the linked sdbt */ | ||
279 | static inline unsigned long *get_next_sdbt(unsigned long *s) | ||
280 | { | ||
281 | return (unsigned long *) (*s & ~0x1ul); | ||
282 | } | ||
102 | #endif /* _ASM_S390_CPU_MF_H */ | 283 | #endif /* _ASM_S390_CPU_MF_H */ |
diff --git a/arch/s390/include/asm/css_chars.h b/arch/s390/include/asm/css_chars.h index 7e1c917bbba2..09d1dd46bd57 100644 --- a/arch/s390/include/asm/css_chars.h +++ b/arch/s390/include/asm/css_chars.h | |||
@@ -29,6 +29,8 @@ struct css_general_char { | |||
29 | u32 fcx : 1; /* bit 88 */ | 29 | u32 fcx : 1; /* bit 88 */ |
30 | u32 : 19; | 30 | u32 : 19; |
31 | u32 alt_ssi : 1; /* bit 108 */ | 31 | u32 alt_ssi : 1; /* bit 108 */ |
32 | u32:1; | ||
33 | u32 narf:1; /* bit 110 */ | ||
32 | } __packed; | 34 | } __packed; |
33 | 35 | ||
34 | extern struct css_general_char css_general_characteristics; | 36 | extern struct css_general_char css_general_characteristics; |
diff --git a/arch/s390/include/asm/page.h b/arch/s390/include/asm/page.h index 316c8503a3b4..114258eeaacd 100644 --- a/arch/s390/include/asm/page.h +++ b/arch/s390/include/asm/page.h | |||
@@ -48,33 +48,21 @@ static inline void clear_page(void *page) | |||
48 | : "memory", "cc"); | 48 | : "memory", "cc"); |
49 | } | 49 | } |
50 | 50 | ||
51 | /* | ||
52 | * copy_page uses the mvcl instruction with 0xb0 padding byte in order to | ||
53 | * bypass caches when copying a page. Especially when copying huge pages | ||
54 | * this keeps L1 and L2 data caches alive. | ||
55 | */ | ||
51 | static inline void copy_page(void *to, void *from) | 56 | static inline void copy_page(void *to, void *from) |
52 | { | 57 | { |
53 | if (MACHINE_HAS_MVPG) { | 58 | register void *reg2 asm ("2") = to; |
54 | register unsigned long reg0 asm ("0") = 0; | 59 | register unsigned long reg3 asm ("3") = 0x1000; |
55 | asm volatile( | 60 | register void *reg4 asm ("4") = from; |
56 | " mvpg %0,%1" | 61 | register unsigned long reg5 asm ("5") = 0xb0001000; |
57 | : : "a" (to), "a" (from), "d" (reg0) | 62 | asm volatile( |
58 | : "memory", "cc"); | 63 | " mvcl 2,4" |
59 | } else | 64 | : "+d" (reg2), "+d" (reg3), "+d" (reg4), "+d" (reg5) |
60 | asm volatile( | 65 | : : "memory", "cc"); |
61 | " mvc 0(256,%0),0(%1)\n" | ||
62 | " mvc 256(256,%0),256(%1)\n" | ||
63 | " mvc 512(256,%0),512(%1)\n" | ||
64 | " mvc 768(256,%0),768(%1)\n" | ||
65 | " mvc 1024(256,%0),1024(%1)\n" | ||
66 | " mvc 1280(256,%0),1280(%1)\n" | ||
67 | " mvc 1536(256,%0),1536(%1)\n" | ||
68 | " mvc 1792(256,%0),1792(%1)\n" | ||
69 | " mvc 2048(256,%0),2048(%1)\n" | ||
70 | " mvc 2304(256,%0),2304(%1)\n" | ||
71 | " mvc 2560(256,%0),2560(%1)\n" | ||
72 | " mvc 2816(256,%0),2816(%1)\n" | ||
73 | " mvc 3072(256,%0),3072(%1)\n" | ||
74 | " mvc 3328(256,%0),3328(%1)\n" | ||
75 | " mvc 3584(256,%0),3584(%1)\n" | ||
76 | " mvc 3840(256,%0),3840(%1)\n" | ||
77 | : : "a" (to), "a" (from) : "memory"); | ||
78 | } | 66 | } |
79 | 67 | ||
80 | #define clear_user_page(page, vaddr, pg) clear_page(page) | 68 | #define clear_user_page(page, vaddr, pg) clear_page(page) |
diff --git a/arch/s390/include/asm/pci.h b/arch/s390/include/asm/pci.h index c129ab2ac731..2583466f576b 100644 --- a/arch/s390/include/asm/pci.h +++ b/arch/s390/include/asm/pci.h | |||
@@ -144,6 +144,7 @@ int clp_disable_fh(struct zpci_dev *); | |||
144 | void zpci_event_error(void *); | 144 | void zpci_event_error(void *); |
145 | void zpci_event_availability(void *); | 145 | void zpci_event_availability(void *); |
146 | void zpci_rescan(void); | 146 | void zpci_rescan(void); |
147 | bool zpci_is_enabled(void); | ||
147 | #else /* CONFIG_PCI */ | 148 | #else /* CONFIG_PCI */ |
148 | static inline void zpci_event_error(void *e) {} | 149 | static inline void zpci_event_error(void *e) {} |
149 | static inline void zpci_event_availability(void *e) {} | 150 | static inline void zpci_event_availability(void *e) {} |
diff --git a/arch/s390/include/asm/perf_event.h b/arch/s390/include/asm/perf_event.h index 1141fb3e7b21..159a8ec6da9a 100644 --- a/arch/s390/include/asm/perf_event.h +++ b/arch/s390/include/asm/perf_event.h | |||
@@ -1,21 +1,40 @@ | |||
1 | /* | 1 | /* |
2 | * Performance event support - s390 specific definitions. | 2 | * Performance event support - s390 specific definitions. |
3 | * | 3 | * |
4 | * Copyright IBM Corp. 2009, 2012 | 4 | * Copyright IBM Corp. 2009, 2013 |
5 | * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com> | 5 | * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com> |
6 | * Hendrik Brueckner <brueckner@linux.vnet.ibm.com> | 6 | * Hendrik Brueckner <brueckner@linux.vnet.ibm.com> |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #include <asm/cpu_mf.h> | 9 | #ifndef _ASM_S390_PERF_EVENT_H |
10 | #define _ASM_S390_PERF_EVENT_H | ||
10 | 11 | ||
11 | /* CPU-measurement counter facility */ | 12 | #ifdef CONFIG_64BIT |
12 | #define PERF_CPUM_CF_MAX_CTR 256 | 13 | |
14 | #include <linux/perf_event.h> | ||
15 | #include <linux/device.h> | ||
16 | #include <asm/cpu_mf.h> | ||
13 | 17 | ||
14 | /* Per-CPU flags for PMU states */ | 18 | /* Per-CPU flags for PMU states */ |
15 | #define PMU_F_RESERVED 0x1000 | 19 | #define PMU_F_RESERVED 0x1000 |
16 | #define PMU_F_ENABLED 0x2000 | 20 | #define PMU_F_ENABLED 0x2000 |
21 | #define PMU_F_IN_USE 0x4000 | ||
22 | #define PMU_F_ERR_IBE 0x0100 | ||
23 | #define PMU_F_ERR_LSDA 0x0200 | ||
24 | #define PMU_F_ERR_MASK (PMU_F_ERR_IBE|PMU_F_ERR_LSDA) | ||
25 | |||
26 | /* Perf defintions for PMU event attributes in sysfs */ | ||
27 | extern __init const struct attribute_group **cpumf_cf_event_group(void); | ||
28 | extern ssize_t cpumf_events_sysfs_show(struct device *dev, | ||
29 | struct device_attribute *attr, | ||
30 | char *page); | ||
31 | #define EVENT_VAR(_cat, _name) event_attr_##_cat##_##_name | ||
32 | #define EVENT_PTR(_cat, _name) (&EVENT_VAR(_cat, _name).attr.attr) | ||
33 | |||
34 | #define CPUMF_EVENT_ATTR(cat, name, id) \ | ||
35 | PMU_EVENT_ATTR(name, EVENT_VAR(cat, name), id, cpumf_events_sysfs_show) | ||
36 | #define CPUMF_EVENT_PTR(cat, name) EVENT_PTR(cat, name) | ||
17 | 37 | ||
18 | #ifdef CONFIG_64BIT | ||
19 | 38 | ||
20 | /* Perf callbacks */ | 39 | /* Perf callbacks */ |
21 | struct pt_regs; | 40 | struct pt_regs; |
@@ -23,4 +42,55 @@ extern unsigned long perf_instruction_pointer(struct pt_regs *regs); | |||
23 | extern unsigned long perf_misc_flags(struct pt_regs *regs); | 42 | extern unsigned long perf_misc_flags(struct pt_regs *regs); |
24 | #define perf_misc_flags(regs) perf_misc_flags(regs) | 43 | #define perf_misc_flags(regs) perf_misc_flags(regs) |
25 | 44 | ||
45 | /* Perf pt_regs extension for sample-data-entry indicators */ | ||
46 | struct perf_sf_sde_regs { | ||
47 | unsigned char in_guest:1; /* guest sample */ | ||
48 | unsigned long reserved:63; /* reserved */ | ||
49 | }; | ||
50 | |||
51 | /* Perf PMU definitions for the counter facility */ | ||
52 | #define PERF_CPUM_CF_MAX_CTR 256 | ||
53 | |||
54 | /* Perf PMU definitions for the sampling facility */ | ||
55 | #define PERF_CPUM_SF_MAX_CTR 2 | ||
56 | #define PERF_EVENT_CPUM_SF 0xB0000UL /* Event: Basic-sampling */ | ||
57 | #define PERF_EVENT_CPUM_SF_DIAG 0xBD000UL /* Event: Combined-sampling */ | ||
58 | #define PERF_CPUM_SF_BASIC_MODE 0x0001 /* Basic-sampling flag */ | ||
59 | #define PERF_CPUM_SF_DIAG_MODE 0x0002 /* Diagnostic-sampling flag */ | ||
60 | #define PERF_CPUM_SF_MODE_MASK (PERF_CPUM_SF_BASIC_MODE| \ | ||
61 | PERF_CPUM_SF_DIAG_MODE) | ||
62 | #define PERF_CPUM_SF_FULL_BLOCKS 0x0004 /* Process full SDBs only */ | ||
63 | |||
64 | #define REG_NONE 0 | ||
65 | #define REG_OVERFLOW 1 | ||
66 | #define OVERFLOW_REG(hwc) ((hwc)->extra_reg.config) | ||
67 | #define SFB_ALLOC_REG(hwc) ((hwc)->extra_reg.alloc) | ||
68 | #define RAWSAMPLE_REG(hwc) ((hwc)->config) | ||
69 | #define TEAR_REG(hwc) ((hwc)->last_tag) | ||
70 | #define SAMPL_RATE(hwc) ((hwc)->event_base) | ||
71 | #define SAMPL_FLAGS(hwc) ((hwc)->config_base) | ||
72 | #define SAMPL_DIAG_MODE(hwc) (SAMPL_FLAGS(hwc) & PERF_CPUM_SF_DIAG_MODE) | ||
73 | #define SDB_FULL_BLOCKS(hwc) (SAMPL_FLAGS(hwc) & PERF_CPUM_SF_FULL_BLOCKS) | ||
74 | |||
75 | /* Structure for sampling data entries to be passed as perf raw sample data | ||
76 | * to user space. Note that raw sample data must be aligned and, thus, might | ||
77 | * be padded with zeros. | ||
78 | */ | ||
79 | struct sf_raw_sample { | ||
80 | #define SF_RAW_SAMPLE_BASIC PERF_CPUM_SF_BASIC_MODE | ||
81 | #define SF_RAW_SAMPLE_DIAG PERF_CPUM_SF_DIAG_MODE | ||
82 | u64 format; | ||
83 | u32 size; /* Size of sf_raw_sample */ | ||
84 | u16 bsdes; /* Basic-sampling data entry size */ | ||
85 | u16 dsdes; /* Diagnostic-sampling data entry size */ | ||
86 | struct hws_basic_entry basic; /* Basic-sampling data entry */ | ||
87 | struct hws_diag_entry diag; /* Diagnostic-sampling data entry */ | ||
88 | u8 padding[]; /* Padding to next multiple of 8 */ | ||
89 | } __packed; | ||
90 | |||
91 | /* Perf hardware reserve and release functions */ | ||
92 | int perf_reserve_sampling(void); | ||
93 | void perf_release_sampling(void); | ||
94 | |||
26 | #endif /* CONFIG_64BIT */ | 95 | #endif /* CONFIG_64BIT */ |
96 | #endif /* _ASM_S390_PERF_EVENT_H */ | ||
diff --git a/arch/s390/include/asm/qdio.h b/arch/s390/include/asm/qdio.h index 57d0d7e794b1..d786c634e052 100644 --- a/arch/s390/include/asm/qdio.h +++ b/arch/s390/include/asm/qdio.h | |||
@@ -336,7 +336,7 @@ typedef void qdio_handler_t(struct ccw_device *, unsigned int, int, | |||
336 | #define QDIO_FLAG_CLEANUP_USING_HALT 0x02 | 336 | #define QDIO_FLAG_CLEANUP_USING_HALT 0x02 |
337 | 337 | ||
338 | /** | 338 | /** |
339 | * struct qdio_initialize - qdio initalization data | 339 | * struct qdio_initialize - qdio initialization data |
340 | * @cdev: associated ccw device | 340 | * @cdev: associated ccw device |
341 | * @q_format: queue format | 341 | * @q_format: queue format |
342 | * @adapter_name: name for the adapter | 342 | * @adapter_name: name for the adapter |
@@ -378,6 +378,34 @@ struct qdio_initialize { | |||
378 | struct qdio_outbuf_state *output_sbal_state_array; | 378 | struct qdio_outbuf_state *output_sbal_state_array; |
379 | }; | 379 | }; |
380 | 380 | ||
381 | /** | ||
382 | * enum qdio_brinfo_entry_type - type of address entry for qdio_brinfo_desc() | ||
383 | * @l3_ipv6_addr: entry contains IPv6 address | ||
384 | * @l3_ipv4_addr: entry contains IPv4 address | ||
385 | * @l2_addr_lnid: entry contains MAC address and VLAN ID | ||
386 | */ | ||
387 | enum qdio_brinfo_entry_type {l3_ipv6_addr, l3_ipv4_addr, l2_addr_lnid}; | ||
388 | |||
389 | /** | ||
390 | * struct qdio_brinfo_entry_XXX - Address entry for qdio_brinfo_desc() | ||
391 | * @nit: Network interface token | ||
392 | * @addr: Address of one of the three types | ||
393 | * | ||
394 | * The struct is passed to the callback function by qdio_brinfo_desc() | ||
395 | */ | ||
396 | struct qdio_brinfo_entry_l3_ipv6 { | ||
397 | u64 nit; | ||
398 | struct { unsigned char _s6_addr[16]; } addr; | ||
399 | } __packed; | ||
400 | struct qdio_brinfo_entry_l3_ipv4 { | ||
401 | u64 nit; | ||
402 | struct { uint32_t _s_addr; } addr; | ||
403 | } __packed; | ||
404 | struct qdio_brinfo_entry_l2 { | ||
405 | u64 nit; | ||
406 | struct { u8 mac[6]; u16 lnid; } addr_lnid; | ||
407 | } __packed; | ||
408 | |||
381 | #define QDIO_STATE_INACTIVE 0x00000002 /* after qdio_cleanup */ | 409 | #define QDIO_STATE_INACTIVE 0x00000002 /* after qdio_cleanup */ |
382 | #define QDIO_STATE_ESTABLISHED 0x00000004 /* after qdio_establish */ | 410 | #define QDIO_STATE_ESTABLISHED 0x00000004 /* after qdio_establish */ |
383 | #define QDIO_STATE_ACTIVE 0x00000008 /* after qdio_activate */ | 411 | #define QDIO_STATE_ACTIVE 0x00000008 /* after qdio_activate */ |
@@ -399,5 +427,10 @@ extern int qdio_get_next_buffers(struct ccw_device *, int, int *, int *); | |||
399 | extern int qdio_shutdown(struct ccw_device *, int); | 427 | extern int qdio_shutdown(struct ccw_device *, int); |
400 | extern int qdio_free(struct ccw_device *); | 428 | extern int qdio_free(struct ccw_device *); |
401 | extern int qdio_get_ssqd_desc(struct ccw_device *, struct qdio_ssqd_desc *); | 429 | extern int qdio_get_ssqd_desc(struct ccw_device *, struct qdio_ssqd_desc *); |
430 | extern int qdio_pnso_brinfo(struct subchannel_id schid, | ||
431 | int cnc, u16 *response, | ||
432 | void (*cb)(void *priv, enum qdio_brinfo_entry_type type, | ||
433 | void *entry), | ||
434 | void *priv); | ||
402 | 435 | ||
403 | #endif /* __QDIO_H__ */ | 436 | #endif /* __QDIO_H__ */ |
diff --git a/arch/s390/include/asm/sclp.h b/arch/s390/include/asm/sclp.h index 30ef748bc161..220e171413f8 100644 --- a/arch/s390/include/asm/sclp.h +++ b/arch/s390/include/asm/sclp.h | |||
@@ -8,6 +8,7 @@ | |||
8 | 8 | ||
9 | #include <linux/types.h> | 9 | #include <linux/types.h> |
10 | #include <asm/chpid.h> | 10 | #include <asm/chpid.h> |
11 | #include <asm/cpu.h> | ||
11 | 12 | ||
12 | #define SCLP_CHP_INFO_MASK_SIZE 32 | 13 | #define SCLP_CHP_INFO_MASK_SIZE 32 |
13 | 14 | ||
@@ -37,7 +38,7 @@ struct sclp_cpu_info { | |||
37 | unsigned int standby; | 38 | unsigned int standby; |
38 | unsigned int combined; | 39 | unsigned int combined; |
39 | int has_cpu_type; | 40 | int has_cpu_type; |
40 | struct sclp_cpu_entry cpu[255]; | 41 | struct sclp_cpu_entry cpu[MAX_CPU_ADDRESS + 1]; |
41 | }; | 42 | }; |
42 | 43 | ||
43 | int sclp_get_cpu_info(struct sclp_cpu_info *info); | 44 | int sclp_get_cpu_info(struct sclp_cpu_info *info); |
@@ -51,8 +52,8 @@ int sclp_chp_configure(struct chp_id chpid); | |||
51 | int sclp_chp_deconfigure(struct chp_id chpid); | 52 | int sclp_chp_deconfigure(struct chp_id chpid); |
52 | int sclp_chp_read_info(struct sclp_chp_info *info); | 53 | int sclp_chp_read_info(struct sclp_chp_info *info); |
53 | void sclp_get_ipl_info(struct sclp_ipl_info *info); | 54 | void sclp_get_ipl_info(struct sclp_ipl_info *info); |
54 | bool sclp_has_linemode(void); | 55 | bool __init sclp_has_linemode(void); |
55 | bool sclp_has_vt220(void); | 56 | bool __init sclp_has_vt220(void); |
56 | int sclp_pci_configure(u32 fid); | 57 | int sclp_pci_configure(u32 fid); |
57 | int sclp_pci_deconfigure(u32 fid); | 58 | int sclp_pci_deconfigure(u32 fid); |
58 | int memcpy_hsa(void *dest, unsigned long src, size_t count, int mode); | 59 | int memcpy_hsa(void *dest, unsigned long src, size_t count, int mode); |
diff --git a/arch/s390/include/asm/smp.h b/arch/s390/include/asm/smp.h index ac9bed8e103f..160779394096 100644 --- a/arch/s390/include/asm/smp.h +++ b/arch/s390/include/asm/smp.h | |||
@@ -31,6 +31,7 @@ extern void smp_yield(void); | |||
31 | extern void smp_stop_cpu(void); | 31 | extern void smp_stop_cpu(void); |
32 | extern void smp_cpu_set_polarization(int cpu, int val); | 32 | extern void smp_cpu_set_polarization(int cpu, int val); |
33 | extern int smp_cpu_get_polarization(int cpu); | 33 | extern int smp_cpu_get_polarization(int cpu); |
34 | extern void smp_fill_possible_mask(void); | ||
34 | 35 | ||
35 | #else /* CONFIG_SMP */ | 36 | #else /* CONFIG_SMP */ |
36 | 37 | ||
@@ -50,6 +51,7 @@ static inline int smp_vcpu_scheduled(int cpu) { return 1; } | |||
50 | static inline void smp_yield_cpu(int cpu) { } | 51 | static inline void smp_yield_cpu(int cpu) { } |
51 | static inline void smp_yield(void) { } | 52 | static inline void smp_yield(void) { } |
52 | static inline void smp_stop_cpu(void) { } | 53 | static inline void smp_stop_cpu(void) { } |
54 | static inline void smp_fill_possible_mask(void) { } | ||
53 | 55 | ||
54 | #endif /* CONFIG_SMP */ | 56 | #endif /* CONFIG_SMP */ |
55 | 57 | ||
diff --git a/arch/s390/include/asm/vdso.h b/arch/s390/include/asm/vdso.h index a73eb2e1e918..bc9746a7d47c 100644 --- a/arch/s390/include/asm/vdso.h +++ b/arch/s390/include/asm/vdso.h | |||
@@ -26,8 +26,9 @@ struct vdso_data { | |||
26 | __u64 wtom_clock_nsec; /* 0x28 */ | 26 | __u64 wtom_clock_nsec; /* 0x28 */ |
27 | __u32 tz_minuteswest; /* Minutes west of Greenwich 0x30 */ | 27 | __u32 tz_minuteswest; /* Minutes west of Greenwich 0x30 */ |
28 | __u32 tz_dsttime; /* Type of dst correction 0x34 */ | 28 | __u32 tz_dsttime; /* Type of dst correction 0x34 */ |
29 | __u32 ectg_available; | 29 | __u32 ectg_available; /* ECTG instruction present 0x38 */ |
30 | __u32 ntp_mult; /* NTP adjusted multiplier 0x3C */ | 30 | __u32 tk_mult; /* Mult. used for xtime_nsec 0x3c */ |
31 | __u32 tk_shift; /* Shift used for xtime_nsec 0x40 */ | ||
31 | }; | 32 | }; |
32 | 33 | ||
33 | struct vdso_per_cpu_data { | 34 | struct vdso_per_cpu_data { |
diff --git a/arch/s390/include/uapi/asm/zcrypt.h b/arch/s390/include/uapi/asm/zcrypt.h index e83fc116f5bf..f2b18eacaca8 100644 --- a/arch/s390/include/uapi/asm/zcrypt.h +++ b/arch/s390/include/uapi/asm/zcrypt.h | |||
@@ -154,6 +154,67 @@ struct ica_xcRB { | |||
154 | unsigned short priority_window; | 154 | unsigned short priority_window; |
155 | unsigned int status; | 155 | unsigned int status; |
156 | } __attribute__((packed)); | 156 | } __attribute__((packed)); |
157 | |||
158 | /** | ||
159 | * struct ep11_cprb - EP11 connectivity programming request block | ||
160 | * @cprb_len: CPRB header length [0x0020] | ||
161 | * @cprb_ver_id: CPRB version id. [0x04] | ||
162 | * @pad_000: Alignment pad bytes | ||
163 | * @flags: Admin cmd [0x80] or functional cmd [0x00] | ||
164 | * @func_id: Function id / subtype [0x5434] | ||
165 | * @source_id: Source id [originator id] | ||
166 | * @target_id: Target id [usage/ctrl domain id] | ||
167 | * @ret_code: Return code | ||
168 | * @reserved1: Reserved | ||
169 | * @reserved2: Reserved | ||
170 | * @payload_len: Payload length | ||
171 | */ | ||
172 | struct ep11_cprb { | ||
173 | uint16_t cprb_len; | ||
174 | unsigned char cprb_ver_id; | ||
175 | unsigned char pad_000[2]; | ||
176 | unsigned char flags; | ||
177 | unsigned char func_id[2]; | ||
178 | uint32_t source_id; | ||
179 | uint32_t target_id; | ||
180 | uint32_t ret_code; | ||
181 | uint32_t reserved1; | ||
182 | uint32_t reserved2; | ||
183 | uint32_t payload_len; | ||
184 | } __attribute__((packed)); | ||
185 | |||
186 | /** | ||
187 | * struct ep11_target_dev - EP11 target device list | ||
188 | * @ap_id: AP device id | ||
189 | * @dom_id: Usage domain id | ||
190 | */ | ||
191 | struct ep11_target_dev { | ||
192 | uint16_t ap_id; | ||
193 | uint16_t dom_id; | ||
194 | }; | ||
195 | |||
196 | /** | ||
197 | * struct ep11_urb - EP11 user request block | ||
198 | * @targets_num: Number of target adapters | ||
199 | * @targets: Addr to target adapter list | ||
200 | * @weight: Level of request priority | ||
201 | * @req_no: Request id/number | ||
202 | * @req_len: Request length | ||
203 | * @req: Addr to request block | ||
204 | * @resp_len: Response length | ||
205 | * @resp: Addr to response block | ||
206 | */ | ||
207 | struct ep11_urb { | ||
208 | uint16_t targets_num; | ||
209 | uint64_t targets; | ||
210 | uint64_t weight; | ||
211 | uint64_t req_no; | ||
212 | uint64_t req_len; | ||
213 | uint64_t req; | ||
214 | uint64_t resp_len; | ||
215 | uint64_t resp; | ||
216 | } __attribute__((packed)); | ||
217 | |||
157 | #define AUTOSELECT ((unsigned int)0xFFFFFFFF) | 218 | #define AUTOSELECT ((unsigned int)0xFFFFFFFF) |
158 | 219 | ||
159 | #define ZCRYPT_IOCTL_MAGIC 'z' | 220 | #define ZCRYPT_IOCTL_MAGIC 'z' |
@@ -183,6 +244,9 @@ struct ica_xcRB { | |||
183 | * ZSECSENDCPRB | 244 | * ZSECSENDCPRB |
184 | * Send an arbitrary CPRB to a crypto card. | 245 | * Send an arbitrary CPRB to a crypto card. |
185 | * | 246 | * |
247 | * ZSENDEP11CPRB | ||
248 | * Send an arbitrary EP11 CPRB to an EP11 coprocessor crypto card. | ||
249 | * | ||
186 | * Z90STAT_STATUS_MASK | 250 | * Z90STAT_STATUS_MASK |
187 | * Return an 64 element array of unsigned chars for the status of | 251 | * Return an 64 element array of unsigned chars for the status of |
188 | * all devices. | 252 | * all devices. |
@@ -256,6 +320,7 @@ struct ica_xcRB { | |||
256 | #define ICARSAMODEXPO _IOC(_IOC_READ|_IOC_WRITE, ZCRYPT_IOCTL_MAGIC, 0x05, 0) | 320 | #define ICARSAMODEXPO _IOC(_IOC_READ|_IOC_WRITE, ZCRYPT_IOCTL_MAGIC, 0x05, 0) |
257 | #define ICARSACRT _IOC(_IOC_READ|_IOC_WRITE, ZCRYPT_IOCTL_MAGIC, 0x06, 0) | 321 | #define ICARSACRT _IOC(_IOC_READ|_IOC_WRITE, ZCRYPT_IOCTL_MAGIC, 0x06, 0) |
258 | #define ZSECSENDCPRB _IOC(_IOC_READ|_IOC_WRITE, ZCRYPT_IOCTL_MAGIC, 0x81, 0) | 322 | #define ZSECSENDCPRB _IOC(_IOC_READ|_IOC_WRITE, ZCRYPT_IOCTL_MAGIC, 0x81, 0) |
323 | #define ZSENDEP11CPRB _IOC(_IOC_READ|_IOC_WRITE, ZCRYPT_IOCTL_MAGIC, 0x04, 0) | ||
259 | 324 | ||
260 | /* New status calls */ | 325 | /* New status calls */ |
261 | #define Z90STAT_TOTALCOUNT _IOR(ZCRYPT_IOCTL_MAGIC, 0x40, int) | 326 | #define Z90STAT_TOTALCOUNT _IOR(ZCRYPT_IOCTL_MAGIC, 0x40, int) |
diff --git a/arch/s390/kernel/Makefile b/arch/s390/kernel/Makefile index 2403303cfed7..1b3ac09c11b6 100644 --- a/arch/s390/kernel/Makefile +++ b/arch/s390/kernel/Makefile | |||
@@ -60,7 +60,8 @@ obj-$(CONFIG_FTRACE_SYSCALLS) += ftrace.o | |||
60 | obj-$(CONFIG_CRASH_DUMP) += crash_dump.o | 60 | obj-$(CONFIG_CRASH_DUMP) += crash_dump.o |
61 | 61 | ||
62 | ifdef CONFIG_64BIT | 62 | ifdef CONFIG_64BIT |
63 | obj-$(CONFIG_PERF_EVENTS) += perf_event.o perf_cpum_cf.o | 63 | obj-$(CONFIG_PERF_EVENTS) += perf_event.o perf_cpum_cf.o perf_cpum_sf.o \ |
64 | perf_cpum_cf_events.o | ||
64 | obj-y += runtime_instr.o cache.o | 65 | obj-y += runtime_instr.o cache.o |
65 | endif | 66 | endif |
66 | 67 | ||
diff --git a/arch/s390/kernel/asm-offsets.c b/arch/s390/kernel/asm-offsets.c index 2416138ebd3e..e4c99a183651 100644 --- a/arch/s390/kernel/asm-offsets.c +++ b/arch/s390/kernel/asm-offsets.c | |||
@@ -65,12 +65,14 @@ int main(void) | |||
65 | DEFINE(__VDSO_WTOM_NSEC, offsetof(struct vdso_data, wtom_clock_nsec)); | 65 | DEFINE(__VDSO_WTOM_NSEC, offsetof(struct vdso_data, wtom_clock_nsec)); |
66 | DEFINE(__VDSO_TIMEZONE, offsetof(struct vdso_data, tz_minuteswest)); | 66 | DEFINE(__VDSO_TIMEZONE, offsetof(struct vdso_data, tz_minuteswest)); |
67 | DEFINE(__VDSO_ECTG_OK, offsetof(struct vdso_data, ectg_available)); | 67 | DEFINE(__VDSO_ECTG_OK, offsetof(struct vdso_data, ectg_available)); |
68 | DEFINE(__VDSO_NTP_MULT, offsetof(struct vdso_data, ntp_mult)); | 68 | DEFINE(__VDSO_TK_MULT, offsetof(struct vdso_data, tk_mult)); |
69 | DEFINE(__VDSO_TK_SHIFT, offsetof(struct vdso_data, tk_shift)); | ||
69 | DEFINE(__VDSO_ECTG_BASE, offsetof(struct vdso_per_cpu_data, ectg_timer_base)); | 70 | DEFINE(__VDSO_ECTG_BASE, offsetof(struct vdso_per_cpu_data, ectg_timer_base)); |
70 | DEFINE(__VDSO_ECTG_USER, offsetof(struct vdso_per_cpu_data, ectg_user_time)); | 71 | DEFINE(__VDSO_ECTG_USER, offsetof(struct vdso_per_cpu_data, ectg_user_time)); |
71 | /* constants used by the vdso */ | 72 | /* constants used by the vdso */ |
72 | DEFINE(__CLOCK_REALTIME, CLOCK_REALTIME); | 73 | DEFINE(__CLOCK_REALTIME, CLOCK_REALTIME); |
73 | DEFINE(__CLOCK_MONOTONIC, CLOCK_MONOTONIC); | 74 | DEFINE(__CLOCK_MONOTONIC, CLOCK_MONOTONIC); |
75 | DEFINE(__CLOCK_THREAD_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID); | ||
74 | DEFINE(__CLOCK_REALTIME_RES, MONOTONIC_RES_NSEC); | 76 | DEFINE(__CLOCK_REALTIME_RES, MONOTONIC_RES_NSEC); |
75 | BLANK(); | 77 | BLANK(); |
76 | /* idle data offsets */ | 78 | /* idle data offsets */ |
diff --git a/arch/s390/kernel/compat_signal.c b/arch/s390/kernel/compat_signal.c index 6e2442978409..8b84bc373e94 100644 --- a/arch/s390/kernel/compat_signal.c +++ b/arch/s390/kernel/compat_signal.c | |||
@@ -194,7 +194,7 @@ static int restore_sigregs32(struct pt_regs *regs,_sigregs32 __user *sregs) | |||
194 | return -EINVAL; | 194 | return -EINVAL; |
195 | 195 | ||
196 | /* Use regs->psw.mask instead of PSW_USER_BITS to preserve PER bit. */ | 196 | /* Use regs->psw.mask instead of PSW_USER_BITS to preserve PER bit. */ |
197 | regs->psw.mask = (regs->psw.mask & ~PSW_MASK_USER) | | 197 | regs->psw.mask = (regs->psw.mask & ~(PSW_MASK_USER | PSW_MASK_RI)) | |
198 | (__u64)(user_sregs.regs.psw.mask & PSW32_MASK_USER) << 32 | | 198 | (__u64)(user_sregs.regs.psw.mask & PSW32_MASK_USER) << 32 | |
199 | (__u64)(user_sregs.regs.psw.mask & PSW32_MASK_RI) << 32 | | 199 | (__u64)(user_sregs.regs.psw.mask & PSW32_MASK_RI) << 32 | |
200 | (__u64)(user_sregs.regs.psw.addr & PSW32_ADDR_AMODE); | 200 | (__u64)(user_sregs.regs.psw.addr & PSW32_ADDR_AMODE); |
@@ -412,8 +412,9 @@ static int setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
412 | regs->gprs[14] = (__u64 __force) ka->sa.sa_restorer | PSW32_ADDR_AMODE; | 412 | regs->gprs[14] = (__u64 __force) ka->sa.sa_restorer | PSW32_ADDR_AMODE; |
413 | } else { | 413 | } else { |
414 | regs->gprs[14] = (__u64 __force) frame->retcode | PSW32_ADDR_AMODE; | 414 | regs->gprs[14] = (__u64 __force) frame->retcode | PSW32_ADDR_AMODE; |
415 | err |= __put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn, | 415 | if (__put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn, |
416 | (u16 __force __user *)(frame->retcode)); | 416 | (u16 __force __user *)(frame->retcode))) |
417 | goto give_sigsegv; | ||
417 | } | 418 | } |
418 | 419 | ||
419 | /* Set up backchain. */ | 420 | /* Set up backchain. */ |
diff --git a/arch/s390/kernel/entry64.S b/arch/s390/kernel/entry64.S index e5b43c97a834..384e609b4711 100644 --- a/arch/s390/kernel/entry64.S +++ b/arch/s390/kernel/entry64.S | |||
@@ -74,7 +74,7 @@ _TIF_TRACE = (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | _TIF_SECCOMP | \ | |||
74 | .endm | 74 | .endm |
75 | 75 | ||
76 | .macro LPP newpp | 76 | .macro LPP newpp |
77 | #if defined(CONFIG_KVM) || defined(CONFIG_KVM_MODULE) | 77 | #if IS_ENABLED(CONFIG_KVM) |
78 | tm __LC_MACHINE_FLAGS+6,0x20 # MACHINE_FLAG_LPP | 78 | tm __LC_MACHINE_FLAGS+6,0x20 # MACHINE_FLAG_LPP |
79 | jz .+8 | 79 | jz .+8 |
80 | .insn s,0xb2800000,\newpp | 80 | .insn s,0xb2800000,\newpp |
@@ -82,7 +82,7 @@ _TIF_TRACE = (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | _TIF_SECCOMP | \ | |||
82 | .endm | 82 | .endm |
83 | 83 | ||
84 | .macro HANDLE_SIE_INTERCEPT scratch,reason | 84 | .macro HANDLE_SIE_INTERCEPT scratch,reason |
85 | #if defined(CONFIG_KVM) || defined(CONFIG_KVM_MODULE) | 85 | #if IS_ENABLED(CONFIG_KVM) |
86 | tmhh %r8,0x0001 # interrupting from user ? | 86 | tmhh %r8,0x0001 # interrupting from user ? |
87 | jnz .+62 | 87 | jnz .+62 |
88 | lgr \scratch,%r9 | 88 | lgr \scratch,%r9 |
@@ -946,7 +946,7 @@ cleanup_idle_insn: | |||
946 | .quad __critical_end - __critical_start | 946 | .quad __critical_end - __critical_start |
947 | 947 | ||
948 | 948 | ||
949 | #if defined(CONFIG_KVM) || defined(CONFIG_KVM_MODULE) | 949 | #if IS_ENABLED(CONFIG_KVM) |
950 | /* | 950 | /* |
951 | * sie64a calling convention: | 951 | * sie64a calling convention: |
952 | * %r2 pointer to sie control block | 952 | * %r2 pointer to sie control block |
@@ -975,7 +975,7 @@ sie_done: | |||
975 | lctlg %c1,%c1,__LC_USER_ASCE # load primary asce | 975 | lctlg %c1,%c1,__LC_USER_ASCE # load primary asce |
976 | # some program checks are suppressing. C code (e.g. do_protection_exception) | 976 | # some program checks are suppressing. C code (e.g. do_protection_exception) |
977 | # will rewind the PSW by the ILC, which is 4 bytes in case of SIE. Other | 977 | # will rewind the PSW by the ILC, which is 4 bytes in case of SIE. Other |
978 | # instructions beween sie64a and sie_done should not cause program | 978 | # instructions between sie64a and sie_done should not cause program |
979 | # interrupts. So lets use a nop (47 00 00 00) as a landing pad. | 979 | # interrupts. So lets use a nop (47 00 00 00) as a landing pad. |
980 | # See also HANDLE_SIE_INTERCEPT | 980 | # See also HANDLE_SIE_INTERCEPT |
981 | rewind_pad: | 981 | rewind_pad: |
diff --git a/arch/s390/kernel/perf_cpum_cf.c b/arch/s390/kernel/perf_cpum_cf.c index 1105502bf6e9..f51214c04858 100644 --- a/arch/s390/kernel/perf_cpum_cf.c +++ b/arch/s390/kernel/perf_cpum_cf.c | |||
@@ -680,6 +680,7 @@ static int __init cpumf_pmu_init(void) | |||
680 | goto out; | 680 | goto out; |
681 | } | 681 | } |
682 | 682 | ||
683 | cpumf_pmu.attr_groups = cpumf_cf_event_group(); | ||
683 | rc = perf_pmu_register(&cpumf_pmu, "cpum_cf", PERF_TYPE_RAW); | 684 | rc = perf_pmu_register(&cpumf_pmu, "cpum_cf", PERF_TYPE_RAW); |
684 | if (rc) { | 685 | if (rc) { |
685 | pr_err("Registering the cpum_cf PMU failed with rc=%i\n", rc); | 686 | pr_err("Registering the cpum_cf PMU failed with rc=%i\n", rc); |
diff --git a/arch/s390/kernel/perf_cpum_cf_events.c b/arch/s390/kernel/perf_cpum_cf_events.c new file mode 100644 index 000000000000..4554a4bae39e --- /dev/null +++ b/arch/s390/kernel/perf_cpum_cf_events.c | |||
@@ -0,0 +1,322 @@ | |||
1 | /* | ||
2 | * Perf PMU sysfs events attributes for available CPU-measurement counters | ||
3 | * | ||
4 | */ | ||
5 | |||
6 | #include <linux/slab.h> | ||
7 | #include <linux/perf_event.h> | ||
8 | |||
9 | |||
10 | /* BEGIN: CPUM_CF COUNTER DEFINITIONS =================================== */ | ||
11 | |||
12 | CPUMF_EVENT_ATTR(cf, CPU_CYCLES, 0x0000); | ||
13 | CPUMF_EVENT_ATTR(cf, INSTRUCTIONS, 0x0001); | ||
14 | CPUMF_EVENT_ATTR(cf, L1I_DIR_WRITES, 0x0002); | ||
15 | CPUMF_EVENT_ATTR(cf, L1I_PENALTY_CYCLES, 0x0003); | ||
16 | CPUMF_EVENT_ATTR(cf, PROBLEM_STATE_CPU_CYCLES, 0x0020); | ||
17 | CPUMF_EVENT_ATTR(cf, PROBLEM_STATE_INSTRUCTIONS, 0x0021); | ||
18 | CPUMF_EVENT_ATTR(cf, PROBLEM_STATE_L1I_DIR_WRITES, 0x0022); | ||
19 | CPUMF_EVENT_ATTR(cf, PROBLEM_STATE_L1I_PENALTY_CYCLES, 0x0023); | ||
20 | CPUMF_EVENT_ATTR(cf, PROBLEM_STATE_L1D_DIR_WRITES, 0x0024); | ||
21 | CPUMF_EVENT_ATTR(cf, PROBLEM_STATE_L1D_PENALTY_CYCLES, 0x0025); | ||
22 | CPUMF_EVENT_ATTR(cf, L1D_DIR_WRITES, 0x0004); | ||
23 | CPUMF_EVENT_ATTR(cf, L1D_PENALTY_CYCLES, 0x0005); | ||
24 | CPUMF_EVENT_ATTR(cf, PRNG_FUNCTIONS, 0x0040); | ||
25 | CPUMF_EVENT_ATTR(cf, PRNG_CYCLES, 0x0041); | ||
26 | CPUMF_EVENT_ATTR(cf, PRNG_BLOCKED_FUNCTIONS, 0x0042); | ||
27 | CPUMF_EVENT_ATTR(cf, PRNG_BLOCKED_CYCLES, 0x0043); | ||
28 | CPUMF_EVENT_ATTR(cf, SHA_FUNCTIONS, 0x0044); | ||
29 | CPUMF_EVENT_ATTR(cf, SHA_CYCLES, 0x0045); | ||
30 | CPUMF_EVENT_ATTR(cf, SHA_BLOCKED_FUNCTIONS, 0x0046); | ||
31 | CPUMF_EVENT_ATTR(cf, SHA_BLOCKED_CYCLES, 0x0047); | ||
32 | CPUMF_EVENT_ATTR(cf, DEA_FUNCTIONS, 0x0048); | ||
33 | CPUMF_EVENT_ATTR(cf, DEA_CYCLES, 0x0049); | ||
34 | CPUMF_EVENT_ATTR(cf, DEA_BLOCKED_FUNCTIONS, 0x004a); | ||
35 | CPUMF_EVENT_ATTR(cf, DEA_BLOCKED_CYCLES, 0x004b); | ||
36 | CPUMF_EVENT_ATTR(cf, AES_FUNCTIONS, 0x004c); | ||
37 | CPUMF_EVENT_ATTR(cf, AES_CYCLES, 0x004d); | ||
38 | CPUMF_EVENT_ATTR(cf, AES_BLOCKED_FUNCTIONS, 0x004e); | ||
39 | CPUMF_EVENT_ATTR(cf, AES_BLOCKED_CYCLES, 0x004f); | ||
40 | CPUMF_EVENT_ATTR(cf_z10, L1I_L2_SOURCED_WRITES, 0x0080); | ||
41 | CPUMF_EVENT_ATTR(cf_z10, L1D_L2_SOURCED_WRITES, 0x0081); | ||
42 | CPUMF_EVENT_ATTR(cf_z10, L1I_L3_LOCAL_WRITES, 0x0082); | ||
43 | CPUMF_EVENT_ATTR(cf_z10, L1D_L3_LOCAL_WRITES, 0x0083); | ||
44 | CPUMF_EVENT_ATTR(cf_z10, L1I_L3_REMOTE_WRITES, 0x0084); | ||
45 | CPUMF_EVENT_ATTR(cf_z10, L1D_L3_REMOTE_WRITES, 0x0085); | ||
46 | CPUMF_EVENT_ATTR(cf_z10, L1D_LMEM_SOURCED_WRITES, 0x0086); | ||
47 | CPUMF_EVENT_ATTR(cf_z10, L1I_LMEM_SOURCED_WRITES, 0x0087); | ||
48 | CPUMF_EVENT_ATTR(cf_z10, L1D_RO_EXCL_WRITES, 0x0088); | ||
49 | CPUMF_EVENT_ATTR(cf_z10, L1I_CACHELINE_INVALIDATES, 0x0089); | ||
50 | CPUMF_EVENT_ATTR(cf_z10, ITLB1_WRITES, 0x008a); | ||
51 | CPUMF_EVENT_ATTR(cf_z10, DTLB1_WRITES, 0x008b); | ||
52 | CPUMF_EVENT_ATTR(cf_z10, TLB2_PTE_WRITES, 0x008c); | ||
53 | CPUMF_EVENT_ATTR(cf_z10, TLB2_CRSTE_WRITES, 0x008d); | ||
54 | CPUMF_EVENT_ATTR(cf_z10, TLB2_CRSTE_HPAGE_WRITES, 0x008e); | ||
55 | CPUMF_EVENT_ATTR(cf_z10, ITLB1_MISSES, 0x0091); | ||
56 | CPUMF_EVENT_ATTR(cf_z10, DTLB1_MISSES, 0x0092); | ||
57 | CPUMF_EVENT_ATTR(cf_z10, L2C_STORES_SENT, 0x0093); | ||
58 | CPUMF_EVENT_ATTR(cf_z196, L1D_L2_SOURCED_WRITES, 0x0080); | ||
59 | CPUMF_EVENT_ATTR(cf_z196, L1I_L2_SOURCED_WRITES, 0x0081); | ||
60 | CPUMF_EVENT_ATTR(cf_z196, DTLB1_MISSES, 0x0082); | ||
61 | CPUMF_EVENT_ATTR(cf_z196, ITLB1_MISSES, 0x0083); | ||
62 | CPUMF_EVENT_ATTR(cf_z196, L2C_STORES_SENT, 0x0085); | ||
63 | CPUMF_EVENT_ATTR(cf_z196, L1D_OFFBOOK_L3_SOURCED_WRITES, 0x0086); | ||
64 | CPUMF_EVENT_ATTR(cf_z196, L1D_ONBOOK_L4_SOURCED_WRITES, 0x0087); | ||
65 | CPUMF_EVENT_ATTR(cf_z196, L1I_ONBOOK_L4_SOURCED_WRITES, 0x0088); | ||
66 | CPUMF_EVENT_ATTR(cf_z196, L1D_RO_EXCL_WRITES, 0x0089); | ||
67 | CPUMF_EVENT_ATTR(cf_z196, L1D_OFFBOOK_L4_SOURCED_WRITES, 0x008a); | ||
68 | CPUMF_EVENT_ATTR(cf_z196, L1I_OFFBOOK_L4_SOURCED_WRITES, 0x008b); | ||
69 | CPUMF_EVENT_ATTR(cf_z196, DTLB1_HPAGE_WRITES, 0x008c); | ||
70 | CPUMF_EVENT_ATTR(cf_z196, L1D_LMEM_SOURCED_WRITES, 0x008d); | ||
71 | CPUMF_EVENT_ATTR(cf_z196, L1I_LMEM_SOURCED_WRITES, 0x008e); | ||
72 | CPUMF_EVENT_ATTR(cf_z196, L1I_OFFBOOK_L3_SOURCED_WRITES, 0x008f); | ||
73 | CPUMF_EVENT_ATTR(cf_z196, DTLB1_WRITES, 0x0090); | ||
74 | CPUMF_EVENT_ATTR(cf_z196, ITLB1_WRITES, 0x0091); | ||
75 | CPUMF_EVENT_ATTR(cf_z196, TLB2_PTE_WRITES, 0x0092); | ||
76 | CPUMF_EVENT_ATTR(cf_z196, TLB2_CRSTE_HPAGE_WRITES, 0x0093); | ||
77 | CPUMF_EVENT_ATTR(cf_z196, TLB2_CRSTE_WRITES, 0x0094); | ||
78 | CPUMF_EVENT_ATTR(cf_z196, L1D_ONCHIP_L3_SOURCED_WRITES, 0x0096); | ||
79 | CPUMF_EVENT_ATTR(cf_z196, L1D_OFFCHIP_L3_SOURCED_WRITES, 0x0098); | ||
80 | CPUMF_EVENT_ATTR(cf_z196, L1I_ONCHIP_L3_SOURCED_WRITES, 0x0099); | ||
81 | CPUMF_EVENT_ATTR(cf_z196, L1I_OFFCHIP_L3_SOURCED_WRITES, 0x009b); | ||
82 | CPUMF_EVENT_ATTR(cf_zec12, DTLB1_MISSES, 0x0080); | ||
83 | CPUMF_EVENT_ATTR(cf_zec12, ITLB1_MISSES, 0x0081); | ||
84 | CPUMF_EVENT_ATTR(cf_zec12, L1D_L2I_SOURCED_WRITES, 0x0082); | ||
85 | CPUMF_EVENT_ATTR(cf_zec12, L1I_L2I_SOURCED_WRITES, 0x0083); | ||
86 | CPUMF_EVENT_ATTR(cf_zec12, L1D_L2D_SOURCED_WRITES, 0x0084); | ||
87 | CPUMF_EVENT_ATTR(cf_zec12, DTLB1_WRITES, 0x0085); | ||
88 | CPUMF_EVENT_ATTR(cf_zec12, L1D_LMEM_SOURCED_WRITES, 0x0087); | ||
89 | CPUMF_EVENT_ATTR(cf_zec12, L1I_LMEM_SOURCED_WRITES, 0x0089); | ||
90 | CPUMF_EVENT_ATTR(cf_zec12, L1D_RO_EXCL_WRITES, 0x008a); | ||
91 | CPUMF_EVENT_ATTR(cf_zec12, DTLB1_HPAGE_WRITES, 0x008b); | ||
92 | CPUMF_EVENT_ATTR(cf_zec12, ITLB1_WRITES, 0x008c); | ||
93 | CPUMF_EVENT_ATTR(cf_zec12, TLB2_PTE_WRITES, 0x008d); | ||
94 | CPUMF_EVENT_ATTR(cf_zec12, TLB2_CRSTE_HPAGE_WRITES, 0x008e); | ||
95 | CPUMF_EVENT_ATTR(cf_zec12, TLB2_CRSTE_WRITES, 0x008f); | ||
96 | CPUMF_EVENT_ATTR(cf_zec12, L1D_ONCHIP_L3_SOURCED_WRITES, 0x0090); | ||
97 | CPUMF_EVENT_ATTR(cf_zec12, L1D_OFFCHIP_L3_SOURCED_WRITES, 0x0091); | ||
98 | CPUMF_EVENT_ATTR(cf_zec12, L1D_OFFBOOK_L3_SOURCED_WRITES, 0x0092); | ||
99 | CPUMF_EVENT_ATTR(cf_zec12, L1D_ONBOOK_L4_SOURCED_WRITES, 0x0093); | ||
100 | CPUMF_EVENT_ATTR(cf_zec12, L1D_OFFBOOK_L4_SOURCED_WRITES, 0x0094); | ||
101 | CPUMF_EVENT_ATTR(cf_zec12, TX_NC_TEND, 0x0095); | ||
102 | CPUMF_EVENT_ATTR(cf_zec12, L1D_ONCHIP_L3_SOURCED_WRITES_IV, 0x0096); | ||
103 | CPUMF_EVENT_ATTR(cf_zec12, L1D_OFFCHIP_L3_SOURCED_WRITES_IV, 0x0097); | ||
104 | CPUMF_EVENT_ATTR(cf_zec12, L1D_OFFBOOK_L3_SOURCED_WRITES_IV, 0x0098); | ||
105 | CPUMF_EVENT_ATTR(cf_zec12, L1I_ONCHIP_L3_SOURCED_WRITES, 0x0099); | ||
106 | CPUMF_EVENT_ATTR(cf_zec12, L1I_OFFCHIP_L3_SOURCED_WRITES, 0x009a); | ||
107 | CPUMF_EVENT_ATTR(cf_zec12, L1I_OFFBOOK_L3_SOURCED_WRITES, 0x009b); | ||
108 | CPUMF_EVENT_ATTR(cf_zec12, L1I_ONBOOK_L4_SOURCED_WRITES, 0x009c); | ||
109 | CPUMF_EVENT_ATTR(cf_zec12, L1I_OFFBOOK_L4_SOURCED_WRITES, 0x009d); | ||
110 | CPUMF_EVENT_ATTR(cf_zec12, TX_C_TEND, 0x009e); | ||
111 | CPUMF_EVENT_ATTR(cf_zec12, L1I_ONCHIP_L3_SOURCED_WRITES_IV, 0x009f); | ||
112 | CPUMF_EVENT_ATTR(cf_zec12, L1I_OFFCHIP_L3_SOURCED_WRITES_IV, 0x00a0); | ||
113 | CPUMF_EVENT_ATTR(cf_zec12, L1I_OFFBOOK_L3_SOURCED_WRITES_IV, 0x00a1); | ||
114 | CPUMF_EVENT_ATTR(cf_zec12, TX_NC_TABORT, 0x00b1); | ||
115 | CPUMF_EVENT_ATTR(cf_zec12, TX_C_TABORT_NO_SPECIAL, 0x00b2); | ||
116 | CPUMF_EVENT_ATTR(cf_zec12, TX_C_TABORT_SPECIAL, 0x00b3); | ||
117 | |||
118 | static struct attribute *cpumcf_pmu_event_attr[] = { | ||
119 | CPUMF_EVENT_PTR(cf, CPU_CYCLES), | ||
120 | CPUMF_EVENT_PTR(cf, INSTRUCTIONS), | ||
121 | CPUMF_EVENT_PTR(cf, L1I_DIR_WRITES), | ||
122 | CPUMF_EVENT_PTR(cf, L1I_PENALTY_CYCLES), | ||
123 | CPUMF_EVENT_PTR(cf, PROBLEM_STATE_CPU_CYCLES), | ||
124 | CPUMF_EVENT_PTR(cf, PROBLEM_STATE_INSTRUCTIONS), | ||
125 | CPUMF_EVENT_PTR(cf, PROBLEM_STATE_L1I_DIR_WRITES), | ||
126 | CPUMF_EVENT_PTR(cf, PROBLEM_STATE_L1I_PENALTY_CYCLES), | ||
127 | CPUMF_EVENT_PTR(cf, PROBLEM_STATE_L1D_DIR_WRITES), | ||
128 | CPUMF_EVENT_PTR(cf, PROBLEM_STATE_L1D_PENALTY_CYCLES), | ||
129 | CPUMF_EVENT_PTR(cf, L1D_DIR_WRITES), | ||
130 | CPUMF_EVENT_PTR(cf, L1D_PENALTY_CYCLES), | ||
131 | CPUMF_EVENT_PTR(cf, PRNG_FUNCTIONS), | ||
132 | CPUMF_EVENT_PTR(cf, PRNG_CYCLES), | ||
133 | CPUMF_EVENT_PTR(cf, PRNG_BLOCKED_FUNCTIONS), | ||
134 | CPUMF_EVENT_PTR(cf, PRNG_BLOCKED_CYCLES), | ||
135 | CPUMF_EVENT_PTR(cf, SHA_FUNCTIONS), | ||
136 | CPUMF_EVENT_PTR(cf, SHA_CYCLES), | ||
137 | CPUMF_EVENT_PTR(cf, SHA_BLOCKED_FUNCTIONS), | ||
138 | CPUMF_EVENT_PTR(cf, SHA_BLOCKED_CYCLES), | ||
139 | CPUMF_EVENT_PTR(cf, DEA_FUNCTIONS), | ||
140 | CPUMF_EVENT_PTR(cf, DEA_CYCLES), | ||
141 | CPUMF_EVENT_PTR(cf, DEA_BLOCKED_FUNCTIONS), | ||
142 | CPUMF_EVENT_PTR(cf, DEA_BLOCKED_CYCLES), | ||
143 | CPUMF_EVENT_PTR(cf, AES_FUNCTIONS), | ||
144 | CPUMF_EVENT_PTR(cf, AES_CYCLES), | ||
145 | CPUMF_EVENT_PTR(cf, AES_BLOCKED_FUNCTIONS), | ||
146 | CPUMF_EVENT_PTR(cf, AES_BLOCKED_CYCLES), | ||
147 | NULL, | ||
148 | }; | ||
149 | |||
150 | static struct attribute *cpumcf_z10_pmu_event_attr[] __initdata = { | ||
151 | CPUMF_EVENT_PTR(cf_z10, L1I_L2_SOURCED_WRITES), | ||
152 | CPUMF_EVENT_PTR(cf_z10, L1D_L2_SOURCED_WRITES), | ||
153 | CPUMF_EVENT_PTR(cf_z10, L1I_L3_LOCAL_WRITES), | ||
154 | CPUMF_EVENT_PTR(cf_z10, L1D_L3_LOCAL_WRITES), | ||
155 | CPUMF_EVENT_PTR(cf_z10, L1I_L3_REMOTE_WRITES), | ||
156 | CPUMF_EVENT_PTR(cf_z10, L1D_L3_REMOTE_WRITES), | ||
157 | CPUMF_EVENT_PTR(cf_z10, L1D_LMEM_SOURCED_WRITES), | ||
158 | CPUMF_EVENT_PTR(cf_z10, L1I_LMEM_SOURCED_WRITES), | ||
159 | CPUMF_EVENT_PTR(cf_z10, L1D_RO_EXCL_WRITES), | ||
160 | CPUMF_EVENT_PTR(cf_z10, L1I_CACHELINE_INVALIDATES), | ||
161 | CPUMF_EVENT_PTR(cf_z10, ITLB1_WRITES), | ||
162 | CPUMF_EVENT_PTR(cf_z10, DTLB1_WRITES), | ||
163 | CPUMF_EVENT_PTR(cf_z10, TLB2_PTE_WRITES), | ||
164 | CPUMF_EVENT_PTR(cf_z10, TLB2_CRSTE_WRITES), | ||
165 | CPUMF_EVENT_PTR(cf_z10, TLB2_CRSTE_HPAGE_WRITES), | ||
166 | CPUMF_EVENT_PTR(cf_z10, ITLB1_MISSES), | ||
167 | CPUMF_EVENT_PTR(cf_z10, DTLB1_MISSES), | ||
168 | CPUMF_EVENT_PTR(cf_z10, L2C_STORES_SENT), | ||
169 | NULL, | ||
170 | }; | ||
171 | |||
172 | static struct attribute *cpumcf_z196_pmu_event_attr[] __initdata = { | ||
173 | CPUMF_EVENT_PTR(cf_z196, L1D_L2_SOURCED_WRITES), | ||
174 | CPUMF_EVENT_PTR(cf_z196, L1I_L2_SOURCED_WRITES), | ||
175 | CPUMF_EVENT_PTR(cf_z196, DTLB1_MISSES), | ||
176 | CPUMF_EVENT_PTR(cf_z196, ITLB1_MISSES), | ||
177 | CPUMF_EVENT_PTR(cf_z196, L2C_STORES_SENT), | ||
178 | CPUMF_EVENT_PTR(cf_z196, L1D_OFFBOOK_L3_SOURCED_WRITES), | ||
179 | CPUMF_EVENT_PTR(cf_z196, L1D_ONBOOK_L4_SOURCED_WRITES), | ||
180 | CPUMF_EVENT_PTR(cf_z196, L1I_ONBOOK_L4_SOURCED_WRITES), | ||
181 | CPUMF_EVENT_PTR(cf_z196, L1D_RO_EXCL_WRITES), | ||
182 | CPUMF_EVENT_PTR(cf_z196, L1D_OFFBOOK_L4_SOURCED_WRITES), | ||
183 | CPUMF_EVENT_PTR(cf_z196, L1I_OFFBOOK_L4_SOURCED_WRITES), | ||
184 | CPUMF_EVENT_PTR(cf_z196, DTLB1_HPAGE_WRITES), | ||
185 | CPUMF_EVENT_PTR(cf_z196, L1D_LMEM_SOURCED_WRITES), | ||
186 | CPUMF_EVENT_PTR(cf_z196, L1I_LMEM_SOURCED_WRITES), | ||
187 | CPUMF_EVENT_PTR(cf_z196, L1I_OFFBOOK_L3_SOURCED_WRITES), | ||
188 | CPUMF_EVENT_PTR(cf_z196, DTLB1_WRITES), | ||
189 | CPUMF_EVENT_PTR(cf_z196, ITLB1_WRITES), | ||
190 | CPUMF_EVENT_PTR(cf_z196, TLB2_PTE_WRITES), | ||
191 | CPUMF_EVENT_PTR(cf_z196, TLB2_CRSTE_HPAGE_WRITES), | ||
192 | CPUMF_EVENT_PTR(cf_z196, TLB2_CRSTE_WRITES), | ||
193 | CPUMF_EVENT_PTR(cf_z196, L1D_ONCHIP_L3_SOURCED_WRITES), | ||
194 | CPUMF_EVENT_PTR(cf_z196, L1D_OFFCHIP_L3_SOURCED_WRITES), | ||
195 | CPUMF_EVENT_PTR(cf_z196, L1I_ONCHIP_L3_SOURCED_WRITES), | ||
196 | CPUMF_EVENT_PTR(cf_z196, L1I_OFFCHIP_L3_SOURCED_WRITES), | ||
197 | NULL, | ||
198 | }; | ||
199 | |||
200 | static struct attribute *cpumcf_zec12_pmu_event_attr[] __initdata = { | ||
201 | CPUMF_EVENT_PTR(cf_zec12, DTLB1_MISSES), | ||
202 | CPUMF_EVENT_PTR(cf_zec12, ITLB1_MISSES), | ||
203 | CPUMF_EVENT_PTR(cf_zec12, L1D_L2I_SOURCED_WRITES), | ||
204 | CPUMF_EVENT_PTR(cf_zec12, L1I_L2I_SOURCED_WRITES), | ||
205 | CPUMF_EVENT_PTR(cf_zec12, L1D_L2D_SOURCED_WRITES), | ||
206 | CPUMF_EVENT_PTR(cf_zec12, DTLB1_WRITES), | ||
207 | CPUMF_EVENT_PTR(cf_zec12, L1D_LMEM_SOURCED_WRITES), | ||
208 | CPUMF_EVENT_PTR(cf_zec12, L1I_LMEM_SOURCED_WRITES), | ||
209 | CPUMF_EVENT_PTR(cf_zec12, L1D_RO_EXCL_WRITES), | ||
210 | CPUMF_EVENT_PTR(cf_zec12, DTLB1_HPAGE_WRITES), | ||
211 | CPUMF_EVENT_PTR(cf_zec12, ITLB1_WRITES), | ||
212 | CPUMF_EVENT_PTR(cf_zec12, TLB2_PTE_WRITES), | ||
213 | CPUMF_EVENT_PTR(cf_zec12, TLB2_CRSTE_HPAGE_WRITES), | ||
214 | CPUMF_EVENT_PTR(cf_zec12, TLB2_CRSTE_WRITES), | ||
215 | CPUMF_EVENT_PTR(cf_zec12, L1D_ONCHIP_L3_SOURCED_WRITES), | ||
216 | CPUMF_EVENT_PTR(cf_zec12, L1D_OFFCHIP_L3_SOURCED_WRITES), | ||
217 | CPUMF_EVENT_PTR(cf_zec12, L1D_OFFBOOK_L3_SOURCED_WRITES), | ||
218 | CPUMF_EVENT_PTR(cf_zec12, L1D_ONBOOK_L4_SOURCED_WRITES), | ||
219 | CPUMF_EVENT_PTR(cf_zec12, L1D_OFFBOOK_L4_SOURCED_WRITES), | ||
220 | CPUMF_EVENT_PTR(cf_zec12, TX_NC_TEND), | ||
221 | CPUMF_EVENT_PTR(cf_zec12, L1D_ONCHIP_L3_SOURCED_WRITES_IV), | ||
222 | CPUMF_EVENT_PTR(cf_zec12, L1D_OFFCHIP_L3_SOURCED_WRITES_IV), | ||
223 | CPUMF_EVENT_PTR(cf_zec12, L1D_OFFBOOK_L3_SOURCED_WRITES_IV), | ||
224 | CPUMF_EVENT_PTR(cf_zec12, L1I_ONCHIP_L3_SOURCED_WRITES), | ||
225 | CPUMF_EVENT_PTR(cf_zec12, L1I_OFFCHIP_L3_SOURCED_WRITES), | ||
226 | CPUMF_EVENT_PTR(cf_zec12, L1I_OFFBOOK_L3_SOURCED_WRITES), | ||
227 | CPUMF_EVENT_PTR(cf_zec12, L1I_ONBOOK_L4_SOURCED_WRITES), | ||
228 | CPUMF_EVENT_PTR(cf_zec12, L1I_OFFBOOK_L4_SOURCED_WRITES), | ||
229 | CPUMF_EVENT_PTR(cf_zec12, TX_C_TEND), | ||
230 | CPUMF_EVENT_PTR(cf_zec12, L1I_ONCHIP_L3_SOURCED_WRITES_IV), | ||
231 | CPUMF_EVENT_PTR(cf_zec12, L1I_OFFCHIP_L3_SOURCED_WRITES_IV), | ||
232 | CPUMF_EVENT_PTR(cf_zec12, L1I_OFFBOOK_L3_SOURCED_WRITES_IV), | ||
233 | CPUMF_EVENT_PTR(cf_zec12, TX_NC_TABORT), | ||
234 | CPUMF_EVENT_PTR(cf_zec12, TX_C_TABORT_NO_SPECIAL), | ||
235 | CPUMF_EVENT_PTR(cf_zec12, TX_C_TABORT_SPECIAL), | ||
236 | NULL, | ||
237 | }; | ||
238 | |||
239 | /* END: CPUM_CF COUNTER DEFINITIONS ===================================== */ | ||
240 | |||
241 | static struct attribute_group cpumsf_pmu_events_group = { | ||
242 | .name = "events", | ||
243 | .attrs = cpumcf_pmu_event_attr, | ||
244 | }; | ||
245 | |||
246 | PMU_FORMAT_ATTR(event, "config:0-63"); | ||
247 | |||
248 | static struct attribute *cpumsf_pmu_format_attr[] = { | ||
249 | &format_attr_event.attr, | ||
250 | NULL, | ||
251 | }; | ||
252 | |||
253 | static struct attribute_group cpumsf_pmu_format_group = { | ||
254 | .name = "format", | ||
255 | .attrs = cpumsf_pmu_format_attr, | ||
256 | }; | ||
257 | |||
258 | static const struct attribute_group *cpumsf_pmu_attr_groups[] = { | ||
259 | &cpumsf_pmu_events_group, | ||
260 | &cpumsf_pmu_format_group, | ||
261 | NULL, | ||
262 | }; | ||
263 | |||
264 | |||
265 | static __init struct attribute **merge_attr(struct attribute **a, | ||
266 | struct attribute **b) | ||
267 | { | ||
268 | struct attribute **new; | ||
269 | int j, i; | ||
270 | |||
271 | for (j = 0; a[j]; j++) | ||
272 | ; | ||
273 | for (i = 0; b[i]; i++) | ||
274 | j++; | ||
275 | j++; | ||
276 | |||
277 | new = kmalloc(sizeof(struct attribute *) * j, GFP_KERNEL); | ||
278 | if (!new) | ||
279 | return NULL; | ||
280 | j = 0; | ||
281 | for (i = 0; a[i]; i++) | ||
282 | new[j++] = a[i]; | ||
283 | for (i = 0; b[i]; i++) | ||
284 | new[j++] = b[i]; | ||
285 | new[j] = NULL; | ||
286 | |||
287 | return new; | ||
288 | } | ||
289 | |||
290 | __init const struct attribute_group **cpumf_cf_event_group(void) | ||
291 | { | ||
292 | struct attribute **combined, **model; | ||
293 | struct cpuid cpu_id; | ||
294 | |||
295 | get_cpu_id(&cpu_id); | ||
296 | switch (cpu_id.machine) { | ||
297 | case 0x2097: | ||
298 | case 0x2098: | ||
299 | model = cpumcf_z10_pmu_event_attr; | ||
300 | break; | ||
301 | case 0x2817: | ||
302 | case 0x2818: | ||
303 | model = cpumcf_z196_pmu_event_attr; | ||
304 | break; | ||
305 | case 0x2827: | ||
306 | case 0x2828: | ||
307 | model = cpumcf_zec12_pmu_event_attr; | ||
308 | break; | ||
309 | default: | ||
310 | model = NULL; | ||
311 | break; | ||
312 | }; | ||
313 | |||
314 | if (!model) | ||
315 | goto out; | ||
316 | |||
317 | combined = merge_attr(cpumcf_pmu_event_attr, model); | ||
318 | if (combined) | ||
319 | cpumsf_pmu_events_group.attrs = combined; | ||
320 | out: | ||
321 | return cpumsf_pmu_attr_groups; | ||
322 | } | ||
diff --git a/arch/s390/kernel/perf_cpum_sf.c b/arch/s390/kernel/perf_cpum_sf.c new file mode 100644 index 000000000000..6c0d29827cb6 --- /dev/null +++ b/arch/s390/kernel/perf_cpum_sf.c | |||
@@ -0,0 +1,1641 @@ | |||
1 | /* | ||
2 | * Performance event support for the System z CPU-measurement Sampling Facility | ||
3 | * | ||
4 | * Copyright IBM Corp. 2013 | ||
5 | * Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License (version 2 only) | ||
9 | * as published by the Free Software Foundation. | ||
10 | */ | ||
11 | #define KMSG_COMPONENT "cpum_sf" | ||
12 | #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt | ||
13 | |||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/kernel_stat.h> | ||
16 | #include <linux/perf_event.h> | ||
17 | #include <linux/percpu.h> | ||
18 | #include <linux/notifier.h> | ||
19 | #include <linux/export.h> | ||
20 | #include <linux/slab.h> | ||
21 | #include <linux/mm.h> | ||
22 | #include <linux/moduleparam.h> | ||
23 | #include <asm/cpu_mf.h> | ||
24 | #include <asm/irq.h> | ||
25 | #include <asm/debug.h> | ||
26 | #include <asm/timex.h> | ||
27 | |||
28 | /* Minimum number of sample-data-block-tables: | ||
29 | * At least one table is required for the sampling buffer structure. | ||
30 | * A single table contains up to 511 pointers to sample-data-blocks. | ||
31 | */ | ||
32 | #define CPUM_SF_MIN_SDBT 1 | ||
33 | |||
34 | /* Number of sample-data-blocks per sample-data-block-table (SDBT): | ||
35 | * A table contains SDB pointers (8 bytes) and one table-link entry | ||
36 | * that points to the origin of the next SDBT. | ||
37 | */ | ||
38 | #define CPUM_SF_SDB_PER_TABLE ((PAGE_SIZE - 8) / 8) | ||
39 | |||
40 | /* Maximum page offset for an SDBT table-link entry: | ||
41 | * If this page offset is reached, a table-link entry to the next SDBT | ||
42 | * must be added. | ||
43 | */ | ||
44 | #define CPUM_SF_SDBT_TL_OFFSET (CPUM_SF_SDB_PER_TABLE * 8) | ||
45 | static inline int require_table_link(const void *sdbt) | ||
46 | { | ||
47 | return ((unsigned long) sdbt & ~PAGE_MASK) == CPUM_SF_SDBT_TL_OFFSET; | ||
48 | } | ||
49 | |||
50 | /* Minimum and maximum sampling buffer sizes: | ||
51 | * | ||
52 | * This number represents the maximum size of the sampling buffer taking | ||
53 | * the number of sample-data-block-tables into account. Note that these | ||
54 | * numbers apply to the basic-sampling function only. | ||
55 | * The maximum number of SDBs is increased by CPUM_SF_SDB_DIAG_FACTOR if | ||
56 | * the diagnostic-sampling function is active. | ||
57 | * | ||
58 | * Sampling buffer size Buffer characteristics | ||
59 | * --------------------------------------------------- | ||
60 | * 64KB == 16 pages (4KB per page) | ||
61 | * 1 page for SDB-tables | ||
62 | * 15 pages for SDBs | ||
63 | * | ||
64 | * 32MB == 8192 pages (4KB per page) | ||
65 | * 16 pages for SDB-tables | ||
66 | * 8176 pages for SDBs | ||
67 | */ | ||
68 | static unsigned long __read_mostly CPUM_SF_MIN_SDB = 15; | ||
69 | static unsigned long __read_mostly CPUM_SF_MAX_SDB = 8176; | ||
70 | static unsigned long __read_mostly CPUM_SF_SDB_DIAG_FACTOR = 1; | ||
71 | |||
72 | struct sf_buffer { | ||
73 | unsigned long *sdbt; /* Sample-data-block-table origin */ | ||
74 | /* buffer characteristics (required for buffer increments) */ | ||
75 | unsigned long num_sdb; /* Number of sample-data-blocks */ | ||
76 | unsigned long num_sdbt; /* Number of sample-data-block-tables */ | ||
77 | unsigned long *tail; /* last sample-data-block-table */ | ||
78 | }; | ||
79 | |||
80 | struct cpu_hw_sf { | ||
81 | /* CPU-measurement sampling information block */ | ||
82 | struct hws_qsi_info_block qsi; | ||
83 | /* CPU-measurement sampling control block */ | ||
84 | struct hws_lsctl_request_block lsctl; | ||
85 | struct sf_buffer sfb; /* Sampling buffer */ | ||
86 | unsigned int flags; /* Status flags */ | ||
87 | struct perf_event *event; /* Scheduled perf event */ | ||
88 | }; | ||
89 | static DEFINE_PER_CPU(struct cpu_hw_sf, cpu_hw_sf); | ||
90 | |||
91 | /* Debug feature */ | ||
92 | static debug_info_t *sfdbg; | ||
93 | |||
94 | /* | ||
95 | * sf_disable() - Switch off sampling facility | ||
96 | */ | ||
97 | static int sf_disable(void) | ||
98 | { | ||
99 | struct hws_lsctl_request_block sreq; | ||
100 | |||
101 | memset(&sreq, 0, sizeof(sreq)); | ||
102 | return lsctl(&sreq); | ||
103 | } | ||
104 | |||
105 | /* | ||
106 | * sf_buffer_available() - Check for an allocated sampling buffer | ||
107 | */ | ||
108 | static int sf_buffer_available(struct cpu_hw_sf *cpuhw) | ||
109 | { | ||
110 | return !!cpuhw->sfb.sdbt; | ||
111 | } | ||
112 | |||
113 | /* | ||
114 | * deallocate sampling facility buffer | ||
115 | */ | ||
116 | static void free_sampling_buffer(struct sf_buffer *sfb) | ||
117 | { | ||
118 | unsigned long *sdbt, *curr; | ||
119 | |||
120 | if (!sfb->sdbt) | ||
121 | return; | ||
122 | |||
123 | sdbt = sfb->sdbt; | ||
124 | curr = sdbt; | ||
125 | |||
126 | /* Free the SDBT after all SDBs are processed... */ | ||
127 | while (1) { | ||
128 | if (!*curr || !sdbt) | ||
129 | break; | ||
130 | |||
131 | /* Process table-link entries */ | ||
132 | if (is_link_entry(curr)) { | ||
133 | curr = get_next_sdbt(curr); | ||
134 | if (sdbt) | ||
135 | free_page((unsigned long) sdbt); | ||
136 | |||
137 | /* If the origin is reached, sampling buffer is freed */ | ||
138 | if (curr == sfb->sdbt) | ||
139 | break; | ||
140 | else | ||
141 | sdbt = curr; | ||
142 | } else { | ||
143 | /* Process SDB pointer */ | ||
144 | if (*curr) { | ||
145 | free_page(*curr); | ||
146 | curr++; | ||
147 | } | ||
148 | } | ||
149 | } | ||
150 | |||
151 | debug_sprintf_event(sfdbg, 5, | ||
152 | "free_sampling_buffer: freed sdbt=%p\n", sfb->sdbt); | ||
153 | memset(sfb, 0, sizeof(*sfb)); | ||
154 | } | ||
155 | |||
156 | static int alloc_sample_data_block(unsigned long *sdbt, gfp_t gfp_flags) | ||
157 | { | ||
158 | unsigned long sdb, *trailer; | ||
159 | |||
160 | /* Allocate and initialize sample-data-block */ | ||
161 | sdb = get_zeroed_page(gfp_flags); | ||
162 | if (!sdb) | ||
163 | return -ENOMEM; | ||
164 | trailer = trailer_entry_ptr(sdb); | ||
165 | *trailer = SDB_TE_ALERT_REQ_MASK; | ||
166 | |||
167 | /* Link SDB into the sample-data-block-table */ | ||
168 | *sdbt = sdb; | ||
169 | |||
170 | return 0; | ||
171 | } | ||
172 | |||
173 | /* | ||
174 | * realloc_sampling_buffer() - extend sampler memory | ||
175 | * | ||
176 | * Allocates new sample-data-blocks and adds them to the specified sampling | ||
177 | * buffer memory. | ||
178 | * | ||
179 | * Important: This modifies the sampling buffer and must be called when the | ||
180 | * sampling facility is disabled. | ||
181 | * | ||
182 | * Returns zero on success, non-zero otherwise. | ||
183 | */ | ||
184 | static int realloc_sampling_buffer(struct sf_buffer *sfb, | ||
185 | unsigned long num_sdb, gfp_t gfp_flags) | ||
186 | { | ||
187 | int i, rc; | ||
188 | unsigned long *new, *tail; | ||
189 | |||
190 | if (!sfb->sdbt || !sfb->tail) | ||
191 | return -EINVAL; | ||
192 | |||
193 | if (!is_link_entry(sfb->tail)) | ||
194 | return -EINVAL; | ||
195 | |||
196 | /* Append to the existing sampling buffer, overwriting the table-link | ||
197 | * register. | ||
198 | * The tail variables always points to the "tail" (last and table-link) | ||
199 | * entry in an SDB-table. | ||
200 | */ | ||
201 | tail = sfb->tail; | ||
202 | |||
203 | /* Do a sanity check whether the table-link entry points to | ||
204 | * the sampling buffer origin. | ||
205 | */ | ||
206 | if (sfb->sdbt != get_next_sdbt(tail)) { | ||
207 | debug_sprintf_event(sfdbg, 3, "realloc_sampling_buffer: " | ||
208 | "sampling buffer is not linked: origin=%p" | ||
209 | "tail=%p\n", | ||
210 | (void *) sfb->sdbt, (void *) tail); | ||
211 | return -EINVAL; | ||
212 | } | ||
213 | |||
214 | /* Allocate remaining SDBs */ | ||
215 | rc = 0; | ||
216 | for (i = 0; i < num_sdb; i++) { | ||
217 | /* Allocate a new SDB-table if it is full. */ | ||
218 | if (require_table_link(tail)) { | ||
219 | new = (unsigned long *) get_zeroed_page(gfp_flags); | ||
220 | if (!new) { | ||
221 | rc = -ENOMEM; | ||
222 | break; | ||
223 | } | ||
224 | sfb->num_sdbt++; | ||
225 | /* Link current page to tail of chain */ | ||
226 | *tail = (unsigned long)(void *) new + 1; | ||
227 | tail = new; | ||
228 | } | ||
229 | |||
230 | /* Allocate a new sample-data-block. | ||
231 | * If there is not enough memory, stop the realloc process | ||
232 | * and simply use what was allocated. If this is a temporary | ||
233 | * issue, a new realloc call (if required) might succeed. | ||
234 | */ | ||
235 | rc = alloc_sample_data_block(tail, gfp_flags); | ||
236 | if (rc) | ||
237 | break; | ||
238 | sfb->num_sdb++; | ||
239 | tail++; | ||
240 | } | ||
241 | |||
242 | /* Link sampling buffer to its origin */ | ||
243 | *tail = (unsigned long) sfb->sdbt + 1; | ||
244 | sfb->tail = tail; | ||
245 | |||
246 | debug_sprintf_event(sfdbg, 4, "realloc_sampling_buffer: new buffer" | ||
247 | " settings: sdbt=%lu sdb=%lu\n", | ||
248 | sfb->num_sdbt, sfb->num_sdb); | ||
249 | return rc; | ||
250 | } | ||
251 | |||
252 | /* | ||
253 | * allocate_sampling_buffer() - allocate sampler memory | ||
254 | * | ||
255 | * Allocates and initializes a sampling buffer structure using the | ||
256 | * specified number of sample-data-blocks (SDB). For each allocation, | ||
257 | * a 4K page is used. The number of sample-data-block-tables (SDBT) | ||
258 | * are calculated from SDBs. | ||
259 | * Also set the ALERT_REQ mask in each SDBs trailer. | ||
260 | * | ||
261 | * Returns zero on success, non-zero otherwise. | ||
262 | */ | ||
263 | static int alloc_sampling_buffer(struct sf_buffer *sfb, unsigned long num_sdb) | ||
264 | { | ||
265 | int rc; | ||
266 | |||
267 | if (sfb->sdbt) | ||
268 | return -EINVAL; | ||
269 | |||
270 | /* Allocate the sample-data-block-table origin */ | ||
271 | sfb->sdbt = (unsigned long *) get_zeroed_page(GFP_KERNEL); | ||
272 | if (!sfb->sdbt) | ||
273 | return -ENOMEM; | ||
274 | sfb->num_sdb = 0; | ||
275 | sfb->num_sdbt = 1; | ||
276 | |||
277 | /* Link the table origin to point to itself to prepare for | ||
278 | * realloc_sampling_buffer() invocation. | ||
279 | */ | ||
280 | sfb->tail = sfb->sdbt; | ||
281 | *sfb->tail = (unsigned long)(void *) sfb->sdbt + 1; | ||
282 | |||
283 | /* Allocate requested number of sample-data-blocks */ | ||
284 | rc = realloc_sampling_buffer(sfb, num_sdb, GFP_KERNEL); | ||
285 | if (rc) { | ||
286 | free_sampling_buffer(sfb); | ||
287 | debug_sprintf_event(sfdbg, 4, "alloc_sampling_buffer: " | ||
288 | "realloc_sampling_buffer failed with rc=%i\n", rc); | ||
289 | } else | ||
290 | debug_sprintf_event(sfdbg, 4, | ||
291 | "alloc_sampling_buffer: tear=%p dear=%p\n", | ||
292 | sfb->sdbt, (void *) *sfb->sdbt); | ||
293 | return rc; | ||
294 | } | ||
295 | |||
296 | static void sfb_set_limits(unsigned long min, unsigned long max) | ||
297 | { | ||
298 | struct hws_qsi_info_block si; | ||
299 | |||
300 | CPUM_SF_MIN_SDB = min; | ||
301 | CPUM_SF_MAX_SDB = max; | ||
302 | |||
303 | memset(&si, 0, sizeof(si)); | ||
304 | if (!qsi(&si)) | ||
305 | CPUM_SF_SDB_DIAG_FACTOR = DIV_ROUND_UP(si.dsdes, si.bsdes); | ||
306 | } | ||
307 | |||
308 | static unsigned long sfb_max_limit(struct hw_perf_event *hwc) | ||
309 | { | ||
310 | return SAMPL_DIAG_MODE(hwc) ? CPUM_SF_MAX_SDB * CPUM_SF_SDB_DIAG_FACTOR | ||
311 | : CPUM_SF_MAX_SDB; | ||
312 | } | ||
313 | |||
314 | static unsigned long sfb_pending_allocs(struct sf_buffer *sfb, | ||
315 | struct hw_perf_event *hwc) | ||
316 | { | ||
317 | if (!sfb->sdbt) | ||
318 | return SFB_ALLOC_REG(hwc); | ||
319 | if (SFB_ALLOC_REG(hwc) > sfb->num_sdb) | ||
320 | return SFB_ALLOC_REG(hwc) - sfb->num_sdb; | ||
321 | return 0; | ||
322 | } | ||
323 | |||
324 | static int sfb_has_pending_allocs(struct sf_buffer *sfb, | ||
325 | struct hw_perf_event *hwc) | ||
326 | { | ||
327 | return sfb_pending_allocs(sfb, hwc) > 0; | ||
328 | } | ||
329 | |||
330 | static void sfb_account_allocs(unsigned long num, struct hw_perf_event *hwc) | ||
331 | { | ||
332 | /* Limit the number of SDBs to not exceed the maximum */ | ||
333 | num = min_t(unsigned long, num, sfb_max_limit(hwc) - SFB_ALLOC_REG(hwc)); | ||
334 | if (num) | ||
335 | SFB_ALLOC_REG(hwc) += num; | ||
336 | } | ||
337 | |||
338 | static void sfb_init_allocs(unsigned long num, struct hw_perf_event *hwc) | ||
339 | { | ||
340 | SFB_ALLOC_REG(hwc) = 0; | ||
341 | sfb_account_allocs(num, hwc); | ||
342 | } | ||
343 | |||
344 | static size_t event_sample_size(struct hw_perf_event *hwc) | ||
345 | { | ||
346 | struct sf_raw_sample *sfr = (struct sf_raw_sample *) RAWSAMPLE_REG(hwc); | ||
347 | size_t sample_size; | ||
348 | |||
349 | /* The sample size depends on the sampling function: The basic-sampling | ||
350 | * function must be always enabled, diagnostic-sampling function is | ||
351 | * optional. | ||
352 | */ | ||
353 | sample_size = sfr->bsdes; | ||
354 | if (SAMPL_DIAG_MODE(hwc)) | ||
355 | sample_size += sfr->dsdes; | ||
356 | |||
357 | return sample_size; | ||
358 | } | ||
359 | |||
360 | static void deallocate_buffers(struct cpu_hw_sf *cpuhw) | ||
361 | { | ||
362 | if (cpuhw->sfb.sdbt) | ||
363 | free_sampling_buffer(&cpuhw->sfb); | ||
364 | } | ||
365 | |||
366 | static int allocate_buffers(struct cpu_hw_sf *cpuhw, struct hw_perf_event *hwc) | ||
367 | { | ||
368 | unsigned long n_sdb, freq, factor; | ||
369 | size_t sfr_size, sample_size; | ||
370 | struct sf_raw_sample *sfr; | ||
371 | |||
372 | /* Allocate raw sample buffer | ||
373 | * | ||
374 | * The raw sample buffer is used to temporarily store sampling data | ||
375 | * entries for perf raw sample processing. The buffer size mainly | ||
376 | * depends on the size of diagnostic-sampling data entries which is | ||
377 | * machine-specific. The exact size calculation includes: | ||
378 | * 1. The first 4 bytes of diagnostic-sampling data entries are | ||
379 | * already reflected in the sf_raw_sample structure. Subtract | ||
380 | * these bytes. | ||
381 | * 2. The perf raw sample data must be 8-byte aligned (u64) and | ||
382 | * perf's internal data size must be considered too. So add | ||
383 | * an additional u32 for correct alignment and subtract before | ||
384 | * allocating the buffer. | ||
385 | * 3. Store the raw sample buffer pointer in the perf event | ||
386 | * hardware structure. | ||
387 | */ | ||
388 | sfr_size = ALIGN((sizeof(*sfr) - sizeof(sfr->diag) + cpuhw->qsi.dsdes) + | ||
389 | sizeof(u32), sizeof(u64)); | ||
390 | sfr_size -= sizeof(u32); | ||
391 | sfr = kzalloc(sfr_size, GFP_KERNEL); | ||
392 | if (!sfr) | ||
393 | return -ENOMEM; | ||
394 | sfr->size = sfr_size; | ||
395 | sfr->bsdes = cpuhw->qsi.bsdes; | ||
396 | sfr->dsdes = cpuhw->qsi.dsdes; | ||
397 | RAWSAMPLE_REG(hwc) = (unsigned long) sfr; | ||
398 | |||
399 | /* Calculate sampling buffers using 4K pages | ||
400 | * | ||
401 | * 1. Determine the sample data size which depends on the used | ||
402 | * sampling functions, for example, basic-sampling or | ||
403 | * basic-sampling with diagnostic-sampling. | ||
404 | * | ||
405 | * 2. Use the sampling frequency as input. The sampling buffer is | ||
406 | * designed for almost one second. This can be adjusted through | ||
407 | * the "factor" variable. | ||
408 | * In any case, alloc_sampling_buffer() sets the Alert Request | ||
409 | * Control indicator to trigger a measurement-alert to harvest | ||
410 | * sample-data-blocks (sdb). | ||
411 | * | ||
412 | * 3. Compute the number of sample-data-blocks and ensure a minimum | ||
413 | * of CPUM_SF_MIN_SDB. Also ensure the upper limit does not | ||
414 | * exceed a "calculated" maximum. The symbolic maximum is | ||
415 | * designed for basic-sampling only and needs to be increased if | ||
416 | * diagnostic-sampling is active. | ||
417 | * See also the remarks for these symbolic constants. | ||
418 | * | ||
419 | * 4. Compute the number of sample-data-block-tables (SDBT) and | ||
420 | * ensure a minimum of CPUM_SF_MIN_SDBT (one table can manage up | ||
421 | * to 511 SDBs). | ||
422 | */ | ||
423 | sample_size = event_sample_size(hwc); | ||
424 | freq = sample_rate_to_freq(&cpuhw->qsi, SAMPL_RATE(hwc)); | ||
425 | factor = 1; | ||
426 | n_sdb = DIV_ROUND_UP(freq, factor * ((PAGE_SIZE-64) / sample_size)); | ||
427 | if (n_sdb < CPUM_SF_MIN_SDB) | ||
428 | n_sdb = CPUM_SF_MIN_SDB; | ||
429 | |||
430 | /* If there is already a sampling buffer allocated, it is very likely | ||
431 | * that the sampling facility is enabled too. If the event to be | ||
432 | * initialized requires a greater sampling buffer, the allocation must | ||
433 | * be postponed. Changing the sampling buffer requires the sampling | ||
434 | * facility to be in the disabled state. So, account the number of | ||
435 | * required SDBs and let cpumsf_pmu_enable() resize the buffer just | ||
436 | * before the event is started. | ||
437 | */ | ||
438 | sfb_init_allocs(n_sdb, hwc); | ||
439 | if (sf_buffer_available(cpuhw)) | ||
440 | return 0; | ||
441 | |||
442 | debug_sprintf_event(sfdbg, 3, | ||
443 | "allocate_buffers: rate=%lu f=%lu sdb=%lu/%lu" | ||
444 | " sample_size=%lu cpuhw=%p\n", | ||
445 | SAMPL_RATE(hwc), freq, n_sdb, sfb_max_limit(hwc), | ||
446 | sample_size, cpuhw); | ||
447 | |||
448 | return alloc_sampling_buffer(&cpuhw->sfb, | ||
449 | sfb_pending_allocs(&cpuhw->sfb, hwc)); | ||
450 | } | ||
451 | |||
452 | static unsigned long min_percent(unsigned int percent, unsigned long base, | ||
453 | unsigned long min) | ||
454 | { | ||
455 | return min_t(unsigned long, min, DIV_ROUND_UP(percent * base, 100)); | ||
456 | } | ||
457 | |||
458 | static unsigned long compute_sfb_extent(unsigned long ratio, unsigned long base) | ||
459 | { | ||
460 | /* Use a percentage-based approach to extend the sampling facility | ||
461 | * buffer. Accept up to 5% sample data loss. | ||
462 | * Vary the extents between 1% to 5% of the current number of | ||
463 | * sample-data-blocks. | ||
464 | */ | ||
465 | if (ratio <= 5) | ||
466 | return 0; | ||
467 | if (ratio <= 25) | ||
468 | return min_percent(1, base, 1); | ||
469 | if (ratio <= 50) | ||
470 | return min_percent(1, base, 1); | ||
471 | if (ratio <= 75) | ||
472 | return min_percent(2, base, 2); | ||
473 | if (ratio <= 100) | ||
474 | return min_percent(3, base, 3); | ||
475 | if (ratio <= 250) | ||
476 | return min_percent(4, base, 4); | ||
477 | |||
478 | return min_percent(5, base, 8); | ||
479 | } | ||
480 | |||
481 | static void sfb_account_overflows(struct cpu_hw_sf *cpuhw, | ||
482 | struct hw_perf_event *hwc) | ||
483 | { | ||
484 | unsigned long ratio, num; | ||
485 | |||
486 | if (!OVERFLOW_REG(hwc)) | ||
487 | return; | ||
488 | |||
489 | /* The sample_overflow contains the average number of sample data | ||
490 | * that has been lost because sample-data-blocks were full. | ||
491 | * | ||
492 | * Calculate the total number of sample data entries that has been | ||
493 | * discarded. Then calculate the ratio of lost samples to total samples | ||
494 | * per second in percent. | ||
495 | */ | ||
496 | ratio = DIV_ROUND_UP(100 * OVERFLOW_REG(hwc) * cpuhw->sfb.num_sdb, | ||
497 | sample_rate_to_freq(&cpuhw->qsi, SAMPL_RATE(hwc))); | ||
498 | |||
499 | /* Compute number of sample-data-blocks */ | ||
500 | num = compute_sfb_extent(ratio, cpuhw->sfb.num_sdb); | ||
501 | if (num) | ||
502 | sfb_account_allocs(num, hwc); | ||
503 | |||
504 | debug_sprintf_event(sfdbg, 5, "sfb: overflow: overflow=%llu ratio=%lu" | ||
505 | " num=%lu\n", OVERFLOW_REG(hwc), ratio, num); | ||
506 | OVERFLOW_REG(hwc) = 0; | ||
507 | } | ||
508 | |||
509 | /* extend_sampling_buffer() - Extend sampling buffer | ||
510 | * @sfb: Sampling buffer structure (for local CPU) | ||
511 | * @hwc: Perf event hardware structure | ||
512 | * | ||
513 | * Use this function to extend the sampling buffer based on the overflow counter | ||
514 | * and postponed allocation extents stored in the specified Perf event hardware. | ||
515 | * | ||
516 | * Important: This function disables the sampling facility in order to safely | ||
517 | * change the sampling buffer structure. Do not call this function | ||
518 | * when the PMU is active. | ||
519 | */ | ||
520 | static void extend_sampling_buffer(struct sf_buffer *sfb, | ||
521 | struct hw_perf_event *hwc) | ||
522 | { | ||
523 | unsigned long num, num_old; | ||
524 | int rc; | ||
525 | |||
526 | num = sfb_pending_allocs(sfb, hwc); | ||
527 | if (!num) | ||
528 | return; | ||
529 | num_old = sfb->num_sdb; | ||
530 | |||
531 | /* Disable the sampling facility to reset any states and also | ||
532 | * clear pending measurement alerts. | ||
533 | */ | ||
534 | sf_disable(); | ||
535 | |||
536 | /* Extend the sampling buffer. | ||
537 | * This memory allocation typically happens in an atomic context when | ||
538 | * called by perf. Because this is a reallocation, it is fine if the | ||
539 | * new SDB-request cannot be satisfied immediately. | ||
540 | */ | ||
541 | rc = realloc_sampling_buffer(sfb, num, GFP_ATOMIC); | ||
542 | if (rc) | ||
543 | debug_sprintf_event(sfdbg, 5, "sfb: extend: realloc " | ||
544 | "failed with rc=%i\n", rc); | ||
545 | |||
546 | if (sfb_has_pending_allocs(sfb, hwc)) | ||
547 | debug_sprintf_event(sfdbg, 5, "sfb: extend: " | ||
548 | "req=%lu alloc=%lu remaining=%lu\n", | ||
549 | num, sfb->num_sdb - num_old, | ||
550 | sfb_pending_allocs(sfb, hwc)); | ||
551 | } | ||
552 | |||
553 | |||
554 | /* Number of perf events counting hardware events */ | ||
555 | static atomic_t num_events; | ||
556 | /* Used to avoid races in calling reserve/release_cpumf_hardware */ | ||
557 | static DEFINE_MUTEX(pmc_reserve_mutex); | ||
558 | |||
559 | #define PMC_INIT 0 | ||
560 | #define PMC_RELEASE 1 | ||
561 | #define PMC_FAILURE 2 | ||
562 | static void setup_pmc_cpu(void *flags) | ||
563 | { | ||
564 | int err; | ||
565 | struct cpu_hw_sf *cpusf = &__get_cpu_var(cpu_hw_sf); | ||
566 | |||
567 | err = 0; | ||
568 | switch (*((int *) flags)) { | ||
569 | case PMC_INIT: | ||
570 | memset(cpusf, 0, sizeof(*cpusf)); | ||
571 | err = qsi(&cpusf->qsi); | ||
572 | if (err) | ||
573 | break; | ||
574 | cpusf->flags |= PMU_F_RESERVED; | ||
575 | err = sf_disable(); | ||
576 | if (err) | ||
577 | pr_err("Switching off the sampling facility failed " | ||
578 | "with rc=%i\n", err); | ||
579 | debug_sprintf_event(sfdbg, 5, | ||
580 | "setup_pmc_cpu: initialized: cpuhw=%p\n", cpusf); | ||
581 | break; | ||
582 | case PMC_RELEASE: | ||
583 | cpusf->flags &= ~PMU_F_RESERVED; | ||
584 | err = sf_disable(); | ||
585 | if (err) { | ||
586 | pr_err("Switching off the sampling facility failed " | ||
587 | "with rc=%i\n", err); | ||
588 | } else | ||
589 | deallocate_buffers(cpusf); | ||
590 | debug_sprintf_event(sfdbg, 5, | ||
591 | "setup_pmc_cpu: released: cpuhw=%p\n", cpusf); | ||
592 | break; | ||
593 | } | ||
594 | if (err) | ||
595 | *((int *) flags) |= PMC_FAILURE; | ||
596 | } | ||
597 | |||
598 | static void release_pmc_hardware(void) | ||
599 | { | ||
600 | int flags = PMC_RELEASE; | ||
601 | |||
602 | irq_subclass_unregister(IRQ_SUBCLASS_MEASUREMENT_ALERT); | ||
603 | on_each_cpu(setup_pmc_cpu, &flags, 1); | ||
604 | perf_release_sampling(); | ||
605 | } | ||
606 | |||
607 | static int reserve_pmc_hardware(void) | ||
608 | { | ||
609 | int flags = PMC_INIT; | ||
610 | int err; | ||
611 | |||
612 | err = perf_reserve_sampling(); | ||
613 | if (err) | ||
614 | return err; | ||
615 | on_each_cpu(setup_pmc_cpu, &flags, 1); | ||
616 | if (flags & PMC_FAILURE) { | ||
617 | release_pmc_hardware(); | ||
618 | return -ENODEV; | ||
619 | } | ||
620 | irq_subclass_register(IRQ_SUBCLASS_MEASUREMENT_ALERT); | ||
621 | |||
622 | return 0; | ||
623 | } | ||
624 | |||
625 | static void hw_perf_event_destroy(struct perf_event *event) | ||
626 | { | ||
627 | /* Free raw sample buffer */ | ||
628 | if (RAWSAMPLE_REG(&event->hw)) | ||
629 | kfree((void *) RAWSAMPLE_REG(&event->hw)); | ||
630 | |||
631 | /* Release PMC if this is the last perf event */ | ||
632 | if (!atomic_add_unless(&num_events, -1, 1)) { | ||
633 | mutex_lock(&pmc_reserve_mutex); | ||
634 | if (atomic_dec_return(&num_events) == 0) | ||
635 | release_pmc_hardware(); | ||
636 | mutex_unlock(&pmc_reserve_mutex); | ||
637 | } | ||
638 | } | ||
639 | |||
640 | static void hw_init_period(struct hw_perf_event *hwc, u64 period) | ||
641 | { | ||
642 | hwc->sample_period = period; | ||
643 | hwc->last_period = hwc->sample_period; | ||
644 | local64_set(&hwc->period_left, hwc->sample_period); | ||
645 | } | ||
646 | |||
647 | static void hw_reset_registers(struct hw_perf_event *hwc, | ||
648 | unsigned long *sdbt_origin) | ||
649 | { | ||
650 | struct sf_raw_sample *sfr; | ||
651 | |||
652 | /* (Re)set to first sample-data-block-table */ | ||
653 | TEAR_REG(hwc) = (unsigned long) sdbt_origin; | ||
654 | |||
655 | /* (Re)set raw sampling buffer register */ | ||
656 | sfr = (struct sf_raw_sample *) RAWSAMPLE_REG(hwc); | ||
657 | memset(&sfr->basic, 0, sizeof(sfr->basic)); | ||
658 | memset(&sfr->diag, 0, sfr->dsdes); | ||
659 | } | ||
660 | |||
661 | static unsigned long hw_limit_rate(const struct hws_qsi_info_block *si, | ||
662 | unsigned long rate) | ||
663 | { | ||
664 | return clamp_t(unsigned long, rate, | ||
665 | si->min_sampl_rate, si->max_sampl_rate); | ||
666 | } | ||
667 | |||
668 | static int __hw_perf_event_init(struct perf_event *event) | ||
669 | { | ||
670 | struct cpu_hw_sf *cpuhw; | ||
671 | struct hws_qsi_info_block si; | ||
672 | struct perf_event_attr *attr = &event->attr; | ||
673 | struct hw_perf_event *hwc = &event->hw; | ||
674 | unsigned long rate; | ||
675 | int cpu, err; | ||
676 | |||
677 | /* Reserve CPU-measurement sampling facility */ | ||
678 | err = 0; | ||
679 | if (!atomic_inc_not_zero(&num_events)) { | ||
680 | mutex_lock(&pmc_reserve_mutex); | ||
681 | if (atomic_read(&num_events) == 0 && reserve_pmc_hardware()) | ||
682 | err = -EBUSY; | ||
683 | else | ||
684 | atomic_inc(&num_events); | ||
685 | mutex_unlock(&pmc_reserve_mutex); | ||
686 | } | ||
687 | event->destroy = hw_perf_event_destroy; | ||
688 | |||
689 | if (err) | ||
690 | goto out; | ||
691 | |||
692 | /* Access per-CPU sampling information (query sampling info) */ | ||
693 | /* | ||
694 | * The event->cpu value can be -1 to count on every CPU, for example, | ||
695 | * when attaching to a task. If this is specified, use the query | ||
696 | * sampling info from the current CPU, otherwise use event->cpu to | ||
697 | * retrieve the per-CPU information. | ||
698 | * Later, cpuhw indicates whether to allocate sampling buffers for a | ||
699 | * particular CPU (cpuhw!=NULL) or each online CPU (cpuw==NULL). | ||
700 | */ | ||
701 | memset(&si, 0, sizeof(si)); | ||
702 | cpuhw = NULL; | ||
703 | if (event->cpu == -1) | ||
704 | qsi(&si); | ||
705 | else { | ||
706 | /* Event is pinned to a particular CPU, retrieve the per-CPU | ||
707 | * sampling structure for accessing the CPU-specific QSI. | ||
708 | */ | ||
709 | cpuhw = &per_cpu(cpu_hw_sf, event->cpu); | ||
710 | si = cpuhw->qsi; | ||
711 | } | ||
712 | |||
713 | /* Check sampling facility authorization and, if not authorized, | ||
714 | * fall back to other PMUs. It is safe to check any CPU because | ||
715 | * the authorization is identical for all configured CPUs. | ||
716 | */ | ||
717 | if (!si.as) { | ||
718 | err = -ENOENT; | ||
719 | goto out; | ||
720 | } | ||
721 | |||
722 | /* Always enable basic sampling */ | ||
723 | SAMPL_FLAGS(hwc) = PERF_CPUM_SF_BASIC_MODE; | ||
724 | |||
725 | /* Check if diagnostic sampling is requested. Deny if the required | ||
726 | * sampling authorization is missing. | ||
727 | */ | ||
728 | if (attr->config == PERF_EVENT_CPUM_SF_DIAG) { | ||
729 | if (!si.ad) { | ||
730 | err = -EPERM; | ||
731 | goto out; | ||
732 | } | ||
733 | SAMPL_FLAGS(hwc) |= PERF_CPUM_SF_DIAG_MODE; | ||
734 | } | ||
735 | |||
736 | /* Check and set other sampling flags */ | ||
737 | if (attr->config1 & PERF_CPUM_SF_FULL_BLOCKS) | ||
738 | SAMPL_FLAGS(hwc) |= PERF_CPUM_SF_FULL_BLOCKS; | ||
739 | |||
740 | /* The sampling information (si) contains information about the | ||
741 | * min/max sampling intervals and the CPU speed. So calculate the | ||
742 | * correct sampling interval and avoid the whole period adjust | ||
743 | * feedback loop. | ||
744 | */ | ||
745 | rate = 0; | ||
746 | if (attr->freq) { | ||
747 | rate = freq_to_sample_rate(&si, attr->sample_freq); | ||
748 | rate = hw_limit_rate(&si, rate); | ||
749 | attr->freq = 0; | ||
750 | attr->sample_period = rate; | ||
751 | } else { | ||
752 | /* The min/max sampling rates specifies the valid range | ||
753 | * of sample periods. If the specified sample period is | ||
754 | * out of range, limit the period to the range boundary. | ||
755 | */ | ||
756 | rate = hw_limit_rate(&si, hwc->sample_period); | ||
757 | |||
758 | /* The perf core maintains a maximum sample rate that is | ||
759 | * configurable through the sysctl interface. Ensure the | ||
760 | * sampling rate does not exceed this value. This also helps | ||
761 | * to avoid throttling when pushing samples with | ||
762 | * perf_event_overflow(). | ||
763 | */ | ||
764 | if (sample_rate_to_freq(&si, rate) > | ||
765 | sysctl_perf_event_sample_rate) { | ||
766 | err = -EINVAL; | ||
767 | debug_sprintf_event(sfdbg, 1, "Sampling rate exceeds maximum perf sample rate\n"); | ||
768 | goto out; | ||
769 | } | ||
770 | } | ||
771 | SAMPL_RATE(hwc) = rate; | ||
772 | hw_init_period(hwc, SAMPL_RATE(hwc)); | ||
773 | |||
774 | /* Initialize sample data overflow accounting */ | ||
775 | hwc->extra_reg.reg = REG_OVERFLOW; | ||
776 | OVERFLOW_REG(hwc) = 0; | ||
777 | |||
778 | /* Allocate the per-CPU sampling buffer using the CPU information | ||
779 | * from the event. If the event is not pinned to a particular | ||
780 | * CPU (event->cpu == -1; or cpuhw == NULL), allocate sampling | ||
781 | * buffers for each online CPU. | ||
782 | */ | ||
783 | if (cpuhw) | ||
784 | /* Event is pinned to a particular CPU */ | ||
785 | err = allocate_buffers(cpuhw, hwc); | ||
786 | else { | ||
787 | /* Event is not pinned, allocate sampling buffer on | ||
788 | * each online CPU | ||
789 | */ | ||
790 | for_each_online_cpu(cpu) { | ||
791 | cpuhw = &per_cpu(cpu_hw_sf, cpu); | ||
792 | err = allocate_buffers(cpuhw, hwc); | ||
793 | if (err) | ||
794 | break; | ||
795 | } | ||
796 | } | ||
797 | out: | ||
798 | return err; | ||
799 | } | ||
800 | |||
801 | static int cpumsf_pmu_event_init(struct perf_event *event) | ||
802 | { | ||
803 | int err; | ||
804 | |||
805 | /* No support for taken branch sampling */ | ||
806 | if (has_branch_stack(event)) | ||
807 | return -EOPNOTSUPP; | ||
808 | |||
809 | switch (event->attr.type) { | ||
810 | case PERF_TYPE_RAW: | ||
811 | if ((event->attr.config != PERF_EVENT_CPUM_SF) && | ||
812 | (event->attr.config != PERF_EVENT_CPUM_SF_DIAG)) | ||
813 | return -ENOENT; | ||
814 | break; | ||
815 | case PERF_TYPE_HARDWARE: | ||
816 | /* Support sampling of CPU cycles in addition to the | ||
817 | * counter facility. However, the counter facility | ||
818 | * is more precise and, hence, restrict this PMU to | ||
819 | * sampling events only. | ||
820 | */ | ||
821 | if (event->attr.config != PERF_COUNT_HW_CPU_CYCLES) | ||
822 | return -ENOENT; | ||
823 | if (!is_sampling_event(event)) | ||
824 | return -ENOENT; | ||
825 | break; | ||
826 | default: | ||
827 | return -ENOENT; | ||
828 | } | ||
829 | |||
830 | /* Check online status of the CPU to which the event is pinned */ | ||
831 | if (event->cpu >= nr_cpumask_bits || | ||
832 | (event->cpu >= 0 && !cpu_online(event->cpu))) | ||
833 | return -ENODEV; | ||
834 | |||
835 | /* Force reset of idle/hv excludes regardless of what the | ||
836 | * user requested. | ||
837 | */ | ||
838 | if (event->attr.exclude_hv) | ||
839 | event->attr.exclude_hv = 0; | ||
840 | if (event->attr.exclude_idle) | ||
841 | event->attr.exclude_idle = 0; | ||
842 | |||
843 | err = __hw_perf_event_init(event); | ||
844 | if (unlikely(err)) | ||
845 | if (event->destroy) | ||
846 | event->destroy(event); | ||
847 | return err; | ||
848 | } | ||
849 | |||
850 | static void cpumsf_pmu_enable(struct pmu *pmu) | ||
851 | { | ||
852 | struct cpu_hw_sf *cpuhw = &__get_cpu_var(cpu_hw_sf); | ||
853 | struct hw_perf_event *hwc; | ||
854 | int err; | ||
855 | |||
856 | if (cpuhw->flags & PMU_F_ENABLED) | ||
857 | return; | ||
858 | |||
859 | if (cpuhw->flags & PMU_F_ERR_MASK) | ||
860 | return; | ||
861 | |||
862 | /* Check whether to extent the sampling buffer. | ||
863 | * | ||
864 | * Two conditions trigger an increase of the sampling buffer for a | ||
865 | * perf event: | ||
866 | * 1. Postponed buffer allocations from the event initialization. | ||
867 | * 2. Sampling overflows that contribute to pending allocations. | ||
868 | * | ||
869 | * Note that the extend_sampling_buffer() function disables the sampling | ||
870 | * facility, but it can be fully re-enabled using sampling controls that | ||
871 | * have been saved in cpumsf_pmu_disable(). | ||
872 | */ | ||
873 | if (cpuhw->event) { | ||
874 | hwc = &cpuhw->event->hw; | ||
875 | /* Account number of overflow-designated buffer extents */ | ||
876 | sfb_account_overflows(cpuhw, hwc); | ||
877 | if (sfb_has_pending_allocs(&cpuhw->sfb, hwc)) | ||
878 | extend_sampling_buffer(&cpuhw->sfb, hwc); | ||
879 | } | ||
880 | |||
881 | /* (Re)enable the PMU and sampling facility */ | ||
882 | cpuhw->flags |= PMU_F_ENABLED; | ||
883 | barrier(); | ||
884 | |||
885 | err = lsctl(&cpuhw->lsctl); | ||
886 | if (err) { | ||
887 | cpuhw->flags &= ~PMU_F_ENABLED; | ||
888 | pr_err("Loading sampling controls failed: op=%i err=%i\n", | ||
889 | 1, err); | ||
890 | return; | ||
891 | } | ||
892 | |||
893 | debug_sprintf_event(sfdbg, 6, "pmu_enable: es=%i cs=%i ed=%i cd=%i " | ||
894 | "tear=%p dear=%p\n", cpuhw->lsctl.es, cpuhw->lsctl.cs, | ||
895 | cpuhw->lsctl.ed, cpuhw->lsctl.cd, | ||
896 | (void *) cpuhw->lsctl.tear, (void *) cpuhw->lsctl.dear); | ||
897 | } | ||
898 | |||
899 | static void cpumsf_pmu_disable(struct pmu *pmu) | ||
900 | { | ||
901 | struct cpu_hw_sf *cpuhw = &__get_cpu_var(cpu_hw_sf); | ||
902 | struct hws_lsctl_request_block inactive; | ||
903 | struct hws_qsi_info_block si; | ||
904 | int err; | ||
905 | |||
906 | if (!(cpuhw->flags & PMU_F_ENABLED)) | ||
907 | return; | ||
908 | |||
909 | if (cpuhw->flags & PMU_F_ERR_MASK) | ||
910 | return; | ||
911 | |||
912 | /* Switch off sampling activation control */ | ||
913 | inactive = cpuhw->lsctl; | ||
914 | inactive.cs = 0; | ||
915 | inactive.cd = 0; | ||
916 | |||
917 | err = lsctl(&inactive); | ||
918 | if (err) { | ||
919 | pr_err("Loading sampling controls failed: op=%i err=%i\n", | ||
920 | 2, err); | ||
921 | return; | ||
922 | } | ||
923 | |||
924 | /* Save state of TEAR and DEAR register contents */ | ||
925 | if (!qsi(&si)) { | ||
926 | /* TEAR/DEAR values are valid only if the sampling facility is | ||
927 | * enabled. Note that cpumsf_pmu_disable() might be called even | ||
928 | * for a disabled sampling facility because cpumsf_pmu_enable() | ||
929 | * controls the enable/disable state. | ||
930 | */ | ||
931 | if (si.es) { | ||
932 | cpuhw->lsctl.tear = si.tear; | ||
933 | cpuhw->lsctl.dear = si.dear; | ||
934 | } | ||
935 | } else | ||
936 | debug_sprintf_event(sfdbg, 3, "cpumsf_pmu_disable: " | ||
937 | "qsi() failed with err=%i\n", err); | ||
938 | |||
939 | cpuhw->flags &= ~PMU_F_ENABLED; | ||
940 | } | ||
941 | |||
942 | /* perf_exclude_event() - Filter event | ||
943 | * @event: The perf event | ||
944 | * @regs: pt_regs structure | ||
945 | * @sde_regs: Sample-data-entry (sde) regs structure | ||
946 | * | ||
947 | * Filter perf events according to their exclude specification. | ||
948 | * | ||
949 | * Return non-zero if the event shall be excluded. | ||
950 | */ | ||
951 | static int perf_exclude_event(struct perf_event *event, struct pt_regs *regs, | ||
952 | struct perf_sf_sde_regs *sde_regs) | ||
953 | { | ||
954 | if (event->attr.exclude_user && user_mode(regs)) | ||
955 | return 1; | ||
956 | if (event->attr.exclude_kernel && !user_mode(regs)) | ||
957 | return 1; | ||
958 | if (event->attr.exclude_guest && sde_regs->in_guest) | ||
959 | return 1; | ||
960 | if (event->attr.exclude_host && !sde_regs->in_guest) | ||
961 | return 1; | ||
962 | return 0; | ||
963 | } | ||
964 | |||
965 | /* perf_push_sample() - Push samples to perf | ||
966 | * @event: The perf event | ||
967 | * @sample: Hardware sample data | ||
968 | * | ||
969 | * Use the hardware sample data to create perf event sample. The sample | ||
970 | * is the pushed to the event subsystem and the function checks for | ||
971 | * possible event overflows. If an event overflow occurs, the PMU is | ||
972 | * stopped. | ||
973 | * | ||
974 | * Return non-zero if an event overflow occurred. | ||
975 | */ | ||
976 | static int perf_push_sample(struct perf_event *event, struct sf_raw_sample *sfr) | ||
977 | { | ||
978 | int overflow; | ||
979 | struct pt_regs regs; | ||
980 | struct perf_sf_sde_regs *sde_regs; | ||
981 | struct perf_sample_data data; | ||
982 | struct perf_raw_record raw; | ||
983 | |||
984 | /* Setup perf sample */ | ||
985 | perf_sample_data_init(&data, 0, event->hw.last_period); | ||
986 | raw.size = sfr->size; | ||
987 | raw.data = sfr; | ||
988 | data.raw = &raw; | ||
989 | |||
990 | /* Setup pt_regs to look like an CPU-measurement external interrupt | ||
991 | * using the Program Request Alert code. The regs.int_parm_long | ||
992 | * field which is unused contains additional sample-data-entry related | ||
993 | * indicators. | ||
994 | */ | ||
995 | memset(®s, 0, sizeof(regs)); | ||
996 | regs.int_code = 0x1407; | ||
997 | regs.int_parm = CPU_MF_INT_SF_PRA; | ||
998 | sde_regs = (struct perf_sf_sde_regs *) ®s.int_parm_long; | ||
999 | |||
1000 | regs.psw.addr = sfr->basic.ia; | ||
1001 | if (sfr->basic.T) | ||
1002 | regs.psw.mask |= PSW_MASK_DAT; | ||
1003 | if (sfr->basic.W) | ||
1004 | regs.psw.mask |= PSW_MASK_WAIT; | ||
1005 | if (sfr->basic.P) | ||
1006 | regs.psw.mask |= PSW_MASK_PSTATE; | ||
1007 | switch (sfr->basic.AS) { | ||
1008 | case 0x0: | ||
1009 | regs.psw.mask |= PSW_ASC_PRIMARY; | ||
1010 | break; | ||
1011 | case 0x1: | ||
1012 | regs.psw.mask |= PSW_ASC_ACCREG; | ||
1013 | break; | ||
1014 | case 0x2: | ||
1015 | regs.psw.mask |= PSW_ASC_SECONDARY; | ||
1016 | break; | ||
1017 | case 0x3: | ||
1018 | regs.psw.mask |= PSW_ASC_HOME; | ||
1019 | break; | ||
1020 | } | ||
1021 | |||
1022 | /* The host-program-parameter (hpp) contains the sie control | ||
1023 | * block that is set by sie64a() in entry64.S. Check if hpp | ||
1024 | * refers to a valid control block and set sde_regs flags | ||
1025 | * accordingly. This would allow to use hpp values for other | ||
1026 | * purposes too. | ||
1027 | * For now, simply use a non-zero value as guest indicator. | ||
1028 | */ | ||
1029 | if (sfr->basic.hpp) | ||
1030 | sde_regs->in_guest = 1; | ||
1031 | |||
1032 | overflow = 0; | ||
1033 | if (perf_exclude_event(event, ®s, sde_regs)) | ||
1034 | goto out; | ||
1035 | if (perf_event_overflow(event, &data, ®s)) { | ||
1036 | overflow = 1; | ||
1037 | event->pmu->stop(event, 0); | ||
1038 | } | ||
1039 | perf_event_update_userpage(event); | ||
1040 | out: | ||
1041 | return overflow; | ||
1042 | } | ||
1043 | |||
1044 | static void perf_event_count_update(struct perf_event *event, u64 count) | ||
1045 | { | ||
1046 | local64_add(count, &event->count); | ||
1047 | } | ||
1048 | |||
1049 | static int sample_format_is_valid(struct hws_combined_entry *sample, | ||
1050 | unsigned int flags) | ||
1051 | { | ||
1052 | if (likely(flags & PERF_CPUM_SF_BASIC_MODE)) | ||
1053 | /* Only basic-sampling data entries with data-entry-format | ||
1054 | * version of 0x0001 can be processed. | ||
1055 | */ | ||
1056 | if (sample->basic.def != 0x0001) | ||
1057 | return 0; | ||
1058 | if (flags & PERF_CPUM_SF_DIAG_MODE) | ||
1059 | /* The data-entry-format number of diagnostic-sampling data | ||
1060 | * entries can vary. Because diagnostic data is just passed | ||
1061 | * through, do only a sanity check on the DEF. | ||
1062 | */ | ||
1063 | if (sample->diag.def < 0x8001) | ||
1064 | return 0; | ||
1065 | return 1; | ||
1066 | } | ||
1067 | |||
1068 | static int sample_is_consistent(struct hws_combined_entry *sample, | ||
1069 | unsigned long flags) | ||
1070 | { | ||
1071 | /* This check applies only to basic-sampling data entries of potentially | ||
1072 | * combined-sampling data entries. Invalid entries cannot be processed | ||
1073 | * by the PMU and, thus, do not deliver an associated | ||
1074 | * diagnostic-sampling data entry. | ||
1075 | */ | ||
1076 | if (unlikely(!(flags & PERF_CPUM_SF_BASIC_MODE))) | ||
1077 | return 0; | ||
1078 | /* | ||
1079 | * Samples are skipped, if they are invalid or for which the | ||
1080 | * instruction address is not predictable, i.e., the wait-state bit is | ||
1081 | * set. | ||
1082 | */ | ||
1083 | if (sample->basic.I || sample->basic.W) | ||
1084 | return 0; | ||
1085 | return 1; | ||
1086 | } | ||
1087 | |||
1088 | static void reset_sample_slot(struct hws_combined_entry *sample, | ||
1089 | unsigned long flags) | ||
1090 | { | ||
1091 | if (likely(flags & PERF_CPUM_SF_BASIC_MODE)) | ||
1092 | sample->basic.def = 0; | ||
1093 | if (flags & PERF_CPUM_SF_DIAG_MODE) | ||
1094 | sample->diag.def = 0; | ||
1095 | } | ||
1096 | |||
1097 | static void sfr_store_sample(struct sf_raw_sample *sfr, | ||
1098 | struct hws_combined_entry *sample) | ||
1099 | { | ||
1100 | if (likely(sfr->format & PERF_CPUM_SF_BASIC_MODE)) | ||
1101 | sfr->basic = sample->basic; | ||
1102 | if (sfr->format & PERF_CPUM_SF_DIAG_MODE) | ||
1103 | memcpy(&sfr->diag, &sample->diag, sfr->dsdes); | ||
1104 | } | ||
1105 | |||
1106 | static void debug_sample_entry(struct hws_combined_entry *sample, | ||
1107 | struct hws_trailer_entry *te, | ||
1108 | unsigned long flags) | ||
1109 | { | ||
1110 | debug_sprintf_event(sfdbg, 4, "hw_collect_samples: Found unknown " | ||
1111 | "sampling data entry: te->f=%i basic.def=%04x (%p)" | ||
1112 | " diag.def=%04x (%p)\n", te->f, | ||
1113 | sample->basic.def, &sample->basic, | ||
1114 | (flags & PERF_CPUM_SF_DIAG_MODE) | ||
1115 | ? sample->diag.def : 0xFFFF, | ||
1116 | (flags & PERF_CPUM_SF_DIAG_MODE) | ||
1117 | ? &sample->diag : NULL); | ||
1118 | } | ||
1119 | |||
1120 | /* hw_collect_samples() - Walk through a sample-data-block and collect samples | ||
1121 | * @event: The perf event | ||
1122 | * @sdbt: Sample-data-block table | ||
1123 | * @overflow: Event overflow counter | ||
1124 | * | ||
1125 | * Walks through a sample-data-block and collects sampling data entries that are | ||
1126 | * then pushed to the perf event subsystem. Depending on the sampling function, | ||
1127 | * there can be either basic-sampling or combined-sampling data entries. A | ||
1128 | * combined-sampling data entry consists of a basic- and a diagnostic-sampling | ||
1129 | * data entry. The sampling function is determined by the flags in the perf | ||
1130 | * event hardware structure. The function always works with a combined-sampling | ||
1131 | * data entry but ignores the the diagnostic portion if it is not available. | ||
1132 | * | ||
1133 | * Note that the implementation focuses on basic-sampling data entries and, if | ||
1134 | * such an entry is not valid, the entire combined-sampling data entry is | ||
1135 | * ignored. | ||
1136 | * | ||
1137 | * The overflow variables counts the number of samples that has been discarded | ||
1138 | * due to a perf event overflow. | ||
1139 | */ | ||
1140 | static void hw_collect_samples(struct perf_event *event, unsigned long *sdbt, | ||
1141 | unsigned long long *overflow) | ||
1142 | { | ||
1143 | unsigned long flags = SAMPL_FLAGS(&event->hw); | ||
1144 | struct hws_combined_entry *sample; | ||
1145 | struct hws_trailer_entry *te; | ||
1146 | struct sf_raw_sample *sfr; | ||
1147 | size_t sample_size; | ||
1148 | |||
1149 | /* Prepare and initialize raw sample data */ | ||
1150 | sfr = (struct sf_raw_sample *) RAWSAMPLE_REG(&event->hw); | ||
1151 | sfr->format = flags & PERF_CPUM_SF_MODE_MASK; | ||
1152 | |||
1153 | sample_size = event_sample_size(&event->hw); | ||
1154 | te = (struct hws_trailer_entry *) trailer_entry_ptr(*sdbt); | ||
1155 | sample = (struct hws_combined_entry *) *sdbt; | ||
1156 | while ((unsigned long *) sample < (unsigned long *) te) { | ||
1157 | /* Check for an empty sample */ | ||
1158 | if (!sample->basic.def) | ||
1159 | break; | ||
1160 | |||
1161 | /* Update perf event period */ | ||
1162 | perf_event_count_update(event, SAMPL_RATE(&event->hw)); | ||
1163 | |||
1164 | /* Check sampling data entry */ | ||
1165 | if (sample_format_is_valid(sample, flags)) { | ||
1166 | /* If an event overflow occurred, the PMU is stopped to | ||
1167 | * throttle event delivery. Remaining sample data is | ||
1168 | * discarded. | ||
1169 | */ | ||
1170 | if (!*overflow) { | ||
1171 | if (sample_is_consistent(sample, flags)) { | ||
1172 | /* Deliver sample data to perf */ | ||
1173 | sfr_store_sample(sfr, sample); | ||
1174 | *overflow = perf_push_sample(event, sfr); | ||
1175 | } | ||
1176 | } else | ||
1177 | /* Count discarded samples */ | ||
1178 | *overflow += 1; | ||
1179 | } else { | ||
1180 | debug_sample_entry(sample, te, flags); | ||
1181 | /* Sample slot is not yet written or other record. | ||
1182 | * | ||
1183 | * This condition can occur if the buffer was reused | ||
1184 | * from a combined basic- and diagnostic-sampling. | ||
1185 | * If only basic-sampling is then active, entries are | ||
1186 | * written into the larger diagnostic entries. | ||
1187 | * This is typically the case for sample-data-blocks | ||
1188 | * that are not full. Stop processing if the first | ||
1189 | * invalid format was detected. | ||
1190 | */ | ||
1191 | if (!te->f) | ||
1192 | break; | ||
1193 | } | ||
1194 | |||
1195 | /* Reset sample slot and advance to next sample */ | ||
1196 | reset_sample_slot(sample, flags); | ||
1197 | sample += sample_size; | ||
1198 | } | ||
1199 | } | ||
1200 | |||
1201 | /* hw_perf_event_update() - Process sampling buffer | ||
1202 | * @event: The perf event | ||
1203 | * @flush_all: Flag to also flush partially filled sample-data-blocks | ||
1204 | * | ||
1205 | * Processes the sampling buffer and create perf event samples. | ||
1206 | * The sampling buffer position are retrieved and saved in the TEAR_REG | ||
1207 | * register of the specified perf event. | ||
1208 | * | ||
1209 | * Only full sample-data-blocks are processed. Specify the flash_all flag | ||
1210 | * to also walk through partially filled sample-data-blocks. It is ignored | ||
1211 | * if PERF_CPUM_SF_FULL_BLOCKS is set. The PERF_CPUM_SF_FULL_BLOCKS flag | ||
1212 | * enforces the processing of full sample-data-blocks only (trailer entries | ||
1213 | * with the block-full-indicator bit set). | ||
1214 | */ | ||
1215 | static void hw_perf_event_update(struct perf_event *event, int flush_all) | ||
1216 | { | ||
1217 | struct hw_perf_event *hwc = &event->hw; | ||
1218 | struct hws_trailer_entry *te; | ||
1219 | unsigned long *sdbt; | ||
1220 | unsigned long long event_overflow, sampl_overflow, num_sdb, te_flags; | ||
1221 | int done; | ||
1222 | |||
1223 | if (flush_all && SDB_FULL_BLOCKS(hwc)) | ||
1224 | flush_all = 0; | ||
1225 | |||
1226 | sdbt = (unsigned long *) TEAR_REG(hwc); | ||
1227 | done = event_overflow = sampl_overflow = num_sdb = 0; | ||
1228 | while (!done) { | ||
1229 | /* Get the trailer entry of the sample-data-block */ | ||
1230 | te = (struct hws_trailer_entry *) trailer_entry_ptr(*sdbt); | ||
1231 | |||
1232 | /* Leave loop if no more work to do (block full indicator) */ | ||
1233 | if (!te->f) { | ||
1234 | done = 1; | ||
1235 | if (!flush_all) | ||
1236 | break; | ||
1237 | } | ||
1238 | |||
1239 | /* Check the sample overflow count */ | ||
1240 | if (te->overflow) | ||
1241 | /* Account sample overflows and, if a particular limit | ||
1242 | * is reached, extend the sampling buffer. | ||
1243 | * For details, see sfb_account_overflows(). | ||
1244 | */ | ||
1245 | sampl_overflow += te->overflow; | ||
1246 | |||
1247 | /* Timestamps are valid for full sample-data-blocks only */ | ||
1248 | debug_sprintf_event(sfdbg, 6, "hw_perf_event_update: sdbt=%p " | ||
1249 | "overflow=%llu timestamp=0x%llx\n", | ||
1250 | sdbt, te->overflow, | ||
1251 | (te->f) ? trailer_timestamp(te) : 0ULL); | ||
1252 | |||
1253 | /* Collect all samples from a single sample-data-block and | ||
1254 | * flag if an (perf) event overflow happened. If so, the PMU | ||
1255 | * is stopped and remaining samples will be discarded. | ||
1256 | */ | ||
1257 | hw_collect_samples(event, sdbt, &event_overflow); | ||
1258 | num_sdb++; | ||
1259 | |||
1260 | /* Reset trailer (using compare-double-and-swap) */ | ||
1261 | do { | ||
1262 | te_flags = te->flags & ~SDB_TE_BUFFER_FULL_MASK; | ||
1263 | te_flags |= SDB_TE_ALERT_REQ_MASK; | ||
1264 | } while (!cmpxchg_double(&te->flags, &te->overflow, | ||
1265 | te->flags, te->overflow, | ||
1266 | te_flags, 0ULL)); | ||
1267 | |||
1268 | /* Advance to next sample-data-block */ | ||
1269 | sdbt++; | ||
1270 | if (is_link_entry(sdbt)) | ||
1271 | sdbt = get_next_sdbt(sdbt); | ||
1272 | |||
1273 | /* Update event hardware registers */ | ||
1274 | TEAR_REG(hwc) = (unsigned long) sdbt; | ||
1275 | |||
1276 | /* Stop processing sample-data if all samples of the current | ||
1277 | * sample-data-block were flushed even if it was not full. | ||
1278 | */ | ||
1279 | if (flush_all && done) | ||
1280 | break; | ||
1281 | |||
1282 | /* If an event overflow happened, discard samples by | ||
1283 | * processing any remaining sample-data-blocks. | ||
1284 | */ | ||
1285 | if (event_overflow) | ||
1286 | flush_all = 1; | ||
1287 | } | ||
1288 | |||
1289 | /* Account sample overflows in the event hardware structure */ | ||
1290 | if (sampl_overflow) | ||
1291 | OVERFLOW_REG(hwc) = DIV_ROUND_UP(OVERFLOW_REG(hwc) + | ||
1292 | sampl_overflow, 1 + num_sdb); | ||
1293 | if (sampl_overflow || event_overflow) | ||
1294 | debug_sprintf_event(sfdbg, 4, "hw_perf_event_update: " | ||
1295 | "overflow stats: sample=%llu event=%llu\n", | ||
1296 | sampl_overflow, event_overflow); | ||
1297 | } | ||
1298 | |||
1299 | static void cpumsf_pmu_read(struct perf_event *event) | ||
1300 | { | ||
1301 | /* Nothing to do ... updates are interrupt-driven */ | ||
1302 | } | ||
1303 | |||
1304 | /* Activate sampling control. | ||
1305 | * Next call of pmu_enable() starts sampling. | ||
1306 | */ | ||
1307 | static void cpumsf_pmu_start(struct perf_event *event, int flags) | ||
1308 | { | ||
1309 | struct cpu_hw_sf *cpuhw = &__get_cpu_var(cpu_hw_sf); | ||
1310 | |||
1311 | if (WARN_ON_ONCE(!(event->hw.state & PERF_HES_STOPPED))) | ||
1312 | return; | ||
1313 | |||
1314 | if (flags & PERF_EF_RELOAD) | ||
1315 | WARN_ON_ONCE(!(event->hw.state & PERF_HES_UPTODATE)); | ||
1316 | |||
1317 | perf_pmu_disable(event->pmu); | ||
1318 | event->hw.state = 0; | ||
1319 | cpuhw->lsctl.cs = 1; | ||
1320 | if (SAMPL_DIAG_MODE(&event->hw)) | ||
1321 | cpuhw->lsctl.cd = 1; | ||
1322 | perf_pmu_enable(event->pmu); | ||
1323 | } | ||
1324 | |||
1325 | /* Deactivate sampling control. | ||
1326 | * Next call of pmu_enable() stops sampling. | ||
1327 | */ | ||
1328 | static void cpumsf_pmu_stop(struct perf_event *event, int flags) | ||
1329 | { | ||
1330 | struct cpu_hw_sf *cpuhw = &__get_cpu_var(cpu_hw_sf); | ||
1331 | |||
1332 | if (event->hw.state & PERF_HES_STOPPED) | ||
1333 | return; | ||
1334 | |||
1335 | perf_pmu_disable(event->pmu); | ||
1336 | cpuhw->lsctl.cs = 0; | ||
1337 | cpuhw->lsctl.cd = 0; | ||
1338 | event->hw.state |= PERF_HES_STOPPED; | ||
1339 | |||
1340 | if ((flags & PERF_EF_UPDATE) && !(event->hw.state & PERF_HES_UPTODATE)) { | ||
1341 | hw_perf_event_update(event, 1); | ||
1342 | event->hw.state |= PERF_HES_UPTODATE; | ||
1343 | } | ||
1344 | perf_pmu_enable(event->pmu); | ||
1345 | } | ||
1346 | |||
1347 | static int cpumsf_pmu_add(struct perf_event *event, int flags) | ||
1348 | { | ||
1349 | struct cpu_hw_sf *cpuhw = &__get_cpu_var(cpu_hw_sf); | ||
1350 | int err; | ||
1351 | |||
1352 | if (cpuhw->flags & PMU_F_IN_USE) | ||
1353 | return -EAGAIN; | ||
1354 | |||
1355 | if (!cpuhw->sfb.sdbt) | ||
1356 | return -EINVAL; | ||
1357 | |||
1358 | err = 0; | ||
1359 | perf_pmu_disable(event->pmu); | ||
1360 | |||
1361 | event->hw.state = PERF_HES_UPTODATE | PERF_HES_STOPPED; | ||
1362 | |||
1363 | /* Set up sampling controls. Always program the sampling register | ||
1364 | * using the SDB-table start. Reset TEAR_REG event hardware register | ||
1365 | * that is used by hw_perf_event_update() to store the sampling buffer | ||
1366 | * position after samples have been flushed. | ||
1367 | */ | ||
1368 | cpuhw->lsctl.s = 0; | ||
1369 | cpuhw->lsctl.h = 1; | ||
1370 | cpuhw->lsctl.tear = (unsigned long) cpuhw->sfb.sdbt; | ||
1371 | cpuhw->lsctl.dear = *(unsigned long *) cpuhw->sfb.sdbt; | ||
1372 | cpuhw->lsctl.interval = SAMPL_RATE(&event->hw); | ||
1373 | hw_reset_registers(&event->hw, cpuhw->sfb.sdbt); | ||
1374 | |||
1375 | /* Ensure sampling functions are in the disabled state. If disabled, | ||
1376 | * switch on sampling enable control. */ | ||
1377 | if (WARN_ON_ONCE(cpuhw->lsctl.es == 1 || cpuhw->lsctl.ed == 1)) { | ||
1378 | err = -EAGAIN; | ||
1379 | goto out; | ||
1380 | } | ||
1381 | cpuhw->lsctl.es = 1; | ||
1382 | if (SAMPL_DIAG_MODE(&event->hw)) | ||
1383 | cpuhw->lsctl.ed = 1; | ||
1384 | |||
1385 | /* Set in_use flag and store event */ | ||
1386 | event->hw.idx = 0; /* only one sampling event per CPU supported */ | ||
1387 | cpuhw->event = event; | ||
1388 | cpuhw->flags |= PMU_F_IN_USE; | ||
1389 | |||
1390 | if (flags & PERF_EF_START) | ||
1391 | cpumsf_pmu_start(event, PERF_EF_RELOAD); | ||
1392 | out: | ||
1393 | perf_event_update_userpage(event); | ||
1394 | perf_pmu_enable(event->pmu); | ||
1395 | return err; | ||
1396 | } | ||
1397 | |||
1398 | static void cpumsf_pmu_del(struct perf_event *event, int flags) | ||
1399 | { | ||
1400 | struct cpu_hw_sf *cpuhw = &__get_cpu_var(cpu_hw_sf); | ||
1401 | |||
1402 | perf_pmu_disable(event->pmu); | ||
1403 | cpumsf_pmu_stop(event, PERF_EF_UPDATE); | ||
1404 | |||
1405 | cpuhw->lsctl.es = 0; | ||
1406 | cpuhw->lsctl.ed = 0; | ||
1407 | cpuhw->flags &= ~PMU_F_IN_USE; | ||
1408 | cpuhw->event = NULL; | ||
1409 | |||
1410 | perf_event_update_userpage(event); | ||
1411 | perf_pmu_enable(event->pmu); | ||
1412 | } | ||
1413 | |||
1414 | static int cpumsf_pmu_event_idx(struct perf_event *event) | ||
1415 | { | ||
1416 | return event->hw.idx; | ||
1417 | } | ||
1418 | |||
1419 | CPUMF_EVENT_ATTR(SF, SF_CYCLES_BASIC, PERF_EVENT_CPUM_SF); | ||
1420 | CPUMF_EVENT_ATTR(SF, SF_CYCLES_BASIC_DIAG, PERF_EVENT_CPUM_SF_DIAG); | ||
1421 | |||
1422 | static struct attribute *cpumsf_pmu_events_attr[] = { | ||
1423 | CPUMF_EVENT_PTR(SF, SF_CYCLES_BASIC), | ||
1424 | CPUMF_EVENT_PTR(SF, SF_CYCLES_BASIC_DIAG), | ||
1425 | NULL, | ||
1426 | }; | ||
1427 | |||
1428 | PMU_FORMAT_ATTR(event, "config:0-63"); | ||
1429 | |||
1430 | static struct attribute *cpumsf_pmu_format_attr[] = { | ||
1431 | &format_attr_event.attr, | ||
1432 | NULL, | ||
1433 | }; | ||
1434 | |||
1435 | static struct attribute_group cpumsf_pmu_events_group = { | ||
1436 | .name = "events", | ||
1437 | .attrs = cpumsf_pmu_events_attr, | ||
1438 | }; | ||
1439 | static struct attribute_group cpumsf_pmu_format_group = { | ||
1440 | .name = "format", | ||
1441 | .attrs = cpumsf_pmu_format_attr, | ||
1442 | }; | ||
1443 | static const struct attribute_group *cpumsf_pmu_attr_groups[] = { | ||
1444 | &cpumsf_pmu_events_group, | ||
1445 | &cpumsf_pmu_format_group, | ||
1446 | NULL, | ||
1447 | }; | ||
1448 | |||
1449 | static struct pmu cpumf_sampling = { | ||
1450 | .pmu_enable = cpumsf_pmu_enable, | ||
1451 | .pmu_disable = cpumsf_pmu_disable, | ||
1452 | |||
1453 | .event_init = cpumsf_pmu_event_init, | ||
1454 | .add = cpumsf_pmu_add, | ||
1455 | .del = cpumsf_pmu_del, | ||
1456 | |||
1457 | .start = cpumsf_pmu_start, | ||
1458 | .stop = cpumsf_pmu_stop, | ||
1459 | .read = cpumsf_pmu_read, | ||
1460 | |||
1461 | .event_idx = cpumsf_pmu_event_idx, | ||
1462 | .attr_groups = cpumsf_pmu_attr_groups, | ||
1463 | }; | ||
1464 | |||
1465 | static void cpumf_measurement_alert(struct ext_code ext_code, | ||
1466 | unsigned int alert, unsigned long unused) | ||
1467 | { | ||
1468 | struct cpu_hw_sf *cpuhw; | ||
1469 | |||
1470 | if (!(alert & CPU_MF_INT_SF_MASK)) | ||
1471 | return; | ||
1472 | inc_irq_stat(IRQEXT_CMS); | ||
1473 | cpuhw = &__get_cpu_var(cpu_hw_sf); | ||
1474 | |||
1475 | /* Measurement alerts are shared and might happen when the PMU | ||
1476 | * is not reserved. Ignore these alerts in this case. */ | ||
1477 | if (!(cpuhw->flags & PMU_F_RESERVED)) | ||
1478 | return; | ||
1479 | |||
1480 | /* The processing below must take care of multiple alert events that | ||
1481 | * might be indicated concurrently. */ | ||
1482 | |||
1483 | /* Program alert request */ | ||
1484 | if (alert & CPU_MF_INT_SF_PRA) { | ||
1485 | if (cpuhw->flags & PMU_F_IN_USE) | ||
1486 | hw_perf_event_update(cpuhw->event, 0); | ||
1487 | else | ||
1488 | WARN_ON_ONCE(!(cpuhw->flags & PMU_F_IN_USE)); | ||
1489 | } | ||
1490 | |||
1491 | /* Report measurement alerts only for non-PRA codes */ | ||
1492 | if (alert != CPU_MF_INT_SF_PRA) | ||
1493 | debug_sprintf_event(sfdbg, 6, "measurement alert: 0x%x\n", alert); | ||
1494 | |||
1495 | /* Sampling authorization change request */ | ||
1496 | if (alert & CPU_MF_INT_SF_SACA) | ||
1497 | qsi(&cpuhw->qsi); | ||
1498 | |||
1499 | /* Loss of sample data due to high-priority machine activities */ | ||
1500 | if (alert & CPU_MF_INT_SF_LSDA) { | ||
1501 | pr_err("Sample data was lost\n"); | ||
1502 | cpuhw->flags |= PMU_F_ERR_LSDA; | ||
1503 | sf_disable(); | ||
1504 | } | ||
1505 | |||
1506 | /* Invalid sampling buffer entry */ | ||
1507 | if (alert & (CPU_MF_INT_SF_IAE|CPU_MF_INT_SF_ISE)) { | ||
1508 | pr_err("A sampling buffer entry is incorrect (alert=0x%x)\n", | ||
1509 | alert); | ||
1510 | cpuhw->flags |= PMU_F_ERR_IBE; | ||
1511 | sf_disable(); | ||
1512 | } | ||
1513 | } | ||
1514 | |||
1515 | static int cpumf_pmu_notifier(struct notifier_block *self, | ||
1516 | unsigned long action, void *hcpu) | ||
1517 | { | ||
1518 | unsigned int cpu = (long) hcpu; | ||
1519 | int flags; | ||
1520 | |||
1521 | /* Ignore the notification if no events are scheduled on the PMU. | ||
1522 | * This might be racy... | ||
1523 | */ | ||
1524 | if (!atomic_read(&num_events)) | ||
1525 | return NOTIFY_OK; | ||
1526 | |||
1527 | switch (action & ~CPU_TASKS_FROZEN) { | ||
1528 | case CPU_ONLINE: | ||
1529 | case CPU_ONLINE_FROZEN: | ||
1530 | flags = PMC_INIT; | ||
1531 | smp_call_function_single(cpu, setup_pmc_cpu, &flags, 1); | ||
1532 | break; | ||
1533 | case CPU_DOWN_PREPARE: | ||
1534 | flags = PMC_RELEASE; | ||
1535 | smp_call_function_single(cpu, setup_pmc_cpu, &flags, 1); | ||
1536 | break; | ||
1537 | default: | ||
1538 | break; | ||
1539 | } | ||
1540 | |||
1541 | return NOTIFY_OK; | ||
1542 | } | ||
1543 | |||
1544 | static int param_get_sfb_size(char *buffer, const struct kernel_param *kp) | ||
1545 | { | ||
1546 | if (!cpum_sf_avail()) | ||
1547 | return -ENODEV; | ||
1548 | return sprintf(buffer, "%lu,%lu", CPUM_SF_MIN_SDB, CPUM_SF_MAX_SDB); | ||
1549 | } | ||
1550 | |||
1551 | static int param_set_sfb_size(const char *val, const struct kernel_param *kp) | ||
1552 | { | ||
1553 | int rc; | ||
1554 | unsigned long min, max; | ||
1555 | |||
1556 | if (!cpum_sf_avail()) | ||
1557 | return -ENODEV; | ||
1558 | if (!val || !strlen(val)) | ||
1559 | return -EINVAL; | ||
1560 | |||
1561 | /* Valid parameter values: "min,max" or "max" */ | ||
1562 | min = CPUM_SF_MIN_SDB; | ||
1563 | max = CPUM_SF_MAX_SDB; | ||
1564 | if (strchr(val, ',')) | ||
1565 | rc = (sscanf(val, "%lu,%lu", &min, &max) == 2) ? 0 : -EINVAL; | ||
1566 | else | ||
1567 | rc = kstrtoul(val, 10, &max); | ||
1568 | |||
1569 | if (min < 2 || min >= max || max > get_num_physpages()) | ||
1570 | rc = -EINVAL; | ||
1571 | if (rc) | ||
1572 | return rc; | ||
1573 | |||
1574 | sfb_set_limits(min, max); | ||
1575 | pr_info("The sampling buffer limits have changed to: " | ||
1576 | "min=%lu max=%lu (diag=x%lu)\n", | ||
1577 | CPUM_SF_MIN_SDB, CPUM_SF_MAX_SDB, CPUM_SF_SDB_DIAG_FACTOR); | ||
1578 | return 0; | ||
1579 | } | ||
1580 | |||
1581 | #define param_check_sfb_size(name, p) __param_check(name, p, void) | ||
1582 | static struct kernel_param_ops param_ops_sfb_size = { | ||
1583 | .set = param_set_sfb_size, | ||
1584 | .get = param_get_sfb_size, | ||
1585 | }; | ||
1586 | |||
1587 | #define RS_INIT_FAILURE_QSI 0x0001 | ||
1588 | #define RS_INIT_FAILURE_BSDES 0x0002 | ||
1589 | #define RS_INIT_FAILURE_ALRT 0x0003 | ||
1590 | #define RS_INIT_FAILURE_PERF 0x0004 | ||
1591 | static void __init pr_cpumsf_err(unsigned int reason) | ||
1592 | { | ||
1593 | pr_err("Sampling facility support for perf is not available: " | ||
1594 | "reason=%04x\n", reason); | ||
1595 | } | ||
1596 | |||
1597 | static int __init init_cpum_sampling_pmu(void) | ||
1598 | { | ||
1599 | struct hws_qsi_info_block si; | ||
1600 | int err; | ||
1601 | |||
1602 | if (!cpum_sf_avail()) | ||
1603 | return -ENODEV; | ||
1604 | |||
1605 | memset(&si, 0, sizeof(si)); | ||
1606 | if (qsi(&si)) { | ||
1607 | pr_cpumsf_err(RS_INIT_FAILURE_QSI); | ||
1608 | return -ENODEV; | ||
1609 | } | ||
1610 | |||
1611 | if (si.bsdes != sizeof(struct hws_basic_entry)) { | ||
1612 | pr_cpumsf_err(RS_INIT_FAILURE_BSDES); | ||
1613 | return -EINVAL; | ||
1614 | } | ||
1615 | |||
1616 | if (si.ad) | ||
1617 | sfb_set_limits(CPUM_SF_MIN_SDB, CPUM_SF_MAX_SDB); | ||
1618 | |||
1619 | sfdbg = debug_register(KMSG_COMPONENT, 2, 1, 80); | ||
1620 | if (!sfdbg) | ||
1621 | pr_err("Registering for s390dbf failed\n"); | ||
1622 | debug_register_view(sfdbg, &debug_sprintf_view); | ||
1623 | |||
1624 | err = register_external_interrupt(0x1407, cpumf_measurement_alert); | ||
1625 | if (err) { | ||
1626 | pr_cpumsf_err(RS_INIT_FAILURE_ALRT); | ||
1627 | goto out; | ||
1628 | } | ||
1629 | |||
1630 | err = perf_pmu_register(&cpumf_sampling, "cpum_sf", PERF_TYPE_RAW); | ||
1631 | if (err) { | ||
1632 | pr_cpumsf_err(RS_INIT_FAILURE_PERF); | ||
1633 | unregister_external_interrupt(0x1407, cpumf_measurement_alert); | ||
1634 | goto out; | ||
1635 | } | ||
1636 | perf_cpu_notifier(cpumf_pmu_notifier); | ||
1637 | out: | ||
1638 | return err; | ||
1639 | } | ||
1640 | arch_initcall(init_cpum_sampling_pmu); | ||
1641 | core_param(cpum_sfb_size, CPUM_SF_MAX_SDB, sfb_size, 0640); | ||
diff --git a/arch/s390/kernel/perf_event.c b/arch/s390/kernel/perf_event.c index 2343c218b8f9..5d2dfa31c4ef 100644 --- a/arch/s390/kernel/perf_event.c +++ b/arch/s390/kernel/perf_event.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Performance event support for s390x | 2 | * Performance event support for s390x |
3 | * | 3 | * |
4 | * Copyright IBM Corp. 2012 | 4 | * Copyright IBM Corp. 2012, 2013 |
5 | * Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com> | 5 | * Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com> |
6 | * | 6 | * |
7 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
@@ -16,15 +16,19 @@ | |||
16 | #include <linux/kvm_host.h> | 16 | #include <linux/kvm_host.h> |
17 | #include <linux/percpu.h> | 17 | #include <linux/percpu.h> |
18 | #include <linux/export.h> | 18 | #include <linux/export.h> |
19 | #include <linux/seq_file.h> | ||
20 | #include <linux/spinlock.h> | ||
21 | #include <linux/sysfs.h> | ||
19 | #include <asm/irq.h> | 22 | #include <asm/irq.h> |
20 | #include <asm/cpu_mf.h> | 23 | #include <asm/cpu_mf.h> |
21 | #include <asm/lowcore.h> | 24 | #include <asm/lowcore.h> |
22 | #include <asm/processor.h> | 25 | #include <asm/processor.h> |
26 | #include <asm/sysinfo.h> | ||
23 | 27 | ||
24 | const char *perf_pmu_name(void) | 28 | const char *perf_pmu_name(void) |
25 | { | 29 | { |
26 | if (cpum_cf_avail() || cpum_sf_avail()) | 30 | if (cpum_cf_avail() || cpum_sf_avail()) |
27 | return "CPU-measurement facilities (CPUMF)"; | 31 | return "CPU-Measurement Facilities (CPU-MF)"; |
28 | return "pmu"; | 32 | return "pmu"; |
29 | } | 33 | } |
30 | EXPORT_SYMBOL(perf_pmu_name); | 34 | EXPORT_SYMBOL(perf_pmu_name); |
@@ -35,6 +39,8 @@ int perf_num_counters(void) | |||
35 | 39 | ||
36 | if (cpum_cf_avail()) | 40 | if (cpum_cf_avail()) |
37 | num += PERF_CPUM_CF_MAX_CTR; | 41 | num += PERF_CPUM_CF_MAX_CTR; |
42 | if (cpum_sf_avail()) | ||
43 | num += PERF_CPUM_SF_MAX_CTR; | ||
38 | 44 | ||
39 | return num; | 45 | return num; |
40 | } | 46 | } |
@@ -54,7 +60,7 @@ static bool is_in_guest(struct pt_regs *regs) | |||
54 | { | 60 | { |
55 | if (user_mode(regs)) | 61 | if (user_mode(regs)) |
56 | return false; | 62 | return false; |
57 | #if defined(CONFIG_KVM) || defined(CONFIG_KVM_MODULE) | 63 | #if IS_ENABLED(CONFIG_KVM) |
58 | return instruction_pointer(regs) == (unsigned long) &sie_exit; | 64 | return instruction_pointer(regs) == (unsigned long) &sie_exit; |
59 | #else | 65 | #else |
60 | return false; | 66 | return false; |
@@ -83,8 +89,31 @@ static unsigned long perf_misc_guest_flags(struct pt_regs *regs) | |||
83 | : PERF_RECORD_MISC_GUEST_KERNEL; | 89 | : PERF_RECORD_MISC_GUEST_KERNEL; |
84 | } | 90 | } |
85 | 91 | ||
92 | static unsigned long perf_misc_flags_sf(struct pt_regs *regs) | ||
93 | { | ||
94 | struct perf_sf_sde_regs *sde_regs; | ||
95 | unsigned long flags; | ||
96 | |||
97 | sde_regs = (struct perf_sf_sde_regs *) ®s->int_parm_long; | ||
98 | if (sde_regs->in_guest) | ||
99 | flags = user_mode(regs) ? PERF_RECORD_MISC_GUEST_USER | ||
100 | : PERF_RECORD_MISC_GUEST_KERNEL; | ||
101 | else | ||
102 | flags = user_mode(regs) ? PERF_RECORD_MISC_USER | ||
103 | : PERF_RECORD_MISC_KERNEL; | ||
104 | return flags; | ||
105 | } | ||
106 | |||
86 | unsigned long perf_misc_flags(struct pt_regs *regs) | 107 | unsigned long perf_misc_flags(struct pt_regs *regs) |
87 | { | 108 | { |
109 | /* Check if the cpum_sf PMU has created the pt_regs structure. | ||
110 | * In this case, perf misc flags can be easily extracted. Otherwise, | ||
111 | * do regular checks on the pt_regs content. | ||
112 | */ | ||
113 | if (regs->int_code == 0x1407 && regs->int_parm == CPU_MF_INT_SF_PRA) | ||
114 | if (!regs->gprs[15]) | ||
115 | return perf_misc_flags_sf(regs); | ||
116 | |||
88 | if (is_in_guest(regs)) | 117 | if (is_in_guest(regs)) |
89 | return perf_misc_guest_flags(regs); | 118 | return perf_misc_guest_flags(regs); |
90 | 119 | ||
@@ -92,27 +121,107 @@ unsigned long perf_misc_flags(struct pt_regs *regs) | |||
92 | : PERF_RECORD_MISC_KERNEL; | 121 | : PERF_RECORD_MISC_KERNEL; |
93 | } | 122 | } |
94 | 123 | ||
95 | void perf_event_print_debug(void) | 124 | void print_debug_cf(void) |
96 | { | 125 | { |
97 | struct cpumf_ctr_info cf_info; | 126 | struct cpumf_ctr_info cf_info; |
98 | unsigned long flags; | 127 | int cpu = smp_processor_id(); |
99 | int cpu; | ||
100 | |||
101 | if (!cpum_cf_avail()) | ||
102 | return; | ||
103 | |||
104 | local_irq_save(flags); | ||
105 | 128 | ||
106 | cpu = smp_processor_id(); | ||
107 | memset(&cf_info, 0, sizeof(cf_info)); | 129 | memset(&cf_info, 0, sizeof(cf_info)); |
108 | if (!qctri(&cf_info)) | 130 | if (!qctri(&cf_info)) |
109 | pr_info("CPU[%i] CPUM_CF: ver=%u.%u A=%04x E=%04x C=%04x\n", | 131 | pr_info("CPU[%i] CPUM_CF: ver=%u.%u A=%04x E=%04x C=%04x\n", |
110 | cpu, cf_info.cfvn, cf_info.csvn, | 132 | cpu, cf_info.cfvn, cf_info.csvn, |
111 | cf_info.auth_ctl, cf_info.enable_ctl, cf_info.act_ctl); | 133 | cf_info.auth_ctl, cf_info.enable_ctl, cf_info.act_ctl); |
134 | } | ||
135 | |||
136 | static void print_debug_sf(void) | ||
137 | { | ||
138 | struct hws_qsi_info_block si; | ||
139 | int cpu = smp_processor_id(); | ||
112 | 140 | ||
141 | memset(&si, 0, sizeof(si)); | ||
142 | if (qsi(&si)) | ||
143 | return; | ||
144 | |||
145 | pr_info("CPU[%i] CPUM_SF: basic=%i diag=%i min=%lu max=%lu cpu_speed=%u\n", | ||
146 | cpu, si.as, si.ad, si.min_sampl_rate, si.max_sampl_rate, | ||
147 | si.cpu_speed); | ||
148 | |||
149 | if (si.as) | ||
150 | pr_info("CPU[%i] CPUM_SF: Basic-sampling: a=%i e=%i c=%i" | ||
151 | " bsdes=%i tear=%016lx dear=%016lx\n", cpu, | ||
152 | si.as, si.es, si.cs, si.bsdes, si.tear, si.dear); | ||
153 | if (si.ad) | ||
154 | pr_info("CPU[%i] CPUM_SF: Diagnostic-sampling: a=%i e=%i c=%i" | ||
155 | " dsdes=%i tear=%016lx dear=%016lx\n", cpu, | ||
156 | si.ad, si.ed, si.cd, si.dsdes, si.tear, si.dear); | ||
157 | } | ||
158 | |||
159 | void perf_event_print_debug(void) | ||
160 | { | ||
161 | unsigned long flags; | ||
162 | |||
163 | local_irq_save(flags); | ||
164 | if (cpum_cf_avail()) | ||
165 | print_debug_cf(); | ||
166 | if (cpum_sf_avail()) | ||
167 | print_debug_sf(); | ||
113 | local_irq_restore(flags); | 168 | local_irq_restore(flags); |
114 | } | 169 | } |
115 | 170 | ||
171 | /* Service level infrastructure */ | ||
172 | static void sl_print_counter(struct seq_file *m) | ||
173 | { | ||
174 | struct cpumf_ctr_info ci; | ||
175 | |||
176 | memset(&ci, 0, sizeof(ci)); | ||
177 | if (qctri(&ci)) | ||
178 | return; | ||
179 | |||
180 | seq_printf(m, "CPU-MF: Counter facility: version=%u.%u " | ||
181 | "authorization=%04x\n", ci.cfvn, ci.csvn, ci.auth_ctl); | ||
182 | } | ||
183 | |||
184 | static void sl_print_sampling(struct seq_file *m) | ||
185 | { | ||
186 | struct hws_qsi_info_block si; | ||
187 | |||
188 | memset(&si, 0, sizeof(si)); | ||
189 | if (qsi(&si)) | ||
190 | return; | ||
191 | |||
192 | if (!si.as && !si.ad) | ||
193 | return; | ||
194 | |||
195 | seq_printf(m, "CPU-MF: Sampling facility: min_rate=%lu max_rate=%lu" | ||
196 | " cpu_speed=%u\n", si.min_sampl_rate, si.max_sampl_rate, | ||
197 | si.cpu_speed); | ||
198 | if (si.as) | ||
199 | seq_printf(m, "CPU-MF: Sampling facility: mode=basic" | ||
200 | " sample_size=%u\n", si.bsdes); | ||
201 | if (si.ad) | ||
202 | seq_printf(m, "CPU-MF: Sampling facility: mode=diagnostic" | ||
203 | " sample_size=%u\n", si.dsdes); | ||
204 | } | ||
205 | |||
206 | static void service_level_perf_print(struct seq_file *m, | ||
207 | struct service_level *sl) | ||
208 | { | ||
209 | if (cpum_cf_avail()) | ||
210 | sl_print_counter(m); | ||
211 | if (cpum_sf_avail()) | ||
212 | sl_print_sampling(m); | ||
213 | } | ||
214 | |||
215 | static struct service_level service_level_perf = { | ||
216 | .seq_print = service_level_perf_print, | ||
217 | }; | ||
218 | |||
219 | static int __init service_level_perf_register(void) | ||
220 | { | ||
221 | return register_service_level(&service_level_perf); | ||
222 | } | ||
223 | arch_initcall(service_level_perf_register); | ||
224 | |||
116 | /* See also arch/s390/kernel/traps.c */ | 225 | /* See also arch/s390/kernel/traps.c */ |
117 | static unsigned long __store_trace(struct perf_callchain_entry *entry, | 226 | static unsigned long __store_trace(struct perf_callchain_entry *entry, |
118 | unsigned long sp, | 227 | unsigned long sp, |
@@ -172,3 +281,44 @@ void perf_callchain_kernel(struct perf_callchain_entry *entry, | |||
172 | __store_trace(entry, head, S390_lowcore.thread_info, | 281 | __store_trace(entry, head, S390_lowcore.thread_info, |
173 | S390_lowcore.thread_info + THREAD_SIZE); | 282 | S390_lowcore.thread_info + THREAD_SIZE); |
174 | } | 283 | } |
284 | |||
285 | /* Perf defintions for PMU event attributes in sysfs */ | ||
286 | ssize_t cpumf_events_sysfs_show(struct device *dev, | ||
287 | struct device_attribute *attr, char *page) | ||
288 | { | ||
289 | struct perf_pmu_events_attr *pmu_attr; | ||
290 | |||
291 | pmu_attr = container_of(attr, struct perf_pmu_events_attr, attr); | ||
292 | return sprintf(page, "event=0x%04llx,name=%s\n", | ||
293 | pmu_attr->id, attr->attr.name); | ||
294 | } | ||
295 | |||
296 | /* Reserve/release functions for sharing perf hardware */ | ||
297 | static DEFINE_SPINLOCK(perf_hw_owner_lock); | ||
298 | static void *perf_sampling_owner; | ||
299 | |||
300 | int perf_reserve_sampling(void) | ||
301 | { | ||
302 | int err; | ||
303 | |||
304 | err = 0; | ||
305 | spin_lock(&perf_hw_owner_lock); | ||
306 | if (perf_sampling_owner) { | ||
307 | pr_warn("The sampling facility is already reserved by %p\n", | ||
308 | perf_sampling_owner); | ||
309 | err = -EBUSY; | ||
310 | } else | ||
311 | perf_sampling_owner = __builtin_return_address(0); | ||
312 | spin_unlock(&perf_hw_owner_lock); | ||
313 | return err; | ||
314 | } | ||
315 | EXPORT_SYMBOL(perf_reserve_sampling); | ||
316 | |||
317 | void perf_release_sampling(void) | ||
318 | { | ||
319 | spin_lock(&perf_hw_owner_lock); | ||
320 | WARN_ON(!perf_sampling_owner); | ||
321 | perf_sampling_owner = NULL; | ||
322 | spin_unlock(&perf_hw_owner_lock); | ||
323 | } | ||
324 | EXPORT_SYMBOL(perf_release_sampling); | ||
diff --git a/arch/s390/kernel/pgm_check.S b/arch/s390/kernel/pgm_check.S index 4a460c44e17e..813ec7260878 100644 --- a/arch/s390/kernel/pgm_check.S +++ b/arch/s390/kernel/pgm_check.S | |||
@@ -78,7 +78,7 @@ PGM_CHECK_DEFAULT /* 34 */ | |||
78 | PGM_CHECK_DEFAULT /* 35 */ | 78 | PGM_CHECK_DEFAULT /* 35 */ |
79 | PGM_CHECK_DEFAULT /* 36 */ | 79 | PGM_CHECK_DEFAULT /* 36 */ |
80 | PGM_CHECK_DEFAULT /* 37 */ | 80 | PGM_CHECK_DEFAULT /* 37 */ |
81 | PGM_CHECK_DEFAULT /* 38 */ | 81 | PGM_CHECK_64BIT(do_dat_exception) /* 38 */ |
82 | PGM_CHECK_64BIT(do_dat_exception) /* 39 */ | 82 | PGM_CHECK_64BIT(do_dat_exception) /* 39 */ |
83 | PGM_CHECK_64BIT(do_dat_exception) /* 3a */ | 83 | PGM_CHECK_64BIT(do_dat_exception) /* 3a */ |
84 | PGM_CHECK_64BIT(do_dat_exception) /* 3b */ | 84 | PGM_CHECK_64BIT(do_dat_exception) /* 3b */ |
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index 7ed0d4e2a435..dd145321d215 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c | |||
@@ -261,20 +261,18 @@ static inline unsigned long brk_rnd(void) | |||
261 | 261 | ||
262 | unsigned long arch_randomize_brk(struct mm_struct *mm) | 262 | unsigned long arch_randomize_brk(struct mm_struct *mm) |
263 | { | 263 | { |
264 | unsigned long ret = PAGE_ALIGN(mm->brk + brk_rnd()); | 264 | unsigned long ret; |
265 | 265 | ||
266 | if (ret < mm->brk) | 266 | ret = PAGE_ALIGN(mm->brk + brk_rnd()); |
267 | return mm->brk; | 267 | return (ret > mm->brk) ? ret : mm->brk; |
268 | return ret; | ||
269 | } | 268 | } |
270 | 269 | ||
271 | unsigned long randomize_et_dyn(unsigned long base) | 270 | unsigned long randomize_et_dyn(unsigned long base) |
272 | { | 271 | { |
273 | unsigned long ret = PAGE_ALIGN(base + brk_rnd()); | 272 | unsigned long ret; |
274 | 273 | ||
275 | if (!(current->flags & PF_RANDOMIZE)) | 274 | if (!(current->flags & PF_RANDOMIZE)) |
276 | return base; | 275 | return base; |
277 | if (ret < base) | 276 | ret = PAGE_ALIGN(base + brk_rnd()); |
278 | return base; | 277 | return (ret > base) ? ret : base; |
279 | return ret; | ||
280 | } | 278 | } |
diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c index e65c91c591e8..f6be6087a0e9 100644 --- a/arch/s390/kernel/ptrace.c +++ b/arch/s390/kernel/ptrace.c | |||
@@ -56,25 +56,26 @@ void update_cr_regs(struct task_struct *task) | |||
56 | #ifdef CONFIG_64BIT | 56 | #ifdef CONFIG_64BIT |
57 | /* Take care of the enable/disable of transactional execution. */ | 57 | /* Take care of the enable/disable of transactional execution. */ |
58 | if (MACHINE_HAS_TE) { | 58 | if (MACHINE_HAS_TE) { |
59 | unsigned long cr[3], cr_new[3]; | 59 | unsigned long cr, cr_new; |
60 | 60 | ||
61 | __ctl_store(cr, 0, 2); | 61 | __ctl_store(cr, 0, 0); |
62 | cr_new[1] = cr[1]; | ||
63 | /* Set or clear transaction execution TXC bit 8. */ | 62 | /* Set or clear transaction execution TXC bit 8. */ |
63 | cr_new = cr | (1UL << 55); | ||
64 | if (task->thread.per_flags & PER_FLAG_NO_TE) | 64 | if (task->thread.per_flags & PER_FLAG_NO_TE) |
65 | cr_new[0] = cr[0] & ~(1UL << 55); | 65 | cr_new &= ~(1UL << 55); |
66 | else | 66 | if (cr_new != cr) |
67 | cr_new[0] = cr[0] | (1UL << 55); | 67 | __ctl_load(cr, 0, 0); |
68 | /* Set or clear transaction execution TDC bits 62 and 63. */ | 68 | /* Set or clear transaction execution TDC bits 62 and 63. */ |
69 | cr_new[2] = cr[2] & ~3UL; | 69 | __ctl_store(cr, 2, 2); |
70 | cr_new = cr & ~3UL; | ||
70 | if (task->thread.per_flags & PER_FLAG_TE_ABORT_RAND) { | 71 | if (task->thread.per_flags & PER_FLAG_TE_ABORT_RAND) { |
71 | if (task->thread.per_flags & PER_FLAG_TE_ABORT_RAND_TEND) | 72 | if (task->thread.per_flags & PER_FLAG_TE_ABORT_RAND_TEND) |
72 | cr_new[2] |= 1UL; | 73 | cr_new |= 1UL; |
73 | else | 74 | else |
74 | cr_new[2] |= 2UL; | 75 | cr_new |= 2UL; |
75 | } | 76 | } |
76 | if (memcmp(&cr_new, &cr, sizeof(cr))) | 77 | if (cr_new != cr) |
77 | __ctl_load(cr_new, 0, 2); | 78 | __ctl_load(cr_new, 2, 2); |
78 | } | 79 | } |
79 | #endif | 80 | #endif |
80 | /* Copy user specified PER registers */ | 81 | /* Copy user specified PER registers */ |
@@ -107,15 +108,11 @@ void update_cr_regs(struct task_struct *task) | |||
107 | void user_enable_single_step(struct task_struct *task) | 108 | void user_enable_single_step(struct task_struct *task) |
108 | { | 109 | { |
109 | set_tsk_thread_flag(task, TIF_SINGLE_STEP); | 110 | set_tsk_thread_flag(task, TIF_SINGLE_STEP); |
110 | if (task == current) | ||
111 | update_cr_regs(task); | ||
112 | } | 111 | } |
113 | 112 | ||
114 | void user_disable_single_step(struct task_struct *task) | 113 | void user_disable_single_step(struct task_struct *task) |
115 | { | 114 | { |
116 | clear_tsk_thread_flag(task, TIF_SINGLE_STEP); | 115 | clear_tsk_thread_flag(task, TIF_SINGLE_STEP); |
117 | if (task == current) | ||
118 | update_cr_regs(task); | ||
119 | } | 116 | } |
120 | 117 | ||
121 | /* | 118 | /* |
diff --git a/arch/s390/kernel/s390_ksyms.c b/arch/s390/kernel/s390_ksyms.c index 3bac589844a7..9f60467938d1 100644 --- a/arch/s390/kernel/s390_ksyms.c +++ b/arch/s390/kernel/s390_ksyms.c | |||
@@ -5,7 +5,7 @@ | |||
5 | #ifdef CONFIG_FUNCTION_TRACER | 5 | #ifdef CONFIG_FUNCTION_TRACER |
6 | EXPORT_SYMBOL(_mcount); | 6 | EXPORT_SYMBOL(_mcount); |
7 | #endif | 7 | #endif |
8 | #if defined(CONFIG_KVM) || defined(CONFIG_KVM_MODULE) | 8 | #if IS_ENABLED(CONFIG_KVM) |
9 | EXPORT_SYMBOL(sie64a); | 9 | EXPORT_SYMBOL(sie64a); |
10 | EXPORT_SYMBOL(sie_exit); | 10 | EXPORT_SYMBOL(sie_exit); |
11 | #endif | 11 | #endif |
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index 4444875266ee..09e2f468f48b 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c | |||
@@ -373,7 +373,7 @@ static void __init setup_lowcore(void) | |||
373 | 373 | ||
374 | /* | 374 | /* |
375 | * Set up PSW restart to call ipl.c:do_restart(). Copy the relevant | 375 | * Set up PSW restart to call ipl.c:do_restart(). Copy the relevant |
376 | * restart data to the absolute zero lowcore. This is necesary if | 376 | * restart data to the absolute zero lowcore. This is necessary if |
377 | * PSW restart is done on an offline CPU that has lowcore zero. | 377 | * PSW restart is done on an offline CPU that has lowcore zero. |
378 | */ | 378 | */ |
379 | lc->restart_stack = (unsigned long) restart_stack; | 379 | lc->restart_stack = (unsigned long) restart_stack; |
@@ -1023,6 +1023,7 @@ void __init setup_arch(char **cmdline_p) | |||
1023 | setup_vmcoreinfo(); | 1023 | setup_vmcoreinfo(); |
1024 | setup_lowcore(); | 1024 | setup_lowcore(); |
1025 | 1025 | ||
1026 | smp_fill_possible_mask(); | ||
1026 | cpu_init(); | 1027 | cpu_init(); |
1027 | s390_init_cpu_topology(); | 1028 | s390_init_cpu_topology(); |
1028 | 1029 | ||
diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c index fb535874a246..d8fd508ccd1e 100644 --- a/arch/s390/kernel/signal.c +++ b/arch/s390/kernel/signal.c | |||
@@ -94,7 +94,7 @@ static int restore_sigregs(struct pt_regs *regs, _sigregs __user *sregs) | |||
94 | return -EINVAL; | 94 | return -EINVAL; |
95 | 95 | ||
96 | /* Use regs->psw.mask instead of PSW_USER_BITS to preserve PER bit. */ | 96 | /* Use regs->psw.mask instead of PSW_USER_BITS to preserve PER bit. */ |
97 | regs->psw.mask = (regs->psw.mask & ~PSW_MASK_USER) | | 97 | regs->psw.mask = (regs->psw.mask & ~(PSW_MASK_USER | PSW_MASK_RI)) | |
98 | (user_sregs.regs.psw.mask & (PSW_MASK_USER | PSW_MASK_RI)); | 98 | (user_sregs.regs.psw.mask & (PSW_MASK_USER | PSW_MASK_RI)); |
99 | /* Check for invalid user address space control. */ | 99 | /* Check for invalid user address space control. */ |
100 | if ((regs->psw.mask & PSW_MASK_ASC) == PSW_ASC_HOME) | 100 | if ((regs->psw.mask & PSW_MASK_ASC) == PSW_ASC_HOME) |
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index dc4a53465060..a7125b62a9a6 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c | |||
@@ -59,7 +59,7 @@ enum { | |||
59 | }; | 59 | }; |
60 | 60 | ||
61 | struct pcpu { | 61 | struct pcpu { |
62 | struct cpu cpu; | 62 | struct cpu *cpu; |
63 | struct _lowcore *lowcore; /* lowcore page(s) for the cpu */ | 63 | struct _lowcore *lowcore; /* lowcore page(s) for the cpu */ |
64 | unsigned long async_stack; /* async stack for the cpu */ | 64 | unsigned long async_stack; /* async stack for the cpu */ |
65 | unsigned long panic_stack; /* panic stack for the cpu */ | 65 | unsigned long panic_stack; /* panic stack for the cpu */ |
@@ -159,9 +159,9 @@ static void pcpu_ec_call(struct pcpu *pcpu, int ec_bit) | |||
159 | { | 159 | { |
160 | int order; | 160 | int order; |
161 | 161 | ||
162 | set_bit(ec_bit, &pcpu->ec_mask); | 162 | if (test_and_set_bit(ec_bit, &pcpu->ec_mask)) |
163 | order = pcpu_running(pcpu) ? | 163 | return; |
164 | SIGP_EXTERNAL_CALL : SIGP_EMERGENCY_SIGNAL; | 164 | order = pcpu_running(pcpu) ? SIGP_EXTERNAL_CALL : SIGP_EMERGENCY_SIGNAL; |
165 | pcpu_sigp_retry(pcpu, order, 0); | 165 | pcpu_sigp_retry(pcpu, order, 0); |
166 | } | 166 | } |
167 | 167 | ||
@@ -721,18 +721,14 @@ int __cpu_up(unsigned int cpu, struct task_struct *tidle) | |||
721 | return 0; | 721 | return 0; |
722 | } | 722 | } |
723 | 723 | ||
724 | static int __init setup_possible_cpus(char *s) | 724 | static unsigned int setup_possible_cpus __initdata; |
725 | { | ||
726 | int max, cpu; | ||
727 | 725 | ||
728 | if (kstrtoint(s, 0, &max) < 0) | 726 | static int __init _setup_possible_cpus(char *s) |
729 | return 0; | 727 | { |
730 | init_cpu_possible(cpumask_of(0)); | 728 | get_option(&s, &setup_possible_cpus); |
731 | for (cpu = 1; cpu < max && cpu < nr_cpu_ids; cpu++) | ||
732 | set_cpu_possible(cpu, true); | ||
733 | return 0; | 729 | return 0; |
734 | } | 730 | } |
735 | early_param("possible_cpus", setup_possible_cpus); | 731 | early_param("possible_cpus", _setup_possible_cpus); |
736 | 732 | ||
737 | #ifdef CONFIG_HOTPLUG_CPU | 733 | #ifdef CONFIG_HOTPLUG_CPU |
738 | 734 | ||
@@ -775,6 +771,17 @@ void __noreturn cpu_die(void) | |||
775 | 771 | ||
776 | #endif /* CONFIG_HOTPLUG_CPU */ | 772 | #endif /* CONFIG_HOTPLUG_CPU */ |
777 | 773 | ||
774 | void __init smp_fill_possible_mask(void) | ||
775 | { | ||
776 | unsigned int possible, cpu; | ||
777 | |||
778 | possible = setup_possible_cpus; | ||
779 | if (!possible) | ||
780 | possible = MACHINE_IS_VM ? 64 : nr_cpu_ids; | ||
781 | for (cpu = 0; cpu < possible && cpu < nr_cpu_ids; cpu++) | ||
782 | set_cpu_possible(cpu, true); | ||
783 | } | ||
784 | |||
778 | void __init smp_prepare_cpus(unsigned int max_cpus) | 785 | void __init smp_prepare_cpus(unsigned int max_cpus) |
779 | { | 786 | { |
780 | /* request the 0x1201 emergency signal external interrupt */ | 787 | /* request the 0x1201 emergency signal external interrupt */ |
@@ -958,7 +965,7 @@ static int smp_cpu_notify(struct notifier_block *self, unsigned long action, | |||
958 | void *hcpu) | 965 | void *hcpu) |
959 | { | 966 | { |
960 | unsigned int cpu = (unsigned int)(long)hcpu; | 967 | unsigned int cpu = (unsigned int)(long)hcpu; |
961 | struct cpu *c = &pcpu_devices[cpu].cpu; | 968 | struct cpu *c = pcpu_devices[cpu].cpu; |
962 | struct device *s = &c->dev; | 969 | struct device *s = &c->dev; |
963 | int err = 0; | 970 | int err = 0; |
964 | 971 | ||
@@ -975,10 +982,15 @@ static int smp_cpu_notify(struct notifier_block *self, unsigned long action, | |||
975 | 982 | ||
976 | static int smp_add_present_cpu(int cpu) | 983 | static int smp_add_present_cpu(int cpu) |
977 | { | 984 | { |
978 | struct cpu *c = &pcpu_devices[cpu].cpu; | 985 | struct device *s; |
979 | struct device *s = &c->dev; | 986 | struct cpu *c; |
980 | int rc; | 987 | int rc; |
981 | 988 | ||
989 | c = kzalloc(sizeof(*c), GFP_KERNEL); | ||
990 | if (!c) | ||
991 | return -ENOMEM; | ||
992 | pcpu_devices[cpu].cpu = c; | ||
993 | s = &c->dev; | ||
982 | c->hotpluggable = 1; | 994 | c->hotpluggable = 1; |
983 | rc = register_cpu(c, cpu); | 995 | rc = register_cpu(c, cpu); |
984 | if (rc) | 996 | if (rc) |
diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index 064c3082ab33..dd95f1631621 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c | |||
@@ -108,20 +108,10 @@ static void fixup_clock_comparator(unsigned long long delta) | |||
108 | set_clock_comparator(S390_lowcore.clock_comparator); | 108 | set_clock_comparator(S390_lowcore.clock_comparator); |
109 | } | 109 | } |
110 | 110 | ||
111 | static int s390_next_ktime(ktime_t expires, | 111 | static int s390_next_event(unsigned long delta, |
112 | struct clock_event_device *evt) | 112 | struct clock_event_device *evt) |
113 | { | 113 | { |
114 | struct timespec ts; | 114 | S390_lowcore.clock_comparator = get_tod_clock() + delta; |
115 | u64 nsecs; | ||
116 | |||
117 | ts.tv_sec = ts.tv_nsec = 0; | ||
118 | monotonic_to_bootbased(&ts); | ||
119 | nsecs = ktime_to_ns(ktime_add(timespec_to_ktime(ts), expires)); | ||
120 | do_div(nsecs, 125); | ||
121 | S390_lowcore.clock_comparator = sched_clock_base_cc + (nsecs << 9); | ||
122 | /* Program the maximum value if we have an overflow (== year 2042) */ | ||
123 | if (unlikely(S390_lowcore.clock_comparator < sched_clock_base_cc)) | ||
124 | S390_lowcore.clock_comparator = -1ULL; | ||
125 | set_clock_comparator(S390_lowcore.clock_comparator); | 115 | set_clock_comparator(S390_lowcore.clock_comparator); |
126 | return 0; | 116 | return 0; |
127 | } | 117 | } |
@@ -146,15 +136,14 @@ void init_cpu_timer(void) | |||
146 | cpu = smp_processor_id(); | 136 | cpu = smp_processor_id(); |
147 | cd = &per_cpu(comparators, cpu); | 137 | cd = &per_cpu(comparators, cpu); |
148 | cd->name = "comparator"; | 138 | cd->name = "comparator"; |
149 | cd->features = CLOCK_EVT_FEAT_ONESHOT | | 139 | cd->features = CLOCK_EVT_FEAT_ONESHOT; |
150 | CLOCK_EVT_FEAT_KTIME; | ||
151 | cd->mult = 16777; | 140 | cd->mult = 16777; |
152 | cd->shift = 12; | 141 | cd->shift = 12; |
153 | cd->min_delta_ns = 1; | 142 | cd->min_delta_ns = 1; |
154 | cd->max_delta_ns = LONG_MAX; | 143 | cd->max_delta_ns = LONG_MAX; |
155 | cd->rating = 400; | 144 | cd->rating = 400; |
156 | cd->cpumask = cpumask_of(cpu); | 145 | cd->cpumask = cpumask_of(cpu); |
157 | cd->set_next_ktime = s390_next_ktime; | 146 | cd->set_next_event = s390_next_event; |
158 | cd->set_mode = s390_set_mode; | 147 | cd->set_mode = s390_set_mode; |
159 | 148 | ||
160 | clockevents_register_device(cd); | 149 | clockevents_register_device(cd); |
@@ -221,21 +210,30 @@ struct clocksource * __init clocksource_default_clock(void) | |||
221 | return &clocksource_tod; | 210 | return &clocksource_tod; |
222 | } | 211 | } |
223 | 212 | ||
224 | void update_vsyscall_old(struct timespec *wall_time, struct timespec *wtm, | 213 | void update_vsyscall(struct timekeeper *tk) |
225 | struct clocksource *clock, u32 mult) | ||
226 | { | 214 | { |
227 | if (clock != &clocksource_tod) | 215 | u64 nsecps; |
216 | |||
217 | if (tk->clock != &clocksource_tod) | ||
228 | return; | 218 | return; |
229 | 219 | ||
230 | /* Make userspace gettimeofday spin until we're done. */ | 220 | /* Make userspace gettimeofday spin until we're done. */ |
231 | ++vdso_data->tb_update_count; | 221 | ++vdso_data->tb_update_count; |
232 | smp_wmb(); | 222 | smp_wmb(); |
233 | vdso_data->xtime_tod_stamp = clock->cycle_last; | 223 | vdso_data->xtime_tod_stamp = tk->clock->cycle_last; |
234 | vdso_data->xtime_clock_sec = wall_time->tv_sec; | 224 | vdso_data->xtime_clock_sec = tk->xtime_sec; |
235 | vdso_data->xtime_clock_nsec = wall_time->tv_nsec; | 225 | vdso_data->xtime_clock_nsec = tk->xtime_nsec; |
236 | vdso_data->wtom_clock_sec = wtm->tv_sec; | 226 | vdso_data->wtom_clock_sec = |
237 | vdso_data->wtom_clock_nsec = wtm->tv_nsec; | 227 | tk->xtime_sec + tk->wall_to_monotonic.tv_sec; |
238 | vdso_data->ntp_mult = mult; | 228 | vdso_data->wtom_clock_nsec = tk->xtime_nsec + |
229 | + (tk->wall_to_monotonic.tv_nsec << tk->shift); | ||
230 | nsecps = (u64) NSEC_PER_SEC << tk->shift; | ||
231 | while (vdso_data->wtom_clock_nsec >= nsecps) { | ||
232 | vdso_data->wtom_clock_nsec -= nsecps; | ||
233 | vdso_data->wtom_clock_sec++; | ||
234 | } | ||
235 | vdso_data->tk_mult = tk->mult; | ||
236 | vdso_data->tk_shift = tk->shift; | ||
239 | smp_wmb(); | 237 | smp_wmb(); |
240 | ++vdso_data->tb_update_count; | 238 | ++vdso_data->tb_update_count; |
241 | } | 239 | } |
diff --git a/arch/s390/kernel/vdso.c b/arch/s390/kernel/vdso.c index a84476f2a9bb..613649096783 100644 --- a/arch/s390/kernel/vdso.c +++ b/arch/s390/kernel/vdso.c | |||
@@ -125,7 +125,7 @@ int vdso_alloc_per_cpu(struct _lowcore *lowcore) | |||
125 | psal[i] = 0x80000000; | 125 | psal[i] = 0x80000000; |
126 | 126 | ||
127 | lowcore->paste[4] = (u32)(addr_t) psal; | 127 | lowcore->paste[4] = (u32)(addr_t) psal; |
128 | psal[0] = 0x20000000; | 128 | psal[0] = 0x02000000; |
129 | psal[2] = (u32)(addr_t) aste; | 129 | psal[2] = (u32)(addr_t) aste; |
130 | *(unsigned long *) (aste + 2) = segment_table + | 130 | *(unsigned long *) (aste + 2) = segment_table + |
131 | _ASCE_TABLE_LENGTH + _ASCE_USER_BITS + _ASCE_TYPE_SEGMENT; | 131 | _ASCE_TABLE_LENGTH + _ASCE_USER_BITS + _ASCE_TYPE_SEGMENT; |
diff --git a/arch/s390/kernel/vdso32/clock_gettime.S b/arch/s390/kernel/vdso32/clock_gettime.S index b2224e0b974c..65fc3979c2f1 100644 --- a/arch/s390/kernel/vdso32/clock_gettime.S +++ b/arch/s390/kernel/vdso32/clock_gettime.S | |||
@@ -38,25 +38,21 @@ __kernel_clock_gettime: | |||
38 | sl %r1,__VDSO_XTIME_STAMP+4(%r5) | 38 | sl %r1,__VDSO_XTIME_STAMP+4(%r5) |
39 | brc 3,2f | 39 | brc 3,2f |
40 | ahi %r0,-1 | 40 | ahi %r0,-1 |
41 | 2: ms %r0,__VDSO_NTP_MULT(%r5) /* cyc2ns(clock,cycle_delta) */ | 41 | 2: ms %r0,__VDSO_TK_MULT(%r5) /* * tk->mult */ |
42 | lr %r2,%r0 | 42 | lr %r2,%r0 |
43 | l %r0,__VDSO_NTP_MULT(%r5) | 43 | l %r0,__VDSO_TK_MULT(%r5) |
44 | ltr %r1,%r1 | 44 | ltr %r1,%r1 |
45 | mr %r0,%r0 | 45 | mr %r0,%r0 |
46 | jnm 3f | 46 | jnm 3f |
47 | a %r0,__VDSO_NTP_MULT(%r5) | 47 | a %r0,__VDSO_TK_MULT(%r5) |
48 | 3: alr %r0,%r2 | 48 | 3: alr %r0,%r2 |
49 | srdl %r0,12 | 49 | al %r0,__VDSO_WTOM_NSEC(%r5) |
50 | al %r0,__VDSO_XTIME_NSEC(%r5) /* + xtime */ | ||
51 | al %r1,__VDSO_XTIME_NSEC+4(%r5) | ||
52 | brc 12,4f | ||
53 | ahi %r0,1 | ||
54 | 4: l %r2,__VDSO_XTIME_SEC+4(%r5) | ||
55 | al %r0,__VDSO_WTOM_NSEC(%r5) /* + wall_to_monotonic */ | ||
56 | al %r1,__VDSO_WTOM_NSEC+4(%r5) | 50 | al %r1,__VDSO_WTOM_NSEC+4(%r5) |
57 | brc 12,5f | 51 | brc 12,5f |
58 | ahi %r0,1 | 52 | ahi %r0,1 |
59 | 5: al %r2,__VDSO_WTOM_SEC+4(%r5) | 53 | 5: l %r2,__VDSO_TK_SHIFT(%r5) /* Timekeeper shift */ |
54 | srdl %r0,0(%r2) /* >> tk->shift */ | ||
55 | l %r2,__VDSO_WTOM_SEC+4(%r5) | ||
60 | cl %r4,__VDSO_UPD_COUNT+4(%r5) /* check update counter */ | 56 | cl %r4,__VDSO_UPD_COUNT+4(%r5) /* check update counter */ |
61 | jne 1b | 57 | jne 1b |
62 | basr %r5,0 | 58 | basr %r5,0 |
@@ -86,20 +82,21 @@ __kernel_clock_gettime: | |||
86 | sl %r1,__VDSO_XTIME_STAMP+4(%r5) | 82 | sl %r1,__VDSO_XTIME_STAMP+4(%r5) |
87 | brc 3,12f | 83 | brc 3,12f |
88 | ahi %r0,-1 | 84 | ahi %r0,-1 |
89 | 12: ms %r0,__VDSO_NTP_MULT(%r5) /* cyc2ns(clock,cycle_delta) */ | 85 | 12: ms %r0,__VDSO_TK_MULT(%r5) /* * tk->mult */ |
90 | lr %r2,%r0 | 86 | lr %r2,%r0 |
91 | l %r0,__VDSO_NTP_MULT(%r5) | 87 | l %r0,__VDSO_TK_MULT(%r5) |
92 | ltr %r1,%r1 | 88 | ltr %r1,%r1 |
93 | mr %r0,%r0 | 89 | mr %r0,%r0 |
94 | jnm 13f | 90 | jnm 13f |
95 | a %r0,__VDSO_NTP_MULT(%r5) | 91 | a %r0,__VDSO_TK_MULT(%r5) |
96 | 13: alr %r0,%r2 | 92 | 13: alr %r0,%r2 |
97 | srdl %r0,12 | 93 | al %r0,__VDSO_XTIME_NSEC(%r5) /* + tk->xtime_nsec */ |
98 | al %r0,__VDSO_XTIME_NSEC(%r5) /* + xtime */ | ||
99 | al %r1,__VDSO_XTIME_NSEC+4(%r5) | 94 | al %r1,__VDSO_XTIME_NSEC+4(%r5) |
100 | brc 12,14f | 95 | brc 12,14f |
101 | ahi %r0,1 | 96 | ahi %r0,1 |
102 | 14: l %r2,__VDSO_XTIME_SEC+4(%r5) | 97 | 14: l %r2,__VDSO_TK_SHIFT(%r5) /* Timekeeper shift */ |
98 | srdl %r0,0(%r2) /* >> tk->shift */ | ||
99 | l %r2,__VDSO_XTIME_SEC+4(%r5) | ||
103 | cl %r4,__VDSO_UPD_COUNT+4(%r5) /* check update counter */ | 100 | cl %r4,__VDSO_UPD_COUNT+4(%r5) /* check update counter */ |
104 | jne 11b | 101 | jne 11b |
105 | basr %r5,0 | 102 | basr %r5,0 |
diff --git a/arch/s390/kernel/vdso32/gettimeofday.S b/arch/s390/kernel/vdso32/gettimeofday.S index 2d3633175e3b..fd621a950f7c 100644 --- a/arch/s390/kernel/vdso32/gettimeofday.S +++ b/arch/s390/kernel/vdso32/gettimeofday.S | |||
@@ -35,15 +35,14 @@ __kernel_gettimeofday: | |||
35 | sl %r1,__VDSO_XTIME_STAMP+4(%r5) | 35 | sl %r1,__VDSO_XTIME_STAMP+4(%r5) |
36 | brc 3,3f | 36 | brc 3,3f |
37 | ahi %r0,-1 | 37 | ahi %r0,-1 |
38 | 3: ms %r0,__VDSO_NTP_MULT(%r5) /* cyc2ns(clock,cycle_delta) */ | 38 | 3: ms %r0,__VDSO_TK_MULT(%r5) /* * tk->mult */ |
39 | st %r0,24(%r15) | 39 | st %r0,24(%r15) |
40 | l %r0,__VDSO_NTP_MULT(%r5) | 40 | l %r0,__VDSO_TK_MULT(%r5) |
41 | ltr %r1,%r1 | 41 | ltr %r1,%r1 |
42 | mr %r0,%r0 | 42 | mr %r0,%r0 |
43 | jnm 4f | 43 | jnm 4f |
44 | a %r0,__VDSO_NTP_MULT(%r5) | 44 | a %r0,__VDSO_TK_MULT(%r5) |
45 | 4: al %r0,24(%r15) | 45 | 4: al %r0,24(%r15) |
46 | srdl %r0,12 | ||
47 | al %r0,__VDSO_XTIME_NSEC(%r5) /* + xtime */ | 46 | al %r0,__VDSO_XTIME_NSEC(%r5) /* + xtime */ |
48 | al %r1,__VDSO_XTIME_NSEC+4(%r5) | 47 | al %r1,__VDSO_XTIME_NSEC+4(%r5) |
49 | brc 12,5f | 48 | brc 12,5f |
@@ -51,6 +50,8 @@ __kernel_gettimeofday: | |||
51 | 5: mvc 24(4,%r15),__VDSO_XTIME_SEC+4(%r5) | 50 | 5: mvc 24(4,%r15),__VDSO_XTIME_SEC+4(%r5) |
52 | cl %r4,__VDSO_UPD_COUNT+4(%r5) /* check update counter */ | 51 | cl %r4,__VDSO_UPD_COUNT+4(%r5) /* check update counter */ |
53 | jne 1b | 52 | jne 1b |
53 | l %r4,__VDSO_TK_SHIFT(%r5) /* Timekeeper shift */ | ||
54 | srdl %r0,0(%r4) /* >> tk->shift */ | ||
54 | l %r4,24(%r15) /* get tv_sec from stack */ | 55 | l %r4,24(%r15) /* get tv_sec from stack */ |
55 | basr %r5,0 | 56 | basr %r5,0 |
56 | 6: ltr %r0,%r0 | 57 | 6: ltr %r0,%r0 |
diff --git a/arch/s390/kernel/vdso64/clock_getres.S b/arch/s390/kernel/vdso64/clock_getres.S index 176e1f75f9aa..34deba7c7ed1 100644 --- a/arch/s390/kernel/vdso64/clock_getres.S +++ b/arch/s390/kernel/vdso64/clock_getres.S | |||
@@ -23,7 +23,9 @@ __kernel_clock_getres: | |||
23 | je 0f | 23 | je 0f |
24 | cghi %r2,__CLOCK_MONOTONIC | 24 | cghi %r2,__CLOCK_MONOTONIC |
25 | je 0f | 25 | je 0f |
26 | cghi %r2,-2 /* CLOCK_THREAD_CPUTIME_ID for this thread */ | 26 | cghi %r2,__CLOCK_THREAD_CPUTIME_ID |
27 | je 0f | ||
28 | cghi %r2,-2 /* Per-thread CPUCLOCK with PID=0, VIRT=1 */ | ||
27 | jne 2f | 29 | jne 2f |
28 | larl %r5,_vdso_data | 30 | larl %r5,_vdso_data |
29 | icm %r0,15,__LC_ECTG_OK(%r5) | 31 | icm %r0,15,__LC_ECTG_OK(%r5) |
diff --git a/arch/s390/kernel/vdso64/clock_gettime.S b/arch/s390/kernel/vdso64/clock_gettime.S index d46c95ed5f19..91940ed33a4a 100644 --- a/arch/s390/kernel/vdso64/clock_gettime.S +++ b/arch/s390/kernel/vdso64/clock_gettime.S | |||
@@ -22,7 +22,9 @@ __kernel_clock_gettime: | |||
22 | larl %r5,_vdso_data | 22 | larl %r5,_vdso_data |
23 | cghi %r2,__CLOCK_REALTIME | 23 | cghi %r2,__CLOCK_REALTIME |
24 | je 4f | 24 | je 4f |
25 | cghi %r2,-2 /* CLOCK_THREAD_CPUTIME_ID for this thread */ | 25 | cghi %r2,__CLOCK_THREAD_CPUTIME_ID |
26 | je 9f | ||
27 | cghi %r2,-2 /* Per-thread CPUCLOCK with PID=0, VIRT=1 */ | ||
26 | je 9f | 28 | je 9f |
27 | cghi %r2,__CLOCK_MONOTONIC | 29 | cghi %r2,__CLOCK_MONOTONIC |
28 | jne 12f | 30 | jne 12f |
@@ -34,14 +36,13 @@ __kernel_clock_gettime: | |||
34 | tmll %r4,0x0001 /* pending update ? loop */ | 36 | tmll %r4,0x0001 /* pending update ? loop */ |
35 | jnz 0b | 37 | jnz 0b |
36 | stck 48(%r15) /* Store TOD clock */ | 38 | stck 48(%r15) /* Store TOD clock */ |
39 | lgf %r2,__VDSO_TK_SHIFT(%r5) /* Timekeeper shift */ | ||
40 | lg %r0,__VDSO_WTOM_SEC(%r5) | ||
37 | lg %r1,48(%r15) | 41 | lg %r1,48(%r15) |
38 | sg %r1,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ | 42 | sg %r1,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ |
39 | msgf %r1,__VDSO_NTP_MULT(%r5) /* * NTP adjustment */ | 43 | msgf %r1,__VDSO_TK_MULT(%r5) /* * tk->mult */ |
40 | srlg %r1,%r1,12 /* cyc2ns(clock,cycle_delta) */ | 44 | alg %r1,__VDSO_WTOM_NSEC(%r5) |
41 | alg %r1,__VDSO_XTIME_NSEC(%r5) /* + xtime */ | 45 | srlg %r1,%r1,0(%r2) /* >> tk->shift */ |
42 | lg %r0,__VDSO_XTIME_SEC(%r5) | ||
43 | alg %r1,__VDSO_WTOM_NSEC(%r5) /* + wall_to_monotonic */ | ||
44 | alg %r0,__VDSO_WTOM_SEC(%r5) | ||
45 | clg %r4,__VDSO_UPD_COUNT(%r5) /* check update counter */ | 46 | clg %r4,__VDSO_UPD_COUNT(%r5) /* check update counter */ |
46 | jne 0b | 47 | jne 0b |
47 | larl %r5,13f | 48 | larl %r5,13f |
@@ -62,12 +63,13 @@ __kernel_clock_gettime: | |||
62 | tmll %r4,0x0001 /* pending update ? loop */ | 63 | tmll %r4,0x0001 /* pending update ? loop */ |
63 | jnz 5b | 64 | jnz 5b |
64 | stck 48(%r15) /* Store TOD clock */ | 65 | stck 48(%r15) /* Store TOD clock */ |
66 | lgf %r2,__VDSO_TK_SHIFT(%r5) /* Timekeeper shift */ | ||
65 | lg %r1,48(%r15) | 67 | lg %r1,48(%r15) |
66 | sg %r1,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ | 68 | sg %r1,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ |
67 | msgf %r1,__VDSO_NTP_MULT(%r5) /* * NTP adjustment */ | 69 | msgf %r1,__VDSO_TK_MULT(%r5) /* * tk->mult */ |
68 | srlg %r1,%r1,12 /* cyc2ns(clock,cycle_delta) */ | 70 | alg %r1,__VDSO_XTIME_NSEC(%r5) /* + tk->xtime_nsec */ |
69 | alg %r1,__VDSO_XTIME_NSEC(%r5) /* + xtime */ | 71 | srlg %r1,%r1,0(%r2) /* >> tk->shift */ |
70 | lg %r0,__VDSO_XTIME_SEC(%r5) | 72 | lg %r0,__VDSO_XTIME_SEC(%r5) /* tk->xtime_sec */ |
71 | clg %r4,__VDSO_UPD_COUNT(%r5) /* check update counter */ | 73 | clg %r4,__VDSO_UPD_COUNT(%r5) /* check update counter */ |
72 | jne 5b | 74 | jne 5b |
73 | larl %r5,13f | 75 | larl %r5,13f |
diff --git a/arch/s390/kernel/vdso64/gettimeofday.S b/arch/s390/kernel/vdso64/gettimeofday.S index 36ee674722ec..d0860d1d0ccc 100644 --- a/arch/s390/kernel/vdso64/gettimeofday.S +++ b/arch/s390/kernel/vdso64/gettimeofday.S | |||
@@ -31,12 +31,13 @@ __kernel_gettimeofday: | |||
31 | stck 48(%r15) /* Store TOD clock */ | 31 | stck 48(%r15) /* Store TOD clock */ |
32 | lg %r1,48(%r15) | 32 | lg %r1,48(%r15) |
33 | sg %r1,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ | 33 | sg %r1,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ |
34 | msgf %r1,__VDSO_NTP_MULT(%r5) /* * NTP adjustment */ | 34 | msgf %r1,__VDSO_TK_MULT(%r5) /* * tk->mult */ |
35 | srlg %r1,%r1,12 /* cyc2ns(clock,cycle_delta) */ | 35 | alg %r1,__VDSO_XTIME_NSEC(%r5) /* + tk->xtime_nsec */ |
36 | alg %r1,__VDSO_XTIME_NSEC(%r5) /* + xtime.tv_nsec */ | 36 | lg %r0,__VDSO_XTIME_SEC(%r5) /* tk->xtime_sec */ |
37 | lg %r0,__VDSO_XTIME_SEC(%r5) /* xtime.tv_sec */ | ||
38 | clg %r4,__VDSO_UPD_COUNT(%r5) /* check update counter */ | 37 | clg %r4,__VDSO_UPD_COUNT(%r5) /* check update counter */ |
39 | jne 0b | 38 | jne 0b |
39 | lgf %r5,__VDSO_TK_SHIFT(%r5) /* Timekeeper shift */ | ||
40 | srlg %r1,%r1,0(%r5) /* >> tk->shift */ | ||
40 | larl %r5,5f | 41 | larl %r5,5f |
41 | 2: clg %r1,0(%r5) | 42 | 2: clg %r1,0(%r5) |
42 | jl 3f | 43 | jl 3f |
diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c index 2440602e6df1..d101dae62771 100644 --- a/arch/s390/kvm/priv.c +++ b/arch/s390/kvm/priv.c | |||
@@ -275,7 +275,7 @@ static int handle_io_inst(struct kvm_vcpu *vcpu) | |||
275 | return -EOPNOTSUPP; | 275 | return -EOPNOTSUPP; |
276 | } else { | 276 | } else { |
277 | /* | 277 | /* |
278 | * Set condition code 3 to stop the guest from issueing channel | 278 | * Set condition code 3 to stop the guest from issuing channel |
279 | * I/O instructions. | 279 | * I/O instructions. |
280 | */ | 280 | */ |
281 | kvm_s390_set_psw_cc(vcpu, 3); | 281 | kvm_s390_set_psw_cc(vcpu, 3); |
diff --git a/arch/s390/lib/uaccess_pt.c b/arch/s390/lib/uaccess_pt.c index 97e03caf7825..0632dc50da78 100644 --- a/arch/s390/lib/uaccess_pt.c +++ b/arch/s390/lib/uaccess_pt.c | |||
@@ -74,15 +74,18 @@ static size_t copy_in_kernel(size_t count, void __user *to, | |||
74 | 74 | ||
75 | /* | 75 | /* |
76 | * Returns kernel address for user virtual address. If the returned address is | 76 | * Returns kernel address for user virtual address. If the returned address is |
77 | * >= -4095 (IS_ERR_VALUE(x) returns true), a fault has occured and the address | 77 | * >= -4095 (IS_ERR_VALUE(x) returns true), a fault has occurred and the |
78 | * contains the (negative) exception code. | 78 | * address contains the (negative) exception code. |
79 | */ | 79 | */ |
80 | #ifdef CONFIG_64BIT | 80 | #ifdef CONFIG_64BIT |
81 | |||
81 | static unsigned long follow_table(struct mm_struct *mm, | 82 | static unsigned long follow_table(struct mm_struct *mm, |
82 | unsigned long address, int write) | 83 | unsigned long address, int write) |
83 | { | 84 | { |
84 | unsigned long *table = (unsigned long *)__pa(mm->pgd); | 85 | unsigned long *table = (unsigned long *)__pa(mm->pgd); |
85 | 86 | ||
87 | if (unlikely(address > mm->context.asce_limit - 1)) | ||
88 | return -0x38UL; | ||
86 | switch (mm->context.asce_bits & _ASCE_TYPE_MASK) { | 89 | switch (mm->context.asce_bits & _ASCE_TYPE_MASK) { |
87 | case _ASCE_TYPE_REGION1: | 90 | case _ASCE_TYPE_REGION1: |
88 | table = table + ((address >> 53) & 0x7ff); | 91 | table = table + ((address >> 53) & 0x7ff); |
diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c index e794c88f699a..3584ed9b20a1 100644 --- a/arch/s390/mm/pgtable.c +++ b/arch/s390/mm/pgtable.c | |||
@@ -293,7 +293,7 @@ static int gmap_alloc_table(struct gmap *gmap, | |||
293 | * @addr: address in the guest address space | 293 | * @addr: address in the guest address space |
294 | * @len: length of the memory area to unmap | 294 | * @len: length of the memory area to unmap |
295 | * | 295 | * |
296 | * Returns 0 if the unmap succeded, -EINVAL if not. | 296 | * Returns 0 if the unmap succeeded, -EINVAL if not. |
297 | */ | 297 | */ |
298 | int gmap_unmap_segment(struct gmap *gmap, unsigned long to, unsigned long len) | 298 | int gmap_unmap_segment(struct gmap *gmap, unsigned long to, unsigned long len) |
299 | { | 299 | { |
@@ -344,7 +344,7 @@ EXPORT_SYMBOL_GPL(gmap_unmap_segment); | |||
344 | * @from: source address in the parent address space | 344 | * @from: source address in the parent address space |
345 | * @to: target address in the guest address space | 345 | * @to: target address in the guest address space |
346 | * | 346 | * |
347 | * Returns 0 if the mmap succeded, -EINVAL or -ENOMEM if not. | 347 | * Returns 0 if the mmap succeeded, -EINVAL or -ENOMEM if not. |
348 | */ | 348 | */ |
349 | int gmap_map_segment(struct gmap *gmap, unsigned long from, | 349 | int gmap_map_segment(struct gmap *gmap, unsigned long from, |
350 | unsigned long to, unsigned long len) | 350 | unsigned long to, unsigned long len) |
diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c index 16871da37371..708d60e40066 100644 --- a/arch/s390/net/bpf_jit_comp.c +++ b/arch/s390/net/bpf_jit_comp.c | |||
@@ -368,14 +368,16 @@ static int bpf_jit_insn(struct bpf_jit *jit, struct sock_filter *filter, | |||
368 | EMIT4_PCREL(0xa7840000, (jit->ret0_ip - jit->prg)); | 368 | EMIT4_PCREL(0xa7840000, (jit->ret0_ip - jit->prg)); |
369 | /* lhi %r4,0 */ | 369 | /* lhi %r4,0 */ |
370 | EMIT4(0xa7480000); | 370 | EMIT4(0xa7480000); |
371 | /* dr %r4,%r12 */ | 371 | /* dlr %r4,%r12 */ |
372 | EMIT2(0x1d4c); | 372 | EMIT4(0xb997004c); |
373 | break; | 373 | break; |
374 | case BPF_S_ALU_DIV_K: /* A = reciprocal_divide(A, K) */ | 374 | case BPF_S_ALU_DIV_K: /* A /= K */ |
375 | /* m %r4,<d(K)>(%r13) */ | 375 | if (K == 1) |
376 | EMIT4_DISP(0x5c40d000, EMIT_CONST(K)); | 376 | break; |
377 | /* lr %r5,%r4 */ | 377 | /* lhi %r4,0 */ |
378 | EMIT2(0x1854); | 378 | EMIT4(0xa7480000); |
379 | /* dl %r4,<d(K)>(%r13) */ | ||
380 | EMIT6_DISP(0xe340d000, 0x0097, EMIT_CONST(K)); | ||
379 | break; | 381 | break; |
380 | case BPF_S_ALU_MOD_X: /* A %= X */ | 382 | case BPF_S_ALU_MOD_X: /* A %= X */ |
381 | jit->seen |= SEEN_XREG | SEEN_RET0; | 383 | jit->seen |= SEEN_XREG | SEEN_RET0; |
@@ -385,16 +387,21 @@ static int bpf_jit_insn(struct bpf_jit *jit, struct sock_filter *filter, | |||
385 | EMIT4_PCREL(0xa7840000, (jit->ret0_ip - jit->prg)); | 387 | EMIT4_PCREL(0xa7840000, (jit->ret0_ip - jit->prg)); |
386 | /* lhi %r4,0 */ | 388 | /* lhi %r4,0 */ |
387 | EMIT4(0xa7480000); | 389 | EMIT4(0xa7480000); |
388 | /* dr %r4,%r12 */ | 390 | /* dlr %r4,%r12 */ |
389 | EMIT2(0x1d4c); | 391 | EMIT4(0xb997004c); |
390 | /* lr %r5,%r4 */ | 392 | /* lr %r5,%r4 */ |
391 | EMIT2(0x1854); | 393 | EMIT2(0x1854); |
392 | break; | 394 | break; |
393 | case BPF_S_ALU_MOD_K: /* A %= K */ | 395 | case BPF_S_ALU_MOD_K: /* A %= K */ |
396 | if (K == 1) { | ||
397 | /* lhi %r5,0 */ | ||
398 | EMIT4(0xa7580000); | ||
399 | break; | ||
400 | } | ||
394 | /* lhi %r4,0 */ | 401 | /* lhi %r4,0 */ |
395 | EMIT4(0xa7480000); | 402 | EMIT4(0xa7480000); |
396 | /* d %r4,<d(K)>(%r13) */ | 403 | /* dl %r4,<d(K)>(%r13) */ |
397 | EMIT4_DISP(0x5d40d000, EMIT_CONST(K)); | 404 | EMIT6_DISP(0xe340d000, 0x0097, EMIT_CONST(K)); |
398 | /* lr %r5,%r4 */ | 405 | /* lr %r5,%r4 */ |
399 | EMIT2(0x1854); | 406 | EMIT2(0x1854); |
400 | break; | 407 | break; |
diff --git a/arch/s390/oprofile/hwsampler.c b/arch/s390/oprofile/hwsampler.c index 231cecafc2f1..a32c96761eab 100644 --- a/arch/s390/oprofile/hwsampler.c +++ b/arch/s390/oprofile/hwsampler.c | |||
@@ -26,9 +26,6 @@ | |||
26 | #define MAX_NUM_SDB 511 | 26 | #define MAX_NUM_SDB 511 |
27 | #define MIN_NUM_SDB 1 | 27 | #define MIN_NUM_SDB 1 |
28 | 28 | ||
29 | #define ALERT_REQ_MASK 0x4000000000000000ul | ||
30 | #define BUFFER_FULL_MASK 0x8000000000000000ul | ||
31 | |||
32 | DECLARE_PER_CPU(struct hws_cpu_buffer, sampler_cpu_buffer); | 29 | DECLARE_PER_CPU(struct hws_cpu_buffer, sampler_cpu_buffer); |
33 | 30 | ||
34 | struct hws_execute_parms { | 31 | struct hws_execute_parms { |
@@ -44,6 +41,7 @@ static DEFINE_MUTEX(hws_sem_oom); | |||
44 | 41 | ||
45 | static unsigned char hws_flush_all; | 42 | static unsigned char hws_flush_all; |
46 | static unsigned int hws_oom; | 43 | static unsigned int hws_oom; |
44 | static unsigned int hws_alert; | ||
47 | static struct workqueue_struct *hws_wq; | 45 | static struct workqueue_struct *hws_wq; |
48 | 46 | ||
49 | static unsigned int hws_state; | 47 | static unsigned int hws_state; |
@@ -65,43 +63,6 @@ static unsigned long interval; | |||
65 | static unsigned long min_sampler_rate; | 63 | static unsigned long min_sampler_rate; |
66 | static unsigned long max_sampler_rate; | 64 | static unsigned long max_sampler_rate; |
67 | 65 | ||
68 | static int ssctl(void *buffer) | ||
69 | { | ||
70 | int cc; | ||
71 | |||
72 | /* set in order to detect a program check */ | ||
73 | cc = 1; | ||
74 | |||
75 | asm volatile( | ||
76 | "0: .insn s,0xB2870000,0(%1)\n" | ||
77 | "1: ipm %0\n" | ||
78 | " srl %0,28\n" | ||
79 | "2:\n" | ||
80 | EX_TABLE(0b, 2b) EX_TABLE(1b, 2b) | ||
81 | : "+d" (cc), "+a" (buffer) | ||
82 | : "m" (*((struct hws_ssctl_request_block *)buffer)) | ||
83 | : "cc", "memory"); | ||
84 | |||
85 | return cc ? -EINVAL : 0 ; | ||
86 | } | ||
87 | |||
88 | static int qsi(void *buffer) | ||
89 | { | ||
90 | int cc; | ||
91 | cc = 1; | ||
92 | |||
93 | asm volatile( | ||
94 | "0: .insn s,0xB2860000,0(%1)\n" | ||
95 | "1: lhi %0,0\n" | ||
96 | "2:\n" | ||
97 | EX_TABLE(0b, 2b) EX_TABLE(1b, 2b) | ||
98 | : "=d" (cc), "+a" (buffer) | ||
99 | : "m" (*((struct hws_qsi_info_block *)buffer)) | ||
100 | : "cc", "memory"); | ||
101 | |||
102 | return cc ? -EINVAL : 0; | ||
103 | } | ||
104 | |||
105 | static void execute_qsi(void *parms) | 66 | static void execute_qsi(void *parms) |
106 | { | 67 | { |
107 | struct hws_execute_parms *ep = parms; | 68 | struct hws_execute_parms *ep = parms; |
@@ -113,7 +74,7 @@ static void execute_ssctl(void *parms) | |||
113 | { | 74 | { |
114 | struct hws_execute_parms *ep = parms; | 75 | struct hws_execute_parms *ep = parms; |
115 | 76 | ||
116 | ep->rc = ssctl(ep->buffer); | 77 | ep->rc = lsctl(ep->buffer); |
117 | } | 78 | } |
118 | 79 | ||
119 | static int smp_ctl_ssctl_stop(int cpu) | 80 | static int smp_ctl_ssctl_stop(int cpu) |
@@ -214,17 +175,6 @@ static int smp_ctl_qsi(int cpu) | |||
214 | return ep.rc; | 175 | return ep.rc; |
215 | } | 176 | } |
216 | 177 | ||
217 | static inline unsigned long *trailer_entry_ptr(unsigned long v) | ||
218 | { | ||
219 | void *ret; | ||
220 | |||
221 | ret = (void *)v; | ||
222 | ret += PAGE_SIZE; | ||
223 | ret -= sizeof(struct hws_trailer_entry); | ||
224 | |||
225 | return (unsigned long *) ret; | ||
226 | } | ||
227 | |||
228 | static void hws_ext_handler(struct ext_code ext_code, | 178 | static void hws_ext_handler(struct ext_code ext_code, |
229 | unsigned int param32, unsigned long param64) | 179 | unsigned int param32, unsigned long param64) |
230 | { | 180 | { |
@@ -233,6 +183,9 @@ static void hws_ext_handler(struct ext_code ext_code, | |||
233 | if (!(param32 & CPU_MF_INT_SF_MASK)) | 183 | if (!(param32 & CPU_MF_INT_SF_MASK)) |
234 | return; | 184 | return; |
235 | 185 | ||
186 | if (!hws_alert) | ||
187 | return; | ||
188 | |||
236 | inc_irq_stat(IRQEXT_CMS); | 189 | inc_irq_stat(IRQEXT_CMS); |
237 | atomic_xchg(&cb->ext_params, atomic_read(&cb->ext_params) | param32); | 190 | atomic_xchg(&cb->ext_params, atomic_read(&cb->ext_params) | param32); |
238 | 191 | ||
@@ -256,16 +209,6 @@ static void init_all_cpu_buffers(void) | |||
256 | } | 209 | } |
257 | } | 210 | } |
258 | 211 | ||
259 | static int is_link_entry(unsigned long *s) | ||
260 | { | ||
261 | return *s & 0x1ul ? 1 : 0; | ||
262 | } | ||
263 | |||
264 | static unsigned long *get_next_sdbt(unsigned long *s) | ||
265 | { | ||
266 | return (unsigned long *) (*s & ~0x1ul); | ||
267 | } | ||
268 | |||
269 | static int prepare_cpu_buffers(void) | 212 | static int prepare_cpu_buffers(void) |
270 | { | 213 | { |
271 | int cpu; | 214 | int cpu; |
@@ -353,7 +296,7 @@ static int allocate_sdbt(int cpu) | |||
353 | } | 296 | } |
354 | *sdbt = sdb; | 297 | *sdbt = sdb; |
355 | trailer = trailer_entry_ptr(*sdbt); | 298 | trailer = trailer_entry_ptr(*sdbt); |
356 | *trailer = ALERT_REQ_MASK; | 299 | *trailer = SDB_TE_ALERT_REQ_MASK; |
357 | sdbt++; | 300 | sdbt++; |
358 | mutex_unlock(&hws_sem_oom); | 301 | mutex_unlock(&hws_sem_oom); |
359 | } | 302 | } |
@@ -829,7 +772,7 @@ static void worker_on_interrupt(unsigned int cpu) | |||
829 | 772 | ||
830 | trailer = trailer_entry_ptr(*sdbt); | 773 | trailer = trailer_entry_ptr(*sdbt); |
831 | /* leave loop if no more work to do */ | 774 | /* leave loop if no more work to do */ |
832 | if (!(*trailer & BUFFER_FULL_MASK)) { | 775 | if (!(*trailer & SDB_TE_BUFFER_FULL_MASK)) { |
833 | done = 1; | 776 | done = 1; |
834 | if (!hws_flush_all) | 777 | if (!hws_flush_all) |
835 | continue; | 778 | continue; |
@@ -856,7 +799,7 @@ static void worker_on_interrupt(unsigned int cpu) | |||
856 | static void add_samples_to_oprofile(unsigned int cpu, unsigned long *sdbt, | 799 | static void add_samples_to_oprofile(unsigned int cpu, unsigned long *sdbt, |
857 | unsigned long *dear) | 800 | unsigned long *dear) |
858 | { | 801 | { |
859 | struct hws_data_entry *sample_data_ptr; | 802 | struct hws_basic_entry *sample_data_ptr; |
860 | unsigned long *trailer; | 803 | unsigned long *trailer; |
861 | 804 | ||
862 | trailer = trailer_entry_ptr(*sdbt); | 805 | trailer = trailer_entry_ptr(*sdbt); |
@@ -866,7 +809,7 @@ static void add_samples_to_oprofile(unsigned int cpu, unsigned long *sdbt, | |||
866 | trailer = dear; | 809 | trailer = dear; |
867 | } | 810 | } |
868 | 811 | ||
869 | sample_data_ptr = (struct hws_data_entry *)(*sdbt); | 812 | sample_data_ptr = (struct hws_basic_entry *)(*sdbt); |
870 | 813 | ||
871 | while ((unsigned long *)sample_data_ptr < trailer) { | 814 | while ((unsigned long *)sample_data_ptr < trailer) { |
872 | struct pt_regs *regs = NULL; | 815 | struct pt_regs *regs = NULL; |
@@ -1002,6 +945,7 @@ int hwsampler_deallocate(void) | |||
1002 | goto deallocate_exit; | 945 | goto deallocate_exit; |
1003 | 946 | ||
1004 | irq_subclass_unregister(IRQ_SUBCLASS_MEASUREMENT_ALERT); | 947 | irq_subclass_unregister(IRQ_SUBCLASS_MEASUREMENT_ALERT); |
948 | hws_alert = 0; | ||
1005 | deallocate_sdbt(); | 949 | deallocate_sdbt(); |
1006 | 950 | ||
1007 | hws_state = HWS_DEALLOCATED; | 951 | hws_state = HWS_DEALLOCATED; |
@@ -1116,6 +1060,7 @@ int hwsampler_shutdown(void) | |||
1116 | 1060 | ||
1117 | if (hws_state == HWS_STOPPED) { | 1061 | if (hws_state == HWS_STOPPED) { |
1118 | irq_subclass_unregister(IRQ_SUBCLASS_MEASUREMENT_ALERT); | 1062 | irq_subclass_unregister(IRQ_SUBCLASS_MEASUREMENT_ALERT); |
1063 | hws_alert = 0; | ||
1119 | deallocate_sdbt(); | 1064 | deallocate_sdbt(); |
1120 | } | 1065 | } |
1121 | if (hws_wq) { | 1066 | if (hws_wq) { |
@@ -1190,6 +1135,7 @@ start_all_exit: | |||
1190 | hws_oom = 1; | 1135 | hws_oom = 1; |
1191 | hws_flush_all = 0; | 1136 | hws_flush_all = 0; |
1192 | /* now let them in, 1407 CPUMF external interrupts */ | 1137 | /* now let them in, 1407 CPUMF external interrupts */ |
1138 | hws_alert = 1; | ||
1193 | irq_subclass_register(IRQ_SUBCLASS_MEASUREMENT_ALERT); | 1139 | irq_subclass_register(IRQ_SUBCLASS_MEASUREMENT_ALERT); |
1194 | 1140 | ||
1195 | return 0; | 1141 | return 0; |
diff --git a/arch/s390/oprofile/hwsampler.h b/arch/s390/oprofile/hwsampler.h index 0022e1ebfbde..a483d06f2fa7 100644 --- a/arch/s390/oprofile/hwsampler.h +++ b/arch/s390/oprofile/hwsampler.h | |||
@@ -9,27 +9,7 @@ | |||
9 | #define HWSAMPLER_H_ | 9 | #define HWSAMPLER_H_ |
10 | 10 | ||
11 | #include <linux/workqueue.h> | 11 | #include <linux/workqueue.h> |
12 | 12 | #include <asm/cpu_mf.h> | |
13 | struct hws_qsi_info_block /* QUERY SAMPLING information block */ | ||
14 | { /* Bit(s) */ | ||
15 | unsigned int b0_13:14; /* 0-13: zeros */ | ||
16 | unsigned int as:1; /* 14: sampling authorisation control*/ | ||
17 | unsigned int b15_21:7; /* 15-21: zeros */ | ||
18 | unsigned int es:1; /* 22: sampling enable control */ | ||
19 | unsigned int b23_29:7; /* 23-29: zeros */ | ||
20 | unsigned int cs:1; /* 30: sampling activation control */ | ||
21 | unsigned int:1; /* 31: reserved */ | ||
22 | unsigned int bsdes:16; /* 4-5: size of sampling entry */ | ||
23 | unsigned int:16; /* 6-7: reserved */ | ||
24 | unsigned long min_sampl_rate; /* 8-15: minimum sampling interval */ | ||
25 | unsigned long max_sampl_rate; /* 16-23: maximum sampling interval*/ | ||
26 | unsigned long tear; /* 24-31: TEAR contents */ | ||
27 | unsigned long dear; /* 32-39: DEAR contents */ | ||
28 | unsigned int rsvrd0; /* 40-43: reserved */ | ||
29 | unsigned int cpu_speed; /* 44-47: CPU speed */ | ||
30 | unsigned long long rsvrd1; /* 48-55: reserved */ | ||
31 | unsigned long long rsvrd2; /* 56-63: reserved */ | ||
32 | }; | ||
33 | 13 | ||
34 | struct hws_ssctl_request_block /* SET SAMPLING CONTROLS req block */ | 14 | struct hws_ssctl_request_block /* SET SAMPLING CONTROLS req block */ |
35 | { /* bytes 0 - 7 Bit(s) */ | 15 | { /* bytes 0 - 7 Bit(s) */ |
@@ -68,36 +48,6 @@ struct hws_cpu_buffer { | |||
68 | unsigned int stop_mode:1; | 48 | unsigned int stop_mode:1; |
69 | }; | 49 | }; |
70 | 50 | ||
71 | struct hws_data_entry { | ||
72 | unsigned int def:16; /* 0-15 Data Entry Format */ | ||
73 | unsigned int R:4; /* 16-19 reserved */ | ||
74 | unsigned int U:4; /* 20-23 Number of unique instruct. */ | ||
75 | unsigned int z:2; /* zeros */ | ||
76 | unsigned int T:1; /* 26 PSW DAT mode */ | ||
77 | unsigned int W:1; /* 27 PSW wait state */ | ||
78 | unsigned int P:1; /* 28 PSW Problem state */ | ||
79 | unsigned int AS:2; /* 29-30 PSW address-space control */ | ||
80 | unsigned int I:1; /* 31 entry valid or invalid */ | ||
81 | unsigned int:16; | ||
82 | unsigned int prim_asn:16; /* primary ASN */ | ||
83 | unsigned long long ia; /* Instruction Address */ | ||
84 | unsigned long long gpp; /* Guest Program Parameter */ | ||
85 | unsigned long long hpp; /* Host Program Parameter */ | ||
86 | }; | ||
87 | |||
88 | struct hws_trailer_entry { | ||
89 | unsigned int f:1; /* 0 - Block Full Indicator */ | ||
90 | unsigned int a:1; /* 1 - Alert request control */ | ||
91 | unsigned long:62; /* 2 - 63: Reserved */ | ||
92 | unsigned long overflow; /* 64 - sample Overflow count */ | ||
93 | unsigned long timestamp; /* 16 - time-stamp */ | ||
94 | unsigned long timestamp1; /* */ | ||
95 | unsigned long reserved1; /* 32 -Reserved */ | ||
96 | unsigned long reserved2; /* */ | ||
97 | unsigned long progusage1; /* 48 - reserved for programming use */ | ||
98 | unsigned long progusage2; /* */ | ||
99 | }; | ||
100 | |||
101 | int hwsampler_setup(void); | 51 | int hwsampler_setup(void); |
102 | int hwsampler_shutdown(void); | 52 | int hwsampler_shutdown(void); |
103 | int hwsampler_allocate(unsigned long sdbt, unsigned long sdb); | 53 | int hwsampler_allocate(unsigned long sdbt, unsigned long sdb); |
diff --git a/arch/s390/oprofile/init.c b/arch/s390/oprofile/init.c index 04e1b6a85362..9ffe645d5989 100644 --- a/arch/s390/oprofile/init.c +++ b/arch/s390/oprofile/init.c | |||
@@ -10,6 +10,7 @@ | |||
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <linux/oprofile.h> | 12 | #include <linux/oprofile.h> |
13 | #include <linux/perf_event.h> | ||
13 | #include <linux/init.h> | 14 | #include <linux/init.h> |
14 | #include <linux/errno.h> | 15 | #include <linux/errno.h> |
15 | #include <linux/fs.h> | 16 | #include <linux/fs.h> |
@@ -67,6 +68,21 @@ module_param_call(cpu_type, set_cpu_type, NULL, NULL, 0); | |||
67 | MODULE_PARM_DESC(cpu_type, "Force legacy basic mode sampling" | 68 | MODULE_PARM_DESC(cpu_type, "Force legacy basic mode sampling" |
68 | "(report cpu_type \"timer\""); | 69 | "(report cpu_type \"timer\""); |
69 | 70 | ||
71 | static int __oprofile_hwsampler_start(void) | ||
72 | { | ||
73 | int retval; | ||
74 | |||
75 | retval = hwsampler_allocate(oprofile_sdbt_blocks, oprofile_sdb_blocks); | ||
76 | if (retval) | ||
77 | return retval; | ||
78 | |||
79 | retval = hwsampler_start_all(oprofile_hw_interval); | ||
80 | if (retval) | ||
81 | hwsampler_deallocate(); | ||
82 | |||
83 | return retval; | ||
84 | } | ||
85 | |||
70 | static int oprofile_hwsampler_start(void) | 86 | static int oprofile_hwsampler_start(void) |
71 | { | 87 | { |
72 | int retval; | 88 | int retval; |
@@ -76,13 +92,13 @@ static int oprofile_hwsampler_start(void) | |||
76 | if (!hwsampler_running) | 92 | if (!hwsampler_running) |
77 | return timer_ops.start(); | 93 | return timer_ops.start(); |
78 | 94 | ||
79 | retval = hwsampler_allocate(oprofile_sdbt_blocks, oprofile_sdb_blocks); | 95 | retval = perf_reserve_sampling(); |
80 | if (retval) | 96 | if (retval) |
81 | return retval; | 97 | return retval; |
82 | 98 | ||
83 | retval = hwsampler_start_all(oprofile_hw_interval); | 99 | retval = __oprofile_hwsampler_start(); |
84 | if (retval) | 100 | if (retval) |
85 | hwsampler_deallocate(); | 101 | perf_release_sampling(); |
86 | 102 | ||
87 | return retval; | 103 | return retval; |
88 | } | 104 | } |
@@ -96,6 +112,7 @@ static void oprofile_hwsampler_stop(void) | |||
96 | 112 | ||
97 | hwsampler_stop_all(); | 113 | hwsampler_stop_all(); |
98 | hwsampler_deallocate(); | 114 | hwsampler_deallocate(); |
115 | perf_release_sampling(); | ||
99 | return; | 116 | return; |
100 | } | 117 | } |
101 | 118 | ||
diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c index 4859c401b75e..66670ff262a0 100644 --- a/arch/s390/pci/pci.c +++ b/arch/s390/pci/pci.c | |||
@@ -919,17 +919,23 @@ static void zpci_mem_exit(void) | |||
919 | kmem_cache_destroy(zdev_fmb_cache); | 919 | kmem_cache_destroy(zdev_fmb_cache); |
920 | } | 920 | } |
921 | 921 | ||
922 | static unsigned int s390_pci_probe; | 922 | static unsigned int s390_pci_probe = 1; |
923 | static unsigned int s390_pci_initialized; | ||
923 | 924 | ||
924 | char * __init pcibios_setup(char *str) | 925 | char * __init pcibios_setup(char *str) |
925 | { | 926 | { |
926 | if (!strcmp(str, "on")) { | 927 | if (!strcmp(str, "off")) { |
927 | s390_pci_probe = 1; | 928 | s390_pci_probe = 0; |
928 | return NULL; | 929 | return NULL; |
929 | } | 930 | } |
930 | return str; | 931 | return str; |
931 | } | 932 | } |
932 | 933 | ||
934 | bool zpci_is_enabled(void) | ||
935 | { | ||
936 | return s390_pci_initialized; | ||
937 | } | ||
938 | |||
933 | static int __init pci_base_init(void) | 939 | static int __init pci_base_init(void) |
934 | { | 940 | { |
935 | int rc; | 941 | int rc; |
@@ -961,6 +967,7 @@ static int __init pci_base_init(void) | |||
961 | if (rc) | 967 | if (rc) |
962 | goto out_find; | 968 | goto out_find; |
963 | 969 | ||
970 | s390_pci_initialized = 1; | ||
964 | return 0; | 971 | return 0; |
965 | 972 | ||
966 | out_find: | 973 | out_find: |
@@ -978,5 +985,6 @@ subsys_initcall_sync(pci_base_init); | |||
978 | 985 | ||
979 | void zpci_rescan(void) | 986 | void zpci_rescan(void) |
980 | { | 987 | { |
981 | clp_rescan_pci_devices_simple(); | 988 | if (zpci_is_enabled()) |
989 | clp_rescan_pci_devices_simple(); | ||
982 | } | 990 | } |
diff --git a/arch/s390/pci/pci_dma.c b/arch/s390/pci/pci_dma.c index 9b83d080902d..60c11a629d96 100644 --- a/arch/s390/pci/pci_dma.c +++ b/arch/s390/pci/pci_dma.c | |||
@@ -285,7 +285,7 @@ static dma_addr_t s390_dma_map_pages(struct device *dev, struct page *page, | |||
285 | flags |= ZPCI_TABLE_PROTECTED; | 285 | flags |= ZPCI_TABLE_PROTECTED; |
286 | 286 | ||
287 | if (!dma_update_trans(zdev, pa, dma_addr, size, flags)) { | 287 | if (!dma_update_trans(zdev, pa, dma_addr, size, flags)) { |
288 | atomic64_add(nr_pages, (atomic64_t *) &zdev->fmb->mapped_pages); | 288 | atomic64_add(nr_pages, &zdev->fmb->mapped_pages); |
289 | return dma_addr + (offset & ~PAGE_MASK); | 289 | return dma_addr + (offset & ~PAGE_MASK); |
290 | } | 290 | } |
291 | 291 | ||
@@ -313,7 +313,7 @@ static void s390_dma_unmap_pages(struct device *dev, dma_addr_t dma_addr, | |||
313 | zpci_err_hex(&dma_addr, sizeof(dma_addr)); | 313 | zpci_err_hex(&dma_addr, sizeof(dma_addr)); |
314 | } | 314 | } |
315 | 315 | ||
316 | atomic64_add(npages, (atomic64_t *) &zdev->fmb->unmapped_pages); | 316 | atomic64_add(npages, &zdev->fmb->unmapped_pages); |
317 | iommu_page_index = (dma_addr - zdev->start_dma) >> PAGE_SHIFT; | 317 | iommu_page_index = (dma_addr - zdev->start_dma) >> PAGE_SHIFT; |
318 | dma_free_iommu(zdev, iommu_page_index, npages); | 318 | dma_free_iommu(zdev, iommu_page_index, npages); |
319 | } | 319 | } |
@@ -332,7 +332,6 @@ static void *s390_dma_alloc(struct device *dev, size_t size, | |||
332 | if (!page) | 332 | if (!page) |
333 | return NULL; | 333 | return NULL; |
334 | 334 | ||
335 | atomic64_add(size / PAGE_SIZE, (atomic64_t *) &zdev->fmb->allocated_pages); | ||
336 | pa = page_to_phys(page); | 335 | pa = page_to_phys(page); |
337 | memset((void *) pa, 0, size); | 336 | memset((void *) pa, 0, size); |
338 | 337 | ||
@@ -343,6 +342,7 @@ static void *s390_dma_alloc(struct device *dev, size_t size, | |||
343 | return NULL; | 342 | return NULL; |
344 | } | 343 | } |
345 | 344 | ||
345 | atomic64_add(size / PAGE_SIZE, &zdev->fmb->allocated_pages); | ||
346 | if (dma_handle) | 346 | if (dma_handle) |
347 | *dma_handle = map; | 347 | *dma_handle = map; |
348 | return (void *) pa; | 348 | return (void *) pa; |
@@ -352,8 +352,11 @@ static void s390_dma_free(struct device *dev, size_t size, | |||
352 | void *pa, dma_addr_t dma_handle, | 352 | void *pa, dma_addr_t dma_handle, |
353 | struct dma_attrs *attrs) | 353 | struct dma_attrs *attrs) |
354 | { | 354 | { |
355 | s390_dma_unmap_pages(dev, dma_handle, PAGE_ALIGN(size), | 355 | struct zpci_dev *zdev = get_zdev(to_pci_dev(dev)); |
356 | DMA_BIDIRECTIONAL, NULL); | 356 | |
357 | size = PAGE_ALIGN(size); | ||
358 | atomic64_sub(size / PAGE_SIZE, &zdev->fmb->allocated_pages); | ||
359 | s390_dma_unmap_pages(dev, dma_handle, size, DMA_BIDIRECTIONAL, NULL); | ||
357 | free_pages((unsigned long) pa, get_order(size)); | 360 | free_pages((unsigned long) pa, get_order(size)); |
358 | } | 361 | } |
359 | 362 | ||
diff --git a/arch/s390/pci/pci_event.c b/arch/s390/pci/pci_event.c index 800f064b0da7..01e251b1da0c 100644 --- a/arch/s390/pci/pci_event.c +++ b/arch/s390/pci/pci_event.c | |||
@@ -43,9 +43,8 @@ struct zpci_ccdf_avail { | |||
43 | u16 pec; /* PCI event code */ | 43 | u16 pec; /* PCI event code */ |
44 | } __packed; | 44 | } __packed; |
45 | 45 | ||
46 | void zpci_event_error(void *data) | 46 | static void __zpci_event_error(struct zpci_ccdf_err *ccdf) |
47 | { | 47 | { |
48 | struct zpci_ccdf_err *ccdf = data; | ||
49 | struct zpci_dev *zdev = get_zdev_by_fid(ccdf->fid); | 48 | struct zpci_dev *zdev = get_zdev_by_fid(ccdf->fid); |
50 | 49 | ||
51 | zpci_err("error CCDF:\n"); | 50 | zpci_err("error CCDF:\n"); |
@@ -58,9 +57,14 @@ void zpci_event_error(void *data) | |||
58 | pci_name(zdev->pdev), ccdf->pec, ccdf->fid); | 57 | pci_name(zdev->pdev), ccdf->pec, ccdf->fid); |
59 | } | 58 | } |
60 | 59 | ||
61 | void zpci_event_availability(void *data) | 60 | void zpci_event_error(void *data) |
61 | { | ||
62 | if (zpci_is_enabled()) | ||
63 | __zpci_event_error(data); | ||
64 | } | ||
65 | |||
66 | static void __zpci_event_availability(struct zpci_ccdf_avail *ccdf) | ||
62 | { | 67 | { |
63 | struct zpci_ccdf_avail *ccdf = data; | ||
64 | struct zpci_dev *zdev = get_zdev_by_fid(ccdf->fid); | 68 | struct zpci_dev *zdev = get_zdev_by_fid(ccdf->fid); |
65 | struct pci_dev *pdev = zdev ? zdev->pdev : NULL; | 69 | struct pci_dev *pdev = zdev ? zdev->pdev : NULL; |
66 | int ret; | 70 | int ret; |
@@ -75,6 +79,7 @@ void zpci_event_availability(void *data) | |||
75 | if (!zdev || zdev->state == ZPCI_FN_STATE_CONFIGURED) | 79 | if (!zdev || zdev->state == ZPCI_FN_STATE_CONFIGURED) |
76 | break; | 80 | break; |
77 | zdev->state = ZPCI_FN_STATE_CONFIGURED; | 81 | zdev->state = ZPCI_FN_STATE_CONFIGURED; |
82 | zdev->fh = ccdf->fh; | ||
78 | ret = zpci_enable_device(zdev); | 83 | ret = zpci_enable_device(zdev); |
79 | if (ret) | 84 | if (ret) |
80 | break; | 85 | break; |
@@ -98,9 +103,14 @@ void zpci_event_availability(void *data) | |||
98 | 103 | ||
99 | break; | 104 | break; |
100 | case 0x0304: /* Configured -> Standby */ | 105 | case 0x0304: /* Configured -> Standby */ |
101 | if (pdev) | 106 | if (pdev) { |
107 | /* Give the driver a hint that the function is | ||
108 | * already unusable. */ | ||
109 | pdev->error_state = pci_channel_io_perm_failure; | ||
102 | pci_stop_and_remove_bus_device(pdev); | 110 | pci_stop_and_remove_bus_device(pdev); |
111 | } | ||
103 | 112 | ||
113 | zdev->fh = ccdf->fh; | ||
104 | zpci_disable_device(zdev); | 114 | zpci_disable_device(zdev); |
105 | zdev->state = ZPCI_FN_STATE_STANDBY; | 115 | zdev->state = ZPCI_FN_STATE_STANDBY; |
106 | break; | 116 | break; |
@@ -108,6 +118,8 @@ void zpci_event_availability(void *data) | |||
108 | clp_rescan_pci_devices(); | 118 | clp_rescan_pci_devices(); |
109 | break; | 119 | break; |
110 | case 0x0308: /* Standby -> Reserved */ | 120 | case 0x0308: /* Standby -> Reserved */ |
121 | if (!zdev) | ||
122 | break; | ||
111 | pci_stop_root_bus(zdev->bus); | 123 | pci_stop_root_bus(zdev->bus); |
112 | pci_remove_root_bus(zdev->bus); | 124 | pci_remove_root_bus(zdev->bus); |
113 | break; | 125 | break; |
@@ -115,3 +127,9 @@ void zpci_event_availability(void *data) | |||
115 | break; | 127 | break; |
116 | } | 128 | } |
117 | } | 129 | } |
130 | |||
131 | void zpci_event_availability(void *data) | ||
132 | { | ||
133 | if (zpci_is_enabled()) | ||
134 | __zpci_event_availability(data); | ||
135 | } | ||
diff --git a/arch/score/Kconfig b/arch/score/Kconfig index 305f7ee1f382..c75d06aa27c3 100644 --- a/arch/score/Kconfig +++ b/arch/score/Kconfig | |||
@@ -2,7 +2,6 @@ menu "Machine selection" | |||
2 | 2 | ||
3 | config SCORE | 3 | config SCORE |
4 | def_bool y | 4 | def_bool y |
5 | select HAVE_GENERIC_HARDIRQS | ||
6 | select GENERIC_IRQ_SHOW | 5 | select GENERIC_IRQ_SHOW |
7 | select GENERIC_IOMAP | 6 | select GENERIC_IOMAP |
8 | select GENERIC_ATOMIC64 | 7 | select GENERIC_ATOMIC64 |
diff --git a/arch/score/include/asm/Kbuild b/arch/score/include/asm/Kbuild index f3414ade77a3..fe7471eb0167 100644 --- a/arch/score/include/asm/Kbuild +++ b/arch/score/include/asm/Kbuild | |||
@@ -1,6 +1,7 @@ | |||
1 | 1 | ||
2 | header-y += | 2 | header-y += |
3 | 3 | ||
4 | generic-y += barrier.h | ||
4 | generic-y += clkdev.h | 5 | generic-y += clkdev.h |
5 | generic-y += trace_clock.h | 6 | generic-y += trace_clock.h |
6 | generic-y += xor.h | 7 | generic-y += xor.h |
diff --git a/arch/score/include/asm/barrier.h b/arch/score/include/asm/barrier.h deleted file mode 100644 index 0eacb6471e6d..000000000000 --- a/arch/score/include/asm/barrier.h +++ /dev/null | |||
@@ -1,16 +0,0 @@ | |||
1 | #ifndef _ASM_SCORE_BARRIER_H | ||
2 | #define _ASM_SCORE_BARRIER_H | ||
3 | |||
4 | #define mb() barrier() | ||
5 | #define rmb() barrier() | ||
6 | #define wmb() barrier() | ||
7 | #define smp_mb() barrier() | ||
8 | #define smp_rmb() barrier() | ||
9 | #define smp_wmb() barrier() | ||
10 | |||
11 | #define read_barrier_depends() do {} while (0) | ||
12 | #define smp_read_barrier_depends() do {} while (0) | ||
13 | |||
14 | #define set_mb(var, value) do {var = value; wmb(); } while (0) | ||
15 | |||
16 | #endif /* _ASM_SCORE_BARRIER_H */ | ||
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index 9b0979f4df7a..ce298317a73e 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig | |||
@@ -66,6 +66,7 @@ config SUPERH32 | |||
66 | select PERF_EVENTS | 66 | select PERF_EVENTS |
67 | select ARCH_HIBERNATION_POSSIBLE if MMU | 67 | select ARCH_HIBERNATION_POSSIBLE if MMU |
68 | select SPARSE_IRQ | 68 | select SPARSE_IRQ |
69 | select HAVE_CC_STACKPROTECTOR | ||
69 | 70 | ||
70 | config SUPERH64 | 71 | config SUPERH64 |
71 | def_bool ARCH = "sh64" | 72 | def_bool ARCH = "sh64" |
@@ -695,20 +696,6 @@ config SECCOMP | |||
695 | 696 | ||
696 | If unsure, say N. | 697 | If unsure, say N. |
697 | 698 | ||
698 | config CC_STACKPROTECTOR | ||
699 | bool "Enable -fstack-protector buffer overflow detection (EXPERIMENTAL)" | ||
700 | depends on SUPERH32 | ||
701 | help | ||
702 | This option turns on the -fstack-protector GCC feature. This | ||
703 | feature puts, at the beginning of functions, a canary value on | ||
704 | the stack just before the return address, and validates | ||
705 | the value just before actually returning. Stack based buffer | ||
706 | overflows (that need to overwrite this return address) now also | ||
707 | overwrite the canary, which gets detected and the attack is then | ||
708 | neutralized via a kernel panic. | ||
709 | |||
710 | This feature requires gcc version 4.2 or above. | ||
711 | |||
712 | config SMP | 699 | config SMP |
713 | bool "Symmetric multi-processing support" | 700 | bool "Symmetric multi-processing support" |
714 | depends on SYS_SUPPORTS_SMP | 701 | depends on SYS_SUPPORTS_SMP |
diff --git a/arch/sh/Makefile b/arch/sh/Makefile index aed701c7b11b..d4d16e4be07c 100644 --- a/arch/sh/Makefile +++ b/arch/sh/Makefile | |||
@@ -199,10 +199,6 @@ ifeq ($(CONFIG_DWARF_UNWINDER),y) | |||
199 | KBUILD_CFLAGS += -fasynchronous-unwind-tables | 199 | KBUILD_CFLAGS += -fasynchronous-unwind-tables |
200 | endif | 200 | endif |
201 | 201 | ||
202 | ifeq ($(CONFIG_CC_STACKPROTECTOR),y) | ||
203 | KBUILD_CFLAGS += -fstack-protector | ||
204 | endif | ||
205 | |||
206 | libs-$(CONFIG_SUPERH32) := arch/sh/lib/ $(libs-y) | 202 | libs-$(CONFIG_SUPERH32) := arch/sh/lib/ $(libs-y) |
207 | libs-$(CONFIG_SUPERH64) := arch/sh/lib64/ $(libs-y) | 203 | libs-$(CONFIG_SUPERH64) := arch/sh/lib64/ $(libs-y) |
208 | 204 | ||
diff --git a/arch/sh/include/asm/barrier.h b/arch/sh/include/asm/barrier.h index 72c103dae300..43715308b068 100644 --- a/arch/sh/include/asm/barrier.h +++ b/arch/sh/include/asm/barrier.h | |||
@@ -26,29 +26,14 @@ | |||
26 | #if defined(CONFIG_CPU_SH4A) || defined(CONFIG_CPU_SH5) | 26 | #if defined(CONFIG_CPU_SH4A) || defined(CONFIG_CPU_SH5) |
27 | #define mb() __asm__ __volatile__ ("synco": : :"memory") | 27 | #define mb() __asm__ __volatile__ ("synco": : :"memory") |
28 | #define rmb() mb() | 28 | #define rmb() mb() |
29 | #define wmb() __asm__ __volatile__ ("synco": : :"memory") | 29 | #define wmb() mb() |
30 | #define ctrl_barrier() __icbi(PAGE_OFFSET) | 30 | #define ctrl_barrier() __icbi(PAGE_OFFSET) |
31 | #define read_barrier_depends() do { } while(0) | ||
32 | #else | 31 | #else |
33 | #define mb() __asm__ __volatile__ ("": : :"memory") | ||
34 | #define rmb() mb() | ||
35 | #define wmb() __asm__ __volatile__ ("": : :"memory") | ||
36 | #define ctrl_barrier() __asm__ __volatile__ ("nop;nop;nop;nop;nop;nop;nop;nop") | 32 | #define ctrl_barrier() __asm__ __volatile__ ("nop;nop;nop;nop;nop;nop;nop;nop") |
37 | #define read_barrier_depends() do { } while(0) | ||
38 | #endif | ||
39 | |||
40 | #ifdef CONFIG_SMP | ||
41 | #define smp_mb() mb() | ||
42 | #define smp_rmb() rmb() | ||
43 | #define smp_wmb() wmb() | ||
44 | #define smp_read_barrier_depends() read_barrier_depends() | ||
45 | #else | ||
46 | #define smp_mb() barrier() | ||
47 | #define smp_rmb() barrier() | ||
48 | #define smp_wmb() barrier() | ||
49 | #define smp_read_barrier_depends() do { } while(0) | ||
50 | #endif | 33 | #endif |
51 | 34 | ||
52 | #define set_mb(var, value) do { (void)xchg(&var, value); } while (0) | 35 | #define set_mb(var, value) do { (void)xchg(&var, value); } while (0) |
53 | 36 | ||
37 | #include <asm-generic/barrier.h> | ||
38 | |||
54 | #endif /* __ASM_SH_BARRIER_H */ | 39 | #endif /* __ASM_SH_BARRIER_H */ |
diff --git a/arch/sh/kernel/kgdb.c b/arch/sh/kernel/kgdb.c index 38b313909ac9..adad46e41a1d 100644 --- a/arch/sh/kernel/kgdb.c +++ b/arch/sh/kernel/kgdb.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/kdebug.h> | 13 | #include <linux/kdebug.h> |
14 | #include <linux/irq.h> | 14 | #include <linux/irq.h> |
15 | #include <linux/io.h> | 15 | #include <linux/io.h> |
16 | #include <linux/sched.h> | ||
16 | #include <asm/cacheflush.h> | 17 | #include <asm/cacheflush.h> |
17 | #include <asm/traps.h> | 18 | #include <asm/traps.h> |
18 | 19 | ||
diff --git a/arch/sh/kernel/setup.c b/arch/sh/kernel/setup.c index 1cf90e947dbf..de19cfa768f2 100644 --- a/arch/sh/kernel/setup.c +++ b/arch/sh/kernel/setup.c | |||
@@ -230,8 +230,8 @@ void __init __add_active_range(unsigned int nid, unsigned long start_pfn, | |||
230 | pmb_bolt_mapping((unsigned long)__va(start), start, end - start, | 230 | pmb_bolt_mapping((unsigned long)__va(start), start, end - start, |
231 | PAGE_KERNEL); | 231 | PAGE_KERNEL); |
232 | 232 | ||
233 | memblock_set_node(PFN_PHYS(start_pfn), | 233 | memblock_set_node(PFN_PHYS(start_pfn), PFN_PHYS(end_pfn - start_pfn), |
234 | PFN_PHYS(end_pfn - start_pfn), nid); | 234 | &memblock.memory, nid); |
235 | } | 235 | } |
236 | 236 | ||
237 | void __init __weak plat_early_device_setup(void) | 237 | void __init __weak plat_early_device_setup(void) |
diff --git a/arch/sh/kernel/sh_ksyms_32.c b/arch/sh/kernel/sh_ksyms_32.c index 2a0a596ebf67..d77f2f6c7ff0 100644 --- a/arch/sh/kernel/sh_ksyms_32.c +++ b/arch/sh/kernel/sh_ksyms_32.c | |||
@@ -20,6 +20,11 @@ EXPORT_SYMBOL(csum_partial_copy_generic); | |||
20 | EXPORT_SYMBOL(copy_page); | 20 | EXPORT_SYMBOL(copy_page); |
21 | EXPORT_SYMBOL(__clear_user); | 21 | EXPORT_SYMBOL(__clear_user); |
22 | EXPORT_SYMBOL(empty_zero_page); | 22 | EXPORT_SYMBOL(empty_zero_page); |
23 | #ifdef CONFIG_FLATMEM | ||
24 | /* need in pfn_valid macro */ | ||
25 | EXPORT_SYMBOL(min_low_pfn); | ||
26 | EXPORT_SYMBOL(max_low_pfn); | ||
27 | #endif | ||
23 | 28 | ||
24 | #define DECLARE_EXPORT(name) \ | 29 | #define DECLARE_EXPORT(name) \ |
25 | extern void name(void);EXPORT_SYMBOL(name) | 30 | extern void name(void);EXPORT_SYMBOL(name) |
diff --git a/arch/sh/lib/Makefile b/arch/sh/lib/Makefile index 7b95f29e3174..3baff31e58cf 100644 --- a/arch/sh/lib/Makefile +++ b/arch/sh/lib/Makefile | |||
@@ -6,7 +6,7 @@ lib-y = delay.o memmove.o memchr.o \ | |||
6 | checksum.o strlen.o div64.o div64-generic.o | 6 | checksum.o strlen.o div64.o div64-generic.o |
7 | 7 | ||
8 | # Extracted from libgcc | 8 | # Extracted from libgcc |
9 | lib-y += movmem.o ashldi3.o ashrdi3.o lshrdi3.o \ | 9 | obj-y += movmem.o ashldi3.o ashrdi3.o lshrdi3.o \ |
10 | ashlsi3.o ashrsi3.o ashiftrt.o lshrsi3.o \ | 10 | ashlsi3.o ashrsi3.o ashiftrt.o lshrsi3.o \ |
11 | udiv_qrnnd.o | 11 | udiv_qrnnd.o |
12 | 12 | ||
diff --git a/arch/sparc/include/asm/barrier_32.h b/arch/sparc/include/asm/barrier_32.h index c1b76654ee76..ae69eda288f4 100644 --- a/arch/sparc/include/asm/barrier_32.h +++ b/arch/sparc/include/asm/barrier_32.h | |||
@@ -1,15 +1,7 @@ | |||
1 | #ifndef __SPARC_BARRIER_H | 1 | #ifndef __SPARC_BARRIER_H |
2 | #define __SPARC_BARRIER_H | 2 | #define __SPARC_BARRIER_H |
3 | 3 | ||
4 | /* XXX Change this if we ever use a PSO mode kernel. */ | 4 | #include <asm/processor.h> /* for nop() */ |
5 | #define mb() __asm__ __volatile__ ("" : : : "memory") | 5 | #include <asm-generic/barrier.h> |
6 | #define rmb() mb() | ||
7 | #define wmb() mb() | ||
8 | #define read_barrier_depends() do { } while(0) | ||
9 | #define set_mb(__var, __value) do { __var = __value; mb(); } while(0) | ||
10 | #define smp_mb() __asm__ __volatile__("":::"memory") | ||
11 | #define smp_rmb() __asm__ __volatile__("":::"memory") | ||
12 | #define smp_wmb() __asm__ __volatile__("":::"memory") | ||
13 | #define smp_read_barrier_depends() do { } while(0) | ||
14 | 6 | ||
15 | #endif /* !(__SPARC_BARRIER_H) */ | 7 | #endif /* !(__SPARC_BARRIER_H) */ |
diff --git a/arch/sparc/include/asm/barrier_64.h b/arch/sparc/include/asm/barrier_64.h index 95d45986f908..b5aad964558e 100644 --- a/arch/sparc/include/asm/barrier_64.h +++ b/arch/sparc/include/asm/barrier_64.h | |||
@@ -53,4 +53,19 @@ do { __asm__ __volatile__("ba,pt %%xcc, 1f\n\t" \ | |||
53 | 53 | ||
54 | #define smp_read_barrier_depends() do { } while(0) | 54 | #define smp_read_barrier_depends() do { } while(0) |
55 | 55 | ||
56 | #define smp_store_release(p, v) \ | ||
57 | do { \ | ||
58 | compiletime_assert_atomic_type(*p); \ | ||
59 | barrier(); \ | ||
60 | ACCESS_ONCE(*p) = (v); \ | ||
61 | } while (0) | ||
62 | |||
63 | #define smp_load_acquire(p) \ | ||
64 | ({ \ | ||
65 | typeof(*p) ___p1 = ACCESS_ONCE(*p); \ | ||
66 | compiletime_assert_atomic_type(*p); \ | ||
67 | barrier(); \ | ||
68 | ___p1; \ | ||
69 | }) | ||
70 | |||
56 | #endif /* !(__SPARC64_BARRIER_H) */ | 71 | #endif /* !(__SPARC64_BARRIER_H) */ |
diff --git a/arch/sparc/include/asm/pgtable_64.h b/arch/sparc/include/asm/pgtable_64.h index 8358dc144959..0f9e94537eee 100644 --- a/arch/sparc/include/asm/pgtable_64.h +++ b/arch/sparc/include/asm/pgtable_64.h | |||
@@ -619,7 +619,7 @@ static inline unsigned long pte_present(pte_t pte) | |||
619 | } | 619 | } |
620 | 620 | ||
621 | #define pte_accessible pte_accessible | 621 | #define pte_accessible pte_accessible |
622 | static inline unsigned long pte_accessible(pte_t a) | 622 | static inline unsigned long pte_accessible(struct mm_struct *mm, pte_t a) |
623 | { | 623 | { |
624 | return pte_val(a) & _PAGE_VALID; | 624 | return pte_val(a) & _PAGE_VALID; |
625 | } | 625 | } |
@@ -847,7 +847,7 @@ static inline void __set_pte_at(struct mm_struct *mm, unsigned long addr, | |||
847 | * SUN4V NOTE: _PAGE_VALID is the same value in both the SUN4U | 847 | * SUN4V NOTE: _PAGE_VALID is the same value in both the SUN4U |
848 | * and SUN4V pte layout, so this inline test is fine. | 848 | * and SUN4V pte layout, so this inline test is fine. |
849 | */ | 849 | */ |
850 | if (likely(mm != &init_mm) && pte_accessible(orig)) | 850 | if (likely(mm != &init_mm) && pte_accessible(mm, orig)) |
851 | tlb_batch_add(mm, addr, ptep, orig, fullmm); | 851 | tlb_batch_add(mm, addr, ptep, orig, fullmm); |
852 | } | 852 | } |
853 | 853 | ||
diff --git a/arch/sparc/include/asm/uaccess_64.h b/arch/sparc/include/asm/uaccess_64.h index e562d3caee57..ad7e178337f1 100644 --- a/arch/sparc/include/asm/uaccess_64.h +++ b/arch/sparc/include/asm/uaccess_64.h | |||
@@ -262,8 +262,8 @@ extern unsigned long __must_check __clear_user(void __user *, unsigned long); | |||
262 | extern __must_check long strlen_user(const char __user *str); | 262 | extern __must_check long strlen_user(const char __user *str); |
263 | extern __must_check long strnlen_user(const char __user *str, long n); | 263 | extern __must_check long strnlen_user(const char __user *str, long n); |
264 | 264 | ||
265 | #define __copy_to_user_inatomic ___copy_to_user | 265 | #define __copy_to_user_inatomic __copy_to_user |
266 | #define __copy_from_user_inatomic ___copy_from_user | 266 | #define __copy_from_user_inatomic __copy_from_user |
267 | 267 | ||
268 | struct pt_regs; | 268 | struct pt_regs; |
269 | extern unsigned long compute_effective_address(struct pt_regs *, | 269 | extern unsigned long compute_effective_address(struct pt_regs *, |
diff --git a/arch/sparc/kernel/kgdb_64.c b/arch/sparc/kernel/kgdb_64.c index 60b19f50c80a..b45fe3fb4d2c 100644 --- a/arch/sparc/kernel/kgdb_64.c +++ b/arch/sparc/kernel/kgdb_64.c | |||
@@ -6,6 +6,7 @@ | |||
6 | #include <linux/kgdb.h> | 6 | #include <linux/kgdb.h> |
7 | #include <linux/kdebug.h> | 7 | #include <linux/kdebug.h> |
8 | #include <linux/ftrace.h> | 8 | #include <linux/ftrace.h> |
9 | #include <linux/context_tracking.h> | ||
9 | 10 | ||
10 | #include <asm/cacheflush.h> | 11 | #include <asm/cacheflush.h> |
11 | #include <asm/kdebug.h> | 12 | #include <asm/kdebug.h> |
diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c index b66a5338231e..b085311dcd0e 100644 --- a/arch/sparc/kernel/smp_64.c +++ b/arch/sparc/kernel/smp_64.c | |||
@@ -123,11 +123,12 @@ void smp_callin(void) | |||
123 | rmb(); | 123 | rmb(); |
124 | 124 | ||
125 | set_cpu_online(cpuid, true); | 125 | set_cpu_online(cpuid, true); |
126 | local_irq_enable(); | ||
127 | 126 | ||
128 | /* idle thread is expected to have preempt disabled */ | 127 | /* idle thread is expected to have preempt disabled */ |
129 | preempt_disable(); | 128 | preempt_disable(); |
130 | 129 | ||
130 | local_irq_enable(); | ||
131 | |||
131 | cpu_startup_entry(CPUHP_ONLINE); | 132 | cpu_startup_entry(CPUHP_ONLINE); |
132 | } | 133 | } |
133 | 134 | ||
diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c index 5322e530d09c..eafbc65c9c47 100644 --- a/arch/sparc/mm/init_64.c +++ b/arch/sparc/mm/init_64.c | |||
@@ -1021,7 +1021,8 @@ static void __init add_node_ranges(void) | |||
1021 | "start[%lx] end[%lx]\n", | 1021 | "start[%lx] end[%lx]\n", |
1022 | nid, start, this_end); | 1022 | nid, start, this_end); |
1023 | 1023 | ||
1024 | memblock_set_node(start, this_end - start, nid); | 1024 | memblock_set_node(start, this_end - start, |
1025 | &memblock.memory, nid); | ||
1025 | start = this_end; | 1026 | start = this_end; |
1026 | } | 1027 | } |
1027 | } | 1028 | } |
@@ -1325,7 +1326,7 @@ static void __init bootmem_init_nonnuma(void) | |||
1325 | (top_of_ram - total_ram) >> 20); | 1326 | (top_of_ram - total_ram) >> 20); |
1326 | 1327 | ||
1327 | init_node_masks_nonnuma(); | 1328 | init_node_masks_nonnuma(); |
1328 | memblock_set_node(0, (phys_addr_t)ULLONG_MAX, 0); | 1329 | memblock_set_node(0, (phys_addr_t)ULLONG_MAX, &memblock.memory, 0); |
1329 | allocate_node_data(0); | 1330 | allocate_node_data(0); |
1330 | node_set_online(0); | 1331 | node_set_online(0); |
1331 | } | 1332 | } |
diff --git a/arch/sparc/net/bpf_jit_comp.c b/arch/sparc/net/bpf_jit_comp.c index 218b6b23c378..01fe9946d388 100644 --- a/arch/sparc/net/bpf_jit_comp.c +++ b/arch/sparc/net/bpf_jit_comp.c | |||
@@ -497,9 +497,20 @@ void bpf_jit_compile(struct sk_filter *fp) | |||
497 | case BPF_S_ALU_MUL_K: /* A *= K */ | 497 | case BPF_S_ALU_MUL_K: /* A *= K */ |
498 | emit_alu_K(MUL, K); | 498 | emit_alu_K(MUL, K); |
499 | break; | 499 | break; |
500 | case BPF_S_ALU_DIV_K: /* A /= K */ | 500 | case BPF_S_ALU_DIV_K: /* A /= K with K != 0*/ |
501 | emit_alu_K(MUL, K); | 501 | if (K == 1) |
502 | emit_read_y(r_A); | 502 | break; |
503 | emit_write_y(G0); | ||
504 | #ifdef CONFIG_SPARC32 | ||
505 | /* The Sparc v8 architecture requires | ||
506 | * three instructions between a %y | ||
507 | * register write and the first use. | ||
508 | */ | ||
509 | emit_nop(); | ||
510 | emit_nop(); | ||
511 | emit_nop(); | ||
512 | #endif | ||
513 | emit_alu_K(DIV, K); | ||
503 | break; | 514 | break; |
504 | case BPF_S_ALU_DIV_X: /* A /= X; */ | 515 | case BPF_S_ALU_DIV_X: /* A /= X; */ |
505 | emit_cmpi(r_X, 0); | 516 | emit_cmpi(r_X, 0); |
diff --git a/arch/tile/include/asm/barrier.h b/arch/tile/include/asm/barrier.h index a9a73da5865d..b5a05d050a8f 100644 --- a/arch/tile/include/asm/barrier.h +++ b/arch/tile/include/asm/barrier.h | |||
@@ -22,59 +22,6 @@ | |||
22 | #include <arch/spr_def.h> | 22 | #include <arch/spr_def.h> |
23 | #include <asm/timex.h> | 23 | #include <asm/timex.h> |
24 | 24 | ||
25 | /* | ||
26 | * read_barrier_depends - Flush all pending reads that subsequents reads | ||
27 | * depend on. | ||
28 | * | ||
29 | * No data-dependent reads from memory-like regions are ever reordered | ||
30 | * over this barrier. All reads preceding this primitive are guaranteed | ||
31 | * to access memory (but not necessarily other CPUs' caches) before any | ||
32 | * reads following this primitive that depend on the data return by | ||
33 | * any of the preceding reads. This primitive is much lighter weight than | ||
34 | * rmb() on most CPUs, and is never heavier weight than is | ||
35 | * rmb(). | ||
36 | * | ||
37 | * These ordering constraints are respected by both the local CPU | ||
38 | * and the compiler. | ||
39 | * | ||
40 | * Ordering is not guaranteed by anything other than these primitives, | ||
41 | * not even by data dependencies. See the documentation for | ||
42 | * memory_barrier() for examples and URLs to more information. | ||
43 | * | ||
44 | * For example, the following code would force ordering (the initial | ||
45 | * value of "a" is zero, "b" is one, and "p" is "&a"): | ||
46 | * | ||
47 | * <programlisting> | ||
48 | * CPU 0 CPU 1 | ||
49 | * | ||
50 | * b = 2; | ||
51 | * memory_barrier(); | ||
52 | * p = &b; q = p; | ||
53 | * read_barrier_depends(); | ||
54 | * d = *q; | ||
55 | * </programlisting> | ||
56 | * | ||
57 | * because the read of "*q" depends on the read of "p" and these | ||
58 | * two reads are separated by a read_barrier_depends(). However, | ||
59 | * the following code, with the same initial values for "a" and "b": | ||
60 | * | ||
61 | * <programlisting> | ||
62 | * CPU 0 CPU 1 | ||
63 | * | ||
64 | * a = 2; | ||
65 | * memory_barrier(); | ||
66 | * b = 3; y = b; | ||
67 | * read_barrier_depends(); | ||
68 | * x = a; | ||
69 | * </programlisting> | ||
70 | * | ||
71 | * does not enforce ordering, since there is no data dependency between | ||
72 | * the read of "a" and the read of "b". Therefore, on some CPUs, such | ||
73 | * as Alpha, "y" could be set to 3 and "x" to 0. Use rmb() | ||
74 | * in cases like this where there are no data dependencies. | ||
75 | */ | ||
76 | #define read_barrier_depends() do { } while (0) | ||
77 | |||
78 | #define __sync() __insn_mf() | 25 | #define __sync() __insn_mf() |
79 | 26 | ||
80 | #include <hv/syscall_public.h> | 27 | #include <hv/syscall_public.h> |
@@ -125,20 +72,7 @@ mb_incoherent(void) | |||
125 | #define mb() fast_mb() | 72 | #define mb() fast_mb() |
126 | #define iob() fast_iob() | 73 | #define iob() fast_iob() |
127 | 74 | ||
128 | #ifdef CONFIG_SMP | 75 | #include <asm-generic/barrier.h> |
129 | #define smp_mb() mb() | ||
130 | #define smp_rmb() rmb() | ||
131 | #define smp_wmb() wmb() | ||
132 | #define smp_read_barrier_depends() read_barrier_depends() | ||
133 | #else | ||
134 | #define smp_mb() barrier() | ||
135 | #define smp_rmb() barrier() | ||
136 | #define smp_wmb() barrier() | ||
137 | #define smp_read_barrier_depends() do { } while (0) | ||
138 | #endif | ||
139 | |||
140 | #define set_mb(var, value) \ | ||
141 | do { var = value; mb(); } while (0) | ||
142 | 76 | ||
143 | #endif /* !__ASSEMBLY__ */ | 77 | #endif /* !__ASSEMBLY__ */ |
144 | #endif /* _ASM_TILE_BARRIER_H */ | 78 | #endif /* _ASM_TILE_BARRIER_H */ |
diff --git a/arch/um/Makefile b/arch/um/Makefile index 48d92bbe62e9..36e658a4291c 100644 --- a/arch/um/Makefile +++ b/arch/um/Makefile | |||
@@ -33,12 +33,11 @@ MODE_INCLUDE += -I$(srctree)/$(ARCH_DIR)/include/shared/skas | |||
33 | 33 | ||
34 | HEADER_ARCH := $(SUBARCH) | 34 | HEADER_ARCH := $(SUBARCH) |
35 | 35 | ||
36 | # Additional ARCH settings for x86 | 36 | ifneq ($(filter $(SUBARCH),x86 x86_64 i386),) |
37 | ifeq ($(SUBARCH),i386) | 37 | HEADER_ARCH := x86 |
38 | HEADER_ARCH := x86 | ||
39 | endif | 38 | endif |
40 | ifeq ($(SUBARCH),x86_64) | 39 | |
41 | HEADER_ARCH := x86 | 40 | ifdef CONFIG_64BIT |
42 | KBUILD_CFLAGS += -mcmodel=large | 41 | KBUILD_CFLAGS += -mcmodel=large |
43 | endif | 42 | endif |
44 | 43 | ||
diff --git a/arch/um/kernel/sysrq.c b/arch/um/kernel/sysrq.c index 4d6fdf68edf3..799d7e413bf5 100644 --- a/arch/um/kernel/sysrq.c +++ b/arch/um/kernel/sysrq.c | |||
@@ -19,7 +19,7 @@ struct stack_frame { | |||
19 | unsigned long return_address; | 19 | unsigned long return_address; |
20 | }; | 20 | }; |
21 | 21 | ||
22 | static void print_stack_trace(unsigned long *sp, unsigned long bp) | 22 | static void do_stack_trace(unsigned long *sp, unsigned long bp) |
23 | { | 23 | { |
24 | int reliable; | 24 | int reliable; |
25 | unsigned long addr; | 25 | unsigned long addr; |
@@ -94,5 +94,5 @@ void show_stack(struct task_struct *task, unsigned long *stack) | |||
94 | } | 94 | } |
95 | printk(KERN_CONT "\n"); | 95 | printk(KERN_CONT "\n"); |
96 | 96 | ||
97 | print_stack_trace(sp, bp); | 97 | do_stack_trace(sp, bp); |
98 | } | 98 | } |
diff --git a/arch/unicore32/include/asm/barrier.h b/arch/unicore32/include/asm/barrier.h index a6620e5336b6..83d6a520f4bd 100644 --- a/arch/unicore32/include/asm/barrier.h +++ b/arch/unicore32/include/asm/barrier.h | |||
@@ -14,15 +14,6 @@ | |||
14 | #define dsb() __asm__ __volatile__ ("" : : : "memory") | 14 | #define dsb() __asm__ __volatile__ ("" : : : "memory") |
15 | #define dmb() __asm__ __volatile__ ("" : : : "memory") | 15 | #define dmb() __asm__ __volatile__ ("" : : : "memory") |
16 | 16 | ||
17 | #define mb() barrier() | 17 | #include <asm-generic/barrier.h> |
18 | #define rmb() barrier() | ||
19 | #define wmb() barrier() | ||
20 | #define smp_mb() barrier() | ||
21 | #define smp_rmb() barrier() | ||
22 | #define smp_wmb() barrier() | ||
23 | #define read_barrier_depends() do { } while (0) | ||
24 | #define smp_read_barrier_depends() do { } while (0) | ||
25 | |||
26 | #define set_mb(var, value) do { var = value; smp_mb(); } while (0) | ||
27 | 18 | ||
28 | #endif /* __UNICORE_BARRIER_H__ */ | 19 | #endif /* __UNICORE_BARRIER_H__ */ |
diff --git a/arch/unicore32/mm/init.c b/arch/unicore32/mm/init.c index ae6bc036db92..be2bde9b07cf 100644 --- a/arch/unicore32/mm/init.c +++ b/arch/unicore32/mm/init.c | |||
@@ -66,9 +66,6 @@ void show_mem(unsigned int filter) | |||
66 | printk(KERN_DEFAULT "Mem-info:\n"); | 66 | printk(KERN_DEFAULT "Mem-info:\n"); |
67 | show_free_areas(filter); | 67 | show_free_areas(filter); |
68 | 68 | ||
69 | if (filter & SHOW_MEM_FILTER_PAGE_COUNT) | ||
70 | return; | ||
71 | |||
72 | for_each_bank(i, mi) { | 69 | for_each_bank(i, mi) { |
73 | struct membank *bank = &mi->bank[i]; | 70 | struct membank *bank = &mi->bank[i]; |
74 | unsigned int pfn1, pfn2; | 71 | unsigned int pfn1, pfn2; |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index e903c71f7e69..cd18b8393400 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -26,6 +26,7 @@ config X86 | |||
26 | select HAVE_AOUT if X86_32 | 26 | select HAVE_AOUT if X86_32 |
27 | select HAVE_UNSTABLE_SCHED_CLOCK | 27 | select HAVE_UNSTABLE_SCHED_CLOCK |
28 | select ARCH_SUPPORTS_NUMA_BALANCING | 28 | select ARCH_SUPPORTS_NUMA_BALANCING |
29 | select ARCH_SUPPORTS_INT128 if X86_64 | ||
29 | select ARCH_WANTS_PROT_NUMA_PROT_NONE | 30 | select ARCH_WANTS_PROT_NUMA_PROT_NONE |
30 | select HAVE_IDE | 31 | select HAVE_IDE |
31 | select HAVE_OPROFILE | 32 | select HAVE_OPROFILE |
@@ -124,6 +125,7 @@ config X86 | |||
124 | select RTC_LIB | 125 | select RTC_LIB |
125 | select HAVE_DEBUG_STACKOVERFLOW | 126 | select HAVE_DEBUG_STACKOVERFLOW |
126 | select HAVE_IRQ_EXIT_ON_IRQ_STACK if X86_64 | 127 | select HAVE_IRQ_EXIT_ON_IRQ_STACK if X86_64 |
128 | select HAVE_CC_STACKPROTECTOR | ||
127 | 129 | ||
128 | config INSTRUCTION_DECODER | 130 | config INSTRUCTION_DECODER |
129 | def_bool y | 131 | def_bool y |
@@ -437,42 +439,26 @@ config X86_INTEL_CE | |||
437 | This option compiles in support for the CE4100 SOC for settop | 439 | This option compiles in support for the CE4100 SOC for settop |
438 | boxes and media devices. | 440 | boxes and media devices. |
439 | 441 | ||
440 | config X86_WANT_INTEL_MID | 442 | config X86_INTEL_MID |
441 | bool "Intel MID platform support" | 443 | bool "Intel MID platform support" |
442 | depends on X86_32 | 444 | depends on X86_32 |
443 | depends on X86_EXTENDED_PLATFORM | 445 | depends on X86_EXTENDED_PLATFORM |
444 | ---help--- | ||
445 | Select to build a kernel capable of supporting Intel MID platform | ||
446 | systems which do not have the PCI legacy interfaces (Moorestown, | ||
447 | Medfield). If you are building for a PC class system say N here. | ||
448 | |||
449 | if X86_WANT_INTEL_MID | ||
450 | |||
451 | config X86_INTEL_MID | ||
452 | bool | ||
453 | |||
454 | config X86_MDFLD | ||
455 | bool "Medfield MID platform" | ||
456 | depends on PCI | 446 | depends on PCI |
457 | depends on PCI_GOANY | 447 | depends on PCI_GOANY |
458 | depends on X86_IO_APIC | 448 | depends on X86_IO_APIC |
459 | select X86_INTEL_MID | ||
460 | select SFI | 449 | select SFI |
450 | select I2C | ||
461 | select DW_APB_TIMER | 451 | select DW_APB_TIMER |
462 | select APB_TIMER | 452 | select APB_TIMER |
463 | select I2C | ||
464 | select SPI | ||
465 | select INTEL_SCU_IPC | 453 | select INTEL_SCU_IPC |
466 | select X86_PLATFORM_DEVICES | ||
467 | select MFD_INTEL_MSIC | 454 | select MFD_INTEL_MSIC |
468 | ---help--- | 455 | ---help--- |
469 | Medfield is Intel's Low Power Intel Architecture (LPIA) based Moblin | 456 | Select to build a kernel capable of supporting Intel MID (Mobile |
470 | Internet Device(MID) platform. | 457 | Internet Device) platform systems which do not have the PCI legacy |
471 | Unlike standard x86 PCs, Medfield does not have many legacy devices | 458 | interfaces. If you are building for a PC class system say N here. |
472 | nor standard legacy replacement devices/features. e.g. Medfield does | ||
473 | not contain i8259, i8254, HPET, legacy BIOS, most of the io ports. | ||
474 | 459 | ||
475 | endif | 460 | Intel MID platforms are based on an Intel processor and chipset which |
461 | consume less power than most of the x86 derivatives. | ||
476 | 462 | ||
477 | config X86_INTEL_LPSS | 463 | config X86_INTEL_LPSS |
478 | bool "Intel Low Power Subsystem Support" | 464 | bool "Intel Low Power Subsystem Support" |
@@ -1079,10 +1065,6 @@ config MICROCODE_OLD_INTERFACE | |||
1079 | def_bool y | 1065 | def_bool y |
1080 | depends on MICROCODE | 1066 | depends on MICROCODE |
1081 | 1067 | ||
1082 | config MICROCODE_INTEL_LIB | ||
1083 | def_bool y | ||
1084 | depends on MICROCODE_INTEL | ||
1085 | |||
1086 | config MICROCODE_INTEL_EARLY | 1068 | config MICROCODE_INTEL_EARLY |
1087 | def_bool n | 1069 | def_bool n |
1088 | 1070 | ||
@@ -1616,22 +1598,6 @@ config SECCOMP | |||
1616 | 1598 | ||
1617 | If unsure, say Y. Only embedded should say N here. | 1599 | If unsure, say Y. Only embedded should say N here. |
1618 | 1600 | ||
1619 | config CC_STACKPROTECTOR | ||
1620 | bool "Enable -fstack-protector buffer overflow detection" | ||
1621 | ---help--- | ||
1622 | This option turns on the -fstack-protector GCC feature. This | ||
1623 | feature puts, at the beginning of functions, a canary value on | ||
1624 | the stack just before the return address, and validates | ||
1625 | the value just before actually returning. Stack based buffer | ||
1626 | overflows (that need to overwrite this return address) now also | ||
1627 | overwrite the canary, which gets detected and the attack is then | ||
1628 | neutralized via a kernel panic. | ||
1629 | |||
1630 | This feature requires gcc version 4.2 or above, or a distribution | ||
1631 | gcc with the feature backported. Older versions are automatically | ||
1632 | detected and for those versions, this configuration option is | ||
1633 | ignored. (and a warning is printed during bootup) | ||
1634 | |||
1635 | source kernel/Kconfig.hz | 1601 | source kernel/Kconfig.hz |
1636 | 1602 | ||
1637 | config KEXEC | 1603 | config KEXEC |
@@ -1727,16 +1693,67 @@ config RELOCATABLE | |||
1727 | 1693 | ||
1728 | Note: If CONFIG_RELOCATABLE=y, then the kernel runs from the address | 1694 | Note: If CONFIG_RELOCATABLE=y, then the kernel runs from the address |
1729 | it has been loaded at and the compile time physical address | 1695 | it has been loaded at and the compile time physical address |
1730 | (CONFIG_PHYSICAL_START) is ignored. | 1696 | (CONFIG_PHYSICAL_START) is used as the minimum location. |
1731 | 1697 | ||
1732 | # Relocation on x86-32 needs some additional build support | 1698 | config RANDOMIZE_BASE |
1699 | bool "Randomize the address of the kernel image" | ||
1700 | depends on RELOCATABLE | ||
1701 | depends on !HIBERNATION | ||
1702 | default n | ||
1703 | ---help--- | ||
1704 | Randomizes the physical and virtual address at which the | ||
1705 | kernel image is decompressed, as a security feature that | ||
1706 | deters exploit attempts relying on knowledge of the location | ||
1707 | of kernel internals. | ||
1708 | |||
1709 | Entropy is generated using the RDRAND instruction if it is | ||
1710 | supported. If RDTSC is supported, it is used as well. If | ||
1711 | neither RDRAND nor RDTSC are supported, then randomness is | ||
1712 | read from the i8254 timer. | ||
1713 | |||
1714 | The kernel will be offset by up to RANDOMIZE_BASE_MAX_OFFSET, | ||
1715 | and aligned according to PHYSICAL_ALIGN. Since the kernel is | ||
1716 | built using 2GiB addressing, and PHYSICAL_ALGIN must be at a | ||
1717 | minimum of 2MiB, only 10 bits of entropy is theoretically | ||
1718 | possible. At best, due to page table layouts, 64-bit can use | ||
1719 | 9 bits of entropy and 32-bit uses 8 bits. | ||
1720 | |||
1721 | If unsure, say N. | ||
1722 | |||
1723 | config RANDOMIZE_BASE_MAX_OFFSET | ||
1724 | hex "Maximum kASLR offset allowed" if EXPERT | ||
1725 | depends on RANDOMIZE_BASE | ||
1726 | range 0x0 0x20000000 if X86_32 | ||
1727 | default "0x20000000" if X86_32 | ||
1728 | range 0x0 0x40000000 if X86_64 | ||
1729 | default "0x40000000" if X86_64 | ||
1730 | ---help--- | ||
1731 | The lesser of RANDOMIZE_BASE_MAX_OFFSET and available physical | ||
1732 | memory is used to determine the maximal offset in bytes that will | ||
1733 | be applied to the kernel when kernel Address Space Layout | ||
1734 | Randomization (kASLR) is active. This must be a multiple of | ||
1735 | PHYSICAL_ALIGN. | ||
1736 | |||
1737 | On 32-bit this is limited to 512MiB by page table layouts. The | ||
1738 | default is 512MiB. | ||
1739 | |||
1740 | On 64-bit this is limited by how the kernel fixmap page table is | ||
1741 | positioned, so this cannot be larger than 1GiB currently. Without | ||
1742 | RANDOMIZE_BASE, there is a 512MiB to 1.5GiB split between kernel | ||
1743 | and modules. When RANDOMIZE_BASE_MAX_OFFSET is above 512MiB, the | ||
1744 | modules area will shrink to compensate, up to the current maximum | ||
1745 | 1GiB to 1GiB split. The default is 1GiB. | ||
1746 | |||
1747 | If unsure, leave at the default value. | ||
1748 | |||
1749 | # Relocation on x86 needs some additional build support | ||
1733 | config X86_NEED_RELOCS | 1750 | config X86_NEED_RELOCS |
1734 | def_bool y | 1751 | def_bool y |
1735 | depends on X86_32 && RELOCATABLE | 1752 | depends on RANDOMIZE_BASE || (X86_32 && RELOCATABLE) |
1736 | 1753 | ||
1737 | config PHYSICAL_ALIGN | 1754 | config PHYSICAL_ALIGN |
1738 | hex "Alignment value to which kernel should be aligned" | 1755 | hex "Alignment value to which kernel should be aligned" |
1739 | default "0x1000000" | 1756 | default "0x200000" |
1740 | range 0x2000 0x1000000 if X86_32 | 1757 | range 0x2000 0x1000000 if X86_32 |
1741 | range 0x200000 0x1000000 if X86_64 | 1758 | range 0x200000 0x1000000 if X86_64 |
1742 | ---help--- | 1759 | ---help--- |
@@ -2392,6 +2409,14 @@ config X86_DMA_REMAP | |||
2392 | bool | 2409 | bool |
2393 | depends on STA2X11 | 2410 | depends on STA2X11 |
2394 | 2411 | ||
2412 | config IOSF_MBI | ||
2413 | bool | ||
2414 | depends on PCI | ||
2415 | ---help--- | ||
2416 | To be selected by modules requiring access to the Intel OnChip System | ||
2417 | Fabric (IOSF) Sideband MailBox Interface (MBI). For MBI platforms | ||
2418 | enumerable by PCI. | ||
2419 | |||
2395 | source "net/Kconfig" | 2420 | source "net/Kconfig" |
2396 | 2421 | ||
2397 | source "drivers/Kconfig" | 2422 | source "drivers/Kconfig" |
diff --git a/arch/x86/Makefile b/arch/x86/Makefile index 41250fb33985..13b22e0f681d 100644 --- a/arch/x86/Makefile +++ b/arch/x86/Makefile | |||
@@ -31,6 +31,9 @@ ifeq ($(CONFIG_X86_32),y) | |||
31 | 31 | ||
32 | KBUILD_CFLAGS += -msoft-float -mregparm=3 -freg-struct-return | 32 | KBUILD_CFLAGS += -msoft-float -mregparm=3 -freg-struct-return |
33 | 33 | ||
34 | # Don't autogenerate MMX or SSE instructions | ||
35 | KBUILD_CFLAGS += -mno-mmx -mno-sse | ||
36 | |||
34 | # Never want PIC in a 32-bit kernel, prevent breakage with GCC built | 37 | # Never want PIC in a 32-bit kernel, prevent breakage with GCC built |
35 | # with nonstandard options | 38 | # with nonstandard options |
36 | KBUILD_CFLAGS += -fno-pic | 39 | KBUILD_CFLAGS += -fno-pic |
@@ -57,8 +60,11 @@ else | |||
57 | KBUILD_AFLAGS += -m64 | 60 | KBUILD_AFLAGS += -m64 |
58 | KBUILD_CFLAGS += -m64 | 61 | KBUILD_CFLAGS += -m64 |
59 | 62 | ||
63 | # Don't autogenerate MMX or SSE instructions | ||
64 | KBUILD_CFLAGS += -mno-mmx -mno-sse | ||
65 | |||
60 | # Use -mpreferred-stack-boundary=3 if supported. | 66 | # Use -mpreferred-stack-boundary=3 if supported. |
61 | KBUILD_CFLAGS += $(call cc-option,-mno-sse -mpreferred-stack-boundary=3) | 67 | KBUILD_CFLAGS += $(call cc-option,-mpreferred-stack-boundary=3) |
62 | 68 | ||
63 | # FIXME - should be integrated in Makefile.cpu (Makefile_32.cpu) | 69 | # FIXME - should be integrated in Makefile.cpu (Makefile_32.cpu) |
64 | cflags-$(CONFIG_MK8) += $(call cc-option,-march=k8) | 70 | cflags-$(CONFIG_MK8) += $(call cc-option,-march=k8) |
@@ -83,13 +89,11 @@ else | |||
83 | KBUILD_CFLAGS += -maccumulate-outgoing-args | 89 | KBUILD_CFLAGS += -maccumulate-outgoing-args |
84 | endif | 90 | endif |
85 | 91 | ||
92 | # Make sure compiler does not have buggy stack-protector support. | ||
86 | ifdef CONFIG_CC_STACKPROTECTOR | 93 | ifdef CONFIG_CC_STACKPROTECTOR |
87 | cc_has_sp := $(srctree)/scripts/gcc-x86_$(BITS)-has-stack-protector.sh | 94 | cc_has_sp := $(srctree)/scripts/gcc-x86_$(BITS)-has-stack-protector.sh |
88 | ifeq ($(shell $(CONFIG_SHELL) $(cc_has_sp) $(CC) $(KBUILD_CPPFLAGS) $(biarch)),y) | 95 | ifneq ($(shell $(CONFIG_SHELL) $(cc_has_sp) $(CC) $(KBUILD_CPPFLAGS) $(biarch)),y) |
89 | stackp-y := -fstack-protector | 96 | $(warning stack-protector enabled but compiler support broken) |
90 | KBUILD_CFLAGS += $(stackp-y) | ||
91 | else | ||
92 | $(warning stack protector enabled but no compiler support) | ||
93 | endif | 97 | endif |
94 | endif | 98 | endif |
95 | 99 | ||
diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile index dce69a256896..de7066918005 100644 --- a/arch/x86/boot/Makefile +++ b/arch/x86/boot/Makefile | |||
@@ -20,7 +20,7 @@ targets := vmlinux.bin setup.bin setup.elf bzImage | |||
20 | targets += fdimage fdimage144 fdimage288 image.iso mtools.conf | 20 | targets += fdimage fdimage144 fdimage288 image.iso mtools.conf |
21 | subdir- := compressed | 21 | subdir- := compressed |
22 | 22 | ||
23 | setup-y += a20.o bioscall.o cmdline.o copy.o cpu.o cpucheck.o | 23 | setup-y += a20.o bioscall.o cmdline.o copy.o cpu.o cpuflags.o cpucheck.o |
24 | setup-y += early_serial_console.o edd.o header.o main.o mca.o memory.o | 24 | setup-y += early_serial_console.o edd.o header.o main.o mca.o memory.o |
25 | setup-y += pm.o pmjump.o printf.o regs.o string.o tty.o video.o | 25 | setup-y += pm.o pmjump.o printf.o regs.o string.o tty.o video.o |
26 | setup-y += video-mode.o version.o | 26 | setup-y += video-mode.o version.o |
@@ -53,18 +53,18 @@ $(obj)/cpustr.h: $(obj)/mkcpustr FORCE | |||
53 | 53 | ||
54 | # How to compile the 16-bit code. Note we always compile for -march=i386, | 54 | # How to compile the 16-bit code. Note we always compile for -march=i386, |
55 | # that way we can complain to the user if the CPU is insufficient. | 55 | # that way we can complain to the user if the CPU is insufficient. |
56 | KBUILD_CFLAGS := $(USERINCLUDE) -g -Os -D_SETUP -D__KERNEL__ \ | 56 | KBUILD_CFLAGS := $(USERINCLUDE) -m32 -g -Os -D_SETUP -D__KERNEL__ \ |
57 | -DDISABLE_BRANCH_PROFILING \ | 57 | -DDISABLE_BRANCH_PROFILING \ |
58 | -Wall -Wstrict-prototypes \ | 58 | -Wall -Wstrict-prototypes \ |
59 | -march=i386 -mregparm=3 \ | 59 | -march=i386 -mregparm=3 \ |
60 | -include $(srctree)/$(src)/code16gcc.h \ | 60 | -include $(srctree)/$(src)/code16gcc.h \ |
61 | -fno-strict-aliasing -fomit-frame-pointer -fno-pic \ | 61 | -fno-strict-aliasing -fomit-frame-pointer -fno-pic \ |
62 | -mno-mmx -mno-sse \ | ||
62 | $(call cc-option, -ffreestanding) \ | 63 | $(call cc-option, -ffreestanding) \ |
63 | $(call cc-option, -fno-toplevel-reorder,\ | 64 | $(call cc-option, -fno-toplevel-reorder,\ |
64 | $(call cc-option, -fno-unit-at-a-time)) \ | 65 | $(call cc-option, -fno-unit-at-a-time)) \ |
65 | $(call cc-option, -fno-stack-protector) \ | 66 | $(call cc-option, -fno-stack-protector) \ |
66 | $(call cc-option, -mpreferred-stack-boundary=2) | 67 | $(call cc-option, -mpreferred-stack-boundary=2) |
67 | KBUILD_CFLAGS += $(call cc-option, -m32) | ||
68 | KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__ | 68 | KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__ |
69 | GCOV_PROFILE := n | 69 | GCOV_PROFILE := n |
70 | 70 | ||
diff --git a/arch/x86/boot/bioscall.S b/arch/x86/boot/bioscall.S index 1dfbf64e52a2..d401b4a262b0 100644 --- a/arch/x86/boot/bioscall.S +++ b/arch/x86/boot/bioscall.S | |||
@@ -1,6 +1,6 @@ | |||
1 | /* ----------------------------------------------------------------------- | 1 | /* ----------------------------------------------------------------------- |
2 | * | 2 | * |
3 | * Copyright 2009 Intel Corporation; author H. Peter Anvin | 3 | * Copyright 2009-2014 Intel Corporation; author H. Peter Anvin |
4 | * | 4 | * |
5 | * This file is part of the Linux kernel, and is made available under | 5 | * This file is part of the Linux kernel, and is made available under |
6 | * the terms of the GNU General Public License version 2 or (at your | 6 | * the terms of the GNU General Public License version 2 or (at your |
@@ -13,8 +13,8 @@ | |||
13 | * touching registers they shouldn't be. | 13 | * touching registers they shouldn't be. |
14 | */ | 14 | */ |
15 | 15 | ||
16 | .code16gcc | 16 | .code16 |
17 | .text | 17 | .section ".inittext","ax" |
18 | .globl intcall | 18 | .globl intcall |
19 | .type intcall, @function | 19 | .type intcall, @function |
20 | intcall: | 20 | intcall: |
diff --git a/arch/x86/boot/boot.h b/arch/x86/boot/boot.h index ef72baeff484..50f8c5e0f37e 100644 --- a/arch/x86/boot/boot.h +++ b/arch/x86/boot/boot.h | |||
@@ -26,9 +26,8 @@ | |||
26 | #include <asm/boot.h> | 26 | #include <asm/boot.h> |
27 | #include <asm/setup.h> | 27 | #include <asm/setup.h> |
28 | #include "bitops.h" | 28 | #include "bitops.h" |
29 | #include <asm/cpufeature.h> | ||
30 | #include <asm/processor-flags.h> | ||
31 | #include "ctype.h" | 29 | #include "ctype.h" |
30 | #include "cpuflags.h" | ||
32 | 31 | ||
33 | /* Useful macros */ | 32 | /* Useful macros */ |
34 | #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) | 33 | #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) |
@@ -307,14 +306,7 @@ static inline int cmdline_find_option_bool(const char *option) | |||
307 | return __cmdline_find_option_bool(cmd_line_ptr, option); | 306 | return __cmdline_find_option_bool(cmd_line_ptr, option); |
308 | } | 307 | } |
309 | 308 | ||
310 | |||
311 | /* cpu.c, cpucheck.c */ | 309 | /* cpu.c, cpucheck.c */ |
312 | struct cpu_features { | ||
313 | int level; /* Family, or 64 for x86-64 */ | ||
314 | int model; | ||
315 | u32 flags[NCAPINTS]; | ||
316 | }; | ||
317 | extern struct cpu_features cpu; | ||
318 | int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr); | 310 | int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr); |
319 | int validate_cpu(void); | 311 | int validate_cpu(void); |
320 | 312 | ||
diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile index dcd90df10ab4..0fcd9133790c 100644 --- a/arch/x86/boot/compressed/Makefile +++ b/arch/x86/boot/compressed/Makefile | |||
@@ -13,6 +13,7 @@ KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING | |||
13 | cflags-$(CONFIG_X86_32) := -march=i386 | 13 | cflags-$(CONFIG_X86_32) := -march=i386 |
14 | cflags-$(CONFIG_X86_64) := -mcmodel=small | 14 | cflags-$(CONFIG_X86_64) := -mcmodel=small |
15 | KBUILD_CFLAGS += $(cflags-y) | 15 | KBUILD_CFLAGS += $(cflags-y) |
16 | KBUILD_CFLAGS += -mno-mmx -mno-sse | ||
16 | KBUILD_CFLAGS += $(call cc-option,-ffreestanding) | 17 | KBUILD_CFLAGS += $(call cc-option,-ffreestanding) |
17 | KBUILD_CFLAGS += $(call cc-option,-fno-stack-protector) | 18 | KBUILD_CFLAGS += $(call cc-option,-fno-stack-protector) |
18 | 19 | ||
@@ -27,7 +28,7 @@ HOST_EXTRACFLAGS += -I$(srctree)/tools/include | |||
27 | 28 | ||
28 | VMLINUX_OBJS = $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o \ | 29 | VMLINUX_OBJS = $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o \ |
29 | $(obj)/string.o $(obj)/cmdline.o $(obj)/early_serial_console.o \ | 30 | $(obj)/string.o $(obj)/cmdline.o $(obj)/early_serial_console.o \ |
30 | $(obj)/piggy.o | 31 | $(obj)/piggy.o $(obj)/cpuflags.o $(obj)/aslr.o |
31 | 32 | ||
32 | $(obj)/eboot.o: KBUILD_CFLAGS += -fshort-wchar -mno-red-zone | 33 | $(obj)/eboot.o: KBUILD_CFLAGS += -fshort-wchar -mno-red-zone |
33 | 34 | ||
diff --git a/arch/x86/boot/compressed/aslr.c b/arch/x86/boot/compressed/aslr.c new file mode 100644 index 000000000000..90a21f430117 --- /dev/null +++ b/arch/x86/boot/compressed/aslr.c | |||
@@ -0,0 +1,316 @@ | |||
1 | #include "misc.h" | ||
2 | |||
3 | #ifdef CONFIG_RANDOMIZE_BASE | ||
4 | #include <asm/msr.h> | ||
5 | #include <asm/archrandom.h> | ||
6 | #include <asm/e820.h> | ||
7 | |||
8 | #include <generated/compile.h> | ||
9 | #include <linux/module.h> | ||
10 | #include <linux/uts.h> | ||
11 | #include <linux/utsname.h> | ||
12 | #include <generated/utsrelease.h> | ||
13 | |||
14 | /* Simplified build-specific string for starting entropy. */ | ||
15 | static const char build_str[] = UTS_RELEASE " (" LINUX_COMPILE_BY "@" | ||
16 | LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION; | ||
17 | |||
18 | #define I8254_PORT_CONTROL 0x43 | ||
19 | #define I8254_PORT_COUNTER0 0x40 | ||
20 | #define I8254_CMD_READBACK 0xC0 | ||
21 | #define I8254_SELECT_COUNTER0 0x02 | ||
22 | #define I8254_STATUS_NOTREADY 0x40 | ||
23 | static inline u16 i8254(void) | ||
24 | { | ||
25 | u16 status, timer; | ||
26 | |||
27 | do { | ||
28 | outb(I8254_PORT_CONTROL, | ||
29 | I8254_CMD_READBACK | I8254_SELECT_COUNTER0); | ||
30 | status = inb(I8254_PORT_COUNTER0); | ||
31 | timer = inb(I8254_PORT_COUNTER0); | ||
32 | timer |= inb(I8254_PORT_COUNTER0) << 8; | ||
33 | } while (status & I8254_STATUS_NOTREADY); | ||
34 | |||
35 | return timer; | ||
36 | } | ||
37 | |||
38 | static unsigned long rotate_xor(unsigned long hash, const void *area, | ||
39 | size_t size) | ||
40 | { | ||
41 | size_t i; | ||
42 | unsigned long *ptr = (unsigned long *)area; | ||
43 | |||
44 | for (i = 0; i < size / sizeof(hash); i++) { | ||
45 | /* Rotate by odd number of bits and XOR. */ | ||
46 | hash = (hash << ((sizeof(hash) * 8) - 7)) | (hash >> 7); | ||
47 | hash ^= ptr[i]; | ||
48 | } | ||
49 | |||
50 | return hash; | ||
51 | } | ||
52 | |||
53 | /* Attempt to create a simple but unpredictable starting entropy. */ | ||
54 | static unsigned long get_random_boot(void) | ||
55 | { | ||
56 | unsigned long hash = 0; | ||
57 | |||
58 | hash = rotate_xor(hash, build_str, sizeof(build_str)); | ||
59 | hash = rotate_xor(hash, real_mode, sizeof(*real_mode)); | ||
60 | |||
61 | return hash; | ||
62 | } | ||
63 | |||
64 | static unsigned long get_random_long(void) | ||
65 | { | ||
66 | #ifdef CONFIG_X86_64 | ||
67 | const unsigned long mix_const = 0x5d6008cbf3848dd3UL; | ||
68 | #else | ||
69 | const unsigned long mix_const = 0x3f39e593UL; | ||
70 | #endif | ||
71 | unsigned long raw, random = get_random_boot(); | ||
72 | bool use_i8254 = true; | ||
73 | |||
74 | debug_putstr("KASLR using"); | ||
75 | |||
76 | if (has_cpuflag(X86_FEATURE_RDRAND)) { | ||
77 | debug_putstr(" RDRAND"); | ||
78 | if (rdrand_long(&raw)) { | ||
79 | random ^= raw; | ||
80 | use_i8254 = false; | ||
81 | } | ||
82 | } | ||
83 | |||
84 | if (has_cpuflag(X86_FEATURE_TSC)) { | ||
85 | debug_putstr(" RDTSC"); | ||
86 | rdtscll(raw); | ||
87 | |||
88 | random ^= raw; | ||
89 | use_i8254 = false; | ||
90 | } | ||
91 | |||
92 | if (use_i8254) { | ||
93 | debug_putstr(" i8254"); | ||
94 | random ^= i8254(); | ||
95 | } | ||
96 | |||
97 | /* Circular multiply for better bit diffusion */ | ||
98 | asm("mul %3" | ||
99 | : "=a" (random), "=d" (raw) | ||
100 | : "a" (random), "rm" (mix_const)); | ||
101 | random += raw; | ||
102 | |||
103 | debug_putstr("...\n"); | ||
104 | |||
105 | return random; | ||
106 | } | ||
107 | |||
108 | struct mem_vector { | ||
109 | unsigned long start; | ||
110 | unsigned long size; | ||
111 | }; | ||
112 | |||
113 | #define MEM_AVOID_MAX 5 | ||
114 | struct mem_vector mem_avoid[MEM_AVOID_MAX]; | ||
115 | |||
116 | static bool mem_contains(struct mem_vector *region, struct mem_vector *item) | ||
117 | { | ||
118 | /* Item at least partially before region. */ | ||
119 | if (item->start < region->start) | ||
120 | return false; | ||
121 | /* Item at least partially after region. */ | ||
122 | if (item->start + item->size > region->start + region->size) | ||
123 | return false; | ||
124 | return true; | ||
125 | } | ||
126 | |||
127 | static bool mem_overlaps(struct mem_vector *one, struct mem_vector *two) | ||
128 | { | ||
129 | /* Item one is entirely before item two. */ | ||
130 | if (one->start + one->size <= two->start) | ||
131 | return false; | ||
132 | /* Item one is entirely after item two. */ | ||
133 | if (one->start >= two->start + two->size) | ||
134 | return false; | ||
135 | return true; | ||
136 | } | ||
137 | |||
138 | static void mem_avoid_init(unsigned long input, unsigned long input_size, | ||
139 | unsigned long output, unsigned long output_size) | ||
140 | { | ||
141 | u64 initrd_start, initrd_size; | ||
142 | u64 cmd_line, cmd_line_size; | ||
143 | unsigned long unsafe, unsafe_len; | ||
144 | char *ptr; | ||
145 | |||
146 | /* | ||
147 | * Avoid the region that is unsafe to overlap during | ||
148 | * decompression (see calculations at top of misc.c). | ||
149 | */ | ||
150 | unsafe_len = (output_size >> 12) + 32768 + 18; | ||
151 | unsafe = (unsigned long)input + input_size - unsafe_len; | ||
152 | mem_avoid[0].start = unsafe; | ||
153 | mem_avoid[0].size = unsafe_len; | ||
154 | |||
155 | /* Avoid initrd. */ | ||
156 | initrd_start = (u64)real_mode->ext_ramdisk_image << 32; | ||
157 | initrd_start |= real_mode->hdr.ramdisk_image; | ||
158 | initrd_size = (u64)real_mode->ext_ramdisk_size << 32; | ||
159 | initrd_size |= real_mode->hdr.ramdisk_size; | ||
160 | mem_avoid[1].start = initrd_start; | ||
161 | mem_avoid[1].size = initrd_size; | ||
162 | |||
163 | /* Avoid kernel command line. */ | ||
164 | cmd_line = (u64)real_mode->ext_cmd_line_ptr << 32; | ||
165 | cmd_line |= real_mode->hdr.cmd_line_ptr; | ||
166 | /* Calculate size of cmd_line. */ | ||
167 | ptr = (char *)(unsigned long)cmd_line; | ||
168 | for (cmd_line_size = 0; ptr[cmd_line_size++]; ) | ||
169 | ; | ||
170 | mem_avoid[2].start = cmd_line; | ||
171 | mem_avoid[2].size = cmd_line_size; | ||
172 | |||
173 | /* Avoid heap memory. */ | ||
174 | mem_avoid[3].start = (unsigned long)free_mem_ptr; | ||
175 | mem_avoid[3].size = BOOT_HEAP_SIZE; | ||
176 | |||
177 | /* Avoid stack memory. */ | ||
178 | mem_avoid[4].start = (unsigned long)free_mem_end_ptr; | ||
179 | mem_avoid[4].size = BOOT_STACK_SIZE; | ||
180 | } | ||
181 | |||
182 | /* Does this memory vector overlap a known avoided area? */ | ||
183 | bool mem_avoid_overlap(struct mem_vector *img) | ||
184 | { | ||
185 | int i; | ||
186 | |||
187 | for (i = 0; i < MEM_AVOID_MAX; i++) { | ||
188 | if (mem_overlaps(img, &mem_avoid[i])) | ||
189 | return true; | ||
190 | } | ||
191 | |||
192 | return false; | ||
193 | } | ||
194 | |||
195 | unsigned long slots[CONFIG_RANDOMIZE_BASE_MAX_OFFSET / CONFIG_PHYSICAL_ALIGN]; | ||
196 | unsigned long slot_max = 0; | ||
197 | |||
198 | static void slots_append(unsigned long addr) | ||
199 | { | ||
200 | /* Overflowing the slots list should be impossible. */ | ||
201 | if (slot_max >= CONFIG_RANDOMIZE_BASE_MAX_OFFSET / | ||
202 | CONFIG_PHYSICAL_ALIGN) | ||
203 | return; | ||
204 | |||
205 | slots[slot_max++] = addr; | ||
206 | } | ||
207 | |||
208 | static unsigned long slots_fetch_random(void) | ||
209 | { | ||
210 | /* Handle case of no slots stored. */ | ||
211 | if (slot_max == 0) | ||
212 | return 0; | ||
213 | |||
214 | return slots[get_random_long() % slot_max]; | ||
215 | } | ||
216 | |||
217 | static void process_e820_entry(struct e820entry *entry, | ||
218 | unsigned long minimum, | ||
219 | unsigned long image_size) | ||
220 | { | ||
221 | struct mem_vector region, img; | ||
222 | |||
223 | /* Skip non-RAM entries. */ | ||
224 | if (entry->type != E820_RAM) | ||
225 | return; | ||
226 | |||
227 | /* Ignore entries entirely above our maximum. */ | ||
228 | if (entry->addr >= CONFIG_RANDOMIZE_BASE_MAX_OFFSET) | ||
229 | return; | ||
230 | |||
231 | /* Ignore entries entirely below our minimum. */ | ||
232 | if (entry->addr + entry->size < minimum) | ||
233 | return; | ||
234 | |||
235 | region.start = entry->addr; | ||
236 | region.size = entry->size; | ||
237 | |||
238 | /* Potentially raise address to minimum location. */ | ||
239 | if (region.start < minimum) | ||
240 | region.start = minimum; | ||
241 | |||
242 | /* Potentially raise address to meet alignment requirements. */ | ||
243 | region.start = ALIGN(region.start, CONFIG_PHYSICAL_ALIGN); | ||
244 | |||
245 | /* Did we raise the address above the bounds of this e820 region? */ | ||
246 | if (region.start > entry->addr + entry->size) | ||
247 | return; | ||
248 | |||
249 | /* Reduce size by any delta from the original address. */ | ||
250 | region.size -= region.start - entry->addr; | ||
251 | |||
252 | /* Reduce maximum size to fit end of image within maximum limit. */ | ||
253 | if (region.start + region.size > CONFIG_RANDOMIZE_BASE_MAX_OFFSET) | ||
254 | region.size = CONFIG_RANDOMIZE_BASE_MAX_OFFSET - region.start; | ||
255 | |||
256 | /* Walk each aligned slot and check for avoided areas. */ | ||
257 | for (img.start = region.start, img.size = image_size ; | ||
258 | mem_contains(®ion, &img) ; | ||
259 | img.start += CONFIG_PHYSICAL_ALIGN) { | ||
260 | if (mem_avoid_overlap(&img)) | ||
261 | continue; | ||
262 | slots_append(img.start); | ||
263 | } | ||
264 | } | ||
265 | |||
266 | static unsigned long find_random_addr(unsigned long minimum, | ||
267 | unsigned long size) | ||
268 | { | ||
269 | int i; | ||
270 | unsigned long addr; | ||
271 | |||
272 | /* Make sure minimum is aligned. */ | ||
273 | minimum = ALIGN(minimum, CONFIG_PHYSICAL_ALIGN); | ||
274 | |||
275 | /* Verify potential e820 positions, appending to slots list. */ | ||
276 | for (i = 0; i < real_mode->e820_entries; i++) { | ||
277 | process_e820_entry(&real_mode->e820_map[i], minimum, size); | ||
278 | } | ||
279 | |||
280 | return slots_fetch_random(); | ||
281 | } | ||
282 | |||
283 | unsigned char *choose_kernel_location(unsigned char *input, | ||
284 | unsigned long input_size, | ||
285 | unsigned char *output, | ||
286 | unsigned long output_size) | ||
287 | { | ||
288 | unsigned long choice = (unsigned long)output; | ||
289 | unsigned long random; | ||
290 | |||
291 | if (cmdline_find_option_bool("nokaslr")) { | ||
292 | debug_putstr("KASLR disabled...\n"); | ||
293 | goto out; | ||
294 | } | ||
295 | |||
296 | /* Record the various known unsafe memory ranges. */ | ||
297 | mem_avoid_init((unsigned long)input, input_size, | ||
298 | (unsigned long)output, output_size); | ||
299 | |||
300 | /* Walk e820 and find a random address. */ | ||
301 | random = find_random_addr(choice, output_size); | ||
302 | if (!random) { | ||
303 | debug_putstr("KASLR could not find suitable E820 region...\n"); | ||
304 | goto out; | ||
305 | } | ||
306 | |||
307 | /* Always enforce the minimum. */ | ||
308 | if (random < choice) | ||
309 | goto out; | ||
310 | |||
311 | choice = random; | ||
312 | out: | ||
313 | return (unsigned char *)choice; | ||
314 | } | ||
315 | |||
316 | #endif /* CONFIG_RANDOMIZE_BASE */ | ||
diff --git a/arch/x86/boot/compressed/cmdline.c b/arch/x86/boot/compressed/cmdline.c index bffd73b45b1f..b68e3033e6b9 100644 --- a/arch/x86/boot/compressed/cmdline.c +++ b/arch/x86/boot/compressed/cmdline.c | |||
@@ -1,6 +1,6 @@ | |||
1 | #include "misc.h" | 1 | #include "misc.h" |
2 | 2 | ||
3 | #ifdef CONFIG_EARLY_PRINTK | 3 | #if CONFIG_EARLY_PRINTK || CONFIG_RANDOMIZE_BASE |
4 | 4 | ||
5 | static unsigned long fs; | 5 | static unsigned long fs; |
6 | static inline void set_fs(unsigned long seg) | 6 | static inline void set_fs(unsigned long seg) |
diff --git a/arch/x86/boot/compressed/cpuflags.c b/arch/x86/boot/compressed/cpuflags.c new file mode 100644 index 000000000000..aa313466118b --- /dev/null +++ b/arch/x86/boot/compressed/cpuflags.c | |||
@@ -0,0 +1,12 @@ | |||
1 | #ifdef CONFIG_RANDOMIZE_BASE | ||
2 | |||
3 | #include "../cpuflags.c" | ||
4 | |||
5 | bool has_cpuflag(int flag) | ||
6 | { | ||
7 | get_cpuflags(); | ||
8 | |||
9 | return test_bit(flag, cpu.flags); | ||
10 | } | ||
11 | |||
12 | #endif | ||
diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S index 5d6f6891b188..9116aac232c7 100644 --- a/arch/x86/boot/compressed/head_32.S +++ b/arch/x86/boot/compressed/head_32.S | |||
@@ -117,9 +117,11 @@ preferred_addr: | |||
117 | addl %eax, %ebx | 117 | addl %eax, %ebx |
118 | notl %eax | 118 | notl %eax |
119 | andl %eax, %ebx | 119 | andl %eax, %ebx |
120 | #else | 120 | cmpl $LOAD_PHYSICAL_ADDR, %ebx |
121 | movl $LOAD_PHYSICAL_ADDR, %ebx | 121 | jge 1f |
122 | #endif | 122 | #endif |
123 | movl $LOAD_PHYSICAL_ADDR, %ebx | ||
124 | 1: | ||
123 | 125 | ||
124 | /* Target address to relocate to for decompression */ | 126 | /* Target address to relocate to for decompression */ |
125 | addl $z_extract_offset, %ebx | 127 | addl $z_extract_offset, %ebx |
@@ -191,14 +193,14 @@ relocated: | |||
191 | leal boot_heap(%ebx), %eax | 193 | leal boot_heap(%ebx), %eax |
192 | pushl %eax /* heap area */ | 194 | pushl %eax /* heap area */ |
193 | pushl %esi /* real mode pointer */ | 195 | pushl %esi /* real mode pointer */ |
194 | call decompress_kernel | 196 | call decompress_kernel /* returns kernel location in %eax */ |
195 | addl $24, %esp | 197 | addl $24, %esp |
196 | 198 | ||
197 | /* | 199 | /* |
198 | * Jump to the decompressed kernel. | 200 | * Jump to the decompressed kernel. |
199 | */ | 201 | */ |
200 | xorl %ebx, %ebx | 202 | xorl %ebx, %ebx |
201 | jmp *%ebp | 203 | jmp *%eax |
202 | 204 | ||
203 | /* | 205 | /* |
204 | * Stack and heap for uncompression | 206 | * Stack and heap for uncompression |
diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S index c337422b575d..c5c1ae0997e7 100644 --- a/arch/x86/boot/compressed/head_64.S +++ b/arch/x86/boot/compressed/head_64.S | |||
@@ -94,9 +94,11 @@ ENTRY(startup_32) | |||
94 | addl %eax, %ebx | 94 | addl %eax, %ebx |
95 | notl %eax | 95 | notl %eax |
96 | andl %eax, %ebx | 96 | andl %eax, %ebx |
97 | #else | 97 | cmpl $LOAD_PHYSICAL_ADDR, %ebx |
98 | movl $LOAD_PHYSICAL_ADDR, %ebx | 98 | jge 1f |
99 | #endif | 99 | #endif |
100 | movl $LOAD_PHYSICAL_ADDR, %ebx | ||
101 | 1: | ||
100 | 102 | ||
101 | /* Target address to relocate to for decompression */ | 103 | /* Target address to relocate to for decompression */ |
102 | addl $z_extract_offset, %ebx | 104 | addl $z_extract_offset, %ebx |
@@ -269,9 +271,11 @@ preferred_addr: | |||
269 | addq %rax, %rbp | 271 | addq %rax, %rbp |
270 | notq %rax | 272 | notq %rax |
271 | andq %rax, %rbp | 273 | andq %rax, %rbp |
272 | #else | 274 | cmpq $LOAD_PHYSICAL_ADDR, %rbp |
273 | movq $LOAD_PHYSICAL_ADDR, %rbp | 275 | jge 1f |
274 | #endif | 276 | #endif |
277 | movq $LOAD_PHYSICAL_ADDR, %rbp | ||
278 | 1: | ||
275 | 279 | ||
276 | /* Target address to relocate to for decompression */ | 280 | /* Target address to relocate to for decompression */ |
277 | leaq z_extract_offset(%rbp), %rbx | 281 | leaq z_extract_offset(%rbp), %rbx |
@@ -339,13 +343,13 @@ relocated: | |||
339 | movl $z_input_len, %ecx /* input_len */ | 343 | movl $z_input_len, %ecx /* input_len */ |
340 | movq %rbp, %r8 /* output target address */ | 344 | movq %rbp, %r8 /* output target address */ |
341 | movq $z_output_len, %r9 /* decompressed length */ | 345 | movq $z_output_len, %r9 /* decompressed length */ |
342 | call decompress_kernel | 346 | call decompress_kernel /* returns kernel location in %rax */ |
343 | popq %rsi | 347 | popq %rsi |
344 | 348 | ||
345 | /* | 349 | /* |
346 | * Jump to the decompressed kernel. | 350 | * Jump to the decompressed kernel. |
347 | */ | 351 | */ |
348 | jmp *%rbp | 352 | jmp *%rax |
349 | 353 | ||
350 | .code32 | 354 | .code32 |
351 | no_longmode: | 355 | no_longmode: |
diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c index 434f077d2c4d..196eaf373a06 100644 --- a/arch/x86/boot/compressed/misc.c +++ b/arch/x86/boot/compressed/misc.c | |||
@@ -112,14 +112,8 @@ struct boot_params *real_mode; /* Pointer to real-mode data */ | |||
112 | void *memset(void *s, int c, size_t n); | 112 | void *memset(void *s, int c, size_t n); |
113 | void *memcpy(void *dest, const void *src, size_t n); | 113 | void *memcpy(void *dest, const void *src, size_t n); |
114 | 114 | ||
115 | #ifdef CONFIG_X86_64 | 115 | memptr free_mem_ptr; |
116 | #define memptr long | 116 | memptr free_mem_end_ptr; |
117 | #else | ||
118 | #define memptr unsigned | ||
119 | #endif | ||
120 | |||
121 | static memptr free_mem_ptr; | ||
122 | static memptr free_mem_end_ptr; | ||
123 | 117 | ||
124 | static char *vidmem; | 118 | static char *vidmem; |
125 | static int vidport; | 119 | static int vidport; |
@@ -395,7 +389,7 @@ static void parse_elf(void *output) | |||
395 | free(phdrs); | 389 | free(phdrs); |
396 | } | 390 | } |
397 | 391 | ||
398 | asmlinkage void decompress_kernel(void *rmode, memptr heap, | 392 | asmlinkage void *decompress_kernel(void *rmode, memptr heap, |
399 | unsigned char *input_data, | 393 | unsigned char *input_data, |
400 | unsigned long input_len, | 394 | unsigned long input_len, |
401 | unsigned char *output, | 395 | unsigned char *output, |
@@ -422,6 +416,10 @@ asmlinkage void decompress_kernel(void *rmode, memptr heap, | |||
422 | free_mem_ptr = heap; /* Heap */ | 416 | free_mem_ptr = heap; /* Heap */ |
423 | free_mem_end_ptr = heap + BOOT_HEAP_SIZE; | 417 | free_mem_end_ptr = heap + BOOT_HEAP_SIZE; |
424 | 418 | ||
419 | output = choose_kernel_location(input_data, input_len, | ||
420 | output, output_len); | ||
421 | |||
422 | /* Validate memory location choices. */ | ||
425 | if ((unsigned long)output & (MIN_KERNEL_ALIGN - 1)) | 423 | if ((unsigned long)output & (MIN_KERNEL_ALIGN - 1)) |
426 | error("Destination address inappropriately aligned"); | 424 | error("Destination address inappropriately aligned"); |
427 | #ifdef CONFIG_X86_64 | 425 | #ifdef CONFIG_X86_64 |
@@ -441,5 +439,5 @@ asmlinkage void decompress_kernel(void *rmode, memptr heap, | |||
441 | parse_elf(output); | 439 | parse_elf(output); |
442 | handle_relocations(output, output_len); | 440 | handle_relocations(output, output_len); |
443 | debug_putstr("done.\nBooting the kernel.\n"); | 441 | debug_putstr("done.\nBooting the kernel.\n"); |
444 | return; | 442 | return output; |
445 | } | 443 | } |
diff --git a/arch/x86/boot/compressed/misc.h b/arch/x86/boot/compressed/misc.h index 674019d8e235..24e3e569a13c 100644 --- a/arch/x86/boot/compressed/misc.h +++ b/arch/x86/boot/compressed/misc.h | |||
@@ -23,7 +23,15 @@ | |||
23 | #define BOOT_BOOT_H | 23 | #define BOOT_BOOT_H |
24 | #include "../ctype.h" | 24 | #include "../ctype.h" |
25 | 25 | ||
26 | #ifdef CONFIG_X86_64 | ||
27 | #define memptr long | ||
28 | #else | ||
29 | #define memptr unsigned | ||
30 | #endif | ||
31 | |||
26 | /* misc.c */ | 32 | /* misc.c */ |
33 | extern memptr free_mem_ptr; | ||
34 | extern memptr free_mem_end_ptr; | ||
27 | extern struct boot_params *real_mode; /* Pointer to real-mode data */ | 35 | extern struct boot_params *real_mode; /* Pointer to real-mode data */ |
28 | void __putstr(const char *s); | 36 | void __putstr(const char *s); |
29 | #define error_putstr(__x) __putstr(__x) | 37 | #define error_putstr(__x) __putstr(__x) |
@@ -39,23 +47,40 @@ static inline void debug_putstr(const char *s) | |||
39 | 47 | ||
40 | #endif | 48 | #endif |
41 | 49 | ||
42 | #ifdef CONFIG_EARLY_PRINTK | 50 | #if CONFIG_EARLY_PRINTK || CONFIG_RANDOMIZE_BASE |
43 | |||
44 | /* cmdline.c */ | 51 | /* cmdline.c */ |
45 | int cmdline_find_option(const char *option, char *buffer, int bufsize); | 52 | int cmdline_find_option(const char *option, char *buffer, int bufsize); |
46 | int cmdline_find_option_bool(const char *option); | 53 | int cmdline_find_option_bool(const char *option); |
54 | #endif | ||
47 | 55 | ||
48 | /* early_serial_console.c */ | ||
49 | extern int early_serial_base; | ||
50 | void console_init(void); | ||
51 | 56 | ||
57 | #if CONFIG_RANDOMIZE_BASE | ||
58 | /* aslr.c */ | ||
59 | unsigned char *choose_kernel_location(unsigned char *input, | ||
60 | unsigned long input_size, | ||
61 | unsigned char *output, | ||
62 | unsigned long output_size); | ||
63 | /* cpuflags.c */ | ||
64 | bool has_cpuflag(int flag); | ||
52 | #else | 65 | #else |
66 | static inline | ||
67 | unsigned char *choose_kernel_location(unsigned char *input, | ||
68 | unsigned long input_size, | ||
69 | unsigned char *output, | ||
70 | unsigned long output_size) | ||
71 | { | ||
72 | return output; | ||
73 | } | ||
74 | #endif | ||
53 | 75 | ||
76 | #ifdef CONFIG_EARLY_PRINTK | ||
54 | /* early_serial_console.c */ | 77 | /* early_serial_console.c */ |
78 | extern int early_serial_base; | ||
79 | void console_init(void); | ||
80 | #else | ||
55 | static const int early_serial_base; | 81 | static const int early_serial_base; |
56 | static inline void console_init(void) | 82 | static inline void console_init(void) |
57 | { } | 83 | { } |
58 | |||
59 | #endif | 84 | #endif |
60 | 85 | ||
61 | #endif | 86 | #endif |
diff --git a/arch/x86/boot/copy.S b/arch/x86/boot/copy.S index 11f272c6f5e9..1eb7d298b47d 100644 --- a/arch/x86/boot/copy.S +++ b/arch/x86/boot/copy.S | |||
@@ -14,7 +14,7 @@ | |||
14 | * Memory copy routines | 14 | * Memory copy routines |
15 | */ | 15 | */ |
16 | 16 | ||
17 | .code16gcc | 17 | .code16 |
18 | .text | 18 | .text |
19 | 19 | ||
20 | GLOBAL(memcpy) | 20 | GLOBAL(memcpy) |
@@ -30,7 +30,7 @@ GLOBAL(memcpy) | |||
30 | rep; movsb | 30 | rep; movsb |
31 | popw %di | 31 | popw %di |
32 | popw %si | 32 | popw %si |
33 | ret | 33 | retl |
34 | ENDPROC(memcpy) | 34 | ENDPROC(memcpy) |
35 | 35 | ||
36 | GLOBAL(memset) | 36 | GLOBAL(memset) |
@@ -45,25 +45,25 @@ GLOBAL(memset) | |||
45 | andw $3, %cx | 45 | andw $3, %cx |
46 | rep; stosb | 46 | rep; stosb |
47 | popw %di | 47 | popw %di |
48 | ret | 48 | retl |
49 | ENDPROC(memset) | 49 | ENDPROC(memset) |
50 | 50 | ||
51 | GLOBAL(copy_from_fs) | 51 | GLOBAL(copy_from_fs) |
52 | pushw %ds | 52 | pushw %ds |
53 | pushw %fs | 53 | pushw %fs |
54 | popw %ds | 54 | popw %ds |
55 | call memcpy | 55 | calll memcpy |
56 | popw %ds | 56 | popw %ds |
57 | ret | 57 | retl |
58 | ENDPROC(copy_from_fs) | 58 | ENDPROC(copy_from_fs) |
59 | 59 | ||
60 | GLOBAL(copy_to_fs) | 60 | GLOBAL(copy_to_fs) |
61 | pushw %es | 61 | pushw %es |
62 | pushw %fs | 62 | pushw %fs |
63 | popw %es | 63 | popw %es |
64 | call memcpy | 64 | calll memcpy |
65 | popw %es | 65 | popw %es |
66 | ret | 66 | retl |
67 | ENDPROC(copy_to_fs) | 67 | ENDPROC(copy_to_fs) |
68 | 68 | ||
69 | #if 0 /* Not currently used, but can be enabled as needed */ | 69 | #if 0 /* Not currently used, but can be enabled as needed */ |
@@ -71,17 +71,17 @@ GLOBAL(copy_from_gs) | |||
71 | pushw %ds | 71 | pushw %ds |
72 | pushw %gs | 72 | pushw %gs |
73 | popw %ds | 73 | popw %ds |
74 | call memcpy | 74 | calll memcpy |
75 | popw %ds | 75 | popw %ds |
76 | ret | 76 | retl |
77 | ENDPROC(copy_from_gs) | 77 | ENDPROC(copy_from_gs) |
78 | 78 | ||
79 | GLOBAL(copy_to_gs) | 79 | GLOBAL(copy_to_gs) |
80 | pushw %es | 80 | pushw %es |
81 | pushw %gs | 81 | pushw %gs |
82 | popw %es | 82 | popw %es |
83 | call memcpy | 83 | calll memcpy |
84 | popw %es | 84 | popw %es |
85 | ret | 85 | retl |
86 | ENDPROC(copy_to_gs) | 86 | ENDPROC(copy_to_gs) |
87 | #endif | 87 | #endif |
diff --git a/arch/x86/boot/cpucheck.c b/arch/x86/boot/cpucheck.c index 4d3ff037201f..100a9a10076a 100644 --- a/arch/x86/boot/cpucheck.c +++ b/arch/x86/boot/cpucheck.c | |||
@@ -28,8 +28,6 @@ | |||
28 | #include <asm/required-features.h> | 28 | #include <asm/required-features.h> |
29 | #include <asm/msr-index.h> | 29 | #include <asm/msr-index.h> |
30 | 30 | ||
31 | struct cpu_features cpu; | ||
32 | static u32 cpu_vendor[3]; | ||
33 | static u32 err_flags[NCAPINTS]; | 31 | static u32 err_flags[NCAPINTS]; |
34 | 32 | ||
35 | static const int req_level = CONFIG_X86_MINIMUM_CPU_FAMILY; | 33 | static const int req_level = CONFIG_X86_MINIMUM_CPU_FAMILY; |
@@ -69,92 +67,8 @@ static int is_transmeta(void) | |||
69 | cpu_vendor[2] == A32('M', 'x', '8', '6'); | 67 | cpu_vendor[2] == A32('M', 'x', '8', '6'); |
70 | } | 68 | } |
71 | 69 | ||
72 | static int has_fpu(void) | ||
73 | { | ||
74 | u16 fcw = -1, fsw = -1; | ||
75 | u32 cr0; | ||
76 | |||
77 | asm("movl %%cr0,%0" : "=r" (cr0)); | ||
78 | if (cr0 & (X86_CR0_EM|X86_CR0_TS)) { | ||
79 | cr0 &= ~(X86_CR0_EM|X86_CR0_TS); | ||
80 | asm volatile("movl %0,%%cr0" : : "r" (cr0)); | ||
81 | } | ||
82 | |||
83 | asm volatile("fninit ; fnstsw %0 ; fnstcw %1" | ||
84 | : "+m" (fsw), "+m" (fcw)); | ||
85 | |||
86 | return fsw == 0 && (fcw & 0x103f) == 0x003f; | ||
87 | } | ||
88 | |||
89 | static int has_eflag(u32 mask) | ||
90 | { | ||
91 | u32 f0, f1; | ||
92 | |||
93 | asm("pushfl ; " | ||
94 | "pushfl ; " | ||
95 | "popl %0 ; " | ||
96 | "movl %0,%1 ; " | ||
97 | "xorl %2,%1 ; " | ||
98 | "pushl %1 ; " | ||
99 | "popfl ; " | ||
100 | "pushfl ; " | ||
101 | "popl %1 ; " | ||
102 | "popfl" | ||
103 | : "=&r" (f0), "=&r" (f1) | ||
104 | : "ri" (mask)); | ||
105 | |||
106 | return !!((f0^f1) & mask); | ||
107 | } | ||
108 | |||
109 | static void get_flags(void) | ||
110 | { | ||
111 | u32 max_intel_level, max_amd_level; | ||
112 | u32 tfms; | ||
113 | |||
114 | if (has_fpu()) | ||
115 | set_bit(X86_FEATURE_FPU, cpu.flags); | ||
116 | |||
117 | if (has_eflag(X86_EFLAGS_ID)) { | ||
118 | asm("cpuid" | ||
119 | : "=a" (max_intel_level), | ||
120 | "=b" (cpu_vendor[0]), | ||
121 | "=d" (cpu_vendor[1]), | ||
122 | "=c" (cpu_vendor[2]) | ||
123 | : "a" (0)); | ||
124 | |||
125 | if (max_intel_level >= 0x00000001 && | ||
126 | max_intel_level <= 0x0000ffff) { | ||
127 | asm("cpuid" | ||
128 | : "=a" (tfms), | ||
129 | "=c" (cpu.flags[4]), | ||
130 | "=d" (cpu.flags[0]) | ||
131 | : "a" (0x00000001) | ||
132 | : "ebx"); | ||
133 | cpu.level = (tfms >> 8) & 15; | ||
134 | cpu.model = (tfms >> 4) & 15; | ||
135 | if (cpu.level >= 6) | ||
136 | cpu.model += ((tfms >> 16) & 0xf) << 4; | ||
137 | } | ||
138 | |||
139 | asm("cpuid" | ||
140 | : "=a" (max_amd_level) | ||
141 | : "a" (0x80000000) | ||
142 | : "ebx", "ecx", "edx"); | ||
143 | |||
144 | if (max_amd_level >= 0x80000001 && | ||
145 | max_amd_level <= 0x8000ffff) { | ||
146 | u32 eax = 0x80000001; | ||
147 | asm("cpuid" | ||
148 | : "+a" (eax), | ||
149 | "=c" (cpu.flags[6]), | ||
150 | "=d" (cpu.flags[1]) | ||
151 | : : "ebx"); | ||
152 | } | ||
153 | } | ||
154 | } | ||
155 | |||
156 | /* Returns a bitmask of which words we have error bits in */ | 70 | /* Returns a bitmask of which words we have error bits in */ |
157 | static int check_flags(void) | 71 | static int check_cpuflags(void) |
158 | { | 72 | { |
159 | u32 err; | 73 | u32 err; |
160 | int i; | 74 | int i; |
@@ -187,8 +101,8 @@ int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr) | |||
187 | if (has_eflag(X86_EFLAGS_AC)) | 101 | if (has_eflag(X86_EFLAGS_AC)) |
188 | cpu.level = 4; | 102 | cpu.level = 4; |
189 | 103 | ||
190 | get_flags(); | 104 | get_cpuflags(); |
191 | err = check_flags(); | 105 | err = check_cpuflags(); |
192 | 106 | ||
193 | if (test_bit(X86_FEATURE_LM, cpu.flags)) | 107 | if (test_bit(X86_FEATURE_LM, cpu.flags)) |
194 | cpu.level = 64; | 108 | cpu.level = 64; |
@@ -207,8 +121,8 @@ int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr) | |||
207 | eax &= ~(1 << 15); | 121 | eax &= ~(1 << 15); |
208 | asm("wrmsr" : : "a" (eax), "d" (edx), "c" (ecx)); | 122 | asm("wrmsr" : : "a" (eax), "d" (edx), "c" (ecx)); |
209 | 123 | ||
210 | get_flags(); /* Make sure it really did something */ | 124 | get_cpuflags(); /* Make sure it really did something */ |
211 | err = check_flags(); | 125 | err = check_cpuflags(); |
212 | } else if (err == 0x01 && | 126 | } else if (err == 0x01 && |
213 | !(err_flags[0] & ~(1 << X86_FEATURE_CX8)) && | 127 | !(err_flags[0] & ~(1 << X86_FEATURE_CX8)) && |
214 | is_centaur() && cpu.model >= 6) { | 128 | is_centaur() && cpu.model >= 6) { |
@@ -223,7 +137,7 @@ int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr) | |||
223 | asm("wrmsr" : : "a" (eax), "d" (edx), "c" (ecx)); | 137 | asm("wrmsr" : : "a" (eax), "d" (edx), "c" (ecx)); |
224 | 138 | ||
225 | set_bit(X86_FEATURE_CX8, cpu.flags); | 139 | set_bit(X86_FEATURE_CX8, cpu.flags); |
226 | err = check_flags(); | 140 | err = check_cpuflags(); |
227 | } else if (err == 0x01 && is_transmeta()) { | 141 | } else if (err == 0x01 && is_transmeta()) { |
228 | /* Transmeta might have masked feature bits in word 0 */ | 142 | /* Transmeta might have masked feature bits in word 0 */ |
229 | 143 | ||
@@ -238,7 +152,7 @@ int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr) | |||
238 | : : "ecx", "ebx"); | 152 | : : "ecx", "ebx"); |
239 | asm("wrmsr" : : "a" (eax), "d" (edx), "c" (ecx)); | 153 | asm("wrmsr" : : "a" (eax), "d" (edx), "c" (ecx)); |
240 | 154 | ||
241 | err = check_flags(); | 155 | err = check_cpuflags(); |
242 | } | 156 | } |
243 | 157 | ||
244 | if (err_flags_ptr) | 158 | if (err_flags_ptr) |
diff --git a/arch/x86/boot/cpuflags.c b/arch/x86/boot/cpuflags.c new file mode 100644 index 000000000000..a9fcb7cfb241 --- /dev/null +++ b/arch/x86/boot/cpuflags.c | |||
@@ -0,0 +1,104 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include "bitops.h" | ||
3 | |||
4 | #include <asm/processor-flags.h> | ||
5 | #include <asm/required-features.h> | ||
6 | #include <asm/msr-index.h> | ||
7 | #include "cpuflags.h" | ||
8 | |||
9 | struct cpu_features cpu; | ||
10 | u32 cpu_vendor[3]; | ||
11 | |||
12 | static bool loaded_flags; | ||
13 | |||
14 | static int has_fpu(void) | ||
15 | { | ||
16 | u16 fcw = -1, fsw = -1; | ||
17 | unsigned long cr0; | ||
18 | |||
19 | asm volatile("mov %%cr0,%0" : "=r" (cr0)); | ||
20 | if (cr0 & (X86_CR0_EM|X86_CR0_TS)) { | ||
21 | cr0 &= ~(X86_CR0_EM|X86_CR0_TS); | ||
22 | asm volatile("mov %0,%%cr0" : : "r" (cr0)); | ||
23 | } | ||
24 | |||
25 | asm volatile("fninit ; fnstsw %0 ; fnstcw %1" | ||
26 | : "+m" (fsw), "+m" (fcw)); | ||
27 | |||
28 | return fsw == 0 && (fcw & 0x103f) == 0x003f; | ||
29 | } | ||
30 | |||
31 | int has_eflag(unsigned long mask) | ||
32 | { | ||
33 | unsigned long f0, f1; | ||
34 | |||
35 | asm volatile("pushf \n\t" | ||
36 | "pushf \n\t" | ||
37 | "pop %0 \n\t" | ||
38 | "mov %0,%1 \n\t" | ||
39 | "xor %2,%1 \n\t" | ||
40 | "push %1 \n\t" | ||
41 | "popf \n\t" | ||
42 | "pushf \n\t" | ||
43 | "pop %1 \n\t" | ||
44 | "popf" | ||
45 | : "=&r" (f0), "=&r" (f1) | ||
46 | : "ri" (mask)); | ||
47 | |||
48 | return !!((f0^f1) & mask); | ||
49 | } | ||
50 | |||
51 | /* Handle x86_32 PIC using ebx. */ | ||
52 | #if defined(__i386__) && defined(__PIC__) | ||
53 | # define EBX_REG "=r" | ||
54 | #else | ||
55 | # define EBX_REG "=b" | ||
56 | #endif | ||
57 | |||
58 | static inline void cpuid(u32 id, u32 *a, u32 *b, u32 *c, u32 *d) | ||
59 | { | ||
60 | asm volatile(".ifnc %%ebx,%3 ; movl %%ebx,%3 ; .endif \n\t" | ||
61 | "cpuid \n\t" | ||
62 | ".ifnc %%ebx,%3 ; xchgl %%ebx,%3 ; .endif \n\t" | ||
63 | : "=a" (*a), "=c" (*c), "=d" (*d), EBX_REG (*b) | ||
64 | : "a" (id) | ||
65 | ); | ||
66 | } | ||
67 | |||
68 | void get_cpuflags(void) | ||
69 | { | ||
70 | u32 max_intel_level, max_amd_level; | ||
71 | u32 tfms; | ||
72 | u32 ignored; | ||
73 | |||
74 | if (loaded_flags) | ||
75 | return; | ||
76 | loaded_flags = true; | ||
77 | |||
78 | if (has_fpu()) | ||
79 | set_bit(X86_FEATURE_FPU, cpu.flags); | ||
80 | |||
81 | if (has_eflag(X86_EFLAGS_ID)) { | ||
82 | cpuid(0x0, &max_intel_level, &cpu_vendor[0], &cpu_vendor[2], | ||
83 | &cpu_vendor[1]); | ||
84 | |||
85 | if (max_intel_level >= 0x00000001 && | ||
86 | max_intel_level <= 0x0000ffff) { | ||
87 | cpuid(0x1, &tfms, &ignored, &cpu.flags[4], | ||
88 | &cpu.flags[0]); | ||
89 | cpu.level = (tfms >> 8) & 15; | ||
90 | cpu.model = (tfms >> 4) & 15; | ||
91 | if (cpu.level >= 6) | ||
92 | cpu.model += ((tfms >> 16) & 0xf) << 4; | ||
93 | } | ||
94 | |||
95 | cpuid(0x80000000, &max_amd_level, &ignored, &ignored, | ||
96 | &ignored); | ||
97 | |||
98 | if (max_amd_level >= 0x80000001 && | ||
99 | max_amd_level <= 0x8000ffff) { | ||
100 | cpuid(0x80000001, &ignored, &ignored, &cpu.flags[6], | ||
101 | &cpu.flags[1]); | ||
102 | } | ||
103 | } | ||
104 | } | ||
diff --git a/arch/x86/boot/cpuflags.h b/arch/x86/boot/cpuflags.h new file mode 100644 index 000000000000..ea97697e51e4 --- /dev/null +++ b/arch/x86/boot/cpuflags.h | |||
@@ -0,0 +1,19 @@ | |||
1 | #ifndef BOOT_CPUFLAGS_H | ||
2 | #define BOOT_CPUFLAGS_H | ||
3 | |||
4 | #include <asm/cpufeature.h> | ||
5 | #include <asm/processor-flags.h> | ||
6 | |||
7 | struct cpu_features { | ||
8 | int level; /* Family, or 64 for x86-64 */ | ||
9 | int model; | ||
10 | u32 flags[NCAPINTS]; | ||
11 | }; | ||
12 | |||
13 | extern struct cpu_features cpu; | ||
14 | extern u32 cpu_vendor[3]; | ||
15 | |||
16 | int has_eflag(unsigned long mask); | ||
17 | void get_cpuflags(void); | ||
18 | |||
19 | #endif | ||
diff --git a/arch/x86/boot/header.S b/arch/x86/boot/header.S index 9ec06a1f6d61..ec3b8ba68096 100644 --- a/arch/x86/boot/header.S +++ b/arch/x86/boot/header.S | |||
@@ -391,7 +391,14 @@ xloadflags: | |||
391 | #else | 391 | #else |
392 | # define XLF23 0 | 392 | # define XLF23 0 |
393 | #endif | 393 | #endif |
394 | .word XLF0 | XLF1 | XLF23 | 394 | |
395 | #if defined(CONFIG_X86_64) && defined(CONFIG_EFI) && defined(CONFIG_KEXEC) | ||
396 | # define XLF4 XLF_EFI_KEXEC | ||
397 | #else | ||
398 | # define XLF4 0 | ||
399 | #endif | ||
400 | |||
401 | .word XLF0 | XLF1 | XLF23 | XLF4 | ||
395 | 402 | ||
396 | cmdline_size: .long COMMAND_LINE_SIZE-1 #length of the command line, | 403 | cmdline_size: .long COMMAND_LINE_SIZE-1 #length of the command line, |
397 | #added with boot protocol | 404 | #added with boot protocol |
diff --git a/arch/x86/crypto/Makefile b/arch/x86/crypto/Makefile index 7d6ba9db1be9..e0fc24db234a 100644 --- a/arch/x86/crypto/Makefile +++ b/arch/x86/crypto/Makefile | |||
@@ -3,8 +3,9 @@ | |||
3 | # | 3 | # |
4 | 4 | ||
5 | avx_supported := $(call as-instr,vpxor %xmm0$(comma)%xmm0$(comma)%xmm0,yes,no) | 5 | avx_supported := $(call as-instr,vpxor %xmm0$(comma)%xmm0$(comma)%xmm0,yes,no) |
6 | avx2_supported := $(call as-instr,vpgatherdd %ymm0$(comma)(%eax$(comma)%ymm1\ | ||
7 | $(comma)4)$(comma)%ymm2,yes,no) | ||
6 | 8 | ||
7 | obj-$(CONFIG_CRYPTO_ABLK_HELPER_X86) += ablk_helper.o | ||
8 | obj-$(CONFIG_CRYPTO_GLUE_HELPER_X86) += glue_helper.o | 9 | obj-$(CONFIG_CRYPTO_GLUE_HELPER_X86) += glue_helper.o |
9 | 10 | ||
10 | obj-$(CONFIG_CRYPTO_AES_586) += aes-i586.o | 11 | obj-$(CONFIG_CRYPTO_AES_586) += aes-i586.o |
diff --git a/arch/x86/crypto/ablk_helper.c b/arch/x86/crypto/ablk_helper.c deleted file mode 100644 index 43282fe04a8b..000000000000 --- a/arch/x86/crypto/ablk_helper.c +++ /dev/null | |||
@@ -1,149 +0,0 @@ | |||
1 | /* | ||
2 | * Shared async block cipher helpers | ||
3 | * | ||
4 | * Copyright (c) 2012 Jussi Kivilinna <jussi.kivilinna@mbnet.fi> | ||
5 | * | ||
6 | * Based on aesni-intel_glue.c by: | ||
7 | * Copyright (C) 2008, Intel Corp. | ||
8 | * Author: Huang Ying <ying.huang@intel.com> | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License as published by | ||
12 | * the Free Software Foundation; either version 2 of the License, or | ||
13 | * (at your option) any later version. | ||
14 | * | ||
15 | * This program is distributed in the hope that it will be useful, | ||
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
18 | * GNU General Public License for more details. | ||
19 | * | ||
20 | * You should have received a copy of the GNU General Public License | ||
21 | * along with this program; if not, write to the Free Software | ||
22 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 | ||
23 | * USA | ||
24 | * | ||
25 | */ | ||
26 | |||
27 | #include <linux/kernel.h> | ||
28 | #include <linux/crypto.h> | ||
29 | #include <linux/init.h> | ||
30 | #include <linux/module.h> | ||
31 | #include <crypto/algapi.h> | ||
32 | #include <crypto/cryptd.h> | ||
33 | #include <asm/i387.h> | ||
34 | #include <asm/crypto/ablk_helper.h> | ||
35 | |||
36 | int ablk_set_key(struct crypto_ablkcipher *tfm, const u8 *key, | ||
37 | unsigned int key_len) | ||
38 | { | ||
39 | struct async_helper_ctx *ctx = crypto_ablkcipher_ctx(tfm); | ||
40 | struct crypto_ablkcipher *child = &ctx->cryptd_tfm->base; | ||
41 | int err; | ||
42 | |||
43 | crypto_ablkcipher_clear_flags(child, CRYPTO_TFM_REQ_MASK); | ||
44 | crypto_ablkcipher_set_flags(child, crypto_ablkcipher_get_flags(tfm) | ||
45 | & CRYPTO_TFM_REQ_MASK); | ||
46 | err = crypto_ablkcipher_setkey(child, key, key_len); | ||
47 | crypto_ablkcipher_set_flags(tfm, crypto_ablkcipher_get_flags(child) | ||
48 | & CRYPTO_TFM_RES_MASK); | ||
49 | return err; | ||
50 | } | ||
51 | EXPORT_SYMBOL_GPL(ablk_set_key); | ||
52 | |||
53 | int __ablk_encrypt(struct ablkcipher_request *req) | ||
54 | { | ||
55 | struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req); | ||
56 | struct async_helper_ctx *ctx = crypto_ablkcipher_ctx(tfm); | ||
57 | struct blkcipher_desc desc; | ||
58 | |||
59 | desc.tfm = cryptd_ablkcipher_child(ctx->cryptd_tfm); | ||
60 | desc.info = req->info; | ||
61 | desc.flags = 0; | ||
62 | |||
63 | return crypto_blkcipher_crt(desc.tfm)->encrypt( | ||
64 | &desc, req->dst, req->src, req->nbytes); | ||
65 | } | ||
66 | EXPORT_SYMBOL_GPL(__ablk_encrypt); | ||
67 | |||
68 | int ablk_encrypt(struct ablkcipher_request *req) | ||
69 | { | ||
70 | struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req); | ||
71 | struct async_helper_ctx *ctx = crypto_ablkcipher_ctx(tfm); | ||
72 | |||
73 | if (!irq_fpu_usable()) { | ||
74 | struct ablkcipher_request *cryptd_req = | ||
75 | ablkcipher_request_ctx(req); | ||
76 | |||
77 | memcpy(cryptd_req, req, sizeof(*req)); | ||
78 | ablkcipher_request_set_tfm(cryptd_req, &ctx->cryptd_tfm->base); | ||
79 | |||
80 | return crypto_ablkcipher_encrypt(cryptd_req); | ||
81 | } else { | ||
82 | return __ablk_encrypt(req); | ||
83 | } | ||
84 | } | ||
85 | EXPORT_SYMBOL_GPL(ablk_encrypt); | ||
86 | |||
87 | int ablk_decrypt(struct ablkcipher_request *req) | ||
88 | { | ||
89 | struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req); | ||
90 | struct async_helper_ctx *ctx = crypto_ablkcipher_ctx(tfm); | ||
91 | |||
92 | if (!irq_fpu_usable()) { | ||
93 | struct ablkcipher_request *cryptd_req = | ||
94 | ablkcipher_request_ctx(req); | ||
95 | |||
96 | memcpy(cryptd_req, req, sizeof(*req)); | ||
97 | ablkcipher_request_set_tfm(cryptd_req, &ctx->cryptd_tfm->base); | ||
98 | |||
99 | return crypto_ablkcipher_decrypt(cryptd_req); | ||
100 | } else { | ||
101 | struct blkcipher_desc desc; | ||
102 | |||
103 | desc.tfm = cryptd_ablkcipher_child(ctx->cryptd_tfm); | ||
104 | desc.info = req->info; | ||
105 | desc.flags = 0; | ||
106 | |||
107 | return crypto_blkcipher_crt(desc.tfm)->decrypt( | ||
108 | &desc, req->dst, req->src, req->nbytes); | ||
109 | } | ||
110 | } | ||
111 | EXPORT_SYMBOL_GPL(ablk_decrypt); | ||
112 | |||
113 | void ablk_exit(struct crypto_tfm *tfm) | ||
114 | { | ||
115 | struct async_helper_ctx *ctx = crypto_tfm_ctx(tfm); | ||
116 | |||
117 | cryptd_free_ablkcipher(ctx->cryptd_tfm); | ||
118 | } | ||
119 | EXPORT_SYMBOL_GPL(ablk_exit); | ||
120 | |||
121 | int ablk_init_common(struct crypto_tfm *tfm, const char *drv_name) | ||
122 | { | ||
123 | struct async_helper_ctx *ctx = crypto_tfm_ctx(tfm); | ||
124 | struct cryptd_ablkcipher *cryptd_tfm; | ||
125 | |||
126 | cryptd_tfm = cryptd_alloc_ablkcipher(drv_name, 0, 0); | ||
127 | if (IS_ERR(cryptd_tfm)) | ||
128 | return PTR_ERR(cryptd_tfm); | ||
129 | |||
130 | ctx->cryptd_tfm = cryptd_tfm; | ||
131 | tfm->crt_ablkcipher.reqsize = sizeof(struct ablkcipher_request) + | ||
132 | crypto_ablkcipher_reqsize(&cryptd_tfm->base); | ||
133 | |||
134 | return 0; | ||
135 | } | ||
136 | EXPORT_SYMBOL_GPL(ablk_init_common); | ||
137 | |||
138 | int ablk_init(struct crypto_tfm *tfm) | ||
139 | { | ||
140 | char drv_name[CRYPTO_MAX_ALG_NAME]; | ||
141 | |||
142 | snprintf(drv_name, sizeof(drv_name), "__driver-%s", | ||
143 | crypto_tfm_alg_driver_name(tfm)); | ||
144 | |||
145 | return ablk_init_common(tfm, drv_name); | ||
146 | } | ||
147 | EXPORT_SYMBOL_GPL(ablk_init); | ||
148 | |||
149 | MODULE_LICENSE("GPL"); | ||
diff --git a/arch/x86/crypto/aesni-intel_glue.c b/arch/x86/crypto/aesni-intel_glue.c index f80e668785c0..835488b745ee 100644 --- a/arch/x86/crypto/aesni-intel_glue.c +++ b/arch/x86/crypto/aesni-intel_glue.c | |||
@@ -34,7 +34,7 @@ | |||
34 | #include <asm/cpu_device_id.h> | 34 | #include <asm/cpu_device_id.h> |
35 | #include <asm/i387.h> | 35 | #include <asm/i387.h> |
36 | #include <asm/crypto/aes.h> | 36 | #include <asm/crypto/aes.h> |
37 | #include <asm/crypto/ablk_helper.h> | 37 | #include <crypto/ablk_helper.h> |
38 | #include <crypto/scatterwalk.h> | 38 | #include <crypto/scatterwalk.h> |
39 | #include <crypto/internal/aead.h> | 39 | #include <crypto/internal/aead.h> |
40 | #include <linux/workqueue.h> | 40 | #include <linux/workqueue.h> |
diff --git a/arch/x86/crypto/camellia_aesni_avx2_glue.c b/arch/x86/crypto/camellia_aesni_avx2_glue.c index 414fe5d7946b..4209a76fcdaa 100644 --- a/arch/x86/crypto/camellia_aesni_avx2_glue.c +++ b/arch/x86/crypto/camellia_aesni_avx2_glue.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/types.h> | 14 | #include <linux/types.h> |
15 | #include <linux/crypto.h> | 15 | #include <linux/crypto.h> |
16 | #include <linux/err.h> | 16 | #include <linux/err.h> |
17 | #include <crypto/ablk_helper.h> | ||
17 | #include <crypto/algapi.h> | 18 | #include <crypto/algapi.h> |
18 | #include <crypto/ctr.h> | 19 | #include <crypto/ctr.h> |
19 | #include <crypto/lrw.h> | 20 | #include <crypto/lrw.h> |
@@ -21,7 +22,6 @@ | |||
21 | #include <asm/xcr.h> | 22 | #include <asm/xcr.h> |
22 | #include <asm/xsave.h> | 23 | #include <asm/xsave.h> |
23 | #include <asm/crypto/camellia.h> | 24 | #include <asm/crypto/camellia.h> |
24 | #include <asm/crypto/ablk_helper.h> | ||
25 | #include <asm/crypto/glue_helper.h> | 25 | #include <asm/crypto/glue_helper.h> |
26 | 26 | ||
27 | #define CAMELLIA_AESNI_PARALLEL_BLOCKS 16 | 27 | #define CAMELLIA_AESNI_PARALLEL_BLOCKS 16 |
diff --git a/arch/x86/crypto/camellia_aesni_avx_glue.c b/arch/x86/crypto/camellia_aesni_avx_glue.c index 37fd0c0a81ea..87a041a10f4a 100644 --- a/arch/x86/crypto/camellia_aesni_avx_glue.c +++ b/arch/x86/crypto/camellia_aesni_avx_glue.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/types.h> | 14 | #include <linux/types.h> |
15 | #include <linux/crypto.h> | 15 | #include <linux/crypto.h> |
16 | #include <linux/err.h> | 16 | #include <linux/err.h> |
17 | #include <crypto/ablk_helper.h> | ||
17 | #include <crypto/algapi.h> | 18 | #include <crypto/algapi.h> |
18 | #include <crypto/ctr.h> | 19 | #include <crypto/ctr.h> |
19 | #include <crypto/lrw.h> | 20 | #include <crypto/lrw.h> |
@@ -21,7 +22,6 @@ | |||
21 | #include <asm/xcr.h> | 22 | #include <asm/xcr.h> |
22 | #include <asm/xsave.h> | 23 | #include <asm/xsave.h> |
23 | #include <asm/crypto/camellia.h> | 24 | #include <asm/crypto/camellia.h> |
24 | #include <asm/crypto/ablk_helper.h> | ||
25 | #include <asm/crypto/glue_helper.h> | 25 | #include <asm/crypto/glue_helper.h> |
26 | 26 | ||
27 | #define CAMELLIA_AESNI_PARALLEL_BLOCKS 16 | 27 | #define CAMELLIA_AESNI_PARALLEL_BLOCKS 16 |
diff --git a/arch/x86/crypto/cast5_avx_glue.c b/arch/x86/crypto/cast5_avx_glue.c index c6631813dc11..e6a3700489b9 100644 --- a/arch/x86/crypto/cast5_avx_glue.c +++ b/arch/x86/crypto/cast5_avx_glue.c | |||
@@ -26,13 +26,13 @@ | |||
26 | #include <linux/types.h> | 26 | #include <linux/types.h> |
27 | #include <linux/crypto.h> | 27 | #include <linux/crypto.h> |
28 | #include <linux/err.h> | 28 | #include <linux/err.h> |
29 | #include <crypto/ablk_helper.h> | ||
29 | #include <crypto/algapi.h> | 30 | #include <crypto/algapi.h> |
30 | #include <crypto/cast5.h> | 31 | #include <crypto/cast5.h> |
31 | #include <crypto/cryptd.h> | 32 | #include <crypto/cryptd.h> |
32 | #include <crypto/ctr.h> | 33 | #include <crypto/ctr.h> |
33 | #include <asm/xcr.h> | 34 | #include <asm/xcr.h> |
34 | #include <asm/xsave.h> | 35 | #include <asm/xsave.h> |
35 | #include <asm/crypto/ablk_helper.h> | ||
36 | #include <asm/crypto/glue_helper.h> | 36 | #include <asm/crypto/glue_helper.h> |
37 | 37 | ||
38 | #define CAST5_PARALLEL_BLOCKS 16 | 38 | #define CAST5_PARALLEL_BLOCKS 16 |
diff --git a/arch/x86/crypto/cast6_avx_glue.c b/arch/x86/crypto/cast6_avx_glue.c index 8d0dfb86a559..09f3677393e4 100644 --- a/arch/x86/crypto/cast6_avx_glue.c +++ b/arch/x86/crypto/cast6_avx_glue.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/types.h> | 28 | #include <linux/types.h> |
29 | #include <linux/crypto.h> | 29 | #include <linux/crypto.h> |
30 | #include <linux/err.h> | 30 | #include <linux/err.h> |
31 | #include <crypto/ablk_helper.h> | ||
31 | #include <crypto/algapi.h> | 32 | #include <crypto/algapi.h> |
32 | #include <crypto/cast6.h> | 33 | #include <crypto/cast6.h> |
33 | #include <crypto/cryptd.h> | 34 | #include <crypto/cryptd.h> |
@@ -37,7 +38,6 @@ | |||
37 | #include <crypto/xts.h> | 38 | #include <crypto/xts.h> |
38 | #include <asm/xcr.h> | 39 | #include <asm/xcr.h> |
39 | #include <asm/xsave.h> | 40 | #include <asm/xsave.h> |
40 | #include <asm/crypto/ablk_helper.h> | ||
41 | #include <asm/crypto/glue_helper.h> | 41 | #include <asm/crypto/glue_helper.h> |
42 | 42 | ||
43 | #define CAST6_PARALLEL_BLOCKS 8 | 43 | #define CAST6_PARALLEL_BLOCKS 8 |
diff --git a/arch/x86/crypto/serpent_avx2_glue.c b/arch/x86/crypto/serpent_avx2_glue.c index 23aabc6c20a5..2fae489b1524 100644 --- a/arch/x86/crypto/serpent_avx2_glue.c +++ b/arch/x86/crypto/serpent_avx2_glue.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/types.h> | 14 | #include <linux/types.h> |
15 | #include <linux/crypto.h> | 15 | #include <linux/crypto.h> |
16 | #include <linux/err.h> | 16 | #include <linux/err.h> |
17 | #include <crypto/ablk_helper.h> | ||
17 | #include <crypto/algapi.h> | 18 | #include <crypto/algapi.h> |
18 | #include <crypto/ctr.h> | 19 | #include <crypto/ctr.h> |
19 | #include <crypto/lrw.h> | 20 | #include <crypto/lrw.h> |
@@ -22,7 +23,6 @@ | |||
22 | #include <asm/xcr.h> | 23 | #include <asm/xcr.h> |
23 | #include <asm/xsave.h> | 24 | #include <asm/xsave.h> |
24 | #include <asm/crypto/serpent-avx.h> | 25 | #include <asm/crypto/serpent-avx.h> |
25 | #include <asm/crypto/ablk_helper.h> | ||
26 | #include <asm/crypto/glue_helper.h> | 26 | #include <asm/crypto/glue_helper.h> |
27 | 27 | ||
28 | #define SERPENT_AVX2_PARALLEL_BLOCKS 16 | 28 | #define SERPENT_AVX2_PARALLEL_BLOCKS 16 |
diff --git a/arch/x86/crypto/serpent_avx_glue.c b/arch/x86/crypto/serpent_avx_glue.c index 9ae83cf8d21e..ff4870870972 100644 --- a/arch/x86/crypto/serpent_avx_glue.c +++ b/arch/x86/crypto/serpent_avx_glue.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/types.h> | 28 | #include <linux/types.h> |
29 | #include <linux/crypto.h> | 29 | #include <linux/crypto.h> |
30 | #include <linux/err.h> | 30 | #include <linux/err.h> |
31 | #include <crypto/ablk_helper.h> | ||
31 | #include <crypto/algapi.h> | 32 | #include <crypto/algapi.h> |
32 | #include <crypto/serpent.h> | 33 | #include <crypto/serpent.h> |
33 | #include <crypto/cryptd.h> | 34 | #include <crypto/cryptd.h> |
@@ -38,7 +39,6 @@ | |||
38 | #include <asm/xcr.h> | 39 | #include <asm/xcr.h> |
39 | #include <asm/xsave.h> | 40 | #include <asm/xsave.h> |
40 | #include <asm/crypto/serpent-avx.h> | 41 | #include <asm/crypto/serpent-avx.h> |
41 | #include <asm/crypto/ablk_helper.h> | ||
42 | #include <asm/crypto/glue_helper.h> | 42 | #include <asm/crypto/glue_helper.h> |
43 | 43 | ||
44 | /* 8-way parallel cipher functions */ | 44 | /* 8-way parallel cipher functions */ |
diff --git a/arch/x86/crypto/serpent_sse2_glue.c b/arch/x86/crypto/serpent_sse2_glue.c index 97a356ece24d..8c95f8637306 100644 --- a/arch/x86/crypto/serpent_sse2_glue.c +++ b/arch/x86/crypto/serpent_sse2_glue.c | |||
@@ -34,6 +34,7 @@ | |||
34 | #include <linux/types.h> | 34 | #include <linux/types.h> |
35 | #include <linux/crypto.h> | 35 | #include <linux/crypto.h> |
36 | #include <linux/err.h> | 36 | #include <linux/err.h> |
37 | #include <crypto/ablk_helper.h> | ||
37 | #include <crypto/algapi.h> | 38 | #include <crypto/algapi.h> |
38 | #include <crypto/serpent.h> | 39 | #include <crypto/serpent.h> |
39 | #include <crypto/cryptd.h> | 40 | #include <crypto/cryptd.h> |
@@ -42,7 +43,6 @@ | |||
42 | #include <crypto/lrw.h> | 43 | #include <crypto/lrw.h> |
43 | #include <crypto/xts.h> | 44 | #include <crypto/xts.h> |
44 | #include <asm/crypto/serpent-sse2.h> | 45 | #include <asm/crypto/serpent-sse2.h> |
45 | #include <asm/crypto/ablk_helper.h> | ||
46 | #include <asm/crypto/glue_helper.h> | 46 | #include <asm/crypto/glue_helper.h> |
47 | 47 | ||
48 | static void serpent_decrypt_cbc_xway(void *ctx, u128 *dst, const u128 *src) | 48 | static void serpent_decrypt_cbc_xway(void *ctx, u128 *dst, const u128 *src) |
diff --git a/arch/x86/crypto/sha256_ssse3_glue.c b/arch/x86/crypto/sha256_ssse3_glue.c index 50226c4b86ed..f248546da1ca 100644 --- a/arch/x86/crypto/sha256_ssse3_glue.c +++ b/arch/x86/crypto/sha256_ssse3_glue.c | |||
@@ -281,7 +281,7 @@ static int __init sha256_ssse3_mod_init(void) | |||
281 | /* allow AVX to override SSSE3, it's a little faster */ | 281 | /* allow AVX to override SSSE3, it's a little faster */ |
282 | if (avx_usable()) { | 282 | if (avx_usable()) { |
283 | #ifdef CONFIG_AS_AVX2 | 283 | #ifdef CONFIG_AS_AVX2 |
284 | if (boot_cpu_has(X86_FEATURE_AVX2)) | 284 | if (boot_cpu_has(X86_FEATURE_AVX2) && boot_cpu_has(X86_FEATURE_BMI2)) |
285 | sha256_transform_asm = sha256_transform_rorx; | 285 | sha256_transform_asm = sha256_transform_rorx; |
286 | else | 286 | else |
287 | #endif | 287 | #endif |
@@ -319,4 +319,4 @@ MODULE_LICENSE("GPL"); | |||
319 | MODULE_DESCRIPTION("SHA256 Secure Hash Algorithm, Supplemental SSE3 accelerated"); | 319 | MODULE_DESCRIPTION("SHA256 Secure Hash Algorithm, Supplemental SSE3 accelerated"); |
320 | 320 | ||
321 | MODULE_ALIAS("sha256"); | 321 | MODULE_ALIAS("sha256"); |
322 | MODULE_ALIAS("sha384"); | 322 | MODULE_ALIAS("sha224"); |
diff --git a/arch/x86/crypto/twofish_avx_glue.c b/arch/x86/crypto/twofish_avx_glue.c index a62ba541884e..4e3c665be129 100644 --- a/arch/x86/crypto/twofish_avx_glue.c +++ b/arch/x86/crypto/twofish_avx_glue.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/types.h> | 28 | #include <linux/types.h> |
29 | #include <linux/crypto.h> | 29 | #include <linux/crypto.h> |
30 | #include <linux/err.h> | 30 | #include <linux/err.h> |
31 | #include <crypto/ablk_helper.h> | ||
31 | #include <crypto/algapi.h> | 32 | #include <crypto/algapi.h> |
32 | #include <crypto/twofish.h> | 33 | #include <crypto/twofish.h> |
33 | #include <crypto/cryptd.h> | 34 | #include <crypto/cryptd.h> |
@@ -39,7 +40,6 @@ | |||
39 | #include <asm/xcr.h> | 40 | #include <asm/xcr.h> |
40 | #include <asm/xsave.h> | 41 | #include <asm/xsave.h> |
41 | #include <asm/crypto/twofish.h> | 42 | #include <asm/crypto/twofish.h> |
42 | #include <asm/crypto/ablk_helper.h> | ||
43 | #include <asm/crypto/glue_helper.h> | 43 | #include <asm/crypto/glue_helper.h> |
44 | #include <crypto/scatterwalk.h> | 44 | #include <crypto/scatterwalk.h> |
45 | #include <linux/workqueue.h> | 45 | #include <linux/workqueue.h> |
diff --git a/arch/x86/include/asm/archrandom.h b/arch/x86/include/asm/archrandom.h index 0d9ec770f2f8..e6a92455740e 100644 --- a/arch/x86/include/asm/archrandom.h +++ b/arch/x86/include/asm/archrandom.h | |||
@@ -39,6 +39,20 @@ | |||
39 | 39 | ||
40 | #ifdef CONFIG_ARCH_RANDOM | 40 | #ifdef CONFIG_ARCH_RANDOM |
41 | 41 | ||
42 | /* Instead of arch_get_random_long() when alternatives haven't run. */ | ||
43 | static inline int rdrand_long(unsigned long *v) | ||
44 | { | ||
45 | int ok; | ||
46 | asm volatile("1: " RDRAND_LONG "\n\t" | ||
47 | "jc 2f\n\t" | ||
48 | "decl %0\n\t" | ||
49 | "jnz 1b\n\t" | ||
50 | "2:" | ||
51 | : "=r" (ok), "=a" (*v) | ||
52 | : "0" (RDRAND_RETRY_LOOPS)); | ||
53 | return ok; | ||
54 | } | ||
55 | |||
42 | #define GET_RANDOM(name, type, rdrand, nop) \ | 56 | #define GET_RANDOM(name, type, rdrand, nop) \ |
43 | static inline int name(type *v) \ | 57 | static inline int name(type *v) \ |
44 | { \ | 58 | { \ |
@@ -68,6 +82,13 @@ GET_RANDOM(arch_get_random_int, unsigned int, RDRAND_INT, ASM_NOP3); | |||
68 | 82 | ||
69 | #endif /* CONFIG_X86_64 */ | 83 | #endif /* CONFIG_X86_64 */ |
70 | 84 | ||
85 | #else | ||
86 | |||
87 | static inline int rdrand_long(unsigned long *v) | ||
88 | { | ||
89 | return 0; | ||
90 | } | ||
91 | |||
71 | #endif /* CONFIG_ARCH_RANDOM */ | 92 | #endif /* CONFIG_ARCH_RANDOM */ |
72 | 93 | ||
73 | extern void x86_init_rdrand(struct cpuinfo_x86 *c); | 94 | extern void x86_init_rdrand(struct cpuinfo_x86 *c); |
diff --git a/arch/x86/include/asm/atomic.h b/arch/x86/include/asm/atomic.h index da31c8b8a92d..b17f4f48ecd7 100644 --- a/arch/x86/include/asm/atomic.h +++ b/arch/x86/include/asm/atomic.h | |||
@@ -77,7 +77,7 @@ static inline void atomic_sub(int i, atomic_t *v) | |||
77 | */ | 77 | */ |
78 | static inline int atomic_sub_and_test(int i, atomic_t *v) | 78 | static inline int atomic_sub_and_test(int i, atomic_t *v) |
79 | { | 79 | { |
80 | GEN_BINARY_RMWcc(LOCK_PREFIX "subl", v->counter, i, "%0", "e"); | 80 | GEN_BINARY_RMWcc(LOCK_PREFIX "subl", v->counter, "er", i, "%0", "e"); |
81 | } | 81 | } |
82 | 82 | ||
83 | /** | 83 | /** |
@@ -141,7 +141,7 @@ static inline int atomic_inc_and_test(atomic_t *v) | |||
141 | */ | 141 | */ |
142 | static inline int atomic_add_negative(int i, atomic_t *v) | 142 | static inline int atomic_add_negative(int i, atomic_t *v) |
143 | { | 143 | { |
144 | GEN_BINARY_RMWcc(LOCK_PREFIX "addl", v->counter, i, "%0", "s"); | 144 | GEN_BINARY_RMWcc(LOCK_PREFIX "addl", v->counter, "er", i, "%0", "s"); |
145 | } | 145 | } |
146 | 146 | ||
147 | /** | 147 | /** |
diff --git a/arch/x86/include/asm/atomic64_64.h b/arch/x86/include/asm/atomic64_64.h index 3f065c985aee..46e9052bbd28 100644 --- a/arch/x86/include/asm/atomic64_64.h +++ b/arch/x86/include/asm/atomic64_64.h | |||
@@ -72,7 +72,7 @@ static inline void atomic64_sub(long i, atomic64_t *v) | |||
72 | */ | 72 | */ |
73 | static inline int atomic64_sub_and_test(long i, atomic64_t *v) | 73 | static inline int atomic64_sub_and_test(long i, atomic64_t *v) |
74 | { | 74 | { |
75 | GEN_BINARY_RMWcc(LOCK_PREFIX "subq", v->counter, i, "%0", "e"); | 75 | GEN_BINARY_RMWcc(LOCK_PREFIX "subq", v->counter, "er", i, "%0", "e"); |
76 | } | 76 | } |
77 | 77 | ||
78 | /** | 78 | /** |
@@ -138,7 +138,7 @@ static inline int atomic64_inc_and_test(atomic64_t *v) | |||
138 | */ | 138 | */ |
139 | static inline int atomic64_add_negative(long i, atomic64_t *v) | 139 | static inline int atomic64_add_negative(long i, atomic64_t *v) |
140 | { | 140 | { |
141 | GEN_BINARY_RMWcc(LOCK_PREFIX "addq", v->counter, i, "%0", "s"); | 141 | GEN_BINARY_RMWcc(LOCK_PREFIX "addq", v->counter, "er", i, "%0", "s"); |
142 | } | 142 | } |
143 | 143 | ||
144 | /** | 144 | /** |
diff --git a/arch/x86/include/asm/barrier.h b/arch/x86/include/asm/barrier.h index c6cd358a1eec..04a48903b2eb 100644 --- a/arch/x86/include/asm/barrier.h +++ b/arch/x86/include/asm/barrier.h | |||
@@ -92,12 +92,53 @@ | |||
92 | #endif | 92 | #endif |
93 | #define smp_read_barrier_depends() read_barrier_depends() | 93 | #define smp_read_barrier_depends() read_barrier_depends() |
94 | #define set_mb(var, value) do { (void)xchg(&var, value); } while (0) | 94 | #define set_mb(var, value) do { (void)xchg(&var, value); } while (0) |
95 | #else | 95 | #else /* !SMP */ |
96 | #define smp_mb() barrier() | 96 | #define smp_mb() barrier() |
97 | #define smp_rmb() barrier() | 97 | #define smp_rmb() barrier() |
98 | #define smp_wmb() barrier() | 98 | #define smp_wmb() barrier() |
99 | #define smp_read_barrier_depends() do { } while (0) | 99 | #define smp_read_barrier_depends() do { } while (0) |
100 | #define set_mb(var, value) do { var = value; barrier(); } while (0) | 100 | #define set_mb(var, value) do { var = value; barrier(); } while (0) |
101 | #endif /* SMP */ | ||
102 | |||
103 | #if defined(CONFIG_X86_OOSTORE) || defined(CONFIG_X86_PPRO_FENCE) | ||
104 | |||
105 | /* | ||
106 | * For either of these options x86 doesn't have a strong TSO memory | ||
107 | * model and we should fall back to full barriers. | ||
108 | */ | ||
109 | |||
110 | #define smp_store_release(p, v) \ | ||
111 | do { \ | ||
112 | compiletime_assert_atomic_type(*p); \ | ||
113 | smp_mb(); \ | ||
114 | ACCESS_ONCE(*p) = (v); \ | ||
115 | } while (0) | ||
116 | |||
117 | #define smp_load_acquire(p) \ | ||
118 | ({ \ | ||
119 | typeof(*p) ___p1 = ACCESS_ONCE(*p); \ | ||
120 | compiletime_assert_atomic_type(*p); \ | ||
121 | smp_mb(); \ | ||
122 | ___p1; \ | ||
123 | }) | ||
124 | |||
125 | #else /* regular x86 TSO memory ordering */ | ||
126 | |||
127 | #define smp_store_release(p, v) \ | ||
128 | do { \ | ||
129 | compiletime_assert_atomic_type(*p); \ | ||
130 | barrier(); \ | ||
131 | ACCESS_ONCE(*p) = (v); \ | ||
132 | } while (0) | ||
133 | |||
134 | #define smp_load_acquire(p) \ | ||
135 | ({ \ | ||
136 | typeof(*p) ___p1 = ACCESS_ONCE(*p); \ | ||
137 | compiletime_assert_atomic_type(*p); \ | ||
138 | barrier(); \ | ||
139 | ___p1; \ | ||
140 | }) | ||
141 | |||
101 | #endif | 142 | #endif |
102 | 143 | ||
103 | /* | 144 | /* |
diff --git a/arch/x86/include/asm/bitops.h b/arch/x86/include/asm/bitops.h index 6d76d0935989..9fc1af74dc83 100644 --- a/arch/x86/include/asm/bitops.h +++ b/arch/x86/include/asm/bitops.h | |||
@@ -205,7 +205,7 @@ static inline void change_bit(long nr, volatile unsigned long *addr) | |||
205 | */ | 205 | */ |
206 | static inline int test_and_set_bit(long nr, volatile unsigned long *addr) | 206 | static inline int test_and_set_bit(long nr, volatile unsigned long *addr) |
207 | { | 207 | { |
208 | GEN_BINARY_RMWcc(LOCK_PREFIX "bts", *addr, nr, "%0", "c"); | 208 | GEN_BINARY_RMWcc(LOCK_PREFIX "bts", *addr, "Ir", nr, "%0", "c"); |
209 | } | 209 | } |
210 | 210 | ||
211 | /** | 211 | /** |
@@ -251,7 +251,7 @@ static inline int __test_and_set_bit(long nr, volatile unsigned long *addr) | |||
251 | */ | 251 | */ |
252 | static inline int test_and_clear_bit(long nr, volatile unsigned long *addr) | 252 | static inline int test_and_clear_bit(long nr, volatile unsigned long *addr) |
253 | { | 253 | { |
254 | GEN_BINARY_RMWcc(LOCK_PREFIX "btr", *addr, nr, "%0", "c"); | 254 | GEN_BINARY_RMWcc(LOCK_PREFIX "btr", *addr, "Ir", nr, "%0", "c"); |
255 | } | 255 | } |
256 | 256 | ||
257 | /** | 257 | /** |
@@ -304,7 +304,7 @@ static inline int __test_and_change_bit(long nr, volatile unsigned long *addr) | |||
304 | */ | 304 | */ |
305 | static inline int test_and_change_bit(long nr, volatile unsigned long *addr) | 305 | static inline int test_and_change_bit(long nr, volatile unsigned long *addr) |
306 | { | 306 | { |
307 | GEN_BINARY_RMWcc(LOCK_PREFIX "btc", *addr, nr, "%0", "c"); | 307 | GEN_BINARY_RMWcc(LOCK_PREFIX "btc", *addr, "Ir", nr, "%0", "c"); |
308 | } | 308 | } |
309 | 309 | ||
310 | static __always_inline int constant_test_bit(long nr, const volatile unsigned long *addr) | 310 | static __always_inline int constant_test_bit(long nr, const volatile unsigned long *addr) |
diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h index 89270b4318db..e099f9502ace 100644 --- a/arch/x86/include/asm/cpufeature.h +++ b/arch/x86/include/asm/cpufeature.h | |||
@@ -216,6 +216,7 @@ | |||
216 | #define X86_FEATURE_ERMS (9*32+ 9) /* Enhanced REP MOVSB/STOSB */ | 216 | #define X86_FEATURE_ERMS (9*32+ 9) /* Enhanced REP MOVSB/STOSB */ |
217 | #define X86_FEATURE_INVPCID (9*32+10) /* Invalidate Processor Context ID */ | 217 | #define X86_FEATURE_INVPCID (9*32+10) /* Invalidate Processor Context ID */ |
218 | #define X86_FEATURE_RTM (9*32+11) /* Restricted Transactional Memory */ | 218 | #define X86_FEATURE_RTM (9*32+11) /* Restricted Transactional Memory */ |
219 | #define X86_FEATURE_MPX (9*32+14) /* Memory Protection Extension */ | ||
219 | #define X86_FEATURE_RDSEED (9*32+18) /* The RDSEED instruction */ | 220 | #define X86_FEATURE_RDSEED (9*32+18) /* The RDSEED instruction */ |
220 | #define X86_FEATURE_ADX (9*32+19) /* The ADCX and ADOX instructions */ | 221 | #define X86_FEATURE_ADX (9*32+19) /* The ADCX and ADOX instructions */ |
221 | #define X86_FEATURE_SMAP (9*32+20) /* Supervisor Mode Access Prevention */ | 222 | #define X86_FEATURE_SMAP (9*32+20) /* Supervisor Mode Access Prevention */ |
diff --git a/arch/x86/include/asm/crypto/ablk_helper.h b/arch/x86/include/asm/crypto/ablk_helper.h deleted file mode 100644 index 4f93df50c23e..000000000000 --- a/arch/x86/include/asm/crypto/ablk_helper.h +++ /dev/null | |||
@@ -1,31 +0,0 @@ | |||
1 | /* | ||
2 | * Shared async block cipher helpers | ||
3 | */ | ||
4 | |||
5 | #ifndef _CRYPTO_ABLK_HELPER_H | ||
6 | #define _CRYPTO_ABLK_HELPER_H | ||
7 | |||
8 | #include <linux/crypto.h> | ||
9 | #include <linux/kernel.h> | ||
10 | #include <crypto/cryptd.h> | ||
11 | |||
12 | struct async_helper_ctx { | ||
13 | struct cryptd_ablkcipher *cryptd_tfm; | ||
14 | }; | ||
15 | |||
16 | extern int ablk_set_key(struct crypto_ablkcipher *tfm, const u8 *key, | ||
17 | unsigned int key_len); | ||
18 | |||
19 | extern int __ablk_encrypt(struct ablkcipher_request *req); | ||
20 | |||
21 | extern int ablk_encrypt(struct ablkcipher_request *req); | ||
22 | |||
23 | extern int ablk_decrypt(struct ablkcipher_request *req); | ||
24 | |||
25 | extern void ablk_exit(struct crypto_tfm *tfm); | ||
26 | |||
27 | extern int ablk_init_common(struct crypto_tfm *tfm, const char *drv_name); | ||
28 | |||
29 | extern int ablk_init(struct crypto_tfm *tfm); | ||
30 | |||
31 | #endif /* _CRYPTO_ABLK_HELPER_H */ | ||
diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h index 65c6e6e3a552..3b978c472d08 100644 --- a/arch/x86/include/asm/efi.h +++ b/arch/x86/include/asm/efi.h | |||
@@ -1,6 +1,24 @@ | |||
1 | #ifndef _ASM_X86_EFI_H | 1 | #ifndef _ASM_X86_EFI_H |
2 | #define _ASM_X86_EFI_H | 2 | #define _ASM_X86_EFI_H |
3 | 3 | ||
4 | /* | ||
5 | * We map the EFI regions needed for runtime services non-contiguously, | ||
6 | * with preserved alignment on virtual addresses starting from -4G down | ||
7 | * for a total max space of 64G. This way, we provide for stable runtime | ||
8 | * services addresses across kernels so that a kexec'd kernel can still | ||
9 | * use them. | ||
10 | * | ||
11 | * This is the main reason why we're doing stable VA mappings for RT | ||
12 | * services. | ||
13 | * | ||
14 | * This flag is used in conjuction with a chicken bit called | ||
15 | * "efi=old_map" which can be used as a fallback to the old runtime | ||
16 | * services mapping method in case there's some b0rkage with a | ||
17 | * particular EFI implementation (haha, it is hard to hold up the | ||
18 | * sarcasm here...). | ||
19 | */ | ||
20 | #define EFI_OLD_MEMMAP EFI_ARCH_1 | ||
21 | |||
4 | #ifdef CONFIG_X86_32 | 22 | #ifdef CONFIG_X86_32 |
5 | 23 | ||
6 | #define EFI_LOADER_SIGNATURE "EL32" | 24 | #define EFI_LOADER_SIGNATURE "EL32" |
@@ -69,24 +87,31 @@ extern u64 efi_call6(void *fp, u64 arg1, u64 arg2, u64 arg3, | |||
69 | efi_call6((f), (u64)(a1), (u64)(a2), (u64)(a3), \ | 87 | efi_call6((f), (u64)(a1), (u64)(a2), (u64)(a3), \ |
70 | (u64)(a4), (u64)(a5), (u64)(a6)) | 88 | (u64)(a4), (u64)(a5), (u64)(a6)) |
71 | 89 | ||
90 | #define _efi_call_virtX(x, f, ...) \ | ||
91 | ({ \ | ||
92 | efi_status_t __s; \ | ||
93 | \ | ||
94 | efi_sync_low_kernel_mappings(); \ | ||
95 | preempt_disable(); \ | ||
96 | __s = efi_call##x((void *)efi.systab->runtime->f, __VA_ARGS__); \ | ||
97 | preempt_enable(); \ | ||
98 | __s; \ | ||
99 | }) | ||
100 | |||
72 | #define efi_call_virt0(f) \ | 101 | #define efi_call_virt0(f) \ |
73 | efi_call0((efi.systab->runtime->f)) | 102 | _efi_call_virtX(0, f) |
74 | #define efi_call_virt1(f, a1) \ | 103 | #define efi_call_virt1(f, a1) \ |
75 | efi_call1((efi.systab->runtime->f), (u64)(a1)) | 104 | _efi_call_virtX(1, f, (u64)(a1)) |
76 | #define efi_call_virt2(f, a1, a2) \ | 105 | #define efi_call_virt2(f, a1, a2) \ |
77 | efi_call2((efi.systab->runtime->f), (u64)(a1), (u64)(a2)) | 106 | _efi_call_virtX(2, f, (u64)(a1), (u64)(a2)) |
78 | #define efi_call_virt3(f, a1, a2, a3) \ | 107 | #define efi_call_virt3(f, a1, a2, a3) \ |
79 | efi_call3((efi.systab->runtime->f), (u64)(a1), (u64)(a2), \ | 108 | _efi_call_virtX(3, f, (u64)(a1), (u64)(a2), (u64)(a3)) |
80 | (u64)(a3)) | 109 | #define efi_call_virt4(f, a1, a2, a3, a4) \ |
81 | #define efi_call_virt4(f, a1, a2, a3, a4) \ | 110 | _efi_call_virtX(4, f, (u64)(a1), (u64)(a2), (u64)(a3), (u64)(a4)) |
82 | efi_call4((efi.systab->runtime->f), (u64)(a1), (u64)(a2), \ | 111 | #define efi_call_virt5(f, a1, a2, a3, a4, a5) \ |
83 | (u64)(a3), (u64)(a4)) | 112 | _efi_call_virtX(5, f, (u64)(a1), (u64)(a2), (u64)(a3), (u64)(a4), (u64)(a5)) |
84 | #define efi_call_virt5(f, a1, a2, a3, a4, a5) \ | 113 | #define efi_call_virt6(f, a1, a2, a3, a4, a5, a6) \ |
85 | efi_call5((efi.systab->runtime->f), (u64)(a1), (u64)(a2), \ | 114 | _efi_call_virtX(6, f, (u64)(a1), (u64)(a2), (u64)(a3), (u64)(a4), (u64)(a5), (u64)(a6)) |
86 | (u64)(a3), (u64)(a4), (u64)(a5)) | ||
87 | #define efi_call_virt6(f, a1, a2, a3, a4, a5, a6) \ | ||
88 | efi_call6((efi.systab->runtime->f), (u64)(a1), (u64)(a2), \ | ||
89 | (u64)(a3), (u64)(a4), (u64)(a5), (u64)(a6)) | ||
90 | 115 | ||
91 | extern void __iomem *efi_ioremap(unsigned long addr, unsigned long size, | 116 | extern void __iomem *efi_ioremap(unsigned long addr, unsigned long size, |
92 | u32 type, u64 attribute); | 117 | u32 type, u64 attribute); |
@@ -95,12 +120,28 @@ extern void __iomem *efi_ioremap(unsigned long addr, unsigned long size, | |||
95 | 120 | ||
96 | extern int add_efi_memmap; | 121 | extern int add_efi_memmap; |
97 | extern unsigned long x86_efi_facility; | 122 | extern unsigned long x86_efi_facility; |
123 | extern struct efi_scratch efi_scratch; | ||
98 | extern void efi_set_executable(efi_memory_desc_t *md, bool executable); | 124 | extern void efi_set_executable(efi_memory_desc_t *md, bool executable); |
99 | extern int efi_memblock_x86_reserve_range(void); | 125 | extern int efi_memblock_x86_reserve_range(void); |
100 | extern void efi_call_phys_prelog(void); | 126 | extern void efi_call_phys_prelog(void); |
101 | extern void efi_call_phys_epilog(void); | 127 | extern void efi_call_phys_epilog(void); |
102 | extern void efi_unmap_memmap(void); | 128 | extern void efi_unmap_memmap(void); |
103 | extern void efi_memory_uc(u64 addr, unsigned long size); | 129 | extern void efi_memory_uc(u64 addr, unsigned long size); |
130 | extern void __init efi_map_region(efi_memory_desc_t *md); | ||
131 | extern void __init efi_map_region_fixed(efi_memory_desc_t *md); | ||
132 | extern void efi_sync_low_kernel_mappings(void); | ||
133 | extern void efi_setup_page_tables(void); | ||
134 | extern void __init old_map_region(efi_memory_desc_t *md); | ||
135 | |||
136 | struct efi_setup_data { | ||
137 | u64 fw_vendor; | ||
138 | u64 runtime; | ||
139 | u64 tables; | ||
140 | u64 smbios; | ||
141 | u64 reserved[8]; | ||
142 | }; | ||
143 | |||
144 | extern u64 efi_setup; | ||
104 | 145 | ||
105 | #ifdef CONFIG_EFI | 146 | #ifdef CONFIG_EFI |
106 | 147 | ||
@@ -110,7 +151,7 @@ static inline bool efi_is_native(void) | |||
110 | } | 151 | } |
111 | 152 | ||
112 | extern struct console early_efi_console; | 153 | extern struct console early_efi_console; |
113 | 154 | extern void parse_efi_setup(u64 phys_addr, u32 data_len); | |
114 | #else | 155 | #else |
115 | /* | 156 | /* |
116 | * IF EFI is not configured, have the EFI calls return -ENOSYS. | 157 | * IF EFI is not configured, have the EFI calls return -ENOSYS. |
@@ -122,6 +163,7 @@ extern struct console early_efi_console; | |||
122 | #define efi_call4(_f, _a1, _a2, _a3, _a4) (-ENOSYS) | 163 | #define efi_call4(_f, _a1, _a2, _a3, _a4) (-ENOSYS) |
123 | #define efi_call5(_f, _a1, _a2, _a3, _a4, _a5) (-ENOSYS) | 164 | #define efi_call5(_f, _a1, _a2, _a3, _a4, _a5) (-ENOSYS) |
124 | #define efi_call6(_f, _a1, _a2, _a3, _a4, _a5, _a6) (-ENOSYS) | 165 | #define efi_call6(_f, _a1, _a2, _a3, _a4, _a5, _a6) (-ENOSYS) |
166 | static inline void parse_efi_setup(u64 phys_addr, u32 data_len) {} | ||
125 | #endif /* CONFIG_EFI */ | 167 | #endif /* CONFIG_EFI */ |
126 | 168 | ||
127 | #endif /* _ASM_X86_EFI_H */ | 169 | #endif /* _ASM_X86_EFI_H */ |
diff --git a/arch/x86/include/asm/fpu-internal.h b/arch/x86/include/asm/fpu-internal.h index c49a613c6452..cea1c76d49bf 100644 --- a/arch/x86/include/asm/fpu-internal.h +++ b/arch/x86/include/asm/fpu-internal.h | |||
@@ -293,12 +293,13 @@ static inline int restore_fpu_checking(struct task_struct *tsk) | |||
293 | /* AMD K7/K8 CPUs don't save/restore FDP/FIP/FOP unless an exception | 293 | /* AMD K7/K8 CPUs don't save/restore FDP/FIP/FOP unless an exception |
294 | is pending. Clear the x87 state here by setting it to fixed | 294 | is pending. Clear the x87 state here by setting it to fixed |
295 | values. "m" is a random variable that should be in L1 */ | 295 | values. "m" is a random variable that should be in L1 */ |
296 | alternative_input( | 296 | if (unlikely(static_cpu_has(X86_FEATURE_FXSAVE_LEAK))) { |
297 | ASM_NOP8 ASM_NOP2, | 297 | asm volatile( |
298 | "emms\n\t" /* clear stack tags */ | 298 | "fnclex\n\t" |
299 | "fildl %P[addr]", /* set F?P to defined value */ | 299 | "emms\n\t" |
300 | X86_FEATURE_FXSAVE_LEAK, | 300 | "fildl %P[addr]" /* set F?P to defined value */ |
301 | [addr] "m" (tsk->thread.fpu.has_fpu)); | 301 | : : [addr] "m" (tsk->thread.fpu.has_fpu)); |
302 | } | ||
302 | 303 | ||
303 | return fpu_restore_checking(&tsk->thread.fpu); | 304 | return fpu_restore_checking(&tsk->thread.fpu); |
304 | } | 305 | } |
diff --git a/arch/x86/include/asm/futex.h b/arch/x86/include/asm/futex.h index be27ba1e947a..b4c1f5453436 100644 --- a/arch/x86/include/asm/futex.h +++ b/arch/x86/include/asm/futex.h | |||
@@ -110,26 +110,7 @@ static inline int futex_atomic_op_inuser(int encoded_op, u32 __user *uaddr) | |||
110 | static inline int futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, | 110 | static inline int futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, |
111 | u32 oldval, u32 newval) | 111 | u32 oldval, u32 newval) |
112 | { | 112 | { |
113 | int ret = 0; | 113 | return user_atomic_cmpxchg_inatomic(uval, uaddr, oldval, newval); |
114 | |||
115 | if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32))) | ||
116 | return -EFAULT; | ||
117 | |||
118 | asm volatile("\t" ASM_STAC "\n" | ||
119 | "1:\t" LOCK_PREFIX "cmpxchgl %4, %2\n" | ||
120 | "2:\t" ASM_CLAC "\n" | ||
121 | "\t.section .fixup, \"ax\"\n" | ||
122 | "3:\tmov %3, %0\n" | ||
123 | "\tjmp 2b\n" | ||
124 | "\t.previous\n" | ||
125 | _ASM_EXTABLE(1b, 3b) | ||
126 | : "+r" (ret), "=a" (oldval), "+m" (*uaddr) | ||
127 | : "i" (-EFAULT), "r" (newval), "1" (oldval) | ||
128 | : "memory" | ||
129 | ); | ||
130 | |||
131 | *uval = oldval; | ||
132 | return ret; | ||
133 | } | 114 | } |
134 | 115 | ||
135 | #endif | 116 | #endif |
diff --git a/arch/x86/include/asm/hw_irq.h b/arch/x86/include/asm/hw_irq.h index cba45d99ac1a..67d69b8e2d20 100644 --- a/arch/x86/include/asm/hw_irq.h +++ b/arch/x86/include/asm/hw_irq.h | |||
@@ -191,6 +191,9 @@ extern void (*__initconst interrupt[NR_VECTORS-FIRST_EXTERNAL_VECTOR])(void); | |||
191 | #define trace_interrupt interrupt | 191 | #define trace_interrupt interrupt |
192 | #endif | 192 | #endif |
193 | 193 | ||
194 | #define VECTOR_UNDEFINED -1 | ||
195 | #define VECTOR_RETRIGGERED -2 | ||
196 | |||
194 | typedef int vector_irq_t[NR_VECTORS]; | 197 | typedef int vector_irq_t[NR_VECTORS]; |
195 | DECLARE_PER_CPU(vector_irq_t, vector_irq); | 198 | DECLARE_PER_CPU(vector_irq_t, vector_irq); |
196 | extern void setup_vector_irq(int cpu); | 199 | extern void setup_vector_irq(int cpu); |
diff --git a/arch/x86/include/asm/intel-mid.h b/arch/x86/include/asm/intel-mid.h index 459769d39263..e34e097b6f9d 100644 --- a/arch/x86/include/asm/intel-mid.h +++ b/arch/x86/include/asm/intel-mid.h | |||
@@ -51,10 +51,41 @@ struct devs_id { | |||
51 | enum intel_mid_cpu_type { | 51 | enum intel_mid_cpu_type { |
52 | /* 1 was Moorestown */ | 52 | /* 1 was Moorestown */ |
53 | INTEL_MID_CPU_CHIP_PENWELL = 2, | 53 | INTEL_MID_CPU_CHIP_PENWELL = 2, |
54 | INTEL_MID_CPU_CHIP_CLOVERVIEW, | ||
55 | INTEL_MID_CPU_CHIP_TANGIER, | ||
54 | }; | 56 | }; |
55 | 57 | ||
56 | extern enum intel_mid_cpu_type __intel_mid_cpu_chip; | 58 | extern enum intel_mid_cpu_type __intel_mid_cpu_chip; |
57 | 59 | ||
60 | /** | ||
61 | * struct intel_mid_ops - Interface between intel-mid & sub archs | ||
62 | * @arch_setup: arch_setup function to re-initialize platform | ||
63 | * structures (x86_init, x86_platform_init) | ||
64 | * | ||
65 | * This structure can be extended if any new interface is required | ||
66 | * between intel-mid & its sub arch files. | ||
67 | */ | ||
68 | struct intel_mid_ops { | ||
69 | void (*arch_setup)(void); | ||
70 | }; | ||
71 | |||
72 | /* Helper API's for INTEL_MID_OPS_INIT */ | ||
73 | #define DECLARE_INTEL_MID_OPS_INIT(cpuname, cpuid) \ | ||
74 | [cpuid] = get_##cpuname##_ops | ||
75 | |||
76 | /* Maximum number of CPU ops */ | ||
77 | #define MAX_CPU_OPS(a) (sizeof(a)/sizeof(void *)) | ||
78 | |||
79 | /* | ||
80 | * For every new cpu addition, a weak get_<cpuname>_ops() function needs be | ||
81 | * declared in arch/x86/platform/intel_mid/intel_mid_weak_decls.h. | ||
82 | */ | ||
83 | #define INTEL_MID_OPS_INIT {\ | ||
84 | DECLARE_INTEL_MID_OPS_INIT(penwell, INTEL_MID_CPU_CHIP_PENWELL), \ | ||
85 | DECLARE_INTEL_MID_OPS_INIT(cloverview, INTEL_MID_CPU_CHIP_CLOVERVIEW), \ | ||
86 | DECLARE_INTEL_MID_OPS_INIT(tangier, INTEL_MID_CPU_CHIP_TANGIER) \ | ||
87 | }; | ||
88 | |||
58 | #ifdef CONFIG_X86_INTEL_MID | 89 | #ifdef CONFIG_X86_INTEL_MID |
59 | 90 | ||
60 | static inline enum intel_mid_cpu_type intel_mid_identify_cpu(void) | 91 | static inline enum intel_mid_cpu_type intel_mid_identify_cpu(void) |
@@ -86,8 +117,21 @@ extern enum intel_mid_timer_options intel_mid_timer_options; | |||
86 | * Penwell uses spread spectrum clock, so the freq number is not exactly | 117 | * Penwell uses spread spectrum clock, so the freq number is not exactly |
87 | * the same as reported by MSR based on SDM. | 118 | * the same as reported by MSR based on SDM. |
88 | */ | 119 | */ |
89 | #define PENWELL_FSB_FREQ_83SKU 83200 | 120 | #define FSB_FREQ_83SKU 83200 |
90 | #define PENWELL_FSB_FREQ_100SKU 99840 | 121 | #define FSB_FREQ_100SKU 99840 |
122 | #define FSB_FREQ_133SKU 133000 | ||
123 | |||
124 | #define FSB_FREQ_167SKU 167000 | ||
125 | #define FSB_FREQ_200SKU 200000 | ||
126 | #define FSB_FREQ_267SKU 267000 | ||
127 | #define FSB_FREQ_333SKU 333000 | ||
128 | #define FSB_FREQ_400SKU 400000 | ||
129 | |||
130 | /* Bus Select SoC Fuse value */ | ||
131 | #define BSEL_SOC_FUSE_MASK 0x7 | ||
132 | #define BSEL_SOC_FUSE_001 0x1 /* FSB 133MHz */ | ||
133 | #define BSEL_SOC_FUSE_101 0x5 /* FSB 100MHz */ | ||
134 | #define BSEL_SOC_FUSE_111 0x7 /* FSB 83MHz */ | ||
91 | 135 | ||
92 | #define SFI_MTMR_MAX_NUM 8 | 136 | #define SFI_MTMR_MAX_NUM 8 |
93 | #define SFI_MRTC_MAX 8 | 137 | #define SFI_MRTC_MAX 8 |
diff --git a/arch/x86/include/asm/iosf_mbi.h b/arch/x86/include/asm/iosf_mbi.h new file mode 100644 index 000000000000..8e71c7941767 --- /dev/null +++ b/arch/x86/include/asm/iosf_mbi.h | |||
@@ -0,0 +1,90 @@ | |||
1 | /* | ||
2 | * iosf_mbi.h: Intel OnChip System Fabric MailBox access support | ||
3 | */ | ||
4 | |||
5 | #ifndef IOSF_MBI_SYMS_H | ||
6 | #define IOSF_MBI_SYMS_H | ||
7 | |||
8 | #define MBI_MCR_OFFSET 0xD0 | ||
9 | #define MBI_MDR_OFFSET 0xD4 | ||
10 | #define MBI_MCRX_OFFSET 0xD8 | ||
11 | |||
12 | #define MBI_RD_MASK 0xFEFFFFFF | ||
13 | #define MBI_WR_MASK 0X01000000 | ||
14 | |||
15 | #define MBI_MASK_HI 0xFFFFFF00 | ||
16 | #define MBI_MASK_LO 0x000000FF | ||
17 | #define MBI_ENABLE 0xF0 | ||
18 | |||
19 | /* Baytrail available units */ | ||
20 | #define BT_MBI_UNIT_AUNIT 0x00 | ||
21 | #define BT_MBI_UNIT_SMC 0x01 | ||
22 | #define BT_MBI_UNIT_CPU 0x02 | ||
23 | #define BT_MBI_UNIT_BUNIT 0x03 | ||
24 | #define BT_MBI_UNIT_PMC 0x04 | ||
25 | #define BT_MBI_UNIT_GFX 0x06 | ||
26 | #define BT_MBI_UNIT_SMI 0x0C | ||
27 | #define BT_MBI_UNIT_USB 0x43 | ||
28 | #define BT_MBI_UNIT_SATA 0xA3 | ||
29 | #define BT_MBI_UNIT_PCIE 0xA6 | ||
30 | |||
31 | /* Baytrail read/write opcodes */ | ||
32 | #define BT_MBI_AUNIT_READ 0x10 | ||
33 | #define BT_MBI_AUNIT_WRITE 0x11 | ||
34 | #define BT_MBI_SMC_READ 0x10 | ||
35 | #define BT_MBI_SMC_WRITE 0x11 | ||
36 | #define BT_MBI_CPU_READ 0x10 | ||
37 | #define BT_MBI_CPU_WRITE 0x11 | ||
38 | #define BT_MBI_BUNIT_READ 0x10 | ||
39 | #define BT_MBI_BUNIT_WRITE 0x11 | ||
40 | #define BT_MBI_PMC_READ 0x06 | ||
41 | #define BT_MBI_PMC_WRITE 0x07 | ||
42 | #define BT_MBI_GFX_READ 0x00 | ||
43 | #define BT_MBI_GFX_WRITE 0x01 | ||
44 | #define BT_MBI_SMIO_READ 0x06 | ||
45 | #define BT_MBI_SMIO_WRITE 0x07 | ||
46 | #define BT_MBI_USB_READ 0x06 | ||
47 | #define BT_MBI_USB_WRITE 0x07 | ||
48 | #define BT_MBI_SATA_READ 0x00 | ||
49 | #define BT_MBI_SATA_WRITE 0x01 | ||
50 | #define BT_MBI_PCIE_READ 0x00 | ||
51 | #define BT_MBI_PCIE_WRITE 0x01 | ||
52 | |||
53 | /** | ||
54 | * iosf_mbi_read() - MailBox Interface read command | ||
55 | * @port: port indicating subunit being accessed | ||
56 | * @opcode: port specific read or write opcode | ||
57 | * @offset: register address offset | ||
58 | * @mdr: register data to be read | ||
59 | * | ||
60 | * Locking is handled by spinlock - cannot sleep. | ||
61 | * Return: Nonzero on error | ||
62 | */ | ||
63 | int iosf_mbi_read(u8 port, u8 opcode, u32 offset, u32 *mdr); | ||
64 | |||
65 | /** | ||
66 | * iosf_mbi_write() - MailBox unmasked write command | ||
67 | * @port: port indicating subunit being accessed | ||
68 | * @opcode: port specific read or write opcode | ||
69 | * @offset: register address offset | ||
70 | * @mdr: register data to be written | ||
71 | * | ||
72 | * Locking is handled by spinlock - cannot sleep. | ||
73 | * Return: Nonzero on error | ||
74 | */ | ||
75 | int iosf_mbi_write(u8 port, u8 opcode, u32 offset, u32 mdr); | ||
76 | |||
77 | /** | ||
78 | * iosf_mbi_modify() - MailBox masked write command | ||
79 | * @port: port indicating subunit being accessed | ||
80 | * @opcode: port specific read or write opcode | ||
81 | * @offset: register address offset | ||
82 | * @mdr: register data being modified | ||
83 | * @mask: mask indicating bits in mdr to be modified | ||
84 | * | ||
85 | * Locking is handled by spinlock - cannot sleep. | ||
86 | * Return: Nonzero on error | ||
87 | */ | ||
88 | int iosf_mbi_modify(u8 port, u8 opcode, u32 offset, u32 mdr, u32 mask); | ||
89 | |||
90 | #endif /* IOSF_MBI_SYMS_H */ | ||
diff --git a/arch/x86/include/asm/irq.h b/arch/x86/include/asm/irq.h index 0ea10f27d613..cb6cfcd034cf 100644 --- a/arch/x86/include/asm/irq.h +++ b/arch/x86/include/asm/irq.h | |||
@@ -25,6 +25,7 @@ extern void irq_ctx_init(int cpu); | |||
25 | 25 | ||
26 | #ifdef CONFIG_HOTPLUG_CPU | 26 | #ifdef CONFIG_HOTPLUG_CPU |
27 | #include <linux/cpumask.h> | 27 | #include <linux/cpumask.h> |
28 | extern int check_irq_vectors_for_cpu_disable(void); | ||
28 | extern void fixup_irqs(void); | 29 | extern void fixup_irqs(void); |
29 | extern void irq_force_complete_move(int); | 30 | extern void irq_force_complete_move(int); |
30 | #endif | 31 | #endif |
diff --git a/arch/x86/include/asm/local.h b/arch/x86/include/asm/local.h index 5b23e605e707..4ad6560847b1 100644 --- a/arch/x86/include/asm/local.h +++ b/arch/x86/include/asm/local.h | |||
@@ -52,7 +52,7 @@ static inline void local_sub(long i, local_t *l) | |||
52 | */ | 52 | */ |
53 | static inline int local_sub_and_test(long i, local_t *l) | 53 | static inline int local_sub_and_test(long i, local_t *l) |
54 | { | 54 | { |
55 | GEN_BINARY_RMWcc(_ASM_SUB, l->a.counter, i, "%0", "e"); | 55 | GEN_BINARY_RMWcc(_ASM_SUB, l->a.counter, "er", i, "%0", "e"); |
56 | } | 56 | } |
57 | 57 | ||
58 | /** | 58 | /** |
@@ -92,7 +92,7 @@ static inline int local_inc_and_test(local_t *l) | |||
92 | */ | 92 | */ |
93 | static inline int local_add_negative(long i, local_t *l) | 93 | static inline int local_add_negative(long i, local_t *l) |
94 | { | 94 | { |
95 | GEN_BINARY_RMWcc(_ASM_ADD, l->a.counter, i, "%0", "s"); | 95 | GEN_BINARY_RMWcc(_ASM_ADD, l->a.counter, "er", i, "%0", "s"); |
96 | } | 96 | } |
97 | 97 | ||
98 | /** | 98 | /** |
diff --git a/arch/x86/include/asm/mce.h b/arch/x86/include/asm/mce.h index c696a8687567..6e4ce2df87cf 100644 --- a/arch/x86/include/asm/mce.h +++ b/arch/x86/include/asm/mce.h | |||
@@ -118,7 +118,6 @@ extern void mce_register_decode_chain(struct notifier_block *nb); | |||
118 | extern void mce_unregister_decode_chain(struct notifier_block *nb); | 118 | extern void mce_unregister_decode_chain(struct notifier_block *nb); |
119 | 119 | ||
120 | #include <linux/percpu.h> | 120 | #include <linux/percpu.h> |
121 | #include <linux/init.h> | ||
122 | #include <linux/atomic.h> | 121 | #include <linux/atomic.h> |
123 | 122 | ||
124 | extern int mce_p5_enabled; | 123 | extern int mce_p5_enabled; |
diff --git a/arch/x86/include/asm/microcode.h b/arch/x86/include/asm/microcode.h index f98bd6625318..b59827e76529 100644 --- a/arch/x86/include/asm/microcode.h +++ b/arch/x86/include/asm/microcode.h | |||
@@ -1,6 +1,21 @@ | |||
1 | #ifndef _ASM_X86_MICROCODE_H | 1 | #ifndef _ASM_X86_MICROCODE_H |
2 | #define _ASM_X86_MICROCODE_H | 2 | #define _ASM_X86_MICROCODE_H |
3 | 3 | ||
4 | #define native_rdmsr(msr, val1, val2) \ | ||
5 | do { \ | ||
6 | u64 __val = native_read_msr((msr)); \ | ||
7 | (void)((val1) = (u32)__val); \ | ||
8 | (void)((val2) = (u32)(__val >> 32)); \ | ||
9 | } while (0) | ||
10 | |||
11 | #define native_wrmsr(msr, low, high) \ | ||
12 | native_write_msr(msr, low, high) | ||
13 | |||
14 | #define native_wrmsrl(msr, val) \ | ||
15 | native_write_msr((msr), \ | ||
16 | (u32)((u64)(val)), \ | ||
17 | (u32)((u64)(val) >> 32)) | ||
18 | |||
4 | struct cpu_signature { | 19 | struct cpu_signature { |
5 | unsigned int sig; | 20 | unsigned int sig; |
6 | unsigned int pf; | 21 | unsigned int pf; |
diff --git a/arch/x86/include/asm/microcode_amd.h b/arch/x86/include/asm/microcode_amd.h index 4c019179a57d..b7b10b82d3e5 100644 --- a/arch/x86/include/asm/microcode_amd.h +++ b/arch/x86/include/asm/microcode_amd.h | |||
@@ -61,11 +61,10 @@ extern int __apply_microcode_amd(struct microcode_amd *mc_amd); | |||
61 | extern int apply_microcode_amd(int cpu); | 61 | extern int apply_microcode_amd(int cpu); |
62 | extern enum ucode_state load_microcode_amd(u8 family, const u8 *data, size_t size); | 62 | extern enum ucode_state load_microcode_amd(u8 family, const u8 *data, size_t size); |
63 | 63 | ||
64 | #define PATCH_MAX_SIZE PAGE_SIZE | ||
65 | extern u8 amd_ucode_patch[PATCH_MAX_SIZE]; | ||
66 | |||
64 | #ifdef CONFIG_MICROCODE_AMD_EARLY | 67 | #ifdef CONFIG_MICROCODE_AMD_EARLY |
65 | #ifdef CONFIG_X86_32 | ||
66 | #define MPB_MAX_SIZE PAGE_SIZE | ||
67 | extern u8 amd_bsp_mpb[MPB_MAX_SIZE]; | ||
68 | #endif | ||
69 | extern void __init load_ucode_amd_bsp(void); | 68 | extern void __init load_ucode_amd_bsp(void); |
70 | extern void load_ucode_amd_ap(void); | 69 | extern void load_ucode_amd_ap(void); |
71 | extern int __init save_microcode_in_initrd_amd(void); | 70 | extern int __init save_microcode_in_initrd_amd(void); |
diff --git a/arch/x86/include/asm/mpspec.h b/arch/x86/include/asm/mpspec.h index 3142a94c7b4b..3e6b4920ef5d 100644 --- a/arch/x86/include/asm/mpspec.h +++ b/arch/x86/include/asm/mpspec.h | |||
@@ -1,7 +1,6 @@ | |||
1 | #ifndef _ASM_X86_MPSPEC_H | 1 | #ifndef _ASM_X86_MPSPEC_H |
2 | #define _ASM_X86_MPSPEC_H | 2 | #define _ASM_X86_MPSPEC_H |
3 | 3 | ||
4 | #include <linux/init.h> | ||
5 | 4 | ||
6 | #include <asm/mpspec_def.h> | 5 | #include <asm/mpspec_def.h> |
7 | #include <asm/x86_init.h> | 6 | #include <asm/x86_init.h> |
diff --git a/arch/x86/include/asm/mwait.h b/arch/x86/include/asm/mwait.h index 2f366d0ac6b4..1da25a5f96f9 100644 --- a/arch/x86/include/asm/mwait.h +++ b/arch/x86/include/asm/mwait.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef _ASM_X86_MWAIT_H | 1 | #ifndef _ASM_X86_MWAIT_H |
2 | #define _ASM_X86_MWAIT_H | 2 | #define _ASM_X86_MWAIT_H |
3 | 3 | ||
4 | #include <linux/sched.h> | ||
5 | |||
4 | #define MWAIT_SUBSTATE_MASK 0xf | 6 | #define MWAIT_SUBSTATE_MASK 0xf |
5 | #define MWAIT_CSTATE_MASK 0xf | 7 | #define MWAIT_CSTATE_MASK 0xf |
6 | #define MWAIT_SUBSTATE_SIZE 4 | 8 | #define MWAIT_SUBSTATE_SIZE 4 |
@@ -13,4 +15,45 @@ | |||
13 | 15 | ||
14 | #define MWAIT_ECX_INTERRUPT_BREAK 0x1 | 16 | #define MWAIT_ECX_INTERRUPT_BREAK 0x1 |
15 | 17 | ||
18 | static inline void __monitor(const void *eax, unsigned long ecx, | ||
19 | unsigned long edx) | ||
20 | { | ||
21 | /* "monitor %eax, %ecx, %edx;" */ | ||
22 | asm volatile(".byte 0x0f, 0x01, 0xc8;" | ||
23 | :: "a" (eax), "c" (ecx), "d"(edx)); | ||
24 | } | ||
25 | |||
26 | static inline void __mwait(unsigned long eax, unsigned long ecx) | ||
27 | { | ||
28 | /* "mwait %eax, %ecx;" */ | ||
29 | asm volatile(".byte 0x0f, 0x01, 0xc9;" | ||
30 | :: "a" (eax), "c" (ecx)); | ||
31 | } | ||
32 | |||
33 | /* | ||
34 | * This uses new MONITOR/MWAIT instructions on P4 processors with PNI, | ||
35 | * which can obviate IPI to trigger checking of need_resched. | ||
36 | * We execute MONITOR against need_resched and enter optimized wait state | ||
37 | * through MWAIT. Whenever someone changes need_resched, we would be woken | ||
38 | * up from MWAIT (without an IPI). | ||
39 | * | ||
40 | * New with Core Duo processors, MWAIT can take some hints based on CPU | ||
41 | * capability. | ||
42 | */ | ||
43 | static inline void mwait_idle_with_hints(unsigned long eax, unsigned long ecx) | ||
44 | { | ||
45 | if (!current_set_polling_and_test()) { | ||
46 | if (static_cpu_has(X86_FEATURE_CLFLUSH_MONITOR)) { | ||
47 | mb(); | ||
48 | clflush((void *)¤t_thread_info()->flags); | ||
49 | mb(); | ||
50 | } | ||
51 | |||
52 | __monitor((void *)¤t_thread_info()->flags, 0, 0); | ||
53 | if (!need_resched()) | ||
54 | __mwait(eax, ecx); | ||
55 | } | ||
56 | current_clr_polling(); | ||
57 | } | ||
58 | |||
16 | #endif /* _ASM_X86_MWAIT_H */ | 59 | #endif /* _ASM_X86_MWAIT_H */ |
diff --git a/arch/x86/include/asm/page.h b/arch/x86/include/asm/page.h index c87892442e53..775873d3be55 100644 --- a/arch/x86/include/asm/page.h +++ b/arch/x86/include/asm/page.h | |||
@@ -71,6 +71,7 @@ extern bool __virt_addr_valid(unsigned long kaddr); | |||
71 | #include <asm-generic/getorder.h> | 71 | #include <asm-generic/getorder.h> |
72 | 72 | ||
73 | #define __HAVE_ARCH_GATE_AREA 1 | 73 | #define __HAVE_ARCH_GATE_AREA 1 |
74 | #define HAVE_ARCH_HUGETLB_UNMAPPED_AREA | ||
74 | 75 | ||
75 | #endif /* __KERNEL__ */ | 76 | #endif /* __KERNEL__ */ |
76 | #endif /* _ASM_X86_PAGE_H */ | 77 | #endif /* _ASM_X86_PAGE_H */ |
diff --git a/arch/x86/include/asm/page_32.h b/arch/x86/include/asm/page_32.h index 4d550d04b609..904f528cc8e8 100644 --- a/arch/x86/include/asm/page_32.h +++ b/arch/x86/include/asm/page_32.h | |||
@@ -5,10 +5,6 @@ | |||
5 | 5 | ||
6 | #ifndef __ASSEMBLY__ | 6 | #ifndef __ASSEMBLY__ |
7 | 7 | ||
8 | #ifdef CONFIG_HUGETLB_PAGE | ||
9 | #define HAVE_ARCH_HUGETLB_UNMAPPED_AREA | ||
10 | #endif | ||
11 | |||
12 | #define __phys_addr_nodebug(x) ((x) - PAGE_OFFSET) | 8 | #define __phys_addr_nodebug(x) ((x) - PAGE_OFFSET) |
13 | #ifdef CONFIG_DEBUG_VIRTUAL | 9 | #ifdef CONFIG_DEBUG_VIRTUAL |
14 | extern unsigned long __phys_addr(unsigned long); | 10 | extern unsigned long __phys_addr(unsigned long); |
diff --git a/arch/x86/include/asm/page_64_types.h b/arch/x86/include/asm/page_64_types.h index 43dcd804ebd5..8de6d9cf3b95 100644 --- a/arch/x86/include/asm/page_64_types.h +++ b/arch/x86/include/asm/page_64_types.h | |||
@@ -39,9 +39,18 @@ | |||
39 | #define __VIRTUAL_MASK_SHIFT 47 | 39 | #define __VIRTUAL_MASK_SHIFT 47 |
40 | 40 | ||
41 | /* | 41 | /* |
42 | * Kernel image size is limited to 512 MB (see level2_kernel_pgt in | 42 | * Kernel image size is limited to 1GiB due to the fixmap living in the |
43 | * arch/x86/kernel/head_64.S), and it is mapped here: | 43 | * next 1GiB (see level2_kernel_pgt in arch/x86/kernel/head_64.S). Use |
44 | * 512MiB by default, leaving 1.5GiB for modules once the page tables | ||
45 | * are fully set up. If kernel ASLR is configured, it can extend the | ||
46 | * kernel page table mapping, reducing the size of the modules area. | ||
44 | */ | 47 | */ |
45 | #define KERNEL_IMAGE_SIZE (512 * 1024 * 1024) | 48 | #define KERNEL_IMAGE_SIZE_DEFAULT (512 * 1024 * 1024) |
49 | #if defined(CONFIG_RANDOMIZE_BASE) && \ | ||
50 | CONFIG_RANDOMIZE_BASE_MAX_OFFSET > KERNEL_IMAGE_SIZE_DEFAULT | ||
51 | #define KERNEL_IMAGE_SIZE CONFIG_RANDOMIZE_BASE_MAX_OFFSET | ||
52 | #else | ||
53 | #define KERNEL_IMAGE_SIZE KERNEL_IMAGE_SIZE_DEFAULT | ||
54 | #endif | ||
46 | 55 | ||
47 | #endif /* _ASM_X86_PAGE_64_DEFS_H */ | 56 | #endif /* _ASM_X86_PAGE_64_DEFS_H */ |
diff --git a/arch/x86/include/asm/page_types.h b/arch/x86/include/asm/page_types.h index f97fbe3abb67..2f59cce3b38a 100644 --- a/arch/x86/include/asm/page_types.h +++ b/arch/x86/include/asm/page_types.h | |||
@@ -51,9 +51,9 @@ extern int devmem_is_allowed(unsigned long pagenr); | |||
51 | extern unsigned long max_low_pfn_mapped; | 51 | extern unsigned long max_low_pfn_mapped; |
52 | extern unsigned long max_pfn_mapped; | 52 | extern unsigned long max_pfn_mapped; |
53 | 53 | ||
54 | static inline phys_addr_t get_max_mapped(void) | 54 | static inline phys_addr_t get_max_low_mapped(void) |
55 | { | 55 | { |
56 | return (phys_addr_t)max_pfn_mapped << PAGE_SHIFT; | 56 | return (phys_addr_t)max_low_pfn_mapped << PAGE_SHIFT; |
57 | } | 57 | } |
58 | 58 | ||
59 | bool pfn_range_is_mapped(unsigned long start_pfn, unsigned long end_pfn); | 59 | bool pfn_range_is_mapped(unsigned long start_pfn, unsigned long end_pfn); |
diff --git a/arch/x86/include/asm/pgtable-2level.h b/arch/x86/include/asm/pgtable-2level.h index 3bf2dd0cf61f..0d193e234647 100644 --- a/arch/x86/include/asm/pgtable-2level.h +++ b/arch/x86/include/asm/pgtable-2level.h | |||
@@ -55,6 +55,13 @@ static inline pmd_t native_pmdp_get_and_clear(pmd_t *xp) | |||
55 | #define native_pmdp_get_and_clear(xp) native_local_pmdp_get_and_clear(xp) | 55 | #define native_pmdp_get_and_clear(xp) native_local_pmdp_get_and_clear(xp) |
56 | #endif | 56 | #endif |
57 | 57 | ||
58 | /* Bit manipulation helper on pte/pgoff entry */ | ||
59 | static inline unsigned long pte_bitop(unsigned long value, unsigned int rightshift, | ||
60 | unsigned long mask, unsigned int leftshift) | ||
61 | { | ||
62 | return ((value >> rightshift) & mask) << leftshift; | ||
63 | } | ||
64 | |||
58 | #ifdef CONFIG_MEM_SOFT_DIRTY | 65 | #ifdef CONFIG_MEM_SOFT_DIRTY |
59 | 66 | ||
60 | /* | 67 | /* |
@@ -71,31 +78,34 @@ static inline pmd_t native_pmdp_get_and_clear(pmd_t *xp) | |||
71 | #define PTE_FILE_BITS2 (PTE_FILE_SHIFT3 - PTE_FILE_SHIFT2 - 1) | 78 | #define PTE_FILE_BITS2 (PTE_FILE_SHIFT3 - PTE_FILE_SHIFT2 - 1) |
72 | #define PTE_FILE_BITS3 (PTE_FILE_SHIFT4 - PTE_FILE_SHIFT3 - 1) | 79 | #define PTE_FILE_BITS3 (PTE_FILE_SHIFT4 - PTE_FILE_SHIFT3 - 1) |
73 | 80 | ||
74 | #define pte_to_pgoff(pte) \ | 81 | #define PTE_FILE_MASK1 ((1U << PTE_FILE_BITS1) - 1) |
75 | ((((pte).pte_low >> (PTE_FILE_SHIFT1)) \ | 82 | #define PTE_FILE_MASK2 ((1U << PTE_FILE_BITS2) - 1) |
76 | & ((1U << PTE_FILE_BITS1) - 1))) \ | 83 | #define PTE_FILE_MASK3 ((1U << PTE_FILE_BITS3) - 1) |
77 | + ((((pte).pte_low >> (PTE_FILE_SHIFT2)) \ | 84 | |
78 | & ((1U << PTE_FILE_BITS2) - 1)) \ | 85 | #define PTE_FILE_LSHIFT2 (PTE_FILE_BITS1) |
79 | << (PTE_FILE_BITS1)) \ | 86 | #define PTE_FILE_LSHIFT3 (PTE_FILE_BITS1 + PTE_FILE_BITS2) |
80 | + ((((pte).pte_low >> (PTE_FILE_SHIFT3)) \ | 87 | #define PTE_FILE_LSHIFT4 (PTE_FILE_BITS1 + PTE_FILE_BITS2 + PTE_FILE_BITS3) |
81 | & ((1U << PTE_FILE_BITS3) - 1)) \ | 88 | |
82 | << (PTE_FILE_BITS1 + PTE_FILE_BITS2)) \ | 89 | static __always_inline pgoff_t pte_to_pgoff(pte_t pte) |
83 | + ((((pte).pte_low >> (PTE_FILE_SHIFT4))) \ | 90 | { |
84 | << (PTE_FILE_BITS1 + PTE_FILE_BITS2 + PTE_FILE_BITS3)) | 91 | return (pgoff_t) |
85 | 92 | (pte_bitop(pte.pte_low, PTE_FILE_SHIFT1, PTE_FILE_MASK1, 0) + | |
86 | #define pgoff_to_pte(off) \ | 93 | pte_bitop(pte.pte_low, PTE_FILE_SHIFT2, PTE_FILE_MASK2, PTE_FILE_LSHIFT2) + |
87 | ((pte_t) { .pte_low = \ | 94 | pte_bitop(pte.pte_low, PTE_FILE_SHIFT3, PTE_FILE_MASK3, PTE_FILE_LSHIFT3) + |
88 | ((((off)) & ((1U << PTE_FILE_BITS1) - 1)) << PTE_FILE_SHIFT1) \ | 95 | pte_bitop(pte.pte_low, PTE_FILE_SHIFT4, -1UL, PTE_FILE_LSHIFT4)); |
89 | + ((((off) >> PTE_FILE_BITS1) \ | 96 | } |
90 | & ((1U << PTE_FILE_BITS2) - 1)) \ | 97 | |
91 | << PTE_FILE_SHIFT2) \ | 98 | static __always_inline pte_t pgoff_to_pte(pgoff_t off) |
92 | + ((((off) >> (PTE_FILE_BITS1 + PTE_FILE_BITS2)) \ | 99 | { |
93 | & ((1U << PTE_FILE_BITS3) - 1)) \ | 100 | return (pte_t){ |
94 | << PTE_FILE_SHIFT3) \ | 101 | .pte_low = |
95 | + ((((off) >> \ | 102 | pte_bitop(off, 0, PTE_FILE_MASK1, PTE_FILE_SHIFT1) + |
96 | (PTE_FILE_BITS1 + PTE_FILE_BITS2 + PTE_FILE_BITS3))) \ | 103 | pte_bitop(off, PTE_FILE_LSHIFT2, PTE_FILE_MASK2, PTE_FILE_SHIFT2) + |
97 | << PTE_FILE_SHIFT4) \ | 104 | pte_bitop(off, PTE_FILE_LSHIFT3, PTE_FILE_MASK3, PTE_FILE_SHIFT3) + |
98 | + _PAGE_FILE }) | 105 | pte_bitop(off, PTE_FILE_LSHIFT4, -1UL, PTE_FILE_SHIFT4) + |
106 | _PAGE_FILE, | ||
107 | }; | ||
108 | } | ||
99 | 109 | ||
100 | #else /* CONFIG_MEM_SOFT_DIRTY */ | 110 | #else /* CONFIG_MEM_SOFT_DIRTY */ |
101 | 111 | ||
@@ -115,22 +125,30 @@ static inline pmd_t native_pmdp_get_and_clear(pmd_t *xp) | |||
115 | #define PTE_FILE_BITS1 (PTE_FILE_SHIFT2 - PTE_FILE_SHIFT1 - 1) | 125 | #define PTE_FILE_BITS1 (PTE_FILE_SHIFT2 - PTE_FILE_SHIFT1 - 1) |
116 | #define PTE_FILE_BITS2 (PTE_FILE_SHIFT3 - PTE_FILE_SHIFT2 - 1) | 126 | #define PTE_FILE_BITS2 (PTE_FILE_SHIFT3 - PTE_FILE_SHIFT2 - 1) |
117 | 127 | ||
118 | #define pte_to_pgoff(pte) \ | 128 | #define PTE_FILE_MASK1 ((1U << PTE_FILE_BITS1) - 1) |
119 | ((((pte).pte_low >> PTE_FILE_SHIFT1) \ | 129 | #define PTE_FILE_MASK2 ((1U << PTE_FILE_BITS2) - 1) |
120 | & ((1U << PTE_FILE_BITS1) - 1)) \ | 130 | |
121 | + ((((pte).pte_low >> PTE_FILE_SHIFT2) \ | 131 | #define PTE_FILE_LSHIFT2 (PTE_FILE_BITS1) |
122 | & ((1U << PTE_FILE_BITS2) - 1)) << PTE_FILE_BITS1) \ | 132 | #define PTE_FILE_LSHIFT3 (PTE_FILE_BITS1 + PTE_FILE_BITS2) |
123 | + (((pte).pte_low >> PTE_FILE_SHIFT3) \ | 133 | |
124 | << (PTE_FILE_BITS1 + PTE_FILE_BITS2))) | 134 | static __always_inline pgoff_t pte_to_pgoff(pte_t pte) |
125 | 135 | { | |
126 | #define pgoff_to_pte(off) \ | 136 | return (pgoff_t) |
127 | ((pte_t) { .pte_low = \ | 137 | (pte_bitop(pte.pte_low, PTE_FILE_SHIFT1, PTE_FILE_MASK1, 0) + |
128 | (((off) & ((1U << PTE_FILE_BITS1) - 1)) << PTE_FILE_SHIFT1) \ | 138 | pte_bitop(pte.pte_low, PTE_FILE_SHIFT2, PTE_FILE_MASK2, PTE_FILE_LSHIFT2) + |
129 | + ((((off) >> PTE_FILE_BITS1) & ((1U << PTE_FILE_BITS2) - 1)) \ | 139 | pte_bitop(pte.pte_low, PTE_FILE_SHIFT3, -1UL, PTE_FILE_LSHIFT3)); |
130 | << PTE_FILE_SHIFT2) \ | 140 | } |
131 | + (((off) >> (PTE_FILE_BITS1 + PTE_FILE_BITS2)) \ | 141 | |
132 | << PTE_FILE_SHIFT3) \ | 142 | static __always_inline pte_t pgoff_to_pte(pgoff_t off) |
133 | + _PAGE_FILE }) | 143 | { |
144 | return (pte_t){ | ||
145 | .pte_low = | ||
146 | pte_bitop(off, 0, PTE_FILE_MASK1, PTE_FILE_SHIFT1) + | ||
147 | pte_bitop(off, PTE_FILE_LSHIFT2, PTE_FILE_MASK2, PTE_FILE_SHIFT2) + | ||
148 | pte_bitop(off, PTE_FILE_LSHIFT3, -1UL, PTE_FILE_SHIFT3) + | ||
149 | _PAGE_FILE, | ||
150 | }; | ||
151 | } | ||
134 | 152 | ||
135 | #endif /* CONFIG_MEM_SOFT_DIRTY */ | 153 | #endif /* CONFIG_MEM_SOFT_DIRTY */ |
136 | 154 | ||
diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h index 3d1999458709..bbc8b12fa443 100644 --- a/arch/x86/include/asm/pgtable.h +++ b/arch/x86/include/asm/pgtable.h | |||
@@ -452,9 +452,16 @@ static inline int pte_present(pte_t a) | |||
452 | } | 452 | } |
453 | 453 | ||
454 | #define pte_accessible pte_accessible | 454 | #define pte_accessible pte_accessible |
455 | static inline int pte_accessible(pte_t a) | 455 | static inline bool pte_accessible(struct mm_struct *mm, pte_t a) |
456 | { | 456 | { |
457 | return pte_flags(a) & _PAGE_PRESENT; | 457 | if (pte_flags(a) & _PAGE_PRESENT) |
458 | return true; | ||
459 | |||
460 | if ((pte_flags(a) & (_PAGE_PROTNONE | _PAGE_NUMA)) && | ||
461 | mm_tlb_flush_pending(mm)) | ||
462 | return true; | ||
463 | |||
464 | return false; | ||
458 | } | 465 | } |
459 | 466 | ||
460 | static inline int pte_hidden(pte_t pte) | 467 | static inline int pte_hidden(pte_t pte) |
diff --git a/arch/x86/include/asm/pgtable_64_types.h b/arch/x86/include/asm/pgtable_64_types.h index 2d883440cb9a..c883bf726398 100644 --- a/arch/x86/include/asm/pgtable_64_types.h +++ b/arch/x86/include/asm/pgtable_64_types.h | |||
@@ -58,7 +58,7 @@ typedef struct { pteval_t pte; } pte_t; | |||
58 | #define VMALLOC_START _AC(0xffffc90000000000, UL) | 58 | #define VMALLOC_START _AC(0xffffc90000000000, UL) |
59 | #define VMALLOC_END _AC(0xffffe8ffffffffff, UL) | 59 | #define VMALLOC_END _AC(0xffffe8ffffffffff, UL) |
60 | #define VMEMMAP_START _AC(0xffffea0000000000, UL) | 60 | #define VMEMMAP_START _AC(0xffffea0000000000, UL) |
61 | #define MODULES_VADDR _AC(0xffffffffa0000000, UL) | 61 | #define MODULES_VADDR (__START_KERNEL_map + KERNEL_IMAGE_SIZE) |
62 | #define MODULES_END _AC(0xffffffffff000000, UL) | 62 | #define MODULES_END _AC(0xffffffffff000000, UL) |
63 | #define MODULES_LEN (MODULES_END - MODULES_VADDR) | 63 | #define MODULES_LEN (MODULES_END - MODULES_VADDR) |
64 | 64 | ||
diff --git a/arch/x86/include/asm/pgtable_types.h b/arch/x86/include/asm/pgtable_types.h index 0ecac257fb26..a83aa44bb1fb 100644 --- a/arch/x86/include/asm/pgtable_types.h +++ b/arch/x86/include/asm/pgtable_types.h | |||
@@ -382,7 +382,8 @@ static inline void update_page_count(int level, unsigned long pages) { } | |||
382 | */ | 382 | */ |
383 | extern pte_t *lookup_address(unsigned long address, unsigned int *level); | 383 | extern pte_t *lookup_address(unsigned long address, unsigned int *level); |
384 | extern phys_addr_t slow_virt_to_phys(void *__address); | 384 | extern phys_addr_t slow_virt_to_phys(void *__address); |
385 | 385 | extern int kernel_map_pages_in_pgd(pgd_t *pgd, u64 pfn, unsigned long address, | |
386 | unsigned numpages, unsigned long page_flags); | ||
386 | #endif /* !__ASSEMBLY__ */ | 387 | #endif /* !__ASSEMBLY__ */ |
387 | 388 | ||
388 | #endif /* _ASM_X86_PGTABLE_DEFS_H */ | 389 | #endif /* _ASM_X86_PGTABLE_DEFS_H */ |
diff --git a/arch/x86/include/asm/preempt.h b/arch/x86/include/asm/preempt.h index 8729723636fd..c8b051933b1b 100644 --- a/arch/x86/include/asm/preempt.h +++ b/arch/x86/include/asm/preempt.h | |||
@@ -8,6 +8,12 @@ | |||
8 | DECLARE_PER_CPU(int, __preempt_count); | 8 | DECLARE_PER_CPU(int, __preempt_count); |
9 | 9 | ||
10 | /* | 10 | /* |
11 | * We use the PREEMPT_NEED_RESCHED bit as an inverted NEED_RESCHED such | ||
12 | * that a decrement hitting 0 means we can and should reschedule. | ||
13 | */ | ||
14 | #define PREEMPT_ENABLED (0 + PREEMPT_NEED_RESCHED) | ||
15 | |||
16 | /* | ||
11 | * We mask the PREEMPT_NEED_RESCHED bit so as not to confuse all current users | 17 | * We mask the PREEMPT_NEED_RESCHED bit so as not to confuse all current users |
12 | * that think a non-zero value indicates we cannot preempt. | 18 | * that think a non-zero value indicates we cannot preempt. |
13 | */ | 19 | */ |
@@ -74,6 +80,11 @@ static __always_inline void __preempt_count_sub(int val) | |||
74 | __this_cpu_add_4(__preempt_count, -val); | 80 | __this_cpu_add_4(__preempt_count, -val); |
75 | } | 81 | } |
76 | 82 | ||
83 | /* | ||
84 | * Because we keep PREEMPT_NEED_RESCHED set when we do _not_ need to reschedule | ||
85 | * a decrement which hits zero means we have no preempt_count and should | ||
86 | * reschedule. | ||
87 | */ | ||
77 | static __always_inline bool __preempt_count_dec_and_test(void) | 88 | static __always_inline bool __preempt_count_dec_and_test(void) |
78 | { | 89 | { |
79 | GEN_UNARY_RMWcc("decl", __preempt_count, __percpu_arg(0), "e"); | 90 | GEN_UNARY_RMWcc("decl", __preempt_count, __percpu_arg(0), "e"); |
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index 7b034a4057f9..fdedd38fd0fc 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h | |||
@@ -27,7 +27,6 @@ struct mm_struct; | |||
27 | #include <linux/cache.h> | 27 | #include <linux/cache.h> |
28 | #include <linux/threads.h> | 28 | #include <linux/threads.h> |
29 | #include <linux/math64.h> | 29 | #include <linux/math64.h> |
30 | #include <linux/init.h> | ||
31 | #include <linux/err.h> | 30 | #include <linux/err.h> |
32 | #include <linux/irqflags.h> | 31 | #include <linux/irqflags.h> |
33 | 32 | ||
@@ -72,6 +71,7 @@ extern u16 __read_mostly tlb_lli_4m[NR_INFO]; | |||
72 | extern u16 __read_mostly tlb_lld_4k[NR_INFO]; | 71 | extern u16 __read_mostly tlb_lld_4k[NR_INFO]; |
73 | extern u16 __read_mostly tlb_lld_2m[NR_INFO]; | 72 | extern u16 __read_mostly tlb_lld_2m[NR_INFO]; |
74 | extern u16 __read_mostly tlb_lld_4m[NR_INFO]; | 73 | extern u16 __read_mostly tlb_lld_4m[NR_INFO]; |
74 | extern u16 __read_mostly tlb_lld_1g[NR_INFO]; | ||
75 | extern s8 __read_mostly tlb_flushall_shift; | 75 | extern s8 __read_mostly tlb_flushall_shift; |
76 | 76 | ||
77 | /* | 77 | /* |
@@ -370,6 +370,20 @@ struct ymmh_struct { | |||
370 | u32 ymmh_space[64]; | 370 | u32 ymmh_space[64]; |
371 | }; | 371 | }; |
372 | 372 | ||
373 | /* We don't support LWP yet: */ | ||
374 | struct lwp_struct { | ||
375 | u8 reserved[128]; | ||
376 | }; | ||
377 | |||
378 | struct bndregs_struct { | ||
379 | u64 bndregs[8]; | ||
380 | } __packed; | ||
381 | |||
382 | struct bndcsr_struct { | ||
383 | u64 cfg_reg_u; | ||
384 | u64 status_reg; | ||
385 | } __packed; | ||
386 | |||
373 | struct xsave_hdr_struct { | 387 | struct xsave_hdr_struct { |
374 | u64 xstate_bv; | 388 | u64 xstate_bv; |
375 | u64 reserved1[2]; | 389 | u64 reserved1[2]; |
@@ -380,6 +394,9 @@ struct xsave_struct { | |||
380 | struct i387_fxsave_struct i387; | 394 | struct i387_fxsave_struct i387; |
381 | struct xsave_hdr_struct xsave_hdr; | 395 | struct xsave_hdr_struct xsave_hdr; |
382 | struct ymmh_struct ymmh; | 396 | struct ymmh_struct ymmh; |
397 | struct lwp_struct lwp; | ||
398 | struct bndregs_struct bndregs; | ||
399 | struct bndcsr_struct bndcsr; | ||
383 | /* new processor state extensions will go here */ | 400 | /* new processor state extensions will go here */ |
384 | } __attribute__ ((packed, aligned (64))); | 401 | } __attribute__ ((packed, aligned (64))); |
385 | 402 | ||
@@ -700,29 +717,6 @@ static inline void sync_core(void) | |||
700 | #endif | 717 | #endif |
701 | } | 718 | } |
702 | 719 | ||
703 | static inline void __monitor(const void *eax, unsigned long ecx, | ||
704 | unsigned long edx) | ||
705 | { | ||
706 | /* "monitor %eax, %ecx, %edx;" */ | ||
707 | asm volatile(".byte 0x0f, 0x01, 0xc8;" | ||
708 | :: "a" (eax), "c" (ecx), "d"(edx)); | ||
709 | } | ||
710 | |||
711 | static inline void __mwait(unsigned long eax, unsigned long ecx) | ||
712 | { | ||
713 | /* "mwait %eax, %ecx;" */ | ||
714 | asm volatile(".byte 0x0f, 0x01, 0xc9;" | ||
715 | :: "a" (eax), "c" (ecx)); | ||
716 | } | ||
717 | |||
718 | static inline void __sti_mwait(unsigned long eax, unsigned long ecx) | ||
719 | { | ||
720 | trace_hardirqs_on(); | ||
721 | /* "mwait %eax, %ecx;" */ | ||
722 | asm volatile("sti; .byte 0x0f, 0x01, 0xc9;" | ||
723 | :: "a" (eax), "c" (ecx)); | ||
724 | } | ||
725 | |||
726 | extern void select_idle_routine(const struct cpuinfo_x86 *c); | 720 | extern void select_idle_routine(const struct cpuinfo_x86 *c); |
727 | extern void init_amd_e400_c1e_mask(void); | 721 | extern void init_amd_e400_c1e_mask(void); |
728 | 722 | ||
diff --git a/arch/x86/include/asm/ptrace.h b/arch/x86/include/asm/ptrace.h index 942a08623a1a..14fd6fd75a19 100644 --- a/arch/x86/include/asm/ptrace.h +++ b/arch/x86/include/asm/ptrace.h | |||
@@ -60,7 +60,6 @@ struct pt_regs { | |||
60 | 60 | ||
61 | #endif /* !__i386__ */ | 61 | #endif /* !__i386__ */ |
62 | 62 | ||
63 | #include <linux/init.h> | ||
64 | #ifdef CONFIG_PARAVIRT | 63 | #ifdef CONFIG_PARAVIRT |
65 | #include <asm/paravirt_types.h> | 64 | #include <asm/paravirt_types.h> |
66 | #endif | 65 | #endif |
diff --git a/arch/x86/include/asm/rmwcc.h b/arch/x86/include/asm/rmwcc.h index 1ff990f1de8e..8f7866a5b9a4 100644 --- a/arch/x86/include/asm/rmwcc.h +++ b/arch/x86/include/asm/rmwcc.h | |||
@@ -16,8 +16,8 @@ cc_label: \ | |||
16 | #define GEN_UNARY_RMWcc(op, var, arg0, cc) \ | 16 | #define GEN_UNARY_RMWcc(op, var, arg0, cc) \ |
17 | __GEN_RMWcc(op " " arg0, var, cc) | 17 | __GEN_RMWcc(op " " arg0, var, cc) |
18 | 18 | ||
19 | #define GEN_BINARY_RMWcc(op, var, val, arg0, cc) \ | 19 | #define GEN_BINARY_RMWcc(op, var, vcon, val, arg0, cc) \ |
20 | __GEN_RMWcc(op " %1, " arg0, var, cc, "er" (val)) | 20 | __GEN_RMWcc(op " %1, " arg0, var, cc, vcon (val)) |
21 | 21 | ||
22 | #else /* !CC_HAVE_ASM_GOTO */ | 22 | #else /* !CC_HAVE_ASM_GOTO */ |
23 | 23 | ||
@@ -33,8 +33,8 @@ do { \ | |||
33 | #define GEN_UNARY_RMWcc(op, var, arg0, cc) \ | 33 | #define GEN_UNARY_RMWcc(op, var, arg0, cc) \ |
34 | __GEN_RMWcc(op " " arg0, var, cc) | 34 | __GEN_RMWcc(op " " arg0, var, cc) |
35 | 35 | ||
36 | #define GEN_BINARY_RMWcc(op, var, val, arg0, cc) \ | 36 | #define GEN_BINARY_RMWcc(op, var, vcon, val, arg0, cc) \ |
37 | __GEN_RMWcc(op " %2, " arg0, var, cc, "er" (val)) | 37 | __GEN_RMWcc(op " %2, " arg0, var, cc, vcon (val)) |
38 | 38 | ||
39 | #endif /* CC_HAVE_ASM_GOTO */ | 39 | #endif /* CC_HAVE_ASM_GOTO */ |
40 | 40 | ||
diff --git a/arch/x86/include/asm/setup.h b/arch/x86/include/asm/setup.h index 59bcf4e22418..d62c9f809bc5 100644 --- a/arch/x86/include/asm/setup.h +++ b/arch/x86/include/asm/setup.h | |||
@@ -3,7 +3,6 @@ | |||
3 | 3 | ||
4 | #include <uapi/asm/setup.h> | 4 | #include <uapi/asm/setup.h> |
5 | 5 | ||
6 | |||
7 | #define COMMAND_LINE_SIZE 2048 | 6 | #define COMMAND_LINE_SIZE 2048 |
8 | 7 | ||
9 | #include <linux/linkage.h> | 8 | #include <linux/linkage.h> |
@@ -29,6 +28,8 @@ | |||
29 | #include <asm/bootparam.h> | 28 | #include <asm/bootparam.h> |
30 | #include <asm/x86_init.h> | 29 | #include <asm/x86_init.h> |
31 | 30 | ||
31 | extern u64 relocated_ramdisk; | ||
32 | |||
32 | /* Interrupt control for vSMPowered x86_64 systems */ | 33 | /* Interrupt control for vSMPowered x86_64 systems */ |
33 | #ifdef CONFIG_X86_64 | 34 | #ifdef CONFIG_X86_64 |
34 | void vsmp_init(void); | 35 | void vsmp_init(void); |
diff --git a/arch/x86/include/asm/simd.h b/arch/x86/include/asm/simd.h new file mode 100644 index 000000000000..ee80b92f0096 --- /dev/null +++ b/arch/x86/include/asm/simd.h | |||
@@ -0,0 +1,11 @@ | |||
1 | |||
2 | #include <asm/i387.h> | ||
3 | |||
4 | /* | ||
5 | * may_use_simd - whether it is allowable at this time to issue SIMD | ||
6 | * instructions or access the SIMD register file | ||
7 | */ | ||
8 | static __must_check inline bool may_use_simd(void) | ||
9 | { | ||
10 | return irq_fpu_usable(); | ||
11 | } | ||
diff --git a/arch/x86/include/asm/smp.h b/arch/x86/include/asm/smp.h index 4137890e88e3..8cd27e08e23c 100644 --- a/arch/x86/include/asm/smp.h +++ b/arch/x86/include/asm/smp.h | |||
@@ -2,7 +2,6 @@ | |||
2 | #define _ASM_X86_SMP_H | 2 | #define _ASM_X86_SMP_H |
3 | #ifndef __ASSEMBLY__ | 3 | #ifndef __ASSEMBLY__ |
4 | #include <linux/cpumask.h> | 4 | #include <linux/cpumask.h> |
5 | #include <linux/init.h> | ||
6 | #include <asm/percpu.h> | 5 | #include <asm/percpu.h> |
7 | 6 | ||
8 | /* | 7 | /* |
diff --git a/arch/x86/include/asm/timer.h b/arch/x86/include/asm/timer.h index 34baa0eb5d0c..a04eabd43d06 100644 --- a/arch/x86/include/asm/timer.h +++ b/arch/x86/include/asm/timer.h | |||
@@ -1,9 +1,9 @@ | |||
1 | #ifndef _ASM_X86_TIMER_H | 1 | #ifndef _ASM_X86_TIMER_H |
2 | #define _ASM_X86_TIMER_H | 2 | #define _ASM_X86_TIMER_H |
3 | #include <linux/init.h> | ||
4 | #include <linux/pm.h> | 3 | #include <linux/pm.h> |
5 | #include <linux/percpu.h> | 4 | #include <linux/percpu.h> |
6 | #include <linux/interrupt.h> | 5 | #include <linux/interrupt.h> |
6 | #include <linux/math64.h> | ||
7 | 7 | ||
8 | #define TICK_SIZE (tick_nsec / 1000) | 8 | #define TICK_SIZE (tick_nsec / 1000) |
9 | 9 | ||
@@ -12,68 +12,26 @@ extern int recalibrate_cpu_khz(void); | |||
12 | 12 | ||
13 | extern int no_timer_check; | 13 | extern int no_timer_check; |
14 | 14 | ||
15 | /* Accelerators for sched_clock() | 15 | /* |
16 | * convert from cycles(64bits) => nanoseconds (64bits) | 16 | * We use the full linear equation: f(x) = a + b*x, in order to allow |
17 | * basic equation: | 17 | * a continuous function in the face of dynamic freq changes. |
18 | * ns = cycles / (freq / ns_per_sec) | ||
19 | * ns = cycles * (ns_per_sec / freq) | ||
20 | * ns = cycles * (10^9 / (cpu_khz * 10^3)) | ||
21 | * ns = cycles * (10^6 / cpu_khz) | ||
22 | * | 18 | * |
23 | * Then we use scaling math (suggested by george@mvista.com) to get: | 19 | * Continuity means that when our frequency changes our slope (b); we want to |
24 | * ns = cycles * (10^6 * SC / cpu_khz) / SC | 20 | * ensure that: f(t) == f'(t), which gives: a + b*t == a' + b'*t. |
25 | * ns = cycles * cyc2ns_scale / SC | ||
26 | * | 21 | * |
27 | * And since SC is a constant power of two, we can convert the div | 22 | * Without an offset (a) the above would not be possible. |
28 | * into a shift. | ||
29 | * | 23 | * |
30 | * We can use khz divisor instead of mhz to keep a better precision, since | 24 | * See the comment near cycles_2_ns() for details on how we compute (b). |
31 | * cyc2ns_scale is limited to 10^6 * 2^10, which fits in 32 bits. | ||
32 | * (mathieu.desnoyers@polymtl.ca) | ||
33 | * | ||
34 | * -johnstul@us.ibm.com "math is hard, lets go shopping!" | ||
35 | * | ||
36 | * In: | ||
37 | * | ||
38 | * ns = cycles * cyc2ns_scale / SC | ||
39 | * | ||
40 | * Although we may still have enough bits to store the value of ns, | ||
41 | * in some cases, we may not have enough bits to store cycles * cyc2ns_scale, | ||
42 | * leading to an incorrect result. | ||
43 | * | ||
44 | * To avoid this, we can decompose 'cycles' into quotient and remainder | ||
45 | * of division by SC. Then, | ||
46 | * | ||
47 | * ns = (quot * SC + rem) * cyc2ns_scale / SC | ||
48 | * = quot * cyc2ns_scale + (rem * cyc2ns_scale) / SC | ||
49 | * | ||
50 | * - sqazi@google.com | ||
51 | */ | 25 | */ |
52 | 26 | struct cyc2ns_data { | |
53 | DECLARE_PER_CPU(unsigned long, cyc2ns); | 27 | u32 cyc2ns_mul; |
54 | DECLARE_PER_CPU(unsigned long long, cyc2ns_offset); | 28 | u32 cyc2ns_shift; |
55 | 29 | u64 cyc2ns_offset; | |
56 | #define CYC2NS_SCALE_FACTOR 10 /* 2^10, carefully chosen */ | 30 | u32 __count; |
57 | 31 | /* u32 hole */ | |
58 | static inline unsigned long long __cycles_2_ns(unsigned long long cyc) | 32 | }; /* 24 bytes -- do not grow */ |
59 | { | 33 | |
60 | int cpu = smp_processor_id(); | 34 | extern struct cyc2ns_data *cyc2ns_read_begin(void); |
61 | unsigned long long ns = per_cpu(cyc2ns_offset, cpu); | 35 | extern void cyc2ns_read_end(struct cyc2ns_data *); |
62 | ns += mult_frac(cyc, per_cpu(cyc2ns, cpu), | ||
63 | (1UL << CYC2NS_SCALE_FACTOR)); | ||
64 | return ns; | ||
65 | } | ||
66 | |||
67 | static inline unsigned long long cycles_2_ns(unsigned long long cyc) | ||
68 | { | ||
69 | unsigned long long ns; | ||
70 | unsigned long flags; | ||
71 | |||
72 | local_irq_save(flags); | ||
73 | ns = __cycles_2_ns(cyc); | ||
74 | local_irq_restore(flags); | ||
75 | |||
76 | return ns; | ||
77 | } | ||
78 | 36 | ||
79 | #endif /* _ASM_X86_TIMER_H */ | 37 | #endif /* _ASM_X86_TIMER_H */ |
diff --git a/arch/x86/include/asm/trace/irq_vectors.h b/arch/x86/include/asm/trace/irq_vectors.h index 2874df24e7a4..4cab890007a7 100644 --- a/arch/x86/include/asm/trace/irq_vectors.h +++ b/arch/x86/include/asm/trace/irq_vectors.h | |||
@@ -72,6 +72,17 @@ DEFINE_IRQ_VECTOR_EVENT(x86_platform_ipi); | |||
72 | DEFINE_IRQ_VECTOR_EVENT(irq_work); | 72 | DEFINE_IRQ_VECTOR_EVENT(irq_work); |
73 | 73 | ||
74 | /* | 74 | /* |
75 | * We must dis-allow sampling irq_work_exit() because perf event sampling | ||
76 | * itself can cause irq_work, which would lead to an infinite loop; | ||
77 | * | ||
78 | * 1) irq_work_exit happens | ||
79 | * 2) generates perf sample | ||
80 | * 3) generates irq_work | ||
81 | * 4) goto 1 | ||
82 | */ | ||
83 | TRACE_EVENT_PERF_PERM(irq_work_exit, is_sampling_event(p_event) ? -EPERM : 0); | ||
84 | |||
85 | /* | ||
75 | * call_function - called when entering/exiting a call function interrupt | 86 | * call_function - called when entering/exiting a call function interrupt |
76 | * vector handler | 87 | * vector handler |
77 | */ | 88 | */ |
diff --git a/arch/x86/include/asm/tsc.h b/arch/x86/include/asm/tsc.h index 235be70d5bb4..57ae63cd6ee2 100644 --- a/arch/x86/include/asm/tsc.h +++ b/arch/x86/include/asm/tsc.h | |||
@@ -65,4 +65,7 @@ extern int notsc_setup(char *); | |||
65 | extern void tsc_save_sched_clock_state(void); | 65 | extern void tsc_save_sched_clock_state(void); |
66 | extern void tsc_restore_sched_clock_state(void); | 66 | extern void tsc_restore_sched_clock_state(void); |
67 | 67 | ||
68 | /* MSR based TSC calibration for Intel Atom SoC platforms */ | ||
69 | int try_msr_calibrate_tsc(unsigned long *fast_calibrate); | ||
70 | |||
68 | #endif /* _ASM_X86_TSC_H */ | 71 | #endif /* _ASM_X86_TSC_H */ |
diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h index 8ec57c07b125..0d592e0a5b84 100644 --- a/arch/x86/include/asm/uaccess.h +++ b/arch/x86/include/asm/uaccess.h | |||
@@ -40,22 +40,30 @@ | |||
40 | /* | 40 | /* |
41 | * Test whether a block of memory is a valid user space address. | 41 | * Test whether a block of memory is a valid user space address. |
42 | * Returns 0 if the range is valid, nonzero otherwise. | 42 | * Returns 0 if the range is valid, nonzero otherwise. |
43 | * | ||
44 | * This is equivalent to the following test: | ||
45 | * (u33)addr + (u33)size > (u33)current->addr_limit.seg (u65 for x86_64) | ||
46 | * | ||
47 | * This needs 33-bit (65-bit for x86_64) arithmetic. We have a carry... | ||
48 | */ | 43 | */ |
44 | static inline bool __chk_range_not_ok(unsigned long addr, unsigned long size, unsigned long limit) | ||
45 | { | ||
46 | /* | ||
47 | * If we have used "sizeof()" for the size, | ||
48 | * we know it won't overflow the limit (but | ||
49 | * it might overflow the 'addr', so it's | ||
50 | * important to subtract the size from the | ||
51 | * limit, not add it to the address). | ||
52 | */ | ||
53 | if (__builtin_constant_p(size)) | ||
54 | return addr > limit - size; | ||
55 | |||
56 | /* Arbitrary sizes? Be careful about overflow */ | ||
57 | addr += size; | ||
58 | if (addr < size) | ||
59 | return true; | ||
60 | return addr > limit; | ||
61 | } | ||
49 | 62 | ||
50 | #define __range_not_ok(addr, size, limit) \ | 63 | #define __range_not_ok(addr, size, limit) \ |
51 | ({ \ | 64 | ({ \ |
52 | unsigned long flag, roksum; \ | ||
53 | __chk_user_ptr(addr); \ | 65 | __chk_user_ptr(addr); \ |
54 | asm("add %3,%1 ; sbb %0,%0 ; cmp %1,%4 ; sbb $0,%0" \ | 66 | __chk_range_not_ok((unsigned long __force)(addr), size, limit); \ |
55 | : "=&r" (flag), "=r" (roksum) \ | ||
56 | : "1" (addr), "g" ((long)(size)), \ | ||
57 | "rm" (limit)); \ | ||
58 | flag; \ | ||
59 | }) | 67 | }) |
60 | 68 | ||
61 | /** | 69 | /** |
@@ -78,7 +86,7 @@ | |||
78 | * this function, memory access functions may still return -EFAULT. | 86 | * this function, memory access functions may still return -EFAULT. |
79 | */ | 87 | */ |
80 | #define access_ok(type, addr, size) \ | 88 | #define access_ok(type, addr, size) \ |
81 | (likely(__range_not_ok(addr, size, user_addr_max()) == 0)) | 89 | likely(!__range_not_ok(addr, size, user_addr_max())) |
82 | 90 | ||
83 | /* | 91 | /* |
84 | * The exception table consists of pairs of addresses relative to the | 92 | * The exception table consists of pairs of addresses relative to the |
@@ -525,6 +533,98 @@ extern __must_check long strnlen_user(const char __user *str, long n); | |||
525 | unsigned long __must_check clear_user(void __user *mem, unsigned long len); | 533 | unsigned long __must_check clear_user(void __user *mem, unsigned long len); |
526 | unsigned long __must_check __clear_user(void __user *mem, unsigned long len); | 534 | unsigned long __must_check __clear_user(void __user *mem, unsigned long len); |
527 | 535 | ||
536 | extern void __cmpxchg_wrong_size(void) | ||
537 | __compiletime_error("Bad argument size for cmpxchg"); | ||
538 | |||
539 | #define __user_atomic_cmpxchg_inatomic(uval, ptr, old, new, size) \ | ||
540 | ({ \ | ||
541 | int __ret = 0; \ | ||
542 | __typeof__(ptr) __uval = (uval); \ | ||
543 | __typeof__(*(ptr)) __old = (old); \ | ||
544 | __typeof__(*(ptr)) __new = (new); \ | ||
545 | switch (size) { \ | ||
546 | case 1: \ | ||
547 | { \ | ||
548 | asm volatile("\t" ASM_STAC "\n" \ | ||
549 | "1:\t" LOCK_PREFIX "cmpxchgb %4, %2\n" \ | ||
550 | "2:\t" ASM_CLAC "\n" \ | ||
551 | "\t.section .fixup, \"ax\"\n" \ | ||
552 | "3:\tmov %3, %0\n" \ | ||
553 | "\tjmp 2b\n" \ | ||
554 | "\t.previous\n" \ | ||
555 | _ASM_EXTABLE(1b, 3b) \ | ||
556 | : "+r" (__ret), "=a" (__old), "+m" (*(ptr)) \ | ||
557 | : "i" (-EFAULT), "q" (__new), "1" (__old) \ | ||
558 | : "memory" \ | ||
559 | ); \ | ||
560 | break; \ | ||
561 | } \ | ||
562 | case 2: \ | ||
563 | { \ | ||
564 | asm volatile("\t" ASM_STAC "\n" \ | ||
565 | "1:\t" LOCK_PREFIX "cmpxchgw %4, %2\n" \ | ||
566 | "2:\t" ASM_CLAC "\n" \ | ||
567 | "\t.section .fixup, \"ax\"\n" \ | ||
568 | "3:\tmov %3, %0\n" \ | ||
569 | "\tjmp 2b\n" \ | ||
570 | "\t.previous\n" \ | ||
571 | _ASM_EXTABLE(1b, 3b) \ | ||
572 | : "+r" (__ret), "=a" (__old), "+m" (*(ptr)) \ | ||
573 | : "i" (-EFAULT), "r" (__new), "1" (__old) \ | ||
574 | : "memory" \ | ||
575 | ); \ | ||
576 | break; \ | ||
577 | } \ | ||
578 | case 4: \ | ||
579 | { \ | ||
580 | asm volatile("\t" ASM_STAC "\n" \ | ||
581 | "1:\t" LOCK_PREFIX "cmpxchgl %4, %2\n" \ | ||
582 | "2:\t" ASM_CLAC "\n" \ | ||
583 | "\t.section .fixup, \"ax\"\n" \ | ||
584 | "3:\tmov %3, %0\n" \ | ||
585 | "\tjmp 2b\n" \ | ||
586 | "\t.previous\n" \ | ||
587 | _ASM_EXTABLE(1b, 3b) \ | ||
588 | : "+r" (__ret), "=a" (__old), "+m" (*(ptr)) \ | ||
589 | : "i" (-EFAULT), "r" (__new), "1" (__old) \ | ||
590 | : "memory" \ | ||
591 | ); \ | ||
592 | break; \ | ||
593 | } \ | ||
594 | case 8: \ | ||
595 | { \ | ||
596 | if (!IS_ENABLED(CONFIG_X86_64)) \ | ||
597 | __cmpxchg_wrong_size(); \ | ||
598 | \ | ||
599 | asm volatile("\t" ASM_STAC "\n" \ | ||
600 | "1:\t" LOCK_PREFIX "cmpxchgq %4, %2\n" \ | ||
601 | "2:\t" ASM_CLAC "\n" \ | ||
602 | "\t.section .fixup, \"ax\"\n" \ | ||
603 | "3:\tmov %3, %0\n" \ | ||
604 | "\tjmp 2b\n" \ | ||
605 | "\t.previous\n" \ | ||
606 | _ASM_EXTABLE(1b, 3b) \ | ||
607 | : "+r" (__ret), "=a" (__old), "+m" (*(ptr)) \ | ||
608 | : "i" (-EFAULT), "r" (__new), "1" (__old) \ | ||
609 | : "memory" \ | ||
610 | ); \ | ||
611 | break; \ | ||
612 | } \ | ||
613 | default: \ | ||
614 | __cmpxchg_wrong_size(); \ | ||
615 | } \ | ||
616 | *__uval = __old; \ | ||
617 | __ret; \ | ||
618 | }) | ||
619 | |||
620 | #define user_atomic_cmpxchg_inatomic(uval, ptr, old, new) \ | ||
621 | ({ \ | ||
622 | access_ok(VERIFY_WRITE, (ptr), sizeof(*(ptr))) ? \ | ||
623 | __user_atomic_cmpxchg_inatomic((uval), (ptr), \ | ||
624 | (old), (new), sizeof(*(ptr))) : \ | ||
625 | -EFAULT; \ | ||
626 | }) | ||
627 | |||
528 | /* | 628 | /* |
529 | * movsl can be slow when source and dest are not both 8-byte aligned | 629 | * movsl can be slow when source and dest are not both 8-byte aligned |
530 | */ | 630 | */ |
diff --git a/arch/x86/include/asm/uaccess_64.h b/arch/x86/include/asm/uaccess_64.h index 190413d0de57..12a26b979bf1 100644 --- a/arch/x86/include/asm/uaccess_64.h +++ b/arch/x86/include/asm/uaccess_64.h | |||
@@ -204,13 +204,13 @@ int __copy_in_user(void __user *dst, const void __user *src, unsigned size) | |||
204 | static __must_check __always_inline int | 204 | static __must_check __always_inline int |
205 | __copy_from_user_inatomic(void *dst, const void __user *src, unsigned size) | 205 | __copy_from_user_inatomic(void *dst, const void __user *src, unsigned size) |
206 | { | 206 | { |
207 | return __copy_from_user_nocheck(dst, (__force const void *)src, size); | 207 | return __copy_from_user_nocheck(dst, src, size); |
208 | } | 208 | } |
209 | 209 | ||
210 | static __must_check __always_inline int | 210 | static __must_check __always_inline int |
211 | __copy_to_user_inatomic(void __user *dst, const void *src, unsigned size) | 211 | __copy_to_user_inatomic(void __user *dst, const void *src, unsigned size) |
212 | { | 212 | { |
213 | return __copy_to_user_nocheck((__force void *)dst, src, size); | 213 | return __copy_to_user_nocheck(dst, src, size); |
214 | } | 214 | } |
215 | 215 | ||
216 | extern long __copy_user_nocache(void *dst, const void __user *src, | 216 | extern long __copy_user_nocache(void *dst, const void __user *src, |
diff --git a/arch/x86/include/asm/xsave.h b/arch/x86/include/asm/xsave.h index 0415cdabb5a6..554738963b28 100644 --- a/arch/x86/include/asm/xsave.h +++ b/arch/x86/include/asm/xsave.h | |||
@@ -9,6 +9,8 @@ | |||
9 | #define XSTATE_FP 0x1 | 9 | #define XSTATE_FP 0x1 |
10 | #define XSTATE_SSE 0x2 | 10 | #define XSTATE_SSE 0x2 |
11 | #define XSTATE_YMM 0x4 | 11 | #define XSTATE_YMM 0x4 |
12 | #define XSTATE_BNDREGS 0x8 | ||
13 | #define XSTATE_BNDCSR 0x10 | ||
12 | 14 | ||
13 | #define XSTATE_FPSSE (XSTATE_FP | XSTATE_SSE) | 15 | #define XSTATE_FPSSE (XSTATE_FP | XSTATE_SSE) |
14 | 16 | ||
@@ -20,10 +22,14 @@ | |||
20 | #define XSAVE_YMM_SIZE 256 | 22 | #define XSAVE_YMM_SIZE 256 |
21 | #define XSAVE_YMM_OFFSET (XSAVE_HDR_SIZE + XSAVE_HDR_OFFSET) | 23 | #define XSAVE_YMM_OFFSET (XSAVE_HDR_SIZE + XSAVE_HDR_OFFSET) |
22 | 24 | ||
23 | /* | 25 | /* Supported features which support lazy state saving */ |
24 | * These are the features that the OS can handle currently. | 26 | #define XSTATE_LAZY (XSTATE_FP | XSTATE_SSE | XSTATE_YMM) |
25 | */ | 27 | |
26 | #define XCNTXT_MASK (XSTATE_FP | XSTATE_SSE | XSTATE_YMM) | 28 | /* Supported features which require eager state saving */ |
29 | #define XSTATE_EAGER (XSTATE_BNDREGS | XSTATE_BNDCSR) | ||
30 | |||
31 | /* All currently supported features */ | ||
32 | #define XCNTXT_MASK (XSTATE_LAZY | XSTATE_EAGER) | ||
27 | 33 | ||
28 | #ifdef CONFIG_X86_64 | 34 | #ifdef CONFIG_X86_64 |
29 | #define REX_PREFIX "0x48, " | 35 | #define REX_PREFIX "0x48, " |
diff --git a/arch/x86/include/uapi/asm/bootparam.h b/arch/x86/include/uapi/asm/bootparam.h index 9c3733c5f8f7..225b0988043a 100644 --- a/arch/x86/include/uapi/asm/bootparam.h +++ b/arch/x86/include/uapi/asm/bootparam.h | |||
@@ -6,6 +6,7 @@ | |||
6 | #define SETUP_E820_EXT 1 | 6 | #define SETUP_E820_EXT 1 |
7 | #define SETUP_DTB 2 | 7 | #define SETUP_DTB 2 |
8 | #define SETUP_PCI 3 | 8 | #define SETUP_PCI 3 |
9 | #define SETUP_EFI 4 | ||
9 | 10 | ||
10 | /* ram_size flags */ | 11 | /* ram_size flags */ |
11 | #define RAMDISK_IMAGE_START_MASK 0x07FF | 12 | #define RAMDISK_IMAGE_START_MASK 0x07FF |
@@ -23,6 +24,7 @@ | |||
23 | #define XLF_CAN_BE_LOADED_ABOVE_4G (1<<1) | 24 | #define XLF_CAN_BE_LOADED_ABOVE_4G (1<<1) |
24 | #define XLF_EFI_HANDOVER_32 (1<<2) | 25 | #define XLF_EFI_HANDOVER_32 (1<<2) |
25 | #define XLF_EFI_HANDOVER_64 (1<<3) | 26 | #define XLF_EFI_HANDOVER_64 (1<<3) |
27 | #define XLF_EFI_KEXEC (1<<4) | ||
26 | 28 | ||
27 | #ifndef __ASSEMBLY__ | 29 | #ifndef __ASSEMBLY__ |
28 | 30 | ||
diff --git a/arch/x86/include/uapi/asm/msr-index.h b/arch/x86/include/uapi/asm/msr-index.h index 37813b5ddc37..59cea185ad1d 100644 --- a/arch/x86/include/uapi/asm/msr-index.h +++ b/arch/x86/include/uapi/asm/msr-index.h | |||
@@ -184,6 +184,7 @@ | |||
184 | #define MSR_AMD64_PATCH_LOADER 0xc0010020 | 184 | #define MSR_AMD64_PATCH_LOADER 0xc0010020 |
185 | #define MSR_AMD64_OSVW_ID_LENGTH 0xc0010140 | 185 | #define MSR_AMD64_OSVW_ID_LENGTH 0xc0010140 |
186 | #define MSR_AMD64_OSVW_STATUS 0xc0010141 | 186 | #define MSR_AMD64_OSVW_STATUS 0xc0010141 |
187 | #define MSR_AMD64_LS_CFG 0xc0011020 | ||
187 | #define MSR_AMD64_DC_CFG 0xc0011022 | 188 | #define MSR_AMD64_DC_CFG 0xc0011022 |
188 | #define MSR_AMD64_BU_CFG2 0xc001102a | 189 | #define MSR_AMD64_BU_CFG2 0xc001102a |
189 | #define MSR_AMD64_IBSFETCHCTL 0xc0011030 | 190 | #define MSR_AMD64_IBSFETCHCTL 0xc0011030 |
diff --git a/arch/x86/include/uapi/asm/stat.h b/arch/x86/include/uapi/asm/stat.h index 7b3ddc348585..bc03eb5d6360 100644 --- a/arch/x86/include/uapi/asm/stat.h +++ b/arch/x86/include/uapi/asm/stat.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef _ASM_X86_STAT_H | 1 | #ifndef _ASM_X86_STAT_H |
2 | #define _ASM_X86_STAT_H | 2 | #define _ASM_X86_STAT_H |
3 | 3 | ||
4 | #include <asm/posix_types.h> | ||
5 | |||
4 | #define STAT_HAVE_NSEC 1 | 6 | #define STAT_HAVE_NSEC 1 |
5 | 7 | ||
6 | #ifdef __i386__ | 8 | #ifdef __i386__ |
@@ -78,26 +80,26 @@ struct stat64 { | |||
78 | #else /* __i386__ */ | 80 | #else /* __i386__ */ |
79 | 81 | ||
80 | struct stat { | 82 | struct stat { |
81 | unsigned long st_dev; | 83 | __kernel_ulong_t st_dev; |
82 | unsigned long st_ino; | 84 | __kernel_ulong_t st_ino; |
83 | unsigned long st_nlink; | 85 | __kernel_ulong_t st_nlink; |
84 | 86 | ||
85 | unsigned int st_mode; | 87 | unsigned int st_mode; |
86 | unsigned int st_uid; | 88 | unsigned int st_uid; |
87 | unsigned int st_gid; | 89 | unsigned int st_gid; |
88 | unsigned int __pad0; | 90 | unsigned int __pad0; |
89 | unsigned long st_rdev; | 91 | __kernel_ulong_t st_rdev; |
90 | long st_size; | 92 | __kernel_long_t st_size; |
91 | long st_blksize; | 93 | __kernel_long_t st_blksize; |
92 | long st_blocks; /* Number 512-byte blocks allocated. */ | 94 | __kernel_long_t st_blocks; /* Number 512-byte blocks allocated. */ |
93 | 95 | ||
94 | unsigned long st_atime; | 96 | __kernel_ulong_t st_atime; |
95 | unsigned long st_atime_nsec; | 97 | __kernel_ulong_t st_atime_nsec; |
96 | unsigned long st_mtime; | 98 | __kernel_ulong_t st_mtime; |
97 | unsigned long st_mtime_nsec; | 99 | __kernel_ulong_t st_mtime_nsec; |
98 | unsigned long st_ctime; | 100 | __kernel_ulong_t st_ctime; |
99 | unsigned long st_ctime_nsec; | 101 | __kernel_ulong_t st_ctime_nsec; |
100 | long __unused[3]; | 102 | __kernel_long_t __unused[3]; |
101 | }; | 103 | }; |
102 | 104 | ||
103 | /* We don't need to memset the whole thing just to initialize the padding */ | 105 | /* We don't need to memset the whole thing just to initialize the padding */ |
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile index 9b0a34e2cd79..cb648c84b327 100644 --- a/arch/x86/kernel/Makefile +++ b/arch/x86/kernel/Makefile | |||
@@ -29,10 +29,11 @@ obj-$(CONFIG_X86_64) += sys_x86_64.o x8664_ksyms_64.o | |||
29 | obj-y += syscall_$(BITS).o | 29 | obj-y += syscall_$(BITS).o |
30 | obj-$(CONFIG_X86_64) += vsyscall_64.o | 30 | obj-$(CONFIG_X86_64) += vsyscall_64.o |
31 | obj-$(CONFIG_X86_64) += vsyscall_emu_64.o | 31 | obj-$(CONFIG_X86_64) += vsyscall_emu_64.o |
32 | obj-$(CONFIG_SYSFS) += ksysfs.o | ||
32 | obj-y += bootflag.o e820.o | 33 | obj-y += bootflag.o e820.o |
33 | obj-y += pci-dma.o quirks.o topology.o kdebugfs.o | 34 | obj-y += pci-dma.o quirks.o topology.o kdebugfs.o |
34 | obj-y += alternative.o i8253.o pci-nommu.o hw_breakpoint.o | 35 | obj-y += alternative.o i8253.o pci-nommu.o hw_breakpoint.o |
35 | obj-y += tsc.o io_delay.o rtc.o | 36 | obj-y += tsc.o tsc_msr.o io_delay.o rtc.o |
36 | obj-y += pci-iommu_table.o | 37 | obj-y += pci-iommu_table.o |
37 | obj-y += resource.o | 38 | obj-y += resource.o |
38 | 39 | ||
@@ -91,15 +92,6 @@ obj-$(CONFIG_PARAVIRT_CLOCK) += pvclock.o | |||
91 | 92 | ||
92 | obj-$(CONFIG_PCSPKR_PLATFORM) += pcspeaker.o | 93 | obj-$(CONFIG_PCSPKR_PLATFORM) += pcspeaker.o |
93 | 94 | ||
94 | obj-$(CONFIG_MICROCODE_EARLY) += microcode_core_early.o | ||
95 | obj-$(CONFIG_MICROCODE_INTEL_EARLY) += microcode_intel_early.o | ||
96 | obj-$(CONFIG_MICROCODE_INTEL_LIB) += microcode_intel_lib.o | ||
97 | microcode-y := microcode_core.o | ||
98 | microcode-$(CONFIG_MICROCODE_INTEL) += microcode_intel.o | ||
99 | microcode-$(CONFIG_MICROCODE_AMD) += microcode_amd.o | ||
100 | obj-$(CONFIG_MICROCODE_AMD_EARLY) += microcode_amd_early.o | ||
101 | obj-$(CONFIG_MICROCODE) += microcode.o | ||
102 | |||
103 | obj-$(CONFIG_X86_CHECK_BIOS_CORRUPTION) += check.o | 95 | obj-$(CONFIG_X86_CHECK_BIOS_CORRUPTION) += check.o |
104 | 96 | ||
105 | obj-$(CONFIG_SWIOTLB) += pci-swiotlb.o | 97 | obj-$(CONFIG_SWIOTLB) += pci-swiotlb.o |
@@ -111,6 +103,7 @@ obj-$(CONFIG_EFI) += sysfb_efi.o | |||
111 | 103 | ||
112 | obj-$(CONFIG_PERF_EVENTS) += perf_regs.o | 104 | obj-$(CONFIG_PERF_EVENTS) += perf_regs.o |
113 | obj-$(CONFIG_TRACING) += tracepoint.o | 105 | obj-$(CONFIG_TRACING) += tracepoint.o |
106 | obj-$(CONFIG_IOSF_MBI) += iosf_mbi.o | ||
114 | 107 | ||
115 | ### | 108 | ### |
116 | # 64 bit specific files | 109 | # 64 bit specific files |
diff --git a/arch/x86/kernel/acpi/cstate.c b/arch/x86/kernel/acpi/cstate.c index d2b7f27781bc..e69182fd01cf 100644 --- a/arch/x86/kernel/acpi/cstate.c +++ b/arch/x86/kernel/acpi/cstate.c | |||
@@ -150,29 +150,6 @@ int acpi_processor_ffh_cstate_probe(unsigned int cpu, | |||
150 | } | 150 | } |
151 | EXPORT_SYMBOL_GPL(acpi_processor_ffh_cstate_probe); | 151 | EXPORT_SYMBOL_GPL(acpi_processor_ffh_cstate_probe); |
152 | 152 | ||
153 | /* | ||
154 | * This uses new MONITOR/MWAIT instructions on P4 processors with PNI, | ||
155 | * which can obviate IPI to trigger checking of need_resched. | ||
156 | * We execute MONITOR against need_resched and enter optimized wait state | ||
157 | * through MWAIT. Whenever someone changes need_resched, we would be woken | ||
158 | * up from MWAIT (without an IPI). | ||
159 | * | ||
160 | * New with Core Duo processors, MWAIT can take some hints based on CPU | ||
161 | * capability. | ||
162 | */ | ||
163 | void mwait_idle_with_hints(unsigned long ax, unsigned long cx) | ||
164 | { | ||
165 | if (!need_resched()) { | ||
166 | if (this_cpu_has(X86_FEATURE_CLFLUSH_MONITOR)) | ||
167 | clflush((void *)¤t_thread_info()->flags); | ||
168 | |||
169 | __monitor((void *)¤t_thread_info()->flags, 0, 0); | ||
170 | smp_mb(); | ||
171 | if (!need_resched()) | ||
172 | __mwait(ax, cx); | ||
173 | } | ||
174 | } | ||
175 | |||
176 | void acpi_processor_ffh_cstate_enter(struct acpi_processor_cx *cx) | 153 | void acpi_processor_ffh_cstate_enter(struct acpi_processor_cx *cx) |
177 | { | 154 | { |
178 | unsigned int cpu = smp_processor_id(); | 155 | unsigned int cpu = smp_processor_id(); |
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index d278736bf774..7f26c9a70a9e 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c | |||
@@ -75,6 +75,13 @@ unsigned int max_physical_apicid; | |||
75 | physid_mask_t phys_cpu_present_map; | 75 | physid_mask_t phys_cpu_present_map; |
76 | 76 | ||
77 | /* | 77 | /* |
78 | * Processor to be disabled specified by kernel parameter | ||
79 | * disable_cpu_apicid=<int>, mostly used for the kdump 2nd kernel to | ||
80 | * avoid undefined behaviour caused by sending INIT from AP to BSP. | ||
81 | */ | ||
82 | static unsigned int disabled_cpu_apicid __read_mostly = BAD_APICID; | ||
83 | |||
84 | /* | ||
78 | * Map cpu index to physical APIC ID | 85 | * Map cpu index to physical APIC ID |
79 | */ | 86 | */ |
80 | DEFINE_EARLY_PER_CPU_READ_MOSTLY(u16, x86_cpu_to_apicid, BAD_APICID); | 87 | DEFINE_EARLY_PER_CPU_READ_MOSTLY(u16, x86_cpu_to_apicid, BAD_APICID); |
@@ -1968,7 +1975,7 @@ __visible void smp_trace_spurious_interrupt(struct pt_regs *regs) | |||
1968 | */ | 1975 | */ |
1969 | static inline void __smp_error_interrupt(struct pt_regs *regs) | 1976 | static inline void __smp_error_interrupt(struct pt_regs *regs) |
1970 | { | 1977 | { |
1971 | u32 v0, v1; | 1978 | u32 v; |
1972 | u32 i = 0; | 1979 | u32 i = 0; |
1973 | static const char * const error_interrupt_reason[] = { | 1980 | static const char * const error_interrupt_reason[] = { |
1974 | "Send CS error", /* APIC Error Bit 0 */ | 1981 | "Send CS error", /* APIC Error Bit 0 */ |
@@ -1982,21 +1989,20 @@ static inline void __smp_error_interrupt(struct pt_regs *regs) | |||
1982 | }; | 1989 | }; |
1983 | 1990 | ||
1984 | /* First tickle the hardware, only then report what went on. -- REW */ | 1991 | /* First tickle the hardware, only then report what went on. -- REW */ |
1985 | v0 = apic_read(APIC_ESR); | ||
1986 | apic_write(APIC_ESR, 0); | 1992 | apic_write(APIC_ESR, 0); |
1987 | v1 = apic_read(APIC_ESR); | 1993 | v = apic_read(APIC_ESR); |
1988 | ack_APIC_irq(); | 1994 | ack_APIC_irq(); |
1989 | atomic_inc(&irq_err_count); | 1995 | atomic_inc(&irq_err_count); |
1990 | 1996 | ||
1991 | apic_printk(APIC_DEBUG, KERN_DEBUG "APIC error on CPU%d: %02x(%02x)", | 1997 | apic_printk(APIC_DEBUG, KERN_DEBUG "APIC error on CPU%d: %02x", |
1992 | smp_processor_id(), v0 , v1); | 1998 | smp_processor_id(), v); |
1993 | 1999 | ||
1994 | v1 = v1 & 0xff; | 2000 | v &= 0xff; |
1995 | while (v1) { | 2001 | while (v) { |
1996 | if (v1 & 0x1) | 2002 | if (v & 0x1) |
1997 | apic_printk(APIC_DEBUG, KERN_CONT " : %s", error_interrupt_reason[i]); | 2003 | apic_printk(APIC_DEBUG, KERN_CONT " : %s", error_interrupt_reason[i]); |
1998 | i++; | 2004 | i++; |
1999 | v1 >>= 1; | 2005 | v >>= 1; |
2000 | } | 2006 | } |
2001 | 2007 | ||
2002 | apic_printk(APIC_DEBUG, KERN_CONT "\n"); | 2008 | apic_printk(APIC_DEBUG, KERN_CONT "\n"); |
@@ -2115,6 +2121,39 @@ int generic_processor_info(int apicid, int version) | |||
2115 | phys_cpu_present_map); | 2121 | phys_cpu_present_map); |
2116 | 2122 | ||
2117 | /* | 2123 | /* |
2124 | * boot_cpu_physical_apicid is designed to have the apicid | ||
2125 | * returned by read_apic_id(), i.e, the apicid of the | ||
2126 | * currently booting-up processor. However, on some platforms, | ||
2127 | * it is temporarily modified by the apicid reported as BSP | ||
2128 | * through MP table. Concretely: | ||
2129 | * | ||
2130 | * - arch/x86/kernel/mpparse.c: MP_processor_info() | ||
2131 | * - arch/x86/mm/amdtopology.c: amd_numa_init() | ||
2132 | * - arch/x86/platform/visws/visws_quirks.c: MP_processor_info() | ||
2133 | * | ||
2134 | * This function is executed with the modified | ||
2135 | * boot_cpu_physical_apicid. So, disabled_cpu_apicid kernel | ||
2136 | * parameter doesn't work to disable APs on kdump 2nd kernel. | ||
2137 | * | ||
2138 | * Since fixing handling of boot_cpu_physical_apicid requires | ||
2139 | * another discussion and tests on each platform, we leave it | ||
2140 | * for now and here we use read_apic_id() directly in this | ||
2141 | * function, generic_processor_info(). | ||
2142 | */ | ||
2143 | if (disabled_cpu_apicid != BAD_APICID && | ||
2144 | disabled_cpu_apicid != read_apic_id() && | ||
2145 | disabled_cpu_apicid == apicid) { | ||
2146 | int thiscpu = num_processors + disabled_cpus; | ||
2147 | |||
2148 | pr_warning("APIC: Disabling requested cpu." | ||
2149 | " Processor %d/0x%x ignored.\n", | ||
2150 | thiscpu, apicid); | ||
2151 | |||
2152 | disabled_cpus++; | ||
2153 | return -ENODEV; | ||
2154 | } | ||
2155 | |||
2156 | /* | ||
2118 | * If boot cpu has not been detected yet, then only allow upto | 2157 | * If boot cpu has not been detected yet, then only allow upto |
2119 | * nr_cpu_ids - 1 processors and keep one slot free for boot cpu | 2158 | * nr_cpu_ids - 1 processors and keep one slot free for boot cpu |
2120 | */ | 2159 | */ |
@@ -2592,3 +2631,12 @@ static int __init lapic_insert_resource(void) | |||
2592 | * that is using request_resource | 2631 | * that is using request_resource |
2593 | */ | 2632 | */ |
2594 | late_initcall(lapic_insert_resource); | 2633 | late_initcall(lapic_insert_resource); |
2634 | |||
2635 | static int __init apic_set_disabled_cpu_apicid(char *arg) | ||
2636 | { | ||
2637 | if (!arg || !get_option(&arg, &disabled_cpu_apicid)) | ||
2638 | return -EINVAL; | ||
2639 | |||
2640 | return 0; | ||
2641 | } | ||
2642 | early_param("disable_cpu_apicid", apic_set_disabled_cpu_apicid); | ||
diff --git a/arch/x86/kernel/apic/apic_flat_64.c b/arch/x86/kernel/apic/apic_flat_64.c index 00c77cf78e9e..5d5b9eb2b7a4 100644 --- a/arch/x86/kernel/apic/apic_flat_64.c +++ b/arch/x86/kernel/apic/apic_flat_64.c | |||
@@ -14,7 +14,6 @@ | |||
14 | #include <linux/string.h> | 14 | #include <linux/string.h> |
15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
16 | #include <linux/ctype.h> | 16 | #include <linux/ctype.h> |
17 | #include <linux/init.h> | ||
18 | #include <linux/hardirq.h> | 17 | #include <linux/hardirq.h> |
19 | #include <linux/module.h> | 18 | #include <linux/module.h> |
20 | #include <asm/smp.h> | 19 | #include <asm/smp.h> |
diff --git a/arch/x86/kernel/apic/apic_noop.c b/arch/x86/kernel/apic/apic_noop.c index e145f28b4099..191ce75c0e54 100644 --- a/arch/x86/kernel/apic/apic_noop.c +++ b/arch/x86/kernel/apic/apic_noop.c | |||
@@ -15,7 +15,6 @@ | |||
15 | #include <linux/string.h> | 15 | #include <linux/string.h> |
16 | #include <linux/kernel.h> | 16 | #include <linux/kernel.h> |
17 | #include <linux/ctype.h> | 17 | #include <linux/ctype.h> |
18 | #include <linux/init.h> | ||
19 | #include <linux/errno.h> | 18 | #include <linux/errno.h> |
20 | #include <asm/fixmap.h> | 19 | #include <asm/fixmap.h> |
21 | #include <asm/mpspec.h> | 20 | #include <asm/mpspec.h> |
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index e63a5bd2a78f..a43f068ebec1 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
@@ -1142,9 +1142,10 @@ next: | |||
1142 | if (test_bit(vector, used_vectors)) | 1142 | if (test_bit(vector, used_vectors)) |
1143 | goto next; | 1143 | goto next; |
1144 | 1144 | ||
1145 | for_each_cpu_and(new_cpu, tmp_mask, cpu_online_mask) | 1145 | for_each_cpu_and(new_cpu, tmp_mask, cpu_online_mask) { |
1146 | if (per_cpu(vector_irq, new_cpu)[vector] != -1) | 1146 | if (per_cpu(vector_irq, new_cpu)[vector] > VECTOR_UNDEFINED) |
1147 | goto next; | 1147 | goto next; |
1148 | } | ||
1148 | /* Found one! */ | 1149 | /* Found one! */ |
1149 | current_vector = vector; | 1150 | current_vector = vector; |
1150 | current_offset = offset; | 1151 | current_offset = offset; |
@@ -1183,7 +1184,7 @@ static void __clear_irq_vector(int irq, struct irq_cfg *cfg) | |||
1183 | 1184 | ||
1184 | vector = cfg->vector; | 1185 | vector = cfg->vector; |
1185 | for_each_cpu_and(cpu, cfg->domain, cpu_online_mask) | 1186 | for_each_cpu_and(cpu, cfg->domain, cpu_online_mask) |
1186 | per_cpu(vector_irq, cpu)[vector] = -1; | 1187 | per_cpu(vector_irq, cpu)[vector] = VECTOR_UNDEFINED; |
1187 | 1188 | ||
1188 | cfg->vector = 0; | 1189 | cfg->vector = 0; |
1189 | cpumask_clear(cfg->domain); | 1190 | cpumask_clear(cfg->domain); |
@@ -1191,11 +1192,10 @@ static void __clear_irq_vector(int irq, struct irq_cfg *cfg) | |||
1191 | if (likely(!cfg->move_in_progress)) | 1192 | if (likely(!cfg->move_in_progress)) |
1192 | return; | 1193 | return; |
1193 | for_each_cpu_and(cpu, cfg->old_domain, cpu_online_mask) { | 1194 | for_each_cpu_and(cpu, cfg->old_domain, cpu_online_mask) { |
1194 | for (vector = FIRST_EXTERNAL_VECTOR; vector < NR_VECTORS; | 1195 | for (vector = FIRST_EXTERNAL_VECTOR; vector < NR_VECTORS; vector++) { |
1195 | vector++) { | ||
1196 | if (per_cpu(vector_irq, cpu)[vector] != irq) | 1196 | if (per_cpu(vector_irq, cpu)[vector] != irq) |
1197 | continue; | 1197 | continue; |
1198 | per_cpu(vector_irq, cpu)[vector] = -1; | 1198 | per_cpu(vector_irq, cpu)[vector] = VECTOR_UNDEFINED; |
1199 | break; | 1199 | break; |
1200 | } | 1200 | } |
1201 | } | 1201 | } |
@@ -1228,12 +1228,12 @@ void __setup_vector_irq(int cpu) | |||
1228 | /* Mark the free vectors */ | 1228 | /* Mark the free vectors */ |
1229 | for (vector = 0; vector < NR_VECTORS; ++vector) { | 1229 | for (vector = 0; vector < NR_VECTORS; ++vector) { |
1230 | irq = per_cpu(vector_irq, cpu)[vector]; | 1230 | irq = per_cpu(vector_irq, cpu)[vector]; |
1231 | if (irq < 0) | 1231 | if (irq <= VECTOR_UNDEFINED) |
1232 | continue; | 1232 | continue; |
1233 | 1233 | ||
1234 | cfg = irq_cfg(irq); | 1234 | cfg = irq_cfg(irq); |
1235 | if (!cpumask_test_cpu(cpu, cfg->domain)) | 1235 | if (!cpumask_test_cpu(cpu, cfg->domain)) |
1236 | per_cpu(vector_irq, cpu)[vector] = -1; | 1236 | per_cpu(vector_irq, cpu)[vector] = VECTOR_UNDEFINED; |
1237 | } | 1237 | } |
1238 | raw_spin_unlock(&vector_lock); | 1238 | raw_spin_unlock(&vector_lock); |
1239 | } | 1239 | } |
@@ -2202,13 +2202,13 @@ asmlinkage void smp_irq_move_cleanup_interrupt(void) | |||
2202 | 2202 | ||
2203 | me = smp_processor_id(); | 2203 | me = smp_processor_id(); |
2204 | for (vector = FIRST_EXTERNAL_VECTOR; vector < NR_VECTORS; vector++) { | 2204 | for (vector = FIRST_EXTERNAL_VECTOR; vector < NR_VECTORS; vector++) { |
2205 | unsigned int irq; | 2205 | int irq; |
2206 | unsigned int irr; | 2206 | unsigned int irr; |
2207 | struct irq_desc *desc; | 2207 | struct irq_desc *desc; |
2208 | struct irq_cfg *cfg; | 2208 | struct irq_cfg *cfg; |
2209 | irq = __this_cpu_read(vector_irq[vector]); | 2209 | irq = __this_cpu_read(vector_irq[vector]); |
2210 | 2210 | ||
2211 | if (irq == -1) | 2211 | if (irq <= VECTOR_UNDEFINED) |
2212 | continue; | 2212 | continue; |
2213 | 2213 | ||
2214 | desc = irq_to_desc(irq); | 2214 | desc = irq_to_desc(irq); |
diff --git a/arch/x86/kernel/apic/ipi.c b/arch/x86/kernel/apic/ipi.c index 7434d8556d09..62071569bd50 100644 --- a/arch/x86/kernel/apic/ipi.c +++ b/arch/x86/kernel/apic/ipi.c | |||
@@ -1,6 +1,5 @@ | |||
1 | #include <linux/cpumask.h> | 1 | #include <linux/cpumask.h> |
2 | #include <linux/interrupt.h> | 2 | #include <linux/interrupt.h> |
3 | #include <linux/init.h> | ||
4 | 3 | ||
5 | #include <linux/mm.h> | 4 | #include <linux/mm.h> |
6 | #include <linux/delay.h> | 5 | #include <linux/delay.h> |
diff --git a/arch/x86/kernel/apic/summit_32.c b/arch/x86/kernel/apic/summit_32.c index 77c95c0e1bf7..00146f9b0254 100644 --- a/arch/x86/kernel/apic/summit_32.c +++ b/arch/x86/kernel/apic/summit_32.c | |||
@@ -29,7 +29,6 @@ | |||
29 | #define pr_fmt(fmt) "summit: %s: " fmt, __func__ | 29 | #define pr_fmt(fmt) "summit: %s: " fmt, __func__ |
30 | 30 | ||
31 | #include <linux/mm.h> | 31 | #include <linux/mm.h> |
32 | #include <linux/init.h> | ||
33 | #include <asm/io.h> | 32 | #include <asm/io.h> |
34 | #include <asm/bios_ebda.h> | 33 | #include <asm/bios_ebda.h> |
35 | 34 | ||
diff --git a/arch/x86/kernel/apic/x2apic_cluster.c b/arch/x86/kernel/apic/x2apic_cluster.c index 140e29db478d..cac85ee6913f 100644 --- a/arch/x86/kernel/apic/x2apic_cluster.c +++ b/arch/x86/kernel/apic/x2apic_cluster.c | |||
@@ -3,7 +3,6 @@ | |||
3 | #include <linux/string.h> | 3 | #include <linux/string.h> |
4 | #include <linux/kernel.h> | 4 | #include <linux/kernel.h> |
5 | #include <linux/ctype.h> | 5 | #include <linux/ctype.h> |
6 | #include <linux/init.h> | ||
7 | #include <linux/dmar.h> | 6 | #include <linux/dmar.h> |
8 | #include <linux/cpu.h> | 7 | #include <linux/cpu.h> |
9 | 8 | ||
diff --git a/arch/x86/kernel/apic/x2apic_phys.c b/arch/x86/kernel/apic/x2apic_phys.c index 562a76d433c8..de231e328cae 100644 --- a/arch/x86/kernel/apic/x2apic_phys.c +++ b/arch/x86/kernel/apic/x2apic_phys.c | |||
@@ -3,7 +3,6 @@ | |||
3 | #include <linux/string.h> | 3 | #include <linux/string.h> |
4 | #include <linux/kernel.h> | 4 | #include <linux/kernel.h> |
5 | #include <linux/ctype.h> | 5 | #include <linux/ctype.h> |
6 | #include <linux/init.h> | ||
7 | #include <linux/dmar.h> | 6 | #include <linux/dmar.h> |
8 | 7 | ||
9 | #include <asm/smp.h> | 8 | #include <asm/smp.h> |
diff --git a/arch/x86/kernel/check.c b/arch/x86/kernel/check.c index e2dbcb7dabdd..83a7995625a6 100644 --- a/arch/x86/kernel/check.c +++ b/arch/x86/kernel/check.c | |||
@@ -91,7 +91,7 @@ void __init setup_bios_corruption_check(void) | |||
91 | 91 | ||
92 | corruption_check_size = round_up(corruption_check_size, PAGE_SIZE); | 92 | corruption_check_size = round_up(corruption_check_size, PAGE_SIZE); |
93 | 93 | ||
94 | for_each_free_mem_range(i, MAX_NUMNODES, &start, &end, NULL) { | 94 | for_each_free_mem_range(i, NUMA_NO_NODE, &start, &end, NULL) { |
95 | start = clamp_t(phys_addr_t, round_up(start, PAGE_SIZE), | 95 | start = clamp_t(phys_addr_t, round_up(start, PAGE_SIZE), |
96 | PAGE_SIZE, corruption_check_size); | 96 | PAGE_SIZE, corruption_check_size); |
97 | end = clamp_t(phys_addr_t, round_down(end, PAGE_SIZE), | 97 | end = clamp_t(phys_addr_t, round_down(end, PAGE_SIZE), |
diff --git a/arch/x86/kernel/cpu/Makefile b/arch/x86/kernel/cpu/Makefile index 47b56a7e99cb..7fd54f09b011 100644 --- a/arch/x86/kernel/cpu/Makefile +++ b/arch/x86/kernel/cpu/Makefile | |||
@@ -36,12 +36,13 @@ obj-$(CONFIG_CPU_SUP_AMD) += perf_event_amd_iommu.o | |||
36 | endif | 36 | endif |
37 | obj-$(CONFIG_CPU_SUP_INTEL) += perf_event_p6.o perf_event_knc.o perf_event_p4.o | 37 | obj-$(CONFIG_CPU_SUP_INTEL) += perf_event_p6.o perf_event_knc.o perf_event_p4.o |
38 | obj-$(CONFIG_CPU_SUP_INTEL) += perf_event_intel_lbr.o perf_event_intel_ds.o perf_event_intel.o | 38 | obj-$(CONFIG_CPU_SUP_INTEL) += perf_event_intel_lbr.o perf_event_intel_ds.o perf_event_intel.o |
39 | obj-$(CONFIG_CPU_SUP_INTEL) += perf_event_intel_uncore.o | 39 | obj-$(CONFIG_CPU_SUP_INTEL) += perf_event_intel_uncore.o perf_event_intel_rapl.o |
40 | endif | 40 | endif |
41 | 41 | ||
42 | 42 | ||
43 | obj-$(CONFIG_X86_MCE) += mcheck/ | 43 | obj-$(CONFIG_X86_MCE) += mcheck/ |
44 | obj-$(CONFIG_MTRR) += mtrr/ | 44 | obj-$(CONFIG_MTRR) += mtrr/ |
45 | obj-$(CONFIG_MICROCODE) += microcode/ | ||
45 | 46 | ||
46 | obj-$(CONFIG_X86_LOCAL_APIC) += perfctr-watchdog.o perf_event_amd_ibs.o | 47 | obj-$(CONFIG_X86_LOCAL_APIC) += perfctr-watchdog.o perf_event_amd_ibs.o |
47 | 48 | ||
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index bca023bdd6b2..d3153e281d72 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c | |||
@@ -1,5 +1,4 @@ | |||
1 | #include <linux/export.h> | 1 | #include <linux/export.h> |
2 | #include <linux/init.h> | ||
3 | #include <linux/bitops.h> | 2 | #include <linux/bitops.h> |
4 | #include <linux/elf.h> | 3 | #include <linux/elf.h> |
5 | #include <linux/mm.h> | 4 | #include <linux/mm.h> |
@@ -487,7 +486,7 @@ static void early_init_amd(struct cpuinfo_x86 *c) | |||
487 | set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); | 486 | set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); |
488 | set_cpu_cap(c, X86_FEATURE_NONSTOP_TSC); | 487 | set_cpu_cap(c, X86_FEATURE_NONSTOP_TSC); |
489 | if (!check_tsc_unstable()) | 488 | if (!check_tsc_unstable()) |
490 | sched_clock_stable = 1; | 489 | set_sched_clock_stable(); |
491 | } | 490 | } |
492 | 491 | ||
493 | #ifdef CONFIG_X86_64 | 492 | #ifdef CONFIG_X86_64 |
@@ -508,6 +507,16 @@ static void early_init_amd(struct cpuinfo_x86 *c) | |||
508 | set_cpu_cap(c, X86_FEATURE_EXTD_APICID); | 507 | set_cpu_cap(c, X86_FEATURE_EXTD_APICID); |
509 | } | 508 | } |
510 | #endif | 509 | #endif |
510 | |||
511 | /* F16h erratum 793, CVE-2013-6885 */ | ||
512 | if (c->x86 == 0x16 && c->x86_model <= 0xf) { | ||
513 | u64 val; | ||
514 | |||
515 | rdmsrl(MSR_AMD64_LS_CFG, val); | ||
516 | if (!(val & BIT(15))) | ||
517 | wrmsrl(MSR_AMD64_LS_CFG, val | BIT(15)); | ||
518 | } | ||
519 | |||
511 | } | 520 | } |
512 | 521 | ||
513 | static const int amd_erratum_383[]; | 522 | static const int amd_erratum_383[]; |
@@ -790,14 +799,10 @@ static void cpu_detect_tlb_amd(struct cpuinfo_x86 *c) | |||
790 | } | 799 | } |
791 | 800 | ||
792 | /* Handle DTLB 2M and 4M sizes, fall back to L1 if L2 is disabled */ | 801 | /* Handle DTLB 2M and 4M sizes, fall back to L1 if L2 is disabled */ |
793 | if (!((eax >> 16) & mask)) { | 802 | if (!((eax >> 16) & mask)) |
794 | u32 a, b, c, d; | 803 | tlb_lld_2m[ENTRIES] = (cpuid_eax(0x80000005) >> 16) & 0xff; |
795 | 804 | else | |
796 | cpuid(0x80000005, &a, &b, &c, &d); | ||
797 | tlb_lld_2m[ENTRIES] = (a >> 16) & 0xff; | ||
798 | } else { | ||
799 | tlb_lld_2m[ENTRIES] = (eax >> 16) & mask; | 805 | tlb_lld_2m[ENTRIES] = (eax >> 16) & mask; |
800 | } | ||
801 | 806 | ||
802 | /* a 4M entry uses two 2M entries */ | 807 | /* a 4M entry uses two 2M entries */ |
803 | tlb_lld_4m[ENTRIES] = tlb_lld_2m[ENTRIES] >> 1; | 808 | tlb_lld_4m[ENTRIES] = tlb_lld_2m[ENTRIES] >> 1; |
diff --git a/arch/x86/kernel/cpu/centaur.c b/arch/x86/kernel/cpu/centaur.c index 8d5652dc99dd..8779edab684e 100644 --- a/arch/x86/kernel/cpu/centaur.c +++ b/arch/x86/kernel/cpu/centaur.c | |||
@@ -1,6 +1,5 @@ | |||
1 | #include <linux/bitops.h> | 1 | #include <linux/bitops.h> |
2 | #include <linux/kernel.h> | 2 | #include <linux/kernel.h> |
3 | #include <linux/init.h> | ||
4 | 3 | ||
5 | #include <asm/processor.h> | 4 | #include <asm/processor.h> |
6 | #include <asm/e820.h> | 5 | #include <asm/e820.h> |
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 6abc172b8258..24b6fd10625a 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
@@ -472,6 +472,7 @@ u16 __read_mostly tlb_lli_4m[NR_INFO]; | |||
472 | u16 __read_mostly tlb_lld_4k[NR_INFO]; | 472 | u16 __read_mostly tlb_lld_4k[NR_INFO]; |
473 | u16 __read_mostly tlb_lld_2m[NR_INFO]; | 473 | u16 __read_mostly tlb_lld_2m[NR_INFO]; |
474 | u16 __read_mostly tlb_lld_4m[NR_INFO]; | 474 | u16 __read_mostly tlb_lld_4m[NR_INFO]; |
475 | u16 __read_mostly tlb_lld_1g[NR_INFO]; | ||
475 | 476 | ||
476 | /* | 477 | /* |
477 | * tlb_flushall_shift shows the balance point in replacing cr3 write | 478 | * tlb_flushall_shift shows the balance point in replacing cr3 write |
@@ -486,13 +487,13 @@ void cpu_detect_tlb(struct cpuinfo_x86 *c) | |||
486 | if (this_cpu->c_detect_tlb) | 487 | if (this_cpu->c_detect_tlb) |
487 | this_cpu->c_detect_tlb(c); | 488 | this_cpu->c_detect_tlb(c); |
488 | 489 | ||
489 | printk(KERN_INFO "Last level iTLB entries: 4KB %d, 2MB %d, 4MB %d\n" \ | 490 | printk(KERN_INFO "Last level iTLB entries: 4KB %d, 2MB %d, 4MB %d\n" |
490 | "Last level dTLB entries: 4KB %d, 2MB %d, 4MB %d\n" \ | 491 | "Last level dTLB entries: 4KB %d, 2MB %d, 4MB %d, 1GB %d\n" |
491 | "tlb_flushall_shift: %d\n", | 492 | "tlb_flushall_shift: %d\n", |
492 | tlb_lli_4k[ENTRIES], tlb_lli_2m[ENTRIES], | 493 | tlb_lli_4k[ENTRIES], tlb_lli_2m[ENTRIES], |
493 | tlb_lli_4m[ENTRIES], tlb_lld_4k[ENTRIES], | 494 | tlb_lli_4m[ENTRIES], tlb_lld_4k[ENTRIES], |
494 | tlb_lld_2m[ENTRIES], tlb_lld_4m[ENTRIES], | 495 | tlb_lld_2m[ENTRIES], tlb_lld_4m[ENTRIES], |
495 | tlb_flushall_shift); | 496 | tlb_lld_1g[ENTRIES], tlb_flushall_shift); |
496 | } | 497 | } |
497 | 498 | ||
498 | void detect_ht(struct cpuinfo_x86 *c) | 499 | void detect_ht(struct cpuinfo_x86 *c) |
diff --git a/arch/x86/kernel/cpu/cyrix.c b/arch/x86/kernel/cpu/cyrix.c index d0969c75ab54..aaf152e79637 100644 --- a/arch/x86/kernel/cpu/cyrix.c +++ b/arch/x86/kernel/cpu/cyrix.c | |||
@@ -1,4 +1,3 @@ | |||
1 | #include <linux/init.h> | ||
2 | #include <linux/bitops.h> | 1 | #include <linux/bitops.h> |
3 | #include <linux/delay.h> | 2 | #include <linux/delay.h> |
4 | #include <linux/pci.h> | 3 | #include <linux/pci.h> |
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c index dc1ec0dff939..3db61c644e44 100644 --- a/arch/x86/kernel/cpu/intel.c +++ b/arch/x86/kernel/cpu/intel.c | |||
@@ -1,4 +1,3 @@ | |||
1 | #include <linux/init.h> | ||
2 | #include <linux/kernel.h> | 1 | #include <linux/kernel.h> |
3 | 2 | ||
4 | #include <linux/string.h> | 3 | #include <linux/string.h> |
@@ -93,7 +92,7 @@ static void early_init_intel(struct cpuinfo_x86 *c) | |||
93 | set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); | 92 | set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); |
94 | set_cpu_cap(c, X86_FEATURE_NONSTOP_TSC); | 93 | set_cpu_cap(c, X86_FEATURE_NONSTOP_TSC); |
95 | if (!check_tsc_unstable()) | 94 | if (!check_tsc_unstable()) |
96 | sched_clock_stable = 1; | 95 | set_sched_clock_stable(); |
97 | } | 96 | } |
98 | 97 | ||
99 | /* Penwell and Cloverview have the TSC which doesn't sleep on S3 */ | 98 | /* Penwell and Cloverview have the TSC which doesn't sleep on S3 */ |
@@ -387,7 +386,8 @@ static void init_intel(struct cpuinfo_x86 *c) | |||
387 | set_cpu_cap(c, X86_FEATURE_PEBS); | 386 | set_cpu_cap(c, X86_FEATURE_PEBS); |
388 | } | 387 | } |
389 | 388 | ||
390 | if (c->x86 == 6 && c->x86_model == 29 && cpu_has_clflush) | 389 | if (c->x86 == 6 && cpu_has_clflush && |
390 | (c->x86_model == 29 || c->x86_model == 46 || c->x86_model == 47)) | ||
391 | set_cpu_cap(c, X86_FEATURE_CLFLUSH_MONITOR); | 391 | set_cpu_cap(c, X86_FEATURE_CLFLUSH_MONITOR); |
392 | 392 | ||
393 | #ifdef CONFIG_X86_64 | 393 | #ifdef CONFIG_X86_64 |
@@ -505,6 +505,7 @@ static unsigned int intel_size_cache(struct cpuinfo_x86 *c, unsigned int size) | |||
505 | #define TLB_DATA0_2M_4M 0x23 | 505 | #define TLB_DATA0_2M_4M 0x23 |
506 | 506 | ||
507 | #define STLB_4K 0x41 | 507 | #define STLB_4K 0x41 |
508 | #define STLB_4K_2M 0x42 | ||
508 | 509 | ||
509 | static const struct _tlb_table intel_tlb_table[] = { | 510 | static const struct _tlb_table intel_tlb_table[] = { |
510 | { 0x01, TLB_INST_4K, 32, " TLB_INST 4 KByte pages, 4-way set associative" }, | 511 | { 0x01, TLB_INST_4K, 32, " TLB_INST 4 KByte pages, 4-way set associative" }, |
@@ -525,13 +526,20 @@ static const struct _tlb_table intel_tlb_table[] = { | |||
525 | { 0x5b, TLB_DATA_4K_4M, 64, " TLB_DATA 4 KByte and 4 MByte pages" }, | 526 | { 0x5b, TLB_DATA_4K_4M, 64, " TLB_DATA 4 KByte and 4 MByte pages" }, |
526 | { 0x5c, TLB_DATA_4K_4M, 128, " TLB_DATA 4 KByte and 4 MByte pages" }, | 527 | { 0x5c, TLB_DATA_4K_4M, 128, " TLB_DATA 4 KByte and 4 MByte pages" }, |
527 | { 0x5d, TLB_DATA_4K_4M, 256, " TLB_DATA 4 KByte and 4 MByte pages" }, | 528 | { 0x5d, TLB_DATA_4K_4M, 256, " TLB_DATA 4 KByte and 4 MByte pages" }, |
529 | { 0x61, TLB_INST_4K, 48, " TLB_INST 4 KByte pages, full associative" }, | ||
530 | { 0x63, TLB_DATA_1G, 4, " TLB_DATA 1 GByte pages, 4-way set associative" }, | ||
531 | { 0x76, TLB_INST_2M_4M, 8, " TLB_INST 2-MByte or 4-MByte pages, fully associative" }, | ||
528 | { 0xb0, TLB_INST_4K, 128, " TLB_INST 4 KByte pages, 4-way set associative" }, | 532 | { 0xb0, TLB_INST_4K, 128, " TLB_INST 4 KByte pages, 4-way set associative" }, |
529 | { 0xb1, TLB_INST_2M_4M, 4, " TLB_INST 2M pages, 4-way, 8 entries or 4M pages, 4-way entries" }, | 533 | { 0xb1, TLB_INST_2M_4M, 4, " TLB_INST 2M pages, 4-way, 8 entries or 4M pages, 4-way entries" }, |
530 | { 0xb2, TLB_INST_4K, 64, " TLB_INST 4KByte pages, 4-way set associative" }, | 534 | { 0xb2, TLB_INST_4K, 64, " TLB_INST 4KByte pages, 4-way set associative" }, |
531 | { 0xb3, TLB_DATA_4K, 128, " TLB_DATA 4 KByte pages, 4-way set associative" }, | 535 | { 0xb3, TLB_DATA_4K, 128, " TLB_DATA 4 KByte pages, 4-way set associative" }, |
532 | { 0xb4, TLB_DATA_4K, 256, " TLB_DATA 4 KByte pages, 4-way associative" }, | 536 | { 0xb4, TLB_DATA_4K, 256, " TLB_DATA 4 KByte pages, 4-way associative" }, |
537 | { 0xb5, TLB_INST_4K, 64, " TLB_INST 4 KByte pages, 8-way set ssociative" }, | ||
538 | { 0xb6, TLB_INST_4K, 128, " TLB_INST 4 KByte pages, 8-way set ssociative" }, | ||
533 | { 0xba, TLB_DATA_4K, 64, " TLB_DATA 4 KByte pages, 4-way associative" }, | 539 | { 0xba, TLB_DATA_4K, 64, " TLB_DATA 4 KByte pages, 4-way associative" }, |
534 | { 0xc0, TLB_DATA_4K_4M, 8, " TLB_DATA 4 KByte and 4 MByte pages, 4-way associative" }, | 540 | { 0xc0, TLB_DATA_4K_4M, 8, " TLB_DATA 4 KByte and 4 MByte pages, 4-way associative" }, |
541 | { 0xc1, STLB_4K_2M, 1024, " STLB 4 KByte and 2 MByte pages, 8-way associative" }, | ||
542 | { 0xc2, TLB_DATA_2M_4M, 16, " DTLB 2 MByte/4MByte pages, 4-way associative" }, | ||
535 | { 0xca, STLB_4K, 512, " STLB 4 KByte pages, 4-way associative" }, | 543 | { 0xca, STLB_4K, 512, " STLB 4 KByte pages, 4-way associative" }, |
536 | { 0x00, 0, 0 } | 544 | { 0x00, 0, 0 } |
537 | }; | 545 | }; |
@@ -557,6 +565,20 @@ static void intel_tlb_lookup(const unsigned char desc) | |||
557 | if (tlb_lld_4k[ENTRIES] < intel_tlb_table[k].entries) | 565 | if (tlb_lld_4k[ENTRIES] < intel_tlb_table[k].entries) |
558 | tlb_lld_4k[ENTRIES] = intel_tlb_table[k].entries; | 566 | tlb_lld_4k[ENTRIES] = intel_tlb_table[k].entries; |
559 | break; | 567 | break; |
568 | case STLB_4K_2M: | ||
569 | if (tlb_lli_4k[ENTRIES] < intel_tlb_table[k].entries) | ||
570 | tlb_lli_4k[ENTRIES] = intel_tlb_table[k].entries; | ||
571 | if (tlb_lld_4k[ENTRIES] < intel_tlb_table[k].entries) | ||
572 | tlb_lld_4k[ENTRIES] = intel_tlb_table[k].entries; | ||
573 | if (tlb_lli_2m[ENTRIES] < intel_tlb_table[k].entries) | ||
574 | tlb_lli_2m[ENTRIES] = intel_tlb_table[k].entries; | ||
575 | if (tlb_lld_2m[ENTRIES] < intel_tlb_table[k].entries) | ||
576 | tlb_lld_2m[ENTRIES] = intel_tlb_table[k].entries; | ||
577 | if (tlb_lli_4m[ENTRIES] < intel_tlb_table[k].entries) | ||
578 | tlb_lli_4m[ENTRIES] = intel_tlb_table[k].entries; | ||
579 | if (tlb_lld_4m[ENTRIES] < intel_tlb_table[k].entries) | ||
580 | tlb_lld_4m[ENTRIES] = intel_tlb_table[k].entries; | ||
581 | break; | ||
560 | case TLB_INST_ALL: | 582 | case TLB_INST_ALL: |
561 | if (tlb_lli_4k[ENTRIES] < intel_tlb_table[k].entries) | 583 | if (tlb_lli_4k[ENTRIES] < intel_tlb_table[k].entries) |
562 | tlb_lli_4k[ENTRIES] = intel_tlb_table[k].entries; | 584 | tlb_lli_4k[ENTRIES] = intel_tlb_table[k].entries; |
@@ -602,6 +624,10 @@ static void intel_tlb_lookup(const unsigned char desc) | |||
602 | if (tlb_lld_4m[ENTRIES] < intel_tlb_table[k].entries) | 624 | if (tlb_lld_4m[ENTRIES] < intel_tlb_table[k].entries) |
603 | tlb_lld_4m[ENTRIES] = intel_tlb_table[k].entries; | 625 | tlb_lld_4m[ENTRIES] = intel_tlb_table[k].entries; |
604 | break; | 626 | break; |
627 | case TLB_DATA_1G: | ||
628 | if (tlb_lld_1g[ENTRIES] < intel_tlb_table[k].entries) | ||
629 | tlb_lld_1g[ENTRIES] = intel_tlb_table[k].entries; | ||
630 | break; | ||
605 | } | 631 | } |
606 | } | 632 | } |
607 | 633 | ||
diff --git a/arch/x86/kernel/cpu/mcheck/mce-apei.c b/arch/x86/kernel/cpu/mcheck/mce-apei.c index de8b60a53f69..a1aef9533154 100644 --- a/arch/x86/kernel/cpu/mcheck/mce-apei.c +++ b/arch/x86/kernel/cpu/mcheck/mce-apei.c | |||
@@ -33,22 +33,28 @@ | |||
33 | #include <linux/acpi.h> | 33 | #include <linux/acpi.h> |
34 | #include <linux/cper.h> | 34 | #include <linux/cper.h> |
35 | #include <acpi/apei.h> | 35 | #include <acpi/apei.h> |
36 | #include <acpi/ghes.h> | ||
36 | #include <asm/mce.h> | 37 | #include <asm/mce.h> |
37 | 38 | ||
38 | #include "mce-internal.h" | 39 | #include "mce-internal.h" |
39 | 40 | ||
40 | void apei_mce_report_mem_error(int corrected, struct cper_sec_mem_err *mem_err) | 41 | void apei_mce_report_mem_error(int severity, struct cper_sec_mem_err *mem_err) |
41 | { | 42 | { |
42 | struct mce m; | 43 | struct mce m; |
43 | 44 | ||
44 | /* Only corrected MC is reported */ | 45 | if (!(mem_err->validation_bits & CPER_MEM_VALID_PA)) |
45 | if (!corrected || !(mem_err->validation_bits & CPER_MEM_VALID_PA)) | ||
46 | return; | 46 | return; |
47 | 47 | ||
48 | mce_setup(&m); | 48 | mce_setup(&m); |
49 | m.bank = 1; | 49 | m.bank = 1; |
50 | /* Fake a memory read corrected error with unknown channel */ | 50 | /* Fake a memory read error with unknown channel */ |
51 | m.status = MCI_STATUS_VAL | MCI_STATUS_EN | MCI_STATUS_ADDRV | 0x9f; | 51 | m.status = MCI_STATUS_VAL | MCI_STATUS_EN | MCI_STATUS_ADDRV | 0x9f; |
52 | |||
53 | if (severity >= GHES_SEV_RECOVERABLE) | ||
54 | m.status |= MCI_STATUS_UC; | ||
55 | if (severity >= GHES_SEV_PANIC) | ||
56 | m.status |= MCI_STATUS_PCC; | ||
57 | |||
52 | m.addr = mem_err->physical_addr; | 58 | m.addr = mem_err->physical_addr; |
53 | mce_log(&m); | 59 | mce_log(&m); |
54 | mce_notify_irq(); | 60 | mce_notify_irq(); |
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index b3218cdee95f..4d5419b249da 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c | |||
@@ -1638,15 +1638,15 @@ static void __mcheck_cpu_init_vendor(struct cpuinfo_x86 *c) | |||
1638 | 1638 | ||
1639 | static void mce_start_timer(unsigned int cpu, struct timer_list *t) | 1639 | static void mce_start_timer(unsigned int cpu, struct timer_list *t) |
1640 | { | 1640 | { |
1641 | unsigned long iv = mce_adjust_timer(check_interval * HZ); | 1641 | unsigned long iv = check_interval * HZ; |
1642 | |||
1643 | __this_cpu_write(mce_next_interval, iv); | ||
1644 | 1642 | ||
1645 | if (mca_cfg.ignore_ce || !iv) | 1643 | if (mca_cfg.ignore_ce || !iv) |
1646 | return; | 1644 | return; |
1647 | 1645 | ||
1646 | per_cpu(mce_next_interval, cpu) = iv; | ||
1647 | |||
1648 | t->expires = round_jiffies(jiffies + iv); | 1648 | t->expires = round_jiffies(jiffies + iv); |
1649 | add_timer_on(t, smp_processor_id()); | 1649 | add_timer_on(t, cpu); |
1650 | } | 1650 | } |
1651 | 1651 | ||
1652 | static void __mcheck_cpu_init_timer(void) | 1652 | static void __mcheck_cpu_init_timer(void) |
@@ -2272,8 +2272,10 @@ static int mce_device_create(unsigned int cpu) | |||
2272 | dev->release = &mce_device_release; | 2272 | dev->release = &mce_device_release; |
2273 | 2273 | ||
2274 | err = device_register(dev); | 2274 | err = device_register(dev); |
2275 | if (err) | 2275 | if (err) { |
2276 | put_device(dev); | ||
2276 | return err; | 2277 | return err; |
2278 | } | ||
2277 | 2279 | ||
2278 | for (i = 0; mce_device_attrs[i]; i++) { | 2280 | for (i = 0; mce_device_attrs[i]; i++) { |
2279 | err = device_create_file(dev, mce_device_attrs[i]); | 2281 | err = device_create_file(dev, mce_device_attrs[i]); |
diff --git a/arch/x86/kernel/cpu/mcheck/mce_intel.c b/arch/x86/kernel/cpu/mcheck/mce_intel.c index 4cfe0458ca66..fb6156fee6f7 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_intel.c +++ b/arch/x86/kernel/cpu/mcheck/mce_intel.c | |||
@@ -6,7 +6,6 @@ | |||
6 | */ | 6 | */ |
7 | 7 | ||
8 | #include <linux/gfp.h> | 8 | #include <linux/gfp.h> |
9 | #include <linux/init.h> | ||
10 | #include <linux/interrupt.h> | 9 | #include <linux/interrupt.h> |
11 | #include <linux/percpu.h> | 10 | #include <linux/percpu.h> |
12 | #include <linux/sched.h> | 11 | #include <linux/sched.h> |
diff --git a/arch/x86/kernel/cpu/mcheck/p5.c b/arch/x86/kernel/cpu/mcheck/p5.c index 1c044b1ccc59..a3042989398c 100644 --- a/arch/x86/kernel/cpu/mcheck/p5.c +++ b/arch/x86/kernel/cpu/mcheck/p5.c | |||
@@ -5,7 +5,6 @@ | |||
5 | #include <linux/interrupt.h> | 5 | #include <linux/interrupt.h> |
6 | #include <linux/kernel.h> | 6 | #include <linux/kernel.h> |
7 | #include <linux/types.h> | 7 | #include <linux/types.h> |
8 | #include <linux/init.h> | ||
9 | #include <linux/smp.h> | 8 | #include <linux/smp.h> |
10 | 9 | ||
11 | #include <asm/processor.h> | 10 | #include <asm/processor.h> |
diff --git a/arch/x86/kernel/cpu/mcheck/winchip.c b/arch/x86/kernel/cpu/mcheck/winchip.c index e9a701aecaa1..7dc5564d0cdf 100644 --- a/arch/x86/kernel/cpu/mcheck/winchip.c +++ b/arch/x86/kernel/cpu/mcheck/winchip.c | |||
@@ -5,7 +5,6 @@ | |||
5 | #include <linux/interrupt.h> | 5 | #include <linux/interrupt.h> |
6 | #include <linux/kernel.h> | 6 | #include <linux/kernel.h> |
7 | #include <linux/types.h> | 7 | #include <linux/types.h> |
8 | #include <linux/init.h> | ||
9 | 8 | ||
10 | #include <asm/processor.h> | 9 | #include <asm/processor.h> |
11 | #include <asm/mce.h> | 10 | #include <asm/mce.h> |
diff --git a/arch/x86/kernel/cpu/microcode/Makefile b/arch/x86/kernel/cpu/microcode/Makefile new file mode 100644 index 000000000000..285c85427c32 --- /dev/null +++ b/arch/x86/kernel/cpu/microcode/Makefile | |||
@@ -0,0 +1,7 @@ | |||
1 | microcode-y := core.o | ||
2 | obj-$(CONFIG_MICROCODE) += microcode.o | ||
3 | microcode-$(CONFIG_MICROCODE_INTEL) += intel.o intel_lib.o | ||
4 | microcode-$(CONFIG_MICROCODE_AMD) += amd.o | ||
5 | obj-$(CONFIG_MICROCODE_EARLY) += core_early.o | ||
6 | obj-$(CONFIG_MICROCODE_INTEL_EARLY) += intel_early.o | ||
7 | obj-$(CONFIG_MICROCODE_AMD_EARLY) += amd_early.o | ||
diff --git a/arch/x86/kernel/microcode_amd.c b/arch/x86/kernel/cpu/microcode/amd.c index c3d4cc972eca..8fffd845e22b 100644 --- a/arch/x86/kernel/microcode_amd.c +++ b/arch/x86/kernel/cpu/microcode/amd.c | |||
@@ -182,10 +182,10 @@ int __apply_microcode_amd(struct microcode_amd *mc_amd) | |||
182 | { | 182 | { |
183 | u32 rev, dummy; | 183 | u32 rev, dummy; |
184 | 184 | ||
185 | wrmsrl(MSR_AMD64_PATCH_LOADER, (u64)(long)&mc_amd->hdr.data_code); | 185 | native_wrmsrl(MSR_AMD64_PATCH_LOADER, (u64)(long)&mc_amd->hdr.data_code); |
186 | 186 | ||
187 | /* verify patch application was successful */ | 187 | /* verify patch application was successful */ |
188 | rdmsr(MSR_AMD64_PATCH_LEVEL, rev, dummy); | 188 | native_rdmsr(MSR_AMD64_PATCH_LEVEL, rev, dummy); |
189 | if (rev != mc_amd->hdr.patch_id) | 189 | if (rev != mc_amd->hdr.patch_id) |
190 | return -1; | 190 | return -1; |
191 | 191 | ||
@@ -332,6 +332,9 @@ static int verify_and_add_patch(u8 family, u8 *fw, unsigned int leftover) | |||
332 | patch->patch_id = mc_hdr->patch_id; | 332 | patch->patch_id = mc_hdr->patch_id; |
333 | patch->equiv_cpu = proc_id; | 333 | patch->equiv_cpu = proc_id; |
334 | 334 | ||
335 | pr_debug("%s: Added patch_id: 0x%08x, proc_id: 0x%04x\n", | ||
336 | __func__, patch->patch_id, proc_id); | ||
337 | |||
335 | /* ... and add to cache. */ | 338 | /* ... and add to cache. */ |
336 | update_cache(patch); | 339 | update_cache(patch); |
337 | 340 | ||
@@ -390,9 +393,9 @@ enum ucode_state load_microcode_amd(u8 family, const u8 *data, size_t size) | |||
390 | if (cpu_data(smp_processor_id()).cpu_index == boot_cpu_data.cpu_index) { | 393 | if (cpu_data(smp_processor_id()).cpu_index == boot_cpu_data.cpu_index) { |
391 | struct ucode_patch *p = find_patch(smp_processor_id()); | 394 | struct ucode_patch *p = find_patch(smp_processor_id()); |
392 | if (p) { | 395 | if (p) { |
393 | memset(amd_bsp_mpb, 0, MPB_MAX_SIZE); | 396 | memset(amd_ucode_patch, 0, PATCH_MAX_SIZE); |
394 | memcpy(amd_bsp_mpb, p->data, min_t(u32, ksize(p->data), | 397 | memcpy(amd_ucode_patch, p->data, min_t(u32, ksize(p->data), |
395 | MPB_MAX_SIZE)); | 398 | PATCH_MAX_SIZE)); |
396 | } | 399 | } |
397 | } | 400 | } |
398 | #endif | 401 | #endif |
@@ -430,7 +433,7 @@ static enum ucode_state request_microcode_amd(int cpu, struct device *device, | |||
430 | if (c->x86 >= 0x15) | 433 | if (c->x86 >= 0x15) |
431 | snprintf(fw_name, sizeof(fw_name), "amd-ucode/microcode_amd_fam%.2xh.bin", c->x86); | 434 | snprintf(fw_name, sizeof(fw_name), "amd-ucode/microcode_amd_fam%.2xh.bin", c->x86); |
432 | 435 | ||
433 | if (request_firmware(&fw, (const char *)fw_name, device)) { | 436 | if (request_firmware_direct(&fw, (const char *)fw_name, device)) { |
434 | pr_debug("failed to load file %s\n", fw_name); | 437 | pr_debug("failed to load file %s\n", fw_name); |
435 | goto out; | 438 | goto out; |
436 | } | 439 | } |
diff --git a/arch/x86/kernel/microcode_amd_early.c b/arch/x86/kernel/cpu/microcode/amd_early.c index 6073104ccaa3..8384c0fa206f 100644 --- a/arch/x86/kernel/microcode_amd_early.c +++ b/arch/x86/kernel/cpu/microcode/amd_early.c | |||
@@ -2,6 +2,7 @@ | |||
2 | * Copyright (C) 2013 Advanced Micro Devices, Inc. | 2 | * Copyright (C) 2013 Advanced Micro Devices, Inc. |
3 | * | 3 | * |
4 | * Author: Jacob Shin <jacob.shin@amd.com> | 4 | * Author: Jacob Shin <jacob.shin@amd.com> |
5 | * Fixes: Borislav Petkov <bp@suse.de> | ||
5 | * | 6 | * |
6 | * This program is free software; you can redistribute it and/or modify | 7 | * 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 | * it under the terms of the GNU General Public License version 2 as |
@@ -15,10 +16,18 @@ | |||
15 | #include <asm/setup.h> | 16 | #include <asm/setup.h> |
16 | #include <asm/microcode_amd.h> | 17 | #include <asm/microcode_amd.h> |
17 | 18 | ||
18 | static bool ucode_loaded; | 19 | /* |
20 | * This points to the current valid container of microcode patches which we will | ||
21 | * save from the initrd before jettisoning its contents. | ||
22 | */ | ||
23 | static u8 *container; | ||
24 | static size_t container_size; | ||
25 | |||
19 | static u32 ucode_new_rev; | 26 | static u32 ucode_new_rev; |
20 | static unsigned long ucode_offset; | 27 | u8 amd_ucode_patch[PATCH_MAX_SIZE]; |
21 | static size_t ucode_size; | 28 | static u16 this_equiv_id; |
29 | |||
30 | struct cpio_data ucode_cpio; | ||
22 | 31 | ||
23 | /* | 32 | /* |
24 | * Microcode patch container file is prepended to the initrd in cpio format. | 33 | * Microcode patch container file is prepended to the initrd in cpio format. |
@@ -32,9 +41,6 @@ static struct cpio_data __init find_ucode_in_initrd(void) | |||
32 | char *path; | 41 | char *path; |
33 | void *start; | 42 | void *start; |
34 | size_t size; | 43 | size_t size; |
35 | unsigned long *uoffset; | ||
36 | size_t *usize; | ||
37 | struct cpio_data cd; | ||
38 | 44 | ||
39 | #ifdef CONFIG_X86_32 | 45 | #ifdef CONFIG_X86_32 |
40 | struct boot_params *p; | 46 | struct boot_params *p; |
@@ -47,30 +53,50 @@ static struct cpio_data __init find_ucode_in_initrd(void) | |||
47 | path = (char *)__pa_nodebug(ucode_path); | 53 | path = (char *)__pa_nodebug(ucode_path); |
48 | start = (void *)p->hdr.ramdisk_image; | 54 | start = (void *)p->hdr.ramdisk_image; |
49 | size = p->hdr.ramdisk_size; | 55 | size = p->hdr.ramdisk_size; |
50 | uoffset = (unsigned long *)__pa_nodebug(&ucode_offset); | ||
51 | usize = (size_t *)__pa_nodebug(&ucode_size); | ||
52 | #else | 56 | #else |
53 | path = ucode_path; | 57 | path = ucode_path; |
54 | start = (void *)(boot_params.hdr.ramdisk_image + PAGE_OFFSET); | 58 | start = (void *)(boot_params.hdr.ramdisk_image + PAGE_OFFSET); |
55 | size = boot_params.hdr.ramdisk_size; | 59 | size = boot_params.hdr.ramdisk_size; |
56 | uoffset = &ucode_offset; | ||
57 | usize = &ucode_size; | ||
58 | #endif | 60 | #endif |
59 | 61 | ||
60 | cd = find_cpio_data(path, start, size, &offset); | 62 | return find_cpio_data(path, start, size, &offset); |
61 | if (!cd.data) | 63 | } |
62 | return cd; | ||
63 | 64 | ||
64 | if (*(u32 *)cd.data != UCODE_MAGIC) { | 65 | static size_t compute_container_size(u8 *data, u32 total_size) |
65 | cd.data = NULL; | 66 | { |
66 | cd.size = 0; | 67 | size_t size = 0; |
67 | return cd; | 68 | u32 *header = (u32 *)data; |
68 | } | ||
69 | 69 | ||
70 | *uoffset = (u8 *)cd.data - (u8 *)start; | 70 | if (header[0] != UCODE_MAGIC || |
71 | *usize = cd.size; | 71 | header[1] != UCODE_EQUIV_CPU_TABLE_TYPE || /* type */ |
72 | header[2] == 0) /* size */ | ||
73 | return size; | ||
72 | 74 | ||
73 | return cd; | 75 | size = header[2] + CONTAINER_HDR_SZ; |
76 | total_size -= size; | ||
77 | data += size; | ||
78 | |||
79 | while (total_size) { | ||
80 | u16 patch_size; | ||
81 | |||
82 | header = (u32 *)data; | ||
83 | |||
84 | if (header[0] != UCODE_UCODE_TYPE) | ||
85 | break; | ||
86 | |||
87 | /* | ||
88 | * Sanity-check patch size. | ||
89 | */ | ||
90 | patch_size = header[1]; | ||
91 | if (patch_size > PATCH_MAX_SIZE) | ||
92 | break; | ||
93 | |||
94 | size += patch_size + SECTION_HDR_SIZE; | ||
95 | data += patch_size + SECTION_HDR_SIZE; | ||
96 | total_size -= patch_size + SECTION_HDR_SIZE; | ||
97 | } | ||
98 | |||
99 | return size; | ||
74 | } | 100 | } |
75 | 101 | ||
76 | /* | 102 | /* |
@@ -85,23 +111,22 @@ static struct cpio_data __init find_ucode_in_initrd(void) | |||
85 | static void apply_ucode_in_initrd(void *ucode, size_t size) | 111 | static void apply_ucode_in_initrd(void *ucode, size_t size) |
86 | { | 112 | { |
87 | struct equiv_cpu_entry *eq; | 113 | struct equiv_cpu_entry *eq; |
114 | size_t *cont_sz; | ||
88 | u32 *header; | 115 | u32 *header; |
89 | u8 *data; | 116 | u8 *data, **cont; |
90 | u16 eq_id = 0; | 117 | u16 eq_id = 0; |
91 | int offset, left; | 118 | int offset, left; |
92 | u32 rev, eax; | 119 | u32 rev, eax, ebx, ecx, edx; |
93 | u32 *new_rev; | 120 | u32 *new_rev; |
94 | unsigned long *uoffset; | ||
95 | size_t *usize; | ||
96 | 121 | ||
97 | #ifdef CONFIG_X86_32 | 122 | #ifdef CONFIG_X86_32 |
98 | new_rev = (u32 *)__pa_nodebug(&ucode_new_rev); | 123 | new_rev = (u32 *)__pa_nodebug(&ucode_new_rev); |
99 | uoffset = (unsigned long *)__pa_nodebug(&ucode_offset); | 124 | cont_sz = (size_t *)__pa_nodebug(&container_size); |
100 | usize = (size_t *)__pa_nodebug(&ucode_size); | 125 | cont = (u8 **)__pa_nodebug(&container); |
101 | #else | 126 | #else |
102 | new_rev = &ucode_new_rev; | 127 | new_rev = &ucode_new_rev; |
103 | uoffset = &ucode_offset; | 128 | cont_sz = &container_size; |
104 | usize = &ucode_size; | 129 | cont = &container; |
105 | #endif | 130 | #endif |
106 | 131 | ||
107 | data = ucode; | 132 | data = ucode; |
@@ -109,23 +134,37 @@ static void apply_ucode_in_initrd(void *ucode, size_t size) | |||
109 | header = (u32 *)data; | 134 | header = (u32 *)data; |
110 | 135 | ||
111 | /* find equiv cpu table */ | 136 | /* find equiv cpu table */ |
112 | 137 | if (header[0] != UCODE_MAGIC || | |
113 | if (header[1] != UCODE_EQUIV_CPU_TABLE_TYPE || /* type */ | 138 | header[1] != UCODE_EQUIV_CPU_TABLE_TYPE || /* type */ |
114 | header[2] == 0) /* size */ | 139 | header[2] == 0) /* size */ |
115 | return; | 140 | return; |
116 | 141 | ||
117 | eax = cpuid_eax(0x00000001); | 142 | eax = 0x00000001; |
143 | ecx = 0; | ||
144 | native_cpuid(&eax, &ebx, &ecx, &edx); | ||
118 | 145 | ||
119 | while (left > 0) { | 146 | while (left > 0) { |
120 | eq = (struct equiv_cpu_entry *)(data + CONTAINER_HDR_SZ); | 147 | eq = (struct equiv_cpu_entry *)(data + CONTAINER_HDR_SZ); |
121 | 148 | ||
149 | *cont = data; | ||
150 | |||
151 | /* Advance past the container header */ | ||
122 | offset = header[2] + CONTAINER_HDR_SZ; | 152 | offset = header[2] + CONTAINER_HDR_SZ; |
123 | data += offset; | 153 | data += offset; |
124 | left -= offset; | 154 | left -= offset; |
125 | 155 | ||
126 | eq_id = find_equiv_id(eq, eax); | 156 | eq_id = find_equiv_id(eq, eax); |
127 | if (eq_id) | 157 | if (eq_id) { |
158 | this_equiv_id = eq_id; | ||
159 | *cont_sz = compute_container_size(*cont, left + offset); | ||
160 | |||
161 | /* | ||
162 | * truncate how much we need to iterate over in the | ||
163 | * ucode update loop below | ||
164 | */ | ||
165 | left = *cont_sz - offset; | ||
128 | break; | 166 | break; |
167 | } | ||
129 | 168 | ||
130 | /* | 169 | /* |
131 | * support multiple container files appended together. if this | 170 | * support multiple container files appended together. if this |
@@ -145,19 +184,18 @@ static void apply_ucode_in_initrd(void *ucode, size_t size) | |||
145 | 184 | ||
146 | /* mark where the next microcode container file starts */ | 185 | /* mark where the next microcode container file starts */ |
147 | offset = data - (u8 *)ucode; | 186 | offset = data - (u8 *)ucode; |
148 | *uoffset += offset; | ||
149 | *usize -= offset; | ||
150 | ucode = data; | 187 | ucode = data; |
151 | } | 188 | } |
152 | 189 | ||
153 | if (!eq_id) { | 190 | if (!eq_id) { |
154 | *usize = 0; | 191 | *cont = NULL; |
192 | *cont_sz = 0; | ||
155 | return; | 193 | return; |
156 | } | 194 | } |
157 | 195 | ||
158 | /* find ucode and update if needed */ | 196 | /* find ucode and update if needed */ |
159 | 197 | ||
160 | rdmsr(MSR_AMD64_PATCH_LEVEL, rev, eax); | 198 | native_rdmsr(MSR_AMD64_PATCH_LEVEL, rev, eax); |
161 | 199 | ||
162 | while (left > 0) { | 200 | while (left > 0) { |
163 | struct microcode_amd *mc; | 201 | struct microcode_amd *mc; |
@@ -168,73 +206,83 @@ static void apply_ucode_in_initrd(void *ucode, size_t size) | |||
168 | break; | 206 | break; |
169 | 207 | ||
170 | mc = (struct microcode_amd *)(data + SECTION_HDR_SIZE); | 208 | mc = (struct microcode_amd *)(data + SECTION_HDR_SIZE); |
171 | if (eq_id == mc->hdr.processor_rev_id && rev < mc->hdr.patch_id) | 209 | |
172 | if (__apply_microcode_amd(mc) == 0) { | 210 | if (eq_id == mc->hdr.processor_rev_id && rev < mc->hdr.patch_id) { |
211 | |||
212 | if (!__apply_microcode_amd(mc)) { | ||
173 | rev = mc->hdr.patch_id; | 213 | rev = mc->hdr.patch_id; |
174 | *new_rev = rev; | 214 | *new_rev = rev; |
215 | |||
216 | /* save ucode patch */ | ||
217 | memcpy(amd_ucode_patch, mc, | ||
218 | min_t(u32, header[1], PATCH_MAX_SIZE)); | ||
175 | } | 219 | } |
220 | } | ||
176 | 221 | ||
177 | offset = header[1] + SECTION_HDR_SIZE; | 222 | offset = header[1] + SECTION_HDR_SIZE; |
178 | data += offset; | 223 | data += offset; |
179 | left -= offset; | 224 | left -= offset; |
180 | } | 225 | } |
181 | |||
182 | /* mark where this microcode container file ends */ | ||
183 | offset = *usize - (data - (u8 *)ucode); | ||
184 | *usize -= offset; | ||
185 | |||
186 | if (!(*new_rev)) | ||
187 | *usize = 0; | ||
188 | } | 226 | } |
189 | 227 | ||
190 | void __init load_ucode_amd_bsp(void) | 228 | void __init load_ucode_amd_bsp(void) |
191 | { | 229 | { |
192 | struct cpio_data cd = find_ucode_in_initrd(); | 230 | struct cpio_data cp; |
193 | if (!cd.data) | 231 | void **data; |
232 | size_t *size; | ||
233 | |||
234 | #ifdef CONFIG_X86_32 | ||
235 | data = (void **)__pa_nodebug(&ucode_cpio.data); | ||
236 | size = (size_t *)__pa_nodebug(&ucode_cpio.size); | ||
237 | #else | ||
238 | data = &ucode_cpio.data; | ||
239 | size = &ucode_cpio.size; | ||
240 | #endif | ||
241 | |||
242 | cp = find_ucode_in_initrd(); | ||
243 | if (!cp.data) | ||
194 | return; | 244 | return; |
195 | 245 | ||
196 | apply_ucode_in_initrd(cd.data, cd.size); | 246 | *data = cp.data; |
247 | *size = cp.size; | ||
248 | |||
249 | apply_ucode_in_initrd(cp.data, cp.size); | ||
197 | } | 250 | } |
198 | 251 | ||
199 | #ifdef CONFIG_X86_32 | 252 | #ifdef CONFIG_X86_32 |
200 | u8 amd_bsp_mpb[MPB_MAX_SIZE]; | ||
201 | |||
202 | /* | 253 | /* |
203 | * On 32-bit, since AP's early load occurs before paging is turned on, we | 254 | * On 32-bit, since AP's early load occurs before paging is turned on, we |
204 | * cannot traverse cpu_equiv_table and pcache in kernel heap memory. So during | 255 | * cannot traverse cpu_equiv_table and pcache in kernel heap memory. So during |
205 | * cold boot, AP will apply_ucode_in_initrd() just like the BSP. During | 256 | * cold boot, AP will apply_ucode_in_initrd() just like the BSP. During |
206 | * save_microcode_in_initrd_amd() BSP's patch is copied to amd_bsp_mpb, which | 257 | * save_microcode_in_initrd_amd() BSP's patch is copied to amd_ucode_patch, |
207 | * is used upon resume from suspend. | 258 | * which is used upon resume from suspend. |
208 | */ | 259 | */ |
209 | void load_ucode_amd_ap(void) | 260 | void load_ucode_amd_ap(void) |
210 | { | 261 | { |
211 | struct microcode_amd *mc; | 262 | struct microcode_amd *mc; |
212 | unsigned long *initrd; | ||
213 | unsigned long *uoffset; | ||
214 | size_t *usize; | 263 | size_t *usize; |
215 | void *ucode; | 264 | void **ucode; |
216 | 265 | ||
217 | mc = (struct microcode_amd *)__pa(amd_bsp_mpb); | 266 | mc = (struct microcode_amd *)__pa(amd_ucode_patch); |
218 | if (mc->hdr.patch_id && mc->hdr.processor_rev_id) { | 267 | if (mc->hdr.patch_id && mc->hdr.processor_rev_id) { |
219 | __apply_microcode_amd(mc); | 268 | __apply_microcode_amd(mc); |
220 | return; | 269 | return; |
221 | } | 270 | } |
222 | 271 | ||
223 | initrd = (unsigned long *)__pa(&initrd_start); | 272 | ucode = (void *)__pa_nodebug(&container); |
224 | uoffset = (unsigned long *)__pa(&ucode_offset); | 273 | usize = (size_t *)__pa_nodebug(&container_size); |
225 | usize = (size_t *)__pa(&ucode_size); | ||
226 | 274 | ||
227 | if (!*usize || !*initrd) | 275 | if (!*ucode || !*usize) |
228 | return; | 276 | return; |
229 | 277 | ||
230 | ucode = (void *)((unsigned long)__pa(*initrd) + *uoffset); | 278 | apply_ucode_in_initrd(*ucode, *usize); |
231 | apply_ucode_in_initrd(ucode, *usize); | ||
232 | } | 279 | } |
233 | 280 | ||
234 | static void __init collect_cpu_sig_on_bsp(void *arg) | 281 | static void __init collect_cpu_sig_on_bsp(void *arg) |
235 | { | 282 | { |
236 | unsigned int cpu = smp_processor_id(); | 283 | unsigned int cpu = smp_processor_id(); |
237 | struct ucode_cpu_info *uci = ucode_cpu_info + cpu; | 284 | struct ucode_cpu_info *uci = ucode_cpu_info + cpu; |
285 | |||
238 | uci->cpu_sig.sig = cpuid_eax(0x00000001); | 286 | uci->cpu_sig.sig = cpuid_eax(0x00000001); |
239 | } | 287 | } |
240 | #else | 288 | #else |
@@ -242,36 +290,54 @@ void load_ucode_amd_ap(void) | |||
242 | { | 290 | { |
243 | unsigned int cpu = smp_processor_id(); | 291 | unsigned int cpu = smp_processor_id(); |
244 | struct ucode_cpu_info *uci = ucode_cpu_info + cpu; | 292 | struct ucode_cpu_info *uci = ucode_cpu_info + cpu; |
293 | struct equiv_cpu_entry *eq; | ||
294 | struct microcode_amd *mc; | ||
245 | u32 rev, eax; | 295 | u32 rev, eax; |
296 | u16 eq_id; | ||
297 | |||
298 | /* Exit if called on the BSP. */ | ||
299 | if (!cpu) | ||
300 | return; | ||
301 | |||
302 | if (!container) | ||
303 | return; | ||
246 | 304 | ||
247 | rdmsr(MSR_AMD64_PATCH_LEVEL, rev, eax); | 305 | rdmsr(MSR_AMD64_PATCH_LEVEL, rev, eax); |
248 | eax = cpuid_eax(0x00000001); | ||
249 | 306 | ||
250 | uci->cpu_sig.rev = rev; | 307 | uci->cpu_sig.rev = rev; |
251 | uci->cpu_sig.sig = eax; | 308 | uci->cpu_sig.sig = eax; |
252 | 309 | ||
253 | if (cpu && !ucode_loaded) { | 310 | eax = cpuid_eax(0x00000001); |
254 | void *ucode; | 311 | eq = (struct equiv_cpu_entry *)(container + CONTAINER_HDR_SZ); |
255 | 312 | ||
256 | if (!ucode_size || !initrd_start) | 313 | eq_id = find_equiv_id(eq, eax); |
257 | return; | 314 | if (!eq_id) |
315 | return; | ||
316 | |||
317 | if (eq_id == this_equiv_id) { | ||
318 | mc = (struct microcode_amd *)amd_ucode_patch; | ||
258 | 319 | ||
259 | ucode = (void *)(initrd_start + ucode_offset); | 320 | if (mc && rev < mc->hdr.patch_id) { |
260 | eax = ((eax >> 8) & 0xf) + ((eax >> 20) & 0xff); | 321 | if (!__apply_microcode_amd(mc)) |
261 | if (load_microcode_amd(eax, ucode, ucode_size) != UCODE_OK) | 322 | ucode_new_rev = mc->hdr.patch_id; |
323 | } | ||
324 | |||
325 | } else { | ||
326 | if (!ucode_cpio.data) | ||
262 | return; | 327 | return; |
263 | 328 | ||
264 | ucode_loaded = true; | 329 | /* |
330 | * AP has a different equivalence ID than BSP, looks like | ||
331 | * mixed-steppings silicon so go through the ucode blob anew. | ||
332 | */ | ||
333 | apply_ucode_in_initrd(ucode_cpio.data, ucode_cpio.size); | ||
265 | } | 334 | } |
266 | |||
267 | apply_microcode_amd(cpu); | ||
268 | } | 335 | } |
269 | #endif | 336 | #endif |
270 | 337 | ||
271 | int __init save_microcode_in_initrd_amd(void) | 338 | int __init save_microcode_in_initrd_amd(void) |
272 | { | 339 | { |
273 | enum ucode_state ret; | 340 | enum ucode_state ret; |
274 | void *ucode; | ||
275 | u32 eax; | 341 | u32 eax; |
276 | 342 | ||
277 | #ifdef CONFIG_X86_32 | 343 | #ifdef CONFIG_X86_32 |
@@ -280,22 +346,35 @@ int __init save_microcode_in_initrd_amd(void) | |||
280 | 346 | ||
281 | if (!uci->cpu_sig.sig) | 347 | if (!uci->cpu_sig.sig) |
282 | smp_call_function_single(bsp, collect_cpu_sig_on_bsp, NULL, 1); | 348 | smp_call_function_single(bsp, collect_cpu_sig_on_bsp, NULL, 1); |
349 | |||
350 | /* | ||
351 | * Take into account the fact that the ramdisk might get relocated | ||
352 | * and therefore we need to recompute the container's position in | ||
353 | * virtual memory space. | ||
354 | */ | ||
355 | container = (u8 *)(__va((u32)relocated_ramdisk) + | ||
356 | ((u32)container - boot_params.hdr.ramdisk_image)); | ||
283 | #endif | 357 | #endif |
284 | if (ucode_new_rev) | 358 | if (ucode_new_rev) |
285 | pr_info("microcode: updated early to new patch_level=0x%08x\n", | 359 | pr_info("microcode: updated early to new patch_level=0x%08x\n", |
286 | ucode_new_rev); | 360 | ucode_new_rev); |
287 | 361 | ||
288 | if (ucode_loaded || !ucode_size || !initrd_start) | 362 | if (!container) |
289 | return 0; | 363 | return -EINVAL; |
290 | 364 | ||
291 | ucode = (void *)(initrd_start + ucode_offset); | ||
292 | eax = cpuid_eax(0x00000001); | 365 | eax = cpuid_eax(0x00000001); |
293 | eax = ((eax >> 8) & 0xf) + ((eax >> 20) & 0xff); | 366 | eax = ((eax >> 8) & 0xf) + ((eax >> 20) & 0xff); |
294 | 367 | ||
295 | ret = load_microcode_amd(eax, ucode, ucode_size); | 368 | ret = load_microcode_amd(eax, container, container_size); |
296 | if (ret != UCODE_OK) | 369 | if (ret != UCODE_OK) |
297 | return -EINVAL; | 370 | return -EINVAL; |
298 | 371 | ||
299 | ucode_loaded = true; | 372 | /* |
373 | * This will be freed any msec now, stash patches for the current | ||
374 | * family and switch to patch cache for cpu hotplug, etc later. | ||
375 | */ | ||
376 | container = NULL; | ||
377 | container_size = 0; | ||
378 | |||
300 | return 0; | 379 | return 0; |
301 | } | 380 | } |
diff --git a/arch/x86/kernel/microcode_core.c b/arch/x86/kernel/cpu/microcode/core.c index 15c987698b0f..15c987698b0f 100644 --- a/arch/x86/kernel/microcode_core.c +++ b/arch/x86/kernel/cpu/microcode/core.c | |||
diff --git a/arch/x86/kernel/microcode_core_early.c b/arch/x86/kernel/cpu/microcode/core_early.c index be7f8514f577..be7f8514f577 100644 --- a/arch/x86/kernel/microcode_core_early.c +++ b/arch/x86/kernel/cpu/microcode/core_early.c | |||
diff --git a/arch/x86/kernel/microcode_intel.c b/arch/x86/kernel/cpu/microcode/intel.c index 5fb2cebf556b..a276fa75d9b5 100644 --- a/arch/x86/kernel/microcode_intel.c +++ b/arch/x86/kernel/cpu/microcode/intel.c | |||
@@ -278,7 +278,7 @@ static enum ucode_state request_microcode_fw(int cpu, struct device *device, | |||
278 | sprintf(name, "intel-ucode/%02x-%02x-%02x", | 278 | sprintf(name, "intel-ucode/%02x-%02x-%02x", |
279 | c->x86, c->x86_model, c->x86_mask); | 279 | c->x86, c->x86_model, c->x86_mask); |
280 | 280 | ||
281 | if (request_firmware(&firmware, name, device)) { | 281 | if (request_firmware_direct(&firmware, name, device)) { |
282 | pr_debug("data file %s load failed\n", name); | 282 | pr_debug("data file %s load failed\n", name); |
283 | return UCODE_NFOUND; | 283 | return UCODE_NFOUND; |
284 | } | 284 | } |
diff --git a/arch/x86/kernel/microcode_intel_early.c b/arch/x86/kernel/cpu/microcode/intel_early.c index 1575deb2e636..18f739129e72 100644 --- a/arch/x86/kernel/microcode_intel_early.c +++ b/arch/x86/kernel/cpu/microcode/intel_early.c | |||
@@ -365,16 +365,6 @@ out: | |||
365 | return state; | 365 | return state; |
366 | } | 366 | } |
367 | 367 | ||
368 | #define native_rdmsr(msr, val1, val2) \ | ||
369 | do { \ | ||
370 | u64 __val = native_read_msr((msr)); \ | ||
371 | (void)((val1) = (u32)__val); \ | ||
372 | (void)((val2) = (u32)(__val >> 32)); \ | ||
373 | } while (0) | ||
374 | |||
375 | #define native_wrmsr(msr, low, high) \ | ||
376 | native_write_msr(msr, low, high); | ||
377 | |||
378 | static int collect_cpu_info_early(struct ucode_cpu_info *uci) | 368 | static int collect_cpu_info_early(struct ucode_cpu_info *uci) |
379 | { | 369 | { |
380 | unsigned int val[2]; | 370 | unsigned int val[2]; |
diff --git a/arch/x86/kernel/microcode_intel_lib.c b/arch/x86/kernel/cpu/microcode/intel_lib.c index ce69320d0179..ce69320d0179 100644 --- a/arch/x86/kernel/microcode_intel_lib.c +++ b/arch/x86/kernel/cpu/microcode/intel_lib.c | |||
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index 8e132931614d..b88645191fe5 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c | |||
@@ -1883,21 +1883,27 @@ static struct pmu pmu = { | |||
1883 | 1883 | ||
1884 | void arch_perf_update_userpage(struct perf_event_mmap_page *userpg, u64 now) | 1884 | void arch_perf_update_userpage(struct perf_event_mmap_page *userpg, u64 now) |
1885 | { | 1885 | { |
1886 | struct cyc2ns_data *data; | ||
1887 | |||
1886 | userpg->cap_user_time = 0; | 1888 | userpg->cap_user_time = 0; |
1887 | userpg->cap_user_time_zero = 0; | 1889 | userpg->cap_user_time_zero = 0; |
1888 | userpg->cap_user_rdpmc = x86_pmu.attr_rdpmc; | 1890 | userpg->cap_user_rdpmc = x86_pmu.attr_rdpmc; |
1889 | userpg->pmc_width = x86_pmu.cntval_bits; | 1891 | userpg->pmc_width = x86_pmu.cntval_bits; |
1890 | 1892 | ||
1891 | if (!sched_clock_stable) | 1893 | if (!sched_clock_stable()) |
1892 | return; | 1894 | return; |
1893 | 1895 | ||
1896 | data = cyc2ns_read_begin(); | ||
1897 | |||
1894 | userpg->cap_user_time = 1; | 1898 | userpg->cap_user_time = 1; |
1895 | userpg->time_mult = this_cpu_read(cyc2ns); | 1899 | userpg->time_mult = data->cyc2ns_mul; |
1896 | userpg->time_shift = CYC2NS_SCALE_FACTOR; | 1900 | userpg->time_shift = data->cyc2ns_shift; |
1897 | userpg->time_offset = this_cpu_read(cyc2ns_offset) - now; | 1901 | userpg->time_offset = data->cyc2ns_offset - now; |
1898 | 1902 | ||
1899 | userpg->cap_user_time_zero = 1; | 1903 | userpg->cap_user_time_zero = 1; |
1900 | userpg->time_zero = this_cpu_read(cyc2ns_offset); | 1904 | userpg->time_zero = data->cyc2ns_offset; |
1905 | |||
1906 | cyc2ns_read_end(data); | ||
1901 | } | 1907 | } |
1902 | 1908 | ||
1903 | /* | 1909 | /* |
diff --git a/arch/x86/kernel/cpu/perf_event.h b/arch/x86/kernel/cpu/perf_event.h index fd00bb29425d..c1a861829d81 100644 --- a/arch/x86/kernel/cpu/perf_event.h +++ b/arch/x86/kernel/cpu/perf_event.h | |||
@@ -262,11 +262,20 @@ struct cpu_hw_events { | |||
262 | __EVENT_CONSTRAINT(c, n, INTEL_ARCH_EVENT_MASK, \ | 262 | __EVENT_CONSTRAINT(c, n, INTEL_ARCH_EVENT_MASK, \ |
263 | HWEIGHT(n), 0, PERF_X86_EVENT_PEBS_ST_HSW) | 263 | HWEIGHT(n), 0, PERF_X86_EVENT_PEBS_ST_HSW) |
264 | 264 | ||
265 | #define EVENT_CONSTRAINT_END \ | 265 | /* |
266 | EVENT_CONSTRAINT(0, 0, 0) | 266 | * We define the end marker as having a weight of -1 |
267 | * to enable blacklisting of events using a counter bitmask | ||
268 | * of zero and thus a weight of zero. | ||
269 | * The end marker has a weight that cannot possibly be | ||
270 | * obtained from counting the bits in the bitmask. | ||
271 | */ | ||
272 | #define EVENT_CONSTRAINT_END { .weight = -1 } | ||
267 | 273 | ||
274 | /* | ||
275 | * Check for end marker with weight == -1 | ||
276 | */ | ||
268 | #define for_each_event_constraint(e, c) \ | 277 | #define for_each_event_constraint(e, c) \ |
269 | for ((e) = (c); (e)->weight; (e)++) | 278 | for ((e) = (c); (e)->weight != -1; (e)++) |
270 | 279 | ||
271 | /* | 280 | /* |
272 | * Extra registers for specific events. | 281 | * Extra registers for specific events. |
diff --git a/arch/x86/kernel/cpu/perf_event_amd_ibs.c b/arch/x86/kernel/cpu/perf_event_amd_ibs.c index e09f0bfb7b8f..4b8e4d3cd6ea 100644 --- a/arch/x86/kernel/cpu/perf_event_amd_ibs.c +++ b/arch/x86/kernel/cpu/perf_event_amd_ibs.c | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <linux/module.h> | 10 | #include <linux/module.h> |
11 | #include <linux/pci.h> | 11 | #include <linux/pci.h> |
12 | #include <linux/ptrace.h> | 12 | #include <linux/ptrace.h> |
13 | #include <linux/syscore_ops.h> | ||
13 | 14 | ||
14 | #include <asm/apic.h> | 15 | #include <asm/apic.h> |
15 | 16 | ||
@@ -816,6 +817,18 @@ out: | |||
816 | return ret; | 817 | return ret; |
817 | } | 818 | } |
818 | 819 | ||
820 | static void ibs_eilvt_setup(void) | ||
821 | { | ||
822 | /* | ||
823 | * Force LVT offset assignment for family 10h: The offsets are | ||
824 | * not assigned by the BIOS for this family, so the OS is | ||
825 | * responsible for doing it. If the OS assignment fails, fall | ||
826 | * back to BIOS settings and try to setup this. | ||
827 | */ | ||
828 | if (boot_cpu_data.x86 == 0x10) | ||
829 | force_ibs_eilvt_setup(); | ||
830 | } | ||
831 | |||
819 | static inline int get_ibs_lvt_offset(void) | 832 | static inline int get_ibs_lvt_offset(void) |
820 | { | 833 | { |
821 | u64 val; | 834 | u64 val; |
@@ -851,6 +864,36 @@ static void clear_APIC_ibs(void *dummy) | |||
851 | setup_APIC_eilvt(offset, 0, APIC_EILVT_MSG_FIX, 1); | 864 | setup_APIC_eilvt(offset, 0, APIC_EILVT_MSG_FIX, 1); |
852 | } | 865 | } |
853 | 866 | ||
867 | #ifdef CONFIG_PM | ||
868 | |||
869 | static int perf_ibs_suspend(void) | ||
870 | { | ||
871 | clear_APIC_ibs(NULL); | ||
872 | return 0; | ||
873 | } | ||
874 | |||
875 | static void perf_ibs_resume(void) | ||
876 | { | ||
877 | ibs_eilvt_setup(); | ||
878 | setup_APIC_ibs(NULL); | ||
879 | } | ||
880 | |||
881 | static struct syscore_ops perf_ibs_syscore_ops = { | ||
882 | .resume = perf_ibs_resume, | ||
883 | .suspend = perf_ibs_suspend, | ||
884 | }; | ||
885 | |||
886 | static void perf_ibs_pm_init(void) | ||
887 | { | ||
888 | register_syscore_ops(&perf_ibs_syscore_ops); | ||
889 | } | ||
890 | |||
891 | #else | ||
892 | |||
893 | static inline void perf_ibs_pm_init(void) { } | ||
894 | |||
895 | #endif | ||
896 | |||
854 | static int | 897 | static int |
855 | perf_ibs_cpu_notifier(struct notifier_block *self, unsigned long action, void *hcpu) | 898 | perf_ibs_cpu_notifier(struct notifier_block *self, unsigned long action, void *hcpu) |
856 | { | 899 | { |
@@ -877,18 +920,12 @@ static __init int amd_ibs_init(void) | |||
877 | if (!caps) | 920 | if (!caps) |
878 | return -ENODEV; /* ibs not supported by the cpu */ | 921 | return -ENODEV; /* ibs not supported by the cpu */ |
879 | 922 | ||
880 | /* | 923 | ibs_eilvt_setup(); |
881 | * Force LVT offset assignment for family 10h: The offsets are | ||
882 | * not assigned by the BIOS for this family, so the OS is | ||
883 | * responsible for doing it. If the OS assignment fails, fall | ||
884 | * back to BIOS settings and try to setup this. | ||
885 | */ | ||
886 | if (boot_cpu_data.x86 == 0x10) | ||
887 | force_ibs_eilvt_setup(); | ||
888 | 924 | ||
889 | if (!ibs_eilvt_valid()) | 925 | if (!ibs_eilvt_valid()) |
890 | goto out; | 926 | goto out; |
891 | 927 | ||
928 | perf_ibs_pm_init(); | ||
892 | get_online_cpus(); | 929 | get_online_cpus(); |
893 | ibs_caps = caps; | 930 | ibs_caps = caps; |
894 | /* make ibs_caps visible to other cpus: */ | 931 | /* make ibs_caps visible to other cpus: */ |
diff --git a/arch/x86/kernel/cpu/perf_event_intel_rapl.c b/arch/x86/kernel/cpu/perf_event_intel_rapl.c new file mode 100644 index 000000000000..5ad35ad94d0f --- /dev/null +++ b/arch/x86/kernel/cpu/perf_event_intel_rapl.c | |||
@@ -0,0 +1,679 @@ | |||
1 | /* | ||
2 | * perf_event_intel_rapl.c: support Intel RAPL energy consumption counters | ||
3 | * Copyright (C) 2013 Google, Inc., Stephane Eranian | ||
4 | * | ||
5 | * Intel RAPL interface is specified in the IA-32 Manual Vol3b | ||
6 | * section 14.7.1 (September 2013) | ||
7 | * | ||
8 | * RAPL provides more controls than just reporting energy consumption | ||
9 | * however here we only expose the 3 energy consumption free running | ||
10 | * counters (pp0, pkg, dram). | ||
11 | * | ||
12 | * Each of those counters increments in a power unit defined by the | ||
13 | * RAPL_POWER_UNIT MSR. On SandyBridge, this unit is 1/(2^16) Joules | ||
14 | * but it can vary. | ||
15 | * | ||
16 | * Counter to rapl events mappings: | ||
17 | * | ||
18 | * pp0 counter: consumption of all physical cores (power plane 0) | ||
19 | * event: rapl_energy_cores | ||
20 | * perf code: 0x1 | ||
21 | * | ||
22 | * pkg counter: consumption of the whole processor package | ||
23 | * event: rapl_energy_pkg | ||
24 | * perf code: 0x2 | ||
25 | * | ||
26 | * dram counter: consumption of the dram domain (servers only) | ||
27 | * event: rapl_energy_dram | ||
28 | * perf code: 0x3 | ||
29 | * | ||
30 | * dram counter: consumption of the builtin-gpu domain (client only) | ||
31 | * event: rapl_energy_gpu | ||
32 | * perf code: 0x4 | ||
33 | * | ||
34 | * We manage those counters as free running (read-only). They may be | ||
35 | * use simultaneously by other tools, such as turbostat. | ||
36 | * | ||
37 | * The events only support system-wide mode counting. There is no | ||
38 | * sampling support because it does not make sense and is not | ||
39 | * supported by the RAPL hardware. | ||
40 | * | ||
41 | * Because we want to avoid floating-point operations in the kernel, | ||
42 | * the events are all reported in fixed point arithmetic (32.32). | ||
43 | * Tools must adjust the counts to convert them to Watts using | ||
44 | * the duration of the measurement. Tools may use a function such as | ||
45 | * ldexp(raw_count, -32); | ||
46 | */ | ||
47 | #include <linux/module.h> | ||
48 | #include <linux/slab.h> | ||
49 | #include <linux/perf_event.h> | ||
50 | #include <asm/cpu_device_id.h> | ||
51 | #include "perf_event.h" | ||
52 | |||
53 | /* | ||
54 | * RAPL energy status counters | ||
55 | */ | ||
56 | #define RAPL_IDX_PP0_NRG_STAT 0 /* all cores */ | ||
57 | #define INTEL_RAPL_PP0 0x1 /* pseudo-encoding */ | ||
58 | #define RAPL_IDX_PKG_NRG_STAT 1 /* entire package */ | ||
59 | #define INTEL_RAPL_PKG 0x2 /* pseudo-encoding */ | ||
60 | #define RAPL_IDX_RAM_NRG_STAT 2 /* DRAM */ | ||
61 | #define INTEL_RAPL_RAM 0x3 /* pseudo-encoding */ | ||
62 | #define RAPL_IDX_PP1_NRG_STAT 3 /* DRAM */ | ||
63 | #define INTEL_RAPL_PP1 0x4 /* pseudo-encoding */ | ||
64 | |||
65 | /* Clients have PP0, PKG */ | ||
66 | #define RAPL_IDX_CLN (1<<RAPL_IDX_PP0_NRG_STAT|\ | ||
67 | 1<<RAPL_IDX_PKG_NRG_STAT|\ | ||
68 | 1<<RAPL_IDX_PP1_NRG_STAT) | ||
69 | |||
70 | /* Servers have PP0, PKG, RAM */ | ||
71 | #define RAPL_IDX_SRV (1<<RAPL_IDX_PP0_NRG_STAT|\ | ||
72 | 1<<RAPL_IDX_PKG_NRG_STAT|\ | ||
73 | 1<<RAPL_IDX_RAM_NRG_STAT) | ||
74 | |||
75 | /* | ||
76 | * event code: LSB 8 bits, passed in attr->config | ||
77 | * any other bit is reserved | ||
78 | */ | ||
79 | #define RAPL_EVENT_MASK 0xFFULL | ||
80 | |||
81 | #define DEFINE_RAPL_FORMAT_ATTR(_var, _name, _format) \ | ||
82 | static ssize_t __rapl_##_var##_show(struct kobject *kobj, \ | ||
83 | struct kobj_attribute *attr, \ | ||
84 | char *page) \ | ||
85 | { \ | ||
86 | BUILD_BUG_ON(sizeof(_format) >= PAGE_SIZE); \ | ||
87 | return sprintf(page, _format "\n"); \ | ||
88 | } \ | ||
89 | static struct kobj_attribute format_attr_##_var = \ | ||
90 | __ATTR(_name, 0444, __rapl_##_var##_show, NULL) | ||
91 | |||
92 | #define RAPL_EVENT_DESC(_name, _config) \ | ||
93 | { \ | ||
94 | .attr = __ATTR(_name, 0444, rapl_event_show, NULL), \ | ||
95 | .config = _config, \ | ||
96 | } | ||
97 | |||
98 | #define RAPL_CNTR_WIDTH 32 /* 32-bit rapl counters */ | ||
99 | |||
100 | struct rapl_pmu { | ||
101 | spinlock_t lock; | ||
102 | int hw_unit; /* 1/2^hw_unit Joule */ | ||
103 | int n_active; /* number of active events */ | ||
104 | struct list_head active_list; | ||
105 | struct pmu *pmu; /* pointer to rapl_pmu_class */ | ||
106 | ktime_t timer_interval; /* in ktime_t unit */ | ||
107 | struct hrtimer hrtimer; | ||
108 | }; | ||
109 | |||
110 | static struct pmu rapl_pmu_class; | ||
111 | static cpumask_t rapl_cpu_mask; | ||
112 | static int rapl_cntr_mask; | ||
113 | |||
114 | static DEFINE_PER_CPU(struct rapl_pmu *, rapl_pmu); | ||
115 | static DEFINE_PER_CPU(struct rapl_pmu *, rapl_pmu_to_free); | ||
116 | |||
117 | static inline u64 rapl_read_counter(struct perf_event *event) | ||
118 | { | ||
119 | u64 raw; | ||
120 | rdmsrl(event->hw.event_base, raw); | ||
121 | return raw; | ||
122 | } | ||
123 | |||
124 | static inline u64 rapl_scale(u64 v) | ||
125 | { | ||
126 | /* | ||
127 | * scale delta to smallest unit (1/2^32) | ||
128 | * users must then scale back: count * 1/(1e9*2^32) to get Joules | ||
129 | * or use ldexp(count, -32). | ||
130 | * Watts = Joules/Time delta | ||
131 | */ | ||
132 | return v << (32 - __get_cpu_var(rapl_pmu)->hw_unit); | ||
133 | } | ||
134 | |||
135 | static u64 rapl_event_update(struct perf_event *event) | ||
136 | { | ||
137 | struct hw_perf_event *hwc = &event->hw; | ||
138 | u64 prev_raw_count, new_raw_count; | ||
139 | s64 delta, sdelta; | ||
140 | int shift = RAPL_CNTR_WIDTH; | ||
141 | |||
142 | again: | ||
143 | prev_raw_count = local64_read(&hwc->prev_count); | ||
144 | rdmsrl(event->hw.event_base, new_raw_count); | ||
145 | |||
146 | if (local64_cmpxchg(&hwc->prev_count, prev_raw_count, | ||
147 | new_raw_count) != prev_raw_count) { | ||
148 | cpu_relax(); | ||
149 | goto again; | ||
150 | } | ||
151 | |||
152 | /* | ||
153 | * Now we have the new raw value and have updated the prev | ||
154 | * timestamp already. We can now calculate the elapsed delta | ||
155 | * (event-)time and add that to the generic event. | ||
156 | * | ||
157 | * Careful, not all hw sign-extends above the physical width | ||
158 | * of the count. | ||
159 | */ | ||
160 | delta = (new_raw_count << shift) - (prev_raw_count << shift); | ||
161 | delta >>= shift; | ||
162 | |||
163 | sdelta = rapl_scale(delta); | ||
164 | |||
165 | local64_add(sdelta, &event->count); | ||
166 | |||
167 | return new_raw_count; | ||
168 | } | ||
169 | |||
170 | static void rapl_start_hrtimer(struct rapl_pmu *pmu) | ||
171 | { | ||
172 | __hrtimer_start_range_ns(&pmu->hrtimer, | ||
173 | pmu->timer_interval, 0, | ||
174 | HRTIMER_MODE_REL_PINNED, 0); | ||
175 | } | ||
176 | |||
177 | static void rapl_stop_hrtimer(struct rapl_pmu *pmu) | ||
178 | { | ||
179 | hrtimer_cancel(&pmu->hrtimer); | ||
180 | } | ||
181 | |||
182 | static enum hrtimer_restart rapl_hrtimer_handle(struct hrtimer *hrtimer) | ||
183 | { | ||
184 | struct rapl_pmu *pmu = __get_cpu_var(rapl_pmu); | ||
185 | struct perf_event *event; | ||
186 | unsigned long flags; | ||
187 | |||
188 | if (!pmu->n_active) | ||
189 | return HRTIMER_NORESTART; | ||
190 | |||
191 | spin_lock_irqsave(&pmu->lock, flags); | ||
192 | |||
193 | list_for_each_entry(event, &pmu->active_list, active_entry) { | ||
194 | rapl_event_update(event); | ||
195 | } | ||
196 | |||
197 | spin_unlock_irqrestore(&pmu->lock, flags); | ||
198 | |||
199 | hrtimer_forward_now(hrtimer, pmu->timer_interval); | ||
200 | |||
201 | return HRTIMER_RESTART; | ||
202 | } | ||
203 | |||
204 | static void rapl_hrtimer_init(struct rapl_pmu *pmu) | ||
205 | { | ||
206 | struct hrtimer *hr = &pmu->hrtimer; | ||
207 | |||
208 | hrtimer_init(hr, CLOCK_MONOTONIC, HRTIMER_MODE_REL); | ||
209 | hr->function = rapl_hrtimer_handle; | ||
210 | } | ||
211 | |||
212 | static void __rapl_pmu_event_start(struct rapl_pmu *pmu, | ||
213 | struct perf_event *event) | ||
214 | { | ||
215 | if (WARN_ON_ONCE(!(event->hw.state & PERF_HES_STOPPED))) | ||
216 | return; | ||
217 | |||
218 | event->hw.state = 0; | ||
219 | |||
220 | list_add_tail(&event->active_entry, &pmu->active_list); | ||
221 | |||
222 | local64_set(&event->hw.prev_count, rapl_read_counter(event)); | ||
223 | |||
224 | pmu->n_active++; | ||
225 | if (pmu->n_active == 1) | ||
226 | rapl_start_hrtimer(pmu); | ||
227 | } | ||
228 | |||
229 | static void rapl_pmu_event_start(struct perf_event *event, int mode) | ||
230 | { | ||
231 | struct rapl_pmu *pmu = __get_cpu_var(rapl_pmu); | ||
232 | unsigned long flags; | ||
233 | |||
234 | spin_lock_irqsave(&pmu->lock, flags); | ||
235 | __rapl_pmu_event_start(pmu, event); | ||
236 | spin_unlock_irqrestore(&pmu->lock, flags); | ||
237 | } | ||
238 | |||
239 | static void rapl_pmu_event_stop(struct perf_event *event, int mode) | ||
240 | { | ||
241 | struct rapl_pmu *pmu = __get_cpu_var(rapl_pmu); | ||
242 | struct hw_perf_event *hwc = &event->hw; | ||
243 | unsigned long flags; | ||
244 | |||
245 | spin_lock_irqsave(&pmu->lock, flags); | ||
246 | |||
247 | /* mark event as deactivated and stopped */ | ||
248 | if (!(hwc->state & PERF_HES_STOPPED)) { | ||
249 | WARN_ON_ONCE(pmu->n_active <= 0); | ||
250 | pmu->n_active--; | ||
251 | if (pmu->n_active == 0) | ||
252 | rapl_stop_hrtimer(pmu); | ||
253 | |||
254 | list_del(&event->active_entry); | ||
255 | |||
256 | WARN_ON_ONCE(hwc->state & PERF_HES_STOPPED); | ||
257 | hwc->state |= PERF_HES_STOPPED; | ||
258 | } | ||
259 | |||
260 | /* check if update of sw counter is necessary */ | ||
261 | if ((mode & PERF_EF_UPDATE) && !(hwc->state & PERF_HES_UPTODATE)) { | ||
262 | /* | ||
263 | * Drain the remaining delta count out of a event | ||
264 | * that we are disabling: | ||
265 | */ | ||
266 | rapl_event_update(event); | ||
267 | hwc->state |= PERF_HES_UPTODATE; | ||
268 | } | ||
269 | |||
270 | spin_unlock_irqrestore(&pmu->lock, flags); | ||
271 | } | ||
272 | |||
273 | static int rapl_pmu_event_add(struct perf_event *event, int mode) | ||
274 | { | ||
275 | struct rapl_pmu *pmu = __get_cpu_var(rapl_pmu); | ||
276 | struct hw_perf_event *hwc = &event->hw; | ||
277 | unsigned long flags; | ||
278 | |||
279 | spin_lock_irqsave(&pmu->lock, flags); | ||
280 | |||
281 | hwc->state = PERF_HES_UPTODATE | PERF_HES_STOPPED; | ||
282 | |||
283 | if (mode & PERF_EF_START) | ||
284 | __rapl_pmu_event_start(pmu, event); | ||
285 | |||
286 | spin_unlock_irqrestore(&pmu->lock, flags); | ||
287 | |||
288 | return 0; | ||
289 | } | ||
290 | |||
291 | static void rapl_pmu_event_del(struct perf_event *event, int flags) | ||
292 | { | ||
293 | rapl_pmu_event_stop(event, PERF_EF_UPDATE); | ||
294 | } | ||
295 | |||
296 | static int rapl_pmu_event_init(struct perf_event *event) | ||
297 | { | ||
298 | u64 cfg = event->attr.config & RAPL_EVENT_MASK; | ||
299 | int bit, msr, ret = 0; | ||
300 | |||
301 | /* only look at RAPL events */ | ||
302 | if (event->attr.type != rapl_pmu_class.type) | ||
303 | return -ENOENT; | ||
304 | |||
305 | /* check only supported bits are set */ | ||
306 | if (event->attr.config & ~RAPL_EVENT_MASK) | ||
307 | return -EINVAL; | ||
308 | |||
309 | /* | ||
310 | * check event is known (determines counter) | ||
311 | */ | ||
312 | switch (cfg) { | ||
313 | case INTEL_RAPL_PP0: | ||
314 | bit = RAPL_IDX_PP0_NRG_STAT; | ||
315 | msr = MSR_PP0_ENERGY_STATUS; | ||
316 | break; | ||
317 | case INTEL_RAPL_PKG: | ||
318 | bit = RAPL_IDX_PKG_NRG_STAT; | ||
319 | msr = MSR_PKG_ENERGY_STATUS; | ||
320 | break; | ||
321 | case INTEL_RAPL_RAM: | ||
322 | bit = RAPL_IDX_RAM_NRG_STAT; | ||
323 | msr = MSR_DRAM_ENERGY_STATUS; | ||
324 | break; | ||
325 | case INTEL_RAPL_PP1: | ||
326 | bit = RAPL_IDX_PP1_NRG_STAT; | ||
327 | msr = MSR_PP1_ENERGY_STATUS; | ||
328 | break; | ||
329 | default: | ||
330 | return -EINVAL; | ||
331 | } | ||
332 | /* check event supported */ | ||
333 | if (!(rapl_cntr_mask & (1 << bit))) | ||
334 | return -EINVAL; | ||
335 | |||
336 | /* unsupported modes and filters */ | ||
337 | if (event->attr.exclude_user || | ||
338 | event->attr.exclude_kernel || | ||
339 | event->attr.exclude_hv || | ||
340 | event->attr.exclude_idle || | ||
341 | event->attr.exclude_host || | ||
342 | event->attr.exclude_guest || | ||
343 | event->attr.sample_period) /* no sampling */ | ||
344 | return -EINVAL; | ||
345 | |||
346 | /* must be done before validate_group */ | ||
347 | event->hw.event_base = msr; | ||
348 | event->hw.config = cfg; | ||
349 | event->hw.idx = bit; | ||
350 | |||
351 | return ret; | ||
352 | } | ||
353 | |||
354 | static void rapl_pmu_event_read(struct perf_event *event) | ||
355 | { | ||
356 | rapl_event_update(event); | ||
357 | } | ||
358 | |||
359 | static ssize_t rapl_get_attr_cpumask(struct device *dev, | ||
360 | struct device_attribute *attr, char *buf) | ||
361 | { | ||
362 | int n = cpulist_scnprintf(buf, PAGE_SIZE - 2, &rapl_cpu_mask); | ||
363 | |||
364 | buf[n++] = '\n'; | ||
365 | buf[n] = '\0'; | ||
366 | return n; | ||
367 | } | ||
368 | |||
369 | static DEVICE_ATTR(cpumask, S_IRUGO, rapl_get_attr_cpumask, NULL); | ||
370 | |||
371 | static struct attribute *rapl_pmu_attrs[] = { | ||
372 | &dev_attr_cpumask.attr, | ||
373 | NULL, | ||
374 | }; | ||
375 | |||
376 | static struct attribute_group rapl_pmu_attr_group = { | ||
377 | .attrs = rapl_pmu_attrs, | ||
378 | }; | ||
379 | |||
380 | EVENT_ATTR_STR(energy-cores, rapl_cores, "event=0x01"); | ||
381 | EVENT_ATTR_STR(energy-pkg , rapl_pkg, "event=0x02"); | ||
382 | EVENT_ATTR_STR(energy-ram , rapl_ram, "event=0x03"); | ||
383 | EVENT_ATTR_STR(energy-gpu , rapl_gpu, "event=0x04"); | ||
384 | |||
385 | EVENT_ATTR_STR(energy-cores.unit, rapl_cores_unit, "Joules"); | ||
386 | EVENT_ATTR_STR(energy-pkg.unit , rapl_pkg_unit, "Joules"); | ||
387 | EVENT_ATTR_STR(energy-ram.unit , rapl_ram_unit, "Joules"); | ||
388 | EVENT_ATTR_STR(energy-gpu.unit , rapl_gpu_unit, "Joules"); | ||
389 | |||
390 | /* | ||
391 | * we compute in 0.23 nJ increments regardless of MSR | ||
392 | */ | ||
393 | EVENT_ATTR_STR(energy-cores.scale, rapl_cores_scale, "2.3283064365386962890625e-10"); | ||
394 | EVENT_ATTR_STR(energy-pkg.scale, rapl_pkg_scale, "2.3283064365386962890625e-10"); | ||
395 | EVENT_ATTR_STR(energy-ram.scale, rapl_ram_scale, "2.3283064365386962890625e-10"); | ||
396 | EVENT_ATTR_STR(energy-gpu.scale, rapl_gpu_scale, "2.3283064365386962890625e-10"); | ||
397 | |||
398 | static struct attribute *rapl_events_srv_attr[] = { | ||
399 | EVENT_PTR(rapl_cores), | ||
400 | EVENT_PTR(rapl_pkg), | ||
401 | EVENT_PTR(rapl_ram), | ||
402 | |||
403 | EVENT_PTR(rapl_cores_unit), | ||
404 | EVENT_PTR(rapl_pkg_unit), | ||
405 | EVENT_PTR(rapl_ram_unit), | ||
406 | |||
407 | EVENT_PTR(rapl_cores_scale), | ||
408 | EVENT_PTR(rapl_pkg_scale), | ||
409 | EVENT_PTR(rapl_ram_scale), | ||
410 | NULL, | ||
411 | }; | ||
412 | |||
413 | static struct attribute *rapl_events_cln_attr[] = { | ||
414 | EVENT_PTR(rapl_cores), | ||
415 | EVENT_PTR(rapl_pkg), | ||
416 | EVENT_PTR(rapl_gpu), | ||
417 | |||
418 | EVENT_PTR(rapl_cores_unit), | ||
419 | EVENT_PTR(rapl_pkg_unit), | ||
420 | EVENT_PTR(rapl_gpu_unit), | ||
421 | |||
422 | EVENT_PTR(rapl_cores_scale), | ||
423 | EVENT_PTR(rapl_pkg_scale), | ||
424 | EVENT_PTR(rapl_gpu_scale), | ||
425 | NULL, | ||
426 | }; | ||
427 | |||
428 | static struct attribute_group rapl_pmu_events_group = { | ||
429 | .name = "events", | ||
430 | .attrs = NULL, /* patched at runtime */ | ||
431 | }; | ||
432 | |||
433 | DEFINE_RAPL_FORMAT_ATTR(event, event, "config:0-7"); | ||
434 | static struct attribute *rapl_formats_attr[] = { | ||
435 | &format_attr_event.attr, | ||
436 | NULL, | ||
437 | }; | ||
438 | |||
439 | static struct attribute_group rapl_pmu_format_group = { | ||
440 | .name = "format", | ||
441 | .attrs = rapl_formats_attr, | ||
442 | }; | ||
443 | |||
444 | const struct attribute_group *rapl_attr_groups[] = { | ||
445 | &rapl_pmu_attr_group, | ||
446 | &rapl_pmu_format_group, | ||
447 | &rapl_pmu_events_group, | ||
448 | NULL, | ||
449 | }; | ||
450 | |||
451 | static struct pmu rapl_pmu_class = { | ||
452 | .attr_groups = rapl_attr_groups, | ||
453 | .task_ctx_nr = perf_invalid_context, /* system-wide only */ | ||
454 | .event_init = rapl_pmu_event_init, | ||
455 | .add = rapl_pmu_event_add, /* must have */ | ||
456 | .del = rapl_pmu_event_del, /* must have */ | ||
457 | .start = rapl_pmu_event_start, | ||
458 | .stop = rapl_pmu_event_stop, | ||
459 | .read = rapl_pmu_event_read, | ||
460 | }; | ||
461 | |||
462 | static void rapl_cpu_exit(int cpu) | ||
463 | { | ||
464 | struct rapl_pmu *pmu = per_cpu(rapl_pmu, cpu); | ||
465 | int i, phys_id = topology_physical_package_id(cpu); | ||
466 | int target = -1; | ||
467 | |||
468 | /* find a new cpu on same package */ | ||
469 | for_each_online_cpu(i) { | ||
470 | if (i == cpu) | ||
471 | continue; | ||
472 | if (phys_id == topology_physical_package_id(i)) { | ||
473 | target = i; | ||
474 | break; | ||
475 | } | ||
476 | } | ||
477 | /* | ||
478 | * clear cpu from cpumask | ||
479 | * if was set in cpumask and still some cpu on package, | ||
480 | * then move to new cpu | ||
481 | */ | ||
482 | if (cpumask_test_and_clear_cpu(cpu, &rapl_cpu_mask) && target >= 0) | ||
483 | cpumask_set_cpu(target, &rapl_cpu_mask); | ||
484 | |||
485 | WARN_ON(cpumask_empty(&rapl_cpu_mask)); | ||
486 | /* | ||
487 | * migrate events and context to new cpu | ||
488 | */ | ||
489 | if (target >= 0) | ||
490 | perf_pmu_migrate_context(pmu->pmu, cpu, target); | ||
491 | |||
492 | /* cancel overflow polling timer for CPU */ | ||
493 | rapl_stop_hrtimer(pmu); | ||
494 | } | ||
495 | |||
496 | static void rapl_cpu_init(int cpu) | ||
497 | { | ||
498 | int i, phys_id = topology_physical_package_id(cpu); | ||
499 | |||
500 | /* check if phys_is is already covered */ | ||
501 | for_each_cpu(i, &rapl_cpu_mask) { | ||
502 | if (phys_id == topology_physical_package_id(i)) | ||
503 | return; | ||
504 | } | ||
505 | /* was not found, so add it */ | ||
506 | cpumask_set_cpu(cpu, &rapl_cpu_mask); | ||
507 | } | ||
508 | |||
509 | static int rapl_cpu_prepare(int cpu) | ||
510 | { | ||
511 | struct rapl_pmu *pmu = per_cpu(rapl_pmu, cpu); | ||
512 | int phys_id = topology_physical_package_id(cpu); | ||
513 | u64 ms; | ||
514 | |||
515 | if (pmu) | ||
516 | return 0; | ||
517 | |||
518 | if (phys_id < 0) | ||
519 | return -1; | ||
520 | |||
521 | pmu = kzalloc_node(sizeof(*pmu), GFP_KERNEL, cpu_to_node(cpu)); | ||
522 | if (!pmu) | ||
523 | return -1; | ||
524 | |||
525 | spin_lock_init(&pmu->lock); | ||
526 | |||
527 | INIT_LIST_HEAD(&pmu->active_list); | ||
528 | |||
529 | /* | ||
530 | * grab power unit as: 1/2^unit Joules | ||
531 | * | ||
532 | * we cache in local PMU instance | ||
533 | */ | ||
534 | rdmsrl(MSR_RAPL_POWER_UNIT, pmu->hw_unit); | ||
535 | pmu->hw_unit = (pmu->hw_unit >> 8) & 0x1FULL; | ||
536 | pmu->pmu = &rapl_pmu_class; | ||
537 | |||
538 | /* | ||
539 | * use reference of 200W for scaling the timeout | ||
540 | * to avoid missing counter overflows. | ||
541 | * 200W = 200 Joules/sec | ||
542 | * divide interval by 2 to avoid lockstep (2 * 100) | ||
543 | * if hw unit is 32, then we use 2 ms 1/200/2 | ||
544 | */ | ||
545 | if (pmu->hw_unit < 32) | ||
546 | ms = (1000 / (2 * 100)) * (1ULL << (32 - pmu->hw_unit - 1)); | ||
547 | else | ||
548 | ms = 2; | ||
549 | |||
550 | pmu->timer_interval = ms_to_ktime(ms); | ||
551 | |||
552 | rapl_hrtimer_init(pmu); | ||
553 | |||
554 | /* set RAPL pmu for this cpu for now */ | ||
555 | per_cpu(rapl_pmu, cpu) = pmu; | ||
556 | per_cpu(rapl_pmu_to_free, cpu) = NULL; | ||
557 | |||
558 | return 0; | ||
559 | } | ||
560 | |||
561 | static void rapl_cpu_kfree(int cpu) | ||
562 | { | ||
563 | struct rapl_pmu *pmu = per_cpu(rapl_pmu_to_free, cpu); | ||
564 | |||
565 | kfree(pmu); | ||
566 | |||
567 | per_cpu(rapl_pmu_to_free, cpu) = NULL; | ||
568 | } | ||
569 | |||
570 | static int rapl_cpu_dying(int cpu) | ||
571 | { | ||
572 | struct rapl_pmu *pmu = per_cpu(rapl_pmu, cpu); | ||
573 | |||
574 | if (!pmu) | ||
575 | return 0; | ||
576 | |||
577 | per_cpu(rapl_pmu, cpu) = NULL; | ||
578 | |||
579 | per_cpu(rapl_pmu_to_free, cpu) = pmu; | ||
580 | |||
581 | return 0; | ||
582 | } | ||
583 | |||
584 | static int rapl_cpu_notifier(struct notifier_block *self, | ||
585 | unsigned long action, void *hcpu) | ||
586 | { | ||
587 | unsigned int cpu = (long)hcpu; | ||
588 | |||
589 | switch (action & ~CPU_TASKS_FROZEN) { | ||
590 | case CPU_UP_PREPARE: | ||
591 | rapl_cpu_prepare(cpu); | ||
592 | break; | ||
593 | case CPU_STARTING: | ||
594 | rapl_cpu_init(cpu); | ||
595 | break; | ||
596 | case CPU_UP_CANCELED: | ||
597 | case CPU_DYING: | ||
598 | rapl_cpu_dying(cpu); | ||
599 | break; | ||
600 | case CPU_ONLINE: | ||
601 | case CPU_DEAD: | ||
602 | rapl_cpu_kfree(cpu); | ||
603 | break; | ||
604 | case CPU_DOWN_PREPARE: | ||
605 | rapl_cpu_exit(cpu); | ||
606 | break; | ||
607 | default: | ||
608 | break; | ||
609 | } | ||
610 | |||
611 | return NOTIFY_OK; | ||
612 | } | ||
613 | |||
614 | static const struct x86_cpu_id rapl_cpu_match[] = { | ||
615 | [0] = { .vendor = X86_VENDOR_INTEL, .family = 6 }, | ||
616 | [1] = {}, | ||
617 | }; | ||
618 | |||
619 | static int __init rapl_pmu_init(void) | ||
620 | { | ||
621 | struct rapl_pmu *pmu; | ||
622 | int cpu, ret; | ||
623 | |||
624 | /* | ||
625 | * check for Intel processor family 6 | ||
626 | */ | ||
627 | if (!x86_match_cpu(rapl_cpu_match)) | ||
628 | return 0; | ||
629 | |||
630 | /* check supported CPU */ | ||
631 | switch (boot_cpu_data.x86_model) { | ||
632 | case 42: /* Sandy Bridge */ | ||
633 | case 58: /* Ivy Bridge */ | ||
634 | case 60: /* Haswell */ | ||
635 | case 69: /* Haswell-Celeron */ | ||
636 | rapl_cntr_mask = RAPL_IDX_CLN; | ||
637 | rapl_pmu_events_group.attrs = rapl_events_cln_attr; | ||
638 | break; | ||
639 | case 45: /* Sandy Bridge-EP */ | ||
640 | case 62: /* IvyTown */ | ||
641 | rapl_cntr_mask = RAPL_IDX_SRV; | ||
642 | rapl_pmu_events_group.attrs = rapl_events_srv_attr; | ||
643 | break; | ||
644 | |||
645 | default: | ||
646 | /* unsupported */ | ||
647 | return 0; | ||
648 | } | ||
649 | get_online_cpus(); | ||
650 | |||
651 | for_each_online_cpu(cpu) { | ||
652 | rapl_cpu_prepare(cpu); | ||
653 | rapl_cpu_init(cpu); | ||
654 | } | ||
655 | |||
656 | perf_cpu_notifier(rapl_cpu_notifier); | ||
657 | |||
658 | ret = perf_pmu_register(&rapl_pmu_class, "power", -1); | ||
659 | if (WARN_ON(ret)) { | ||
660 | pr_info("RAPL PMU detected, registration failed (%d), RAPL PMU disabled\n", ret); | ||
661 | put_online_cpus(); | ||
662 | return -1; | ||
663 | } | ||
664 | |||
665 | pmu = __get_cpu_var(rapl_pmu); | ||
666 | |||
667 | pr_info("RAPL PMU detected, hw unit 2^-%d Joules," | ||
668 | " API unit is 2^-32 Joules," | ||
669 | " %d fixed counters" | ||
670 | " %llu ms ovfl timer\n", | ||
671 | pmu->hw_unit, | ||
672 | hweight32(rapl_cntr_mask), | ||
673 | ktime_to_ms(pmu->timer_interval)); | ||
674 | |||
675 | put_online_cpus(); | ||
676 | |||
677 | return 0; | ||
678 | } | ||
679 | device_initcall(rapl_pmu_init); | ||
diff --git a/arch/x86/kernel/cpu/rdrand.c b/arch/x86/kernel/cpu/rdrand.c index 88db010845cb..384df5105fbc 100644 --- a/arch/x86/kernel/cpu/rdrand.c +++ b/arch/x86/kernel/cpu/rdrand.c | |||
@@ -31,20 +31,6 @@ static int __init x86_rdrand_setup(char *s) | |||
31 | } | 31 | } |
32 | __setup("nordrand", x86_rdrand_setup); | 32 | __setup("nordrand", x86_rdrand_setup); |
33 | 33 | ||
34 | /* We can't use arch_get_random_long() here since alternatives haven't run */ | ||
35 | static inline int rdrand_long(unsigned long *v) | ||
36 | { | ||
37 | int ok; | ||
38 | asm volatile("1: " RDRAND_LONG "\n\t" | ||
39 | "jc 2f\n\t" | ||
40 | "decl %0\n\t" | ||
41 | "jnz 1b\n\t" | ||
42 | "2:" | ||
43 | : "=r" (ok), "=a" (*v) | ||
44 | : "0" (RDRAND_RETRY_LOOPS)); | ||
45 | return ok; | ||
46 | } | ||
47 | |||
48 | /* | 34 | /* |
49 | * Force a reseed cycle; we are architecturally guaranteed a reseed | 35 | * Force a reseed cycle; we are architecturally guaranteed a reseed |
50 | * after no more than 512 128-bit chunks of random data. This also | 36 | * after no more than 512 128-bit chunks of random data. This also |
diff --git a/arch/x86/kernel/cpu/transmeta.c b/arch/x86/kernel/cpu/transmeta.c index aa0430d69b90..3fa0e5ad86b4 100644 --- a/arch/x86/kernel/cpu/transmeta.c +++ b/arch/x86/kernel/cpu/transmeta.c | |||
@@ -1,6 +1,5 @@ | |||
1 | #include <linux/kernel.h> | 1 | #include <linux/kernel.h> |
2 | #include <linux/mm.h> | 2 | #include <linux/mm.h> |
3 | #include <linux/init.h> | ||
4 | #include <asm/processor.h> | 3 | #include <asm/processor.h> |
5 | #include <asm/msr.h> | 4 | #include <asm/msr.h> |
6 | #include "cpu.h" | 5 | #include "cpu.h" |
diff --git a/arch/x86/kernel/cpu/umc.c b/arch/x86/kernel/cpu/umc.c index 75c5ad5d35cc..ef9c2a0078bd 100644 --- a/arch/x86/kernel/cpu/umc.c +++ b/arch/x86/kernel/cpu/umc.c | |||
@@ -1,5 +1,4 @@ | |||
1 | #include <linux/kernel.h> | 1 | #include <linux/kernel.h> |
2 | #include <linux/init.h> | ||
3 | #include <asm/processor.h> | 2 | #include <asm/processor.h> |
4 | #include "cpu.h" | 3 | #include "cpu.h" |
5 | 4 | ||
diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c index 18677a90d6a3..a57902efe2d5 100644 --- a/arch/x86/kernel/crash.c +++ b/arch/x86/kernel/crash.c | |||
@@ -7,7 +7,6 @@ | |||
7 | * | 7 | * |
8 | */ | 8 | */ |
9 | 9 | ||
10 | #include <linux/init.h> | ||
11 | #include <linux/types.h> | 10 | #include <linux/types.h> |
12 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
13 | #include <linux/smp.h> | 12 | #include <linux/smp.h> |
diff --git a/arch/x86/kernel/doublefault.c b/arch/x86/kernel/doublefault.c index 5d3fe8d36e4a..f6dfd9334b67 100644 --- a/arch/x86/kernel/doublefault.c +++ b/arch/x86/kernel/doublefault.c | |||
@@ -1,6 +1,5 @@ | |||
1 | #include <linux/mm.h> | 1 | #include <linux/mm.h> |
2 | #include <linux/sched.h> | 2 | #include <linux/sched.h> |
3 | #include <linux/init.h> | ||
4 | #include <linux/init_task.h> | 3 | #include <linux/init_task.h> |
5 | #include <linux/fs.h> | 4 | #include <linux/fs.h> |
6 | 5 | ||
diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c index 174da5fc5a7b..988c00a1f60d 100644 --- a/arch/x86/kernel/e820.c +++ b/arch/x86/kernel/e820.c | |||
@@ -1120,7 +1120,7 @@ void __init memblock_find_dma_reserve(void) | |||
1120 | nr_pages += end_pfn - start_pfn; | 1120 | nr_pages += end_pfn - start_pfn; |
1121 | } | 1121 | } |
1122 | 1122 | ||
1123 | for_each_free_mem_range(u, MAX_NUMNODES, &start, &end, NULL) { | 1123 | for_each_free_mem_range(u, NUMA_NO_NODE, &start, &end, NULL) { |
1124 | start_pfn = min_t(unsigned long, PFN_UP(start), MAX_DMA_PFN); | 1124 | start_pfn = min_t(unsigned long, PFN_UP(start), MAX_DMA_PFN); |
1125 | end_pfn = min_t(unsigned long, PFN_DOWN(end), MAX_DMA_PFN); | 1125 | end_pfn = min_t(unsigned long, PFN_DOWN(end), MAX_DMA_PFN); |
1126 | if (start_pfn < end_pfn) | 1126 | if (start_pfn < end_pfn) |
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index 51e2988c5728..a2a4f4697889 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S | |||
@@ -1082,7 +1082,7 @@ ENTRY(ftrace_caller) | |||
1082 | pushl $0 /* Pass NULL as regs pointer */ | 1082 | pushl $0 /* Pass NULL as regs pointer */ |
1083 | movl 4*4(%esp), %eax | 1083 | movl 4*4(%esp), %eax |
1084 | movl 0x4(%ebp), %edx | 1084 | movl 0x4(%ebp), %edx |
1085 | leal function_trace_op, %ecx | 1085 | movl function_trace_op, %ecx |
1086 | subl $MCOUNT_INSN_SIZE, %eax | 1086 | subl $MCOUNT_INSN_SIZE, %eax |
1087 | 1087 | ||
1088 | .globl ftrace_call | 1088 | .globl ftrace_call |
@@ -1140,7 +1140,7 @@ ENTRY(ftrace_regs_caller) | |||
1140 | movl 12*4(%esp), %eax /* Load ip (1st parameter) */ | 1140 | movl 12*4(%esp), %eax /* Load ip (1st parameter) */ |
1141 | subl $MCOUNT_INSN_SIZE, %eax /* Adjust ip */ | 1141 | subl $MCOUNT_INSN_SIZE, %eax /* Adjust ip */ |
1142 | movl 0x4(%ebp), %edx /* Load parent ip (2nd parameter) */ | 1142 | movl 0x4(%ebp), %edx /* Load parent ip (2nd parameter) */ |
1143 | leal function_trace_op, %ecx /* Save ftrace_pos in 3rd parameter */ | 1143 | movl function_trace_op, %ecx /* Save ftrace_pos in 3rd parameter */ |
1144 | pushl %esp /* Save pt_regs as 4th parameter */ | 1144 | pushl %esp /* Save pt_regs as 4th parameter */ |
1145 | 1145 | ||
1146 | GLOBAL(ftrace_regs_call) | 1146 | GLOBAL(ftrace_regs_call) |
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index e21b0785a85b..1e96c3628bf2 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
@@ -88,7 +88,7 @@ END(function_hook) | |||
88 | MCOUNT_SAVE_FRAME \skip | 88 | MCOUNT_SAVE_FRAME \skip |
89 | 89 | ||
90 | /* Load the ftrace_ops into the 3rd parameter */ | 90 | /* Load the ftrace_ops into the 3rd parameter */ |
91 | leaq function_trace_op, %rdx | 91 | movq function_trace_op(%rip), %rdx |
92 | 92 | ||
93 | /* Load ip into the first parameter */ | 93 | /* Load ip into the first parameter */ |
94 | movq RIP(%rsp), %rdi | 94 | movq RIP(%rsp), %rdi |
diff --git a/arch/x86/kernel/hw_breakpoint.c b/arch/x86/kernel/hw_breakpoint.c index f66ff162dce8..a67b47c31314 100644 --- a/arch/x86/kernel/hw_breakpoint.c +++ b/arch/x86/kernel/hw_breakpoint.c | |||
@@ -38,7 +38,6 @@ | |||
38 | #include <linux/kernel.h> | 38 | #include <linux/kernel.h> |
39 | #include <linux/module.h> | 39 | #include <linux/module.h> |
40 | #include <linux/sched.h> | 40 | #include <linux/sched.h> |
41 | #include <linux/init.h> | ||
42 | #include <linux/smp.h> | 41 | #include <linux/smp.h> |
43 | 42 | ||
44 | #include <asm/hw_breakpoint.h> | 43 | #include <asm/hw_breakpoint.h> |
diff --git a/arch/x86/kernel/iosf_mbi.c b/arch/x86/kernel/iosf_mbi.c new file mode 100644 index 000000000000..c3aae6672843 --- /dev/null +++ b/arch/x86/kernel/iosf_mbi.c | |||
@@ -0,0 +1,226 @@ | |||
1 | /* | ||
2 | * IOSF-SB MailBox Interface Driver | ||
3 | * Copyright (c) 2013, Intel Corporation. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms and conditions of the GNU General Public License, | ||
7 | * version 2, as published by the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
12 | * more details. | ||
13 | * | ||
14 | * | ||
15 | * The IOSF-SB is a fabric bus available on Atom based SOC's that uses a | ||
16 | * mailbox interface (MBI) to communicate with mutiple devices. This | ||
17 | * driver implements access to this interface for those platforms that can | ||
18 | * enumerate the device using PCI. | ||
19 | */ | ||
20 | |||
21 | #include <linux/module.h> | ||
22 | #include <linux/init.h> | ||
23 | #include <linux/spinlock.h> | ||
24 | #include <linux/pci.h> | ||
25 | |||
26 | #include <asm/iosf_mbi.h> | ||
27 | |||
28 | static DEFINE_SPINLOCK(iosf_mbi_lock); | ||
29 | |||
30 | static inline u32 iosf_mbi_form_mcr(u8 op, u8 port, u8 offset) | ||
31 | { | ||
32 | return (op << 24) | (port << 16) | (offset << 8) | MBI_ENABLE; | ||
33 | } | ||
34 | |||
35 | static struct pci_dev *mbi_pdev; /* one mbi device */ | ||
36 | |||
37 | static int iosf_mbi_pci_read_mdr(u32 mcrx, u32 mcr, u32 *mdr) | ||
38 | { | ||
39 | int result; | ||
40 | |||
41 | if (!mbi_pdev) | ||
42 | return -ENODEV; | ||
43 | |||
44 | if (mcrx) { | ||
45 | result = pci_write_config_dword(mbi_pdev, MBI_MCRX_OFFSET, | ||
46 | mcrx); | ||
47 | if (result < 0) | ||
48 | goto fail_read; | ||
49 | } | ||
50 | |||
51 | result = pci_write_config_dword(mbi_pdev, MBI_MCR_OFFSET, mcr); | ||
52 | if (result < 0) | ||
53 | goto fail_read; | ||
54 | |||
55 | result = pci_read_config_dword(mbi_pdev, MBI_MDR_OFFSET, mdr); | ||
56 | if (result < 0) | ||
57 | goto fail_read; | ||
58 | |||
59 | return 0; | ||
60 | |||
61 | fail_read: | ||
62 | dev_err(&mbi_pdev->dev, "PCI config access failed with %d\n", result); | ||
63 | return result; | ||
64 | } | ||
65 | |||
66 | static int iosf_mbi_pci_write_mdr(u32 mcrx, u32 mcr, u32 mdr) | ||
67 | { | ||
68 | int result; | ||
69 | |||
70 | if (!mbi_pdev) | ||
71 | return -ENODEV; | ||
72 | |||
73 | result = pci_write_config_dword(mbi_pdev, MBI_MDR_OFFSET, mdr); | ||
74 | if (result < 0) | ||
75 | goto fail_write; | ||
76 | |||
77 | if (mcrx) { | ||
78 | result = pci_write_config_dword(mbi_pdev, MBI_MCRX_OFFSET, | ||
79 | mcrx); | ||
80 | if (result < 0) | ||
81 | goto fail_write; | ||
82 | } | ||
83 | |||
84 | result = pci_write_config_dword(mbi_pdev, MBI_MCR_OFFSET, mcr); | ||
85 | if (result < 0) | ||
86 | goto fail_write; | ||
87 | |||
88 | return 0; | ||
89 | |||
90 | fail_write: | ||
91 | dev_err(&mbi_pdev->dev, "PCI config access failed with %d\n", result); | ||
92 | return result; | ||
93 | } | ||
94 | |||
95 | int iosf_mbi_read(u8 port, u8 opcode, u32 offset, u32 *mdr) | ||
96 | { | ||
97 | u32 mcr, mcrx; | ||
98 | unsigned long flags; | ||
99 | int ret; | ||
100 | |||
101 | /*Access to the GFX unit is handled by GPU code */ | ||
102 | if (port == BT_MBI_UNIT_GFX) { | ||
103 | WARN_ON(1); | ||
104 | return -EPERM; | ||
105 | } | ||
106 | |||
107 | mcr = iosf_mbi_form_mcr(opcode, port, offset & MBI_MASK_LO); | ||
108 | mcrx = offset & MBI_MASK_HI; | ||
109 | |||
110 | spin_lock_irqsave(&iosf_mbi_lock, flags); | ||
111 | ret = iosf_mbi_pci_read_mdr(mcrx, mcr, mdr); | ||
112 | spin_unlock_irqrestore(&iosf_mbi_lock, flags); | ||
113 | |||
114 | return ret; | ||
115 | } | ||
116 | EXPORT_SYMBOL(iosf_mbi_read); | ||
117 | |||
118 | int iosf_mbi_write(u8 port, u8 opcode, u32 offset, u32 mdr) | ||
119 | { | ||
120 | u32 mcr, mcrx; | ||
121 | unsigned long flags; | ||
122 | int ret; | ||
123 | |||
124 | /*Access to the GFX unit is handled by GPU code */ | ||
125 | if (port == BT_MBI_UNIT_GFX) { | ||
126 | WARN_ON(1); | ||
127 | return -EPERM; | ||
128 | } | ||
129 | |||
130 | mcr = iosf_mbi_form_mcr(opcode, port, offset & MBI_MASK_LO); | ||
131 | mcrx = offset & MBI_MASK_HI; | ||
132 | |||
133 | spin_lock_irqsave(&iosf_mbi_lock, flags); | ||
134 | ret = iosf_mbi_pci_write_mdr(mcrx, mcr, mdr); | ||
135 | spin_unlock_irqrestore(&iosf_mbi_lock, flags); | ||
136 | |||
137 | return ret; | ||
138 | } | ||
139 | EXPORT_SYMBOL(iosf_mbi_write); | ||
140 | |||
141 | int iosf_mbi_modify(u8 port, u8 opcode, u32 offset, u32 mdr, u32 mask) | ||
142 | { | ||
143 | u32 mcr, mcrx; | ||
144 | u32 value; | ||
145 | unsigned long flags; | ||
146 | int ret; | ||
147 | |||
148 | /*Access to the GFX unit is handled by GPU code */ | ||
149 | if (port == BT_MBI_UNIT_GFX) { | ||
150 | WARN_ON(1); | ||
151 | return -EPERM; | ||
152 | } | ||
153 | |||
154 | mcr = iosf_mbi_form_mcr(opcode, port, offset & MBI_MASK_LO); | ||
155 | mcrx = offset & MBI_MASK_HI; | ||
156 | |||
157 | spin_lock_irqsave(&iosf_mbi_lock, flags); | ||
158 | |||
159 | /* Read current mdr value */ | ||
160 | ret = iosf_mbi_pci_read_mdr(mcrx, mcr & MBI_RD_MASK, &value); | ||
161 | if (ret < 0) { | ||
162 | spin_unlock_irqrestore(&iosf_mbi_lock, flags); | ||
163 | return ret; | ||
164 | } | ||
165 | |||
166 | /* Apply mask */ | ||
167 | value &= ~mask; | ||
168 | mdr &= mask; | ||
169 | value |= mdr; | ||
170 | |||
171 | /* Write back */ | ||
172 | ret = iosf_mbi_pci_write_mdr(mcrx, mcr | MBI_WR_MASK, value); | ||
173 | |||
174 | spin_unlock_irqrestore(&iosf_mbi_lock, flags); | ||
175 | |||
176 | return ret; | ||
177 | } | ||
178 | EXPORT_SYMBOL(iosf_mbi_modify); | ||
179 | |||
180 | static int iosf_mbi_probe(struct pci_dev *pdev, | ||
181 | const struct pci_device_id *unused) | ||
182 | { | ||
183 | int ret; | ||
184 | |||
185 | ret = pci_enable_device(pdev); | ||
186 | if (ret < 0) { | ||
187 | dev_err(&pdev->dev, "error: could not enable device\n"); | ||
188 | return ret; | ||
189 | } | ||
190 | |||
191 | mbi_pdev = pci_dev_get(pdev); | ||
192 | return 0; | ||
193 | } | ||
194 | |||
195 | static DEFINE_PCI_DEVICE_TABLE(iosf_mbi_pci_ids) = { | ||
196 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x0F00) }, | ||
197 | { 0, }, | ||
198 | }; | ||
199 | MODULE_DEVICE_TABLE(pci, iosf_mbi_pci_ids); | ||
200 | |||
201 | static struct pci_driver iosf_mbi_pci_driver = { | ||
202 | .name = "iosf_mbi_pci", | ||
203 | .probe = iosf_mbi_probe, | ||
204 | .id_table = iosf_mbi_pci_ids, | ||
205 | }; | ||
206 | |||
207 | static int __init iosf_mbi_init(void) | ||
208 | { | ||
209 | return pci_register_driver(&iosf_mbi_pci_driver); | ||
210 | } | ||
211 | |||
212 | static void __exit iosf_mbi_exit(void) | ||
213 | { | ||
214 | pci_unregister_driver(&iosf_mbi_pci_driver); | ||
215 | if (mbi_pdev) { | ||
216 | pci_dev_put(mbi_pdev); | ||
217 | mbi_pdev = NULL; | ||
218 | } | ||
219 | } | ||
220 | |||
221 | module_init(iosf_mbi_init); | ||
222 | module_exit(iosf_mbi_exit); | ||
223 | |||
224 | MODULE_AUTHOR("David E. Box <david.e.box@linux.intel.com>"); | ||
225 | MODULE_DESCRIPTION("IOSF Mailbox Interface accessor"); | ||
226 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index 22d0687e7fda..dbb60878b744 100644 --- a/arch/x86/kernel/irq.c +++ b/arch/x86/kernel/irq.c | |||
@@ -193,9 +193,13 @@ __visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs) | |||
193 | if (!handle_irq(irq, regs)) { | 193 | if (!handle_irq(irq, regs)) { |
194 | ack_APIC_irq(); | 194 | ack_APIC_irq(); |
195 | 195 | ||
196 | if (printk_ratelimit()) | 196 | if (irq != VECTOR_RETRIGGERED) { |
197 | pr_emerg("%s: %d.%d No irq handler for vector (irq %d)\n", | 197 | pr_emerg_ratelimited("%s: %d.%d No irq handler for vector (irq %d)\n", |
198 | __func__, smp_processor_id(), vector, irq); | 198 | __func__, smp_processor_id(), |
199 | vector, irq); | ||
200 | } else { | ||
201 | __this_cpu_write(vector_irq[vector], VECTOR_UNDEFINED); | ||
202 | } | ||
199 | } | 203 | } |
200 | 204 | ||
201 | irq_exit(); | 205 | irq_exit(); |
@@ -262,6 +266,76 @@ __visible void smp_trace_x86_platform_ipi(struct pt_regs *regs) | |||
262 | EXPORT_SYMBOL_GPL(vector_used_by_percpu_irq); | 266 | EXPORT_SYMBOL_GPL(vector_used_by_percpu_irq); |
263 | 267 | ||
264 | #ifdef CONFIG_HOTPLUG_CPU | 268 | #ifdef CONFIG_HOTPLUG_CPU |
269 | /* | ||
270 | * This cpu is going to be removed and its vectors migrated to the remaining | ||
271 | * online cpus. Check to see if there are enough vectors in the remaining cpus. | ||
272 | * This function is protected by stop_machine(). | ||
273 | */ | ||
274 | int check_irq_vectors_for_cpu_disable(void) | ||
275 | { | ||
276 | int irq, cpu; | ||
277 | unsigned int this_cpu, vector, this_count, count; | ||
278 | struct irq_desc *desc; | ||
279 | struct irq_data *data; | ||
280 | struct cpumask affinity_new, online_new; | ||
281 | |||
282 | this_cpu = smp_processor_id(); | ||
283 | cpumask_copy(&online_new, cpu_online_mask); | ||
284 | cpu_clear(this_cpu, online_new); | ||
285 | |||
286 | this_count = 0; | ||
287 | for (vector = FIRST_EXTERNAL_VECTOR; vector < NR_VECTORS; vector++) { | ||
288 | irq = __this_cpu_read(vector_irq[vector]); | ||
289 | if (irq >= 0) { | ||
290 | desc = irq_to_desc(irq); | ||
291 | data = irq_desc_get_irq_data(desc); | ||
292 | cpumask_copy(&affinity_new, data->affinity); | ||
293 | cpu_clear(this_cpu, affinity_new); | ||
294 | |||
295 | /* Do not count inactive or per-cpu irqs. */ | ||
296 | if (!irq_has_action(irq) || irqd_is_per_cpu(data)) | ||
297 | continue; | ||
298 | |||
299 | /* | ||
300 | * A single irq may be mapped to multiple | ||
301 | * cpu's vector_irq[] (for example IOAPIC cluster | ||
302 | * mode). In this case we have two | ||
303 | * possibilities: | ||
304 | * | ||
305 | * 1) the resulting affinity mask is empty; that is | ||
306 | * this the down'd cpu is the last cpu in the irq's | ||
307 | * affinity mask, or | ||
308 | * | ||
309 | * 2) the resulting affinity mask is no longer | ||
310 | * a subset of the online cpus but the affinity | ||
311 | * mask is not zero; that is the down'd cpu is the | ||
312 | * last online cpu in a user set affinity mask. | ||
313 | */ | ||
314 | if (cpumask_empty(&affinity_new) || | ||
315 | !cpumask_subset(&affinity_new, &online_new)) | ||
316 | this_count++; | ||
317 | } | ||
318 | } | ||
319 | |||
320 | count = 0; | ||
321 | for_each_online_cpu(cpu) { | ||
322 | if (cpu == this_cpu) | ||
323 | continue; | ||
324 | for (vector = FIRST_EXTERNAL_VECTOR; vector < NR_VECTORS; | ||
325 | vector++) { | ||
326 | if (per_cpu(vector_irq, cpu)[vector] < 0) | ||
327 | count++; | ||
328 | } | ||
329 | } | ||
330 | |||
331 | if (count < this_count) { | ||
332 | pr_warn("CPU %d disable failed: CPU has %u vectors assigned and there are only %u available.\n", | ||
333 | this_cpu, this_count, count); | ||
334 | return -ERANGE; | ||
335 | } | ||
336 | return 0; | ||
337 | } | ||
338 | |||
265 | /* A cpu has been removed from cpu_online_mask. Reset irq affinities. */ | 339 | /* A cpu has been removed from cpu_online_mask. Reset irq affinities. */ |
266 | void fixup_irqs(void) | 340 | void fixup_irqs(void) |
267 | { | 341 | { |
@@ -344,7 +418,7 @@ void fixup_irqs(void) | |||
344 | for (vector = FIRST_EXTERNAL_VECTOR; vector < NR_VECTORS; vector++) { | 418 | for (vector = FIRST_EXTERNAL_VECTOR; vector < NR_VECTORS; vector++) { |
345 | unsigned int irr; | 419 | unsigned int irr; |
346 | 420 | ||
347 | if (__this_cpu_read(vector_irq[vector]) < 0) | 421 | if (__this_cpu_read(vector_irq[vector]) <= VECTOR_UNDEFINED) |
348 | continue; | 422 | continue; |
349 | 423 | ||
350 | irr = apic_read(APIC_IRR + (vector / 32 * 0x10)); | 424 | irr = apic_read(APIC_IRR + (vector / 32 * 0x10)); |
@@ -355,11 +429,14 @@ void fixup_irqs(void) | |||
355 | data = irq_desc_get_irq_data(desc); | 429 | data = irq_desc_get_irq_data(desc); |
356 | chip = irq_data_get_irq_chip(data); | 430 | chip = irq_data_get_irq_chip(data); |
357 | raw_spin_lock(&desc->lock); | 431 | raw_spin_lock(&desc->lock); |
358 | if (chip->irq_retrigger) | 432 | if (chip->irq_retrigger) { |
359 | chip->irq_retrigger(data); | 433 | chip->irq_retrigger(data); |
434 | __this_cpu_write(vector_irq[vector], VECTOR_RETRIGGERED); | ||
435 | } | ||
360 | raw_spin_unlock(&desc->lock); | 436 | raw_spin_unlock(&desc->lock); |
361 | } | 437 | } |
362 | __this_cpu_write(vector_irq[vector], -1); | 438 | if (__this_cpu_read(vector_irq[vector]) != VECTOR_RETRIGGERED) |
439 | __this_cpu_write(vector_irq[vector], VECTOR_UNDEFINED); | ||
363 | } | 440 | } |
364 | } | 441 | } |
365 | #endif | 442 | #endif |
diff --git a/arch/x86/kernel/irqinit.c b/arch/x86/kernel/irqinit.c index a2a1fbc594ff..7f50156542fb 100644 --- a/arch/x86/kernel/irqinit.c +++ b/arch/x86/kernel/irqinit.c | |||
@@ -52,7 +52,7 @@ static struct irqaction irq2 = { | |||
52 | }; | 52 | }; |
53 | 53 | ||
54 | DEFINE_PER_CPU(vector_irq_t, vector_irq) = { | 54 | DEFINE_PER_CPU(vector_irq_t, vector_irq) = { |
55 | [0 ... NR_VECTORS - 1] = -1, | 55 | [0 ... NR_VECTORS - 1] = VECTOR_UNDEFINED, |
56 | }; | 56 | }; |
57 | 57 | ||
58 | int vector_used_by_percpu_irq(unsigned int vector) | 58 | int vector_used_by_percpu_irq(unsigned int vector) |
@@ -60,7 +60,7 @@ int vector_used_by_percpu_irq(unsigned int vector) | |||
60 | int cpu; | 60 | int cpu; |
61 | 61 | ||
62 | for_each_online_cpu(cpu) { | 62 | for_each_online_cpu(cpu) { |
63 | if (per_cpu(vector_irq, cpu)[vector] != -1) | 63 | if (per_cpu(vector_irq, cpu)[vector] > VECTOR_UNDEFINED) |
64 | return 1; | 64 | return 1; |
65 | } | 65 | } |
66 | 66 | ||
diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c index 836f8322960e..7ec1d5f8d283 100644 --- a/arch/x86/kernel/kgdb.c +++ b/arch/x86/kernel/kgdb.c | |||
@@ -39,7 +39,6 @@ | |||
39 | #include <linux/sched.h> | 39 | #include <linux/sched.h> |
40 | #include <linux/delay.h> | 40 | #include <linux/delay.h> |
41 | #include <linux/kgdb.h> | 41 | #include <linux/kgdb.h> |
42 | #include <linux/init.h> | ||
43 | #include <linux/smp.h> | 42 | #include <linux/smp.h> |
44 | #include <linux/nmi.h> | 43 | #include <linux/nmi.h> |
45 | #include <linux/hw_breakpoint.h> | 44 | #include <linux/hw_breakpoint.h> |
diff --git a/arch/x86/kernel/ksysfs.c b/arch/x86/kernel/ksysfs.c new file mode 100644 index 000000000000..c2bedaea11f7 --- /dev/null +++ b/arch/x86/kernel/ksysfs.c | |||
@@ -0,0 +1,340 @@ | |||
1 | /* | ||
2 | * Architecture specific sysfs attributes in /sys/kernel | ||
3 | * | ||
4 | * Copyright (C) 2007, Intel Corp. | ||
5 | * Huang Ying <ying.huang@intel.com> | ||
6 | * Copyright (C) 2013, 2013 Red Hat, Inc. | ||
7 | * Dave Young <dyoung@redhat.com> | ||
8 | * | ||
9 | * This file is released under the GPLv2 | ||
10 | */ | ||
11 | |||
12 | #include <linux/kobject.h> | ||
13 | #include <linux/string.h> | ||
14 | #include <linux/sysfs.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/stat.h> | ||
17 | #include <linux/slab.h> | ||
18 | #include <linux/mm.h> | ||
19 | |||
20 | #include <asm/io.h> | ||
21 | #include <asm/setup.h> | ||
22 | |||
23 | static ssize_t version_show(struct kobject *kobj, | ||
24 | struct kobj_attribute *attr, char *buf) | ||
25 | { | ||
26 | return sprintf(buf, "0x%04x\n", boot_params.hdr.version); | ||
27 | } | ||
28 | |||
29 | static struct kobj_attribute boot_params_version_attr = __ATTR_RO(version); | ||
30 | |||
31 | static ssize_t boot_params_data_read(struct file *fp, struct kobject *kobj, | ||
32 | struct bin_attribute *bin_attr, | ||
33 | char *buf, loff_t off, size_t count) | ||
34 | { | ||
35 | memcpy(buf, (void *)&boot_params + off, count); | ||
36 | return count; | ||
37 | } | ||
38 | |||
39 | static struct bin_attribute boot_params_data_attr = { | ||
40 | .attr = { | ||
41 | .name = "data", | ||
42 | .mode = S_IRUGO, | ||
43 | }, | ||
44 | .read = boot_params_data_read, | ||
45 | .size = sizeof(boot_params), | ||
46 | }; | ||
47 | |||
48 | static struct attribute *boot_params_version_attrs[] = { | ||
49 | &boot_params_version_attr.attr, | ||
50 | NULL, | ||
51 | }; | ||
52 | |||
53 | static struct bin_attribute *boot_params_data_attrs[] = { | ||
54 | &boot_params_data_attr, | ||
55 | NULL, | ||
56 | }; | ||
57 | |||
58 | static struct attribute_group boot_params_attr_group = { | ||
59 | .attrs = boot_params_version_attrs, | ||
60 | .bin_attrs = boot_params_data_attrs, | ||
61 | }; | ||
62 | |||
63 | static int kobj_to_setup_data_nr(struct kobject *kobj, int *nr) | ||
64 | { | ||
65 | const char *name; | ||
66 | |||
67 | name = kobject_name(kobj); | ||
68 | return kstrtoint(name, 10, nr); | ||
69 | } | ||
70 | |||
71 | static int get_setup_data_paddr(int nr, u64 *paddr) | ||
72 | { | ||
73 | int i = 0; | ||
74 | struct setup_data *data; | ||
75 | u64 pa_data = boot_params.hdr.setup_data; | ||
76 | |||
77 | while (pa_data) { | ||
78 | if (nr == i) { | ||
79 | *paddr = pa_data; | ||
80 | return 0; | ||
81 | } | ||
82 | data = ioremap_cache(pa_data, sizeof(*data)); | ||
83 | if (!data) | ||
84 | return -ENOMEM; | ||
85 | |||
86 | pa_data = data->next; | ||
87 | iounmap(data); | ||
88 | i++; | ||
89 | } | ||
90 | return -EINVAL; | ||
91 | } | ||
92 | |||
93 | static int __init get_setup_data_size(int nr, size_t *size) | ||
94 | { | ||
95 | int i = 0; | ||
96 | struct setup_data *data; | ||
97 | u64 pa_data = boot_params.hdr.setup_data; | ||
98 | |||
99 | while (pa_data) { | ||
100 | data = ioremap_cache(pa_data, sizeof(*data)); | ||
101 | if (!data) | ||
102 | return -ENOMEM; | ||
103 | if (nr == i) { | ||
104 | *size = data->len; | ||
105 | iounmap(data); | ||
106 | return 0; | ||
107 | } | ||
108 | |||
109 | pa_data = data->next; | ||
110 | iounmap(data); | ||
111 | i++; | ||
112 | } | ||
113 | return -EINVAL; | ||
114 | } | ||
115 | |||
116 | static ssize_t type_show(struct kobject *kobj, | ||
117 | struct kobj_attribute *attr, char *buf) | ||
118 | { | ||
119 | int nr, ret; | ||
120 | u64 paddr; | ||
121 | struct setup_data *data; | ||
122 | |||
123 | ret = kobj_to_setup_data_nr(kobj, &nr); | ||
124 | if (ret) | ||
125 | return ret; | ||
126 | |||
127 | ret = get_setup_data_paddr(nr, &paddr); | ||
128 | if (ret) | ||
129 | return ret; | ||
130 | data = ioremap_cache(paddr, sizeof(*data)); | ||
131 | if (!data) | ||
132 | return -ENOMEM; | ||
133 | |||
134 | ret = sprintf(buf, "0x%x\n", data->type); | ||
135 | iounmap(data); | ||
136 | return ret; | ||
137 | } | ||
138 | |||
139 | static ssize_t setup_data_data_read(struct file *fp, | ||
140 | struct kobject *kobj, | ||
141 | struct bin_attribute *bin_attr, | ||
142 | char *buf, | ||
143 | loff_t off, size_t count) | ||
144 | { | ||
145 | int nr, ret = 0; | ||
146 | u64 paddr; | ||
147 | struct setup_data *data; | ||
148 | void *p; | ||
149 | |||
150 | ret = kobj_to_setup_data_nr(kobj, &nr); | ||
151 | if (ret) | ||
152 | return ret; | ||
153 | |||
154 | ret = get_setup_data_paddr(nr, &paddr); | ||
155 | if (ret) | ||
156 | return ret; | ||
157 | data = ioremap_cache(paddr, sizeof(*data)); | ||
158 | if (!data) | ||
159 | return -ENOMEM; | ||
160 | |||
161 | if (off > data->len) { | ||
162 | ret = -EINVAL; | ||
163 | goto out; | ||
164 | } | ||
165 | |||
166 | if (count > data->len - off) | ||
167 | count = data->len - off; | ||
168 | |||
169 | if (!count) | ||
170 | goto out; | ||
171 | |||
172 | ret = count; | ||
173 | p = ioremap_cache(paddr + sizeof(*data), data->len); | ||
174 | if (!p) { | ||
175 | ret = -ENOMEM; | ||
176 | goto out; | ||
177 | } | ||
178 | memcpy(buf, p + off, count); | ||
179 | iounmap(p); | ||
180 | out: | ||
181 | iounmap(data); | ||
182 | return ret; | ||
183 | } | ||
184 | |||
185 | static struct kobj_attribute type_attr = __ATTR_RO(type); | ||
186 | |||
187 | static struct bin_attribute data_attr = { | ||
188 | .attr = { | ||
189 | .name = "data", | ||
190 | .mode = S_IRUGO, | ||
191 | }, | ||
192 | .read = setup_data_data_read, | ||
193 | }; | ||
194 | |||
195 | static struct attribute *setup_data_type_attrs[] = { | ||
196 | &type_attr.attr, | ||
197 | NULL, | ||
198 | }; | ||
199 | |||
200 | static struct bin_attribute *setup_data_data_attrs[] = { | ||
201 | &data_attr, | ||
202 | NULL, | ||
203 | }; | ||
204 | |||
205 | static struct attribute_group setup_data_attr_group = { | ||
206 | .attrs = setup_data_type_attrs, | ||
207 | .bin_attrs = setup_data_data_attrs, | ||
208 | }; | ||
209 | |||
210 | static int __init create_setup_data_node(struct kobject *parent, | ||
211 | struct kobject **kobjp, int nr) | ||
212 | { | ||
213 | int ret = 0; | ||
214 | size_t size; | ||
215 | struct kobject *kobj; | ||
216 | char name[16]; /* should be enough for setup_data nodes numbers */ | ||
217 | snprintf(name, 16, "%d", nr); | ||
218 | |||
219 | kobj = kobject_create_and_add(name, parent); | ||
220 | if (!kobj) | ||
221 | return -ENOMEM; | ||
222 | |||
223 | ret = get_setup_data_size(nr, &size); | ||
224 | if (ret) | ||
225 | goto out_kobj; | ||
226 | |||
227 | data_attr.size = size; | ||
228 | ret = sysfs_create_group(kobj, &setup_data_attr_group); | ||
229 | if (ret) | ||
230 | goto out_kobj; | ||
231 | *kobjp = kobj; | ||
232 | |||
233 | return 0; | ||
234 | out_kobj: | ||
235 | kobject_put(kobj); | ||
236 | return ret; | ||
237 | } | ||
238 | |||
239 | static void __init cleanup_setup_data_node(struct kobject *kobj) | ||
240 | { | ||
241 | sysfs_remove_group(kobj, &setup_data_attr_group); | ||
242 | kobject_put(kobj); | ||
243 | } | ||
244 | |||
245 | static int __init get_setup_data_total_num(u64 pa_data, int *nr) | ||
246 | { | ||
247 | int ret = 0; | ||
248 | struct setup_data *data; | ||
249 | |||
250 | *nr = 0; | ||
251 | while (pa_data) { | ||
252 | *nr += 1; | ||
253 | data = ioremap_cache(pa_data, sizeof(*data)); | ||
254 | if (!data) { | ||
255 | ret = -ENOMEM; | ||
256 | goto out; | ||
257 | } | ||
258 | pa_data = data->next; | ||
259 | iounmap(data); | ||
260 | } | ||
261 | |||
262 | out: | ||
263 | return ret; | ||
264 | } | ||
265 | |||
266 | static int __init create_setup_data_nodes(struct kobject *parent) | ||
267 | { | ||
268 | struct kobject *setup_data_kobj, **kobjp; | ||
269 | u64 pa_data; | ||
270 | int i, j, nr, ret = 0; | ||
271 | |||
272 | pa_data = boot_params.hdr.setup_data; | ||
273 | if (!pa_data) | ||
274 | return 0; | ||
275 | |||
276 | setup_data_kobj = kobject_create_and_add("setup_data", parent); | ||
277 | if (!setup_data_kobj) { | ||
278 | ret = -ENOMEM; | ||
279 | goto out; | ||
280 | } | ||
281 | |||
282 | ret = get_setup_data_total_num(pa_data, &nr); | ||
283 | if (ret) | ||
284 | goto out_setup_data_kobj; | ||
285 | |||
286 | kobjp = kmalloc(sizeof(*kobjp) * nr, GFP_KERNEL); | ||
287 | if (!kobjp) { | ||
288 | ret = -ENOMEM; | ||
289 | goto out_setup_data_kobj; | ||
290 | } | ||
291 | |||
292 | for (i = 0; i < nr; i++) { | ||
293 | ret = create_setup_data_node(setup_data_kobj, kobjp + i, i); | ||
294 | if (ret) | ||
295 | goto out_clean_nodes; | ||
296 | } | ||
297 | |||
298 | kfree(kobjp); | ||
299 | return 0; | ||
300 | |||
301 | out_clean_nodes: | ||
302 | for (j = i - 1; j > 0; j--) | ||
303 | cleanup_setup_data_node(*(kobjp + j)); | ||
304 | kfree(kobjp); | ||
305 | out_setup_data_kobj: | ||
306 | kobject_put(setup_data_kobj); | ||
307 | out: | ||
308 | return ret; | ||
309 | } | ||
310 | |||
311 | static int __init boot_params_ksysfs_init(void) | ||
312 | { | ||
313 | int ret; | ||
314 | struct kobject *boot_params_kobj; | ||
315 | |||
316 | boot_params_kobj = kobject_create_and_add("boot_params", | ||
317 | kernel_kobj); | ||
318 | if (!boot_params_kobj) { | ||
319 | ret = -ENOMEM; | ||
320 | goto out; | ||
321 | } | ||
322 | |||
323 | ret = sysfs_create_group(boot_params_kobj, &boot_params_attr_group); | ||
324 | if (ret) | ||
325 | goto out_boot_params_kobj; | ||
326 | |||
327 | ret = create_setup_data_nodes(boot_params_kobj); | ||
328 | if (ret) | ||
329 | goto out_create_group; | ||
330 | |||
331 | return 0; | ||
332 | out_create_group: | ||
333 | sysfs_remove_group(boot_params_kobj, &boot_params_attr_group); | ||
334 | out_boot_params_kobj: | ||
335 | kobject_put(boot_params_kobj); | ||
336 | out: | ||
337 | return ret; | ||
338 | } | ||
339 | |||
340 | arch_initcall(boot_params_ksysfs_init); | ||
diff --git a/arch/x86/kernel/machine_kexec_32.c b/arch/x86/kernel/machine_kexec_32.c index 5b19e4d78b00..1667b1de8d5d 100644 --- a/arch/x86/kernel/machine_kexec_32.c +++ b/arch/x86/kernel/machine_kexec_32.c | |||
@@ -9,7 +9,6 @@ | |||
9 | #include <linux/mm.h> | 9 | #include <linux/mm.h> |
10 | #include <linux/kexec.h> | 10 | #include <linux/kexec.h> |
11 | #include <linux/delay.h> | 11 | #include <linux/delay.h> |
12 | #include <linux/init.h> | ||
13 | #include <linux/numa.h> | 12 | #include <linux/numa.h> |
14 | #include <linux/ftrace.h> | 13 | #include <linux/ftrace.h> |
15 | #include <linux/suspend.h> | 14 | #include <linux/suspend.h> |
diff --git a/arch/x86/kernel/pci-nommu.c b/arch/x86/kernel/pci-nommu.c index 871be4a84c7d..da15918d1c81 100644 --- a/arch/x86/kernel/pci-nommu.c +++ b/arch/x86/kernel/pci-nommu.c | |||
@@ -3,7 +3,6 @@ | |||
3 | #include <linux/dma-mapping.h> | 3 | #include <linux/dma-mapping.h> |
4 | #include <linux/scatterlist.h> | 4 | #include <linux/scatterlist.h> |
5 | #include <linux/string.h> | 5 | #include <linux/string.h> |
6 | #include <linux/init.h> | ||
7 | #include <linux/gfp.h> | 6 | #include <linux/gfp.h> |
8 | #include <linux/pci.h> | 7 | #include <linux/pci.h> |
9 | #include <linux/mm.h> | 8 | #include <linux/mm.h> |
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index 6f1236c29c4b..0de43e98ce08 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c | |||
@@ -24,7 +24,6 @@ | |||
24 | #include <linux/interrupt.h> | 24 | #include <linux/interrupt.h> |
25 | #include <linux/delay.h> | 25 | #include <linux/delay.h> |
26 | #include <linux/reboot.h> | 26 | #include <linux/reboot.h> |
27 | #include <linux/init.h> | ||
28 | #include <linux/mc146818rtc.h> | 27 | #include <linux/mc146818rtc.h> |
29 | #include <linux/module.h> | 28 | #include <linux/module.h> |
30 | #include <linux/kallsyms.h> | 29 | #include <linux/kallsyms.h> |
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index da3c599584a3..c752cb43e52f 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c | |||
@@ -558,6 +558,17 @@ void native_machine_shutdown(void) | |||
558 | { | 558 | { |
559 | /* Stop the cpus and apics */ | 559 | /* Stop the cpus and apics */ |
560 | #ifdef CONFIG_X86_IO_APIC | 560 | #ifdef CONFIG_X86_IO_APIC |
561 | /* | ||
562 | * Disabling IO APIC before local APIC is a workaround for | ||
563 | * erratum AVR31 in "Intel Atom Processor C2000 Product Family | ||
564 | * Specification Update". In this situation, interrupts that target | ||
565 | * a Logical Processor whose Local APIC is either in the process of | ||
566 | * being hardware disabled or software disabled are neither delivered | ||
567 | * nor discarded. When this erratum occurs, the processor may hang. | ||
568 | * | ||
569 | * Even without the erratum, it still makes sense to quiet IO APIC | ||
570 | * before disabling Local APIC. | ||
571 | */ | ||
561 | disable_IO_APIC(); | 572 | disable_IO_APIC(); |
562 | #endif | 573 | #endif |
563 | 574 | ||
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index cb233bc9dee3..c9675594d7ca 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
@@ -295,6 +295,8 @@ static void __init reserve_brk(void) | |||
295 | _brk_start = 0; | 295 | _brk_start = 0; |
296 | } | 296 | } |
297 | 297 | ||
298 | u64 relocated_ramdisk; | ||
299 | |||
298 | #ifdef CONFIG_BLK_DEV_INITRD | 300 | #ifdef CONFIG_BLK_DEV_INITRD |
299 | 301 | ||
300 | static u64 __init get_ramdisk_image(void) | 302 | static u64 __init get_ramdisk_image(void) |
@@ -321,25 +323,24 @@ static void __init relocate_initrd(void) | |||
321 | u64 ramdisk_image = get_ramdisk_image(); | 323 | u64 ramdisk_image = get_ramdisk_image(); |
322 | u64 ramdisk_size = get_ramdisk_size(); | 324 | u64 ramdisk_size = get_ramdisk_size(); |
323 | u64 area_size = PAGE_ALIGN(ramdisk_size); | 325 | u64 area_size = PAGE_ALIGN(ramdisk_size); |
324 | u64 ramdisk_here; | ||
325 | unsigned long slop, clen, mapaddr; | 326 | unsigned long slop, clen, mapaddr; |
326 | char *p, *q; | 327 | char *p, *q; |
327 | 328 | ||
328 | /* We need to move the initrd down into directly mapped mem */ | 329 | /* We need to move the initrd down into directly mapped mem */ |
329 | ramdisk_here = memblock_find_in_range(0, PFN_PHYS(max_pfn_mapped), | 330 | relocated_ramdisk = memblock_find_in_range(0, PFN_PHYS(max_pfn_mapped), |
330 | area_size, PAGE_SIZE); | 331 | area_size, PAGE_SIZE); |
331 | 332 | ||
332 | if (!ramdisk_here) | 333 | if (!relocated_ramdisk) |
333 | panic("Cannot find place for new RAMDISK of size %lld\n", | 334 | panic("Cannot find place for new RAMDISK of size %lld\n", |
334 | ramdisk_size); | 335 | ramdisk_size); |
335 | 336 | ||
336 | /* Note: this includes all the mem currently occupied by | 337 | /* Note: this includes all the mem currently occupied by |
337 | the initrd, we rely on that fact to keep the data intact. */ | 338 | the initrd, we rely on that fact to keep the data intact. */ |
338 | memblock_reserve(ramdisk_here, area_size); | 339 | memblock_reserve(relocated_ramdisk, area_size); |
339 | initrd_start = ramdisk_here + PAGE_OFFSET; | 340 | initrd_start = relocated_ramdisk + PAGE_OFFSET; |
340 | initrd_end = initrd_start + ramdisk_size; | 341 | initrd_end = initrd_start + ramdisk_size; |
341 | printk(KERN_INFO "Allocated new RAMDISK: [mem %#010llx-%#010llx]\n", | 342 | printk(KERN_INFO "Allocated new RAMDISK: [mem %#010llx-%#010llx]\n", |
342 | ramdisk_here, ramdisk_here + ramdisk_size - 1); | 343 | relocated_ramdisk, relocated_ramdisk + ramdisk_size - 1); |
343 | 344 | ||
344 | q = (char *)initrd_start; | 345 | q = (char *)initrd_start; |
345 | 346 | ||
@@ -363,7 +364,7 @@ static void __init relocate_initrd(void) | |||
363 | printk(KERN_INFO "Move RAMDISK from [mem %#010llx-%#010llx] to" | 364 | printk(KERN_INFO "Move RAMDISK from [mem %#010llx-%#010llx] to" |
364 | " [mem %#010llx-%#010llx]\n", | 365 | " [mem %#010llx-%#010llx]\n", |
365 | ramdisk_image, ramdisk_image + ramdisk_size - 1, | 366 | ramdisk_image, ramdisk_image + ramdisk_size - 1, |
366 | ramdisk_here, ramdisk_here + ramdisk_size - 1); | 367 | relocated_ramdisk, relocated_ramdisk + ramdisk_size - 1); |
367 | } | 368 | } |
368 | 369 | ||
369 | static void __init early_reserve_initrd(void) | 370 | static void __init early_reserve_initrd(void) |
@@ -447,6 +448,9 @@ static void __init parse_setup_data(void) | |||
447 | case SETUP_DTB: | 448 | case SETUP_DTB: |
448 | add_dtb(pa_data); | 449 | add_dtb(pa_data); |
449 | break; | 450 | break; |
451 | case SETUP_EFI: | ||
452 | parse_efi_setup(pa_data, data_len); | ||
453 | break; | ||
450 | default: | 454 | default: |
451 | break; | 455 | break; |
452 | } | 456 | } |
@@ -824,6 +828,20 @@ static void __init trim_low_memory_range(void) | |||
824 | } | 828 | } |
825 | 829 | ||
826 | /* | 830 | /* |
831 | * Dump out kernel offset information on panic. | ||
832 | */ | ||
833 | static int | ||
834 | dump_kernel_offset(struct notifier_block *self, unsigned long v, void *p) | ||
835 | { | ||
836 | pr_emerg("Kernel Offset: 0x%lx from 0x%lx " | ||
837 | "(relocation range: 0x%lx-0x%lx)\n", | ||
838 | (unsigned long)&_text - __START_KERNEL, __START_KERNEL, | ||
839 | __START_KERNEL_map, MODULES_VADDR-1); | ||
840 | |||
841 | return 0; | ||
842 | } | ||
843 | |||
844 | /* | ||
827 | * Determine if we were loaded by an EFI loader. If so, then we have also been | 845 | * Determine if we were loaded by an EFI loader. If so, then we have also been |
828 | * passed the efi memmap, systab, etc., so we should use these data structures | 846 | * passed the efi memmap, systab, etc., so we should use these data structures |
829 | * for initialization. Note, the efi init code path is determined by the | 847 | * for initialization. Note, the efi init code path is determined by the |
@@ -924,8 +942,6 @@ void __init setup_arch(char **cmdline_p) | |||
924 | iomem_resource.end = (1ULL << boot_cpu_data.x86_phys_bits) - 1; | 942 | iomem_resource.end = (1ULL << boot_cpu_data.x86_phys_bits) - 1; |
925 | setup_memory_map(); | 943 | setup_memory_map(); |
926 | parse_setup_data(); | 944 | parse_setup_data(); |
927 | /* update the e820_saved too */ | ||
928 | e820_reserve_setup_data(); | ||
929 | 945 | ||
930 | copy_edd(); | 946 | copy_edd(); |
931 | 947 | ||
@@ -987,6 +1003,8 @@ void __init setup_arch(char **cmdline_p) | |||
987 | early_dump_pci_devices(); | 1003 | early_dump_pci_devices(); |
988 | #endif | 1004 | #endif |
989 | 1005 | ||
1006 | /* update the e820_saved too */ | ||
1007 | e820_reserve_setup_data(); | ||
990 | finish_e820_parsing(); | 1008 | finish_e820_parsing(); |
991 | 1009 | ||
992 | if (efi_enabled(EFI_BOOT)) | 1010 | if (efi_enabled(EFI_BOOT)) |
@@ -1101,7 +1119,7 @@ void __init setup_arch(char **cmdline_p) | |||
1101 | 1119 | ||
1102 | setup_real_mode(); | 1120 | setup_real_mode(); |
1103 | 1121 | ||
1104 | memblock_set_current_limit(get_max_mapped()); | 1122 | memblock_set_current_limit(get_max_low_mapped()); |
1105 | dma_contiguous_reserve(0); | 1123 | dma_contiguous_reserve(0); |
1106 | 1124 | ||
1107 | /* | 1125 | /* |
@@ -1248,3 +1266,15 @@ void __init i386_reserve_resources(void) | |||
1248 | } | 1266 | } |
1249 | 1267 | ||
1250 | #endif /* CONFIG_X86_32 */ | 1268 | #endif /* CONFIG_X86_32 */ |
1269 | |||
1270 | static struct notifier_block kernel_offset_notifier = { | ||
1271 | .notifier_call = dump_kernel_offset | ||
1272 | }; | ||
1273 | |||
1274 | static int __init register_kernel_offset_dumper(void) | ||
1275 | { | ||
1276 | atomic_notifier_chain_register(&panic_notifier_list, | ||
1277 | &kernel_offset_notifier); | ||
1278 | return 0; | ||
1279 | } | ||
1280 | __initcall(register_kernel_offset_dumper); | ||
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 85dc05a3aa02..a32da804252e 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
@@ -1312,6 +1312,12 @@ void cpu_disable_common(void) | |||
1312 | 1312 | ||
1313 | int native_cpu_disable(void) | 1313 | int native_cpu_disable(void) |
1314 | { | 1314 | { |
1315 | int ret; | ||
1316 | |||
1317 | ret = check_irq_vectors_for_cpu_disable(); | ||
1318 | if (ret) | ||
1319 | return ret; | ||
1320 | |||
1315 | clear_local_APIC(); | 1321 | clear_local_APIC(); |
1316 | 1322 | ||
1317 | cpu_disable_common(); | 1323 | cpu_disable_common(); |
@@ -1417,7 +1423,9 @@ static inline void mwait_play_dead(void) | |||
1417 | * The WBINVD is insufficient due to the spurious-wakeup | 1423 | * The WBINVD is insufficient due to the spurious-wakeup |
1418 | * case where we return around the loop. | 1424 | * case where we return around the loop. |
1419 | */ | 1425 | */ |
1426 | mb(); | ||
1420 | clflush(mwait_ptr); | 1427 | clflush(mwait_ptr); |
1428 | mb(); | ||
1421 | __monitor(mwait_ptr, 0, 0); | 1429 | __monitor(mwait_ptr, 0, 0); |
1422 | mb(); | 1430 | mb(); |
1423 | __mwait(eax, 0); | 1431 | __mwait(eax, 0); |
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index b857ed890b4c..57409f6b8c62 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c | |||
@@ -211,21 +211,17 @@ dotraplinkage void do_##name(struct pt_regs *regs, long error_code) \ | |||
211 | exception_exit(prev_state); \ | 211 | exception_exit(prev_state); \ |
212 | } | 212 | } |
213 | 213 | ||
214 | DO_ERROR_INFO(X86_TRAP_DE, SIGFPE, "divide error", divide_error, FPE_INTDIV, | 214 | DO_ERROR_INFO(X86_TRAP_DE, SIGFPE, "divide error", divide_error, FPE_INTDIV, regs->ip ) |
215 | regs->ip) | 215 | DO_ERROR (X86_TRAP_OF, SIGSEGV, "overflow", overflow ) |
216 | DO_ERROR(X86_TRAP_OF, SIGSEGV, "overflow", overflow) | 216 | DO_ERROR (X86_TRAP_BR, SIGSEGV, "bounds", bounds ) |
217 | DO_ERROR(X86_TRAP_BR, SIGSEGV, "bounds", bounds) | 217 | DO_ERROR_INFO(X86_TRAP_UD, SIGILL, "invalid opcode", invalid_op, ILL_ILLOPN, regs->ip ) |
218 | DO_ERROR_INFO(X86_TRAP_UD, SIGILL, "invalid opcode", invalid_op, ILL_ILLOPN, | 218 | DO_ERROR (X86_TRAP_OLD_MF, SIGFPE, "coprocessor segment overrun", coprocessor_segment_overrun ) |
219 | regs->ip) | 219 | DO_ERROR (X86_TRAP_TS, SIGSEGV, "invalid TSS", invalid_TSS ) |
220 | DO_ERROR(X86_TRAP_OLD_MF, SIGFPE, "coprocessor segment overrun", | 220 | DO_ERROR (X86_TRAP_NP, SIGBUS, "segment not present", segment_not_present ) |
221 | coprocessor_segment_overrun) | ||
222 | DO_ERROR(X86_TRAP_TS, SIGSEGV, "invalid TSS", invalid_TSS) | ||
223 | DO_ERROR(X86_TRAP_NP, SIGBUS, "segment not present", segment_not_present) | ||
224 | #ifdef CONFIG_X86_32 | 221 | #ifdef CONFIG_X86_32 |
225 | DO_ERROR(X86_TRAP_SS, SIGBUS, "stack segment", stack_segment) | 222 | DO_ERROR (X86_TRAP_SS, SIGBUS, "stack segment", stack_segment ) |
226 | #endif | 223 | #endif |
227 | DO_ERROR_INFO(X86_TRAP_AC, SIGBUS, "alignment check", alignment_check, | 224 | DO_ERROR_INFO(X86_TRAP_AC, SIGBUS, "alignment check", alignment_check, BUS_ADRALN, 0 ) |
228 | BUS_ADRALN, 0) | ||
229 | 225 | ||
230 | #ifdef CONFIG_X86_64 | 226 | #ifdef CONFIG_X86_64 |
231 | /* Runs on IST stack */ | 227 | /* Runs on IST stack */ |
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 930e5d48f560..a3acbac2ee72 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/clocksource.h> | 11 | #include <linux/clocksource.h> |
12 | #include <linux/percpu.h> | 12 | #include <linux/percpu.h> |
13 | #include <linux/timex.h> | 13 | #include <linux/timex.h> |
14 | #include <linux/static_key.h> | ||
14 | 15 | ||
15 | #include <asm/hpet.h> | 16 | #include <asm/hpet.h> |
16 | #include <asm/timer.h> | 17 | #include <asm/timer.h> |
@@ -37,13 +38,244 @@ static int __read_mostly tsc_unstable; | |||
37 | erroneous rdtsc usage on !cpu_has_tsc processors */ | 38 | erroneous rdtsc usage on !cpu_has_tsc processors */ |
38 | static int __read_mostly tsc_disabled = -1; | 39 | static int __read_mostly tsc_disabled = -1; |
39 | 40 | ||
41 | static struct static_key __use_tsc = STATIC_KEY_INIT; | ||
42 | |||
40 | int tsc_clocksource_reliable; | 43 | int tsc_clocksource_reliable; |
44 | |||
45 | /* | ||
46 | * Use a ring-buffer like data structure, where a writer advances the head by | ||
47 | * writing a new data entry and a reader advances the tail when it observes a | ||
48 | * new entry. | ||
49 | * | ||
50 | * Writers are made to wait on readers until there's space to write a new | ||
51 | * entry. | ||
52 | * | ||
53 | * This means that we can always use an {offset, mul} pair to compute a ns | ||
54 | * value that is 'roughly' in the right direction, even if we're writing a new | ||
55 | * {offset, mul} pair during the clock read. | ||
56 | * | ||
57 | * The down-side is that we can no longer guarantee strict monotonicity anymore | ||
58 | * (assuming the TSC was that to begin with), because while we compute the | ||
59 | * intersection point of the two clock slopes and make sure the time is | ||
60 | * continuous at the point of switching; we can no longer guarantee a reader is | ||
61 | * strictly before or after the switch point. | ||
62 | * | ||
63 | * It does mean a reader no longer needs to disable IRQs in order to avoid | ||
64 | * CPU-Freq updates messing with his times, and similarly an NMI reader will | ||
65 | * no longer run the risk of hitting half-written state. | ||
66 | */ | ||
67 | |||
68 | struct cyc2ns { | ||
69 | struct cyc2ns_data data[2]; /* 0 + 2*24 = 48 */ | ||
70 | struct cyc2ns_data *head; /* 48 + 8 = 56 */ | ||
71 | struct cyc2ns_data *tail; /* 56 + 8 = 64 */ | ||
72 | }; /* exactly fits one cacheline */ | ||
73 | |||
74 | static DEFINE_PER_CPU_ALIGNED(struct cyc2ns, cyc2ns); | ||
75 | |||
76 | struct cyc2ns_data *cyc2ns_read_begin(void) | ||
77 | { | ||
78 | struct cyc2ns_data *head; | ||
79 | |||
80 | preempt_disable(); | ||
81 | |||
82 | head = this_cpu_read(cyc2ns.head); | ||
83 | /* | ||
84 | * Ensure we observe the entry when we observe the pointer to it. | ||
85 | * matches the wmb from cyc2ns_write_end(). | ||
86 | */ | ||
87 | smp_read_barrier_depends(); | ||
88 | head->__count++; | ||
89 | barrier(); | ||
90 | |||
91 | return head; | ||
92 | } | ||
93 | |||
94 | void cyc2ns_read_end(struct cyc2ns_data *head) | ||
95 | { | ||
96 | barrier(); | ||
97 | /* | ||
98 | * If we're the outer most nested read; update the tail pointer | ||
99 | * when we're done. This notifies possible pending writers | ||
100 | * that we've observed the head pointer and that the other | ||
101 | * entry is now free. | ||
102 | */ | ||
103 | if (!--head->__count) { | ||
104 | /* | ||
105 | * x86-TSO does not reorder writes with older reads; | ||
106 | * therefore once this write becomes visible to another | ||
107 | * cpu, we must be finished reading the cyc2ns_data. | ||
108 | * | ||
109 | * matches with cyc2ns_write_begin(). | ||
110 | */ | ||
111 | this_cpu_write(cyc2ns.tail, head); | ||
112 | } | ||
113 | preempt_enable(); | ||
114 | } | ||
115 | |||
116 | /* | ||
117 | * Begin writing a new @data entry for @cpu. | ||
118 | * | ||
119 | * Assumes some sort of write side lock; currently 'provided' by the assumption | ||
120 | * that cpufreq will call its notifiers sequentially. | ||
121 | */ | ||
122 | static struct cyc2ns_data *cyc2ns_write_begin(int cpu) | ||
123 | { | ||
124 | struct cyc2ns *c2n = &per_cpu(cyc2ns, cpu); | ||
125 | struct cyc2ns_data *data = c2n->data; | ||
126 | |||
127 | if (data == c2n->head) | ||
128 | data++; | ||
129 | |||
130 | /* XXX send an IPI to @cpu in order to guarantee a read? */ | ||
131 | |||
132 | /* | ||
133 | * When we observe the tail write from cyc2ns_read_end(), | ||
134 | * the cpu must be done with that entry and its safe | ||
135 | * to start writing to it. | ||
136 | */ | ||
137 | while (c2n->tail == data) | ||
138 | cpu_relax(); | ||
139 | |||
140 | return data; | ||
141 | } | ||
142 | |||
143 | static void cyc2ns_write_end(int cpu, struct cyc2ns_data *data) | ||
144 | { | ||
145 | struct cyc2ns *c2n = &per_cpu(cyc2ns, cpu); | ||
146 | |||
147 | /* | ||
148 | * Ensure the @data writes are visible before we publish the | ||
149 | * entry. Matches the data-depencency in cyc2ns_read_begin(). | ||
150 | */ | ||
151 | smp_wmb(); | ||
152 | |||
153 | ACCESS_ONCE(c2n->head) = data; | ||
154 | } | ||
155 | |||
156 | /* | ||
157 | * Accelerators for sched_clock() | ||
158 | * convert from cycles(64bits) => nanoseconds (64bits) | ||
159 | * basic equation: | ||
160 | * ns = cycles / (freq / ns_per_sec) | ||
161 | * ns = cycles * (ns_per_sec / freq) | ||
162 | * ns = cycles * (10^9 / (cpu_khz * 10^3)) | ||
163 | * ns = cycles * (10^6 / cpu_khz) | ||
164 | * | ||
165 | * Then we use scaling math (suggested by george@mvista.com) to get: | ||
166 | * ns = cycles * (10^6 * SC / cpu_khz) / SC | ||
167 | * ns = cycles * cyc2ns_scale / SC | ||
168 | * | ||
169 | * And since SC is a constant power of two, we can convert the div | ||
170 | * into a shift. | ||
171 | * | ||
172 | * We can use khz divisor instead of mhz to keep a better precision, since | ||
173 | * cyc2ns_scale is limited to 10^6 * 2^10, which fits in 32 bits. | ||
174 | * (mathieu.desnoyers@polymtl.ca) | ||
175 | * | ||
176 | * -johnstul@us.ibm.com "math is hard, lets go shopping!" | ||
177 | */ | ||
178 | |||
179 | #define CYC2NS_SCALE_FACTOR 10 /* 2^10, carefully chosen */ | ||
180 | |||
181 | static void cyc2ns_data_init(struct cyc2ns_data *data) | ||
182 | { | ||
183 | data->cyc2ns_mul = 1U << CYC2NS_SCALE_FACTOR; | ||
184 | data->cyc2ns_shift = CYC2NS_SCALE_FACTOR; | ||
185 | data->cyc2ns_offset = 0; | ||
186 | data->__count = 0; | ||
187 | } | ||
188 | |||
189 | static void cyc2ns_init(int cpu) | ||
190 | { | ||
191 | struct cyc2ns *c2n = &per_cpu(cyc2ns, cpu); | ||
192 | |||
193 | cyc2ns_data_init(&c2n->data[0]); | ||
194 | cyc2ns_data_init(&c2n->data[1]); | ||
195 | |||
196 | c2n->head = c2n->data; | ||
197 | c2n->tail = c2n->data; | ||
198 | } | ||
199 | |||
200 | static inline unsigned long long cycles_2_ns(unsigned long long cyc) | ||
201 | { | ||
202 | struct cyc2ns_data *data, *tail; | ||
203 | unsigned long long ns; | ||
204 | |||
205 | /* | ||
206 | * See cyc2ns_read_*() for details; replicated in order to avoid | ||
207 | * an extra few instructions that came with the abstraction. | ||
208 | * Notable, it allows us to only do the __count and tail update | ||
209 | * dance when its actually needed. | ||
210 | */ | ||
211 | |||
212 | preempt_disable(); | ||
213 | data = this_cpu_read(cyc2ns.head); | ||
214 | tail = this_cpu_read(cyc2ns.tail); | ||
215 | |||
216 | if (likely(data == tail)) { | ||
217 | ns = data->cyc2ns_offset; | ||
218 | ns += mul_u64_u32_shr(cyc, data->cyc2ns_mul, CYC2NS_SCALE_FACTOR); | ||
219 | } else { | ||
220 | data->__count++; | ||
221 | |||
222 | barrier(); | ||
223 | |||
224 | ns = data->cyc2ns_offset; | ||
225 | ns += mul_u64_u32_shr(cyc, data->cyc2ns_mul, CYC2NS_SCALE_FACTOR); | ||
226 | |||
227 | barrier(); | ||
228 | |||
229 | if (!--data->__count) | ||
230 | this_cpu_write(cyc2ns.tail, data); | ||
231 | } | ||
232 | preempt_enable(); | ||
233 | |||
234 | return ns; | ||
235 | } | ||
236 | |||
237 | /* XXX surely we already have this someplace in the kernel?! */ | ||
238 | #define DIV_ROUND(n, d) (((n) + ((d) / 2)) / (d)) | ||
239 | |||
240 | static void set_cyc2ns_scale(unsigned long cpu_khz, int cpu) | ||
241 | { | ||
242 | unsigned long long tsc_now, ns_now; | ||
243 | struct cyc2ns_data *data; | ||
244 | unsigned long flags; | ||
245 | |||
246 | local_irq_save(flags); | ||
247 | sched_clock_idle_sleep_event(); | ||
248 | |||
249 | if (!cpu_khz) | ||
250 | goto done; | ||
251 | |||
252 | data = cyc2ns_write_begin(cpu); | ||
253 | |||
254 | rdtscll(tsc_now); | ||
255 | ns_now = cycles_2_ns(tsc_now); | ||
256 | |||
257 | /* | ||
258 | * Compute a new multiplier as per the above comment and ensure our | ||
259 | * time function is continuous; see the comment near struct | ||
260 | * cyc2ns_data. | ||
261 | */ | ||
262 | data->cyc2ns_mul = DIV_ROUND(NSEC_PER_MSEC << CYC2NS_SCALE_FACTOR, cpu_khz); | ||
263 | data->cyc2ns_shift = CYC2NS_SCALE_FACTOR; | ||
264 | data->cyc2ns_offset = ns_now - | ||
265 | mul_u64_u32_shr(tsc_now, data->cyc2ns_mul, CYC2NS_SCALE_FACTOR); | ||
266 | |||
267 | cyc2ns_write_end(cpu, data); | ||
268 | |||
269 | done: | ||
270 | sched_clock_idle_wakeup_event(0); | ||
271 | local_irq_restore(flags); | ||
272 | } | ||
41 | /* | 273 | /* |
42 | * Scheduler clock - returns current time in nanosec units. | 274 | * Scheduler clock - returns current time in nanosec units. |
43 | */ | 275 | */ |
44 | u64 native_sched_clock(void) | 276 | u64 native_sched_clock(void) |
45 | { | 277 | { |
46 | u64 this_offset; | 278 | u64 tsc_now; |
47 | 279 | ||
48 | /* | 280 | /* |
49 | * Fall back to jiffies if there's no TSC available: | 281 | * Fall back to jiffies if there's no TSC available: |
@@ -53,16 +285,16 @@ u64 native_sched_clock(void) | |||
53 | * very important for it to be as fast as the platform | 285 | * very important for it to be as fast as the platform |
54 | * can achieve it. ) | 286 | * can achieve it. ) |
55 | */ | 287 | */ |
56 | if (unlikely(tsc_disabled)) { | 288 | if (!static_key_false(&__use_tsc)) { |
57 | /* No locking but a rare wrong value is not a big deal: */ | 289 | /* No locking but a rare wrong value is not a big deal: */ |
58 | return (jiffies_64 - INITIAL_JIFFIES) * (1000000000 / HZ); | 290 | return (jiffies_64 - INITIAL_JIFFIES) * (1000000000 / HZ); |
59 | } | 291 | } |
60 | 292 | ||
61 | /* read the Time Stamp Counter: */ | 293 | /* read the Time Stamp Counter: */ |
62 | rdtscll(this_offset); | 294 | rdtscll(tsc_now); |
63 | 295 | ||
64 | /* return the value in ns */ | 296 | /* return the value in ns */ |
65 | return __cycles_2_ns(this_offset); | 297 | return cycles_2_ns(tsc_now); |
66 | } | 298 | } |
67 | 299 | ||
68 | /* We need to define a real function for sched_clock, to override the | 300 | /* We need to define a real function for sched_clock, to override the |
@@ -419,6 +651,16 @@ unsigned long native_calibrate_tsc(void) | |||
419 | unsigned long flags, latch, ms, fast_calibrate; | 651 | unsigned long flags, latch, ms, fast_calibrate; |
420 | int hpet = is_hpet_enabled(), i, loopmin; | 652 | int hpet = is_hpet_enabled(), i, loopmin; |
421 | 653 | ||
654 | /* Calibrate TSC using MSR for Intel Atom SoCs */ | ||
655 | local_irq_save(flags); | ||
656 | i = try_msr_calibrate_tsc(&fast_calibrate); | ||
657 | local_irq_restore(flags); | ||
658 | if (i >= 0) { | ||
659 | if (i == 0) | ||
660 | pr_warn("Fast TSC calibration using MSR failed\n"); | ||
661 | return fast_calibrate; | ||
662 | } | ||
663 | |||
422 | local_irq_save(flags); | 664 | local_irq_save(flags); |
423 | fast_calibrate = quick_pit_calibrate(); | 665 | fast_calibrate = quick_pit_calibrate(); |
424 | local_irq_restore(flags); | 666 | local_irq_restore(flags); |
@@ -589,61 +831,11 @@ int recalibrate_cpu_khz(void) | |||
589 | EXPORT_SYMBOL(recalibrate_cpu_khz); | 831 | EXPORT_SYMBOL(recalibrate_cpu_khz); |
590 | 832 | ||
591 | 833 | ||
592 | /* Accelerators for sched_clock() | ||
593 | * convert from cycles(64bits) => nanoseconds (64bits) | ||
594 | * basic equation: | ||
595 | * ns = cycles / (freq / ns_per_sec) | ||
596 | * ns = cycles * (ns_per_sec / freq) | ||
597 | * ns = cycles * (10^9 / (cpu_khz * 10^3)) | ||
598 | * ns = cycles * (10^6 / cpu_khz) | ||
599 | * | ||
600 | * Then we use scaling math (suggested by george@mvista.com) to get: | ||
601 | * ns = cycles * (10^6 * SC / cpu_khz) / SC | ||
602 | * ns = cycles * cyc2ns_scale / SC | ||
603 | * | ||
604 | * And since SC is a constant power of two, we can convert the div | ||
605 | * into a shift. | ||
606 | * | ||
607 | * We can use khz divisor instead of mhz to keep a better precision, since | ||
608 | * cyc2ns_scale is limited to 10^6 * 2^10, which fits in 32 bits. | ||
609 | * (mathieu.desnoyers@polymtl.ca) | ||
610 | * | ||
611 | * -johnstul@us.ibm.com "math is hard, lets go shopping!" | ||
612 | */ | ||
613 | |||
614 | DEFINE_PER_CPU(unsigned long, cyc2ns); | ||
615 | DEFINE_PER_CPU(unsigned long long, cyc2ns_offset); | ||
616 | |||
617 | static void set_cyc2ns_scale(unsigned long cpu_khz, int cpu) | ||
618 | { | ||
619 | unsigned long long tsc_now, ns_now, *offset; | ||
620 | unsigned long flags, *scale; | ||
621 | |||
622 | local_irq_save(flags); | ||
623 | sched_clock_idle_sleep_event(); | ||
624 | |||
625 | scale = &per_cpu(cyc2ns, cpu); | ||
626 | offset = &per_cpu(cyc2ns_offset, cpu); | ||
627 | |||
628 | rdtscll(tsc_now); | ||
629 | ns_now = __cycles_2_ns(tsc_now); | ||
630 | |||
631 | if (cpu_khz) { | ||
632 | *scale = ((NSEC_PER_MSEC << CYC2NS_SCALE_FACTOR) + | ||
633 | cpu_khz / 2) / cpu_khz; | ||
634 | *offset = ns_now - mult_frac(tsc_now, *scale, | ||
635 | (1UL << CYC2NS_SCALE_FACTOR)); | ||
636 | } | ||
637 | |||
638 | sched_clock_idle_wakeup_event(0); | ||
639 | local_irq_restore(flags); | ||
640 | } | ||
641 | |||
642 | static unsigned long long cyc2ns_suspend; | 834 | static unsigned long long cyc2ns_suspend; |
643 | 835 | ||
644 | void tsc_save_sched_clock_state(void) | 836 | void tsc_save_sched_clock_state(void) |
645 | { | 837 | { |
646 | if (!sched_clock_stable) | 838 | if (!sched_clock_stable()) |
647 | return; | 839 | return; |
648 | 840 | ||
649 | cyc2ns_suspend = sched_clock(); | 841 | cyc2ns_suspend = sched_clock(); |
@@ -663,16 +855,26 @@ void tsc_restore_sched_clock_state(void) | |||
663 | unsigned long flags; | 855 | unsigned long flags; |
664 | int cpu; | 856 | int cpu; |
665 | 857 | ||
666 | if (!sched_clock_stable) | 858 | if (!sched_clock_stable()) |
667 | return; | 859 | return; |
668 | 860 | ||
669 | local_irq_save(flags); | 861 | local_irq_save(flags); |
670 | 862 | ||
671 | __this_cpu_write(cyc2ns_offset, 0); | 863 | /* |
864 | * We're comming out of suspend, there's no concurrency yet; don't | ||
865 | * bother being nice about the RCU stuff, just write to both | ||
866 | * data fields. | ||
867 | */ | ||
868 | |||
869 | this_cpu_write(cyc2ns.data[0].cyc2ns_offset, 0); | ||
870 | this_cpu_write(cyc2ns.data[1].cyc2ns_offset, 0); | ||
871 | |||
672 | offset = cyc2ns_suspend - sched_clock(); | 872 | offset = cyc2ns_suspend - sched_clock(); |
673 | 873 | ||
674 | for_each_possible_cpu(cpu) | 874 | for_each_possible_cpu(cpu) { |
675 | per_cpu(cyc2ns_offset, cpu) = offset; | 875 | per_cpu(cyc2ns.data[0].cyc2ns_offset, cpu) = offset; |
876 | per_cpu(cyc2ns.data[1].cyc2ns_offset, cpu) = offset; | ||
877 | } | ||
676 | 878 | ||
677 | local_irq_restore(flags); | 879 | local_irq_restore(flags); |
678 | } | 880 | } |
@@ -795,7 +997,7 @@ void mark_tsc_unstable(char *reason) | |||
795 | { | 997 | { |
796 | if (!tsc_unstable) { | 998 | if (!tsc_unstable) { |
797 | tsc_unstable = 1; | 999 | tsc_unstable = 1; |
798 | sched_clock_stable = 0; | 1000 | clear_sched_clock_stable(); |
799 | disable_sched_clock_irqtime(); | 1001 | disable_sched_clock_irqtime(); |
800 | pr_info("Marking TSC unstable due to %s\n", reason); | 1002 | pr_info("Marking TSC unstable due to %s\n", reason); |
801 | /* Change only the rating, when not registered */ | 1003 | /* Change only the rating, when not registered */ |
@@ -995,14 +1197,18 @@ void __init tsc_init(void) | |||
995 | * speed as the bootup CPU. (cpufreq notifiers will fix this | 1197 | * speed as the bootup CPU. (cpufreq notifiers will fix this |
996 | * up if their speed diverges) | 1198 | * up if their speed diverges) |
997 | */ | 1199 | */ |
998 | for_each_possible_cpu(cpu) | 1200 | for_each_possible_cpu(cpu) { |
1201 | cyc2ns_init(cpu); | ||
999 | set_cyc2ns_scale(cpu_khz, cpu); | 1202 | set_cyc2ns_scale(cpu_khz, cpu); |
1203 | } | ||
1000 | 1204 | ||
1001 | if (tsc_disabled > 0) | 1205 | if (tsc_disabled > 0) |
1002 | return; | 1206 | return; |
1003 | 1207 | ||
1004 | /* now allow native_sched_clock() to use rdtsc */ | 1208 | /* now allow native_sched_clock() to use rdtsc */ |
1209 | |||
1005 | tsc_disabled = 0; | 1210 | tsc_disabled = 0; |
1211 | static_key_slow_inc(&__use_tsc); | ||
1006 | 1212 | ||
1007 | if (!no_sched_irq_time) | 1213 | if (!no_sched_irq_time) |
1008 | enable_sched_clock_irqtime(); | 1214 | enable_sched_clock_irqtime(); |
diff --git a/arch/x86/kernel/tsc_msr.c b/arch/x86/kernel/tsc_msr.c new file mode 100644 index 000000000000..8b5434f4389f --- /dev/null +++ b/arch/x86/kernel/tsc_msr.c | |||
@@ -0,0 +1,127 @@ | |||
1 | /* | ||
2 | * tsc_msr.c - MSR based TSC calibration on Intel Atom SoC platforms. | ||
3 | * | ||
4 | * TSC in Intel Atom SoC runs at a constant rate which can be figured | ||
5 | * by this formula: | ||
6 | * <maximum core-clock to bus-clock ratio> * <maximum resolved frequency> | ||
7 | * See Intel 64 and IA-32 System Programming Guid section 16.12 and 30.11.5 | ||
8 | * for details. | ||
9 | * Especially some Intel Atom SoCs don't have PIT(i8254) or HPET, so MSR | ||
10 | * based calibration is the only option. | ||
11 | * | ||
12 | * | ||
13 | * Copyright (C) 2013 Intel Corporation | ||
14 | * Author: Bin Gao <bin.gao@intel.com> | ||
15 | * | ||
16 | * This file is released under the GPLv2. | ||
17 | */ | ||
18 | |||
19 | #include <linux/kernel.h> | ||
20 | #include <asm/processor.h> | ||
21 | #include <asm/setup.h> | ||
22 | #include <asm/apic.h> | ||
23 | #include <asm/param.h> | ||
24 | |||
25 | /* CPU reference clock frequency: in KHz */ | ||
26 | #define FREQ_83 83200 | ||
27 | #define FREQ_100 99840 | ||
28 | #define FREQ_133 133200 | ||
29 | #define FREQ_166 166400 | ||
30 | |||
31 | #define MAX_NUM_FREQS 8 | ||
32 | |||
33 | /* | ||
34 | * According to Intel 64 and IA-32 System Programming Guide, | ||
35 | * if MSR_PERF_STAT[31] is set, the maximum resolved bus ratio can be | ||
36 | * read in MSR_PLATFORM_ID[12:8], otherwise in MSR_PERF_STAT[44:40]. | ||
37 | * Unfortunately some Intel Atom SoCs aren't quite compliant to this, | ||
38 | * so we need manually differentiate SoC families. This is what the | ||
39 | * field msr_plat does. | ||
40 | */ | ||
41 | struct freq_desc { | ||
42 | u8 x86_family; /* CPU family */ | ||
43 | u8 x86_model; /* model */ | ||
44 | u8 msr_plat; /* 1: use MSR_PLATFORM_INFO, 0: MSR_IA32_PERF_STATUS */ | ||
45 | u32 freqs[MAX_NUM_FREQS]; | ||
46 | }; | ||
47 | |||
48 | static struct freq_desc freq_desc_tables[] = { | ||
49 | /* PNW */ | ||
50 | { 6, 0x27, 0, { 0, 0, 0, 0, 0, FREQ_100, 0, FREQ_83 } }, | ||
51 | /* CLV+ */ | ||
52 | { 6, 0x35, 0, { 0, FREQ_133, 0, 0, 0, FREQ_100, 0, FREQ_83 } }, | ||
53 | /* TNG */ | ||
54 | { 6, 0x4a, 1, { 0, FREQ_100, FREQ_133, 0, 0, 0, 0, 0 } }, | ||
55 | /* VLV2 */ | ||
56 | { 6, 0x37, 1, { 0, FREQ_100, FREQ_133, FREQ_166, 0, 0, 0, 0 } }, | ||
57 | /* ANN */ | ||
58 | { 6, 0x5a, 1, { FREQ_83, FREQ_100, FREQ_133, FREQ_100, 0, 0, 0, 0 } }, | ||
59 | }; | ||
60 | |||
61 | static int match_cpu(u8 family, u8 model) | ||
62 | { | ||
63 | int i; | ||
64 | |||
65 | for (i = 0; i < ARRAY_SIZE(freq_desc_tables); i++) { | ||
66 | if ((family == freq_desc_tables[i].x86_family) && | ||
67 | (model == freq_desc_tables[i].x86_model)) | ||
68 | return i; | ||
69 | } | ||
70 | |||
71 | return -1; | ||
72 | } | ||
73 | |||
74 | /* Map CPU reference clock freq ID(0-7) to CPU reference clock freq(KHz) */ | ||
75 | #define id_to_freq(cpu_index, freq_id) \ | ||
76 | (freq_desc_tables[cpu_index].freqs[freq_id]) | ||
77 | |||
78 | /* | ||
79 | * Do MSR calibration only for known/supported CPUs. | ||
80 | * Return values: | ||
81 | * -1: CPU is unknown/unsupported for MSR based calibration | ||
82 | * 0: CPU is known/supported, but calibration failed | ||
83 | * 1: CPU is known/supported, and calibration succeeded | ||
84 | */ | ||
85 | int try_msr_calibrate_tsc(unsigned long *fast_calibrate) | ||
86 | { | ||
87 | int cpu_index; | ||
88 | u32 lo, hi, ratio, freq_id, freq; | ||
89 | |||
90 | cpu_index = match_cpu(boot_cpu_data.x86, boot_cpu_data.x86_model); | ||
91 | if (cpu_index < 0) | ||
92 | return -1; | ||
93 | |||
94 | *fast_calibrate = 0; | ||
95 | |||
96 | if (freq_desc_tables[cpu_index].msr_plat) { | ||
97 | rdmsr(MSR_PLATFORM_INFO, lo, hi); | ||
98 | ratio = (lo >> 8) & 0x1f; | ||
99 | } else { | ||
100 | rdmsr(MSR_IA32_PERF_STATUS, lo, hi); | ||
101 | ratio = (hi >> 8) & 0x1f; | ||
102 | } | ||
103 | pr_info("Maximum core-clock to bus-clock ratio: 0x%x\n", ratio); | ||
104 | |||
105 | if (!ratio) | ||
106 | return 0; | ||
107 | |||
108 | /* Get FSB FREQ ID */ | ||
109 | rdmsr(MSR_FSB_FREQ, lo, hi); | ||
110 | freq_id = lo & 0x7; | ||
111 | freq = id_to_freq(cpu_index, freq_id); | ||
112 | pr_info("Resolved frequency ID: %u, frequency: %u KHz\n", | ||
113 | freq_id, freq); | ||
114 | if (!freq) | ||
115 | return 0; | ||
116 | |||
117 | /* TSC frequency = maximum resolved freq * maximum resolved bus ratio */ | ||
118 | *fast_calibrate = freq * ratio; | ||
119 | pr_info("TSC runs at %lu KHz\n", *fast_calibrate); | ||
120 | |||
121 | #ifdef CONFIG_X86_LOCAL_APIC | ||
122 | lapic_timer_frequency = (freq * 1000) / HZ; | ||
123 | pr_info("lapic_timer_frequency = %d\n", lapic_timer_frequency); | ||
124 | #endif | ||
125 | |||
126 | return 1; | ||
127 | } | ||
diff --git a/arch/x86/kernel/tsc_sync.c b/arch/x86/kernel/tsc_sync.c index adfdf56a3714..26488487bc61 100644 --- a/arch/x86/kernel/tsc_sync.c +++ b/arch/x86/kernel/tsc_sync.c | |||
@@ -16,7 +16,6 @@ | |||
16 | */ | 16 | */ |
17 | #include <linux/spinlock.h> | 17 | #include <linux/spinlock.h> |
18 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
19 | #include <linux/init.h> | ||
20 | #include <linux/smp.h> | 19 | #include <linux/smp.h> |
21 | #include <linux/nmi.h> | 20 | #include <linux/nmi.h> |
22 | #include <asm/tsc.h> | 21 | #include <asm/tsc.h> |
diff --git a/arch/x86/kernel/xsave.c b/arch/x86/kernel/xsave.c index 422fd8223470..a4b451c6addf 100644 --- a/arch/x86/kernel/xsave.c +++ b/arch/x86/kernel/xsave.c | |||
@@ -562,6 +562,16 @@ static void __init xstate_enable_boot_cpu(void) | |||
562 | if (cpu_has_xsaveopt && eagerfpu != DISABLE) | 562 | if (cpu_has_xsaveopt && eagerfpu != DISABLE) |
563 | eagerfpu = ENABLE; | 563 | eagerfpu = ENABLE; |
564 | 564 | ||
565 | if (pcntxt_mask & XSTATE_EAGER) { | ||
566 | if (eagerfpu == DISABLE) { | ||
567 | pr_err("eagerfpu not present, disabling some xstate features: 0x%llx\n", | ||
568 | pcntxt_mask & XSTATE_EAGER); | ||
569 | pcntxt_mask &= ~XSTATE_EAGER; | ||
570 | } else { | ||
571 | eagerfpu = ENABLE; | ||
572 | } | ||
573 | } | ||
574 | |||
565 | pr_info("enabled xstate_bv 0x%llx, cntxt size 0x%x\n", | 575 | pr_info("enabled xstate_bv 0x%llx, cntxt size 0x%x\n", |
566 | pcntxt_mask, xstate_size); | 576 | pcntxt_mask, xstate_size); |
567 | } | 577 | } |
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 5439117d5c4c..775702f649ca 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c | |||
@@ -143,6 +143,8 @@ static inline int kvm_apic_id(struct kvm_lapic *apic) | |||
143 | return (kvm_apic_get_reg(apic, APIC_ID) >> 24) & 0xff; | 143 | return (kvm_apic_get_reg(apic, APIC_ID) >> 24) & 0xff; |
144 | } | 144 | } |
145 | 145 | ||
146 | #define KVM_X2APIC_CID_BITS 0 | ||
147 | |||
146 | static void recalculate_apic_map(struct kvm *kvm) | 148 | static void recalculate_apic_map(struct kvm *kvm) |
147 | { | 149 | { |
148 | struct kvm_apic_map *new, *old = NULL; | 150 | struct kvm_apic_map *new, *old = NULL; |
@@ -180,7 +182,8 @@ static void recalculate_apic_map(struct kvm *kvm) | |||
180 | if (apic_x2apic_mode(apic)) { | 182 | if (apic_x2apic_mode(apic)) { |
181 | new->ldr_bits = 32; | 183 | new->ldr_bits = 32; |
182 | new->cid_shift = 16; | 184 | new->cid_shift = 16; |
183 | new->cid_mask = new->lid_mask = 0xffff; | 185 | new->cid_mask = (1 << KVM_X2APIC_CID_BITS) - 1; |
186 | new->lid_mask = 0xffff; | ||
184 | } else if (kvm_apic_sw_enabled(apic) && | 187 | } else if (kvm_apic_sw_enabled(apic) && |
185 | !new->cid_mask /* flat mode */ && | 188 | !new->cid_mask /* flat mode */ && |
186 | kvm_apic_get_reg(apic, APIC_DFR) == APIC_DFR_CLUSTER) { | 189 | kvm_apic_get_reg(apic, APIC_DFR) == APIC_DFR_CLUSTER) { |
@@ -841,7 +844,8 @@ static u32 apic_get_tmcct(struct kvm_lapic *apic) | |||
841 | ASSERT(apic != NULL); | 844 | ASSERT(apic != NULL); |
842 | 845 | ||
843 | /* if initial count is 0, current count should also be 0 */ | 846 | /* if initial count is 0, current count should also be 0 */ |
844 | if (kvm_apic_get_reg(apic, APIC_TMICT) == 0) | 847 | if (kvm_apic_get_reg(apic, APIC_TMICT) == 0 || |
848 | apic->lapic_timer.period == 0) | ||
845 | return 0; | 849 | return 0; |
846 | 850 | ||
847 | remaining = hrtimer_get_remaining(&apic->lapic_timer.timer); | 851 | remaining = hrtimer_get_remaining(&apic->lapic_timer.timer); |
@@ -1346,8 +1350,12 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value) | |||
1346 | return; | 1350 | return; |
1347 | } | 1351 | } |
1348 | 1352 | ||
1353 | if (!kvm_vcpu_is_bsp(apic->vcpu)) | ||
1354 | value &= ~MSR_IA32_APICBASE_BSP; | ||
1355 | vcpu->arch.apic_base = value; | ||
1356 | |||
1349 | /* update jump label if enable bit changes */ | 1357 | /* update jump label if enable bit changes */ |
1350 | if ((vcpu->arch.apic_base ^ value) & MSR_IA32_APICBASE_ENABLE) { | 1358 | if ((old_value ^ value) & MSR_IA32_APICBASE_ENABLE) { |
1351 | if (value & MSR_IA32_APICBASE_ENABLE) | 1359 | if (value & MSR_IA32_APICBASE_ENABLE) |
1352 | static_key_slow_dec_deferred(&apic_hw_disabled); | 1360 | static_key_slow_dec_deferred(&apic_hw_disabled); |
1353 | else | 1361 | else |
@@ -1355,10 +1363,6 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value) | |||
1355 | recalculate_apic_map(vcpu->kvm); | 1363 | recalculate_apic_map(vcpu->kvm); |
1356 | } | 1364 | } |
1357 | 1365 | ||
1358 | if (!kvm_vcpu_is_bsp(apic->vcpu)) | ||
1359 | value &= ~MSR_IA32_APICBASE_BSP; | ||
1360 | |||
1361 | vcpu->arch.apic_base = value; | ||
1362 | if ((old_value ^ value) & X2APIC_ENABLE) { | 1366 | if ((old_value ^ value) & X2APIC_ENABLE) { |
1363 | if (value & X2APIC_ENABLE) { | 1367 | if (value & X2APIC_ENABLE) { |
1364 | u32 id = kvm_apic_id(apic); | 1368 | u32 id = kvm_apic_id(apic); |
@@ -1691,7 +1695,6 @@ static void apic_sync_pv_eoi_from_guest(struct kvm_vcpu *vcpu, | |||
1691 | void kvm_lapic_sync_from_vapic(struct kvm_vcpu *vcpu) | 1695 | void kvm_lapic_sync_from_vapic(struct kvm_vcpu *vcpu) |
1692 | { | 1696 | { |
1693 | u32 data; | 1697 | u32 data; |
1694 | void *vapic; | ||
1695 | 1698 | ||
1696 | if (test_bit(KVM_APIC_PV_EOI_PENDING, &vcpu->arch.apic_attention)) | 1699 | if (test_bit(KVM_APIC_PV_EOI_PENDING, &vcpu->arch.apic_attention)) |
1697 | apic_sync_pv_eoi_from_guest(vcpu, vcpu->arch.apic); | 1700 | apic_sync_pv_eoi_from_guest(vcpu, vcpu->arch.apic); |
@@ -1699,9 +1702,8 @@ void kvm_lapic_sync_from_vapic(struct kvm_vcpu *vcpu) | |||
1699 | if (!test_bit(KVM_APIC_CHECK_VAPIC, &vcpu->arch.apic_attention)) | 1702 | if (!test_bit(KVM_APIC_CHECK_VAPIC, &vcpu->arch.apic_attention)) |
1700 | return; | 1703 | return; |
1701 | 1704 | ||
1702 | vapic = kmap_atomic(vcpu->arch.apic->vapic_page); | 1705 | kvm_read_guest_cached(vcpu->kvm, &vcpu->arch.apic->vapic_cache, &data, |
1703 | data = *(u32 *)(vapic + offset_in_page(vcpu->arch.apic->vapic_addr)); | 1706 | sizeof(u32)); |
1704 | kunmap_atomic(vapic); | ||
1705 | 1707 | ||
1706 | apic_set_tpr(vcpu->arch.apic, data & 0xff); | 1708 | apic_set_tpr(vcpu->arch.apic, data & 0xff); |
1707 | } | 1709 | } |
@@ -1737,7 +1739,6 @@ void kvm_lapic_sync_to_vapic(struct kvm_vcpu *vcpu) | |||
1737 | u32 data, tpr; | 1739 | u32 data, tpr; |
1738 | int max_irr, max_isr; | 1740 | int max_irr, max_isr; |
1739 | struct kvm_lapic *apic = vcpu->arch.apic; | 1741 | struct kvm_lapic *apic = vcpu->arch.apic; |
1740 | void *vapic; | ||
1741 | 1742 | ||
1742 | apic_sync_pv_eoi_to_guest(vcpu, apic); | 1743 | apic_sync_pv_eoi_to_guest(vcpu, apic); |
1743 | 1744 | ||
@@ -1753,18 +1754,24 @@ void kvm_lapic_sync_to_vapic(struct kvm_vcpu *vcpu) | |||
1753 | max_isr = 0; | 1754 | max_isr = 0; |
1754 | data = (tpr & 0xff) | ((max_isr & 0xf0) << 8) | (max_irr << 24); | 1755 | data = (tpr & 0xff) | ((max_isr & 0xf0) << 8) | (max_irr << 24); |
1755 | 1756 | ||
1756 | vapic = kmap_atomic(vcpu->arch.apic->vapic_page); | 1757 | kvm_write_guest_cached(vcpu->kvm, &vcpu->arch.apic->vapic_cache, &data, |
1757 | *(u32 *)(vapic + offset_in_page(vcpu->arch.apic->vapic_addr)) = data; | 1758 | sizeof(u32)); |
1758 | kunmap_atomic(vapic); | ||
1759 | } | 1759 | } |
1760 | 1760 | ||
1761 | void kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr) | 1761 | int kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr) |
1762 | { | 1762 | { |
1763 | vcpu->arch.apic->vapic_addr = vapic_addr; | 1763 | if (vapic_addr) { |
1764 | if (vapic_addr) | 1764 | if (kvm_gfn_to_hva_cache_init(vcpu->kvm, |
1765 | &vcpu->arch.apic->vapic_cache, | ||
1766 | vapic_addr, sizeof(u32))) | ||
1767 | return -EINVAL; | ||
1765 | __set_bit(KVM_APIC_CHECK_VAPIC, &vcpu->arch.apic_attention); | 1768 | __set_bit(KVM_APIC_CHECK_VAPIC, &vcpu->arch.apic_attention); |
1766 | else | 1769 | } else { |
1767 | __clear_bit(KVM_APIC_CHECK_VAPIC, &vcpu->arch.apic_attention); | 1770 | __clear_bit(KVM_APIC_CHECK_VAPIC, &vcpu->arch.apic_attention); |
1771 | } | ||
1772 | |||
1773 | vcpu->arch.apic->vapic_addr = vapic_addr; | ||
1774 | return 0; | ||
1768 | } | 1775 | } |
1769 | 1776 | ||
1770 | int kvm_x2apic_msr_write(struct kvm_vcpu *vcpu, u32 msr, u64 data) | 1777 | int kvm_x2apic_msr_write(struct kvm_vcpu *vcpu, u32 msr, u64 data) |
diff --git a/arch/x86/kvm/lapic.h b/arch/x86/kvm/lapic.h index c730ac9fe801..c8b0d0d2da5c 100644 --- a/arch/x86/kvm/lapic.h +++ b/arch/x86/kvm/lapic.h | |||
@@ -34,7 +34,7 @@ struct kvm_lapic { | |||
34 | */ | 34 | */ |
35 | void *regs; | 35 | void *regs; |
36 | gpa_t vapic_addr; | 36 | gpa_t vapic_addr; |
37 | struct page *vapic_page; | 37 | struct gfn_to_hva_cache vapic_cache; |
38 | unsigned long pending_events; | 38 | unsigned long pending_events; |
39 | unsigned int sipi_vector; | 39 | unsigned int sipi_vector; |
40 | }; | 40 | }; |
@@ -76,7 +76,7 @@ void kvm_set_lapic_tscdeadline_msr(struct kvm_vcpu *vcpu, u64 data); | |||
76 | void kvm_apic_write_nodecode(struct kvm_vcpu *vcpu, u32 offset); | 76 | void kvm_apic_write_nodecode(struct kvm_vcpu *vcpu, u32 offset); |
77 | void kvm_apic_set_eoi_accelerated(struct kvm_vcpu *vcpu, int vector); | 77 | void kvm_apic_set_eoi_accelerated(struct kvm_vcpu *vcpu, int vector); |
78 | 78 | ||
79 | void kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr); | 79 | int kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr); |
80 | void kvm_lapic_sync_from_vapic(struct kvm_vcpu *vcpu); | 80 | void kvm_lapic_sync_from_vapic(struct kvm_vcpu *vcpu); |
81 | void kvm_lapic_sync_to_vapic(struct kvm_vcpu *vcpu); | 81 | void kvm_lapic_sync_to_vapic(struct kvm_vcpu *vcpu); |
82 | 82 | ||
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index b2fe1c252f35..da7837e1349d 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
@@ -8283,8 +8283,7 @@ static void load_vmcs12_host_state(struct kvm_vcpu *vcpu, | |||
8283 | vcpu->arch.cr4_guest_owned_bits = ~vmcs_readl(CR4_GUEST_HOST_MASK); | 8283 | vcpu->arch.cr4_guest_owned_bits = ~vmcs_readl(CR4_GUEST_HOST_MASK); |
8284 | kvm_set_cr4(vcpu, vmcs12->host_cr4); | 8284 | kvm_set_cr4(vcpu, vmcs12->host_cr4); |
8285 | 8285 | ||
8286 | if (nested_cpu_has_ept(vmcs12)) | 8286 | nested_ept_uninit_mmu_context(vcpu); |
8287 | nested_ept_uninit_mmu_context(vcpu); | ||
8288 | 8287 | ||
8289 | kvm_set_cr3(vcpu, vmcs12->host_cr3); | 8288 | kvm_set_cr3(vcpu, vmcs12->host_cr3); |
8290 | kvm_mmu_reset_context(vcpu); | 8289 | kvm_mmu_reset_context(vcpu); |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 21ef1ba184ae..5d004da1e35d 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -3214,8 +3214,7 @@ long kvm_arch_vcpu_ioctl(struct file *filp, | |||
3214 | r = -EFAULT; | 3214 | r = -EFAULT; |
3215 | if (copy_from_user(&va, argp, sizeof va)) | 3215 | if (copy_from_user(&va, argp, sizeof va)) |
3216 | goto out; | 3216 | goto out; |
3217 | r = 0; | 3217 | r = kvm_lapic_set_vapic_addr(vcpu, va.vapic_addr); |
3218 | kvm_lapic_set_vapic_addr(vcpu, va.vapic_addr); | ||
3219 | break; | 3218 | break; |
3220 | } | 3219 | } |
3221 | case KVM_X86_SETUP_MCE: { | 3220 | case KVM_X86_SETUP_MCE: { |
@@ -5739,36 +5738,6 @@ static void post_kvm_run_save(struct kvm_vcpu *vcpu) | |||
5739 | !kvm_event_needs_reinjection(vcpu); | 5738 | !kvm_event_needs_reinjection(vcpu); |
5740 | } | 5739 | } |
5741 | 5740 | ||
5742 | static int vapic_enter(struct kvm_vcpu *vcpu) | ||
5743 | { | ||
5744 | struct kvm_lapic *apic = vcpu->arch.apic; | ||
5745 | struct page *page; | ||
5746 | |||
5747 | if (!apic || !apic->vapic_addr) | ||
5748 | return 0; | ||
5749 | |||
5750 | page = gfn_to_page(vcpu->kvm, apic->vapic_addr >> PAGE_SHIFT); | ||
5751 | if (is_error_page(page)) | ||
5752 | return -EFAULT; | ||
5753 | |||
5754 | vcpu->arch.apic->vapic_page = page; | ||
5755 | return 0; | ||
5756 | } | ||
5757 | |||
5758 | static void vapic_exit(struct kvm_vcpu *vcpu) | ||
5759 | { | ||
5760 | struct kvm_lapic *apic = vcpu->arch.apic; | ||
5761 | int idx; | ||
5762 | |||
5763 | if (!apic || !apic->vapic_addr) | ||
5764 | return; | ||
5765 | |||
5766 | idx = srcu_read_lock(&vcpu->kvm->srcu); | ||
5767 | kvm_release_page_dirty(apic->vapic_page); | ||
5768 | mark_page_dirty(vcpu->kvm, apic->vapic_addr >> PAGE_SHIFT); | ||
5769 | srcu_read_unlock(&vcpu->kvm->srcu, idx); | ||
5770 | } | ||
5771 | |||
5772 | static void update_cr8_intercept(struct kvm_vcpu *vcpu) | 5741 | static void update_cr8_intercept(struct kvm_vcpu *vcpu) |
5773 | { | 5742 | { |
5774 | int max_irr, tpr; | 5743 | int max_irr, tpr; |
@@ -6069,11 +6038,6 @@ static int __vcpu_run(struct kvm_vcpu *vcpu) | |||
6069 | struct kvm *kvm = vcpu->kvm; | 6038 | struct kvm *kvm = vcpu->kvm; |
6070 | 6039 | ||
6071 | vcpu->srcu_idx = srcu_read_lock(&kvm->srcu); | 6040 | vcpu->srcu_idx = srcu_read_lock(&kvm->srcu); |
6072 | r = vapic_enter(vcpu); | ||
6073 | if (r) { | ||
6074 | srcu_read_unlock(&kvm->srcu, vcpu->srcu_idx); | ||
6075 | return r; | ||
6076 | } | ||
6077 | 6041 | ||
6078 | r = 1; | 6042 | r = 1; |
6079 | while (r > 0) { | 6043 | while (r > 0) { |
@@ -6132,8 +6096,6 @@ static int __vcpu_run(struct kvm_vcpu *vcpu) | |||
6132 | 6096 | ||
6133 | srcu_read_unlock(&kvm->srcu, vcpu->srcu_idx); | 6097 | srcu_read_unlock(&kvm->srcu, vcpu->srcu_idx); |
6134 | 6098 | ||
6135 | vapic_exit(vcpu); | ||
6136 | |||
6137 | return r; | 6099 | return r; |
6138 | } | 6100 | } |
6139 | 6101 | ||
diff --git a/arch/x86/lib/copy_user_64.S b/arch/x86/lib/copy_user_64.S index a30ca15be21c..dee945d55594 100644 --- a/arch/x86/lib/copy_user_64.S +++ b/arch/x86/lib/copy_user_64.S | |||
@@ -186,7 +186,7 @@ ENTRY(copy_user_generic_unrolled) | |||
186 | 30: shll $6,%ecx | 186 | 30: shll $6,%ecx |
187 | addl %ecx,%edx | 187 | addl %ecx,%edx |
188 | jmp 60f | 188 | jmp 60f |
189 | 40: lea (%rdx,%rcx,8),%rdx | 189 | 40: leal (%rdx,%rcx,8),%edx |
190 | jmp 60f | 190 | jmp 60f |
191 | 50: movl %ecx,%edx | 191 | 50: movl %ecx,%edx |
192 | 60: jmp copy_user_handle_tail /* ecx is zerorest also */ | 192 | 60: jmp copy_user_handle_tail /* ecx is zerorest also */ |
@@ -236,8 +236,6 @@ ENDPROC(copy_user_generic_unrolled) | |||
236 | ENTRY(copy_user_generic_string) | 236 | ENTRY(copy_user_generic_string) |
237 | CFI_STARTPROC | 237 | CFI_STARTPROC |
238 | ASM_STAC | 238 | ASM_STAC |
239 | andl %edx,%edx | ||
240 | jz 4f | ||
241 | cmpl $8,%edx | 239 | cmpl $8,%edx |
242 | jb 2f /* less than 8 bytes, go to byte copy loop */ | 240 | jb 2f /* less than 8 bytes, go to byte copy loop */ |
243 | ALIGN_DESTINATION | 241 | ALIGN_DESTINATION |
@@ -249,12 +247,12 @@ ENTRY(copy_user_generic_string) | |||
249 | 2: movl %edx,%ecx | 247 | 2: movl %edx,%ecx |
250 | 3: rep | 248 | 3: rep |
251 | movsb | 249 | movsb |
252 | 4: xorl %eax,%eax | 250 | xorl %eax,%eax |
253 | ASM_CLAC | 251 | ASM_CLAC |
254 | ret | 252 | ret |
255 | 253 | ||
256 | .section .fixup,"ax" | 254 | .section .fixup,"ax" |
257 | 11: lea (%rdx,%rcx,8),%rcx | 255 | 11: leal (%rdx,%rcx,8),%ecx |
258 | 12: movl %ecx,%edx /* ecx is zerorest also */ | 256 | 12: movl %ecx,%edx /* ecx is zerorest also */ |
259 | jmp copy_user_handle_tail | 257 | jmp copy_user_handle_tail |
260 | .previous | 258 | .previous |
@@ -279,12 +277,10 @@ ENDPROC(copy_user_generic_string) | |||
279 | ENTRY(copy_user_enhanced_fast_string) | 277 | ENTRY(copy_user_enhanced_fast_string) |
280 | CFI_STARTPROC | 278 | CFI_STARTPROC |
281 | ASM_STAC | 279 | ASM_STAC |
282 | andl %edx,%edx | ||
283 | jz 2f | ||
284 | movl %edx,%ecx | 280 | movl %edx,%ecx |
285 | 1: rep | 281 | 1: rep |
286 | movsb | 282 | movsb |
287 | 2: xorl %eax,%eax | 283 | xorl %eax,%eax |
288 | ASM_CLAC | 284 | ASM_CLAC |
289 | ret | 285 | ret |
290 | 286 | ||
diff --git a/arch/x86/lib/delay.c b/arch/x86/lib/delay.c index 7c3bee636e2f..39d6a3db0b96 100644 --- a/arch/x86/lib/delay.c +++ b/arch/x86/lib/delay.c | |||
@@ -16,7 +16,6 @@ | |||
16 | #include <linux/timex.h> | 16 | #include <linux/timex.h> |
17 | #include <linux/preempt.h> | 17 | #include <linux/preempt.h> |
18 | #include <linux/delay.h> | 18 | #include <linux/delay.h> |
19 | #include <linux/init.h> | ||
20 | 19 | ||
21 | #include <asm/processor.h> | 20 | #include <asm/processor.h> |
22 | #include <asm/delay.h> | 21 | #include <asm/delay.h> |
diff --git a/arch/x86/lib/x86-opcode-map.txt b/arch/x86/lib/x86-opcode-map.txt index 533a85e3a07e..1a2be7c6895d 100644 --- a/arch/x86/lib/x86-opcode-map.txt +++ b/arch/x86/lib/x86-opcode-map.txt | |||
@@ -346,8 +346,8 @@ AVXcode: 1 | |||
346 | 17: vmovhps Mq,Vq (v1) | vmovhpd Mq,Vq (66),(v1) | 346 | 17: vmovhps Mq,Vq (v1) | vmovhpd Mq,Vq (66),(v1) |
347 | 18: Grp16 (1A) | 347 | 18: Grp16 (1A) |
348 | 19: | 348 | 19: |
349 | 1a: | 349 | 1a: BNDCL Ev,Gv | BNDCU Ev,Gv | BNDMOV Gv,Ev | BNDLDX Gv,Ev,Gv |
350 | 1b: | 350 | 1b: BNDCN Ev,Gv | BNDMOV Ev,Gv | BNDMK Gv,Ev | BNDSTX Ev,GV,Gv |
351 | 1c: | 351 | 1c: |
352 | 1d: | 352 | 1d: |
353 | 1e: | 353 | 1e: |
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 9ff85bb8dd69..9d591c895803 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c | |||
@@ -641,6 +641,20 @@ no_context(struct pt_regs *regs, unsigned long error_code, | |||
641 | 641 | ||
642 | /* Are we prepared to handle this kernel fault? */ | 642 | /* Are we prepared to handle this kernel fault? */ |
643 | if (fixup_exception(regs)) { | 643 | if (fixup_exception(regs)) { |
644 | /* | ||
645 | * Any interrupt that takes a fault gets the fixup. This makes | ||
646 | * the below recursive fault logic only apply to a faults from | ||
647 | * task context. | ||
648 | */ | ||
649 | if (in_interrupt()) | ||
650 | return; | ||
651 | |||
652 | /* | ||
653 | * Per the above we're !in_interrupt(), aka. task context. | ||
654 | * | ||
655 | * In this case we need to make sure we're not recursively | ||
656 | * faulting through the emulate_vsyscall() logic. | ||
657 | */ | ||
644 | if (current_thread_info()->sig_on_uaccess_error && signal) { | 658 | if (current_thread_info()->sig_on_uaccess_error && signal) { |
645 | tsk->thread.trap_nr = X86_TRAP_PF; | 659 | tsk->thread.trap_nr = X86_TRAP_PF; |
646 | tsk->thread.error_code = error_code | PF_USER; | 660 | tsk->thread.error_code = error_code | PF_USER; |
@@ -649,6 +663,10 @@ no_context(struct pt_regs *regs, unsigned long error_code, | |||
649 | /* XXX: hwpoison faults will set the wrong code. */ | 663 | /* XXX: hwpoison faults will set the wrong code. */ |
650 | force_sig_info_fault(signal, si_code, address, tsk, 0); | 664 | force_sig_info_fault(signal, si_code, address, tsk, 0); |
651 | } | 665 | } |
666 | |||
667 | /* | ||
668 | * Barring that, we can do the fixup and be happy. | ||
669 | */ | ||
652 | return; | 670 | return; |
653 | } | 671 | } |
654 | 672 | ||
diff --git a/arch/x86/mm/gup.c b/arch/x86/mm/gup.c index dd74e46828c0..0596e8e0cc19 100644 --- a/arch/x86/mm/gup.c +++ b/arch/x86/mm/gup.c | |||
@@ -83,6 +83,12 @@ static noinline int gup_pte_range(pmd_t pmd, unsigned long addr, | |||
83 | pte_t pte = gup_get_pte(ptep); | 83 | pte_t pte = gup_get_pte(ptep); |
84 | struct page *page; | 84 | struct page *page; |
85 | 85 | ||
86 | /* Similar to the PMD case, NUMA hinting must take slow path */ | ||
87 | if (pte_numa(pte)) { | ||
88 | pte_unmap(ptep); | ||
89 | return 0; | ||
90 | } | ||
91 | |||
86 | if ((pte_flags(pte) & (mask | _PAGE_SPECIAL)) != mask) { | 92 | if ((pte_flags(pte) & (mask | _PAGE_SPECIAL)) != mask) { |
87 | pte_unmap(ptep); | 93 | pte_unmap(ptep); |
88 | return 0; | 94 | return 0; |
@@ -167,6 +173,13 @@ static int gup_pmd_range(pud_t pud, unsigned long addr, unsigned long end, | |||
167 | if (pmd_none(pmd) || pmd_trans_splitting(pmd)) | 173 | if (pmd_none(pmd) || pmd_trans_splitting(pmd)) |
168 | return 0; | 174 | return 0; |
169 | if (unlikely(pmd_large(pmd))) { | 175 | if (unlikely(pmd_large(pmd))) { |
176 | /* | ||
177 | * NUMA hinting faults need to be handled in the GUP | ||
178 | * slowpath for accounting purposes and so that they | ||
179 | * can be serialised against THP migration. | ||
180 | */ | ||
181 | if (pmd_numa(pmd)) | ||
182 | return 0; | ||
170 | if (!gup_huge_pmd(pmd, addr, next, write, pages, nr)) | 183 | if (!gup_huge_pmd(pmd, addr, next, write, pages, nr)) |
171 | return 0; | 184 | return 0; |
172 | } else { | 185 | } else { |
diff --git a/arch/x86/mm/hugetlbpage.c b/arch/x86/mm/hugetlbpage.c index 9d980d88b747..8c9f647ff9e1 100644 --- a/arch/x86/mm/hugetlbpage.c +++ b/arch/x86/mm/hugetlbpage.c | |||
@@ -87,9 +87,7 @@ int pmd_huge_support(void) | |||
87 | } | 87 | } |
88 | #endif | 88 | #endif |
89 | 89 | ||
90 | /* x86_64 also uses this file */ | 90 | #ifdef CONFIG_HUGETLB_PAGE |
91 | |||
92 | #ifdef HAVE_ARCH_HUGETLB_UNMAPPED_AREA | ||
93 | static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file, | 91 | static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file, |
94 | unsigned long addr, unsigned long len, | 92 | unsigned long addr, unsigned long len, |
95 | unsigned long pgoff, unsigned long flags) | 93 | unsigned long pgoff, unsigned long flags) |
@@ -99,7 +97,7 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file, | |||
99 | 97 | ||
100 | info.flags = 0; | 98 | info.flags = 0; |
101 | info.length = len; | 99 | info.length = len; |
102 | info.low_limit = TASK_UNMAPPED_BASE; | 100 | info.low_limit = current->mm->mmap_legacy_base; |
103 | info.high_limit = TASK_SIZE; | 101 | info.high_limit = TASK_SIZE; |
104 | info.align_mask = PAGE_MASK & ~huge_page_mask(h); | 102 | info.align_mask = PAGE_MASK & ~huge_page_mask(h); |
105 | info.align_offset = 0; | 103 | info.align_offset = 0; |
@@ -172,8 +170,7 @@ hugetlb_get_unmapped_area(struct file *file, unsigned long addr, | |||
172 | return hugetlb_get_unmapped_area_topdown(file, addr, len, | 170 | return hugetlb_get_unmapped_area_topdown(file, addr, len, |
173 | pgoff, flags); | 171 | pgoff, flags); |
174 | } | 172 | } |
175 | 173 | #endif /* CONFIG_HUGETLB_PAGE */ | |
176 | #endif /*HAVE_ARCH_HUGETLB_UNMAPPED_AREA*/ | ||
177 | 174 | ||
178 | #ifdef CONFIG_X86_64 | 175 | #ifdef CONFIG_X86_64 |
179 | static __init int setup_hugepagesz(char *opt) | 176 | static __init int setup_hugepagesz(char *opt) |
diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c index 4287f1ffba7e..e39504878aec 100644 --- a/arch/x86/mm/init_32.c +++ b/arch/x86/mm/init_32.c | |||
@@ -665,7 +665,7 @@ void __init initmem_init(void) | |||
665 | high_memory = (void *) __va(max_low_pfn * PAGE_SIZE - 1) + 1; | 665 | high_memory = (void *) __va(max_low_pfn * PAGE_SIZE - 1) + 1; |
666 | #endif | 666 | #endif |
667 | 667 | ||
668 | memblock_set_node(0, (phys_addr_t)ULLONG_MAX, 0); | 668 | memblock_set_node(0, (phys_addr_t)ULLONG_MAX, &memblock.memory, 0); |
669 | sparse_memory_present_with_active_regions(0); | 669 | sparse_memory_present_with_active_regions(0); |
670 | 670 | ||
671 | #ifdef CONFIG_FLATMEM | 671 | #ifdef CONFIG_FLATMEM |
@@ -806,6 +806,9 @@ void __init mem_init(void) | |||
806 | BUILD_BUG_ON(VMALLOC_START >= VMALLOC_END); | 806 | BUILD_BUG_ON(VMALLOC_START >= VMALLOC_END); |
807 | #undef high_memory | 807 | #undef high_memory |
808 | #undef __FIXADDR_TOP | 808 | #undef __FIXADDR_TOP |
809 | #ifdef CONFIG_RANDOMIZE_BASE | ||
810 | BUILD_BUG_ON(CONFIG_RANDOMIZE_BASE_MAX_OFFSET > KERNEL_IMAGE_SIZE); | ||
811 | #endif | ||
809 | 812 | ||
810 | #ifdef CONFIG_HIGHMEM | 813 | #ifdef CONFIG_HIGHMEM |
811 | BUG_ON(PKMAP_BASE + LAST_PKMAP*PAGE_SIZE > FIXADDR_START); | 814 | BUG_ON(PKMAP_BASE + LAST_PKMAP*PAGE_SIZE > FIXADDR_START); |
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 104d56a9245f..f35c66c5959a 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c | |||
@@ -643,7 +643,7 @@ kernel_physical_mapping_init(unsigned long start, | |||
643 | #ifndef CONFIG_NUMA | 643 | #ifndef CONFIG_NUMA |
644 | void __init initmem_init(void) | 644 | void __init initmem_init(void) |
645 | { | 645 | { |
646 | memblock_set_node(0, (phys_addr_t)ULLONG_MAX, 0); | 646 | memblock_set_node(0, (phys_addr_t)ULLONG_MAX, &memblock.memory, 0); |
647 | } | 647 | } |
648 | #endif | 648 | #endif |
649 | 649 | ||
diff --git a/arch/x86/mm/kmmio.c b/arch/x86/mm/kmmio.c index e5d5e2ce9f77..637ab34ed632 100644 --- a/arch/x86/mm/kmmio.c +++ b/arch/x86/mm/kmmio.c | |||
@@ -11,7 +11,6 @@ | |||
11 | #include <linux/rculist.h> | 11 | #include <linux/rculist.h> |
12 | #include <linux/spinlock.h> | 12 | #include <linux/spinlock.h> |
13 | #include <linux/hash.h> | 13 | #include <linux/hash.h> |
14 | #include <linux/init.h> | ||
15 | #include <linux/module.h> | 14 | #include <linux/module.h> |
16 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
17 | #include <linux/uaccess.h> | 16 | #include <linux/uaccess.h> |
diff --git a/arch/x86/mm/memtest.c b/arch/x86/mm/memtest.c index 8dabbed409ee..1e9da795767a 100644 --- a/arch/x86/mm/memtest.c +++ b/arch/x86/mm/memtest.c | |||
@@ -74,7 +74,7 @@ static void __init do_one_pass(u64 pattern, u64 start, u64 end) | |||
74 | u64 i; | 74 | u64 i; |
75 | phys_addr_t this_start, this_end; | 75 | phys_addr_t this_start, this_end; |
76 | 76 | ||
77 | for_each_free_mem_range(i, MAX_NUMNODES, &this_start, &this_end, NULL) { | 77 | for_each_free_mem_range(i, NUMA_NO_NODE, &this_start, &this_end, NULL) { |
78 | this_start = clamp_t(phys_addr_t, this_start, start, end); | 78 | this_start = clamp_t(phys_addr_t, this_start, start, end); |
79 | this_end = clamp_t(phys_addr_t, this_end, start, end); | 79 | this_end = clamp_t(phys_addr_t, this_end, start, end); |
80 | if (this_start < this_end) { | 80 | if (this_start < this_end) { |
diff --git a/arch/x86/mm/numa.c b/arch/x86/mm/numa.c index 24aec58d6afd..81b2750f3666 100644 --- a/arch/x86/mm/numa.c +++ b/arch/x86/mm/numa.c | |||
@@ -211,9 +211,13 @@ static void __init setup_node_data(int nid, u64 start, u64 end) | |||
211 | */ | 211 | */ |
212 | nd_pa = memblock_alloc_nid(nd_size, SMP_CACHE_BYTES, nid); | 212 | nd_pa = memblock_alloc_nid(nd_size, SMP_CACHE_BYTES, nid); |
213 | if (!nd_pa) { | 213 | if (!nd_pa) { |
214 | pr_err("Cannot find %zu bytes in node %d\n", | 214 | nd_pa = __memblock_alloc_base(nd_size, SMP_CACHE_BYTES, |
215 | nd_size, nid); | 215 | MEMBLOCK_ALLOC_ACCESSIBLE); |
216 | return; | 216 | if (!nd_pa) { |
217 | pr_err("Cannot find %zu bytes in node %d\n", | ||
218 | nd_size, nid); | ||
219 | return; | ||
220 | } | ||
217 | } | 221 | } |
218 | nd = __va(nd_pa); | 222 | nd = __va(nd_pa); |
219 | 223 | ||
@@ -487,7 +491,16 @@ static int __init numa_register_memblks(struct numa_meminfo *mi) | |||
487 | 491 | ||
488 | for (i = 0; i < mi->nr_blks; i++) { | 492 | for (i = 0; i < mi->nr_blks; i++) { |
489 | struct numa_memblk *mb = &mi->blk[i]; | 493 | struct numa_memblk *mb = &mi->blk[i]; |
490 | memblock_set_node(mb->start, mb->end - mb->start, mb->nid); | 494 | memblock_set_node(mb->start, mb->end - mb->start, |
495 | &memblock.memory, mb->nid); | ||
496 | |||
497 | /* | ||
498 | * At this time, all memory regions reserved by memblock are | ||
499 | * used by the kernel. Set the nid in memblock.reserved will | ||
500 | * mark out all the nodes the kernel resides in. | ||
501 | */ | ||
502 | memblock_set_node(mb->start, mb->end - mb->start, | ||
503 | &memblock.reserved, mb->nid); | ||
491 | } | 504 | } |
492 | 505 | ||
493 | /* | 506 | /* |
@@ -549,6 +562,30 @@ static void __init numa_init_array(void) | |||
549 | } | 562 | } |
550 | } | 563 | } |
551 | 564 | ||
565 | static void __init numa_clear_kernel_node_hotplug(void) | ||
566 | { | ||
567 | int i, nid; | ||
568 | nodemask_t numa_kernel_nodes; | ||
569 | unsigned long start, end; | ||
570 | struct memblock_type *type = &memblock.reserved; | ||
571 | |||
572 | /* Mark all kernel nodes. */ | ||
573 | for (i = 0; i < type->cnt; i++) | ||
574 | node_set(type->regions[i].nid, numa_kernel_nodes); | ||
575 | |||
576 | /* Clear MEMBLOCK_HOTPLUG flag for memory in kernel nodes. */ | ||
577 | for (i = 0; i < numa_meminfo.nr_blks; i++) { | ||
578 | nid = numa_meminfo.blk[i].nid; | ||
579 | if (!node_isset(nid, numa_kernel_nodes)) | ||
580 | continue; | ||
581 | |||
582 | start = numa_meminfo.blk[i].start; | ||
583 | end = numa_meminfo.blk[i].end; | ||
584 | |||
585 | memblock_clear_hotplug(start, end - start); | ||
586 | } | ||
587 | } | ||
588 | |||
552 | static int __init numa_init(int (*init_func)(void)) | 589 | static int __init numa_init(int (*init_func)(void)) |
553 | { | 590 | { |
554 | int i; | 591 | int i; |
@@ -561,7 +598,12 @@ static int __init numa_init(int (*init_func)(void)) | |||
561 | nodes_clear(node_possible_map); | 598 | nodes_clear(node_possible_map); |
562 | nodes_clear(node_online_map); | 599 | nodes_clear(node_online_map); |
563 | memset(&numa_meminfo, 0, sizeof(numa_meminfo)); | 600 | memset(&numa_meminfo, 0, sizeof(numa_meminfo)); |
564 | WARN_ON(memblock_set_node(0, ULLONG_MAX, MAX_NUMNODES)); | 601 | WARN_ON(memblock_set_node(0, ULLONG_MAX, &memblock.memory, |
602 | MAX_NUMNODES)); | ||
603 | WARN_ON(memblock_set_node(0, ULLONG_MAX, &memblock.reserved, | ||
604 | MAX_NUMNODES)); | ||
605 | /* In case that parsing SRAT failed. */ | ||
606 | WARN_ON(memblock_clear_hotplug(0, ULLONG_MAX)); | ||
565 | numa_reset_distance(); | 607 | numa_reset_distance(); |
566 | 608 | ||
567 | ret = init_func(); | 609 | ret = init_func(); |
@@ -597,6 +639,16 @@ static int __init numa_init(int (*init_func)(void)) | |||
597 | numa_clear_node(i); | 639 | numa_clear_node(i); |
598 | } | 640 | } |
599 | numa_init_array(); | 641 | numa_init_array(); |
642 | |||
643 | /* | ||
644 | * At very early time, the kernel have to use some memory such as | ||
645 | * loading the kernel image. We cannot prevent this anyway. So any | ||
646 | * node the kernel resides in should be un-hotpluggable. | ||
647 | * | ||
648 | * And when we come here, numa_init() won't fail. | ||
649 | */ | ||
650 | numa_clear_kernel_node_hotplug(); | ||
651 | |||
600 | return 0; | 652 | return 0; |
601 | } | 653 | } |
602 | 654 | ||
diff --git a/arch/x86/mm/pageattr-test.c b/arch/x86/mm/pageattr-test.c index d0b1773d9d2e..461bc8289024 100644 --- a/arch/x86/mm/pageattr-test.c +++ b/arch/x86/mm/pageattr-test.c | |||
@@ -8,7 +8,6 @@ | |||
8 | #include <linux/kthread.h> | 8 | #include <linux/kthread.h> |
9 | #include <linux/random.h> | 9 | #include <linux/random.h> |
10 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
11 | #include <linux/init.h> | ||
12 | #include <linux/mm.h> | 11 | #include <linux/mm.h> |
13 | 12 | ||
14 | #include <asm/cacheflush.h> | 13 | #include <asm/cacheflush.h> |
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index bb32480c2d71..b3b19f46c016 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c | |||
@@ -30,6 +30,7 @@ | |||
30 | */ | 30 | */ |
31 | struct cpa_data { | 31 | struct cpa_data { |
32 | unsigned long *vaddr; | 32 | unsigned long *vaddr; |
33 | pgd_t *pgd; | ||
33 | pgprot_t mask_set; | 34 | pgprot_t mask_set; |
34 | pgprot_t mask_clr; | 35 | pgprot_t mask_clr; |
35 | int numpages; | 36 | int numpages; |
@@ -322,17 +323,9 @@ static inline pgprot_t static_protections(pgprot_t prot, unsigned long address, | |||
322 | return prot; | 323 | return prot; |
323 | } | 324 | } |
324 | 325 | ||
325 | /* | 326 | static pte_t *__lookup_address_in_pgd(pgd_t *pgd, unsigned long address, |
326 | * Lookup the page table entry for a virtual address. Return a pointer | 327 | unsigned int *level) |
327 | * to the entry and the level of the mapping. | ||
328 | * | ||
329 | * Note: We return pud and pmd either when the entry is marked large | ||
330 | * or when the present bit is not set. Otherwise we would return a | ||
331 | * pointer to a nonexisting mapping. | ||
332 | */ | ||
333 | pte_t *lookup_address(unsigned long address, unsigned int *level) | ||
334 | { | 328 | { |
335 | pgd_t *pgd = pgd_offset_k(address); | ||
336 | pud_t *pud; | 329 | pud_t *pud; |
337 | pmd_t *pmd; | 330 | pmd_t *pmd; |
338 | 331 | ||
@@ -361,8 +354,31 @@ pte_t *lookup_address(unsigned long address, unsigned int *level) | |||
361 | 354 | ||
362 | return pte_offset_kernel(pmd, address); | 355 | return pte_offset_kernel(pmd, address); |
363 | } | 356 | } |
357 | |||
358 | /* | ||
359 | * Lookup the page table entry for a virtual address. Return a pointer | ||
360 | * to the entry and the level of the mapping. | ||
361 | * | ||
362 | * Note: We return pud and pmd either when the entry is marked large | ||
363 | * or when the present bit is not set. Otherwise we would return a | ||
364 | * pointer to a nonexisting mapping. | ||
365 | */ | ||
366 | pte_t *lookup_address(unsigned long address, unsigned int *level) | ||
367 | { | ||
368 | return __lookup_address_in_pgd(pgd_offset_k(address), address, level); | ||
369 | } | ||
364 | EXPORT_SYMBOL_GPL(lookup_address); | 370 | EXPORT_SYMBOL_GPL(lookup_address); |
365 | 371 | ||
372 | static pte_t *_lookup_address_cpa(struct cpa_data *cpa, unsigned long address, | ||
373 | unsigned int *level) | ||
374 | { | ||
375 | if (cpa->pgd) | ||
376 | return __lookup_address_in_pgd(cpa->pgd + pgd_index(address), | ||
377 | address, level); | ||
378 | |||
379 | return lookup_address(address, level); | ||
380 | } | ||
381 | |||
366 | /* | 382 | /* |
367 | * This is necessary because __pa() does not work on some | 383 | * This is necessary because __pa() does not work on some |
368 | * kinds of memory, like vmalloc() or the alloc_remap() | 384 | * kinds of memory, like vmalloc() or the alloc_remap() |
@@ -437,7 +453,7 @@ try_preserve_large_page(pte_t *kpte, unsigned long address, | |||
437 | * Check for races, another CPU might have split this page | 453 | * Check for races, another CPU might have split this page |
438 | * up already: | 454 | * up already: |
439 | */ | 455 | */ |
440 | tmp = lookup_address(address, &level); | 456 | tmp = _lookup_address_cpa(cpa, address, &level); |
441 | if (tmp != kpte) | 457 | if (tmp != kpte) |
442 | goto out_unlock; | 458 | goto out_unlock; |
443 | 459 | ||
@@ -543,7 +559,8 @@ out_unlock: | |||
543 | } | 559 | } |
544 | 560 | ||
545 | static int | 561 | static int |
546 | __split_large_page(pte_t *kpte, unsigned long address, struct page *base) | 562 | __split_large_page(struct cpa_data *cpa, pte_t *kpte, unsigned long address, |
563 | struct page *base) | ||
547 | { | 564 | { |
548 | pte_t *pbase = (pte_t *)page_address(base); | 565 | pte_t *pbase = (pte_t *)page_address(base); |
549 | unsigned long pfn, pfninc = 1; | 566 | unsigned long pfn, pfninc = 1; |
@@ -556,7 +573,7 @@ __split_large_page(pte_t *kpte, unsigned long address, struct page *base) | |||
556 | * Check for races, another CPU might have split this page | 573 | * Check for races, another CPU might have split this page |
557 | * up for us already: | 574 | * up for us already: |
558 | */ | 575 | */ |
559 | tmp = lookup_address(address, &level); | 576 | tmp = _lookup_address_cpa(cpa, address, &level); |
560 | if (tmp != kpte) { | 577 | if (tmp != kpte) { |
561 | spin_unlock(&pgd_lock); | 578 | spin_unlock(&pgd_lock); |
562 | return 1; | 579 | return 1; |
@@ -632,7 +649,8 @@ __split_large_page(pte_t *kpte, unsigned long address, struct page *base) | |||
632 | return 0; | 649 | return 0; |
633 | } | 650 | } |
634 | 651 | ||
635 | static int split_large_page(pte_t *kpte, unsigned long address) | 652 | static int split_large_page(struct cpa_data *cpa, pte_t *kpte, |
653 | unsigned long address) | ||
636 | { | 654 | { |
637 | struct page *base; | 655 | struct page *base; |
638 | 656 | ||
@@ -644,15 +662,390 @@ static int split_large_page(pte_t *kpte, unsigned long address) | |||
644 | if (!base) | 662 | if (!base) |
645 | return -ENOMEM; | 663 | return -ENOMEM; |
646 | 664 | ||
647 | if (__split_large_page(kpte, address, base)) | 665 | if (__split_large_page(cpa, kpte, address, base)) |
648 | __free_page(base); | 666 | __free_page(base); |
649 | 667 | ||
650 | return 0; | 668 | return 0; |
651 | } | 669 | } |
652 | 670 | ||
671 | static bool try_to_free_pte_page(pte_t *pte) | ||
672 | { | ||
673 | int i; | ||
674 | |||
675 | for (i = 0; i < PTRS_PER_PTE; i++) | ||
676 | if (!pte_none(pte[i])) | ||
677 | return false; | ||
678 | |||
679 | free_page((unsigned long)pte); | ||
680 | return true; | ||
681 | } | ||
682 | |||
683 | static bool try_to_free_pmd_page(pmd_t *pmd) | ||
684 | { | ||
685 | int i; | ||
686 | |||
687 | for (i = 0; i < PTRS_PER_PMD; i++) | ||
688 | if (!pmd_none(pmd[i])) | ||
689 | return false; | ||
690 | |||
691 | free_page((unsigned long)pmd); | ||
692 | return true; | ||
693 | } | ||
694 | |||
695 | static bool unmap_pte_range(pmd_t *pmd, unsigned long start, unsigned long end) | ||
696 | { | ||
697 | pte_t *pte = pte_offset_kernel(pmd, start); | ||
698 | |||
699 | while (start < end) { | ||
700 | set_pte(pte, __pte(0)); | ||
701 | |||
702 | start += PAGE_SIZE; | ||
703 | pte++; | ||
704 | } | ||
705 | |||
706 | if (try_to_free_pte_page((pte_t *)pmd_page_vaddr(*pmd))) { | ||
707 | pmd_clear(pmd); | ||
708 | return true; | ||
709 | } | ||
710 | return false; | ||
711 | } | ||
712 | |||
713 | static void __unmap_pmd_range(pud_t *pud, pmd_t *pmd, | ||
714 | unsigned long start, unsigned long end) | ||
715 | { | ||
716 | if (unmap_pte_range(pmd, start, end)) | ||
717 | if (try_to_free_pmd_page((pmd_t *)pud_page_vaddr(*pud))) | ||
718 | pud_clear(pud); | ||
719 | } | ||
720 | |||
721 | static void unmap_pmd_range(pud_t *pud, unsigned long start, unsigned long end) | ||
722 | { | ||
723 | pmd_t *pmd = pmd_offset(pud, start); | ||
724 | |||
725 | /* | ||
726 | * Not on a 2MB page boundary? | ||
727 | */ | ||
728 | if (start & (PMD_SIZE - 1)) { | ||
729 | unsigned long next_page = (start + PMD_SIZE) & PMD_MASK; | ||
730 | unsigned long pre_end = min_t(unsigned long, end, next_page); | ||
731 | |||
732 | __unmap_pmd_range(pud, pmd, start, pre_end); | ||
733 | |||
734 | start = pre_end; | ||
735 | pmd++; | ||
736 | } | ||
737 | |||
738 | /* | ||
739 | * Try to unmap in 2M chunks. | ||
740 | */ | ||
741 | while (end - start >= PMD_SIZE) { | ||
742 | if (pmd_large(*pmd)) | ||
743 | pmd_clear(pmd); | ||
744 | else | ||
745 | __unmap_pmd_range(pud, pmd, start, start + PMD_SIZE); | ||
746 | |||
747 | start += PMD_SIZE; | ||
748 | pmd++; | ||
749 | } | ||
750 | |||
751 | /* | ||
752 | * 4K leftovers? | ||
753 | */ | ||
754 | if (start < end) | ||
755 | return __unmap_pmd_range(pud, pmd, start, end); | ||
756 | |||
757 | /* | ||
758 | * Try again to free the PMD page if haven't succeeded above. | ||
759 | */ | ||
760 | if (!pud_none(*pud)) | ||
761 | if (try_to_free_pmd_page((pmd_t *)pud_page_vaddr(*pud))) | ||
762 | pud_clear(pud); | ||
763 | } | ||
764 | |||
765 | static void unmap_pud_range(pgd_t *pgd, unsigned long start, unsigned long end) | ||
766 | { | ||
767 | pud_t *pud = pud_offset(pgd, start); | ||
768 | |||
769 | /* | ||
770 | * Not on a GB page boundary? | ||
771 | */ | ||
772 | if (start & (PUD_SIZE - 1)) { | ||
773 | unsigned long next_page = (start + PUD_SIZE) & PUD_MASK; | ||
774 | unsigned long pre_end = min_t(unsigned long, end, next_page); | ||
775 | |||
776 | unmap_pmd_range(pud, start, pre_end); | ||
777 | |||
778 | start = pre_end; | ||
779 | pud++; | ||
780 | } | ||
781 | |||
782 | /* | ||
783 | * Try to unmap in 1G chunks? | ||
784 | */ | ||
785 | while (end - start >= PUD_SIZE) { | ||
786 | |||
787 | if (pud_large(*pud)) | ||
788 | pud_clear(pud); | ||
789 | else | ||
790 | unmap_pmd_range(pud, start, start + PUD_SIZE); | ||
791 | |||
792 | start += PUD_SIZE; | ||
793 | pud++; | ||
794 | } | ||
795 | |||
796 | /* | ||
797 | * 2M leftovers? | ||
798 | */ | ||
799 | if (start < end) | ||
800 | unmap_pmd_range(pud, start, end); | ||
801 | |||
802 | /* | ||
803 | * No need to try to free the PUD page because we'll free it in | ||
804 | * populate_pgd's error path | ||
805 | */ | ||
806 | } | ||
807 | |||
808 | static int alloc_pte_page(pmd_t *pmd) | ||
809 | { | ||
810 | pte_t *pte = (pte_t *)get_zeroed_page(GFP_KERNEL | __GFP_NOTRACK); | ||
811 | if (!pte) | ||
812 | return -1; | ||
813 | |||
814 | set_pmd(pmd, __pmd(__pa(pte) | _KERNPG_TABLE)); | ||
815 | return 0; | ||
816 | } | ||
817 | |||
818 | static int alloc_pmd_page(pud_t *pud) | ||
819 | { | ||
820 | pmd_t *pmd = (pmd_t *)get_zeroed_page(GFP_KERNEL | __GFP_NOTRACK); | ||
821 | if (!pmd) | ||
822 | return -1; | ||
823 | |||
824 | set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE)); | ||
825 | return 0; | ||
826 | } | ||
827 | |||
828 | static void populate_pte(struct cpa_data *cpa, | ||
829 | unsigned long start, unsigned long end, | ||
830 | unsigned num_pages, pmd_t *pmd, pgprot_t pgprot) | ||
831 | { | ||
832 | pte_t *pte; | ||
833 | |||
834 | pte = pte_offset_kernel(pmd, start); | ||
835 | |||
836 | while (num_pages-- && start < end) { | ||
837 | |||
838 | /* deal with the NX bit */ | ||
839 | if (!(pgprot_val(pgprot) & _PAGE_NX)) | ||
840 | cpa->pfn &= ~_PAGE_NX; | ||
841 | |||
842 | set_pte(pte, pfn_pte(cpa->pfn >> PAGE_SHIFT, pgprot)); | ||
843 | |||
844 | start += PAGE_SIZE; | ||
845 | cpa->pfn += PAGE_SIZE; | ||
846 | pte++; | ||
847 | } | ||
848 | } | ||
849 | |||
850 | static int populate_pmd(struct cpa_data *cpa, | ||
851 | unsigned long start, unsigned long end, | ||
852 | unsigned num_pages, pud_t *pud, pgprot_t pgprot) | ||
853 | { | ||
854 | unsigned int cur_pages = 0; | ||
855 | pmd_t *pmd; | ||
856 | |||
857 | /* | ||
858 | * Not on a 2M boundary? | ||
859 | */ | ||
860 | if (start & (PMD_SIZE - 1)) { | ||
861 | unsigned long pre_end = start + (num_pages << PAGE_SHIFT); | ||
862 | unsigned long next_page = (start + PMD_SIZE) & PMD_MASK; | ||
863 | |||
864 | pre_end = min_t(unsigned long, pre_end, next_page); | ||
865 | cur_pages = (pre_end - start) >> PAGE_SHIFT; | ||
866 | cur_pages = min_t(unsigned int, num_pages, cur_pages); | ||
867 | |||
868 | /* | ||
869 | * Need a PTE page? | ||
870 | */ | ||
871 | pmd = pmd_offset(pud, start); | ||
872 | if (pmd_none(*pmd)) | ||
873 | if (alloc_pte_page(pmd)) | ||
874 | return -1; | ||
875 | |||
876 | populate_pte(cpa, start, pre_end, cur_pages, pmd, pgprot); | ||
877 | |||
878 | start = pre_end; | ||
879 | } | ||
880 | |||
881 | /* | ||
882 | * We mapped them all? | ||
883 | */ | ||
884 | if (num_pages == cur_pages) | ||
885 | return cur_pages; | ||
886 | |||
887 | while (end - start >= PMD_SIZE) { | ||
888 | |||
889 | /* | ||
890 | * We cannot use a 1G page so allocate a PMD page if needed. | ||
891 | */ | ||
892 | if (pud_none(*pud)) | ||
893 | if (alloc_pmd_page(pud)) | ||
894 | return -1; | ||
895 | |||
896 | pmd = pmd_offset(pud, start); | ||
897 | |||
898 | set_pmd(pmd, __pmd(cpa->pfn | _PAGE_PSE | massage_pgprot(pgprot))); | ||
899 | |||
900 | start += PMD_SIZE; | ||
901 | cpa->pfn += PMD_SIZE; | ||
902 | cur_pages += PMD_SIZE >> PAGE_SHIFT; | ||
903 | } | ||
904 | |||
905 | /* | ||
906 | * Map trailing 4K pages. | ||
907 | */ | ||
908 | if (start < end) { | ||
909 | pmd = pmd_offset(pud, start); | ||
910 | if (pmd_none(*pmd)) | ||
911 | if (alloc_pte_page(pmd)) | ||
912 | return -1; | ||
913 | |||
914 | populate_pte(cpa, start, end, num_pages - cur_pages, | ||
915 | pmd, pgprot); | ||
916 | } | ||
917 | return num_pages; | ||
918 | } | ||
919 | |||
920 | static int populate_pud(struct cpa_data *cpa, unsigned long start, pgd_t *pgd, | ||
921 | pgprot_t pgprot) | ||
922 | { | ||
923 | pud_t *pud; | ||
924 | unsigned long end; | ||
925 | int cur_pages = 0; | ||
926 | |||
927 | end = start + (cpa->numpages << PAGE_SHIFT); | ||
928 | |||
929 | /* | ||
930 | * Not on a Gb page boundary? => map everything up to it with | ||
931 | * smaller pages. | ||
932 | */ | ||
933 | if (start & (PUD_SIZE - 1)) { | ||
934 | unsigned long pre_end; | ||
935 | unsigned long next_page = (start + PUD_SIZE) & PUD_MASK; | ||
936 | |||
937 | pre_end = min_t(unsigned long, end, next_page); | ||
938 | cur_pages = (pre_end - start) >> PAGE_SHIFT; | ||
939 | cur_pages = min_t(int, (int)cpa->numpages, cur_pages); | ||
940 | |||
941 | pud = pud_offset(pgd, start); | ||
942 | |||
943 | /* | ||
944 | * Need a PMD page? | ||
945 | */ | ||
946 | if (pud_none(*pud)) | ||
947 | if (alloc_pmd_page(pud)) | ||
948 | return -1; | ||
949 | |||
950 | cur_pages = populate_pmd(cpa, start, pre_end, cur_pages, | ||
951 | pud, pgprot); | ||
952 | if (cur_pages < 0) | ||
953 | return cur_pages; | ||
954 | |||
955 | start = pre_end; | ||
956 | } | ||
957 | |||
958 | /* We mapped them all? */ | ||
959 | if (cpa->numpages == cur_pages) | ||
960 | return cur_pages; | ||
961 | |||
962 | pud = pud_offset(pgd, start); | ||
963 | |||
964 | /* | ||
965 | * Map everything starting from the Gb boundary, possibly with 1G pages | ||
966 | */ | ||
967 | while (end - start >= PUD_SIZE) { | ||
968 | set_pud(pud, __pud(cpa->pfn | _PAGE_PSE | massage_pgprot(pgprot))); | ||
969 | |||
970 | start += PUD_SIZE; | ||
971 | cpa->pfn += PUD_SIZE; | ||
972 | cur_pages += PUD_SIZE >> PAGE_SHIFT; | ||
973 | pud++; | ||
974 | } | ||
975 | |||
976 | /* Map trailing leftover */ | ||
977 | if (start < end) { | ||
978 | int tmp; | ||
979 | |||
980 | pud = pud_offset(pgd, start); | ||
981 | if (pud_none(*pud)) | ||
982 | if (alloc_pmd_page(pud)) | ||
983 | return -1; | ||
984 | |||
985 | tmp = populate_pmd(cpa, start, end, cpa->numpages - cur_pages, | ||
986 | pud, pgprot); | ||
987 | if (tmp < 0) | ||
988 | return cur_pages; | ||
989 | |||
990 | cur_pages += tmp; | ||
991 | } | ||
992 | return cur_pages; | ||
993 | } | ||
994 | |||
995 | /* | ||
996 | * Restrictions for kernel page table do not necessarily apply when mapping in | ||
997 | * an alternate PGD. | ||
998 | */ | ||
999 | static int populate_pgd(struct cpa_data *cpa, unsigned long addr) | ||
1000 | { | ||
1001 | pgprot_t pgprot = __pgprot(_KERNPG_TABLE); | ||
1002 | bool allocd_pgd = false; | ||
1003 | pgd_t *pgd_entry; | ||
1004 | pud_t *pud = NULL; /* shut up gcc */ | ||
1005 | int ret; | ||
1006 | |||
1007 | pgd_entry = cpa->pgd + pgd_index(addr); | ||
1008 | |||
1009 | /* | ||
1010 | * Allocate a PUD page and hand it down for mapping. | ||
1011 | */ | ||
1012 | if (pgd_none(*pgd_entry)) { | ||
1013 | pud = (pud_t *)get_zeroed_page(GFP_KERNEL | __GFP_NOTRACK); | ||
1014 | if (!pud) | ||
1015 | return -1; | ||
1016 | |||
1017 | set_pgd(pgd_entry, __pgd(__pa(pud) | _KERNPG_TABLE)); | ||
1018 | allocd_pgd = true; | ||
1019 | } | ||
1020 | |||
1021 | pgprot_val(pgprot) &= ~pgprot_val(cpa->mask_clr); | ||
1022 | pgprot_val(pgprot) |= pgprot_val(cpa->mask_set); | ||
1023 | |||
1024 | ret = populate_pud(cpa, addr, pgd_entry, pgprot); | ||
1025 | if (ret < 0) { | ||
1026 | unmap_pud_range(pgd_entry, addr, | ||
1027 | addr + (cpa->numpages << PAGE_SHIFT)); | ||
1028 | |||
1029 | if (allocd_pgd) { | ||
1030 | /* | ||
1031 | * If I allocated this PUD page, I can just as well | ||
1032 | * free it in this error path. | ||
1033 | */ | ||
1034 | pgd_clear(pgd_entry); | ||
1035 | free_page((unsigned long)pud); | ||
1036 | } | ||
1037 | return ret; | ||
1038 | } | ||
1039 | cpa->numpages = ret; | ||
1040 | return 0; | ||
1041 | } | ||
1042 | |||
653 | static int __cpa_process_fault(struct cpa_data *cpa, unsigned long vaddr, | 1043 | static int __cpa_process_fault(struct cpa_data *cpa, unsigned long vaddr, |
654 | int primary) | 1044 | int primary) |
655 | { | 1045 | { |
1046 | if (cpa->pgd) | ||
1047 | return populate_pgd(cpa, vaddr); | ||
1048 | |||
656 | /* | 1049 | /* |
657 | * Ignore all non primary paths. | 1050 | * Ignore all non primary paths. |
658 | */ | 1051 | */ |
@@ -697,7 +1090,7 @@ static int __change_page_attr(struct cpa_data *cpa, int primary) | |||
697 | else | 1090 | else |
698 | address = *cpa->vaddr; | 1091 | address = *cpa->vaddr; |
699 | repeat: | 1092 | repeat: |
700 | kpte = lookup_address(address, &level); | 1093 | kpte = _lookup_address_cpa(cpa, address, &level); |
701 | if (!kpte) | 1094 | if (!kpte) |
702 | return __cpa_process_fault(cpa, address, primary); | 1095 | return __cpa_process_fault(cpa, address, primary); |
703 | 1096 | ||
@@ -761,7 +1154,7 @@ repeat: | |||
761 | /* | 1154 | /* |
762 | * We have to split the large page: | 1155 | * We have to split the large page: |
763 | */ | 1156 | */ |
764 | err = split_large_page(kpte, address); | 1157 | err = split_large_page(cpa, kpte, address); |
765 | if (!err) { | 1158 | if (!err) { |
766 | /* | 1159 | /* |
767 | * Do a global flush tlb after splitting the large page | 1160 | * Do a global flush tlb after splitting the large page |
@@ -910,6 +1303,8 @@ static int change_page_attr_set_clr(unsigned long *addr, int numpages, | |||
910 | int ret, cache, checkalias; | 1303 | int ret, cache, checkalias; |
911 | unsigned long baddr = 0; | 1304 | unsigned long baddr = 0; |
912 | 1305 | ||
1306 | memset(&cpa, 0, sizeof(cpa)); | ||
1307 | |||
913 | /* | 1308 | /* |
914 | * Check, if we are requested to change a not supported | 1309 | * Check, if we are requested to change a not supported |
915 | * feature: | 1310 | * feature: |
@@ -1356,6 +1751,7 @@ static int __set_pages_p(struct page *page, int numpages) | |||
1356 | { | 1751 | { |
1357 | unsigned long tempaddr = (unsigned long) page_address(page); | 1752 | unsigned long tempaddr = (unsigned long) page_address(page); |
1358 | struct cpa_data cpa = { .vaddr = &tempaddr, | 1753 | struct cpa_data cpa = { .vaddr = &tempaddr, |
1754 | .pgd = NULL, | ||
1359 | .numpages = numpages, | 1755 | .numpages = numpages, |
1360 | .mask_set = __pgprot(_PAGE_PRESENT | _PAGE_RW), | 1756 | .mask_set = __pgprot(_PAGE_PRESENT | _PAGE_RW), |
1361 | .mask_clr = __pgprot(0), | 1757 | .mask_clr = __pgprot(0), |
@@ -1374,6 +1770,7 @@ static int __set_pages_np(struct page *page, int numpages) | |||
1374 | { | 1770 | { |
1375 | unsigned long tempaddr = (unsigned long) page_address(page); | 1771 | unsigned long tempaddr = (unsigned long) page_address(page); |
1376 | struct cpa_data cpa = { .vaddr = &tempaddr, | 1772 | struct cpa_data cpa = { .vaddr = &tempaddr, |
1773 | .pgd = NULL, | ||
1377 | .numpages = numpages, | 1774 | .numpages = numpages, |
1378 | .mask_set = __pgprot(0), | 1775 | .mask_set = __pgprot(0), |
1379 | .mask_clr = __pgprot(_PAGE_PRESENT | _PAGE_RW), | 1776 | .mask_clr = __pgprot(_PAGE_PRESENT | _PAGE_RW), |
@@ -1434,6 +1831,36 @@ bool kernel_page_present(struct page *page) | |||
1434 | 1831 | ||
1435 | #endif /* CONFIG_DEBUG_PAGEALLOC */ | 1832 | #endif /* CONFIG_DEBUG_PAGEALLOC */ |
1436 | 1833 | ||
1834 | int kernel_map_pages_in_pgd(pgd_t *pgd, u64 pfn, unsigned long address, | ||
1835 | unsigned numpages, unsigned long page_flags) | ||
1836 | { | ||
1837 | int retval = -EINVAL; | ||
1838 | |||
1839 | struct cpa_data cpa = { | ||
1840 | .vaddr = &address, | ||
1841 | .pfn = pfn, | ||
1842 | .pgd = pgd, | ||
1843 | .numpages = numpages, | ||
1844 | .mask_set = __pgprot(0), | ||
1845 | .mask_clr = __pgprot(0), | ||
1846 | .flags = 0, | ||
1847 | }; | ||
1848 | |||
1849 | if (!(__supported_pte_mask & _PAGE_NX)) | ||
1850 | goto out; | ||
1851 | |||
1852 | if (!(page_flags & _PAGE_NX)) | ||
1853 | cpa.mask_clr = __pgprot(_PAGE_NX); | ||
1854 | |||
1855 | cpa.mask_set = __pgprot(_PAGE_PRESENT | page_flags); | ||
1856 | |||
1857 | retval = __change_page_attr_set_clr(&cpa, 0); | ||
1858 | __flush_tlb_all(); | ||
1859 | |||
1860 | out: | ||
1861 | return retval; | ||
1862 | } | ||
1863 | |||
1437 | /* | 1864 | /* |
1438 | * The testcases use internal knowledge of the implementation that shouldn't | 1865 | * The testcases use internal knowledge of the implementation that shouldn't |
1439 | * be exposed to the rest of the kernel. Include these directly here. | 1866 | * be exposed to the rest of the kernel. Include these directly here. |
diff --git a/arch/x86/mm/srat.c b/arch/x86/mm/srat.c index 266ca912f62e..1a25187e151e 100644 --- a/arch/x86/mm/srat.c +++ b/arch/x86/mm/srat.c | |||
@@ -181,6 +181,11 @@ acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma) | |||
181 | (unsigned long long) start, (unsigned long long) end - 1, | 181 | (unsigned long long) start, (unsigned long long) end - 1, |
182 | hotpluggable ? " hotplug" : ""); | 182 | hotpluggable ? " hotplug" : ""); |
183 | 183 | ||
184 | /* Mark hotplug range in memblock. */ | ||
185 | if (hotpluggable && memblock_mark_hotplug(start, ma->length)) | ||
186 | pr_warn("SRAT: Failed to mark hotplug range [mem %#010Lx-%#010Lx] in memblock\n", | ||
187 | (unsigned long long)start, (unsigned long long)end - 1); | ||
188 | |||
184 | return 0; | 189 | return 0; |
185 | out_err_bad_srat: | 190 | out_err_bad_srat: |
186 | bad_srat(); | 191 | bad_srat(); |
diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c index 26328e800869..4ed75dd81d05 100644 --- a/arch/x86/net/bpf_jit_comp.c +++ b/arch/x86/net/bpf_jit_comp.c | |||
@@ -359,15 +359,21 @@ void bpf_jit_compile(struct sk_filter *fp) | |||
359 | EMIT2(0x89, 0xd0); /* mov %edx,%eax */ | 359 | EMIT2(0x89, 0xd0); /* mov %edx,%eax */ |
360 | break; | 360 | break; |
361 | case BPF_S_ALU_MOD_K: /* A %= K; */ | 361 | case BPF_S_ALU_MOD_K: /* A %= K; */ |
362 | if (K == 1) { | ||
363 | CLEAR_A(); | ||
364 | break; | ||
365 | } | ||
362 | EMIT2(0x31, 0xd2); /* xor %edx,%edx */ | 366 | EMIT2(0x31, 0xd2); /* xor %edx,%edx */ |
363 | EMIT1(0xb9);EMIT(K, 4); /* mov imm32,%ecx */ | 367 | EMIT1(0xb9);EMIT(K, 4); /* mov imm32,%ecx */ |
364 | EMIT2(0xf7, 0xf1); /* div %ecx */ | 368 | EMIT2(0xf7, 0xf1); /* div %ecx */ |
365 | EMIT2(0x89, 0xd0); /* mov %edx,%eax */ | 369 | EMIT2(0x89, 0xd0); /* mov %edx,%eax */ |
366 | break; | 370 | break; |
367 | case BPF_S_ALU_DIV_K: /* A = reciprocal_divide(A, K); */ | 371 | case BPF_S_ALU_DIV_K: /* A /= K */ |
368 | EMIT3(0x48, 0x69, 0xc0); /* imul imm32,%rax,%rax */ | 372 | if (K == 1) |
369 | EMIT(K, 4); | 373 | break; |
370 | EMIT4(0x48, 0xc1, 0xe8, 0x20); /* shr $0x20,%rax */ | 374 | EMIT2(0x31, 0xd2); /* xor %edx,%edx */ |
375 | EMIT1(0xb9);EMIT(K, 4); /* mov imm32,%ecx */ | ||
376 | EMIT2(0xf7, 0xf1); /* div %ecx */ | ||
371 | break; | 377 | break; |
372 | case BPF_S_ALU_AND_X: | 378 | case BPF_S_ALU_AND_X: |
373 | seen |= SEEN_XREG; | 379 | seen |= SEEN_XREG; |
diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c index b046e070e088..bca9e85daaa5 100644 --- a/arch/x86/pci/fixup.c +++ b/arch/x86/pci/fixup.c | |||
@@ -5,7 +5,6 @@ | |||
5 | #include <linux/delay.h> | 5 | #include <linux/delay.h> |
6 | #include <linux/dmi.h> | 6 | #include <linux/dmi.h> |
7 | #include <linux/pci.h> | 7 | #include <linux/pci.h> |
8 | #include <linux/init.h> | ||
9 | #include <linux/vgaarb.h> | 8 | #include <linux/vgaarb.h> |
10 | #include <asm/pci_x86.h> | 9 | #include <asm/pci_x86.h> |
11 | 10 | ||
diff --git a/arch/x86/pci/intel_mid_pci.c b/arch/x86/pci/intel_mid_pci.c index 51384ca727ad..84b9d672843d 100644 --- a/arch/x86/pci/intel_mid_pci.c +++ b/arch/x86/pci/intel_mid_pci.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <asm/pci_x86.h> | 31 | #include <asm/pci_x86.h> |
32 | #include <asm/hw_irq.h> | 32 | #include <asm/hw_irq.h> |
33 | #include <asm/io_apic.h> | 33 | #include <asm/io_apic.h> |
34 | #include <asm/intel-mid.h> | ||
34 | 35 | ||
35 | #define PCIE_CAP_OFFSET 0x100 | 36 | #define PCIE_CAP_OFFSET 0x100 |
36 | 37 | ||
@@ -219,7 +220,10 @@ static int intel_mid_pci_irq_enable(struct pci_dev *dev) | |||
219 | irq_attr.ioapic = mp_find_ioapic(dev->irq); | 220 | irq_attr.ioapic = mp_find_ioapic(dev->irq); |
220 | irq_attr.ioapic_pin = dev->irq; | 221 | irq_attr.ioapic_pin = dev->irq; |
221 | irq_attr.trigger = 1; /* level */ | 222 | irq_attr.trigger = 1; /* level */ |
222 | irq_attr.polarity = 1; /* active low */ | 223 | if (intel_mid_identify_cpu() == INTEL_MID_CPU_CHIP_TANGIER) |
224 | irq_attr.polarity = 0; /* active high */ | ||
225 | else | ||
226 | irq_attr.polarity = 1; /* active low */ | ||
223 | io_apic_set_pci_routing(&dev->dev, dev->irq, &irq_attr); | 227 | io_apic_set_pci_routing(&dev->dev, dev->irq, &irq_attr); |
224 | 228 | ||
225 | return 0; | 229 | return 0; |
diff --git a/arch/x86/platform/efi/early_printk.c b/arch/x86/platform/efi/early_printk.c index 6599a0027b76..81b506d5befd 100644 --- a/arch/x86/platform/efi/early_printk.c +++ b/arch/x86/platform/efi/early_printk.c | |||
@@ -142,7 +142,7 @@ early_efi_write(struct console *con, const char *str, unsigned int num) | |||
142 | efi_y += font->height; | 142 | efi_y += font->height; |
143 | } | 143 | } |
144 | 144 | ||
145 | if (efi_y + font->height >= si->lfb_height) { | 145 | if (efi_y + font->height > si->lfb_height) { |
146 | u32 i; | 146 | u32 i; |
147 | 147 | ||
148 | efi_y -= font->height; | 148 | efi_y -= font->height; |
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c index 92c02344a060..d62ec87a2b26 100644 --- a/arch/x86/platform/efi/efi.c +++ b/arch/x86/platform/efi/efi.c | |||
@@ -12,6 +12,8 @@ | |||
12 | * Bibo Mao <bibo.mao@intel.com> | 12 | * Bibo Mao <bibo.mao@intel.com> |
13 | * Chandramouli Narayanan <mouli@linux.intel.com> | 13 | * Chandramouli Narayanan <mouli@linux.intel.com> |
14 | * Huang Ying <ying.huang@intel.com> | 14 | * Huang Ying <ying.huang@intel.com> |
15 | * Copyright (C) 2013 SuSE Labs | ||
16 | * Borislav Petkov <bp@suse.de> - runtime services VA mapping | ||
15 | * | 17 | * |
16 | * Copied from efi_32.c to eliminate the duplicated code between EFI | 18 | * Copied from efi_32.c to eliminate the duplicated code between EFI |
17 | * 32/64 support code. --ying 2007-10-26 | 19 | * 32/64 support code. --ying 2007-10-26 |
@@ -51,7 +53,7 @@ | |||
51 | #include <asm/x86_init.h> | 53 | #include <asm/x86_init.h> |
52 | #include <asm/rtc.h> | 54 | #include <asm/rtc.h> |
53 | 55 | ||
54 | #define EFI_DEBUG 1 | 56 | #define EFI_DEBUG |
55 | 57 | ||
56 | #define EFI_MIN_RESERVE 5120 | 58 | #define EFI_MIN_RESERVE 5120 |
57 | 59 | ||
@@ -74,6 +76,8 @@ static __initdata efi_config_table_type_t arch_tables[] = { | |||
74 | {NULL_GUID, NULL, NULL}, | 76 | {NULL_GUID, NULL, NULL}, |
75 | }; | 77 | }; |
76 | 78 | ||
79 | u64 efi_setup; /* efi setup_data physical address */ | ||
80 | |||
77 | /* | 81 | /* |
78 | * Returns 1 if 'facility' is enabled, 0 otherwise. | 82 | * Returns 1 if 'facility' is enabled, 0 otherwise. |
79 | */ | 83 | */ |
@@ -110,7 +114,6 @@ static int __init setup_storage_paranoia(char *arg) | |||
110 | } | 114 | } |
111 | early_param("efi_no_storage_paranoia", setup_storage_paranoia); | 115 | early_param("efi_no_storage_paranoia", setup_storage_paranoia); |
112 | 116 | ||
113 | |||
114 | static efi_status_t virt_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc) | 117 | static efi_status_t virt_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc) |
115 | { | 118 | { |
116 | unsigned long flags; | 119 | unsigned long flags; |
@@ -398,9 +401,9 @@ int __init efi_memblock_x86_reserve_range(void) | |||
398 | return 0; | 401 | return 0; |
399 | } | 402 | } |
400 | 403 | ||
401 | #if EFI_DEBUG | ||
402 | static void __init print_efi_memmap(void) | 404 | static void __init print_efi_memmap(void) |
403 | { | 405 | { |
406 | #ifdef EFI_DEBUG | ||
404 | efi_memory_desc_t *md; | 407 | efi_memory_desc_t *md; |
405 | void *p; | 408 | void *p; |
406 | int i; | 409 | int i; |
@@ -415,8 +418,8 @@ static void __init print_efi_memmap(void) | |||
415 | md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT), | 418 | md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT), |
416 | (md->num_pages >> (20 - EFI_PAGE_SHIFT))); | 419 | (md->num_pages >> (20 - EFI_PAGE_SHIFT))); |
417 | } | 420 | } |
418 | } | ||
419 | #endif /* EFI_DEBUG */ | 421 | #endif /* EFI_DEBUG */ |
422 | } | ||
420 | 423 | ||
421 | void __init efi_reserve_boot_services(void) | 424 | void __init efi_reserve_boot_services(void) |
422 | { | 425 | { |
@@ -436,7 +439,7 @@ void __init efi_reserve_boot_services(void) | |||
436 | * - Not within any part of the kernel | 439 | * - Not within any part of the kernel |
437 | * - Not the bios reserved area | 440 | * - Not the bios reserved area |
438 | */ | 441 | */ |
439 | if ((start+size >= __pa_symbol(_text) | 442 | if ((start + size > __pa_symbol(_text) |
440 | && start <= __pa_symbol(_end)) || | 443 | && start <= __pa_symbol(_end)) || |
441 | !e820_all_mapped(start, start+size, E820_RAM) || | 444 | !e820_all_mapped(start, start+size, E820_RAM) || |
442 | memblock_is_region_reserved(start, size)) { | 445 | memblock_is_region_reserved(start, size)) { |
@@ -489,18 +492,27 @@ static int __init efi_systab_init(void *phys) | |||
489 | { | 492 | { |
490 | if (efi_enabled(EFI_64BIT)) { | 493 | if (efi_enabled(EFI_64BIT)) { |
491 | efi_system_table_64_t *systab64; | 494 | efi_system_table_64_t *systab64; |
495 | struct efi_setup_data *data = NULL; | ||
492 | u64 tmp = 0; | 496 | u64 tmp = 0; |
493 | 497 | ||
498 | if (efi_setup) { | ||
499 | data = early_memremap(efi_setup, sizeof(*data)); | ||
500 | if (!data) | ||
501 | return -ENOMEM; | ||
502 | } | ||
494 | systab64 = early_ioremap((unsigned long)phys, | 503 | systab64 = early_ioremap((unsigned long)phys, |
495 | sizeof(*systab64)); | 504 | sizeof(*systab64)); |
496 | if (systab64 == NULL) { | 505 | if (systab64 == NULL) { |
497 | pr_err("Couldn't map the system table!\n"); | 506 | pr_err("Couldn't map the system table!\n"); |
507 | if (data) | ||
508 | early_iounmap(data, sizeof(*data)); | ||
498 | return -ENOMEM; | 509 | return -ENOMEM; |
499 | } | 510 | } |
500 | 511 | ||
501 | efi_systab.hdr = systab64->hdr; | 512 | efi_systab.hdr = systab64->hdr; |
502 | efi_systab.fw_vendor = systab64->fw_vendor; | 513 | efi_systab.fw_vendor = data ? (unsigned long)data->fw_vendor : |
503 | tmp |= systab64->fw_vendor; | 514 | systab64->fw_vendor; |
515 | tmp |= data ? data->fw_vendor : systab64->fw_vendor; | ||
504 | efi_systab.fw_revision = systab64->fw_revision; | 516 | efi_systab.fw_revision = systab64->fw_revision; |
505 | efi_systab.con_in_handle = systab64->con_in_handle; | 517 | efi_systab.con_in_handle = systab64->con_in_handle; |
506 | tmp |= systab64->con_in_handle; | 518 | tmp |= systab64->con_in_handle; |
@@ -514,15 +526,20 @@ static int __init efi_systab_init(void *phys) | |||
514 | tmp |= systab64->stderr_handle; | 526 | tmp |= systab64->stderr_handle; |
515 | efi_systab.stderr = systab64->stderr; | 527 | efi_systab.stderr = systab64->stderr; |
516 | tmp |= systab64->stderr; | 528 | tmp |= systab64->stderr; |
517 | efi_systab.runtime = (void *)(unsigned long)systab64->runtime; | 529 | efi_systab.runtime = data ? |
518 | tmp |= systab64->runtime; | 530 | (void *)(unsigned long)data->runtime : |
531 | (void *)(unsigned long)systab64->runtime; | ||
532 | tmp |= data ? data->runtime : systab64->runtime; | ||
519 | efi_systab.boottime = (void *)(unsigned long)systab64->boottime; | 533 | efi_systab.boottime = (void *)(unsigned long)systab64->boottime; |
520 | tmp |= systab64->boottime; | 534 | tmp |= systab64->boottime; |
521 | efi_systab.nr_tables = systab64->nr_tables; | 535 | efi_systab.nr_tables = systab64->nr_tables; |
522 | efi_systab.tables = systab64->tables; | 536 | efi_systab.tables = data ? (unsigned long)data->tables : |
523 | tmp |= systab64->tables; | 537 | systab64->tables; |
538 | tmp |= data ? data->tables : systab64->tables; | ||
524 | 539 | ||
525 | early_iounmap(systab64, sizeof(*systab64)); | 540 | early_iounmap(systab64, sizeof(*systab64)); |
541 | if (data) | ||
542 | early_iounmap(data, sizeof(*data)); | ||
526 | #ifdef CONFIG_X86_32 | 543 | #ifdef CONFIG_X86_32 |
527 | if (tmp >> 32) { | 544 | if (tmp >> 32) { |
528 | pr_err("EFI data located above 4GB, disabling EFI.\n"); | 545 | pr_err("EFI data located above 4GB, disabling EFI.\n"); |
@@ -626,6 +643,62 @@ static int __init efi_memmap_init(void) | |||
626 | return 0; | 643 | return 0; |
627 | } | 644 | } |
628 | 645 | ||
646 | /* | ||
647 | * A number of config table entries get remapped to virtual addresses | ||
648 | * after entering EFI virtual mode. However, the kexec kernel requires | ||
649 | * their physical addresses therefore we pass them via setup_data and | ||
650 | * correct those entries to their respective physical addresses here. | ||
651 | * | ||
652 | * Currently only handles smbios which is necessary for some firmware | ||
653 | * implementation. | ||
654 | */ | ||
655 | static int __init efi_reuse_config(u64 tables, int nr_tables) | ||
656 | { | ||
657 | int i, sz, ret = 0; | ||
658 | void *p, *tablep; | ||
659 | struct efi_setup_data *data; | ||
660 | |||
661 | if (!efi_setup) | ||
662 | return 0; | ||
663 | |||
664 | if (!efi_enabled(EFI_64BIT)) | ||
665 | return 0; | ||
666 | |||
667 | data = early_memremap(efi_setup, sizeof(*data)); | ||
668 | if (!data) { | ||
669 | ret = -ENOMEM; | ||
670 | goto out; | ||
671 | } | ||
672 | |||
673 | if (!data->smbios) | ||
674 | goto out_memremap; | ||
675 | |||
676 | sz = sizeof(efi_config_table_64_t); | ||
677 | |||
678 | p = tablep = early_memremap(tables, nr_tables * sz); | ||
679 | if (!p) { | ||
680 | pr_err("Could not map Configuration table!\n"); | ||
681 | ret = -ENOMEM; | ||
682 | goto out_memremap; | ||
683 | } | ||
684 | |||
685 | for (i = 0; i < efi.systab->nr_tables; i++) { | ||
686 | efi_guid_t guid; | ||
687 | |||
688 | guid = ((efi_config_table_64_t *)p)->guid; | ||
689 | |||
690 | if (!efi_guidcmp(guid, SMBIOS_TABLE_GUID)) | ||
691 | ((efi_config_table_64_t *)p)->table = data->smbios; | ||
692 | p += sz; | ||
693 | } | ||
694 | early_iounmap(tablep, nr_tables * sz); | ||
695 | |||
696 | out_memremap: | ||
697 | early_iounmap(data, sizeof(*data)); | ||
698 | out: | ||
699 | return ret; | ||
700 | } | ||
701 | |||
629 | void __init efi_init(void) | 702 | void __init efi_init(void) |
630 | { | 703 | { |
631 | efi_char16_t *c16; | 704 | efi_char16_t *c16; |
@@ -651,6 +724,10 @@ void __init efi_init(void) | |||
651 | 724 | ||
652 | set_bit(EFI_SYSTEM_TABLES, &x86_efi_facility); | 725 | set_bit(EFI_SYSTEM_TABLES, &x86_efi_facility); |
653 | 726 | ||
727 | efi.config_table = (unsigned long)efi.systab->tables; | ||
728 | efi.fw_vendor = (unsigned long)efi.systab->fw_vendor; | ||
729 | efi.runtime = (unsigned long)efi.systab->runtime; | ||
730 | |||
654 | /* | 731 | /* |
655 | * Show what we know for posterity | 732 | * Show what we know for posterity |
656 | */ | 733 | */ |
@@ -667,6 +744,9 @@ void __init efi_init(void) | |||
667 | efi.systab->hdr.revision >> 16, | 744 | efi.systab->hdr.revision >> 16, |
668 | efi.systab->hdr.revision & 0xffff, vendor); | 745 | efi.systab->hdr.revision & 0xffff, vendor); |
669 | 746 | ||
747 | if (efi_reuse_config(efi.systab->tables, efi.systab->nr_tables)) | ||
748 | return; | ||
749 | |||
670 | if (efi_config_init(arch_tables)) | 750 | if (efi_config_init(arch_tables)) |
671 | return; | 751 | return; |
672 | 752 | ||
@@ -684,22 +764,12 @@ void __init efi_init(void) | |||
684 | return; | 764 | return; |
685 | set_bit(EFI_RUNTIME_SERVICES, &x86_efi_facility); | 765 | set_bit(EFI_RUNTIME_SERVICES, &x86_efi_facility); |
686 | } | 766 | } |
687 | |||
688 | if (efi_memmap_init()) | 767 | if (efi_memmap_init()) |
689 | return; | 768 | return; |
690 | 769 | ||
691 | set_bit(EFI_MEMMAP, &x86_efi_facility); | 770 | set_bit(EFI_MEMMAP, &x86_efi_facility); |
692 | 771 | ||
693 | #ifdef CONFIG_X86_32 | ||
694 | if (efi_is_native()) { | ||
695 | x86_platform.get_wallclock = efi_get_time; | ||
696 | x86_platform.set_wallclock = efi_set_rtc_mmss; | ||
697 | } | ||
698 | #endif | ||
699 | |||
700 | #if EFI_DEBUG | ||
701 | print_efi_memmap(); | 772 | print_efi_memmap(); |
702 | #endif | ||
703 | } | 773 | } |
704 | 774 | ||
705 | void __init efi_late_init(void) | 775 | void __init efi_late_init(void) |
@@ -748,36 +818,38 @@ void efi_memory_uc(u64 addr, unsigned long size) | |||
748 | set_memory_uc(addr, npages); | 818 | set_memory_uc(addr, npages); |
749 | } | 819 | } |
750 | 820 | ||
751 | /* | 821 | void __init old_map_region(efi_memory_desc_t *md) |
752 | * This function will switch the EFI runtime services to virtual mode. | ||
753 | * Essentially, look through the EFI memmap and map every region that | ||
754 | * has the runtime attribute bit set in its memory descriptor and update | ||
755 | * that memory descriptor with the virtual address obtained from ioremap(). | ||
756 | * This enables the runtime services to be called without having to | ||
757 | * thunk back into physical mode for every invocation. | ||
758 | */ | ||
759 | void __init efi_enter_virtual_mode(void) | ||
760 | { | 822 | { |
761 | efi_memory_desc_t *md, *prev_md = NULL; | 823 | u64 start_pfn, end_pfn, end; |
762 | efi_status_t status; | ||
763 | unsigned long size; | 824 | unsigned long size; |
764 | u64 end, systab, start_pfn, end_pfn; | 825 | void *va; |
765 | void *p, *va, *new_memmap = NULL; | ||
766 | int count = 0; | ||
767 | 826 | ||
768 | efi.systab = NULL; | 827 | start_pfn = PFN_DOWN(md->phys_addr); |
828 | size = md->num_pages << PAGE_SHIFT; | ||
829 | end = md->phys_addr + size; | ||
830 | end_pfn = PFN_UP(end); | ||
769 | 831 | ||
770 | /* | 832 | if (pfn_range_is_mapped(start_pfn, end_pfn)) { |
771 | * We don't do virtual mode, since we don't do runtime services, on | 833 | va = __va(md->phys_addr); |
772 | * non-native EFI | ||
773 | */ | ||
774 | 834 | ||
775 | if (!efi_is_native()) { | 835 | if (!(md->attribute & EFI_MEMORY_WB)) |
776 | efi_unmap_memmap(); | 836 | efi_memory_uc((u64)(unsigned long)va, size); |
777 | return; | 837 | } else |
778 | } | 838 | va = efi_ioremap(md->phys_addr, size, |
839 | md->type, md->attribute); | ||
840 | |||
841 | md->virt_addr = (u64) (unsigned long) va; | ||
842 | if (!va) | ||
843 | pr_err("ioremap of 0x%llX failed!\n", | ||
844 | (unsigned long long)md->phys_addr); | ||
845 | } | ||
846 | |||
847 | /* Merge contiguous regions of the same type and attribute */ | ||
848 | static void __init efi_merge_regions(void) | ||
849 | { | ||
850 | void *p; | ||
851 | efi_memory_desc_t *md, *prev_md = NULL; | ||
779 | 852 | ||
780 | /* Merge contiguous regions of the same type and attribute */ | ||
781 | for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { | 853 | for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { |
782 | u64 prev_size; | 854 | u64 prev_size; |
783 | md = p; | 855 | md = p; |
@@ -803,6 +875,77 @@ void __init efi_enter_virtual_mode(void) | |||
803 | } | 875 | } |
804 | prev_md = md; | 876 | prev_md = md; |
805 | } | 877 | } |
878 | } | ||
879 | |||
880 | static void __init get_systab_virt_addr(efi_memory_desc_t *md) | ||
881 | { | ||
882 | unsigned long size; | ||
883 | u64 end, systab; | ||
884 | |||
885 | size = md->num_pages << EFI_PAGE_SHIFT; | ||
886 | end = md->phys_addr + size; | ||
887 | systab = (u64)(unsigned long)efi_phys.systab; | ||
888 | if (md->phys_addr <= systab && systab < end) { | ||
889 | systab += md->virt_addr - md->phys_addr; | ||
890 | efi.systab = (efi_system_table_t *)(unsigned long)systab; | ||
891 | } | ||
892 | } | ||
893 | |||
894 | static int __init save_runtime_map(void) | ||
895 | { | ||
896 | efi_memory_desc_t *md; | ||
897 | void *tmp, *p, *q = NULL; | ||
898 | int count = 0; | ||
899 | |||
900 | for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { | ||
901 | md = p; | ||
902 | |||
903 | if (!(md->attribute & EFI_MEMORY_RUNTIME) || | ||
904 | (md->type == EFI_BOOT_SERVICES_CODE) || | ||
905 | (md->type == EFI_BOOT_SERVICES_DATA)) | ||
906 | continue; | ||
907 | tmp = krealloc(q, (count + 1) * memmap.desc_size, GFP_KERNEL); | ||
908 | if (!tmp) | ||
909 | goto out; | ||
910 | q = tmp; | ||
911 | |||
912 | memcpy(q + count * memmap.desc_size, md, memmap.desc_size); | ||
913 | count++; | ||
914 | } | ||
915 | |||
916 | efi_runtime_map_setup(q, count, memmap.desc_size); | ||
917 | |||
918 | return 0; | ||
919 | out: | ||
920 | kfree(q); | ||
921 | return -ENOMEM; | ||
922 | } | ||
923 | |||
924 | /* | ||
925 | * Map efi regions which were passed via setup_data. The virt_addr is a fixed | ||
926 | * addr which was used in first kernel of a kexec boot. | ||
927 | */ | ||
928 | static void __init efi_map_regions_fixed(void) | ||
929 | { | ||
930 | void *p; | ||
931 | efi_memory_desc_t *md; | ||
932 | |||
933 | for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { | ||
934 | md = p; | ||
935 | efi_map_region_fixed(md); /* FIXME: add error handling */ | ||
936 | get_systab_virt_addr(md); | ||
937 | } | ||
938 | |||
939 | } | ||
940 | |||
941 | /* | ||
942 | * Map efi memory ranges for runtime serivce and update new_memmap with virtual | ||
943 | * addresses. | ||
944 | */ | ||
945 | static void * __init efi_map_regions(int *count) | ||
946 | { | ||
947 | efi_memory_desc_t *md; | ||
948 | void *p, *tmp, *new_memmap = NULL; | ||
806 | 949 | ||
807 | for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { | 950 | for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { |
808 | md = p; | 951 | md = p; |
@@ -814,53 +957,95 @@ void __init efi_enter_virtual_mode(void) | |||
814 | continue; | 957 | continue; |
815 | } | 958 | } |
816 | 959 | ||
817 | size = md->num_pages << EFI_PAGE_SHIFT; | 960 | efi_map_region(md); |
818 | end = md->phys_addr + size; | 961 | get_systab_virt_addr(md); |
819 | 962 | ||
820 | start_pfn = PFN_DOWN(md->phys_addr); | 963 | tmp = krealloc(new_memmap, (*count + 1) * memmap.desc_size, |
821 | end_pfn = PFN_UP(end); | 964 | GFP_KERNEL); |
822 | if (pfn_range_is_mapped(start_pfn, end_pfn)) { | 965 | if (!tmp) |
823 | va = __va(md->phys_addr); | 966 | goto out; |
967 | new_memmap = tmp; | ||
968 | memcpy(new_memmap + (*count * memmap.desc_size), md, | ||
969 | memmap.desc_size); | ||
970 | (*count)++; | ||
971 | } | ||
824 | 972 | ||
825 | if (!(md->attribute & EFI_MEMORY_WB)) | 973 | return new_memmap; |
826 | efi_memory_uc((u64)(unsigned long)va, size); | 974 | out: |
827 | } else | 975 | kfree(new_memmap); |
828 | va = efi_ioremap(md->phys_addr, size, | 976 | return NULL; |
829 | md->type, md->attribute); | 977 | } |
978 | |||
979 | /* | ||
980 | * This function will switch the EFI runtime services to virtual mode. | ||
981 | * Essentially, we look through the EFI memmap and map every region that | ||
982 | * has the runtime attribute bit set in its memory descriptor into the | ||
983 | * ->trampoline_pgd page table using a top-down VA allocation scheme. | ||
984 | * | ||
985 | * The old method which used to update that memory descriptor with the | ||
986 | * virtual address obtained from ioremap() is still supported when the | ||
987 | * kernel is booted with efi=old_map on its command line. Same old | ||
988 | * method enabled the runtime services to be called without having to | ||
989 | * thunk back into physical mode for every invocation. | ||
990 | * | ||
991 | * The new method does a pagetable switch in a preemption-safe manner | ||
992 | * so that we're in a different address space when calling a runtime | ||
993 | * function. For function arguments passing we do copy the PGDs of the | ||
994 | * kernel page table into ->trampoline_pgd prior to each call. | ||
995 | * | ||
996 | * Specially for kexec boot, efi runtime maps in previous kernel should | ||
997 | * be passed in via setup_data. In that case runtime ranges will be mapped | ||
998 | * to the same virtual addresses as the first kernel. | ||
999 | */ | ||
1000 | void __init efi_enter_virtual_mode(void) | ||
1001 | { | ||
1002 | efi_status_t status; | ||
1003 | void *new_memmap = NULL; | ||
1004 | int err, count = 0; | ||
830 | 1005 | ||
831 | md->virt_addr = (u64) (unsigned long) va; | 1006 | efi.systab = NULL; |
832 | 1007 | ||
833 | if (!va) { | 1008 | /* |
834 | pr_err("ioremap of 0x%llX failed!\n", | 1009 | * We don't do virtual mode, since we don't do runtime services, on |
835 | (unsigned long long)md->phys_addr); | 1010 | * non-native EFI |
836 | continue; | 1011 | */ |
837 | } | 1012 | if (!efi_is_native()) { |
1013 | efi_unmap_memmap(); | ||
1014 | return; | ||
1015 | } | ||
838 | 1016 | ||
839 | systab = (u64) (unsigned long) efi_phys.systab; | 1017 | if (efi_setup) { |
840 | if (md->phys_addr <= systab && systab < end) { | 1018 | efi_map_regions_fixed(); |
841 | systab += md->virt_addr - md->phys_addr; | 1019 | } else { |
842 | efi.systab = (efi_system_table_t *) (unsigned long) systab; | 1020 | efi_merge_regions(); |
1021 | new_memmap = efi_map_regions(&count); | ||
1022 | if (!new_memmap) { | ||
1023 | pr_err("Error reallocating memory, EFI runtime non-functional!\n"); | ||
1024 | return; | ||
843 | } | 1025 | } |
844 | new_memmap = krealloc(new_memmap, | ||
845 | (count + 1) * memmap.desc_size, | ||
846 | GFP_KERNEL); | ||
847 | memcpy(new_memmap + (count * memmap.desc_size), md, | ||
848 | memmap.desc_size); | ||
849 | count++; | ||
850 | } | 1026 | } |
851 | 1027 | ||
1028 | err = save_runtime_map(); | ||
1029 | if (err) | ||
1030 | pr_err("Error saving runtime map, efi runtime on kexec non-functional!!\n"); | ||
1031 | |||
852 | BUG_ON(!efi.systab); | 1032 | BUG_ON(!efi.systab); |
853 | 1033 | ||
854 | status = phys_efi_set_virtual_address_map( | 1034 | efi_setup_page_tables(); |
855 | memmap.desc_size * count, | 1035 | efi_sync_low_kernel_mappings(); |
856 | memmap.desc_size, | ||
857 | memmap.desc_version, | ||
858 | (efi_memory_desc_t *)__pa(new_memmap)); | ||
859 | 1036 | ||
860 | if (status != EFI_SUCCESS) { | 1037 | if (!efi_setup) { |
861 | pr_alert("Unable to switch EFI into virtual mode " | 1038 | status = phys_efi_set_virtual_address_map( |
862 | "(status=%lx)!\n", status); | 1039 | memmap.desc_size * count, |
863 | panic("EFI call to SetVirtualAddressMap() failed!"); | 1040 | memmap.desc_size, |
1041 | memmap.desc_version, | ||
1042 | (efi_memory_desc_t *)__pa(new_memmap)); | ||
1043 | |||
1044 | if (status != EFI_SUCCESS) { | ||
1045 | pr_alert("Unable to switch EFI into virtual mode (status=%lx)!\n", | ||
1046 | status); | ||
1047 | panic("EFI call to SetVirtualAddressMap() failed!"); | ||
1048 | } | ||
864 | } | 1049 | } |
865 | 1050 | ||
866 | /* | 1051 | /* |
@@ -883,7 +1068,8 @@ void __init efi_enter_virtual_mode(void) | |||
883 | efi.query_variable_info = virt_efi_query_variable_info; | 1068 | efi.query_variable_info = virt_efi_query_variable_info; |
884 | efi.update_capsule = virt_efi_update_capsule; | 1069 | efi.update_capsule = virt_efi_update_capsule; |
885 | efi.query_capsule_caps = virt_efi_query_capsule_caps; | 1070 | efi.query_capsule_caps = virt_efi_query_capsule_caps; |
886 | if (__supported_pte_mask & _PAGE_NX) | 1071 | |
1072 | if (efi_enabled(EFI_OLD_MEMMAP) && (__supported_pte_mask & _PAGE_NX)) | ||
887 | runtime_code_page_mkexec(); | 1073 | runtime_code_page_mkexec(); |
888 | 1074 | ||
889 | kfree(new_memmap); | 1075 | kfree(new_memmap); |
@@ -1013,3 +1199,15 @@ efi_status_t efi_query_variable_store(u32 attributes, unsigned long size) | |||
1013 | return EFI_SUCCESS; | 1199 | return EFI_SUCCESS; |
1014 | } | 1200 | } |
1015 | EXPORT_SYMBOL_GPL(efi_query_variable_store); | 1201 | EXPORT_SYMBOL_GPL(efi_query_variable_store); |
1202 | |||
1203 | static int __init parse_efi_cmdline(char *str) | ||
1204 | { | ||
1205 | if (*str == '=') | ||
1206 | str++; | ||
1207 | |||
1208 | if (!strncmp(str, "old_map", 7)) | ||
1209 | set_bit(EFI_OLD_MEMMAP, &x86_efi_facility); | ||
1210 | |||
1211 | return 0; | ||
1212 | } | ||
1213 | early_param("efi", parse_efi_cmdline); | ||
diff --git a/arch/x86/platform/efi/efi_32.c b/arch/x86/platform/efi/efi_32.c index 40e446941dd7..249b183cf417 100644 --- a/arch/x86/platform/efi/efi_32.c +++ b/arch/x86/platform/efi/efi_32.c | |||
@@ -37,9 +37,19 @@ | |||
37 | * claim EFI runtime service handler exclusively and to duplicate a memory in | 37 | * claim EFI runtime service handler exclusively and to duplicate a memory in |
38 | * low memory space say 0 - 3G. | 38 | * low memory space say 0 - 3G. |
39 | */ | 39 | */ |
40 | |||
41 | static unsigned long efi_rt_eflags; | 40 | static unsigned long efi_rt_eflags; |
42 | 41 | ||
42 | void efi_sync_low_kernel_mappings(void) {} | ||
43 | void efi_setup_page_tables(void) {} | ||
44 | |||
45 | void __init efi_map_region(efi_memory_desc_t *md) | ||
46 | { | ||
47 | old_map_region(md); | ||
48 | } | ||
49 | |||
50 | void __init efi_map_region_fixed(efi_memory_desc_t *md) {} | ||
51 | void __init parse_efi_setup(u64 phys_addr, u32 data_len) {} | ||
52 | |||
43 | void efi_call_phys_prelog(void) | 53 | void efi_call_phys_prelog(void) |
44 | { | 54 | { |
45 | struct desc_ptr gdt_descr; | 55 | struct desc_ptr gdt_descr; |
diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c index 39a0e7f1f0a3..6284f158a47d 100644 --- a/arch/x86/platform/efi/efi_64.c +++ b/arch/x86/platform/efi/efi_64.c | |||
@@ -38,10 +38,28 @@ | |||
38 | #include <asm/efi.h> | 38 | #include <asm/efi.h> |
39 | #include <asm/cacheflush.h> | 39 | #include <asm/cacheflush.h> |
40 | #include <asm/fixmap.h> | 40 | #include <asm/fixmap.h> |
41 | #include <asm/realmode.h> | ||
41 | 42 | ||
42 | static pgd_t *save_pgd __initdata; | 43 | static pgd_t *save_pgd __initdata; |
43 | static unsigned long efi_flags __initdata; | 44 | static unsigned long efi_flags __initdata; |
44 | 45 | ||
46 | /* | ||
47 | * We allocate runtime services regions bottom-up, starting from -4G, i.e. | ||
48 | * 0xffff_ffff_0000_0000 and limit EFI VA mapping space to 64G. | ||
49 | */ | ||
50 | static u64 efi_va = -4 * (1UL << 30); | ||
51 | #define EFI_VA_END (-68 * (1UL << 30)) | ||
52 | |||
53 | /* | ||
54 | * Scratch space used for switching the pagetable in the EFI stub | ||
55 | */ | ||
56 | struct efi_scratch { | ||
57 | u64 r15; | ||
58 | u64 prev_cr3; | ||
59 | pgd_t *efi_pgt; | ||
60 | bool use_pgd; | ||
61 | }; | ||
62 | |||
45 | static void __init early_code_mapping_set_exec(int executable) | 63 | static void __init early_code_mapping_set_exec(int executable) |
46 | { | 64 | { |
47 | efi_memory_desc_t *md; | 65 | efi_memory_desc_t *md; |
@@ -65,6 +83,9 @@ void __init efi_call_phys_prelog(void) | |||
65 | int pgd; | 83 | int pgd; |
66 | int n_pgds; | 84 | int n_pgds; |
67 | 85 | ||
86 | if (!efi_enabled(EFI_OLD_MEMMAP)) | ||
87 | return; | ||
88 | |||
68 | early_code_mapping_set_exec(1); | 89 | early_code_mapping_set_exec(1); |
69 | local_irq_save(efi_flags); | 90 | local_irq_save(efi_flags); |
70 | 91 | ||
@@ -86,6 +107,10 @@ void __init efi_call_phys_epilog(void) | |||
86 | */ | 107 | */ |
87 | int pgd; | 108 | int pgd; |
88 | int n_pgds = DIV_ROUND_UP((max_pfn << PAGE_SHIFT) , PGDIR_SIZE); | 109 | int n_pgds = DIV_ROUND_UP((max_pfn << PAGE_SHIFT) , PGDIR_SIZE); |
110 | |||
111 | if (!efi_enabled(EFI_OLD_MEMMAP)) | ||
112 | return; | ||
113 | |||
89 | for (pgd = 0; pgd < n_pgds; pgd++) | 114 | for (pgd = 0; pgd < n_pgds; pgd++) |
90 | set_pgd(pgd_offset_k(pgd * PGDIR_SIZE), save_pgd[pgd]); | 115 | set_pgd(pgd_offset_k(pgd * PGDIR_SIZE), save_pgd[pgd]); |
91 | kfree(save_pgd); | 116 | kfree(save_pgd); |
@@ -94,6 +119,96 @@ void __init efi_call_phys_epilog(void) | |||
94 | early_code_mapping_set_exec(0); | 119 | early_code_mapping_set_exec(0); |
95 | } | 120 | } |
96 | 121 | ||
122 | /* | ||
123 | * Add low kernel mappings for passing arguments to EFI functions. | ||
124 | */ | ||
125 | void efi_sync_low_kernel_mappings(void) | ||
126 | { | ||
127 | unsigned num_pgds; | ||
128 | pgd_t *pgd = (pgd_t *)__va(real_mode_header->trampoline_pgd); | ||
129 | |||
130 | if (efi_enabled(EFI_OLD_MEMMAP)) | ||
131 | return; | ||
132 | |||
133 | num_pgds = pgd_index(MODULES_END - 1) - pgd_index(PAGE_OFFSET); | ||
134 | |||
135 | memcpy(pgd + pgd_index(PAGE_OFFSET), | ||
136 | init_mm.pgd + pgd_index(PAGE_OFFSET), | ||
137 | sizeof(pgd_t) * num_pgds); | ||
138 | } | ||
139 | |||
140 | void efi_setup_page_tables(void) | ||
141 | { | ||
142 | efi_scratch.efi_pgt = (pgd_t *)(unsigned long)real_mode_header->trampoline_pgd; | ||
143 | |||
144 | if (!efi_enabled(EFI_OLD_MEMMAP)) | ||
145 | efi_scratch.use_pgd = true; | ||
146 | } | ||
147 | |||
148 | static void __init __map_region(efi_memory_desc_t *md, u64 va) | ||
149 | { | ||
150 | pgd_t *pgd = (pgd_t *)__va(real_mode_header->trampoline_pgd); | ||
151 | unsigned long pf = 0; | ||
152 | |||
153 | if (!(md->attribute & EFI_MEMORY_WB)) | ||
154 | pf |= _PAGE_PCD; | ||
155 | |||
156 | if (kernel_map_pages_in_pgd(pgd, md->phys_addr, va, md->num_pages, pf)) | ||
157 | pr_warn("Error mapping PA 0x%llx -> VA 0x%llx!\n", | ||
158 | md->phys_addr, va); | ||
159 | } | ||
160 | |||
161 | void __init efi_map_region(efi_memory_desc_t *md) | ||
162 | { | ||
163 | unsigned long size = md->num_pages << PAGE_SHIFT; | ||
164 | u64 pa = md->phys_addr; | ||
165 | |||
166 | if (efi_enabled(EFI_OLD_MEMMAP)) | ||
167 | return old_map_region(md); | ||
168 | |||
169 | /* | ||
170 | * Make sure the 1:1 mappings are present as a catch-all for b0rked | ||
171 | * firmware which doesn't update all internal pointers after switching | ||
172 | * to virtual mode and would otherwise crap on us. | ||
173 | */ | ||
174 | __map_region(md, md->phys_addr); | ||
175 | |||
176 | efi_va -= size; | ||
177 | |||
178 | /* Is PA 2M-aligned? */ | ||
179 | if (!(pa & (PMD_SIZE - 1))) { | ||
180 | efi_va &= PMD_MASK; | ||
181 | } else { | ||
182 | u64 pa_offset = pa & (PMD_SIZE - 1); | ||
183 | u64 prev_va = efi_va; | ||
184 | |||
185 | /* get us the same offset within this 2M page */ | ||
186 | efi_va = (efi_va & PMD_MASK) + pa_offset; | ||
187 | |||
188 | if (efi_va > prev_va) | ||
189 | efi_va -= PMD_SIZE; | ||
190 | } | ||
191 | |||
192 | if (efi_va < EFI_VA_END) { | ||
193 | pr_warn(FW_WARN "VA address range overflow!\n"); | ||
194 | return; | ||
195 | } | ||
196 | |||
197 | /* Do the VA map */ | ||
198 | __map_region(md, efi_va); | ||
199 | md->virt_addr = efi_va; | ||
200 | } | ||
201 | |||
202 | /* | ||
203 | * kexec kernel will use efi_map_region_fixed to map efi runtime memory ranges. | ||
204 | * md->virt_addr is the original virtual address which had been mapped in kexec | ||
205 | * 1st kernel. | ||
206 | */ | ||
207 | void __init efi_map_region_fixed(efi_memory_desc_t *md) | ||
208 | { | ||
209 | __map_region(md, md->virt_addr); | ||
210 | } | ||
211 | |||
97 | void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size, | 212 | void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size, |
98 | u32 type, u64 attribute) | 213 | u32 type, u64 attribute) |
99 | { | 214 | { |
@@ -113,3 +228,8 @@ void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size, | |||
113 | 228 | ||
114 | return (void __iomem *)__va(phys_addr); | 229 | return (void __iomem *)__va(phys_addr); |
115 | } | 230 | } |
231 | |||
232 | void __init parse_efi_setup(u64 phys_addr, u32 data_len) | ||
233 | { | ||
234 | efi_setup = phys_addr + sizeof(struct setup_data); | ||
235 | } | ||
diff --git a/arch/x86/platform/efi/efi_stub_64.S b/arch/x86/platform/efi/efi_stub_64.S index 4c07ccab8146..88073b140298 100644 --- a/arch/x86/platform/efi/efi_stub_64.S +++ b/arch/x86/platform/efi/efi_stub_64.S | |||
@@ -34,10 +34,47 @@ | |||
34 | mov %rsi, %cr0; \ | 34 | mov %rsi, %cr0; \ |
35 | mov (%rsp), %rsp | 35 | mov (%rsp), %rsp |
36 | 36 | ||
37 | /* stolen from gcc */ | ||
38 | .macro FLUSH_TLB_ALL | ||
39 | movq %r15, efi_scratch(%rip) | ||
40 | movq %r14, efi_scratch+8(%rip) | ||
41 | movq %cr4, %r15 | ||
42 | movq %r15, %r14 | ||
43 | andb $0x7f, %r14b | ||
44 | movq %r14, %cr4 | ||
45 | movq %r15, %cr4 | ||
46 | movq efi_scratch+8(%rip), %r14 | ||
47 | movq efi_scratch(%rip), %r15 | ||
48 | .endm | ||
49 | |||
50 | .macro SWITCH_PGT | ||
51 | cmpb $0, efi_scratch+24(%rip) | ||
52 | je 1f | ||
53 | movq %r15, efi_scratch(%rip) # r15 | ||
54 | # save previous CR3 | ||
55 | movq %cr3, %r15 | ||
56 | movq %r15, efi_scratch+8(%rip) # prev_cr3 | ||
57 | movq efi_scratch+16(%rip), %r15 # EFI pgt | ||
58 | movq %r15, %cr3 | ||
59 | 1: | ||
60 | .endm | ||
61 | |||
62 | .macro RESTORE_PGT | ||
63 | cmpb $0, efi_scratch+24(%rip) | ||
64 | je 2f | ||
65 | movq efi_scratch+8(%rip), %r15 | ||
66 | movq %r15, %cr3 | ||
67 | movq efi_scratch(%rip), %r15 | ||
68 | FLUSH_TLB_ALL | ||
69 | 2: | ||
70 | .endm | ||
71 | |||
37 | ENTRY(efi_call0) | 72 | ENTRY(efi_call0) |
38 | SAVE_XMM | 73 | SAVE_XMM |
39 | subq $32, %rsp | 74 | subq $32, %rsp |
75 | SWITCH_PGT | ||
40 | call *%rdi | 76 | call *%rdi |
77 | RESTORE_PGT | ||
41 | addq $32, %rsp | 78 | addq $32, %rsp |
42 | RESTORE_XMM | 79 | RESTORE_XMM |
43 | ret | 80 | ret |
@@ -47,7 +84,9 @@ ENTRY(efi_call1) | |||
47 | SAVE_XMM | 84 | SAVE_XMM |
48 | subq $32, %rsp | 85 | subq $32, %rsp |
49 | mov %rsi, %rcx | 86 | mov %rsi, %rcx |
87 | SWITCH_PGT | ||
50 | call *%rdi | 88 | call *%rdi |
89 | RESTORE_PGT | ||
51 | addq $32, %rsp | 90 | addq $32, %rsp |
52 | RESTORE_XMM | 91 | RESTORE_XMM |
53 | ret | 92 | ret |
@@ -57,7 +96,9 @@ ENTRY(efi_call2) | |||
57 | SAVE_XMM | 96 | SAVE_XMM |
58 | subq $32, %rsp | 97 | subq $32, %rsp |
59 | mov %rsi, %rcx | 98 | mov %rsi, %rcx |
99 | SWITCH_PGT | ||
60 | call *%rdi | 100 | call *%rdi |
101 | RESTORE_PGT | ||
61 | addq $32, %rsp | 102 | addq $32, %rsp |
62 | RESTORE_XMM | 103 | RESTORE_XMM |
63 | ret | 104 | ret |
@@ -68,7 +109,9 @@ ENTRY(efi_call3) | |||
68 | subq $32, %rsp | 109 | subq $32, %rsp |
69 | mov %rcx, %r8 | 110 | mov %rcx, %r8 |
70 | mov %rsi, %rcx | 111 | mov %rsi, %rcx |
112 | SWITCH_PGT | ||
71 | call *%rdi | 113 | call *%rdi |
114 | RESTORE_PGT | ||
72 | addq $32, %rsp | 115 | addq $32, %rsp |
73 | RESTORE_XMM | 116 | RESTORE_XMM |
74 | ret | 117 | ret |
@@ -80,7 +123,9 @@ ENTRY(efi_call4) | |||
80 | mov %r8, %r9 | 123 | mov %r8, %r9 |
81 | mov %rcx, %r8 | 124 | mov %rcx, %r8 |
82 | mov %rsi, %rcx | 125 | mov %rsi, %rcx |
126 | SWITCH_PGT | ||
83 | call *%rdi | 127 | call *%rdi |
128 | RESTORE_PGT | ||
84 | addq $32, %rsp | 129 | addq $32, %rsp |
85 | RESTORE_XMM | 130 | RESTORE_XMM |
86 | ret | 131 | ret |
@@ -93,7 +138,9 @@ ENTRY(efi_call5) | |||
93 | mov %r8, %r9 | 138 | mov %r8, %r9 |
94 | mov %rcx, %r8 | 139 | mov %rcx, %r8 |
95 | mov %rsi, %rcx | 140 | mov %rsi, %rcx |
141 | SWITCH_PGT | ||
96 | call *%rdi | 142 | call *%rdi |
143 | RESTORE_PGT | ||
97 | addq $48, %rsp | 144 | addq $48, %rsp |
98 | RESTORE_XMM | 145 | RESTORE_XMM |
99 | ret | 146 | ret |
@@ -109,8 +156,15 @@ ENTRY(efi_call6) | |||
109 | mov %r8, %r9 | 156 | mov %r8, %r9 |
110 | mov %rcx, %r8 | 157 | mov %rcx, %r8 |
111 | mov %rsi, %rcx | 158 | mov %rsi, %rcx |
159 | SWITCH_PGT | ||
112 | call *%rdi | 160 | call *%rdi |
161 | RESTORE_PGT | ||
113 | addq $48, %rsp | 162 | addq $48, %rsp |
114 | RESTORE_XMM | 163 | RESTORE_XMM |
115 | ret | 164 | ret |
116 | ENDPROC(efi_call6) | 165 | ENDPROC(efi_call6) |
166 | |||
167 | .data | ||
168 | ENTRY(efi_scratch) | ||
169 | .fill 3,8,0 | ||
170 | .byte 0 | ||
diff --git a/arch/x86/platform/intel-mid/Makefile b/arch/x86/platform/intel-mid/Makefile index 01cc29ea5ff7..0a8ee703b9fa 100644 --- a/arch/x86/platform/intel-mid/Makefile +++ b/arch/x86/platform/intel-mid/Makefile | |||
@@ -1,6 +1,6 @@ | |||
1 | obj-$(CONFIG_X86_INTEL_MID) += intel-mid.o | 1 | obj-$(CONFIG_X86_INTEL_MID) += intel-mid.o intel_mid_vrtc.o mfld.o mrfl.o |
2 | obj-$(CONFIG_X86_INTEL_MID) += intel_mid_vrtc.o | ||
3 | obj-$(CONFIG_EARLY_PRINTK_INTEL_MID) += early_printk_intel_mid.o | 2 | obj-$(CONFIG_EARLY_PRINTK_INTEL_MID) += early_printk_intel_mid.o |
3 | |||
4 | # SFI specific code | 4 | # SFI specific code |
5 | ifdef CONFIG_X86_INTEL_MID | 5 | ifdef CONFIG_X86_INTEL_MID |
6 | obj-$(CONFIG_SFI) += sfi.o device_libs/ | 6 | obj-$(CONFIG_SFI) += sfi.o device_libs/ |
diff --git a/arch/x86/platform/intel-mid/device_libs/platform_emc1403.c b/arch/x86/platform/intel-mid/device_libs/platform_emc1403.c index 0d942c1d26d5..69a783689d21 100644 --- a/arch/x86/platform/intel-mid/device_libs/platform_emc1403.c +++ b/arch/x86/platform/intel-mid/device_libs/platform_emc1403.c | |||
@@ -22,7 +22,9 @@ static void __init *emc1403_platform_data(void *info) | |||
22 | int intr = get_gpio_by_name("thermal_int"); | 22 | int intr = get_gpio_by_name("thermal_int"); |
23 | int intr2nd = get_gpio_by_name("thermal_alert"); | 23 | int intr2nd = get_gpio_by_name("thermal_alert"); |
24 | 24 | ||
25 | if (intr == -1 || intr2nd == -1) | 25 | if (intr < 0) |
26 | return NULL; | ||
27 | if (intr2nd < 0) | ||
26 | return NULL; | 28 | return NULL; |
27 | 29 | ||
28 | i2c_info->irq = intr + INTEL_MID_IRQ_OFFSET; | 30 | i2c_info->irq = intr + INTEL_MID_IRQ_OFFSET; |
diff --git a/arch/x86/platform/intel-mid/device_libs/platform_gpio_keys.c b/arch/x86/platform/intel-mid/device_libs/platform_gpio_keys.c index a013a4834bbe..dccae6b0413f 100644 --- a/arch/x86/platform/intel-mid/device_libs/platform_gpio_keys.c +++ b/arch/x86/platform/intel-mid/device_libs/platform_gpio_keys.c | |||
@@ -66,7 +66,7 @@ static int __init pb_keys_init(void) | |||
66 | gb[i].gpio = get_gpio_by_name(gb[i].desc); | 66 | gb[i].gpio = get_gpio_by_name(gb[i].desc); |
67 | pr_debug("info[%2d]: name = %s, gpio = %d\n", i, gb[i].desc, | 67 | pr_debug("info[%2d]: name = %s, gpio = %d\n", i, gb[i].desc, |
68 | gb[i].gpio); | 68 | gb[i].gpio); |
69 | if (gb[i].gpio == -1) | 69 | if (gb[i].gpio < 0) |
70 | continue; | 70 | continue; |
71 | 71 | ||
72 | if (i != good) | 72 | if (i != good) |
diff --git a/arch/x86/platform/intel-mid/device_libs/platform_lis331.c b/arch/x86/platform/intel-mid/device_libs/platform_lis331.c index 15278c11f714..54226de7541a 100644 --- a/arch/x86/platform/intel-mid/device_libs/platform_lis331.c +++ b/arch/x86/platform/intel-mid/device_libs/platform_lis331.c | |||
@@ -21,7 +21,9 @@ static void __init *lis331dl_platform_data(void *info) | |||
21 | int intr = get_gpio_by_name("accel_int"); | 21 | int intr = get_gpio_by_name("accel_int"); |
22 | int intr2nd = get_gpio_by_name("accel_2"); | 22 | int intr2nd = get_gpio_by_name("accel_2"); |
23 | 23 | ||
24 | if (intr == -1 || intr2nd == -1) | 24 | if (intr < 0) |
25 | return NULL; | ||
26 | if (intr2nd < 0) | ||
25 | return NULL; | 27 | return NULL; |
26 | 28 | ||
27 | i2c_info->irq = intr + INTEL_MID_IRQ_OFFSET; | 29 | i2c_info->irq = intr + INTEL_MID_IRQ_OFFSET; |
diff --git a/arch/x86/platform/intel-mid/device_libs/platform_max7315.c b/arch/x86/platform/intel-mid/device_libs/platform_max7315.c index 94ade10024ae..2c8acbc1e9ad 100644 --- a/arch/x86/platform/intel-mid/device_libs/platform_max7315.c +++ b/arch/x86/platform/intel-mid/device_libs/platform_max7315.c | |||
@@ -48,7 +48,7 @@ static void __init *max7315_platform_data(void *info) | |||
48 | gpio_base = get_gpio_by_name(base_pin_name); | 48 | gpio_base = get_gpio_by_name(base_pin_name); |
49 | intr = get_gpio_by_name(intr_pin_name); | 49 | intr = get_gpio_by_name(intr_pin_name); |
50 | 50 | ||
51 | if (gpio_base == -1) | 51 | if (gpio_base < 0) |
52 | return NULL; | 52 | return NULL; |
53 | max7315->gpio_base = gpio_base; | 53 | max7315->gpio_base = gpio_base; |
54 | if (intr != -1) { | 54 | if (intr != -1) { |
diff --git a/arch/x86/platform/intel-mid/device_libs/platform_mpu3050.c b/arch/x86/platform/intel-mid/device_libs/platform_mpu3050.c index dd28d63c84fb..cfe9a47a1e87 100644 --- a/arch/x86/platform/intel-mid/device_libs/platform_mpu3050.c +++ b/arch/x86/platform/intel-mid/device_libs/platform_mpu3050.c | |||
@@ -19,7 +19,7 @@ static void *mpu3050_platform_data(void *info) | |||
19 | struct i2c_board_info *i2c_info = info; | 19 | struct i2c_board_info *i2c_info = info; |
20 | int intr = get_gpio_by_name("mpu3050_int"); | 20 | int intr = get_gpio_by_name("mpu3050_int"); |
21 | 21 | ||
22 | if (intr == -1) | 22 | if (intr < 0) |
23 | return NULL; | 23 | return NULL; |
24 | 24 | ||
25 | i2c_info->irq = intr + INTEL_MID_IRQ_OFFSET; | 25 | i2c_info->irq = intr + INTEL_MID_IRQ_OFFSET; |
diff --git a/arch/x86/platform/intel-mid/device_libs/platform_pmic_gpio.c b/arch/x86/platform/intel-mid/device_libs/platform_pmic_gpio.c index d87182a09263..65c2a9a19db4 100644 --- a/arch/x86/platform/intel-mid/device_libs/platform_pmic_gpio.c +++ b/arch/x86/platform/intel-mid/device_libs/platform_pmic_gpio.c | |||
@@ -26,7 +26,7 @@ static void __init *pmic_gpio_platform_data(void *info) | |||
26 | static struct intel_pmic_gpio_platform_data pmic_gpio_pdata; | 26 | static struct intel_pmic_gpio_platform_data pmic_gpio_pdata; |
27 | int gpio_base = get_gpio_by_name("pmic_gpio_base"); | 27 | int gpio_base = get_gpio_by_name("pmic_gpio_base"); |
28 | 28 | ||
29 | if (gpio_base == -1) | 29 | if (gpio_base < 0) |
30 | gpio_base = 64; | 30 | gpio_base = 64; |
31 | pmic_gpio_pdata.gpio_base = gpio_base; | 31 | pmic_gpio_pdata.gpio_base = gpio_base; |
32 | pmic_gpio_pdata.irq_base = gpio_base + INTEL_MID_IRQ_OFFSET; | 32 | pmic_gpio_pdata.irq_base = gpio_base + INTEL_MID_IRQ_OFFSET; |
diff --git a/arch/x86/platform/intel-mid/device_libs/platform_tca6416.c b/arch/x86/platform/intel-mid/device_libs/platform_tca6416.c index 22881c9a6737..33be0b3be6e1 100644 --- a/arch/x86/platform/intel-mid/device_libs/platform_tca6416.c +++ b/arch/x86/platform/intel-mid/device_libs/platform_tca6416.c | |||
@@ -34,10 +34,10 @@ static void *tca6416_platform_data(void *info) | |||
34 | gpio_base = get_gpio_by_name(base_pin_name); | 34 | gpio_base = get_gpio_by_name(base_pin_name); |
35 | intr = get_gpio_by_name(intr_pin_name); | 35 | intr = get_gpio_by_name(intr_pin_name); |
36 | 36 | ||
37 | if (gpio_base == -1) | 37 | if (gpio_base < 0) |
38 | return NULL; | 38 | return NULL; |
39 | tca6416.gpio_base = gpio_base; | 39 | tca6416.gpio_base = gpio_base; |
40 | if (intr != -1) { | 40 | if (intr >= 0) { |
41 | i2c_info->irq = intr + INTEL_MID_IRQ_OFFSET; | 41 | i2c_info->irq = intr + INTEL_MID_IRQ_OFFSET; |
42 | tca6416.irq_base = gpio_base + INTEL_MID_IRQ_OFFSET; | 42 | tca6416.irq_base = gpio_base + INTEL_MID_IRQ_OFFSET; |
43 | } else { | 43 | } else { |
diff --git a/arch/x86/platform/intel-mid/early_printk_intel_mid.c b/arch/x86/platform/intel-mid/early_printk_intel_mid.c index 4f702f554f6e..e0bd082a80e0 100644 --- a/arch/x86/platform/intel-mid/early_printk_intel_mid.c +++ b/arch/x86/platform/intel-mid/early_printk_intel_mid.c | |||
@@ -22,7 +22,6 @@ | |||
22 | #include <linux/console.h> | 22 | #include <linux/console.h> |
23 | #include <linux/kernel.h> | 23 | #include <linux/kernel.h> |
24 | #include <linux/delay.h> | 24 | #include <linux/delay.h> |
25 | #include <linux/init.h> | ||
26 | #include <linux/io.h> | 25 | #include <linux/io.h> |
27 | 26 | ||
28 | #include <asm/fixmap.h> | 27 | #include <asm/fixmap.h> |
diff --git a/arch/x86/platform/intel-mid/intel-mid.c b/arch/x86/platform/intel-mid/intel-mid.c index f90e290f689f..1bbedc4b0f88 100644 --- a/arch/x86/platform/intel-mid/intel-mid.c +++ b/arch/x86/platform/intel-mid/intel-mid.c | |||
@@ -35,6 +35,8 @@ | |||
35 | #include <asm/apb_timer.h> | 35 | #include <asm/apb_timer.h> |
36 | #include <asm/reboot.h> | 36 | #include <asm/reboot.h> |
37 | 37 | ||
38 | #include "intel_mid_weak_decls.h" | ||
39 | |||
38 | /* | 40 | /* |
39 | * the clockevent devices on Moorestown/Medfield can be APBT or LAPIC clock, | 41 | * the clockevent devices on Moorestown/Medfield can be APBT or LAPIC clock, |
40 | * cmdline option x86_intel_mid_timer can be used to override the configuration | 42 | * cmdline option x86_intel_mid_timer can be used to override the configuration |
@@ -58,12 +60,16 @@ | |||
58 | 60 | ||
59 | enum intel_mid_timer_options intel_mid_timer_options; | 61 | enum intel_mid_timer_options intel_mid_timer_options; |
60 | 62 | ||
63 | /* intel_mid_ops to store sub arch ops */ | ||
64 | struct intel_mid_ops *intel_mid_ops; | ||
65 | /* getter function for sub arch ops*/ | ||
66 | static void *(*get_intel_mid_ops[])(void) = INTEL_MID_OPS_INIT; | ||
61 | enum intel_mid_cpu_type __intel_mid_cpu_chip; | 67 | enum intel_mid_cpu_type __intel_mid_cpu_chip; |
62 | EXPORT_SYMBOL_GPL(__intel_mid_cpu_chip); | 68 | EXPORT_SYMBOL_GPL(__intel_mid_cpu_chip); |
63 | 69 | ||
64 | static void intel_mid_power_off(void) | 70 | static void intel_mid_power_off(void) |
65 | { | 71 | { |
66 | } | 72 | }; |
67 | 73 | ||
68 | static void intel_mid_reboot(void) | 74 | static void intel_mid_reboot(void) |
69 | { | 75 | { |
@@ -72,32 +78,6 @@ static void intel_mid_reboot(void) | |||
72 | 78 | ||
73 | static unsigned long __init intel_mid_calibrate_tsc(void) | 79 | static unsigned long __init intel_mid_calibrate_tsc(void) |
74 | { | 80 | { |
75 | unsigned long fast_calibrate; | ||
76 | u32 lo, hi, ratio, fsb; | ||
77 | |||
78 | rdmsr(MSR_IA32_PERF_STATUS, lo, hi); | ||
79 | pr_debug("IA32 perf status is 0x%x, 0x%0x\n", lo, hi); | ||
80 | ratio = (hi >> 8) & 0x1f; | ||
81 | pr_debug("ratio is %d\n", ratio); | ||
82 | if (!ratio) { | ||
83 | pr_err("read a zero ratio, should be incorrect!\n"); | ||
84 | pr_err("force tsc ratio to 16 ...\n"); | ||
85 | ratio = 16; | ||
86 | } | ||
87 | rdmsr(MSR_FSB_FREQ, lo, hi); | ||
88 | if ((lo & 0x7) == 0x7) | ||
89 | fsb = PENWELL_FSB_FREQ_83SKU; | ||
90 | else | ||
91 | fsb = PENWELL_FSB_FREQ_100SKU; | ||
92 | fast_calibrate = ratio * fsb; | ||
93 | pr_debug("read penwell tsc %lu khz\n", fast_calibrate); | ||
94 | lapic_timer_frequency = fsb * 1000 / HZ; | ||
95 | /* mark tsc clocksource as reliable */ | ||
96 | set_cpu_cap(&boot_cpu_data, X86_FEATURE_TSC_RELIABLE); | ||
97 | |||
98 | if (fast_calibrate) | ||
99 | return fast_calibrate; | ||
100 | |||
101 | return 0; | 81 | return 0; |
102 | } | 82 | } |
103 | 83 | ||
@@ -125,13 +105,37 @@ static void __init intel_mid_time_init(void) | |||
125 | 105 | ||
126 | static void intel_mid_arch_setup(void) | 106 | static void intel_mid_arch_setup(void) |
127 | { | 107 | { |
128 | if (boot_cpu_data.x86 == 6 && boot_cpu_data.x86_model == 0x27) | 108 | if (boot_cpu_data.x86 != 6) { |
129 | __intel_mid_cpu_chip = INTEL_MID_CPU_CHIP_PENWELL; | ||
130 | else { | ||
131 | pr_err("Unknown Intel MID CPU (%d:%d), default to Penwell\n", | 109 | pr_err("Unknown Intel MID CPU (%d:%d), default to Penwell\n", |
132 | boot_cpu_data.x86, boot_cpu_data.x86_model); | 110 | boot_cpu_data.x86, boot_cpu_data.x86_model); |
133 | __intel_mid_cpu_chip = INTEL_MID_CPU_CHIP_PENWELL; | 111 | __intel_mid_cpu_chip = INTEL_MID_CPU_CHIP_PENWELL; |
112 | goto out; | ||
134 | } | 113 | } |
114 | |||
115 | switch (boot_cpu_data.x86_model) { | ||
116 | case 0x35: | ||
117 | __intel_mid_cpu_chip = INTEL_MID_CPU_CHIP_CLOVERVIEW; | ||
118 | break; | ||
119 | case 0x3C: | ||
120 | case 0x4A: | ||
121 | __intel_mid_cpu_chip = INTEL_MID_CPU_CHIP_TANGIER; | ||
122 | break; | ||
123 | case 0x27: | ||
124 | default: | ||
125 | __intel_mid_cpu_chip = INTEL_MID_CPU_CHIP_PENWELL; | ||
126 | break; | ||
127 | } | ||
128 | |||
129 | if (__intel_mid_cpu_chip < MAX_CPU_OPS(get_intel_mid_ops)) | ||
130 | intel_mid_ops = get_intel_mid_ops[__intel_mid_cpu_chip](); | ||
131 | else { | ||
132 | intel_mid_ops = get_intel_mid_ops[INTEL_MID_CPU_CHIP_PENWELL](); | ||
133 | pr_info("ARCH: Uknown SoC, assuming PENWELL!\n"); | ||
134 | } | ||
135 | |||
136 | out: | ||
137 | if (intel_mid_ops->arch_setup) | ||
138 | intel_mid_ops->arch_setup(); | ||
135 | } | 139 | } |
136 | 140 | ||
137 | /* MID systems don't have i8042 controller */ | 141 | /* MID systems don't have i8042 controller */ |
diff --git a/arch/x86/platform/intel-mid/intel_mid_weak_decls.h b/arch/x86/platform/intel-mid/intel_mid_weak_decls.h new file mode 100644 index 000000000000..a537ffc16299 --- /dev/null +++ b/arch/x86/platform/intel-mid/intel_mid_weak_decls.h | |||
@@ -0,0 +1,19 @@ | |||
1 | /* | ||
2 | * intel_mid_weak_decls.h: Weak declarations of intel-mid.c | ||
3 | * | ||
4 | * (C) Copyright 2013 Intel Corporation | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; version 2 | ||
9 | * of the License. | ||
10 | */ | ||
11 | |||
12 | |||
13 | /* __attribute__((weak)) makes these declarations overridable */ | ||
14 | /* For every CPU addition a new get_<cpuname>_ops interface needs | ||
15 | * to be added. | ||
16 | */ | ||
17 | extern void * __cpuinit get_penwell_ops(void) __attribute__((weak)); | ||
18 | extern void * __cpuinit get_cloverview_ops(void) __attribute__((weak)); | ||
19 | extern void * __init get_tangier_ops(void) __attribute__((weak)); | ||
diff --git a/arch/x86/platform/intel-mid/mfld.c b/arch/x86/platform/intel-mid/mfld.c new file mode 100644 index 000000000000..4f7884eebc14 --- /dev/null +++ b/arch/x86/platform/intel-mid/mfld.c | |||
@@ -0,0 +1,75 @@ | |||
1 | /* | ||
2 | * mfld.c: Intel Medfield platform setup code | ||
3 | * | ||
4 | * (C) Copyright 2013 Intel Corporation | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; version 2 | ||
9 | * of the License. | ||
10 | */ | ||
11 | |||
12 | #include <linux/init.h> | ||
13 | |||
14 | #include <asm/apic.h> | ||
15 | #include <asm/intel-mid.h> | ||
16 | #include <asm/intel_mid_vrtc.h> | ||
17 | |||
18 | #include "intel_mid_weak_decls.h" | ||
19 | |||
20 | static void penwell_arch_setup(void); | ||
21 | /* penwell arch ops */ | ||
22 | static struct intel_mid_ops penwell_ops = { | ||
23 | .arch_setup = penwell_arch_setup, | ||
24 | }; | ||
25 | |||
26 | static void mfld_power_off(void) | ||
27 | { | ||
28 | } | ||
29 | |||
30 | static unsigned long __init mfld_calibrate_tsc(void) | ||
31 | { | ||
32 | unsigned long fast_calibrate; | ||
33 | u32 lo, hi, ratio, fsb; | ||
34 | |||
35 | rdmsr(MSR_IA32_PERF_STATUS, lo, hi); | ||
36 | pr_debug("IA32 perf status is 0x%x, 0x%0x\n", lo, hi); | ||
37 | ratio = (hi >> 8) & 0x1f; | ||
38 | pr_debug("ratio is %d\n", ratio); | ||
39 | if (!ratio) { | ||
40 | pr_err("read a zero ratio, should be incorrect!\n"); | ||
41 | pr_err("force tsc ratio to 16 ...\n"); | ||
42 | ratio = 16; | ||
43 | } | ||
44 | rdmsr(MSR_FSB_FREQ, lo, hi); | ||
45 | if ((lo & 0x7) == 0x7) | ||
46 | fsb = FSB_FREQ_83SKU; | ||
47 | else | ||
48 | fsb = FSB_FREQ_100SKU; | ||
49 | fast_calibrate = ratio * fsb; | ||
50 | pr_debug("read penwell tsc %lu khz\n", fast_calibrate); | ||
51 | lapic_timer_frequency = fsb * 1000 / HZ; | ||
52 | /* mark tsc clocksource as reliable */ | ||
53 | set_cpu_cap(&boot_cpu_data, X86_FEATURE_TSC_RELIABLE); | ||
54 | |||
55 | if (fast_calibrate) | ||
56 | return fast_calibrate; | ||
57 | |||
58 | return 0; | ||
59 | } | ||
60 | |||
61 | static void __init penwell_arch_setup() | ||
62 | { | ||
63 | x86_platform.calibrate_tsc = mfld_calibrate_tsc; | ||
64 | pm_power_off = mfld_power_off; | ||
65 | } | ||
66 | |||
67 | void * __cpuinit get_penwell_ops() | ||
68 | { | ||
69 | return &penwell_ops; | ||
70 | } | ||
71 | |||
72 | void * __cpuinit get_cloverview_ops() | ||
73 | { | ||
74 | return &penwell_ops; | ||
75 | } | ||
diff --git a/arch/x86/platform/intel-mid/mrfl.c b/arch/x86/platform/intel-mid/mrfl.c new file mode 100644 index 000000000000..09d10159e7b7 --- /dev/null +++ b/arch/x86/platform/intel-mid/mrfl.c | |||
@@ -0,0 +1,103 @@ | |||
1 | /* | ||
2 | * mrfl.c: Intel Merrifield platform specific setup code | ||
3 | * | ||
4 | * (C) Copyright 2013 Intel Corporation | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; version 2 | ||
9 | * of the License. | ||
10 | */ | ||
11 | |||
12 | #include <linux/init.h> | ||
13 | |||
14 | #include <asm/apic.h> | ||
15 | #include <asm/intel-mid.h> | ||
16 | |||
17 | #include "intel_mid_weak_decls.h" | ||
18 | |||
19 | static unsigned long __init tangier_calibrate_tsc(void) | ||
20 | { | ||
21 | unsigned long fast_calibrate; | ||
22 | u32 lo, hi, ratio, fsb, bus_freq; | ||
23 | |||
24 | /* *********************** */ | ||
25 | /* Compute TSC:Ratio * FSB */ | ||
26 | /* *********************** */ | ||
27 | |||
28 | /* Compute Ratio */ | ||
29 | rdmsr(MSR_PLATFORM_INFO, lo, hi); | ||
30 | pr_debug("IA32 PLATFORM_INFO is 0x%x : %x\n", hi, lo); | ||
31 | |||
32 | ratio = (lo >> 8) & 0xFF; | ||
33 | pr_debug("ratio is %d\n", ratio); | ||
34 | if (!ratio) { | ||
35 | pr_err("Read a zero ratio, force tsc ratio to 4 ...\n"); | ||
36 | ratio = 4; | ||
37 | } | ||
38 | |||
39 | /* Compute FSB */ | ||
40 | rdmsr(MSR_FSB_FREQ, lo, hi); | ||
41 | pr_debug("Actual FSB frequency detected by SOC 0x%x : %x\n", | ||
42 | hi, lo); | ||
43 | |||
44 | bus_freq = lo & 0x7; | ||
45 | pr_debug("bus_freq = 0x%x\n", bus_freq); | ||
46 | |||
47 | if (bus_freq == 0) | ||
48 | fsb = FSB_FREQ_100SKU; | ||
49 | else if (bus_freq == 1) | ||
50 | fsb = FSB_FREQ_100SKU; | ||
51 | else if (bus_freq == 2) | ||
52 | fsb = FSB_FREQ_133SKU; | ||
53 | else if (bus_freq == 3) | ||
54 | fsb = FSB_FREQ_167SKU; | ||
55 | else if (bus_freq == 4) | ||
56 | fsb = FSB_FREQ_83SKU; | ||
57 | else if (bus_freq == 5) | ||
58 | fsb = FSB_FREQ_400SKU; | ||
59 | else if (bus_freq == 6) | ||
60 | fsb = FSB_FREQ_267SKU; | ||
61 | else if (bus_freq == 7) | ||
62 | fsb = FSB_FREQ_333SKU; | ||
63 | else { | ||
64 | BUG(); | ||
65 | pr_err("Invalid bus_freq! Setting to minimal value!\n"); | ||
66 | fsb = FSB_FREQ_100SKU; | ||
67 | } | ||
68 | |||
69 | /* TSC = FSB Freq * Resolved HFM Ratio */ | ||
70 | fast_calibrate = ratio * fsb; | ||
71 | pr_debug("calculate tangier tsc %lu KHz\n", fast_calibrate); | ||
72 | |||
73 | /* ************************************ */ | ||
74 | /* Calculate Local APIC Timer Frequency */ | ||
75 | /* ************************************ */ | ||
76 | lapic_timer_frequency = (fsb * 1000) / HZ; | ||
77 | |||
78 | pr_debug("Setting lapic_timer_frequency = %d\n", | ||
79 | lapic_timer_frequency); | ||
80 | |||
81 | /* mark tsc clocksource as reliable */ | ||
82 | set_cpu_cap(&boot_cpu_data, X86_FEATURE_TSC_RELIABLE); | ||
83 | |||
84 | if (fast_calibrate) | ||
85 | return fast_calibrate; | ||
86 | |||
87 | return 0; | ||
88 | } | ||
89 | |||
90 | static void __init tangier_arch_setup(void) | ||
91 | { | ||
92 | x86_platform.calibrate_tsc = tangier_calibrate_tsc; | ||
93 | } | ||
94 | |||
95 | /* tangier arch ops */ | ||
96 | static struct intel_mid_ops tangier_ops = { | ||
97 | .arch_setup = tangier_arch_setup, | ||
98 | }; | ||
99 | |||
100 | void * __cpuinit get_tangier_ops() | ||
101 | { | ||
102 | return &tangier_ops; | ||
103 | } | ||
diff --git a/arch/x86/platform/intel-mid/sfi.c b/arch/x86/platform/intel-mid/sfi.c index c84c1ca396bf..994c40bd7cb7 100644 --- a/arch/x86/platform/intel-mid/sfi.c +++ b/arch/x86/platform/intel-mid/sfi.c | |||
@@ -224,7 +224,7 @@ int get_gpio_by_name(const char *name) | |||
224 | if (!strncmp(name, pentry->pin_name, SFI_NAME_LEN)) | 224 | if (!strncmp(name, pentry->pin_name, SFI_NAME_LEN)) |
225 | return pentry->pin_no; | 225 | return pentry->pin_no; |
226 | } | 226 | } |
227 | return -1; | 227 | return -EINVAL; |
228 | } | 228 | } |
229 | 229 | ||
230 | void __init intel_scu_device_register(struct platform_device *pdev) | 230 | void __init intel_scu_device_register(struct platform_device *pdev) |
@@ -250,7 +250,7 @@ static void __init intel_scu_spi_device_register(struct spi_board_info *sdev) | |||
250 | sdev->modalias); | 250 | sdev->modalias); |
251 | return; | 251 | return; |
252 | } | 252 | } |
253 | memcpy(new_dev, sdev, sizeof(*sdev)); | 253 | *new_dev = *sdev; |
254 | 254 | ||
255 | spi_devs[spi_next_dev++] = new_dev; | 255 | spi_devs[spi_next_dev++] = new_dev; |
256 | } | 256 | } |
@@ -271,7 +271,7 @@ static void __init intel_scu_i2c_device_register(int bus, | |||
271 | idev->type); | 271 | idev->type); |
272 | return; | 272 | return; |
273 | } | 273 | } |
274 | memcpy(new_dev, idev, sizeof(*idev)); | 274 | *new_dev = *idev; |
275 | 275 | ||
276 | i2c_bus[i2c_next_dev] = bus; | 276 | i2c_bus[i2c_next_dev] = bus; |
277 | i2c_devs[i2c_next_dev++] = new_dev; | 277 | i2c_devs[i2c_next_dev++] = new_dev; |
@@ -337,6 +337,8 @@ static void __init sfi_handle_ipc_dev(struct sfi_device_table_entry *pentry, | |||
337 | pr_debug("IPC bus, name = %16.16s, irq = 0x%2x\n", | 337 | pr_debug("IPC bus, name = %16.16s, irq = 0x%2x\n", |
338 | pentry->name, pentry->irq); | 338 | pentry->name, pentry->irq); |
339 | pdata = intel_mid_sfi_get_pdata(dev, pentry); | 339 | pdata = intel_mid_sfi_get_pdata(dev, pentry); |
340 | if (IS_ERR(pdata)) | ||
341 | return; | ||
340 | 342 | ||
341 | pdev = platform_device_alloc(pentry->name, 0); | 343 | pdev = platform_device_alloc(pentry->name, 0); |
342 | if (pdev == NULL) { | 344 | if (pdev == NULL) { |
@@ -370,6 +372,8 @@ static void __init sfi_handle_spi_dev(struct sfi_device_table_entry *pentry, | |||
370 | spi_info.chip_select); | 372 | spi_info.chip_select); |
371 | 373 | ||
372 | pdata = intel_mid_sfi_get_pdata(dev, &spi_info); | 374 | pdata = intel_mid_sfi_get_pdata(dev, &spi_info); |
375 | if (IS_ERR(pdata)) | ||
376 | return; | ||
373 | 377 | ||
374 | spi_info.platform_data = pdata; | 378 | spi_info.platform_data = pdata; |
375 | if (dev->delay) | 379 | if (dev->delay) |
@@ -395,6 +399,8 @@ static void __init sfi_handle_i2c_dev(struct sfi_device_table_entry *pentry, | |||
395 | i2c_info.addr); | 399 | i2c_info.addr); |
396 | pdata = intel_mid_sfi_get_pdata(dev, &i2c_info); | 400 | pdata = intel_mid_sfi_get_pdata(dev, &i2c_info); |
397 | i2c_info.platform_data = pdata; | 401 | i2c_info.platform_data = pdata; |
402 | if (IS_ERR(pdata)) | ||
403 | return; | ||
398 | 404 | ||
399 | if (dev->delay) | 405 | if (dev->delay) |
400 | intel_scu_i2c_device_register(pentry->host_num, &i2c_info); | 406 | intel_scu_i2c_device_register(pentry->host_num, &i2c_info); |
@@ -443,13 +449,35 @@ static int __init sfi_parse_devs(struct sfi_table_header *table) | |||
443 | * so we have to enable them one by one here | 449 | * so we have to enable them one by one here |
444 | */ | 450 | */ |
445 | ioapic = mp_find_ioapic(irq); | 451 | ioapic = mp_find_ioapic(irq); |
446 | irq_attr.ioapic = ioapic; | 452 | if (ioapic >= 0) { |
447 | irq_attr.ioapic_pin = irq; | 453 | irq_attr.ioapic = ioapic; |
448 | irq_attr.trigger = 1; | 454 | irq_attr.ioapic_pin = irq; |
449 | irq_attr.polarity = 1; | 455 | irq_attr.trigger = 1; |
450 | io_apic_set_pci_routing(NULL, irq, &irq_attr); | 456 | if (intel_mid_identify_cpu() == |
451 | } else | 457 | INTEL_MID_CPU_CHIP_TANGIER) { |
458 | if (!strncmp(pentry->name, | ||
459 | "r69001-ts-i2c", 13)) | ||
460 | /* active low */ | ||
461 | irq_attr.polarity = 1; | ||
462 | else if (!strncmp(pentry->name, | ||
463 | "synaptics_3202", 14)) | ||
464 | /* active low */ | ||
465 | irq_attr.polarity = 1; | ||
466 | else if (irq == 41) | ||
467 | /* fast_int_1 */ | ||
468 | irq_attr.polarity = 1; | ||
469 | else | ||
470 | /* active high */ | ||
471 | irq_attr.polarity = 0; | ||
472 | } else { | ||
473 | /* PNW and CLV go with active low */ | ||
474 | irq_attr.polarity = 1; | ||
475 | } | ||
476 | io_apic_set_pci_routing(NULL, irq, &irq_attr); | ||
477 | } | ||
478 | } else { | ||
452 | irq = 0; /* No irq */ | 479 | irq = 0; /* No irq */ |
480 | } | ||
453 | 481 | ||
454 | dev = get_device_id(pentry->type, pentry->name); | 482 | dev = get_device_id(pentry->type, pentry->name); |
455 | 483 | ||
diff --git a/arch/x86/platform/iris/iris.c b/arch/x86/platform/iris/iris.c index e6cb80f620af..4d171e8640ef 100644 --- a/arch/x86/platform/iris/iris.c +++ b/arch/x86/platform/iris/iris.c | |||
@@ -27,7 +27,6 @@ | |||
27 | #include <linux/kernel.h> | 27 | #include <linux/kernel.h> |
28 | #include <linux/errno.h> | 28 | #include <linux/errno.h> |
29 | #include <linux/delay.h> | 29 | #include <linux/delay.h> |
30 | #include <linux/init.h> | ||
31 | #include <linux/pm.h> | 30 | #include <linux/pm.h> |
32 | #include <asm/io.h> | 31 | #include <asm/io.h> |
33 | 32 | ||
diff --git a/arch/x86/platform/uv/tlb_uv.c b/arch/x86/platform/uv/tlb_uv.c index 0f92173a12b6..dfe605ac1bcd 100644 --- a/arch/x86/platform/uv/tlb_uv.c +++ b/arch/x86/platform/uv/tlb_uv.c | |||
@@ -433,15 +433,49 @@ static void reset_with_ipi(struct pnmask *distribution, struct bau_control *bcp) | |||
433 | return; | 433 | return; |
434 | } | 434 | } |
435 | 435 | ||
436 | static inline unsigned long cycles_2_us(unsigned long long cyc) | 436 | /* |
437 | * Not to be confused with cycles_2_ns() from tsc.c; this gives a relative | ||
438 | * number, not an absolute. It converts a duration in cycles to a duration in | ||
439 | * ns. | ||
440 | */ | ||
441 | static inline unsigned long long cycles_2_ns(unsigned long long cyc) | ||
437 | { | 442 | { |
443 | struct cyc2ns_data *data = cyc2ns_read_begin(); | ||
438 | unsigned long long ns; | 444 | unsigned long long ns; |
439 | unsigned long us; | ||
440 | int cpu = smp_processor_id(); | ||
441 | 445 | ||
442 | ns = (cyc * per_cpu(cyc2ns, cpu)) >> CYC2NS_SCALE_FACTOR; | 446 | ns = mul_u64_u32_shr(cyc, data->cyc2ns_mul, data->cyc2ns_shift); |
443 | us = ns / 1000; | 447 | |
444 | return us; | 448 | cyc2ns_read_end(data); |
449 | return ns; | ||
450 | } | ||
451 | |||
452 | /* | ||
453 | * The reverse of the above; converts a duration in ns to a duration in cycles. | ||
454 | */ | ||
455 | static inline unsigned long long ns_2_cycles(unsigned long long ns) | ||
456 | { | ||
457 | struct cyc2ns_data *data = cyc2ns_read_begin(); | ||
458 | unsigned long long cyc; | ||
459 | |||
460 | cyc = (ns << data->cyc2ns_shift) / data->cyc2ns_mul; | ||
461 | |||
462 | cyc2ns_read_end(data); | ||
463 | return cyc; | ||
464 | } | ||
465 | |||
466 | static inline unsigned long cycles_2_us(unsigned long long cyc) | ||
467 | { | ||
468 | return cycles_2_ns(cyc) / NSEC_PER_USEC; | ||
469 | } | ||
470 | |||
471 | static inline cycles_t sec_2_cycles(unsigned long sec) | ||
472 | { | ||
473 | return ns_2_cycles(sec * NSEC_PER_SEC); | ||
474 | } | ||
475 | |||
476 | static inline unsigned long long usec_2_cycles(unsigned long usec) | ||
477 | { | ||
478 | return ns_2_cycles(usec * NSEC_PER_USEC); | ||
445 | } | 479 | } |
446 | 480 | ||
447 | /* | 481 | /* |
@@ -668,16 +702,6 @@ static int wait_completion(struct bau_desc *bau_desc, | |||
668 | bcp, try); | 702 | bcp, try); |
669 | } | 703 | } |
670 | 704 | ||
671 | static inline cycles_t sec_2_cycles(unsigned long sec) | ||
672 | { | ||
673 | unsigned long ns; | ||
674 | cycles_t cyc; | ||
675 | |||
676 | ns = sec * 1000000000; | ||
677 | cyc = (ns << CYC2NS_SCALE_FACTOR)/(per_cpu(cyc2ns, smp_processor_id())); | ||
678 | return cyc; | ||
679 | } | ||
680 | |||
681 | /* | 705 | /* |
682 | * Our retries are blocked by all destination sw ack resources being | 706 | * Our retries are blocked by all destination sw ack resources being |
683 | * in use, and a timeout is pending. In that case hardware immediately | 707 | * in use, and a timeout is pending. In that case hardware immediately |
@@ -1070,12 +1094,13 @@ const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask, | |||
1070 | unsigned long status; | 1094 | unsigned long status; |
1071 | 1095 | ||
1072 | bcp = &per_cpu(bau_control, cpu); | 1096 | bcp = &per_cpu(bau_control, cpu); |
1073 | stat = bcp->statp; | ||
1074 | stat->s_enters++; | ||
1075 | 1097 | ||
1076 | if (bcp->nobau) | 1098 | if (bcp->nobau) |
1077 | return cpumask; | 1099 | return cpumask; |
1078 | 1100 | ||
1101 | stat = bcp->statp; | ||
1102 | stat->s_enters++; | ||
1103 | |||
1079 | if (bcp->busy) { | 1104 | if (bcp->busy) { |
1080 | descriptor_status = | 1105 | descriptor_status = |
1081 | read_lmmr(UVH_LB_BAU_SB_ACTIVATION_STATUS_0); | 1106 | read_lmmr(UVH_LB_BAU_SB_ACTIVATION_STATUS_0); |
@@ -1326,16 +1351,6 @@ static void ptc_seq_stop(struct seq_file *file, void *data) | |||
1326 | { | 1351 | { |
1327 | } | 1352 | } |
1328 | 1353 | ||
1329 | static inline unsigned long long usec_2_cycles(unsigned long microsec) | ||
1330 | { | ||
1331 | unsigned long ns; | ||
1332 | unsigned long long cyc; | ||
1333 | |||
1334 | ns = microsec * 1000; | ||
1335 | cyc = (ns << CYC2NS_SCALE_FACTOR)/(per_cpu(cyc2ns, smp_processor_id())); | ||
1336 | return cyc; | ||
1337 | } | ||
1338 | |||
1339 | /* | 1354 | /* |
1340 | * Display the statistics thru /proc/sgi_uv/ptc_statistics | 1355 | * Display the statistics thru /proc/sgi_uv/ptc_statistics |
1341 | * 'data' points to the cpu number | 1356 | * 'data' points to the cpu number |
diff --git a/arch/x86/realmode/init.c b/arch/x86/realmode/init.c index a44f457e70a1..bad628a620c4 100644 --- a/arch/x86/realmode/init.c +++ b/arch/x86/realmode/init.c | |||
@@ -29,12 +29,10 @@ void __init reserve_real_mode(void) | |||
29 | void __init setup_real_mode(void) | 29 | void __init setup_real_mode(void) |
30 | { | 30 | { |
31 | u16 real_mode_seg; | 31 | u16 real_mode_seg; |
32 | u32 *rel; | 32 | const u32 *rel; |
33 | u32 count; | 33 | u32 count; |
34 | u32 *ptr; | ||
35 | u16 *seg; | ||
36 | int i; | ||
37 | unsigned char *base; | 34 | unsigned char *base; |
35 | unsigned long phys_base; | ||
38 | struct trampoline_header *trampoline_header; | 36 | struct trampoline_header *trampoline_header; |
39 | size_t size = PAGE_ALIGN(real_mode_blob_end - real_mode_blob); | 37 | size_t size = PAGE_ALIGN(real_mode_blob_end - real_mode_blob); |
40 | #ifdef CONFIG_X86_64 | 38 | #ifdef CONFIG_X86_64 |
@@ -46,23 +44,23 @@ void __init setup_real_mode(void) | |||
46 | 44 | ||
47 | memcpy(base, real_mode_blob, size); | 45 | memcpy(base, real_mode_blob, size); |
48 | 46 | ||
49 | real_mode_seg = __pa(base) >> 4; | 47 | phys_base = __pa(base); |
48 | real_mode_seg = phys_base >> 4; | ||
49 | |||
50 | rel = (u32 *) real_mode_relocs; | 50 | rel = (u32 *) real_mode_relocs; |
51 | 51 | ||
52 | /* 16-bit segment relocations. */ | 52 | /* 16-bit segment relocations. */ |
53 | count = rel[0]; | 53 | count = *rel++; |
54 | rel = &rel[1]; | 54 | while (count--) { |
55 | for (i = 0; i < count; i++) { | 55 | u16 *seg = (u16 *) (base + *rel++); |
56 | seg = (u16 *) (base + rel[i]); | ||
57 | *seg = real_mode_seg; | 56 | *seg = real_mode_seg; |
58 | } | 57 | } |
59 | 58 | ||
60 | /* 32-bit linear relocations. */ | 59 | /* 32-bit linear relocations. */ |
61 | count = rel[i]; | 60 | count = *rel++; |
62 | rel = &rel[i + 1]; | 61 | while (count--) { |
63 | for (i = 0; i < count; i++) { | 62 | u32 *ptr = (u32 *) (base + *rel++); |
64 | ptr = (u32 *) (base + rel[i]); | 63 | *ptr += phys_base; |
65 | *ptr += __pa(base); | ||
66 | } | 64 | } |
67 | 65 | ||
68 | /* Must be perfomed *after* relocation. */ | 66 | /* Must be perfomed *after* relocation. */ |
diff --git a/arch/x86/realmode/rm/Makefile b/arch/x86/realmode/rm/Makefile index 88692871823f..9cac82588cbc 100644 --- a/arch/x86/realmode/rm/Makefile +++ b/arch/x86/realmode/rm/Makefile | |||
@@ -73,9 +73,10 @@ KBUILD_CFLAGS := $(LINUXINCLUDE) -m32 -g -Os -D_SETUP -D__KERNEL__ -D_WAKEUP \ | |||
73 | -march=i386 -mregparm=3 \ | 73 | -march=i386 -mregparm=3 \ |
74 | -include $(srctree)/$(src)/../../boot/code16gcc.h \ | 74 | -include $(srctree)/$(src)/../../boot/code16gcc.h \ |
75 | -fno-strict-aliasing -fomit-frame-pointer -fno-pic \ | 75 | -fno-strict-aliasing -fomit-frame-pointer -fno-pic \ |
76 | -mno-mmx -mno-sse \ | ||
76 | $(call cc-option, -ffreestanding) \ | 77 | $(call cc-option, -ffreestanding) \ |
77 | $(call cc-option, -fno-toplevel-reorder,\ | 78 | $(call cc-option, -fno-toplevel-reorder,\ |
78 | $(call cc-option, -fno-unit-at-a-time)) \ | 79 | $(call cc-option, -fno-unit-at-a-time)) \ |
79 | $(call cc-option, -fno-stack-protector) \ | 80 | $(call cc-option, -fno-stack-protector) \ |
80 | $(call cc-option, -mpreferred-stack-boundary=2) | 81 | $(call cc-option, -mpreferred-stack-boundary=2) |
81 | KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__ | 82 | KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__ |
diff --git a/arch/x86/realmode/rm/reboot.S b/arch/x86/realmode/rm/reboot.S index f932ea61d1c8..d66c607bdc58 100644 --- a/arch/x86/realmode/rm/reboot.S +++ b/arch/x86/realmode/rm/reboot.S | |||
@@ -1,5 +1,4 @@ | |||
1 | #include <linux/linkage.h> | 1 | #include <linux/linkage.h> |
2 | #include <linux/init.h> | ||
3 | #include <asm/segment.h> | 2 | #include <asm/segment.h> |
4 | #include <asm/page_types.h> | 3 | #include <asm/page_types.h> |
5 | #include <asm/processor-flags.h> | 4 | #include <asm/processor-flags.h> |
diff --git a/arch/x86/realmode/rm/trampoline_32.S b/arch/x86/realmode/rm/trampoline_32.S index c1b2791183e7..48ddd76bc4c3 100644 --- a/arch/x86/realmode/rm/trampoline_32.S +++ b/arch/x86/realmode/rm/trampoline_32.S | |||
@@ -20,7 +20,6 @@ | |||
20 | */ | 20 | */ |
21 | 21 | ||
22 | #include <linux/linkage.h> | 22 | #include <linux/linkage.h> |
23 | #include <linux/init.h> | ||
24 | #include <asm/segment.h> | 23 | #include <asm/segment.h> |
25 | #include <asm/page_types.h> | 24 | #include <asm/page_types.h> |
26 | #include "realmode.h" | 25 | #include "realmode.h" |
diff --git a/arch/x86/realmode/rm/trampoline_64.S b/arch/x86/realmode/rm/trampoline_64.S index bb360dc39d21..dac7b20d2f9d 100644 --- a/arch/x86/realmode/rm/trampoline_64.S +++ b/arch/x86/realmode/rm/trampoline_64.S | |||
@@ -25,7 +25,6 @@ | |||
25 | */ | 25 | */ |
26 | 26 | ||
27 | #include <linux/linkage.h> | 27 | #include <linux/linkage.h> |
28 | #include <linux/init.h> | ||
29 | #include <asm/pgtable_types.h> | 28 | #include <asm/pgtable_types.h> |
30 | #include <asm/page_types.h> | 29 | #include <asm/page_types.h> |
31 | #include <asm/msr.h> | 30 | #include <asm/msr.h> |
diff --git a/arch/x86/syscalls/syscall_32.tbl b/arch/x86/syscalls/syscall_32.tbl index aabfb8380a1c..96bc506ac6de 100644 --- a/arch/x86/syscalls/syscall_32.tbl +++ b/arch/x86/syscalls/syscall_32.tbl | |||
@@ -357,3 +357,5 @@ | |||
357 | 348 i386 process_vm_writev sys_process_vm_writev compat_sys_process_vm_writev | 357 | 348 i386 process_vm_writev sys_process_vm_writev compat_sys_process_vm_writev |
358 | 349 i386 kcmp sys_kcmp | 358 | 349 i386 kcmp sys_kcmp |
359 | 350 i386 finit_module sys_finit_module | 359 | 350 i386 finit_module sys_finit_module |
360 | 351 i386 sched_setattr sys_sched_setattr | ||
361 | 352 i386 sched_getattr sys_sched_getattr | ||
diff --git a/arch/x86/syscalls/syscall_64.tbl b/arch/x86/syscalls/syscall_64.tbl index 38ae65dfd14f..a12bddc7ccea 100644 --- a/arch/x86/syscalls/syscall_64.tbl +++ b/arch/x86/syscalls/syscall_64.tbl | |||
@@ -320,6 +320,8 @@ | |||
320 | 311 64 process_vm_writev sys_process_vm_writev | 320 | 311 64 process_vm_writev sys_process_vm_writev |
321 | 312 common kcmp sys_kcmp | 321 | 312 common kcmp sys_kcmp |
322 | 313 common finit_module sys_finit_module | 322 | 313 common finit_module sys_finit_module |
323 | 314 common sched_setattr sys_sched_setattr | ||
324 | 315 common sched_getattr sys_sched_getattr | ||
323 | 325 | ||
324 | # | 326 | # |
325 | # x32-specific system call numbers start at 512 to avoid cache impact | 327 | # x32-specific system call numbers start at 512 to avoid cache impact |
diff --git a/arch/x86/tools/relocs.c b/arch/x86/tools/relocs.c index f7bab68a4b83..11f9285a2ff6 100644 --- a/arch/x86/tools/relocs.c +++ b/arch/x86/tools/relocs.c | |||
@@ -722,15 +722,25 @@ static void percpu_init(void) | |||
722 | 722 | ||
723 | /* | 723 | /* |
724 | * Check to see if a symbol lies in the .data..percpu section. | 724 | * Check to see if a symbol lies in the .data..percpu section. |
725 | * For some as yet not understood reason the "__init_begin" | 725 | * |
726 | * symbol which immediately preceeds the .data..percpu section | 726 | * The linker incorrectly associates some symbols with the |
727 | * also shows up as it it were part of it so we do an explict | 727 | * .data..percpu section so we also need to check the symbol |
728 | * check for that symbol name and ignore it. | 728 | * name to make sure that we classify the symbol correctly. |
729 | * | ||
730 | * The GNU linker incorrectly associates: | ||
731 | * __init_begin | ||
732 | * __per_cpu_load | ||
733 | * | ||
734 | * The "gold" linker incorrectly associates: | ||
735 | * init_per_cpu__irq_stack_union | ||
736 | * init_per_cpu__gdt_page | ||
729 | */ | 737 | */ |
730 | static int is_percpu_sym(ElfW(Sym) *sym, const char *symname) | 738 | static int is_percpu_sym(ElfW(Sym) *sym, const char *symname) |
731 | { | 739 | { |
732 | return (sym->st_shndx == per_cpu_shndx) && | 740 | return (sym->st_shndx == per_cpu_shndx) && |
733 | strcmp(symname, "__init_begin"); | 741 | strcmp(symname, "__init_begin") && |
742 | strcmp(symname, "__per_cpu_load") && | ||
743 | strncmp(symname, "init_per_cpu_", 13); | ||
734 | } | 744 | } |
735 | 745 | ||
736 | 746 | ||
diff --git a/arch/x86/vdso/vclock_gettime.c b/arch/x86/vdso/vclock_gettime.c index 2ada505067cc..eb5d7a56f8d4 100644 --- a/arch/x86/vdso/vclock_gettime.c +++ b/arch/x86/vdso/vclock_gettime.c | |||
@@ -178,7 +178,7 @@ notrace static int __always_inline do_realtime(struct timespec *ts) | |||
178 | 178 | ||
179 | ts->tv_nsec = 0; | 179 | ts->tv_nsec = 0; |
180 | do { | 180 | do { |
181 | seq = read_seqcount_begin_no_lockdep(>od->seq); | 181 | seq = raw_read_seqcount_begin(>od->seq); |
182 | mode = gtod->clock.vclock_mode; | 182 | mode = gtod->clock.vclock_mode; |
183 | ts->tv_sec = gtod->wall_time_sec; | 183 | ts->tv_sec = gtod->wall_time_sec; |
184 | ns = gtod->wall_time_snsec; | 184 | ns = gtod->wall_time_snsec; |
@@ -198,7 +198,7 @@ notrace static int do_monotonic(struct timespec *ts) | |||
198 | 198 | ||
199 | ts->tv_nsec = 0; | 199 | ts->tv_nsec = 0; |
200 | do { | 200 | do { |
201 | seq = read_seqcount_begin_no_lockdep(>od->seq); | 201 | seq = raw_read_seqcount_begin(>od->seq); |
202 | mode = gtod->clock.vclock_mode; | 202 | mode = gtod->clock.vclock_mode; |
203 | ts->tv_sec = gtod->monotonic_time_sec; | 203 | ts->tv_sec = gtod->monotonic_time_sec; |
204 | ns = gtod->monotonic_time_snsec; | 204 | ns = gtod->monotonic_time_snsec; |
@@ -214,7 +214,7 @@ notrace static int do_realtime_coarse(struct timespec *ts) | |||
214 | { | 214 | { |
215 | unsigned long seq; | 215 | unsigned long seq; |
216 | do { | 216 | do { |
217 | seq = read_seqcount_begin_no_lockdep(>od->seq); | 217 | seq = raw_read_seqcount_begin(>od->seq); |
218 | ts->tv_sec = gtod->wall_time_coarse.tv_sec; | 218 | ts->tv_sec = gtod->wall_time_coarse.tv_sec; |
219 | ts->tv_nsec = gtod->wall_time_coarse.tv_nsec; | 219 | ts->tv_nsec = gtod->wall_time_coarse.tv_nsec; |
220 | } while (unlikely(read_seqcount_retry(>od->seq, seq))); | 220 | } while (unlikely(read_seqcount_retry(>od->seq, seq))); |
@@ -225,7 +225,7 @@ notrace static int do_monotonic_coarse(struct timespec *ts) | |||
225 | { | 225 | { |
226 | unsigned long seq; | 226 | unsigned long seq; |
227 | do { | 227 | do { |
228 | seq = read_seqcount_begin_no_lockdep(>od->seq); | 228 | seq = raw_read_seqcount_begin(>od->seq); |
229 | ts->tv_sec = gtod->monotonic_time_coarse.tv_sec; | 229 | ts->tv_sec = gtod->monotonic_time_coarse.tv_sec; |
230 | ts->tv_nsec = gtod->monotonic_time_coarse.tv_nsec; | 230 | ts->tv_nsec = gtod->monotonic_time_coarse.tv_nsec; |
231 | } while (unlikely(read_seqcount_retry(>od->seq, seq))); | 231 | } while (unlikely(read_seqcount_retry(>od->seq, seq))); |
diff --git a/arch/x86/vdso/vdso.S b/arch/x86/vdso/vdso.S index 01f5e3b4613c..1e13eb8c9656 100644 --- a/arch/x86/vdso/vdso.S +++ b/arch/x86/vdso/vdso.S | |||
@@ -1,6 +1,5 @@ | |||
1 | #include <asm/page_types.h> | 1 | #include <asm/page_types.h> |
2 | #include <linux/linkage.h> | 2 | #include <linux/linkage.h> |
3 | #include <linux/init.h> | ||
4 | 3 | ||
5 | __PAGE_ALIGNED_DATA | 4 | __PAGE_ALIGNED_DATA |
6 | 5 | ||
diff --git a/arch/x86/vdso/vdsox32.S b/arch/x86/vdso/vdsox32.S index d6b9a7f42a8a..295f1c7543d8 100644 --- a/arch/x86/vdso/vdsox32.S +++ b/arch/x86/vdso/vdsox32.S | |||
@@ -1,6 +1,5 @@ | |||
1 | #include <asm/page_types.h> | 1 | #include <asm/page_types.h> |
2 | #include <linux/linkage.h> | 2 | #include <linux/linkage.h> |
3 | #include <linux/init.h> | ||
4 | 3 | ||
5 | __PAGE_ALIGNED_DATA | 4 | __PAGE_ALIGNED_DATA |
6 | 5 | ||
diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig index 8d24dcb7cdac..f8df0cc70cb6 100644 --- a/arch/xtensa/Kconfig +++ b/arch/xtensa/Kconfig | |||
@@ -64,6 +64,9 @@ config MMU | |||
64 | config VARIANT_IRQ_SWITCH | 64 | config VARIANT_IRQ_SWITCH |
65 | def_bool n | 65 | def_bool n |
66 | 66 | ||
67 | config HAVE_XTENSA_GPIO32 | ||
68 | def_bool n | ||
69 | |||
67 | menu "Processor type and features" | 70 | menu "Processor type and features" |
68 | 71 | ||
69 | choice | 72 | choice |
@@ -73,16 +76,19 @@ choice | |||
73 | config XTENSA_VARIANT_FSF | 76 | config XTENSA_VARIANT_FSF |
74 | bool "fsf - default (not generic) configuration" | 77 | bool "fsf - default (not generic) configuration" |
75 | select MMU | 78 | select MMU |
79 | select HAVE_XTENSA_GPIO32 | ||
76 | 80 | ||
77 | config XTENSA_VARIANT_DC232B | 81 | config XTENSA_VARIANT_DC232B |
78 | bool "dc232b - Diamond 232L Standard Core Rev.B (LE)" | 82 | bool "dc232b - Diamond 232L Standard Core Rev.B (LE)" |
79 | select MMU | 83 | select MMU |
84 | select HAVE_XTENSA_GPIO32 | ||
80 | help | 85 | help |
81 | This variant refers to Tensilica's Diamond 232L Standard core Rev.B (LE). | 86 | This variant refers to Tensilica's Diamond 232L Standard core Rev.B (LE). |
82 | 87 | ||
83 | config XTENSA_VARIANT_DC233C | 88 | config XTENSA_VARIANT_DC233C |
84 | bool "dc233c - Diamond 233L Standard Core Rev.C (LE)" | 89 | bool "dc233c - Diamond 233L Standard Core Rev.C (LE)" |
85 | select MMU | 90 | select MMU |
91 | select HAVE_XTENSA_GPIO32 | ||
86 | help | 92 | help |
87 | This variant refers to Tensilica's Diamond 233L Standard core Rev.C (LE). | 93 | This variant refers to Tensilica's Diamond 233L Standard core Rev.C (LE). |
88 | 94 | ||
diff --git a/arch/xtensa/include/asm/barrier.h b/arch/xtensa/include/asm/barrier.h index ef021677d536..e1ee6b51dfc5 100644 --- a/arch/xtensa/include/asm/barrier.h +++ b/arch/xtensa/include/asm/barrier.h | |||
@@ -9,21 +9,14 @@ | |||
9 | #ifndef _XTENSA_SYSTEM_H | 9 | #ifndef _XTENSA_SYSTEM_H |
10 | #define _XTENSA_SYSTEM_H | 10 | #define _XTENSA_SYSTEM_H |
11 | 11 | ||
12 | #define smp_read_barrier_depends() do { } while(0) | ||
13 | #define read_barrier_depends() do { } while(0) | ||
14 | |||
15 | #define mb() ({ __asm__ __volatile__("memw" : : : "memory"); }) | 12 | #define mb() ({ __asm__ __volatile__("memw" : : : "memory"); }) |
16 | #define rmb() barrier() | 13 | #define rmb() barrier() |
17 | #define wmb() mb() | 14 | #define wmb() mb() |
18 | 15 | ||
19 | #ifdef CONFIG_SMP | 16 | #ifdef CONFIG_SMP |
20 | #error smp_* not defined | 17 | #error smp_* not defined |
21 | #else | ||
22 | #define smp_mb() barrier() | ||
23 | #define smp_rmb() barrier() | ||
24 | #define smp_wmb() barrier() | ||
25 | #endif | 18 | #endif |
26 | 19 | ||
27 | #define set_mb(var, value) do { var = value; mb(); } while (0) | 20 | #include <asm-generic/barrier.h> |
28 | 21 | ||
29 | #endif /* _XTENSA_SYSTEM_H */ | 22 | #endif /* _XTENSA_SYSTEM_H */ |