diff options
Diffstat (limited to 'arch')
107 files changed, 870 insertions, 425 deletions
diff --git a/arch/alpha/Makefile b/arch/alpha/Makefile index 4759fe751aa1..2cc3cc519c54 100644 --- a/arch/alpha/Makefile +++ b/arch/alpha/Makefile | |||
| @@ -12,7 +12,7 @@ NM := $(NM) -B | |||
| 12 | 12 | ||
| 13 | LDFLAGS_vmlinux := -static -N #-relax | 13 | LDFLAGS_vmlinux := -static -N #-relax |
| 14 | CHECKFLAGS += -D__alpha__ -m64 | 14 | CHECKFLAGS += -D__alpha__ -m64 |
| 15 | cflags-y := -pipe -mno-fp-regs -ffixed-8 -msmall-data | 15 | cflags-y := -pipe -mno-fp-regs -ffixed-8 |
| 16 | cflags-y += $(call cc-option, -fno-jump-tables) | 16 | cflags-y += $(call cc-option, -fno-jump-tables) |
| 17 | 17 | ||
| 18 | cpuflags-$(CONFIG_ALPHA_EV4) := -mcpu=ev4 | 18 | cpuflags-$(CONFIG_ALPHA_EV4) := -mcpu=ev4 |
diff --git a/arch/alpha/include/asm/floppy.h b/arch/alpha/include/asm/floppy.h index 46cefbd50e73..bae97eb19d26 100644 --- a/arch/alpha/include/asm/floppy.h +++ b/arch/alpha/include/asm/floppy.h | |||
| @@ -26,7 +26,7 @@ | |||
| 26 | #define fd_disable_irq() disable_irq(FLOPPY_IRQ) | 26 | #define fd_disable_irq() disable_irq(FLOPPY_IRQ) |
| 27 | #define fd_cacheflush(addr,size) /* nothing */ | 27 | #define fd_cacheflush(addr,size) /* nothing */ |
| 28 | #define fd_request_irq() request_irq(FLOPPY_IRQ, floppy_interrupt,\ | 28 | #define fd_request_irq() request_irq(FLOPPY_IRQ, floppy_interrupt,\ |
| 29 | IRQF_DISABLED, "floppy", NULL) | 29 | 0, "floppy", NULL) |
| 30 | #define fd_free_irq() free_irq(FLOPPY_IRQ, NULL) | 30 | #define fd_free_irq() free_irq(FLOPPY_IRQ, NULL) |
| 31 | 31 | ||
| 32 | #ifdef CONFIG_PCI | 32 | #ifdef CONFIG_PCI |
diff --git a/arch/alpha/kernel/irq.c b/arch/alpha/kernel/irq.c index 2872accd2215..7b2be251c30f 100644 --- a/arch/alpha/kernel/irq.c +++ b/arch/alpha/kernel/irq.c | |||
| @@ -117,13 +117,6 @@ handle_irq(int irq) | |||
| 117 | return; | 117 | return; |
| 118 | } | 118 | } |
| 119 | 119 | ||
| 120 | /* | ||
| 121 | * From here we must proceed with IPL_MAX. Note that we do not | ||
| 122 | * explicitly enable interrupts afterwards - some MILO PALcode | ||
| 123 | * (namely LX164 one) seems to have severe problems with RTI | ||
| 124 | * at IPL 0. | ||
| 125 | */ | ||
| 126 | local_irq_disable(); | ||
| 127 | irq_enter(); | 120 | irq_enter(); |
| 128 | generic_handle_irq_desc(irq, desc); | 121 | generic_handle_irq_desc(irq, desc); |
| 129 | irq_exit(); | 122 | irq_exit(); |
diff --git a/arch/alpha/kernel/irq_alpha.c b/arch/alpha/kernel/irq_alpha.c index 772ddfdb71a8..f433fc11877a 100644 --- a/arch/alpha/kernel/irq_alpha.c +++ b/arch/alpha/kernel/irq_alpha.c | |||
| @@ -45,6 +45,14 @@ do_entInt(unsigned long type, unsigned long vector, | |||
| 45 | unsigned long la_ptr, struct pt_regs *regs) | 45 | unsigned long la_ptr, struct pt_regs *regs) |
| 46 | { | 46 | { |
| 47 | struct pt_regs *old_regs; | 47 | struct pt_regs *old_regs; |
| 48 | |||
| 49 | /* | ||
| 50 | * Disable interrupts during IRQ handling. | ||
| 51 | * Note that there is no matching local_irq_enable() due to | ||
| 52 | * severe problems with RTI at IPL0 and some MILO PALcode | ||
| 53 | * (namely LX164). | ||
| 54 | */ | ||
| 55 | local_irq_disable(); | ||
| 48 | switch (type) { | 56 | switch (type) { |
| 49 | case 0: | 57 | case 0: |
| 50 | #ifdef CONFIG_SMP | 58 | #ifdef CONFIG_SMP |
| @@ -62,7 +70,6 @@ do_entInt(unsigned long type, unsigned long vector, | |||
| 62 | { | 70 | { |
| 63 | long cpu; | 71 | long cpu; |
| 64 | 72 | ||
| 65 | local_irq_disable(); | ||
| 66 | smp_percpu_timer_interrupt(regs); | 73 | smp_percpu_timer_interrupt(regs); |
| 67 | cpu = smp_processor_id(); | 74 | cpu = smp_processor_id(); |
| 68 | if (cpu != boot_cpuid) { | 75 | if (cpu != boot_cpuid) { |
| @@ -222,7 +229,6 @@ process_mcheck_info(unsigned long vector, unsigned long la_ptr, | |||
| 222 | 229 | ||
| 223 | struct irqaction timer_irqaction = { | 230 | struct irqaction timer_irqaction = { |
| 224 | .handler = timer_interrupt, | 231 | .handler = timer_interrupt, |
| 225 | .flags = IRQF_DISABLED, | ||
| 226 | .name = "timer", | 232 | .name = "timer", |
| 227 | }; | 233 | }; |
| 228 | 234 | ||
diff --git a/arch/alpha/kernel/sys_nautilus.c b/arch/alpha/kernel/sys_nautilus.c index 4d4c046f708d..1383f8601a93 100644 --- a/arch/alpha/kernel/sys_nautilus.c +++ b/arch/alpha/kernel/sys_nautilus.c | |||
| @@ -188,6 +188,10 @@ nautilus_machine_check(unsigned long vector, unsigned long la_ptr) | |||
| 188 | extern void free_reserved_mem(void *, void *); | 188 | extern void free_reserved_mem(void *, void *); |
| 189 | extern void pcibios_claim_one_bus(struct pci_bus *); | 189 | extern void pcibios_claim_one_bus(struct pci_bus *); |
| 190 | 190 | ||
| 191 | static struct resource irongate_io = { | ||
| 192 | .name = "Irongate PCI IO", | ||
| 193 | .flags = IORESOURCE_IO, | ||
| 194 | }; | ||
| 191 | static struct resource irongate_mem = { | 195 | static struct resource irongate_mem = { |
| 192 | .name = "Irongate PCI MEM", | 196 | .name = "Irongate PCI MEM", |
| 193 | .flags = IORESOURCE_MEM, | 197 | .flags = IORESOURCE_MEM, |
| @@ -209,6 +213,7 @@ nautilus_init_pci(void) | |||
| 209 | 213 | ||
| 210 | irongate = pci_get_bus_and_slot(0, 0); | 214 | irongate = pci_get_bus_and_slot(0, 0); |
| 211 | bus->self = irongate; | 215 | bus->self = irongate; |
| 216 | bus->resource[0] = &irongate_io; | ||
| 212 | bus->resource[1] = &irongate_mem; | 217 | bus->resource[1] = &irongate_mem; |
| 213 | 218 | ||
| 214 | pci_bus_size_bridges(bus); | 219 | pci_bus_size_bridges(bus); |
diff --git a/arch/alpha/kernel/sys_titan.c b/arch/alpha/kernel/sys_titan.c index 5cf4a481b8c5..a53cf03f49d5 100644 --- a/arch/alpha/kernel/sys_titan.c +++ b/arch/alpha/kernel/sys_titan.c | |||
| @@ -280,15 +280,15 @@ titan_late_init(void) | |||
| 280 | * all reported to the kernel as machine checks, so the handler | 280 | * all reported to the kernel as machine checks, so the handler |
| 281 | * is a nop so it can be called to count the individual events. | 281 | * is a nop so it can be called to count the individual events. |
| 282 | */ | 282 | */ |
| 283 | titan_request_irq(63+16, titan_intr_nop, IRQF_DISABLED, | 283 | titan_request_irq(63+16, titan_intr_nop, 0, |
| 284 | "CChip Error", NULL); | 284 | "CChip Error", NULL); |
| 285 | titan_request_irq(62+16, titan_intr_nop, IRQF_DISABLED, | 285 | titan_request_irq(62+16, titan_intr_nop, 0, |
| 286 | "PChip 0 H_Error", NULL); | 286 | "PChip 0 H_Error", NULL); |
| 287 | titan_request_irq(61+16, titan_intr_nop, IRQF_DISABLED, | 287 | titan_request_irq(61+16, titan_intr_nop, 0, |
| 288 | "PChip 1 H_Error", NULL); | 288 | "PChip 1 H_Error", NULL); |
| 289 | titan_request_irq(60+16, titan_intr_nop, IRQF_DISABLED, | 289 | titan_request_irq(60+16, titan_intr_nop, 0, |
| 290 | "PChip 0 C_Error", NULL); | 290 | "PChip 0 C_Error", NULL); |
| 291 | titan_request_irq(59+16, titan_intr_nop, IRQF_DISABLED, | 291 | titan_request_irq(59+16, titan_intr_nop, 0, |
| 292 | "PChip 1 C_Error", NULL); | 292 | "PChip 1 C_Error", NULL); |
| 293 | 293 | ||
| 294 | /* | 294 | /* |
| @@ -348,9 +348,9 @@ privateer_init_pci(void) | |||
| 348 | * Hook a couple of extra err interrupts that the | 348 | * Hook a couple of extra err interrupts that the |
| 349 | * common titan code won't. | 349 | * common titan code won't. |
| 350 | */ | 350 | */ |
| 351 | titan_request_irq(53+16, titan_intr_nop, IRQF_DISABLED, | 351 | titan_request_irq(53+16, titan_intr_nop, 0, |
| 352 | "NMI", NULL); | 352 | "NMI", NULL); |
| 353 | titan_request_irq(50+16, titan_intr_nop, IRQF_DISABLED, | 353 | titan_request_irq(50+16, titan_intr_nop, 0, |
| 354 | "Temperature Warning", NULL); | 354 | "Temperature Warning", NULL); |
| 355 | 355 | ||
| 356 | /* | 356 | /* |
diff --git a/arch/arc/include/asm/irqflags.h b/arch/arc/include/asm/irqflags.h index ccd84806b62f..eac071668201 100644 --- a/arch/arc/include/asm/irqflags.h +++ b/arch/arc/include/asm/irqflags.h | |||
| @@ -39,7 +39,7 @@ static inline long arch_local_irq_save(void) | |||
| 39 | " flag.nz %0 \n" | 39 | " flag.nz %0 \n" |
| 40 | : "=r"(temp), "=r"(flags) | 40 | : "=r"(temp), "=r"(flags) |
| 41 | : "n"((STATUS_E1_MASK | STATUS_E2_MASK)) | 41 | : "n"((STATUS_E1_MASK | STATUS_E2_MASK)) |
| 42 | : "cc"); | 42 | : "memory", "cc"); |
| 43 | 43 | ||
| 44 | return flags; | 44 | return flags; |
| 45 | } | 45 | } |
| @@ -53,7 +53,8 @@ static inline void arch_local_irq_restore(unsigned long flags) | |||
| 53 | __asm__ __volatile__( | 53 | __asm__ __volatile__( |
| 54 | " flag %0 \n" | 54 | " flag %0 \n" |
| 55 | : | 55 | : |
| 56 | : "r"(flags)); | 56 | : "r"(flags) |
| 57 | : "memory"); | ||
| 57 | } | 58 | } |
| 58 | 59 | ||
| 59 | /* | 60 | /* |
| @@ -73,7 +74,8 @@ static inline void arch_local_irq_disable(void) | |||
| 73 | " and %0, %0, %1 \n" | 74 | " and %0, %0, %1 \n" |
| 74 | " flag %0 \n" | 75 | " flag %0 \n" |
| 75 | : "=&r"(temp) | 76 | : "=&r"(temp) |
| 76 | : "n"(~(STATUS_E1_MASK | STATUS_E2_MASK))); | 77 | : "n"(~(STATUS_E1_MASK | STATUS_E2_MASK)) |
| 78 | : "memory"); | ||
| 77 | } | 79 | } |
| 78 | 80 | ||
| 79 | /* | 81 | /* |
| @@ -85,7 +87,9 @@ static inline long arch_local_save_flags(void) | |||
| 85 | 87 | ||
| 86 | __asm__ __volatile__( | 88 | __asm__ __volatile__( |
| 87 | " lr %0, [status32] \n" | 89 | " lr %0, [status32] \n" |
| 88 | : "=&r"(temp)); | 90 | : "=&r"(temp) |
| 91 | : | ||
| 92 | : "memory"); | ||
| 89 | 93 | ||
| 90 | return temp; | 94 | return temp; |
| 91 | } | 95 | } |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 13b739469c51..1cacda426a0e 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
| @@ -1183,9 +1183,9 @@ config ARM_NR_BANKS | |||
| 1183 | default 8 | 1183 | default 8 |
| 1184 | 1184 | ||
| 1185 | config IWMMXT | 1185 | config IWMMXT |
| 1186 | bool "Enable iWMMXt support" | 1186 | bool "Enable iWMMXt support" if !CPU_PJ4 |
| 1187 | depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4 | 1187 | depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4 |
| 1188 | default y if PXA27x || PXA3xx || ARCH_MMP | 1188 | default y if PXA27x || PXA3xx || ARCH_MMP || CPU_PJ4 |
| 1189 | help | 1189 | help |
| 1190 | Enable support for iWMMXt context switching at run time if | 1190 | Enable support for iWMMXt context switching at run time if |
| 1191 | running on a CPU that supports it. | 1191 | running on a CPU that supports it. |
| @@ -1439,6 +1439,16 @@ config ARM_ERRATA_775420 | |||
| 1439 | to deadlock. This workaround puts DSB before executing ISB if | 1439 | to deadlock. This workaround puts DSB before executing ISB if |
| 1440 | an abort may occur on cache maintenance. | 1440 | an abort may occur on cache maintenance. |
| 1441 | 1441 | ||
| 1442 | config ARM_ERRATA_798181 | ||
| 1443 | bool "ARM errata: TLBI/DSB failure on Cortex-A15" | ||
| 1444 | depends on CPU_V7 && SMP | ||
| 1445 | help | ||
| 1446 | On Cortex-A15 (r0p0..r3p2) the TLBI*IS/DSB operations are not | ||
| 1447 | adequately shooting down all use of the old entries. This | ||
| 1448 | option enables the Linux kernel workaround for this erratum | ||
| 1449 | which sends an IPI to the CPUs that are running the same ASID | ||
| 1450 | as the one being invalidated. | ||
| 1451 | |||
| 1442 | endmenu | 1452 | endmenu |
| 1443 | 1453 | ||
| 1444 | source "arch/arm/common/Kconfig" | 1454 | source "arch/arm/common/Kconfig" |
diff --git a/arch/arm/boot/dts/armada-370-mirabox.dts b/arch/arm/boot/dts/armada-370-mirabox.dts index dd0c57dd9f30..3234875824dc 100644 --- a/arch/arm/boot/dts/armada-370-mirabox.dts +++ b/arch/arm/boot/dts/armada-370-mirabox.dts | |||
| @@ -54,7 +54,7 @@ | |||
| 54 | }; | 54 | }; |
| 55 | 55 | ||
| 56 | mvsdio@d00d4000 { | 56 | mvsdio@d00d4000 { |
| 57 | pinctrl-0 = <&sdio_pins2>; | 57 | pinctrl-0 = <&sdio_pins3>; |
| 58 | pinctrl-names = "default"; | 58 | pinctrl-names = "default"; |
| 59 | status = "okay"; | 59 | status = "okay"; |
| 60 | /* | 60 | /* |
diff --git a/arch/arm/boot/dts/armada-370.dtsi b/arch/arm/boot/dts/armada-370.dtsi index 8188d138020e..a195debb67d3 100644 --- a/arch/arm/boot/dts/armada-370.dtsi +++ b/arch/arm/boot/dts/armada-370.dtsi | |||
| @@ -59,6 +59,12 @@ | |||
| 59 | "mpp50", "mpp51", "mpp52"; | 59 | "mpp50", "mpp51", "mpp52"; |
| 60 | marvell,function = "sd0"; | 60 | marvell,function = "sd0"; |
| 61 | }; | 61 | }; |
| 62 | |||
| 63 | sdio_pins3: sdio-pins3 { | ||
| 64 | marvell,pins = "mpp48", "mpp49", "mpp50", | ||
| 65 | "mpp51", "mpp52", "mpp53"; | ||
| 66 | marvell,function = "sd0"; | ||
| 67 | }; | ||
| 62 | }; | 68 | }; |
| 63 | 69 | ||
| 64 | gpio0: gpio@d0018100 { | 70 | gpio0: gpio@d0018100 { |
diff --git a/arch/arm/boot/dts/dbx5x0.dtsi b/arch/arm/boot/dts/dbx5x0.dtsi index 9de93096601a..aaa63d0a8096 100644 --- a/arch/arm/boot/dts/dbx5x0.dtsi +++ b/arch/arm/boot/dts/dbx5x0.dtsi | |||
| @@ -191,8 +191,8 @@ | |||
| 191 | 191 | ||
| 192 | prcmu: prcmu@80157000 { | 192 | prcmu: prcmu@80157000 { |
| 193 | compatible = "stericsson,db8500-prcmu"; | 193 | compatible = "stericsson,db8500-prcmu"; |
| 194 | reg = <0x80157000 0x1000>; | 194 | reg = <0x80157000 0x1000>, <0x801b0000 0x8000>, <0x801b8000 0x1000>; |
| 195 | reg-names = "prcmu"; | 195 | reg-names = "prcmu", "prcmu-tcpm", "prcmu-tcdm"; |
| 196 | interrupts = <0 47 0x4>; | 196 | interrupts = <0 47 0x4>; |
| 197 | #address-cells = <1>; | 197 | #address-cells = <1>; |
| 198 | #size-cells = <1>; | 198 | #size-cells = <1>; |
diff --git a/arch/arm/boot/dts/imx28-m28evk.dts b/arch/arm/boot/dts/imx28-m28evk.dts index 6ce3d17c3a29..fd36e1cca104 100644 --- a/arch/arm/boot/dts/imx28-m28evk.dts +++ b/arch/arm/boot/dts/imx28-m28evk.dts | |||
| @@ -152,7 +152,6 @@ | |||
| 152 | i2c0: i2c@80058000 { | 152 | i2c0: i2c@80058000 { |
| 153 | pinctrl-names = "default"; | 153 | pinctrl-names = "default"; |
| 154 | pinctrl-0 = <&i2c0_pins_a>; | 154 | pinctrl-0 = <&i2c0_pins_a>; |
| 155 | clock-frequency = <400000>; | ||
| 156 | status = "okay"; | 155 | status = "okay"; |
| 157 | 156 | ||
| 158 | sgtl5000: codec@0a { | 157 | sgtl5000: codec@0a { |
diff --git a/arch/arm/boot/dts/imx28-sps1.dts b/arch/arm/boot/dts/imx28-sps1.dts index e6cde8aa7fff..6c6a5442800a 100644 --- a/arch/arm/boot/dts/imx28-sps1.dts +++ b/arch/arm/boot/dts/imx28-sps1.dts | |||
| @@ -70,7 +70,6 @@ | |||
| 70 | i2c0: i2c@80058000 { | 70 | i2c0: i2c@80058000 { |
| 71 | pinctrl-names = "default"; | 71 | pinctrl-names = "default"; |
| 72 | pinctrl-0 = <&i2c0_pins_a>; | 72 | pinctrl-0 = <&i2c0_pins_a>; |
| 73 | clock-frequency = <400000>; | ||
| 74 | status = "okay"; | 73 | status = "okay"; |
| 75 | 74 | ||
| 76 | rtc: rtc@51 { | 75 | rtc: rtc@51 { |
diff --git a/arch/arm/boot/dts/imx6qdl.dtsi b/arch/arm/boot/dts/imx6qdl.dtsi index 06ec460b4581..281a223591ff 100644 --- a/arch/arm/boot/dts/imx6qdl.dtsi +++ b/arch/arm/boot/dts/imx6qdl.dtsi | |||
| @@ -91,6 +91,7 @@ | |||
| 91 | compatible = "arm,cortex-a9-twd-timer"; | 91 | compatible = "arm,cortex-a9-twd-timer"; |
| 92 | reg = <0x00a00600 0x20>; | 92 | reg = <0x00a00600 0x20>; |
| 93 | interrupts = <1 13 0xf01>; | 93 | interrupts = <1 13 0xf01>; |
| 94 | clocks = <&clks 15>; | ||
| 94 | }; | 95 | }; |
| 95 | 96 | ||
| 96 | L2: l2-cache@00a02000 { | 97 | L2: l2-cache@00a02000 { |
diff --git a/arch/arm/boot/dts/kirkwood-goflexnet.dts b/arch/arm/boot/dts/kirkwood-goflexnet.dts index bd83b8fc7c83..c3573be7b92c 100644 --- a/arch/arm/boot/dts/kirkwood-goflexnet.dts +++ b/arch/arm/boot/dts/kirkwood-goflexnet.dts | |||
| @@ -77,6 +77,7 @@ | |||
| 77 | }; | 77 | }; |
| 78 | 78 | ||
| 79 | nand@3000000 { | 79 | nand@3000000 { |
| 80 | chip-delay = <40>; | ||
| 80 | status = "okay"; | 81 | status = "okay"; |
| 81 | 82 | ||
| 82 | partition@0 { | 83 | partition@0 { |
diff --git a/arch/arm/boot/dts/kirkwood-iomega_ix2_200.dts b/arch/arm/boot/dts/kirkwood-iomega_ix2_200.dts index 93c3afbef9ee..3694e94f6e99 100644 --- a/arch/arm/boot/dts/kirkwood-iomega_ix2_200.dts +++ b/arch/arm/boot/dts/kirkwood-iomega_ix2_200.dts | |||
| @@ -96,11 +96,11 @@ | |||
| 96 | marvell,function = "gpio"; | 96 | marvell,function = "gpio"; |
| 97 | }; | 97 | }; |
| 98 | pmx_led_rebuild_brt_ctrl_1: pmx-led-rebuild-brt-ctrl-1 { | 98 | pmx_led_rebuild_brt_ctrl_1: pmx-led-rebuild-brt-ctrl-1 { |
| 99 | marvell,pins = "mpp44"; | 99 | marvell,pins = "mpp46"; |
| 100 | marvell,function = "gpio"; | 100 | marvell,function = "gpio"; |
| 101 | }; | 101 | }; |
| 102 | pmx_led_rebuild_brt_ctrl_2: pmx-led-rebuild-brt-ctrl-2 { | 102 | pmx_led_rebuild_brt_ctrl_2: pmx-led-rebuild-brt-ctrl-2 { |
| 103 | marvell,pins = "mpp45"; | 103 | marvell,pins = "mpp47"; |
| 104 | marvell,function = "gpio"; | 104 | marvell,function = "gpio"; |
| 105 | }; | 105 | }; |
| 106 | 106 | ||
| @@ -157,14 +157,14 @@ | |||
| 157 | gpios = <&gpio0 16 0>; | 157 | gpios = <&gpio0 16 0>; |
| 158 | linux,default-trigger = "default-on"; | 158 | linux,default-trigger = "default-on"; |
| 159 | }; | 159 | }; |
| 160 | health_led1 { | 160 | rebuild_led { |
| 161 | label = "status:white:rebuild_led"; | ||
| 162 | gpios = <&gpio1 4 0>; | ||
| 163 | }; | ||
| 164 | health_led { | ||
| 161 | label = "status:red:health_led"; | 165 | label = "status:red:health_led"; |
| 162 | gpios = <&gpio1 5 0>; | 166 | gpios = <&gpio1 5 0>; |
| 163 | }; | 167 | }; |
| 164 | health_led2 { | ||
| 165 | label = "status:white:health_led"; | ||
| 166 | gpios = <&gpio1 4 0>; | ||
| 167 | }; | ||
| 168 | backup_led { | 168 | backup_led { |
| 169 | label = "status:blue:backup_led"; | 169 | label = "status:blue:backup_led"; |
| 170 | gpios = <&gpio0 15 0>; | 170 | gpios = <&gpio0 15 0>; |
diff --git a/arch/arm/boot/dts/orion5x.dtsi b/arch/arm/boot/dts/orion5x.dtsi index 8aad00f81ed9..f7bec3b1ba32 100644 --- a/arch/arm/boot/dts/orion5x.dtsi +++ b/arch/arm/boot/dts/orion5x.dtsi | |||
| @@ -13,6 +13,9 @@ | |||
| 13 | compatible = "marvell,orion5x"; | 13 | compatible = "marvell,orion5x"; |
| 14 | interrupt-parent = <&intc>; | 14 | interrupt-parent = <&intc>; |
| 15 | 15 | ||
| 16 | aliases { | ||
| 17 | gpio0 = &gpio0; | ||
| 18 | }; | ||
| 16 | intc: interrupt-controller { | 19 | intc: interrupt-controller { |
| 17 | compatible = "marvell,orion-intc", "marvell,intc"; | 20 | compatible = "marvell,orion-intc", "marvell,intc"; |
| 18 | interrupt-controller; | 21 | interrupt-controller; |
| @@ -32,7 +35,9 @@ | |||
| 32 | #gpio-cells = <2>; | 35 | #gpio-cells = <2>; |
| 33 | gpio-controller; | 36 | gpio-controller; |
| 34 | reg = <0x10100 0x40>; | 37 | reg = <0x10100 0x40>; |
| 35 | ngpio = <32>; | 38 | ngpios = <32>; |
| 39 | interrupt-controller; | ||
| 40 | #interrupt-cells = <2>; | ||
| 36 | interrupts = <6>, <7>, <8>, <9>; | 41 | interrupts = <6>, <7>, <8>, <9>; |
| 37 | }; | 42 | }; |
| 38 | 43 | ||
| @@ -91,7 +96,7 @@ | |||
| 91 | reg = <0x90000 0x10000>, | 96 | reg = <0x90000 0x10000>, |
| 92 | <0xf2200000 0x800>; | 97 | <0xf2200000 0x800>; |
| 93 | reg-names = "regs", "sram"; | 98 | reg-names = "regs", "sram"; |
| 94 | interrupts = <22>; | 99 | interrupts = <28>; |
| 95 | status = "okay"; | 100 | status = "okay"; |
| 96 | }; | 101 | }; |
| 97 | }; | 102 | }; |
diff --git a/arch/arm/include/asm/delay.h b/arch/arm/include/asm/delay.h index 720799fd3a81..dff714d886d5 100644 --- a/arch/arm/include/asm/delay.h +++ b/arch/arm/include/asm/delay.h | |||
| @@ -24,7 +24,7 @@ extern struct arm_delay_ops { | |||
| 24 | void (*delay)(unsigned long); | 24 | void (*delay)(unsigned long); |
| 25 | void (*const_udelay)(unsigned long); | 25 | void (*const_udelay)(unsigned long); |
| 26 | void (*udelay)(unsigned long); | 26 | void (*udelay)(unsigned long); |
| 27 | bool const_clock; | 27 | unsigned long ticks_per_jiffy; |
| 28 | } arm_delay_ops; | 28 | } arm_delay_ops; |
| 29 | 29 | ||
| 30 | #define __delay(n) arm_delay_ops.delay(n) | 30 | #define __delay(n) arm_delay_ops.delay(n) |
diff --git a/arch/arm/include/asm/highmem.h b/arch/arm/include/asm/highmem.h index 8c5e828f484d..91b99abe7a95 100644 --- a/arch/arm/include/asm/highmem.h +++ b/arch/arm/include/asm/highmem.h | |||
| @@ -41,6 +41,13 @@ extern void kunmap_high(struct page *page); | |||
| 41 | #endif | 41 | #endif |
| 42 | #endif | 42 | #endif |
| 43 | 43 | ||
| 44 | /* | ||
| 45 | * Needed to be able to broadcast the TLB invalidation for kmap. | ||
| 46 | */ | ||
| 47 | #ifdef CONFIG_ARM_ERRATA_798181 | ||
| 48 | #undef ARCH_NEEDS_KMAP_HIGH_GET | ||
| 49 | #endif | ||
| 50 | |||
| 44 | #ifdef ARCH_NEEDS_KMAP_HIGH_GET | 51 | #ifdef ARCH_NEEDS_KMAP_HIGH_GET |
| 45 | extern void *kmap_high_get(struct page *page); | 52 | extern void *kmap_high_get(struct page *page); |
| 46 | #else | 53 | #else |
diff --git a/arch/arm/include/asm/mmu_context.h b/arch/arm/include/asm/mmu_context.h index 863a6611323c..a7b85e0d0cc1 100644 --- a/arch/arm/include/asm/mmu_context.h +++ b/arch/arm/include/asm/mmu_context.h | |||
| @@ -27,6 +27,8 @@ void __check_vmalloc_seq(struct mm_struct *mm); | |||
| 27 | void check_and_switch_context(struct mm_struct *mm, struct task_struct *tsk); | 27 | void check_and_switch_context(struct mm_struct *mm, struct task_struct *tsk); |
| 28 | #define init_new_context(tsk,mm) ({ atomic64_set(&mm->context.id, 0); 0; }) | 28 | #define init_new_context(tsk,mm) ({ atomic64_set(&mm->context.id, 0); 0; }) |
| 29 | 29 | ||
| 30 | DECLARE_PER_CPU(atomic64_t, active_asids); | ||
| 31 | |||
| 30 | #else /* !CONFIG_CPU_HAS_ASID */ | 32 | #else /* !CONFIG_CPU_HAS_ASID */ |
| 31 | 33 | ||
| 32 | #ifdef CONFIG_MMU | 34 | #ifdef CONFIG_MMU |
diff --git a/arch/arm/include/asm/tlbflush.h b/arch/arm/include/asm/tlbflush.h index 4db8c8820f0d..9e9c041358ca 100644 --- a/arch/arm/include/asm/tlbflush.h +++ b/arch/arm/include/asm/tlbflush.h | |||
| @@ -450,6 +450,21 @@ static inline void local_flush_bp_all(void) | |||
| 450 | isb(); | 450 | isb(); |
| 451 | } | 451 | } |
| 452 | 452 | ||
| 453 | #ifdef CONFIG_ARM_ERRATA_798181 | ||
| 454 | static inline void dummy_flush_tlb_a15_erratum(void) | ||
| 455 | { | ||
| 456 | /* | ||
| 457 | * Dummy TLBIMVAIS. Using the unmapped address 0 and ASID 0. | ||
| 458 | */ | ||
| 459 | asm("mcr p15, 0, %0, c8, c3, 1" : : "r" (0)); | ||
| 460 | dsb(); | ||
| 461 | } | ||
| 462 | #else | ||
| 463 | static inline void dummy_flush_tlb_a15_erratum(void) | ||
| 464 | { | ||
| 465 | } | ||
| 466 | #endif | ||
| 467 | |||
| 453 | /* | 468 | /* |
| 454 | * flush_pmd_entry | 469 | * flush_pmd_entry |
| 455 | * | 470 | * |
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 3248cde504ed..fefd7f971437 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S | |||
| @@ -276,7 +276,13 @@ ENDPROC(ftrace_graph_caller_old) | |||
| 276 | */ | 276 | */ |
| 277 | 277 | ||
| 278 | .macro mcount_enter | 278 | .macro mcount_enter |
| 279 | /* | ||
| 280 | * This pad compensates for the push {lr} at the call site. Note that we are | ||
| 281 | * unable to unwind through a function which does not otherwise save its lr. | ||
| 282 | */ | ||
| 283 | UNWIND(.pad #4) | ||
| 279 | stmdb sp!, {r0-r3, lr} | 284 | stmdb sp!, {r0-r3, lr} |
| 285 | UNWIND(.save {r0-r3, lr}) | ||
| 280 | .endm | 286 | .endm |
| 281 | 287 | ||
| 282 | .macro mcount_get_lr reg | 288 | .macro mcount_get_lr reg |
| @@ -289,6 +295,7 @@ ENDPROC(ftrace_graph_caller_old) | |||
| 289 | .endm | 295 | .endm |
| 290 | 296 | ||
| 291 | ENTRY(__gnu_mcount_nc) | 297 | ENTRY(__gnu_mcount_nc) |
| 298 | UNWIND(.fnstart) | ||
| 292 | #ifdef CONFIG_DYNAMIC_FTRACE | 299 | #ifdef CONFIG_DYNAMIC_FTRACE |
| 293 | mov ip, lr | 300 | mov ip, lr |
| 294 | ldmia sp!, {lr} | 301 | ldmia sp!, {lr} |
| @@ -296,17 +303,22 @@ ENTRY(__gnu_mcount_nc) | |||
| 296 | #else | 303 | #else |
| 297 | __mcount | 304 | __mcount |
| 298 | #endif | 305 | #endif |
| 306 | UNWIND(.fnend) | ||
| 299 | ENDPROC(__gnu_mcount_nc) | 307 | ENDPROC(__gnu_mcount_nc) |
| 300 | 308 | ||
| 301 | #ifdef CONFIG_DYNAMIC_FTRACE | 309 | #ifdef CONFIG_DYNAMIC_FTRACE |
| 302 | ENTRY(ftrace_caller) | 310 | ENTRY(ftrace_caller) |
| 311 | UNWIND(.fnstart) | ||
| 303 | __ftrace_caller | 312 | __ftrace_caller |
| 313 | UNWIND(.fnend) | ||
| 304 | ENDPROC(ftrace_caller) | 314 | ENDPROC(ftrace_caller) |
| 305 | #endif | 315 | #endif |
| 306 | 316 | ||
| 307 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | 317 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
| 308 | ENTRY(ftrace_graph_caller) | 318 | ENTRY(ftrace_graph_caller) |
| 319 | UNWIND(.fnstart) | ||
| 309 | __ftrace_graph_caller | 320 | __ftrace_graph_caller |
| 321 | UNWIND(.fnend) | ||
| 310 | ENDPROC(ftrace_graph_caller) | 322 | ENDPROC(ftrace_graph_caller) |
| 311 | #endif | 323 | #endif |
| 312 | 324 | ||
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index e0eb9a1cae77..8bac553fe213 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S | |||
| @@ -267,7 +267,7 @@ __create_page_tables: | |||
| 267 | addne r6, r6, #1 << SECTION_SHIFT | 267 | addne r6, r6, #1 << SECTION_SHIFT |
| 268 | strne r6, [r3] | 268 | strne r6, [r3] |
| 269 | 269 | ||
| 270 | #if defined(CONFIG_LPAE) && defined(CONFIG_CPU_ENDIAN_BE8) | 270 | #if defined(CONFIG_ARM_LPAE) && defined(CONFIG_CPU_ENDIAN_BE8) |
| 271 | sub r4, r4, #4 @ Fixup page table pointer | 271 | sub r4, r4, #4 @ Fixup page table pointer |
| 272 | @ for 64-bit descriptors | 272 | @ for 64-bit descriptors |
| 273 | #endif | 273 | #endif |
diff --git a/arch/arm/kernel/hw_breakpoint.c b/arch/arm/kernel/hw_breakpoint.c index 96093b75ab90..5dc1aa6f0f7d 100644 --- a/arch/arm/kernel/hw_breakpoint.c +++ b/arch/arm/kernel/hw_breakpoint.c | |||
| @@ -966,7 +966,7 @@ static void reset_ctrl_regs(void *unused) | |||
| 966 | } | 966 | } |
| 967 | 967 | ||
| 968 | if (err) { | 968 | if (err) { |
| 969 | pr_warning("CPU %d debug is powered down!\n", cpu); | 969 | pr_warn_once("CPU %d debug is powered down!\n", cpu); |
| 970 | cpumask_or(&debug_err_mask, &debug_err_mask, cpumask_of(cpu)); | 970 | cpumask_or(&debug_err_mask, &debug_err_mask, cpumask_of(cpu)); |
| 971 | return; | 971 | return; |
| 972 | } | 972 | } |
| @@ -987,7 +987,7 @@ clear_vcr: | |||
| 987 | isb(); | 987 | isb(); |
| 988 | 988 | ||
| 989 | if (cpumask_intersects(&debug_err_mask, cpumask_of(cpu))) { | 989 | if (cpumask_intersects(&debug_err_mask, cpumask_of(cpu))) { |
| 990 | pr_warning("CPU %d failed to disable vector catch\n", cpu); | 990 | pr_warn_once("CPU %d failed to disable vector catch\n", cpu); |
| 991 | return; | 991 | return; |
| 992 | } | 992 | } |
| 993 | 993 | ||
| @@ -1007,7 +1007,7 @@ clear_vcr: | |||
| 1007 | } | 1007 | } |
| 1008 | 1008 | ||
| 1009 | if (cpumask_intersects(&debug_err_mask, cpumask_of(cpu))) { | 1009 | if (cpumask_intersects(&debug_err_mask, cpumask_of(cpu))) { |
| 1010 | pr_warning("CPU %d failed to clear debug register pairs\n", cpu); | 1010 | pr_warn_once("CPU %d failed to clear debug register pairs\n", cpu); |
| 1011 | return; | 1011 | return; |
| 1012 | } | 1012 | } |
| 1013 | 1013 | ||
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 3f6cbb2e3eda..d343a6c3a6d1 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
| @@ -353,6 +353,23 @@ void __init early_print(const char *str, ...) | |||
| 353 | printk("%s", buf); | 353 | printk("%s", buf); |
| 354 | } | 354 | } |
| 355 | 355 | ||
| 356 | static void __init cpuid_init_hwcaps(void) | ||
| 357 | { | ||
| 358 | unsigned int divide_instrs; | ||
| 359 | |||
| 360 | if (cpu_architecture() < CPU_ARCH_ARMv7) | ||
| 361 | return; | ||
| 362 | |||
| 363 | divide_instrs = (read_cpuid_ext(CPUID_EXT_ISAR0) & 0x0f000000) >> 24; | ||
| 364 | |||
| 365 | switch (divide_instrs) { | ||
| 366 | case 2: | ||
| 367 | elf_hwcap |= HWCAP_IDIVA; | ||
| 368 | case 1: | ||
| 369 | elf_hwcap |= HWCAP_IDIVT; | ||
| 370 | } | ||
| 371 | } | ||
| 372 | |||
| 356 | static void __init feat_v6_fixup(void) | 373 | static void __init feat_v6_fixup(void) |
| 357 | { | 374 | { |
| 358 | int id = read_cpuid_id(); | 375 | int id = read_cpuid_id(); |
| @@ -483,8 +500,11 @@ static void __init setup_processor(void) | |||
| 483 | snprintf(elf_platform, ELF_PLATFORM_SIZE, "%s%c", | 500 | snprintf(elf_platform, ELF_PLATFORM_SIZE, "%s%c", |
| 484 | list->elf_name, ENDIANNESS); | 501 | list->elf_name, ENDIANNESS); |
| 485 | elf_hwcap = list->elf_hwcap; | 502 | elf_hwcap = list->elf_hwcap; |
| 503 | |||
| 504 | cpuid_init_hwcaps(); | ||
| 505 | |||
| 486 | #ifndef CONFIG_ARM_THUMB | 506 | #ifndef CONFIG_ARM_THUMB |
| 487 | elf_hwcap &= ~HWCAP_THUMB; | 507 | elf_hwcap &= ~(HWCAP_THUMB | HWCAP_IDIVT); |
| 488 | #endif | 508 | #endif |
| 489 | 509 | ||
| 490 | feat_v6_fixup(); | 510 | feat_v6_fixup(); |
| @@ -524,7 +544,7 @@ int __init arm_add_memory(phys_addr_t start, phys_addr_t size) | |||
| 524 | size -= start & ~PAGE_MASK; | 544 | size -= start & ~PAGE_MASK; |
| 525 | bank->start = PAGE_ALIGN(start); | 545 | bank->start = PAGE_ALIGN(start); |
| 526 | 546 | ||
| 527 | #ifndef CONFIG_LPAE | 547 | #ifndef CONFIG_ARM_LPAE |
| 528 | if (bank->start + size < bank->start) { | 548 | if (bank->start + size < bank->start) { |
| 529 | printk(KERN_CRIT "Truncating memory at 0x%08llx to fit in " | 549 | printk(KERN_CRIT "Truncating memory at 0x%08llx to fit in " |
| 530 | "32-bit physical address space\n", (long long)start); | 550 | "32-bit physical address space\n", (long long)start); |
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 79078edbb9bc..1f2ccccaf009 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c | |||
| @@ -673,9 +673,6 @@ static int cpufreq_callback(struct notifier_block *nb, | |||
| 673 | if (freq->flags & CPUFREQ_CONST_LOOPS) | 673 | if (freq->flags & CPUFREQ_CONST_LOOPS) |
| 674 | return NOTIFY_OK; | 674 | return NOTIFY_OK; |
| 675 | 675 | ||
| 676 | if (arm_delay_ops.const_clock) | ||
| 677 | return NOTIFY_OK; | ||
| 678 | |||
| 679 | if (!per_cpu(l_p_j_ref, cpu)) { | 676 | if (!per_cpu(l_p_j_ref, cpu)) { |
| 680 | per_cpu(l_p_j_ref, cpu) = | 677 | per_cpu(l_p_j_ref, cpu) = |
| 681 | per_cpu(cpu_data, cpu).loops_per_jiffy; | 678 | per_cpu(cpu_data, cpu).loops_per_jiffy; |
diff --git a/arch/arm/kernel/smp_tlb.c b/arch/arm/kernel/smp_tlb.c index bd0300531399..e82e1d248772 100644 --- a/arch/arm/kernel/smp_tlb.c +++ b/arch/arm/kernel/smp_tlb.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | 12 | ||
| 13 | #include <asm/smp_plat.h> | 13 | #include <asm/smp_plat.h> |
| 14 | #include <asm/tlbflush.h> | 14 | #include <asm/tlbflush.h> |
| 15 | #include <asm/mmu_context.h> | ||
| 15 | 16 | ||
| 16 | /**********************************************************************/ | 17 | /**********************************************************************/ |
| 17 | 18 | ||
| @@ -69,12 +70,72 @@ static inline void ipi_flush_bp_all(void *ignored) | |||
| 69 | local_flush_bp_all(); | 70 | local_flush_bp_all(); |
| 70 | } | 71 | } |
| 71 | 72 | ||
| 73 | #ifdef CONFIG_ARM_ERRATA_798181 | ||
| 74 | static int erratum_a15_798181(void) | ||
| 75 | { | ||
| 76 | unsigned int midr = read_cpuid_id(); | ||
| 77 | |||
| 78 | /* Cortex-A15 r0p0..r3p2 affected */ | ||
| 79 | if ((midr & 0xff0ffff0) != 0x410fc0f0 || midr > 0x413fc0f2) | ||
| 80 | return 0; | ||
| 81 | return 1; | ||
| 82 | } | ||
| 83 | #else | ||
| 84 | static int erratum_a15_798181(void) | ||
| 85 | { | ||
| 86 | return 0; | ||
| 87 | } | ||
| 88 | #endif | ||
| 89 | |||
| 90 | static void ipi_flush_tlb_a15_erratum(void *arg) | ||
| 91 | { | ||
| 92 | dmb(); | ||
| 93 | } | ||
| 94 | |||
| 95 | static void broadcast_tlb_a15_erratum(void) | ||
| 96 | { | ||
| 97 | if (!erratum_a15_798181()) | ||
| 98 | return; | ||
| 99 | |||
| 100 | dummy_flush_tlb_a15_erratum(); | ||
| 101 | smp_call_function_many(cpu_online_mask, ipi_flush_tlb_a15_erratum, | ||
| 102 | NULL, 1); | ||
| 103 | } | ||
| 104 | |||
| 105 | static void broadcast_tlb_mm_a15_erratum(struct mm_struct *mm) | ||
| 106 | { | ||
| 107 | int cpu; | ||
| 108 | cpumask_t mask = { CPU_BITS_NONE }; | ||
| 109 | |||
| 110 | if (!erratum_a15_798181()) | ||
| 111 | return; | ||
| 112 | |||
| 113 | dummy_flush_tlb_a15_erratum(); | ||
| 114 | for_each_online_cpu(cpu) { | ||
| 115 | if (cpu == smp_processor_id()) | ||
| 116 | continue; | ||
| 117 | /* | ||
| 118 | * We only need to send an IPI if the other CPUs are running | ||
| 119 | * the same ASID as the one being invalidated. There is no | ||
| 120 | * need for locking around the active_asids check since the | ||
| 121 | * switch_mm() function has at least one dmb() (as required by | ||
| 122 | * this workaround) in case a context switch happens on | ||
| 123 | * another CPU after the condition below. | ||
| 124 | */ | ||
| 125 | if (atomic64_read(&mm->context.id) == | ||
| 126 | atomic64_read(&per_cpu(active_asids, cpu))) | ||
| 127 | cpumask_set_cpu(cpu, &mask); | ||
| 128 | } | ||
| 129 | smp_call_function_many(&mask, ipi_flush_tlb_a15_erratum, NULL, 1); | ||
| 130 | } | ||
| 131 | |||
| 72 | void flush_tlb_all(void) | 132 | void flush_tlb_all(void) |
| 73 | { | 133 | { |
| 74 | if (tlb_ops_need_broadcast()) | 134 | if (tlb_ops_need_broadcast()) |
| 75 | on_each_cpu(ipi_flush_tlb_all, NULL, 1); | 135 | on_each_cpu(ipi_flush_tlb_all, NULL, 1); |
| 76 | else | 136 | else |
| 77 | local_flush_tlb_all(); | 137 | local_flush_tlb_all(); |
| 138 | broadcast_tlb_a15_erratum(); | ||
| 78 | } | 139 | } |
| 79 | 140 | ||
| 80 | void flush_tlb_mm(struct mm_struct *mm) | 141 | void flush_tlb_mm(struct mm_struct *mm) |
| @@ -83,6 +144,7 @@ void flush_tlb_mm(struct mm_struct *mm) | |||
| 83 | on_each_cpu_mask(mm_cpumask(mm), ipi_flush_tlb_mm, mm, 1); | 144 | on_each_cpu_mask(mm_cpumask(mm), ipi_flush_tlb_mm, mm, 1); |
| 84 | else | 145 | else |
| 85 | local_flush_tlb_mm(mm); | 146 | local_flush_tlb_mm(mm); |
| 147 | broadcast_tlb_mm_a15_erratum(mm); | ||
| 86 | } | 148 | } |
| 87 | 149 | ||
| 88 | void flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr) | 150 | void flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr) |
| @@ -95,6 +157,7 @@ void flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr) | |||
| 95 | &ta, 1); | 157 | &ta, 1); |
| 96 | } else | 158 | } else |
| 97 | local_flush_tlb_page(vma, uaddr); | 159 | local_flush_tlb_page(vma, uaddr); |
| 160 | broadcast_tlb_mm_a15_erratum(vma->vm_mm); | ||
| 98 | } | 161 | } |
| 99 | 162 | ||
| 100 | void flush_tlb_kernel_page(unsigned long kaddr) | 163 | void flush_tlb_kernel_page(unsigned long kaddr) |
| @@ -105,6 +168,7 @@ void flush_tlb_kernel_page(unsigned long kaddr) | |||
| 105 | on_each_cpu(ipi_flush_tlb_kernel_page, &ta, 1); | 168 | on_each_cpu(ipi_flush_tlb_kernel_page, &ta, 1); |
| 106 | } else | 169 | } else |
| 107 | local_flush_tlb_kernel_page(kaddr); | 170 | local_flush_tlb_kernel_page(kaddr); |
| 171 | broadcast_tlb_a15_erratum(); | ||
| 108 | } | 172 | } |
| 109 | 173 | ||
| 110 | void flush_tlb_range(struct vm_area_struct *vma, | 174 | void flush_tlb_range(struct vm_area_struct *vma, |
| @@ -119,6 +183,7 @@ void flush_tlb_range(struct vm_area_struct *vma, | |||
| 119 | &ta, 1); | 183 | &ta, 1); |
| 120 | } else | 184 | } else |
| 121 | local_flush_tlb_range(vma, start, end); | 185 | local_flush_tlb_range(vma, start, end); |
| 186 | broadcast_tlb_mm_a15_erratum(vma->vm_mm); | ||
| 122 | } | 187 | } |
| 123 | 188 | ||
| 124 | void flush_tlb_kernel_range(unsigned long start, unsigned long end) | 189 | void flush_tlb_kernel_range(unsigned long start, unsigned long end) |
| @@ -130,6 +195,7 @@ void flush_tlb_kernel_range(unsigned long start, unsigned long end) | |||
| 130 | on_each_cpu(ipi_flush_tlb_kernel_range, &ta, 1); | 195 | on_each_cpu(ipi_flush_tlb_kernel_range, &ta, 1); |
| 131 | } else | 196 | } else |
| 132 | local_flush_tlb_kernel_range(start, end); | 197 | local_flush_tlb_kernel_range(start, end); |
| 198 | broadcast_tlb_a15_erratum(); | ||
| 133 | } | 199 | } |
| 134 | 200 | ||
| 135 | void flush_bp_all(void) | 201 | void flush_bp_all(void) |
diff --git a/arch/arm/kvm/vgic.c b/arch/arm/kvm/vgic.c index c9a17316e9fe..0e4cfe123b38 100644 --- a/arch/arm/kvm/vgic.c +++ b/arch/arm/kvm/vgic.c | |||
| @@ -883,8 +883,7 @@ static bool vgic_queue_irq(struct kvm_vcpu *vcpu, u8 sgi_source_id, int irq) | |||
| 883 | lr, irq, vgic_cpu->vgic_lr[lr]); | 883 | lr, irq, vgic_cpu->vgic_lr[lr]); |
| 884 | BUG_ON(!test_bit(lr, vgic_cpu->lr_used)); | 884 | BUG_ON(!test_bit(lr, vgic_cpu->lr_used)); |
| 885 | vgic_cpu->vgic_lr[lr] |= GICH_LR_PENDING_BIT; | 885 | vgic_cpu->vgic_lr[lr] |= GICH_LR_PENDING_BIT; |
| 886 | 886 | return true; | |
| 887 | goto out; | ||
| 888 | } | 887 | } |
| 889 | 888 | ||
| 890 | /* Try to use another LR for this interrupt */ | 889 | /* Try to use another LR for this interrupt */ |
| @@ -898,7 +897,6 @@ static bool vgic_queue_irq(struct kvm_vcpu *vcpu, u8 sgi_source_id, int irq) | |||
| 898 | vgic_cpu->vgic_irq_lr_map[irq] = lr; | 897 | vgic_cpu->vgic_irq_lr_map[irq] = lr; |
| 899 | set_bit(lr, vgic_cpu->lr_used); | 898 | set_bit(lr, vgic_cpu->lr_used); |
| 900 | 899 | ||
| 901 | out: | ||
| 902 | if (!vgic_irq_is_edge(vcpu, irq)) | 900 | if (!vgic_irq_is_edge(vcpu, irq)) |
| 903 | vgic_cpu->vgic_lr[lr] |= GICH_LR_EOI; | 901 | vgic_cpu->vgic_lr[lr] |= GICH_LR_EOI; |
| 904 | 902 | ||
| @@ -1018,21 +1016,6 @@ static bool vgic_process_maintenance(struct kvm_vcpu *vcpu) | |||
| 1018 | 1016 | ||
| 1019 | kvm_debug("MISR = %08x\n", vgic_cpu->vgic_misr); | 1017 | kvm_debug("MISR = %08x\n", vgic_cpu->vgic_misr); |
| 1020 | 1018 | ||
| 1021 | /* | ||
| 1022 | * We do not need to take the distributor lock here, since the only | ||
| 1023 | * action we perform is clearing the irq_active_bit for an EOIed | ||
| 1024 | * level interrupt. There is a potential race with | ||
| 1025 | * the queuing of an interrupt in __kvm_vgic_flush_hwstate(), where we | ||
| 1026 | * check if the interrupt is already active. Two possibilities: | ||
| 1027 | * | ||
| 1028 | * - The queuing is occurring on the same vcpu: cannot happen, | ||
| 1029 | * as we're already in the context of this vcpu, and | ||
| 1030 | * executing the handler | ||
| 1031 | * - The interrupt has been migrated to another vcpu, and we | ||
| 1032 | * ignore this interrupt for this run. Big deal. It is still | ||
| 1033 | * pending though, and will get considered when this vcpu | ||
| 1034 | * exits. | ||
| 1035 | */ | ||
| 1036 | if (vgic_cpu->vgic_misr & GICH_MISR_EOI) { | 1019 | if (vgic_cpu->vgic_misr & GICH_MISR_EOI) { |
| 1037 | /* | 1020 | /* |
| 1038 | * Some level interrupts have been EOIed. Clear their | 1021 | * Some level interrupts have been EOIed. Clear their |
| @@ -1054,6 +1037,13 @@ static bool vgic_process_maintenance(struct kvm_vcpu *vcpu) | |||
| 1054 | } else { | 1037 | } else { |
| 1055 | vgic_cpu_irq_clear(vcpu, irq); | 1038 | vgic_cpu_irq_clear(vcpu, irq); |
| 1056 | } | 1039 | } |
| 1040 | |||
| 1041 | /* | ||
| 1042 | * Despite being EOIed, the LR may not have | ||
| 1043 | * been marked as empty. | ||
| 1044 | */ | ||
| 1045 | set_bit(lr, (unsigned long *)vgic_cpu->vgic_elrsr); | ||
| 1046 | vgic_cpu->vgic_lr[lr] &= ~GICH_LR_ACTIVE_BIT; | ||
| 1057 | } | 1047 | } |
| 1058 | } | 1048 | } |
| 1059 | 1049 | ||
| @@ -1064,9 +1054,8 @@ static bool vgic_process_maintenance(struct kvm_vcpu *vcpu) | |||
| 1064 | } | 1054 | } |
| 1065 | 1055 | ||
| 1066 | /* | 1056 | /* |
| 1067 | * Sync back the VGIC state after a guest run. We do not really touch | 1057 | * Sync back the VGIC state after a guest run. The distributor lock is |
| 1068 | * the distributor here (the irq_pending_on_cpu bit is safe to set), | 1058 | * needed so we don't get preempted in the middle of the state processing. |
| 1069 | * so there is no need for taking its lock. | ||
| 1070 | */ | 1059 | */ |
| 1071 | static void __kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu) | 1060 | static void __kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu) |
| 1072 | { | 1061 | { |
| @@ -1112,10 +1101,14 @@ void kvm_vgic_flush_hwstate(struct kvm_vcpu *vcpu) | |||
| 1112 | 1101 | ||
| 1113 | void kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu) | 1102 | void kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu) |
| 1114 | { | 1103 | { |
| 1104 | struct vgic_dist *dist = &vcpu->kvm->arch.vgic; | ||
| 1105 | |||
| 1115 | if (!irqchip_in_kernel(vcpu->kvm)) | 1106 | if (!irqchip_in_kernel(vcpu->kvm)) |
| 1116 | return; | 1107 | return; |
| 1117 | 1108 | ||
| 1109 | spin_lock(&dist->lock); | ||
| 1118 | __kvm_vgic_sync_hwstate(vcpu); | 1110 | __kvm_vgic_sync_hwstate(vcpu); |
| 1111 | spin_unlock(&dist->lock); | ||
| 1119 | } | 1112 | } |
| 1120 | 1113 | ||
| 1121 | int kvm_vgic_vcpu_pending_irq(struct kvm_vcpu *vcpu) | 1114 | int kvm_vgic_vcpu_pending_irq(struct kvm_vcpu *vcpu) |
diff --git a/arch/arm/lib/delay.c b/arch/arm/lib/delay.c index 6b93f6a1a3c7..64dbfa57204a 100644 --- a/arch/arm/lib/delay.c +++ b/arch/arm/lib/delay.c | |||
| @@ -58,7 +58,7 @@ static void __timer_delay(unsigned long cycles) | |||
| 58 | static void __timer_const_udelay(unsigned long xloops) | 58 | static void __timer_const_udelay(unsigned long xloops) |
| 59 | { | 59 | { |
| 60 | unsigned long long loops = xloops; | 60 | unsigned long long loops = xloops; |
| 61 | loops *= loops_per_jiffy; | 61 | loops *= arm_delay_ops.ticks_per_jiffy; |
| 62 | __timer_delay(loops >> UDELAY_SHIFT); | 62 | __timer_delay(loops >> UDELAY_SHIFT); |
| 63 | } | 63 | } |
| 64 | 64 | ||
| @@ -73,11 +73,13 @@ void __init register_current_timer_delay(const struct delay_timer *timer) | |||
| 73 | pr_info("Switching to timer-based delay loop\n"); | 73 | pr_info("Switching to timer-based delay loop\n"); |
| 74 | delay_timer = timer; | 74 | delay_timer = timer; |
| 75 | lpj_fine = timer->freq / HZ; | 75 | lpj_fine = timer->freq / HZ; |
| 76 | loops_per_jiffy = lpj_fine; | 76 | |
| 77 | /* cpufreq may scale loops_per_jiffy, so keep a private copy */ | ||
| 78 | arm_delay_ops.ticks_per_jiffy = lpj_fine; | ||
| 77 | arm_delay_ops.delay = __timer_delay; | 79 | arm_delay_ops.delay = __timer_delay; |
| 78 | arm_delay_ops.const_udelay = __timer_const_udelay; | 80 | arm_delay_ops.const_udelay = __timer_const_udelay; |
| 79 | arm_delay_ops.udelay = __timer_udelay; | 81 | arm_delay_ops.udelay = __timer_udelay; |
| 80 | arm_delay_ops.const_clock = true; | 82 | |
| 81 | delay_calibrated = true; | 83 | delay_calibrated = true; |
| 82 | } else { | 84 | } else { |
| 83 | pr_info("Ignoring duplicate/late registration of read_current_timer delay\n"); | 85 | pr_info("Ignoring duplicate/late registration of read_current_timer delay\n"); |
diff --git a/arch/arm/mach-cns3xxx/core.c b/arch/arm/mach-cns3xxx/core.c index e698f26cc0cb..52e4bb5cf12d 100644 --- a/arch/arm/mach-cns3xxx/core.c +++ b/arch/arm/mach-cns3xxx/core.c | |||
| @@ -22,19 +22,9 @@ | |||
| 22 | 22 | ||
| 23 | static struct map_desc cns3xxx_io_desc[] __initdata = { | 23 | static struct map_desc cns3xxx_io_desc[] __initdata = { |
| 24 | { | 24 | { |
| 25 | .virtual = CNS3XXX_TC11MP_TWD_BASE_VIRT, | 25 | .virtual = CNS3XXX_TC11MP_SCU_BASE_VIRT, |
| 26 | .pfn = __phys_to_pfn(CNS3XXX_TC11MP_TWD_BASE), | 26 | .pfn = __phys_to_pfn(CNS3XXX_TC11MP_SCU_BASE), |
| 27 | .length = SZ_4K, | 27 | .length = SZ_8K, |
| 28 | .type = MT_DEVICE, | ||
| 29 | }, { | ||
| 30 | .virtual = CNS3XXX_TC11MP_GIC_CPU_BASE_VIRT, | ||
| 31 | .pfn = __phys_to_pfn(CNS3XXX_TC11MP_GIC_CPU_BASE), | ||
| 32 | .length = SZ_4K, | ||
| 33 | .type = MT_DEVICE, | ||
| 34 | }, { | ||
| 35 | .virtual = CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT, | ||
| 36 | .pfn = __phys_to_pfn(CNS3XXX_TC11MP_GIC_DIST_BASE), | ||
| 37 | .length = SZ_4K, | ||
| 38 | .type = MT_DEVICE, | 28 | .type = MT_DEVICE, |
| 39 | }, { | 29 | }, { |
| 40 | .virtual = CNS3XXX_TIMER1_2_3_BASE_VIRT, | 30 | .virtual = CNS3XXX_TIMER1_2_3_BASE_VIRT, |
diff --git a/arch/arm/mach-cns3xxx/include/mach/cns3xxx.h b/arch/arm/mach-cns3xxx/include/mach/cns3xxx.h index 191c8e57f289..b1021aafa481 100644 --- a/arch/arm/mach-cns3xxx/include/mach/cns3xxx.h +++ b/arch/arm/mach-cns3xxx/include/mach/cns3xxx.h | |||
| @@ -94,10 +94,10 @@ | |||
| 94 | #define RTC_INTR_STS_OFFSET 0x34 | 94 | #define RTC_INTR_STS_OFFSET 0x34 |
| 95 | 95 | ||
| 96 | #define CNS3XXX_MISC_BASE 0x76000000 /* Misc Control */ | 96 | #define CNS3XXX_MISC_BASE 0x76000000 /* Misc Control */ |
| 97 | #define CNS3XXX_MISC_BASE_VIRT 0xFFF07000 /* Misc Control */ | 97 | #define CNS3XXX_MISC_BASE_VIRT 0xFB000000 /* Misc Control */ |
| 98 | 98 | ||
| 99 | #define CNS3XXX_PM_BASE 0x77000000 /* Power Management Control */ | 99 | #define CNS3XXX_PM_BASE 0x77000000 /* Power Management Control */ |
| 100 | #define CNS3XXX_PM_BASE_VIRT 0xFFF08000 | 100 | #define CNS3XXX_PM_BASE_VIRT 0xFB001000 |
| 101 | 101 | ||
| 102 | #define PM_CLK_GATE_OFFSET 0x00 | 102 | #define PM_CLK_GATE_OFFSET 0x00 |
| 103 | #define PM_SOFT_RST_OFFSET 0x04 | 103 | #define PM_SOFT_RST_OFFSET 0x04 |
| @@ -109,7 +109,7 @@ | |||
| 109 | #define PM_PLL_HM_PD_OFFSET 0x1C | 109 | #define PM_PLL_HM_PD_OFFSET 0x1C |
| 110 | 110 | ||
| 111 | #define CNS3XXX_UART0_BASE 0x78000000 /* UART 0 */ | 111 | #define CNS3XXX_UART0_BASE 0x78000000 /* UART 0 */ |
| 112 | #define CNS3XXX_UART0_BASE_VIRT 0xFFF09000 | 112 | #define CNS3XXX_UART0_BASE_VIRT 0xFB002000 |
| 113 | 113 | ||
| 114 | #define CNS3XXX_UART1_BASE 0x78400000 /* UART 1 */ | 114 | #define CNS3XXX_UART1_BASE 0x78400000 /* UART 1 */ |
| 115 | #define CNS3XXX_UART1_BASE_VIRT 0xFFF0A000 | 115 | #define CNS3XXX_UART1_BASE_VIRT 0xFFF0A000 |
| @@ -130,7 +130,7 @@ | |||
| 130 | #define CNS3XXX_I2S_BASE_VIRT 0xFFF10000 | 130 | #define CNS3XXX_I2S_BASE_VIRT 0xFFF10000 |
| 131 | 131 | ||
| 132 | #define CNS3XXX_TIMER1_2_3_BASE 0x7C800000 /* Timer */ | 132 | #define CNS3XXX_TIMER1_2_3_BASE 0x7C800000 /* Timer */ |
| 133 | #define CNS3XXX_TIMER1_2_3_BASE_VIRT 0xFFF10800 | 133 | #define CNS3XXX_TIMER1_2_3_BASE_VIRT 0xFB003000 |
| 134 | 134 | ||
| 135 | #define TIMER1_COUNTER_OFFSET 0x00 | 135 | #define TIMER1_COUNTER_OFFSET 0x00 |
| 136 | #define TIMER1_AUTO_RELOAD_OFFSET 0x04 | 136 | #define TIMER1_AUTO_RELOAD_OFFSET 0x04 |
| @@ -227,16 +227,16 @@ | |||
| 227 | * Testchip peripheral and fpga gic regions | 227 | * Testchip peripheral and fpga gic regions |
| 228 | */ | 228 | */ |
| 229 | #define CNS3XXX_TC11MP_SCU_BASE 0x90000000 /* IRQ, Test chip */ | 229 | #define CNS3XXX_TC11MP_SCU_BASE 0x90000000 /* IRQ, Test chip */ |
| 230 | #define CNS3XXX_TC11MP_SCU_BASE_VIRT 0xFF000000 | 230 | #define CNS3XXX_TC11MP_SCU_BASE_VIRT 0xFB004000 |
| 231 | 231 | ||
| 232 | #define CNS3XXX_TC11MP_GIC_CPU_BASE 0x90000100 /* Test chip interrupt controller CPU interface */ | 232 | #define CNS3XXX_TC11MP_GIC_CPU_BASE 0x90000100 /* Test chip interrupt controller CPU interface */ |
| 233 | #define CNS3XXX_TC11MP_GIC_CPU_BASE_VIRT 0xFF000100 | 233 | #define CNS3XXX_TC11MP_GIC_CPU_BASE_VIRT (CNS3XXX_TC11MP_SCU_BASE_VIRT + 0x100) |
| 234 | 234 | ||
| 235 | #define CNS3XXX_TC11MP_TWD_BASE 0x90000600 | 235 | #define CNS3XXX_TC11MP_TWD_BASE 0x90000600 |
| 236 | #define CNS3XXX_TC11MP_TWD_BASE_VIRT 0xFF000600 | 236 | #define CNS3XXX_TC11MP_TWD_BASE_VIRT (CNS3XXX_TC11MP_SCU_BASE_VIRT + 0x600) |
| 237 | 237 | ||
| 238 | #define CNS3XXX_TC11MP_GIC_DIST_BASE 0x90001000 /* Test chip interrupt controller distributor */ | 238 | #define CNS3XXX_TC11MP_GIC_DIST_BASE 0x90001000 /* Test chip interrupt controller distributor */ |
| 239 | #define CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT 0xFF001000 | 239 | #define CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT (CNS3XXX_TC11MP_SCU_BASE_VIRT + 0x1000) |
| 240 | 240 | ||
| 241 | #define CNS3XXX_TC11MP_L220_BASE 0x92002000 /* L220 registers */ | 241 | #define CNS3XXX_TC11MP_L220_BASE 0x92002000 /* L220 registers */ |
| 242 | #define CNS3XXX_TC11MP_L220_BASE_VIRT 0xFF002000 | 242 | #define CNS3XXX_TC11MP_L220_BASE_VIRT 0xFF002000 |
diff --git a/arch/arm/mach-ep93xx/include/mach/uncompress.h b/arch/arm/mach-ep93xx/include/mach/uncompress.h index d2afb4dd82ab..b5cc77d2380b 100644 --- a/arch/arm/mach-ep93xx/include/mach/uncompress.h +++ b/arch/arm/mach-ep93xx/include/mach/uncompress.h | |||
| @@ -47,9 +47,13 @@ static void __raw_writel(unsigned int value, unsigned int ptr) | |||
| 47 | 47 | ||
| 48 | static inline void putc(int c) | 48 | static inline void putc(int c) |
| 49 | { | 49 | { |
| 50 | /* Transmit fifo not full? */ | 50 | int i; |
| 51 | while (__raw_readb(PHYS_UART_FLAG) & UART_FLAG_TXFF) | 51 | |
| 52 | ; | 52 | for (i = 0; i < 10000; i++) { |
| 53 | /* Transmit fifo not full? */ | ||
| 54 | if (!(__raw_readb(PHYS_UART_FLAG) & UART_FLAG_TXFF)) | ||
| 55 | break; | ||
| 56 | } | ||
| 53 | 57 | ||
| 54 | __raw_writeb(c, PHYS_UART_DATA); | 58 | __raw_writeb(c, PHYS_UART_DATA); |
| 55 | } | 59 | } |
diff --git a/arch/arm/mach-imx/clk-imx35.c b/arch/arm/mach-imx/clk-imx35.c index e13a8fa5e62c..2193c834f55c 100644 --- a/arch/arm/mach-imx/clk-imx35.c +++ b/arch/arm/mach-imx/clk-imx35.c | |||
| @@ -257,6 +257,7 @@ int __init mx35_clocks_init(void) | |||
| 257 | clk_register_clkdev(clk[wdog_gate], NULL, "imx2-wdt.0"); | 257 | clk_register_clkdev(clk[wdog_gate], NULL, "imx2-wdt.0"); |
| 258 | clk_register_clkdev(clk[nfc_div], NULL, "imx25-nand.0"); | 258 | clk_register_clkdev(clk[nfc_div], NULL, "imx25-nand.0"); |
| 259 | clk_register_clkdev(clk[csi_gate], NULL, "mx3-camera.0"); | 259 | clk_register_clkdev(clk[csi_gate], NULL, "mx3-camera.0"); |
| 260 | clk_register_clkdev(clk[admux_gate], "audmux", NULL); | ||
| 260 | 261 | ||
| 261 | clk_prepare_enable(clk[spba_gate]); | 262 | clk_prepare_enable(clk[spba_gate]); |
| 262 | clk_prepare_enable(clk[gpio1_gate]); | 263 | clk_prepare_enable(clk[gpio1_gate]); |
| @@ -265,6 +266,7 @@ int __init mx35_clocks_init(void) | |||
| 265 | clk_prepare_enable(clk[iim_gate]); | 266 | clk_prepare_enable(clk[iim_gate]); |
| 266 | clk_prepare_enable(clk[emi_gate]); | 267 | clk_prepare_enable(clk[emi_gate]); |
| 267 | clk_prepare_enable(clk[max_gate]); | 268 | clk_prepare_enable(clk[max_gate]); |
| 269 | clk_prepare_enable(clk[iomuxc_gate]); | ||
| 268 | 270 | ||
| 269 | /* | 271 | /* |
| 270 | * SCC is needed to boot via mmc after a watchdog reset. The clock code | 272 | * SCC is needed to boot via mmc after a watchdog reset. The clock code |
diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c index 2f9ff93a4e61..d38e54f5b6d7 100644 --- a/arch/arm/mach-imx/clk-imx6q.c +++ b/arch/arm/mach-imx/clk-imx6q.c | |||
| @@ -115,7 +115,7 @@ static const char *gpu2d_core_sels[] = { "axi", "pll3_usb_otg", "pll2_pfd0_352m" | |||
| 115 | static const char *gpu3d_core_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd2_396m", }; | 115 | static const char *gpu3d_core_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd2_396m", }; |
| 116 | static const char *gpu3d_shader_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd9_720m", }; | 116 | static const char *gpu3d_shader_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd9_720m", }; |
| 117 | static const char *ipu_sels[] = { "mmdc_ch0_axi", "pll2_pfd2_396m", "pll3_120m", "pll3_pfd1_540m", }; | 117 | static const char *ipu_sels[] = { "mmdc_ch0_axi", "pll2_pfd2_396m", "pll3_120m", "pll3_pfd1_540m", }; |
| 118 | static const char *ldb_di_sels[] = { "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "mmdc_ch1_axi", "pll3_pfd1_540m", }; | 118 | static const char *ldb_di_sels[] = { "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "mmdc_ch1_axi", "pll3_usb_otg", }; |
| 119 | static const char *ipu_di_pre_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "pll3_pfd1_540m", }; | 119 | static const char *ipu_di_pre_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "pll3_pfd1_540m", }; |
| 120 | static const char *ipu1_di0_sels[] = { "ipu1_di0_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", }; | 120 | static const char *ipu1_di0_sels[] = { "ipu1_di0_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", }; |
| 121 | static const char *ipu1_di1_sels[] = { "ipu1_di1_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", }; | 121 | static const char *ipu1_di1_sels[] = { "ipu1_di1_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", }; |
| @@ -443,7 +443,6 @@ int __init mx6q_clocks_init(void) | |||
| 443 | 443 | ||
| 444 | clk_register_clkdev(clk[gpt_ipg], "ipg", "imx-gpt.0"); | 444 | clk_register_clkdev(clk[gpt_ipg], "ipg", "imx-gpt.0"); |
| 445 | clk_register_clkdev(clk[gpt_ipg_per], "per", "imx-gpt.0"); | 445 | clk_register_clkdev(clk[gpt_ipg_per], "per", "imx-gpt.0"); |
| 446 | clk_register_clkdev(clk[twd], NULL, "smp_twd"); | ||
| 447 | clk_register_clkdev(clk[cko1_sel], "cko1_sel", NULL); | 446 | clk_register_clkdev(clk[cko1_sel], "cko1_sel", NULL); |
| 448 | clk_register_clkdev(clk[ahb], "ahb", NULL); | 447 | clk_register_clkdev(clk[ahb], "ahb", NULL); |
| 449 | clk_register_clkdev(clk[cko1], "cko1", NULL); | 448 | clk_register_clkdev(clk[cko1], "cko1", NULL); |
diff --git a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h index 5a800bfcec5b..5bf4a97ab241 100644 --- a/arch/arm/mach-imx/common.h +++ b/arch/arm/mach-imx/common.h | |||
| @@ -110,6 +110,8 @@ void tzic_handle_irq(struct pt_regs *); | |||
| 110 | 110 | ||
| 111 | extern void imx_enable_cpu(int cpu, bool enable); | 111 | extern void imx_enable_cpu(int cpu, bool enable); |
| 112 | extern void imx_set_cpu_jump(int cpu, void *jump_addr); | 112 | extern void imx_set_cpu_jump(int cpu, void *jump_addr); |
| 113 | extern u32 imx_get_cpu_arg(int cpu); | ||
| 114 | extern void imx_set_cpu_arg(int cpu, u32 arg); | ||
| 113 | extern void v7_cpu_resume(void); | 115 | extern void v7_cpu_resume(void); |
| 114 | extern u32 *pl310_get_save_ptr(void); | 116 | extern u32 *pl310_get_save_ptr(void); |
| 115 | #ifdef CONFIG_SMP | 117 | #ifdef CONFIG_SMP |
diff --git a/arch/arm/mach-imx/hotplug.c b/arch/arm/mach-imx/hotplug.c index 7bc5fe15dda2..361a253e2b63 100644 --- a/arch/arm/mach-imx/hotplug.c +++ b/arch/arm/mach-imx/hotplug.c | |||
| @@ -46,11 +46,23 @@ static inline void cpu_enter_lowpower(void) | |||
| 46 | void imx_cpu_die(unsigned int cpu) | 46 | void imx_cpu_die(unsigned int cpu) |
| 47 | { | 47 | { |
| 48 | cpu_enter_lowpower(); | 48 | cpu_enter_lowpower(); |
| 49 | /* | ||
| 50 | * We use the cpu jumping argument register to sync with | ||
| 51 | * imx_cpu_kill() which is running on cpu0 and waiting for | ||
| 52 | * the register being cleared to kill the cpu. | ||
| 53 | */ | ||
| 54 | imx_set_cpu_arg(cpu, ~0); | ||
| 49 | cpu_do_idle(); | 55 | cpu_do_idle(); |
| 50 | } | 56 | } |
| 51 | 57 | ||
| 52 | int imx_cpu_kill(unsigned int cpu) | 58 | int imx_cpu_kill(unsigned int cpu) |
| 53 | { | 59 | { |
| 60 | unsigned long timeout = jiffies + msecs_to_jiffies(50); | ||
| 61 | |||
| 62 | while (imx_get_cpu_arg(cpu) == 0) | ||
| 63 | if (time_after(jiffies, timeout)) | ||
| 64 | return 0; | ||
| 54 | imx_enable_cpu(cpu, false); | 65 | imx_enable_cpu(cpu, false); |
| 66 | imx_set_cpu_arg(cpu, 0); | ||
| 55 | return 1; | 67 | return 1; |
| 56 | } | 68 | } |
diff --git a/arch/arm/mach-imx/src.c b/arch/arm/mach-imx/src.c index e15f1555c59b..09a742f8c7ab 100644 --- a/arch/arm/mach-imx/src.c +++ b/arch/arm/mach-imx/src.c | |||
| @@ -43,6 +43,18 @@ void imx_set_cpu_jump(int cpu, void *jump_addr) | |||
| 43 | src_base + SRC_GPR1 + cpu * 8); | 43 | src_base + SRC_GPR1 + cpu * 8); |
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | u32 imx_get_cpu_arg(int cpu) | ||
| 47 | { | ||
| 48 | cpu = cpu_logical_map(cpu); | ||
| 49 | return readl_relaxed(src_base + SRC_GPR1 + cpu * 8 + 4); | ||
| 50 | } | ||
| 51 | |||
| 52 | void imx_set_cpu_arg(int cpu, u32 arg) | ||
| 53 | { | ||
| 54 | cpu = cpu_logical_map(cpu); | ||
| 55 | writel_relaxed(arg, src_base + SRC_GPR1 + cpu * 8 + 4); | ||
| 56 | } | ||
| 57 | |||
| 46 | void imx_src_prepare_restart(void) | 58 | void imx_src_prepare_restart(void) |
| 47 | { | 59 | { |
| 48 | u32 val; | 60 | u32 val; |
diff --git a/arch/arm/mach-kirkwood/board-iomega_ix2_200.c b/arch/arm/mach-kirkwood/board-iomega_ix2_200.c index f655b2637b0e..e5f70415905a 100644 --- a/arch/arm/mach-kirkwood/board-iomega_ix2_200.c +++ b/arch/arm/mach-kirkwood/board-iomega_ix2_200.c | |||
| @@ -20,10 +20,15 @@ static struct mv643xx_eth_platform_data iomega_ix2_200_ge00_data = { | |||
| 20 | .duplex = DUPLEX_FULL, | 20 | .duplex = DUPLEX_FULL, |
| 21 | }; | 21 | }; |
| 22 | 22 | ||
| 23 | static struct mv643xx_eth_platform_data iomega_ix2_200_ge01_data = { | ||
| 24 | .phy_addr = MV643XX_ETH_PHY_ADDR(11), | ||
| 25 | }; | ||
| 26 | |||
| 23 | void __init iomega_ix2_200_init(void) | 27 | void __init iomega_ix2_200_init(void) |
| 24 | { | 28 | { |
| 25 | /* | 29 | /* |
| 26 | * Basic setup. Needs to be called early. | 30 | * Basic setup. Needs to be called early. |
| 27 | */ | 31 | */ |
| 28 | kirkwood_ge01_init(&iomega_ix2_200_ge00_data); | 32 | kirkwood_ge00_init(&iomega_ix2_200_ge00_data); |
| 33 | kirkwood_ge01_init(&iomega_ix2_200_ge01_data); | ||
| 29 | } | 34 | } |
diff --git a/arch/arm/mach-kirkwood/guruplug-setup.c b/arch/arm/mach-kirkwood/guruplug-setup.c index 1c6e736cbbf8..08dd739aa709 100644 --- a/arch/arm/mach-kirkwood/guruplug-setup.c +++ b/arch/arm/mach-kirkwood/guruplug-setup.c | |||
| @@ -53,6 +53,8 @@ static struct mv_sata_platform_data guruplug_sata_data = { | |||
| 53 | 53 | ||
| 54 | static struct mvsdio_platform_data guruplug_mvsdio_data = { | 54 | static struct mvsdio_platform_data guruplug_mvsdio_data = { |
| 55 | /* unfortunately the CD signal has not been connected */ | 55 | /* unfortunately the CD signal has not been connected */ |
| 56 | .gpio_card_detect = -1, | ||
| 57 | .gpio_write_protect = -1, | ||
| 56 | }; | 58 | }; |
| 57 | 59 | ||
| 58 | static struct gpio_led guruplug_led_pins[] = { | 60 | static struct gpio_led guruplug_led_pins[] = { |
diff --git a/arch/arm/mach-kirkwood/openrd-setup.c b/arch/arm/mach-kirkwood/openrd-setup.c index 8ddd69fdc937..6a6eb548307d 100644 --- a/arch/arm/mach-kirkwood/openrd-setup.c +++ b/arch/arm/mach-kirkwood/openrd-setup.c | |||
| @@ -55,6 +55,7 @@ static struct mv_sata_platform_data openrd_sata_data = { | |||
| 55 | 55 | ||
| 56 | static struct mvsdio_platform_data openrd_mvsdio_data = { | 56 | static struct mvsdio_platform_data openrd_mvsdio_data = { |
| 57 | .gpio_card_detect = 29, /* MPP29 used as SD card detect */ | 57 | .gpio_card_detect = 29, /* MPP29 used as SD card detect */ |
| 58 | .gpio_write_protect = -1, | ||
| 58 | }; | 59 | }; |
| 59 | 60 | ||
| 60 | static unsigned int openrd_mpp_config[] __initdata = { | 61 | static unsigned int openrd_mpp_config[] __initdata = { |
diff --git a/arch/arm/mach-kirkwood/rd88f6281-setup.c b/arch/arm/mach-kirkwood/rd88f6281-setup.c index c7d93b48926b..d24223166e06 100644 --- a/arch/arm/mach-kirkwood/rd88f6281-setup.c +++ b/arch/arm/mach-kirkwood/rd88f6281-setup.c | |||
| @@ -69,6 +69,7 @@ static struct mv_sata_platform_data rd88f6281_sata_data = { | |||
| 69 | 69 | ||
| 70 | static struct mvsdio_platform_data rd88f6281_mvsdio_data = { | 70 | static struct mvsdio_platform_data rd88f6281_mvsdio_data = { |
| 71 | .gpio_card_detect = 28, | 71 | .gpio_card_detect = 28, |
| 72 | .gpio_write_protect = -1, | ||
| 72 | }; | 73 | }; |
| 73 | 74 | ||
| 74 | static unsigned int rd88f6281_mpp_config[] __initdata = { | 75 | static unsigned int rd88f6281_mpp_config[] __initdata = { |
diff --git a/arch/arm/mach-msm/timer.c b/arch/arm/mach-msm/timer.c index 2969027f02fa..f9fd77e8f1f5 100644 --- a/arch/arm/mach-msm/timer.c +++ b/arch/arm/mach-msm/timer.c | |||
| @@ -62,7 +62,10 @@ static int msm_timer_set_next_event(unsigned long cycles, | |||
| 62 | { | 62 | { |
| 63 | u32 ctrl = readl_relaxed(event_base + TIMER_ENABLE); | 63 | u32 ctrl = readl_relaxed(event_base + TIMER_ENABLE); |
| 64 | 64 | ||
| 65 | writel_relaxed(0, event_base + TIMER_CLEAR); | 65 | ctrl &= ~TIMER_ENABLE_EN; |
| 66 | writel_relaxed(ctrl, event_base + TIMER_ENABLE); | ||
| 67 | |||
| 68 | writel_relaxed(ctrl, event_base + TIMER_CLEAR); | ||
| 66 | writel_relaxed(cycles, event_base + TIMER_MATCH_VAL); | 69 | writel_relaxed(cycles, event_base + TIMER_MATCH_VAL); |
| 67 | writel_relaxed(ctrl | TIMER_ENABLE_EN, event_base + TIMER_ENABLE); | 70 | writel_relaxed(ctrl | TIMER_ENABLE_EN, event_base + TIMER_ENABLE); |
| 68 | return 0; | 71 | return 0; |
diff --git a/arch/arm/mach-mvebu/irq-armada-370-xp.c b/arch/arm/mach-mvebu/irq-armada-370-xp.c index 274ff58271de..d5970f5a1e8d 100644 --- a/arch/arm/mach-mvebu/irq-armada-370-xp.c +++ b/arch/arm/mach-mvebu/irq-armada-370-xp.c | |||
| @@ -44,6 +44,8 @@ | |||
| 44 | 44 | ||
| 45 | #define ARMADA_370_XP_MAX_PER_CPU_IRQS (28) | 45 | #define ARMADA_370_XP_MAX_PER_CPU_IRQS (28) |
| 46 | 46 | ||
| 47 | #define ARMADA_370_XP_TIMER0_PER_CPU_IRQ (5) | ||
| 48 | |||
| 47 | #define ACTIVE_DOORBELLS (8) | 49 | #define ACTIVE_DOORBELLS (8) |
| 48 | 50 | ||
| 49 | static DEFINE_RAW_SPINLOCK(irq_controller_lock); | 51 | static DEFINE_RAW_SPINLOCK(irq_controller_lock); |
| @@ -59,36 +61,26 @@ static struct irq_domain *armada_370_xp_mpic_domain; | |||
| 59 | */ | 61 | */ |
| 60 | static void armada_370_xp_irq_mask(struct irq_data *d) | 62 | static void armada_370_xp_irq_mask(struct irq_data *d) |
| 61 | { | 63 | { |
| 62 | #ifdef CONFIG_SMP | ||
| 63 | irq_hw_number_t hwirq = irqd_to_hwirq(d); | 64 | irq_hw_number_t hwirq = irqd_to_hwirq(d); |
| 64 | 65 | ||
| 65 | if (hwirq > ARMADA_370_XP_MAX_PER_CPU_IRQS) | 66 | if (hwirq != ARMADA_370_XP_TIMER0_PER_CPU_IRQ) |
| 66 | writel(hwirq, main_int_base + | 67 | writel(hwirq, main_int_base + |
| 67 | ARMADA_370_XP_INT_CLEAR_ENABLE_OFFS); | 68 | ARMADA_370_XP_INT_CLEAR_ENABLE_OFFS); |
| 68 | else | 69 | else |
| 69 | writel(hwirq, per_cpu_int_base + | 70 | writel(hwirq, per_cpu_int_base + |
| 70 | ARMADA_370_XP_INT_SET_MASK_OFFS); | 71 | ARMADA_370_XP_INT_SET_MASK_OFFS); |
| 71 | #else | ||
| 72 | writel(irqd_to_hwirq(d), | ||
| 73 | per_cpu_int_base + ARMADA_370_XP_INT_SET_MASK_OFFS); | ||
| 74 | #endif | ||
| 75 | } | 72 | } |
| 76 | 73 | ||
| 77 | static void armada_370_xp_irq_unmask(struct irq_data *d) | 74 | static void armada_370_xp_irq_unmask(struct irq_data *d) |
| 78 | { | 75 | { |
| 79 | #ifdef CONFIG_SMP | ||
| 80 | irq_hw_number_t hwirq = irqd_to_hwirq(d); | 76 | irq_hw_number_t hwirq = irqd_to_hwirq(d); |
| 81 | 77 | ||
| 82 | if (hwirq > ARMADA_370_XP_MAX_PER_CPU_IRQS) | 78 | if (hwirq != ARMADA_370_XP_TIMER0_PER_CPU_IRQ) |
| 83 | writel(hwirq, main_int_base + | 79 | writel(hwirq, main_int_base + |
| 84 | ARMADA_370_XP_INT_SET_ENABLE_OFFS); | 80 | ARMADA_370_XP_INT_SET_ENABLE_OFFS); |
| 85 | else | 81 | else |
| 86 | writel(hwirq, per_cpu_int_base + | 82 | writel(hwirq, per_cpu_int_base + |
| 87 | ARMADA_370_XP_INT_CLEAR_MASK_OFFS); | 83 | ARMADA_370_XP_INT_CLEAR_MASK_OFFS); |
| 88 | #else | ||
| 89 | writel(irqd_to_hwirq(d), | ||
| 90 | per_cpu_int_base + ARMADA_370_XP_INT_CLEAR_MASK_OFFS); | ||
| 91 | #endif | ||
| 92 | } | 84 | } |
| 93 | 85 | ||
| 94 | #ifdef CONFIG_SMP | 86 | #ifdef CONFIG_SMP |
| @@ -144,10 +136,14 @@ static int armada_370_xp_mpic_irq_map(struct irq_domain *h, | |||
| 144 | unsigned int virq, irq_hw_number_t hw) | 136 | unsigned int virq, irq_hw_number_t hw) |
| 145 | { | 137 | { |
| 146 | armada_370_xp_irq_mask(irq_get_irq_data(virq)); | 138 | armada_370_xp_irq_mask(irq_get_irq_data(virq)); |
| 147 | writel(hw, main_int_base + ARMADA_370_XP_INT_SET_ENABLE_OFFS); | 139 | if (hw != ARMADA_370_XP_TIMER0_PER_CPU_IRQ) |
| 140 | writel(hw, per_cpu_int_base + | ||
| 141 | ARMADA_370_XP_INT_CLEAR_MASK_OFFS); | ||
| 142 | else | ||
| 143 | writel(hw, main_int_base + ARMADA_370_XP_INT_SET_ENABLE_OFFS); | ||
| 148 | irq_set_status_flags(virq, IRQ_LEVEL); | 144 | irq_set_status_flags(virq, IRQ_LEVEL); |
| 149 | 145 | ||
| 150 | if (hw < ARMADA_370_XP_MAX_PER_CPU_IRQS) { | 146 | if (hw == ARMADA_370_XP_TIMER0_PER_CPU_IRQ) { |
| 151 | irq_set_percpu_devid(virq); | 147 | irq_set_percpu_devid(virq); |
| 152 | irq_set_chip_and_handler(virq, &armada_370_xp_irq_chip, | 148 | irq_set_chip_and_handler(virq, &armada_370_xp_irq_chip, |
| 153 | handle_percpu_devid_irq); | 149 | handle_percpu_devid_irq); |
diff --git a/arch/arm/mach-omap1/clock_data.c b/arch/arm/mach-omap1/clock_data.c index cb7c6ae2e3fc..6c4f766365a2 100644 --- a/arch/arm/mach-omap1/clock_data.c +++ b/arch/arm/mach-omap1/clock_data.c | |||
| @@ -543,15 +543,6 @@ static struct clk usb_dc_ck = { | |||
| 543 | /* Direct from ULPD, no parent */ | 543 | /* Direct from ULPD, no parent */ |
| 544 | .rate = 48000000, | 544 | .rate = 48000000, |
| 545 | .enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG), | 545 | .enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG), |
| 546 | .enable_bit = USB_REQ_EN_SHIFT, | ||
| 547 | }; | ||
| 548 | |||
| 549 | static struct clk usb_dc_ck7xx = { | ||
| 550 | .name = "usb_dc_ck", | ||
| 551 | .ops = &clkops_generic, | ||
| 552 | /* Direct from ULPD, no parent */ | ||
| 553 | .rate = 48000000, | ||
| 554 | .enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG), | ||
| 555 | .enable_bit = SOFT_USB_OTG_DPLL_REQ_SHIFT, | 546 | .enable_bit = SOFT_USB_OTG_DPLL_REQ_SHIFT, |
| 556 | }; | 547 | }; |
| 557 | 548 | ||
| @@ -727,8 +718,7 @@ static struct omap_clk omap_clks[] = { | |||
| 727 | CLK(NULL, "usb_clko", &usb_clko, CK_16XX | CK_1510 | CK_310), | 718 | CLK(NULL, "usb_clko", &usb_clko, CK_16XX | CK_1510 | CK_310), |
| 728 | CLK(NULL, "usb_hhc_ck", &usb_hhc_ck1510, CK_1510 | CK_310), | 719 | CLK(NULL, "usb_hhc_ck", &usb_hhc_ck1510, CK_1510 | CK_310), |
| 729 | CLK(NULL, "usb_hhc_ck", &usb_hhc_ck16xx, CK_16XX), | 720 | CLK(NULL, "usb_hhc_ck", &usb_hhc_ck16xx, CK_16XX), |
| 730 | CLK(NULL, "usb_dc_ck", &usb_dc_ck, CK_16XX), | 721 | CLK(NULL, "usb_dc_ck", &usb_dc_ck, CK_16XX | CK_7XX), |
| 731 | CLK(NULL, "usb_dc_ck", &usb_dc_ck7xx, CK_7XX), | ||
| 732 | CLK(NULL, "mclk", &mclk_1510, CK_1510 | CK_310), | 722 | CLK(NULL, "mclk", &mclk_1510, CK_1510 | CK_310), |
| 733 | CLK(NULL, "mclk", &mclk_16xx, CK_16XX), | 723 | CLK(NULL, "mclk", &mclk_16xx, CK_16XX), |
| 734 | CLK(NULL, "bclk", &bclk_1510, CK_1510 | CK_310), | 724 | CLK(NULL, "bclk", &bclk_1510, CK_1510 | CK_310), |
diff --git a/arch/arm/mach-omap2/cclock44xx_data.c b/arch/arm/mach-omap2/cclock44xx_data.c index 3d58f335f173..0c6834ae1fc4 100644 --- a/arch/arm/mach-omap2/cclock44xx_data.c +++ b/arch/arm/mach-omap2/cclock44xx_data.c | |||
| @@ -52,6 +52,13 @@ | |||
| 52 | */ | 52 | */ |
| 53 | #define OMAP4_DPLL_ABE_DEFFREQ 98304000 | 53 | #define OMAP4_DPLL_ABE_DEFFREQ 98304000 |
| 54 | 54 | ||
| 55 | /* | ||
| 56 | * OMAP4 USB DPLL default frequency. In OMAP4430 TRM version V, section | ||
| 57 | * "3.6.3.9.5 DPLL_USB Preferred Settings" shows that the preferred | ||
| 58 | * locked frequency for the USB DPLL is 960MHz. | ||
| 59 | */ | ||
| 60 | #define OMAP4_DPLL_USB_DEFFREQ 960000000 | ||
| 61 | |||
| 55 | /* Root clocks */ | 62 | /* Root clocks */ |
| 56 | 63 | ||
| 57 | DEFINE_CLK_FIXED_RATE(extalt_clkin_ck, CLK_IS_ROOT, 59000000, 0x0); | 64 | DEFINE_CLK_FIXED_RATE(extalt_clkin_ck, CLK_IS_ROOT, 59000000, 0x0); |
| @@ -1011,6 +1018,10 @@ DEFINE_CLK_OMAP_MUX(hsmmc2_fclk, "l3_init_clkdm", hsmmc1_fclk_sel, | |||
| 1011 | OMAP4430_CM_L3INIT_MMC2_CLKCTRL, OMAP4430_CLKSEL_MASK, | 1018 | OMAP4430_CM_L3INIT_MMC2_CLKCTRL, OMAP4430_CLKSEL_MASK, |
| 1012 | hsmmc1_fclk_parents, func_dmic_abe_gfclk_ops); | 1019 | hsmmc1_fclk_parents, func_dmic_abe_gfclk_ops); |
| 1013 | 1020 | ||
| 1021 | DEFINE_CLK_GATE(ocp2scp_usb_phy_phy_48m, "func_48m_fclk", &func_48m_fclk, 0x0, | ||
| 1022 | OMAP4430_CM_L3INIT_USBPHYOCP2SCP_CLKCTRL, | ||
| 1023 | OMAP4430_OPTFCLKEN_PHY_48M_SHIFT, 0x0, NULL); | ||
| 1024 | |||
| 1014 | DEFINE_CLK_GATE(sha2md5_fck, "l3_div_ck", &l3_div_ck, 0x0, | 1025 | DEFINE_CLK_GATE(sha2md5_fck, "l3_div_ck", &l3_div_ck, 0x0, |
| 1015 | OMAP4430_CM_L4SEC_SHA2MD51_CLKCTRL, | 1026 | OMAP4430_CM_L4SEC_SHA2MD51_CLKCTRL, |
| 1016 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | 1027 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); |
| @@ -1538,6 +1549,7 @@ static struct omap_clk omap44xx_clks[] = { | |||
| 1538 | CLK(NULL, "per_mcbsp4_gfclk", &per_mcbsp4_gfclk, CK_443X), | 1549 | CLK(NULL, "per_mcbsp4_gfclk", &per_mcbsp4_gfclk, CK_443X), |
| 1539 | CLK(NULL, "hsmmc1_fclk", &hsmmc1_fclk, CK_443X), | 1550 | CLK(NULL, "hsmmc1_fclk", &hsmmc1_fclk, CK_443X), |
| 1540 | CLK(NULL, "hsmmc2_fclk", &hsmmc2_fclk, CK_443X), | 1551 | CLK(NULL, "hsmmc2_fclk", &hsmmc2_fclk, CK_443X), |
| 1552 | CLK(NULL, "ocp2scp_usb_phy_phy_48m", &ocp2scp_usb_phy_phy_48m, CK_443X), | ||
| 1541 | CLK(NULL, "sha2md5_fck", &sha2md5_fck, CK_443X), | 1553 | CLK(NULL, "sha2md5_fck", &sha2md5_fck, CK_443X), |
| 1542 | CLK(NULL, "slimbus1_fclk_1", &slimbus1_fclk_1, CK_443X), | 1554 | CLK(NULL, "slimbus1_fclk_1", &slimbus1_fclk_1, CK_443X), |
| 1543 | CLK(NULL, "slimbus1_fclk_0", &slimbus1_fclk_0, CK_443X), | 1555 | CLK(NULL, "slimbus1_fclk_0", &slimbus1_fclk_0, CK_443X), |
| @@ -1705,5 +1717,13 @@ int __init omap4xxx_clk_init(void) | |||
| 1705 | if (rc) | 1717 | if (rc) |
| 1706 | pr_err("%s: failed to configure ABE DPLL!\n", __func__); | 1718 | pr_err("%s: failed to configure ABE DPLL!\n", __func__); |
| 1707 | 1719 | ||
| 1720 | /* | ||
| 1721 | * Lock USB DPLL on OMAP4 devices so that the L3INIT power | ||
| 1722 | * domain can transition to retention state when not in use. | ||
| 1723 | */ | ||
| 1724 | rc = clk_set_rate(&dpll_usb_ck, OMAP4_DPLL_USB_DEFFREQ); | ||
| 1725 | if (rc) | ||
| 1726 | pr_err("%s: failed to configure USB DPLL!\n", __func__); | ||
| 1727 | |||
| 1708 | return 0; | 1728 | return 0; |
| 1709 | } | 1729 | } |
diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h index 40f4a03d728f..d6ba13e1c540 100644 --- a/arch/arm/mach-omap2/common.h +++ b/arch/arm/mach-omap2/common.h | |||
| @@ -293,5 +293,8 @@ extern void omap_reserve(void); | |||
| 293 | struct omap_hwmod; | 293 | struct omap_hwmod; |
| 294 | extern int omap_dss_reset(struct omap_hwmod *); | 294 | extern int omap_dss_reset(struct omap_hwmod *); |
| 295 | 295 | ||
| 296 | /* SoC specific clock initializer */ | ||
| 297 | extern int (*omap_clk_init)(void); | ||
| 298 | |||
| 296 | #endif /* __ASSEMBLER__ */ | 299 | #endif /* __ASSEMBLER__ */ |
| 297 | #endif /* __ARCH_ARM_MACH_OMAP2PLUS_COMMON_H */ | 300 | #endif /* __ARCH_ARM_MACH_OMAP2PLUS_COMMON_H */ |
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 2c3fdd65387b..5c445ca1e271 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
| @@ -55,6 +55,12 @@ | |||
| 55 | #include "prm44xx.h" | 55 | #include "prm44xx.h" |
| 56 | 56 | ||
| 57 | /* | 57 | /* |
| 58 | * omap_clk_init: points to a function that does the SoC-specific | ||
| 59 | * clock initializations | ||
| 60 | */ | ||
| 61 | int (*omap_clk_init)(void); | ||
| 62 | |||
| 63 | /* | ||
| 58 | * The machine specific code may provide the extra mapping besides the | 64 | * The machine specific code may provide the extra mapping besides the |
| 59 | * default mapping provided here. | 65 | * default mapping provided here. |
| 60 | */ | 66 | */ |
| @@ -397,7 +403,7 @@ void __init omap2420_init_early(void) | |||
| 397 | omap242x_clockdomains_init(); | 403 | omap242x_clockdomains_init(); |
| 398 | omap2420_hwmod_init(); | 404 | omap2420_hwmod_init(); |
| 399 | omap_hwmod_init_postsetup(); | 405 | omap_hwmod_init_postsetup(); |
| 400 | omap2420_clk_init(); | 406 | omap_clk_init = omap2420_clk_init; |
| 401 | } | 407 | } |
| 402 | 408 | ||
| 403 | void __init omap2420_init_late(void) | 409 | void __init omap2420_init_late(void) |
| @@ -427,7 +433,7 @@ void __init omap2430_init_early(void) | |||
| 427 | omap243x_clockdomains_init(); | 433 | omap243x_clockdomains_init(); |
| 428 | omap2430_hwmod_init(); | 434 | omap2430_hwmod_init(); |
| 429 | omap_hwmod_init_postsetup(); | 435 | omap_hwmod_init_postsetup(); |
| 430 | omap2430_clk_init(); | 436 | omap_clk_init = omap2430_clk_init; |
| 431 | } | 437 | } |
| 432 | 438 | ||
| 433 | void __init omap2430_init_late(void) | 439 | void __init omap2430_init_late(void) |
| @@ -462,7 +468,7 @@ void __init omap3_init_early(void) | |||
| 462 | omap3xxx_clockdomains_init(); | 468 | omap3xxx_clockdomains_init(); |
| 463 | omap3xxx_hwmod_init(); | 469 | omap3xxx_hwmod_init(); |
| 464 | omap_hwmod_init_postsetup(); | 470 | omap_hwmod_init_postsetup(); |
| 465 | omap3xxx_clk_init(); | 471 | omap_clk_init = omap3xxx_clk_init; |
| 466 | } | 472 | } |
| 467 | 473 | ||
| 468 | void __init omap3430_init_early(void) | 474 | void __init omap3430_init_early(void) |
| @@ -500,7 +506,7 @@ void __init ti81xx_init_early(void) | |||
| 500 | omap3xxx_clockdomains_init(); | 506 | omap3xxx_clockdomains_init(); |
| 501 | omap3xxx_hwmod_init(); | 507 | omap3xxx_hwmod_init(); |
| 502 | omap_hwmod_init_postsetup(); | 508 | omap_hwmod_init_postsetup(); |
| 503 | omap3xxx_clk_init(); | 509 | omap_clk_init = omap3xxx_clk_init; |
| 504 | } | 510 | } |
| 505 | 511 | ||
| 506 | void __init omap3_init_late(void) | 512 | void __init omap3_init_late(void) |
| @@ -568,7 +574,7 @@ void __init am33xx_init_early(void) | |||
| 568 | am33xx_clockdomains_init(); | 574 | am33xx_clockdomains_init(); |
| 569 | am33xx_hwmod_init(); | 575 | am33xx_hwmod_init(); |
| 570 | omap_hwmod_init_postsetup(); | 576 | omap_hwmod_init_postsetup(); |
| 571 | am33xx_clk_init(); | 577 | omap_clk_init = am33xx_clk_init; |
| 572 | } | 578 | } |
| 573 | #endif | 579 | #endif |
| 574 | 580 | ||
| @@ -593,7 +599,7 @@ void __init omap4430_init_early(void) | |||
| 593 | omap44xx_clockdomains_init(); | 599 | omap44xx_clockdomains_init(); |
| 594 | omap44xx_hwmod_init(); | 600 | omap44xx_hwmod_init(); |
| 595 | omap_hwmod_init_postsetup(); | 601 | omap_hwmod_init_postsetup(); |
| 596 | omap4xxx_clk_init(); | 602 | omap_clk_init = omap4xxx_clk_init; |
| 597 | } | 603 | } |
| 598 | 604 | ||
| 599 | void __init omap4430_init_late(void) | 605 | void __init omap4430_init_late(void) |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index c2c798c08c2b..a202a4785104 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
| @@ -1368,7 +1368,9 @@ static void _enable_sysc(struct omap_hwmod *oh) | |||
| 1368 | } | 1368 | } |
| 1369 | 1369 | ||
| 1370 | if (sf & SYSC_HAS_MIDLEMODE) { | 1370 | if (sf & SYSC_HAS_MIDLEMODE) { |
| 1371 | if (oh->flags & HWMOD_SWSUP_MSTANDBY) { | 1371 | if (oh->flags & HWMOD_FORCE_MSTANDBY) { |
| 1372 | idlemode = HWMOD_IDLEMODE_FORCE; | ||
| 1373 | } else if (oh->flags & HWMOD_SWSUP_MSTANDBY) { | ||
| 1372 | idlemode = HWMOD_IDLEMODE_NO; | 1374 | idlemode = HWMOD_IDLEMODE_NO; |
| 1373 | } else { | 1375 | } else { |
| 1374 | if (sf & SYSC_HAS_ENAWAKEUP) | 1376 | if (sf & SYSC_HAS_ENAWAKEUP) |
| @@ -1440,7 +1442,8 @@ static void _idle_sysc(struct omap_hwmod *oh) | |||
| 1440 | } | 1442 | } |
| 1441 | 1443 | ||
| 1442 | if (sf & SYSC_HAS_MIDLEMODE) { | 1444 | if (sf & SYSC_HAS_MIDLEMODE) { |
| 1443 | if (oh->flags & HWMOD_SWSUP_MSTANDBY) { | 1445 | if ((oh->flags & HWMOD_SWSUP_MSTANDBY) || |
| 1446 | (oh->flags & HWMOD_FORCE_MSTANDBY)) { | ||
| 1444 | idlemode = HWMOD_IDLEMODE_FORCE; | 1447 | idlemode = HWMOD_IDLEMODE_FORCE; |
| 1445 | } else { | 1448 | } else { |
| 1446 | if (sf & SYSC_HAS_ENAWAKEUP) | 1449 | if (sf & SYSC_HAS_ENAWAKEUP) |
diff --git a/arch/arm/mach-omap2/omap_hwmod.h b/arch/arm/mach-omap2/omap_hwmod.h index d43d9b608eda..d5dc935f6060 100644 --- a/arch/arm/mach-omap2/omap_hwmod.h +++ b/arch/arm/mach-omap2/omap_hwmod.h | |||
| @@ -427,8 +427,8 @@ struct omap_hwmod_omap4_prcm { | |||
| 427 | * | 427 | * |
| 428 | * HWMOD_SWSUP_SIDLE: omap_hwmod code should manually bring module in and out | 428 | * HWMOD_SWSUP_SIDLE: omap_hwmod code should manually bring module in and out |
| 429 | * of idle, rather than relying on module smart-idle | 429 | * of idle, rather than relying on module smart-idle |
| 430 | * HWMOD_SWSUP_MSTDBY: omap_hwmod code should manually bring module in and out | 430 | * HWMOD_SWSUP_MSTANDBY: omap_hwmod code should manually bring module in and |
| 431 | * of standby, rather than relying on module smart-standby | 431 | * out of standby, rather than relying on module smart-standby |
| 432 | * HWMOD_INIT_NO_RESET: don't reset this module at boot - important for | 432 | * HWMOD_INIT_NO_RESET: don't reset this module at boot - important for |
| 433 | * SDRAM controller, etc. XXX probably belongs outside the main hwmod file | 433 | * SDRAM controller, etc. XXX probably belongs outside the main hwmod file |
| 434 | * XXX Should be HWMOD_SETUP_NO_RESET | 434 | * XXX Should be HWMOD_SETUP_NO_RESET |
| @@ -459,6 +459,10 @@ struct omap_hwmod_omap4_prcm { | |||
| 459 | * correctly, or this is being abused to deal with some PM latency | 459 | * correctly, or this is being abused to deal with some PM latency |
| 460 | * issues -- but we're currently suffering from a shortage of | 460 | * issues -- but we're currently suffering from a shortage of |
| 461 | * folks who are able to track these issues down properly. | 461 | * folks who are able to track these issues down properly. |
| 462 | * HWMOD_FORCE_MSTANDBY: Always keep MIDLEMODE bits cleared so that device | ||
| 463 | * is kept in force-standby mode. Failing to do so causes PM problems | ||
| 464 | * with musb on OMAP3630 at least. Note that musb has a dedicated register | ||
| 465 | * to control MSTANDBY signal when MIDLEMODE is set to force-standby. | ||
| 462 | */ | 466 | */ |
| 463 | #define HWMOD_SWSUP_SIDLE (1 << 0) | 467 | #define HWMOD_SWSUP_SIDLE (1 << 0) |
| 464 | #define HWMOD_SWSUP_MSTANDBY (1 << 1) | 468 | #define HWMOD_SWSUP_MSTANDBY (1 << 1) |
| @@ -471,6 +475,7 @@ struct omap_hwmod_omap4_prcm { | |||
| 471 | #define HWMOD_16BIT_REG (1 << 8) | 475 | #define HWMOD_16BIT_REG (1 << 8) |
| 472 | #define HWMOD_EXT_OPT_MAIN_CLK (1 << 9) | 476 | #define HWMOD_EXT_OPT_MAIN_CLK (1 << 9) |
| 473 | #define HWMOD_BLOCK_WFI (1 << 10) | 477 | #define HWMOD_BLOCK_WFI (1 << 10) |
| 478 | #define HWMOD_FORCE_MSTANDBY (1 << 11) | ||
| 474 | 479 | ||
| 475 | /* | 480 | /* |
| 476 | * omap_hwmod._int_flags definitions | 481 | * omap_hwmod._int_flags definitions |
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index ac7e03ec952f..5112d04e7b79 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | |||
| @@ -1707,9 +1707,14 @@ static struct omap_hwmod omap3xxx_usbhsotg_hwmod = { | |||
| 1707 | * Erratum ID: i479 idle_req / idle_ack mechanism potentially | 1707 | * Erratum ID: i479 idle_req / idle_ack mechanism potentially |
| 1708 | * broken when autoidle is enabled | 1708 | * broken when autoidle is enabled |
| 1709 | * workaround is to disable the autoidle bit at module level. | 1709 | * workaround is to disable the autoidle bit at module level. |
| 1710 | * | ||
| 1711 | * Enabling the device in any other MIDLEMODE setting but force-idle | ||
| 1712 | * causes core_pwrdm not enter idle states at least on OMAP3630. | ||
| 1713 | * Note that musb has OTG_FORCESTDBY register that controls MSTANDBY | ||
| 1714 | * signal when MIDLEMODE is set to force-idle. | ||
| 1710 | */ | 1715 | */ |
| 1711 | .flags = HWMOD_NO_OCP_AUTOIDLE | HWMOD_SWSUP_SIDLE | 1716 | .flags = HWMOD_NO_OCP_AUTOIDLE | HWMOD_SWSUP_SIDLE |
| 1712 | | HWMOD_SWSUP_MSTANDBY, | 1717 | | HWMOD_FORCE_MSTANDBY, |
| 1713 | }; | 1718 | }; |
| 1714 | 1719 | ||
| 1715 | /* usb_otg_hs */ | 1720 | /* usb_otg_hs */ |
diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index 0e47d2e1687c..9e0576569e07 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c | |||
| @@ -2714,6 +2714,10 @@ static struct omap_ocp2scp_dev ocp2scp_dev_attr[] = { | |||
| 2714 | { } | 2714 | { } |
| 2715 | }; | 2715 | }; |
| 2716 | 2716 | ||
| 2717 | static struct omap_hwmod_opt_clk ocp2scp_usb_phy_opt_clks[] = { | ||
| 2718 | { .role = "48mhz", .clk = "ocp2scp_usb_phy_phy_48m" }, | ||
| 2719 | }; | ||
| 2720 | |||
| 2717 | /* ocp2scp_usb_phy */ | 2721 | /* ocp2scp_usb_phy */ |
| 2718 | static struct omap_hwmod omap44xx_ocp2scp_usb_phy_hwmod = { | 2722 | static struct omap_hwmod omap44xx_ocp2scp_usb_phy_hwmod = { |
| 2719 | .name = "ocp2scp_usb_phy", | 2723 | .name = "ocp2scp_usb_phy", |
| @@ -2728,6 +2732,8 @@ static struct omap_hwmod omap44xx_ocp2scp_usb_phy_hwmod = { | |||
| 2728 | }, | 2732 | }, |
| 2729 | }, | 2733 | }, |
| 2730 | .dev_attr = ocp2scp_dev_attr, | 2734 | .dev_attr = ocp2scp_dev_attr, |
| 2735 | .opt_clks = ocp2scp_usb_phy_opt_clks, | ||
| 2736 | .opt_clks_cnt = ARRAY_SIZE(ocp2scp_usb_phy_opt_clks), | ||
| 2731 | }; | 2737 | }; |
| 2732 | 2738 | ||
| 2733 | /* | 2739 | /* |
diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c index 2bdd4cf17a8f..f62b509ed08d 100644 --- a/arch/arm/mach-omap2/timer.c +++ b/arch/arm/mach-omap2/timer.c | |||
| @@ -547,6 +547,8 @@ static inline void __init realtime_counter_init(void) | |||
| 547 | clksrc_nr, clksrc_src) \ | 547 | clksrc_nr, clksrc_src) \ |
| 548 | void __init omap##name##_gptimer_timer_init(void) \ | 548 | void __init omap##name##_gptimer_timer_init(void) \ |
| 549 | { \ | 549 | { \ |
| 550 | if (omap_clk_init) \ | ||
| 551 | omap_clk_init(); \ | ||
| 550 | omap_dmtimer_init(); \ | 552 | omap_dmtimer_init(); \ |
| 551 | omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \ | 553 | omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \ |
| 552 | omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src); \ | 554 | omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src); \ |
| @@ -556,6 +558,8 @@ void __init omap##name##_gptimer_timer_init(void) \ | |||
| 556 | clksrc_nr, clksrc_src) \ | 558 | clksrc_nr, clksrc_src) \ |
| 557 | void __init omap##name##_sync32k_timer_init(void) \ | 559 | void __init omap##name##_sync32k_timer_init(void) \ |
| 558 | { \ | 560 | { \ |
| 561 | if (omap_clk_init) \ | ||
| 562 | omap_clk_init(); \ | ||
| 559 | omap_dmtimer_init(); \ | 563 | omap_dmtimer_init(); \ |
| 560 | omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \ | 564 | omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \ |
| 561 | /* Enable the use of clocksource="gp_timer" kernel parameter */ \ | 565 | /* Enable the use of clocksource="gp_timer" kernel parameter */ \ |
diff --git a/arch/arm/mach-s3c24xx/include/mach/irqs.h b/arch/arm/mach-s3c24xx/include/mach/irqs.h index b7a9f4d469e8..1e73f5fa8659 100644 --- a/arch/arm/mach-s3c24xx/include/mach/irqs.h +++ b/arch/arm/mach-s3c24xx/include/mach/irqs.h | |||
| @@ -188,10 +188,8 @@ | |||
| 188 | 188 | ||
| 189 | #if defined(CONFIG_CPU_S3C2416) | 189 | #if defined(CONFIG_CPU_S3C2416) |
| 190 | #define NR_IRQS (IRQ_S3C2416_I2S1 + 1) | 190 | #define NR_IRQS (IRQ_S3C2416_I2S1 + 1) |
| 191 | #elif defined(CONFIG_CPU_S3C2443) | ||
| 192 | #define NR_IRQS (IRQ_S3C2443_AC97+1) | ||
| 193 | #else | 191 | #else |
| 194 | #define NR_IRQS (IRQ_S3C2440_AC97+1) | 192 | #define NR_IRQS (IRQ_S3C2443_AC97 + 1) |
| 195 | #endif | 193 | #endif |
| 196 | 194 | ||
| 197 | /* compatibility define. */ | 195 | /* compatibility define. */ |
diff --git a/arch/arm/mach-s3c24xx/irq.c b/arch/arm/mach-s3c24xx/irq.c index cb9f5e011e73..d8ba9bee4c7e 100644 --- a/arch/arm/mach-s3c24xx/irq.c +++ b/arch/arm/mach-s3c24xx/irq.c | |||
| @@ -500,7 +500,7 @@ struct s3c_irq_intc *s3c24xx_init_intc(struct device_node *np, | |||
| 500 | base = (void *)0xfd000000; | 500 | base = (void *)0xfd000000; |
| 501 | 501 | ||
| 502 | intc->reg_mask = base + 0xa4; | 502 | intc->reg_mask = base + 0xa4; |
| 503 | intc->reg_pending = base + 0x08; | 503 | intc->reg_pending = base + 0xa8; |
| 504 | irq_num = 20; | 504 | irq_num = 20; |
| 505 | irq_start = S3C2410_IRQ(32); | 505 | irq_start = S3C2410_IRQ(32); |
| 506 | irq_offset = 4; | 506 | irq_offset = 4; |
diff --git a/arch/arm/mach-ux500/board-mop500-sdi.c b/arch/arm/mach-ux500/board-mop500-sdi.c index 051b62c27102..7f2cb6c5e2c1 100644 --- a/arch/arm/mach-ux500/board-mop500-sdi.c +++ b/arch/arm/mach-ux500/board-mop500-sdi.c | |||
| @@ -81,7 +81,6 @@ static struct stedma40_chan_cfg mop500_sdi0_dma_cfg_tx = { | |||
| 81 | #endif | 81 | #endif |
| 82 | 82 | ||
| 83 | struct mmci_platform_data mop500_sdi0_data = { | 83 | struct mmci_platform_data mop500_sdi0_data = { |
| 84 | .ios_handler = mop500_sdi0_ios_handler, | ||
| 85 | .ocr_mask = MMC_VDD_29_30, | 84 | .ocr_mask = MMC_VDD_29_30, |
| 86 | .f_max = 50000000, | 85 | .f_max = 50000000, |
| 87 | .capabilities = MMC_CAP_4_BIT_DATA | | 86 | .capabilities = MMC_CAP_4_BIT_DATA | |
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index b03457881c4b..87d2d7b38ce9 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
| 13 | #include <linux/interrupt.h> | 13 | #include <linux/interrupt.h> |
| 14 | #include <linux/platform_device.h> | 14 | #include <linux/platform_device.h> |
| 15 | #include <linux/clk.h> | ||
| 15 | #include <linux/io.h> | 16 | #include <linux/io.h> |
| 16 | #include <linux/i2c.h> | 17 | #include <linux/i2c.h> |
| 17 | #include <linux/platform_data/i2c-nomadik.h> | 18 | #include <linux/platform_data/i2c-nomadik.h> |
| @@ -439,6 +440,15 @@ static void mop500_prox_deactivate(struct device *dev) | |||
| 439 | regulator_put(prox_regulator); | 440 | regulator_put(prox_regulator); |
| 440 | } | 441 | } |
| 441 | 442 | ||
| 443 | void mop500_snowball_ethernet_clock_enable(void) | ||
| 444 | { | ||
| 445 | struct clk *clk; | ||
| 446 | |||
| 447 | clk = clk_get_sys("fsmc", NULL); | ||
| 448 | if (!IS_ERR(clk)) | ||
| 449 | clk_prepare_enable(clk); | ||
| 450 | } | ||
| 451 | |||
| 442 | static struct cryp_platform_data u8500_cryp1_platform_data = { | 452 | static struct cryp_platform_data u8500_cryp1_platform_data = { |
| 443 | .mem_to_engine = { | 453 | .mem_to_engine = { |
| 444 | .dir = STEDMA40_MEM_TO_PERIPH, | 454 | .dir = STEDMA40_MEM_TO_PERIPH, |
| @@ -683,6 +693,8 @@ static void __init snowball_init_machine(void) | |||
| 683 | mop500_audio_init(parent); | 693 | mop500_audio_init(parent); |
| 684 | mop500_uart_init(parent); | 694 | mop500_uart_init(parent); |
| 685 | 695 | ||
| 696 | mop500_snowball_ethernet_clock_enable(); | ||
| 697 | |||
| 686 | /* This board has full regulator constraints */ | 698 | /* This board has full regulator constraints */ |
| 687 | regulator_has_full_constraints(); | 699 | regulator_has_full_constraints(); |
| 688 | } | 700 | } |
diff --git a/arch/arm/mach-ux500/board-mop500.h b/arch/arm/mach-ux500/board-mop500.h index eaa605f5d90d..d38951be70df 100644 --- a/arch/arm/mach-ux500/board-mop500.h +++ b/arch/arm/mach-ux500/board-mop500.h | |||
| @@ -104,6 +104,7 @@ void __init mop500_pinmaps_init(void); | |||
| 104 | void __init snowball_pinmaps_init(void); | 104 | void __init snowball_pinmaps_init(void); |
| 105 | void __init hrefv60_pinmaps_init(void); | 105 | void __init hrefv60_pinmaps_init(void); |
| 106 | void mop500_audio_init(struct device *parent); | 106 | void mop500_audio_init(struct device *parent); |
| 107 | void mop500_snowball_ethernet_clock_enable(void); | ||
| 107 | 108 | ||
| 108 | int __init mop500_uib_init(void); | 109 | int __init mop500_uib_init(void); |
| 109 | void mop500_uib_i2c_add(int busnum, struct i2c_board_info *info, | 110 | void mop500_uib_i2c_add(int busnum, struct i2c_board_info *info, |
diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c index 19235cf7bbe3..f1a581844372 100644 --- a/arch/arm/mach-ux500/cpu-db8500.c +++ b/arch/arm/mach-ux500/cpu-db8500.c | |||
| @@ -312,9 +312,10 @@ static void __init u8500_init_machine(void) | |||
| 312 | /* Pinmaps must be in place before devices register */ | 312 | /* Pinmaps must be in place before devices register */ |
| 313 | if (of_machine_is_compatible("st-ericsson,mop500")) | 313 | if (of_machine_is_compatible("st-ericsson,mop500")) |
| 314 | mop500_pinmaps_init(); | 314 | mop500_pinmaps_init(); |
| 315 | else if (of_machine_is_compatible("calaosystems,snowball-a9500")) | 315 | else if (of_machine_is_compatible("calaosystems,snowball-a9500")) { |
| 316 | snowball_pinmaps_init(); | 316 | snowball_pinmaps_init(); |
| 317 | else if (of_machine_is_compatible("st-ericsson,hrefv60+")) | 317 | mop500_snowball_ethernet_clock_enable(); |
| 318 | } else if (of_machine_is_compatible("st-ericsson,hrefv60+")) | ||
| 318 | hrefv60_pinmaps_init(); | 319 | hrefv60_pinmaps_init(); |
| 319 | else if (of_machine_is_compatible("st-ericsson,ccu9540")) {} | 320 | else if (of_machine_is_compatible("st-ericsson,ccu9540")) {} |
| 320 | /* TODO: Add pinmaps for ccu9540 board. */ | 321 | /* TODO: Add pinmaps for ccu9540 board. */ |
diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c index c2f37390308a..c465faca51b0 100644 --- a/arch/arm/mm/cache-l2x0.c +++ b/arch/arm/mm/cache-l2x0.c | |||
| @@ -299,7 +299,7 @@ static void l2x0_unlock(u32 cache_id) | |||
| 299 | int lockregs; | 299 | int lockregs; |
| 300 | int i; | 300 | int i; |
| 301 | 301 | ||
| 302 | switch (cache_id) { | 302 | switch (cache_id & L2X0_CACHE_ID_PART_MASK) { |
| 303 | case L2X0_CACHE_ID_PART_L310: | 303 | case L2X0_CACHE_ID_PART_L310: |
| 304 | lockregs = 8; | 304 | lockregs = 8; |
| 305 | break; | 305 | break; |
| @@ -333,15 +333,14 @@ void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask) | |||
| 333 | if (cache_id_part_number_from_dt) | 333 | if (cache_id_part_number_from_dt) |
| 334 | cache_id = cache_id_part_number_from_dt; | 334 | cache_id = cache_id_part_number_from_dt; |
| 335 | else | 335 | else |
| 336 | cache_id = readl_relaxed(l2x0_base + L2X0_CACHE_ID) | 336 | cache_id = readl_relaxed(l2x0_base + L2X0_CACHE_ID); |
| 337 | & L2X0_CACHE_ID_PART_MASK; | ||
| 338 | aux = readl_relaxed(l2x0_base + L2X0_AUX_CTRL); | 337 | aux = readl_relaxed(l2x0_base + L2X0_AUX_CTRL); |
| 339 | 338 | ||
| 340 | aux &= aux_mask; | 339 | aux &= aux_mask; |
| 341 | aux |= aux_val; | 340 | aux |= aux_val; |
| 342 | 341 | ||
| 343 | /* Determine the number of ways */ | 342 | /* Determine the number of ways */ |
| 344 | switch (cache_id) { | 343 | switch (cache_id & L2X0_CACHE_ID_PART_MASK) { |
| 345 | case L2X0_CACHE_ID_PART_L310: | 344 | case L2X0_CACHE_ID_PART_L310: |
| 346 | if (aux & (1 << 16)) | 345 | if (aux & (1 << 16)) |
| 347 | ways = 16; | 346 | ways = 16; |
| @@ -725,7 +724,6 @@ static const struct l2x0_of_data pl310_data = { | |||
| 725 | .flush_all = l2x0_flush_all, | 724 | .flush_all = l2x0_flush_all, |
| 726 | .inv_all = l2x0_inv_all, | 725 | .inv_all = l2x0_inv_all, |
| 727 | .disable = l2x0_disable, | 726 | .disable = l2x0_disable, |
| 728 | .set_debug = pl310_set_debug, | ||
| 729 | }, | 727 | }, |
| 730 | }; | 728 | }; |
| 731 | 729 | ||
| @@ -814,9 +812,8 @@ int __init l2x0_of_init(u32 aux_val, u32 aux_mask) | |||
| 814 | data->save(); | 812 | data->save(); |
| 815 | 813 | ||
| 816 | of_init = true; | 814 | of_init = true; |
| 817 | l2x0_init(l2x0_base, aux_val, aux_mask); | ||
| 818 | |||
| 819 | memcpy(&outer_cache, &data->outer_cache, sizeof(outer_cache)); | 815 | memcpy(&outer_cache, &data->outer_cache, sizeof(outer_cache)); |
| 816 | l2x0_init(l2x0_base, aux_val, aux_mask); | ||
| 820 | 817 | ||
| 821 | return 0; | 818 | return 0; |
| 822 | } | 819 | } |
diff --git a/arch/arm/mm/context.c b/arch/arm/mm/context.c index a5a4b2bc42ba..2ac37372ef52 100644 --- a/arch/arm/mm/context.c +++ b/arch/arm/mm/context.c | |||
| @@ -48,7 +48,7 @@ static DEFINE_RAW_SPINLOCK(cpu_asid_lock); | |||
| 48 | static atomic64_t asid_generation = ATOMIC64_INIT(ASID_FIRST_VERSION); | 48 | static atomic64_t asid_generation = ATOMIC64_INIT(ASID_FIRST_VERSION); |
| 49 | static DECLARE_BITMAP(asid_map, NUM_USER_ASIDS); | 49 | static DECLARE_BITMAP(asid_map, NUM_USER_ASIDS); |
| 50 | 50 | ||
| 51 | static DEFINE_PER_CPU(atomic64_t, active_asids); | 51 | DEFINE_PER_CPU(atomic64_t, active_asids); |
| 52 | static DEFINE_PER_CPU(u64, reserved_asids); | 52 | static DEFINE_PER_CPU(u64, reserved_asids); |
| 53 | static cpumask_t tlb_flush_pending; | 53 | static cpumask_t tlb_flush_pending; |
| 54 | 54 | ||
| @@ -215,6 +215,7 @@ void check_and_switch_context(struct mm_struct *mm, struct task_struct *tsk) | |||
| 215 | if (cpumask_test_and_clear_cpu(cpu, &tlb_flush_pending)) { | 215 | if (cpumask_test_and_clear_cpu(cpu, &tlb_flush_pending)) { |
| 216 | local_flush_bp_all(); | 216 | local_flush_bp_all(); |
| 217 | local_flush_tlb_all(); | 217 | local_flush_tlb_all(); |
| 218 | dummy_flush_tlb_a15_erratum(); | ||
| 218 | } | 219 | } |
| 219 | 220 | ||
| 220 | atomic64_set(&per_cpu(active_asids, cpu), asid); | 221 | atomic64_set(&per_cpu(active_asids, cpu), asid); |
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index e95a996ab78f..78978945492a 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
| @@ -598,39 +598,60 @@ static void __init alloc_init_pte(pmd_t *pmd, unsigned long addr, | |||
| 598 | } while (pte++, addr += PAGE_SIZE, addr != end); | 598 | } while (pte++, addr += PAGE_SIZE, addr != end); |
| 599 | } | 599 | } |
| 600 | 600 | ||
| 601 | static void __init alloc_init_section(pud_t *pud, unsigned long addr, | 601 | static void __init map_init_section(pmd_t *pmd, unsigned long addr, |
| 602 | unsigned long end, phys_addr_t phys, | 602 | unsigned long end, phys_addr_t phys, |
| 603 | const struct mem_type *type) | 603 | const struct mem_type *type) |
| 604 | { | 604 | { |
| 605 | pmd_t *pmd = pmd_offset(pud, addr); | 605 | #ifndef CONFIG_ARM_LPAE |
| 606 | |||
| 607 | /* | 606 | /* |
| 608 | * Try a section mapping - end, addr and phys must all be aligned | 607 | * In classic MMU format, puds and pmds are folded in to |
| 609 | * to a section boundary. Note that PMDs refer to the individual | 608 | * the pgds. pmd_offset gives the PGD entry. PGDs refer to a |
| 610 | * L1 entries, whereas PGDs refer to a group of L1 entries making | 609 | * group of L1 entries making up one logical pointer to |
| 611 | * up one logical pointer to an L2 table. | 610 | * an L2 table (2MB), where as PMDs refer to the individual |
| 611 | * L1 entries (1MB). Hence increment to get the correct | ||
| 612 | * offset for odd 1MB sections. | ||
| 613 | * (See arch/arm/include/asm/pgtable-2level.h) | ||
| 612 | */ | 614 | */ |
| 613 | if (type->prot_sect && ((addr | end | phys) & ~SECTION_MASK) == 0) { | 615 | if (addr & SECTION_SIZE) |
| 614 | pmd_t *p = pmd; | 616 | pmd++; |
| 615 | |||
| 616 | #ifndef CONFIG_ARM_LPAE | ||
| 617 | if (addr & SECTION_SIZE) | ||
| 618 | pmd++; | ||
| 619 | #endif | 617 | #endif |
| 618 | do { | ||
| 619 | *pmd = __pmd(phys | type->prot_sect); | ||
| 620 | phys += SECTION_SIZE; | ||
| 621 | } while (pmd++, addr += SECTION_SIZE, addr != end); | ||
| 620 | 622 | ||
| 621 | do { | 623 | flush_pmd_entry(pmd); |
| 622 | *pmd = __pmd(phys | type->prot_sect); | 624 | } |
| 623 | phys += SECTION_SIZE; | ||
| 624 | } while (pmd++, addr += SECTION_SIZE, addr != end); | ||
| 625 | 625 | ||
| 626 | flush_pmd_entry(p); | 626 | static void __init alloc_init_pmd(pud_t *pud, unsigned long addr, |
| 627 | } else { | 627 | unsigned long end, phys_addr_t phys, |
| 628 | const struct mem_type *type) | ||
| 629 | { | ||
| 630 | pmd_t *pmd = pmd_offset(pud, addr); | ||
| 631 | unsigned long next; | ||
| 632 | |||
| 633 | do { | ||
| 628 | /* | 634 | /* |
| 629 | * No need to loop; pte's aren't interested in the | 635 | * With LPAE, we must loop over to map |
| 630 | * individual L1 entries. | 636 | * all the pmds for the given range. |
| 631 | */ | 637 | */ |
| 632 | alloc_init_pte(pmd, addr, end, __phys_to_pfn(phys), type); | 638 | next = pmd_addr_end(addr, end); |
| 633 | } | 639 | |
| 640 | /* | ||
| 641 | * Try a section mapping - addr, next and phys must all be | ||
| 642 | * aligned to a section boundary. | ||
| 643 | */ | ||
| 644 | if (type->prot_sect && | ||
| 645 | ((addr | next | phys) & ~SECTION_MASK) == 0) { | ||
| 646 | map_init_section(pmd, addr, next, phys, type); | ||
| 647 | } else { | ||
| 648 | alloc_init_pte(pmd, addr, next, | ||
| 649 | __phys_to_pfn(phys), type); | ||
| 650 | } | ||
| 651 | |||
| 652 | phys += next - addr; | ||
| 653 | |||
| 654 | } while (pmd++, addr = next, addr != end); | ||
| 634 | } | 655 | } |
| 635 | 656 | ||
| 636 | static void __init alloc_init_pud(pgd_t *pgd, unsigned long addr, | 657 | static void __init alloc_init_pud(pgd_t *pgd, unsigned long addr, |
| @@ -641,7 +662,7 @@ static void __init alloc_init_pud(pgd_t *pgd, unsigned long addr, | |||
| 641 | 662 | ||
| 642 | do { | 663 | do { |
| 643 | next = pud_addr_end(addr, end); | 664 | next = pud_addr_end(addr, end); |
| 644 | alloc_init_section(pud, addr, next, phys, type); | 665 | alloc_init_pmd(pud, addr, next, phys, type); |
| 645 | phys += next - addr; | 666 | phys += next - addr; |
| 646 | } while (pud++, addr = next, addr != end); | 667 | } while (pud++, addr = next, addr != end); |
| 647 | } | 668 | } |
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index 3a3c015f8d5c..f584d3f5b37c 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S | |||
| @@ -420,7 +420,7 @@ __v7_pj4b_proc_info: | |||
| 420 | __v7_ca7mp_proc_info: | 420 | __v7_ca7mp_proc_info: |
| 421 | .long 0x410fc070 | 421 | .long 0x410fc070 |
| 422 | .long 0xff0ffff0 | 422 | .long 0xff0ffff0 |
| 423 | __v7_proc __v7_ca7mp_setup, hwcaps = HWCAP_IDIV | 423 | __v7_proc __v7_ca7mp_setup |
| 424 | .size __v7_ca7mp_proc_info, . - __v7_ca7mp_proc_info | 424 | .size __v7_ca7mp_proc_info, . - __v7_ca7mp_proc_info |
| 425 | 425 | ||
| 426 | /* | 426 | /* |
| @@ -430,10 +430,25 @@ __v7_ca7mp_proc_info: | |||
| 430 | __v7_ca15mp_proc_info: | 430 | __v7_ca15mp_proc_info: |
| 431 | .long 0x410fc0f0 | 431 | .long 0x410fc0f0 |
| 432 | .long 0xff0ffff0 | 432 | .long 0xff0ffff0 |
| 433 | __v7_proc __v7_ca15mp_setup, hwcaps = HWCAP_IDIV | 433 | __v7_proc __v7_ca15mp_setup |
| 434 | .size __v7_ca15mp_proc_info, . - __v7_ca15mp_proc_info | 434 | .size __v7_ca15mp_proc_info, . - __v7_ca15mp_proc_info |
| 435 | 435 | ||
| 436 | /* | 436 | /* |
| 437 | * Qualcomm Inc. Krait processors. | ||
| 438 | */ | ||
| 439 | .type __krait_proc_info, #object | ||
| 440 | __krait_proc_info: | ||
| 441 | .long 0x510f0400 @ Required ID value | ||
| 442 | .long 0xff0ffc00 @ Mask for ID | ||
| 443 | /* | ||
| 444 | * Some Krait processors don't indicate support for SDIV and UDIV | ||
| 445 | * instructions in the ARM instruction set, even though they actually | ||
| 446 | * do support them. | ||
| 447 | */ | ||
| 448 | __v7_proc __v7_setup, hwcaps = HWCAP_IDIV | ||
| 449 | .size __krait_proc_info, . - __krait_proc_info | ||
| 450 | |||
| 451 | /* | ||
| 437 | * Match any ARMv7 processor core. | 452 | * Match any ARMv7 processor core. |
| 438 | */ | 453 | */ |
| 439 | .type __v7_proc_info, #object | 454 | .type __v7_proc_info, #object |
diff --git a/arch/c6x/include/asm/irqflags.h b/arch/c6x/include/asm/irqflags.h index cf78e09e18c3..2c71d5634ec2 100644 --- a/arch/c6x/include/asm/irqflags.h +++ b/arch/c6x/include/asm/irqflags.h | |||
| @@ -27,7 +27,7 @@ static inline unsigned long arch_local_save_flags(void) | |||
| 27 | /* set interrupt enabled status */ | 27 | /* set interrupt enabled status */ |
| 28 | static inline void arch_local_irq_restore(unsigned long flags) | 28 | static inline void arch_local_irq_restore(unsigned long flags) |
| 29 | { | 29 | { |
| 30 | asm volatile (" mvc .s2 %0,CSR\n" : : "b"(flags)); | 30 | asm volatile (" mvc .s2 %0,CSR\n" : : "b"(flags) : "memory"); |
| 31 | } | 31 | } |
| 32 | 32 | ||
| 33 | /* unconditionally enable interrupts */ | 33 | /* unconditionally enable interrupts */ |
diff --git a/arch/ia64/kernel/palinfo.c b/arch/ia64/kernel/palinfo.c index 77597e5ea60a..79521d5499f9 100644 --- a/arch/ia64/kernel/palinfo.c +++ b/arch/ia64/kernel/palinfo.c | |||
| @@ -849,17 +849,6 @@ static palinfo_entry_t palinfo_entries[]={ | |||
| 849 | 849 | ||
| 850 | #define NR_PALINFO_ENTRIES (int) ARRAY_SIZE(palinfo_entries) | 850 | #define NR_PALINFO_ENTRIES (int) ARRAY_SIZE(palinfo_entries) |
| 851 | 851 | ||
| 852 | /* | ||
| 853 | * this array is used to keep track of the proc entries we create. This is | ||
| 854 | * required in the module mode when we need to remove all entries. The procfs code | ||
| 855 | * does not do recursion of deletion | ||
| 856 | * | ||
| 857 | * Notes: | ||
| 858 | * - +1 accounts for the cpuN directory entry in /proc/pal | ||
| 859 | */ | ||
| 860 | #define NR_PALINFO_PROC_ENTRIES (NR_CPUS*(NR_PALINFO_ENTRIES+1)) | ||
| 861 | |||
| 862 | static struct proc_dir_entry *palinfo_proc_entries[NR_PALINFO_PROC_ENTRIES]; | ||
| 863 | static struct proc_dir_entry *palinfo_dir; | 852 | static struct proc_dir_entry *palinfo_dir; |
| 864 | 853 | ||
| 865 | /* | 854 | /* |
| @@ -971,60 +960,32 @@ palinfo_read_entry(char *page, char **start, off_t off, int count, int *eof, voi | |||
| 971 | static void __cpuinit | 960 | static void __cpuinit |
| 972 | create_palinfo_proc_entries(unsigned int cpu) | 961 | create_palinfo_proc_entries(unsigned int cpu) |
| 973 | { | 962 | { |
| 974 | # define CPUSTR "cpu%d" | ||
| 975 | |||
| 976 | pal_func_cpu_u_t f; | 963 | pal_func_cpu_u_t f; |
| 977 | struct proc_dir_entry **pdir; | ||
| 978 | struct proc_dir_entry *cpu_dir; | 964 | struct proc_dir_entry *cpu_dir; |
| 979 | int j; | 965 | int j; |
| 980 | char cpustr[sizeof(CPUSTR)]; | 966 | char cpustr[3+4+1]; /* cpu numbers are up to 4095 on itanic */ |
| 981 | 967 | sprintf(cpustr, "cpu%d", cpu); | |
| 982 | |||
| 983 | /* | ||
| 984 | * we keep track of created entries in a depth-first order for | ||
| 985 | * cleanup purposes. Each entry is stored into palinfo_proc_entries | ||
| 986 | */ | ||
| 987 | sprintf(cpustr,CPUSTR, cpu); | ||
| 988 | 968 | ||
| 989 | cpu_dir = proc_mkdir(cpustr, palinfo_dir); | 969 | cpu_dir = proc_mkdir(cpustr, palinfo_dir); |
| 970 | if (!cpu_dir) | ||
| 971 | return; | ||
| 990 | 972 | ||
| 991 | f.req_cpu = cpu; | 973 | f.req_cpu = cpu; |
| 992 | 974 | ||
| 993 | /* | ||
| 994 | * Compute the location to store per cpu entries | ||
| 995 | * We dont store the top level entry in this list, but | ||
| 996 | * remove it finally after removing all cpu entries. | ||
| 997 | */ | ||
| 998 | pdir = &palinfo_proc_entries[cpu*(NR_PALINFO_ENTRIES+1)]; | ||
| 999 | *pdir++ = cpu_dir; | ||
| 1000 | for (j=0; j < NR_PALINFO_ENTRIES; j++) { | 975 | for (j=0; j < NR_PALINFO_ENTRIES; j++) { |
| 1001 | f.func_id = j; | 976 | f.func_id = j; |
| 1002 | *pdir = create_proc_read_entry( | 977 | create_proc_read_entry( |
| 1003 | palinfo_entries[j].name, 0, cpu_dir, | 978 | palinfo_entries[j].name, 0, cpu_dir, |
| 1004 | palinfo_read_entry, (void *)f.value); | 979 | palinfo_read_entry, (void *)f.value); |
| 1005 | pdir++; | ||
| 1006 | } | 980 | } |
| 1007 | } | 981 | } |
| 1008 | 982 | ||
| 1009 | static void | 983 | static void |
| 1010 | remove_palinfo_proc_entries(unsigned int hcpu) | 984 | remove_palinfo_proc_entries(unsigned int hcpu) |
| 1011 | { | 985 | { |
| 1012 | int j; | 986 | char cpustr[3+4+1]; /* cpu numbers are up to 4095 on itanic */ |
| 1013 | struct proc_dir_entry *cpu_dir, **pdir; | 987 | sprintf(cpustr, "cpu%d", hcpu); |
| 1014 | 988 | remove_proc_subtree(cpustr, palinfo_dir); | |
| 1015 | pdir = &palinfo_proc_entries[hcpu*(NR_PALINFO_ENTRIES+1)]; | ||
| 1016 | cpu_dir = *pdir; | ||
| 1017 | *pdir++=NULL; | ||
| 1018 | for (j=0; j < (NR_PALINFO_ENTRIES); j++) { | ||
| 1019 | if ((*pdir)) { | ||
| 1020 | remove_proc_entry ((*pdir)->name, cpu_dir); | ||
| 1021 | *pdir ++= NULL; | ||
| 1022 | } | ||
| 1023 | } | ||
| 1024 | |||
| 1025 | if (cpu_dir) { | ||
| 1026 | remove_proc_entry(cpu_dir->name, palinfo_dir); | ||
| 1027 | } | ||
| 1028 | } | 989 | } |
| 1029 | 990 | ||
| 1030 | static int __cpuinit palinfo_cpu_callback(struct notifier_block *nfb, | 991 | static int __cpuinit palinfo_cpu_callback(struct notifier_block *nfb, |
| @@ -1058,6 +1019,8 @@ palinfo_init(void) | |||
| 1058 | 1019 | ||
| 1059 | printk(KERN_INFO "PAL Information Facility v%s\n", PALINFO_VERSION); | 1020 | printk(KERN_INFO "PAL Information Facility v%s\n", PALINFO_VERSION); |
| 1060 | palinfo_dir = proc_mkdir("pal", NULL); | 1021 | palinfo_dir = proc_mkdir("pal", NULL); |
| 1022 | if (!palinfo_dir) | ||
| 1023 | return -ENOMEM; | ||
| 1061 | 1024 | ||
| 1062 | /* Create palinfo dirs in /proc for all online cpus */ | 1025 | /* Create palinfo dirs in /proc for all online cpus */ |
| 1063 | for_each_online_cpu(i) { | 1026 | for_each_online_cpu(i) { |
| @@ -1073,22 +1036,8 @@ palinfo_init(void) | |||
| 1073 | static void __exit | 1036 | static void __exit |
| 1074 | palinfo_exit(void) | 1037 | palinfo_exit(void) |
| 1075 | { | 1038 | { |
| 1076 | int i = 0; | ||
| 1077 | |||
| 1078 | /* remove all nodes: depth first pass. Could optimize this */ | ||
| 1079 | for_each_online_cpu(i) { | ||
| 1080 | remove_palinfo_proc_entries(i); | ||
| 1081 | } | ||
| 1082 | |||
| 1083 | /* | ||
| 1084 | * Remove the top level entry finally | ||
| 1085 | */ | ||
| 1086 | remove_proc_entry(palinfo_dir->name, NULL); | ||
| 1087 | |||
| 1088 | /* | ||
| 1089 | * Unregister from cpu notifier callbacks | ||
| 1090 | */ | ||
| 1091 | unregister_hotcpu_notifier(&palinfo_cpu_notifier); | 1039 | unregister_hotcpu_notifier(&palinfo_cpu_notifier); |
| 1040 | remove_proc_subtree("pal", NULL); | ||
| 1092 | } | 1041 | } |
| 1093 | 1042 | ||
| 1094 | module_init(palinfo_init); | 1043 | module_init(palinfo_init); |
diff --git a/arch/m68k/include/asm/gpio.h b/arch/m68k/include/asm/gpio.h index 4395ffc51fdb..8cc83431805b 100644 --- a/arch/m68k/include/asm/gpio.h +++ b/arch/m68k/include/asm/gpio.h | |||
| @@ -86,4 +86,24 @@ static inline int gpio_cansleep(unsigned gpio) | |||
| 86 | return gpio < MCFGPIO_PIN_MAX ? 0 : __gpio_cansleep(gpio); | 86 | return gpio < MCFGPIO_PIN_MAX ? 0 : __gpio_cansleep(gpio); |
| 87 | } | 87 | } |
| 88 | 88 | ||
| 89 | static inline int gpio_request_one(unsigned gpio, unsigned long flags, const char *label) | ||
| 90 | { | ||
| 91 | int err; | ||
| 92 | |||
| 93 | err = gpio_request(gpio, label); | ||
| 94 | if (err) | ||
| 95 | return err; | ||
| 96 | |||
| 97 | if (flags & GPIOF_DIR_IN) | ||
| 98 | err = gpio_direction_input(gpio); | ||
| 99 | else | ||
| 100 | err = gpio_direction_output(gpio, | ||
| 101 | (flags & GPIOF_INIT_HIGH) ? 1 : 0); | ||
| 102 | |||
| 103 | if (err) | ||
| 104 | gpio_free(gpio); | ||
| 105 | |||
| 106 | return err; | ||
| 107 | } | ||
| 108 | |||
| 89 | #endif | 109 | #endif |
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index cd2e21ff562a..51244bf97271 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
| @@ -18,7 +18,7 @@ config MIPS | |||
| 18 | select HAVE_KRETPROBES | 18 | select HAVE_KRETPROBES |
| 19 | select HAVE_DEBUG_KMEMLEAK | 19 | select HAVE_DEBUG_KMEMLEAK |
| 20 | select ARCH_BINFMT_ELF_RANDOMIZE_PIE | 20 | select ARCH_BINFMT_ELF_RANDOMIZE_PIE |
| 21 | select HAVE_ARCH_TRANSPARENT_HUGEPAGE | 21 | select HAVE_ARCH_TRANSPARENT_HUGEPAGE if CPU_SUPPORTS_HUGEPAGES && 64BIT |
| 22 | select RTC_LIB if !MACH_LOONGSON | 22 | select RTC_LIB if !MACH_LOONGSON |
| 23 | select GENERIC_ATOMIC64 if !64BIT | 23 | select GENERIC_ATOMIC64 if !64BIT |
| 24 | select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE | 24 | select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE |
| @@ -657,7 +657,7 @@ config SNI_RM | |||
| 657 | bool "SNI RM200/300/400" | 657 | bool "SNI RM200/300/400" |
| 658 | select FW_ARC if CPU_LITTLE_ENDIAN | 658 | select FW_ARC if CPU_LITTLE_ENDIAN |
| 659 | select FW_ARC32 if CPU_LITTLE_ENDIAN | 659 | select FW_ARC32 if CPU_LITTLE_ENDIAN |
| 660 | select SNIPROM if CPU_BIG_ENDIAN | 660 | select FW_SNIPROM if CPU_BIG_ENDIAN |
| 661 | select ARCH_MAY_HAVE_PC_FDC | 661 | select ARCH_MAY_HAVE_PC_FDC |
| 662 | select BOOT_ELF32 | 662 | select BOOT_ELF32 |
| 663 | select CEVT_R4K | 663 | select CEVT_R4K |
| @@ -1144,7 +1144,7 @@ config DEFAULT_SGI_PARTITION | |||
| 1144 | config FW_ARC32 | 1144 | config FW_ARC32 |
| 1145 | bool | 1145 | bool |
| 1146 | 1146 | ||
| 1147 | config SNIPROM | 1147 | config FW_SNIPROM |
| 1148 | bool | 1148 | bool |
| 1149 | 1149 | ||
| 1150 | config BOOT_ELF32 | 1150 | config BOOT_ELF32 |
| @@ -1493,7 +1493,6 @@ config CPU_XLP | |||
| 1493 | select CPU_SUPPORTS_32BIT_KERNEL | 1493 | select CPU_SUPPORTS_32BIT_KERNEL |
| 1494 | select CPU_SUPPORTS_64BIT_KERNEL | 1494 | select CPU_SUPPORTS_64BIT_KERNEL |
| 1495 | select CPU_SUPPORTS_HIGHMEM | 1495 | select CPU_SUPPORTS_HIGHMEM |
| 1496 | select CPU_HAS_LLSC | ||
| 1497 | select WEAK_ORDERING | 1496 | select WEAK_ORDERING |
| 1498 | select WEAK_REORDERING_BEYOND_LLSC | 1497 | select WEAK_REORDERING_BEYOND_LLSC |
| 1499 | select CPU_HAS_PREFETCH | 1498 | select CPU_HAS_PREFETCH |
diff --git a/arch/mips/bcm63xx/boards/board_bcm963xx.c b/arch/mips/bcm63xx/boards/board_bcm963xx.c index ed1949c29508..9aa7d44898ed 100644 --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c | |||
| @@ -745,10 +745,7 @@ void __init board_prom_init(void) | |||
| 745 | strcpy(cfe_version, "unknown"); | 745 | strcpy(cfe_version, "unknown"); |
| 746 | printk(KERN_INFO PFX "CFE version: %s\n", cfe_version); | 746 | printk(KERN_INFO PFX "CFE version: %s\n", cfe_version); |
| 747 | 747 | ||
| 748 | if (bcm63xx_nvram_init(boot_addr + BCM963XX_NVRAM_OFFSET)) { | 748 | bcm63xx_nvram_init(boot_addr + BCM963XX_NVRAM_OFFSET); |
| 749 | printk(KERN_ERR PFX "invalid nvram checksum\n"); | ||
| 750 | return; | ||
| 751 | } | ||
| 752 | 749 | ||
| 753 | board_name = bcm63xx_nvram_get_name(); | 750 | board_name = bcm63xx_nvram_get_name(); |
| 754 | /* find board by name */ | 751 | /* find board by name */ |
diff --git a/arch/mips/bcm63xx/nvram.c b/arch/mips/bcm63xx/nvram.c index 620611680839..a4b8864f9307 100644 --- a/arch/mips/bcm63xx/nvram.c +++ b/arch/mips/bcm63xx/nvram.c | |||
| @@ -38,7 +38,7 @@ struct bcm963xx_nvram { | |||
| 38 | static struct bcm963xx_nvram nvram; | 38 | static struct bcm963xx_nvram nvram; |
| 39 | static int mac_addr_used; | 39 | static int mac_addr_used; |
| 40 | 40 | ||
| 41 | int __init bcm63xx_nvram_init(void *addr) | 41 | void __init bcm63xx_nvram_init(void *addr) |
| 42 | { | 42 | { |
| 43 | unsigned int check_len; | 43 | unsigned int check_len; |
| 44 | u32 crc, expected_crc; | 44 | u32 crc, expected_crc; |
| @@ -60,9 +60,8 @@ int __init bcm63xx_nvram_init(void *addr) | |||
| 60 | crc = crc32_le(~0, (u8 *)&nvram, check_len); | 60 | crc = crc32_le(~0, (u8 *)&nvram, check_len); |
| 61 | 61 | ||
| 62 | if (crc != expected_crc) | 62 | if (crc != expected_crc) |
| 63 | return -EINVAL; | 63 | pr_warn("nvram checksum failed, contents may be invalid (expected %08x, got %08x)\n", |
| 64 | 64 | expected_crc, crc); | |
| 65 | return 0; | ||
| 66 | } | 65 | } |
| 67 | 66 | ||
| 68 | u8 *bcm63xx_nvram_get_name(void) | 67 | u8 *bcm63xx_nvram_get_name(void) |
diff --git a/arch/mips/bcm63xx/setup.c b/arch/mips/bcm63xx/setup.c index 314231be788c..35e18e98beb9 100644 --- a/arch/mips/bcm63xx/setup.c +++ b/arch/mips/bcm63xx/setup.c | |||
| @@ -157,4 +157,4 @@ int __init bcm63xx_register_devices(void) | |||
| 157 | return board_register_devices(); | 157 | return board_register_devices(); |
| 158 | } | 158 | } |
| 159 | 159 | ||
| 160 | device_initcall(bcm63xx_register_devices); | 160 | arch_initcall(bcm63xx_register_devices); |
diff --git a/arch/mips/cavium-octeon/setup.c b/arch/mips/cavium-octeon/setup.c index c594a3d4f743..b0baa299f899 100644 --- a/arch/mips/cavium-octeon/setup.c +++ b/arch/mips/cavium-octeon/setup.c | |||
| @@ -174,7 +174,10 @@ static int octeon_kexec_prepare(struct kimage *image) | |||
| 174 | 174 | ||
| 175 | static void octeon_generic_shutdown(void) | 175 | static void octeon_generic_shutdown(void) |
| 176 | { | 176 | { |
| 177 | int cpu, i; | 177 | int i; |
| 178 | #ifdef CONFIG_SMP | ||
| 179 | int cpu; | ||
| 180 | #endif | ||
| 178 | struct cvmx_bootmem_desc *bootmem_desc; | 181 | struct cvmx_bootmem_desc *bootmem_desc; |
| 179 | void *named_block_array_ptr; | 182 | void *named_block_array_ptr; |
| 180 | 183 | ||
diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_nvram.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_nvram.h index 62d6a3b4d3b7..4e0b6bc1165e 100644 --- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_nvram.h +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_nvram.h | |||
| @@ -9,10 +9,8 @@ | |||
| 9 | * | 9 | * |
| 10 | * Initialized the local nvram copy from the target address and checks | 10 | * Initialized the local nvram copy from the target address and checks |
| 11 | * its checksum. | 11 | * its checksum. |
| 12 | * | ||
| 13 | * Returns 0 on success. | ||
| 14 | */ | 12 | */ |
| 15 | int __init bcm63xx_nvram_init(void *nvram); | 13 | void bcm63xx_nvram_init(void *nvram); |
| 16 | 14 | ||
| 17 | /** | 15 | /** |
| 18 | * bcm63xx_nvram_get_name() - returns the board name according to nvram | 16 | * bcm63xx_nvram_get_name() - returns the board name according to nvram |
diff --git a/arch/mips/include/asm/mach-sead3/cpu-feature-overrides.h b/arch/mips/include/asm/mach-sead3/cpu-feature-overrides.h index d9c828419037..193c0912d38e 100644 --- a/arch/mips/include/asm/mach-sead3/cpu-feature-overrides.h +++ b/arch/mips/include/asm/mach-sead3/cpu-feature-overrides.h | |||
| @@ -28,11 +28,7 @@ | |||
| 28 | /* #define cpu_has_prefetch ? */ | 28 | /* #define cpu_has_prefetch ? */ |
| 29 | #define cpu_has_mcheck 1 | 29 | #define cpu_has_mcheck 1 |
| 30 | /* #define cpu_has_ejtag ? */ | 30 | /* #define cpu_has_ejtag ? */ |
| 31 | #ifdef CONFIG_CPU_HAS_LLSC | ||
| 32 | #define cpu_has_llsc 1 | 31 | #define cpu_has_llsc 1 |
| 33 | #else | ||
| 34 | #define cpu_has_llsc 0 | ||
| 35 | #endif | ||
| 36 | /* #define cpu_has_vtag_icache ? */ | 32 | /* #define cpu_has_vtag_icache ? */ |
| 37 | /* #define cpu_has_dc_aliases ? */ | 33 | /* #define cpu_has_dc_aliases ? */ |
| 38 | /* #define cpu_has_ic_fills_f_dc ? */ | 34 | /* #define cpu_has_ic_fills_f_dc ? */ |
diff --git a/arch/mips/include/asm/mipsregs.h b/arch/mips/include/asm/mipsregs.h index 12b70c25906a..0da44d422f5b 100644 --- a/arch/mips/include/asm/mipsregs.h +++ b/arch/mips/include/asm/mipsregs.h | |||
| @@ -1166,7 +1166,10 @@ do { \ | |||
| 1166 | unsigned int __dspctl; \ | 1166 | unsigned int __dspctl; \ |
| 1167 | \ | 1167 | \ |
| 1168 | __asm__ __volatile__( \ | 1168 | __asm__ __volatile__( \ |
| 1169 | " .set push \n" \ | ||
| 1170 | " .set dsp \n" \ | ||
| 1169 | " rddsp %0, %x1 \n" \ | 1171 | " rddsp %0, %x1 \n" \ |
| 1172 | " .set pop \n" \ | ||
| 1170 | : "=r" (__dspctl) \ | 1173 | : "=r" (__dspctl) \ |
| 1171 | : "i" (mask)); \ | 1174 | : "i" (mask)); \ |
| 1172 | __dspctl; \ | 1175 | __dspctl; \ |
| @@ -1175,30 +1178,198 @@ do { \ | |||
| 1175 | #define wrdsp(val, mask) \ | 1178 | #define wrdsp(val, mask) \ |
| 1176 | do { \ | 1179 | do { \ |
| 1177 | __asm__ __volatile__( \ | 1180 | __asm__ __volatile__( \ |
| 1181 | " .set push \n" \ | ||
| 1182 | " .set dsp \n" \ | ||
| 1178 | " wrdsp %0, %x1 \n" \ | 1183 | " wrdsp %0, %x1 \n" \ |
| 1184 | " .set pop \n" \ | ||
| 1179 | : \ | 1185 | : \ |
| 1180 | : "r" (val), "i" (mask)); \ | 1186 | : "r" (val), "i" (mask)); \ |
| 1181 | } while (0) | 1187 | } while (0) |
| 1182 | 1188 | ||
| 1183 | #define mflo0() ({ long mflo0; __asm__("mflo %0, $ac0" : "=r" (mflo0)); mflo0;}) | 1189 | #define mflo0() \ |
| 1184 | #define mflo1() ({ long mflo1; __asm__("mflo %0, $ac1" : "=r" (mflo1)); mflo1;}) | 1190 | ({ \ |
| 1185 | #define mflo2() ({ long mflo2; __asm__("mflo %0, $ac2" : "=r" (mflo2)); mflo2;}) | 1191 | long mflo0; \ |
| 1186 | #define mflo3() ({ long mflo3; __asm__("mflo %0, $ac3" : "=r" (mflo3)); mflo3;}) | 1192 | __asm__( \ |
| 1187 | 1193 | " .set push \n" \ | |
| 1188 | #define mfhi0() ({ long mfhi0; __asm__("mfhi %0, $ac0" : "=r" (mfhi0)); mfhi0;}) | 1194 | " .set dsp \n" \ |
| 1189 | #define mfhi1() ({ long mfhi1; __asm__("mfhi %0, $ac1" : "=r" (mfhi1)); mfhi1;}) | 1195 | " mflo %0, $ac0 \n" \ |
| 1190 | #define mfhi2() ({ long mfhi2; __asm__("mfhi %0, $ac2" : "=r" (mfhi2)); mfhi2;}) | 1196 | " .set pop \n" \ |
| 1191 | #define mfhi3() ({ long mfhi3; __asm__("mfhi %0, $ac3" : "=r" (mfhi3)); mfhi3;}) | 1197 | : "=r" (mflo0)); \ |
| 1192 | 1198 | mflo0; \ | |
| 1193 | #define mtlo0(x) __asm__("mtlo %0, $ac0" ::"r" (x)) | 1199 | }) |
| 1194 | #define mtlo1(x) __asm__("mtlo %0, $ac1" ::"r" (x)) | 1200 | |
| 1195 | #define mtlo2(x) __asm__("mtlo %0, $ac2" ::"r" (x)) | 1201 | #define mflo1() \ |
| 1196 | #define mtlo3(x) __asm__("mtlo %0, $ac3" ::"r" (x)) | 1202 | ({ \ |
| 1197 | 1203 | long mflo1; \ | |
| 1198 | #define mthi0(x) __asm__("mthi %0, $ac0" ::"r" (x)) | 1204 | __asm__( \ |
| 1199 | #define mthi1(x) __asm__("mthi %0, $ac1" ::"r" (x)) | 1205 | " .set push \n" \ |
| 1200 | #define mthi2(x) __asm__("mthi %0, $ac2" ::"r" (x)) | 1206 | " .set dsp \n" \ |
| 1201 | #define mthi3(x) __asm__("mthi %0, $ac3" ::"r" (x)) | 1207 | " mflo %0, $ac1 \n" \ |
| 1208 | " .set pop \n" \ | ||
| 1209 | : "=r" (mflo1)); \ | ||
| 1210 | mflo1; \ | ||
| 1211 | }) | ||
| 1212 | |||
| 1213 | #define mflo2() \ | ||
| 1214 | ({ \ | ||
| 1215 | long mflo2; \ | ||
| 1216 | __asm__( \ | ||
| 1217 | " .set push \n" \ | ||
| 1218 | " .set dsp \n" \ | ||
| 1219 | " mflo %0, $ac2 \n" \ | ||
| 1220 | " .set pop \n" \ | ||
| 1221 | : "=r" (mflo2)); \ | ||
| 1222 | mflo2; \ | ||
| 1223 | }) | ||
| 1224 | |||
| 1225 | #define mflo3() \ | ||
| 1226 | ({ \ | ||
| 1227 | long mflo3; \ | ||
| 1228 | __asm__( \ | ||
| 1229 | " .set push \n" \ | ||
| 1230 | " .set dsp \n" \ | ||
| 1231 | " mflo %0, $ac3 \n" \ | ||
| 1232 | " .set pop \n" \ | ||
| 1233 | : "=r" (mflo3)); \ | ||
| 1234 | mflo3; \ | ||
| 1235 | }) | ||
| 1236 | |||
| 1237 | #define mfhi0() \ | ||
| 1238 | ({ \ | ||
| 1239 | long mfhi0; \ | ||
| 1240 | __asm__( \ | ||
| 1241 | " .set push \n" \ | ||
| 1242 | " .set dsp \n" \ | ||
| 1243 | " mfhi %0, $ac0 \n" \ | ||
| 1244 | " .set pop \n" \ | ||
| 1245 | : "=r" (mfhi0)); \ | ||
| 1246 | mfhi0; \ | ||
| 1247 | }) | ||
| 1248 | |||
| 1249 | #define mfhi1() \ | ||
| 1250 | ({ \ | ||
| 1251 | long mfhi1; \ | ||
| 1252 | __asm__( \ | ||
| 1253 | " .set push \n" \ | ||
| 1254 | " .set dsp \n" \ | ||
| 1255 | " mfhi %0, $ac1 \n" \ | ||
| 1256 | " .set pop \n" \ | ||
| 1257 | : "=r" (mfhi1)); \ | ||
| 1258 | mfhi1; \ | ||
| 1259 | }) | ||
| 1260 | |||
| 1261 | #define mfhi2() \ | ||
| 1262 | ({ \ | ||
| 1263 | long mfhi2; \ | ||
| 1264 | __asm__( \ | ||
| 1265 | " .set push \n" \ | ||
| 1266 | " .set dsp \n" \ | ||
| 1267 | " mfhi %0, $ac2 \n" \ | ||
| 1268 | " .set pop \n" \ | ||
| 1269 | : "=r" (mfhi2)); \ | ||
| 1270 | mfhi2; \ | ||
| 1271 | }) | ||
| 1272 | |||
| 1273 | #define mfhi3() \ | ||
| 1274 | ({ \ | ||
| 1275 | long mfhi3; \ | ||
| 1276 | __asm__( \ | ||
| 1277 | " .set push \n" \ | ||
| 1278 | " .set dsp \n" \ | ||
| 1279 | " mfhi %0, $ac3 \n" \ | ||
| 1280 | " .set pop \n" \ | ||
| 1281 | : "=r" (mfhi3)); \ | ||
| 1282 | mfhi3; \ | ||
| 1283 | }) | ||
| 1284 | |||
| 1285 | |||
| 1286 | #define mtlo0(x) \ | ||
| 1287 | ({ \ | ||
| 1288 | __asm__( \ | ||
| 1289 | " .set push \n" \ | ||
| 1290 | " .set dsp \n" \ | ||
| 1291 | " mtlo %0, $ac0 \n" \ | ||
| 1292 | " .set pop \n" \ | ||
| 1293 | : \ | ||
| 1294 | : "r" (x)); \ | ||
| 1295 | }) | ||
| 1296 | |||
| 1297 | #define mtlo1(x) \ | ||
| 1298 | ({ \ | ||
| 1299 | __asm__( \ | ||
| 1300 | " .set push \n" \ | ||
| 1301 | " .set dsp \n" \ | ||
| 1302 | " mtlo %0, $ac1 \n" \ | ||
| 1303 | " .set pop \n" \ | ||
| 1304 | : \ | ||
| 1305 | : "r" (x)); \ | ||
| 1306 | }) | ||
| 1307 | |||
| 1308 | #define mtlo2(x) \ | ||
| 1309 | ({ \ | ||
| 1310 | __asm__( \ | ||
| 1311 | " .set push \n" \ | ||
| 1312 | " .set dsp \n" \ | ||
| 1313 | " mtlo %0, $ac2 \n" \ | ||
| 1314 | " .set pop \n" \ | ||
| 1315 | : \ | ||
| 1316 | : "r" (x)); \ | ||
| 1317 | }) | ||
| 1318 | |||
| 1319 | #define mtlo3(x) \ | ||
| 1320 | ({ \ | ||
| 1321 | __asm__( \ | ||
| 1322 | " .set push \n" \ | ||
| 1323 | " .set dsp \n" \ | ||
| 1324 | " mtlo %0, $ac3 \n" \ | ||
| 1325 | " .set pop \n" \ | ||
| 1326 | : \ | ||
| 1327 | : "r" (x)); \ | ||
| 1328 | }) | ||
| 1329 | |||
| 1330 | #define mthi0(x) \ | ||
| 1331 | ({ \ | ||
| 1332 | __asm__( \ | ||
| 1333 | " .set push \n" \ | ||
| 1334 | " .set dsp \n" \ | ||
| 1335 | " mthi %0, $ac0 \n" \ | ||
| 1336 | " .set pop \n" \ | ||
| 1337 | : \ | ||
| 1338 | : "r" (x)); \ | ||
| 1339 | }) | ||
| 1340 | |||
| 1341 | #define mthi1(x) \ | ||
| 1342 | ({ \ | ||
| 1343 | __asm__( \ | ||
| 1344 | " .set push \n" \ | ||
| 1345 | " .set dsp \n" \ | ||
| 1346 | " mthi %0, $ac1 \n" \ | ||
| 1347 | " .set pop \n" \ | ||
| 1348 | : \ | ||
| 1349 | : "r" (x)); \ | ||
| 1350 | }) | ||
| 1351 | |||
| 1352 | #define mthi2(x) \ | ||
| 1353 | ({ \ | ||
| 1354 | __asm__( \ | ||
| 1355 | " .set push \n" \ | ||
| 1356 | " .set dsp \n" \ | ||
| 1357 | " mthi %0, $ac2 \n" \ | ||
| 1358 | " .set pop \n" \ | ||
| 1359 | : \ | ||
| 1360 | : "r" (x)); \ | ||
| 1361 | }) | ||
| 1362 | |||
| 1363 | #define mthi3(x) \ | ||
| 1364 | ({ \ | ||
| 1365 | __asm__( \ | ||
| 1366 | " .set push \n" \ | ||
| 1367 | " .set dsp \n" \ | ||
| 1368 | " mthi %0, $ac3 \n" \ | ||
| 1369 | " .set pop \n" \ | ||
| 1370 | : \ | ||
| 1371 | : "r" (x)); \ | ||
| 1372 | }) | ||
| 1202 | 1373 | ||
| 1203 | #else | 1374 | #else |
| 1204 | 1375 | ||
diff --git a/arch/mips/include/asm/signal.h b/arch/mips/include/asm/signal.h index 197f6367c201..8efe5a9e2c3e 100644 --- a/arch/mips/include/asm/signal.h +++ b/arch/mips/include/asm/signal.h | |||
| @@ -21,6 +21,6 @@ | |||
| 21 | #include <asm/sigcontext.h> | 21 | #include <asm/sigcontext.h> |
| 22 | #include <asm/siginfo.h> | 22 | #include <asm/siginfo.h> |
| 23 | 23 | ||
| 24 | #define __ARCH_HAS_ODD_SIGACTION | 24 | #define __ARCH_HAS_IRIX_SIGACTION |
| 25 | 25 | ||
| 26 | #endif /* _ASM_SIGNAL_H */ | 26 | #endif /* _ASM_SIGNAL_H */ |
diff --git a/arch/mips/include/uapi/asm/signal.h b/arch/mips/include/uapi/asm/signal.h index d6b18b4d0f3a..addb9f556b71 100644 --- a/arch/mips/include/uapi/asm/signal.h +++ b/arch/mips/include/uapi/asm/signal.h | |||
| @@ -72,6 +72,12 @@ typedef unsigned long old_sigset_t; /* at least 32 bits */ | |||
| 72 | * | 72 | * |
| 73 | * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single | 73 | * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single |
| 74 | * Unix names RESETHAND and NODEFER respectively. | 74 | * Unix names RESETHAND and NODEFER respectively. |
| 75 | * | ||
| 76 | * SA_RESTORER used to be defined as 0x04000000 but only the O32 ABI ever | ||
| 77 | * supported its use and no libc was using it, so the entire sa-restorer | ||
| 78 | * functionality was removed with lmo commit 39bffc12c3580ab for 2.5.48 | ||
| 79 | * retaining only the SA_RESTORER definition as a reminder to avoid | ||
| 80 | * accidental reuse of the mask bit. | ||
| 75 | */ | 81 | */ |
| 76 | #define SA_ONSTACK 0x08000000 | 82 | #define SA_ONSTACK 0x08000000 |
| 77 | #define SA_RESETHAND 0x80000000 | 83 | #define SA_RESETHAND 0x80000000 |
| @@ -84,8 +90,6 @@ typedef unsigned long old_sigset_t; /* at least 32 bits */ | |||
| 84 | #define SA_NOMASK SA_NODEFER | 90 | #define SA_NOMASK SA_NODEFER |
| 85 | #define SA_ONESHOT SA_RESETHAND | 91 | #define SA_ONESHOT SA_RESETHAND |
| 86 | 92 | ||
| 87 | #define SA_RESTORER 0x04000000 /* Only for o32 */ | ||
| 88 | |||
| 89 | #define MINSIGSTKSZ 2048 | 93 | #define MINSIGSTKSZ 2048 |
| 90 | #define SIGSTKSZ 8192 | 94 | #define SIGSTKSZ 8192 |
| 91 | 95 | ||
diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile index f81d98f6184c..de75fb50562b 100644 --- a/arch/mips/kernel/Makefile +++ b/arch/mips/kernel/Makefile | |||
| @@ -100,29 +100,16 @@ obj-$(CONFIG_HW_PERF_EVENTS) += perf_event_mipsxx.o | |||
| 100 | obj-$(CONFIG_JUMP_LABEL) += jump_label.o | 100 | obj-$(CONFIG_JUMP_LABEL) += jump_label.o |
| 101 | 101 | ||
| 102 | # | 102 | # |
| 103 | # DSP ASE supported for MIPS32 or MIPS64 Release 2 cores only. It is safe | 103 | # DSP ASE supported for MIPS32 or MIPS64 Release 2 cores only. It is not |
| 104 | # to enable DSP assembler support here even if the MIPS Release 2 CPU we | 104 | # safe to unconditionnaly use the assembler -mdsp / -mdspr2 switches |
| 105 | # are targetting does not support DSP because all code-paths making use of | 105 | # here because the compiler may use DSP ASE instructions (such as lwx) in |
| 106 | # it properly check that the running CPU *actually does* support these | 106 | # code paths where we cannot check that the CPU we are running on supports it. |
| 107 | # instructions. | 107 | # Proper abstraction using HAVE_AS_DSP and macros is done in |
| 108 | # arch/mips/include/asm/mipsregs.h. | ||
| 108 | # | 109 | # |
| 109 | ifeq ($(CONFIG_CPU_MIPSR2), y) | 110 | ifeq ($(CONFIG_CPU_MIPSR2), y) |
| 110 | CFLAGS_DSP = -DHAVE_AS_DSP | 111 | CFLAGS_DSP = -DHAVE_AS_DSP |
| 111 | 112 | ||
| 112 | # | ||
| 113 | # Check if assembler supports DSP ASE | ||
| 114 | # | ||
| 115 | ifeq ($(call cc-option-yn,-mdsp), y) | ||
| 116 | CFLAGS_DSP += -mdsp | ||
| 117 | endif | ||
| 118 | |||
| 119 | # | ||
| 120 | # Check if assembler supports DSP ASE Rev2 | ||
| 121 | # | ||
| 122 | ifeq ($(call cc-option-yn,-mdspr2), y) | ||
| 123 | CFLAGS_DSP += -mdspr2 | ||
| 124 | endif | ||
| 125 | |||
| 126 | CFLAGS_signal.o = $(CFLAGS_DSP) | 113 | CFLAGS_signal.o = $(CFLAGS_DSP) |
| 127 | CFLAGS_signal32.o = $(CFLAGS_DSP) | 114 | CFLAGS_signal32.o = $(CFLAGS_DSP) |
| 128 | CFLAGS_process.o = $(CFLAGS_DSP) | 115 | CFLAGS_process.o = $(CFLAGS_DSP) |
diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c index 6bfccc227a95..5fe66a0c3224 100644 --- a/arch/mips/kernel/cpu-probe.c +++ b/arch/mips/kernel/cpu-probe.c | |||
| @@ -580,6 +580,9 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu) | |||
| 580 | c->tlbsize = 48; | 580 | c->tlbsize = 48; |
| 581 | break; | 581 | break; |
| 582 | case PRID_IMP_VR41XX: | 582 | case PRID_IMP_VR41XX: |
| 583 | set_isa(c, MIPS_CPU_ISA_III); | ||
| 584 | c->options = R4K_OPTS; | ||
| 585 | c->tlbsize = 32; | ||
| 583 | switch (c->processor_id & 0xf0) { | 586 | switch (c->processor_id & 0xf0) { |
| 584 | case PRID_REV_VR4111: | 587 | case PRID_REV_VR4111: |
| 585 | c->cputype = CPU_VR4111; | 588 | c->cputype = CPU_VR4111; |
| @@ -604,6 +607,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu) | |||
| 604 | __cpu_name[cpu] = "NEC VR4131"; | 607 | __cpu_name[cpu] = "NEC VR4131"; |
| 605 | } else { | 608 | } else { |
| 606 | c->cputype = CPU_VR4133; | 609 | c->cputype = CPU_VR4133; |
| 610 | c->options |= MIPS_CPU_LLSC; | ||
| 607 | __cpu_name[cpu] = "NEC VR4133"; | 611 | __cpu_name[cpu] = "NEC VR4133"; |
| 608 | } | 612 | } |
| 609 | break; | 613 | break; |
| @@ -613,9 +617,6 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu) | |||
| 613 | __cpu_name[cpu] = "NEC Vr41xx"; | 617 | __cpu_name[cpu] = "NEC Vr41xx"; |
| 614 | break; | 618 | break; |
| 615 | } | 619 | } |
| 616 | set_isa(c, MIPS_CPU_ISA_III); | ||
| 617 | c->options = R4K_OPTS; | ||
| 618 | c->tlbsize = 32; | ||
| 619 | break; | 620 | break; |
| 620 | case PRID_IMP_R4300: | 621 | case PRID_IMP_R4300: |
| 621 | c->cputype = CPU_R4300; | 622 | c->cputype = CPU_R4300; |
| @@ -1226,10 +1227,8 @@ __cpuinit void cpu_probe(void) | |||
| 1226 | if (c->options & MIPS_CPU_FPU) { | 1227 | if (c->options & MIPS_CPU_FPU) { |
| 1227 | c->fpu_id = cpu_get_fpu_id(); | 1228 | c->fpu_id = cpu_get_fpu_id(); |
| 1228 | 1229 | ||
| 1229 | if (c->isa_level == MIPS_CPU_ISA_M32R1 || | 1230 | if (c->isa_level & (MIPS_CPU_ISA_M32R1 | MIPS_CPU_ISA_M32R2 | |
| 1230 | c->isa_level == MIPS_CPU_ISA_M32R2 || | 1231 | MIPS_CPU_ISA_M64R1 | MIPS_CPU_ISA_M64R2)) { |
| 1231 | c->isa_level == MIPS_CPU_ISA_M64R1 || | ||
| 1232 | c->isa_level == MIPS_CPU_ISA_M64R2) { | ||
| 1233 | if (c->fpu_id & MIPS_FPIR_3D) | 1232 | if (c->fpu_id & MIPS_FPIR_3D) |
| 1234 | c->ases |= MIPS_ASE_MIPS3D; | 1233 | c->ases |= MIPS_ASE_MIPS3D; |
| 1235 | } | 1234 | } |
diff --git a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c index 8eeee1c860c0..db9655f08892 100644 --- a/arch/mips/kernel/linux32.c +++ b/arch/mips/kernel/linux32.c | |||
| @@ -171,7 +171,7 @@ SYSCALL_DEFINE6(32_ipc, u32, call, long, first, long, second, long, third, | |||
| 171 | err = compat_sys_shmctl(first, second, compat_ptr(ptr)); | 171 | err = compat_sys_shmctl(first, second, compat_ptr(ptr)); |
| 172 | break; | 172 | break; |
| 173 | default: | 173 | default: |
| 174 | err = -EINVAL; | 174 | err = -ENOSYS; |
| 175 | break; | 175 | break; |
| 176 | } | 176 | } |
| 177 | 177 | ||
diff --git a/arch/mips/kernel/mcount.S b/arch/mips/kernel/mcount.S index 165867673357..33d067148e61 100644 --- a/arch/mips/kernel/mcount.S +++ b/arch/mips/kernel/mcount.S | |||
| @@ -46,10 +46,9 @@ | |||
| 46 | PTR_L a5, PT_R9(sp) | 46 | PTR_L a5, PT_R9(sp) |
| 47 | PTR_L a6, PT_R10(sp) | 47 | PTR_L a6, PT_R10(sp) |
| 48 | PTR_L a7, PT_R11(sp) | 48 | PTR_L a7, PT_R11(sp) |
| 49 | #else | ||
| 50 | PTR_ADDIU sp, PT_SIZE | ||
| 51 | #endif | 49 | #endif |
| 52 | .endm | 50 | PTR_ADDIU sp, PT_SIZE |
| 51 | .endm | ||
| 53 | 52 | ||
| 54 | .macro RETURN_BACK | 53 | .macro RETURN_BACK |
| 55 | jr ra | 54 | jr ra |
| @@ -68,7 +67,11 @@ NESTED(ftrace_caller, PT_SIZE, ra) | |||
| 68 | .globl _mcount | 67 | .globl _mcount |
| 69 | _mcount: | 68 | _mcount: |
| 70 | b ftrace_stub | 69 | b ftrace_stub |
| 71 | addiu sp,sp,8 | 70 | #ifdef CONFIG_32BIT |
| 71 | addiu sp,sp,8 | ||
| 72 | #else | ||
| 73 | nop | ||
| 74 | #endif | ||
| 72 | 75 | ||
| 73 | /* When tracing is activated, it calls ftrace_caller+8 (aka here) */ | 76 | /* When tracing is activated, it calls ftrace_caller+8 (aka here) */ |
| 74 | lw t1, function_trace_stop | 77 | lw t1, function_trace_stop |
diff --git a/arch/mips/kernel/proc.c b/arch/mips/kernel/proc.c index 135c4aadccbe..7a54f74b7818 100644 --- a/arch/mips/kernel/proc.c +++ b/arch/mips/kernel/proc.c | |||
| @@ -67,7 +67,7 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
| 67 | if (cpu_has_mips_r) { | 67 | if (cpu_has_mips_r) { |
| 68 | seq_printf(m, "isa\t\t\t:"); | 68 | seq_printf(m, "isa\t\t\t:"); |
| 69 | if (cpu_has_mips_1) | 69 | if (cpu_has_mips_1) |
| 70 | seq_printf(m, "%s", "mips1"); | 70 | seq_printf(m, "%s", " mips1"); |
| 71 | if (cpu_has_mips_2) | 71 | if (cpu_has_mips_2) |
| 72 | seq_printf(m, "%s", " mips2"); | 72 | seq_printf(m, "%s", " mips2"); |
| 73 | if (cpu_has_mips_3) | 73 | if (cpu_has_mips_3) |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index a200b5bdbb87..c3abb88170fc 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
| @@ -1571,7 +1571,7 @@ void __cpuinit per_cpu_trap_init(bool is_boot_cpu) | |||
| 1571 | #ifdef CONFIG_64BIT | 1571 | #ifdef CONFIG_64BIT |
| 1572 | status_set |= ST0_FR|ST0_KX|ST0_SX|ST0_UX; | 1572 | status_set |= ST0_FR|ST0_KX|ST0_SX|ST0_UX; |
| 1573 | #endif | 1573 | #endif |
| 1574 | if (current_cpu_data.isa_level == MIPS_CPU_ISA_IV) | 1574 | if (current_cpu_data.isa_level & MIPS_CPU_ISA_IV) |
| 1575 | status_set |= ST0_XX; | 1575 | status_set |= ST0_XX; |
| 1576 | if (cpu_has_dsp) | 1576 | if (cpu_has_dsp) |
| 1577 | status_set |= ST0_MX; | 1577 | status_set |= ST0_MX; |
diff --git a/arch/mips/lib/bitops.c b/arch/mips/lib/bitops.c index 81f1dcfdcab8..a64daee740ee 100644 --- a/arch/mips/lib/bitops.c +++ b/arch/mips/lib/bitops.c | |||
| @@ -90,12 +90,12 @@ int __mips_test_and_set_bit(unsigned long nr, | |||
| 90 | unsigned bit = nr & SZLONG_MASK; | 90 | unsigned bit = nr & SZLONG_MASK; |
| 91 | unsigned long mask; | 91 | unsigned long mask; |
| 92 | unsigned long flags; | 92 | unsigned long flags; |
| 93 | unsigned long res; | 93 | int res; |
| 94 | 94 | ||
| 95 | a += nr >> SZLONG_LOG; | 95 | a += nr >> SZLONG_LOG; |
| 96 | mask = 1UL << bit; | 96 | mask = 1UL << bit; |
| 97 | raw_local_irq_save(flags); | 97 | raw_local_irq_save(flags); |
| 98 | res = (mask & *a); | 98 | res = (mask & *a) != 0; |
| 99 | *a |= mask; | 99 | *a |= mask; |
| 100 | raw_local_irq_restore(flags); | 100 | raw_local_irq_restore(flags); |
| 101 | return res; | 101 | return res; |
| @@ -116,12 +116,12 @@ int __mips_test_and_set_bit_lock(unsigned long nr, | |||
| 116 | unsigned bit = nr & SZLONG_MASK; | 116 | unsigned bit = nr & SZLONG_MASK; |
| 117 | unsigned long mask; | 117 | unsigned long mask; |
| 118 | unsigned long flags; | 118 | unsigned long flags; |
| 119 | unsigned long res; | 119 | int res; |
| 120 | 120 | ||
| 121 | a += nr >> SZLONG_LOG; | 121 | a += nr >> SZLONG_LOG; |
| 122 | mask = 1UL << bit; | 122 | mask = 1UL << bit; |
| 123 | raw_local_irq_save(flags); | 123 | raw_local_irq_save(flags); |
| 124 | res = (mask & *a); | 124 | res = (mask & *a) != 0; |
| 125 | *a |= mask; | 125 | *a |= mask; |
| 126 | raw_local_irq_restore(flags); | 126 | raw_local_irq_restore(flags); |
| 127 | return res; | 127 | return res; |
| @@ -141,12 +141,12 @@ int __mips_test_and_clear_bit(unsigned long nr, volatile unsigned long *addr) | |||
| 141 | unsigned bit = nr & SZLONG_MASK; | 141 | unsigned bit = nr & SZLONG_MASK; |
| 142 | unsigned long mask; | 142 | unsigned long mask; |
| 143 | unsigned long flags; | 143 | unsigned long flags; |
| 144 | unsigned long res; | 144 | int res; |
| 145 | 145 | ||
| 146 | a += nr >> SZLONG_LOG; | 146 | a += nr >> SZLONG_LOG; |
| 147 | mask = 1UL << bit; | 147 | mask = 1UL << bit; |
| 148 | raw_local_irq_save(flags); | 148 | raw_local_irq_save(flags); |
| 149 | res = (mask & *a); | 149 | res = (mask & *a) != 0; |
| 150 | *a &= ~mask; | 150 | *a &= ~mask; |
| 151 | raw_local_irq_restore(flags); | 151 | raw_local_irq_restore(flags); |
| 152 | return res; | 152 | return res; |
| @@ -166,12 +166,12 @@ int __mips_test_and_change_bit(unsigned long nr, volatile unsigned long *addr) | |||
| 166 | unsigned bit = nr & SZLONG_MASK; | 166 | unsigned bit = nr & SZLONG_MASK; |
| 167 | unsigned long mask; | 167 | unsigned long mask; |
| 168 | unsigned long flags; | 168 | unsigned long flags; |
| 169 | unsigned long res; | 169 | int res; |
| 170 | 170 | ||
| 171 | a += nr >> SZLONG_LOG; | 171 | a += nr >> SZLONG_LOG; |
| 172 | mask = 1UL << bit; | 172 | mask = 1UL << bit; |
| 173 | raw_local_irq_save(flags); | 173 | raw_local_irq_save(flags); |
| 174 | res = (mask & *a); | 174 | res = (mask & *a) != 0; |
| 175 | *a ^= mask; | 175 | *a ^= mask; |
| 176 | raw_local_irq_restore(flags); | 176 | raw_local_irq_restore(flags); |
| 177 | return res; | 177 | return res; |
diff --git a/arch/mips/lib/csum_partial.S b/arch/mips/lib/csum_partial.S index 507147aebd41..a6adffbb4e5f 100644 --- a/arch/mips/lib/csum_partial.S +++ b/arch/mips/lib/csum_partial.S | |||
| @@ -270,7 +270,7 @@ LEAF(csum_partial) | |||
| 270 | #endif | 270 | #endif |
| 271 | 271 | ||
| 272 | /* odd buffer alignment? */ | 272 | /* odd buffer alignment? */ |
| 273 | #ifdef CPU_MIPSR2 | 273 | #ifdef CONFIG_CPU_MIPSR2 |
| 274 | wsbh v1, sum | 274 | wsbh v1, sum |
| 275 | movn sum, v1, t7 | 275 | movn sum, v1, t7 |
| 276 | #else | 276 | #else |
| @@ -670,7 +670,7 @@ EXC( sb t0, NBYTES-2(dst), .Ls_exc) | |||
| 670 | addu sum, v1 | 670 | addu sum, v1 |
| 671 | #endif | 671 | #endif |
| 672 | 672 | ||
| 673 | #ifdef CPU_MIPSR2 | 673 | #ifdef CONFIG_CPU_MIPSR2 |
| 674 | wsbh v1, sum | 674 | wsbh v1, sum |
| 675 | movn sum, v1, odd | 675 | movn sum, v1, odd |
| 676 | #else | 676 | #else |
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c index ecca559b8d7b..2078915eacb9 100644 --- a/arch/mips/mm/c-r4k.c +++ b/arch/mips/mm/c-r4k.c | |||
| @@ -1247,10 +1247,8 @@ static void __cpuinit setup_scache(void) | |||
| 1247 | return; | 1247 | return; |
| 1248 | 1248 | ||
| 1249 | default: | 1249 | default: |
| 1250 | if (c->isa_level == MIPS_CPU_ISA_M32R1 || | 1250 | if (c->isa_level & (MIPS_CPU_ISA_M32R1 | MIPS_CPU_ISA_M32R2 | |
| 1251 | c->isa_level == MIPS_CPU_ISA_M32R2 || | 1251 | MIPS_CPU_ISA_M64R1 | MIPS_CPU_ISA_M64R2)) { |
| 1252 | c->isa_level == MIPS_CPU_ISA_M64R1 || | ||
| 1253 | c->isa_level == MIPS_CPU_ISA_M64R2) { | ||
| 1254 | #ifdef CONFIG_MIPS_CPU_SCACHE | 1252 | #ifdef CONFIG_MIPS_CPU_SCACHE |
| 1255 | if (mips_sc_init ()) { | 1253 | if (mips_sc_init ()) { |
| 1256 | scache_size = c->scache.ways * c->scache.sets * c->scache.linesz; | 1254 | scache_size = c->scache.ways * c->scache.sets * c->scache.linesz; |
diff --git a/arch/mips/mm/sc-mips.c b/arch/mips/mm/sc-mips.c index 93d937b4b1ba..df96da7e939b 100644 --- a/arch/mips/mm/sc-mips.c +++ b/arch/mips/mm/sc-mips.c | |||
| @@ -98,10 +98,8 @@ static inline int __init mips_sc_probe(void) | |||
| 98 | c->scache.flags |= MIPS_CACHE_NOT_PRESENT; | 98 | c->scache.flags |= MIPS_CACHE_NOT_PRESENT; |
| 99 | 99 | ||
| 100 | /* Ignore anything but MIPSxx processors */ | 100 | /* Ignore anything but MIPSxx processors */ |
| 101 | if (c->isa_level != MIPS_CPU_ISA_M32R1 && | 101 | if (!(c->isa_level & (MIPS_CPU_ISA_M32R1 | MIPS_CPU_ISA_M32R2 | |
| 102 | c->isa_level != MIPS_CPU_ISA_M32R2 && | 102 | MIPS_CPU_ISA_M64R1 | MIPS_CPU_ISA_M64R2))) |
| 103 | c->isa_level != MIPS_CPU_ISA_M64R1 && | ||
| 104 | c->isa_level != MIPS_CPU_ISA_M64R2) | ||
| 105 | return 0; | 103 | return 0; |
| 106 | 104 | ||
| 107 | /* Does this MIPS32/MIPS64 CPU have a config2 register? */ | 105 | /* Does this MIPS32/MIPS64 CPU have a config2 register? */ |
diff --git a/arch/mips/pci/pci-alchemy.c b/arch/mips/pci/pci-alchemy.c index 38a80c83fd67..d1faece21b6a 100644 --- a/arch/mips/pci/pci-alchemy.c +++ b/arch/mips/pci/pci-alchemy.c | |||
| @@ -19,7 +19,7 @@ | |||
| 19 | #include <asm/mach-au1x00/au1000.h> | 19 | #include <asm/mach-au1x00/au1000.h> |
| 20 | #include <asm/tlbmisc.h> | 20 | #include <asm/tlbmisc.h> |
| 21 | 21 | ||
| 22 | #ifdef CONFIG_DEBUG_PCI | 22 | #ifdef CONFIG_PCI_DEBUG |
| 23 | #define DBG(x...) printk(KERN_DEBUG x) | 23 | #define DBG(x...) printk(KERN_DEBUG x) |
| 24 | #else | 24 | #else |
| 25 | #define DBG(x...) do {} while (0) | 25 | #define DBG(x...) do {} while (0) |
| @@ -162,7 +162,7 @@ static int config_access(unsigned char access_type, struct pci_bus *bus, | |||
| 162 | if (status & (1 << 29)) { | 162 | if (status & (1 << 29)) { |
| 163 | *data = 0xffffffff; | 163 | *data = 0xffffffff; |
| 164 | error = -1; | 164 | error = -1; |
| 165 | DBG("alchemy-pci: master abort on cfg access %d bus %d dev %d", | 165 | DBG("alchemy-pci: master abort on cfg access %d bus %d dev %d\n", |
| 166 | access_type, bus->number, device); | 166 | access_type, bus->number, device); |
| 167 | } else if ((status >> 28) & 0xf) { | 167 | } else if ((status >> 28) & 0xf) { |
| 168 | DBG("alchemy-pci: PCI ERR detected: dev %d, status %lx\n", | 168 | DBG("alchemy-pci: PCI ERR detected: dev %d, status %lx\n", |
diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c index 0da39fed355a..299731e9036b 100644 --- a/arch/powerpc/platforms/pseries/lpar.c +++ b/arch/powerpc/platforms/pseries/lpar.c | |||
| @@ -186,7 +186,13 @@ static long pSeries_lpar_hpte_remove(unsigned long hpte_group) | |||
| 186 | (0x1UL << 4), &dummy1, &dummy2); | 186 | (0x1UL << 4), &dummy1, &dummy2); |
| 187 | if (lpar_rc == H_SUCCESS) | 187 | if (lpar_rc == H_SUCCESS) |
| 188 | return i; | 188 | return i; |
| 189 | BUG_ON(lpar_rc != H_NOT_FOUND); | 189 | |
| 190 | /* | ||
| 191 | * The test for adjunct partition is performed before the | ||
| 192 | * ANDCOND test. H_RESOURCE may be returned, so we need to | ||
| 193 | * check for that as well. | ||
| 194 | */ | ||
| 195 | BUG_ON(lpar_rc != H_NOT_FOUND && lpar_rc != H_RESOURCE); | ||
| 190 | 196 | ||
| 191 | slot_offset++; | 197 | slot_offset++; |
| 192 | slot_offset &= 0x7; | 198 | slot_offset &= 0x7; |
diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h index 4a2930844d43..4a5443118cfb 100644 --- a/arch/s390/include/asm/pgtable.h +++ b/arch/s390/include/asm/pgtable.h | |||
| @@ -344,6 +344,7 @@ extern unsigned long MODULES_END; | |||
| 344 | #define _REGION3_ENTRY_CO 0x100 /* change-recording override */ | 344 | #define _REGION3_ENTRY_CO 0x100 /* change-recording override */ |
| 345 | 345 | ||
| 346 | /* Bits in the segment table entry */ | 346 | /* Bits in the segment table entry */ |
| 347 | #define _SEGMENT_ENTRY_ORIGIN_LARGE ~0xfffffUL /* large page address */ | ||
| 347 | #define _SEGMENT_ENTRY_ORIGIN ~0x7ffUL/* segment table origin */ | 348 | #define _SEGMENT_ENTRY_ORIGIN ~0x7ffUL/* segment table origin */ |
| 348 | #define _SEGMENT_ENTRY_RO 0x200 /* page protection bit */ | 349 | #define _SEGMENT_ENTRY_RO 0x200 /* page protection bit */ |
| 349 | #define _SEGMENT_ENTRY_INV 0x20 /* invalid segment table entry */ | 350 | #define _SEGMENT_ENTRY_INV 0x20 /* invalid segment table entry */ |
| @@ -1531,7 +1532,8 @@ extern int s390_enable_sie(void); | |||
| 1531 | /* | 1532 | /* |
| 1532 | * No page table caches to initialise | 1533 | * No page table caches to initialise |
| 1533 | */ | 1534 | */ |
| 1534 | #define pgtable_cache_init() do { } while (0) | 1535 | static inline void pgtable_cache_init(void) { } |
| 1536 | static inline void check_pgt_cache(void) { } | ||
| 1535 | 1537 | ||
| 1536 | #include <asm-generic/pgtable.h> | 1538 | #include <asm-generic/pgtable.h> |
| 1537 | 1539 | ||
diff --git a/arch/s390/lib/uaccess_pt.c b/arch/s390/lib/uaccess_pt.c index dff631d34b45..466fb3383960 100644 --- a/arch/s390/lib/uaccess_pt.c +++ b/arch/s390/lib/uaccess_pt.c | |||
| @@ -77,42 +77,69 @@ static size_t copy_in_kernel(size_t count, void __user *to, | |||
| 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 occured and the address |
| 78 | * contains the (negative) exception code. | 78 | * contains the (negative) exception code. |
| 79 | */ | 79 | */ |
| 80 | static __always_inline unsigned long follow_table(struct mm_struct *mm, | 80 | #ifdef CONFIG_64BIT |
| 81 | unsigned long addr, int write) | 81 | static unsigned long follow_table(struct mm_struct *mm, |
| 82 | unsigned long address, int write) | ||
| 82 | { | 83 | { |
| 83 | pgd_t *pgd; | 84 | unsigned long *table = (unsigned long *)__pa(mm->pgd); |
| 84 | pud_t *pud; | 85 | |
| 85 | pmd_t *pmd; | 86 | switch (mm->context.asce_bits & _ASCE_TYPE_MASK) { |
| 86 | pte_t *ptep; | 87 | case _ASCE_TYPE_REGION1: |
| 88 | table = table + ((address >> 53) & 0x7ff); | ||
| 89 | if (unlikely(*table & _REGION_ENTRY_INV)) | ||
| 90 | return -0x39UL; | ||
| 91 | table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN); | ||
| 92 | case _ASCE_TYPE_REGION2: | ||
| 93 | table = table + ((address >> 42) & 0x7ff); | ||
| 94 | if (unlikely(*table & _REGION_ENTRY_INV)) | ||
| 95 | return -0x3aUL; | ||
| 96 | table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN); | ||
| 97 | case _ASCE_TYPE_REGION3: | ||
| 98 | table = table + ((address >> 31) & 0x7ff); | ||
| 99 | if (unlikely(*table & _REGION_ENTRY_INV)) | ||
| 100 | return -0x3bUL; | ||
| 101 | table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN); | ||
| 102 | case _ASCE_TYPE_SEGMENT: | ||
| 103 | table = table + ((address >> 20) & 0x7ff); | ||
| 104 | if (unlikely(*table & _SEGMENT_ENTRY_INV)) | ||
| 105 | return -0x10UL; | ||
| 106 | if (unlikely(*table & _SEGMENT_ENTRY_LARGE)) { | ||
| 107 | if (write && (*table & _SEGMENT_ENTRY_RO)) | ||
| 108 | return -0x04UL; | ||
| 109 | return (*table & _SEGMENT_ENTRY_ORIGIN_LARGE) + | ||
| 110 | (address & ~_SEGMENT_ENTRY_ORIGIN_LARGE); | ||
| 111 | } | ||
| 112 | table = (unsigned long *)(*table & _SEGMENT_ENTRY_ORIGIN); | ||
| 113 | } | ||
| 114 | table = table + ((address >> 12) & 0xff); | ||
| 115 | if (unlikely(*table & _PAGE_INVALID)) | ||
| 116 | return -0x11UL; | ||
| 117 | if (write && (*table & _PAGE_RO)) | ||
| 118 | return -0x04UL; | ||
| 119 | return (*table & PAGE_MASK) + (address & ~PAGE_MASK); | ||
| 120 | } | ||
| 87 | 121 | ||
| 88 | pgd = pgd_offset(mm, addr); | 122 | #else /* CONFIG_64BIT */ |
| 89 | if (pgd_none(*pgd) || unlikely(pgd_bad(*pgd))) | ||
| 90 | return -0x3aUL; | ||
| 91 | 123 | ||
| 92 | pud = pud_offset(pgd, addr); | 124 | static unsigned long follow_table(struct mm_struct *mm, |
| 93 | if (pud_none(*pud) || unlikely(pud_bad(*pud))) | 125 | unsigned long address, int write) |
| 94 | return -0x3bUL; | 126 | { |
| 127 | unsigned long *table = (unsigned long *)__pa(mm->pgd); | ||
| 95 | 128 | ||
| 96 | pmd = pmd_offset(pud, addr); | 129 | table = table + ((address >> 20) & 0x7ff); |
| 97 | if (pmd_none(*pmd)) | 130 | if (unlikely(*table & _SEGMENT_ENTRY_INV)) |
| 98 | return -0x10UL; | 131 | return -0x10UL; |
| 99 | if (pmd_large(*pmd)) { | 132 | table = (unsigned long *)(*table & _SEGMENT_ENTRY_ORIGIN); |
| 100 | if (write && (pmd_val(*pmd) & _SEGMENT_ENTRY_RO)) | 133 | table = table + ((address >> 12) & 0xff); |
| 101 | return -0x04UL; | 134 | if (unlikely(*table & _PAGE_INVALID)) |
| 102 | return (pmd_val(*pmd) & HPAGE_MASK) + (addr & ~HPAGE_MASK); | ||
| 103 | } | ||
| 104 | if (unlikely(pmd_bad(*pmd))) | ||
| 105 | return -0x10UL; | ||
| 106 | |||
| 107 | ptep = pte_offset_map(pmd, addr); | ||
| 108 | if (!pte_present(*ptep)) | ||
| 109 | return -0x11UL; | 135 | return -0x11UL; |
| 110 | if (write && (!pte_write(*ptep) || !pte_dirty(*ptep))) | 136 | if (write && (*table & _PAGE_RO)) |
| 111 | return -0x04UL; | 137 | return -0x04UL; |
| 112 | 138 | return (*table & PAGE_MASK) + (address & ~PAGE_MASK); | |
| 113 | return (pte_val(*ptep) & PAGE_MASK) + (addr & ~PAGE_MASK); | ||
| 114 | } | 139 | } |
| 115 | 140 | ||
| 141 | #endif /* CONFIG_64BIT */ | ||
| 142 | |||
| 116 | static __always_inline size_t __user_copy_pt(unsigned long uaddr, void *kptr, | 143 | static __always_inline size_t __user_copy_pt(unsigned long uaddr, void *kptr, |
| 117 | size_t n, int write_user) | 144 | size_t n, int write_user) |
| 118 | { | 145 | { |
| @@ -197,7 +224,7 @@ size_t copy_to_user_pt(size_t n, void __user *to, const void *from) | |||
| 197 | 224 | ||
| 198 | static size_t clear_user_pt(size_t n, void __user *to) | 225 | static size_t clear_user_pt(size_t n, void __user *to) |
| 199 | { | 226 | { |
| 200 | void *zpage = &empty_zero_page; | 227 | void *zpage = (void *) empty_zero_page; |
| 201 | long done, size, ret; | 228 | long done, size, ret; |
| 202 | 229 | ||
| 203 | done = 0; | 230 | done = 0; |
diff --git a/arch/tile/include/asm/irqflags.h b/arch/tile/include/asm/irqflags.h index 241c0bb60b12..c96f9bbb760d 100644 --- a/arch/tile/include/asm/irqflags.h +++ b/arch/tile/include/asm/irqflags.h | |||
| @@ -40,7 +40,15 @@ | |||
| 40 | #include <asm/percpu.h> | 40 | #include <asm/percpu.h> |
| 41 | #include <arch/spr_def.h> | 41 | #include <arch/spr_def.h> |
| 42 | 42 | ||
| 43 | /* Set and clear kernel interrupt masks. */ | 43 | /* |
| 44 | * Set and clear kernel interrupt masks. | ||
| 45 | * | ||
| 46 | * NOTE: __insn_mtspr() is a compiler builtin marked as a memory | ||
| 47 | * clobber. We rely on it being equivalent to a compiler barrier in | ||
| 48 | * this code since arch_local_irq_save() and friends must act as | ||
| 49 | * compiler barriers. This compiler semantic is baked into enough | ||
| 50 | * places that the compiler will maintain it going forward. | ||
| 51 | */ | ||
| 44 | #if CHIP_HAS_SPLIT_INTR_MASK() | 52 | #if CHIP_HAS_SPLIT_INTR_MASK() |
| 45 | #if INT_PERF_COUNT < 32 || INT_AUX_PERF_COUNT < 32 || INT_MEM_ERROR >= 32 | 53 | #if INT_PERF_COUNT < 32 || INT_AUX_PERF_COUNT < 32 || INT_MEM_ERROR >= 32 |
| 46 | # error Fix assumptions about which word various interrupts are in | 54 | # error Fix assumptions about which word various interrupts are in |
diff --git a/arch/tile/kernel/setup.c b/arch/tile/kernel/setup.c index d1e15f7b59c6..7a5aa1a7864e 100644 --- a/arch/tile/kernel/setup.c +++ b/arch/tile/kernel/setup.c | |||
| @@ -1004,15 +1004,8 @@ void __cpuinit setup_cpu(int boot) | |||
| 1004 | 1004 | ||
| 1005 | #ifdef CONFIG_BLK_DEV_INITRD | 1005 | #ifdef CONFIG_BLK_DEV_INITRD |
| 1006 | 1006 | ||
| 1007 | /* | ||
| 1008 | * Note that the kernel can potentially support other compression | ||
| 1009 | * techniques than gz, though we don't do so by default. If we ever | ||
| 1010 | * decide to do so we can either look for other filename extensions, | ||
| 1011 | * or just allow a file with this name to be compressed with an | ||
| 1012 | * arbitrary compressor (somewhat counterintuitively). | ||
| 1013 | */ | ||
| 1014 | static int __initdata set_initramfs_file; | 1007 | static int __initdata set_initramfs_file; |
| 1015 | static char __initdata initramfs_file[128] = "initramfs.cpio.gz"; | 1008 | static char __initdata initramfs_file[128] = "initramfs"; |
| 1016 | 1009 | ||
| 1017 | static int __init setup_initramfs_file(char *str) | 1010 | static int __init setup_initramfs_file(char *str) |
| 1018 | { | 1011 | { |
| @@ -1026,9 +1019,9 @@ static int __init setup_initramfs_file(char *str) | |||
| 1026 | early_param("initramfs_file", setup_initramfs_file); | 1019 | early_param("initramfs_file", setup_initramfs_file); |
| 1027 | 1020 | ||
| 1028 | /* | 1021 | /* |
| 1029 | * We look for an "initramfs.cpio.gz" file in the hvfs. | 1022 | * We look for a file called "initramfs" in the hvfs. If there is one, we |
| 1030 | * If there is one, we allocate some memory for it and it will be | 1023 | * allocate some memory for it and it will be unpacked to the initramfs. |
| 1031 | * unpacked to the initramfs. | 1024 | * If it's compressed, the initd code will uncompress it first. |
| 1032 | */ | 1025 | */ |
| 1033 | static void __init load_hv_initrd(void) | 1026 | static void __init load_hv_initrd(void) |
| 1034 | { | 1027 | { |
| @@ -1038,10 +1031,16 @@ static void __init load_hv_initrd(void) | |||
| 1038 | 1031 | ||
| 1039 | fd = hv_fs_findfile((HV_VirtAddr) initramfs_file); | 1032 | fd = hv_fs_findfile((HV_VirtAddr) initramfs_file); |
| 1040 | if (fd == HV_ENOENT) { | 1033 | if (fd == HV_ENOENT) { |
| 1041 | if (set_initramfs_file) | 1034 | if (set_initramfs_file) { |
| 1042 | pr_warning("No such hvfs initramfs file '%s'\n", | 1035 | pr_warning("No such hvfs initramfs file '%s'\n", |
| 1043 | initramfs_file); | 1036 | initramfs_file); |
| 1044 | return; | 1037 | return; |
| 1038 | } else { | ||
| 1039 | /* Try old backwards-compatible name. */ | ||
| 1040 | fd = hv_fs_findfile((HV_VirtAddr)"initramfs.cpio.gz"); | ||
| 1041 | if (fd == HV_ENOENT) | ||
| 1042 | return; | ||
| 1043 | } | ||
| 1045 | } | 1044 | } |
| 1046 | BUG_ON(fd < 0); | 1045 | BUG_ON(fd < 0); |
| 1047 | stat = hv_fs_fstat(fd); | 1046 | stat = hv_fs_fstat(fd); |
diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile index 8a84501acb1b..5ef205c5f37b 100644 --- a/arch/x86/boot/compressed/Makefile +++ b/arch/x86/boot/compressed/Makefile | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | # create a compressed vmlinux image from the original vmlinux | 4 | # create a compressed vmlinux image from the original vmlinux |
| 5 | # | 5 | # |
| 6 | 6 | ||
| 7 | targets := vmlinux.lds vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma vmlinux.bin.xz vmlinux.bin.lzo head_$(BITS).o misc.o string.o cmdline.o early_serial_console.o piggy.o | 7 | targets := vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma vmlinux.bin.xz vmlinux.bin.lzo |
| 8 | 8 | ||
| 9 | KBUILD_CFLAGS := -m$(BITS) -D__KERNEL__ $(LINUX_INCLUDE) -O2 | 9 | KBUILD_CFLAGS := -m$(BITS) -D__KERNEL__ $(LINUX_INCLUDE) -O2 |
| 10 | KBUILD_CFLAGS += -fno-strict-aliasing -fPIC | 10 | KBUILD_CFLAGS += -fno-strict-aliasing -fPIC |
| @@ -29,7 +29,6 @@ VMLINUX_OBJS = $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o \ | |||
| 29 | $(obj)/piggy.o | 29 | $(obj)/piggy.o |
| 30 | 30 | ||
| 31 | $(obj)/eboot.o: KBUILD_CFLAGS += -fshort-wchar -mno-red-zone | 31 | $(obj)/eboot.o: KBUILD_CFLAGS += -fshort-wchar -mno-red-zone |
| 32 | $(obj)/efi_stub_$(BITS).o: KBUILD_CLFAGS += -fshort-wchar -mno-red-zone | ||
| 33 | 32 | ||
| 34 | ifeq ($(CONFIG_EFI_STUB), y) | 33 | ifeq ($(CONFIG_EFI_STUB), y) |
| 35 | VMLINUX_OBJS += $(obj)/eboot.o $(obj)/efi_stub_$(BITS).o | 34 | VMLINUX_OBJS += $(obj)/eboot.o $(obj)/efi_stub_$(BITS).o |
| @@ -43,7 +42,7 @@ OBJCOPYFLAGS_vmlinux.bin := -R .comment -S | |||
| 43 | $(obj)/vmlinux.bin: vmlinux FORCE | 42 | $(obj)/vmlinux.bin: vmlinux FORCE |
| 44 | $(call if_changed,objcopy) | 43 | $(call if_changed,objcopy) |
| 45 | 44 | ||
| 46 | targets += vmlinux.bin.all vmlinux.relocs | 45 | targets += $(patsubst $(obj)/%,%,$(VMLINUX_OBJS)) vmlinux.bin.all vmlinux.relocs |
| 47 | 46 | ||
| 48 | CMD_RELOCS = arch/x86/tools/relocs | 47 | CMD_RELOCS = arch/x86/tools/relocs |
| 49 | quiet_cmd_relocs = RELOCS $@ | 48 | quiet_cmd_relocs = RELOCS $@ |
diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h index 5edd1742cfd0..7361e47db79f 100644 --- a/arch/x86/include/asm/paravirt.h +++ b/arch/x86/include/asm/paravirt.h | |||
| @@ -703,7 +703,10 @@ static inline void arch_leave_lazy_mmu_mode(void) | |||
| 703 | PVOP_VCALL0(pv_mmu_ops.lazy_mode.leave); | 703 | PVOP_VCALL0(pv_mmu_ops.lazy_mode.leave); |
| 704 | } | 704 | } |
| 705 | 705 | ||
| 706 | void arch_flush_lazy_mmu_mode(void); | 706 | static inline void arch_flush_lazy_mmu_mode(void) |
| 707 | { | ||
| 708 | PVOP_VCALL0(pv_mmu_ops.lazy_mode.flush); | ||
| 709 | } | ||
| 707 | 710 | ||
| 708 | static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx, | 711 | static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx, |
| 709 | phys_addr_t phys, pgprot_t flags) | 712 | phys_addr_t phys, pgprot_t flags) |
diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h index 142236ed83af..b3b0ec1dac86 100644 --- a/arch/x86/include/asm/paravirt_types.h +++ b/arch/x86/include/asm/paravirt_types.h | |||
| @@ -91,6 +91,7 @@ struct pv_lazy_ops { | |||
| 91 | /* Set deferred update mode, used for batching operations. */ | 91 | /* Set deferred update mode, used for batching operations. */ |
| 92 | void (*enter)(void); | 92 | void (*enter)(void); |
| 93 | void (*leave)(void); | 93 | void (*leave)(void); |
| 94 | void (*flush)(void); | ||
| 94 | }; | 95 | }; |
| 95 | 96 | ||
| 96 | struct pv_time_ops { | 97 | struct pv_time_ops { |
| @@ -679,6 +680,7 @@ void paravirt_end_context_switch(struct task_struct *next); | |||
| 679 | 680 | ||
| 680 | void paravirt_enter_lazy_mmu(void); | 681 | void paravirt_enter_lazy_mmu(void); |
| 681 | void paravirt_leave_lazy_mmu(void); | 682 | void paravirt_leave_lazy_mmu(void); |
| 683 | void paravirt_flush_lazy_mmu(void); | ||
| 682 | 684 | ||
| 683 | void _paravirt_nop(void); | 685 | void _paravirt_nop(void); |
| 684 | u32 _paravirt_ident_32(u32); | 686 | u32 _paravirt_ident_32(u32); |
diff --git a/arch/x86/include/asm/syscall.h b/arch/x86/include/asm/syscall.h index 1ace47b62592..2e188d68397c 100644 --- a/arch/x86/include/asm/syscall.h +++ b/arch/x86/include/asm/syscall.h | |||
| @@ -29,13 +29,13 @@ extern const unsigned long sys_call_table[]; | |||
| 29 | */ | 29 | */ |
| 30 | static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs) | 30 | static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs) |
| 31 | { | 31 | { |
| 32 | return regs->orig_ax & __SYSCALL_MASK; | 32 | return regs->orig_ax; |
| 33 | } | 33 | } |
| 34 | 34 | ||
| 35 | static inline void syscall_rollback(struct task_struct *task, | 35 | static inline void syscall_rollback(struct task_struct *task, |
| 36 | struct pt_regs *regs) | 36 | struct pt_regs *regs) |
| 37 | { | 37 | { |
| 38 | regs->ax = regs->orig_ax & __SYSCALL_MASK; | 38 | regs->ax = regs->orig_ax; |
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | static inline long syscall_get_error(struct task_struct *task, | 41 | static inline long syscall_get_error(struct task_struct *task, |
diff --git a/arch/x86/include/asm/tlb.h b/arch/x86/include/asm/tlb.h index 4fef20773b8f..c7797307fc2b 100644 --- a/arch/x86/include/asm/tlb.h +++ b/arch/x86/include/asm/tlb.h | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | 7 | ||
| 8 | #define tlb_flush(tlb) \ | 8 | #define tlb_flush(tlb) \ |
| 9 | { \ | 9 | { \ |
| 10 | if (tlb->fullmm == 0) \ | 10 | if (!tlb->fullmm && !tlb->need_flush_all) \ |
| 11 | flush_tlb_mm_range(tlb->mm, tlb->start, tlb->end, 0UL); \ | 11 | flush_tlb_mm_range(tlb->mm, tlb->start, tlb->end, 0UL); \ |
| 12 | else \ | 12 | else \ |
| 13 | flush_tlb_mm_range(tlb->mm, 0UL, TLB_FLUSH_ALL, 0UL); \ | 13 | flush_tlb_mm_range(tlb->mm, 0UL, TLB_FLUSH_ALL, 0UL); \ |
diff --git a/arch/x86/kernel/amd_nb.c b/arch/x86/kernel/amd_nb.c index aadf3359e2a7..f1d0a1446d3a 100644 --- a/arch/x86/kernel/amd_nb.c +++ b/arch/x86/kernel/amd_nb.c | |||
| @@ -20,12 +20,14 @@ const struct pci_device_id amd_nb_misc_ids[] = { | |||
| 20 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_10H_NB_MISC) }, | 20 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_10H_NB_MISC) }, |
| 21 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F3) }, | 21 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F3) }, |
| 22 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_M10H_F3) }, | 22 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_M10H_F3) }, |
| 23 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_16H_NB_F3) }, | ||
| 23 | {} | 24 | {} |
| 24 | }; | 25 | }; |
| 25 | EXPORT_SYMBOL(amd_nb_misc_ids); | 26 | EXPORT_SYMBOL(amd_nb_misc_ids); |
| 26 | 27 | ||
| 27 | static struct pci_device_id amd_nb_link_ids[] = { | 28 | static struct pci_device_id amd_nb_link_ids[] = { |
| 28 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F4) }, | 29 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F4) }, |
| 30 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_16H_NB_F4) }, | ||
| 29 | {} | 31 | {} |
| 30 | }; | 32 | }; |
| 31 | 33 | ||
| @@ -81,7 +83,6 @@ int amd_cache_northbridges(void) | |||
| 81 | next_northbridge(link, amd_nb_link_ids); | 83 | next_northbridge(link, amd_nb_link_ids); |
| 82 | } | 84 | } |
| 83 | 85 | ||
| 84 | /* some CPU families (e.g. family 0x11) do not support GART */ | ||
| 85 | if (boot_cpu_data.x86 == 0xf || boot_cpu_data.x86 == 0x10 || | 86 | if (boot_cpu_data.x86 == 0xf || boot_cpu_data.x86 == 0x10 || |
| 86 | boot_cpu_data.x86 == 0x15) | 87 | boot_cpu_data.x86 == 0x15) |
| 87 | amd_northbridges.flags |= AMD_NB_GART; | 88 | amd_northbridges.flags |= AMD_NB_GART; |
diff --git a/arch/x86/kernel/cpu/perf_event_intel_ds.c b/arch/x86/kernel/cpu/perf_event_intel_ds.c index b05a575d56f4..26830f3af0df 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_ds.c +++ b/arch/x86/kernel/cpu/perf_event_intel_ds.c | |||
| @@ -314,10 +314,11 @@ int intel_pmu_drain_bts_buffer(void) | |||
| 314 | if (top <= at) | 314 | if (top <= at) |
| 315 | return 0; | 315 | return 0; |
| 316 | 316 | ||
| 317 | memset(®s, 0, sizeof(regs)); | ||
| 318 | |||
| 317 | ds->bts_index = ds->bts_buffer_base; | 319 | ds->bts_index = ds->bts_buffer_base; |
| 318 | 320 | ||
| 319 | perf_sample_data_init(&data, 0, event->hw.last_period); | 321 | perf_sample_data_init(&data, 0, event->hw.last_period); |
| 320 | regs.ip = 0; | ||
| 321 | 322 | ||
| 322 | /* | 323 | /* |
| 323 | * Prepare a generic sample, i.e. fill in the invariant fields. | 324 | * Prepare a generic sample, i.e. fill in the invariant fields. |
diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c index 17fff18a1031..8bfb335f74bb 100644 --- a/arch/x86/kernel/paravirt.c +++ b/arch/x86/kernel/paravirt.c | |||
| @@ -263,6 +263,18 @@ void paravirt_leave_lazy_mmu(void) | |||
| 263 | leave_lazy(PARAVIRT_LAZY_MMU); | 263 | leave_lazy(PARAVIRT_LAZY_MMU); |
| 264 | } | 264 | } |
| 265 | 265 | ||
| 266 | void paravirt_flush_lazy_mmu(void) | ||
| 267 | { | ||
| 268 | preempt_disable(); | ||
| 269 | |||
| 270 | if (paravirt_get_lazy_mode() == PARAVIRT_LAZY_MMU) { | ||
| 271 | arch_leave_lazy_mmu_mode(); | ||
| 272 | arch_enter_lazy_mmu_mode(); | ||
| 273 | } | ||
| 274 | |||
| 275 | preempt_enable(); | ||
| 276 | } | ||
| 277 | |||
| 266 | void paravirt_start_context_switch(struct task_struct *prev) | 278 | void paravirt_start_context_switch(struct task_struct *prev) |
| 267 | { | 279 | { |
| 268 | BUG_ON(preemptible()); | 280 | BUG_ON(preemptible()); |
| @@ -292,18 +304,6 @@ enum paravirt_lazy_mode paravirt_get_lazy_mode(void) | |||
| 292 | return this_cpu_read(paravirt_lazy_mode); | 304 | return this_cpu_read(paravirt_lazy_mode); |
| 293 | } | 305 | } |
| 294 | 306 | ||
| 295 | void arch_flush_lazy_mmu_mode(void) | ||
| 296 | { | ||
| 297 | preempt_disable(); | ||
| 298 | |||
| 299 | if (paravirt_get_lazy_mode() == PARAVIRT_LAZY_MMU) { | ||
| 300 | arch_leave_lazy_mmu_mode(); | ||
| 301 | arch_enter_lazy_mmu_mode(); | ||
| 302 | } | ||
| 303 | |||
| 304 | preempt_enable(); | ||
| 305 | } | ||
| 306 | |||
| 307 | struct pv_info pv_info = { | 307 | struct pv_info pv_info = { |
| 308 | .name = "bare hardware", | 308 | .name = "bare hardware", |
| 309 | .paravirt_enabled = 0, | 309 | .paravirt_enabled = 0, |
| @@ -475,6 +475,7 @@ struct pv_mmu_ops pv_mmu_ops = { | |||
| 475 | .lazy_mode = { | 475 | .lazy_mode = { |
| 476 | .enter = paravirt_nop, | 476 | .enter = paravirt_nop, |
| 477 | .leave = paravirt_nop, | 477 | .leave = paravirt_nop, |
| 478 | .flush = paravirt_nop, | ||
| 478 | }, | 479 | }, |
| 479 | 480 | ||
| 480 | .set_fixmap = native_set_fixmap, | 481 | .set_fixmap = native_set_fixmap, |
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 02b51dd4e4ad..f77df1c5de6e 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c | |||
| @@ -1857,7 +1857,7 @@ int kvm_lapic_enable_pv_eoi(struct kvm_vcpu *vcpu, u64 data) | |||
| 1857 | if (!pv_eoi_enabled(vcpu)) | 1857 | if (!pv_eoi_enabled(vcpu)) |
| 1858 | return 0; | 1858 | return 0; |
| 1859 | return kvm_gfn_to_hva_cache_init(vcpu->kvm, &vcpu->arch.pv_eoi.data, | 1859 | return kvm_gfn_to_hva_cache_init(vcpu->kvm, &vcpu->arch.pv_eoi.data, |
| 1860 | addr); | 1860 | addr, sizeof(u8)); |
| 1861 | } | 1861 | } |
| 1862 | 1862 | ||
| 1863 | void kvm_lapic_init(void) | 1863 | void kvm_lapic_init(void) |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index f19ac0aca60d..e1721324c271 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
| @@ -1823,7 +1823,8 @@ static int kvm_pv_enable_async_pf(struct kvm_vcpu *vcpu, u64 data) | |||
| 1823 | return 0; | 1823 | return 0; |
| 1824 | } | 1824 | } |
| 1825 | 1825 | ||
| 1826 | if (kvm_gfn_to_hva_cache_init(vcpu->kvm, &vcpu->arch.apf.data, gpa)) | 1826 | if (kvm_gfn_to_hva_cache_init(vcpu->kvm, &vcpu->arch.apf.data, gpa, |
| 1827 | sizeof(u32))) | ||
| 1827 | return 1; | 1828 | return 1; |
| 1828 | 1829 | ||
| 1829 | vcpu->arch.apf.send_user_only = !(data & KVM_ASYNC_PF_SEND_ALWAYS); | 1830 | vcpu->arch.apf.send_user_only = !(data & KVM_ASYNC_PF_SEND_ALWAYS); |
| @@ -1952,12 +1953,9 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) | |||
| 1952 | 1953 | ||
| 1953 | gpa_offset = data & ~(PAGE_MASK | 1); | 1954 | gpa_offset = data & ~(PAGE_MASK | 1); |
| 1954 | 1955 | ||
| 1955 | /* Check that the address is 32-byte aligned. */ | ||
| 1956 | if (gpa_offset & (sizeof(struct pvclock_vcpu_time_info) - 1)) | ||
| 1957 | break; | ||
| 1958 | |||
| 1959 | if (kvm_gfn_to_hva_cache_init(vcpu->kvm, | 1956 | if (kvm_gfn_to_hva_cache_init(vcpu->kvm, |
| 1960 | &vcpu->arch.pv_time, data & ~1ULL)) | 1957 | &vcpu->arch.pv_time, data & ~1ULL, |
| 1958 | sizeof(struct pvclock_vcpu_time_info))) | ||
| 1961 | vcpu->arch.pv_time_enabled = false; | 1959 | vcpu->arch.pv_time_enabled = false; |
| 1962 | else | 1960 | else |
| 1963 | vcpu->arch.pv_time_enabled = true; | 1961 | vcpu->arch.pv_time_enabled = true; |
| @@ -1977,7 +1975,8 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) | |||
| 1977 | return 1; | 1975 | return 1; |
| 1978 | 1976 | ||
| 1979 | if (kvm_gfn_to_hva_cache_init(vcpu->kvm, &vcpu->arch.st.stime, | 1977 | if (kvm_gfn_to_hva_cache_init(vcpu->kvm, &vcpu->arch.st.stime, |
| 1980 | data & KVM_STEAL_VALID_BITS)) | 1978 | data & KVM_STEAL_VALID_BITS, |
| 1979 | sizeof(struct kvm_steal_time))) | ||
| 1981 | return 1; | 1980 | return 1; |
| 1982 | 1981 | ||
| 1983 | vcpu->arch.st.msr_val = data; | 1982 | vcpu->arch.st.msr_val = data; |
diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c index 1cbd89ca5569..7114c63f047d 100644 --- a/arch/x86/lguest/boot.c +++ b/arch/x86/lguest/boot.c | |||
| @@ -1334,6 +1334,7 @@ __init void lguest_init(void) | |||
| 1334 | pv_mmu_ops.read_cr3 = lguest_read_cr3; | 1334 | pv_mmu_ops.read_cr3 = lguest_read_cr3; |
| 1335 | pv_mmu_ops.lazy_mode.enter = paravirt_enter_lazy_mmu; | 1335 | pv_mmu_ops.lazy_mode.enter = paravirt_enter_lazy_mmu; |
| 1336 | pv_mmu_ops.lazy_mode.leave = lguest_leave_lazy_mmu_mode; | 1336 | pv_mmu_ops.lazy_mode.leave = lguest_leave_lazy_mmu_mode; |
| 1337 | pv_mmu_ops.lazy_mode.flush = paravirt_flush_lazy_mmu; | ||
| 1337 | pv_mmu_ops.pte_update = lguest_pte_update; | 1338 | pv_mmu_ops.pte_update = lguest_pte_update; |
| 1338 | pv_mmu_ops.pte_update_defer = lguest_pte_update; | 1339 | pv_mmu_ops.pte_update_defer = lguest_pte_update; |
| 1339 | 1340 | ||
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 2b97525246d4..0e883364abb5 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c | |||
| @@ -378,10 +378,12 @@ static noinline __kprobes int vmalloc_fault(unsigned long address) | |||
| 378 | if (pgd_none(*pgd_ref)) | 378 | if (pgd_none(*pgd_ref)) |
| 379 | return -1; | 379 | return -1; |
| 380 | 380 | ||
| 381 | if (pgd_none(*pgd)) | 381 | if (pgd_none(*pgd)) { |
| 382 | set_pgd(pgd, *pgd_ref); | 382 | set_pgd(pgd, *pgd_ref); |
| 383 | else | 383 | arch_flush_lazy_mmu_mode(); |
| 384 | } else { | ||
| 384 | BUG_ON(pgd_page_vaddr(*pgd) != pgd_page_vaddr(*pgd_ref)); | 385 | BUG_ON(pgd_page_vaddr(*pgd) != pgd_page_vaddr(*pgd_ref)); |
| 386 | } | ||
| 385 | 387 | ||
| 386 | /* | 388 | /* |
| 387 | * Below here mismatches are bugs because these lower tables | 389 | * Below here mismatches are bugs because these lower tables |
diff --git a/arch/x86/mm/pageattr-test.c b/arch/x86/mm/pageattr-test.c index b0086567271c..0e38951e65eb 100644 --- a/arch/x86/mm/pageattr-test.c +++ b/arch/x86/mm/pageattr-test.c | |||
| @@ -68,7 +68,7 @@ static int print_split(struct split_state *s) | |||
| 68 | s->gpg++; | 68 | s->gpg++; |
| 69 | i += GPS/PAGE_SIZE; | 69 | i += GPS/PAGE_SIZE; |
| 70 | } else if (level == PG_LEVEL_2M) { | 70 | } else if (level == PG_LEVEL_2M) { |
| 71 | if (!(pte_val(*pte) & _PAGE_PSE)) { | 71 | if ((pte_val(*pte) & _PAGE_PRESENT) && !(pte_val(*pte) & _PAGE_PSE)) { |
| 72 | printk(KERN_ERR | 72 | printk(KERN_ERR |
| 73 | "%lx level %d but not PSE %Lx\n", | 73 | "%lx level %d but not PSE %Lx\n", |
| 74 | addr, level, (u64)pte_val(*pte)); | 74 | addr, level, (u64)pte_val(*pte)); |
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index 091934e1d0d9..fb4e73ec24d8 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c | |||
| @@ -467,7 +467,7 @@ try_preserve_large_page(pte_t *kpte, unsigned long address, | |||
| 467 | * We are safe now. Check whether the new pgprot is the same: | 467 | * We are safe now. Check whether the new pgprot is the same: |
| 468 | */ | 468 | */ |
| 469 | old_pte = *kpte; | 469 | old_pte = *kpte; |
| 470 | old_prot = new_prot = req_prot = pte_pgprot(old_pte); | 470 | old_prot = req_prot = pte_pgprot(old_pte); |
| 471 | 471 | ||
| 472 | pgprot_val(req_prot) &= ~pgprot_val(cpa->mask_clr); | 472 | pgprot_val(req_prot) &= ~pgprot_val(cpa->mask_clr); |
| 473 | pgprot_val(req_prot) |= pgprot_val(cpa->mask_set); | 473 | pgprot_val(req_prot) |= pgprot_val(cpa->mask_set); |
| @@ -478,12 +478,12 @@ try_preserve_large_page(pte_t *kpte, unsigned long address, | |||
| 478 | * a non present pmd. The canon_pgprot will clear _PAGE_GLOBAL | 478 | * a non present pmd. The canon_pgprot will clear _PAGE_GLOBAL |
| 479 | * for the ancient hardware that doesn't support it. | 479 | * for the ancient hardware that doesn't support it. |
| 480 | */ | 480 | */ |
| 481 | if (pgprot_val(new_prot) & _PAGE_PRESENT) | 481 | if (pgprot_val(req_prot) & _PAGE_PRESENT) |
| 482 | pgprot_val(new_prot) |= _PAGE_PSE | _PAGE_GLOBAL; | 482 | pgprot_val(req_prot) |= _PAGE_PSE | _PAGE_GLOBAL; |
| 483 | else | 483 | else |
| 484 | pgprot_val(new_prot) &= ~(_PAGE_PSE | _PAGE_GLOBAL); | 484 | pgprot_val(req_prot) &= ~(_PAGE_PSE | _PAGE_GLOBAL); |
| 485 | 485 | ||
| 486 | new_prot = canon_pgprot(new_prot); | 486 | req_prot = canon_pgprot(req_prot); |
| 487 | 487 | ||
| 488 | /* | 488 | /* |
| 489 | * old_pte points to the large page base address. So we need | 489 | * old_pte points to the large page base address. So we need |
| @@ -1413,6 +1413,8 @@ void kernel_map_pages(struct page *page, int numpages, int enable) | |||
| 1413 | * but that can deadlock->flush only current cpu: | 1413 | * but that can deadlock->flush only current cpu: |
| 1414 | */ | 1414 | */ |
| 1415 | __flush_tlb_all(); | 1415 | __flush_tlb_all(); |
| 1416 | |||
| 1417 | arch_flush_lazy_mmu_mode(); | ||
| 1416 | } | 1418 | } |
| 1417 | 1419 | ||
| 1418 | #ifdef CONFIG_HIBERNATION | 1420 | #ifdef CONFIG_HIBERNATION |
diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c index 193350b51f90..17fda6a8b3c2 100644 --- a/arch/x86/mm/pgtable.c +++ b/arch/x86/mm/pgtable.c | |||
| @@ -58,6 +58,13 @@ void ___pte_free_tlb(struct mmu_gather *tlb, struct page *pte) | |||
| 58 | void ___pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd) | 58 | void ___pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd) |
| 59 | { | 59 | { |
| 60 | paravirt_release_pmd(__pa(pmd) >> PAGE_SHIFT); | 60 | paravirt_release_pmd(__pa(pmd) >> PAGE_SHIFT); |
| 61 | /* | ||
| 62 | * NOTE! For PAE, any changes to the top page-directory-pointer-table | ||
| 63 | * entries need a full cr3 reload to flush. | ||
| 64 | */ | ||
| 65 | #ifdef CONFIG_X86_PAE | ||
| 66 | tlb->need_flush_all = 1; | ||
| 67 | #endif | ||
| 61 | tlb_remove_page(tlb, virt_to_page(pmd)); | 68 | tlb_remove_page(tlb, virt_to_page(pmd)); |
| 62 | } | 69 | } |
| 63 | 70 | ||
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index 6afbb2ca9a0a..e006c18d288a 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
| @@ -1748,14 +1748,18 @@ static void *m2v(phys_addr_t maddr) | |||
| 1748 | } | 1748 | } |
| 1749 | 1749 | ||
| 1750 | /* Set the page permissions on an identity-mapped pages */ | 1750 | /* Set the page permissions on an identity-mapped pages */ |
| 1751 | static void set_page_prot(void *addr, pgprot_t prot) | 1751 | static void set_page_prot_flags(void *addr, pgprot_t prot, unsigned long flags) |
| 1752 | { | 1752 | { |
| 1753 | unsigned long pfn = __pa(addr) >> PAGE_SHIFT; | 1753 | unsigned long pfn = __pa(addr) >> PAGE_SHIFT; |
| 1754 | pte_t pte = pfn_pte(pfn, prot); | 1754 | pte_t pte = pfn_pte(pfn, prot); |
| 1755 | 1755 | ||
| 1756 | if (HYPERVISOR_update_va_mapping((unsigned long)addr, pte, 0)) | 1756 | if (HYPERVISOR_update_va_mapping((unsigned long)addr, pte, flags)) |
| 1757 | BUG(); | 1757 | BUG(); |
| 1758 | } | 1758 | } |
| 1759 | static void set_page_prot(void *addr, pgprot_t prot) | ||
| 1760 | { | ||
| 1761 | return set_page_prot_flags(addr, prot, UVMF_NONE); | ||
| 1762 | } | ||
| 1759 | #ifdef CONFIG_X86_32 | 1763 | #ifdef CONFIG_X86_32 |
| 1760 | static void __init xen_map_identity_early(pmd_t *pmd, unsigned long max_pfn) | 1764 | static void __init xen_map_identity_early(pmd_t *pmd, unsigned long max_pfn) |
| 1761 | { | 1765 | { |
| @@ -1839,12 +1843,12 @@ static void __init check_pt_base(unsigned long *pt_base, unsigned long *pt_end, | |||
| 1839 | unsigned long addr) | 1843 | unsigned long addr) |
| 1840 | { | 1844 | { |
| 1841 | if (*pt_base == PFN_DOWN(__pa(addr))) { | 1845 | if (*pt_base == PFN_DOWN(__pa(addr))) { |
| 1842 | set_page_prot((void *)addr, PAGE_KERNEL); | 1846 | set_page_prot_flags((void *)addr, PAGE_KERNEL, UVMF_INVLPG); |
| 1843 | clear_page((void *)addr); | 1847 | clear_page((void *)addr); |
| 1844 | (*pt_base)++; | 1848 | (*pt_base)++; |
| 1845 | } | 1849 | } |
| 1846 | if (*pt_end == PFN_DOWN(__pa(addr))) { | 1850 | if (*pt_end == PFN_DOWN(__pa(addr))) { |
| 1847 | set_page_prot((void *)addr, PAGE_KERNEL); | 1851 | set_page_prot_flags((void *)addr, PAGE_KERNEL, UVMF_INVLPG); |
| 1848 | clear_page((void *)addr); | 1852 | clear_page((void *)addr); |
| 1849 | (*pt_end)--; | 1853 | (*pt_end)--; |
| 1850 | } | 1854 | } |
| @@ -2196,6 +2200,7 @@ static const struct pv_mmu_ops xen_mmu_ops __initconst = { | |||
| 2196 | .lazy_mode = { | 2200 | .lazy_mode = { |
| 2197 | .enter = paravirt_enter_lazy_mmu, | 2201 | .enter = paravirt_enter_lazy_mmu, |
| 2198 | .leave = xen_leave_lazy_mmu, | 2202 | .leave = xen_leave_lazy_mmu, |
| 2203 | .flush = paravirt_flush_lazy_mmu, | ||
| 2199 | }, | 2204 | }, |
| 2200 | 2205 | ||
| 2201 | .set_fixmap = xen_set_fixmap, | 2206 | .set_fixmap = xen_set_fixmap, |
