diff options
432 files changed, 4215 insertions, 4356 deletions
diff --git a/Documentation/arm/memory.txt b/Documentation/arm/memory.txt index 771d48d3b33..208a2d465b9 100644 --- a/Documentation/arm/memory.txt +++ b/Documentation/arm/memory.txt | |||
@@ -51,15 +51,14 @@ ffc00000 ffefffff DMA memory mapping region. Memory returned | |||
51 | ff000000 ffbfffff Reserved for future expansion of DMA | 51 | ff000000 ffbfffff Reserved for future expansion of DMA |
52 | mapping region. | 52 | mapping region. |
53 | 53 | ||
54 | VMALLOC_END feffffff Free for platform use, recommended. | ||
55 | VMALLOC_END must be aligned to a 2MB | ||
56 | boundary. | ||
57 | |||
58 | VMALLOC_START VMALLOC_END-1 vmalloc() / ioremap() space. | 54 | VMALLOC_START VMALLOC_END-1 vmalloc() / ioremap() space. |
59 | Memory returned by vmalloc/ioremap will | 55 | Memory returned by vmalloc/ioremap will |
60 | be dynamically placed in this region. | 56 | be dynamically placed in this region. |
61 | VMALLOC_START may be based upon the value | 57 | Machine specific static mappings are also |
62 | of the high_memory variable. | 58 | located here through iotable_init(). |
59 | VMALLOC_START is based upon the value | ||
60 | of the high_memory variable, and VMALLOC_END | ||
61 | is equal to 0xff000000. | ||
63 | 62 | ||
64 | PAGE_OFFSET high_memory-1 Kernel direct-mapped RAM region. | 63 | PAGE_OFFSET high_memory-1 Kernel direct-mapped RAM region. |
65 | This maps the platforms RAM, and typically | 64 | This maps the platforms RAM, and typically |
diff --git a/Documentation/devicetree/bindings/arm/gic.txt b/Documentation/devicetree/bindings/arm/gic.txt index 52916b4aa1f..9b4b82a721b 100644 --- a/Documentation/devicetree/bindings/arm/gic.txt +++ b/Documentation/devicetree/bindings/arm/gic.txt | |||
@@ -42,6 +42,10 @@ Optional | |||
42 | - interrupts : Interrupt source of the parent interrupt controller. Only | 42 | - interrupts : Interrupt source of the parent interrupt controller. Only |
43 | present on secondary GICs. | 43 | present on secondary GICs. |
44 | 44 | ||
45 | - cpu-offset : per-cpu offset within the distributor and cpu interface | ||
46 | regions, used when the GIC doesn't have banked registers. The offset is | ||
47 | cpu-offset * cpu-nr. | ||
48 | |||
45 | Example: | 49 | Example: |
46 | 50 | ||
47 | intc: interrupt-controller@fff11000 { | 51 | intc: interrupt-controller@fff11000 { |
diff --git a/Documentation/devicetree/bindings/arm/vic.txt b/Documentation/devicetree/bindings/arm/vic.txt new file mode 100644 index 00000000000..266716b2343 --- /dev/null +++ b/Documentation/devicetree/bindings/arm/vic.txt | |||
@@ -0,0 +1,29 @@ | |||
1 | * ARM Vectored Interrupt Controller | ||
2 | |||
3 | One or more Vectored Interrupt Controllers (VIC's) can be connected in an ARM | ||
4 | system for interrupt routing. For multiple controllers they can either be | ||
5 | nested or have the outputs wire-OR'd together. | ||
6 | |||
7 | Required properties: | ||
8 | |||
9 | - compatible : should be one of | ||
10 | "arm,pl190-vic" | ||
11 | "arm,pl192-vic" | ||
12 | - interrupt-controller : Identifies the node as an interrupt controller | ||
13 | - #interrupt-cells : The number of cells to define the interrupts. Must be 1 as | ||
14 | the VIC has no configuration options for interrupt sources. The cell is a u32 | ||
15 | and defines the interrupt number. | ||
16 | - reg : The register bank for the VIC. | ||
17 | |||
18 | Optional properties: | ||
19 | |||
20 | - interrupts : Interrupt source for parent controllers if the VIC is nested. | ||
21 | |||
22 | Example: | ||
23 | |||
24 | vic0: interrupt-controller@60000 { | ||
25 | compatible = "arm,pl192-vic"; | ||
26 | interrupt-controller; | ||
27 | #interrupt-cells = <1>; | ||
28 | reg = <0x60000 0x1000>; | ||
29 | }; | ||
diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt index 7945b0bd35e..e2a4b528736 100644 --- a/Documentation/virtual/kvm/api.txt +++ b/Documentation/virtual/kvm/api.txt | |||
@@ -1100,6 +1100,15 @@ emulate them efficiently. The fields in each entry are defined as follows: | |||
1100 | eax, ebx, ecx, edx: the values returned by the cpuid instruction for | 1100 | eax, ebx, ecx, edx: the values returned by the cpuid instruction for |
1101 | this function/index combination | 1101 | this function/index combination |
1102 | 1102 | ||
1103 | The TSC deadline timer feature (CPUID leaf 1, ecx[24]) is always returned | ||
1104 | as false, since the feature depends on KVM_CREATE_IRQCHIP for local APIC | ||
1105 | support. Instead it is reported via | ||
1106 | |||
1107 | ioctl(KVM_CHECK_EXTENSION, KVM_CAP_TSC_DEADLINE_TIMER) | ||
1108 | |||
1109 | if that returns true and you use KVM_CREATE_IRQCHIP, or if you emulate the | ||
1110 | feature in userspace, then you can enable the feature for KVM_SET_CPUID2. | ||
1111 | |||
1103 | 4.47 KVM_PPC_GET_PVINFO | 1112 | 4.47 KVM_PPC_GET_PVINFO |
1104 | 1113 | ||
1105 | Capability: KVM_CAP_PPC_GET_PVINFO | 1114 | Capability: KVM_CAP_PPC_GET_PVINFO |
@@ -1151,6 +1160,13 @@ following flags are specified: | |||
1151 | /* Depends on KVM_CAP_IOMMU */ | 1160 | /* Depends on KVM_CAP_IOMMU */ |
1152 | #define KVM_DEV_ASSIGN_ENABLE_IOMMU (1 << 0) | 1161 | #define KVM_DEV_ASSIGN_ENABLE_IOMMU (1 << 0) |
1153 | 1162 | ||
1163 | The KVM_DEV_ASSIGN_ENABLE_IOMMU flag is a mandatory option to ensure | ||
1164 | isolation of the device. Usages not specifying this flag are deprecated. | ||
1165 | |||
1166 | Only PCI header type 0 devices with PCI BAR resources are supported by | ||
1167 | device assignment. The user requesting this ioctl must have read/write | ||
1168 | access to the PCI sysfs resource files associated with the device. | ||
1169 | |||
1154 | 4.49 KVM_DEASSIGN_PCI_DEVICE | 1170 | 4.49 KVM_DEASSIGN_PCI_DEVICE |
1155 | 1171 | ||
1156 | Capability: KVM_CAP_DEVICE_DEASSIGNMENT | 1172 | Capability: KVM_CAP_DEVICE_DEASSIGNMENT |
diff --git a/MAINTAINERS b/MAINTAINERS index 5a601eab03a..5a70c1809b7 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -2693,7 +2693,7 @@ FIREWIRE SUBSYSTEM | |||
2693 | M: Stefan Richter <stefanr@s5r6.in-berlin.de> | 2693 | M: Stefan Richter <stefanr@s5r6.in-berlin.de> |
2694 | L: linux1394-devel@lists.sourceforge.net | 2694 | L: linux1394-devel@lists.sourceforge.net |
2695 | W: http://ieee1394.wiki.kernel.org/ | 2695 | W: http://ieee1394.wiki.kernel.org/ |
2696 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6.git | 2696 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394.git |
2697 | S: Maintained | 2697 | S: Maintained |
2698 | F: drivers/firewire/ | 2698 | F: drivers/firewire/ |
2699 | F: include/linux/firewire*.h | 2699 | F: include/linux/firewire*.h |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 849e3ad9370..444822526a0 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -258,6 +258,7 @@ config ARCH_INTEGRATOR | |||
258 | select ARCH_HAS_CPUFREQ | 258 | select ARCH_HAS_CPUFREQ |
259 | select CLKDEV_LOOKUP | 259 | select CLKDEV_LOOKUP |
260 | select HAVE_MACH_CLKDEV | 260 | select HAVE_MACH_CLKDEV |
261 | select HAVE_TCM | ||
261 | select ICST | 262 | select ICST |
262 | select GENERIC_CLOCKEVENTS | 263 | select GENERIC_CLOCKEVENTS |
263 | select PLAT_VERSATILE | 264 | select PLAT_VERSATILE |
@@ -341,10 +342,12 @@ config ARCH_HIGHBANK | |||
341 | select ARM_AMBA | 342 | select ARM_AMBA |
342 | select ARM_GIC | 343 | select ARM_GIC |
343 | select ARM_TIMER_SP804 | 344 | select ARM_TIMER_SP804 |
345 | select CACHE_L2X0 | ||
344 | select CLKDEV_LOOKUP | 346 | select CLKDEV_LOOKUP |
345 | select CPU_V7 | 347 | select CPU_V7 |
346 | select GENERIC_CLOCKEVENTS | 348 | select GENERIC_CLOCKEVENTS |
347 | select HAVE_ARM_SCU | 349 | select HAVE_ARM_SCU |
350 | select HAVE_SMP | ||
348 | select USE_OF | 351 | select USE_OF |
349 | help | 352 | help |
350 | Support for the Calxeda Highbank SoC based boards. | 353 | Support for the Calxeda Highbank SoC based boards. |
@@ -362,6 +365,7 @@ config ARCH_CNS3XXX | |||
362 | select CPU_V6K | 365 | select CPU_V6K |
363 | select GENERIC_CLOCKEVENTS | 366 | select GENERIC_CLOCKEVENTS |
364 | select ARM_GIC | 367 | select ARM_GIC |
368 | select MIGHT_HAVE_CACHE_L2X0 | ||
365 | select MIGHT_HAVE_PCI | 369 | select MIGHT_HAVE_PCI |
366 | select PCI_DOMAINS if PCI | 370 | select PCI_DOMAINS if PCI |
367 | help | 371 | help |
@@ -382,6 +386,7 @@ config ARCH_PRIMA2 | |||
382 | select GENERIC_CLOCKEVENTS | 386 | select GENERIC_CLOCKEVENTS |
383 | select CLKDEV_LOOKUP | 387 | select CLKDEV_LOOKUP |
384 | select GENERIC_IRQ_CHIP | 388 | select GENERIC_IRQ_CHIP |
389 | select MIGHT_HAVE_CACHE_L2X0 | ||
385 | select USE_OF | 390 | select USE_OF |
386 | select ZONE_DMA | 391 | select ZONE_DMA |
387 | help | 392 | help |
@@ -634,6 +639,8 @@ config ARCH_TEGRA | |||
634 | select GENERIC_GPIO | 639 | select GENERIC_GPIO |
635 | select HAVE_CLK | 640 | select HAVE_CLK |
636 | select HAVE_SCHED_CLOCK | 641 | select HAVE_SCHED_CLOCK |
642 | select HAVE_SMP | ||
643 | select MIGHT_HAVE_CACHE_L2X0 | ||
637 | select ARCH_HAS_CPUFREQ | 644 | select ARCH_HAS_CPUFREQ |
638 | help | 645 | help |
639 | This enables support for NVIDIA Tegra based systems (Tegra APX, | 646 | This enables support for NVIDIA Tegra based systems (Tegra APX, |
@@ -703,7 +710,9 @@ config ARCH_SHMOBILE | |||
703 | select HAVE_CLK | 710 | select HAVE_CLK |
704 | select CLKDEV_LOOKUP | 711 | select CLKDEV_LOOKUP |
705 | select HAVE_MACH_CLKDEV | 712 | select HAVE_MACH_CLKDEV |
713 | select HAVE_SMP | ||
706 | select GENERIC_CLOCKEVENTS | 714 | select GENERIC_CLOCKEVENTS |
715 | select MIGHT_HAVE_CACHE_L2X0 | ||
707 | select NO_IOPORT | 716 | select NO_IOPORT |
708 | select SPARSE_IRQ | 717 | select SPARSE_IRQ |
709 | select MULTI_IRQ_HANDLER | 718 | select MULTI_IRQ_HANDLER |
@@ -895,6 +904,8 @@ config ARCH_U8500 | |||
895 | select CLKDEV_LOOKUP | 904 | select CLKDEV_LOOKUP |
896 | select ARCH_REQUIRE_GPIOLIB | 905 | select ARCH_REQUIRE_GPIOLIB |
897 | select ARCH_HAS_CPUFREQ | 906 | select ARCH_HAS_CPUFREQ |
907 | select HAVE_SMP | ||
908 | select MIGHT_HAVE_CACHE_L2X0 | ||
898 | help | 909 | help |
899 | Support for ST-Ericsson's Ux500 architecture | 910 | Support for ST-Ericsson's Ux500 architecture |
900 | 911 | ||
@@ -905,6 +916,7 @@ config ARCH_NOMADIK | |||
905 | select CPU_ARM926T | 916 | select CPU_ARM926T |
906 | select CLKDEV_LOOKUP | 917 | select CLKDEV_LOOKUP |
907 | select GENERIC_CLOCKEVENTS | 918 | select GENERIC_CLOCKEVENTS |
919 | select MIGHT_HAVE_CACHE_L2X0 | ||
908 | select ARCH_REQUIRE_GPIOLIB | 920 | select ARCH_REQUIRE_GPIOLIB |
909 | help | 921 | help |
910 | Support for the Nomadik platform by ST-Ericsson | 922 | Support for the Nomadik platform by ST-Ericsson |
@@ -964,6 +976,7 @@ config ARCH_ZYNQ | |||
964 | select ARM_GIC | 976 | select ARM_GIC |
965 | select ARM_AMBA | 977 | select ARM_AMBA |
966 | select ICST | 978 | select ICST |
979 | select MIGHT_HAVE_CACHE_L2X0 | ||
967 | select USE_OF | 980 | select USE_OF |
968 | help | 981 | help |
969 | Support for Xilinx Zynq ARM Cortex A9 Platform | 982 | Support for Xilinx Zynq ARM Cortex A9 Platform |
@@ -1114,6 +1127,11 @@ config ARM_TIMER_SP804 | |||
1114 | 1127 | ||
1115 | source arch/arm/mm/Kconfig | 1128 | source arch/arm/mm/Kconfig |
1116 | 1129 | ||
1130 | config ARM_NR_BANKS | ||
1131 | int | ||
1132 | default 16 if ARCH_EP93XX | ||
1133 | default 8 | ||
1134 | |||
1117 | config IWMMXT | 1135 | config IWMMXT |
1118 | bool "Enable iWMMXt support" | 1136 | bool "Enable iWMMXt support" |
1119 | depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4 | 1137 | depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4 |
@@ -1234,7 +1252,7 @@ config PL310_ERRATA_588369 | |||
1234 | 1252 | ||
1235 | config ARM_ERRATA_720789 | 1253 | config ARM_ERRATA_720789 |
1236 | bool "ARM errata: TLBIASIDIS and TLBIMVAIS operations can broadcast a faulty ASID" | 1254 | bool "ARM errata: TLBIASIDIS and TLBIMVAIS operations can broadcast a faulty ASID" |
1237 | depends on CPU_V7 && SMP | 1255 | depends on CPU_V7 |
1238 | help | 1256 | help |
1239 | This option enables the workaround for the 720789 Cortex-A9 (prior to | 1257 | This option enables the workaround for the 720789 Cortex-A9 (prior to |
1240 | r2p0) erratum. A faulty ASID can be sent to the other CPUs for the | 1258 | r2p0) erratum. A faulty ASID can be sent to the other CPUs for the |
@@ -1270,7 +1288,7 @@ config ARM_ERRATA_743622 | |||
1270 | 1288 | ||
1271 | config ARM_ERRATA_751472 | 1289 | config ARM_ERRATA_751472 |
1272 | bool "ARM errata: Interrupted ICIALLUIS may prevent completion of broadcasted operation" | 1290 | bool "ARM errata: Interrupted ICIALLUIS may prevent completion of broadcasted operation" |
1273 | depends on CPU_V7 && SMP | 1291 | depends on CPU_V7 |
1274 | help | 1292 | help |
1275 | This option enables the workaround for the 751472 Cortex-A9 (prior | 1293 | This option enables the workaround for the 751472 Cortex-A9 (prior |
1276 | to r3p0) erratum. An interrupted ICIALLUIS operation may prevent the | 1294 | to r3p0) erratum. An interrupted ICIALLUIS operation may prevent the |
@@ -1423,14 +1441,20 @@ menu "Kernel Features" | |||
1423 | 1441 | ||
1424 | source "kernel/time/Kconfig" | 1442 | source "kernel/time/Kconfig" |
1425 | 1443 | ||
1444 | config HAVE_SMP | ||
1445 | bool | ||
1446 | help | ||
1447 | This option should be selected by machines which have an SMP- | ||
1448 | capable CPU. | ||
1449 | |||
1450 | The only effect of this option is to make the SMP-related | ||
1451 | options available to the user for configuration. | ||
1452 | |||
1426 | config SMP | 1453 | config SMP |
1427 | bool "Symmetric Multi-Processing" | 1454 | bool "Symmetric Multi-Processing" |
1428 | depends on CPU_V6K || CPU_V7 | 1455 | depends on CPU_V6K || CPU_V7 |
1429 | depends on GENERIC_CLOCKEVENTS | 1456 | depends on GENERIC_CLOCKEVENTS |
1430 | depends on REALVIEW_EB_ARM11MP || REALVIEW_EB_A9MP || \ | 1457 | depends on HAVE_SMP |
1431 | MACH_REALVIEW_PB11MP || MACH_REALVIEW_PBX || ARCH_OMAP4 || \ | ||
1432 | ARCH_EXYNOS4 || ARCH_TEGRA || ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || \ | ||
1433 | ARCH_MSM_SCORPIONMP || ARCH_SHMOBILE || ARCH_HIGHBANK || SOC_IMX6Q | ||
1434 | depends on MMU | 1458 | depends on MMU |
1435 | select USE_GENERIC_SMP_HELPERS | 1459 | select USE_GENERIC_SMP_HELPERS |
1436 | select HAVE_ARM_SCU if !ARCH_MSM_SCORPIONMP | 1460 | select HAVE_ARM_SCU if !ARCH_MSM_SCORPIONMP |
@@ -1548,6 +1572,16 @@ config LOCAL_TIMERS | |||
1548 | accounting to be spread across the timer interval, preventing a | 1572 | accounting to be spread across the timer interval, preventing a |
1549 | "thundering herd" at every timer tick. | 1573 | "thundering herd" at every timer tick. |
1550 | 1574 | ||
1575 | config ARCH_NR_GPIO | ||
1576 | int | ||
1577 | default 1024 if ARCH_SHMOBILE || ARCH_TEGRA | ||
1578 | default 350 if ARCH_U8500 | ||
1579 | default 0 | ||
1580 | help | ||
1581 | Maximum number of GPIOs in the system. | ||
1582 | |||
1583 | If unsure, leave the default value. | ||
1584 | |||
1551 | source kernel/Kconfig.preempt | 1585 | source kernel/Kconfig.preempt |
1552 | 1586 | ||
1553 | config HZ | 1587 | config HZ |
@@ -1960,7 +1994,7 @@ endchoice | |||
1960 | 1994 | ||
1961 | config XIP_KERNEL | 1995 | config XIP_KERNEL |
1962 | bool "Kernel Execute-In-Place from ROM" | 1996 | bool "Kernel Execute-In-Place from ROM" |
1963 | depends on !ZBOOT_ROM | 1997 | depends on !ZBOOT_ROM && !ARM_LPAE |
1964 | help | 1998 | help |
1965 | Execute-In-Place allows the kernel to run from non-volatile storage | 1999 | Execute-In-Place allows the kernel to run from non-volatile storage |
1966 | directly addressable by the CPU, such as NOR flash. This saves RAM | 2000 | directly addressable by the CPU, such as NOR flash. This saves RAM |
@@ -1990,7 +2024,7 @@ config XIP_PHYS_ADDR | |||
1990 | 2024 | ||
1991 | config KEXEC | 2025 | config KEXEC |
1992 | bool "Kexec system call (EXPERIMENTAL)" | 2026 | bool "Kexec system call (EXPERIMENTAL)" |
1993 | depends on EXPERIMENTAL | 2027 | depends on EXPERIMENTAL && (!SMP || HOTPLUG_CPU) |
1994 | help | 2028 | help |
1995 | kexec is a system call that implements the ability to shutdown your | 2029 | kexec is a system call that implements the ability to shutdown your |
1996 | current kernel, and to start another kernel. It is like a reboot | 2030 | current kernel, and to start another kernel. It is like a reboot |
diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile index 21f56ff3279..cf0a64ce4b8 100644 --- a/arch/arm/boot/compressed/Makefile +++ b/arch/arm/boot/compressed/Makefile | |||
@@ -126,7 +126,8 @@ ccflags-y := -fpic -fno-builtin -I$(obj) | |||
126 | asflags-y := -Wa,-march=all | 126 | asflags-y := -Wa,-march=all |
127 | 127 | ||
128 | # Supply kernel BSS size to the decompressor via a linker symbol. | 128 | # Supply kernel BSS size to the decompressor via a linker symbol. |
129 | KBSS_SZ = $(shell size $(obj)/../../../../vmlinux | awk 'END{print $$3}') | 129 | KBSS_SZ = $(shell $(CROSS_COMPILE)size $(obj)/../../../../vmlinux | \ |
130 | awk 'END{print $$3}') | ||
130 | LDFLAGS_vmlinux = --defsym _kernel_bss_size=$(KBSS_SZ) | 131 | LDFLAGS_vmlinux = --defsym _kernel_bss_size=$(KBSS_SZ) |
131 | # Supply ZRELADDR to the decompressor via a linker symbol. | 132 | # Supply ZRELADDR to the decompressor via a linker symbol. |
132 | ifneq ($(CONFIG_AUTO_ZRELADDR),y) | 133 | ifneq ($(CONFIG_AUTO_ZRELADDR),y) |
diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S index c2effc91725..c5d60250d43 100644 --- a/arch/arm/boot/compressed/head.S +++ b/arch/arm/boot/compressed/head.S | |||
@@ -659,6 +659,7 @@ __armv7_mmu_cache_on: | |||
659 | mcrne p15, 0, r3, c2, c0, 0 @ load page table pointer | 659 | mcrne p15, 0, r3, c2, c0, 0 @ load page table pointer |
660 | mcrne p15, 0, r1, c3, c0, 0 @ load domain access control | 660 | mcrne p15, 0, r1, c3, c0, 0 @ load domain access control |
661 | #endif | 661 | #endif |
662 | mcr p15, 0, r0, c7, c5, 4 @ ISB | ||
662 | mcr p15, 0, r0, c1, c0, 0 @ load control register | 663 | mcr p15, 0, r0, c1, c0, 0 @ load control register |
663 | mrc p15, 0, r0, c1, c0, 0 @ and read it back | 664 | mrc p15, 0, r0, c1, c0, 0 @ and read it back |
664 | mov r0, #0 | 665 | mov r0, #0 |
diff --git a/arch/arm/common/Kconfig b/arch/arm/common/Kconfig index 74df9ca2be3..81a933eb090 100644 --- a/arch/arm/common/Kconfig +++ b/arch/arm/common/Kconfig | |||
@@ -1,8 +1,14 @@ | |||
1 | config ARM_GIC | 1 | config ARM_GIC |
2 | select IRQ_DOMAIN | 2 | select IRQ_DOMAIN |
3 | select MULTI_IRQ_HANDLER | ||
4 | bool | ||
5 | |||
6 | config GIC_NON_BANKED | ||
3 | bool | 7 | bool |
4 | 8 | ||
5 | config ARM_VIC | 9 | config ARM_VIC |
10 | select IRQ_DOMAIN | ||
11 | select MULTI_IRQ_HANDLER | ||
6 | bool | 12 | bool |
7 | 13 | ||
8 | config ARM_VIC_NR | 14 | config ARM_VIC_NR |
diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c index 410a546060a..b2dc2dd7f1d 100644 --- a/arch/arm/common/gic.c +++ b/arch/arm/common/gic.c | |||
@@ -40,13 +40,36 @@ | |||
40 | #include <linux/slab.h> | 40 | #include <linux/slab.h> |
41 | 41 | ||
42 | #include <asm/irq.h> | 42 | #include <asm/irq.h> |
43 | #include <asm/exception.h> | ||
43 | #include <asm/mach/irq.h> | 44 | #include <asm/mach/irq.h> |
44 | #include <asm/hardware/gic.h> | 45 | #include <asm/hardware/gic.h> |
45 | 46 | ||
46 | static DEFINE_RAW_SPINLOCK(irq_controller_lock); | 47 | union gic_base { |
48 | void __iomem *common_base; | ||
49 | void __percpu __iomem **percpu_base; | ||
50 | }; | ||
47 | 51 | ||
48 | /* Address of GIC 0 CPU interface */ | 52 | struct gic_chip_data { |
49 | void __iomem *gic_cpu_base_addr __read_mostly; | 53 | unsigned int irq_offset; |
54 | union gic_base dist_base; | ||
55 | union gic_base cpu_base; | ||
56 | #ifdef CONFIG_CPU_PM | ||
57 | u32 saved_spi_enable[DIV_ROUND_UP(1020, 32)]; | ||
58 | u32 saved_spi_conf[DIV_ROUND_UP(1020, 16)]; | ||
59 | u32 saved_spi_target[DIV_ROUND_UP(1020, 4)]; | ||
60 | u32 __percpu *saved_ppi_enable; | ||
61 | u32 __percpu *saved_ppi_conf; | ||
62 | #endif | ||
63 | #ifdef CONFIG_IRQ_DOMAIN | ||
64 | struct irq_domain domain; | ||
65 | #endif | ||
66 | unsigned int gic_irqs; | ||
67 | #ifdef CONFIG_GIC_NON_BANKED | ||
68 | void __iomem *(*get_base)(union gic_base *); | ||
69 | #endif | ||
70 | }; | ||
71 | |||
72 | static DEFINE_RAW_SPINLOCK(irq_controller_lock); | ||
50 | 73 | ||
51 | /* | 74 | /* |
52 | * Supported arch specific GIC irq extension. | 75 | * Supported arch specific GIC irq extension. |
@@ -67,16 +90,48 @@ struct irq_chip gic_arch_extn = { | |||
67 | 90 | ||
68 | static struct gic_chip_data gic_data[MAX_GIC_NR] __read_mostly; | 91 | static struct gic_chip_data gic_data[MAX_GIC_NR] __read_mostly; |
69 | 92 | ||
93 | #ifdef CONFIG_GIC_NON_BANKED | ||
94 | static void __iomem *gic_get_percpu_base(union gic_base *base) | ||
95 | { | ||
96 | return *__this_cpu_ptr(base->percpu_base); | ||
97 | } | ||
98 | |||
99 | static void __iomem *gic_get_common_base(union gic_base *base) | ||
100 | { | ||
101 | return base->common_base; | ||
102 | } | ||
103 | |||
104 | static inline void __iomem *gic_data_dist_base(struct gic_chip_data *data) | ||
105 | { | ||
106 | return data->get_base(&data->dist_base); | ||
107 | } | ||
108 | |||
109 | static inline void __iomem *gic_data_cpu_base(struct gic_chip_data *data) | ||
110 | { | ||
111 | return data->get_base(&data->cpu_base); | ||
112 | } | ||
113 | |||
114 | static inline void gic_set_base_accessor(struct gic_chip_data *data, | ||
115 | void __iomem *(*f)(union gic_base *)) | ||
116 | { | ||
117 | data->get_base = f; | ||
118 | } | ||
119 | #else | ||
120 | #define gic_data_dist_base(d) ((d)->dist_base.common_base) | ||
121 | #define gic_data_cpu_base(d) ((d)->cpu_base.common_base) | ||
122 | #define gic_set_base_accessor(d,f) | ||
123 | #endif | ||
124 | |||
70 | static inline void __iomem *gic_dist_base(struct irq_data *d) | 125 | static inline void __iomem *gic_dist_base(struct irq_data *d) |
71 | { | 126 | { |
72 | struct gic_chip_data *gic_data = irq_data_get_irq_chip_data(d); | 127 | struct gic_chip_data *gic_data = irq_data_get_irq_chip_data(d); |
73 | return gic_data->dist_base; | 128 | return gic_data_dist_base(gic_data); |
74 | } | 129 | } |
75 | 130 | ||
76 | static inline void __iomem *gic_cpu_base(struct irq_data *d) | 131 | static inline void __iomem *gic_cpu_base(struct irq_data *d) |
77 | { | 132 | { |
78 | struct gic_chip_data *gic_data = irq_data_get_irq_chip_data(d); | 133 | struct gic_chip_data *gic_data = irq_data_get_irq_chip_data(d); |
79 | return gic_data->cpu_base; | 134 | return gic_data_cpu_base(gic_data); |
80 | } | 135 | } |
81 | 136 | ||
82 | static inline unsigned int gic_irq(struct irq_data *d) | 137 | static inline unsigned int gic_irq(struct irq_data *d) |
@@ -215,6 +270,32 @@ static int gic_set_wake(struct irq_data *d, unsigned int on) | |||
215 | #define gic_set_wake NULL | 270 | #define gic_set_wake NULL |
216 | #endif | 271 | #endif |
217 | 272 | ||
273 | asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs) | ||
274 | { | ||
275 | u32 irqstat, irqnr; | ||
276 | struct gic_chip_data *gic = &gic_data[0]; | ||
277 | void __iomem *cpu_base = gic_data_cpu_base(gic); | ||
278 | |||
279 | do { | ||
280 | irqstat = readl_relaxed(cpu_base + GIC_CPU_INTACK); | ||
281 | irqnr = irqstat & ~0x1c00; | ||
282 | |||
283 | if (likely(irqnr > 15 && irqnr < 1021)) { | ||
284 | irqnr = irq_domain_to_irq(&gic->domain, irqnr); | ||
285 | handle_IRQ(irqnr, regs); | ||
286 | continue; | ||
287 | } | ||
288 | if (irqnr < 16) { | ||
289 | writel_relaxed(irqstat, cpu_base + GIC_CPU_EOI); | ||
290 | #ifdef CONFIG_SMP | ||
291 | handle_IPI(irqnr, regs); | ||
292 | #endif | ||
293 | continue; | ||
294 | } | ||
295 | break; | ||
296 | } while (1); | ||
297 | } | ||
298 | |||
218 | static void gic_handle_cascade_irq(unsigned int irq, struct irq_desc *desc) | 299 | static void gic_handle_cascade_irq(unsigned int irq, struct irq_desc *desc) |
219 | { | 300 | { |
220 | struct gic_chip_data *chip_data = irq_get_handler_data(irq); | 301 | struct gic_chip_data *chip_data = irq_get_handler_data(irq); |
@@ -225,7 +306,7 @@ static void gic_handle_cascade_irq(unsigned int irq, struct irq_desc *desc) | |||
225 | chained_irq_enter(chip, desc); | 306 | chained_irq_enter(chip, desc); |
226 | 307 | ||
227 | raw_spin_lock(&irq_controller_lock); | 308 | raw_spin_lock(&irq_controller_lock); |
228 | status = readl_relaxed(chip_data->cpu_base + GIC_CPU_INTACK); | 309 | status = readl_relaxed(gic_data_cpu_base(chip_data) + GIC_CPU_INTACK); |
229 | raw_spin_unlock(&irq_controller_lock); | 310 | raw_spin_unlock(&irq_controller_lock); |
230 | 311 | ||
231 | gic_irq = (status & 0x3ff); | 312 | gic_irq = (status & 0x3ff); |
@@ -270,7 +351,7 @@ static void __init gic_dist_init(struct gic_chip_data *gic) | |||
270 | u32 cpumask; | 351 | u32 cpumask; |
271 | unsigned int gic_irqs = gic->gic_irqs; | 352 | unsigned int gic_irqs = gic->gic_irqs; |
272 | struct irq_domain *domain = &gic->domain; | 353 | struct irq_domain *domain = &gic->domain; |
273 | void __iomem *base = gic->dist_base; | 354 | void __iomem *base = gic_data_dist_base(gic); |
274 | u32 cpu = 0; | 355 | u32 cpu = 0; |
275 | 356 | ||
276 | #ifdef CONFIG_SMP | 357 | #ifdef CONFIG_SMP |
@@ -330,8 +411,8 @@ static void __init gic_dist_init(struct gic_chip_data *gic) | |||
330 | 411 | ||
331 | static void __cpuinit gic_cpu_init(struct gic_chip_data *gic) | 412 | static void __cpuinit gic_cpu_init(struct gic_chip_data *gic) |
332 | { | 413 | { |
333 | void __iomem *dist_base = gic->dist_base; | 414 | void __iomem *dist_base = gic_data_dist_base(gic); |
334 | void __iomem *base = gic->cpu_base; | 415 | void __iomem *base = gic_data_cpu_base(gic); |
335 | int i; | 416 | int i; |
336 | 417 | ||
337 | /* | 418 | /* |
@@ -368,7 +449,7 @@ static void gic_dist_save(unsigned int gic_nr) | |||
368 | BUG(); | 449 | BUG(); |
369 | 450 | ||
370 | gic_irqs = gic_data[gic_nr].gic_irqs; | 451 | gic_irqs = gic_data[gic_nr].gic_irqs; |
371 | dist_base = gic_data[gic_nr].dist_base; | 452 | dist_base = gic_data_dist_base(&gic_data[gic_nr]); |
372 | 453 | ||
373 | if (!dist_base) | 454 | if (!dist_base) |
374 | return; | 455 | return; |
@@ -403,7 +484,7 @@ static void gic_dist_restore(unsigned int gic_nr) | |||
403 | BUG(); | 484 | BUG(); |
404 | 485 | ||
405 | gic_irqs = gic_data[gic_nr].gic_irqs; | 486 | gic_irqs = gic_data[gic_nr].gic_irqs; |
406 | dist_base = gic_data[gic_nr].dist_base; | 487 | dist_base = gic_data_dist_base(&gic_data[gic_nr]); |
407 | 488 | ||
408 | if (!dist_base) | 489 | if (!dist_base) |
409 | return; | 490 | return; |
@@ -439,8 +520,8 @@ static void gic_cpu_save(unsigned int gic_nr) | |||
439 | if (gic_nr >= MAX_GIC_NR) | 520 | if (gic_nr >= MAX_GIC_NR) |
440 | BUG(); | 521 | BUG(); |
441 | 522 | ||
442 | dist_base = gic_data[gic_nr].dist_base; | 523 | dist_base = gic_data_dist_base(&gic_data[gic_nr]); |
443 | cpu_base = gic_data[gic_nr].cpu_base; | 524 | cpu_base = gic_data_cpu_base(&gic_data[gic_nr]); |
444 | 525 | ||
445 | if (!dist_base || !cpu_base) | 526 | if (!dist_base || !cpu_base) |
446 | return; | 527 | return; |
@@ -465,8 +546,8 @@ static void gic_cpu_restore(unsigned int gic_nr) | |||
465 | if (gic_nr >= MAX_GIC_NR) | 546 | if (gic_nr >= MAX_GIC_NR) |
466 | BUG(); | 547 | BUG(); |
467 | 548 | ||
468 | dist_base = gic_data[gic_nr].dist_base; | 549 | dist_base = gic_data_dist_base(&gic_data[gic_nr]); |
469 | cpu_base = gic_data[gic_nr].cpu_base; | 550 | cpu_base = gic_data_cpu_base(&gic_data[gic_nr]); |
470 | 551 | ||
471 | if (!dist_base || !cpu_base) | 552 | if (!dist_base || !cpu_base) |
472 | return; | 553 | return; |
@@ -491,6 +572,11 @@ static int gic_notifier(struct notifier_block *self, unsigned long cmd, void *v) | |||
491 | int i; | 572 | int i; |
492 | 573 | ||
493 | for (i = 0; i < MAX_GIC_NR; i++) { | 574 | for (i = 0; i < MAX_GIC_NR; i++) { |
575 | #ifdef CONFIG_GIC_NON_BANKED | ||
576 | /* Skip over unused GICs */ | ||
577 | if (!gic_data[i].get_base) | ||
578 | continue; | ||
579 | #endif | ||
494 | switch (cmd) { | 580 | switch (cmd) { |
495 | case CPU_PM_ENTER: | 581 | case CPU_PM_ENTER: |
496 | gic_cpu_save(i); | 582 | gic_cpu_save(i); |
@@ -564,8 +650,9 @@ const struct irq_domain_ops gic_irq_domain_ops = { | |||
564 | #endif | 650 | #endif |
565 | }; | 651 | }; |
566 | 652 | ||
567 | void __init gic_init(unsigned int gic_nr, int irq_start, | 653 | void __init gic_init_bases(unsigned int gic_nr, int irq_start, |
568 | void __iomem *dist_base, void __iomem *cpu_base) | 654 | void __iomem *dist_base, void __iomem *cpu_base, |
655 | u32 percpu_offset) | ||
569 | { | 656 | { |
570 | struct gic_chip_data *gic; | 657 | struct gic_chip_data *gic; |
571 | struct irq_domain *domain; | 658 | struct irq_domain *domain; |
@@ -575,8 +662,36 @@ void __init gic_init(unsigned int gic_nr, int irq_start, | |||
575 | 662 | ||
576 | gic = &gic_data[gic_nr]; | 663 | gic = &gic_data[gic_nr]; |
577 | domain = &gic->domain; | 664 | domain = &gic->domain; |
578 | gic->dist_base = dist_base; | 665 | #ifdef CONFIG_GIC_NON_BANKED |
579 | gic->cpu_base = cpu_base; | 666 | if (percpu_offset) { /* Frankein-GIC without banked registers... */ |
667 | unsigned int cpu; | ||
668 | |||
669 | gic->dist_base.percpu_base = alloc_percpu(void __iomem *); | ||
670 | gic->cpu_base.percpu_base = alloc_percpu(void __iomem *); | ||
671 | if (WARN_ON(!gic->dist_base.percpu_base || | ||
672 | !gic->cpu_base.percpu_base)) { | ||
673 | free_percpu(gic->dist_base.percpu_base); | ||
674 | free_percpu(gic->cpu_base.percpu_base); | ||
675 | return; | ||
676 | } | ||
677 | |||
678 | for_each_possible_cpu(cpu) { | ||
679 | unsigned long offset = percpu_offset * cpu_logical_map(cpu); | ||
680 | *per_cpu_ptr(gic->dist_base.percpu_base, cpu) = dist_base + offset; | ||
681 | *per_cpu_ptr(gic->cpu_base.percpu_base, cpu) = cpu_base + offset; | ||
682 | } | ||
683 | |||
684 | gic_set_base_accessor(gic, gic_get_percpu_base); | ||
685 | } else | ||
686 | #endif | ||
687 | { /* Normal, sane GIC... */ | ||
688 | WARN(percpu_offset, | ||
689 | "GIC_NON_BANKED not enabled, ignoring %08x offset!", | ||
690 | percpu_offset); | ||
691 | gic->dist_base.common_base = dist_base; | ||
692 | gic->cpu_base.common_base = cpu_base; | ||
693 | gic_set_base_accessor(gic, gic_get_common_base); | ||
694 | } | ||
580 | 695 | ||
581 | /* | 696 | /* |
582 | * For primary GICs, skip over SGIs. | 697 | * For primary GICs, skip over SGIs. |
@@ -584,8 +699,6 @@ void __init gic_init(unsigned int gic_nr, int irq_start, | |||
584 | */ | 699 | */ |
585 | domain->hwirq_base = 32; | 700 | domain->hwirq_base = 32; |
586 | if (gic_nr == 0) { | 701 | if (gic_nr == 0) { |
587 | gic_cpu_base_addr = cpu_base; | ||
588 | |||
589 | if ((irq_start & 31) > 0) { | 702 | if ((irq_start & 31) > 0) { |
590 | domain->hwirq_base = 16; | 703 | domain->hwirq_base = 16; |
591 | if (irq_start != -1) | 704 | if (irq_start != -1) |
@@ -597,7 +710,7 @@ void __init gic_init(unsigned int gic_nr, int irq_start, | |||
597 | * Find out how many interrupts are supported. | 710 | * Find out how many interrupts are supported. |
598 | * The GIC only supports up to 1020 interrupt sources. | 711 | * The GIC only supports up to 1020 interrupt sources. |
599 | */ | 712 | */ |
600 | gic_irqs = readl_relaxed(dist_base + GIC_DIST_CTR) & 0x1f; | 713 | gic_irqs = readl_relaxed(gic_data_dist_base(gic) + GIC_DIST_CTR) & 0x1f; |
601 | gic_irqs = (gic_irqs + 1) * 32; | 714 | gic_irqs = (gic_irqs + 1) * 32; |
602 | if (gic_irqs > 1020) | 715 | if (gic_irqs > 1020) |
603 | gic_irqs = 1020; | 716 | gic_irqs = 1020; |
@@ -645,7 +758,7 @@ void gic_raise_softirq(const struct cpumask *mask, unsigned int irq) | |||
645 | dsb(); | 758 | dsb(); |
646 | 759 | ||
647 | /* this always happens on GIC0 */ | 760 | /* this always happens on GIC0 */ |
648 | writel_relaxed(map << 16 | irq, gic_data[0].dist_base + GIC_DIST_SOFTINT); | 761 | writel_relaxed(map << 16 | irq, gic_data_dist_base(&gic_data[0]) + GIC_DIST_SOFTINT); |
649 | } | 762 | } |
650 | #endif | 763 | #endif |
651 | 764 | ||
@@ -656,6 +769,7 @@ int __init gic_of_init(struct device_node *node, struct device_node *parent) | |||
656 | { | 769 | { |
657 | void __iomem *cpu_base; | 770 | void __iomem *cpu_base; |
658 | void __iomem *dist_base; | 771 | void __iomem *dist_base; |
772 | u32 percpu_offset; | ||
659 | int irq; | 773 | int irq; |
660 | struct irq_domain *domain = &gic_data[gic_cnt].domain; | 774 | struct irq_domain *domain = &gic_data[gic_cnt].domain; |
661 | 775 | ||
@@ -668,9 +782,12 @@ int __init gic_of_init(struct device_node *node, struct device_node *parent) | |||
668 | cpu_base = of_iomap(node, 1); | 782 | cpu_base = of_iomap(node, 1); |
669 | WARN(!cpu_base, "unable to map gic cpu registers\n"); | 783 | WARN(!cpu_base, "unable to map gic cpu registers\n"); |
670 | 784 | ||
785 | if (of_property_read_u32(node, "cpu-offset", &percpu_offset)) | ||
786 | percpu_offset = 0; | ||
787 | |||
671 | domain->of_node = of_node_get(node); | 788 | domain->of_node = of_node_get(node); |
672 | 789 | ||
673 | gic_init(gic_cnt, -1, dist_base, cpu_base); | 790 | gic_init_bases(gic_cnt, -1, dist_base, cpu_base, percpu_offset); |
674 | 791 | ||
675 | if (parent) { | 792 | if (parent) { |
676 | irq = irq_of_parse_and_map(node, 0); | 793 | irq = irq_of_parse_and_map(node, 0); |
diff --git a/arch/arm/common/pl330.c b/arch/arm/common/pl330.c index f407a6b35d3..d8e44a43047 100644 --- a/arch/arm/common/pl330.c +++ b/arch/arm/common/pl330.c | |||
@@ -221,17 +221,6 @@ | |||
221 | */ | 221 | */ |
222 | #define MCODE_BUFF_PER_REQ 256 | 222 | #define MCODE_BUFF_PER_REQ 256 |
223 | 223 | ||
224 | /* | ||
225 | * Mark a _pl330_req as free. | ||
226 | * We do it by writing DMAEND as the first instruction | ||
227 | * because no valid request is going to have DMAEND as | ||
228 | * its first instruction to execute. | ||
229 | */ | ||
230 | #define MARK_FREE(req) do { \ | ||
231 | _emit_END(0, (req)->mc_cpu); \ | ||
232 | (req)->mc_len = 0; \ | ||
233 | } while (0) | ||
234 | |||
235 | /* If the _pl330_req is available to the client */ | 224 | /* If the _pl330_req is available to the client */ |
236 | #define IS_FREE(req) (*((u8 *)((req)->mc_cpu)) == CMD_DMAEND) | 225 | #define IS_FREE(req) (*((u8 *)((req)->mc_cpu)) == CMD_DMAEND) |
237 | 226 | ||
@@ -301,8 +290,10 @@ struct pl330_thread { | |||
301 | struct pl330_dmac *dmac; | 290 | struct pl330_dmac *dmac; |
302 | /* Only two at a time */ | 291 | /* Only two at a time */ |
303 | struct _pl330_req req[2]; | 292 | struct _pl330_req req[2]; |
304 | /* Index of the last submitted request */ | 293 | /* Index of the last enqueued request */ |
305 | unsigned lstenq; | 294 | unsigned lstenq; |
295 | /* Index of the last submitted request or -1 if the DMA is stopped */ | ||
296 | int req_running; | ||
306 | }; | 297 | }; |
307 | 298 | ||
308 | enum pl330_dmac_state { | 299 | enum pl330_dmac_state { |
@@ -778,6 +769,22 @@ static inline void _execute_DBGINSN(struct pl330_thread *thrd, | |||
778 | writel(0, regs + DBGCMD); | 769 | writel(0, regs + DBGCMD); |
779 | } | 770 | } |
780 | 771 | ||
772 | /* | ||
773 | * Mark a _pl330_req as free. | ||
774 | * We do it by writing DMAEND as the first instruction | ||
775 | * because no valid request is going to have DMAEND as | ||
776 | * its first instruction to execute. | ||
777 | */ | ||
778 | static void mark_free(struct pl330_thread *thrd, int idx) | ||
779 | { | ||
780 | struct _pl330_req *req = &thrd->req[idx]; | ||
781 | |||
782 | _emit_END(0, req->mc_cpu); | ||
783 | req->mc_len = 0; | ||
784 | |||
785 | thrd->req_running = -1; | ||
786 | } | ||
787 | |||
781 | static inline u32 _state(struct pl330_thread *thrd) | 788 | static inline u32 _state(struct pl330_thread *thrd) |
782 | { | 789 | { |
783 | void __iomem *regs = thrd->dmac->pinfo->base; | 790 | void __iomem *regs = thrd->dmac->pinfo->base; |
@@ -836,31 +843,6 @@ static inline u32 _state(struct pl330_thread *thrd) | |||
836 | } | 843 | } |
837 | } | 844 | } |
838 | 845 | ||
839 | /* If the request 'req' of thread 'thrd' is currently active */ | ||
840 | static inline bool _req_active(struct pl330_thread *thrd, | ||
841 | struct _pl330_req *req) | ||
842 | { | ||
843 | void __iomem *regs = thrd->dmac->pinfo->base; | ||
844 | u32 buf = req->mc_bus, pc = readl(regs + CPC(thrd->id)); | ||
845 | |||
846 | if (IS_FREE(req)) | ||
847 | return false; | ||
848 | |||
849 | return (pc >= buf && pc <= buf + req->mc_len) ? true : false; | ||
850 | } | ||
851 | |||
852 | /* Returns 0 if the thread is inactive, ID of active req + 1 otherwise */ | ||
853 | static inline unsigned _thrd_active(struct pl330_thread *thrd) | ||
854 | { | ||
855 | if (_req_active(thrd, &thrd->req[0])) | ||
856 | return 1; /* First req active */ | ||
857 | |||
858 | if (_req_active(thrd, &thrd->req[1])) | ||
859 | return 2; /* Second req active */ | ||
860 | |||
861 | return 0; | ||
862 | } | ||
863 | |||
864 | static void _stop(struct pl330_thread *thrd) | 846 | static void _stop(struct pl330_thread *thrd) |
865 | { | 847 | { |
866 | void __iomem *regs = thrd->dmac->pinfo->base; | 848 | void __iomem *regs = thrd->dmac->pinfo->base; |
@@ -892,17 +874,22 @@ static bool _trigger(struct pl330_thread *thrd) | |||
892 | struct _arg_GO go; | 874 | struct _arg_GO go; |
893 | unsigned ns; | 875 | unsigned ns; |
894 | u8 insn[6] = {0, 0, 0, 0, 0, 0}; | 876 | u8 insn[6] = {0, 0, 0, 0, 0, 0}; |
877 | int idx; | ||
895 | 878 | ||
896 | /* Return if already ACTIVE */ | 879 | /* Return if already ACTIVE */ |
897 | if (_state(thrd) != PL330_STATE_STOPPED) | 880 | if (_state(thrd) != PL330_STATE_STOPPED) |
898 | return true; | 881 | return true; |
899 | 882 | ||
900 | if (!IS_FREE(&thrd->req[1 - thrd->lstenq])) | 883 | idx = 1 - thrd->lstenq; |
901 | req = &thrd->req[1 - thrd->lstenq]; | 884 | if (!IS_FREE(&thrd->req[idx])) |
902 | else if (!IS_FREE(&thrd->req[thrd->lstenq])) | 885 | req = &thrd->req[idx]; |
903 | req = &thrd->req[thrd->lstenq]; | 886 | else { |
904 | else | 887 | idx = thrd->lstenq; |
905 | req = NULL; | 888 | if (!IS_FREE(&thrd->req[idx])) |
889 | req = &thrd->req[idx]; | ||
890 | else | ||
891 | req = NULL; | ||
892 | } | ||
906 | 893 | ||
907 | /* Return if no request */ | 894 | /* Return if no request */ |
908 | if (!req || !req->r) | 895 | if (!req || !req->r) |
@@ -933,6 +920,8 @@ static bool _trigger(struct pl330_thread *thrd) | |||
933 | /* Only manager can execute GO */ | 920 | /* Only manager can execute GO */ |
934 | _execute_DBGINSN(thrd, insn, true); | 921 | _execute_DBGINSN(thrd, insn, true); |
935 | 922 | ||
923 | thrd->req_running = idx; | ||
924 | |||
936 | return true; | 925 | return true; |
937 | } | 926 | } |
938 | 927 | ||
@@ -1382,8 +1371,8 @@ static void pl330_dotask(unsigned long data) | |||
1382 | 1371 | ||
1383 | thrd->req[0].r = NULL; | 1372 | thrd->req[0].r = NULL; |
1384 | thrd->req[1].r = NULL; | 1373 | thrd->req[1].r = NULL; |
1385 | MARK_FREE(&thrd->req[0]); | 1374 | mark_free(thrd, 0); |
1386 | MARK_FREE(&thrd->req[1]); | 1375 | mark_free(thrd, 1); |
1387 | 1376 | ||
1388 | /* Clear the reset flag */ | 1377 | /* Clear the reset flag */ |
1389 | pl330->dmac_tbd.reset_chan &= ~(1 << i); | 1378 | pl330->dmac_tbd.reset_chan &= ~(1 << i); |
@@ -1461,14 +1450,12 @@ int pl330_update(const struct pl330_info *pi) | |||
1461 | 1450 | ||
1462 | thrd = &pl330->channels[id]; | 1451 | thrd = &pl330->channels[id]; |
1463 | 1452 | ||
1464 | active = _thrd_active(thrd); | 1453 | active = thrd->req_running; |
1465 | if (!active) /* Aborted */ | 1454 | if (active == -1) /* Aborted */ |
1466 | continue; | 1455 | continue; |
1467 | 1456 | ||
1468 | active -= 1; | ||
1469 | |||
1470 | rqdone = &thrd->req[active]; | 1457 | rqdone = &thrd->req[active]; |
1471 | MARK_FREE(rqdone); | 1458 | mark_free(thrd, active); |
1472 | 1459 | ||
1473 | /* Get going again ASAP */ | 1460 | /* Get going again ASAP */ |
1474 | _start(thrd); | 1461 | _start(thrd); |
@@ -1480,13 +1467,19 @@ int pl330_update(const struct pl330_info *pi) | |||
1480 | 1467 | ||
1481 | /* Now that we are in no hurry, do the callbacks */ | 1468 | /* Now that we are in no hurry, do the callbacks */ |
1482 | while (!list_empty(&pl330->req_done)) { | 1469 | while (!list_empty(&pl330->req_done)) { |
1470 | struct pl330_req *r; | ||
1471 | |||
1483 | rqdone = container_of(pl330->req_done.next, | 1472 | rqdone = container_of(pl330->req_done.next, |
1484 | struct _pl330_req, rqd); | 1473 | struct _pl330_req, rqd); |
1485 | 1474 | ||
1486 | list_del_init(&rqdone->rqd); | 1475 | list_del_init(&rqdone->rqd); |
1487 | 1476 | ||
1477 | /* Detach the req */ | ||
1478 | r = rqdone->r; | ||
1479 | rqdone->r = NULL; | ||
1480 | |||
1488 | spin_unlock_irqrestore(&pl330->lock, flags); | 1481 | spin_unlock_irqrestore(&pl330->lock, flags); |
1489 | _callback(rqdone->r, PL330_ERR_NONE); | 1482 | _callback(r, PL330_ERR_NONE); |
1490 | spin_lock_irqsave(&pl330->lock, flags); | 1483 | spin_lock_irqsave(&pl330->lock, flags); |
1491 | } | 1484 | } |
1492 | 1485 | ||
@@ -1509,7 +1502,7 @@ int pl330_chan_ctrl(void *ch_id, enum pl330_chan_op op) | |||
1509 | struct pl330_thread *thrd = ch_id; | 1502 | struct pl330_thread *thrd = ch_id; |
1510 | struct pl330_dmac *pl330; | 1503 | struct pl330_dmac *pl330; |
1511 | unsigned long flags; | 1504 | unsigned long flags; |
1512 | int ret = 0, active; | 1505 | int ret = 0, active = thrd->req_running; |
1513 | 1506 | ||
1514 | if (!thrd || thrd->free || thrd->dmac->state == DYING) | 1507 | if (!thrd || thrd->free || thrd->dmac->state == DYING) |
1515 | return -EINVAL; | 1508 | return -EINVAL; |
@@ -1525,28 +1518,24 @@ int pl330_chan_ctrl(void *ch_id, enum pl330_chan_op op) | |||
1525 | 1518 | ||
1526 | thrd->req[0].r = NULL; | 1519 | thrd->req[0].r = NULL; |
1527 | thrd->req[1].r = NULL; | 1520 | thrd->req[1].r = NULL; |
1528 | MARK_FREE(&thrd->req[0]); | 1521 | mark_free(thrd, 0); |
1529 | MARK_FREE(&thrd->req[1]); | 1522 | mark_free(thrd, 1); |
1530 | break; | 1523 | break; |
1531 | 1524 | ||
1532 | case PL330_OP_ABORT: | 1525 | case PL330_OP_ABORT: |
1533 | active = _thrd_active(thrd); | ||
1534 | |||
1535 | /* Make sure the channel is stopped */ | 1526 | /* Make sure the channel is stopped */ |
1536 | _stop(thrd); | 1527 | _stop(thrd); |
1537 | 1528 | ||
1538 | /* ABORT is only for the active req */ | 1529 | /* ABORT is only for the active req */ |
1539 | if (!active) | 1530 | if (active == -1) |
1540 | break; | 1531 | break; |
1541 | 1532 | ||
1542 | active--; | ||
1543 | |||
1544 | thrd->req[active].r = NULL; | 1533 | thrd->req[active].r = NULL; |
1545 | MARK_FREE(&thrd->req[active]); | 1534 | mark_free(thrd, active); |
1546 | 1535 | ||
1547 | /* Start the next */ | 1536 | /* Start the next */ |
1548 | case PL330_OP_START: | 1537 | case PL330_OP_START: |
1549 | if (!_thrd_active(thrd) && !_start(thrd)) | 1538 | if ((active == -1) && !_start(thrd)) |
1550 | ret = -EIO; | 1539 | ret = -EIO; |
1551 | break; | 1540 | break; |
1552 | 1541 | ||
@@ -1587,14 +1576,13 @@ int pl330_chan_status(void *ch_id, struct pl330_chanstatus *pstatus) | |||
1587 | else | 1576 | else |
1588 | pstatus->faulting = false; | 1577 | pstatus->faulting = false; |
1589 | 1578 | ||
1590 | active = _thrd_active(thrd); | 1579 | active = thrd->req_running; |
1591 | 1580 | ||
1592 | if (!active) { | 1581 | if (active == -1) { |
1593 | /* Indicate that the thread is not running */ | 1582 | /* Indicate that the thread is not running */ |
1594 | pstatus->top_req = NULL; | 1583 | pstatus->top_req = NULL; |
1595 | pstatus->wait_req = NULL; | 1584 | pstatus->wait_req = NULL; |
1596 | } else { | 1585 | } else { |
1597 | active--; | ||
1598 | pstatus->top_req = thrd->req[active].r; | 1586 | pstatus->top_req = thrd->req[active].r; |
1599 | pstatus->wait_req = !IS_FREE(&thrd->req[1 - active]) | 1587 | pstatus->wait_req = !IS_FREE(&thrd->req[1 - active]) |
1600 | ? thrd->req[1 - active].r : NULL; | 1588 | ? thrd->req[1 - active].r : NULL; |
@@ -1659,9 +1647,9 @@ void *pl330_request_channel(const struct pl330_info *pi) | |||
1659 | thrd->free = false; | 1647 | thrd->free = false; |
1660 | thrd->lstenq = 1; | 1648 | thrd->lstenq = 1; |
1661 | thrd->req[0].r = NULL; | 1649 | thrd->req[0].r = NULL; |
1662 | MARK_FREE(&thrd->req[0]); | 1650 | mark_free(thrd, 0); |
1663 | thrd->req[1].r = NULL; | 1651 | thrd->req[1].r = NULL; |
1664 | MARK_FREE(&thrd->req[1]); | 1652 | mark_free(thrd, 1); |
1665 | break; | 1653 | break; |
1666 | } | 1654 | } |
1667 | } | 1655 | } |
@@ -1767,14 +1755,14 @@ static inline void _reset_thread(struct pl330_thread *thrd) | |||
1767 | thrd->req[0].mc_bus = pl330->mcode_bus | 1755 | thrd->req[0].mc_bus = pl330->mcode_bus |
1768 | + (thrd->id * pi->mcbufsz); | 1756 | + (thrd->id * pi->mcbufsz); |
1769 | thrd->req[0].r = NULL; | 1757 | thrd->req[0].r = NULL; |
1770 | MARK_FREE(&thrd->req[0]); | 1758 | mark_free(thrd, 0); |
1771 | 1759 | ||
1772 | thrd->req[1].mc_cpu = thrd->req[0].mc_cpu | 1760 | thrd->req[1].mc_cpu = thrd->req[0].mc_cpu |
1773 | + pi->mcbufsz / 2; | 1761 | + pi->mcbufsz / 2; |
1774 | thrd->req[1].mc_bus = thrd->req[0].mc_bus | 1762 | thrd->req[1].mc_bus = thrd->req[0].mc_bus |
1775 | + pi->mcbufsz / 2; | 1763 | + pi->mcbufsz / 2; |
1776 | thrd->req[1].r = NULL; | 1764 | thrd->req[1].r = NULL; |
1777 | MARK_FREE(&thrd->req[1]); | 1765 | mark_free(thrd, 1); |
1778 | } | 1766 | } |
1779 | 1767 | ||
1780 | static int dmac_alloc_threads(struct pl330_dmac *pl330) | 1768 | static int dmac_alloc_threads(struct pl330_dmac *pl330) |
diff --git a/arch/arm/common/timer-sp.c b/arch/arm/common/timer-sp.c index 2393b5bc96f..8794a34eae6 100644 --- a/arch/arm/common/timer-sp.c +++ b/arch/arm/common/timer-sp.c | |||
@@ -143,7 +143,6 @@ static int sp804_set_next_event(unsigned long next, | |||
143 | } | 143 | } |
144 | 144 | ||
145 | static struct clock_event_device sp804_clockevent = { | 145 | static struct clock_event_device sp804_clockevent = { |
146 | .shift = 32, | ||
147 | .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, | 146 | .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, |
148 | .set_mode = sp804_set_mode, | 147 | .set_mode = sp804_set_mode, |
149 | .set_next_event = sp804_set_next_event, | 148 | .set_next_event = sp804_set_next_event, |
@@ -169,13 +168,9 @@ void __init sp804_clockevents_init(void __iomem *base, unsigned int irq, | |||
169 | 168 | ||
170 | clkevt_base = base; | 169 | clkevt_base = base; |
171 | clkevt_reload = DIV_ROUND_CLOSEST(rate, HZ); | 170 | clkevt_reload = DIV_ROUND_CLOSEST(rate, HZ); |
172 | |||
173 | evt->name = name; | 171 | evt->name = name; |
174 | evt->irq = irq; | 172 | evt->irq = irq; |
175 | evt->mult = div_sc(rate, NSEC_PER_SEC, evt->shift); | ||
176 | evt->max_delta_ns = clockevent_delta2ns(0xffffffff, evt); | ||
177 | evt->min_delta_ns = clockevent_delta2ns(0xf, evt); | ||
178 | 173 | ||
179 | setup_irq(irq, &sp804_timer_irq); | 174 | setup_irq(irq, &sp804_timer_irq); |
180 | clockevents_register_device(evt); | 175 | clockevents_config_and_register(evt, rate, 0xf, 0xffffffff); |
181 | } | 176 | } |
diff --git a/arch/arm/common/vic.c b/arch/arm/common/vic.c index 01f18a421b1..dcb004a804c 100644 --- a/arch/arm/common/vic.c +++ b/arch/arm/common/vic.c | |||
@@ -19,17 +19,22 @@ | |||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
20 | */ | 20 | */ |
21 | 21 | ||
22 | #include <linux/export.h> | ||
22 | #include <linux/init.h> | 23 | #include <linux/init.h> |
23 | #include <linux/list.h> | 24 | #include <linux/list.h> |
24 | #include <linux/io.h> | 25 | #include <linux/io.h> |
26 | #include <linux/irqdomain.h> | ||
27 | #include <linux/of.h> | ||
28 | #include <linux/of_address.h> | ||
29 | #include <linux/of_irq.h> | ||
25 | #include <linux/syscore_ops.h> | 30 | #include <linux/syscore_ops.h> |
26 | #include <linux/device.h> | 31 | #include <linux/device.h> |
27 | #include <linux/amba/bus.h> | 32 | #include <linux/amba/bus.h> |
28 | 33 | ||
34 | #include <asm/exception.h> | ||
29 | #include <asm/mach/irq.h> | 35 | #include <asm/mach/irq.h> |
30 | #include <asm/hardware/vic.h> | 36 | #include <asm/hardware/vic.h> |
31 | 37 | ||
32 | #ifdef CONFIG_PM | ||
33 | /** | 38 | /** |
34 | * struct vic_device - VIC PM device | 39 | * struct vic_device - VIC PM device |
35 | * @irq: The IRQ number for the base of the VIC. | 40 | * @irq: The IRQ number for the base of the VIC. |
@@ -40,6 +45,7 @@ | |||
40 | * @int_enable: Save for VIC_INT_ENABLE. | 45 | * @int_enable: Save for VIC_INT_ENABLE. |
41 | * @soft_int: Save for VIC_INT_SOFT. | 46 | * @soft_int: Save for VIC_INT_SOFT. |
42 | * @protect: Save for VIC_PROTECT. | 47 | * @protect: Save for VIC_PROTECT. |
48 | * @domain: The IRQ domain for the VIC. | ||
43 | */ | 49 | */ |
44 | struct vic_device { | 50 | struct vic_device { |
45 | void __iomem *base; | 51 | void __iomem *base; |
@@ -50,13 +56,13 @@ struct vic_device { | |||
50 | u32 int_enable; | 56 | u32 int_enable; |
51 | u32 soft_int; | 57 | u32 soft_int; |
52 | u32 protect; | 58 | u32 protect; |
59 | struct irq_domain domain; | ||
53 | }; | 60 | }; |
54 | 61 | ||
55 | /* we cannot allocate memory when VICs are initially registered */ | 62 | /* we cannot allocate memory when VICs are initially registered */ |
56 | static struct vic_device vic_devices[CONFIG_ARM_VIC_NR]; | 63 | static struct vic_device vic_devices[CONFIG_ARM_VIC_NR]; |
57 | 64 | ||
58 | static int vic_id; | 65 | static int vic_id; |
59 | #endif /* CONFIG_PM */ | ||
60 | 66 | ||
61 | /** | 67 | /** |
62 | * vic_init2 - common initialisation code | 68 | * vic_init2 - common initialisation code |
@@ -156,39 +162,50 @@ static int __init vic_pm_init(void) | |||
156 | return 0; | 162 | return 0; |
157 | } | 163 | } |
158 | late_initcall(vic_pm_init); | 164 | late_initcall(vic_pm_init); |
165 | #endif /* CONFIG_PM */ | ||
159 | 166 | ||
160 | /** | 167 | /** |
161 | * vic_pm_register - Register a VIC for later power management control | 168 | * vic_register() - Register a VIC. |
162 | * @base: The base address of the VIC. | 169 | * @base: The base address of the VIC. |
163 | * @irq: The base IRQ for the VIC. | 170 | * @irq: The base IRQ for the VIC. |
164 | * @resume_sources: bitmask of interrupts allowed for resume sources. | 171 | * @resume_sources: bitmask of interrupts allowed for resume sources. |
172 | * @node: The device tree node associated with the VIC. | ||
165 | * | 173 | * |
166 | * Register the VIC with the system device tree so that it can be notified | 174 | * Register the VIC with the system device tree so that it can be notified |
167 | * of suspend and resume requests and ensure that the correct actions are | 175 | * of suspend and resume requests and ensure that the correct actions are |
168 | * taken to re-instate the settings on resume. | 176 | * taken to re-instate the settings on resume. |
177 | * | ||
178 | * This also configures the IRQ domain for the VIC. | ||
169 | */ | 179 | */ |
170 | static void __init vic_pm_register(void __iomem *base, unsigned int irq, u32 resume_sources) | 180 | static void __init vic_register(void __iomem *base, unsigned int irq, |
181 | u32 resume_sources, struct device_node *node) | ||
171 | { | 182 | { |
172 | struct vic_device *v; | 183 | struct vic_device *v; |
173 | 184 | ||
174 | if (vic_id >= ARRAY_SIZE(vic_devices)) | 185 | if (vic_id >= ARRAY_SIZE(vic_devices)) { |
175 | printk(KERN_ERR "%s: too few VICs, increase CONFIG_ARM_VIC_NR\n", __func__); | 186 | printk(KERN_ERR "%s: too few VICs, increase CONFIG_ARM_VIC_NR\n", __func__); |
176 | else { | 187 | return; |
177 | v = &vic_devices[vic_id]; | ||
178 | v->base = base; | ||
179 | v->resume_sources = resume_sources; | ||
180 | v->irq = irq; | ||
181 | vic_id++; | ||
182 | } | 188 | } |
189 | |||
190 | v = &vic_devices[vic_id]; | ||
191 | v->base = base; | ||
192 | v->resume_sources = resume_sources; | ||
193 | v->irq = irq; | ||
194 | vic_id++; | ||
195 | |||
196 | v->domain.irq_base = irq; | ||
197 | v->domain.nr_irq = 32; | ||
198 | #ifdef CONFIG_OF_IRQ | ||
199 | v->domain.of_node = of_node_get(node); | ||
200 | #endif /* CONFIG_OF */ | ||
201 | v->domain.ops = &irq_domain_simple_ops; | ||
202 | irq_domain_add(&v->domain); | ||
183 | } | 203 | } |
184 | #else | ||
185 | static inline void vic_pm_register(void __iomem *base, unsigned int irq, u32 arg1) { } | ||
186 | #endif /* CONFIG_PM */ | ||
187 | 204 | ||
188 | static void vic_ack_irq(struct irq_data *d) | 205 | static void vic_ack_irq(struct irq_data *d) |
189 | { | 206 | { |
190 | void __iomem *base = irq_data_get_irq_chip_data(d); | 207 | void __iomem *base = irq_data_get_irq_chip_data(d); |
191 | unsigned int irq = d->irq & 31; | 208 | unsigned int irq = d->hwirq; |
192 | writel(1 << irq, base + VIC_INT_ENABLE_CLEAR); | 209 | writel(1 << irq, base + VIC_INT_ENABLE_CLEAR); |
193 | /* moreover, clear the soft-triggered, in case it was the reason */ | 210 | /* moreover, clear the soft-triggered, in case it was the reason */ |
194 | writel(1 << irq, base + VIC_INT_SOFT_CLEAR); | 211 | writel(1 << irq, base + VIC_INT_SOFT_CLEAR); |
@@ -197,14 +214,14 @@ static void vic_ack_irq(struct irq_data *d) | |||
197 | static void vic_mask_irq(struct irq_data *d) | 214 | static void vic_mask_irq(struct irq_data *d) |
198 | { | 215 | { |
199 | void __iomem *base = irq_data_get_irq_chip_data(d); | 216 | void __iomem *base = irq_data_get_irq_chip_data(d); |
200 | unsigned int irq = d->irq & 31; | 217 | unsigned int irq = d->hwirq; |
201 | writel(1 << irq, base + VIC_INT_ENABLE_CLEAR); | 218 | writel(1 << irq, base + VIC_INT_ENABLE_CLEAR); |
202 | } | 219 | } |
203 | 220 | ||
204 | static void vic_unmask_irq(struct irq_data *d) | 221 | static void vic_unmask_irq(struct irq_data *d) |
205 | { | 222 | { |
206 | void __iomem *base = irq_data_get_irq_chip_data(d); | 223 | void __iomem *base = irq_data_get_irq_chip_data(d); |
207 | unsigned int irq = d->irq & 31; | 224 | unsigned int irq = d->hwirq; |
208 | writel(1 << irq, base + VIC_INT_ENABLE); | 225 | writel(1 << irq, base + VIC_INT_ENABLE); |
209 | } | 226 | } |
210 | 227 | ||
@@ -226,7 +243,7 @@ static struct vic_device *vic_from_irq(unsigned int irq) | |||
226 | static int vic_set_wake(struct irq_data *d, unsigned int on) | 243 | static int vic_set_wake(struct irq_data *d, unsigned int on) |
227 | { | 244 | { |
228 | struct vic_device *v = vic_from_irq(d->irq); | 245 | struct vic_device *v = vic_from_irq(d->irq); |
229 | unsigned int off = d->irq & 31; | 246 | unsigned int off = d->hwirq; |
230 | u32 bit = 1 << off; | 247 | u32 bit = 1 << off; |
231 | 248 | ||
232 | if (!v) | 249 | if (!v) |
@@ -301,7 +318,7 @@ static void __init vic_set_irq_sources(void __iomem *base, | |||
301 | * and 020 within the page. We call this "second block". | 318 | * and 020 within the page. We call this "second block". |
302 | */ | 319 | */ |
303 | static void __init vic_init_st(void __iomem *base, unsigned int irq_start, | 320 | static void __init vic_init_st(void __iomem *base, unsigned int irq_start, |
304 | u32 vic_sources) | 321 | u32 vic_sources, struct device_node *node) |
305 | { | 322 | { |
306 | unsigned int i; | 323 | unsigned int i; |
307 | int vic_2nd_block = ((unsigned long)base & ~PAGE_MASK) != 0; | 324 | int vic_2nd_block = ((unsigned long)base & ~PAGE_MASK) != 0; |
@@ -328,17 +345,12 @@ static void __init vic_init_st(void __iomem *base, unsigned int irq_start, | |||
328 | } | 345 | } |
329 | 346 | ||
330 | vic_set_irq_sources(base, irq_start, vic_sources); | 347 | vic_set_irq_sources(base, irq_start, vic_sources); |
348 | vic_register(base, irq_start, 0, node); | ||
331 | } | 349 | } |
332 | 350 | ||
333 | /** | 351 | static void __init __vic_init(void __iomem *base, unsigned int irq_start, |
334 | * vic_init - initialise a vectored interrupt controller | 352 | u32 vic_sources, u32 resume_sources, |
335 | * @base: iomem base address | 353 | struct device_node *node) |
336 | * @irq_start: starting interrupt number, must be muliple of 32 | ||
337 | * @vic_sources: bitmask of interrupt sources to allow | ||
338 | * @resume_sources: bitmask of interrupt sources to allow for resume | ||
339 | */ | ||
340 | void __init vic_init(void __iomem *base, unsigned int irq_start, | ||
341 | u32 vic_sources, u32 resume_sources) | ||
342 | { | 354 | { |
343 | unsigned int i; | 355 | unsigned int i; |
344 | u32 cellid = 0; | 356 | u32 cellid = 0; |
@@ -356,7 +368,7 @@ void __init vic_init(void __iomem *base, unsigned int irq_start, | |||
356 | 368 | ||
357 | switch(vendor) { | 369 | switch(vendor) { |
358 | case AMBA_VENDOR_ST: | 370 | case AMBA_VENDOR_ST: |
359 | vic_init_st(base, irq_start, vic_sources); | 371 | vic_init_st(base, irq_start, vic_sources, node); |
360 | return; | 372 | return; |
361 | default: | 373 | default: |
362 | printk(KERN_WARNING "VIC: unknown vendor, continuing anyways\n"); | 374 | printk(KERN_WARNING "VIC: unknown vendor, continuing anyways\n"); |
@@ -375,5 +387,81 @@ void __init vic_init(void __iomem *base, unsigned int irq_start, | |||
375 | 387 | ||
376 | vic_set_irq_sources(base, irq_start, vic_sources); | 388 | vic_set_irq_sources(base, irq_start, vic_sources); |
377 | 389 | ||
378 | vic_pm_register(base, irq_start, resume_sources); | 390 | vic_register(base, irq_start, resume_sources, node); |
391 | } | ||
392 | |||
393 | /** | ||
394 | * vic_init() - initialise a vectored interrupt controller | ||
395 | * @base: iomem base address | ||
396 | * @irq_start: starting interrupt number, must be muliple of 32 | ||
397 | * @vic_sources: bitmask of interrupt sources to allow | ||
398 | * @resume_sources: bitmask of interrupt sources to allow for resume | ||
399 | */ | ||
400 | void __init vic_init(void __iomem *base, unsigned int irq_start, | ||
401 | u32 vic_sources, u32 resume_sources) | ||
402 | { | ||
403 | __vic_init(base, irq_start, vic_sources, resume_sources, NULL); | ||
404 | } | ||
405 | |||
406 | #ifdef CONFIG_OF | ||
407 | int __init vic_of_init(struct device_node *node, struct device_node *parent) | ||
408 | { | ||
409 | void __iomem *regs; | ||
410 | int irq_base; | ||
411 | |||
412 | if (WARN(parent, "non-root VICs are not supported")) | ||
413 | return -EINVAL; | ||
414 | |||
415 | regs = of_iomap(node, 0); | ||
416 | if (WARN_ON(!regs)) | ||
417 | return -EIO; | ||
418 | |||
419 | irq_base = irq_alloc_descs(-1, 0, 32, numa_node_id()); | ||
420 | if (WARN_ON(irq_base < 0)) | ||
421 | goto out_unmap; | ||
422 | |||
423 | __vic_init(regs, irq_base, ~0, ~0, node); | ||
424 | |||
425 | return 0; | ||
426 | |||
427 | out_unmap: | ||
428 | iounmap(regs); | ||
429 | |||
430 | return -EIO; | ||
431 | } | ||
432 | #endif /* CONFIG OF */ | ||
433 | |||
434 | /* | ||
435 | * Handle each interrupt in a single VIC. Returns non-zero if we've | ||
436 | * handled at least one interrupt. This does a single read of the | ||
437 | * status register and handles all interrupts in order from LSB first. | ||
438 | */ | ||
439 | static int handle_one_vic(struct vic_device *vic, struct pt_regs *regs) | ||
440 | { | ||
441 | u32 stat, irq; | ||
442 | int handled = 0; | ||
443 | |||
444 | stat = readl_relaxed(vic->base + VIC_IRQ_STATUS); | ||
445 | while (stat) { | ||
446 | irq = ffs(stat) - 1; | ||
447 | handle_IRQ(irq_domain_to_irq(&vic->domain, irq), regs); | ||
448 | stat &= ~(1 << irq); | ||
449 | handled = 1; | ||
450 | } | ||
451 | |||
452 | return handled; | ||
453 | } | ||
454 | |||
455 | /* | ||
456 | * Keep iterating over all registered VIC's until there are no pending | ||
457 | * interrupts. | ||
458 | */ | ||
459 | asmlinkage void __exception_irq_entry vic_handle_irq(struct pt_regs *regs) | ||
460 | { | ||
461 | int i, handled; | ||
462 | |||
463 | do { | ||
464 | for (i = 0, handled = 0; i < vic_id; ++i) | ||
465 | handled |= handle_one_vic(&vic_devices[i], regs); | ||
466 | } while (handled); | ||
379 | } | 467 | } |
diff --git a/arch/arm/configs/imx_v4_v5_defconfig b/arch/arm/configs/imx_v4_v5_defconfig index 11a4192197c..cf497ce41df 100644 --- a/arch/arm/configs/imx_v4_v5_defconfig +++ b/arch/arm/configs/imx_v4_v5_defconfig | |||
@@ -18,9 +18,10 @@ CONFIG_ARCH_MXC=y | |||
18 | CONFIG_ARCH_IMX_V4_V5=y | 18 | CONFIG_ARCH_IMX_V4_V5=y |
19 | CONFIG_ARCH_MX1ADS=y | 19 | CONFIG_ARCH_MX1ADS=y |
20 | CONFIG_MACH_SCB9328=y | 20 | CONFIG_MACH_SCB9328=y |
21 | CONFIG_MACH_APF9328=y | ||
21 | CONFIG_MACH_MX21ADS=y | 22 | CONFIG_MACH_MX21ADS=y |
22 | CONFIG_MACH_MX25_3DS=y | 23 | CONFIG_MACH_MX25_3DS=y |
23 | CONFIG_MACH_EUKREA_CPUIMX25=y | 24 | CONFIG_MACH_EUKREA_CPUIMX25SD=y |
24 | CONFIG_MACH_MX27ADS=y | 25 | CONFIG_MACH_MX27ADS=y |
25 | CONFIG_MACH_PCM038=y | 26 | CONFIG_MACH_PCM038=y |
26 | CONFIG_MACH_CPUIMX27=y | 27 | CONFIG_MACH_CPUIMX27=y |
@@ -72,17 +73,16 @@ CONFIG_MTD_CFI_GEOMETRY=y | |||
72 | CONFIG_MTD_CFI_INTELEXT=y | 73 | CONFIG_MTD_CFI_INTELEXT=y |
73 | CONFIG_MTD_PHYSMAP=y | 74 | CONFIG_MTD_PHYSMAP=y |
74 | CONFIG_MTD_NAND=y | 75 | CONFIG_MTD_NAND=y |
76 | CONFIG_MTD_NAND_MXC=y | ||
75 | CONFIG_MTD_UBI=y | 77 | CONFIG_MTD_UBI=y |
76 | CONFIG_MISC_DEVICES=y | 78 | CONFIG_MISC_DEVICES=y |
77 | CONFIG_EEPROM_AT24=y | 79 | CONFIG_EEPROM_AT24=y |
78 | CONFIG_EEPROM_AT25=y | 80 | CONFIG_EEPROM_AT25=y |
79 | CONFIG_NETDEVICES=y | 81 | CONFIG_NETDEVICES=y |
80 | CONFIG_NET_ETHERNET=y | ||
81 | CONFIG_SMC91X=y | ||
82 | CONFIG_DM9000=y | 82 | CONFIG_DM9000=y |
83 | CONFIG_SMC91X=y | ||
83 | CONFIG_SMC911X=y | 84 | CONFIG_SMC911X=y |
84 | # CONFIG_NETDEV_1000 is not set | 85 | CONFIG_SMSC_PHY=y |
85 | # CONFIG_NETDEV_10000 is not set | ||
86 | # CONFIG_INPUT_MOUSEDEV is not set | 86 | # CONFIG_INPUT_MOUSEDEV is not set |
87 | CONFIG_INPUT_EVDEV=y | 87 | CONFIG_INPUT_EVDEV=y |
88 | # CONFIG_INPUT_KEYBOARD is not set | 88 | # CONFIG_INPUT_KEYBOARD is not set |
@@ -100,6 +100,7 @@ CONFIG_I2C_CHARDEV=y | |||
100 | CONFIG_I2C_IMX=y | 100 | CONFIG_I2C_IMX=y |
101 | CONFIG_SPI=y | 101 | CONFIG_SPI=y |
102 | CONFIG_SPI_IMX=y | 102 | CONFIG_SPI_IMX=y |
103 | CONFIG_SPI_SPIDEV=y | ||
103 | CONFIG_W1=y | 104 | CONFIG_W1=y |
104 | CONFIG_W1_MASTER_MXC=y | 105 | CONFIG_W1_MASTER_MXC=y |
105 | CONFIG_W1_SLAVE_THERM=y | 106 | CONFIG_W1_SLAVE_THERM=y |
@@ -139,6 +140,7 @@ CONFIG_MMC=y | |||
139 | CONFIG_MMC_MXC=y | 140 | CONFIG_MMC_MXC=y |
140 | CONFIG_NEW_LEDS=y | 141 | CONFIG_NEW_LEDS=y |
141 | CONFIG_LEDS_CLASS=y | 142 | CONFIG_LEDS_CLASS=y |
143 | CONFIG_LEDS_GPIO=y | ||
142 | CONFIG_LEDS_MC13783=y | 144 | CONFIG_LEDS_MC13783=y |
143 | CONFIG_LEDS_TRIGGERS=y | 145 | CONFIG_LEDS_TRIGGERS=y |
144 | CONFIG_LEDS_TRIGGER_TIMER=y | 146 | CONFIG_LEDS_TRIGGER_TIMER=y |
diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h index 29035e86a59..b6e65dedfd7 100644 --- a/arch/arm/include/asm/assembler.h +++ b/arch/arm/include/asm/assembler.h | |||
@@ -187,6 +187,17 @@ | |||
187 | #endif | 187 | #endif |
188 | 188 | ||
189 | /* | 189 | /* |
190 | * Instruction barrier | ||
191 | */ | ||
192 | .macro instr_sync | ||
193 | #if __LINUX_ARM_ARCH__ >= 7 | ||
194 | isb | ||
195 | #elif __LINUX_ARM_ARCH__ == 6 | ||
196 | mcr p15, 0, r0, c7, c5, 4 | ||
197 | #endif | ||
198 | .endm | ||
199 | |||
200 | /* | ||
190 | * SMP data memory barrier | 201 | * SMP data memory barrier |
191 | */ | 202 | */ |
192 | .macro smp_dmb mode | 203 | .macro smp_dmb mode |
diff --git a/arch/arm/include/asm/bug.h b/arch/arm/include/asm/bug.h index 9abe7a07d5a..fac79dceb73 100644 --- a/arch/arm/include/asm/bug.h +++ b/arch/arm/include/asm/bug.h | |||
@@ -32,7 +32,6 @@ | |||
32 | 32 | ||
33 | #define __BUG(__file, __line, __value) \ | 33 | #define __BUG(__file, __line, __value) \ |
34 | do { \ | 34 | do { \ |
35 | BUILD_BUG_ON(sizeof(struct bug_entry) != 12); \ | ||
36 | asm volatile("1:\t" BUG_INSTR_TYPE #__value "\n" \ | 35 | asm volatile("1:\t" BUG_INSTR_TYPE #__value "\n" \ |
37 | ".pushsection .rodata.str, \"aMS\", %progbits, 1\n" \ | 36 | ".pushsection .rodata.str, \"aMS\", %progbits, 1\n" \ |
38 | "2:\t.asciz " #__file "\n" \ | 37 | "2:\t.asciz " #__file "\n" \ |
diff --git a/arch/arm/include/asm/cti.h b/arch/arm/include/asm/cti.h new file mode 100644 index 00000000000..a0ada3ea435 --- /dev/null +++ b/arch/arm/include/asm/cti.h | |||
@@ -0,0 +1,179 @@ | |||
1 | #ifndef __ASMARM_CTI_H | ||
2 | #define __ASMARM_CTI_H | ||
3 | |||
4 | #include <asm/io.h> | ||
5 | |||
6 | /* The registers' definition is from section 3.2 of | ||
7 | * Embedded Cross Trigger Revision: r0p0 | ||
8 | */ | ||
9 | #define CTICONTROL 0x000 | ||
10 | #define CTISTATUS 0x004 | ||
11 | #define CTILOCK 0x008 | ||
12 | #define CTIPROTECTION 0x00C | ||
13 | #define CTIINTACK 0x010 | ||
14 | #define CTIAPPSET 0x014 | ||
15 | #define CTIAPPCLEAR 0x018 | ||
16 | #define CTIAPPPULSE 0x01c | ||
17 | #define CTIINEN 0x020 | ||
18 | #define CTIOUTEN 0x0A0 | ||
19 | #define CTITRIGINSTATUS 0x130 | ||
20 | #define CTITRIGOUTSTATUS 0x134 | ||
21 | #define CTICHINSTATUS 0x138 | ||
22 | #define CTICHOUTSTATUS 0x13c | ||
23 | #define CTIPERIPHID0 0xFE0 | ||
24 | #define CTIPERIPHID1 0xFE4 | ||
25 | #define CTIPERIPHID2 0xFE8 | ||
26 | #define CTIPERIPHID3 0xFEC | ||
27 | #define CTIPCELLID0 0xFF0 | ||
28 | #define CTIPCELLID1 0xFF4 | ||
29 | #define CTIPCELLID2 0xFF8 | ||
30 | #define CTIPCELLID3 0xFFC | ||
31 | |||
32 | /* The below are from section 3.6.4 of | ||
33 | * CoreSight v1.0 Architecture Specification | ||
34 | */ | ||
35 | #define LOCKACCESS 0xFB0 | ||
36 | #define LOCKSTATUS 0xFB4 | ||
37 | |||
38 | /* write this value to LOCKACCESS will unlock the module, and | ||
39 | * other value will lock the module | ||
40 | */ | ||
41 | #define LOCKCODE 0xC5ACCE55 | ||
42 | |||
43 | /** | ||
44 | * struct cti - cross trigger interface struct | ||
45 | * @base: mapped virtual address for the cti base | ||
46 | * @irq: irq number for the cti | ||
47 | * @trig_out_for_irq: triger out number which will cause | ||
48 | * the @irq happen | ||
49 | * | ||
50 | * cti struct used to operate cti registers. | ||
51 | */ | ||
52 | struct cti { | ||
53 | void __iomem *base; | ||
54 | int irq; | ||
55 | int trig_out_for_irq; | ||
56 | }; | ||
57 | |||
58 | /** | ||
59 | * cti_init - initialize the cti instance | ||
60 | * @cti: cti instance | ||
61 | * @base: mapped virtual address for the cti base | ||
62 | * @irq: irq number for the cti | ||
63 | * @trig_out: triger out number which will cause | ||
64 | * the @irq happen | ||
65 | * | ||
66 | * called by machine code to pass the board dependent | ||
67 | * @base, @irq and @trig_out to cti. | ||
68 | */ | ||
69 | static inline void cti_init(struct cti *cti, | ||
70 | void __iomem *base, int irq, int trig_out) | ||
71 | { | ||
72 | cti->base = base; | ||
73 | cti->irq = irq; | ||
74 | cti->trig_out_for_irq = trig_out; | ||
75 | } | ||
76 | |||
77 | /** | ||
78 | * cti_map_trigger - use the @chan to map @trig_in to @trig_out | ||
79 | * @cti: cti instance | ||
80 | * @trig_in: trigger in number | ||
81 | * @trig_out: trigger out number | ||
82 | * @channel: channel number | ||
83 | * | ||
84 | * This function maps one trigger in of @trig_in to one trigger | ||
85 | * out of @trig_out using the channel @chan. | ||
86 | */ | ||
87 | static inline void cti_map_trigger(struct cti *cti, | ||
88 | int trig_in, int trig_out, int chan) | ||
89 | { | ||
90 | void __iomem *base = cti->base; | ||
91 | unsigned long val; | ||
92 | |||
93 | val = __raw_readl(base + CTIINEN + trig_in * 4); | ||
94 | val |= BIT(chan); | ||
95 | __raw_writel(val, base + CTIINEN + trig_in * 4); | ||
96 | |||
97 | val = __raw_readl(base + CTIOUTEN + trig_out * 4); | ||
98 | val |= BIT(chan); | ||
99 | __raw_writel(val, base + CTIOUTEN + trig_out * 4); | ||
100 | } | ||
101 | |||
102 | /** | ||
103 | * cti_enable - enable the cti module | ||
104 | * @cti: cti instance | ||
105 | * | ||
106 | * enable the cti module | ||
107 | */ | ||
108 | static inline void cti_enable(struct cti *cti) | ||
109 | { | ||
110 | __raw_writel(0x1, cti->base + CTICONTROL); | ||
111 | } | ||
112 | |||
113 | /** | ||
114 | * cti_disable - disable the cti module | ||
115 | * @cti: cti instance | ||
116 | * | ||
117 | * enable the cti module | ||
118 | */ | ||
119 | static inline void cti_disable(struct cti *cti) | ||
120 | { | ||
121 | __raw_writel(0, cti->base + CTICONTROL); | ||
122 | } | ||
123 | |||
124 | /** | ||
125 | * cti_irq_ack - clear the cti irq | ||
126 | * @cti: cti instance | ||
127 | * | ||
128 | * clear the cti irq | ||
129 | */ | ||
130 | static inline void cti_irq_ack(struct cti *cti) | ||
131 | { | ||
132 | void __iomem *base = cti->base; | ||
133 | unsigned long val; | ||
134 | |||
135 | val = __raw_readl(base + CTIINTACK); | ||
136 | val |= BIT(cti->trig_out_for_irq); | ||
137 | __raw_writel(val, base + CTIINTACK); | ||
138 | } | ||
139 | |||
140 | /** | ||
141 | * cti_unlock - unlock cti module | ||
142 | * @cti: cti instance | ||
143 | * | ||
144 | * unlock the cti module, or else any writes to the cti | ||
145 | * module is not allowed. | ||
146 | */ | ||
147 | static inline void cti_unlock(struct cti *cti) | ||
148 | { | ||
149 | void __iomem *base = cti->base; | ||
150 | unsigned long val; | ||
151 | |||
152 | val = __raw_readl(base + LOCKSTATUS); | ||
153 | |||
154 | if (val & 1) { | ||
155 | val = LOCKCODE; | ||
156 | __raw_writel(val, base + LOCKACCESS); | ||
157 | } | ||
158 | } | ||
159 | |||
160 | /** | ||
161 | * cti_lock - lock cti module | ||
162 | * @cti: cti instance | ||
163 | * | ||
164 | * lock the cti module, so any writes to the cti | ||
165 | * module will be not allowed. | ||
166 | */ | ||
167 | static inline void cti_lock(struct cti *cti) | ||
168 | { | ||
169 | void __iomem *base = cti->base; | ||
170 | unsigned long val; | ||
171 | |||
172 | val = __raw_readl(base + LOCKSTATUS); | ||
173 | |||
174 | if (!(val & 1)) { | ||
175 | val = ~LOCKCODE; | ||
176 | __raw_writel(val, base + LOCKACCESS); | ||
177 | } | ||
178 | } | ||
179 | #endif | ||
diff --git a/arch/arm/include/asm/edac.h b/arch/arm/include/asm/edac.h new file mode 100644 index 00000000000..0df7a2c1fc3 --- /dev/null +++ b/arch/arm/include/asm/edac.h | |||
@@ -0,0 +1,48 @@ | |||
1 | /* | ||
2 | * Copyright 2011 Calxeda, Inc. | ||
3 | * Based on PPC version Copyright 2007 MontaVista Software, Inc. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms and conditions of the GNU General Public License, | ||
7 | * version 2, as published by the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
12 | * more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License along with | ||
15 | * this program. If not, see <http://www.gnu.org/licenses/>. | ||
16 | */ | ||
17 | #ifndef ASM_EDAC_H | ||
18 | #define ASM_EDAC_H | ||
19 | /* | ||
20 | * ECC atomic, DMA, SMP and interrupt safe scrub function. | ||
21 | * Implements the per arch atomic_scrub() that EDAC use for software | ||
22 | * ECC scrubbing. It reads memory and then writes back the original | ||
23 | * value, allowing the hardware to detect and correct memory errors. | ||
24 | */ | ||
25 | static inline void atomic_scrub(void *va, u32 size) | ||
26 | { | ||
27 | #if __LINUX_ARM_ARCH__ >= 6 | ||
28 | unsigned int *virt_addr = va; | ||
29 | unsigned int temp, temp2; | ||
30 | unsigned int i; | ||
31 | |||
32 | for (i = 0; i < size / sizeof(*virt_addr); i++, virt_addr++) { | ||
33 | /* Very carefully read and write to memory atomically | ||
34 | * so we are interrupt, DMA and SMP safe. | ||
35 | */ | ||
36 | __asm__ __volatile__("\n" | ||
37 | "1: ldrex %0, [%2]\n" | ||
38 | " strex %1, %0, [%2]\n" | ||
39 | " teq %1, #0\n" | ||
40 | " bne 1b\n" | ||
41 | : "=&r"(temp), "=&r"(temp2) | ||
42 | : "r"(virt_addr) | ||
43 | : "cc"); | ||
44 | } | ||
45 | #endif | ||
46 | } | ||
47 | |||
48 | #endif | ||
diff --git a/arch/arm/include/asm/entry-macro-vic2.S b/arch/arm/include/asm/entry-macro-vic2.S deleted file mode 100644 index 3ceb85e4385..00000000000 --- a/arch/arm/include/asm/entry-macro-vic2.S +++ /dev/null | |||
@@ -1,57 +0,0 @@ | |||
1 | /* arch/arm/include/asm/entry-macro-vic2.S | ||
2 | * | ||
3 | * Originally arch/arm/mach-s3c6400/include/mach/entry-macro.S | ||
4 | * | ||
5 | * Copyright 2008 Openmoko, Inc. | ||
6 | * Copyright 2008 Simtec Electronics | ||
7 | * http://armlinux.simtec.co.uk/ | ||
8 | * Ben Dooks <ben@simtec.co.uk> | ||
9 | * | ||
10 | * Low-level IRQ helper macros for a device with two VICs | ||
11 | * | ||
12 | * This file is licensed under the terms of the GNU General Public | ||
13 | * License version 2. This program is licensed "as is" without any | ||
14 | * warranty of any kind, whether express or implied. | ||
15 | */ | ||
16 | |||
17 | /* This should be included from <mach/entry-macro.S> with the necessary | ||
18 | * defines for virtual addresses and IRQ bases for the two vics. | ||
19 | * | ||
20 | * The code needs the following defined: | ||
21 | * IRQ_VIC0_BASE IRQ number of VIC0's first IRQ | ||
22 | * IRQ_VIC1_BASE IRQ number of VIC1's first IRQ | ||
23 | * VA_VIC0 Virtual address of VIC0 | ||
24 | * VA_VIC1 Virtual address of VIC1 | ||
25 | * | ||
26 | * Note, code assumes VIC0's virtual address is an ARM immediate constant | ||
27 | * away from VIC1. | ||
28 | */ | ||
29 | |||
30 | #include <asm/hardware/vic.h> | ||
31 | |||
32 | .macro disable_fiq | ||
33 | .endm | ||
34 | |||
35 | .macro get_irqnr_preamble, base, tmp | ||
36 | ldr \base, =VA_VIC0 | ||
37 | .endm | ||
38 | |||
39 | .macro arch_ret_to_user, tmp1, tmp2 | ||
40 | .endm | ||
41 | |||
42 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
43 | |||
44 | @ check the vic0 | ||
45 | mov \irqnr, #IRQ_VIC0_BASE + 31 | ||
46 | ldr \irqstat, [ \base, # VIC_IRQ_STATUS ] | ||
47 | teq \irqstat, #0 | ||
48 | |||
49 | @ otherwise try vic1 | ||
50 | addeq \tmp, \base, #(VA_VIC1 - VA_VIC0) | ||
51 | addeq \irqnr, \irqnr, #(IRQ_VIC1_BASE - IRQ_VIC0_BASE) | ||
52 | ldreq \irqstat, [ \tmp, # VIC_IRQ_STATUS ] | ||
53 | teqeq \irqstat, #0 | ||
54 | |||
55 | clzne \irqstat, \irqstat | ||
56 | subne \irqnr, \irqnr, \irqstat | ||
57 | .endm | ||
diff --git a/arch/arm/include/asm/gpio.h b/arch/arm/include/asm/gpio.h index 11ad0bfbb0a..7151753b098 100644 --- a/arch/arm/include/asm/gpio.h +++ b/arch/arm/include/asm/gpio.h | |||
@@ -1,6 +1,10 @@ | |||
1 | #ifndef _ARCH_ARM_GPIO_H | 1 | #ifndef _ARCH_ARM_GPIO_H |
2 | #define _ARCH_ARM_GPIO_H | 2 | #define _ARCH_ARM_GPIO_H |
3 | 3 | ||
4 | #if CONFIG_ARCH_NR_GPIO > 0 | ||
5 | #define ARCH_NR_GPIO CONFIG_ARCH_NR_GPIO | ||
6 | #endif | ||
7 | |||
4 | /* not all ARM platforms necessarily support this API ... */ | 8 | /* not all ARM platforms necessarily support this API ... */ |
5 | #include <mach/gpio.h> | 9 | #include <mach/gpio.h> |
6 | 10 | ||
diff --git a/arch/arm/include/asm/hardirq.h b/arch/arm/include/asm/hardirq.h index ddf07a92a6c..436e60b2cf7 100644 --- a/arch/arm/include/asm/hardirq.h +++ b/arch/arm/include/asm/hardirq.h | |||
@@ -27,23 +27,6 @@ u64 smp_irq_stat_cpu(unsigned int cpu); | |||
27 | 27 | ||
28 | #define arch_irq_stat_cpu smp_irq_stat_cpu | 28 | #define arch_irq_stat_cpu smp_irq_stat_cpu |
29 | 29 | ||
30 | #if NR_IRQS > 512 | ||
31 | #define HARDIRQ_BITS 10 | ||
32 | #elif NR_IRQS > 256 | ||
33 | #define HARDIRQ_BITS 9 | ||
34 | #else | ||
35 | #define HARDIRQ_BITS 8 | ||
36 | #endif | ||
37 | |||
38 | /* | ||
39 | * The hardirq mask has to be large enough to have space | ||
40 | * for potentially all IRQ sources in the system nesting | ||
41 | * on a single CPU: | ||
42 | */ | ||
43 | #if (1 << HARDIRQ_BITS) < NR_IRQS | ||
44 | # error HARDIRQ_BITS is too low! | ||
45 | #endif | ||
46 | |||
47 | #define __ARCH_IRQ_EXIT_IRQS_DISABLED 1 | 30 | #define __ARCH_IRQ_EXIT_IRQS_DISABLED 1 |
48 | 31 | ||
49 | #endif /* __ASM_HARDIRQ_H */ | 32 | #endif /* __ASM_HARDIRQ_H */ |
diff --git a/arch/arm/include/asm/hardware/entry-macro-gic.S b/arch/arm/include/asm/hardware/entry-macro-gic.S deleted file mode 100644 index 74ebc803904..00000000000 --- a/arch/arm/include/asm/hardware/entry-macro-gic.S +++ /dev/null | |||
@@ -1,60 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/include/asm/hardware/entry-macro-gic.S | ||
3 | * | ||
4 | * Low-level IRQ helper macros for GIC | ||
5 | * | ||
6 | * This file is licensed under the terms of the GNU General Public | ||
7 | * License version 2. This program is licensed "as is" without any | ||
8 | * warranty of any kind, whether express or implied. | ||
9 | */ | ||
10 | |||
11 | #include <asm/hardware/gic.h> | ||
12 | |||
13 | #ifndef HAVE_GET_IRQNR_PREAMBLE | ||
14 | .macro get_irqnr_preamble, base, tmp | ||
15 | ldr \base, =gic_cpu_base_addr | ||
16 | ldr \base, [\base] | ||
17 | .endm | ||
18 | #endif | ||
19 | |||
20 | /* | ||
21 | * The interrupt numbering scheme is defined in the | ||
22 | * interrupt controller spec. To wit: | ||
23 | * | ||
24 | * Interrupts 0-15 are IPI | ||
25 | * 16-31 are local. We allow 30 to be used for the watchdog. | ||
26 | * 32-1020 are global | ||
27 | * 1021-1022 are reserved | ||
28 | * 1023 is "spurious" (no interrupt) | ||
29 | * | ||
30 | * A simple read from the controller will tell us the number of the highest | ||
31 | * priority enabled interrupt. We then just need to check whether it is in the | ||
32 | * valid range for an IRQ (30-1020 inclusive). | ||
33 | */ | ||
34 | |||
35 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
36 | |||
37 | ldr \irqstat, [\base, #GIC_CPU_INTACK] | ||
38 | /* bits 12-10 = src CPU, 9-0 = int # */ | ||
39 | |||
40 | ldr \tmp, =1021 | ||
41 | bic \irqnr, \irqstat, #0x1c00 | ||
42 | cmp \irqnr, #15 | ||
43 | cmpcc \irqnr, \irqnr | ||
44 | cmpne \irqnr, \tmp | ||
45 | cmpcs \irqnr, \irqnr | ||
46 | .endm | ||
47 | |||
48 | /* We assume that irqstat (the raw value of the IRQ acknowledge | ||
49 | * register) is preserved from the macro above. | ||
50 | * If there is an IPI, we immediately signal end of interrupt on the | ||
51 | * controller, since this requires the original irqstat value which | ||
52 | * we won't easily be able to recreate later. | ||
53 | */ | ||
54 | |||
55 | .macro test_for_ipi, irqnr, irqstat, base, tmp | ||
56 | bic \irqnr, \irqstat, #0x1c00 | ||
57 | cmp \irqnr, #16 | ||
58 | strcc \irqstat, [\base, #GIC_CPU_EOI] | ||
59 | cmpcs \irqnr, \irqnr | ||
60 | .endm | ||
diff --git a/arch/arm/include/asm/hardware/gic.h b/arch/arm/include/asm/hardware/gic.h index 3e91f22046f..4bdfe001869 100644 --- a/arch/arm/include/asm/hardware/gic.h +++ b/arch/arm/include/asm/hardware/gic.h | |||
@@ -36,30 +36,22 @@ | |||
36 | #include <linux/irqdomain.h> | 36 | #include <linux/irqdomain.h> |
37 | struct device_node; | 37 | struct device_node; |
38 | 38 | ||
39 | extern void __iomem *gic_cpu_base_addr; | ||
40 | extern struct irq_chip gic_arch_extn; | 39 | extern struct irq_chip gic_arch_extn; |
41 | 40 | ||
42 | void gic_init(unsigned int, int, void __iomem *, void __iomem *); | 41 | void gic_init_bases(unsigned int, int, void __iomem *, void __iomem *, |
42 | u32 offset); | ||
43 | int gic_of_init(struct device_node *node, struct device_node *parent); | 43 | int gic_of_init(struct device_node *node, struct device_node *parent); |
44 | void gic_secondary_init(unsigned int); | 44 | void gic_secondary_init(unsigned int); |
45 | void gic_handle_irq(struct pt_regs *regs); | ||
45 | void gic_cascade_irq(unsigned int gic_nr, unsigned int irq); | 46 | void gic_cascade_irq(unsigned int gic_nr, unsigned int irq); |
46 | void gic_raise_softirq(const struct cpumask *mask, unsigned int irq); | 47 | void gic_raise_softirq(const struct cpumask *mask, unsigned int irq); |
47 | 48 | ||
48 | struct gic_chip_data { | 49 | static inline void gic_init(unsigned int nr, int start, |
49 | void __iomem *dist_base; | 50 | void __iomem *dist , void __iomem *cpu) |
50 | void __iomem *cpu_base; | 51 | { |
51 | #ifdef CONFIG_CPU_PM | 52 | gic_init_bases(nr, start, dist, cpu, 0); |
52 | u32 saved_spi_enable[DIV_ROUND_UP(1020, 32)]; | 53 | } |
53 | u32 saved_spi_conf[DIV_ROUND_UP(1020, 16)]; | 54 | |
54 | u32 saved_spi_target[DIV_ROUND_UP(1020, 4)]; | ||
55 | u32 __percpu *saved_ppi_enable; | ||
56 | u32 __percpu *saved_ppi_conf; | ||
57 | #endif | ||
58 | #ifdef CONFIG_IRQ_DOMAIN | ||
59 | struct irq_domain domain; | ||
60 | #endif | ||
61 | unsigned int gic_irqs; | ||
62 | }; | ||
63 | #endif | 55 | #endif |
64 | 56 | ||
65 | #endif | 57 | #endif |
diff --git a/arch/arm/include/asm/hardware/vic.h b/arch/arm/include/asm/hardware/vic.h index 5d72550a809..f42ebd61959 100644 --- a/arch/arm/include/asm/hardware/vic.h +++ b/arch/arm/include/asm/hardware/vic.h | |||
@@ -41,7 +41,15 @@ | |||
41 | #define VIC_PL192_VECT_ADDR 0xF00 | 41 | #define VIC_PL192_VECT_ADDR 0xF00 |
42 | 42 | ||
43 | #ifndef __ASSEMBLY__ | 43 | #ifndef __ASSEMBLY__ |
44 | #include <linux/compiler.h> | ||
45 | #include <linux/types.h> | ||
46 | |||
47 | struct device_node; | ||
48 | struct pt_regs; | ||
49 | |||
44 | void vic_init(void __iomem *base, unsigned int irq_start, u32 vic_sources, u32 resume_sources); | 50 | void vic_init(void __iomem *base, unsigned int irq_start, u32 vic_sources, u32 resume_sources); |
45 | #endif | 51 | int vic_of_init(struct device_node *node, struct device_node *parent); |
52 | void vic_handle_irq(struct pt_regs *regs); | ||
46 | 53 | ||
54 | #endif /* __ASSEMBLY__ */ | ||
47 | #endif | 55 | #endif |
diff --git a/arch/arm/include/asm/idmap.h b/arch/arm/include/asm/idmap.h new file mode 100644 index 00000000000..bf863edb517 --- /dev/null +++ b/arch/arm/include/asm/idmap.h | |||
@@ -0,0 +1,14 @@ | |||
1 | #ifndef __ASM_IDMAP_H | ||
2 | #define __ASM_IDMAP_H | ||
3 | |||
4 | #include <linux/compiler.h> | ||
5 | #include <asm/pgtable.h> | ||
6 | |||
7 | /* Tag a function as requiring to be executed via an identity mapping. */ | ||
8 | #define __idmap __section(.idmap.text) noinline notrace | ||
9 | |||
10 | extern pgd_t *idmap_pgd; | ||
11 | |||
12 | void setup_mm_for_reboot(void); | ||
13 | |||
14 | #endif /* __ASM_IDMAP_H */ | ||
diff --git a/arch/arm/include/asm/opcodes.h b/arch/arm/include/asm/opcodes.h new file mode 100644 index 00000000000..c0efdd60966 --- /dev/null +++ b/arch/arm/include/asm/opcodes.h | |||
@@ -0,0 +1,20 @@ | |||
1 | /* | ||
2 | * arch/arm/include/asm/opcodes.h | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | */ | ||
8 | |||
9 | #ifndef __ASM_ARM_OPCODES_H | ||
10 | #define __ASM_ARM_OPCODES_H | ||
11 | |||
12 | #ifndef __ASSEMBLY__ | ||
13 | extern asmlinkage unsigned int arm_check_condition(u32 opcode, u32 psr); | ||
14 | #endif | ||
15 | |||
16 | #define ARM_OPCODE_CONDTEST_FAIL 0 | ||
17 | #define ARM_OPCODE_CONDTEST_PASS 1 | ||
18 | #define ARM_OPCODE_CONDTEST_UNCOND 2 | ||
19 | |||
20 | #endif /* __ASM_ARM_OPCODES_H */ | ||
diff --git a/arch/arm/include/asm/page.h b/arch/arm/include/asm/page.h index ca94653f1ec..97b440c25c5 100644 --- a/arch/arm/include/asm/page.h +++ b/arch/arm/include/asm/page.h | |||
@@ -151,7 +151,11 @@ extern void __cpu_copy_user_highpage(struct page *to, struct page *from, | |||
151 | #define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) | 151 | #define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) |
152 | extern void copy_page(void *to, const void *from); | 152 | extern void copy_page(void *to, const void *from); |
153 | 153 | ||
154 | #ifdef CONFIG_ARM_LPAE | ||
155 | #include <asm/pgtable-3level-types.h> | ||
156 | #else | ||
154 | #include <asm/pgtable-2level-types.h> | 157 | #include <asm/pgtable-2level-types.h> |
158 | #endif | ||
155 | 159 | ||
156 | #endif /* CONFIG_MMU */ | 160 | #endif /* CONFIG_MMU */ |
157 | 161 | ||
diff --git a/arch/arm/include/asm/perf_event.h b/arch/arm/include/asm/perf_event.h index 0f8e3827a89..99cfe360798 100644 --- a/arch/arm/include/asm/perf_event.h +++ b/arch/arm/include/asm/perf_event.h | |||
@@ -32,7 +32,4 @@ enum arm_perf_pmu_ids { | |||
32 | extern enum arm_perf_pmu_ids | 32 | extern enum arm_perf_pmu_ids |
33 | armpmu_get_pmu_id(void); | 33 | armpmu_get_pmu_id(void); |
34 | 34 | ||
35 | extern int | ||
36 | armpmu_get_max_events(void); | ||
37 | |||
38 | #endif /* __ARM_PERF_EVENT_H__ */ | 35 | #endif /* __ARM_PERF_EVENT_H__ */ |
diff --git a/arch/arm/include/asm/pgalloc.h b/arch/arm/include/asm/pgalloc.h index 3e08fd3fbb6..943504f53f5 100644 --- a/arch/arm/include/asm/pgalloc.h +++ b/arch/arm/include/asm/pgalloc.h | |||
@@ -25,12 +25,34 @@ | |||
25 | #define _PAGE_USER_TABLE (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_USER)) | 25 | #define _PAGE_USER_TABLE (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_USER)) |
26 | #define _PAGE_KERNEL_TABLE (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_KERNEL)) | 26 | #define _PAGE_KERNEL_TABLE (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_KERNEL)) |
27 | 27 | ||
28 | #ifdef CONFIG_ARM_LPAE | ||
29 | |||
30 | static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr) | ||
31 | { | ||
32 | return (pmd_t *)get_zeroed_page(GFP_KERNEL | __GFP_REPEAT); | ||
33 | } | ||
34 | |||
35 | static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd) | ||
36 | { | ||
37 | BUG_ON((unsigned long)pmd & (PAGE_SIZE-1)); | ||
38 | free_page((unsigned long)pmd); | ||
39 | } | ||
40 | |||
41 | static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd) | ||
42 | { | ||
43 | set_pud(pud, __pud(__pa(pmd) | PMD_TYPE_TABLE)); | ||
44 | } | ||
45 | |||
46 | #else /* !CONFIG_ARM_LPAE */ | ||
47 | |||
28 | /* | 48 | /* |
29 | * Since we have only two-level page tables, these are trivial | 49 | * Since we have only two-level page tables, these are trivial |
30 | */ | 50 | */ |
31 | #define pmd_alloc_one(mm,addr) ({ BUG(); ((pmd_t *)2); }) | 51 | #define pmd_alloc_one(mm,addr) ({ BUG(); ((pmd_t *)2); }) |
32 | #define pmd_free(mm, pmd) do { } while (0) | 52 | #define pmd_free(mm, pmd) do { } while (0) |
33 | #define pgd_populate(mm,pmd,pte) BUG() | 53 | #define pud_populate(mm,pmd,pte) BUG() |
54 | |||
55 | #endif /* CONFIG_ARM_LPAE */ | ||
34 | 56 | ||
35 | extern pgd_t *pgd_alloc(struct mm_struct *mm); | 57 | extern pgd_t *pgd_alloc(struct mm_struct *mm); |
36 | extern void pgd_free(struct mm_struct *mm, pgd_t *pgd); | 58 | extern void pgd_free(struct mm_struct *mm, pgd_t *pgd); |
@@ -109,7 +131,9 @@ static inline void __pmd_populate(pmd_t *pmdp, phys_addr_t pte, | |||
109 | { | 131 | { |
110 | pmdval_t pmdval = (pte + PTE_HWTABLE_OFF) | prot; | 132 | pmdval_t pmdval = (pte + PTE_HWTABLE_OFF) | prot; |
111 | pmdp[0] = __pmd(pmdval); | 133 | pmdp[0] = __pmd(pmdval); |
134 | #ifndef CONFIG_ARM_LPAE | ||
112 | pmdp[1] = __pmd(pmdval + 256 * sizeof(pte_t)); | 135 | pmdp[1] = __pmd(pmdval + 256 * sizeof(pte_t)); |
136 | #endif | ||
113 | flush_pmd_entry(pmdp); | 137 | flush_pmd_entry(pmdp); |
114 | } | 138 | } |
115 | 139 | ||
diff --git a/arch/arm/include/asm/pgtable-2level.h b/arch/arm/include/asm/pgtable-2level.h index 470457e1cfc..2317a71c8f8 100644 --- a/arch/arm/include/asm/pgtable-2level.h +++ b/arch/arm/include/asm/pgtable-2level.h | |||
@@ -140,4 +140,45 @@ | |||
140 | #define L_PTE_MT_DEV_CACHED (_AT(pteval_t, 0x0b) << 2) /* 1011 */ | 140 | #define L_PTE_MT_DEV_CACHED (_AT(pteval_t, 0x0b) << 2) /* 1011 */ |
141 | #define L_PTE_MT_MASK (_AT(pteval_t, 0x0f) << 2) | 141 | #define L_PTE_MT_MASK (_AT(pteval_t, 0x0f) << 2) |
142 | 142 | ||
143 | #ifndef __ASSEMBLY__ | ||
144 | |||
145 | /* | ||
146 | * The "pud_xxx()" functions here are trivial when the pmd is folded into | ||
147 | * the pud: the pud entry is never bad, always exists, and can't be set or | ||
148 | * cleared. | ||
149 | */ | ||
150 | #define pud_none(pud) (0) | ||
151 | #define pud_bad(pud) (0) | ||
152 | #define pud_present(pud) (1) | ||
153 | #define pud_clear(pudp) do { } while (0) | ||
154 | #define set_pud(pud,pudp) do { } while (0) | ||
155 | |||
156 | static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr) | ||
157 | { | ||
158 | return (pmd_t *)pud; | ||
159 | } | ||
160 | |||
161 | #define pmd_bad(pmd) (pmd_val(pmd) & 2) | ||
162 | |||
163 | #define copy_pmd(pmdpd,pmdps) \ | ||
164 | do { \ | ||
165 | pmdpd[0] = pmdps[0]; \ | ||
166 | pmdpd[1] = pmdps[1]; \ | ||
167 | flush_pmd_entry(pmdpd); \ | ||
168 | } while (0) | ||
169 | |||
170 | #define pmd_clear(pmdp) \ | ||
171 | do { \ | ||
172 | pmdp[0] = __pmd(0); \ | ||
173 | pmdp[1] = __pmd(0); \ | ||
174 | clean_pmd_entry(pmdp); \ | ||
175 | } while (0) | ||
176 | |||
177 | /* we don't need complex calculations here as the pmd is folded into the pgd */ | ||
178 | #define pmd_addr_end(addr,end) (end) | ||
179 | |||
180 | #define set_pte_ext(ptep,pte,ext) cpu_set_pte_ext(ptep,pte,ext) | ||
181 | |||
182 | #endif /* __ASSEMBLY__ */ | ||
183 | |||
143 | #endif /* _ASM_PGTABLE_2LEVEL_H */ | 184 | #endif /* _ASM_PGTABLE_2LEVEL_H */ |
diff --git a/arch/arm/include/asm/pgtable-3level-hwdef.h b/arch/arm/include/asm/pgtable-3level-hwdef.h new file mode 100644 index 00000000000..d7952824c5c --- /dev/null +++ b/arch/arm/include/asm/pgtable-3level-hwdef.h | |||
@@ -0,0 +1,77 @@ | |||
1 | /* | ||
2 | * arch/arm/include/asm/pgtable-3level-hwdef.h | ||
3 | * | ||
4 | * Copyright (C) 2011 ARM Ltd. | ||
5 | * Author: Catalin Marinas <catalin.marinas@arm.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | */ | ||
20 | #ifndef _ASM_PGTABLE_3LEVEL_HWDEF_H | ||
21 | #define _ASM_PGTABLE_3LEVEL_HWDEF_H | ||
22 | |||
23 | /* | ||
24 | * Hardware page table definitions. | ||
25 | * | ||
26 | * + Level 1/2 descriptor | ||
27 | * - common | ||
28 | */ | ||
29 | #define PMD_TYPE_MASK (_AT(pmdval_t, 3) << 0) | ||
30 | #define PMD_TYPE_FAULT (_AT(pmdval_t, 0) << 0) | ||
31 | #define PMD_TYPE_TABLE (_AT(pmdval_t, 3) << 0) | ||
32 | #define PMD_TYPE_SECT (_AT(pmdval_t, 1) << 0) | ||
33 | #define PMD_BIT4 (_AT(pmdval_t, 0)) | ||
34 | #define PMD_DOMAIN(x) (_AT(pmdval_t, 0)) | ||
35 | |||
36 | /* | ||
37 | * - section | ||
38 | */ | ||
39 | #define PMD_SECT_BUFFERABLE (_AT(pmdval_t, 1) << 2) | ||
40 | #define PMD_SECT_CACHEABLE (_AT(pmdval_t, 1) << 3) | ||
41 | #define PMD_SECT_S (_AT(pmdval_t, 3) << 8) | ||
42 | #define PMD_SECT_AF (_AT(pmdval_t, 1) << 10) | ||
43 | #define PMD_SECT_nG (_AT(pmdval_t, 1) << 11) | ||
44 | #define PMD_SECT_XN (_AT(pmdval_t, 1) << 54) | ||
45 | #define PMD_SECT_AP_WRITE (_AT(pmdval_t, 0)) | ||
46 | #define PMD_SECT_AP_READ (_AT(pmdval_t, 0)) | ||
47 | #define PMD_SECT_TEX(x) (_AT(pmdval_t, 0)) | ||
48 | |||
49 | /* | ||
50 | * AttrIndx[2:0] encoding (mapping attributes defined in the MAIR* registers). | ||
51 | */ | ||
52 | #define PMD_SECT_UNCACHED (_AT(pmdval_t, 0) << 2) /* strongly ordered */ | ||
53 | #define PMD_SECT_BUFFERED (_AT(pmdval_t, 1) << 2) /* normal non-cacheable */ | ||
54 | #define PMD_SECT_WT (_AT(pmdval_t, 2) << 2) /* normal inner write-through */ | ||
55 | #define PMD_SECT_WB (_AT(pmdval_t, 3) << 2) /* normal inner write-back */ | ||
56 | #define PMD_SECT_WBWA (_AT(pmdval_t, 7) << 2) /* normal inner write-alloc */ | ||
57 | |||
58 | /* | ||
59 | * + Level 3 descriptor (PTE) | ||
60 | */ | ||
61 | #define PTE_TYPE_MASK (_AT(pteval_t, 3) << 0) | ||
62 | #define PTE_TYPE_FAULT (_AT(pteval_t, 0) << 0) | ||
63 | #define PTE_TYPE_PAGE (_AT(pteval_t, 3) << 0) | ||
64 | #define PTE_BUFFERABLE (_AT(pteval_t, 1) << 2) /* AttrIndx[0] */ | ||
65 | #define PTE_CACHEABLE (_AT(pteval_t, 1) << 3) /* AttrIndx[1] */ | ||
66 | #define PTE_EXT_SHARED (_AT(pteval_t, 3) << 8) /* SH[1:0], inner shareable */ | ||
67 | #define PTE_EXT_AF (_AT(pteval_t, 1) << 10) /* Access Flag */ | ||
68 | #define PTE_EXT_NG (_AT(pteval_t, 1) << 11) /* nG */ | ||
69 | #define PTE_EXT_XN (_AT(pteval_t, 1) << 54) /* XN */ | ||
70 | |||
71 | /* | ||
72 | * 40-bit physical address supported. | ||
73 | */ | ||
74 | #define PHYS_MASK_SHIFT (40) | ||
75 | #define PHYS_MASK ((1ULL << PHYS_MASK_SHIFT) - 1) | ||
76 | |||
77 | #endif | ||
diff --git a/arch/arm/include/asm/pgtable-3level-types.h b/arch/arm/include/asm/pgtable-3level-types.h new file mode 100644 index 00000000000..921aa30259c --- /dev/null +++ b/arch/arm/include/asm/pgtable-3level-types.h | |||
@@ -0,0 +1,70 @@ | |||
1 | /* | ||
2 | * arch/arm/include/asm/pgtable-3level-types.h | ||
3 | * | ||
4 | * Copyright (C) 2011 ARM Ltd. | ||
5 | * Author: Catalin Marinas <catalin.marinas@arm.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | */ | ||
20 | #ifndef _ASM_PGTABLE_3LEVEL_TYPES_H | ||
21 | #define _ASM_PGTABLE_3LEVEL_TYPES_H | ||
22 | |||
23 | #include <asm/types.h> | ||
24 | |||
25 | typedef u64 pteval_t; | ||
26 | typedef u64 pmdval_t; | ||
27 | typedef u64 pgdval_t; | ||
28 | |||
29 | #undef STRICT_MM_TYPECHECKS | ||
30 | |||
31 | #ifdef STRICT_MM_TYPECHECKS | ||
32 | |||
33 | /* | ||
34 | * These are used to make use of C type-checking.. | ||
35 | */ | ||
36 | typedef struct { pteval_t pte; } pte_t; | ||
37 | typedef struct { pmdval_t pmd; } pmd_t; | ||
38 | typedef struct { pgdval_t pgd; } pgd_t; | ||
39 | typedef struct { pteval_t pgprot; } pgprot_t; | ||
40 | |||
41 | #define pte_val(x) ((x).pte) | ||
42 | #define pmd_val(x) ((x).pmd) | ||
43 | #define pgd_val(x) ((x).pgd) | ||
44 | #define pgprot_val(x) ((x).pgprot) | ||
45 | |||
46 | #define __pte(x) ((pte_t) { (x) } ) | ||
47 | #define __pmd(x) ((pmd_t) { (x) } ) | ||
48 | #define __pgd(x) ((pgd_t) { (x) } ) | ||
49 | #define __pgprot(x) ((pgprot_t) { (x) } ) | ||
50 | |||
51 | #else /* !STRICT_MM_TYPECHECKS */ | ||
52 | |||
53 | typedef pteval_t pte_t; | ||
54 | typedef pmdval_t pmd_t; | ||
55 | typedef pgdval_t pgd_t; | ||
56 | typedef pteval_t pgprot_t; | ||
57 | |||
58 | #define pte_val(x) (x) | ||
59 | #define pmd_val(x) (x) | ||
60 | #define pgd_val(x) (x) | ||
61 | #define pgprot_val(x) (x) | ||
62 | |||
63 | #define __pte(x) (x) | ||
64 | #define __pmd(x) (x) | ||
65 | #define __pgd(x) (x) | ||
66 | #define __pgprot(x) (x) | ||
67 | |||
68 | #endif /* STRICT_MM_TYPECHECKS */ | ||
69 | |||
70 | #endif /* _ASM_PGTABLE_3LEVEL_TYPES_H */ | ||
diff --git a/arch/arm/include/asm/pgtable-3level.h b/arch/arm/include/asm/pgtable-3level.h new file mode 100644 index 00000000000..759af70f9a0 --- /dev/null +++ b/arch/arm/include/asm/pgtable-3level.h | |||
@@ -0,0 +1,155 @@ | |||
1 | /* | ||
2 | * arch/arm/include/asm/pgtable-3level.h | ||
3 | * | ||
4 | * Copyright (C) 2011 ARM Ltd. | ||
5 | * Author: Catalin Marinas <catalin.marinas@arm.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | */ | ||
20 | #ifndef _ASM_PGTABLE_3LEVEL_H | ||
21 | #define _ASM_PGTABLE_3LEVEL_H | ||
22 | |||
23 | /* | ||
24 | * With LPAE, there are 3 levels of page tables. Each level has 512 entries of | ||
25 | * 8 bytes each, occupying a 4K page. The first level table covers a range of | ||
26 | * 512GB, each entry representing 1GB. Since we are limited to 4GB input | ||
27 | * address range, only 4 entries in the PGD are used. | ||
28 | * | ||
29 | * There are enough spare bits in a page table entry for the kernel specific | ||
30 | * state. | ||
31 | */ | ||
32 | #define PTRS_PER_PTE 512 | ||
33 | #define PTRS_PER_PMD 512 | ||
34 | #define PTRS_PER_PGD 4 | ||
35 | |||
36 | #define PTE_HWTABLE_PTRS (PTRS_PER_PTE) | ||
37 | #define PTE_HWTABLE_OFF (0) | ||
38 | #define PTE_HWTABLE_SIZE (PTRS_PER_PTE * sizeof(u64)) | ||
39 | |||
40 | /* | ||
41 | * PGDIR_SHIFT determines the size a top-level page table entry can map. | ||
42 | */ | ||
43 | #define PGDIR_SHIFT 30 | ||
44 | |||
45 | /* | ||
46 | * PMD_SHIFT determines the size a middle-level page table entry can map. | ||
47 | */ | ||
48 | #define PMD_SHIFT 21 | ||
49 | |||
50 | #define PMD_SIZE (1UL << PMD_SHIFT) | ||
51 | #define PMD_MASK (~(PMD_SIZE-1)) | ||
52 | #define PGDIR_SIZE (1UL << PGDIR_SHIFT) | ||
53 | #define PGDIR_MASK (~(PGDIR_SIZE-1)) | ||
54 | |||
55 | /* | ||
56 | * section address mask and size definitions. | ||
57 | */ | ||
58 | #define SECTION_SHIFT 21 | ||
59 | #define SECTION_SIZE (1UL << SECTION_SHIFT) | ||
60 | #define SECTION_MASK (~(SECTION_SIZE-1)) | ||
61 | |||
62 | #define USER_PTRS_PER_PGD (PAGE_OFFSET / PGDIR_SIZE) | ||
63 | |||
64 | /* | ||
65 | * "Linux" PTE definitions for LPAE. | ||
66 | * | ||
67 | * These bits overlap with the hardware bits but the naming is preserved for | ||
68 | * consistency with the classic page table format. | ||
69 | */ | ||
70 | #define L_PTE_PRESENT (_AT(pteval_t, 3) << 0) /* Valid */ | ||
71 | #define L_PTE_FILE (_AT(pteval_t, 1) << 2) /* only when !PRESENT */ | ||
72 | #define L_PTE_BUFFERABLE (_AT(pteval_t, 1) << 2) /* AttrIndx[0] */ | ||
73 | #define L_PTE_CACHEABLE (_AT(pteval_t, 1) << 3) /* AttrIndx[1] */ | ||
74 | #define L_PTE_USER (_AT(pteval_t, 1) << 6) /* AP[1] */ | ||
75 | #define L_PTE_RDONLY (_AT(pteval_t, 1) << 7) /* AP[2] */ | ||
76 | #define L_PTE_SHARED (_AT(pteval_t, 3) << 8) /* SH[1:0], inner shareable */ | ||
77 | #define L_PTE_YOUNG (_AT(pteval_t, 1) << 10) /* AF */ | ||
78 | #define L_PTE_XN (_AT(pteval_t, 1) << 54) /* XN */ | ||
79 | #define L_PTE_DIRTY (_AT(pteval_t, 1) << 55) /* unused */ | ||
80 | #define L_PTE_SPECIAL (_AT(pteval_t, 1) << 56) /* unused */ | ||
81 | |||
82 | /* | ||
83 | * To be used in assembly code with the upper page attributes. | ||
84 | */ | ||
85 | #define L_PTE_XN_HIGH (1 << (54 - 32)) | ||
86 | #define L_PTE_DIRTY_HIGH (1 << (55 - 32)) | ||
87 | |||
88 | /* | ||
89 | * AttrIndx[2:0] encoding (mapping attributes defined in the MAIR* registers). | ||
90 | */ | ||
91 | #define L_PTE_MT_UNCACHED (_AT(pteval_t, 0) << 2) /* strongly ordered */ | ||
92 | #define L_PTE_MT_BUFFERABLE (_AT(pteval_t, 1) << 2) /* normal non-cacheable */ | ||
93 | #define L_PTE_MT_WRITETHROUGH (_AT(pteval_t, 2) << 2) /* normal inner write-through */ | ||
94 | #define L_PTE_MT_WRITEBACK (_AT(pteval_t, 3) << 2) /* normal inner write-back */ | ||
95 | #define L_PTE_MT_WRITEALLOC (_AT(pteval_t, 7) << 2) /* normal inner write-alloc */ | ||
96 | #define L_PTE_MT_DEV_SHARED (_AT(pteval_t, 4) << 2) /* device */ | ||
97 | #define L_PTE_MT_DEV_NONSHARED (_AT(pteval_t, 4) << 2) /* device */ | ||
98 | #define L_PTE_MT_DEV_WC (_AT(pteval_t, 1) << 2) /* normal non-cacheable */ | ||
99 | #define L_PTE_MT_DEV_CACHED (_AT(pteval_t, 3) << 2) /* normal inner write-back */ | ||
100 | #define L_PTE_MT_MASK (_AT(pteval_t, 7) << 2) | ||
101 | |||
102 | /* | ||
103 | * Software PGD flags. | ||
104 | */ | ||
105 | #define L_PGD_SWAPPER (_AT(pgdval_t, 1) << 55) /* swapper_pg_dir entry */ | ||
106 | |||
107 | #ifndef __ASSEMBLY__ | ||
108 | |||
109 | #define pud_none(pud) (!pud_val(pud)) | ||
110 | #define pud_bad(pud) (!(pud_val(pud) & 2)) | ||
111 | #define pud_present(pud) (pud_val(pud)) | ||
112 | |||
113 | #define pud_clear(pudp) \ | ||
114 | do { \ | ||
115 | *pudp = __pud(0); \ | ||
116 | clean_pmd_entry(pudp); \ | ||
117 | } while (0) | ||
118 | |||
119 | #define set_pud(pudp, pud) \ | ||
120 | do { \ | ||
121 | *pudp = pud; \ | ||
122 | flush_pmd_entry(pudp); \ | ||
123 | } while (0) | ||
124 | |||
125 | static inline pmd_t *pud_page_vaddr(pud_t pud) | ||
126 | { | ||
127 | return __va(pud_val(pud) & PHYS_MASK & (s32)PAGE_MASK); | ||
128 | } | ||
129 | |||
130 | /* Find an entry in the second-level page table.. */ | ||
131 | #define pmd_index(addr) (((addr) >> PMD_SHIFT) & (PTRS_PER_PMD - 1)) | ||
132 | static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr) | ||
133 | { | ||
134 | return (pmd_t *)pud_page_vaddr(*pud) + pmd_index(addr); | ||
135 | } | ||
136 | |||
137 | #define pmd_bad(pmd) (!(pmd_val(pmd) & 2)) | ||
138 | |||
139 | #define copy_pmd(pmdpd,pmdps) \ | ||
140 | do { \ | ||
141 | *pmdpd = *pmdps; \ | ||
142 | flush_pmd_entry(pmdpd); \ | ||
143 | } while (0) | ||
144 | |||
145 | #define pmd_clear(pmdp) \ | ||
146 | do { \ | ||
147 | *pmdp = __pmd(0); \ | ||
148 | clean_pmd_entry(pmdp); \ | ||
149 | } while (0) | ||
150 | |||
151 | #define set_pte_ext(ptep,pte,ext) cpu_set_pte_ext(ptep,__pte(pte_val(pte)|(ext))) | ||
152 | |||
153 | #endif /* __ASSEMBLY__ */ | ||
154 | |||
155 | #endif /* _ASM_PGTABLE_3LEVEL_H */ | ||
diff --git a/arch/arm/include/asm/pgtable-hwdef.h b/arch/arm/include/asm/pgtable-hwdef.h index 183111164ce..8426229ba29 100644 --- a/arch/arm/include/asm/pgtable-hwdef.h +++ b/arch/arm/include/asm/pgtable-hwdef.h | |||
@@ -10,6 +10,10 @@ | |||
10 | #ifndef _ASMARM_PGTABLE_HWDEF_H | 10 | #ifndef _ASMARM_PGTABLE_HWDEF_H |
11 | #define _ASMARM_PGTABLE_HWDEF_H | 11 | #define _ASMARM_PGTABLE_HWDEF_H |
12 | 12 | ||
13 | #ifdef CONFIG_ARM_LPAE | ||
14 | #include <asm/pgtable-3level-hwdef.h> | ||
15 | #else | ||
13 | #include <asm/pgtable-2level-hwdef.h> | 16 | #include <asm/pgtable-2level-hwdef.h> |
17 | #endif | ||
14 | 18 | ||
15 | #endif | 19 | #endif |
diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h index 9451dce3a55..f66626d71e7 100644 --- a/arch/arm/include/asm/pgtable.h +++ b/arch/arm/include/asm/pgtable.h | |||
@@ -11,20 +11,24 @@ | |||
11 | #define _ASMARM_PGTABLE_H | 11 | #define _ASMARM_PGTABLE_H |
12 | 12 | ||
13 | #include <linux/const.h> | 13 | #include <linux/const.h> |
14 | #include <asm-generic/4level-fixup.h> | ||
15 | #include <asm/proc-fns.h> | 14 | #include <asm/proc-fns.h> |
16 | 15 | ||
17 | #ifndef CONFIG_MMU | 16 | #ifndef CONFIG_MMU |
18 | 17 | ||
18 | #include <asm-generic/4level-fixup.h> | ||
19 | #include "pgtable-nommu.h" | 19 | #include "pgtable-nommu.h" |
20 | 20 | ||
21 | #else | 21 | #else |
22 | 22 | ||
23 | #include <asm-generic/pgtable-nopud.h> | ||
23 | #include <asm/memory.h> | 24 | #include <asm/memory.h> |
24 | #include <mach/vmalloc.h> | ||
25 | #include <asm/pgtable-hwdef.h> | 25 | #include <asm/pgtable-hwdef.h> |
26 | 26 | ||
27 | #ifdef CONFIG_ARM_LPAE | ||
28 | #include <asm/pgtable-3level.h> | ||
29 | #else | ||
27 | #include <asm/pgtable-2level.h> | 30 | #include <asm/pgtable-2level.h> |
31 | #endif | ||
28 | 32 | ||
29 | /* | 33 | /* |
30 | * Just any arbitrary offset to the start of the vmalloc VM area: the | 34 | * Just any arbitrary offset to the start of the vmalloc VM area: the |
@@ -33,15 +37,10 @@ | |||
33 | * any out-of-bounds memory accesses will hopefully be caught. | 37 | * any out-of-bounds memory accesses will hopefully be caught. |
34 | * The vmalloc() routines leaves a hole of 4kB between each vmalloced | 38 | * The vmalloc() routines leaves a hole of 4kB between each vmalloced |
35 | * area for the same reason. ;) | 39 | * area for the same reason. ;) |
36 | * | ||
37 | * Note that platforms may override VMALLOC_START, but they must provide | ||
38 | * VMALLOC_END. VMALLOC_END defines the (exclusive) limit of this space, | ||
39 | * which may not overlap IO space. | ||
40 | */ | 40 | */ |
41 | #ifndef VMALLOC_START | ||
42 | #define VMALLOC_OFFSET (8*1024*1024) | 41 | #define VMALLOC_OFFSET (8*1024*1024) |
43 | #define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) | 42 | #define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) |
44 | #endif | 43 | #define VMALLOC_END 0xff000000UL |
45 | 44 | ||
46 | #define LIBRARY_TEXT_START 0x0c000000 | 45 | #define LIBRARY_TEXT_START 0x0c000000 |
47 | 46 | ||
@@ -163,39 +162,8 @@ extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; | |||
163 | /* to find an entry in a kernel page-table-directory */ | 162 | /* to find an entry in a kernel page-table-directory */ |
164 | #define pgd_offset_k(addr) pgd_offset(&init_mm, addr) | 163 | #define pgd_offset_k(addr) pgd_offset(&init_mm, addr) |
165 | 164 | ||
166 | /* | ||
167 | * The "pgd_xxx()" functions here are trivial for a folded two-level | ||
168 | * setup: the pgd is never bad, and a pmd always exists (as it's folded | ||
169 | * into the pgd entry) | ||
170 | */ | ||
171 | #define pgd_none(pgd) (0) | ||
172 | #define pgd_bad(pgd) (0) | ||
173 | #define pgd_present(pgd) (1) | ||
174 | #define pgd_clear(pgdp) do { } while (0) | ||
175 | #define set_pgd(pgd,pgdp) do { } while (0) | ||
176 | #define set_pud(pud,pudp) do { } while (0) | ||
177 | |||
178 | |||
179 | /* Find an entry in the second-level page table.. */ | ||
180 | #define pmd_offset(dir, addr) ((pmd_t *)(dir)) | ||
181 | |||
182 | #define pmd_none(pmd) (!pmd_val(pmd)) | 165 | #define pmd_none(pmd) (!pmd_val(pmd)) |
183 | #define pmd_present(pmd) (pmd_val(pmd)) | 166 | #define pmd_present(pmd) (pmd_val(pmd)) |
184 | #define pmd_bad(pmd) (pmd_val(pmd) & 2) | ||
185 | |||
186 | #define copy_pmd(pmdpd,pmdps) \ | ||
187 | do { \ | ||
188 | pmdpd[0] = pmdps[0]; \ | ||
189 | pmdpd[1] = pmdps[1]; \ | ||
190 | flush_pmd_entry(pmdpd); \ | ||
191 | } while (0) | ||
192 | |||
193 | #define pmd_clear(pmdp) \ | ||
194 | do { \ | ||
195 | pmdp[0] = __pmd(0); \ | ||
196 | pmdp[1] = __pmd(0); \ | ||
197 | clean_pmd_entry(pmdp); \ | ||
198 | } while (0) | ||
199 | 167 | ||
200 | static inline pte_t *pmd_page_vaddr(pmd_t pmd) | 168 | static inline pte_t *pmd_page_vaddr(pmd_t pmd) |
201 | { | 169 | { |
@@ -204,10 +172,6 @@ static inline pte_t *pmd_page_vaddr(pmd_t pmd) | |||
204 | 172 | ||
205 | #define pmd_page(pmd) pfn_to_page(__phys_to_pfn(pmd_val(pmd) & PHYS_MASK)) | 173 | #define pmd_page(pmd) pfn_to_page(__phys_to_pfn(pmd_val(pmd) & PHYS_MASK)) |
206 | 174 | ||
207 | /* we don't need complex calculations here as the pmd is folded into the pgd */ | ||
208 | #define pmd_addr_end(addr,end) (end) | ||
209 | |||
210 | |||
211 | #ifndef CONFIG_HIGHPTE | 175 | #ifndef CONFIG_HIGHPTE |
212 | #define __pte_map(pmd) pmd_page_vaddr(*(pmd)) | 176 | #define __pte_map(pmd) pmd_page_vaddr(*(pmd)) |
213 | #define __pte_unmap(pte) do { } while (0) | 177 | #define __pte_unmap(pte) do { } while (0) |
@@ -229,7 +193,6 @@ static inline pte_t *pmd_page_vaddr(pmd_t pmd) | |||
229 | #define pte_page(pte) pfn_to_page(pte_pfn(pte)) | 193 | #define pte_page(pte) pfn_to_page(pte_pfn(pte)) |
230 | #define mk_pte(page,prot) pfn_pte(page_to_pfn(page), prot) | 194 | #define mk_pte(page,prot) pfn_pte(page_to_pfn(page), prot) |
231 | 195 | ||
232 | #define set_pte_ext(ptep,pte,ext) cpu_set_pte_ext(ptep,pte,ext) | ||
233 | #define pte_clear(mm,addr,ptep) set_pte_ext(ptep, __pte(0), 0) | 196 | #define pte_clear(mm,addr,ptep) set_pte_ext(ptep, __pte(0), 0) |
234 | 197 | ||
235 | #if __LINUX_ARM_ARCH__ < 6 | 198 | #if __LINUX_ARM_ARCH__ < 6 |
@@ -336,6 +299,7 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) | |||
336 | * We provide our own arch_get_unmapped_area to cope with VIPT caches. | 299 | * We provide our own arch_get_unmapped_area to cope with VIPT caches. |
337 | */ | 300 | */ |
338 | #define HAVE_ARCH_UNMAPPED_AREA | 301 | #define HAVE_ARCH_UNMAPPED_AREA |
302 | #define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN | ||
339 | 303 | ||
340 | /* | 304 | /* |
341 | * remap a physical page `pfn' of size `size' with page protection `prot' | 305 | * remap a physical page `pfn' of size `size' with page protection `prot' |
@@ -346,9 +310,6 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) | |||
346 | 310 | ||
347 | #define pgtable_cache_init() do { } while (0) | 311 | #define pgtable_cache_init() do { } while (0) |
348 | 312 | ||
349 | void identity_mapping_add(pgd_t *, unsigned long, unsigned long); | ||
350 | void identity_mapping_del(pgd_t *, unsigned long, unsigned long); | ||
351 | |||
352 | #endif /* !__ASSEMBLY__ */ | 313 | #endif /* !__ASSEMBLY__ */ |
353 | 314 | ||
354 | #endif /* CONFIG_MMU */ | 315 | #endif /* CONFIG_MMU */ |
diff --git a/arch/arm/include/asm/pmu.h b/arch/arm/include/asm/pmu.h index 0bda22c094a..b5a5be2536c 100644 --- a/arch/arm/include/asm/pmu.h +++ b/arch/arm/include/asm/pmu.h | |||
@@ -27,13 +27,22 @@ enum arm_pmu_type { | |||
27 | /* | 27 | /* |
28 | * struct arm_pmu_platdata - ARM PMU platform data | 28 | * struct arm_pmu_platdata - ARM PMU platform data |
29 | * | 29 | * |
30 | * @handle_irq: an optional handler which will be called from the interrupt and | 30 | * @handle_irq: an optional handler which will be called from the |
31 | * passed the address of the low level handler, and can be used to implement | 31 | * interrupt and passed the address of the low level handler, |
32 | * any platform specific handling before or after calling it. | 32 | * and can be used to implement any platform specific handling |
33 | * before or after calling it. | ||
34 | * @enable_irq: an optional handler which will be called after | ||
35 | * request_irq and be used to handle some platform specific | ||
36 | * irq enablement | ||
37 | * @disable_irq: an optional handler which will be called before | ||
38 | * free_irq and be used to handle some platform specific | ||
39 | * irq disablement | ||
33 | */ | 40 | */ |
34 | struct arm_pmu_platdata { | 41 | struct arm_pmu_platdata { |
35 | irqreturn_t (*handle_irq)(int irq, void *dev, | 42 | irqreturn_t (*handle_irq)(int irq, void *dev, |
36 | irq_handler_t pmu_handler); | 43 | irq_handler_t pmu_handler); |
44 | void (*enable_irq)(int irq); | ||
45 | void (*disable_irq)(int irq); | ||
37 | }; | 46 | }; |
38 | 47 | ||
39 | #ifdef CONFIG_CPU_HAS_PMU | 48 | #ifdef CONFIG_CPU_HAS_PMU |
diff --git a/arch/arm/include/asm/proc-fns.h b/arch/arm/include/asm/proc-fns.h index 9e92cb205e6..f3628fb3d2b 100644 --- a/arch/arm/include/asm/proc-fns.h +++ b/arch/arm/include/asm/proc-fns.h | |||
@@ -65,7 +65,11 @@ extern struct processor { | |||
65 | * Set a possibly extended PTE. Non-extended PTEs should | 65 | * Set a possibly extended PTE. Non-extended PTEs should |
66 | * ignore 'ext'. | 66 | * ignore 'ext'. |
67 | */ | 67 | */ |
68 | #ifdef CONFIG_ARM_LPAE | ||
69 | void (*set_pte_ext)(pte_t *ptep, pte_t pte); | ||
70 | #else | ||
68 | void (*set_pte_ext)(pte_t *ptep, pte_t pte, unsigned int ext); | 71 | void (*set_pte_ext)(pte_t *ptep, pte_t pte, unsigned int ext); |
72 | #endif | ||
69 | 73 | ||
70 | /* Suspend/resume */ | 74 | /* Suspend/resume */ |
71 | unsigned int suspend_size; | 75 | unsigned int suspend_size; |
@@ -79,7 +83,11 @@ extern void cpu_proc_fin(void); | |||
79 | extern int cpu_do_idle(void); | 83 | extern int cpu_do_idle(void); |
80 | extern void cpu_dcache_clean_area(void *, int); | 84 | extern void cpu_dcache_clean_area(void *, int); |
81 | extern void cpu_do_switch_mm(unsigned long pgd_phys, struct mm_struct *mm); | 85 | extern void cpu_do_switch_mm(unsigned long pgd_phys, struct mm_struct *mm); |
86 | #ifdef CONFIG_ARM_LPAE | ||
87 | extern void cpu_set_pte_ext(pte_t *ptep, pte_t pte); | ||
88 | #else | ||
82 | extern void cpu_set_pte_ext(pte_t *ptep, pte_t pte, unsigned int ext); | 89 | extern void cpu_set_pte_ext(pte_t *ptep, pte_t pte, unsigned int ext); |
90 | #endif | ||
83 | extern void cpu_reset(unsigned long addr) __attribute__((noreturn)); | 91 | extern void cpu_reset(unsigned long addr) __attribute__((noreturn)); |
84 | 92 | ||
85 | /* These three are private to arch/arm/kernel/suspend.c */ | 93 | /* These three are private to arch/arm/kernel/suspend.c */ |
@@ -107,6 +115,18 @@ extern void cpu_resume(void); | |||
107 | 115 | ||
108 | #define cpu_switch_mm(pgd,mm) cpu_do_switch_mm(virt_to_phys(pgd),mm) | 116 | #define cpu_switch_mm(pgd,mm) cpu_do_switch_mm(virt_to_phys(pgd),mm) |
109 | 117 | ||
118 | #ifdef CONFIG_ARM_LPAE | ||
119 | #define cpu_get_pgd() \ | ||
120 | ({ \ | ||
121 | unsigned long pg, pg2; \ | ||
122 | __asm__("mrrc p15, 0, %0, %1, c2" \ | ||
123 | : "=r" (pg), "=r" (pg2) \ | ||
124 | : \ | ||
125 | : "cc"); \ | ||
126 | pg &= ~(PTRS_PER_PGD*sizeof(pgd_t)-1); \ | ||
127 | (pgd_t *)phys_to_virt(pg); \ | ||
128 | }) | ||
129 | #else | ||
110 | #define cpu_get_pgd() \ | 130 | #define cpu_get_pgd() \ |
111 | ({ \ | 131 | ({ \ |
112 | unsigned long pg; \ | 132 | unsigned long pg; \ |
@@ -115,6 +135,7 @@ extern void cpu_resume(void); | |||
115 | pg &= ~0x3fff; \ | 135 | pg &= ~0x3fff; \ |
116 | (pgd_t *)phys_to_virt(pg); \ | 136 | (pgd_t *)phys_to_virt(pg); \ |
117 | }) | 137 | }) |
138 | #endif | ||
118 | 139 | ||
119 | #endif | 140 | #endif |
120 | 141 | ||
diff --git a/arch/arm/include/asm/processor.h b/arch/arm/include/asm/processor.h index b2d9df5667a..ce280b8d613 100644 --- a/arch/arm/include/asm/processor.h +++ b/arch/arm/include/asm/processor.h | |||
@@ -123,6 +123,8 @@ static inline void prefetch(const void *ptr) | |||
123 | 123 | ||
124 | #endif | 124 | #endif |
125 | 125 | ||
126 | #define HAVE_ARCH_PICK_MMAP_LAYOUT | ||
127 | |||
126 | #endif | 128 | #endif |
127 | 129 | ||
128 | #endif /* __ASM_ARM_PROCESSOR_H */ | 130 | #endif /* __ASM_ARM_PROCESSOR_H */ |
diff --git a/arch/arm/include/asm/sched_clock.h b/arch/arm/include/asm/sched_clock.h index c8e6ddf3e86..e3f75726343 100644 --- a/arch/arm/include/asm/sched_clock.h +++ b/arch/arm/include/asm/sched_clock.h | |||
@@ -8,113 +8,7 @@ | |||
8 | #ifndef ASM_SCHED_CLOCK | 8 | #ifndef ASM_SCHED_CLOCK |
9 | #define ASM_SCHED_CLOCK | 9 | #define ASM_SCHED_CLOCK |
10 | 10 | ||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/types.h> | ||
13 | |||
14 | struct clock_data { | ||
15 | u64 epoch_ns; | ||
16 | u32 epoch_cyc; | ||
17 | u32 epoch_cyc_copy; | ||
18 | u32 mult; | ||
19 | u32 shift; | ||
20 | }; | ||
21 | |||
22 | #define DEFINE_CLOCK_DATA(name) struct clock_data name | ||
23 | |||
24 | static inline u64 cyc_to_ns(u64 cyc, u32 mult, u32 shift) | ||
25 | { | ||
26 | return (cyc * mult) >> shift; | ||
27 | } | ||
28 | |||
29 | /* | ||
30 | * Atomically update the sched_clock epoch. Your update callback will | ||
31 | * be called from a timer before the counter wraps - read the current | ||
32 | * counter value, and call this function to safely move the epochs | ||
33 | * forward. Only use this from the update callback. | ||
34 | */ | ||
35 | static inline void update_sched_clock(struct clock_data *cd, u32 cyc, u32 mask) | ||
36 | { | ||
37 | unsigned long flags; | ||
38 | u64 ns = cd->epoch_ns + | ||
39 | cyc_to_ns((cyc - cd->epoch_cyc) & mask, cd->mult, cd->shift); | ||
40 | |||
41 | /* | ||
42 | * Write epoch_cyc and epoch_ns in a way that the update is | ||
43 | * detectable in cyc_to_fixed_sched_clock(). | ||
44 | */ | ||
45 | raw_local_irq_save(flags); | ||
46 | cd->epoch_cyc = cyc; | ||
47 | smp_wmb(); | ||
48 | cd->epoch_ns = ns; | ||
49 | smp_wmb(); | ||
50 | cd->epoch_cyc_copy = cyc; | ||
51 | raw_local_irq_restore(flags); | ||
52 | } | ||
53 | |||
54 | /* | ||
55 | * If your clock rate is known at compile time, using this will allow | ||
56 | * you to optimize the mult/shift loads away. This is paired with | ||
57 | * init_fixed_sched_clock() to ensure that your mult/shift are correct. | ||
58 | */ | ||
59 | static inline unsigned long long cyc_to_fixed_sched_clock(struct clock_data *cd, | ||
60 | u32 cyc, u32 mask, u32 mult, u32 shift) | ||
61 | { | ||
62 | u64 epoch_ns; | ||
63 | u32 epoch_cyc; | ||
64 | |||
65 | /* | ||
66 | * Load the epoch_cyc and epoch_ns atomically. We do this by | ||
67 | * ensuring that we always write epoch_cyc, epoch_ns and | ||
68 | * epoch_cyc_copy in strict order, and read them in strict order. | ||
69 | * If epoch_cyc and epoch_cyc_copy are not equal, then we're in | ||
70 | * the middle of an update, and we should repeat the load. | ||
71 | */ | ||
72 | do { | ||
73 | epoch_cyc = cd->epoch_cyc; | ||
74 | smp_rmb(); | ||
75 | epoch_ns = cd->epoch_ns; | ||
76 | smp_rmb(); | ||
77 | } while (epoch_cyc != cd->epoch_cyc_copy); | ||
78 | |||
79 | return epoch_ns + cyc_to_ns((cyc - epoch_cyc) & mask, mult, shift); | ||
80 | } | ||
81 | |||
82 | /* | ||
83 | * Otherwise, you need to use this, which will obtain the mult/shift | ||
84 | * from the clock_data structure. Use init_sched_clock() with this. | ||
85 | */ | ||
86 | static inline unsigned long long cyc_to_sched_clock(struct clock_data *cd, | ||
87 | u32 cyc, u32 mask) | ||
88 | { | ||
89 | return cyc_to_fixed_sched_clock(cd, cyc, mask, cd->mult, cd->shift); | ||
90 | } | ||
91 | |||
92 | /* | ||
93 | * Initialize the clock data - calculate the appropriate multiplier | ||
94 | * and shift. Also setup a timer to ensure that the epoch is refreshed | ||
95 | * at the appropriate time interval, which will call your update | ||
96 | * handler. | ||
97 | */ | ||
98 | void init_sched_clock(struct clock_data *, void (*)(void), | ||
99 | unsigned int, unsigned long); | ||
100 | |||
101 | /* | ||
102 | * Use this initialization function rather than init_sched_clock() if | ||
103 | * you're using cyc_to_fixed_sched_clock, which will warn if your | ||
104 | * constants are incorrect. | ||
105 | */ | ||
106 | static inline void init_fixed_sched_clock(struct clock_data *cd, | ||
107 | void (*update)(void), unsigned int bits, unsigned long rate, | ||
108 | u32 mult, u32 shift) | ||
109 | { | ||
110 | init_sched_clock(cd, update, bits, rate); | ||
111 | if (cd->mult != mult || cd->shift != shift) { | ||
112 | pr_crit("sched_clock: wrong multiply/shift: %u>>%u vs calculated %u>>%u\n" | ||
113 | "sched_clock: fix multiply/shift to avoid scheduler hiccups\n", | ||
114 | mult, shift, cd->mult, cd->shift); | ||
115 | } | ||
116 | } | ||
117 | |||
118 | extern void sched_clock_postinit(void); | 11 | extern void sched_clock_postinit(void); |
12 | extern void setup_sched_clock(u32 (*read)(void), int bits, unsigned long rate); | ||
119 | 13 | ||
120 | #endif | 14 | #endif |
diff --git a/arch/arm/include/asm/setup.h b/arch/arm/include/asm/setup.h index 915696dd9c7..23ebc0c82a3 100644 --- a/arch/arm/include/asm/setup.h +++ b/arch/arm/include/asm/setup.h | |||
@@ -192,11 +192,7 @@ static const struct tagtable __tagtable_##fn __tag = { tag, fn } | |||
192 | /* | 192 | /* |
193 | * Memory map description | 193 | * Memory map description |
194 | */ | 194 | */ |
195 | #ifdef CONFIG_ARCH_EP93XX | 195 | #define NR_BANKS CONFIG_ARM_NR_BANKS |
196 | # define NR_BANKS 16 | ||
197 | #else | ||
198 | # define NR_BANKS 8 | ||
199 | #endif | ||
200 | 196 | ||
201 | struct membank { | 197 | struct membank { |
202 | phys_addr_t start; | 198 | phys_addr_t start; |
diff --git a/arch/arm/include/asm/swab.h b/arch/arm/include/asm/swab.h index 9997ad20eff..32ee164a2f6 100644 --- a/arch/arm/include/asm/swab.h +++ b/arch/arm/include/asm/swab.h | |||
@@ -24,12 +24,13 @@ | |||
24 | 24 | ||
25 | #if defined(__KERNEL__) && __LINUX_ARM_ARCH__ >= 6 | 25 | #if defined(__KERNEL__) && __LINUX_ARM_ARCH__ >= 6 |
26 | 26 | ||
27 | static inline __attribute_const__ __u16 __arch_swab16(__u16 x) | 27 | static inline __attribute_const__ __u32 __arch_swahb32(__u32 x) |
28 | { | 28 | { |
29 | __asm__ ("rev16 %0, %1" : "=r" (x) : "r" (x)); | 29 | __asm__ ("rev16 %0, %1" : "=r" (x) : "r" (x)); |
30 | return x; | 30 | return x; |
31 | } | 31 | } |
32 | #define __arch_swab16 __arch_swab16 | 32 | #define __arch_swahb32 __arch_swahb32 |
33 | #define __arch_swab16(x) ((__u16)__arch_swahb32(x)) | ||
33 | 34 | ||
34 | static inline __attribute_const__ __u32 __arch_swab32(__u32 x) | 35 | static inline __attribute_const__ __u32 __arch_swab32(__u32 x) |
35 | { | 36 | { |
diff --git a/arch/arm/include/asm/system.h b/arch/arm/include/asm/system.h index 03775b14be8..e4c96cc6ec0 100644 --- a/arch/arm/include/asm/system.h +++ b/arch/arm/include/asm/system.h | |||
@@ -80,6 +80,14 @@ struct siginfo; | |||
80 | void arm_notify_die(const char *str, struct pt_regs *regs, struct siginfo *info, | 80 | void arm_notify_die(const char *str, struct pt_regs *regs, struct siginfo *info, |
81 | unsigned long err, unsigned long trap); | 81 | unsigned long err, unsigned long trap); |
82 | 82 | ||
83 | #ifdef CONFIG_ARM_LPAE | ||
84 | #define FAULT_CODE_ALIGNMENT 33 | ||
85 | #define FAULT_CODE_DEBUG 34 | ||
86 | #else | ||
87 | #define FAULT_CODE_ALIGNMENT 1 | ||
88 | #define FAULT_CODE_DEBUG 2 | ||
89 | #endif | ||
90 | |||
83 | void hook_fault_code(int nr, int (*fn)(unsigned long, unsigned int, | 91 | void hook_fault_code(int nr, int (*fn)(unsigned long, unsigned int, |
84 | struct pt_regs *), | 92 | struct pt_regs *), |
85 | int sig, int code, const char *name); | 93 | int sig, int code, const char *name); |
diff --git a/arch/arm/include/asm/tlb.h b/arch/arm/include/asm/tlb.h index 265f908c4a6..5d3ed7e3856 100644 --- a/arch/arm/include/asm/tlb.h +++ b/arch/arm/include/asm/tlb.h | |||
@@ -202,8 +202,18 @@ static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte, | |||
202 | tlb_remove_page(tlb, pte); | 202 | tlb_remove_page(tlb, pte); |
203 | } | 203 | } |
204 | 204 | ||
205 | static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmdp, | ||
206 | unsigned long addr) | ||
207 | { | ||
208 | #ifdef CONFIG_ARM_LPAE | ||
209 | tlb_add_flush(tlb, addr); | ||
210 | tlb_remove_page(tlb, virt_to_page(pmdp)); | ||
211 | #endif | ||
212 | } | ||
213 | |||
205 | #define pte_free_tlb(tlb, ptep, addr) __pte_free_tlb(tlb, ptep, addr) | 214 | #define pte_free_tlb(tlb, ptep, addr) __pte_free_tlb(tlb, ptep, addr) |
206 | #define pmd_free_tlb(tlb, pmdp, addr) pmd_free((tlb)->mm, pmdp) | 215 | #define pmd_free_tlb(tlb, pmdp, addr) __pmd_free_tlb(tlb, pmdp, addr) |
216 | #define pud_free_tlb(tlb, pudp, addr) pud_free((tlb)->mm, pudp) | ||
207 | 217 | ||
208 | #define tlb_migrate_finish(mm) do { } while (0) | 218 | #define tlb_migrate_finish(mm) do { } while (0) |
209 | 219 | ||
diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile index 16eed6aebfa..43b740d0e37 100644 --- a/arch/arm/kernel/Makefile +++ b/arch/arm/kernel/Makefile | |||
@@ -13,7 +13,7 @@ CFLAGS_REMOVE_return_address.o = -pg | |||
13 | 13 | ||
14 | # Object file lists. | 14 | # Object file lists. |
15 | 15 | ||
16 | obj-y := elf.o entry-armv.o entry-common.o irq.o \ | 16 | obj-y := elf.o entry-armv.o entry-common.o irq.o opcodes.o \ |
17 | process.o ptrace.o return_address.o setup.o signal.o \ | 17 | process.o ptrace.o return_address.o setup.o signal.o \ |
18 | sys_arm.o stacktrace.o time.o traps.o | 18 | sys_arm.o stacktrace.o time.o traps.o |
19 | 19 | ||
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index b145f16c91b..3a456c6c700 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S | |||
@@ -36,12 +36,11 @@ | |||
36 | #ifdef CONFIG_MULTI_IRQ_HANDLER | 36 | #ifdef CONFIG_MULTI_IRQ_HANDLER |
37 | ldr r1, =handle_arch_irq | 37 | ldr r1, =handle_arch_irq |
38 | mov r0, sp | 38 | mov r0, sp |
39 | ldr r1, [r1] | ||
40 | adr lr, BSYM(9997f) | 39 | adr lr, BSYM(9997f) |
41 | teq r1, #0 | 40 | ldr pc, [r1] |
42 | movne pc, r1 | 41 | #else |
43 | #endif | ||
44 | arch_irq_handler_default | 42 | arch_irq_handler_default |
43 | #endif | ||
45 | 9997: | 44 | 9997: |
46 | .endm | 45 | .endm |
47 | 46 | ||
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index 08c82fd844a..14e277d2ff9 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S | |||
@@ -39,8 +39,14 @@ | |||
39 | #error KERNEL_RAM_VADDR must start at 0xXXXX8000 | 39 | #error KERNEL_RAM_VADDR must start at 0xXXXX8000 |
40 | #endif | 40 | #endif |
41 | 41 | ||
42 | #ifdef CONFIG_ARM_LPAE | ||
43 | /* LPAE requires an additional page for the PGD */ | ||
44 | #define PG_DIR_SIZE 0x5000 | ||
45 | #define PMD_ORDER 3 | ||
46 | #else | ||
42 | #define PG_DIR_SIZE 0x4000 | 47 | #define PG_DIR_SIZE 0x4000 |
43 | #define PMD_ORDER 2 | 48 | #define PMD_ORDER 2 |
49 | #endif | ||
44 | 50 | ||
45 | .globl swapper_pg_dir | 51 | .globl swapper_pg_dir |
46 | .equ swapper_pg_dir, KERNEL_RAM_VADDR - PG_DIR_SIZE | 52 | .equ swapper_pg_dir, KERNEL_RAM_VADDR - PG_DIR_SIZE |
@@ -164,17 +170,36 @@ __create_page_tables: | |||
164 | teq r0, r6 | 170 | teq r0, r6 |
165 | bne 1b | 171 | bne 1b |
166 | 172 | ||
173 | #ifdef CONFIG_ARM_LPAE | ||
174 | /* | ||
175 | * Build the PGD table (first level) to point to the PMD table. A PGD | ||
176 | * entry is 64-bit wide. | ||
177 | */ | ||
178 | mov r0, r4 | ||
179 | add r3, r4, #0x1000 @ first PMD table address | ||
180 | orr r3, r3, #3 @ PGD block type | ||
181 | mov r6, #4 @ PTRS_PER_PGD | ||
182 | mov r7, #1 << (55 - 32) @ L_PGD_SWAPPER | ||
183 | 1: str r3, [r0], #4 @ set bottom PGD entry bits | ||
184 | str r7, [r0], #4 @ set top PGD entry bits | ||
185 | add r3, r3, #0x1000 @ next PMD table | ||
186 | subs r6, r6, #1 | ||
187 | bne 1b | ||
188 | |||
189 | add r4, r4, #0x1000 @ point to the PMD tables | ||
190 | #endif | ||
191 | |||
167 | ldr r7, [r10, #PROCINFO_MM_MMUFLAGS] @ mm_mmuflags | 192 | ldr r7, [r10, #PROCINFO_MM_MMUFLAGS] @ mm_mmuflags |
168 | 193 | ||
169 | /* | 194 | /* |
170 | * Create identity mapping to cater for __enable_mmu. | 195 | * Create identity mapping to cater for __enable_mmu. |
171 | * This identity mapping will be removed by paging_init(). | 196 | * This identity mapping will be removed by paging_init(). |
172 | */ | 197 | */ |
173 | adr r0, __enable_mmu_loc | 198 | adr r0, __turn_mmu_on_loc |
174 | ldmia r0, {r3, r5, r6} | 199 | ldmia r0, {r3, r5, r6} |
175 | sub r0, r0, r3 @ virt->phys offset | 200 | sub r0, r0, r3 @ virt->phys offset |
176 | add r5, r5, r0 @ phys __enable_mmu | 201 | add r5, r5, r0 @ phys __turn_mmu_on |
177 | add r6, r6, r0 @ phys __enable_mmu_end | 202 | add r6, r6, r0 @ phys __turn_mmu_on_end |
178 | mov r5, r5, lsr #SECTION_SHIFT | 203 | mov r5, r5, lsr #SECTION_SHIFT |
179 | mov r6, r6, lsr #SECTION_SHIFT | 204 | mov r6, r6, lsr #SECTION_SHIFT |
180 | 205 | ||
@@ -219,8 +244,8 @@ __create_page_tables: | |||
219 | #endif | 244 | #endif |
220 | 245 | ||
221 | /* | 246 | /* |
222 | * Then map boot params address in r2 or | 247 | * Then map boot params address in r2 or the first 1MB (2MB with LPAE) |
223 | * the first 1MB of ram if boot params address is not specified. | 248 | * of ram if boot params address is not specified. |
224 | */ | 249 | */ |
225 | mov r0, r2, lsr #SECTION_SHIFT | 250 | mov r0, r2, lsr #SECTION_SHIFT |
226 | movs r0, r0, lsl #SECTION_SHIFT | 251 | movs r0, r0, lsl #SECTION_SHIFT |
@@ -251,7 +276,15 @@ __create_page_tables: | |||
251 | mov r3, r7, lsr #SECTION_SHIFT | 276 | mov r3, r7, lsr #SECTION_SHIFT |
252 | ldr r7, [r10, #PROCINFO_IO_MMUFLAGS] @ io_mmuflags | 277 | ldr r7, [r10, #PROCINFO_IO_MMUFLAGS] @ io_mmuflags |
253 | orr r3, r7, r3, lsl #SECTION_SHIFT | 278 | orr r3, r7, r3, lsl #SECTION_SHIFT |
279 | #ifdef CONFIG_ARM_LPAE | ||
280 | mov r7, #1 << (54 - 32) @ XN | ||
281 | #else | ||
282 | orr r3, r3, #PMD_SECT_XN | ||
283 | #endif | ||
254 | 1: str r3, [r0], #4 | 284 | 1: str r3, [r0], #4 |
285 | #ifdef CONFIG_ARM_LPAE | ||
286 | str r7, [r0], #4 | ||
287 | #endif | ||
255 | add r3, r3, #1 << SECTION_SHIFT | 288 | add r3, r3, #1 << SECTION_SHIFT |
256 | cmp r0, r6 | 289 | cmp r0, r6 |
257 | blo 1b | 290 | blo 1b |
@@ -283,14 +316,17 @@ __create_page_tables: | |||
283 | str r3, [r0] | 316 | str r3, [r0] |
284 | #endif | 317 | #endif |
285 | #endif | 318 | #endif |
319 | #ifdef CONFIG_ARM_LPAE | ||
320 | sub r4, r4, #0x1000 @ point to the PGD table | ||
321 | #endif | ||
286 | mov pc, lr | 322 | mov pc, lr |
287 | ENDPROC(__create_page_tables) | 323 | ENDPROC(__create_page_tables) |
288 | .ltorg | 324 | .ltorg |
289 | .align | 325 | .align |
290 | __enable_mmu_loc: | 326 | __turn_mmu_on_loc: |
291 | .long . | 327 | .long . |
292 | .long __enable_mmu | 328 | .long __turn_mmu_on |
293 | .long __enable_mmu_end | 329 | .long __turn_mmu_on_end |
294 | 330 | ||
295 | #if defined(CONFIG_SMP) | 331 | #if defined(CONFIG_SMP) |
296 | __CPUINIT | 332 | __CPUINIT |
@@ -374,12 +410,17 @@ __enable_mmu: | |||
374 | #ifdef CONFIG_CPU_ICACHE_DISABLE | 410 | #ifdef CONFIG_CPU_ICACHE_DISABLE |
375 | bic r0, r0, #CR_I | 411 | bic r0, r0, #CR_I |
376 | #endif | 412 | #endif |
413 | #ifdef CONFIG_ARM_LPAE | ||
414 | mov r5, #0 | ||
415 | mcrr p15, 0, r4, r5, c2 @ load TTBR0 | ||
416 | #else | ||
377 | mov r5, #(domain_val(DOMAIN_USER, DOMAIN_MANAGER) | \ | 417 | mov r5, #(domain_val(DOMAIN_USER, DOMAIN_MANAGER) | \ |
378 | domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) | \ | 418 | domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) | \ |
379 | domain_val(DOMAIN_TABLE, DOMAIN_MANAGER) | \ | 419 | domain_val(DOMAIN_TABLE, DOMAIN_MANAGER) | \ |
380 | domain_val(DOMAIN_IO, DOMAIN_CLIENT)) | 420 | domain_val(DOMAIN_IO, DOMAIN_CLIENT)) |
381 | mcr p15, 0, r5, c3, c0, 0 @ load domain access register | 421 | mcr p15, 0, r5, c3, c0, 0 @ load domain access register |
382 | mcr p15, 0, r4, c2, c0, 0 @ load page table pointer | 422 | mcr p15, 0, r4, c2, c0, 0 @ load page table pointer |
423 | #endif | ||
383 | b __turn_mmu_on | 424 | b __turn_mmu_on |
384 | ENDPROC(__enable_mmu) | 425 | ENDPROC(__enable_mmu) |
385 | 426 | ||
@@ -398,15 +439,19 @@ ENDPROC(__enable_mmu) | |||
398 | * other registers depend on the function called upon completion | 439 | * other registers depend on the function called upon completion |
399 | */ | 440 | */ |
400 | .align 5 | 441 | .align 5 |
401 | __turn_mmu_on: | 442 | .pushsection .idmap.text, "ax" |
443 | ENTRY(__turn_mmu_on) | ||
402 | mov r0, r0 | 444 | mov r0, r0 |
445 | instr_sync | ||
403 | mcr p15, 0, r0, c1, c0, 0 @ write control reg | 446 | mcr p15, 0, r0, c1, c0, 0 @ write control reg |
404 | mrc p15, 0, r3, c0, c0, 0 @ read id reg | 447 | mrc p15, 0, r3, c0, c0, 0 @ read id reg |
448 | instr_sync | ||
405 | mov r3, r3 | 449 | mov r3, r3 |
406 | mov r3, r13 | 450 | mov r3, r13 |
407 | mov pc, r3 | 451 | mov pc, r3 |
408 | __enable_mmu_end: | 452 | __turn_mmu_on_end: |
409 | ENDPROC(__turn_mmu_on) | 453 | ENDPROC(__turn_mmu_on) |
454 | .popsection | ||
410 | 455 | ||
411 | 456 | ||
412 | #ifdef CONFIG_SMP_ON_UP | 457 | #ifdef CONFIG_SMP_ON_UP |
diff --git a/arch/arm/kernel/hw_breakpoint.c b/arch/arm/kernel/hw_breakpoint.c index 814a52a9dc3..d6a95ef9131 100644 --- a/arch/arm/kernel/hw_breakpoint.c +++ b/arch/arm/kernel/hw_breakpoint.c | |||
@@ -1016,10 +1016,10 @@ static int __init arch_hw_breakpoint_init(void) | |||
1016 | } | 1016 | } |
1017 | 1017 | ||
1018 | /* Register debug fault handler. */ | 1018 | /* Register debug fault handler. */ |
1019 | hook_fault_code(2, hw_breakpoint_pending, SIGTRAP, TRAP_HWBKPT, | 1019 | hook_fault_code(FAULT_CODE_DEBUG, hw_breakpoint_pending, SIGTRAP, |
1020 | "watchpoint debug exception"); | 1020 | TRAP_HWBKPT, "watchpoint debug exception"); |
1021 | hook_ifault_code(2, hw_breakpoint_pending, SIGTRAP, TRAP_HWBKPT, | 1021 | hook_ifault_code(FAULT_CODE_DEBUG, hw_breakpoint_pending, SIGTRAP, |
1022 | "breakpoint debug exception"); | 1022 | TRAP_HWBKPT, "breakpoint debug exception"); |
1023 | 1023 | ||
1024 | /* Register hotplug notifier. */ | 1024 | /* Register hotplug notifier. */ |
1025 | register_cpu_notifier(&dbg_reset_nb); | 1025 | register_cpu_notifier(&dbg_reset_nb); |
diff --git a/arch/arm/kernel/kprobes-test.c b/arch/arm/kernel/kprobes-test.c index e17cdd6d90d..1862d8f2fd4 100644 --- a/arch/arm/kernel/kprobes-test.c +++ b/arch/arm/kernel/kprobes-test.c | |||
@@ -202,6 +202,8 @@ | |||
202 | #include <linux/slab.h> | 202 | #include <linux/slab.h> |
203 | #include <linux/kprobes.h> | 203 | #include <linux/kprobes.h> |
204 | 204 | ||
205 | #include <asm/opcodes.h> | ||
206 | |||
205 | #include "kprobes.h" | 207 | #include "kprobes.h" |
206 | #include "kprobes-test.h" | 208 | #include "kprobes-test.h" |
207 | 209 | ||
@@ -1050,65 +1052,9 @@ static int test_instance; | |||
1050 | 1052 | ||
1051 | static unsigned long test_check_cc(int cc, unsigned long cpsr) | 1053 | static unsigned long test_check_cc(int cc, unsigned long cpsr) |
1052 | { | 1054 | { |
1053 | unsigned long temp; | 1055 | int ret = arm_check_condition(cc << 28, cpsr); |
1054 | |||
1055 | switch (cc) { | ||
1056 | case 0x0: /* eq */ | ||
1057 | return cpsr & PSR_Z_BIT; | ||
1058 | |||
1059 | case 0x1: /* ne */ | ||
1060 | return (~cpsr) & PSR_Z_BIT; | ||
1061 | |||
1062 | case 0x2: /* cs */ | ||
1063 | return cpsr & PSR_C_BIT; | ||
1064 | |||
1065 | case 0x3: /* cc */ | ||
1066 | return (~cpsr) & PSR_C_BIT; | ||
1067 | |||
1068 | case 0x4: /* mi */ | ||
1069 | return cpsr & PSR_N_BIT; | ||
1070 | |||
1071 | case 0x5: /* pl */ | ||
1072 | return (~cpsr) & PSR_N_BIT; | ||
1073 | |||
1074 | case 0x6: /* vs */ | ||
1075 | return cpsr & PSR_V_BIT; | ||
1076 | |||
1077 | case 0x7: /* vc */ | ||
1078 | return (~cpsr) & PSR_V_BIT; | ||
1079 | 1056 | ||
1080 | case 0x8: /* hi */ | 1057 | return (ret != ARM_OPCODE_CONDTEST_FAIL); |
1081 | cpsr &= ~(cpsr >> 1); /* PSR_C_BIT &= ~PSR_Z_BIT */ | ||
1082 | return cpsr & PSR_C_BIT; | ||
1083 | |||
1084 | case 0x9: /* ls */ | ||
1085 | cpsr &= ~(cpsr >> 1); /* PSR_C_BIT &= ~PSR_Z_BIT */ | ||
1086 | return (~cpsr) & PSR_C_BIT; | ||
1087 | |||
1088 | case 0xa: /* ge */ | ||
1089 | cpsr ^= (cpsr << 3); /* PSR_N_BIT ^= PSR_V_BIT */ | ||
1090 | return (~cpsr) & PSR_N_BIT; | ||
1091 | |||
1092 | case 0xb: /* lt */ | ||
1093 | cpsr ^= (cpsr << 3); /* PSR_N_BIT ^= PSR_V_BIT */ | ||
1094 | return cpsr & PSR_N_BIT; | ||
1095 | |||
1096 | case 0xc: /* gt */ | ||
1097 | temp = cpsr ^ (cpsr << 3); /* PSR_N_BIT ^= PSR_V_BIT */ | ||
1098 | temp |= (cpsr << 1); /* PSR_N_BIT |= PSR_Z_BIT */ | ||
1099 | return (~temp) & PSR_N_BIT; | ||
1100 | |||
1101 | case 0xd: /* le */ | ||
1102 | temp = cpsr ^ (cpsr << 3); /* PSR_N_BIT ^= PSR_V_BIT */ | ||
1103 | temp |= (cpsr << 1); /* PSR_N_BIT |= PSR_Z_BIT */ | ||
1104 | return temp & PSR_N_BIT; | ||
1105 | |||
1106 | case 0xe: /* al */ | ||
1107 | case 0xf: /* unconditional */ | ||
1108 | return true; | ||
1109 | } | ||
1110 | BUG(); | ||
1111 | return false; | ||
1112 | } | 1058 | } |
1113 | 1059 | ||
1114 | static int is_last_scenario; | 1060 | static int is_last_scenario; |
@@ -1128,7 +1074,9 @@ static unsigned long test_context_cpsr(int scenario) | |||
1128 | 1074 | ||
1129 | if (!test_case_is_thumb) { | 1075 | if (!test_case_is_thumb) { |
1130 | /* Testing ARM code */ | 1076 | /* Testing ARM code */ |
1131 | probe_should_run = test_check_cc(current_instruction >> 28, cpsr) != 0; | 1077 | int cc = current_instruction >> 28; |
1078 | |||
1079 | probe_should_run = test_check_cc(cc, cpsr) != 0; | ||
1132 | if (scenario == 15) | 1080 | if (scenario == 15) |
1133 | is_last_scenario = true; | 1081 | is_last_scenario = true; |
1134 | 1082 | ||
diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c index 29620b632ed..764bd456d84 100644 --- a/arch/arm/kernel/machine_kexec.c +++ b/arch/arm/kernel/machine_kexec.c | |||
@@ -12,12 +12,11 @@ | |||
12 | #include <asm/mmu_context.h> | 12 | #include <asm/mmu_context.h> |
13 | #include <asm/cacheflush.h> | 13 | #include <asm/cacheflush.h> |
14 | #include <asm/mach-types.h> | 14 | #include <asm/mach-types.h> |
15 | #include <asm/system.h> | ||
15 | 16 | ||
16 | extern const unsigned char relocate_new_kernel[]; | 17 | extern const unsigned char relocate_new_kernel[]; |
17 | extern const unsigned int relocate_new_kernel_size; | 18 | extern const unsigned int relocate_new_kernel_size; |
18 | 19 | ||
19 | extern void setup_mm_for_reboot(void); | ||
20 | |||
21 | extern unsigned long kexec_start_address; | 20 | extern unsigned long kexec_start_address; |
22 | extern unsigned long kexec_indirection_page; | 21 | extern unsigned long kexec_indirection_page; |
23 | extern unsigned long kexec_mach_type; | 22 | extern unsigned long kexec_mach_type; |
@@ -111,14 +110,6 @@ void machine_kexec(struct kimage *image) | |||
111 | 110 | ||
112 | if (kexec_reinit) | 111 | if (kexec_reinit) |
113 | kexec_reinit(); | 112 | kexec_reinit(); |
114 | local_irq_disable(); | 113 | |
115 | local_fiq_disable(); | 114 | soft_restart(reboot_code_buffer_phys); |
116 | setup_mm_for_reboot(); | ||
117 | flush_cache_all(); | ||
118 | outer_flush_all(); | ||
119 | outer_disable(); | ||
120 | cpu_proc_fin(); | ||
121 | outer_inv_all(); | ||
122 | flush_cache_all(); | ||
123 | cpu_reset(reboot_code_buffer_phys); | ||
124 | } | 115 | } |
diff --git a/arch/arm/kernel/opcodes.c b/arch/arm/kernel/opcodes.c new file mode 100644 index 00000000000..f8179c6a817 --- /dev/null +++ b/arch/arm/kernel/opcodes.c | |||
@@ -0,0 +1,72 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/kernel/opcodes.c | ||
3 | * | ||
4 | * A32 condition code lookup feature moved from nwfpe/fpopcode.c | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/module.h> | ||
12 | #include <asm/opcodes.h> | ||
13 | |||
14 | #define ARM_OPCODE_CONDITION_UNCOND 0xf | ||
15 | |||
16 | /* | ||
17 | * condition code lookup table | ||
18 | * index into the table is test code: EQ, NE, ... LT, GT, AL, NV | ||
19 | * | ||
20 | * bit position in short is condition code: NZCV | ||
21 | */ | ||
22 | static const unsigned short cc_map[16] = { | ||
23 | 0xF0F0, /* EQ == Z set */ | ||
24 | 0x0F0F, /* NE */ | ||
25 | 0xCCCC, /* CS == C set */ | ||
26 | 0x3333, /* CC */ | ||
27 | 0xFF00, /* MI == N set */ | ||
28 | 0x00FF, /* PL */ | ||
29 | 0xAAAA, /* VS == V set */ | ||
30 | 0x5555, /* VC */ | ||
31 | 0x0C0C, /* HI == C set && Z clear */ | ||
32 | 0xF3F3, /* LS == C clear || Z set */ | ||
33 | 0xAA55, /* GE == (N==V) */ | ||
34 | 0x55AA, /* LT == (N!=V) */ | ||
35 | 0x0A05, /* GT == (!Z && (N==V)) */ | ||
36 | 0xF5FA, /* LE == (Z || (N!=V)) */ | ||
37 | 0xFFFF, /* AL always */ | ||
38 | 0 /* NV */ | ||
39 | }; | ||
40 | |||
41 | /* | ||
42 | * Returns: | ||
43 | * ARM_OPCODE_CONDTEST_FAIL - if condition fails | ||
44 | * ARM_OPCODE_CONDTEST_PASS - if condition passes (including AL) | ||
45 | * ARM_OPCODE_CONDTEST_UNCOND - if NV condition, or separate unconditional | ||
46 | * opcode space from v5 onwards | ||
47 | * | ||
48 | * Code that tests whether a conditional instruction would pass its condition | ||
49 | * check should check that return value == ARM_OPCODE_CONDTEST_PASS. | ||
50 | * | ||
51 | * Code that tests if a condition means that the instruction would be executed | ||
52 | * (regardless of conditional or unconditional) should instead check that the | ||
53 | * return value != ARM_OPCODE_CONDTEST_FAIL. | ||
54 | */ | ||
55 | asmlinkage unsigned int arm_check_condition(u32 opcode, u32 psr) | ||
56 | { | ||
57 | u32 cc_bits = opcode >> 28; | ||
58 | u32 psr_cond = psr >> 28; | ||
59 | unsigned int ret; | ||
60 | |||
61 | if (cc_bits != ARM_OPCODE_CONDITION_UNCOND) { | ||
62 | if ((cc_map[cc_bits] >> (psr_cond)) & 1) | ||
63 | ret = ARM_OPCODE_CONDTEST_PASS; | ||
64 | else | ||
65 | ret = ARM_OPCODE_CONDTEST_FAIL; | ||
66 | } else { | ||
67 | ret = ARM_OPCODE_CONDTEST_UNCOND; | ||
68 | } | ||
69 | |||
70 | return ret; | ||
71 | } | ||
72 | EXPORT_SYMBOL_GPL(arm_check_condition); | ||
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index 88b0941ce51..5bb91bf3d47 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c | |||
@@ -59,8 +59,7 @@ armpmu_get_pmu_id(void) | |||
59 | } | 59 | } |
60 | EXPORT_SYMBOL_GPL(armpmu_get_pmu_id); | 60 | EXPORT_SYMBOL_GPL(armpmu_get_pmu_id); |
61 | 61 | ||
62 | int | 62 | int perf_num_counters(void) |
63 | armpmu_get_max_events(void) | ||
64 | { | 63 | { |
65 | int max_events = 0; | 64 | int max_events = 0; |
66 | 65 | ||
@@ -69,12 +68,6 @@ armpmu_get_max_events(void) | |||
69 | 68 | ||
70 | return max_events; | 69 | return max_events; |
71 | } | 70 | } |
72 | EXPORT_SYMBOL_GPL(armpmu_get_max_events); | ||
73 | |||
74 | int perf_num_counters(void) | ||
75 | { | ||
76 | return armpmu_get_max_events(); | ||
77 | } | ||
78 | EXPORT_SYMBOL_GPL(perf_num_counters); | 71 | EXPORT_SYMBOL_GPL(perf_num_counters); |
79 | 72 | ||
80 | #define HW_OP_UNSUPPORTED 0xFFFF | 73 | #define HW_OP_UNSUPPORTED 0xFFFF |
@@ -380,6 +373,8 @@ armpmu_release_hardware(struct arm_pmu *armpmu) | |||
380 | { | 373 | { |
381 | int i, irq, irqs; | 374 | int i, irq, irqs; |
382 | struct platform_device *pmu_device = armpmu->plat_device; | 375 | struct platform_device *pmu_device = armpmu->plat_device; |
376 | struct arm_pmu_platdata *plat = | ||
377 | dev_get_platdata(&pmu_device->dev); | ||
383 | 378 | ||
384 | irqs = min(pmu_device->num_resources, num_possible_cpus()); | 379 | irqs = min(pmu_device->num_resources, num_possible_cpus()); |
385 | 380 | ||
@@ -387,8 +382,11 @@ armpmu_release_hardware(struct arm_pmu *armpmu) | |||
387 | if (!cpumask_test_and_clear_cpu(i, &armpmu->active_irqs)) | 382 | if (!cpumask_test_and_clear_cpu(i, &armpmu->active_irqs)) |
388 | continue; | 383 | continue; |
389 | irq = platform_get_irq(pmu_device, i); | 384 | irq = platform_get_irq(pmu_device, i); |
390 | if (irq >= 0) | 385 | if (irq >= 0) { |
386 | if (plat && plat->disable_irq) | ||
387 | plat->disable_irq(irq); | ||
391 | free_irq(irq, armpmu); | 388 | free_irq(irq, armpmu); |
389 | } | ||
392 | } | 390 | } |
393 | 391 | ||
394 | release_pmu(armpmu->type); | 392 | release_pmu(armpmu->type); |
@@ -448,7 +446,8 @@ armpmu_reserve_hardware(struct arm_pmu *armpmu) | |||
448 | irq); | 446 | irq); |
449 | armpmu_release_hardware(armpmu); | 447 | armpmu_release_hardware(armpmu); |
450 | return err; | 448 | return err; |
451 | } | 449 | } else if (plat && plat->enable_irq) |
450 | plat->enable_irq(irq); | ||
452 | 451 | ||
453 | cpumask_set_cpu(i, &armpmu->active_irqs); | 452 | cpumask_set_cpu(i, &armpmu->active_irqs); |
454 | } | 453 | } |
diff --git a/arch/arm/kernel/perf_event_v6.c b/arch/arm/kernel/perf_event_v6.c index e63d8115c01..533be9930ec 100644 --- a/arch/arm/kernel/perf_event_v6.c +++ b/arch/arm/kernel/perf_event_v6.c | |||
@@ -65,13 +65,15 @@ enum armv6_counters { | |||
65 | * accesses/misses in hardware. | 65 | * accesses/misses in hardware. |
66 | */ | 66 | */ |
67 | static const unsigned armv6_perf_map[PERF_COUNT_HW_MAX] = { | 67 | static const unsigned armv6_perf_map[PERF_COUNT_HW_MAX] = { |
68 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV6_PERFCTR_CPU_CYCLES, | 68 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV6_PERFCTR_CPU_CYCLES, |
69 | [PERF_COUNT_HW_INSTRUCTIONS] = ARMV6_PERFCTR_INSTR_EXEC, | 69 | [PERF_COUNT_HW_INSTRUCTIONS] = ARMV6_PERFCTR_INSTR_EXEC, |
70 | [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, | 70 | [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, |
71 | [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, | 71 | [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, |
72 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV6_PERFCTR_BR_EXEC, | 72 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV6_PERFCTR_BR_EXEC, |
73 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV6_PERFCTR_BR_MISPREDICT, | 73 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV6_PERFCTR_BR_MISPREDICT, |
74 | [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, | 74 | [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, |
75 | [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = ARMV6_PERFCTR_IBUF_STALL, | ||
76 | [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = ARMV6_PERFCTR_LSU_FULL_STALL, | ||
75 | }; | 77 | }; |
76 | 78 | ||
77 | static const unsigned armv6_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | 79 | static const unsigned armv6_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] |
@@ -218,13 +220,15 @@ enum armv6mpcore_perf_types { | |||
218 | * accesses/misses in hardware. | 220 | * accesses/misses in hardware. |
219 | */ | 221 | */ |
220 | static const unsigned armv6mpcore_perf_map[PERF_COUNT_HW_MAX] = { | 222 | static const unsigned armv6mpcore_perf_map[PERF_COUNT_HW_MAX] = { |
221 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV6MPCORE_PERFCTR_CPU_CYCLES, | 223 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV6MPCORE_PERFCTR_CPU_CYCLES, |
222 | [PERF_COUNT_HW_INSTRUCTIONS] = ARMV6MPCORE_PERFCTR_INSTR_EXEC, | 224 | [PERF_COUNT_HW_INSTRUCTIONS] = ARMV6MPCORE_PERFCTR_INSTR_EXEC, |
223 | [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, | 225 | [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, |
224 | [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, | 226 | [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, |
225 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV6MPCORE_PERFCTR_BR_EXEC, | 227 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV6MPCORE_PERFCTR_BR_EXEC, |
226 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV6MPCORE_PERFCTR_BR_MISPREDICT, | 228 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV6MPCORE_PERFCTR_BR_MISPREDICT, |
227 | [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, | 229 | [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, |
230 | [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = ARMV6MPCORE_PERFCTR_IBUF_STALL, | ||
231 | [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = ARMV6MPCORE_PERFCTR_LSU_FULL_STALL, | ||
228 | }; | 232 | }; |
229 | 233 | ||
230 | static const unsigned armv6mpcore_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | 234 | static const unsigned armv6mpcore_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] |
diff --git a/arch/arm/kernel/perf_event_v7.c b/arch/arm/kernel/perf_event_v7.c index 1ef6d0034b8..460bbbb6b88 100644 --- a/arch/arm/kernel/perf_event_v7.c +++ b/arch/arm/kernel/perf_event_v7.c | |||
@@ -28,165 +28,87 @@ static struct arm_pmu armv7pmu; | |||
28 | * they are not available. | 28 | * they are not available. |
29 | */ | 29 | */ |
30 | enum armv7_perf_types { | 30 | enum armv7_perf_types { |
31 | ARMV7_PERFCTR_PMNC_SW_INCR = 0x00, | 31 | ARMV7_PERFCTR_PMNC_SW_INCR = 0x00, |
32 | ARMV7_PERFCTR_IFETCH_MISS = 0x01, | 32 | ARMV7_PERFCTR_L1_ICACHE_REFILL = 0x01, |
33 | ARMV7_PERFCTR_ITLB_MISS = 0x02, | 33 | ARMV7_PERFCTR_ITLB_REFILL = 0x02, |
34 | ARMV7_PERFCTR_DCACHE_REFILL = 0x03, /* L1 */ | 34 | ARMV7_PERFCTR_L1_DCACHE_REFILL = 0x03, |
35 | ARMV7_PERFCTR_DCACHE_ACCESS = 0x04, /* L1 */ | 35 | ARMV7_PERFCTR_L1_DCACHE_ACCESS = 0x04, |
36 | ARMV7_PERFCTR_DTLB_REFILL = 0x05, | 36 | ARMV7_PERFCTR_DTLB_REFILL = 0x05, |
37 | ARMV7_PERFCTR_DREAD = 0x06, | 37 | ARMV7_PERFCTR_MEM_READ = 0x06, |
38 | ARMV7_PERFCTR_DWRITE = 0x07, | 38 | ARMV7_PERFCTR_MEM_WRITE = 0x07, |
39 | ARMV7_PERFCTR_INSTR_EXECUTED = 0x08, | 39 | ARMV7_PERFCTR_INSTR_EXECUTED = 0x08, |
40 | ARMV7_PERFCTR_EXC_TAKEN = 0x09, | 40 | ARMV7_PERFCTR_EXC_TAKEN = 0x09, |
41 | ARMV7_PERFCTR_EXC_EXECUTED = 0x0A, | 41 | ARMV7_PERFCTR_EXC_EXECUTED = 0x0A, |
42 | ARMV7_PERFCTR_CID_WRITE = 0x0B, | 42 | ARMV7_PERFCTR_CID_WRITE = 0x0B, |
43 | /* ARMV7_PERFCTR_PC_WRITE is equivalent to HW_BRANCH_INSTRUCTIONS. | 43 | |
44 | /* | ||
45 | * ARMV7_PERFCTR_PC_WRITE is equivalent to HW_BRANCH_INSTRUCTIONS. | ||
44 | * It counts: | 46 | * It counts: |
45 | * - all branch instructions, | 47 | * - all (taken) branch instructions, |
46 | * - instructions that explicitly write the PC, | 48 | * - instructions that explicitly write the PC, |
47 | * - exception generating instructions. | 49 | * - exception generating instructions. |
48 | */ | 50 | */ |
49 | ARMV7_PERFCTR_PC_WRITE = 0x0C, | 51 | ARMV7_PERFCTR_PC_WRITE = 0x0C, |
50 | ARMV7_PERFCTR_PC_IMM_BRANCH = 0x0D, | 52 | ARMV7_PERFCTR_PC_IMM_BRANCH = 0x0D, |
51 | ARMV7_PERFCTR_PC_PROC_RETURN = 0x0E, | 53 | ARMV7_PERFCTR_PC_PROC_RETURN = 0x0E, |
52 | ARMV7_PERFCTR_UNALIGNED_ACCESS = 0x0F, | 54 | ARMV7_PERFCTR_MEM_UNALIGNED_ACCESS = 0x0F, |
55 | ARMV7_PERFCTR_PC_BRANCH_MIS_PRED = 0x10, | ||
56 | ARMV7_PERFCTR_CLOCK_CYCLES = 0x11, | ||
57 | ARMV7_PERFCTR_PC_BRANCH_PRED = 0x12, | ||
53 | 58 | ||
54 | /* These events are defined by the PMUv2 supplement (ARM DDI 0457A). */ | 59 | /* These events are defined by the PMUv2 supplement (ARM DDI 0457A). */ |
55 | ARMV7_PERFCTR_PC_BRANCH_MIS_PRED = 0x10, | 60 | ARMV7_PERFCTR_MEM_ACCESS = 0x13, |
56 | ARMV7_PERFCTR_CLOCK_CYCLES = 0x11, | 61 | ARMV7_PERFCTR_L1_ICACHE_ACCESS = 0x14, |
57 | ARMV7_PERFCTR_PC_BRANCH_PRED = 0x12, | 62 | ARMV7_PERFCTR_L1_DCACHE_WB = 0x15, |
58 | ARMV7_PERFCTR_MEM_ACCESS = 0x13, | 63 | ARMV7_PERFCTR_L2_CACHE_ACCESS = 0x16, |
59 | ARMV7_PERFCTR_L1_ICACHE_ACCESS = 0x14, | 64 | ARMV7_PERFCTR_L2_CACHE_REFILL = 0x17, |
60 | ARMV7_PERFCTR_L1_DCACHE_WB = 0x15, | 65 | ARMV7_PERFCTR_L2_CACHE_WB = 0x18, |
61 | ARMV7_PERFCTR_L2_DCACHE_ACCESS = 0x16, | 66 | ARMV7_PERFCTR_BUS_ACCESS = 0x19, |
62 | ARMV7_PERFCTR_L2_DCACHE_REFILL = 0x17, | 67 | ARMV7_PERFCTR_MEM_ERROR = 0x1A, |
63 | ARMV7_PERFCTR_L2_DCACHE_WB = 0x18, | 68 | ARMV7_PERFCTR_INSTR_SPEC = 0x1B, |
64 | ARMV7_PERFCTR_BUS_ACCESS = 0x19, | 69 | ARMV7_PERFCTR_TTBR_WRITE = 0x1C, |
65 | ARMV7_PERFCTR_MEMORY_ERROR = 0x1A, | 70 | ARMV7_PERFCTR_BUS_CYCLES = 0x1D, |
66 | ARMV7_PERFCTR_INSTR_SPEC = 0x1B, | 71 | |
67 | ARMV7_PERFCTR_TTBR_WRITE = 0x1C, | 72 | ARMV7_PERFCTR_CPU_CYCLES = 0xFF |
68 | ARMV7_PERFCTR_BUS_CYCLES = 0x1D, | ||
69 | |||
70 | ARMV7_PERFCTR_CPU_CYCLES = 0xFF | ||
71 | }; | 73 | }; |
72 | 74 | ||
73 | /* ARMv7 Cortex-A8 specific event types */ | 75 | /* ARMv7 Cortex-A8 specific event types */ |
74 | enum armv7_a8_perf_types { | 76 | enum armv7_a8_perf_types { |
75 | ARMV7_PERFCTR_WRITE_BUFFER_FULL = 0x40, | 77 | ARMV7_A8_PERFCTR_L2_CACHE_ACCESS = 0x43, |
76 | ARMV7_PERFCTR_L2_STORE_MERGED = 0x41, | 78 | ARMV7_A8_PERFCTR_L2_CACHE_REFILL = 0x44, |
77 | ARMV7_PERFCTR_L2_STORE_BUFF = 0x42, | 79 | ARMV7_A8_PERFCTR_L1_ICACHE_ACCESS = 0x50, |
78 | ARMV7_PERFCTR_L2_ACCESS = 0x43, | 80 | ARMV7_A8_PERFCTR_STALL_ISIDE = 0x56, |
79 | ARMV7_PERFCTR_L2_CACH_MISS = 0x44, | ||
80 | ARMV7_PERFCTR_AXI_READ_CYCLES = 0x45, | ||
81 | ARMV7_PERFCTR_AXI_WRITE_CYCLES = 0x46, | ||
82 | ARMV7_PERFCTR_MEMORY_REPLAY = 0x47, | ||
83 | ARMV7_PERFCTR_UNALIGNED_ACCESS_REPLAY = 0x48, | ||
84 | ARMV7_PERFCTR_L1_DATA_MISS = 0x49, | ||
85 | ARMV7_PERFCTR_L1_INST_MISS = 0x4A, | ||
86 | ARMV7_PERFCTR_L1_DATA_COLORING = 0x4B, | ||
87 | ARMV7_PERFCTR_L1_NEON_DATA = 0x4C, | ||
88 | ARMV7_PERFCTR_L1_NEON_CACH_DATA = 0x4D, | ||
89 | ARMV7_PERFCTR_L2_NEON = 0x4E, | ||
90 | ARMV7_PERFCTR_L2_NEON_HIT = 0x4F, | ||
91 | ARMV7_PERFCTR_L1_INST = 0x50, | ||
92 | ARMV7_PERFCTR_PC_RETURN_MIS_PRED = 0x51, | ||
93 | ARMV7_PERFCTR_PC_BRANCH_FAILED = 0x52, | ||
94 | ARMV7_PERFCTR_PC_BRANCH_TAKEN = 0x53, | ||
95 | ARMV7_PERFCTR_PC_BRANCH_EXECUTED = 0x54, | ||
96 | ARMV7_PERFCTR_OP_EXECUTED = 0x55, | ||
97 | ARMV7_PERFCTR_CYCLES_INST_STALL = 0x56, | ||
98 | ARMV7_PERFCTR_CYCLES_INST = 0x57, | ||
99 | ARMV7_PERFCTR_CYCLES_NEON_DATA_STALL = 0x58, | ||
100 | ARMV7_PERFCTR_CYCLES_NEON_INST_STALL = 0x59, | ||
101 | ARMV7_PERFCTR_NEON_CYCLES = 0x5A, | ||
102 | |||
103 | ARMV7_PERFCTR_PMU0_EVENTS = 0x70, | ||
104 | ARMV7_PERFCTR_PMU1_EVENTS = 0x71, | ||
105 | ARMV7_PERFCTR_PMU_EVENTS = 0x72, | ||
106 | }; | 81 | }; |
107 | 82 | ||
108 | /* ARMv7 Cortex-A9 specific event types */ | 83 | /* ARMv7 Cortex-A9 specific event types */ |
109 | enum armv7_a9_perf_types { | 84 | enum armv7_a9_perf_types { |
110 | ARMV7_PERFCTR_JAVA_HW_BYTECODE_EXEC = 0x40, | 85 | ARMV7_A9_PERFCTR_INSTR_CORE_RENAME = 0x68, |
111 | ARMV7_PERFCTR_JAVA_SW_BYTECODE_EXEC = 0x41, | 86 | ARMV7_A9_PERFCTR_STALL_ICACHE = 0x60, |
112 | ARMV7_PERFCTR_JAZELLE_BRANCH_EXEC = 0x42, | 87 | ARMV7_A9_PERFCTR_STALL_DISPATCH = 0x66, |
113 | |||
114 | ARMV7_PERFCTR_COHERENT_LINE_MISS = 0x50, | ||
115 | ARMV7_PERFCTR_COHERENT_LINE_HIT = 0x51, | ||
116 | |||
117 | ARMV7_PERFCTR_ICACHE_DEP_STALL_CYCLES = 0x60, | ||
118 | ARMV7_PERFCTR_DCACHE_DEP_STALL_CYCLES = 0x61, | ||
119 | ARMV7_PERFCTR_TLB_MISS_DEP_STALL_CYCLES = 0x62, | ||
120 | ARMV7_PERFCTR_STREX_EXECUTED_PASSED = 0x63, | ||
121 | ARMV7_PERFCTR_STREX_EXECUTED_FAILED = 0x64, | ||
122 | ARMV7_PERFCTR_DATA_EVICTION = 0x65, | ||
123 | ARMV7_PERFCTR_ISSUE_STAGE_NO_INST = 0x66, | ||
124 | ARMV7_PERFCTR_ISSUE_STAGE_EMPTY = 0x67, | ||
125 | ARMV7_PERFCTR_INST_OUT_OF_RENAME_STAGE = 0x68, | ||
126 | |||
127 | ARMV7_PERFCTR_PREDICTABLE_FUNCT_RETURNS = 0x6E, | ||
128 | |||
129 | ARMV7_PERFCTR_MAIN_UNIT_EXECUTED_INST = 0x70, | ||
130 | ARMV7_PERFCTR_SECOND_UNIT_EXECUTED_INST = 0x71, | ||
131 | ARMV7_PERFCTR_LD_ST_UNIT_EXECUTED_INST = 0x72, | ||
132 | ARMV7_PERFCTR_FP_EXECUTED_INST = 0x73, | ||
133 | ARMV7_PERFCTR_NEON_EXECUTED_INST = 0x74, | ||
134 | |||
135 | ARMV7_PERFCTR_PLD_FULL_DEP_STALL_CYCLES = 0x80, | ||
136 | ARMV7_PERFCTR_DATA_WR_DEP_STALL_CYCLES = 0x81, | ||
137 | ARMV7_PERFCTR_ITLB_MISS_DEP_STALL_CYCLES = 0x82, | ||
138 | ARMV7_PERFCTR_DTLB_MISS_DEP_STALL_CYCLES = 0x83, | ||
139 | ARMV7_PERFCTR_MICRO_ITLB_MISS_DEP_STALL_CYCLES = 0x84, | ||
140 | ARMV7_PERFCTR_MICRO_DTLB_MISS_DEP_STALL_CYCLES = 0x85, | ||
141 | ARMV7_PERFCTR_DMB_DEP_STALL_CYCLES = 0x86, | ||
142 | |||
143 | ARMV7_PERFCTR_INTGR_CLK_ENABLED_CYCLES = 0x8A, | ||
144 | ARMV7_PERFCTR_DATA_ENGINE_CLK_EN_CYCLES = 0x8B, | ||
145 | |||
146 | ARMV7_PERFCTR_ISB_INST = 0x90, | ||
147 | ARMV7_PERFCTR_DSB_INST = 0x91, | ||
148 | ARMV7_PERFCTR_DMB_INST = 0x92, | ||
149 | ARMV7_PERFCTR_EXT_INTERRUPTS = 0x93, | ||
150 | |||
151 | ARMV7_PERFCTR_PLE_CACHE_LINE_RQST_COMPLETED = 0xA0, | ||
152 | ARMV7_PERFCTR_PLE_CACHE_LINE_RQST_SKIPPED = 0xA1, | ||
153 | ARMV7_PERFCTR_PLE_FIFO_FLUSH = 0xA2, | ||
154 | ARMV7_PERFCTR_PLE_RQST_COMPLETED = 0xA3, | ||
155 | ARMV7_PERFCTR_PLE_FIFO_OVERFLOW = 0xA4, | ||
156 | ARMV7_PERFCTR_PLE_RQST_PROG = 0xA5 | ||
157 | }; | 88 | }; |
158 | 89 | ||
159 | /* ARMv7 Cortex-A5 specific event types */ | 90 | /* ARMv7 Cortex-A5 specific event types */ |
160 | enum armv7_a5_perf_types { | 91 | enum armv7_a5_perf_types { |
161 | ARMV7_PERFCTR_IRQ_TAKEN = 0x86, | 92 | ARMV7_A5_PERFCTR_PREFETCH_LINEFILL = 0xc2, |
162 | ARMV7_PERFCTR_FIQ_TAKEN = 0x87, | 93 | ARMV7_A5_PERFCTR_PREFETCH_LINEFILL_DROP = 0xc3, |
163 | |||
164 | ARMV7_PERFCTR_EXT_MEM_RQST = 0xc0, | ||
165 | ARMV7_PERFCTR_NC_EXT_MEM_RQST = 0xc1, | ||
166 | ARMV7_PERFCTR_PREFETCH_LINEFILL = 0xc2, | ||
167 | ARMV7_PERFCTR_PREFETCH_LINEFILL_DROP = 0xc3, | ||
168 | ARMV7_PERFCTR_ENTER_READ_ALLOC = 0xc4, | ||
169 | ARMV7_PERFCTR_READ_ALLOC = 0xc5, | ||
170 | |||
171 | ARMV7_PERFCTR_STALL_SB_FULL = 0xc9, | ||
172 | }; | 94 | }; |
173 | 95 | ||
174 | /* ARMv7 Cortex-A15 specific event types */ | 96 | /* ARMv7 Cortex-A15 specific event types */ |
175 | enum armv7_a15_perf_types { | 97 | enum armv7_a15_perf_types { |
176 | ARMV7_PERFCTR_L1_DCACHE_READ_ACCESS = 0x40, | 98 | ARMV7_A15_PERFCTR_L1_DCACHE_ACCESS_READ = 0x40, |
177 | ARMV7_PERFCTR_L1_DCACHE_WRITE_ACCESS = 0x41, | 99 | ARMV7_A15_PERFCTR_L1_DCACHE_ACCESS_WRITE = 0x41, |
178 | ARMV7_PERFCTR_L1_DCACHE_READ_REFILL = 0x42, | 100 | ARMV7_A15_PERFCTR_L1_DCACHE_REFILL_READ = 0x42, |
179 | ARMV7_PERFCTR_L1_DCACHE_WRITE_REFILL = 0x43, | 101 | ARMV7_A15_PERFCTR_L1_DCACHE_REFILL_WRITE = 0x43, |
180 | 102 | ||
181 | ARMV7_PERFCTR_L1_DTLB_READ_REFILL = 0x4C, | 103 | ARMV7_A15_PERFCTR_DTLB_REFILL_L1_READ = 0x4C, |
182 | ARMV7_PERFCTR_L1_DTLB_WRITE_REFILL = 0x4D, | 104 | ARMV7_A15_PERFCTR_DTLB_REFILL_L1_WRITE = 0x4D, |
183 | 105 | ||
184 | ARMV7_PERFCTR_L2_DCACHE_READ_ACCESS = 0x50, | 106 | ARMV7_A15_PERFCTR_L2_CACHE_ACCESS_READ = 0x50, |
185 | ARMV7_PERFCTR_L2_DCACHE_WRITE_ACCESS = 0x51, | 107 | ARMV7_A15_PERFCTR_L2_CACHE_ACCESS_WRITE = 0x51, |
186 | ARMV7_PERFCTR_L2_DCACHE_READ_REFILL = 0x52, | 108 | ARMV7_A15_PERFCTR_L2_CACHE_REFILL_READ = 0x52, |
187 | ARMV7_PERFCTR_L2_DCACHE_WRITE_REFILL = 0x53, | 109 | ARMV7_A15_PERFCTR_L2_CACHE_REFILL_WRITE = 0x53, |
188 | 110 | ||
189 | ARMV7_PERFCTR_SPEC_PC_WRITE = 0x76, | 111 | ARMV7_A15_PERFCTR_PC_WRITE_SPEC = 0x76, |
190 | }; | 112 | }; |
191 | 113 | ||
192 | /* | 114 | /* |
@@ -197,13 +119,15 @@ enum armv7_a15_perf_types { | |||
197 | * accesses/misses in hardware. | 119 | * accesses/misses in hardware. |
198 | */ | 120 | */ |
199 | static const unsigned armv7_a8_perf_map[PERF_COUNT_HW_MAX] = { | 121 | static const unsigned armv7_a8_perf_map[PERF_COUNT_HW_MAX] = { |
200 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, | 122 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, |
201 | [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED, | 123 | [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED, |
202 | [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, | 124 | [PERF_COUNT_HW_CACHE_REFERENCES] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, |
203 | [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, | 125 | [PERF_COUNT_HW_CACHE_MISSES] = ARMV7_PERFCTR_L1_DCACHE_REFILL, |
204 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE, | 126 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE, |
205 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | 127 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, |
206 | [PERF_COUNT_HW_BUS_CYCLES] = ARMV7_PERFCTR_CLOCK_CYCLES, | 128 | [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, |
129 | [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = ARMV7_A8_PERFCTR_STALL_ISIDE, | ||
130 | [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = HW_OP_UNSUPPORTED, | ||
207 | }; | 131 | }; |
208 | 132 | ||
209 | static const unsigned armv7_a8_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | 133 | static const unsigned armv7_a8_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] |
@@ -217,12 +141,12 @@ static const unsigned armv7_a8_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
217 | * combined. | 141 | * combined. |
218 | */ | 142 | */ |
219 | [C(OP_READ)] = { | 143 | [C(OP_READ)] = { |
220 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_DCACHE_ACCESS, | 144 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, |
221 | [C(RESULT_MISS)] = ARMV7_PERFCTR_DCACHE_REFILL, | 145 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, |
222 | }, | 146 | }, |
223 | [C(OP_WRITE)] = { | 147 | [C(OP_WRITE)] = { |
224 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_DCACHE_ACCESS, | 148 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, |
225 | [C(RESULT_MISS)] = ARMV7_PERFCTR_DCACHE_REFILL, | 149 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, |
226 | }, | 150 | }, |
227 | [C(OP_PREFETCH)] = { | 151 | [C(OP_PREFETCH)] = { |
228 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 152 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -231,12 +155,12 @@ static const unsigned armv7_a8_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
231 | }, | 155 | }, |
232 | [C(L1I)] = { | 156 | [C(L1I)] = { |
233 | [C(OP_READ)] = { | 157 | [C(OP_READ)] = { |
234 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_INST, | 158 | [C(RESULT_ACCESS)] = ARMV7_A8_PERFCTR_L1_ICACHE_ACCESS, |
235 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_INST_MISS, | 159 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, |
236 | }, | 160 | }, |
237 | [C(OP_WRITE)] = { | 161 | [C(OP_WRITE)] = { |
238 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_INST, | 162 | [C(RESULT_ACCESS)] = ARMV7_A8_PERFCTR_L1_ICACHE_ACCESS, |
239 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_INST_MISS, | 163 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, |
240 | }, | 164 | }, |
241 | [C(OP_PREFETCH)] = { | 165 | [C(OP_PREFETCH)] = { |
242 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 166 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -245,12 +169,12 @@ static const unsigned armv7_a8_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
245 | }, | 169 | }, |
246 | [C(LL)] = { | 170 | [C(LL)] = { |
247 | [C(OP_READ)] = { | 171 | [C(OP_READ)] = { |
248 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L2_ACCESS, | 172 | [C(RESULT_ACCESS)] = ARMV7_A8_PERFCTR_L2_CACHE_ACCESS, |
249 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L2_CACH_MISS, | 173 | [C(RESULT_MISS)] = ARMV7_A8_PERFCTR_L2_CACHE_REFILL, |
250 | }, | 174 | }, |
251 | [C(OP_WRITE)] = { | 175 | [C(OP_WRITE)] = { |
252 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L2_ACCESS, | 176 | [C(RESULT_ACCESS)] = ARMV7_A8_PERFCTR_L2_CACHE_ACCESS, |
253 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L2_CACH_MISS, | 177 | [C(RESULT_MISS)] = ARMV7_A8_PERFCTR_L2_CACHE_REFILL, |
254 | }, | 178 | }, |
255 | [C(OP_PREFETCH)] = { | 179 | [C(OP_PREFETCH)] = { |
256 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 180 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -274,11 +198,11 @@ static const unsigned armv7_a8_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
274 | [C(ITLB)] = { | 198 | [C(ITLB)] = { |
275 | [C(OP_READ)] = { | 199 | [C(OP_READ)] = { |
276 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 200 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
277 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_MISS, | 201 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, |
278 | }, | 202 | }, |
279 | [C(OP_WRITE)] = { | 203 | [C(OP_WRITE)] = { |
280 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 204 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
281 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_MISS, | 205 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, |
282 | }, | 206 | }, |
283 | [C(OP_PREFETCH)] = { | 207 | [C(OP_PREFETCH)] = { |
284 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 208 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -287,14 +211,12 @@ static const unsigned armv7_a8_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
287 | }, | 211 | }, |
288 | [C(BPU)] = { | 212 | [C(BPU)] = { |
289 | [C(OP_READ)] = { | 213 | [C(OP_READ)] = { |
290 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_WRITE, | 214 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, |
291 | [C(RESULT_MISS)] | 215 | [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, |
292 | = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | ||
293 | }, | 216 | }, |
294 | [C(OP_WRITE)] = { | 217 | [C(OP_WRITE)] = { |
295 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_WRITE, | 218 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, |
296 | [C(RESULT_MISS)] | 219 | [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, |
297 | = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | ||
298 | }, | 220 | }, |
299 | [C(OP_PREFETCH)] = { | 221 | [C(OP_PREFETCH)] = { |
300 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 222 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -321,14 +243,15 @@ static const unsigned armv7_a8_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
321 | * Cortex-A9 HW events mapping | 243 | * Cortex-A9 HW events mapping |
322 | */ | 244 | */ |
323 | static const unsigned armv7_a9_perf_map[PERF_COUNT_HW_MAX] = { | 245 | static const unsigned armv7_a9_perf_map[PERF_COUNT_HW_MAX] = { |
324 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, | 246 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, |
325 | [PERF_COUNT_HW_INSTRUCTIONS] = | 247 | [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_A9_PERFCTR_INSTR_CORE_RENAME, |
326 | ARMV7_PERFCTR_INST_OUT_OF_RENAME_STAGE, | 248 | [PERF_COUNT_HW_CACHE_REFERENCES] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, |
327 | [PERF_COUNT_HW_CACHE_REFERENCES] = ARMV7_PERFCTR_DCACHE_ACCESS, | 249 | [PERF_COUNT_HW_CACHE_MISSES] = ARMV7_PERFCTR_L1_DCACHE_REFILL, |
328 | [PERF_COUNT_HW_CACHE_MISSES] = ARMV7_PERFCTR_DCACHE_REFILL, | 250 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE, |
329 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE, | 251 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, |
330 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | 252 | [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, |
331 | [PERF_COUNT_HW_BUS_CYCLES] = ARMV7_PERFCTR_CLOCK_CYCLES, | 253 | [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = ARMV7_A9_PERFCTR_STALL_ICACHE, |
254 | [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = ARMV7_A9_PERFCTR_STALL_DISPATCH, | ||
332 | }; | 255 | }; |
333 | 256 | ||
334 | static const unsigned armv7_a9_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | 257 | static const unsigned armv7_a9_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] |
@@ -342,12 +265,12 @@ static const unsigned armv7_a9_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
342 | * combined. | 265 | * combined. |
343 | */ | 266 | */ |
344 | [C(OP_READ)] = { | 267 | [C(OP_READ)] = { |
345 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_DCACHE_ACCESS, | 268 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, |
346 | [C(RESULT_MISS)] = ARMV7_PERFCTR_DCACHE_REFILL, | 269 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, |
347 | }, | 270 | }, |
348 | [C(OP_WRITE)] = { | 271 | [C(OP_WRITE)] = { |
349 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_DCACHE_ACCESS, | 272 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, |
350 | [C(RESULT_MISS)] = ARMV7_PERFCTR_DCACHE_REFILL, | 273 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, |
351 | }, | 274 | }, |
352 | [C(OP_PREFETCH)] = { | 275 | [C(OP_PREFETCH)] = { |
353 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 276 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -357,11 +280,11 @@ static const unsigned armv7_a9_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
357 | [C(L1I)] = { | 280 | [C(L1I)] = { |
358 | [C(OP_READ)] = { | 281 | [C(OP_READ)] = { |
359 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 282 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
360 | [C(RESULT_MISS)] = ARMV7_PERFCTR_IFETCH_MISS, | 283 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, |
361 | }, | 284 | }, |
362 | [C(OP_WRITE)] = { | 285 | [C(OP_WRITE)] = { |
363 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 286 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
364 | [C(RESULT_MISS)] = ARMV7_PERFCTR_IFETCH_MISS, | 287 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, |
365 | }, | 288 | }, |
366 | [C(OP_PREFETCH)] = { | 289 | [C(OP_PREFETCH)] = { |
367 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 290 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -399,11 +322,11 @@ static const unsigned armv7_a9_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
399 | [C(ITLB)] = { | 322 | [C(ITLB)] = { |
400 | [C(OP_READ)] = { | 323 | [C(OP_READ)] = { |
401 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 324 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
402 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_MISS, | 325 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, |
403 | }, | 326 | }, |
404 | [C(OP_WRITE)] = { | 327 | [C(OP_WRITE)] = { |
405 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 328 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
406 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_MISS, | 329 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, |
407 | }, | 330 | }, |
408 | [C(OP_PREFETCH)] = { | 331 | [C(OP_PREFETCH)] = { |
409 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 332 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -412,14 +335,12 @@ static const unsigned armv7_a9_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
412 | }, | 335 | }, |
413 | [C(BPU)] = { | 336 | [C(BPU)] = { |
414 | [C(OP_READ)] = { | 337 | [C(OP_READ)] = { |
415 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_WRITE, | 338 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, |
416 | [C(RESULT_MISS)] | 339 | [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, |
417 | = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | ||
418 | }, | 340 | }, |
419 | [C(OP_WRITE)] = { | 341 | [C(OP_WRITE)] = { |
420 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_WRITE, | 342 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, |
421 | [C(RESULT_MISS)] | 343 | [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, |
422 | = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | ||
423 | }, | 344 | }, |
424 | [C(OP_PREFETCH)] = { | 345 | [C(OP_PREFETCH)] = { |
425 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 346 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -446,13 +367,15 @@ static const unsigned armv7_a9_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
446 | * Cortex-A5 HW events mapping | 367 | * Cortex-A5 HW events mapping |
447 | */ | 368 | */ |
448 | static const unsigned armv7_a5_perf_map[PERF_COUNT_HW_MAX] = { | 369 | static const unsigned armv7_a5_perf_map[PERF_COUNT_HW_MAX] = { |
449 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, | 370 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, |
450 | [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED, | 371 | [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED, |
451 | [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, | 372 | [PERF_COUNT_HW_CACHE_REFERENCES] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, |
452 | [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, | 373 | [PERF_COUNT_HW_CACHE_MISSES] = ARMV7_PERFCTR_L1_DCACHE_REFILL, |
453 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE, | 374 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE, |
454 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | 375 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, |
455 | [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, | 376 | [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, |
377 | [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = HW_OP_UNSUPPORTED, | ||
378 | [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = HW_OP_UNSUPPORTED, | ||
456 | }; | 379 | }; |
457 | 380 | ||
458 | static const unsigned armv7_a5_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | 381 | static const unsigned armv7_a5_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] |
@@ -460,42 +383,34 @@ static const unsigned armv7_a5_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
460 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = { | 383 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = { |
461 | [C(L1D)] = { | 384 | [C(L1D)] = { |
462 | [C(OP_READ)] = { | 385 | [C(OP_READ)] = { |
463 | [C(RESULT_ACCESS)] | 386 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, |
464 | = ARMV7_PERFCTR_DCACHE_ACCESS, | 387 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, |
465 | [C(RESULT_MISS)] | ||
466 | = ARMV7_PERFCTR_DCACHE_REFILL, | ||
467 | }, | 388 | }, |
468 | [C(OP_WRITE)] = { | 389 | [C(OP_WRITE)] = { |
469 | [C(RESULT_ACCESS)] | 390 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, |
470 | = ARMV7_PERFCTR_DCACHE_ACCESS, | 391 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, |
471 | [C(RESULT_MISS)] | ||
472 | = ARMV7_PERFCTR_DCACHE_REFILL, | ||
473 | }, | 392 | }, |
474 | [C(OP_PREFETCH)] = { | 393 | [C(OP_PREFETCH)] = { |
475 | [C(RESULT_ACCESS)] | 394 | [C(RESULT_ACCESS)] = ARMV7_A5_PERFCTR_PREFETCH_LINEFILL, |
476 | = ARMV7_PERFCTR_PREFETCH_LINEFILL, | 395 | [C(RESULT_MISS)] = ARMV7_A5_PERFCTR_PREFETCH_LINEFILL_DROP, |
477 | [C(RESULT_MISS)] | ||
478 | = ARMV7_PERFCTR_PREFETCH_LINEFILL_DROP, | ||
479 | }, | 396 | }, |
480 | }, | 397 | }, |
481 | [C(L1I)] = { | 398 | [C(L1I)] = { |
482 | [C(OP_READ)] = { | 399 | [C(OP_READ)] = { |
483 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, | 400 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, |
484 | [C(RESULT_MISS)] = ARMV7_PERFCTR_IFETCH_MISS, | 401 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, |
485 | }, | 402 | }, |
486 | [C(OP_WRITE)] = { | 403 | [C(OP_WRITE)] = { |
487 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, | 404 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, |
488 | [C(RESULT_MISS)] = ARMV7_PERFCTR_IFETCH_MISS, | 405 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, |
489 | }, | 406 | }, |
490 | /* | 407 | /* |
491 | * The prefetch counters don't differentiate between the I | 408 | * The prefetch counters don't differentiate between the I |
492 | * side and the D side. | 409 | * side and the D side. |
493 | */ | 410 | */ |
494 | [C(OP_PREFETCH)] = { | 411 | [C(OP_PREFETCH)] = { |
495 | [C(RESULT_ACCESS)] | 412 | [C(RESULT_ACCESS)] = ARMV7_A5_PERFCTR_PREFETCH_LINEFILL, |
496 | = ARMV7_PERFCTR_PREFETCH_LINEFILL, | 413 | [C(RESULT_MISS)] = ARMV7_A5_PERFCTR_PREFETCH_LINEFILL_DROP, |
497 | [C(RESULT_MISS)] | ||
498 | = ARMV7_PERFCTR_PREFETCH_LINEFILL_DROP, | ||
499 | }, | 414 | }, |
500 | }, | 415 | }, |
501 | [C(LL)] = { | 416 | [C(LL)] = { |
@@ -529,11 +444,11 @@ static const unsigned armv7_a5_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
529 | [C(ITLB)] = { | 444 | [C(ITLB)] = { |
530 | [C(OP_READ)] = { | 445 | [C(OP_READ)] = { |
531 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 446 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
532 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_MISS, | 447 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, |
533 | }, | 448 | }, |
534 | [C(OP_WRITE)] = { | 449 | [C(OP_WRITE)] = { |
535 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 450 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
536 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_MISS, | 451 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, |
537 | }, | 452 | }, |
538 | [C(OP_PREFETCH)] = { | 453 | [C(OP_PREFETCH)] = { |
539 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 454 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -543,13 +458,11 @@ static const unsigned armv7_a5_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
543 | [C(BPU)] = { | 458 | [C(BPU)] = { |
544 | [C(OP_READ)] = { | 459 | [C(OP_READ)] = { |
545 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, | 460 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, |
546 | [C(RESULT_MISS)] | 461 | [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, |
547 | = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | ||
548 | }, | 462 | }, |
549 | [C(OP_WRITE)] = { | 463 | [C(OP_WRITE)] = { |
550 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, | 464 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, |
551 | [C(RESULT_MISS)] | 465 | [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, |
552 | = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | ||
553 | }, | 466 | }, |
554 | [C(OP_PREFETCH)] = { | 467 | [C(OP_PREFETCH)] = { |
555 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 468 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -562,13 +475,15 @@ static const unsigned armv7_a5_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
562 | * Cortex-A15 HW events mapping | 475 | * Cortex-A15 HW events mapping |
563 | */ | 476 | */ |
564 | static const unsigned armv7_a15_perf_map[PERF_COUNT_HW_MAX] = { | 477 | static const unsigned armv7_a15_perf_map[PERF_COUNT_HW_MAX] = { |
565 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, | 478 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, |
566 | [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED, | 479 | [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED, |
567 | [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, | 480 | [PERF_COUNT_HW_CACHE_REFERENCES] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, |
568 | [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, | 481 | [PERF_COUNT_HW_CACHE_MISSES] = ARMV7_PERFCTR_L1_DCACHE_REFILL, |
569 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_SPEC_PC_WRITE, | 482 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_A15_PERFCTR_PC_WRITE_SPEC, |
570 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | 483 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, |
571 | [PERF_COUNT_HW_BUS_CYCLES] = ARMV7_PERFCTR_BUS_CYCLES, | 484 | [PERF_COUNT_HW_BUS_CYCLES] = ARMV7_PERFCTR_BUS_CYCLES, |
485 | [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = HW_OP_UNSUPPORTED, | ||
486 | [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = HW_OP_UNSUPPORTED, | ||
572 | }; | 487 | }; |
573 | 488 | ||
574 | static const unsigned armv7_a15_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | 489 | static const unsigned armv7_a15_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] |
@@ -576,16 +491,12 @@ static const unsigned armv7_a15_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
576 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = { | 491 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = { |
577 | [C(L1D)] = { | 492 | [C(L1D)] = { |
578 | [C(OP_READ)] = { | 493 | [C(OP_READ)] = { |
579 | [C(RESULT_ACCESS)] | 494 | [C(RESULT_ACCESS)] = ARMV7_A15_PERFCTR_L1_DCACHE_ACCESS_READ, |
580 | = ARMV7_PERFCTR_L1_DCACHE_READ_ACCESS, | 495 | [C(RESULT_MISS)] = ARMV7_A15_PERFCTR_L1_DCACHE_REFILL_READ, |
581 | [C(RESULT_MISS)] | ||
582 | = ARMV7_PERFCTR_L1_DCACHE_READ_REFILL, | ||
583 | }, | 496 | }, |
584 | [C(OP_WRITE)] = { | 497 | [C(OP_WRITE)] = { |
585 | [C(RESULT_ACCESS)] | 498 | [C(RESULT_ACCESS)] = ARMV7_A15_PERFCTR_L1_DCACHE_ACCESS_WRITE, |
586 | = ARMV7_PERFCTR_L1_DCACHE_WRITE_ACCESS, | 499 | [C(RESULT_MISS)] = ARMV7_A15_PERFCTR_L1_DCACHE_REFILL_WRITE, |
587 | [C(RESULT_MISS)] | ||
588 | = ARMV7_PERFCTR_L1_DCACHE_WRITE_REFILL, | ||
589 | }, | 500 | }, |
590 | [C(OP_PREFETCH)] = { | 501 | [C(OP_PREFETCH)] = { |
591 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 502 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -601,11 +512,11 @@ static const unsigned armv7_a15_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
601 | */ | 512 | */ |
602 | [C(OP_READ)] = { | 513 | [C(OP_READ)] = { |
603 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, | 514 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, |
604 | [C(RESULT_MISS)] = ARMV7_PERFCTR_IFETCH_MISS, | 515 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, |
605 | }, | 516 | }, |
606 | [C(OP_WRITE)] = { | 517 | [C(OP_WRITE)] = { |
607 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, | 518 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, |
608 | [C(RESULT_MISS)] = ARMV7_PERFCTR_IFETCH_MISS, | 519 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, |
609 | }, | 520 | }, |
610 | [C(OP_PREFETCH)] = { | 521 | [C(OP_PREFETCH)] = { |
611 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 522 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -614,16 +525,12 @@ static const unsigned armv7_a15_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
614 | }, | 525 | }, |
615 | [C(LL)] = { | 526 | [C(LL)] = { |
616 | [C(OP_READ)] = { | 527 | [C(OP_READ)] = { |
617 | [C(RESULT_ACCESS)] | 528 | [C(RESULT_ACCESS)] = ARMV7_A15_PERFCTR_L2_CACHE_ACCESS_READ, |
618 | = ARMV7_PERFCTR_L2_DCACHE_READ_ACCESS, | 529 | [C(RESULT_MISS)] = ARMV7_A15_PERFCTR_L2_CACHE_REFILL_READ, |
619 | [C(RESULT_MISS)] | ||
620 | = ARMV7_PERFCTR_L2_DCACHE_READ_REFILL, | ||
621 | }, | 530 | }, |
622 | [C(OP_WRITE)] = { | 531 | [C(OP_WRITE)] = { |
623 | [C(RESULT_ACCESS)] | 532 | [C(RESULT_ACCESS)] = ARMV7_A15_PERFCTR_L2_CACHE_ACCESS_WRITE, |
624 | = ARMV7_PERFCTR_L2_DCACHE_WRITE_ACCESS, | 533 | [C(RESULT_MISS)] = ARMV7_A15_PERFCTR_L2_CACHE_REFILL_WRITE, |
625 | [C(RESULT_MISS)] | ||
626 | = ARMV7_PERFCTR_L2_DCACHE_WRITE_REFILL, | ||
627 | }, | 534 | }, |
628 | [C(OP_PREFETCH)] = { | 535 | [C(OP_PREFETCH)] = { |
629 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 536 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -633,13 +540,11 @@ static const unsigned armv7_a15_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
633 | [C(DTLB)] = { | 540 | [C(DTLB)] = { |
634 | [C(OP_READ)] = { | 541 | [C(OP_READ)] = { |
635 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 542 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
636 | [C(RESULT_MISS)] | 543 | [C(RESULT_MISS)] = ARMV7_A15_PERFCTR_DTLB_REFILL_L1_READ, |
637 | = ARMV7_PERFCTR_L1_DTLB_READ_REFILL, | ||
638 | }, | 544 | }, |
639 | [C(OP_WRITE)] = { | 545 | [C(OP_WRITE)] = { |
640 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 546 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
641 | [C(RESULT_MISS)] | 547 | [C(RESULT_MISS)] = ARMV7_A15_PERFCTR_DTLB_REFILL_L1_WRITE, |
642 | = ARMV7_PERFCTR_L1_DTLB_WRITE_REFILL, | ||
643 | }, | 548 | }, |
644 | [C(OP_PREFETCH)] = { | 549 | [C(OP_PREFETCH)] = { |
645 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 550 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -649,11 +554,11 @@ static const unsigned armv7_a15_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
649 | [C(ITLB)] = { | 554 | [C(ITLB)] = { |
650 | [C(OP_READ)] = { | 555 | [C(OP_READ)] = { |
651 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 556 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
652 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_MISS, | 557 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, |
653 | }, | 558 | }, |
654 | [C(OP_WRITE)] = { | 559 | [C(OP_WRITE)] = { |
655 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 560 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
656 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_MISS, | 561 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, |
657 | }, | 562 | }, |
658 | [C(OP_PREFETCH)] = { | 563 | [C(OP_PREFETCH)] = { |
659 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 564 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -663,13 +568,11 @@ static const unsigned armv7_a15_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
663 | [C(BPU)] = { | 568 | [C(BPU)] = { |
664 | [C(OP_READ)] = { | 569 | [C(OP_READ)] = { |
665 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, | 570 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, |
666 | [C(RESULT_MISS)] | 571 | [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, |
667 | = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | ||
668 | }, | 572 | }, |
669 | [C(OP_WRITE)] = { | 573 | [C(OP_WRITE)] = { |
670 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, | 574 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, |
671 | [C(RESULT_MISS)] | 575 | [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, |
672 | = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | ||
673 | }, | 576 | }, |
674 | [C(OP_PREFETCH)] = { | 577 | [C(OP_PREFETCH)] = { |
675 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 578 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
diff --git a/arch/arm/kernel/perf_event_xscale.c b/arch/arm/kernel/perf_event_xscale.c index e0cca10a841..3b99d826982 100644 --- a/arch/arm/kernel/perf_event_xscale.c +++ b/arch/arm/kernel/perf_event_xscale.c | |||
@@ -48,13 +48,15 @@ enum xscale_counters { | |||
48 | }; | 48 | }; |
49 | 49 | ||
50 | static const unsigned xscale_perf_map[PERF_COUNT_HW_MAX] = { | 50 | static const unsigned xscale_perf_map[PERF_COUNT_HW_MAX] = { |
51 | [PERF_COUNT_HW_CPU_CYCLES] = XSCALE_PERFCTR_CCNT, | 51 | [PERF_COUNT_HW_CPU_CYCLES] = XSCALE_PERFCTR_CCNT, |
52 | [PERF_COUNT_HW_INSTRUCTIONS] = XSCALE_PERFCTR_INSTRUCTION, | 52 | [PERF_COUNT_HW_INSTRUCTIONS] = XSCALE_PERFCTR_INSTRUCTION, |
53 | [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, | 53 | [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, |
54 | [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, | 54 | [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, |
55 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = XSCALE_PERFCTR_BRANCH, | 55 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = XSCALE_PERFCTR_BRANCH, |
56 | [PERF_COUNT_HW_BRANCH_MISSES] = XSCALE_PERFCTR_BRANCH_MISS, | 56 | [PERF_COUNT_HW_BRANCH_MISSES] = XSCALE_PERFCTR_BRANCH_MISS, |
57 | [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, | 57 | [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, |
58 | [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = XSCALE_PERFCTR_ICACHE_NO_DELIVER, | ||
59 | [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = HW_OP_UNSUPPORTED, | ||
58 | }; | 60 | }; |
59 | 61 | ||
60 | static const unsigned xscale_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | 62 | static const unsigned xscale_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] |
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 17859ce4e7b..b29776aa658 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c | |||
@@ -92,17 +92,23 @@ static int __init hlt_setup(char *__unused) | |||
92 | __setup("nohlt", nohlt_setup); | 92 | __setup("nohlt", nohlt_setup); |
93 | __setup("hlt", hlt_setup); | 93 | __setup("hlt", hlt_setup); |
94 | 94 | ||
95 | void soft_restart(unsigned long addr) | 95 | extern void call_with_stack(void (*fn)(void *), void *arg, void *sp); |
96 | typedef void (*phys_reset_t)(unsigned long); | ||
97 | |||
98 | /* | ||
99 | * A temporary stack to use for CPU reset. This is static so that we | ||
100 | * don't clobber it with the identity mapping. When running with this | ||
101 | * stack, any references to the current task *will not work* so you | ||
102 | * should really do as little as possible before jumping to your reset | ||
103 | * code. | ||
104 | */ | ||
105 | static u64 soft_restart_stack[16]; | ||
106 | |||
107 | static void __soft_restart(void *addr) | ||
96 | { | 108 | { |
97 | /* Disable interrupts first */ | 109 | phys_reset_t phys_reset; |
98 | local_irq_disable(); | ||
99 | local_fiq_disable(); | ||
100 | 110 | ||
101 | /* | 111 | /* Take out a flat memory mapping. */ |
102 | * Tell the mm system that we are going to reboot - | ||
103 | * we may need it to insert some 1:1 mappings so that | ||
104 | * soft boot works. | ||
105 | */ | ||
106 | setup_mm_for_reboot(); | 112 | setup_mm_for_reboot(); |
107 | 113 | ||
108 | /* Clean and invalidate caches */ | 114 | /* Clean and invalidate caches */ |
@@ -114,7 +120,31 @@ void soft_restart(unsigned long addr) | |||
114 | /* Push out any further dirty data, and ensure cache is empty */ | 120 | /* Push out any further dirty data, and ensure cache is empty */ |
115 | flush_cache_all(); | 121 | flush_cache_all(); |
116 | 122 | ||
117 | cpu_reset(addr); | 123 | /* Switch to the identity mapping. */ |
124 | phys_reset = (phys_reset_t)(unsigned long)virt_to_phys(cpu_reset); | ||
125 | phys_reset((unsigned long)addr); | ||
126 | |||
127 | /* Should never get here. */ | ||
128 | BUG(); | ||
129 | } | ||
130 | |||
131 | void soft_restart(unsigned long addr) | ||
132 | { | ||
133 | u64 *stack = soft_restart_stack + ARRAY_SIZE(soft_restart_stack); | ||
134 | |||
135 | /* Disable interrupts first */ | ||
136 | local_irq_disable(); | ||
137 | local_fiq_disable(); | ||
138 | |||
139 | /* Disable the L2 if we're the last man standing. */ | ||
140 | if (num_online_cpus() == 1) | ||
141 | outer_disable(); | ||
142 | |||
143 | /* Change to the new stack and continue with the reset. */ | ||
144 | call_with_stack(__soft_restart, (void *)addr, (void *)stack); | ||
145 | |||
146 | /* Should never get here. */ | ||
147 | BUG(); | ||
118 | } | 148 | } |
119 | 149 | ||
120 | static void null_restart(char mode, const char *cmd) | 150 | static void null_restart(char mode, const char *cmd) |
diff --git a/arch/arm/kernel/sched_clock.c b/arch/arm/kernel/sched_clock.c index 9a46370fe9d..5416c7c1252 100644 --- a/arch/arm/kernel/sched_clock.c +++ b/arch/arm/kernel/sched_clock.c | |||
@@ -14,61 +14,153 @@ | |||
14 | 14 | ||
15 | #include <asm/sched_clock.h> | 15 | #include <asm/sched_clock.h> |
16 | 16 | ||
17 | struct clock_data { | ||
18 | u64 epoch_ns; | ||
19 | u32 epoch_cyc; | ||
20 | u32 epoch_cyc_copy; | ||
21 | u32 mult; | ||
22 | u32 shift; | ||
23 | }; | ||
24 | |||
17 | static void sched_clock_poll(unsigned long wrap_ticks); | 25 | static void sched_clock_poll(unsigned long wrap_ticks); |
18 | static DEFINE_TIMER(sched_clock_timer, sched_clock_poll, 0, 0); | 26 | static DEFINE_TIMER(sched_clock_timer, sched_clock_poll, 0, 0); |
19 | static void (*sched_clock_update_fn)(void); | 27 | |
28 | static struct clock_data cd = { | ||
29 | .mult = NSEC_PER_SEC / HZ, | ||
30 | }; | ||
31 | |||
32 | static u32 __read_mostly sched_clock_mask = 0xffffffff; | ||
33 | |||
34 | static u32 notrace jiffy_sched_clock_read(void) | ||
35 | { | ||
36 | return (u32)(jiffies - INITIAL_JIFFIES); | ||
37 | } | ||
38 | |||
39 | static u32 __read_mostly (*read_sched_clock)(void) = jiffy_sched_clock_read; | ||
40 | |||
41 | static inline u64 cyc_to_ns(u64 cyc, u32 mult, u32 shift) | ||
42 | { | ||
43 | return (cyc * mult) >> shift; | ||
44 | } | ||
45 | |||
46 | static unsigned long long cyc_to_sched_clock(u32 cyc, u32 mask) | ||
47 | { | ||
48 | u64 epoch_ns; | ||
49 | u32 epoch_cyc; | ||
50 | |||
51 | /* | ||
52 | * Load the epoch_cyc and epoch_ns atomically. We do this by | ||
53 | * ensuring that we always write epoch_cyc, epoch_ns and | ||
54 | * epoch_cyc_copy in strict order, and read them in strict order. | ||
55 | * If epoch_cyc and epoch_cyc_copy are not equal, then we're in | ||
56 | * the middle of an update, and we should repeat the load. | ||
57 | */ | ||
58 | do { | ||
59 | epoch_cyc = cd.epoch_cyc; | ||
60 | smp_rmb(); | ||
61 | epoch_ns = cd.epoch_ns; | ||
62 | smp_rmb(); | ||
63 | } while (epoch_cyc != cd.epoch_cyc_copy); | ||
64 | |||
65 | return epoch_ns + cyc_to_ns((cyc - epoch_cyc) & mask, cd.mult, cd.shift); | ||
66 | } | ||
67 | |||
68 | /* | ||
69 | * Atomically update the sched_clock epoch. | ||
70 | */ | ||
71 | static void notrace update_sched_clock(void) | ||
72 | { | ||
73 | unsigned long flags; | ||
74 | u32 cyc; | ||
75 | u64 ns; | ||
76 | |||
77 | cyc = read_sched_clock(); | ||
78 | ns = cd.epoch_ns + | ||
79 | cyc_to_ns((cyc - cd.epoch_cyc) & sched_clock_mask, | ||
80 | cd.mult, cd.shift); | ||
81 | /* | ||
82 | * Write epoch_cyc and epoch_ns in a way that the update is | ||
83 | * detectable in cyc_to_fixed_sched_clock(). | ||
84 | */ | ||
85 | raw_local_irq_save(flags); | ||
86 | cd.epoch_cyc = cyc; | ||
87 | smp_wmb(); | ||
88 | cd.epoch_ns = ns; | ||
89 | smp_wmb(); | ||
90 | cd.epoch_cyc_copy = cyc; | ||
91 | raw_local_irq_restore(flags); | ||
92 | } | ||
20 | 93 | ||
21 | static void sched_clock_poll(unsigned long wrap_ticks) | 94 | static void sched_clock_poll(unsigned long wrap_ticks) |
22 | { | 95 | { |
23 | mod_timer(&sched_clock_timer, round_jiffies(jiffies + wrap_ticks)); | 96 | mod_timer(&sched_clock_timer, round_jiffies(jiffies + wrap_ticks)); |
24 | sched_clock_update_fn(); | 97 | update_sched_clock(); |
25 | } | 98 | } |
26 | 99 | ||
27 | void __init init_sched_clock(struct clock_data *cd, void (*update)(void), | 100 | void __init setup_sched_clock(u32 (*read)(void), int bits, unsigned long rate) |
28 | unsigned int clock_bits, unsigned long rate) | ||
29 | { | 101 | { |
30 | unsigned long r, w; | 102 | unsigned long r, w; |
31 | u64 res, wrap; | 103 | u64 res, wrap; |
32 | char r_unit; | 104 | char r_unit; |
33 | 105 | ||
34 | sched_clock_update_fn = update; | 106 | BUG_ON(bits > 32); |
107 | WARN_ON(!irqs_disabled()); | ||
108 | WARN_ON(read_sched_clock != jiffy_sched_clock_read); | ||
109 | read_sched_clock = read; | ||
110 | sched_clock_mask = (1 << bits) - 1; | ||
35 | 111 | ||
36 | /* calculate the mult/shift to convert counter ticks to ns. */ | 112 | /* calculate the mult/shift to convert counter ticks to ns. */ |
37 | clocks_calc_mult_shift(&cd->mult, &cd->shift, rate, NSEC_PER_SEC, 0); | 113 | clocks_calc_mult_shift(&cd.mult, &cd.shift, rate, NSEC_PER_SEC, 0); |
38 | 114 | ||
39 | r = rate; | 115 | r = rate; |
40 | if (r >= 4000000) { | 116 | if (r >= 4000000) { |
41 | r /= 1000000; | 117 | r /= 1000000; |
42 | r_unit = 'M'; | 118 | r_unit = 'M'; |
43 | } else { | 119 | } else if (r >= 1000) { |
44 | r /= 1000; | 120 | r /= 1000; |
45 | r_unit = 'k'; | 121 | r_unit = 'k'; |
46 | } | 122 | } else |
123 | r_unit = ' '; | ||
47 | 124 | ||
48 | /* calculate how many ns until we wrap */ | 125 | /* calculate how many ns until we wrap */ |
49 | wrap = cyc_to_ns((1ULL << clock_bits) - 1, cd->mult, cd->shift); | 126 | wrap = cyc_to_ns((1ULL << bits) - 1, cd.mult, cd.shift); |
50 | do_div(wrap, NSEC_PER_MSEC); | 127 | do_div(wrap, NSEC_PER_MSEC); |
51 | w = wrap; | 128 | w = wrap; |
52 | 129 | ||
53 | /* calculate the ns resolution of this counter */ | 130 | /* calculate the ns resolution of this counter */ |
54 | res = cyc_to_ns(1ULL, cd->mult, cd->shift); | 131 | res = cyc_to_ns(1ULL, cd.mult, cd.shift); |
55 | pr_info("sched_clock: %u bits at %lu%cHz, resolution %lluns, wraps every %lums\n", | 132 | pr_info("sched_clock: %u bits at %lu%cHz, resolution %lluns, wraps every %lums\n", |
56 | clock_bits, r, r_unit, res, w); | 133 | bits, r, r_unit, res, w); |
57 | 134 | ||
58 | /* | 135 | /* |
59 | * Start the timer to keep sched_clock() properly updated and | 136 | * Start the timer to keep sched_clock() properly updated and |
60 | * sets the initial epoch. | 137 | * sets the initial epoch. |
61 | */ | 138 | */ |
62 | sched_clock_timer.data = msecs_to_jiffies(w - (w / 10)); | 139 | sched_clock_timer.data = msecs_to_jiffies(w - (w / 10)); |
63 | update(); | 140 | update_sched_clock(); |
64 | 141 | ||
65 | /* | 142 | /* |
66 | * Ensure that sched_clock() starts off at 0ns | 143 | * Ensure that sched_clock() starts off at 0ns |
67 | */ | 144 | */ |
68 | cd->epoch_ns = 0; | 145 | cd.epoch_ns = 0; |
146 | |||
147 | pr_debug("Registered %pF as sched_clock source\n", read); | ||
148 | } | ||
149 | |||
150 | unsigned long long notrace sched_clock(void) | ||
151 | { | ||
152 | u32 cyc = read_sched_clock(); | ||
153 | return cyc_to_sched_clock(cyc, sched_clock_mask); | ||
69 | } | 154 | } |
70 | 155 | ||
71 | void __init sched_clock_postinit(void) | 156 | void __init sched_clock_postinit(void) |
72 | { | 157 | { |
158 | /* | ||
159 | * If no sched_clock function has been provided at that point, | ||
160 | * make it the final one one. | ||
161 | */ | ||
162 | if (read_sched_clock == jiffy_sched_clock_read) | ||
163 | setup_sched_clock(jiffy_sched_clock_read, 32, HZ); | ||
164 | |||
73 | sched_clock_poll(sched_clock_timer.data); | 165 | sched_clock_poll(sched_clock_timer.data); |
74 | } | 166 | } |
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 8b13930cdb0..095d6611c84 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <linux/memblock.h> | 31 | #include <linux/memblock.h> |
32 | #include <linux/bug.h> | 32 | #include <linux/bug.h> |
33 | #include <linux/compiler.h> | 33 | #include <linux/compiler.h> |
34 | #include <linux/sort.h> | ||
34 | 35 | ||
35 | #include <asm/unified.h> | 36 | #include <asm/unified.h> |
36 | #include <asm/cpu.h> | 37 | #include <asm/cpu.h> |
@@ -890,6 +891,12 @@ static struct machine_desc * __init setup_machine_tags(unsigned int nr) | |||
890 | return mdesc; | 891 | return mdesc; |
891 | } | 892 | } |
892 | 893 | ||
894 | static int __init meminfo_cmp(const void *_a, const void *_b) | ||
895 | { | ||
896 | const struct membank *a = _a, *b = _b; | ||
897 | long cmp = bank_pfn_start(a) - bank_pfn_start(b); | ||
898 | return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; | ||
899 | } | ||
893 | 900 | ||
894 | void __init setup_arch(char **cmdline_p) | 901 | void __init setup_arch(char **cmdline_p) |
895 | { | 902 | { |
@@ -922,6 +929,7 @@ void __init setup_arch(char **cmdline_p) | |||
922 | 929 | ||
923 | parse_early_param(); | 930 | parse_early_param(); |
924 | 931 | ||
932 | sort(&meminfo.bank, meminfo.nr_banks, sizeof(meminfo.bank[0]), meminfo_cmp, NULL); | ||
925 | sanity_check_meminfo(); | 933 | sanity_check_meminfo(); |
926 | arm_memblock_init(&meminfo, mdesc); | 934 | arm_memblock_init(&meminfo, mdesc); |
927 | 935 | ||
diff --git a/arch/arm/kernel/sleep.S b/arch/arm/kernel/sleep.S index 020e99c845e..1f268bda455 100644 --- a/arch/arm/kernel/sleep.S +++ b/arch/arm/kernel/sleep.S | |||
@@ -54,14 +54,18 @@ ENDPROC(cpu_suspend_abort) | |||
54 | * r0 = control register value | 54 | * r0 = control register value |
55 | */ | 55 | */ |
56 | .align 5 | 56 | .align 5 |
57 | .pushsection .idmap.text,"ax" | ||
57 | ENTRY(cpu_resume_mmu) | 58 | ENTRY(cpu_resume_mmu) |
58 | ldr r3, =cpu_resume_after_mmu | 59 | ldr r3, =cpu_resume_after_mmu |
60 | instr_sync | ||
59 | mcr p15, 0, r0, c1, c0, 0 @ turn on MMU, I-cache, etc | 61 | mcr p15, 0, r0, c1, c0, 0 @ turn on MMU, I-cache, etc |
60 | mrc p15, 0, r0, c0, c0, 0 @ read id reg | 62 | mrc p15, 0, r0, c0, c0, 0 @ read id reg |
63 | instr_sync | ||
61 | mov r0, r0 | 64 | mov r0, r0 |
62 | mov r0, r0 | 65 | mov r0, r0 |
63 | mov pc, r3 @ jump to virtual address | 66 | mov pc, r3 @ jump to virtual address |
64 | ENDPROC(cpu_resume_mmu) | 67 | ENDPROC(cpu_resume_mmu) |
68 | .popsection | ||
65 | cpu_resume_after_mmu: | 69 | cpu_resume_after_mmu: |
66 | bl cpu_init @ restore the und/abt/irq banked regs | 70 | bl cpu_init @ restore the und/abt/irq banked regs |
67 | mov r0, #0 @ return zero on success | 71 | mov r0, #0 @ return zero on success |
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index ef5640b9e21..57db122a4f6 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <asm/cpu.h> | 31 | #include <asm/cpu.h> |
32 | #include <asm/cputype.h> | 32 | #include <asm/cputype.h> |
33 | #include <asm/exception.h> | 33 | #include <asm/exception.h> |
34 | #include <asm/idmap.h> | ||
34 | #include <asm/topology.h> | 35 | #include <asm/topology.h> |
35 | #include <asm/mmu_context.h> | 36 | #include <asm/mmu_context.h> |
36 | #include <asm/pgtable.h> | 37 | #include <asm/pgtable.h> |
@@ -61,7 +62,6 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
61 | { | 62 | { |
62 | struct cpuinfo_arm *ci = &per_cpu(cpu_data, cpu); | 63 | struct cpuinfo_arm *ci = &per_cpu(cpu_data, cpu); |
63 | struct task_struct *idle = ci->idle; | 64 | struct task_struct *idle = ci->idle; |
64 | pgd_t *pgd; | ||
65 | int ret; | 65 | int ret; |
66 | 66 | ||
67 | /* | 67 | /* |
@@ -84,29 +84,11 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
84 | } | 84 | } |
85 | 85 | ||
86 | /* | 86 | /* |
87 | * Allocate initial page tables to allow the new CPU to | ||
88 | * enable the MMU safely. This essentially means a set | ||
89 | * of our "standard" page tables, with the addition of | ||
90 | * a 1:1 mapping for the physical address of the kernel. | ||
91 | */ | ||
92 | pgd = pgd_alloc(&init_mm); | ||
93 | if (!pgd) | ||
94 | return -ENOMEM; | ||
95 | |||
96 | if (PHYS_OFFSET != PAGE_OFFSET) { | ||
97 | #ifndef CONFIG_HOTPLUG_CPU | ||
98 | identity_mapping_add(pgd, __pa(__init_begin), __pa(__init_end)); | ||
99 | #endif | ||
100 | identity_mapping_add(pgd, __pa(_stext), __pa(_etext)); | ||
101 | identity_mapping_add(pgd, __pa(_sdata), __pa(_edata)); | ||
102 | } | ||
103 | |||
104 | /* | ||
105 | * We need to tell the secondary core where to find | 87 | * We need to tell the secondary core where to find |
106 | * its stack and the page tables. | 88 | * its stack and the page tables. |
107 | */ | 89 | */ |
108 | secondary_data.stack = task_stack_page(idle) + THREAD_START_SP; | 90 | secondary_data.stack = task_stack_page(idle) + THREAD_START_SP; |
109 | secondary_data.pgdir = virt_to_phys(pgd); | 91 | secondary_data.pgdir = virt_to_phys(idmap_pgd); |
110 | secondary_data.swapper_pg_dir = virt_to_phys(swapper_pg_dir); | 92 | secondary_data.swapper_pg_dir = virt_to_phys(swapper_pg_dir); |
111 | __cpuc_flush_dcache_area(&secondary_data, sizeof(secondary_data)); | 93 | __cpuc_flush_dcache_area(&secondary_data, sizeof(secondary_data)); |
112 | outer_clean_range(__pa(&secondary_data), __pa(&secondary_data + 1)); | 94 | outer_clean_range(__pa(&secondary_data), __pa(&secondary_data + 1)); |
@@ -142,16 +124,6 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
142 | secondary_data.stack = NULL; | 124 | secondary_data.stack = NULL; |
143 | secondary_data.pgdir = 0; | 125 | secondary_data.pgdir = 0; |
144 | 126 | ||
145 | if (PHYS_OFFSET != PAGE_OFFSET) { | ||
146 | #ifndef CONFIG_HOTPLUG_CPU | ||
147 | identity_mapping_del(pgd, __pa(__init_begin), __pa(__init_end)); | ||
148 | #endif | ||
149 | identity_mapping_del(pgd, __pa(_stext), __pa(_etext)); | ||
150 | identity_mapping_del(pgd, __pa(_sdata), __pa(_edata)); | ||
151 | } | ||
152 | |||
153 | pgd_free(&init_mm, pgd); | ||
154 | |||
155 | return ret; | 127 | return ret; |
156 | } | 128 | } |
157 | 129 | ||
@@ -550,6 +522,10 @@ static void ipi_cpu_stop(unsigned int cpu) | |||
550 | local_fiq_disable(); | 522 | local_fiq_disable(); |
551 | local_irq_disable(); | 523 | local_irq_disable(); |
552 | 524 | ||
525 | #ifdef CONFIG_HOTPLUG_CPU | ||
526 | platform_cpu_kill(cpu); | ||
527 | #endif | ||
528 | |||
553 | while (1) | 529 | while (1) |
554 | cpu_relax(); | 530 | cpu_relax(); |
555 | } | 531 | } |
diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c index a8a6682d6b5..c8e938553d4 100644 --- a/arch/arm/kernel/smp_twd.c +++ b/arch/arm/kernel/smp_twd.c | |||
@@ -10,8 +10,11 @@ | |||
10 | */ | 10 | */ |
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
13 | #include <linux/clk.h> | ||
14 | #include <linux/cpufreq.h> | ||
13 | #include <linux/delay.h> | 15 | #include <linux/delay.h> |
14 | #include <linux/device.h> | 16 | #include <linux/device.h> |
17 | #include <linux/err.h> | ||
15 | #include <linux/smp.h> | 18 | #include <linux/smp.h> |
16 | #include <linux/jiffies.h> | 19 | #include <linux/jiffies.h> |
17 | #include <linux/clockchips.h> | 20 | #include <linux/clockchips.h> |
@@ -25,6 +28,7 @@ | |||
25 | /* set up by the platform code */ | 28 | /* set up by the platform code */ |
26 | void __iomem *twd_base; | 29 | void __iomem *twd_base; |
27 | 30 | ||
31 | static struct clk *twd_clk; | ||
28 | static unsigned long twd_timer_rate; | 32 | static unsigned long twd_timer_rate; |
29 | 33 | ||
30 | static struct clock_event_device __percpu **twd_evt; | 34 | static struct clock_event_device __percpu **twd_evt; |
@@ -89,6 +93,52 @@ void twd_timer_stop(struct clock_event_device *clk) | |||
89 | disable_percpu_irq(clk->irq); | 93 | disable_percpu_irq(clk->irq); |
90 | } | 94 | } |
91 | 95 | ||
96 | #ifdef CONFIG_CPU_FREQ | ||
97 | |||
98 | /* | ||
99 | * Updates clockevent frequency when the cpu frequency changes. | ||
100 | * Called on the cpu that is changing frequency with interrupts disabled. | ||
101 | */ | ||
102 | static void twd_update_frequency(void *data) | ||
103 | { | ||
104 | twd_timer_rate = clk_get_rate(twd_clk); | ||
105 | |||
106 | clockevents_update_freq(*__this_cpu_ptr(twd_evt), twd_timer_rate); | ||
107 | } | ||
108 | |||
109 | static int twd_cpufreq_transition(struct notifier_block *nb, | ||
110 | unsigned long state, void *data) | ||
111 | { | ||
112 | struct cpufreq_freqs *freqs = data; | ||
113 | |||
114 | /* | ||
115 | * The twd clock events must be reprogrammed to account for the new | ||
116 | * frequency. The timer is local to a cpu, so cross-call to the | ||
117 | * changing cpu. | ||
118 | */ | ||
119 | if (state == CPUFREQ_POSTCHANGE || state == CPUFREQ_RESUMECHANGE) | ||
120 | smp_call_function_single(freqs->cpu, twd_update_frequency, | ||
121 | NULL, 1); | ||
122 | |||
123 | return NOTIFY_OK; | ||
124 | } | ||
125 | |||
126 | static struct notifier_block twd_cpufreq_nb = { | ||
127 | .notifier_call = twd_cpufreq_transition, | ||
128 | }; | ||
129 | |||
130 | static int twd_cpufreq_init(void) | ||
131 | { | ||
132 | if (!IS_ERR(twd_clk)) | ||
133 | return cpufreq_register_notifier(&twd_cpufreq_nb, | ||
134 | CPUFREQ_TRANSITION_NOTIFIER); | ||
135 | |||
136 | return 0; | ||
137 | } | ||
138 | core_initcall(twd_cpufreq_init); | ||
139 | |||
140 | #endif | ||
141 | |||
92 | static void __cpuinit twd_calibrate_rate(void) | 142 | static void __cpuinit twd_calibrate_rate(void) |
93 | { | 143 | { |
94 | unsigned long count; | 144 | unsigned long count; |
@@ -140,6 +190,35 @@ static irqreturn_t twd_handler(int irq, void *dev_id) | |||
140 | return IRQ_NONE; | 190 | return IRQ_NONE; |
141 | } | 191 | } |
142 | 192 | ||
193 | static struct clk *twd_get_clock(void) | ||
194 | { | ||
195 | struct clk *clk; | ||
196 | int err; | ||
197 | |||
198 | clk = clk_get_sys("smp_twd", NULL); | ||
199 | if (IS_ERR(clk)) { | ||
200 | pr_err("smp_twd: clock not found: %d\n", (int)PTR_ERR(clk)); | ||
201 | return clk; | ||
202 | } | ||
203 | |||
204 | err = clk_prepare(clk); | ||
205 | if (err) { | ||
206 | pr_err("smp_twd: clock failed to prepare: %d\n", err); | ||
207 | clk_put(clk); | ||
208 | return ERR_PTR(err); | ||
209 | } | ||
210 | |||
211 | err = clk_enable(clk); | ||
212 | if (err) { | ||
213 | pr_err("smp_twd: clock failed to enable: %d\n", err); | ||
214 | clk_unprepare(clk); | ||
215 | clk_put(clk); | ||
216 | return ERR_PTR(err); | ||
217 | } | ||
218 | |||
219 | return clk; | ||
220 | } | ||
221 | |||
143 | /* | 222 | /* |
144 | * Setup the local clock events for a CPU. | 223 | * Setup the local clock events for a CPU. |
145 | */ | 224 | */ |
@@ -165,7 +244,13 @@ void __cpuinit twd_timer_setup(struct clock_event_device *clk) | |||
165 | } | 244 | } |
166 | } | 245 | } |
167 | 246 | ||
168 | twd_calibrate_rate(); | 247 | if (!twd_clk) |
248 | twd_clk = twd_get_clock(); | ||
249 | |||
250 | if (!IS_ERR_OR_NULL(twd_clk)) | ||
251 | twd_timer_rate = clk_get_rate(twd_clk); | ||
252 | else | ||
253 | twd_calibrate_rate(); | ||
169 | 254 | ||
170 | clk->name = "local_timer"; | 255 | clk->name = "local_timer"; |
171 | clk->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT | | 256 | clk->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT | |
@@ -173,15 +258,11 @@ void __cpuinit twd_timer_setup(struct clock_event_device *clk) | |||
173 | clk->rating = 350; | 258 | clk->rating = 350; |
174 | clk->set_mode = twd_set_mode; | 259 | clk->set_mode = twd_set_mode; |
175 | clk->set_next_event = twd_set_next_event; | 260 | clk->set_next_event = twd_set_next_event; |
176 | clk->shift = 20; | ||
177 | clk->mult = div_sc(twd_timer_rate, NSEC_PER_SEC, clk->shift); | ||
178 | clk->max_delta_ns = clockevent_delta2ns(0xffffffff, clk); | ||
179 | clk->min_delta_ns = clockevent_delta2ns(0xf, clk); | ||
180 | 261 | ||
181 | this_cpu_clk = __this_cpu_ptr(twd_evt); | 262 | this_cpu_clk = __this_cpu_ptr(twd_evt); |
182 | *this_cpu_clk = clk; | 263 | *this_cpu_clk = clk; |
183 | 264 | ||
184 | clockevents_register_device(clk); | 265 | clockevents_config_and_register(clk, twd_timer_rate, |
185 | 266 | 0xf, 0xffffffff); | |
186 | enable_percpu_irq(clk->irq, 0); | 267 | enable_percpu_irq(clk->irq, 0); |
187 | } | 268 | } |
diff --git a/arch/arm/kernel/suspend.c b/arch/arm/kernel/suspend.c index 93a22d282c1..1794cc3b0f1 100644 --- a/arch/arm/kernel/suspend.c +++ b/arch/arm/kernel/suspend.c | |||
@@ -1,13 +1,12 @@ | |||
1 | #include <linux/init.h> | 1 | #include <linux/init.h> |
2 | 2 | ||
3 | #include <asm/idmap.h> | ||
3 | #include <asm/pgalloc.h> | 4 | #include <asm/pgalloc.h> |
4 | #include <asm/pgtable.h> | 5 | #include <asm/pgtable.h> |
5 | #include <asm/memory.h> | 6 | #include <asm/memory.h> |
6 | #include <asm/suspend.h> | 7 | #include <asm/suspend.h> |
7 | #include <asm/tlbflush.h> | 8 | #include <asm/tlbflush.h> |
8 | 9 | ||
9 | static pgd_t *suspend_pgd; | ||
10 | |||
11 | extern int __cpu_suspend(unsigned long, int (*)(unsigned long)); | 10 | extern int __cpu_suspend(unsigned long, int (*)(unsigned long)); |
12 | extern void cpu_resume_mmu(void); | 11 | extern void cpu_resume_mmu(void); |
13 | 12 | ||
@@ -21,7 +20,7 @@ void __cpu_suspend_save(u32 *ptr, u32 ptrsz, u32 sp, u32 *save_ptr) | |||
21 | *save_ptr = virt_to_phys(ptr); | 20 | *save_ptr = virt_to_phys(ptr); |
22 | 21 | ||
23 | /* This must correspond to the LDM in cpu_resume() assembly */ | 22 | /* This must correspond to the LDM in cpu_resume() assembly */ |
24 | *ptr++ = virt_to_phys(suspend_pgd); | 23 | *ptr++ = virt_to_phys(idmap_pgd); |
25 | *ptr++ = sp; | 24 | *ptr++ = sp; |
26 | *ptr++ = virt_to_phys(cpu_do_resume); | 25 | *ptr++ = virt_to_phys(cpu_do_resume); |
27 | 26 | ||
@@ -42,7 +41,7 @@ int cpu_suspend(unsigned long arg, int (*fn)(unsigned long)) | |||
42 | struct mm_struct *mm = current->active_mm; | 41 | struct mm_struct *mm = current->active_mm; |
43 | int ret; | 42 | int ret; |
44 | 43 | ||
45 | if (!suspend_pgd) | 44 | if (!idmap_pgd) |
46 | return -EINVAL; | 45 | return -EINVAL; |
47 | 46 | ||
48 | /* | 47 | /* |
@@ -59,14 +58,3 @@ int cpu_suspend(unsigned long arg, int (*fn)(unsigned long)) | |||
59 | 58 | ||
60 | return ret; | 59 | return ret; |
61 | } | 60 | } |
62 | |||
63 | static int __init cpu_suspend_init(void) | ||
64 | { | ||
65 | suspend_pgd = pgd_alloc(&init_mm); | ||
66 | if (suspend_pgd) { | ||
67 | unsigned long addr = virt_to_phys(cpu_resume_mmu); | ||
68 | identity_mapping_add(suspend_pgd, addr, addr + SECTION_SIZE); | ||
69 | } | ||
70 | return suspend_pgd ? 0 : -ENOMEM; | ||
71 | } | ||
72 | core_initcall(cpu_suspend_init); | ||
diff --git a/arch/arm/kernel/swp_emulate.c b/arch/arm/kernel/swp_emulate.c index 5f452f8fde0..df745188f5d 100644 --- a/arch/arm/kernel/swp_emulate.c +++ b/arch/arm/kernel/swp_emulate.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/syscalls.h> | 25 | #include <linux/syscalls.h> |
26 | #include <linux/perf_event.h> | 26 | #include <linux/perf_event.h> |
27 | 27 | ||
28 | #include <asm/opcodes.h> | ||
28 | #include <asm/traps.h> | 29 | #include <asm/traps.h> |
29 | #include <asm/uaccess.h> | 30 | #include <asm/uaccess.h> |
30 | 31 | ||
@@ -185,6 +186,21 @@ static int swp_handler(struct pt_regs *regs, unsigned int instr) | |||
185 | 186 | ||
186 | perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS, 1, regs, regs->ARM_pc); | 187 | perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS, 1, regs, regs->ARM_pc); |
187 | 188 | ||
189 | res = arm_check_condition(instr, regs->ARM_cpsr); | ||
190 | switch (res) { | ||
191 | case ARM_OPCODE_CONDTEST_PASS: | ||
192 | break; | ||
193 | case ARM_OPCODE_CONDTEST_FAIL: | ||
194 | /* Condition failed - return to next instruction */ | ||
195 | regs->ARM_pc += 4; | ||
196 | return 0; | ||
197 | case ARM_OPCODE_CONDTEST_UNCOND: | ||
198 | /* If unconditional encoding - not a SWP, undef */ | ||
199 | return -EFAULT; | ||
200 | default: | ||
201 | return -EINVAL; | ||
202 | } | ||
203 | |||
188 | if (current->pid != previous_pid) { | 204 | if (current->pid != previous_pid) { |
189 | pr_debug("\"%s\" (%ld) uses deprecated SWP{B} instruction\n", | 205 | pr_debug("\"%s\" (%ld) uses deprecated SWP{B} instruction\n", |
190 | current->comm, (unsigned long)current->pid); | 206 | current->comm, (unsigned long)current->pid); |
diff --git a/arch/arm/kernel/tcm.c b/arch/arm/kernel/tcm.c index 30e302d33e0..01ec453bb92 100644 --- a/arch/arm/kernel/tcm.c +++ b/arch/arm/kernel/tcm.c | |||
@@ -180,9 +180,9 @@ static int __init setup_tcm_bank(u8 type, u8 bank, u8 banks, | |||
180 | */ | 180 | */ |
181 | void __init tcm_init(void) | 181 | void __init tcm_init(void) |
182 | { | 182 | { |
183 | u32 tcm_status = read_cpuid_tcmstatus(); | 183 | u32 tcm_status; |
184 | u8 dtcm_banks = (tcm_status >> 16) & 0x03; | 184 | u8 dtcm_banks; |
185 | u8 itcm_banks = (tcm_status & 0x03); | 185 | u8 itcm_banks; |
186 | size_t dtcm_code_sz = &__edtcm_data - &__sdtcm_data; | 186 | size_t dtcm_code_sz = &__edtcm_data - &__sdtcm_data; |
187 | size_t itcm_code_sz = &__eitcm_text - &__sitcm_text; | 187 | size_t itcm_code_sz = &__eitcm_text - &__sitcm_text; |
188 | char *start; | 188 | char *start; |
@@ -191,6 +191,22 @@ void __init tcm_init(void) | |||
191 | int ret; | 191 | int ret; |
192 | int i; | 192 | int i; |
193 | 193 | ||
194 | /* | ||
195 | * Prior to ARMv5 there is no TCM, and trying to read the status | ||
196 | * register will hang the processor. | ||
197 | */ | ||
198 | if (cpu_architecture() < CPU_ARCH_ARMv5) { | ||
199 | if (dtcm_code_sz || itcm_code_sz) | ||
200 | pr_info("CPU TCM: %u bytes of DTCM and %u bytes of " | ||
201 | "ITCM code compiled in, but no TCM present " | ||
202 | "in pre-v5 CPU\n", dtcm_code_sz, itcm_code_sz); | ||
203 | return; | ||
204 | } | ||
205 | |||
206 | tcm_status = read_cpuid_tcmstatus(); | ||
207 | dtcm_banks = (tcm_status >> 16) & 0x03; | ||
208 | itcm_banks = (tcm_status & 0x03); | ||
209 | |||
194 | /* Values greater than 2 for D/ITCM banks are "reserved" */ | 210 | /* Values greater than 2 for D/ITCM banks are "reserved" */ |
195 | if (dtcm_banks > 2) | 211 | if (dtcm_banks > 2) |
196 | dtcm_banks = 0; | 212 | dtcm_banks = 0; |
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index 20b3041e086..f76e7554867 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S | |||
@@ -13,6 +13,12 @@ | |||
13 | *(.proc.info.init) \ | 13 | *(.proc.info.init) \ |
14 | VMLINUX_SYMBOL(__proc_info_end) = .; | 14 | VMLINUX_SYMBOL(__proc_info_end) = .; |
15 | 15 | ||
16 | #define IDMAP_TEXT \ | ||
17 | ALIGN_FUNCTION(); \ | ||
18 | VMLINUX_SYMBOL(__idmap_text_start) = .; \ | ||
19 | *(.idmap.text) \ | ||
20 | VMLINUX_SYMBOL(__idmap_text_end) = .; | ||
21 | |||
16 | #ifdef CONFIG_HOTPLUG_CPU | 22 | #ifdef CONFIG_HOTPLUG_CPU |
17 | #define ARM_CPU_DISCARD(x) | 23 | #define ARM_CPU_DISCARD(x) |
18 | #define ARM_CPU_KEEP(x) x | 24 | #define ARM_CPU_KEEP(x) x |
@@ -92,6 +98,7 @@ SECTIONS | |||
92 | SCHED_TEXT | 98 | SCHED_TEXT |
93 | LOCK_TEXT | 99 | LOCK_TEXT |
94 | KPROBES_TEXT | 100 | KPROBES_TEXT |
101 | IDMAP_TEXT | ||
95 | #ifdef CONFIG_MMU | 102 | #ifdef CONFIG_MMU |
96 | *(.fixup) | 103 | *(.fixup) |
97 | #endif | 104 | #endif |
diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile index cf73a7f742d..0ade0acc1ed 100644 --- a/arch/arm/lib/Makefile +++ b/arch/arm/lib/Makefile | |||
@@ -13,7 +13,8 @@ lib-y := backtrace.o changebit.o csumipv6.o csumpartial.o \ | |||
13 | testchangebit.o testclearbit.o testsetbit.o \ | 13 | testchangebit.o testclearbit.o testsetbit.o \ |
14 | ashldi3.o ashrdi3.o lshrdi3.o muldi3.o \ | 14 | ashldi3.o ashrdi3.o lshrdi3.o muldi3.o \ |
15 | ucmpdi2.o lib1funcs.o div64.o \ | 15 | ucmpdi2.o lib1funcs.o div64.o \ |
16 | io-readsb.o io-writesb.o io-readsl.o io-writesl.o | 16 | io-readsb.o io-writesb.o io-readsl.o io-writesl.o \ |
17 | call_with_stack.o | ||
17 | 18 | ||
18 | mmu-y := clear_user.o copy_page.o getuser.o putuser.o | 19 | mmu-y := clear_user.o copy_page.o getuser.o putuser.o |
19 | 20 | ||
diff --git a/arch/arm/lib/call_with_stack.S b/arch/arm/lib/call_with_stack.S new file mode 100644 index 00000000000..916c80f13ae --- /dev/null +++ b/arch/arm/lib/call_with_stack.S | |||
@@ -0,0 +1,44 @@ | |||
1 | /* | ||
2 | * arch/arm/lib/call_with_stack.S | ||
3 | * | ||
4 | * Copyright (C) 2011 ARM Ltd. | ||
5 | * Written by Will Deacon <will.deacon@arm.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | */ | ||
20 | |||
21 | #include <linux/linkage.h> | ||
22 | #include <asm/assembler.h> | ||
23 | |||
24 | /* | ||
25 | * void call_with_stack(void (*fn)(void *), void *arg, void *sp) | ||
26 | * | ||
27 | * Change the stack to that pointed at by sp, then invoke fn(arg) with | ||
28 | * the new stack. | ||
29 | */ | ||
30 | ENTRY(call_with_stack) | ||
31 | str sp, [r2, #-4]! | ||
32 | str lr, [r2, #-4]! | ||
33 | |||
34 | mov sp, r2 | ||
35 | mov r2, r0 | ||
36 | mov r0, r1 | ||
37 | |||
38 | adr lr, BSYM(1f) | ||
39 | mov pc, r2 | ||
40 | |||
41 | 1: ldr lr, [sp] | ||
42 | ldr sp, [sp, #4] | ||
43 | mov pc, lr | ||
44 | ENDPROC(call_with_stack) | ||
diff --git a/arch/arm/mach-at91/include/mach/io.h b/arch/arm/mach-at91/include/mach/io.h index 4298e7806c7..4ca09ef7ca2 100644 --- a/arch/arm/mach-at91/include/mach/io.h +++ b/arch/arm/mach-at91/include/mach/io.h | |||
@@ -30,14 +30,6 @@ | |||
30 | 30 | ||
31 | #ifndef __ASSEMBLY__ | 31 | #ifndef __ASSEMBLY__ |
32 | 32 | ||
33 | #ifndef CONFIG_ARCH_AT91X40 | ||
34 | #define __arch_ioremap at91_ioremap | ||
35 | #define __arch_iounmap at91_iounmap | ||
36 | #endif | ||
37 | |||
38 | void __iomem *at91_ioremap(unsigned long phys, size_t size, unsigned int type); | ||
39 | void at91_iounmap(volatile void __iomem *addr); | ||
40 | |||
41 | static inline unsigned int at91_sys_read(unsigned int reg_offset) | 33 | static inline unsigned int at91_sys_read(unsigned int reg_offset) |
42 | { | 34 | { |
43 | void __iomem *addr = (void __iomem *)AT91_VA_BASE_SYS; | 35 | void __iomem *addr = (void __iomem *)AT91_VA_BASE_SYS; |
diff --git a/arch/arm/mach-at91/include/mach/vmalloc.h b/arch/arm/mach-at91/include/mach/vmalloc.h deleted file mode 100644 index 8e4a1bd0ab1..00000000000 --- a/arch/arm/mach-at91/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,28 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-at91/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 2003 SAN People | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | */ | ||
20 | |||
21 | #ifndef __ASM_ARCH_VMALLOC_H | ||
22 | #define __ASM_ARCH_VMALLOC_H | ||
23 | |||
24 | #include <mach/hardware.h> | ||
25 | |||
26 | #define VMALLOC_END (AT91_VIRT_BASE & PGDIR_MASK) | ||
27 | |||
28 | #endif | ||
diff --git a/arch/arm/mach-at91/setup.c b/arch/arm/mach-at91/setup.c index aa64294c7db..cf98a8f94dc 100644 --- a/arch/arm/mach-at91/setup.c +++ b/arch/arm/mach-at91/setup.c | |||
@@ -73,24 +73,6 @@ static struct map_desc at91_io_desc __initdata = { | |||
73 | .type = MT_DEVICE, | 73 | .type = MT_DEVICE, |
74 | }; | 74 | }; |
75 | 75 | ||
76 | void __iomem *at91_ioremap(unsigned long p, size_t size, unsigned int type) | ||
77 | { | ||
78 | if (p >= AT91_BASE_SYS && p <= (AT91_BASE_SYS + SZ_16K - 1)) | ||
79 | return (void __iomem *)AT91_IO_P2V(p); | ||
80 | |||
81 | return __arm_ioremap_caller(p, size, type, __builtin_return_address(0)); | ||
82 | } | ||
83 | EXPORT_SYMBOL(at91_ioremap); | ||
84 | |||
85 | void at91_iounmap(volatile void __iomem *addr) | ||
86 | { | ||
87 | unsigned long virt = (unsigned long)addr; | ||
88 | |||
89 | if (virt >= VMALLOC_START && virt < VMALLOC_END) | ||
90 | __iounmap(addr); | ||
91 | } | ||
92 | EXPORT_SYMBOL(at91_iounmap); | ||
93 | |||
94 | #define AT91_DBGU0 0xfffff200 | 76 | #define AT91_DBGU0 0xfffff200 |
95 | #define AT91_DBGU1 0xffffee00 | 77 | #define AT91_DBGU1 0xffffee00 |
96 | 78 | ||
diff --git a/arch/arm/mach-bcmring/dma.c b/arch/arm/mach-bcmring/dma.c index f4d4d6d174d..1a1a27dd565 100644 --- a/arch/arm/mach-bcmring/dma.c +++ b/arch/arm/mach-bcmring/dma.c | |||
@@ -1615,7 +1615,7 @@ DMA_MemType_t dma_mem_type(void *addr) | |||
1615 | { | 1615 | { |
1616 | unsigned long addrVal = (unsigned long)addr; | 1616 | unsigned long addrVal = (unsigned long)addr; |
1617 | 1617 | ||
1618 | if (addrVal >= VMALLOC_END) { | 1618 | if (addrVal >= CONSISTENT_BASE) { |
1619 | /* NOTE: DMA virtual memory space starts at 0xFFxxxxxx */ | 1619 | /* NOTE: DMA virtual memory space starts at 0xFFxxxxxx */ |
1620 | 1620 | ||
1621 | /* dma_alloc_xxx pages are physically and virtually contiguous */ | 1621 | /* dma_alloc_xxx pages are physically and virtually contiguous */ |
diff --git a/arch/arm/mach-bcmring/include/mach/vmalloc.h b/arch/arm/mach-bcmring/include/mach/vmalloc.h deleted file mode 100644 index 7397bd7817d..00000000000 --- a/arch/arm/mach-bcmring/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,25 +0,0 @@ | |||
1 | /* | ||
2 | * | ||
3 | * Copyright (C) 2000 Russell King. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation; either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
18 | */ | ||
19 | |||
20 | /* | ||
21 | * Move VMALLOC_END to 0xf0000000 so that the vm space can range from | ||
22 | * 0xe0000000 to 0xefffffff. This gives us 256 MB of vm space and handles | ||
23 | * larger physical memory designs better. | ||
24 | */ | ||
25 | #define VMALLOC_END 0xf0000000UL | ||
diff --git a/arch/arm/mach-clps711x/include/mach/vmalloc.h b/arch/arm/mach-clps711x/include/mach/vmalloc.h deleted file mode 100644 index 467b96137e4..00000000000 --- a/arch/arm/mach-clps711x/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-clps711x/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 2000 Deep Blue Solutions Ltd. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | */ | ||
20 | #define VMALLOC_END 0xd0000000UL | ||
diff --git a/arch/arm/mach-cns3xxx/cns3420vb.c b/arch/arm/mach-cns3xxx/cns3420vb.c index 9b8c3d59731..2c5fb4c7e50 100644 --- a/arch/arm/mach-cns3xxx/cns3420vb.c +++ b/arch/arm/mach-cns3xxx/cns3420vb.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/mtd/partitions.h> | 26 | #include <linux/mtd/partitions.h> |
27 | #include <asm/setup.h> | 27 | #include <asm/setup.h> |
28 | #include <asm/mach-types.h> | 28 | #include <asm/mach-types.h> |
29 | #include <asm/hardware/gic.h> | ||
29 | #include <asm/mach/arch.h> | 30 | #include <asm/mach/arch.h> |
30 | #include <asm/mach/map.h> | 31 | #include <asm/mach/map.h> |
31 | #include <asm/mach/time.h> | 32 | #include <asm/mach/time.h> |
@@ -201,6 +202,7 @@ MACHINE_START(CNS3420VB, "Cavium Networks CNS3420 Validation Board") | |||
201 | .map_io = cns3420_map_io, | 202 | .map_io = cns3420_map_io, |
202 | .init_irq = cns3xxx_init_irq, | 203 | .init_irq = cns3xxx_init_irq, |
203 | .timer = &cns3xxx_timer, | 204 | .timer = &cns3xxx_timer, |
205 | .handle_irq = gic_handle_irq, | ||
204 | .init_machine = cns3420_init, | 206 | .init_machine = cns3420_init, |
205 | .restart = cns3xxx_restart, | 207 | .restart = cns3xxx_restart, |
206 | MACHINE_END | 208 | MACHINE_END |
diff --git a/arch/arm/mach-cns3xxx/include/mach/entry-macro.S b/arch/arm/mach-cns3xxx/include/mach/entry-macro.S index d87bfc397d3..01c57df5f71 100644 --- a/arch/arm/mach-cns3xxx/include/mach/entry-macro.S +++ b/arch/arm/mach-cns3xxx/include/mach/entry-macro.S | |||
@@ -8,8 +8,6 @@ | |||
8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include <asm/hardware/entry-macro-gic.S> | ||
12 | |||
13 | .macro disable_fiq | 11 | .macro disable_fiq |
14 | .endm | 12 | .endm |
15 | 13 | ||
diff --git a/arch/arm/mach-cns3xxx/include/mach/vmalloc.h b/arch/arm/mach-cns3xxx/include/mach/vmalloc.h deleted file mode 100644 index 1dd231d2f77..00000000000 --- a/arch/arm/mach-cns3xxx/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,11 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright 2000 Russell King. | ||
3 | * Copyright 2003 ARM Limited | ||
4 | * Copyright 2008 Cavium Networks | ||
5 | * | ||
6 | * This file is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License, Version 2, as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #define VMALLOC_END 0xd8000000UL | ||
diff --git a/arch/arm/mach-davinci/Makefile b/arch/arm/mach-davinci/Makefile index 495e31306fc..2db78bd5c83 100644 --- a/arch/arm/mach-davinci/Makefile +++ b/arch/arm/mach-davinci/Makefile | |||
@@ -4,7 +4,7 @@ | |||
4 | # | 4 | # |
5 | 5 | ||
6 | # Common objects | 6 | # Common objects |
7 | obj-y := time.o clock.o serial.o io.o psc.o \ | 7 | obj-y := time.o clock.o serial.o psc.o \ |
8 | dma.o usb.o common.o sram.o aemif.o | 8 | dma.o usb.o common.o sram.o aemif.o |
9 | 9 | ||
10 | obj-$(CONFIG_DAVINCI_MUX) += mux.o | 10 | obj-$(CONFIG_DAVINCI_MUX) += mux.o |
diff --git a/arch/arm/mach-davinci/include/mach/io.h b/arch/arm/mach-davinci/include/mach/io.h index d1b954955c1..b2267d1e1a7 100644 --- a/arch/arm/mach-davinci/include/mach/io.h +++ b/arch/arm/mach-davinci/include/mach/io.h | |||
@@ -21,12 +21,4 @@ | |||
21 | #define __mem_pci(a) (a) | 21 | #define __mem_pci(a) (a) |
22 | #define __mem_isa(a) (a) | 22 | #define __mem_isa(a) (a) |
23 | 23 | ||
24 | #ifndef __ASSEMBLER__ | ||
25 | #define __arch_ioremap davinci_ioremap | ||
26 | #define __arch_iounmap davinci_iounmap | ||
27 | |||
28 | void __iomem *davinci_ioremap(unsigned long phys, size_t size, | ||
29 | unsigned int type); | ||
30 | void davinci_iounmap(volatile void __iomem *addr); | ||
31 | #endif | ||
32 | #endif /* __ASM_ARCH_IO_H */ | 24 | #endif /* __ASM_ARCH_IO_H */ |
diff --git a/arch/arm/mach-davinci/include/mach/vmalloc.h b/arch/arm/mach-davinci/include/mach/vmalloc.h deleted file mode 100644 index d49646a8e20..00000000000 --- a/arch/arm/mach-davinci/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,14 +0,0 @@ | |||
1 | /* | ||
2 | * DaVinci vmalloc definitions | ||
3 | * | ||
4 | * Author: Kevin Hilman, MontaVista Software, Inc. <source@mvista.com> | ||
5 | * | ||
6 | * 2007 (c) MontaVista Software, Inc. This file is licensed under | ||
7 | * the terms of the GNU General Public License version 2. This program | ||
8 | * is licensed "as is" without any warranty of any kind, whether express | ||
9 | * or implied. | ||
10 | */ | ||
11 | #include <mach/hardware.h> | ||
12 | |||
13 | /* Allow vmalloc range until the IO virtual range minus a 2M "hole" */ | ||
14 | #define VMALLOC_END (IO_VIRT - (2<<20)) | ||
diff --git a/arch/arm/mach-davinci/io.c b/arch/arm/mach-davinci/io.c deleted file mode 100644 index 8ea60a8b249..00000000000 --- a/arch/arm/mach-davinci/io.c +++ /dev/null | |||
@@ -1,48 +0,0 @@ | |||
1 | /* | ||
2 | * DaVinci I/O mapping code | ||
3 | * | ||
4 | * Copyright (C) 2005-2006 Texas Instruments | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/module.h> | ||
12 | #include <linux/io.h> | ||
13 | |||
14 | #include <asm/tlb.h> | ||
15 | #include <asm/mach/map.h> | ||
16 | |||
17 | #include <mach/common.h> | ||
18 | |||
19 | /* | ||
20 | * Intercept ioremap() requests for addresses in our fixed mapping regions. | ||
21 | */ | ||
22 | void __iomem *davinci_ioremap(unsigned long p, size_t size, unsigned int type) | ||
23 | { | ||
24 | struct map_desc *desc = davinci_soc_info.io_desc; | ||
25 | int desc_num = davinci_soc_info.io_desc_num; | ||
26 | int i; | ||
27 | |||
28 | for (i = 0; i < desc_num; i++, desc++) { | ||
29 | unsigned long iophys = __pfn_to_phys(desc->pfn); | ||
30 | unsigned long iosize = desc->length; | ||
31 | |||
32 | if (p >= iophys && (p + size) <= (iophys + iosize)) | ||
33 | return __io(desc->virtual + p - iophys); | ||
34 | } | ||
35 | |||
36 | return __arm_ioremap_caller(p, size, type, | ||
37 | __builtin_return_address(0)); | ||
38 | } | ||
39 | EXPORT_SYMBOL(davinci_ioremap); | ||
40 | |||
41 | void davinci_iounmap(volatile void __iomem *addr) | ||
42 | { | ||
43 | unsigned long virt = (unsigned long)addr; | ||
44 | |||
45 | if (virt >= VMALLOC_START && virt < VMALLOC_END) | ||
46 | __iounmap(addr); | ||
47 | } | ||
48 | EXPORT_SYMBOL(davinci_iounmap); | ||
diff --git a/arch/arm/mach-dove/include/mach/dove.h b/arch/arm/mach-dove/include/mach/dove.h index b20ec9af788..ad1165d488c 100644 --- a/arch/arm/mach-dove/include/mach/dove.h +++ b/arch/arm/mach-dove/include/mach/dove.h | |||
@@ -11,8 +11,6 @@ | |||
11 | #ifndef __ASM_ARCH_DOVE_H | 11 | #ifndef __ASM_ARCH_DOVE_H |
12 | #define __ASM_ARCH_DOVE_H | 12 | #define __ASM_ARCH_DOVE_H |
13 | 13 | ||
14 | #include <mach/vmalloc.h> | ||
15 | |||
16 | /* | 14 | /* |
17 | * Marvell Dove address maps. | 15 | * Marvell Dove address maps. |
18 | * | 16 | * |
diff --git a/arch/arm/mach-dove/include/mach/vmalloc.h b/arch/arm/mach-dove/include/mach/vmalloc.h deleted file mode 100644 index a28792cf761..00000000000 --- a/arch/arm/mach-dove/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-dove/include/mach/vmalloc.h | ||
3 | */ | ||
4 | |||
5 | #define VMALLOC_END 0xfd800000UL | ||
diff --git a/arch/arm/mach-ebsa110/include/mach/vmalloc.h b/arch/arm/mach-ebsa110/include/mach/vmalloc.h deleted file mode 100644 index ea141b7a3e0..00000000000 --- a/arch/arm/mach-ebsa110/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,10 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-ebsa110/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 1998 Russell King | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | #define VMALLOC_END 0xdf000000UL | ||
diff --git a/arch/arm/mach-ep93xx/adssphere.c b/arch/arm/mach-ep93xx/adssphere.c index 7b41651728c..681e939407d 100644 --- a/arch/arm/mach-ep93xx/adssphere.c +++ b/arch/arm/mach-ep93xx/adssphere.c | |||
@@ -16,6 +16,7 @@ | |||
16 | 16 | ||
17 | #include <mach/hardware.h> | 17 | #include <mach/hardware.h> |
18 | 18 | ||
19 | #include <asm/hardware/vic.h> | ||
19 | #include <asm/mach-types.h> | 20 | #include <asm/mach-types.h> |
20 | #include <asm/mach/arch.h> | 21 | #include <asm/mach/arch.h> |
21 | 22 | ||
@@ -36,6 +37,7 @@ MACHINE_START(ADSSPHERE, "ADS Sphere board") | |||
36 | .atag_offset = 0x100, | 37 | .atag_offset = 0x100, |
37 | .map_io = ep93xx_map_io, | 38 | .map_io = ep93xx_map_io, |
38 | .init_irq = ep93xx_init_irq, | 39 | .init_irq = ep93xx_init_irq, |
40 | .handle_irq = vic_handle_irq, | ||
39 | .timer = &ep93xx_timer, | 41 | .timer = &ep93xx_timer, |
40 | .init_machine = adssphere_init_machine, | 42 | .init_machine = adssphere_init_machine, |
41 | .restart = ep93xx_restart, | 43 | .restart = ep93xx_restart, |
diff --git a/arch/arm/mach-ep93xx/edb93xx.c b/arch/arm/mach-ep93xx/edb93xx.c index c5731c68acc..d115653edca 100644 --- a/arch/arm/mach-ep93xx/edb93xx.c +++ b/arch/arm/mach-ep93xx/edb93xx.c | |||
@@ -39,6 +39,7 @@ | |||
39 | #include <mach/ep93xx_spi.h> | 39 | #include <mach/ep93xx_spi.h> |
40 | #include <mach/gpio-ep93xx.h> | 40 | #include <mach/gpio-ep93xx.h> |
41 | 41 | ||
42 | #include <asm/hardware/vic.h> | ||
42 | #include <asm/mach-types.h> | 43 | #include <asm/mach-types.h> |
43 | #include <asm/mach/arch.h> | 44 | #include <asm/mach/arch.h> |
44 | 45 | ||
@@ -250,6 +251,7 @@ MACHINE_START(EDB9301, "Cirrus Logic EDB9301 Evaluation Board") | |||
250 | .atag_offset = 0x100, | 251 | .atag_offset = 0x100, |
251 | .map_io = ep93xx_map_io, | 252 | .map_io = ep93xx_map_io, |
252 | .init_irq = ep93xx_init_irq, | 253 | .init_irq = ep93xx_init_irq, |
254 | .handle_irq = vic_handle_irq, | ||
253 | .timer = &ep93xx_timer, | 255 | .timer = &ep93xx_timer, |
254 | .init_machine = edb93xx_init_machine, | 256 | .init_machine = edb93xx_init_machine, |
255 | .restart = ep93xx_restart, | 257 | .restart = ep93xx_restart, |
@@ -262,6 +264,7 @@ MACHINE_START(EDB9302, "Cirrus Logic EDB9302 Evaluation Board") | |||
262 | .atag_offset = 0x100, | 264 | .atag_offset = 0x100, |
263 | .map_io = ep93xx_map_io, | 265 | .map_io = ep93xx_map_io, |
264 | .init_irq = ep93xx_init_irq, | 266 | .init_irq = ep93xx_init_irq, |
267 | .handle_irq = vic_handle_irq, | ||
265 | .timer = &ep93xx_timer, | 268 | .timer = &ep93xx_timer, |
266 | .init_machine = edb93xx_init_machine, | 269 | .init_machine = edb93xx_init_machine, |
267 | .restart = ep93xx_restart, | 270 | .restart = ep93xx_restart, |
@@ -274,6 +277,7 @@ MACHINE_START(EDB9302A, "Cirrus Logic EDB9302A Evaluation Board") | |||
274 | .atag_offset = 0x100, | 277 | .atag_offset = 0x100, |
275 | .map_io = ep93xx_map_io, | 278 | .map_io = ep93xx_map_io, |
276 | .init_irq = ep93xx_init_irq, | 279 | .init_irq = ep93xx_init_irq, |
280 | .handle_irq = vic_handle_irq, | ||
277 | .timer = &ep93xx_timer, | 281 | .timer = &ep93xx_timer, |
278 | .init_machine = edb93xx_init_machine, | 282 | .init_machine = edb93xx_init_machine, |
279 | .restart = ep93xx_restart, | 283 | .restart = ep93xx_restart, |
@@ -286,6 +290,7 @@ MACHINE_START(EDB9307, "Cirrus Logic EDB9307 Evaluation Board") | |||
286 | .atag_offset = 0x100, | 290 | .atag_offset = 0x100, |
287 | .map_io = ep93xx_map_io, | 291 | .map_io = ep93xx_map_io, |
288 | .init_irq = ep93xx_init_irq, | 292 | .init_irq = ep93xx_init_irq, |
293 | .handle_irq = vic_handle_irq, | ||
289 | .timer = &ep93xx_timer, | 294 | .timer = &ep93xx_timer, |
290 | .init_machine = edb93xx_init_machine, | 295 | .init_machine = edb93xx_init_machine, |
291 | .restart = ep93xx_restart, | 296 | .restart = ep93xx_restart, |
@@ -298,6 +303,7 @@ MACHINE_START(EDB9307A, "Cirrus Logic EDB9307A Evaluation Board") | |||
298 | .atag_offset = 0x100, | 303 | .atag_offset = 0x100, |
299 | .map_io = ep93xx_map_io, | 304 | .map_io = ep93xx_map_io, |
300 | .init_irq = ep93xx_init_irq, | 305 | .init_irq = ep93xx_init_irq, |
306 | .handle_irq = vic_handle_irq, | ||
301 | .timer = &ep93xx_timer, | 307 | .timer = &ep93xx_timer, |
302 | .init_machine = edb93xx_init_machine, | 308 | .init_machine = edb93xx_init_machine, |
303 | .restart = ep93xx_restart, | 309 | .restart = ep93xx_restart, |
@@ -310,6 +316,7 @@ MACHINE_START(EDB9312, "Cirrus Logic EDB9312 Evaluation Board") | |||
310 | .atag_offset = 0x100, | 316 | .atag_offset = 0x100, |
311 | .map_io = ep93xx_map_io, | 317 | .map_io = ep93xx_map_io, |
312 | .init_irq = ep93xx_init_irq, | 318 | .init_irq = ep93xx_init_irq, |
319 | .handle_irq = vic_handle_irq, | ||
313 | .timer = &ep93xx_timer, | 320 | .timer = &ep93xx_timer, |
314 | .init_machine = edb93xx_init_machine, | 321 | .init_machine = edb93xx_init_machine, |
315 | .restart = ep93xx_restart, | 322 | .restart = ep93xx_restart, |
@@ -322,6 +329,7 @@ MACHINE_START(EDB9315, "Cirrus Logic EDB9315 Evaluation Board") | |||
322 | .atag_offset = 0x100, | 329 | .atag_offset = 0x100, |
323 | .map_io = ep93xx_map_io, | 330 | .map_io = ep93xx_map_io, |
324 | .init_irq = ep93xx_init_irq, | 331 | .init_irq = ep93xx_init_irq, |
332 | .handle_irq = vic_handle_irq, | ||
325 | .timer = &ep93xx_timer, | 333 | .timer = &ep93xx_timer, |
326 | .init_machine = edb93xx_init_machine, | 334 | .init_machine = edb93xx_init_machine, |
327 | .restart = ep93xx_restart, | 335 | .restart = ep93xx_restart, |
@@ -334,6 +342,7 @@ MACHINE_START(EDB9315A, "Cirrus Logic EDB9315A Evaluation Board") | |||
334 | .atag_offset = 0x100, | 342 | .atag_offset = 0x100, |
335 | .map_io = ep93xx_map_io, | 343 | .map_io = ep93xx_map_io, |
336 | .init_irq = ep93xx_init_irq, | 344 | .init_irq = ep93xx_init_irq, |
345 | .handle_irq = vic_handle_irq, | ||
337 | .timer = &ep93xx_timer, | 346 | .timer = &ep93xx_timer, |
338 | .init_machine = edb93xx_init_machine, | 347 | .init_machine = edb93xx_init_machine, |
339 | .restart = ep93xx_restart, | 348 | .restart = ep93xx_restart, |
diff --git a/arch/arm/mach-ep93xx/gesbc9312.c b/arch/arm/mach-ep93xx/gesbc9312.c index 7b89e8a1bb7..af46970dc58 100644 --- a/arch/arm/mach-ep93xx/gesbc9312.c +++ b/arch/arm/mach-ep93xx/gesbc9312.c | |||
@@ -16,6 +16,7 @@ | |||
16 | 16 | ||
17 | #include <mach/hardware.h> | 17 | #include <mach/hardware.h> |
18 | 18 | ||
19 | #include <asm/hardware/vic.h> | ||
19 | #include <asm/mach-types.h> | 20 | #include <asm/mach-types.h> |
20 | #include <asm/mach/arch.h> | 21 | #include <asm/mach/arch.h> |
21 | 22 | ||
@@ -36,6 +37,7 @@ MACHINE_START(GESBC9312, "Glomation GESBC-9312-sx") | |||
36 | .atag_offset = 0x100, | 37 | .atag_offset = 0x100, |
37 | .map_io = ep93xx_map_io, | 38 | .map_io = ep93xx_map_io, |
38 | .init_irq = ep93xx_init_irq, | 39 | .init_irq = ep93xx_init_irq, |
40 | .handle_irq = vic_handle_irq, | ||
39 | .timer = &ep93xx_timer, | 41 | .timer = &ep93xx_timer, |
40 | .init_machine = gesbc9312_init_machine, | 42 | .init_machine = gesbc9312_init_machine, |
41 | .restart = ep93xx_restart, | 43 | .restart = ep93xx_restart, |
diff --git a/arch/arm/mach-ep93xx/include/mach/entry-macro.S b/arch/arm/mach-ep93xx/include/mach/entry-macro.S index 96b85e2c2c0..9be6edcf904 100644 --- a/arch/arm/mach-ep93xx/include/mach/entry-macro.S +++ b/arch/arm/mach-ep93xx/include/mach/entry-macro.S | |||
@@ -9,51 +9,9 @@ | |||
9 | * the Free Software Foundation; either version 2 of the License, or (at | 9 | * the Free Software Foundation; either version 2 of the License, or (at |
10 | * your option) any later version. | 10 | * your option) any later version. |
11 | */ | 11 | */ |
12 | #include <mach/ep93xx-regs.h> | ||
13 | 12 | ||
14 | .macro disable_fiq | 13 | .macro disable_fiq |
15 | .endm | 14 | .endm |
16 | 15 | ||
17 | .macro get_irqnr_preamble, base, tmp | ||
18 | .endm | ||
19 | |||
20 | .macro arch_ret_to_user, tmp1, tmp2 | 16 | .macro arch_ret_to_user, tmp1, tmp2 |
21 | .endm | 17 | .endm |
22 | |||
23 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
24 | ldr \base, =(EP93XX_AHB_VIRT_BASE) | ||
25 | orr \base, \base, #0x000b0000 | ||
26 | mov \irqnr, #0 | ||
27 | ldr \irqstat, [\base] @ lower 32 interrupts | ||
28 | cmp \irqstat, #0 | ||
29 | bne 1001f | ||
30 | |||
31 | eor \base, \base, #0x00070000 | ||
32 | ldr \irqstat, [\base] @ upper 32 interrupts | ||
33 | cmp \irqstat, #0 | ||
34 | beq 1002f | ||
35 | mov \irqnr, #0x20 | ||
36 | |||
37 | 1001: | ||
38 | movs \tmp, \irqstat, lsl #16 | ||
39 | movne \irqstat, \tmp | ||
40 | addeq \irqnr, \irqnr, #16 | ||
41 | |||
42 | movs \tmp, \irqstat, lsl #8 | ||
43 | movne \irqstat, \tmp | ||
44 | addeq \irqnr, \irqnr, #8 | ||
45 | |||
46 | movs \tmp, \irqstat, lsl #4 | ||
47 | movne \irqstat, \tmp | ||
48 | addeq \irqnr, \irqnr, #4 | ||
49 | |||
50 | movs \tmp, \irqstat, lsl #2 | ||
51 | movne \irqstat, \tmp | ||
52 | addeq \irqnr, \irqnr, #2 | ||
53 | |||
54 | movs \tmp, \irqstat, lsl #1 | ||
55 | addeq \irqnr, \irqnr, #1 | ||
56 | orrs \base, \base, #1 | ||
57 | |||
58 | 1002: | ||
59 | .endm | ||
diff --git a/arch/arm/mach-ep93xx/include/mach/vmalloc.h b/arch/arm/mach-ep93xx/include/mach/vmalloc.h deleted file mode 100644 index 1b3f25d03d3..00000000000 --- a/arch/arm/mach-ep93xx/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-ep93xx/include/mach/vmalloc.h | ||
3 | */ | ||
4 | |||
5 | #define VMALLOC_END 0xfe800000UL | ||
diff --git a/arch/arm/mach-ep93xx/micro9.c b/arch/arm/mach-ep93xx/micro9.c index 050ce9216d7..7b98084f0c9 100644 --- a/arch/arm/mach-ep93xx/micro9.c +++ b/arch/arm/mach-ep93xx/micro9.c | |||
@@ -18,6 +18,7 @@ | |||
18 | 18 | ||
19 | #include <mach/hardware.h> | 19 | #include <mach/hardware.h> |
20 | 20 | ||
21 | #include <asm/hardware/vic.h> | ||
21 | #include <asm/mach-types.h> | 22 | #include <asm/mach-types.h> |
22 | #include <asm/mach/arch.h> | 23 | #include <asm/mach/arch.h> |
23 | 24 | ||
@@ -80,6 +81,7 @@ MACHINE_START(MICRO9, "Contec Micro9-High") | |||
80 | .atag_offset = 0x100, | 81 | .atag_offset = 0x100, |
81 | .map_io = ep93xx_map_io, | 82 | .map_io = ep93xx_map_io, |
82 | .init_irq = ep93xx_init_irq, | 83 | .init_irq = ep93xx_init_irq, |
84 | .handle_irq = vic_handle_irq, | ||
83 | .timer = &ep93xx_timer, | 85 | .timer = &ep93xx_timer, |
84 | .init_machine = micro9_init_machine, | 86 | .init_machine = micro9_init_machine, |
85 | .restart = ep93xx_restart, | 87 | .restart = ep93xx_restart, |
@@ -92,6 +94,7 @@ MACHINE_START(MICRO9M, "Contec Micro9-Mid") | |||
92 | .atag_offset = 0x100, | 94 | .atag_offset = 0x100, |
93 | .map_io = ep93xx_map_io, | 95 | .map_io = ep93xx_map_io, |
94 | .init_irq = ep93xx_init_irq, | 96 | .init_irq = ep93xx_init_irq, |
97 | .handle_irq = vic_handle_irq, | ||
95 | .timer = &ep93xx_timer, | 98 | .timer = &ep93xx_timer, |
96 | .init_machine = micro9_init_machine, | 99 | .init_machine = micro9_init_machine, |
97 | .restart = ep93xx_restart, | 100 | .restart = ep93xx_restart, |
@@ -104,6 +107,7 @@ MACHINE_START(MICRO9L, "Contec Micro9-Lite") | |||
104 | .atag_offset = 0x100, | 107 | .atag_offset = 0x100, |
105 | .map_io = ep93xx_map_io, | 108 | .map_io = ep93xx_map_io, |
106 | .init_irq = ep93xx_init_irq, | 109 | .init_irq = ep93xx_init_irq, |
110 | .handle_irq = vic_handle_irq, | ||
107 | .timer = &ep93xx_timer, | 111 | .timer = &ep93xx_timer, |
108 | .init_machine = micro9_init_machine, | 112 | .init_machine = micro9_init_machine, |
109 | .restart = ep93xx_restart, | 113 | .restart = ep93xx_restart, |
@@ -116,6 +120,7 @@ MACHINE_START(MICRO9S, "Contec Micro9-Slim") | |||
116 | .atag_offset = 0x100, | 120 | .atag_offset = 0x100, |
117 | .map_io = ep93xx_map_io, | 121 | .map_io = ep93xx_map_io, |
118 | .init_irq = ep93xx_init_irq, | 122 | .init_irq = ep93xx_init_irq, |
123 | .handle_irq = vic_handle_irq, | ||
119 | .timer = &ep93xx_timer, | 124 | .timer = &ep93xx_timer, |
120 | .init_machine = micro9_init_machine, | 125 | .init_machine = micro9_init_machine, |
121 | .restart = ep93xx_restart, | 126 | .restart = ep93xx_restart, |
diff --git a/arch/arm/mach-ep93xx/simone.c b/arch/arm/mach-ep93xx/simone.c index 188cbdb4dbd..f4e553eca21 100644 --- a/arch/arm/mach-ep93xx/simone.c +++ b/arch/arm/mach-ep93xx/simone.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <mach/fb.h> | 25 | #include <mach/fb.h> |
26 | #include <mach/gpio-ep93xx.h> | 26 | #include <mach/gpio-ep93xx.h> |
27 | 27 | ||
28 | #include <asm/hardware/vic.h> | ||
28 | #include <asm/mach-types.h> | 29 | #include <asm/mach-types.h> |
29 | #include <asm/mach/arch.h> | 30 | #include <asm/mach/arch.h> |
30 | 31 | ||
@@ -80,6 +81,7 @@ MACHINE_START(SIM_ONE, "Simplemachines Sim.One Board") | |||
80 | .atag_offset = 0x100, | 81 | .atag_offset = 0x100, |
81 | .map_io = ep93xx_map_io, | 82 | .map_io = ep93xx_map_io, |
82 | .init_irq = ep93xx_init_irq, | 83 | .init_irq = ep93xx_init_irq, |
84 | .handle_irq = vic_handle_irq, | ||
83 | .timer = &ep93xx_timer, | 85 | .timer = &ep93xx_timer, |
84 | .init_machine = simone_init_machine, | 86 | .init_machine = simone_init_machine, |
85 | .restart = ep93xx_restart, | 87 | .restart = ep93xx_restart, |
diff --git a/arch/arm/mach-ep93xx/snappercl15.c b/arch/arm/mach-ep93xx/snappercl15.c index 797afdee80a..fd846331ddf 100644 --- a/arch/arm/mach-ep93xx/snappercl15.c +++ b/arch/arm/mach-ep93xx/snappercl15.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <mach/fb.h> | 31 | #include <mach/fb.h> |
32 | #include <mach/gpio-ep93xx.h> | 32 | #include <mach/gpio-ep93xx.h> |
33 | 33 | ||
34 | #include <asm/hardware/vic.h> | ||
34 | #include <asm/mach-types.h> | 35 | #include <asm/mach-types.h> |
35 | #include <asm/mach/arch.h> | 36 | #include <asm/mach/arch.h> |
36 | 37 | ||
@@ -177,6 +178,7 @@ MACHINE_START(SNAPPER_CL15, "Bluewater Systems Snapper CL15") | |||
177 | .atag_offset = 0x100, | 178 | .atag_offset = 0x100, |
178 | .map_io = ep93xx_map_io, | 179 | .map_io = ep93xx_map_io, |
179 | .init_irq = ep93xx_init_irq, | 180 | .init_irq = ep93xx_init_irq, |
181 | .handle_irq = vic_handle_irq, | ||
180 | .timer = &ep93xx_timer, | 182 | .timer = &ep93xx_timer, |
181 | .init_machine = snappercl15_init_machine, | 183 | .init_machine = snappercl15_init_machine, |
182 | .restart = ep93xx_restart, | 184 | .restart = ep93xx_restart, |
diff --git a/arch/arm/mach-ep93xx/ts72xx.c b/arch/arm/mach-ep93xx/ts72xx.c index de9bb541b55..79f8ecf07a1 100644 --- a/arch/arm/mach-ep93xx/ts72xx.c +++ b/arch/arm/mach-ep93xx/ts72xx.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <mach/hardware.h> | 23 | #include <mach/hardware.h> |
24 | #include <mach/ts72xx.h> | 24 | #include <mach/ts72xx.h> |
25 | 25 | ||
26 | #include <asm/hardware/vic.h> | ||
26 | #include <asm/mach-types.h> | 27 | #include <asm/mach-types.h> |
27 | #include <asm/mach/map.h> | 28 | #include <asm/mach/map.h> |
28 | #include <asm/mach/arch.h> | 29 | #include <asm/mach/arch.h> |
@@ -247,6 +248,7 @@ MACHINE_START(TS72XX, "Technologic Systems TS-72xx SBC") | |||
247 | .atag_offset = 0x100, | 248 | .atag_offset = 0x100, |
248 | .map_io = ts72xx_map_io, | 249 | .map_io = ts72xx_map_io, |
249 | .init_irq = ep93xx_init_irq, | 250 | .init_irq = ep93xx_init_irq, |
251 | .handle_irq = vic_handle_irq, | ||
250 | .timer = &ep93xx_timer, | 252 | .timer = &ep93xx_timer, |
251 | .init_machine = ts72xx_init_machine, | 253 | .init_machine = ts72xx_init_machine, |
252 | .restart = ep93xx_restart, | 254 | .restart = ep93xx_restart, |
diff --git a/arch/arm/mach-exynos/Kconfig b/arch/arm/mach-exynos/Kconfig index 724ec0f3560..e1efbca2a53 100644 --- a/arch/arm/mach-exynos/Kconfig +++ b/arch/arm/mach-exynos/Kconfig | |||
@@ -17,6 +17,8 @@ choice | |||
17 | 17 | ||
18 | config ARCH_EXYNOS4 | 18 | config ARCH_EXYNOS4 |
19 | bool "SAMSUNG EXYNOS4" | 19 | bool "SAMSUNG EXYNOS4" |
20 | select HAVE_SMP | ||
21 | select MIGHT_HAVE_CACHE_L2X0 | ||
20 | help | 22 | help |
21 | Samsung EXYNOS4 SoCs based systems | 23 | Samsung EXYNOS4 SoCs based systems |
22 | 24 | ||
diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c index 6f567a4d851..d2acb0f948c 100644 --- a/arch/arm/mach-exynos/common.c +++ b/arch/arm/mach-exynos/common.c | |||
@@ -175,11 +175,6 @@ static struct map_desc exynos4_iodesc[] __initdata = { | |||
175 | .length = SZ_4K, | 175 | .length = SZ_4K, |
176 | .type = MT_DEVICE, | 176 | .type = MT_DEVICE, |
177 | }, { | 177 | }, { |
178 | .virtual = (unsigned long)S5P_VA_SROMC, | ||
179 | .pfn = __phys_to_pfn(EXYNOS4_PA_SROMC), | ||
180 | .length = SZ_4K, | ||
181 | .type = MT_DEVICE, | ||
182 | }, { | ||
183 | .virtual = (unsigned long)S3C_VA_USB_HSPHY, | 178 | .virtual = (unsigned long)S3C_VA_USB_HSPHY, |
184 | .pfn = __phys_to_pfn(EXYNOS4_PA_HSPHY), | 179 | .pfn = __phys_to_pfn(EXYNOS4_PA_HSPHY), |
185 | .length = SZ_4K, | 180 | .length = SZ_4K, |
diff --git a/arch/arm/mach-exynos/include/mach/entry-macro.S b/arch/arm/mach-exynos/include/mach/entry-macro.S index f5e9fd8e37b..3ba4f547534 100644 --- a/arch/arm/mach-exynos/include/mach/entry-macro.S +++ b/arch/arm/mach-exynos/include/mach/entry-macro.S | |||
@@ -9,83 +9,8 @@ | |||
9 | * warranty of any kind, whether express or implied. | 9 | * warranty of any kind, whether express or implied. |
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <mach/hardware.h> | ||
13 | #include <mach/map.h> | ||
14 | #include <asm/hardware/gic.h> | ||
15 | |||
16 | .macro disable_fiq | 12 | .macro disable_fiq |
17 | .endm | 13 | .endm |
18 | 14 | ||
19 | .macro get_irqnr_preamble, base, tmp | ||
20 | mov \tmp, #0 | ||
21 | |||
22 | mrc p15, 0, \base, c0, c0, 5 | ||
23 | and \base, \base, #3 | ||
24 | cmp \base, #0 | ||
25 | beq 1f | ||
26 | |||
27 | ldr \tmp, =gic_bank_offset | ||
28 | ldr \tmp, [\tmp] | ||
29 | cmp \base, #1 | ||
30 | beq 1f | ||
31 | |||
32 | cmp \base, #2 | ||
33 | addeq \tmp, \tmp, \tmp | ||
34 | addne \tmp, \tmp, \tmp, LSL #1 | ||
35 | |||
36 | 1: ldr \base, =gic_cpu_base_addr | ||
37 | ldr \base, [\base] | ||
38 | add \base, \base, \tmp | ||
39 | .endm | ||
40 | |||
41 | .macro arch_ret_to_user, tmp1, tmp2 | 15 | .macro arch_ret_to_user, tmp1, tmp2 |
42 | .endm | 16 | .endm |
43 | |||
44 | /* | ||
45 | * The interrupt numbering scheme is defined in the | ||
46 | * interrupt controller spec. To wit: | ||
47 | * | ||
48 | * Interrupts 0-15 are IPI | ||
49 | * 16-28 are reserved | ||
50 | * 29-31 are local. We allow 30 to be used for the watchdog. | ||
51 | * 32-1020 are global | ||
52 | * 1021-1022 are reserved | ||
53 | * 1023 is "spurious" (no interrupt) | ||
54 | * | ||
55 | * For now, we ignore all local interrupts so only return an interrupt if it's | ||
56 | * between 30 and 1020. The test_for_ipi routine below will pick up on IPIs. | ||
57 | * | ||
58 | * A simple read from the controller will tell us the number of the highest | ||
59 | * priority enabled interrupt. We then just need to check whether it is in the | ||
60 | * valid range for an IRQ (30-1020 inclusive). | ||
61 | */ | ||
62 | |||
63 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
64 | |||
65 | ldr \irqstat, [\base, #GIC_CPU_INTACK] /* bits 12-10 = src CPU, 9-0 = int # */ | ||
66 | |||
67 | ldr \tmp, =1021 | ||
68 | |||
69 | bic \irqnr, \irqstat, #0x1c00 | ||
70 | |||
71 | cmp \irqnr, #15 | ||
72 | cmpcc \irqnr, \irqnr | ||
73 | cmpne \irqnr, \tmp | ||
74 | cmpcs \irqnr, \irqnr | ||
75 | addne \irqnr, \irqnr, #32 | ||
76 | |||
77 | .endm | ||
78 | |||
79 | /* We assume that irqstat (the raw value of the IRQ acknowledge | ||
80 | * register) is preserved from the macro above. | ||
81 | * If there is an IPI, we immediately signal end of interrupt on the | ||
82 | * controller, since this requires the original irqstat value which | ||
83 | * we won't easily be able to recreate later. | ||
84 | */ | ||
85 | |||
86 | .macro test_for_ipi, irqnr, irqstat, base, tmp | ||
87 | bic \irqnr, \irqstat, #0x1c00 | ||
88 | cmp \irqnr, #16 | ||
89 | strcc \irqstat, [\base, #GIC_CPU_EOI] | ||
90 | cmpcs \irqnr, \irqnr | ||
91 | .endm | ||
diff --git a/arch/arm/mach-exynos/include/mach/vmalloc.h b/arch/arm/mach-exynos/include/mach/vmalloc.h deleted file mode 100644 index 284330e571d..00000000000 --- a/arch/arm/mach-exynos/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,22 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-exynos4/include/mach/vmalloc.h | ||
2 | * | ||
3 | * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | ||
5 | * | ||
6 | * Copyright 2010 Ben Dooks <ben-linux@fluff.org> | ||
7 | * | ||
8 | * Based on arch/arm/mach-s5p6440/include/mach/vmalloc.h | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | * | ||
14 | * EXYNOS4 vmalloc definition | ||
15 | */ | ||
16 | |||
17 | #ifndef __ASM_ARCH_VMALLOC_H | ||
18 | #define __ASM_ARCH_VMALLOC_H __FILE__ | ||
19 | |||
20 | #define VMALLOC_END 0xF6000000UL | ||
21 | |||
22 | #endif /* __ASM_ARCH_VMALLOC_H */ | ||
diff --git a/arch/arm/mach-exynos/mach-armlex4210.c b/arch/arm/mach-exynos/mach-armlex4210.c index 9a2b99646d2..d726fcd3acf 100644 --- a/arch/arm/mach-exynos/mach-armlex4210.c +++ b/arch/arm/mach-exynos/mach-armlex4210.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/smsc911x.h> | 16 | #include <linux/smsc911x.h> |
17 | 17 | ||
18 | #include <asm/mach/arch.h> | 18 | #include <asm/mach/arch.h> |
19 | #include <asm/hardware/gic.h> | ||
19 | #include <asm/mach-types.h> | 20 | #include <asm/mach-types.h> |
20 | 21 | ||
21 | #include <plat/cpu.h> | 22 | #include <plat/cpu.h> |
@@ -211,6 +212,7 @@ MACHINE_START(ARMLEX4210, "ARMLEX4210") | |||
211 | .atag_offset = 0x100, | 212 | .atag_offset = 0x100, |
212 | .init_irq = exynos4_init_irq, | 213 | .init_irq = exynos4_init_irq, |
213 | .map_io = armlex4210_map_io, | 214 | .map_io = armlex4210_map_io, |
215 | .handle_irq = gic_handle_irq, | ||
214 | .init_machine = armlex4210_machine_init, | 216 | .init_machine = armlex4210_machine_init, |
215 | .timer = &exynos4_timer, | 217 | .timer = &exynos4_timer, |
216 | .restart = exynos4_restart, | 218 | .restart = exynos4_restart, |
diff --git a/arch/arm/mach-exynos/mach-nuri.c b/arch/arm/mach-exynos/mach-nuri.c index 5f6b97f04b7..635fb97e31a 100644 --- a/arch/arm/mach-exynos/mach-nuri.c +++ b/arch/arm/mach-exynos/mach-nuri.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <media/v4l2-mediabus.h> | 32 | #include <media/v4l2-mediabus.h> |
33 | 33 | ||
34 | #include <asm/mach/arch.h> | 34 | #include <asm/mach/arch.h> |
35 | #include <asm/hardware/gic.h> | ||
35 | #include <asm/mach-types.h> | 36 | #include <asm/mach-types.h> |
36 | 37 | ||
37 | #include <plat/adc.h> | 38 | #include <plat/adc.h> |
@@ -1334,6 +1335,7 @@ MACHINE_START(NURI, "NURI") | |||
1334 | .atag_offset = 0x100, | 1335 | .atag_offset = 0x100, |
1335 | .init_irq = exynos4_init_irq, | 1336 | .init_irq = exynos4_init_irq, |
1336 | .map_io = nuri_map_io, | 1337 | .map_io = nuri_map_io, |
1338 | .handle_irq = gic_handle_irq, | ||
1337 | .init_machine = nuri_machine_init, | 1339 | .init_machine = nuri_machine_init, |
1338 | .timer = &exynos4_timer, | 1340 | .timer = &exynos4_timer, |
1339 | .reserve = &nuri_reserve, | 1341 | .reserve = &nuri_reserve, |
diff --git a/arch/arm/mach-exynos/mach-origen.c b/arch/arm/mach-exynos/mach-origen.c index 9536b335691..586eb995aa9 100644 --- a/arch/arm/mach-exynos/mach-origen.c +++ b/arch/arm/mach-exynos/mach-origen.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/lcd.h> | 22 | #include <linux/lcd.h> |
23 | 23 | ||
24 | #include <asm/mach/arch.h> | 24 | #include <asm/mach/arch.h> |
25 | #include <asm/hardware/gic.h> | ||
25 | #include <asm/mach-types.h> | 26 | #include <asm/mach-types.h> |
26 | 27 | ||
27 | #include <video/platform_lcd.h> | 28 | #include <video/platform_lcd.h> |
@@ -695,6 +696,7 @@ MACHINE_START(ORIGEN, "ORIGEN") | |||
695 | .atag_offset = 0x100, | 696 | .atag_offset = 0x100, |
696 | .init_irq = exynos4_init_irq, | 697 | .init_irq = exynos4_init_irq, |
697 | .map_io = origen_map_io, | 698 | .map_io = origen_map_io, |
699 | .handle_irq = gic_handle_irq, | ||
698 | .init_machine = origen_machine_init, | 700 | .init_machine = origen_machine_init, |
699 | .timer = &exynos4_timer, | 701 | .timer = &exynos4_timer, |
700 | .reserve = &origen_reserve, | 702 | .reserve = &origen_reserve, |
diff --git a/arch/arm/mach-exynos/mach-smdk4x12.c b/arch/arm/mach-exynos/mach-smdk4x12.c index 375b5aa5e16..d00e4f016a6 100644 --- a/arch/arm/mach-exynos/mach-smdk4x12.c +++ b/arch/arm/mach-exynos/mach-smdk4x12.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/serial_core.h> | 21 | #include <linux/serial_core.h> |
22 | 22 | ||
23 | #include <asm/mach/arch.h> | 23 | #include <asm/mach/arch.h> |
24 | #include <asm/hardware/gic.h> | ||
24 | #include <asm/mach-types.h> | 25 | #include <asm/mach-types.h> |
25 | 26 | ||
26 | #include <plat/backlight.h> | 27 | #include <plat/backlight.h> |
@@ -288,6 +289,7 @@ MACHINE_START(SMDK4212, "SMDK4212") | |||
288 | .atag_offset = 0x100, | 289 | .atag_offset = 0x100, |
289 | .init_irq = exynos4_init_irq, | 290 | .init_irq = exynos4_init_irq, |
290 | .map_io = smdk4x12_map_io, | 291 | .map_io = smdk4x12_map_io, |
292 | .handle_irq = gic_handle_irq, | ||
291 | .init_machine = smdk4x12_machine_init, | 293 | .init_machine = smdk4x12_machine_init, |
292 | .timer = &exynos4_timer, | 294 | .timer = &exynos4_timer, |
293 | .restart = exynos4_restart, | 295 | .restart = exynos4_restart, |
@@ -299,6 +301,7 @@ MACHINE_START(SMDK4412, "SMDK4412") | |||
299 | .atag_offset = 0x100, | 301 | .atag_offset = 0x100, |
300 | .init_irq = exynos4_init_irq, | 302 | .init_irq = exynos4_init_irq, |
301 | .map_io = smdk4x12_map_io, | 303 | .map_io = smdk4x12_map_io, |
304 | .handle_irq = gic_handle_irq, | ||
302 | .init_machine = smdk4x12_machine_init, | 305 | .init_machine = smdk4x12_machine_init, |
303 | .timer = &exynos4_timer, | 306 | .timer = &exynos4_timer, |
304 | .restart = exynos4_restart, | 307 | .restart = exynos4_restart, |
diff --git a/arch/arm/mach-exynos/mach-smdkv310.c b/arch/arm/mach-exynos/mach-smdkv310.c index f2552ff5ddb..5b365613b47 100644 --- a/arch/arm/mach-exynos/mach-smdkv310.c +++ b/arch/arm/mach-exynos/mach-smdkv310.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/pwm_backlight.h> | 21 | #include <linux/pwm_backlight.h> |
22 | 22 | ||
23 | #include <asm/mach/arch.h> | 23 | #include <asm/mach/arch.h> |
24 | #include <asm/hardware/gic.h> | ||
24 | #include <asm/mach-types.h> | 25 | #include <asm/mach-types.h> |
25 | 26 | ||
26 | #include <video/platform_lcd.h> | 27 | #include <video/platform_lcd.h> |
@@ -376,6 +377,7 @@ MACHINE_START(SMDKV310, "SMDKV310") | |||
376 | .atag_offset = 0x100, | 377 | .atag_offset = 0x100, |
377 | .init_irq = exynos4_init_irq, | 378 | .init_irq = exynos4_init_irq, |
378 | .map_io = smdkv310_map_io, | 379 | .map_io = smdkv310_map_io, |
380 | .handle_irq = gic_handle_irq, | ||
379 | .init_machine = smdkv310_machine_init, | 381 | .init_machine = smdkv310_machine_init, |
380 | .timer = &exynos4_timer, | 382 | .timer = &exynos4_timer, |
381 | .reserve = &smdkv310_reserve, | 383 | .reserve = &smdkv310_reserve, |
@@ -387,6 +389,7 @@ MACHINE_START(SMDKC210, "SMDKC210") | |||
387 | .atag_offset = 0x100, | 389 | .atag_offset = 0x100, |
388 | .init_irq = exynos4_init_irq, | 390 | .init_irq = exynos4_init_irq, |
389 | .map_io = smdkv310_map_io, | 391 | .map_io = smdkv310_map_io, |
392 | .handle_irq = gic_handle_irq, | ||
390 | .init_machine = smdkv310_machine_init, | 393 | .init_machine = smdkv310_machine_init, |
391 | .timer = &exynos4_timer, | 394 | .timer = &exynos4_timer, |
392 | .restart = exynos4_restart, | 395 | .restart = exynos4_restart, |
diff --git a/arch/arm/mach-exynos/mach-universal_c210.c b/arch/arm/mach-exynos/mach-universal_c210.c index 0078d062616..52aea972746 100644 --- a/arch/arm/mach-exynos/mach-universal_c210.c +++ b/arch/arm/mach-exynos/mach-universal_c210.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/i2c/atmel_mxt_ts.h> | 24 | #include <linux/i2c/atmel_mxt_ts.h> |
25 | 25 | ||
26 | #include <asm/mach/arch.h> | 26 | #include <asm/mach/arch.h> |
27 | #include <asm/hardware/gic.h> | ||
27 | #include <asm/mach-types.h> | 28 | #include <asm/mach-types.h> |
28 | 29 | ||
29 | #include <plat/regs-serial.h> | 30 | #include <plat/regs-serial.h> |
@@ -1059,6 +1060,7 @@ MACHINE_START(UNIVERSAL_C210, "UNIVERSAL_C210") | |||
1059 | .atag_offset = 0x100, | 1060 | .atag_offset = 0x100, |
1060 | .init_irq = exynos4_init_irq, | 1061 | .init_irq = exynos4_init_irq, |
1061 | .map_io = universal_map_io, | 1062 | .map_io = universal_map_io, |
1063 | .handle_irq = gic_handle_irq, | ||
1062 | .init_machine = universal_machine_init, | 1064 | .init_machine = universal_machine_init, |
1063 | .timer = &exynos4_timer, | 1065 | .timer = &exynos4_timer, |
1064 | .reserve = &universal_reserve, | 1066 | .reserve = &universal_reserve, |
diff --git a/arch/arm/mach-exynos/platsmp.c b/arch/arm/mach-exynos/platsmp.c index 69ffb2fb387..60bc45e3e70 100644 --- a/arch/arm/mach-exynos/platsmp.c +++ b/arch/arm/mach-exynos/platsmp.c | |||
@@ -32,7 +32,6 @@ | |||
32 | 32 | ||
33 | #include <plat/cpu.h> | 33 | #include <plat/cpu.h> |
34 | 34 | ||
35 | extern unsigned int gic_bank_offset; | ||
36 | extern void exynos4_secondary_startup(void); | 35 | extern void exynos4_secondary_startup(void); |
37 | 36 | ||
38 | #define CPU1_BOOT_REG (samsung_rev() == EXYNOS4210_REV_1_1 ? \ | 37 | #define CPU1_BOOT_REG (samsung_rev() == EXYNOS4210_REV_1_1 ? \ |
@@ -65,31 +64,6 @@ static void __iomem *scu_base_addr(void) | |||
65 | 64 | ||
66 | static DEFINE_SPINLOCK(boot_lock); | 65 | static DEFINE_SPINLOCK(boot_lock); |
67 | 66 | ||
68 | static void __cpuinit exynos4_gic_secondary_init(void) | ||
69 | { | ||
70 | void __iomem *dist_base = S5P_VA_GIC_DIST + | ||
71 | (gic_bank_offset * smp_processor_id()); | ||
72 | void __iomem *cpu_base = S5P_VA_GIC_CPU + | ||
73 | (gic_bank_offset * smp_processor_id()); | ||
74 | int i; | ||
75 | |||
76 | /* | ||
77 | * Deal with the banked PPI and SGI interrupts - disable all | ||
78 | * PPI interrupts, ensure all SGI interrupts are enabled. | ||
79 | */ | ||
80 | __raw_writel(0xffff0000, dist_base + GIC_DIST_ENABLE_CLEAR); | ||
81 | __raw_writel(0x0000ffff, dist_base + GIC_DIST_ENABLE_SET); | ||
82 | |||
83 | /* | ||
84 | * Set priority on PPI and SGI interrupts | ||
85 | */ | ||
86 | for (i = 0; i < 32; i += 4) | ||
87 | __raw_writel(0xa0a0a0a0, dist_base + GIC_DIST_PRI + i * 4 / 4); | ||
88 | |||
89 | __raw_writel(0xf0, cpu_base + GIC_CPU_PRIMASK); | ||
90 | __raw_writel(1, cpu_base + GIC_CPU_CTRL); | ||
91 | } | ||
92 | |||
93 | void __cpuinit platform_secondary_init(unsigned int cpu) | 67 | void __cpuinit platform_secondary_init(unsigned int cpu) |
94 | { | 68 | { |
95 | /* | 69 | /* |
@@ -97,7 +71,7 @@ void __cpuinit platform_secondary_init(unsigned int cpu) | |||
97 | * core (e.g. timer irq), then they will not have been enabled | 71 | * core (e.g. timer irq), then they will not have been enabled |
98 | * for us: do so | 72 | * for us: do so |
99 | */ | 73 | */ |
100 | exynos4_gic_secondary_init(); | 74 | gic_secondary_init(0); |
101 | 75 | ||
102 | /* | 76 | /* |
103 | * let the primary processor know we're out of the | 77 | * let the primary processor know we're out of the |
diff --git a/arch/arm/mach-footbridge/include/mach/vmalloc.h b/arch/arm/mach-footbridge/include/mach/vmalloc.h deleted file mode 100644 index 40ba78e5782..00000000000 --- a/arch/arm/mach-footbridge/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,10 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-footbridge/include/mach/vmalloc.h | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | */ | ||
8 | |||
9 | |||
10 | #define VMALLOC_END 0xf0000000UL | ||
diff --git a/arch/arm/mach-gemini/include/mach/vmalloc.h b/arch/arm/mach-gemini/include/mach/vmalloc.h deleted file mode 100644 index 45371eb86fc..00000000000 --- a/arch/arm/mach-gemini/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,10 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2008-2009 Paulius Zaleckas <paulius.zaleckas@teltonika.lt> | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | */ | ||
9 | |||
10 | #define VMALLOC_END 0xf0000000UL | ||
diff --git a/arch/arm/mach-h720x/include/mach/vmalloc.h b/arch/arm/mach-h720x/include/mach/vmalloc.h deleted file mode 100644 index 8520b4a4d4e..00000000000 --- a/arch/arm/mach-h720x/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,10 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-h720x/include/mach/vmalloc.h | ||
3 | */ | ||
4 | |||
5 | #ifndef __ARCH_ARM_VMALLOC_H | ||
6 | #define __ARCH_ARM_VMALLOC_H | ||
7 | |||
8 | #define VMALLOC_END 0xd0000000UL | ||
9 | |||
10 | #endif | ||
diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c index 4508384f100..804c4a55f80 100644 --- a/arch/arm/mach-highbank/highbank.c +++ b/arch/arm/mach-highbank/highbank.c | |||
@@ -144,6 +144,7 @@ DT_MACHINE_START(HIGHBANK, "Highbank") | |||
144 | .map_io = highbank_map_io, | 144 | .map_io = highbank_map_io, |
145 | .init_irq = highbank_init_irq, | 145 | .init_irq = highbank_init_irq, |
146 | .timer = &highbank_timer, | 146 | .timer = &highbank_timer, |
147 | .handle_irq = gic_handle_irq, | ||
147 | .init_machine = highbank_init, | 148 | .init_machine = highbank_init, |
148 | .dt_compat = highbank_match, | 149 | .dt_compat = highbank_match, |
149 | .restart = highbank_restart, | 150 | .restart = highbank_restart, |
diff --git a/arch/arm/mach-highbank/include/mach/entry-macro.S b/arch/arm/mach-highbank/include/mach/entry-macro.S index 73c11297509..a14f9e62ca9 100644 --- a/arch/arm/mach-highbank/include/mach/entry-macro.S +++ b/arch/arm/mach-highbank/include/mach/entry-macro.S | |||
@@ -1,5 +1,3 @@ | |||
1 | #include <asm/hardware/entry-macro-gic.S> | ||
2 | |||
3 | .macro disable_fiq | 1 | .macro disable_fiq |
4 | .endm | 2 | .endm |
5 | 3 | ||
diff --git a/arch/arm/mach-highbank/include/mach/vmalloc.h b/arch/arm/mach-highbank/include/mach/vmalloc.h deleted file mode 100644 index 1969e954277..00000000000 --- a/arch/arm/mach-highbank/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1 +0,0 @@ | |||
1 | #define VMALLOC_END 0xFEE00000UL | ||
diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig index c44aa974e79..35a218cb5c7 100644 --- a/arch/arm/mach-imx/Kconfig +++ b/arch/arm/mach-imx/Kconfig | |||
@@ -132,7 +132,7 @@ config MACH_MX25_3DS | |||
132 | select IMX_HAVE_PLATFORM_MXC_NAND | 132 | select IMX_HAVE_PLATFORM_MXC_NAND |
133 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX | 133 | select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX |
134 | 134 | ||
135 | config MACH_EUKREA_CPUIMX25 | 135 | config MACH_EUKREA_CPUIMX25SD |
136 | bool "Support Eukrea CPUIMX25 Platform" | 136 | bool "Support Eukrea CPUIMX25 Platform" |
137 | select SOC_IMX25 | 137 | select SOC_IMX25 |
138 | select IMX_HAVE_PLATFORM_FLEXCAN | 138 | select IMX_HAVE_PLATFORM_FLEXCAN |
@@ -148,7 +148,7 @@ config MACH_EUKREA_CPUIMX25 | |||
148 | 148 | ||
149 | choice | 149 | choice |
150 | prompt "Baseboard" | 150 | prompt "Baseboard" |
151 | depends on MACH_EUKREA_CPUIMX25 | 151 | depends on MACH_EUKREA_CPUIMX25SD |
152 | default MACH_EUKREA_MBIMXSD25_BASEBOARD | 152 | default MACH_EUKREA_MBIMXSD25_BASEBOARD |
153 | 153 | ||
154 | config MACH_EUKREA_MBIMXSD25_BASEBOARD | 154 | config MACH_EUKREA_MBIMXSD25_BASEBOARD |
@@ -542,7 +542,7 @@ config MACH_MX35_3DS | |||
542 | Include support for MX35PDK platform. This includes specific | 542 | Include support for MX35PDK platform. This includes specific |
543 | configurations for the board and its peripherals. | 543 | configurations for the board and its peripherals. |
544 | 544 | ||
545 | config MACH_EUKREA_CPUIMX35 | 545 | config MACH_EUKREA_CPUIMX35SD |
546 | bool "Support Eukrea CPUIMX35 Platform" | 546 | bool "Support Eukrea CPUIMX35 Platform" |
547 | select SOC_IMX35 | 547 | select SOC_IMX35 |
548 | select IMX_HAVE_PLATFORM_FLEXCAN | 548 | select IMX_HAVE_PLATFORM_FLEXCAN |
@@ -560,7 +560,7 @@ config MACH_EUKREA_CPUIMX35 | |||
560 | 560 | ||
561 | choice | 561 | choice |
562 | prompt "Baseboard" | 562 | prompt "Baseboard" |
563 | depends on MACH_EUKREA_CPUIMX35 | 563 | depends on MACH_EUKREA_CPUIMX35SD |
564 | default MACH_EUKREA_MBIMXSD35_BASEBOARD | 564 | default MACH_EUKREA_MBIMXSD35_BASEBOARD |
565 | 565 | ||
566 | config MACH_EUKREA_MBIMXSD35_BASEBOARD | 566 | config MACH_EUKREA_MBIMXSD35_BASEBOARD |
@@ -596,12 +596,12 @@ comment "i.MX6 family:" | |||
596 | config SOC_IMX6Q | 596 | config SOC_IMX6Q |
597 | bool "i.MX6 Quad support" | 597 | bool "i.MX6 Quad support" |
598 | select ARM_GIC | 598 | select ARM_GIC |
599 | select CACHE_L2X0 | ||
600 | select CPU_V7 | 599 | select CPU_V7 |
601 | select HAVE_ARM_SCU | 600 | select HAVE_ARM_SCU |
602 | select HAVE_IMX_GPC | 601 | select HAVE_IMX_GPC |
603 | select HAVE_IMX_MMDC | 602 | select HAVE_IMX_MMDC |
604 | select HAVE_IMX_SRC | 603 | select HAVE_IMX_SRC |
604 | select HAVE_SMP | ||
605 | select USE_OF | 605 | select USE_OF |
606 | 606 | ||
607 | help | 607 | help |
diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile index aba73214c2a..d97f409ce98 100644 --- a/arch/arm/mach-imx/Makefile +++ b/arch/arm/mach-imx/Makefile | |||
@@ -24,7 +24,7 @@ obj-$(CONFIG_MACH_MX21ADS) += mach-mx21ads.o | |||
24 | 24 | ||
25 | # i.MX25 based machines | 25 | # i.MX25 based machines |
26 | obj-$(CONFIG_MACH_MX25_3DS) += mach-mx25_3ds.o | 26 | obj-$(CONFIG_MACH_MX25_3DS) += mach-mx25_3ds.o |
27 | obj-$(CONFIG_MACH_EUKREA_CPUIMX25) += mach-eukrea_cpuimx25.o | 27 | obj-$(CONFIG_MACH_EUKREA_CPUIMX25SD) += mach-eukrea_cpuimx25.o |
28 | obj-$(CONFIG_MACH_EUKREA_MBIMXSD25_BASEBOARD) += eukrea_mbimxsd25-baseboard.o | 28 | obj-$(CONFIG_MACH_EUKREA_MBIMXSD25_BASEBOARD) += eukrea_mbimxsd25-baseboard.o |
29 | 29 | ||
30 | # i.MX27 based machines | 30 | # i.MX27 based machines |
@@ -57,7 +57,7 @@ obj-$(CONFIG_MACH_BUG) += mach-bug.o | |||
57 | # i.MX35 based machines | 57 | # i.MX35 based machines |
58 | obj-$(CONFIG_MACH_PCM043) += mach-pcm043.o | 58 | obj-$(CONFIG_MACH_PCM043) += mach-pcm043.o |
59 | obj-$(CONFIG_MACH_MX35_3DS) += mach-mx35_3ds.o | 59 | obj-$(CONFIG_MACH_MX35_3DS) += mach-mx35_3ds.o |
60 | obj-$(CONFIG_MACH_EUKREA_CPUIMX35) += mach-cpuimx35.o | 60 | obj-$(CONFIG_MACH_EUKREA_CPUIMX35SD) += mach-cpuimx35.o |
61 | obj-$(CONFIG_MACH_EUKREA_MBIMXSD35_BASEBOARD) += eukrea_mbimxsd35-baseboard.o | 61 | obj-$(CONFIG_MACH_EUKREA_MBIMXSD35_BASEBOARD) += eukrea_mbimxsd35-baseboard.o |
62 | obj-$(CONFIG_MACH_VPR200) += mach-vpr200.o | 62 | obj-$(CONFIG_MACH_VPR200) += mach-vpr200.o |
63 | 63 | ||
diff --git a/arch/arm/mach-imx/clock-imx35.c b/arch/arm/mach-imx/clock-imx35.c index 8116f119517..ac8238caecb 100644 --- a/arch/arm/mach-imx/clock-imx35.c +++ b/arch/arm/mach-imx/clock-imx35.c | |||
@@ -507,7 +507,7 @@ static struct clk_lookup lookups[] = { | |||
507 | 507 | ||
508 | int __init mx35_clocks_init() | 508 | int __init mx35_clocks_init() |
509 | { | 509 | { |
510 | unsigned int cgr2 = 3 << 26, cgr3 = 0; | 510 | unsigned int cgr2 = 3 << 26; |
511 | 511 | ||
512 | #if defined(CONFIG_DEBUG_LL) && !defined(CONFIG_DEBUG_ICEDCC) | 512 | #if defined(CONFIG_DEBUG_LL) && !defined(CONFIG_DEBUG_ICEDCC) |
513 | cgr2 |= 3 << 16; | 513 | cgr2 |= 3 << 16; |
@@ -521,6 +521,12 @@ int __init mx35_clocks_init() | |||
521 | __raw_writel((3 << 18), CCM_BASE + CCM_CGR0); | 521 | __raw_writel((3 << 18), CCM_BASE + CCM_CGR0); |
522 | __raw_writel((3 << 2) | (3 << 4) | (3 << 6) | (3 << 8) | (3 << 16), | 522 | __raw_writel((3 << 2) | (3 << 4) | (3 << 6) | (3 << 8) | (3 << 16), |
523 | CCM_BASE + CCM_CGR1); | 523 | CCM_BASE + CCM_CGR1); |
524 | __raw_writel(cgr2, CCM_BASE + CCM_CGR2); | ||
525 | __raw_writel(0, CCM_BASE + CCM_CGR3); | ||
526 | |||
527 | clk_enable(&iim_clk); | ||
528 | imx_print_silicon_rev("i.MX35", mx35_revision()); | ||
529 | clk_disable(&iim_clk); | ||
524 | 530 | ||
525 | /* | 531 | /* |
526 | * Check if we came up in internal boot mode. If yes, we need some | 532 | * Check if we came up in internal boot mode. If yes, we need some |
@@ -529,17 +535,11 @@ int __init mx35_clocks_init() | |||
529 | */ | 535 | */ |
530 | if (!(__raw_readl(CCM_BASE + CCM_RCSR) & (3 << 10))) { | 536 | if (!(__raw_readl(CCM_BASE + CCM_RCSR) & (3 << 10))) { |
531 | /* Additionally turn on UART1, SCC, and IIM clocks */ | 537 | /* Additionally turn on UART1, SCC, and IIM clocks */ |
532 | cgr2 |= 3 << 16 | 3 << 4; | 538 | clk_enable(&iim_clk); |
533 | cgr3 |= 3 << 2; | 539 | clk_enable(&uart1_clk); |
540 | clk_enable(&scc_clk); | ||
534 | } | 541 | } |
535 | 542 | ||
536 | __raw_writel(cgr2, CCM_BASE + CCM_CGR2); | ||
537 | __raw_writel(cgr3, CCM_BASE + CCM_CGR3); | ||
538 | |||
539 | clk_enable(&iim_clk); | ||
540 | imx_print_silicon_rev("i.MX35", mx35_revision()); | ||
541 | clk_disable(&iim_clk); | ||
542 | |||
543 | #ifdef CONFIG_MXC_USE_EPIT | 543 | #ifdef CONFIG_MXC_USE_EPIT |
544 | epit_timer_init(&epit1_clk, | 544 | epit_timer_init(&epit1_clk, |
545 | MX35_IO_ADDRESS(MX35_EPIT1_BASE_ADDR), MX35_INT_EPIT1); | 545 | MX35_IO_ADDRESS(MX35_EPIT1_BASE_ADDR), MX35_INT_EPIT1); |
diff --git a/arch/arm/mach-imx/mach-cpuimx35.c b/arch/arm/mach-imx/mach-cpuimx35.c index 012e120509e..8ecc872b254 100644 --- a/arch/arm/mach-imx/mach-cpuimx35.c +++ b/arch/arm/mach-imx/mach-cpuimx35.c | |||
@@ -53,12 +53,18 @@ static const struct imxi2c_platform_data | |||
53 | .bitrate = 100000, | 53 | .bitrate = 100000, |
54 | }; | 54 | }; |
55 | 55 | ||
56 | #define TSC2007_IRQGPIO IMX_GPIO_NR(3, 2) | ||
57 | static int tsc2007_get_pendown_state(void) | ||
58 | { | ||
59 | return !gpio_get_value(TSC2007_IRQGPIO); | ||
60 | } | ||
61 | |||
56 | static struct tsc2007_platform_data tsc2007_info = { | 62 | static struct tsc2007_platform_data tsc2007_info = { |
57 | .model = 2007, | 63 | .model = 2007, |
58 | .x_plate_ohms = 180, | 64 | .x_plate_ohms = 180, |
65 | .get_pendown_state = tsc2007_get_pendown_state, | ||
59 | }; | 66 | }; |
60 | 67 | ||
61 | #define TSC2007_IRQGPIO IMX_GPIO_NR(3, 2) | ||
62 | static struct i2c_board_info eukrea_cpuimx35_i2c_devices[] = { | 68 | static struct i2c_board_info eukrea_cpuimx35_i2c_devices[] = { |
63 | { | 69 | { |
64 | I2C_BOARD_INFO("pcf8563", 0x51), | 70 | I2C_BOARD_INFO("pcf8563", 0x51), |
diff --git a/arch/arm/mach-integrator/Kconfig b/arch/arm/mach-integrator/Kconfig index dfd18f3b50e..350e26636a0 100644 --- a/arch/arm/mach-integrator/Kconfig +++ b/arch/arm/mach-integrator/Kconfig | |||
@@ -6,6 +6,8 @@ config ARCH_INTEGRATOR_AP | |||
6 | bool "Support Integrator/AP and Integrator/PP2 platforms" | 6 | bool "Support Integrator/AP and Integrator/PP2 platforms" |
7 | select CLKSRC_MMIO | 7 | select CLKSRC_MMIO |
8 | select MIGHT_HAVE_PCI | 8 | select MIGHT_HAVE_PCI |
9 | select SERIAL_AMBA_PL010 | ||
10 | select SERIAL_AMBA_PL010_CONSOLE | ||
9 | help | 11 | help |
10 | Include support for the ARM(R) Integrator/AP and | 12 | Include support for the ARM(R) Integrator/AP and |
11 | Integrator/PP2 platforms. | 13 | Integrator/PP2 platforms. |
@@ -15,6 +17,8 @@ config ARCH_INTEGRATOR_CP | |||
15 | select ARCH_CINTEGRATOR | 17 | select ARCH_CINTEGRATOR |
16 | select ARM_TIMER_SP804 | 18 | select ARM_TIMER_SP804 |
17 | select PLAT_VERSATILE_CLCD | 19 | select PLAT_VERSATILE_CLCD |
20 | select SERIAL_AMBA_PL011 | ||
21 | select SERIAL_AMBA_PL011_CONSOLE | ||
18 | help | 22 | help |
19 | Include support for the ARM(R) Integrator CP platform. | 23 | Include support for the ARM(R) Integrator CP platform. |
20 | 24 | ||
diff --git a/arch/arm/mach-integrator/core.c b/arch/arm/mach-integrator/core.c index 0a3e0974398..019f0ab08f6 100644 --- a/arch/arm/mach-integrator/core.c +++ b/arch/arm/mach-integrator/core.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <mach/cm.h> | 29 | #include <mach/cm.h> |
30 | #include <asm/system.h> | 30 | #include <asm/system.h> |
31 | #include <asm/leds.h> | 31 | #include <asm/leds.h> |
32 | #include <asm/mach-types.h> | ||
32 | #include <asm/mach/time.h> | 33 | #include <asm/mach/time.h> |
33 | #include <asm/pgtable.h> | 34 | #include <asm/pgtable.h> |
34 | 35 | ||
@@ -44,7 +45,6 @@ static struct amba_device rtc_device = { | |||
44 | .flags = IORESOURCE_MEM, | 45 | .flags = IORESOURCE_MEM, |
45 | }, | 46 | }, |
46 | .irq = { IRQ_RTCINT, NO_IRQ }, | 47 | .irq = { IRQ_RTCINT, NO_IRQ }, |
47 | .periphid = 0x00041030, | ||
48 | }; | 48 | }; |
49 | 49 | ||
50 | static struct amba_device uart0_device = { | 50 | static struct amba_device uart0_device = { |
@@ -58,7 +58,6 @@ static struct amba_device uart0_device = { | |||
58 | .flags = IORESOURCE_MEM, | 58 | .flags = IORESOURCE_MEM, |
59 | }, | 59 | }, |
60 | .irq = { IRQ_UARTINT0, NO_IRQ }, | 60 | .irq = { IRQ_UARTINT0, NO_IRQ }, |
61 | .periphid = 0x0041010, | ||
62 | }; | 61 | }; |
63 | 62 | ||
64 | static struct amba_device uart1_device = { | 63 | static struct amba_device uart1_device = { |
@@ -72,7 +71,6 @@ static struct amba_device uart1_device = { | |||
72 | .flags = IORESOURCE_MEM, | 71 | .flags = IORESOURCE_MEM, |
73 | }, | 72 | }, |
74 | .irq = { IRQ_UARTINT1, NO_IRQ }, | 73 | .irq = { IRQ_UARTINT1, NO_IRQ }, |
75 | .periphid = 0x0041010, | ||
76 | }; | 74 | }; |
77 | 75 | ||
78 | static struct amba_device kmi0_device = { | 76 | static struct amba_device kmi0_device = { |
@@ -85,7 +83,6 @@ static struct amba_device kmi0_device = { | |||
85 | .flags = IORESOURCE_MEM, | 83 | .flags = IORESOURCE_MEM, |
86 | }, | 84 | }, |
87 | .irq = { IRQ_KMIINT0, NO_IRQ }, | 85 | .irq = { IRQ_KMIINT0, NO_IRQ }, |
88 | .periphid = 0x00041050, | ||
89 | }; | 86 | }; |
90 | 87 | ||
91 | static struct amba_device kmi1_device = { | 88 | static struct amba_device kmi1_device = { |
@@ -98,7 +95,6 @@ static struct amba_device kmi1_device = { | |||
98 | .flags = IORESOURCE_MEM, | 95 | .flags = IORESOURCE_MEM, |
99 | }, | 96 | }, |
100 | .irq = { IRQ_KMIINT1, NO_IRQ }, | 97 | .irq = { IRQ_KMIINT1, NO_IRQ }, |
101 | .periphid = 0x00041050, | ||
102 | }; | 98 | }; |
103 | 99 | ||
104 | static struct amba_device *amba_devs[] __initdata = { | 100 | static struct amba_device *amba_devs[] __initdata = { |
@@ -157,6 +153,19 @@ static int __init integrator_init(void) | |||
157 | { | 153 | { |
158 | int i; | 154 | int i; |
159 | 155 | ||
156 | /* | ||
157 | * The Integrator/AP lacks necessary AMBA PrimeCell IDs, so we need to | ||
158 | * hard-code them. The Integator/CP and forward have proper cell IDs. | ||
159 | * Else we leave them undefined to the bus driver can autoprobe them. | ||
160 | */ | ||
161 | if (machine_is_integrator()) { | ||
162 | rtc_device.periphid = 0x00041030; | ||
163 | uart0_device.periphid = 0x00041010; | ||
164 | uart1_device.periphid = 0x00041010; | ||
165 | kmi0_device.periphid = 0x00041050; | ||
166 | kmi1_device.periphid = 0x00041050; | ||
167 | } | ||
168 | |||
160 | for (i = 0; i < ARRAY_SIZE(amba_devs); i++) { | 169 | for (i = 0; i < ARRAY_SIZE(amba_devs); i++) { |
161 | struct amba_device *d = amba_devs[i]; | 170 | struct amba_device *d = amba_devs[i]; |
162 | amba_device_register(d, &iomem_resource); | 171 | amba_device_register(d, &iomem_resource); |
diff --git a/arch/arm/mach-integrator/include/mach/vmalloc.h b/arch/arm/mach-integrator/include/mach/vmalloc.h deleted file mode 100644 index 2f5a2bafb11..00000000000 --- a/arch/arm/mach-integrator/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-integrator/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 2000 Russell King. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | */ | ||
20 | #define VMALLOC_END 0xd0000000UL | ||
diff --git a/arch/arm/mach-iop13xx/include/mach/vmalloc.h b/arch/arm/mach-iop13xx/include/mach/vmalloc.h deleted file mode 100644 index c5345674034..00000000000 --- a/arch/arm/mach-iop13xx/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,4 +0,0 @@ | |||
1 | #ifndef _VMALLOC_H_ | ||
2 | #define _VMALLOC_H_ | ||
3 | #define VMALLOC_END 0xfa000000UL | ||
4 | #endif | ||
diff --git a/arch/arm/mach-iop32x/include/mach/io.h b/arch/arm/mach-iop32x/include/mach/io.h index 059c783ce0b..2d88264b986 100644 --- a/arch/arm/mach-iop32x/include/mach/io.h +++ b/arch/arm/mach-iop32x/include/mach/io.h | |||
@@ -13,15 +13,8 @@ | |||
13 | 13 | ||
14 | #include <asm/hardware/iop3xx.h> | 14 | #include <asm/hardware/iop3xx.h> |
15 | 15 | ||
16 | extern void __iomem *__iop3xx_ioremap(unsigned long cookie, size_t size, | ||
17 | unsigned int mtype); | ||
18 | extern void __iop3xx_iounmap(void __iomem *addr); | ||
19 | |||
20 | #define IO_SPACE_LIMIT 0xffffffff | 16 | #define IO_SPACE_LIMIT 0xffffffff |
21 | #define __io(p) ((void __iomem *)IOP3XX_PCI_IO_PHYS_TO_VIRT(p)) | 17 | #define __io(p) ((void __iomem *)IOP3XX_PCI_IO_PHYS_TO_VIRT(p)) |
22 | #define __mem_pci(a) (a) | 18 | #define __mem_pci(a) (a) |
23 | 19 | ||
24 | #define __arch_ioremap __iop3xx_ioremap | ||
25 | #define __arch_iounmap __iop3xx_iounmap | ||
26 | |||
27 | #endif | 20 | #endif |
diff --git a/arch/arm/mach-iop32x/include/mach/vmalloc.h b/arch/arm/mach-iop32x/include/mach/vmalloc.h deleted file mode 100644 index c4862d48e58..00000000000 --- a/arch/arm/mach-iop32x/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-iop32x/include/mach/vmalloc.h | ||
3 | */ | ||
4 | |||
5 | #define VMALLOC_END 0xfe000000UL | ||
diff --git a/arch/arm/mach-iop33x/include/mach/io.h b/arch/arm/mach-iop33x/include/mach/io.h index 39e893e97c2..a8a66fc8fbd 100644 --- a/arch/arm/mach-iop33x/include/mach/io.h +++ b/arch/arm/mach-iop33x/include/mach/io.h | |||
@@ -13,15 +13,8 @@ | |||
13 | 13 | ||
14 | #include <asm/hardware/iop3xx.h> | 14 | #include <asm/hardware/iop3xx.h> |
15 | 15 | ||
16 | extern void __iomem *__iop3xx_ioremap(unsigned long cookie, size_t size, | ||
17 | unsigned int mtype); | ||
18 | extern void __iop3xx_iounmap(void __iomem *addr); | ||
19 | |||
20 | #define IO_SPACE_LIMIT 0xffffffff | 16 | #define IO_SPACE_LIMIT 0xffffffff |
21 | #define __io(p) ((void __iomem *)IOP3XX_PCI_IO_PHYS_TO_VIRT(p)) | 17 | #define __io(p) ((void __iomem *)IOP3XX_PCI_IO_PHYS_TO_VIRT(p)) |
22 | #define __mem_pci(a) (a) | 18 | #define __mem_pci(a) (a) |
23 | 19 | ||
24 | #define __arch_ioremap __iop3xx_ioremap | ||
25 | #define __arch_iounmap __iop3xx_iounmap | ||
26 | |||
27 | #endif | 20 | #endif |
diff --git a/arch/arm/mach-iop33x/include/mach/vmalloc.h b/arch/arm/mach-iop33x/include/mach/vmalloc.h deleted file mode 100644 index 48331dc2370..00000000000 --- a/arch/arm/mach-iop33x/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-iop33x/include/mach/vmalloc.h | ||
3 | */ | ||
4 | |||
5 | #define VMALLOC_END 0xfe000000UL | ||
diff --git a/arch/arm/mach-ixp2000/include/mach/vmalloc.h b/arch/arm/mach-ixp2000/include/mach/vmalloc.h deleted file mode 100644 index 61c8dae24f9..00000000000 --- a/arch/arm/mach-ixp2000/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-ixp2000/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Author: Naeem Afzal <naeem.m.afzal@intel.com> | ||
5 | * | ||
6 | * Copyright 2002 Intel Corp. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License as published by the | ||
10 | * Free Software Foundation; either version 2 of the License, or (at your | ||
11 | * option) any later version. | ||
12 | * | ||
13 | * Just any arbitrary offset to the start of the vmalloc VM area: the | ||
14 | * current 8MB value just means that there will be a 8MB "hole" after the | ||
15 | * physical memory until the kernel virtual memory starts. That means that | ||
16 | * any out-of-bounds memory accesses will hopefully be caught. | ||
17 | * The vmalloc() routines leaves a hole of 4kB between each vmalloced | ||
18 | * area for the same reason. ;) | ||
19 | */ | ||
20 | #define VMALLOC_END 0xfb000000UL | ||
diff --git a/arch/arm/mach-ixp23xx/include/mach/io.h b/arch/arm/mach-ixp23xx/include/mach/io.h index a1749d0fd89..4ce4353b9f7 100644 --- a/arch/arm/mach-ixp23xx/include/mach/io.h +++ b/arch/arm/mach-ixp23xx/include/mach/io.h | |||
@@ -20,33 +20,4 @@ | |||
20 | #define __io(p) ((void __iomem*)((p) + IXP23XX_PCI_IO_VIRT)) | 20 | #define __io(p) ((void __iomem*)((p) + IXP23XX_PCI_IO_VIRT)) |
21 | #define __mem_pci(a) (a) | 21 | #define __mem_pci(a) (a) |
22 | 22 | ||
23 | static inline void __iomem * | ||
24 | ixp23xx_ioremap(unsigned long addr, unsigned long size, unsigned int mtype) | ||
25 | { | ||
26 | if (addr >= IXP23XX_PCI_MEM_START && | ||
27 | addr <= IXP23XX_PCI_MEM_START + IXP23XX_PCI_MEM_SIZE) { | ||
28 | if (addr + size > IXP23XX_PCI_MEM_START + IXP23XX_PCI_MEM_SIZE) | ||
29 | return NULL; | ||
30 | |||
31 | return (void __iomem *) | ||
32 | ((addr - IXP23XX_PCI_MEM_START) + IXP23XX_PCI_MEM_VIRT); | ||
33 | } | ||
34 | |||
35 | return __arm_ioremap(addr, size, mtype); | ||
36 | } | ||
37 | |||
38 | static inline void | ||
39 | ixp23xx_iounmap(void __iomem *addr) | ||
40 | { | ||
41 | if ((((u32)addr) >= IXP23XX_PCI_MEM_VIRT) && | ||
42 | (((u32)addr) < IXP23XX_PCI_MEM_VIRT + IXP23XX_PCI_MEM_SIZE)) | ||
43 | return; | ||
44 | |||
45 | __iounmap(addr); | ||
46 | } | ||
47 | |||
48 | #define __arch_ioremap ixp23xx_ioremap | ||
49 | #define __arch_iounmap ixp23xx_iounmap | ||
50 | |||
51 | |||
52 | #endif | 23 | #endif |
diff --git a/arch/arm/mach-ixp23xx/include/mach/vmalloc.h b/arch/arm/mach-ixp23xx/include/mach/vmalloc.h deleted file mode 100644 index 896c56a1c00..00000000000 --- a/arch/arm/mach-ixp23xx/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,10 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-ixp23xx/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (c) 2005 MontaVista Software, Inc. | ||
5 | * | ||
6 | * NPU mappings end at 0xf0000000 and we allocate 64MB for board | ||
7 | * specific static I/O. | ||
8 | */ | ||
9 | |||
10 | #define VMALLOC_END (0xec000000UL) | ||
diff --git a/arch/arm/mach-ixp4xx/common.c b/arch/arm/mach-ixp4xx/common.c index 04aa12103bc..3841ab4146b 100644 --- a/arch/arm/mach-ixp4xx/common.c +++ b/arch/arm/mach-ixp4xx/common.c | |||
@@ -17,7 +17,6 @@ | |||
17 | #include <linux/mm.h> | 17 | #include <linux/mm.h> |
18 | #include <linux/init.h> | 18 | #include <linux/init.h> |
19 | #include <linux/serial.h> | 19 | #include <linux/serial.h> |
20 | #include <linux/sched.h> | ||
21 | #include <linux/tty.h> | 20 | #include <linux/tty.h> |
22 | #include <linux/platform_device.h> | 21 | #include <linux/platform_device.h> |
23 | #include <linux/serial_core.h> | 22 | #include <linux/serial_core.h> |
@@ -403,18 +402,9 @@ void __init ixp4xx_sys_init(void) | |||
403 | /* | 402 | /* |
404 | * sched_clock() | 403 | * sched_clock() |
405 | */ | 404 | */ |
406 | static DEFINE_CLOCK_DATA(cd); | 405 | static u32 notrace ixp4xx_read_sched_clock(void) |
407 | |||
408 | unsigned long long notrace sched_clock(void) | ||
409 | { | 406 | { |
410 | u32 cyc = *IXP4XX_OSTS; | 407 | return *IXP4XX_OSTS; |
411 | return cyc_to_sched_clock(&cd, cyc, (u32)~0); | ||
412 | } | ||
413 | |||
414 | static void notrace ixp4xx_update_sched_clock(void) | ||
415 | { | ||
416 | u32 cyc = *IXP4XX_OSTS; | ||
417 | update_sched_clock(&cd, cyc, (u32)~0); | ||
418 | } | 408 | } |
419 | 409 | ||
420 | /* | 410 | /* |
@@ -430,7 +420,7 @@ unsigned long ixp4xx_timer_freq = IXP4XX_TIMER_FREQ; | |||
430 | EXPORT_SYMBOL(ixp4xx_timer_freq); | 420 | EXPORT_SYMBOL(ixp4xx_timer_freq); |
431 | static void __init ixp4xx_clocksource_init(void) | 421 | static void __init ixp4xx_clocksource_init(void) |
432 | { | 422 | { |
433 | init_sched_clock(&cd, ixp4xx_update_sched_clock, 32, ixp4xx_timer_freq); | 423 | setup_sched_clock(ixp4xx_read_sched_clock, 32, ixp4xx_timer_freq); |
434 | 424 | ||
435 | clocksource_mmio_init(NULL, "OSTS", ixp4xx_timer_freq, 200, 32, | 425 | clocksource_mmio_init(NULL, "OSTS", ixp4xx_timer_freq, 200, 32, |
436 | ixp4xx_clocksource_read); | 426 | ixp4xx_clocksource_read); |
diff --git a/arch/arm/mach-ixp4xx/include/mach/vmalloc.h b/arch/arm/mach-ixp4xx/include/mach/vmalloc.h deleted file mode 100644 index 9bcd64d5985..00000000000 --- a/arch/arm/mach-ixp4xx/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-ixp4xx/include/mach/vmalloc.h | ||
3 | */ | ||
4 | #define VMALLOC_END (0xff000000UL) | ||
5 | |||
diff --git a/arch/arm/mach-kirkwood/include/mach/io.h b/arch/arm/mach-kirkwood/include/mach/io.h index 1aaddc364f2..49dd0cb5e16 100644 --- a/arch/arm/mach-kirkwood/include/mach/io.h +++ b/arch/arm/mach-kirkwood/include/mach/io.h | |||
@@ -19,31 +19,6 @@ static inline void __iomem *__io(unsigned long addr) | |||
19 | + KIRKWOOD_PCIE_IO_VIRT_BASE); | 19 | + KIRKWOOD_PCIE_IO_VIRT_BASE); |
20 | } | 20 | } |
21 | 21 | ||
22 | static inline void __iomem * | ||
23 | __arch_ioremap(unsigned long paddr, size_t size, unsigned int mtype) | ||
24 | { | ||
25 | void __iomem *retval; | ||
26 | unsigned long offs = paddr - KIRKWOOD_REGS_PHYS_BASE; | ||
27 | if (mtype == MT_DEVICE && size && offs < KIRKWOOD_REGS_SIZE && | ||
28 | size <= KIRKWOOD_REGS_SIZE && offs + size <= KIRKWOOD_REGS_SIZE) { | ||
29 | retval = (void __iomem *)KIRKWOOD_REGS_VIRT_BASE + offs; | ||
30 | } else { | ||
31 | retval = __arm_ioremap(paddr, size, mtype); | ||
32 | } | ||
33 | |||
34 | return retval; | ||
35 | } | ||
36 | |||
37 | static inline void | ||
38 | __arch_iounmap(void __iomem *addr) | ||
39 | { | ||
40 | if (addr < (void __iomem *)KIRKWOOD_REGS_VIRT_BASE || | ||
41 | addr >= (void __iomem *)(KIRKWOOD_REGS_VIRT_BASE + KIRKWOOD_REGS_SIZE)) | ||
42 | __iounmap(addr); | ||
43 | } | ||
44 | |||
45 | #define __arch_ioremap __arch_ioremap | ||
46 | #define __arch_iounmap __arch_iounmap | ||
47 | #define __io(a) __io(a) | 22 | #define __io(a) __io(a) |
48 | #define __mem_pci(a) (a) | 23 | #define __mem_pci(a) (a) |
49 | 24 | ||
diff --git a/arch/arm/mach-kirkwood/include/mach/vmalloc.h b/arch/arm/mach-kirkwood/include/mach/vmalloc.h deleted file mode 100644 index bf162ca3d2c..00000000000 --- a/arch/arm/mach-kirkwood/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-kirkwood/include/mach/vmalloc.h | ||
3 | */ | ||
4 | |||
5 | #define VMALLOC_END 0xfe800000UL | ||
diff --git a/arch/arm/mach-kirkwood/sheevaplug-setup.c b/arch/arm/mach-kirkwood/sheevaplug-setup.c index 85bff6b7699..4ea70e5f713 100644 --- a/arch/arm/mach-kirkwood/sheevaplug-setup.c +++ b/arch/arm/mach-kirkwood/sheevaplug-setup.c | |||
@@ -107,7 +107,7 @@ static void __init sheevaplug_init(void) | |||
107 | kirkwood_init(); | 107 | kirkwood_init(); |
108 | 108 | ||
109 | /* setup gpio pin select */ | 109 | /* setup gpio pin select */ |
110 | if (machine_is_sheeva_esata()) | 110 | if (machine_is_esata_sheevaplug()) |
111 | kirkwood_mpp_conf(sheeva_esata_mpp_config); | 111 | kirkwood_mpp_conf(sheeva_esata_mpp_config); |
112 | else | 112 | else |
113 | kirkwood_mpp_conf(sheevaplug_mpp_config); | 113 | kirkwood_mpp_conf(sheevaplug_mpp_config); |
@@ -123,11 +123,11 @@ static void __init sheevaplug_init(void) | |||
123 | kirkwood_ge00_init(&sheevaplug_ge00_data); | 123 | kirkwood_ge00_init(&sheevaplug_ge00_data); |
124 | 124 | ||
125 | /* honor lower power consumption for plugs with out eSATA */ | 125 | /* honor lower power consumption for plugs with out eSATA */ |
126 | if (machine_is_sheeva_esata()) | 126 | if (machine_is_esata_sheevaplug()) |
127 | kirkwood_sata_init(&sheeva_esata_sata_data); | 127 | kirkwood_sata_init(&sheeva_esata_sata_data); |
128 | 128 | ||
129 | /* enable sd wp and sd cd on plugs with esata */ | 129 | /* enable sd wp and sd cd on plugs with esata */ |
130 | if (machine_is_sheeva_esata()) | 130 | if (machine_is_esata_sheevaplug()) |
131 | kirkwood_sdio_init(&sheeva_esata_mvsdio_data); | 131 | kirkwood_sdio_init(&sheeva_esata_mvsdio_data); |
132 | else | 132 | else |
133 | kirkwood_sdio_init(&sheevaplug_mvsdio_data); | 133 | kirkwood_sdio_init(&sheevaplug_mvsdio_data); |
diff --git a/arch/arm/mach-ks8695/include/mach/vmalloc.h b/arch/arm/mach-ks8695/include/mach/vmalloc.h deleted file mode 100644 index 744ac66be3a..00000000000 --- a/arch/arm/mach-ks8695/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,19 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-ks8695/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 2006 Ben Dooks | ||
5 | * Copyright (C) 2006 Simtec Electronics <linux@simtec.co.uk> | ||
6 | * | ||
7 | * KS8695 vmalloc definition | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License version 2 as | ||
11 | * published by the Free Software Foundation. | ||
12 | */ | ||
13 | |||
14 | #ifndef __ASM_ARCH_VMALLOC_H | ||
15 | #define __ASM_ARCH_VMALLOC_H | ||
16 | |||
17 | #define VMALLOC_END (KS8695_IO_VA & PGDIR_MASK) | ||
18 | |||
19 | #endif | ||
diff --git a/arch/arm/mach-lpc32xx/include/mach/vmalloc.h b/arch/arm/mach-lpc32xx/include/mach/vmalloc.h deleted file mode 100644 index 720fa43a60b..00000000000 --- a/arch/arm/mach-lpc32xx/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,24 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-lpc32xx/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Author: Kevin Wells <kevin.wells@nxp.com> | ||
5 | * | ||
6 | * Copyright (C) 2010 NXP Semiconductors | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License as published by | ||
10 | * the Free Software Foundation; either version 2 of the License, or | ||
11 | * (at your option) any later version. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | * GNU General Public License for more details. | ||
17 | */ | ||
18 | |||
19 | #ifndef __ASM_ARCH_VMALLOC_H | ||
20 | #define __ASM_ARCH_VMALLOC_H | ||
21 | |||
22 | #define VMALLOC_END 0xF0000000UL | ||
23 | |||
24 | #endif | ||
diff --git a/arch/arm/mach-mmp/include/mach/vmalloc.h b/arch/arm/mach-mmp/include/mach/vmalloc.h deleted file mode 100644 index 1d0bac003ad..00000000000 --- a/arch/arm/mach-mmp/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-mmp/include/mach/vmalloc.h | ||
3 | */ | ||
4 | |||
5 | #define VMALLOC_END 0xfe000000UL | ||
diff --git a/arch/arm/mach-mmp/time.c b/arch/arm/mach-mmp/time.c index 4e91ee6e27c..71fc4ee4602 100644 --- a/arch/arm/mach-mmp/time.c +++ b/arch/arm/mach-mmp/time.c | |||
@@ -25,7 +25,6 @@ | |||
25 | 25 | ||
26 | #include <linux/io.h> | 26 | #include <linux/io.h> |
27 | #include <linux/irq.h> | 27 | #include <linux/irq.h> |
28 | #include <linux/sched.h> | ||
29 | 28 | ||
30 | #include <asm/sched_clock.h> | 29 | #include <asm/sched_clock.h> |
31 | #include <mach/addr-map.h> | 30 | #include <mach/addr-map.h> |
@@ -42,8 +41,6 @@ | |||
42 | #define MAX_DELTA (0xfffffffe) | 41 | #define MAX_DELTA (0xfffffffe) |
43 | #define MIN_DELTA (16) | 42 | #define MIN_DELTA (16) |
44 | 43 | ||
45 | static DEFINE_CLOCK_DATA(cd); | ||
46 | |||
47 | /* | 44 | /* |
48 | * FIXME: the timer needs some delay to stablize the counter capture | 45 | * FIXME: the timer needs some delay to stablize the counter capture |
49 | */ | 46 | */ |
@@ -59,16 +56,9 @@ static inline uint32_t timer_read(void) | |||
59 | return __raw_readl(TIMERS_VIRT_BASE + TMR_CVWR(1)); | 56 | return __raw_readl(TIMERS_VIRT_BASE + TMR_CVWR(1)); |
60 | } | 57 | } |
61 | 58 | ||
62 | unsigned long long notrace sched_clock(void) | 59 | static u32 notrace mmp_read_sched_clock(void) |
63 | { | 60 | { |
64 | u32 cyc = timer_read(); | 61 | return timer_read(); |
65 | return cyc_to_sched_clock(&cd, cyc, (u32)~0); | ||
66 | } | ||
67 | |||
68 | static void notrace mmp_update_sched_clock(void) | ||
69 | { | ||
70 | u32 cyc = timer_read(); | ||
71 | update_sched_clock(&cd, cyc, (u32)~0); | ||
72 | } | 62 | } |
73 | 63 | ||
74 | static irqreturn_t timer_interrupt(int irq, void *dev_id) | 64 | static irqreturn_t timer_interrupt(int irq, void *dev_id) |
@@ -201,7 +191,7 @@ void __init timer_init(int irq) | |||
201 | { | 191 | { |
202 | timer_config(); | 192 | timer_config(); |
203 | 193 | ||
204 | init_sched_clock(&cd, mmp_update_sched_clock, 32, CLOCK_TICK_RATE); | 194 | setup_sched_clock(mmp_read_sched_clock, 32, CLOCK_TICK_RATE); |
205 | 195 | ||
206 | ckevt.mult = div_sc(CLOCK_TICK_RATE, NSEC_PER_SEC, ckevt.shift); | 196 | ckevt.mult = div_sc(CLOCK_TICK_RATE, NSEC_PER_SEC, ckevt.shift); |
207 | ckevt.max_delta_ns = clockevent_delta2ns(MAX_DELTA, &ckevt); | 197 | ckevt.max_delta_ns = clockevent_delta2ns(MAX_DELTA, &ckevt); |
diff --git a/arch/arm/mach-msm/Kconfig b/arch/arm/mach-msm/Kconfig index ebde97f5d5f..e6beaff7621 100644 --- a/arch/arm/mach-msm/Kconfig +++ b/arch/arm/mach-msm/Kconfig | |||
@@ -67,6 +67,7 @@ config MSM_SOC_REV_A | |||
67 | bool | 67 | bool |
68 | config ARCH_MSM_SCORPIONMP | 68 | config ARCH_MSM_SCORPIONMP |
69 | bool | 69 | bool |
70 | select HAVE_SMP | ||
70 | 71 | ||
71 | config ARCH_MSM_ARM11 | 72 | config ARCH_MSM_ARM11 |
72 | bool | 73 | bool |
diff --git a/arch/arm/mach-msm/board-msm8960.c b/arch/arm/mach-msm/board-msm8960.c index 6dc1cbd2a59..ed359812853 100644 --- a/arch/arm/mach-msm/board-msm8960.c +++ b/arch/arm/mach-msm/board-msm8960.c | |||
@@ -99,6 +99,7 @@ MACHINE_START(MSM8960_SIM, "QCT MSM8960 SIMULATOR") | |||
99 | .map_io = msm8960_map_io, | 99 | .map_io = msm8960_map_io, |
100 | .init_irq = msm8960_init_irq, | 100 | .init_irq = msm8960_init_irq, |
101 | .timer = &msm_timer, | 101 | .timer = &msm_timer, |
102 | .handle_irq = gic_handle_irq, | ||
102 | .init_machine = msm8960_sim_init, | 103 | .init_machine = msm8960_sim_init, |
103 | MACHINE_END | 104 | MACHINE_END |
104 | 105 | ||
@@ -108,6 +109,7 @@ MACHINE_START(MSM8960_RUMI3, "QCT MSM8960 RUMI3") | |||
108 | .map_io = msm8960_map_io, | 109 | .map_io = msm8960_map_io, |
109 | .init_irq = msm8960_init_irq, | 110 | .init_irq = msm8960_init_irq, |
110 | .timer = &msm_timer, | 111 | .timer = &msm_timer, |
112 | .handle_irq = gic_handle_irq, | ||
111 | .init_machine = msm8960_rumi3_init, | 113 | .init_machine = msm8960_rumi3_init, |
112 | MACHINE_END | 114 | MACHINE_END |
113 | 115 | ||
diff --git a/arch/arm/mach-msm/board-msm8x60.c b/arch/arm/mach-msm/board-msm8x60.c index 44bf7168837..0a113424632 100644 --- a/arch/arm/mach-msm/board-msm8x60.c +++ b/arch/arm/mach-msm/board-msm8x60.c | |||
@@ -108,6 +108,7 @@ MACHINE_START(MSM8X60_RUMI3, "QCT MSM8X60 RUMI3") | |||
108 | .reserve = msm8x60_reserve, | 108 | .reserve = msm8x60_reserve, |
109 | .map_io = msm8x60_map_io, | 109 | .map_io = msm8x60_map_io, |
110 | .init_irq = msm8x60_init_irq, | 110 | .init_irq = msm8x60_init_irq, |
111 | .handle_irq = gic_handle_irq, | ||
111 | .init_machine = msm8x60_init, | 112 | .init_machine = msm8x60_init, |
112 | .timer = &msm_timer, | 113 | .timer = &msm_timer, |
113 | MACHINE_END | 114 | MACHINE_END |
@@ -117,6 +118,7 @@ MACHINE_START(MSM8X60_SURF, "QCT MSM8X60 SURF") | |||
117 | .reserve = msm8x60_reserve, | 118 | .reserve = msm8x60_reserve, |
118 | .map_io = msm8x60_map_io, | 119 | .map_io = msm8x60_map_io, |
119 | .init_irq = msm8x60_init_irq, | 120 | .init_irq = msm8x60_init_irq, |
121 | .handle_irq = gic_handle_irq, | ||
120 | .init_machine = msm8x60_init, | 122 | .init_machine = msm8x60_init, |
121 | .timer = &msm_timer, | 123 | .timer = &msm_timer, |
122 | MACHINE_END | 124 | MACHINE_END |
@@ -126,6 +128,7 @@ MACHINE_START(MSM8X60_SIM, "QCT MSM8X60 SIMULATOR") | |||
126 | .reserve = msm8x60_reserve, | 128 | .reserve = msm8x60_reserve, |
127 | .map_io = msm8x60_map_io, | 129 | .map_io = msm8x60_map_io, |
128 | .init_irq = msm8x60_init_irq, | 130 | .init_irq = msm8x60_init_irq, |
131 | .handle_irq = gic_handle_irq, | ||
129 | .init_machine = msm8x60_init, | 132 | .init_machine = msm8x60_init, |
130 | .timer = &msm_timer, | 133 | .timer = &msm_timer, |
131 | MACHINE_END | 134 | MACHINE_END |
@@ -135,6 +138,7 @@ MACHINE_START(MSM8X60_FFA, "QCT MSM8X60 FFA") | |||
135 | .reserve = msm8x60_reserve, | 138 | .reserve = msm8x60_reserve, |
136 | .map_io = msm8x60_map_io, | 139 | .map_io = msm8x60_map_io, |
137 | .init_irq = msm8x60_init_irq, | 140 | .init_irq = msm8x60_init_irq, |
141 | .handle_irq = gic_handle_irq, | ||
138 | .init_machine = msm8x60_init, | 142 | .init_machine = msm8x60_init, |
139 | .timer = &msm_timer, | 143 | .timer = &msm_timer, |
140 | MACHINE_END | 144 | MACHINE_END |
diff --git a/arch/arm/mach-msm/include/mach/entry-macro-qgic.S b/arch/arm/mach-msm/include/mach/entry-macro-qgic.S deleted file mode 100644 index 717076f3ca7..00000000000 --- a/arch/arm/mach-msm/include/mach/entry-macro-qgic.S +++ /dev/null | |||
@@ -1,17 +0,0 @@ | |||
1 | /* | ||
2 | * Low-level IRQ helper macros | ||
3 | * | ||
4 | * Copyright (c) 2010, Code Aurora Forum. All rights reserved. | ||
5 | * | ||
6 | * This file is licensed under the terms of the GNU General Public | ||
7 | * License version 2. This program is licensed "as is" without any | ||
8 | * warranty of any kind, whether express or implied. | ||
9 | */ | ||
10 | |||
11 | #include <asm/hardware/entry-macro-gic.S> | ||
12 | |||
13 | .macro disable_fiq | ||
14 | .endm | ||
15 | |||
16 | .macro arch_ret_to_user, tmp1, tmp2 | ||
17 | .endm | ||
diff --git a/arch/arm/mach-msm/include/mach/entry-macro-vic.S b/arch/arm/mach-msm/include/mach/entry-macro-vic.S deleted file mode 100644 index 70563ed11b3..00000000000 --- a/arch/arm/mach-msm/include/mach/entry-macro-vic.S +++ /dev/null | |||
@@ -1,37 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2007 Google, Inc. | ||
3 | * Author: Brian Swetland <swetland@google.com> | ||
4 | * | ||
5 | * This software is licensed under the terms of the GNU General Public | ||
6 | * License version 2, as published by the Free Software Foundation, and | ||
7 | * may be copied, distributed, and modified under those terms. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | */ | ||
15 | |||
16 | #include <mach/msm_iomap.h> | ||
17 | |||
18 | .macro disable_fiq | ||
19 | .endm | ||
20 | |||
21 | .macro get_irqnr_preamble, base, tmp | ||
22 | @ enable imprecise aborts | ||
23 | cpsie a | ||
24 | mov \base, #MSM_VIC_BASE | ||
25 | .endm | ||
26 | |||
27 | .macro arch_ret_to_user, tmp1, tmp2 | ||
28 | .endm | ||
29 | |||
30 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
31 | @ 0xD0 has irq# or old irq# if the irq has been handled | ||
32 | @ 0xD4 has irq# or -1 if none pending *but* if you just | ||
33 | @ read 0xD4 you never get the first irq for some reason | ||
34 | ldr \irqnr, [\base, #0xD0] | ||
35 | ldr \irqnr, [\base, #0xD4] | ||
36 | cmp \irqnr, #0xffffffff | ||
37 | .endm | ||
diff --git a/arch/arm/mach-msm/include/mach/entry-macro.S b/arch/arm/mach-msm/include/mach/entry-macro.S index b16f082eeb6..41f7003ef34 100644 --- a/arch/arm/mach-msm/include/mach/entry-macro.S +++ b/arch/arm/mach-msm/include/mach/entry-macro.S | |||
@@ -16,8 +16,27 @@ | |||
16 | * | 16 | * |
17 | */ | 17 | */ |
18 | 18 | ||
19 | #if defined(CONFIG_ARM_GIC) | 19 | .macro disable_fiq |
20 | #include <mach/entry-macro-qgic.S> | 20 | .endm |
21 | #else | 21 | |
22 | #include <mach/entry-macro-vic.S> | 22 | .macro arch_ret_to_user, tmp1, tmp2 |
23 | .endm | ||
24 | |||
25 | #if !defined(CONFIG_ARM_GIC) | ||
26 | #include <mach/msm_iomap.h> | ||
27 | |||
28 | .macro get_irqnr_preamble, base, tmp | ||
29 | @ enable imprecise aborts | ||
30 | cpsie a | ||
31 | mov \base, #MSM_VIC_BASE | ||
32 | .endm | ||
33 | |||
34 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
35 | @ 0xD0 has irq# or old irq# if the irq has been handled | ||
36 | @ 0xD4 has irq# or -1 if none pending *but* if you just | ||
37 | @ read 0xD4 you never get the first irq for some reason | ||
38 | ldr \irqnr, [\base, #0xD0] | ||
39 | ldr \irqnr, [\base, #0xD4] | ||
40 | cmp \irqnr, #0xffffffff | ||
41 | .endm | ||
23 | #endif | 42 | #endif |
diff --git a/arch/arm/mach-msm/include/mach/vmalloc.h b/arch/arm/mach-msm/include/mach/vmalloc.h deleted file mode 100644 index d138448eff1..00000000000 --- a/arch/arm/mach-msm/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,22 +0,0 @@ | |||
1 | /* arch/arm/mach-msm/include/mach/vmalloc.h | ||
2 | * | ||
3 | * Copyright (C) 2007 Google, Inc. | ||
4 | * | ||
5 | * This software is licensed under the terms of the GNU General Public | ||
6 | * License version 2, as published by the Free Software Foundation, and | ||
7 | * may be copied, distributed, and modified under those terms. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | */ | ||
15 | |||
16 | #ifndef __ASM_ARCH_MSM_VMALLOC_H | ||
17 | #define __ASM_ARCH_MSM_VMALLOC_H | ||
18 | |||
19 | #define VMALLOC_END 0xd0000000UL | ||
20 | |||
21 | #endif | ||
22 | |||
diff --git a/arch/arm/mach-mv78xx0/include/mach/vmalloc.h b/arch/arm/mach-mv78xx0/include/mach/vmalloc.h deleted file mode 100644 index ba26fe98e64..00000000000 --- a/arch/arm/mach-mv78xx0/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-mv78xx0/include/mach/vmalloc.h | ||
3 | */ | ||
4 | |||
5 | #define VMALLOC_END 0xfe000000UL | ||
diff --git a/arch/arm/mach-mxs/include/mach/vmalloc.h b/arch/arm/mach-mxs/include/mach/vmalloc.h deleted file mode 100644 index 103b0165ed0..00000000000 --- a/arch/arm/mach-mxs/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,22 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2000 Russell King. | ||
3 | * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation; either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | */ | ||
15 | |||
16 | #ifndef __MACH_MXS_VMALLOC_H__ | ||
17 | #define __MACH_MXS_VMALLOC_H__ | ||
18 | |||
19 | /* vmalloc ending address */ | ||
20 | #define VMALLOC_END 0xf4000000UL | ||
21 | |||
22 | #endif /* __MACH_MXS_VMALLOC_H__ */ | ||
diff --git a/arch/arm/mach-netx/include/mach/entry-macro.S b/arch/arm/mach-netx/include/mach/entry-macro.S index 844f1f9acbd..6e9f1cbe163 100644 --- a/arch/arm/mach-netx/include/mach/entry-macro.S +++ b/arch/arm/mach-netx/include/mach/entry-macro.S | |||
@@ -18,22 +18,9 @@ | |||
18 | * along with this program; if not, write to the Free Software | 18 | * along with this program; if not, write to the Free Software |
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
20 | */ | 20 | */ |
21 | #include <mach/hardware.h> | ||
22 | 21 | ||
23 | .macro disable_fiq | 22 | .macro disable_fiq |
24 | .endm | 23 | .endm |
25 | 24 | ||
26 | .macro get_irqnr_preamble, base, tmp | ||
27 | ldr \base, =io_p2v(0x001ff000) | ||
28 | .endm | ||
29 | |||
30 | .macro arch_ret_to_user, tmp1, tmp2 | 25 | .macro arch_ret_to_user, tmp1, tmp2 |
31 | .endm | 26 | .endm |
32 | |||
33 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
34 | ldr \irqstat, [\base, #0] | ||
35 | clz \irqnr, \irqstat | ||
36 | rsb \irqnr, \irqnr, #31 | ||
37 | cmp \irqstat, #0 | ||
38 | .endm | ||
39 | |||
diff --git a/arch/arm/mach-netx/include/mach/vmalloc.h b/arch/arm/mach-netx/include/mach/vmalloc.h deleted file mode 100644 index 871f1ef7bff..00000000000 --- a/arch/arm/mach-netx/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,19 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-netx/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 2005 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 | ||
8 | * as published by the Free Software Foundation. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
18 | */ | ||
19 | #define VMALLOC_END 0xd0000000UL | ||
diff --git a/arch/arm/mach-netx/nxdb500.c b/arch/arm/mach-netx/nxdb500.c index 5384b5a78f6..180ea899a48 100644 --- a/arch/arm/mach-netx/nxdb500.c +++ b/arch/arm/mach-netx/nxdb500.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <mach/hardware.h> | 28 | #include <mach/hardware.h> |
29 | #include <asm/mach-types.h> | 29 | #include <asm/mach-types.h> |
30 | #include <asm/mach/arch.h> | 30 | #include <asm/mach/arch.h> |
31 | #include <asm/hardware/vic.h> | ||
31 | #include <mach/netx-regs.h> | 32 | #include <mach/netx-regs.h> |
32 | #include <mach/eth.h> | 33 | #include <mach/eth.h> |
33 | 34 | ||
@@ -203,6 +204,7 @@ MACHINE_START(NXDB500, "Hilscher nxdb500") | |||
203 | .atag_offset = 0x100, | 204 | .atag_offset = 0x100, |
204 | .map_io = netx_map_io, | 205 | .map_io = netx_map_io, |
205 | .init_irq = netx_init_irq, | 206 | .init_irq = netx_init_irq, |
207 | .handle_irq = vic_handle_irq, | ||
206 | .timer = &netx_timer, | 208 | .timer = &netx_timer, |
207 | .init_machine = nxdb500_init, | 209 | .init_machine = nxdb500_init, |
208 | .restart = netx_restart, | 210 | .restart = netx_restart, |
diff --git a/arch/arm/mach-netx/nxdkn.c b/arch/arm/mach-netx/nxdkn.c index 2df3783ef45..58009e29b20 100644 --- a/arch/arm/mach-netx/nxdkn.c +++ b/arch/arm/mach-netx/nxdkn.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <mach/hardware.h> | 28 | #include <mach/hardware.h> |
29 | #include <asm/mach-types.h> | 29 | #include <asm/mach-types.h> |
30 | #include <asm/mach/arch.h> | 30 | #include <asm/mach/arch.h> |
31 | #include <asm/hardware/vic.h> | ||
31 | #include <mach/netx-regs.h> | 32 | #include <mach/netx-regs.h> |
32 | #include <mach/eth.h> | 33 | #include <mach/eth.h> |
33 | 34 | ||
@@ -96,6 +97,7 @@ MACHINE_START(NXDKN, "Hilscher nxdkn") | |||
96 | .atag_offset = 0x100, | 97 | .atag_offset = 0x100, |
97 | .map_io = netx_map_io, | 98 | .map_io = netx_map_io, |
98 | .init_irq = netx_init_irq, | 99 | .init_irq = netx_init_irq, |
100 | .handle_irq = vic_handle_irq, | ||
99 | .timer = &netx_timer, | 101 | .timer = &netx_timer, |
100 | .init_machine = nxdkn_init, | 102 | .init_machine = nxdkn_init, |
101 | .restart = netx_restart, | 103 | .restart = netx_restart, |
diff --git a/arch/arm/mach-netx/nxeb500hmi.c b/arch/arm/mach-netx/nxeb500hmi.c index 26255b2ce47..122e99826ef 100644 --- a/arch/arm/mach-netx/nxeb500hmi.c +++ b/arch/arm/mach-netx/nxeb500hmi.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <mach/hardware.h> | 28 | #include <mach/hardware.h> |
29 | #include <asm/mach-types.h> | 29 | #include <asm/mach-types.h> |
30 | #include <asm/mach/arch.h> | 30 | #include <asm/mach/arch.h> |
31 | #include <asm/hardware/vic.h> | ||
31 | #include <mach/netx-regs.h> | 32 | #include <mach/netx-regs.h> |
32 | #include <mach/eth.h> | 33 | #include <mach/eth.h> |
33 | 34 | ||
@@ -180,6 +181,7 @@ MACHINE_START(NXEB500HMI, "Hilscher nxeb500hmi") | |||
180 | .atag_offset = 0x100, | 181 | .atag_offset = 0x100, |
181 | .map_io = netx_map_io, | 182 | .map_io = netx_map_io, |
182 | .init_irq = netx_init_irq, | 183 | .init_irq = netx_init_irq, |
184 | .handle_irq = vic_handle_irq, | ||
183 | .timer = &netx_timer, | 185 | .timer = &netx_timer, |
184 | .init_machine = nxeb500hmi_init, | 186 | .init_machine = nxeb500hmi_init, |
185 | .restart = netx_restart, | 187 | .restart = netx_restart, |
diff --git a/arch/arm/mach-nomadik/board-nhk8815.c b/arch/arm/mach-nomadik/board-nhk8815.c index 68c7b79bad7..7c878bf0034 100644 --- a/arch/arm/mach-nomadik/board-nhk8815.c +++ b/arch/arm/mach-nomadik/board-nhk8815.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/mtd/onenand.h> | 21 | #include <linux/mtd/onenand.h> |
22 | #include <linux/mtd/partitions.h> | 22 | #include <linux/mtd/partitions.h> |
23 | #include <linux/io.h> | 23 | #include <linux/io.h> |
24 | #include <asm/hardware/vic.h> | ||
24 | #include <asm/sizes.h> | 25 | #include <asm/sizes.h> |
25 | #include <asm/mach-types.h> | 26 | #include <asm/mach-types.h> |
26 | #include <asm/mach/arch.h> | 27 | #include <asm/mach/arch.h> |
@@ -282,6 +283,7 @@ MACHINE_START(NOMADIK, "NHK8815") | |||
282 | .atag_offset = 0x100, | 283 | .atag_offset = 0x100, |
283 | .map_io = cpu8815_map_io, | 284 | .map_io = cpu8815_map_io, |
284 | .init_irq = cpu8815_init_irq, | 285 | .init_irq = cpu8815_init_irq, |
286 | .handle_irq = vic_handle_irq, | ||
285 | .timer = &nomadik_timer, | 287 | .timer = &nomadik_timer, |
286 | .init_machine = nhk8815_platform_init, | 288 | .init_machine = nhk8815_platform_init, |
287 | .restart = cpu8815_restart, | 289 | .restart = cpu8815_restart, |
diff --git a/arch/arm/mach-nomadik/include/mach/entry-macro.S b/arch/arm/mach-nomadik/include/mach/entry-macro.S index 49f1aa3bb42..98ea1c1fbba 100644 --- a/arch/arm/mach-nomadik/include/mach/entry-macro.S +++ b/arch/arm/mach-nomadik/include/mach/entry-macro.S | |||
@@ -6,38 +6,8 @@ | |||
6 | * warranty of any kind, whether express or implied. | 6 | * warranty of any kind, whether express or implied. |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #include <mach/hardware.h> | ||
10 | #include <mach/irqs.h> | ||
11 | |||
12 | .macro disable_fiq | 9 | .macro disable_fiq |
13 | .endm | 10 | .endm |
14 | 11 | ||
15 | .macro get_irqnr_preamble, base, tmp | ||
16 | ldr \base, =IO_ADDRESS(NOMADIK_IC_BASE) | ||
17 | .endm | ||
18 | |||
19 | .macro arch_ret_to_user, tmp1, tmp2 | 12 | .macro arch_ret_to_user, tmp1, tmp2 |
20 | .endm | 13 | .endm |
21 | |||
22 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
23 | |||
24 | /* This stanza gets the irq mask from one of two status registers */ | ||
25 | mov \irqnr, #0 | ||
26 | ldr \irqstat, [\base, #VIC_REG_IRQSR0] @ get masked status | ||
27 | cmp \irqstat, #0 | ||
28 | bne 1001f | ||
29 | add \irqnr, \irqnr, #32 | ||
30 | ldr \irqstat, [\base, #VIC_REG_IRQSR1] @ get masked status | ||
31 | |||
32 | 1001: tst \irqstat, #15 | ||
33 | bne 1002f | ||
34 | add \irqnr, \irqnr, #4 | ||
35 | movs \irqstat, \irqstat, lsr #4 | ||
36 | bne 1001b | ||
37 | 1002: tst \irqstat, #1 | ||
38 | bne 1003f | ||
39 | add \irqnr, \irqnr, #1 | ||
40 | movs \irqstat, \irqstat, lsr #1 | ||
41 | bne 1002b | ||
42 | 1003: /* EQ will be set if no irqs pending */ | ||
43 | .endm | ||
diff --git a/arch/arm/mach-nomadik/include/mach/vmalloc.h b/arch/arm/mach-nomadik/include/mach/vmalloc.h deleted file mode 100644 index f83d574d944..00000000000 --- a/arch/arm/mach-nomadik/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,2 +0,0 @@ | |||
1 | |||
2 | #define VMALLOC_END 0xe8000000UL | ||
diff --git a/arch/arm/mach-omap1/include/mach/vmalloc.h b/arch/arm/mach-omap1/include/mach/vmalloc.h deleted file mode 100644 index 22ec4a47957..00000000000 --- a/arch/arm/mach-omap1/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-omap1/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 2000 Russell King. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | */ | ||
20 | #define VMALLOC_END 0xd8000000UL | ||
diff --git a/arch/arm/mach-omap1/io.c b/arch/arm/mach-omap1/io.c index 7969cfda445..8e55b6fb347 100644 --- a/arch/arm/mach-omap1/io.c +++ b/arch/arm/mach-omap1/io.c | |||
@@ -121,7 +121,6 @@ void __init omap16xx_map_io(void) | |||
121 | void omap1_init_early(void) | 121 | void omap1_init_early(void) |
122 | { | 122 | { |
123 | omap_check_revision(); | 123 | omap_check_revision(); |
124 | omap_ioremap_init(); | ||
125 | 124 | ||
126 | /* REVISIT: Refer to OMAP5910 Errata, Advisory SYS_1: "Timeout Abort | 125 | /* REVISIT: Refer to OMAP5910 Errata, Advisory SYS_1: "Timeout Abort |
127 | * on a Posted Write in the TIPB Bridge". | 126 | * on a Posted Write in the TIPB Bridge". |
diff --git a/arch/arm/mach-omap1/time.c b/arch/arm/mach-omap1/time.c index 485a21d3100..b8faffa44f9 100644 --- a/arch/arm/mach-omap1/time.c +++ b/arch/arm/mach-omap1/time.c | |||
@@ -37,7 +37,6 @@ | |||
37 | #include <linux/init.h> | 37 | #include <linux/init.h> |
38 | #include <linux/delay.h> | 38 | #include <linux/delay.h> |
39 | #include <linux/interrupt.h> | 39 | #include <linux/interrupt.h> |
40 | #include <linux/sched.h> | ||
41 | #include <linux/spinlock.h> | 40 | #include <linux/spinlock.h> |
42 | #include <linux/clk.h> | 41 | #include <linux/clk.h> |
43 | #include <linux/err.h> | 42 | #include <linux/err.h> |
@@ -190,30 +189,9 @@ static __init void omap_init_mpu_timer(unsigned long rate) | |||
190 | * --------------------------------------------------------------------------- | 189 | * --------------------------------------------------------------------------- |
191 | */ | 190 | */ |
192 | 191 | ||
193 | static DEFINE_CLOCK_DATA(cd); | 192 | static u32 notrace omap_mpu_read_sched_clock(void) |
194 | |||
195 | static inline unsigned long long notrace _omap_mpu_sched_clock(void) | ||
196 | { | ||
197 | u32 cyc = ~omap_mpu_timer_read(1); | ||
198 | return cyc_to_sched_clock(&cd, cyc, (u32)~0); | ||
199 | } | ||
200 | |||
201 | #ifndef CONFIG_OMAP_32K_TIMER | ||
202 | unsigned long long notrace sched_clock(void) | ||
203 | { | ||
204 | return _omap_mpu_sched_clock(); | ||
205 | } | ||
206 | #else | ||
207 | static unsigned long long notrace omap_mpu_sched_clock(void) | ||
208 | { | ||
209 | return _omap_mpu_sched_clock(); | ||
210 | } | ||
211 | #endif | ||
212 | |||
213 | static void notrace mpu_update_sched_clock(void) | ||
214 | { | 193 | { |
215 | u32 cyc = ~omap_mpu_timer_read(1); | 194 | return ~omap_mpu_timer_read(1); |
216 | update_sched_clock(&cd, cyc, (u32)~0); | ||
217 | } | 195 | } |
218 | 196 | ||
219 | static void __init omap_init_clocksource(unsigned long rate) | 197 | static void __init omap_init_clocksource(unsigned long rate) |
@@ -223,7 +201,7 @@ static void __init omap_init_clocksource(unsigned long rate) | |||
223 | "%s: can't register clocksource!\n"; | 201 | "%s: can't register clocksource!\n"; |
224 | 202 | ||
225 | omap_mpu_timer_start(1, ~0, 1); | 203 | omap_mpu_timer_start(1, ~0, 1); |
226 | init_sched_clock(&cd, mpu_update_sched_clock, 32, rate); | 204 | setup_sched_clock(omap_mpu_read_sched_clock, 32, rate); |
227 | 205 | ||
228 | if (clocksource_mmio_init(&timer->read_tim, "mpu_timer2", rate, | 206 | if (clocksource_mmio_init(&timer->read_tim, "mpu_timer2", rate, |
229 | 300, 32, clocksource_mmio_readl_down)) | 207 | 300, 32, clocksource_mmio_readl_down)) |
@@ -254,30 +232,6 @@ static inline void omap_mpu_timer_init(void) | |||
254 | } | 232 | } |
255 | #endif /* CONFIG_OMAP_MPU_TIMER */ | 233 | #endif /* CONFIG_OMAP_MPU_TIMER */ |
256 | 234 | ||
257 | #if defined(CONFIG_OMAP_MPU_TIMER) && defined(CONFIG_OMAP_32K_TIMER) | ||
258 | static unsigned long long (*preferred_sched_clock)(void); | ||
259 | |||
260 | unsigned long long notrace sched_clock(void) | ||
261 | { | ||
262 | if (!preferred_sched_clock) | ||
263 | return 0; | ||
264 | |||
265 | return preferred_sched_clock(); | ||
266 | } | ||
267 | |||
268 | static inline void preferred_sched_clock_init(bool use_32k_sched_clock) | ||
269 | { | ||
270 | if (use_32k_sched_clock) | ||
271 | preferred_sched_clock = omap_32k_sched_clock; | ||
272 | else | ||
273 | preferred_sched_clock = omap_mpu_sched_clock; | ||
274 | } | ||
275 | #else | ||
276 | static inline void preferred_sched_clock_init(bool use_32k_sched_clcok) | ||
277 | { | ||
278 | } | ||
279 | #endif | ||
280 | |||
281 | static inline int omap_32k_timer_usable(void) | 235 | static inline int omap_32k_timer_usable(void) |
282 | { | 236 | { |
283 | int res = false; | 237 | int res = false; |
@@ -299,12 +253,8 @@ static inline int omap_32k_timer_usable(void) | |||
299 | */ | 253 | */ |
300 | static void __init omap1_timer_init(void) | 254 | static void __init omap1_timer_init(void) |
301 | { | 255 | { |
302 | if (omap_32k_timer_usable()) { | 256 | if (!omap_32k_timer_usable()) |
303 | preferred_sched_clock_init(1); | ||
304 | } else { | ||
305 | omap_mpu_timer_init(); | 257 | omap_mpu_timer_init(); |
306 | preferred_sched_clock_init(0); | ||
307 | } | ||
308 | } | 258 | } |
309 | 259 | ||
310 | struct sys_timer omap1_timer = { | 260 | struct sys_timer omap1_timer = { |
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index e1293aa513d..4f01533083c 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig | |||
@@ -25,6 +25,7 @@ config ARCH_OMAP2 | |||
25 | depends on ARCH_OMAP2PLUS | 25 | depends on ARCH_OMAP2PLUS |
26 | default y | 26 | default y |
27 | select CPU_V6 | 27 | select CPU_V6 |
28 | select MULTI_IRQ_HANDLER | ||
28 | 29 | ||
29 | config ARCH_OMAP3 | 30 | config ARCH_OMAP3 |
30 | bool "TI OMAP3" | 31 | bool "TI OMAP3" |
@@ -36,13 +37,16 @@ config ARCH_OMAP3 | |||
36 | select ARCH_HAS_OPP | 37 | select ARCH_HAS_OPP |
37 | select PM_OPP if PM | 38 | select PM_OPP if PM |
38 | select ARM_CPU_SUSPEND if PM | 39 | select ARM_CPU_SUSPEND if PM |
40 | select MULTI_IRQ_HANDLER | ||
39 | 41 | ||
40 | config ARCH_OMAP4 | 42 | config ARCH_OMAP4 |
41 | bool "TI OMAP4" | 43 | bool "TI OMAP4" |
42 | default y | 44 | default y |
43 | depends on ARCH_OMAP2PLUS | 45 | depends on ARCH_OMAP2PLUS |
46 | select CACHE_L2X0 | ||
44 | select CPU_V7 | 47 | select CPU_V7 |
45 | select ARM_GIC | 48 | select ARM_GIC |
49 | select HAVE_SMP | ||
46 | select LOCAL_TIMERS if SMP | 50 | select LOCAL_TIMERS if SMP |
47 | select PL310_ERRATA_588369 | 51 | select PL310_ERRATA_588369 |
48 | select PL310_ERRATA_727915 | 52 | select PL310_ERRATA_727915 |
diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-omap2/board-2430sdp.c index 2e730242132..7370983f809 100644 --- a/arch/arm/mach-omap2/board-2430sdp.c +++ b/arch/arm/mach-omap2/board-2430sdp.c | |||
@@ -301,6 +301,7 @@ MACHINE_START(OMAP_2430SDP, "OMAP2430 sdp2430 board") | |||
301 | .map_io = omap243x_map_io, | 301 | .map_io = omap243x_map_io, |
302 | .init_early = omap2430_init_early, | 302 | .init_early = omap2430_init_early, |
303 | .init_irq = omap2_init_irq, | 303 | .init_irq = omap2_init_irq, |
304 | .handle_irq = omap2_intc_handle_irq, | ||
304 | .init_machine = omap_2430sdp_init, | 305 | .init_machine = omap_2430sdp_init, |
305 | .timer = &omap2_timer, | 306 | .timer = &omap2_timer, |
306 | .restart = omap_prcm_restart, | 307 | .restart = omap_prcm_restart, |
diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c index 7111677c7e6..9996334cb68 100644 --- a/arch/arm/mach-omap2/board-3430sdp.c +++ b/arch/arm/mach-omap2/board-3430sdp.c | |||
@@ -728,6 +728,7 @@ MACHINE_START(OMAP_3430SDP, "OMAP3430 3430SDP board") | |||
728 | .map_io = omap3_map_io, | 728 | .map_io = omap3_map_io, |
729 | .init_early = omap3430_init_early, | 729 | .init_early = omap3430_init_early, |
730 | .init_irq = omap3_init_irq, | 730 | .init_irq = omap3_init_irq, |
731 | .handle_irq = omap3_intc_handle_irq, | ||
731 | .init_machine = omap_3430sdp_init, | 732 | .init_machine = omap_3430sdp_init, |
732 | .timer = &omap3_timer, | 733 | .timer = &omap3_timer, |
733 | .restart = omap_prcm_restart, | 734 | .restart = omap_prcm_restart, |
diff --git a/arch/arm/mach-omap2/board-3630sdp.c b/arch/arm/mach-omap2/board-3630sdp.c index a01d08118a4..6ef350d1ae4 100644 --- a/arch/arm/mach-omap2/board-3630sdp.c +++ b/arch/arm/mach-omap2/board-3630sdp.c | |||
@@ -215,6 +215,7 @@ MACHINE_START(OMAP_3630SDP, "OMAP 3630SDP board") | |||
215 | .map_io = omap3_map_io, | 215 | .map_io = omap3_map_io, |
216 | .init_early = omap3630_init_early, | 216 | .init_early = omap3630_init_early, |
217 | .init_irq = omap3_init_irq, | 217 | .init_irq = omap3_init_irq, |
218 | .handle_irq = omap3_intc_handle_irq, | ||
218 | .init_machine = omap_sdp_init, | 219 | .init_machine = omap_sdp_init, |
219 | .timer = &omap3_timer, | 220 | .timer = &omap3_timer, |
220 | .restart = omap_prcm_restart, | 221 | .restart = omap_prcm_restart, |
diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c index 8a46ad8f122..bad5d5a5ef7 100644 --- a/arch/arm/mach-omap2/board-4430sdp.c +++ b/arch/arm/mach-omap2/board-4430sdp.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/leds_pwm.h> | 27 | #include <linux/leds_pwm.h> |
28 | 28 | ||
29 | #include <mach/hardware.h> | 29 | #include <mach/hardware.h> |
30 | #include <asm/hardware/gic.h> | ||
30 | #include <asm/mach-types.h> | 31 | #include <asm/mach-types.h> |
31 | #include <asm/mach/arch.h> | 32 | #include <asm/mach/arch.h> |
32 | #include <asm/mach/map.h> | 33 | #include <asm/mach/map.h> |
@@ -983,6 +984,7 @@ MACHINE_START(OMAP_4430SDP, "OMAP4430 4430SDP board") | |||
983 | .map_io = omap4_map_io, | 984 | .map_io = omap4_map_io, |
984 | .init_early = omap4430_init_early, | 985 | .init_early = omap4430_init_early, |
985 | .init_irq = gic_init_irq, | 986 | .init_irq = gic_init_irq, |
987 | .handle_irq = gic_handle_irq, | ||
986 | .init_machine = omap_4430sdp_init, | 988 | .init_machine = omap_4430sdp_init, |
987 | .timer = &omap4_timer, | 989 | .timer = &omap4_timer, |
988 | .restart = omap_prcm_restart, | 990 | .restart = omap_prcm_restart, |
diff --git a/arch/arm/mach-omap2/board-am3517crane.c b/arch/arm/mach-omap2/board-am3517crane.c index c1d6b6338b0..c3851e8de28 100644 --- a/arch/arm/mach-omap2/board-am3517crane.c +++ b/arch/arm/mach-omap2/board-am3517crane.c | |||
@@ -98,6 +98,7 @@ MACHINE_START(CRANEBOARD, "AM3517/05 CRANEBOARD") | |||
98 | .map_io = omap3_map_io, | 98 | .map_io = omap3_map_io, |
99 | .init_early = am35xx_init_early, | 99 | .init_early = am35xx_init_early, |
100 | .init_irq = omap3_init_irq, | 100 | .init_irq = omap3_init_irq, |
101 | .handle_irq = omap3_intc_handle_irq, | ||
101 | .init_machine = am3517_crane_init, | 102 | .init_machine = am3517_crane_init, |
102 | .timer = &omap3_timer, | 103 | .timer = &omap3_timer, |
103 | .restart = omap_prcm_restart, | 104 | .restart = omap_prcm_restart, |
diff --git a/arch/arm/mach-omap2/board-am3517evm.c b/arch/arm/mach-omap2/board-am3517evm.c index 18c079070ec..f5a3a3f1173 100644 --- a/arch/arm/mach-omap2/board-am3517evm.c +++ b/arch/arm/mach-omap2/board-am3517evm.c | |||
@@ -491,6 +491,7 @@ MACHINE_START(OMAP3517EVM, "OMAP3517/AM3517 EVM") | |||
491 | .map_io = omap3_map_io, | 491 | .map_io = omap3_map_io, |
492 | .init_early = am35xx_init_early, | 492 | .init_early = am35xx_init_early, |
493 | .init_irq = omap3_init_irq, | 493 | .init_irq = omap3_init_irq, |
494 | .handle_irq = omap3_intc_handle_irq, | ||
494 | .init_machine = am3517_evm_init, | 495 | .init_machine = am3517_evm_init, |
495 | .timer = &omap3_timer, | 496 | .timer = &omap3_timer, |
496 | .restart = omap_prcm_restart, | 497 | .restart = omap_prcm_restart, |
diff --git a/arch/arm/mach-omap2/board-apollon.c b/arch/arm/mach-omap2/board-apollon.c index 75c731c45b2..ac773829941 100644 --- a/arch/arm/mach-omap2/board-apollon.c +++ b/arch/arm/mach-omap2/board-apollon.c | |||
@@ -354,6 +354,7 @@ MACHINE_START(OMAP_APOLLON, "OMAP24xx Apollon") | |||
354 | .map_io = omap242x_map_io, | 354 | .map_io = omap242x_map_io, |
355 | .init_early = omap2420_init_early, | 355 | .init_early = omap2420_init_early, |
356 | .init_irq = omap2_init_irq, | 356 | .init_irq = omap2_init_irq, |
357 | .handle_irq = omap2_intc_handle_irq, | ||
357 | .init_machine = omap_apollon_init, | 358 | .init_machine = omap_apollon_init, |
358 | .timer = &omap2_timer, | 359 | .timer = &omap2_timer, |
359 | .restart = omap_prcm_restart, | 360 | .restart = omap_prcm_restart, |
diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-omap2/board-cm-t35.c index c3402cdf0ba..1545102d1f9 100644 --- a/arch/arm/mach-omap2/board-cm-t35.c +++ b/arch/arm/mach-omap2/board-cm-t35.c | |||
@@ -634,6 +634,7 @@ MACHINE_START(CM_T35, "Compulab CM-T35") | |||
634 | .map_io = omap3_map_io, | 634 | .map_io = omap3_map_io, |
635 | .init_early = omap35xx_init_early, | 635 | .init_early = omap35xx_init_early, |
636 | .init_irq = omap3_init_irq, | 636 | .init_irq = omap3_init_irq, |
637 | .handle_irq = omap3_intc_handle_irq, | ||
637 | .init_machine = cm_t35_init, | 638 | .init_machine = cm_t35_init, |
638 | .timer = &omap3_timer, | 639 | .timer = &omap3_timer, |
639 | .restart = omap_prcm_restart, | 640 | .restart = omap_prcm_restart, |
@@ -645,6 +646,7 @@ MACHINE_START(CM_T3730, "Compulab CM-T3730") | |||
645 | .map_io = omap3_map_io, | 646 | .map_io = omap3_map_io, |
646 | .init_early = omap3630_init_early, | 647 | .init_early = omap3630_init_early, |
647 | .init_irq = omap3_init_irq, | 648 | .init_irq = omap3_init_irq, |
649 | .handle_irq = omap3_intc_handle_irq, | ||
648 | .init_machine = cm_t3730_init, | 650 | .init_machine = cm_t3730_init, |
649 | .timer = &omap3_timer, | 651 | .timer = &omap3_timer, |
650 | .restart = omap_prcm_restart, | 652 | .restart = omap_prcm_restart, |
diff --git a/arch/arm/mach-omap2/board-cm-t3517.c b/arch/arm/mach-omap2/board-cm-t3517.c index 0b06ac3d440..f36d694d215 100644 --- a/arch/arm/mach-omap2/board-cm-t3517.c +++ b/arch/arm/mach-omap2/board-cm-t3517.c | |||
@@ -299,6 +299,7 @@ MACHINE_START(CM_T3517, "Compulab CM-T3517") | |||
299 | .map_io = omap3_map_io, | 299 | .map_io = omap3_map_io, |
300 | .init_early = am35xx_init_early, | 300 | .init_early = am35xx_init_early, |
301 | .init_irq = omap3_init_irq, | 301 | .init_irq = omap3_init_irq, |
302 | .handle_irq = omap3_intc_handle_irq, | ||
302 | .init_machine = cm_t3517_init, | 303 | .init_machine = cm_t3517_init, |
303 | .timer = &omap3_timer, | 304 | .timer = &omap3_timer, |
304 | .restart = omap_prcm_restart, | 305 | .restart = omap_prcm_restart, |
diff --git a/arch/arm/mach-omap2/board-devkit8000.c b/arch/arm/mach-omap2/board-devkit8000.c index 519e5f9d491..e873063f4fd 100644 --- a/arch/arm/mach-omap2/board-devkit8000.c +++ b/arch/arm/mach-omap2/board-devkit8000.c | |||
@@ -660,6 +660,7 @@ MACHINE_START(DEVKIT8000, "OMAP3 Devkit8000") | |||
660 | .map_io = omap3_map_io, | 660 | .map_io = omap3_map_io, |
661 | .init_early = omap35xx_init_early, | 661 | .init_early = omap35xx_init_early, |
662 | .init_irq = omap3_init_irq, | 662 | .init_irq = omap3_init_irq, |
663 | .handle_irq = omap3_intc_handle_irq, | ||
663 | .init_machine = devkit8000_init, | 664 | .init_machine = devkit8000_init, |
664 | .timer = &omap3_secure_timer, | 665 | .timer = &omap3_secure_timer, |
665 | .restart = omap_prcm_restart, | 666 | .restart = omap_prcm_restart, |
diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index f462d8c65bc..f8c5b2cc7c9 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c | |||
@@ -122,6 +122,7 @@ DT_MACHINE_START(OMAP243X_DT, "Generic OMAP2430 (Flattened Device Tree)") | |||
122 | .map_io = omap243x_map_io, | 122 | .map_io = omap243x_map_io, |
123 | .init_early = omap2430_init_early, | 123 | .init_early = omap2430_init_early, |
124 | .init_irq = omap2_init_irq, | 124 | .init_irq = omap2_init_irq, |
125 | .handle_irq = omap2_intc_handle_irq, | ||
125 | .init_machine = omap_generic_init, | 126 | .init_machine = omap_generic_init, |
126 | .timer = &omap2_timer, | 127 | .timer = &omap2_timer, |
127 | .dt_compat = omap243x_boards_compat, | 128 | .dt_compat = omap243x_boards_compat, |
diff --git a/arch/arm/mach-omap2/board-h4.c b/arch/arm/mach-omap2/board-h4.c index 34ccde484fa..54af800d143 100644 --- a/arch/arm/mach-omap2/board-h4.c +++ b/arch/arm/mach-omap2/board-h4.c | |||
@@ -396,6 +396,7 @@ MACHINE_START(OMAP_H4, "OMAP2420 H4 board") | |||
396 | .map_io = omap242x_map_io, | 396 | .map_io = omap242x_map_io, |
397 | .init_early = omap2420_init_early, | 397 | .init_early = omap2420_init_early, |
398 | .init_irq = omap2_init_irq, | 398 | .init_irq = omap2_init_irq, |
399 | .handle_irq = omap2_intc_handle_irq, | ||
399 | .init_machine = omap_h4_init, | 400 | .init_machine = omap_h4_init, |
400 | .timer = &omap2_timer, | 401 | .timer = &omap2_timer, |
401 | .restart = omap_prcm_restart, | 402 | .restart = omap_prcm_restart, |
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c index e1850d55561..a59ace0ed56 100644 --- a/arch/arm/mach-omap2/board-igep0020.c +++ b/arch/arm/mach-omap2/board-igep0020.c | |||
@@ -672,6 +672,7 @@ MACHINE_START(IGEP0020, "IGEP v2 board") | |||
672 | .map_io = omap3_map_io, | 672 | .map_io = omap3_map_io, |
673 | .init_early = omap35xx_init_early, | 673 | .init_early = omap35xx_init_early, |
674 | .init_irq = omap3_init_irq, | 674 | .init_irq = omap3_init_irq, |
675 | .handle_irq = omap3_intc_handle_irq, | ||
675 | .init_machine = igep_init, | 676 | .init_machine = igep_init, |
676 | .timer = &omap3_timer, | 677 | .timer = &omap3_timer, |
677 | .restart = omap_prcm_restart, | 678 | .restart = omap_prcm_restart, |
@@ -683,6 +684,7 @@ MACHINE_START(IGEP0030, "IGEP OMAP3 module") | |||
683 | .map_io = omap3_map_io, | 684 | .map_io = omap3_map_io, |
684 | .init_early = omap35xx_init_early, | 685 | .init_early = omap35xx_init_early, |
685 | .init_irq = omap3_init_irq, | 686 | .init_irq = omap3_init_irq, |
687 | .handle_irq = omap3_intc_handle_irq, | ||
686 | .init_machine = igep_init, | 688 | .init_machine = igep_init, |
687 | .timer = &omap3_timer, | 689 | .timer = &omap3_timer, |
688 | .restart = omap_prcm_restart, | 690 | .restart = omap_prcm_restart, |
diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c index 84bbdd6e5af..2d2a61f7dcb 100644 --- a/arch/arm/mach-omap2/board-ldp.c +++ b/arch/arm/mach-omap2/board-ldp.c | |||
@@ -434,6 +434,7 @@ MACHINE_START(OMAP_LDP, "OMAP LDP board") | |||
434 | .map_io = omap3_map_io, | 434 | .map_io = omap3_map_io, |
435 | .init_early = omap3430_init_early, | 435 | .init_early = omap3430_init_early, |
436 | .init_irq = omap3_init_irq, | 436 | .init_irq = omap3_init_irq, |
437 | .handle_irq = omap3_intc_handle_irq, | ||
437 | .init_machine = omap_ldp_init, | 438 | .init_machine = omap_ldp_init, |
438 | .timer = &omap3_timer, | 439 | .timer = &omap3_timer, |
439 | .restart = omap_prcm_restart, | 440 | .restart = omap_prcm_restart, |
diff --git a/arch/arm/mach-omap2/board-n8x0.c b/arch/arm/mach-omap2/board-n8x0.c index cc1dd541224..cef2cf1c0b8 100644 --- a/arch/arm/mach-omap2/board-n8x0.c +++ b/arch/arm/mach-omap2/board-n8x0.c | |||
@@ -689,6 +689,7 @@ MACHINE_START(NOKIA_N800, "Nokia N800") | |||
689 | .map_io = omap242x_map_io, | 689 | .map_io = omap242x_map_io, |
690 | .init_early = omap2420_init_early, | 690 | .init_early = omap2420_init_early, |
691 | .init_irq = omap2_init_irq, | 691 | .init_irq = omap2_init_irq, |
692 | .handle_irq = omap2_intc_handle_irq, | ||
692 | .init_machine = n8x0_init_machine, | 693 | .init_machine = n8x0_init_machine, |
693 | .timer = &omap2_timer, | 694 | .timer = &omap2_timer, |
694 | .restart = omap_prcm_restart, | 695 | .restart = omap_prcm_restart, |
@@ -700,6 +701,7 @@ MACHINE_START(NOKIA_N810, "Nokia N810") | |||
700 | .map_io = omap242x_map_io, | 701 | .map_io = omap242x_map_io, |
701 | .init_early = omap2420_init_early, | 702 | .init_early = omap2420_init_early, |
702 | .init_irq = omap2_init_irq, | 703 | .init_irq = omap2_init_irq, |
704 | .handle_irq = omap2_intc_handle_irq, | ||
703 | .init_machine = n8x0_init_machine, | 705 | .init_machine = n8x0_init_machine, |
704 | .timer = &omap2_timer, | 706 | .timer = &omap2_timer, |
705 | .restart = omap_prcm_restart, | 707 | .restart = omap_prcm_restart, |
@@ -711,6 +713,7 @@ MACHINE_START(NOKIA_N810_WIMAX, "Nokia N810 WiMAX") | |||
711 | .map_io = omap242x_map_io, | 713 | .map_io = omap242x_map_io, |
712 | .init_early = omap2420_init_early, | 714 | .init_early = omap2420_init_early, |
713 | .init_irq = omap2_init_irq, | 715 | .init_irq = omap2_init_irq, |
716 | .handle_irq = omap2_intc_handle_irq, | ||
714 | .init_machine = n8x0_init_machine, | 717 | .init_machine = n8x0_init_machine, |
715 | .timer = &omap2_timer, | 718 | .timer = &omap2_timer, |
716 | .restart = omap_prcm_restart, | 719 | .restart = omap_prcm_restart, |
diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c index bb6031f6dcb..7ffcd2839e7 100644 --- a/arch/arm/mach-omap2/board-omap3beagle.c +++ b/arch/arm/mach-omap2/board-omap3beagle.c | |||
@@ -559,6 +559,7 @@ MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board") | |||
559 | .map_io = omap3_map_io, | 559 | .map_io = omap3_map_io, |
560 | .init_early = omap3_init_early, | 560 | .init_early = omap3_init_early, |
561 | .init_irq = omap3_init_irq, | 561 | .init_irq = omap3_init_irq, |
562 | .handle_irq = omap3_intc_handle_irq, | ||
562 | .init_machine = omap3_beagle_init, | 563 | .init_machine = omap3_beagle_init, |
563 | .timer = &omap3_secure_timer, | 564 | .timer = &omap3_secure_timer, |
564 | .restart = omap_prcm_restart, | 565 | .restart = omap_prcm_restart, |
diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c index 60912e47325..003fe34c934 100644 --- a/arch/arm/mach-omap2/board-omap3evm.c +++ b/arch/arm/mach-omap2/board-omap3evm.c | |||
@@ -681,6 +681,7 @@ MACHINE_START(OMAP3EVM, "OMAP3 EVM") | |||
681 | .map_io = omap3_map_io, | 681 | .map_io = omap3_map_io, |
682 | .init_early = omap35xx_init_early, | 682 | .init_early = omap35xx_init_early, |
683 | .init_irq = omap3_init_irq, | 683 | .init_irq = omap3_init_irq, |
684 | .handle_irq = omap3_intc_handle_irq, | ||
684 | .init_machine = omap3_evm_init, | 685 | .init_machine = omap3_evm_init, |
685 | .timer = &omap3_timer, | 686 | .timer = &omap3_timer, |
686 | .restart = omap_prcm_restart, | 687 | .restart = omap_prcm_restart, |
diff --git a/arch/arm/mach-omap2/board-omap3logic.c b/arch/arm/mach-omap2/board-omap3logic.c index 7ecf04a3ff1..4198dd017d8 100644 --- a/arch/arm/mach-omap2/board-omap3logic.c +++ b/arch/arm/mach-omap2/board-omap3logic.c | |||
@@ -208,6 +208,7 @@ MACHINE_START(OMAP3_TORPEDO, "Logic OMAP3 Torpedo board") | |||
208 | .map_io = omap3_map_io, | 208 | .map_io = omap3_map_io, |
209 | .init_early = omap35xx_init_early, | 209 | .init_early = omap35xx_init_early, |
210 | .init_irq = omap3_init_irq, | 210 | .init_irq = omap3_init_irq, |
211 | .handle_irq = omap3_intc_handle_irq, | ||
211 | .init_machine = omap3logic_init, | 212 | .init_machine = omap3logic_init, |
212 | .timer = &omap3_timer, | 213 | .timer = &omap3_timer, |
213 | .restart = omap_prcm_restart, | 214 | .restart = omap_prcm_restart, |
@@ -218,6 +219,7 @@ MACHINE_START(OMAP3530_LV_SOM, "OMAP Logic 3530 LV SOM board") | |||
218 | .map_io = omap3_map_io, | 219 | .map_io = omap3_map_io, |
219 | .init_early = omap35xx_init_early, | 220 | .init_early = omap35xx_init_early, |
220 | .init_irq = omap3_init_irq, | 221 | .init_irq = omap3_init_irq, |
222 | .handle_irq = omap3_intc_handle_irq, | ||
221 | .init_machine = omap3logic_init, | 223 | .init_machine = omap3logic_init, |
222 | .timer = &omap3_timer, | 224 | .timer = &omap3_timer, |
223 | .restart = omap_prcm_restart, | 225 | .restart = omap_prcm_restart, |
diff --git a/arch/arm/mach-omap2/board-omap3pandora.c b/arch/arm/mach-omap2/board-omap3pandora.c index 7071a2473a6..1644b73017f 100644 --- a/arch/arm/mach-omap2/board-omap3pandora.c +++ b/arch/arm/mach-omap2/board-omap3pandora.c | |||
@@ -606,6 +606,7 @@ MACHINE_START(OMAP3_PANDORA, "Pandora Handheld Console") | |||
606 | .map_io = omap3_map_io, | 606 | .map_io = omap3_map_io, |
607 | .init_early = omap35xx_init_early, | 607 | .init_early = omap35xx_init_early, |
608 | .init_irq = omap3_init_irq, | 608 | .init_irq = omap3_init_irq, |
609 | .handle_irq = omap3_intc_handle_irq, | ||
609 | .init_machine = omap3pandora_init, | 610 | .init_machine = omap3pandora_init, |
610 | .timer = &omap3_timer, | 611 | .timer = &omap3_timer, |
611 | .restart = omap_prcm_restart, | 612 | .restart = omap_prcm_restart, |
diff --git a/arch/arm/mach-omap2/board-omap3stalker.c b/arch/arm/mach-omap2/board-omap3stalker.c index 6e47987d989..cb089a46f62 100644 --- a/arch/arm/mach-omap2/board-omap3stalker.c +++ b/arch/arm/mach-omap2/board-omap3stalker.c | |||
@@ -454,6 +454,7 @@ MACHINE_START(SBC3530, "OMAP3 STALKER") | |||
454 | .map_io = omap3_map_io, | 454 | .map_io = omap3_map_io, |
455 | .init_early = omap35xx_init_early, | 455 | .init_early = omap35xx_init_early, |
456 | .init_irq = omap3_init_irq, | 456 | .init_irq = omap3_init_irq, |
457 | .handle_irq = omap3_intc_handle_irq, | ||
457 | .init_machine = omap3_stalker_init, | 458 | .init_machine = omap3_stalker_init, |
458 | .timer = &omap3_secure_timer, | 459 | .timer = &omap3_secure_timer, |
459 | .restart = omap_prcm_restart, | 460 | .restart = omap_prcm_restart, |
diff --git a/arch/arm/mach-omap2/board-omap3touchbook.c b/arch/arm/mach-omap2/board-omap3touchbook.c index 5bb590a40f2..a0b851aafcc 100644 --- a/arch/arm/mach-omap2/board-omap3touchbook.c +++ b/arch/arm/mach-omap2/board-omap3touchbook.c | |||
@@ -381,6 +381,7 @@ MACHINE_START(TOUCHBOOK, "OMAP3 touchbook Board") | |||
381 | .map_io = omap3_map_io, | 381 | .map_io = omap3_map_io, |
382 | .init_early = omap3430_init_early, | 382 | .init_early = omap3430_init_early, |
383 | .init_irq = omap3_init_irq, | 383 | .init_irq = omap3_init_irq, |
384 | .handle_irq = omap3_intc_handle_irq, | ||
384 | .init_machine = omap3_touchbook_init, | 385 | .init_machine = omap3_touchbook_init, |
385 | .timer = &omap3_secure_timer, | 386 | .timer = &omap3_secure_timer, |
386 | .restart = omap_prcm_restart, | 387 | .restart = omap_prcm_restart, |
diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c index 955cbee91b4..8b06c6a60d0 100644 --- a/arch/arm/mach-omap2/board-omap4panda.c +++ b/arch/arm/mach-omap2/board-omap4panda.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/wl12xx.h> | 30 | #include <linux/wl12xx.h> |
31 | 31 | ||
32 | #include <mach/hardware.h> | 32 | #include <mach/hardware.h> |
33 | #include <asm/hardware/gic.h> | ||
33 | #include <asm/mach-types.h> | 34 | #include <asm/mach-types.h> |
34 | #include <asm/mach/arch.h> | 35 | #include <asm/mach/arch.h> |
35 | #include <asm/mach/map.h> | 36 | #include <asm/mach/map.h> |
@@ -576,6 +577,7 @@ MACHINE_START(OMAP4_PANDA, "OMAP4 Panda board") | |||
576 | .map_io = omap4_map_io, | 577 | .map_io = omap4_map_io, |
577 | .init_early = omap4430_init_early, | 578 | .init_early = omap4430_init_early, |
578 | .init_irq = gic_init_irq, | 579 | .init_irq = gic_init_irq, |
580 | .handle_irq = gic_handle_irq, | ||
579 | .init_machine = omap4_panda_init, | 581 | .init_machine = omap4_panda_init, |
580 | .timer = &omap4_timer, | 582 | .timer = &omap4_timer, |
581 | .restart = omap_prcm_restart, | 583 | .restart = omap_prcm_restart, |
diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c index c14d7812999..52c0cef7716 100644 --- a/arch/arm/mach-omap2/board-overo.c +++ b/arch/arm/mach-omap2/board-overo.c | |||
@@ -562,6 +562,7 @@ MACHINE_START(OVERO, "Gumstix Overo") | |||
562 | .map_io = omap3_map_io, | 562 | .map_io = omap3_map_io, |
563 | .init_early = omap35xx_init_early, | 563 | .init_early = omap35xx_init_early, |
564 | .init_irq = omap3_init_irq, | 564 | .init_irq = omap3_init_irq, |
565 | .handle_irq = omap3_intc_handle_irq, | ||
565 | .init_machine = overo_init, | 566 | .init_machine = overo_init, |
566 | .timer = &omap3_timer, | 567 | .timer = &omap3_timer, |
567 | .restart = omap_prcm_restart, | 568 | .restart = omap_prcm_restart, |
diff --git a/arch/arm/mach-omap2/board-rm680.c b/arch/arm/mach-omap2/board-rm680.c index 0c67ecc244d..8678b386c6a 100644 --- a/arch/arm/mach-omap2/board-rm680.c +++ b/arch/arm/mach-omap2/board-rm680.c | |||
@@ -149,6 +149,7 @@ MACHINE_START(NOKIA_RM680, "Nokia RM-680 board") | |||
149 | .map_io = omap3_map_io, | 149 | .map_io = omap3_map_io, |
150 | .init_early = omap3630_init_early, | 150 | .init_early = omap3630_init_early, |
151 | .init_irq = omap3_init_irq, | 151 | .init_irq = omap3_init_irq, |
152 | .handle_irq = omap3_intc_handle_irq, | ||
152 | .init_machine = rm680_init, | 153 | .init_machine = rm680_init, |
153 | .timer = &omap3_timer, | 154 | .timer = &omap3_timer, |
154 | .restart = omap_prcm_restart, | 155 | .restart = omap_prcm_restart, |
diff --git a/arch/arm/mach-omap2/board-rx51.c b/arch/arm/mach-omap2/board-rx51.c index c3e716ad2b5..27f01f051df 100644 --- a/arch/arm/mach-omap2/board-rx51.c +++ b/arch/arm/mach-omap2/board-rx51.c | |||
@@ -127,6 +127,7 @@ MACHINE_START(NOKIA_RX51, "Nokia RX-51 board") | |||
127 | .map_io = omap3_map_io, | 127 | .map_io = omap3_map_io, |
128 | .init_early = omap3430_init_early, | 128 | .init_early = omap3430_init_early, |
129 | .init_irq = omap3_init_irq, | 129 | .init_irq = omap3_init_irq, |
130 | .handle_irq = omap3_intc_handle_irq, | ||
130 | .init_machine = rx51_init, | 131 | .init_machine = rx51_init, |
131 | .timer = &omap3_timer, | 132 | .timer = &omap3_timer, |
132 | .restart = omap_prcm_restart, | 133 | .restart = omap_prcm_restart, |
diff --git a/arch/arm/mach-omap2/board-zoom.c b/arch/arm/mach-omap2/board-zoom.c index 68d6f1c875b..5c20bcc57f2 100644 --- a/arch/arm/mach-omap2/board-zoom.c +++ b/arch/arm/mach-omap2/board-zoom.c | |||
@@ -135,6 +135,7 @@ MACHINE_START(OMAP_ZOOM2, "OMAP Zoom2 board") | |||
135 | .map_io = omap3_map_io, | 135 | .map_io = omap3_map_io, |
136 | .init_early = omap3430_init_early, | 136 | .init_early = omap3430_init_early, |
137 | .init_irq = omap3_init_irq, | 137 | .init_irq = omap3_init_irq, |
138 | .handle_irq = omap3_intc_handle_irq, | ||
138 | .init_machine = omap_zoom_init, | 139 | .init_machine = omap_zoom_init, |
139 | .timer = &omap3_timer, | 140 | .timer = &omap3_timer, |
140 | .restart = omap_prcm_restart, | 141 | .restart = omap_prcm_restart, |
@@ -146,6 +147,7 @@ MACHINE_START(OMAP_ZOOM3, "OMAP Zoom3 board") | |||
146 | .map_io = omap3_map_io, | 147 | .map_io = omap3_map_io, |
147 | .init_early = omap3630_init_early, | 148 | .init_early = omap3630_init_early, |
148 | .init_irq = omap3_init_irq, | 149 | .init_irq = omap3_init_irq, |
150 | .handle_irq = omap3_intc_handle_irq, | ||
149 | .init_machine = omap_zoom_init, | 151 | .init_machine = omap_zoom_init, |
150 | .timer = &omap3_timer, | 152 | .timer = &omap3_timer, |
151 | .restart = omap_prcm_restart, | 153 | .restart = omap_prcm_restart, |
diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h index 1df1b396fc3..cda888a2e63 100644 --- a/arch/arm/mach-omap2/common.h +++ b/arch/arm/mach-omap2/common.h | |||
@@ -154,6 +154,8 @@ void omap_intc_restore_context(void); | |||
154 | void omap3_intc_suspend(void); | 154 | void omap3_intc_suspend(void); |
155 | void omap3_intc_prepare_idle(void); | 155 | void omap3_intc_prepare_idle(void); |
156 | void omap3_intc_resume_idle(void); | 156 | void omap3_intc_resume_idle(void); |
157 | void omap2_intc_handle_irq(struct pt_regs *regs); | ||
158 | void omap3_intc_handle_irq(struct pt_regs *regs); | ||
157 | 159 | ||
158 | /* | 160 | /* |
159 | * wfi used in low power code. Directly opcode is used instead | 161 | * wfi used in low power code. Directly opcode is used instead |
@@ -170,8 +172,6 @@ void omap3_intc_resume_idle(void); | |||
170 | extern void __iomem *l2cache_base; | 172 | extern void __iomem *l2cache_base; |
171 | #endif | 173 | #endif |
172 | 174 | ||
173 | extern void __iomem *gic_dist_base_addr; | ||
174 | |||
175 | extern void __init gic_init_irq(void); | 175 | extern void __init gic_init_irq(void); |
176 | extern void omap_smc1(u32 fn, u32 arg); | 176 | extern void omap_smc1(u32 fn, u32 arg); |
177 | 177 | ||
diff --git a/arch/arm/mach-omap2/cpuidle34xx.c b/arch/arm/mach-omap2/cpuidle34xx.c index 942bb4f19f9..e20332f4abd 100644 --- a/arch/arm/mach-omap2/cpuidle34xx.c +++ b/arch/arm/mach-omap2/cpuidle34xx.c | |||
@@ -34,6 +34,7 @@ | |||
34 | 34 | ||
35 | #include "pm.h" | 35 | #include "pm.h" |
36 | #include "control.h" | 36 | #include "control.h" |
37 | #include "common.h" | ||
37 | 38 | ||
38 | #ifdef CONFIG_CPU_IDLE | 39 | #ifdef CONFIG_CPU_IDLE |
39 | 40 | ||
diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c index dce9905d64b..bc6cf863a56 100644 --- a/arch/arm/mach-omap2/display.c +++ b/arch/arm/mach-omap2/display.c | |||
@@ -22,12 +22,13 @@ | |||
22 | #include <linux/io.h> | 22 | #include <linux/io.h> |
23 | #include <linux/clk.h> | 23 | #include <linux/clk.h> |
24 | #include <linux/err.h> | 24 | #include <linux/err.h> |
25 | #include <linux/delay.h> | ||
25 | 26 | ||
26 | #include <video/omapdss.h> | 27 | #include <video/omapdss.h> |
27 | #include <plat/omap_hwmod.h> | 28 | #include <plat/omap_hwmod.h> |
28 | #include <plat/omap_device.h> | 29 | #include <plat/omap_device.h> |
29 | #include <plat/omap-pm.h> | 30 | #include <plat/omap-pm.h> |
30 | #include <plat/common.h> | 31 | #include "common.h" |
31 | 32 | ||
32 | #include "control.h" | 33 | #include "control.h" |
33 | #include "display.h" | 34 | #include "display.h" |
diff --git a/arch/arm/mach-omap2/include/mach/entry-macro.S b/arch/arm/mach-omap2/include/mach/entry-macro.S index feb90a10945..56964a0c4c7 100644 --- a/arch/arm/mach-omap2/include/mach/entry-macro.S +++ b/arch/arm/mach-omap2/include/mach/entry-macro.S | |||
@@ -10,146 +10,9 @@ | |||
10 | * License version 2. This program is licensed "as is" without any | 10 | * License version 2. This program is licensed "as is" without any |
11 | * warranty of any kind, whether express or implied. | 11 | * warranty of any kind, whether express or implied. |
12 | */ | 12 | */ |
13 | #include <mach/hardware.h> | ||
14 | #include <mach/io.h> | ||
15 | #include <mach/irqs.h> | ||
16 | #include <asm/hardware/gic.h> | ||
17 | |||
18 | #include <plat/omap24xx.h> | ||
19 | #include <plat/omap34xx.h> | ||
20 | #include <plat/omap44xx.h> | ||
21 | |||
22 | #include <plat/multi.h> | ||
23 | |||
24 | #define OMAP2_IRQ_BASE OMAP2_L4_IO_ADDRESS(OMAP24XX_IC_BASE) | ||
25 | #define OMAP3_IRQ_BASE OMAP2_L4_IO_ADDRESS(OMAP34XX_IC_BASE) | ||
26 | #define OMAP4_IRQ_BASE OMAP2_L4_IO_ADDRESS(OMAP44XX_GIC_CPU_BASE) | ||
27 | #define INTCPS_SIR_IRQ_OFFSET 0x0040 /* omap2/3 active interrupt offset */ | ||
28 | #define ACTIVEIRQ_MASK 0x7f /* omap2/3 active interrupt bits */ | ||
29 | 13 | ||
30 | .macro disable_fiq | 14 | .macro disable_fiq |
31 | .endm | 15 | .endm |
32 | 16 | ||
33 | .macro arch_ret_to_user, tmp1, tmp2 | 17 | .macro arch_ret_to_user, tmp1, tmp2 |
34 | .endm | 18 | .endm |
35 | |||
36 | /* | ||
37 | * Unoptimized irq functions for multi-omap2, 3 and 4 | ||
38 | */ | ||
39 | |||
40 | #ifdef MULTI_OMAP2 | ||
41 | /* | ||
42 | * Configure the interrupt base on the first interrupt. | ||
43 | * See also omap_irq_base_init for setting omap_irq_base. | ||
44 | */ | ||
45 | .macro get_irqnr_preamble, base, tmp | ||
46 | ldr \base, =omap_irq_base @ irq base address | ||
47 | ldr \base, [\base, #0] @ irq base value | ||
48 | .endm | ||
49 | |||
50 | /* Check the pending interrupts. Note that base already set */ | ||
51 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
52 | tst \base, #0x100 @ gic address? | ||
53 | bne 4401f @ found gic | ||
54 | |||
55 | /* Handle omap2 and omap3 */ | ||
56 | ldr \irqnr, [\base, #0x98] /* IRQ pending reg 1 */ | ||
57 | cmp \irqnr, #0x0 | ||
58 | bne 9998f | ||
59 | ldr \irqnr, [\base, #0xb8] /* IRQ pending reg 2 */ | ||
60 | cmp \irqnr, #0x0 | ||
61 | bne 9998f | ||
62 | ldr \irqnr, [\base, #0xd8] /* IRQ pending reg 3 */ | ||
63 | cmp \irqnr, #0x0 | ||
64 | bne 9998f | ||
65 | |||
66 | /* | ||
67 | * ti816x has additional IRQ pending register. Checking this | ||
68 | * register on omap2 & omap3 has no effect (read as 0). | ||
69 | */ | ||
70 | ldr \irqnr, [\base, #0xf8] /* IRQ pending reg 4 */ | ||
71 | cmp \irqnr, #0x0 | ||
72 | 9998: | ||
73 | ldrne \irqnr, [\base, #INTCPS_SIR_IRQ_OFFSET] | ||
74 | and \irqnr, \irqnr, #ACTIVEIRQ_MASK /* Clear spurious bits */ | ||
75 | b 9999f | ||
76 | |||
77 | /* Handle omap4 */ | ||
78 | 4401: ldr \irqstat, [\base, #GIC_CPU_INTACK] | ||
79 | ldr \tmp, =1021 | ||
80 | bic \irqnr, \irqstat, #0x1c00 | ||
81 | cmp \irqnr, #15 | ||
82 | cmpcc \irqnr, \irqnr | ||
83 | cmpne \irqnr, \tmp | ||
84 | cmpcs \irqnr, \irqnr | ||
85 | 9999: | ||
86 | .endm | ||
87 | |||
88 | #ifdef CONFIG_SMP | ||
89 | /* We assume that irqstat (the raw value of the IRQ acknowledge | ||
90 | * register) is preserved from the macro above. | ||
91 | * If there is an IPI, we immediately signal end of interrupt | ||
92 | * on the controller, since this requires the original irqstat | ||
93 | * value which we won't easily be able to recreate later. | ||
94 | */ | ||
95 | |||
96 | .macro test_for_ipi, irqnr, irqstat, base, tmp | ||
97 | bic \irqnr, \irqstat, #0x1c00 | ||
98 | cmp \irqnr, #16 | ||
99 | it cc | ||
100 | strcc \irqstat, [\base, #GIC_CPU_EOI] | ||
101 | it cs | ||
102 | cmpcs \irqnr, \irqnr | ||
103 | .endm | ||
104 | #endif /* CONFIG_SMP */ | ||
105 | |||
106 | #else /* MULTI_OMAP2 */ | ||
107 | |||
108 | |||
109 | /* | ||
110 | * Optimized irq functions for omap2, 3 and 4 | ||
111 | */ | ||
112 | |||
113 | #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) | ||
114 | .macro get_irqnr_preamble, base, tmp | ||
115 | #ifdef CONFIG_ARCH_OMAP2 | ||
116 | ldr \base, =OMAP2_IRQ_BASE | ||
117 | #else | ||
118 | ldr \base, =OMAP3_IRQ_BASE | ||
119 | #endif | ||
120 | .endm | ||
121 | |||
122 | /* Check the pending interrupts. Note that base already set */ | ||
123 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
124 | ldr \irqnr, [\base, #0x98] /* IRQ pending reg 1 */ | ||
125 | cmp \irqnr, #0x0 | ||
126 | bne 9999f | ||
127 | ldr \irqnr, [\base, #0xb8] /* IRQ pending reg 2 */ | ||
128 | cmp \irqnr, #0x0 | ||
129 | bne 9999f | ||
130 | ldr \irqnr, [\base, #0xd8] /* IRQ pending reg 3 */ | ||
131 | cmp \irqnr, #0x0 | ||
132 | #ifdef CONFIG_SOC_OMAPTI816X | ||
133 | bne 9999f | ||
134 | ldr \irqnr, [\base, #0xf8] /* IRQ pending reg 4 */ | ||
135 | cmp \irqnr, #0x0 | ||
136 | #endif | ||
137 | 9999: | ||
138 | ldrne \irqnr, [\base, #INTCPS_SIR_IRQ_OFFSET] | ||
139 | and \irqnr, \irqnr, #ACTIVEIRQ_MASK /* Clear spurious bits */ | ||
140 | |||
141 | .endm | ||
142 | #endif | ||
143 | |||
144 | |||
145 | #ifdef CONFIG_ARCH_OMAP4 | ||
146 | #define HAVE_GET_IRQNR_PREAMBLE | ||
147 | #include <asm/hardware/entry-macro-gic.S> | ||
148 | |||
149 | .macro get_irqnr_preamble, base, tmp | ||
150 | ldr \base, =OMAP4_IRQ_BASE | ||
151 | .endm | ||
152 | |||
153 | #endif | ||
154 | |||
155 | #endif /* MULTI_OMAP2 */ | ||
diff --git a/arch/arm/mach-omap2/include/mach/vmalloc.h b/arch/arm/mach-omap2/include/mach/vmalloc.h deleted file mode 100644 index 86631994776..00000000000 --- a/arch/arm/mach-omap2/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/plat-omap/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 2000 Russell King. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | */ | ||
20 | #define VMALLOC_END 0xf8000000UL | ||
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 33f090ce022..3f565dd2ea8 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
@@ -316,13 +316,9 @@ static int _set_hwmod_postsetup_state(struct omap_hwmod *oh, void *data) | |||
316 | return omap_hwmod_set_postsetup_state(oh, *(u8 *)data); | 316 | return omap_hwmod_set_postsetup_state(oh, *(u8 *)data); |
317 | } | 317 | } |
318 | 318 | ||
319 | /* See irq.c, omap4-common.c and entry-macro.S */ | ||
320 | void __iomem *omap_irq_base; | ||
321 | |||
322 | static void __init omap_common_init_early(void) | 319 | static void __init omap_common_init_early(void) |
323 | { | 320 | { |
324 | omap2_check_revision(); | 321 | omap2_check_revision(); |
325 | omap_ioremap_init(); | ||
326 | omap_init_consistent_dma_size(); | 322 | omap_init_consistent_dma_size(); |
327 | } | 323 | } |
328 | 324 | ||
diff --git a/arch/arm/mach-omap2/irq.c b/arch/arm/mach-omap2/irq.c index 65f1be6a182..42b1d659191 100644 --- a/arch/arm/mach-omap2/irq.c +++ b/arch/arm/mach-omap2/irq.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/interrupt.h> | 15 | #include <linux/interrupt.h> |
16 | #include <linux/io.h> | 16 | #include <linux/io.h> |
17 | #include <mach/hardware.h> | 17 | #include <mach/hardware.h> |
18 | #include <asm/exception.h> | ||
18 | #include <asm/mach/irq.h> | 19 | #include <asm/mach/irq.h> |
19 | 20 | ||
20 | 21 | ||
@@ -35,6 +36,11 @@ | |||
35 | /* Number of IRQ state bits in each MIR register */ | 36 | /* Number of IRQ state bits in each MIR register */ |
36 | #define IRQ_BITS_PER_REG 32 | 37 | #define IRQ_BITS_PER_REG 32 |
37 | 38 | ||
39 | #define OMAP2_IRQ_BASE OMAP2_L4_IO_ADDRESS(OMAP24XX_IC_BASE) | ||
40 | #define OMAP3_IRQ_BASE OMAP2_L4_IO_ADDRESS(OMAP34XX_IC_BASE) | ||
41 | #define INTCPS_SIR_IRQ_OFFSET 0x0040 /* omap2/3 active interrupt offset */ | ||
42 | #define ACTIVEIRQ_MASK 0x7f /* omap2/3 active interrupt bits */ | ||
43 | |||
38 | /* | 44 | /* |
39 | * OMAP2 has a number of different interrupt controllers, each interrupt | 45 | * OMAP2 has a number of different interrupt controllers, each interrupt |
40 | * controller is identified as its own "bank". Register definitions are | 46 | * controller is identified as its own "bank". Register definitions are |
@@ -143,6 +149,7 @@ omap_alloc_gc(void __iomem *base, unsigned int irq_start, unsigned int num) | |||
143 | 149 | ||
144 | static void __init omap_init_irq(u32 base, int nr_irqs) | 150 | static void __init omap_init_irq(u32 base, int nr_irqs) |
145 | { | 151 | { |
152 | void __iomem *omap_irq_base; | ||
146 | unsigned long nr_of_irqs = 0; | 153 | unsigned long nr_of_irqs = 0; |
147 | unsigned int nr_banks = 0; | 154 | unsigned int nr_banks = 0; |
148 | int i, j; | 155 | int i, j; |
@@ -191,6 +198,44 @@ void __init ti816x_init_irq(void) | |||
191 | omap_init_irq(OMAP34XX_IC_BASE, 128); | 198 | omap_init_irq(OMAP34XX_IC_BASE, 128); |
192 | } | 199 | } |
193 | 200 | ||
201 | static inline void omap_intc_handle_irq(void __iomem *base_addr, struct pt_regs *regs) | ||
202 | { | ||
203 | u32 irqnr; | ||
204 | |||
205 | do { | ||
206 | irqnr = readl_relaxed(base_addr + 0x98); | ||
207 | if (irqnr) | ||
208 | goto out; | ||
209 | |||
210 | irqnr = readl_relaxed(base_addr + 0xb8); | ||
211 | if (irqnr) | ||
212 | goto out; | ||
213 | |||
214 | irqnr = readl_relaxed(base_addr + 0xd8); | ||
215 | #ifdef CONFIG_SOC_OMAPTI816X | ||
216 | if (irqnr) | ||
217 | goto out; | ||
218 | irqnr = readl_relaxed(base_addr + 0xf8); | ||
219 | #endif | ||
220 | |||
221 | out: | ||
222 | if (!irqnr) | ||
223 | break; | ||
224 | |||
225 | irqnr = readl_relaxed(base_addr + INTCPS_SIR_IRQ_OFFSET); | ||
226 | irqnr &= ACTIVEIRQ_MASK; | ||
227 | |||
228 | if (irqnr) | ||
229 | handle_IRQ(irqnr, regs); | ||
230 | } while (irqnr); | ||
231 | } | ||
232 | |||
233 | asmlinkage void __exception_irq_entry omap2_intc_handle_irq(struct pt_regs *regs) | ||
234 | { | ||
235 | void __iomem *base_addr = OMAP2_IRQ_BASE; | ||
236 | omap_intc_handle_irq(base_addr, regs); | ||
237 | } | ||
238 | |||
194 | #ifdef CONFIG_ARCH_OMAP3 | 239 | #ifdef CONFIG_ARCH_OMAP3 |
195 | static struct omap3_intc_regs intc_context[ARRAY_SIZE(irq_banks)]; | 240 | static struct omap3_intc_regs intc_context[ARRAY_SIZE(irq_banks)]; |
196 | 241 | ||
@@ -263,4 +308,10 @@ void omap3_intc_resume_idle(void) | |||
263 | /* Re-enable autoidle */ | 308 | /* Re-enable autoidle */ |
264 | intc_bank_write_reg(1, &irq_banks[0], INTC_SYSCONFIG); | 309 | intc_bank_write_reg(1, &irq_banks[0], INTC_SYSCONFIG); |
265 | } | 310 | } |
311 | |||
312 | asmlinkage void __exception_irq_entry omap3_intc_handle_irq(struct pt_regs *regs) | ||
313 | { | ||
314 | void __iomem *base_addr = OMAP3_IRQ_BASE; | ||
315 | omap_intc_handle_irq(base_addr, regs); | ||
316 | } | ||
266 | #endif /* CONFIG_ARCH_OMAP3 */ | 317 | #endif /* CONFIG_ARCH_OMAP3 */ |
diff --git a/arch/arm/mach-omap2/omap4-common.c b/arch/arm/mach-omap2/omap4-common.c index f327d7472ca..beecfdd56ea 100644 --- a/arch/arm/mach-omap2/omap4-common.c +++ b/arch/arm/mach-omap2/omap4-common.c | |||
@@ -29,11 +29,11 @@ | |||
29 | void __iomem *l2cache_base; | 29 | void __iomem *l2cache_base; |
30 | #endif | 30 | #endif |
31 | 31 | ||
32 | void __iomem *gic_dist_base_addr; | ||
33 | |||
34 | |||
35 | void __init gic_init_irq(void) | 32 | void __init gic_init_irq(void) |
36 | { | 33 | { |
34 | void __iomem *omap_irq_base; | ||
35 | void __iomem *gic_dist_base_addr; | ||
36 | |||
37 | /* Static mapping, never released */ | 37 | /* Static mapping, never released */ |
38 | gic_dist_base_addr = ioremap(OMAP44XX_GIC_DIST_BASE, SZ_4K); | 38 | gic_dist_base_addr = ioremap(OMAP44XX_GIC_DIST_BASE, SZ_4K); |
39 | BUG_ON(!gic_dist_base_addr); | 39 | BUG_ON(!gic_dist_base_addr); |
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index 7f8915ad509..eef43e2e163 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | |||
@@ -3247,18 +3247,14 @@ static __initdata struct omap_hwmod *omap3xxx_hwmods[] = { | |||
3247 | 3247 | ||
3248 | /* 3430ES1-only hwmods */ | 3248 | /* 3430ES1-only hwmods */ |
3249 | static __initdata struct omap_hwmod *omap3430es1_hwmods[] = { | 3249 | static __initdata struct omap_hwmod *omap3430es1_hwmods[] = { |
3250 | &omap3xxx_iva_hwmod, | ||
3251 | &omap3430es1_dss_core_hwmod, | 3250 | &omap3430es1_dss_core_hwmod, |
3252 | &omap3xxx_mailbox_hwmod, | ||
3253 | NULL | 3251 | NULL |
3254 | }; | 3252 | }; |
3255 | 3253 | ||
3256 | /* 3430ES2+-only hwmods */ | 3254 | /* 3430ES2+-only hwmods */ |
3257 | static __initdata struct omap_hwmod *omap3430es2plus_hwmods[] = { | 3255 | static __initdata struct omap_hwmod *omap3430es2plus_hwmods[] = { |
3258 | &omap3xxx_iva_hwmod, | ||
3259 | &omap3xxx_dss_core_hwmod, | 3256 | &omap3xxx_dss_core_hwmod, |
3260 | &omap3xxx_usbhsotg_hwmod, | 3257 | &omap3xxx_usbhsotg_hwmod, |
3261 | &omap3xxx_mailbox_hwmod, | ||
3262 | NULL | 3258 | NULL |
3263 | }; | 3259 | }; |
3264 | 3260 | ||
diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c index 9edcd520510..6eeff0e0ae0 100644 --- a/arch/arm/mach-omap2/timer.c +++ b/arch/arm/mach-omap2/timer.c | |||
@@ -254,7 +254,6 @@ static struct omap_dm_timer clksrc; | |||
254 | /* | 254 | /* |
255 | * clocksource | 255 | * clocksource |
256 | */ | 256 | */ |
257 | static DEFINE_CLOCK_DATA(cd); | ||
258 | static cycle_t clocksource_read_cycles(struct clocksource *cs) | 257 | static cycle_t clocksource_read_cycles(struct clocksource *cs) |
259 | { | 258 | { |
260 | return (cycle_t)__omap_dm_timer_read_counter(&clksrc, 1); | 259 | return (cycle_t)__omap_dm_timer_read_counter(&clksrc, 1); |
@@ -268,23 +267,12 @@ static struct clocksource clocksource_gpt = { | |||
268 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | 267 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, |
269 | }; | 268 | }; |
270 | 269 | ||
271 | static void notrace dmtimer_update_sched_clock(void) | 270 | static u32 notrace dmtimer_read_sched_clock(void) |
272 | { | 271 | { |
273 | u32 cyc; | ||
274 | |||
275 | cyc = __omap_dm_timer_read_counter(&clksrc, 1); | ||
276 | |||
277 | update_sched_clock(&cd, cyc, (u32)~0); | ||
278 | } | ||
279 | |||
280 | unsigned long long notrace sched_clock(void) | ||
281 | { | ||
282 | u32 cyc = 0; | ||
283 | |||
284 | if (clksrc.reserved) | 272 | if (clksrc.reserved) |
285 | cyc = __omap_dm_timer_read_counter(&clksrc, 1); | 273 | return __omap_dm_timer_read_counter(clksrc.io_base, 1); |
286 | 274 | ||
287 | return cyc_to_sched_clock(&cd, cyc, (u32)~0); | 275 | return 0; |
288 | } | 276 | } |
289 | 277 | ||
290 | /* Setup free-running counter for clocksource */ | 278 | /* Setup free-running counter for clocksource */ |
@@ -301,7 +289,7 @@ static void __init omap2_gp_clocksource_init(int gptimer_id, | |||
301 | 289 | ||
302 | __omap_dm_timer_load_start(&clksrc, | 290 | __omap_dm_timer_load_start(&clksrc, |
303 | OMAP_TIMER_CTRL_ST | OMAP_TIMER_CTRL_AR, 0, 1); | 291 | OMAP_TIMER_CTRL_ST | OMAP_TIMER_CTRL_AR, 0, 1); |
304 | init_sched_clock(&cd, dmtimer_update_sched_clock, 32, clksrc.rate); | 292 | setup_sched_clock(dmtimer_read_sched_clock, 32, clksrc.rate); |
305 | 293 | ||
306 | if (clocksource_register_hz(&clocksource_gpt, clksrc.rate)) | 294 | if (clocksource_register_hz(&clocksource_gpt, clksrc.rate)) |
307 | pr_err("Could not register clocksource %s\n", | 295 | pr_err("Could not register clocksource %s\n", |
diff --git a/arch/arm/mach-orion5x/include/mach/io.h b/arch/arm/mach-orion5x/include/mach/io.h index c5196101a23..e9d9afdc265 100644 --- a/arch/arm/mach-orion5x/include/mach/io.h +++ b/arch/arm/mach-orion5x/include/mach/io.h | |||
@@ -15,31 +15,6 @@ | |||
15 | 15 | ||
16 | #define IO_SPACE_LIMIT 0xffffffff | 16 | #define IO_SPACE_LIMIT 0xffffffff |
17 | 17 | ||
18 | static inline void __iomem * | ||
19 | __arch_ioremap(unsigned long paddr, size_t size, unsigned int mtype) | ||
20 | { | ||
21 | void __iomem *retval; | ||
22 | unsigned long offs = paddr - ORION5X_REGS_PHYS_BASE; | ||
23 | if (mtype == MT_DEVICE && size && offs < ORION5X_REGS_SIZE && | ||
24 | size <= ORION5X_REGS_SIZE && offs + size <= ORION5X_REGS_SIZE) { | ||
25 | retval = (void __iomem *)ORION5X_REGS_VIRT_BASE + offs; | ||
26 | } else { | ||
27 | retval = __arm_ioremap(paddr, size, mtype); | ||
28 | } | ||
29 | |||
30 | return retval; | ||
31 | } | ||
32 | |||
33 | static inline void | ||
34 | __arch_iounmap(void __iomem *addr) | ||
35 | { | ||
36 | if (addr < (void __iomem *)ORION5X_REGS_VIRT_BASE || | ||
37 | addr >= (void __iomem *)(ORION5X_REGS_VIRT_BASE + ORION5X_REGS_SIZE)) | ||
38 | __iounmap(addr); | ||
39 | } | ||
40 | |||
41 | #define __arch_ioremap __arch_ioremap | ||
42 | #define __arch_iounmap __arch_iounmap | ||
43 | #define __io(a) __typesafe_io(a) | 18 | #define __io(a) __typesafe_io(a) |
44 | #define __mem_pci(a) (a) | 19 | #define __mem_pci(a) (a) |
45 | 20 | ||
diff --git a/arch/arm/mach-orion5x/include/mach/vmalloc.h b/arch/arm/mach-orion5x/include/mach/vmalloc.h deleted file mode 100644 index 06b50aeff7b..00000000000 --- a/arch/arm/mach-orion5x/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-orion5x/include/mach/vmalloc.h | ||
3 | */ | ||
4 | |||
5 | #define VMALLOC_END 0xfd800000UL | ||
diff --git a/arch/arm/mach-orion5x/ts209-setup.c b/arch/arm/mach-orion5x/ts209-setup.c index 62c156b20cc..5d640874558 100644 --- a/arch/arm/mach-orion5x/ts209-setup.c +++ b/arch/arm/mach-orion5x/ts209-setup.c | |||
@@ -178,7 +178,7 @@ static struct hw_pci qnap_ts209_pci __initdata = { | |||
178 | 178 | ||
179 | static int __init qnap_ts209_pci_init(void) | 179 | static int __init qnap_ts209_pci_init(void) |
180 | { | 180 | { |
181 | if (machine_is_ts_x09()) | 181 | if (machine_is_ts209()) |
182 | pci_common_init(&qnap_ts209_pci); | 182 | pci_common_init(&qnap_ts209_pci); |
183 | 183 | ||
184 | return 0; | 184 | return 0; |
diff --git a/arch/arm/mach-picoxcell/common.c b/arch/arm/mach-picoxcell/common.c index 34d08347be5..ad871bd7b1a 100644 --- a/arch/arm/mach-picoxcell/common.c +++ b/arch/arm/mach-picoxcell/common.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/irqdomain.h> | 11 | #include <linux/irqdomain.h> |
12 | #include <linux/of.h> | 12 | #include <linux/of.h> |
13 | #include <linux/of_address.h> | 13 | #include <linux/of_address.h> |
14 | #include <linux/of_irq.h> | ||
14 | #include <linux/of_platform.h> | 15 | #include <linux/of_platform.h> |
15 | 16 | ||
16 | #include <asm/mach/arch.h> | 17 | #include <asm/mach/arch.h> |
@@ -33,22 +34,20 @@ static const char *picoxcell_dt_match[] = { | |||
33 | }; | 34 | }; |
34 | 35 | ||
35 | static const struct of_device_id vic_of_match[] __initconst = { | 36 | static const struct of_device_id vic_of_match[] __initconst = { |
36 | { .compatible = "arm,pl192-vic" }, | 37 | { .compatible = "arm,pl192-vic", .data = vic_of_init, }, |
37 | { /* Sentinel */ } | 38 | { /* Sentinel */ } |
38 | }; | 39 | }; |
39 | 40 | ||
40 | static void __init picoxcell_init_irq(void) | 41 | static void __init picoxcell_init_irq(void) |
41 | { | 42 | { |
42 | vic_init(IO_ADDRESS(PICOXCELL_VIC0_BASE), 0, ~0, 0); | 43 | of_irq_init(vic_of_match); |
43 | vic_init(IO_ADDRESS(PICOXCELL_VIC1_BASE), 32, ~0, 0); | ||
44 | irq_domain_generate_simple(vic_of_match, PICOXCELL_VIC0_BASE, 0); | ||
45 | irq_domain_generate_simple(vic_of_match, PICOXCELL_VIC1_BASE, 32); | ||
46 | } | 44 | } |
47 | 45 | ||
48 | DT_MACHINE_START(PICOXCELL, "Picochip picoXcell") | 46 | DT_MACHINE_START(PICOXCELL, "Picochip picoXcell") |
49 | .map_io = picoxcell_map_io, | 47 | .map_io = picoxcell_map_io, |
50 | .nr_irqs = ARCH_NR_IRQS, | 48 | .nr_irqs = ARCH_NR_IRQS, |
51 | .init_irq = picoxcell_init_irq, | 49 | .init_irq = picoxcell_init_irq, |
50 | .handle_irq = vic_handle_irq, | ||
52 | .timer = &picoxcell_timer, | 51 | .timer = &picoxcell_timer, |
53 | .init_machine = picoxcell_init_machine, | 52 | .init_machine = picoxcell_init_machine, |
54 | .dt_compat = picoxcell_dt_match, | 53 | .dt_compat = picoxcell_dt_match, |
diff --git a/arch/arm/mach-picoxcell/include/mach/entry-macro.S b/arch/arm/mach-picoxcell/include/mach/entry-macro.S index a6b09f75d9d..9b505ac00be 100644 --- a/arch/arm/mach-picoxcell/include/mach/entry-macro.S +++ b/arch/arm/mach-picoxcell/include/mach/entry-macro.S | |||
@@ -9,11 +9,8 @@ | |||
9 | * License version 2. This program is licensed "as is" without any | 9 | * License version 2. This program is licensed "as is" without any |
10 | * warranty of any kind, whether express or implied. | 10 | * warranty of any kind, whether express or implied. |
11 | */ | 11 | */ |
12 | #include <mach/hardware.h> | 12 | .macro disable_fiq |
13 | #include <mach/irqs.h> | 13 | .endm |
14 | #include <mach/map.h> | ||
15 | 14 | ||
16 | #define VA_VIC0 IO_ADDRESS(PICOXCELL_VIC0_BASE) | 15 | .macro arch_ret_to_user, tmp1, tmp2 |
17 | #define VA_VIC1 IO_ADDRESS(PICOXCELL_VIC1_BASE) | 16 | .endm |
18 | |||
19 | #include <asm/entry-macro-vic2.S> | ||
diff --git a/arch/arm/mach-picoxcell/include/mach/vmalloc.h b/arch/arm/mach-picoxcell/include/mach/vmalloc.h deleted file mode 100644 index 0216cc4b1f0..00000000000 --- a/arch/arm/mach-picoxcell/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,14 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2011 Picochip Ltd., Jamie Iles | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | */ | ||
14 | #define VMALLOC_END 0xfe000000UL | ||
diff --git a/arch/arm/mach-picoxcell/time.c b/arch/arm/mach-picoxcell/time.c index 90a554ff449..6c89cf8ab22 100644 --- a/arch/arm/mach-picoxcell/time.c +++ b/arch/arm/mach-picoxcell/time.c | |||
@@ -11,7 +11,6 @@ | |||
11 | #include <linux/of.h> | 11 | #include <linux/of.h> |
12 | #include <linux/of_address.h> | 12 | #include <linux/of_address.h> |
13 | #include <linux/of_irq.h> | 13 | #include <linux/of_irq.h> |
14 | #include <linux/sched.h> | ||
15 | 14 | ||
16 | #include <asm/mach/time.h> | 15 | #include <asm/mach/time.h> |
17 | #include <asm/sched_clock.h> | 16 | #include <asm/sched_clock.h> |
@@ -66,21 +65,11 @@ static void picoxcell_add_clocksource(struct device_node *source_timer) | |||
66 | dw_apb_clocksource_register(cs); | 65 | dw_apb_clocksource_register(cs); |
67 | } | 66 | } |
68 | 67 | ||
69 | static DEFINE_CLOCK_DATA(cd); | ||
70 | static void __iomem *sched_io_base; | 68 | static void __iomem *sched_io_base; |
71 | 69 | ||
72 | unsigned long long notrace sched_clock(void) | 70 | unsigned u32 notrace picoxcell_read_sched_clock(void) |
73 | { | 71 | { |
74 | cycle_t cyc = sched_io_base ? __raw_readl(sched_io_base) : 0; | 72 | return __raw_readl(sched_io_base); |
75 | |||
76 | return cyc_to_sched_clock(&cd, cyc, (u32)~0); | ||
77 | } | ||
78 | |||
79 | static void notrace picoxcell_update_sched_clock(void) | ||
80 | { | ||
81 | cycle_t cyc = sched_io_base ? __raw_readl(sched_io_base) : 0; | ||
82 | |||
83 | update_sched_clock(&cd, cyc, (u32)~0); | ||
84 | } | 73 | } |
85 | 74 | ||
86 | static const struct of_device_id picoxcell_rtc_ids[] __initconst = { | 75 | static const struct of_device_id picoxcell_rtc_ids[] __initconst = { |
@@ -100,7 +89,7 @@ static void picoxcell_init_sched_clock(void) | |||
100 | timer_get_base_and_rate(sched_timer, &sched_io_base, &rate); | 89 | timer_get_base_and_rate(sched_timer, &sched_io_base, &rate); |
101 | of_node_put(sched_timer); | 90 | of_node_put(sched_timer); |
102 | 91 | ||
103 | init_sched_clock(&cd, picoxcell_update_sched_clock, 32, rate); | 92 | setup_sched_clock(picoxcell_read_sched_clock, 32, rate); |
104 | } | 93 | } |
105 | 94 | ||
106 | static const struct of_device_id picoxcell_timer_ids[] __initconst = { | 95 | static const struct of_device_id picoxcell_timer_ids[] __initconst = { |
diff --git a/arch/arm/mach-pnx4008/include/mach/vmalloc.h b/arch/arm/mach-pnx4008/include/mach/vmalloc.h deleted file mode 100644 index 184913c7114..00000000000 --- a/arch/arm/mach-pnx4008/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-pnx4008/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Author: Vitaly Wool <source@mvista.com> | ||
5 | * | ||
6 | * 2006 (c) MontaVista Software, Inc. This file is licensed under | ||
7 | * the terms of the GNU General Public License version 2. This program | ||
8 | * is licensed "as is" without any warranty of any kind, whether express | ||
9 | * or implied. | ||
10 | */ | ||
11 | |||
12 | /* | ||
13 | * Just any arbitrary offset to the start of the vmalloc VM area: the | ||
14 | * current 8MB value just means that there will be a 8MB "hole" after the | ||
15 | * physical memory until the kernel virtual memory starts. That means that | ||
16 | * any out-of-bounds memory accesses will hopefully be caught. | ||
17 | * The vmalloc() routines leaves a hole of 4kB between each vmalloced | ||
18 | * area for the same reason. ;) | ||
19 | */ | ||
20 | #define VMALLOC_END 0xd0000000UL | ||
diff --git a/arch/arm/mach-prima2/include/mach/map.h b/arch/arm/mach-prima2/include/mach/map.h index 66b1ae2e553..6f243532570 100644 --- a/arch/arm/mach-prima2/include/mach/map.h +++ b/arch/arm/mach-prima2/include/mach/map.h | |||
@@ -9,8 +9,10 @@ | |||
9 | #ifndef __MACH_PRIMA2_MAP_H__ | 9 | #ifndef __MACH_PRIMA2_MAP_H__ |
10 | #define __MACH_PRIMA2_MAP_H__ | 10 | #define __MACH_PRIMA2_MAP_H__ |
11 | 11 | ||
12 | #include <mach/vmalloc.h> | 12 | #include <linux/const.h> |
13 | 13 | ||
14 | #define SIRFSOC_VA(x) (VMALLOC_END + ((x) & 0x00FFF000)) | 14 | #define SIRFSOC_VA_BASE _AC(0xFEC00000, UL) |
15 | |||
16 | #define SIRFSOC_VA(x) (SIRFSOC_VA_BASE + ((x) & 0x00FFF000)) | ||
15 | 17 | ||
16 | #endif | 18 | #endif |
diff --git a/arch/arm/mach-prima2/include/mach/vmalloc.h b/arch/arm/mach-prima2/include/mach/vmalloc.h deleted file mode 100644 index c9f90fec78e..00000000000 --- a/arch/arm/mach-prima2/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,16 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/ach-prima2/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (c) 2010 – 2011 Cambridge Silicon Radio Limited, a CSR plc group company. | ||
5 | * | ||
6 | * Licensed under GPLv2 or later. | ||
7 | */ | ||
8 | |||
9 | #ifndef __MACH_VMALLOC_H | ||
10 | #define __MACH_VMALLOC_H | ||
11 | |||
12 | #include <linux/const.h> | ||
13 | |||
14 | #define VMALLOC_END _AC(0xFEC00000, UL) | ||
15 | |||
16 | #endif | ||
diff --git a/arch/arm/mach-pxa/include/mach/entry-macro.S b/arch/arm/mach-pxa/include/mach/entry-macro.S index a73bc86a3c2..260c0c17692 100644 --- a/arch/arm/mach-pxa/include/mach/entry-macro.S +++ b/arch/arm/mach-pxa/include/mach/entry-macro.S | |||
@@ -7,45 +7,9 @@ | |||
7 | * License version 2. This program is licensed "as is" without any | 7 | * License version 2. This program is licensed "as is" without any |
8 | * warranty of any kind, whether express or implied. | 8 | * warranty of any kind, whether express or implied. |
9 | */ | 9 | */ |
10 | #include <mach/hardware.h> | ||
11 | #include <mach/irqs.h> | ||
12 | 10 | ||
13 | .macro disable_fiq | 11 | .macro disable_fiq |
14 | .endm | 12 | .endm |
15 | 13 | ||
16 | .macro get_irqnr_preamble, base, tmp | ||
17 | .endm | ||
18 | |||
19 | .macro arch_ret_to_user, tmp1, tmp2 | 14 | .macro arch_ret_to_user, tmp1, tmp2 |
20 | .endm | 15 | .endm |
21 | |||
22 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
23 | mrc p15, 0, \tmp, c0, c0, 0 @ CPUID | ||
24 | mov \tmp, \tmp, lsr #13 | ||
25 | and \tmp, \tmp, #0x7 @ Core G | ||
26 | cmp \tmp, #1 | ||
27 | bhi 1002f | ||
28 | |||
29 | @ Core Generation 1 (PXA25x) | ||
30 | mov \base, #io_p2v(0x40000000) @ IIR Ctl = 0x40d00000 | ||
31 | add \base, \base, #0x00d00000 | ||
32 | ldr \irqstat, [\base, #0] @ ICIP | ||
33 | ldr \irqnr, [\base, #4] @ ICMR | ||
34 | |||
35 | ands \irqnr, \irqstat, \irqnr | ||
36 | beq 1001f | ||
37 | rsb \irqstat, \irqnr, #0 | ||
38 | and \irqstat, \irqstat, \irqnr | ||
39 | clz \irqnr, \irqstat | ||
40 | rsb \irqnr, \irqnr, #(31 + PXA_IRQ(0)) | ||
41 | b 1001f | ||
42 | 1002: | ||
43 | @ Core Generation 2 (PXA27x) or Core Generation 3 (PXA3xx) | ||
44 | mrc p6, 0, \irqstat, c5, c0, 0 @ ICHP | ||
45 | tst \irqstat, #0x80000000 | ||
46 | beq 1001f | ||
47 | bic \irqstat, \irqstat, #0x80000000 | ||
48 | mov \irqnr, \irqstat, lsr #16 | ||
49 | add \irqnr, \irqnr, #(PXA_IRQ(0)) | ||
50 | 1001: | ||
51 | .endm | ||
diff --git a/arch/arm/mach-pxa/include/mach/vmalloc.h b/arch/arm/mach-pxa/include/mach/vmalloc.h deleted file mode 100644 index bfecfbf5f46..00000000000 --- a/arch/arm/mach-pxa/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,11 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-pxa/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Author: Nicolas Pitre | ||
5 | * Copyright: (C) 2001 MontaVista Software Inc. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | #define VMALLOC_END (0xe8000000UL) | ||
diff --git a/arch/arm/mach-pxa/time.c b/arch/arm/mach-pxa/time.c index de684701449..b503049d6d2 100644 --- a/arch/arm/mach-pxa/time.c +++ b/arch/arm/mach-pxa/time.c | |||
@@ -16,7 +16,6 @@ | |||
16 | #include <linux/init.h> | 16 | #include <linux/init.h> |
17 | #include <linux/interrupt.h> | 17 | #include <linux/interrupt.h> |
18 | #include <linux/clockchips.h> | 18 | #include <linux/clockchips.h> |
19 | #include <linux/sched.h> | ||
20 | 19 | ||
21 | #include <asm/div64.h> | 20 | #include <asm/div64.h> |
22 | #include <asm/mach/irq.h> | 21 | #include <asm/mach/irq.h> |
@@ -32,18 +31,10 @@ | |||
32 | * long as there is always less than 582 seconds between successive | 31 | * long as there is always less than 582 seconds between successive |
33 | * calls to sched_clock() which should always be the case in practice. | 32 | * calls to sched_clock() which should always be the case in practice. |
34 | */ | 33 | */ |
35 | static DEFINE_CLOCK_DATA(cd); | ||
36 | 34 | ||
37 | unsigned long long notrace sched_clock(void) | 35 | static u32 notrace pxa_read_sched_clock(void) |
38 | { | 36 | { |
39 | u32 cyc = OSCR; | 37 | return OSCR; |
40 | return cyc_to_sched_clock(&cd, cyc, (u32)~0); | ||
41 | } | ||
42 | |||
43 | static void notrace pxa_update_sched_clock(void) | ||
44 | { | ||
45 | u32 cyc = OSCR; | ||
46 | update_sched_clock(&cd, cyc, (u32)~0); | ||
47 | } | 38 | } |
48 | 39 | ||
49 | 40 | ||
@@ -119,7 +110,7 @@ static void __init pxa_timer_init(void) | |||
119 | OIER = 0; | 110 | OIER = 0; |
120 | OSSR = OSSR_M0 | OSSR_M1 | OSSR_M2 | OSSR_M3; | 111 | OSSR = OSSR_M0 | OSSR_M1 | OSSR_M2 | OSSR_M3; |
121 | 112 | ||
122 | init_sched_clock(&cd, pxa_update_sched_clock, 32, clock_tick_rate); | 113 | setup_sched_clock(pxa_read_sched_clock, 32, clock_tick_rate); |
123 | 114 | ||
124 | clockevents_calc_mult_shift(&ckevt_pxa_osmr0, clock_tick_rate, 4); | 115 | clockevents_calc_mult_shift(&ckevt_pxa_osmr0, clock_tick_rate, 4); |
125 | ckevt_pxa_osmr0.max_delta_ns = | 116 | ckevt_pxa_osmr0.max_delta_ns = |
diff --git a/arch/arm/mach-realview/Kconfig b/arch/arm/mach-realview/Kconfig index dba6d0c1fc1..c593be428b8 100644 --- a/arch/arm/mach-realview/Kconfig +++ b/arch/arm/mach-realview/Kconfig | |||
@@ -12,6 +12,8 @@ config REALVIEW_EB_A9MP | |||
12 | bool "Support Multicore Cortex-A9 Tile" | 12 | bool "Support Multicore Cortex-A9 Tile" |
13 | depends on MACH_REALVIEW_EB | 13 | depends on MACH_REALVIEW_EB |
14 | select CPU_V7 | 14 | select CPU_V7 |
15 | select HAVE_SMP | ||
16 | select MIGHT_HAVE_CACHE_L2X0 | ||
15 | help | 17 | help |
16 | Enable support for the Cortex-A9MPCore tile fitted to the | 18 | Enable support for the Cortex-A9MPCore tile fitted to the |
17 | Realview(R) Emulation Baseboard platform. | 19 | Realview(R) Emulation Baseboard platform. |
@@ -21,6 +23,8 @@ config REALVIEW_EB_ARM11MP | |||
21 | depends on MACH_REALVIEW_EB | 23 | depends on MACH_REALVIEW_EB |
22 | select CPU_V6K | 24 | select CPU_V6K |
23 | select ARCH_HAS_BARRIERS if SMP | 25 | select ARCH_HAS_BARRIERS if SMP |
26 | select HAVE_SMP | ||
27 | select MIGHT_HAVE_CACHE_L2X0 | ||
24 | help | 28 | help |
25 | Enable support for the ARM11MPCore tile fitted to the Realview(R) | 29 | Enable support for the ARM11MPCore tile fitted to the Realview(R) |
26 | Emulation Baseboard platform. | 30 | Emulation Baseboard platform. |
@@ -39,6 +43,8 @@ config MACH_REALVIEW_PB11MP | |||
39 | select CPU_V6K | 43 | select CPU_V6K |
40 | select ARM_GIC | 44 | select ARM_GIC |
41 | select HAVE_PATA_PLATFORM | 45 | select HAVE_PATA_PLATFORM |
46 | select HAVE_SMP | ||
47 | select MIGHT_HAVE_CACHE_L2X0 | ||
42 | select ARCH_HAS_BARRIERS if SMP | 48 | select ARCH_HAS_BARRIERS if SMP |
43 | help | 49 | help |
44 | Include support for the ARM(R) RealView(R) Platform Baseboard for | 50 | Include support for the ARM(R) RealView(R) Platform Baseboard for |
@@ -51,6 +57,7 @@ config MACH_REALVIEW_PB1176 | |||
51 | select CPU_V6 | 57 | select CPU_V6 |
52 | select ARM_GIC | 58 | select ARM_GIC |
53 | select HAVE_TCM | 59 | select HAVE_TCM |
60 | select MIGHT_HAVE_CACHE_L2X0 | ||
54 | help | 61 | help |
55 | Include support for the ARM(R) RealView(R) Platform Baseboard for | 62 | Include support for the ARM(R) RealView(R) Platform Baseboard for |
56 | ARM1176JZF-S. | 63 | ARM1176JZF-S. |
@@ -78,6 +85,8 @@ config MACH_REALVIEW_PBX | |||
78 | bool "Support RealView(R) Platform Baseboard Explore" | 85 | bool "Support RealView(R) Platform Baseboard Explore" |
79 | select ARM_GIC | 86 | select ARM_GIC |
80 | select HAVE_PATA_PLATFORM | 87 | select HAVE_PATA_PLATFORM |
88 | select HAVE_SMP | ||
89 | select MIGHT_HAVE_CACHE_L2X0 | ||
81 | select ARCH_SPARSEMEM_ENABLE if CPU_V7 && !REALVIEW_HIGH_PHYS_OFFSET | 90 | select ARCH_SPARSEMEM_ENABLE if CPU_V7 && !REALVIEW_HIGH_PHYS_OFFSET |
82 | select ZONE_DMA if SPARSEMEM | 91 | select ZONE_DMA if SPARSEMEM |
83 | help | 92 | help |
diff --git a/arch/arm/mach-realview/include/mach/entry-macro.S b/arch/arm/mach-realview/include/mach/entry-macro.S index 4071164aeba..e8a5179c265 100644 --- a/arch/arm/mach-realview/include/mach/entry-macro.S +++ b/arch/arm/mach-realview/include/mach/entry-macro.S | |||
@@ -7,8 +7,6 @@ | |||
7 | * License version 2. This program is licensed "as is" without any | 7 | * License version 2. This program is licensed "as is" without any |
8 | * warranty of any kind, whether express or implied. | 8 | * warranty of any kind, whether express or implied. |
9 | */ | 9 | */ |
10 | #include <mach/hardware.h> | ||
11 | #include <asm/hardware/entry-macro-gic.S> | ||
12 | 10 | ||
13 | .macro disable_fiq | 11 | .macro disable_fiq |
14 | .endm | 12 | .endm |
diff --git a/arch/arm/mach-realview/include/mach/vmalloc.h b/arch/arm/mach-realview/include/mach/vmalloc.h deleted file mode 100644 index a2a4c686140..00000000000 --- a/arch/arm/mach-realview/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,21 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-realview/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 2003 ARM Limited | ||
5 | * Copyright (C) 2000 Russell King. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | */ | ||
21 | #define VMALLOC_END 0xf8000000UL | ||
diff --git a/arch/arm/mach-realview/realview_eb.c b/arch/arm/mach-realview/realview_eb.c index 4b796241dd7..f92a920cf50 100644 --- a/arch/arm/mach-realview/realview_eb.c +++ b/arch/arm/mach-realview/realview_eb.c | |||
@@ -91,8 +91,8 @@ static struct map_desc realview_eb_io_desc[] __initdata = { | |||
91 | 91 | ||
92 | static struct map_desc realview_eb11mp_io_desc[] __initdata = { | 92 | static struct map_desc realview_eb11mp_io_desc[] __initdata = { |
93 | { | 93 | { |
94 | .virtual = IO_ADDRESS(REALVIEW_EB11MP_GIC_CPU_BASE), | 94 | .virtual = IO_ADDRESS(REALVIEW_EB11MP_SCU_BASE), |
95 | .pfn = __phys_to_pfn(REALVIEW_EB11MP_GIC_CPU_BASE), | 95 | .pfn = __phys_to_pfn(REALVIEW_EB11MP_SCU_BASE), |
96 | .length = SZ_4K, | 96 | .length = SZ_4K, |
97 | .type = MT_DEVICE, | 97 | .type = MT_DEVICE, |
98 | }, { | 98 | }, { |
@@ -469,6 +469,7 @@ MACHINE_START(REALVIEW_EB, "ARM-RealView EB") | |||
469 | .init_early = realview_init_early, | 469 | .init_early = realview_init_early, |
470 | .init_irq = gic_init_irq, | 470 | .init_irq = gic_init_irq, |
471 | .timer = &realview_eb_timer, | 471 | .timer = &realview_eb_timer, |
472 | .handle_irq = gic_handle_irq, | ||
472 | .init_machine = realview_eb_init, | 473 | .init_machine = realview_eb_init, |
473 | #ifdef CONFIG_ZONE_DMA | 474 | #ifdef CONFIG_ZONE_DMA |
474 | .dma_zone_size = SZ_256M, | 475 | .dma_zone_size = SZ_256M, |
diff --git a/arch/arm/mach-realview/realview_pb1176.c b/arch/arm/mach-realview/realview_pb1176.c index 09e630bfa44..8ec37b29e0f 100644 --- a/arch/arm/mach-realview/realview_pb1176.c +++ b/arch/arm/mach-realview/realview_pb1176.c | |||
@@ -392,6 +392,7 @@ MACHINE_START(REALVIEW_PB1176, "ARM-RealView PB1176") | |||
392 | .init_early = realview_init_early, | 392 | .init_early = realview_init_early, |
393 | .init_irq = gic_init_irq, | 393 | .init_irq = gic_init_irq, |
394 | .timer = &realview_pb1176_timer, | 394 | .timer = &realview_pb1176_timer, |
395 | .handle_irq = gic_handle_irq, | ||
395 | .init_machine = realview_pb1176_init, | 396 | .init_machine = realview_pb1176_init, |
396 | #ifdef CONFIG_ZONE_DMA | 397 | #ifdef CONFIG_ZONE_DMA |
397 | .dma_zone_size = SZ_256M, | 398 | .dma_zone_size = SZ_256M, |
diff --git a/arch/arm/mach-realview/realview_pb11mp.c b/arch/arm/mach-realview/realview_pb11mp.c index e38e85b6472..f035fda8b61 100644 --- a/arch/arm/mach-realview/realview_pb11mp.c +++ b/arch/arm/mach-realview/realview_pb11mp.c | |||
@@ -366,6 +366,7 @@ MACHINE_START(REALVIEW_PB11MP, "ARM-RealView PB11MPCore") | |||
366 | .init_early = realview_init_early, | 366 | .init_early = realview_init_early, |
367 | .init_irq = gic_init_irq, | 367 | .init_irq = gic_init_irq, |
368 | .timer = &realview_pb11mp_timer, | 368 | .timer = &realview_pb11mp_timer, |
369 | .handle_irq = gic_handle_irq, | ||
369 | .init_machine = realview_pb11mp_init, | 370 | .init_machine = realview_pb11mp_init, |
370 | #ifdef CONFIG_ZONE_DMA | 371 | #ifdef CONFIG_ZONE_DMA |
371 | .dma_zone_size = SZ_256M, | 372 | .dma_zone_size = SZ_256M, |
diff --git a/arch/arm/mach-realview/realview_pba8.c b/arch/arm/mach-realview/realview_pba8.c index 04d1e495309..0109c8b440c 100644 --- a/arch/arm/mach-realview/realview_pba8.c +++ b/arch/arm/mach-realview/realview_pba8.c | |||
@@ -316,6 +316,7 @@ MACHINE_START(REALVIEW_PBA8, "ARM-RealView PB-A8") | |||
316 | .init_early = realview_init_early, | 316 | .init_early = realview_init_early, |
317 | .init_irq = gic_init_irq, | 317 | .init_irq = gic_init_irq, |
318 | .timer = &realview_pba8_timer, | 318 | .timer = &realview_pba8_timer, |
319 | .handle_irq = gic_handle_irq, | ||
319 | .init_machine = realview_pba8_init, | 320 | .init_machine = realview_pba8_init, |
320 | #ifdef CONFIG_ZONE_DMA | 321 | #ifdef CONFIG_ZONE_DMA |
321 | .dma_zone_size = SZ_256M, | 322 | .dma_zone_size = SZ_256M, |
diff --git a/arch/arm/mach-realview/realview_pbx.c b/arch/arm/mach-realview/realview_pbx.c index d515452323a..0194b3e26dc 100644 --- a/arch/arm/mach-realview/realview_pbx.c +++ b/arch/arm/mach-realview/realview_pbx.c | |||
@@ -98,8 +98,8 @@ static struct map_desc realview_pbx_io_desc[] __initdata = { | |||
98 | 98 | ||
99 | static struct map_desc realview_local_io_desc[] __initdata = { | 99 | static struct map_desc realview_local_io_desc[] __initdata = { |
100 | { | 100 | { |
101 | .virtual = IO_ADDRESS(REALVIEW_PBX_TILE_GIC_CPU_BASE), | 101 | .virtual = IO_ADDRESS(REALVIEW_PBX_TILE_SCU_BASE), |
102 | .pfn = __phys_to_pfn(REALVIEW_PBX_TILE_GIC_CPU_BASE), | 102 | .pfn = __phys_to_pfn(REALVIEW_PBX_TILE_SCU_BASE), |
103 | .length = SZ_4K, | 103 | .length = SZ_4K, |
104 | .type = MT_DEVICE, | 104 | .type = MT_DEVICE, |
105 | }, { | 105 | }, { |
@@ -399,6 +399,7 @@ MACHINE_START(REALVIEW_PBX, "ARM-RealView PBX") | |||
399 | .init_early = realview_init_early, | 399 | .init_early = realview_init_early, |
400 | .init_irq = gic_init_irq, | 400 | .init_irq = gic_init_irq, |
401 | .timer = &realview_pbx_timer, | 401 | .timer = &realview_pbx_timer, |
402 | .handle_irq = gic_handle_irq, | ||
402 | .init_machine = realview_pbx_init, | 403 | .init_machine = realview_pbx_init, |
403 | #ifdef CONFIG_ZONE_DMA | 404 | #ifdef CONFIG_ZONE_DMA |
404 | .dma_zone_size = SZ_256M, | 405 | .dma_zone_size = SZ_256M, |
diff --git a/arch/arm/mach-rpc/include/mach/vmalloc.h b/arch/arm/mach-rpc/include/mach/vmalloc.h deleted file mode 100644 index fb700228637..00000000000 --- a/arch/arm/mach-rpc/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,10 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-rpc/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 1997 Russell King | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | #define VMALLOC_END 0xdc000000UL | ||
diff --git a/arch/arm/mach-s3c2410/include/mach/vmalloc.h b/arch/arm/mach-s3c2410/include/mach/vmalloc.h deleted file mode 100644 index 7a311e8dddb..00000000000 --- a/arch/arm/mach-s3c2410/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* arch/arm/mach-s3c2410/include/mach/vmalloc.h | ||
2 | * | ||
3 | * from arch/arm/mach-iop3xx/include/mach/vmalloc.h | ||
4 | * | ||
5 | * Copyright (c) 2003 Simtec Electronics <linux@simtec.co.uk> | ||
6 | * http://www.simtec.co.uk/products/SWLINUX/ | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | * | ||
12 | * S3C2410 vmalloc definition | ||
13 | */ | ||
14 | |||
15 | #ifndef __ASM_ARCH_VMALLOC_H | ||
16 | #define __ASM_ARCH_VMALLOC_H | ||
17 | |||
18 | #define VMALLOC_END 0xF6000000UL | ||
19 | |||
20 | #endif /* __ASM_ARCH_VMALLOC_H */ | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/entry-macro.S b/arch/arm/mach-s3c64xx/include/mach/entry-macro.S index dd362604dcc..dc2bc15142c 100644 --- a/arch/arm/mach-s3c64xx/include/mach/entry-macro.S +++ b/arch/arm/mach-s3c64xx/include/mach/entry-macro.S | |||
@@ -12,7 +12,8 @@ | |||
12 | * warranty of any kind, whether express or implied. | 12 | * warranty of any kind, whether express or implied. |
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <mach/map.h> | 15 | .macro disable_fiq |
16 | #include <mach/irqs.h> | 16 | .endm |
17 | 17 | ||
18 | #include <asm/entry-macro-vic2.S> | 18 | .macro arch_ret_to_user, tmp1, tmp2 |
19 | .endm | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/vmalloc.h b/arch/arm/mach-s3c64xx/include/mach/vmalloc.h deleted file mode 100644 index 23f75e556a3..00000000000 --- a/arch/arm/mach-s3c64xx/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* arch/arm/mach-s3c64xx/include/mach/vmalloc.h | ||
2 | * | ||
3 | * from arch/arm/mach-iop3xx/include/mach/vmalloc.h | ||
4 | * | ||
5 | * Copyright (c) 2003 Simtec Electronics <linux@simtec.co.uk> | ||
6 | * http://www.simtec.co.uk/products/SWLINUX/ | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | * | ||
12 | * S3C6400 vmalloc definition | ||
13 | */ | ||
14 | |||
15 | #ifndef __ASM_ARCH_VMALLOC_H | ||
16 | #define __ASM_ARCH_VMALLOC_H | ||
17 | |||
18 | #define VMALLOC_END 0xF6000000UL | ||
19 | |||
20 | #endif /* __ASM_ARCH_VMALLOC_H */ | ||
diff --git a/arch/arm/mach-s3c64xx/mach-anw6410.c b/arch/arm/mach-s3c64xx/mach-anw6410.c index a2ea6e5ee46..b86f2779e4e 100644 --- a/arch/arm/mach-s3c64xx/mach-anw6410.c +++ b/arch/arm/mach-s3c64xx/mach-anw6410.c | |||
@@ -30,6 +30,7 @@ | |||
30 | 30 | ||
31 | #include <video/platform_lcd.h> | 31 | #include <video/platform_lcd.h> |
32 | 32 | ||
33 | #include <asm/hardware/vic.h> | ||
33 | #include <asm/mach/arch.h> | 34 | #include <asm/mach/arch.h> |
34 | #include <asm/mach/map.h> | 35 | #include <asm/mach/map.h> |
35 | #include <asm/mach/irq.h> | 36 | #include <asm/mach/irq.h> |
@@ -237,6 +238,7 @@ MACHINE_START(ANW6410, "A&W6410") | |||
237 | .atag_offset = 0x100, | 238 | .atag_offset = 0x100, |
238 | 239 | ||
239 | .init_irq = s3c6410_init_irq, | 240 | .init_irq = s3c6410_init_irq, |
241 | .handle_irq = vic_handle_irq, | ||
240 | .map_io = anw6410_map_io, | 242 | .map_io = anw6410_map_io, |
241 | .init_machine = anw6410_machine_init, | 243 | .init_machine = anw6410_machine_init, |
242 | .timer = &s3c24xx_timer, | 244 | .timer = &s3c24xx_timer, |
diff --git a/arch/arm/mach-s3c64xx/mach-crag6410.c b/arch/arm/mach-s3c64xx/mach-crag6410.c index 3615d83d7b5..f1c848aa4a1 100644 --- a/arch/arm/mach-s3c64xx/mach-crag6410.c +++ b/arch/arm/mach-s3c64xx/mach-crag6410.c | |||
@@ -37,6 +37,7 @@ | |||
37 | #include <linux/mfd/wm831x/irq.h> | 37 | #include <linux/mfd/wm831x/irq.h> |
38 | #include <linux/mfd/wm831x/gpio.h> | 38 | #include <linux/mfd/wm831x/gpio.h> |
39 | 39 | ||
40 | #include <asm/hardware/vic.h> | ||
40 | #include <asm/mach/arch.h> | 41 | #include <asm/mach/arch.h> |
41 | #include <asm/mach-types.h> | 42 | #include <asm/mach-types.h> |
42 | 43 | ||
@@ -712,6 +713,7 @@ MACHINE_START(WLF_CRAGG_6410, "Wolfson Cragganmore 6410") | |||
712 | /* Maintainer: Mark Brown <broonie@opensource.wolfsonmicro.com> */ | 713 | /* Maintainer: Mark Brown <broonie@opensource.wolfsonmicro.com> */ |
713 | .atag_offset = 0x100, | 714 | .atag_offset = 0x100, |
714 | .init_irq = s3c6410_init_irq, | 715 | .init_irq = s3c6410_init_irq, |
716 | .handle_irq = vic_handle_irq, | ||
715 | .map_io = crag6410_map_io, | 717 | .map_io = crag6410_map_io, |
716 | .init_machine = crag6410_machine_init, | 718 | .init_machine = crag6410_machine_init, |
717 | .timer = &s3c24xx_timer, | 719 | .timer = &s3c24xx_timer, |
diff --git a/arch/arm/mach-s3c64xx/mach-hmt.c b/arch/arm/mach-s3c64xx/mach-hmt.c index 8707bee2f0d..521e07b8501 100644 --- a/arch/arm/mach-s3c64xx/mach-hmt.c +++ b/arch/arm/mach-s3c64xx/mach-hmt.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <mach/hardware.h> | 29 | #include <mach/hardware.h> |
30 | #include <mach/map.h> | 30 | #include <mach/map.h> |
31 | 31 | ||
32 | #include <asm/hardware/vic.h> | ||
32 | #include <asm/irq.h> | 33 | #include <asm/irq.h> |
33 | #include <asm/mach-types.h> | 34 | #include <asm/mach-types.h> |
34 | 35 | ||
@@ -268,6 +269,7 @@ MACHINE_START(HMT, "Airgoo-HMT") | |||
268 | /* Maintainer: Peter Korsgaard <jacmet@sunsite.dk> */ | 269 | /* Maintainer: Peter Korsgaard <jacmet@sunsite.dk> */ |
269 | .atag_offset = 0x100, | 270 | .atag_offset = 0x100, |
270 | .init_irq = s3c6410_init_irq, | 271 | .init_irq = s3c6410_init_irq, |
272 | .handle_irq = vic_handle_irq, | ||
271 | .map_io = hmt_map_io, | 273 | .map_io = hmt_map_io, |
272 | .init_machine = hmt_machine_init, | 274 | .init_machine = hmt_machine_init, |
273 | .timer = &s3c24xx_timer, | 275 | .timer = &s3c24xx_timer, |
diff --git a/arch/arm/mach-s3c64xx/mach-mini6410.c b/arch/arm/mach-s3c64xx/mach-mini6410.c index 4fba2328a04..c34c2ab22ea 100644 --- a/arch/arm/mach-s3c64xx/mach-mini6410.c +++ b/arch/arm/mach-s3c64xx/mach-mini6410.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/serial_core.h> | 24 | #include <linux/serial_core.h> |
25 | #include <linux/types.h> | 25 | #include <linux/types.h> |
26 | 26 | ||
27 | #include <asm/hardware/vic.h> | ||
27 | #include <asm/mach-types.h> | 28 | #include <asm/mach-types.h> |
28 | #include <asm/mach/arch.h> | 29 | #include <asm/mach/arch.h> |
29 | #include <asm/mach/map.h> | 30 | #include <asm/mach/map.h> |
@@ -346,6 +347,7 @@ MACHINE_START(MINI6410, "MINI6410") | |||
346 | /* Maintainer: Darius Augulis <augulis.darius@gmail.com> */ | 347 | /* Maintainer: Darius Augulis <augulis.darius@gmail.com> */ |
347 | .atag_offset = 0x100, | 348 | .atag_offset = 0x100, |
348 | .init_irq = s3c6410_init_irq, | 349 | .init_irq = s3c6410_init_irq, |
350 | .handle_irq = vic_handle_irq, | ||
349 | .map_io = mini6410_map_io, | 351 | .map_io = mini6410_map_io, |
350 | .init_machine = mini6410_machine_init, | 352 | .init_machine = mini6410_machine_init, |
351 | .timer = &s3c24xx_timer, | 353 | .timer = &s3c24xx_timer, |
diff --git a/arch/arm/mach-s3c64xx/mach-ncp.c b/arch/arm/mach-s3c64xx/mach-ncp.c index 9ec4d571073..0efa2ba783b 100644 --- a/arch/arm/mach-s3c64xx/mach-ncp.c +++ b/arch/arm/mach-s3c64xx/mach-ncp.c | |||
@@ -25,6 +25,7 @@ | |||
25 | 25 | ||
26 | #include <video/platform_lcd.h> | 26 | #include <video/platform_lcd.h> |
27 | 27 | ||
28 | #include <asm/hardware/vic.h> | ||
28 | #include <asm/mach/arch.h> | 29 | #include <asm/mach/arch.h> |
29 | #include <asm/mach/map.h> | 30 | #include <asm/mach/map.h> |
30 | #include <asm/mach/irq.h> | 31 | #include <asm/mach/irq.h> |
@@ -100,6 +101,7 @@ MACHINE_START(NCP, "NCP") | |||
100 | /* Maintainer: Samsung Electronics */ | 101 | /* Maintainer: Samsung Electronics */ |
101 | .atag_offset = 0x100, | 102 | .atag_offset = 0x100, |
102 | .init_irq = s3c6410_init_irq, | 103 | .init_irq = s3c6410_init_irq, |
104 | .handle_irq = vic_handle_irq, | ||
103 | .map_io = ncp_map_io, | 105 | .map_io = ncp_map_io, |
104 | .init_machine = ncp_machine_init, | 106 | .init_machine = ncp_machine_init, |
105 | .timer = &s3c24xx_timer, | 107 | .timer = &s3c24xx_timer, |
diff --git a/arch/arm/mach-s3c64xx/mach-real6410.c b/arch/arm/mach-s3c64xx/mach-real6410.c index 0cb7116d7b5..be2a9a22ab7 100644 --- a/arch/arm/mach-s3c64xx/mach-real6410.c +++ b/arch/arm/mach-s3c64xx/mach-real6410.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/serial_core.h> | 25 | #include <linux/serial_core.h> |
26 | #include <linux/types.h> | 26 | #include <linux/types.h> |
27 | 27 | ||
28 | #include <asm/hardware/vic.h> | ||
28 | #include <asm/mach-types.h> | 29 | #include <asm/mach-types.h> |
29 | #include <asm/mach/arch.h> | 30 | #include <asm/mach/arch.h> |
30 | #include <asm/mach/map.h> | 31 | #include <asm/mach/map.h> |
@@ -327,6 +328,7 @@ MACHINE_START(REAL6410, "REAL6410") | |||
327 | .atag_offset = 0x100, | 328 | .atag_offset = 0x100, |
328 | 329 | ||
329 | .init_irq = s3c6410_init_irq, | 330 | .init_irq = s3c6410_init_irq, |
331 | .handle_irq = vic_handle_irq, | ||
330 | .map_io = real6410_map_io, | 332 | .map_io = real6410_map_io, |
331 | .init_machine = real6410_machine_init, | 333 | .init_machine = real6410_machine_init, |
332 | .timer = &s3c24xx_timer, | 334 | .timer = &s3c24xx_timer, |
diff --git a/arch/arm/mach-s3c64xx/mach-smartq5.c b/arch/arm/mach-s3c64xx/mach-smartq5.c index f1f57bd5ce1..3f42431d4dd 100644 --- a/arch/arm/mach-s3c64xx/mach-smartq5.c +++ b/arch/arm/mach-s3c64xx/mach-smartq5.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/leds.h> | 17 | #include <linux/leds.h> |
18 | #include <linux/platform_device.h> | 18 | #include <linux/platform_device.h> |
19 | 19 | ||
20 | #include <asm/hardware/vic.h> | ||
20 | #include <asm/mach-types.h> | 21 | #include <asm/mach-types.h> |
21 | #include <asm/mach/arch.h> | 22 | #include <asm/mach/arch.h> |
22 | 23 | ||
@@ -148,6 +149,7 @@ MACHINE_START(SMARTQ5, "SmartQ 5") | |||
148 | /* Maintainer: Maurus Cuelenaere <mcuelenaere AT gmail DOT com> */ | 149 | /* Maintainer: Maurus Cuelenaere <mcuelenaere AT gmail DOT com> */ |
149 | .atag_offset = 0x100, | 150 | .atag_offset = 0x100, |
150 | .init_irq = s3c6410_init_irq, | 151 | .init_irq = s3c6410_init_irq, |
152 | .handle_irq = vic_handle_irq, | ||
151 | .map_io = smartq_map_io, | 153 | .map_io = smartq_map_io, |
152 | .init_machine = smartq5_machine_init, | 154 | .init_machine = smartq5_machine_init, |
153 | .timer = &s3c24xx_timer, | 155 | .timer = &s3c24xx_timer, |
diff --git a/arch/arm/mach-s3c64xx/mach-smartq7.c b/arch/arm/mach-s3c64xx/mach-smartq7.c index 63117d84182..e5c09b6db96 100644 --- a/arch/arm/mach-s3c64xx/mach-smartq7.c +++ b/arch/arm/mach-s3c64xx/mach-smartq7.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/leds.h> | 17 | #include <linux/leds.h> |
18 | #include <linux/platform_device.h> | 18 | #include <linux/platform_device.h> |
19 | 19 | ||
20 | #include <asm/hardware/vic.h> | ||
20 | #include <asm/mach-types.h> | 21 | #include <asm/mach-types.h> |
21 | #include <asm/mach/arch.h> | 22 | #include <asm/mach/arch.h> |
22 | 23 | ||
@@ -164,6 +165,7 @@ MACHINE_START(SMARTQ7, "SmartQ 7") | |||
164 | /* Maintainer: Maurus Cuelenaere <mcuelenaere AT gmail DOT com> */ | 165 | /* Maintainer: Maurus Cuelenaere <mcuelenaere AT gmail DOT com> */ |
165 | .atag_offset = 0x100, | 166 | .atag_offset = 0x100, |
166 | .init_irq = s3c6410_init_irq, | 167 | .init_irq = s3c6410_init_irq, |
168 | .handle_irq = vic_handle_irq, | ||
167 | .map_io = smartq_map_io, | 169 | .map_io = smartq_map_io, |
168 | .init_machine = smartq7_machine_init, | 170 | .init_machine = smartq7_machine_init, |
169 | .timer = &s3c24xx_timer, | 171 | .timer = &s3c24xx_timer, |
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6400.c b/arch/arm/mach-s3c64xx/mach-smdk6400.c index 64375d7dda5..5f096534f4c 100644 --- a/arch/arm/mach-s3c64xx/mach-smdk6400.c +++ b/arch/arm/mach-s3c64xx/mach-smdk6400.c | |||
@@ -22,6 +22,7 @@ | |||
22 | 22 | ||
23 | #include <asm/mach-types.h> | 23 | #include <asm/mach-types.h> |
24 | 24 | ||
25 | #include <asm/hardware/vic.h> | ||
25 | #include <asm/mach/arch.h> | 26 | #include <asm/mach/arch.h> |
26 | #include <asm/mach/map.h> | 27 | #include <asm/mach/map.h> |
27 | #include <asm/mach/irq.h> | 28 | #include <asm/mach/irq.h> |
@@ -89,6 +90,7 @@ MACHINE_START(SMDK6400, "SMDK6400") | |||
89 | .atag_offset = 0x100, | 90 | .atag_offset = 0x100, |
90 | 91 | ||
91 | .init_irq = s3c6400_init_irq, | 92 | .init_irq = s3c6400_init_irq, |
93 | .handle_irq = vic_handle_irq, | ||
92 | .map_io = smdk6400_map_io, | 94 | .map_io = smdk6400_map_io, |
93 | .init_machine = smdk6400_machine_init, | 95 | .init_machine = smdk6400_machine_init, |
94 | .timer = &s3c24xx_timer, | 96 | .timer = &s3c24xx_timer, |
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6410.c b/arch/arm/mach-s3c64xx/mach-smdk6410.c index f239b0a53a6..ca6fc204f0e 100644 --- a/arch/arm/mach-s3c64xx/mach-smdk6410.c +++ b/arch/arm/mach-s3c64xx/mach-smdk6410.c | |||
@@ -43,6 +43,7 @@ | |||
43 | 43 | ||
44 | #include <video/platform_lcd.h> | 44 | #include <video/platform_lcd.h> |
45 | 45 | ||
46 | #include <asm/hardware/vic.h> | ||
46 | #include <asm/mach/arch.h> | 47 | #include <asm/mach/arch.h> |
47 | #include <asm/mach/map.h> | 48 | #include <asm/mach/map.h> |
48 | #include <asm/mach/irq.h> | 49 | #include <asm/mach/irq.h> |
@@ -701,6 +702,7 @@ MACHINE_START(SMDK6410, "SMDK6410") | |||
701 | .atag_offset = 0x100, | 702 | .atag_offset = 0x100, |
702 | 703 | ||
703 | .init_irq = s3c6410_init_irq, | 704 | .init_irq = s3c6410_init_irq, |
705 | .handle_irq = vic_handle_irq, | ||
704 | .map_io = smdk6410_map_io, | 706 | .map_io = smdk6410_map_io, |
705 | .init_machine = smdk6410_machine_init, | 707 | .init_machine = smdk6410_machine_init, |
706 | .timer = &s3c24xx_timer, | 708 | .timer = &s3c24xx_timer, |
diff --git a/arch/arm/mach-s5p64x0/include/mach/entry-macro.S b/arch/arm/mach-s5p64x0/include/mach/entry-macro.S index 10b62b4f821..fbb246d0a3d 100644 --- a/arch/arm/mach-s5p64x0/include/mach/entry-macro.S +++ b/arch/arm/mach-s5p64x0/include/mach/entry-macro.S | |||
@@ -10,7 +10,8 @@ | |||
10 | * published by the Free Software Foundation. | 10 | * published by the Free Software Foundation. |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <mach/map.h> | 13 | .macro disable_fiq |
14 | #include <plat/irqs.h> | 14 | .endm |
15 | 15 | ||
16 | #include <asm/entry-macro-vic2.S> | 16 | .macro arch_ret_to_user, tmp1, tmp2 |
17 | .endm | ||
diff --git a/arch/arm/mach-s5p64x0/include/mach/vmalloc.h b/arch/arm/mach-s5p64x0/include/mach/vmalloc.h deleted file mode 100644 index 38dcc71a03c..00000000000 --- a/arch/arm/mach-s5p64x0/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5p64x0/include/mach/vmalloc.h | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | ||
5 | * | ||
6 | * Copyright 2010 Ben Dooks <ben-linux@fluff.org> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | * | ||
12 | * S3C6400 vmalloc definition | ||
13 | */ | ||
14 | |||
15 | #ifndef __ASM_ARCH_VMALLOC_H | ||
16 | #define __ASM_ARCH_VMALLOC_H | ||
17 | |||
18 | #define VMALLOC_END 0xF6000000UL | ||
19 | |||
20 | #endif /* __ASM_ARCH_VMALLOC_H */ | ||
diff --git a/arch/arm/mach-s5p64x0/mach-smdk6440.c b/arch/arm/mach-s5p64x0/mach-smdk6440.c index 14ace6d282e..34d98a1dae5 100644 --- a/arch/arm/mach-s5p64x0/mach-smdk6440.c +++ b/arch/arm/mach-s5p64x0/mach-smdk6440.c | |||
@@ -27,6 +27,7 @@ | |||
27 | 27 | ||
28 | #include <video/platform_lcd.h> | 28 | #include <video/platform_lcd.h> |
29 | 29 | ||
30 | #include <asm/hardware/vic.h> | ||
30 | #include <asm/mach/arch.h> | 31 | #include <asm/mach/arch.h> |
31 | #include <asm/mach/map.h> | 32 | #include <asm/mach/map.h> |
32 | #include <asm/irq.h> | 33 | #include <asm/irq.h> |
@@ -243,6 +244,7 @@ MACHINE_START(SMDK6440, "SMDK6440") | |||
243 | .atag_offset = 0x100, | 244 | .atag_offset = 0x100, |
244 | 245 | ||
245 | .init_irq = s5p6440_init_irq, | 246 | .init_irq = s5p6440_init_irq, |
247 | .handle_irq = vic_handle_irq, | ||
246 | .map_io = smdk6440_map_io, | 248 | .map_io = smdk6440_map_io, |
247 | .init_machine = smdk6440_machine_init, | 249 | .init_machine = smdk6440_machine_init, |
248 | .timer = &s5p_timer, | 250 | .timer = &s5p_timer, |
diff --git a/arch/arm/mach-s5p64x0/mach-smdk6450.c b/arch/arm/mach-s5p64x0/mach-smdk6450.c index 924478a19b9..135cf5d8473 100644 --- a/arch/arm/mach-s5p64x0/mach-smdk6450.c +++ b/arch/arm/mach-s5p64x0/mach-smdk6450.c | |||
@@ -27,6 +27,7 @@ | |||
27 | 27 | ||
28 | #include <video/platform_lcd.h> | 28 | #include <video/platform_lcd.h> |
29 | 29 | ||
30 | #include <asm/hardware/vic.h> | ||
30 | #include <asm/mach/arch.h> | 31 | #include <asm/mach/arch.h> |
31 | #include <asm/mach/map.h> | 32 | #include <asm/mach/map.h> |
32 | #include <asm/irq.h> | 33 | #include <asm/irq.h> |
@@ -263,6 +264,7 @@ MACHINE_START(SMDK6450, "SMDK6450") | |||
263 | .atag_offset = 0x100, | 264 | .atag_offset = 0x100, |
264 | 265 | ||
265 | .init_irq = s5p6450_init_irq, | 266 | .init_irq = s5p6450_init_irq, |
267 | .handle_irq = vic_handle_irq, | ||
266 | .map_io = smdk6450_map_io, | 268 | .map_io = smdk6450_map_io, |
267 | .init_machine = smdk6450_machine_init, | 269 | .init_machine = smdk6450_machine_init, |
268 | .timer = &s5p_timer, | 270 | .timer = &s5p_timer, |
diff --git a/arch/arm/mach-s5pc100/include/mach/entry-macro.S b/arch/arm/mach-s5pc100/include/mach/entry-macro.S index ba76af052c8..b8c242edfa2 100644 --- a/arch/arm/mach-s5pc100/include/mach/entry-macro.S +++ b/arch/arm/mach-s5pc100/include/mach/entry-macro.S | |||
@@ -12,39 +12,14 @@ | |||
12 | * warranty of any kind, whether express or implied. | 12 | * warranty of any kind, whether express or implied. |
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <asm/hardware/vic.h> | ||
16 | #include <mach/map.h> | ||
17 | #include <plat/irqs.h> | ||
18 | |||
19 | .macro disable_fiq | 15 | .macro disable_fiq |
20 | .endm | 16 | .endm |
21 | 17 | ||
22 | .macro get_irqnr_preamble, base, tmp | 18 | .macro get_irqnr_preamble, base, tmp |
23 | ldr \base, =VA_VIC0 | ||
24 | .endm | 19 | .endm |
25 | 20 | ||
26 | .macro arch_ret_to_user, tmp1, tmp2 | 21 | .macro arch_ret_to_user, tmp1, tmp2 |
27 | .endm | 22 | .endm |
28 | 23 | ||
29 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | 24 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp |
30 | |||
31 | @ check the vic0 | ||
32 | mov \irqnr, # S5P_IRQ_OFFSET + 31 | ||
33 | ldr \irqstat, [ \base, # VIC_IRQ_STATUS ] | ||
34 | teq \irqstat, #0 | ||
35 | |||
36 | @ otherwise try vic1 | ||
37 | addeq \tmp, \base, #(VA_VIC1 - VA_VIC0) | ||
38 | addeq \irqnr, \irqnr, #32 | ||
39 | ldreq \irqstat, [ \tmp, # VIC_IRQ_STATUS ] | ||
40 | teqeq \irqstat, #0 | ||
41 | |||
42 | @ otherwise try vic2 | ||
43 | addeq \tmp, \base, #(VA_VIC2 - VA_VIC0) | ||
44 | addeq \irqnr, \irqnr, #32 | ||
45 | ldreq \irqstat, [ \tmp, # VIC_IRQ_STATUS ] | ||
46 | teqeq \irqstat, #0 | ||
47 | |||
48 | clzne \irqstat, \irqstat | ||
49 | subne \irqnr, \irqnr, \irqstat | ||
50 | .endm | 25 | .endm |
diff --git a/arch/arm/mach-s5pc100/include/mach/vmalloc.h b/arch/arm/mach-s5pc100/include/mach/vmalloc.h deleted file mode 100644 index 44c8e5726d9..00000000000 --- a/arch/arm/mach-s5pc100/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,17 +0,0 @@ | |||
1 | /* arch/arm/mach-s5pc100/include/mach/vmalloc.h | ||
2 | * | ||
3 | * Copyright 2010 Ben Dooks <ben-linux@fluff.org> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License version 2 as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | * S3C6400 vmalloc definition | ||
10 | */ | ||
11 | |||
12 | #ifndef __ASM_ARCH_VMALLOC_H | ||
13 | #define __ASM_ARCH_VMALLOC_H | ||
14 | |||
15 | #define VMALLOC_END 0xF6000000UL | ||
16 | |||
17 | #endif /* __ASM_ARCH_VMALLOC_H */ | ||
diff --git a/arch/arm/mach-s5pc100/mach-smdkc100.c b/arch/arm/mach-s5pc100/mach-smdkc100.c index ead292ce1e0..674d22992f3 100644 --- a/arch/arm/mach-s5pc100/mach-smdkc100.c +++ b/arch/arm/mach-s5pc100/mach-smdkc100.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/input.h> | 25 | #include <linux/input.h> |
26 | #include <linux/pwm_backlight.h> | 26 | #include <linux/pwm_backlight.h> |
27 | 27 | ||
28 | #include <asm/hardware/vic.h> | ||
28 | #include <asm/mach/arch.h> | 29 | #include <asm/mach/arch.h> |
29 | #include <asm/mach/map.h> | 30 | #include <asm/mach/map.h> |
30 | 31 | ||
@@ -251,6 +252,7 @@ MACHINE_START(SMDKC100, "SMDKC100") | |||
251 | /* Maintainer: Byungho Min <bhmin@samsung.com> */ | 252 | /* Maintainer: Byungho Min <bhmin@samsung.com> */ |
252 | .atag_offset = 0x100, | 253 | .atag_offset = 0x100, |
253 | .init_irq = s5pc100_init_irq, | 254 | .init_irq = s5pc100_init_irq, |
255 | .handle_irq = vic_handle_irq, | ||
254 | .map_io = smdkc100_map_io, | 256 | .map_io = smdkc100_map_io, |
255 | .init_machine = smdkc100_machine_init, | 257 | .init_machine = smdkc100_machine_init, |
256 | .timer = &s3c24xx_timer, | 258 | .timer = &s3c24xx_timer, |
diff --git a/arch/arm/mach-s5pv210/include/mach/entry-macro.S b/arch/arm/mach-s5pv210/include/mach/entry-macro.S index 3aa41ac59f0..bebca1b5d0b 100644 --- a/arch/arm/mach-s5pv210/include/mach/entry-macro.S +++ b/arch/arm/mach-s5pv210/include/mach/entry-macro.S | |||
@@ -10,45 +10,8 @@ | |||
10 | * published by the Free Software Foundation. | 10 | * published by the Free Software Foundation. |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <asm/hardware/vic.h> | ||
14 | #include <mach/map.h> | ||
15 | #include <plat/irqs.h> | ||
16 | |||
17 | .macro disable_fiq | 13 | .macro disable_fiq |
18 | .endm | 14 | .endm |
19 | 15 | ||
20 | .macro get_irqnr_preamble, base, tmp | ||
21 | ldr \base, =VA_VIC0 | ||
22 | .endm | ||
23 | |||
24 | .macro arch_ret_to_user, tmp1, tmp2 | 16 | .macro arch_ret_to_user, tmp1, tmp2 |
25 | .endm | 17 | .endm |
26 | |||
27 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
28 | |||
29 | @ check the vic0 | ||
30 | mov \irqnr, # S5P_IRQ_OFFSET + 31 | ||
31 | ldr \irqstat, [ \base, # VIC_IRQ_STATUS ] | ||
32 | teq \irqstat, #0 | ||
33 | |||
34 | @ otherwise try vic1 | ||
35 | addeq \tmp, \base, #(VA_VIC1 - VA_VIC0) | ||
36 | addeq \irqnr, \irqnr, #32 | ||
37 | ldreq \irqstat, [ \tmp, # VIC_IRQ_STATUS ] | ||
38 | teqeq \irqstat, #0 | ||
39 | |||
40 | @ otherwise try vic2 | ||
41 | addeq \tmp, \base, #(VA_VIC2 - VA_VIC0) | ||
42 | addeq \irqnr, \irqnr, #32 | ||
43 | ldreq \irqstat, [ \tmp, # VIC_IRQ_STATUS ] | ||
44 | teqeq \irqstat, #0 | ||
45 | |||
46 | @ otherwise try vic3 | ||
47 | addeq \tmp, \base, #(VA_VIC3 - VA_VIC0) | ||
48 | addeq \irqnr, \irqnr, #32 | ||
49 | ldreq \irqstat, [ \tmp, # VIC_IRQ_STATUS ] | ||
50 | teqeq \irqstat, #0 | ||
51 | |||
52 | clzne \irqstat, \irqstat | ||
53 | subne \irqnr, \irqnr, \irqstat | ||
54 | .endm | ||
diff --git a/arch/arm/mach-s5pv210/include/mach/vmalloc.h b/arch/arm/mach-s5pv210/include/mach/vmalloc.h deleted file mode 100644 index a6c659d68a5..00000000000 --- a/arch/arm/mach-s5pv210/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,22 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5p6442/include/mach/vmalloc.h | ||
2 | * | ||
3 | * Copyright 2010 Ben Dooks <ben-linux@fluff.org> | ||
4 | * | ||
5 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
6 | * http://www.samsung.com/ | ||
7 | * | ||
8 | * Based on arch/arm/mach-s5p6442/include/mach/vmalloc.h | ||
9 | * | ||
10 | * S5PV210 vmalloc definition | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or modify | ||
13 | * it under the terms of the GNU General Public License version 2 as | ||
14 | * published by the Free Software Foundation. | ||
15 | */ | ||
16 | |||
17 | #ifndef __ASM_ARCH_VMALLOC_H | ||
18 | #define __ASM_ARCH_VMALLOC_H __FILE__ | ||
19 | |||
20 | #define VMALLOC_END 0xF6000000UL | ||
21 | |||
22 | #endif /* __ASM_ARCH_VMALLOC_H */ | ||
diff --git a/arch/arm/mach-s5pv210/mach-aquila.c b/arch/arm/mach-s5pv210/mach-aquila.c index edc52968315..6f7dfe993c1 100644 --- a/arch/arm/mach-s5pv210/mach-aquila.c +++ b/arch/arm/mach-s5pv210/mach-aquila.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/input.h> | 22 | #include <linux/input.h> |
23 | #include <linux/gpio.h> | 23 | #include <linux/gpio.h> |
24 | 24 | ||
25 | #include <asm/hardware/vic.h> | ||
25 | #include <asm/mach/arch.h> | 26 | #include <asm/mach/arch.h> |
26 | #include <asm/mach/map.h> | 27 | #include <asm/mach/map.h> |
27 | #include <asm/setup.h> | 28 | #include <asm/setup.h> |
@@ -681,6 +682,7 @@ MACHINE_START(AQUILA, "Aquila") | |||
681 | Kyungmin Park <kyungmin.park@samsung.com> */ | 682 | Kyungmin Park <kyungmin.park@samsung.com> */ |
682 | .atag_offset = 0x100, | 683 | .atag_offset = 0x100, |
683 | .init_irq = s5pv210_init_irq, | 684 | .init_irq = s5pv210_init_irq, |
685 | .handle_irq = vic_handle_irq, | ||
684 | .map_io = aquila_map_io, | 686 | .map_io = aquila_map_io, |
685 | .init_machine = aquila_machine_init, | 687 | .init_machine = aquila_machine_init, |
686 | .timer = &s5p_timer, | 688 | .timer = &s5p_timer, |
diff --git a/arch/arm/mach-s5pv210/mach-goni.c b/arch/arm/mach-s5pv210/mach-goni.c index b5a1dc3ed9c..12c69371739 100644 --- a/arch/arm/mach-s5pv210/mach-goni.c +++ b/arch/arm/mach-s5pv210/mach-goni.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/gpio.h> | 27 | #include <linux/gpio.h> |
28 | #include <linux/interrupt.h> | 28 | #include <linux/interrupt.h> |
29 | 29 | ||
30 | #include <asm/hardware/vic.h> | ||
30 | #include <asm/mach/arch.h> | 31 | #include <asm/mach/arch.h> |
31 | #include <asm/mach/map.h> | 32 | #include <asm/mach/map.h> |
32 | #include <asm/setup.h> | 33 | #include <asm/setup.h> |
@@ -957,6 +958,7 @@ MACHINE_START(GONI, "GONI") | |||
957 | /* Maintainers: Kyungmin Park <kyungmin.park@samsung.com> */ | 958 | /* Maintainers: Kyungmin Park <kyungmin.park@samsung.com> */ |
958 | .atag_offset = 0x100, | 959 | .atag_offset = 0x100, |
959 | .init_irq = s5pv210_init_irq, | 960 | .init_irq = s5pv210_init_irq, |
961 | .handle_irq = vic_handle_irq, | ||
960 | .map_io = goni_map_io, | 962 | .map_io = goni_map_io, |
961 | .init_machine = goni_machine_init, | 963 | .init_machine = goni_machine_init, |
962 | .timer = &s5p_timer, | 964 | .timer = &s5p_timer, |
diff --git a/arch/arm/mach-s5pv210/mach-smdkc110.c b/arch/arm/mach-s5pv210/mach-smdkc110.c index 553319f70e5..9405da4ae3a 100644 --- a/arch/arm/mach-s5pv210/mach-smdkc110.c +++ b/arch/arm/mach-s5pv210/mach-smdkc110.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/i2c.h> | 15 | #include <linux/i2c.h> |
16 | #include <linux/sysdev.h> | 16 | #include <linux/sysdev.h> |
17 | 17 | ||
18 | #include <asm/hardware/vic.h> | ||
18 | #include <asm/mach/arch.h> | 19 | #include <asm/mach/arch.h> |
19 | #include <asm/mach/map.h> | 20 | #include <asm/mach/map.h> |
20 | #include <asm/setup.h> | 21 | #include <asm/setup.h> |
@@ -139,6 +140,7 @@ MACHINE_START(SMDKC110, "SMDKC110") | |||
139 | /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */ | 140 | /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */ |
140 | .atag_offset = 0x100, | 141 | .atag_offset = 0x100, |
141 | .init_irq = s5pv210_init_irq, | 142 | .init_irq = s5pv210_init_irq, |
143 | .handle_irq = vic_handle_irq, | ||
142 | .map_io = smdkc110_map_io, | 144 | .map_io = smdkc110_map_io, |
143 | .init_machine = smdkc110_machine_init, | 145 | .init_machine = smdkc110_machine_init, |
144 | .timer = &s5p_timer, | 146 | .timer = &s5p_timer, |
diff --git a/arch/arm/mach-s5pv210/mach-smdkv210.c b/arch/arm/mach-s5pv210/mach-smdkv210.c index 9c6de570431..cf4da739382 100644 --- a/arch/arm/mach-s5pv210/mach-smdkv210.c +++ b/arch/arm/mach-s5pv210/mach-smdkv210.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/delay.h> | 20 | #include <linux/delay.h> |
21 | #include <linux/pwm_backlight.h> | 21 | #include <linux/pwm_backlight.h> |
22 | 22 | ||
23 | #include <asm/hardware/vic.h> | ||
23 | #include <asm/mach/arch.h> | 24 | #include <asm/mach/arch.h> |
24 | #include <asm/mach/map.h> | 25 | #include <asm/mach/map.h> |
25 | #include <asm/setup.h> | 26 | #include <asm/setup.h> |
@@ -317,6 +318,7 @@ MACHINE_START(SMDKV210, "SMDKV210") | |||
317 | /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */ | 318 | /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */ |
318 | .atag_offset = 0x100, | 319 | .atag_offset = 0x100, |
319 | .init_irq = s5pv210_init_irq, | 320 | .init_irq = s5pv210_init_irq, |
321 | .handle_irq = vic_handle_irq, | ||
320 | .map_io = smdkv210_map_io, | 322 | .map_io = smdkv210_map_io, |
321 | .init_machine = smdkv210_machine_init, | 323 | .init_machine = smdkv210_machine_init, |
322 | .timer = &s5p_timer, | 324 | .timer = &s5p_timer, |
diff --git a/arch/arm/mach-s5pv210/mach-torbreck.c b/arch/arm/mach-s5pv210/mach-torbreck.c index db6409a3abd..74e99bc0dc9 100644 --- a/arch/arm/mach-s5pv210/mach-torbreck.c +++ b/arch/arm/mach-s5pv210/mach-torbreck.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/serial_core.h> | 15 | #include <linux/serial_core.h> |
16 | 16 | ||
17 | #include <asm/hardware/vic.h> | ||
17 | #include <asm/mach/arch.h> | 18 | #include <asm/mach/arch.h> |
18 | #include <asm/mach/map.h> | 19 | #include <asm/mach/map.h> |
19 | #include <asm/setup.h> | 20 | #include <asm/setup.h> |
@@ -128,6 +129,7 @@ MACHINE_START(TORBRECK, "TORBRECK") | |||
128 | /* Maintainer: Hyunchul Ko <ghcstop@gmail.com> */ | 129 | /* Maintainer: Hyunchul Ko <ghcstop@gmail.com> */ |
129 | .atag_offset = 0x100, | 130 | .atag_offset = 0x100, |
130 | .init_irq = s5pv210_init_irq, | 131 | .init_irq = s5pv210_init_irq, |
132 | .handle_irq = vic_handle_irq, | ||
131 | .map_io = torbreck_map_io, | 133 | .map_io = torbreck_map_io, |
132 | .init_machine = torbreck_machine_init, | 134 | .init_machine = torbreck_machine_init, |
133 | .timer = &s5p_timer, | 135 | .timer = &s5p_timer, |
diff --git a/arch/arm/mach-sa1100/include/mach/vmalloc.h b/arch/arm/mach-sa1100/include/mach/vmalloc.h deleted file mode 100644 index b3d00239848..00000000000 --- a/arch/arm/mach-sa1100/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,4 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-sa1100/include/mach/vmalloc.h | ||
3 | */ | ||
4 | #define VMALLOC_END (0xe8000000UL) | ||
diff --git a/arch/arm/mach-sa1100/nanoengine.c b/arch/arm/mach-sa1100/nanoengine.c index ed77f85b995..85f6ee67222 100644 --- a/arch/arm/mach-sa1100/nanoengine.c +++ b/arch/arm/mach-sa1100/nanoengine.c | |||
@@ -19,6 +19,7 @@ | |||
19 | 19 | ||
20 | #include <asm/mach-types.h> | 20 | #include <asm/mach-types.h> |
21 | #include <asm/setup.h> | 21 | #include <asm/setup.h> |
22 | #include <asm/page.h> | ||
22 | 23 | ||
23 | #include <asm/mach/arch.h> | 24 | #include <asm/mach/arch.h> |
24 | #include <asm/mach/flash.h> | 25 | #include <asm/mach/flash.h> |
diff --git a/arch/arm/mach-sa1100/time.c b/arch/arm/mach-sa1100/time.c index fa6602491d5..69e33535dee 100644 --- a/arch/arm/mach-sa1100/time.c +++ b/arch/arm/mach-sa1100/time.c | |||
@@ -12,7 +12,6 @@ | |||
12 | #include <linux/errno.h> | 12 | #include <linux/errno.h> |
13 | #include <linux/interrupt.h> | 13 | #include <linux/interrupt.h> |
14 | #include <linux/irq.h> | 14 | #include <linux/irq.h> |
15 | #include <linux/sched.h> /* just for sched_clock() - funny that */ | ||
16 | #include <linux/timex.h> | 15 | #include <linux/timex.h> |
17 | #include <linux/clockchips.h> | 16 | #include <linux/clockchips.h> |
18 | 17 | ||
@@ -20,29 +19,9 @@ | |||
20 | #include <asm/sched_clock.h> | 19 | #include <asm/sched_clock.h> |
21 | #include <mach/hardware.h> | 20 | #include <mach/hardware.h> |
22 | 21 | ||
23 | /* | 22 | static u32 notrace sa1100_read_sched_clock(void) |
24 | * This is the SA11x0 sched_clock implementation. | ||
25 | */ | ||
26 | static DEFINE_CLOCK_DATA(cd); | ||
27 | |||
28 | /* | ||
29 | * Constants generated by clocks_calc_mult_shift(m, s, 3.6864MHz, | ||
30 | * NSEC_PER_SEC, 60). | ||
31 | * This gives a resolution of about 271ns and a wrap period of about 19min. | ||
32 | */ | ||
33 | #define SC_MULT 2275555556u | ||
34 | #define SC_SHIFT 23 | ||
35 | |||
36 | unsigned long long notrace sched_clock(void) | ||
37 | { | ||
38 | u32 cyc = OSCR; | ||
39 | return cyc_to_fixed_sched_clock(&cd, cyc, (u32)~0, SC_MULT, SC_SHIFT); | ||
40 | } | ||
41 | |||
42 | static void notrace sa1100_update_sched_clock(void) | ||
43 | { | 23 | { |
44 | u32 cyc = OSCR; | 24 | return OSCR; |
45 | update_sched_clock(&cd, cyc, (u32)~0); | ||
46 | } | 25 | } |
47 | 26 | ||
48 | #define MIN_OSCR_DELTA 2 | 27 | #define MIN_OSCR_DELTA 2 |
@@ -109,8 +88,7 @@ static void __init sa1100_timer_init(void) | |||
109 | OIER = 0; | 88 | OIER = 0; |
110 | OSSR = OSSR_M0 | OSSR_M1 | OSSR_M2 | OSSR_M3; | 89 | OSSR = OSSR_M0 | OSSR_M1 | OSSR_M2 | OSSR_M3; |
111 | 90 | ||
112 | init_fixed_sched_clock(&cd, sa1100_update_sched_clock, 32, | 91 | setup_sched_clock(sa1100_read_sched_clock, 32, 3686400); |
113 | 3686400, SC_MULT, SC_SHIFT); | ||
114 | 92 | ||
115 | clockevents_calc_mult_shift(&ckevt_sa1100_osmr0, 3686400, 4); | 93 | clockevents_calc_mult_shift(&ckevt_sa1100_osmr0, 3686400, 4); |
116 | ckevt_sa1100_osmr0.max_delta_ns = | 94 | ckevt_sa1100_osmr0.max_delta_ns = |
diff --git a/arch/arm/mach-shark/include/mach/vmalloc.h b/arch/arm/mach-shark/include/mach/vmalloc.h deleted file mode 100644 index b10df988526..00000000000 --- a/arch/arm/mach-shark/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,4 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-shark/include/mach/vmalloc.h | ||
3 | */ | ||
4 | #define VMALLOC_END 0xd0000000UL | ||
diff --git a/arch/arm/mach-shmobile/Makefile b/arch/arm/mach-shmobile/Makefile index 737bdc631b0..5ca1f9d6699 100644 --- a/arch/arm/mach-shmobile/Makefile +++ b/arch/arm/mach-shmobile/Makefile | |||
@@ -28,7 +28,6 @@ pfc-$(CONFIG_ARCH_SH73A0) += pfc-sh73a0.o | |||
28 | obj-$(CONFIG_ARCH_SH7367) += entry-intc.o | 28 | obj-$(CONFIG_ARCH_SH7367) += entry-intc.o |
29 | obj-$(CONFIG_ARCH_SH7377) += entry-intc.o | 29 | obj-$(CONFIG_ARCH_SH7377) += entry-intc.o |
30 | obj-$(CONFIG_ARCH_SH7372) += entry-intc.o | 30 | obj-$(CONFIG_ARCH_SH7372) += entry-intc.o |
31 | obj-$(CONFIG_ARCH_SH73A0) += entry-gic.o | ||
32 | 31 | ||
33 | # PM objects | 32 | # PM objects |
34 | obj-$(CONFIG_SUSPEND) += suspend.o | 33 | obj-$(CONFIG_SUSPEND) += suspend.o |
diff --git a/arch/arm/mach-shmobile/board-ag5evm.c b/arch/arm/mach-shmobile/board-ag5evm.c index 7119b87cbfa..a4e6ca04e31 100644 --- a/arch/arm/mach-shmobile/board-ag5evm.c +++ b/arch/arm/mach-shmobile/board-ag5evm.c | |||
@@ -466,8 +466,6 @@ static struct map_desc ag5evm_io_desc[] __initdata = { | |||
466 | static void __init ag5evm_map_io(void) | 466 | static void __init ag5evm_map_io(void) |
467 | { | 467 | { |
468 | iotable_init(ag5evm_io_desc, ARRAY_SIZE(ag5evm_io_desc)); | 468 | iotable_init(ag5evm_io_desc, ARRAY_SIZE(ag5evm_io_desc)); |
469 | /* DMA memory at 0xf6000000 - 0xffdfffff */ | ||
470 | init_consistent_dma_size(158 << 20); | ||
471 | 469 | ||
472 | /* setup early devices and console here as well */ | 470 | /* setup early devices and console here as well */ |
473 | sh73a0_add_early_devices(); | 471 | sh73a0_add_early_devices(); |
@@ -609,7 +607,7 @@ MACHINE_START(AG5EVM, "ag5evm") | |||
609 | .map_io = ag5evm_map_io, | 607 | .map_io = ag5evm_map_io, |
610 | .nr_irqs = NR_IRQS_LEGACY, | 608 | .nr_irqs = NR_IRQS_LEGACY, |
611 | .init_irq = sh73a0_init_irq, | 609 | .init_irq = sh73a0_init_irq, |
612 | .handle_irq = shmobile_handle_irq_gic, | 610 | .handle_irq = gic_handle_irq, |
613 | .init_machine = ag5evm_init, | 611 | .init_machine = ag5evm_init, |
614 | .timer = &ag5evm_timer, | 612 | .timer = &ag5evm_timer, |
615 | MACHINE_END | 613 | MACHINE_END |
diff --git a/arch/arm/mach-shmobile/board-ap4evb.c b/arch/arm/mach-shmobile/board-ap4evb.c index 4c865ece9ac..6a6f9f7568c 100644 --- a/arch/arm/mach-shmobile/board-ap4evb.c +++ b/arch/arm/mach-shmobile/board-ap4evb.c | |||
@@ -1172,8 +1172,6 @@ static struct map_desc ap4evb_io_desc[] __initdata = { | |||
1172 | static void __init ap4evb_map_io(void) | 1172 | static void __init ap4evb_map_io(void) |
1173 | { | 1173 | { |
1174 | iotable_init(ap4evb_io_desc, ARRAY_SIZE(ap4evb_io_desc)); | 1174 | iotable_init(ap4evb_io_desc, ARRAY_SIZE(ap4evb_io_desc)); |
1175 | /* DMA memory at 0xf6000000 - 0xffdfffff */ | ||
1176 | init_consistent_dma_size(158 << 20); | ||
1177 | 1175 | ||
1178 | /* setup early devices and console here as well */ | 1176 | /* setup early devices and console here as well */ |
1179 | sh7372_add_early_devices(); | 1177 | sh7372_add_early_devices(); |
diff --git a/arch/arm/mach-shmobile/board-g3evm.c b/arch/arm/mach-shmobile/board-g3evm.c index 8b620bf0622..72d557281b1 100644 --- a/arch/arm/mach-shmobile/board-g3evm.c +++ b/arch/arm/mach-shmobile/board-g3evm.c | |||
@@ -261,8 +261,6 @@ static struct map_desc g3evm_io_desc[] __initdata = { | |||
261 | static void __init g3evm_map_io(void) | 261 | static void __init g3evm_map_io(void) |
262 | { | 262 | { |
263 | iotable_init(g3evm_io_desc, ARRAY_SIZE(g3evm_io_desc)); | 263 | iotable_init(g3evm_io_desc, ARRAY_SIZE(g3evm_io_desc)); |
264 | /* DMA memory at 0xf6000000 - 0xffdfffff */ | ||
265 | init_consistent_dma_size(158 << 20); | ||
266 | 264 | ||
267 | /* setup early devices and console here as well */ | 265 | /* setup early devices and console here as well */ |
268 | sh7367_add_early_devices(); | 266 | sh7367_add_early_devices(); |
diff --git a/arch/arm/mach-shmobile/board-g4evm.c b/arch/arm/mach-shmobile/board-g4evm.c index 7719ddc5f59..2220b885cff 100644 --- a/arch/arm/mach-shmobile/board-g4evm.c +++ b/arch/arm/mach-shmobile/board-g4evm.c | |||
@@ -275,8 +275,6 @@ static struct map_desc g4evm_io_desc[] __initdata = { | |||
275 | static void __init g4evm_map_io(void) | 275 | static void __init g4evm_map_io(void) |
276 | { | 276 | { |
277 | iotable_init(g4evm_io_desc, ARRAY_SIZE(g4evm_io_desc)); | 277 | iotable_init(g4evm_io_desc, ARRAY_SIZE(g4evm_io_desc)); |
278 | /* DMA memory at 0xf6000000 - 0xffdfffff */ | ||
279 | init_consistent_dma_size(158 << 20); | ||
280 | 278 | ||
281 | /* setup early devices and console here as well */ | 279 | /* setup early devices and console here as well */ |
282 | sh7377_add_early_devices(); | 280 | sh7377_add_early_devices(); |
diff --git a/arch/arm/mach-shmobile/board-kota2.c b/arch/arm/mach-shmobile/board-kota2.c index f44150b5ae4..857ceeec1bb 100644 --- a/arch/arm/mach-shmobile/board-kota2.c +++ b/arch/arm/mach-shmobile/board-kota2.c | |||
@@ -551,7 +551,7 @@ MACHINE_START(KOTA2, "kota2") | |||
551 | .map_io = kota2_map_io, | 551 | .map_io = kota2_map_io, |
552 | .nr_irqs = NR_IRQS_LEGACY, | 552 | .nr_irqs = NR_IRQS_LEGACY, |
553 | .init_irq = sh73a0_init_irq, | 553 | .init_irq = sh73a0_init_irq, |
554 | .handle_irq = shmobile_handle_irq_gic, | 554 | .handle_irq = gic_handle_irq, |
555 | .init_machine = kota2_init, | 555 | .init_machine = kota2_init, |
556 | .timer = &kota2_timer, | 556 | .timer = &kota2_timer, |
557 | MACHINE_END | 557 | MACHINE_END |
diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c index 9c5e598e0e3..ed525668739 100644 --- a/arch/arm/mach-shmobile/board-mackerel.c +++ b/arch/arm/mach-shmobile/board-mackerel.c | |||
@@ -1390,8 +1390,6 @@ static struct map_desc mackerel_io_desc[] __initdata = { | |||
1390 | static void __init mackerel_map_io(void) | 1390 | static void __init mackerel_map_io(void) |
1391 | { | 1391 | { |
1392 | iotable_init(mackerel_io_desc, ARRAY_SIZE(mackerel_io_desc)); | 1392 | iotable_init(mackerel_io_desc, ARRAY_SIZE(mackerel_io_desc)); |
1393 | /* DMA memory at 0xf6000000 - 0xffdfffff */ | ||
1394 | init_consistent_dma_size(158 << 20); | ||
1395 | 1393 | ||
1396 | /* setup early devices and console here as well */ | 1394 | /* setup early devices and console here as well */ |
1397 | sh7372_add_early_devices(); | 1395 | sh7372_add_early_devices(); |
diff --git a/arch/arm/mach-shmobile/entry-gic.S b/arch/arm/mach-shmobile/entry-gic.S deleted file mode 100644 index e20239b08c8..00000000000 --- a/arch/arm/mach-shmobile/entry-gic.S +++ /dev/null | |||
@@ -1,18 +0,0 @@ | |||
1 | /* | ||
2 | * ARM Interrupt demux handler using GIC | ||
3 | * | ||
4 | * Copyright (C) 2010 Magnus Damm | ||
5 | * Copyright (C) 2011 Paul Mundt | ||
6 | * Copyright (C) 2010 - 2011 Renesas Solutions Corp. | ||
7 | * | ||
8 | * This file is licensed under the terms of the GNU General Public | ||
9 | * License version 2. This program is licensed "as is" without any | ||
10 | * warranty of any kind, whether express or implied. | ||
11 | */ | ||
12 | |||
13 | #include <asm/assembler.h> | ||
14 | #include <asm/entry-macro-multi.S> | ||
15 | #include <asm/hardware/gic.h> | ||
16 | #include <asm/hardware/entry-macro-gic.S> | ||
17 | |||
18 | arch_irq_handler shmobile_handle_irq_gic | ||
diff --git a/arch/arm/mach-shmobile/include/mach/common.h b/arch/arm/mach-shmobile/include/mach/common.h index 834bd6cd508..4bf82c15677 100644 --- a/arch/arm/mach-shmobile/include/mach/common.h +++ b/arch/arm/mach-shmobile/include/mach/common.h | |||
@@ -7,7 +7,6 @@ extern void shmobile_secondary_vector(void); | |||
7 | struct clk; | 7 | struct clk; |
8 | extern int clk_init(void); | 8 | extern int clk_init(void); |
9 | extern void shmobile_handle_irq_intc(struct pt_regs *); | 9 | extern void shmobile_handle_irq_intc(struct pt_regs *); |
10 | extern void shmobile_handle_irq_gic(struct pt_regs *); | ||
11 | extern struct platform_suspend_ops shmobile_suspend_ops; | 10 | extern struct platform_suspend_ops shmobile_suspend_ops; |
12 | struct cpuidle_driver; | 11 | struct cpuidle_driver; |
13 | extern void (*shmobile_cpuidle_modes[])(void); | 12 | extern void (*shmobile_cpuidle_modes[])(void); |
diff --git a/arch/arm/mach-shmobile/include/mach/entry-macro.S b/arch/arm/mach-shmobile/include/mach/entry-macro.S index 8d4a416d428..2a57b2964ee 100644 --- a/arch/arm/mach-shmobile/include/mach/entry-macro.S +++ b/arch/arm/mach-shmobile/include/mach/entry-macro.S | |||
@@ -18,14 +18,5 @@ | |||
18 | .macro disable_fiq | 18 | .macro disable_fiq |
19 | .endm | 19 | .endm |
20 | 20 | ||
21 | .macro get_irqnr_preamble, base, tmp | ||
22 | .endm | ||
23 | |||
24 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
25 | .endm | ||
26 | |||
27 | .macro test_for_ipi, irqnr, irqstat, base, tmp | ||
28 | .endm | ||
29 | |||
30 | .macro arch_ret_to_user, tmp1, tmp2 | 21 | .macro arch_ret_to_user, tmp1, tmp2 |
31 | .endm | 22 | .endm |
diff --git a/arch/arm/mach-shmobile/include/mach/gpio.h b/arch/arm/mach-shmobile/include/mach/gpio.h index 7bf0890e16b..de795b42232 100644 --- a/arch/arm/mach-shmobile/include/mach/gpio.h +++ b/arch/arm/mach-shmobile/include/mach/gpio.h | |||
@@ -12,8 +12,6 @@ | |||
12 | 12 | ||
13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
14 | #include <linux/errno.h> | 14 | #include <linux/errno.h> |
15 | |||
16 | #define ARCH_NR_GPIOS 1024 | ||
17 | #include <linux/sh_pfc.h> | 15 | #include <linux/sh_pfc.h> |
18 | 16 | ||
19 | #ifdef CONFIG_GPIOLIB | 17 | #ifdef CONFIG_GPIOLIB |
diff --git a/arch/arm/mach-shmobile/include/mach/vmalloc.h b/arch/arm/mach-shmobile/include/mach/vmalloc.h deleted file mode 100644 index 2b8fd8b942f..00000000000 --- a/arch/arm/mach-shmobile/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,7 +0,0 @@ | |||
1 | #ifndef __ASM_MACH_VMALLOC_H | ||
2 | #define __ASM_MACH_VMALLOC_H | ||
3 | |||
4 | /* Vmalloc at ... - 0xe5ffffff */ | ||
5 | #define VMALLOC_END 0xe6000000UL | ||
6 | |||
7 | #endif /* __ASM_MACH_VMALLOC_H */ | ||
diff --git a/arch/arm/mach-spear3xx/include/mach/entry-macro.S b/arch/arm/mach-spear3xx/include/mach/entry-macro.S index 53da4224ba3..de3bb41c8e9 100644 --- a/arch/arm/mach-spear3xx/include/mach/entry-macro.S +++ b/arch/arm/mach-spear3xx/include/mach/entry-macro.S | |||
@@ -11,35 +11,8 @@ | |||
11 | * warranty of any kind, whether express or implied. | 11 | * warranty of any kind, whether express or implied. |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <asm/hardware/vic.h> | ||
15 | #include <mach/hardware.h> | ||
16 | |||
17 | .macro disable_fiq | 14 | .macro disable_fiq |
18 | .endm | 15 | .endm |
19 | 16 | ||
20 | .macro get_irqnr_preamble, base, tmp | ||
21 | .endm | ||
22 | |||
23 | .macro arch_ret_to_user, tmp1, tmp2 | 17 | .macro arch_ret_to_user, tmp1, tmp2 |
24 | .endm | 18 | .endm |
25 | |||
26 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
27 | ldr \base, =VA_SPEAR3XX_ML1_VIC_BASE | ||
28 | ldr \irqstat, [\base, #VIC_IRQ_STATUS] @ get status | ||
29 | teq \irqstat, #0 | ||
30 | beq 1001f @ this will set/reset | ||
31 | @ zero register | ||
32 | /* | ||
33 | * Following code will find bit position of least significang | ||
34 | * bit set in irqstat, using following equation | ||
35 | * least significant bit set in n = (n & ~(n-1)) | ||
36 | */ | ||
37 | sub \tmp, \irqstat, #1 @ tmp = irqstat - 1 | ||
38 | mvn \tmp, \tmp @ tmp = ~tmp | ||
39 | and \irqstat, \irqstat, \tmp @ irqstat &= tmp | ||
40 | /* Now, irqstat is = bit no. of 1st bit set in vic irq status */ | ||
41 | clz \tmp, \irqstat @ tmp = leading zeros | ||
42 | rsb \irqnr, \tmp, #0x1F @ irqnr = 32 - tmp - 1 | ||
43 | |||
44 | 1001: /* EQ will be set if no irqs pending */ | ||
45 | .endm | ||
diff --git a/arch/arm/mach-spear3xx/include/mach/vmalloc.h b/arch/arm/mach-spear3xx/include/mach/vmalloc.h deleted file mode 100644 index df977b3c9a6..00000000000 --- a/arch/arm/mach-spear3xx/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,19 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-spear3xx/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Defining Vmalloc area for SPEAr3xx machine family | ||
5 | * | ||
6 | * Copyright (C) 2009 ST Microelectronics | ||
7 | * Viresh Kumar<viresh.kumar@st.com> | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | #ifndef __MACH_VMALLOC_H | ||
15 | #define __MACH_VMALLOC_H | ||
16 | |||
17 | #include <plat/vmalloc.h> | ||
18 | |||
19 | #endif /* __MACH_VMALLOC_H */ | ||
diff --git a/arch/arm/mach-spear3xx/spear300_evb.c b/arch/arm/mach-spear3xx/spear300_evb.c index 8b429f05b61..3462ab9d612 100644 --- a/arch/arm/mach-spear3xx/spear300_evb.c +++ b/arch/arm/mach-spear3xx/spear300_evb.c | |||
@@ -11,6 +11,7 @@ | |||
11 | * warranty of any kind, whether express or implied. | 11 | * warranty of any kind, whether express or implied. |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <asm/hardware/vic.h> | ||
14 | #include <asm/mach/arch.h> | 15 | #include <asm/mach/arch.h> |
15 | #include <asm/mach-types.h> | 16 | #include <asm/mach-types.h> |
16 | #include <mach/generic.h> | 17 | #include <mach/generic.h> |
@@ -67,6 +68,7 @@ MACHINE_START(SPEAR300, "ST-SPEAR300-EVB") | |||
67 | .atag_offset = 0x100, | 68 | .atag_offset = 0x100, |
68 | .map_io = spear3xx_map_io, | 69 | .map_io = spear3xx_map_io, |
69 | .init_irq = spear3xx_init_irq, | 70 | .init_irq = spear3xx_init_irq, |
71 | .handle_irq = vic_handle_irq, | ||
70 | .timer = &spear3xx_timer, | 72 | .timer = &spear3xx_timer, |
71 | .init_machine = spear300_evb_init, | 73 | .init_machine = spear300_evb_init, |
72 | .restart = spear_restart, | 74 | .restart = spear_restart, |
diff --git a/arch/arm/mach-spear3xx/spear310_evb.c b/arch/arm/mach-spear3xx/spear310_evb.c index a11d6ead0ae..f92c4993f65 100644 --- a/arch/arm/mach-spear3xx/spear310_evb.c +++ b/arch/arm/mach-spear3xx/spear310_evb.c | |||
@@ -11,6 +11,7 @@ | |||
11 | * warranty of any kind, whether express or implied. | 11 | * warranty of any kind, whether express or implied. |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <asm/hardware/vic.h> | ||
14 | #include <asm/mach/arch.h> | 15 | #include <asm/mach/arch.h> |
15 | #include <asm/mach-types.h> | 16 | #include <asm/mach-types.h> |
16 | #include <mach/generic.h> | 17 | #include <mach/generic.h> |
@@ -73,6 +74,7 @@ MACHINE_START(SPEAR310, "ST-SPEAR310-EVB") | |||
73 | .atag_offset = 0x100, | 74 | .atag_offset = 0x100, |
74 | .map_io = spear3xx_map_io, | 75 | .map_io = spear3xx_map_io, |
75 | .init_irq = spear3xx_init_irq, | 76 | .init_irq = spear3xx_init_irq, |
77 | .handle_irq = vic_handle_irq, | ||
76 | .timer = &spear3xx_timer, | 78 | .timer = &spear3xx_timer, |
77 | .init_machine = spear310_evb_init, | 79 | .init_machine = spear310_evb_init, |
78 | .restart = spear_restart, | 80 | .restart = spear_restart, |
diff --git a/arch/arm/mach-spear3xx/spear320_evb.c b/arch/arm/mach-spear3xx/spear320_evb.c index 4239a70686c..105334ab702 100644 --- a/arch/arm/mach-spear3xx/spear320_evb.c +++ b/arch/arm/mach-spear3xx/spear320_evb.c | |||
@@ -11,6 +11,7 @@ | |||
11 | * warranty of any kind, whether express or implied. | 11 | * warranty of any kind, whether express or implied. |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <asm/hardware/vic.h> | ||
14 | #include <asm/mach/arch.h> | 15 | #include <asm/mach/arch.h> |
15 | #include <asm/mach-types.h> | 16 | #include <asm/mach-types.h> |
16 | #include <mach/generic.h> | 17 | #include <mach/generic.h> |
@@ -71,6 +72,7 @@ MACHINE_START(SPEAR320, "ST-SPEAR320-EVB") | |||
71 | .atag_offset = 0x100, | 72 | .atag_offset = 0x100, |
72 | .map_io = spear3xx_map_io, | 73 | .map_io = spear3xx_map_io, |
73 | .init_irq = spear3xx_init_irq, | 74 | .init_irq = spear3xx_init_irq, |
75 | .handle_irq = vic_handle_irq, | ||
74 | .timer = &spear3xx_timer, | 76 | .timer = &spear3xx_timer, |
75 | .init_machine = spear320_evb_init, | 77 | .init_machine = spear320_evb_init, |
76 | .restart = spear_restart, | 78 | .restart = spear_restart, |
diff --git a/arch/arm/mach-spear6xx/include/mach/entry-macro.S b/arch/arm/mach-spear6xx/include/mach/entry-macro.S index 8a0b0ed7b20..d490a910d92 100644 --- a/arch/arm/mach-spear6xx/include/mach/entry-macro.S +++ b/arch/arm/mach-spear6xx/include/mach/entry-macro.S | |||
@@ -11,44 +11,8 @@ | |||
11 | * warranty of any kind, whether express or implied. | 11 | * warranty of any kind, whether express or implied. |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <asm/hardware/vic.h> | ||
15 | #include <mach/hardware.h> | ||
16 | |||
17 | .macro disable_fiq | 14 | .macro disable_fiq |
18 | .endm | 15 | .endm |
19 | 16 | ||
20 | .macro get_irqnr_preamble, base, tmp | ||
21 | .endm | ||
22 | |||
23 | .macro arch_ret_to_user, tmp1, tmp2 | 17 | .macro arch_ret_to_user, tmp1, tmp2 |
24 | .endm | 18 | .endm |
25 | |||
26 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
27 | ldr \base, =VA_SPEAR6XX_CPU_VIC_PRI_BASE | ||
28 | ldr \irqstat, [\base, #VIC_IRQ_STATUS] @ get status | ||
29 | mov \irqnr, #0 | ||
30 | teq \irqstat, #0 | ||
31 | bne 1001f | ||
32 | ldr \base, =VA_SPEAR6XX_CPU_VIC_SEC_BASE | ||
33 | ldr \irqstat, [\base, #VIC_IRQ_STATUS] @ get status | ||
34 | teq \irqstat, #0 | ||
35 | beq 1002f @ this will set/reset | ||
36 | @ zero register | ||
37 | mov \irqnr, #32 | ||
38 | 1001: | ||
39 | /* | ||
40 | * Following code will find bit position of least significang | ||
41 | * bit set in irqstat, using following equation | ||
42 | * least significant bit set in n = (n & ~(n-1)) | ||
43 | */ | ||
44 | sub \tmp, \irqstat, #1 @ tmp = irqstat - 1 | ||
45 | mvn \tmp, \tmp @ tmp = ~tmp | ||
46 | and \irqstat, \irqstat, \tmp @ irqstat &= tmp | ||
47 | /* Now, irqstat is = bit no. of 1st bit set in vic irq status */ | ||
48 | clz \tmp, \irqstat @ tmp = leading zeros | ||
49 | |||
50 | rsb \tmp, \tmp, #0x1F @ tmp = 32 - tmp - 1 | ||
51 | add \irqnr, \irqnr, \tmp | ||
52 | |||
53 | 1002: /* EQ will be set if no irqs pending */ | ||
54 | .endm | ||
diff --git a/arch/arm/mach-spear6xx/include/mach/vmalloc.h b/arch/arm/mach-spear6xx/include/mach/vmalloc.h deleted file mode 100644 index 4a0b56cb2a9..00000000000 --- a/arch/arm/mach-spear6xx/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,19 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-spear6xx/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Defining Vmalloc area for SPEAr6xx machine family | ||
5 | * | ||
6 | * Copyright (C) 2009 ST Microelectronics | ||
7 | * Rajeev Kumar<rajeev-dlh.kumar@st.com> | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | #ifndef __MACH_VMALLOC_H | ||
15 | #define __MACH_VMALLOC_H | ||
16 | |||
17 | #include <plat/vmalloc.h> | ||
18 | |||
19 | #endif /* __MACH_VMALLOC_H */ | ||
diff --git a/arch/arm/mach-spear6xx/spear600_evb.c b/arch/arm/mach-spear6xx/spear600_evb.c index 0a16559ba26..c6e4254741c 100644 --- a/arch/arm/mach-spear6xx/spear600_evb.c +++ b/arch/arm/mach-spear6xx/spear600_evb.c | |||
@@ -11,6 +11,7 @@ | |||
11 | * warranty of any kind, whether express or implied. | 11 | * warranty of any kind, whether express or implied. |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <asm/hardware/vic.h> | ||
14 | #include <asm/mach/arch.h> | 15 | #include <asm/mach/arch.h> |
15 | #include <asm/mach-types.h> | 16 | #include <asm/mach-types.h> |
16 | #include <mach/generic.h> | 17 | #include <mach/generic.h> |
@@ -46,6 +47,7 @@ MACHINE_START(SPEAR600, "ST-SPEAR600-EVB") | |||
46 | .atag_offset = 0x100, | 47 | .atag_offset = 0x100, |
47 | .map_io = spear6xx_map_io, | 48 | .map_io = spear6xx_map_io, |
48 | .init_irq = spear6xx_init_irq, | 49 | .init_irq = spear6xx_init_irq, |
50 | .handle_irq = vic_handle_irq, | ||
49 | .timer = &spear6xx_timer, | 51 | .timer = &spear6xx_timer, |
50 | .init_machine = spear600_evb_init, | 52 | .init_machine = spear600_evb_init, |
51 | .restart = spear_restart, | 53 | .restart = spear_restart, |
diff --git a/arch/arm/mach-tegra/board-dt.c b/arch/arm/mach-tegra/board-dt.c index aaaa17c9d21..e417a8383db 100644 --- a/arch/arm/mach-tegra/board-dt.c +++ b/arch/arm/mach-tegra/board-dt.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <linux/i2c.h> | 32 | #include <linux/i2c.h> |
33 | #include <linux/i2c-tegra.h> | 33 | #include <linux/i2c-tegra.h> |
34 | 34 | ||
35 | #include <asm/hardware/gic.h> | ||
35 | #include <asm/mach-types.h> | 36 | #include <asm/mach-types.h> |
36 | #include <asm/mach/arch.h> | 37 | #include <asm/mach/arch.h> |
37 | #include <asm/mach/time.h> | 38 | #include <asm/mach/time.h> |
@@ -130,6 +131,7 @@ DT_MACHINE_START(TEGRA_DT, "nVidia Tegra (Flattened Device Tree)") | |||
130 | .map_io = tegra_map_common_io, | 131 | .map_io = tegra_map_common_io, |
131 | .init_early = tegra_init_early, | 132 | .init_early = tegra_init_early, |
132 | .init_irq = tegra_init_irq, | 133 | .init_irq = tegra_init_irq, |
134 | .handle_irq = gic_handle_irq, | ||
133 | .timer = &tegra_timer, | 135 | .timer = &tegra_timer, |
134 | .init_machine = tegra_dt_init, | 136 | .init_machine = tegra_dt_init, |
135 | .restart = tegra_assert_system_reset, | 137 | .restart = tegra_assert_system_reset, |
diff --git a/arch/arm/mach-tegra/board-harmony.c b/arch/arm/mach-tegra/board-harmony.c index 7eaa52de756..70ee674131f 100644 --- a/arch/arm/mach-tegra/board-harmony.c +++ b/arch/arm/mach-tegra/board-harmony.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <asm/mach-types.h> | 31 | #include <asm/mach-types.h> |
32 | #include <asm/mach/arch.h> | 32 | #include <asm/mach/arch.h> |
33 | #include <asm/mach/time.h> | 33 | #include <asm/mach/time.h> |
34 | #include <asm/hardware/gic.h> | ||
34 | #include <asm/setup.h> | 35 | #include <asm/setup.h> |
35 | 36 | ||
36 | #include <mach/tegra_wm8903_pdata.h> | 37 | #include <mach/tegra_wm8903_pdata.h> |
@@ -187,6 +188,7 @@ MACHINE_START(HARMONY, "harmony") | |||
187 | .map_io = tegra_map_common_io, | 188 | .map_io = tegra_map_common_io, |
188 | .init_early = tegra_init_early, | 189 | .init_early = tegra_init_early, |
189 | .init_irq = tegra_init_irq, | 190 | .init_irq = tegra_init_irq, |
191 | .handle_irq = gic_handle_irq, | ||
190 | .timer = &tegra_timer, | 192 | .timer = &tegra_timer, |
191 | .init_machine = tegra_harmony_init, | 193 | .init_machine = tegra_harmony_init, |
192 | .restart = tegra_assert_system_reset, | 194 | .restart = tegra_assert_system_reset, |
diff --git a/arch/arm/mach-tegra/board-paz00.c b/arch/arm/mach-tegra/board-paz00.c index 28c97e31740..33d6205ad30 100644 --- a/arch/arm/mach-tegra/board-paz00.c +++ b/arch/arm/mach-tegra/board-paz00.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/gpio.h> | 29 | #include <linux/gpio.h> |
30 | #include <linux/rfkill-gpio.h> | 30 | #include <linux/rfkill-gpio.h> |
31 | 31 | ||
32 | #include <asm/hardware/gic.h> | ||
32 | #include <asm/mach-types.h> | 33 | #include <asm/mach-types.h> |
33 | #include <asm/mach/arch.h> | 34 | #include <asm/mach/arch.h> |
34 | #include <asm/mach/time.h> | 35 | #include <asm/mach/time.h> |
@@ -190,6 +191,7 @@ MACHINE_START(PAZ00, "Toshiba AC100 / Dynabook AZ") | |||
190 | .map_io = tegra_map_common_io, | 191 | .map_io = tegra_map_common_io, |
191 | .init_early = tegra_init_early, | 192 | .init_early = tegra_init_early, |
192 | .init_irq = tegra_init_irq, | 193 | .init_irq = tegra_init_irq, |
194 | .handle_irq = gic_handle_irq, | ||
193 | .timer = &tegra_timer, | 195 | .timer = &tegra_timer, |
194 | .init_machine = tegra_paz00_init, | 196 | .init_machine = tegra_paz00_init, |
195 | .restart = tegra_assert_system_reset, | 197 | .restart = tegra_assert_system_reset, |
diff --git a/arch/arm/mach-tegra/board-seaboard.c b/arch/arm/mach-tegra/board-seaboard.c index 9b2eca1f528..c1599eb8e0c 100644 --- a/arch/arm/mach-tegra/board-seaboard.c +++ b/arch/arm/mach-tegra/board-seaboard.c | |||
@@ -34,6 +34,7 @@ | |||
34 | 34 | ||
35 | #include <asm/mach-types.h> | 35 | #include <asm/mach-types.h> |
36 | #include <asm/mach/arch.h> | 36 | #include <asm/mach/arch.h> |
37 | #include <asm/hardware/gic.h> | ||
37 | 38 | ||
38 | #include "board.h" | 39 | #include "board.h" |
39 | #include "board-seaboard.h" | 40 | #include "board-seaboard.h" |
@@ -284,6 +285,7 @@ MACHINE_START(SEABOARD, "seaboard") | |||
284 | .map_io = tegra_map_common_io, | 285 | .map_io = tegra_map_common_io, |
285 | .init_early = tegra_init_early, | 286 | .init_early = tegra_init_early, |
286 | .init_irq = tegra_init_irq, | 287 | .init_irq = tegra_init_irq, |
288 | .handle_irq = gic_handle_irq, | ||
287 | .timer = &tegra_timer, | 289 | .timer = &tegra_timer, |
288 | .init_machine = tegra_seaboard_init, | 290 | .init_machine = tegra_seaboard_init, |
289 | .restart = tegra_assert_system_reset, | 291 | .restart = tegra_assert_system_reset, |
@@ -294,6 +296,7 @@ MACHINE_START(KAEN, "kaen") | |||
294 | .map_io = tegra_map_common_io, | 296 | .map_io = tegra_map_common_io, |
295 | .init_early = tegra_init_early, | 297 | .init_early = tegra_init_early, |
296 | .init_irq = tegra_init_irq, | 298 | .init_irq = tegra_init_irq, |
299 | .handle_irq = gic_handle_irq, | ||
297 | .timer = &tegra_timer, | 300 | .timer = &tegra_timer, |
298 | .init_machine = tegra_kaen_init, | 301 | .init_machine = tegra_kaen_init, |
299 | .restart = tegra_assert_system_reset, | 302 | .restart = tegra_assert_system_reset, |
@@ -304,6 +307,7 @@ MACHINE_START(WARIO, "wario") | |||
304 | .map_io = tegra_map_common_io, | 307 | .map_io = tegra_map_common_io, |
305 | .init_early = tegra_init_early, | 308 | .init_early = tegra_init_early, |
306 | .init_irq = tegra_init_irq, | 309 | .init_irq = tegra_init_irq, |
310 | .handle_irq = gic_handle_irq, | ||
307 | .timer = &tegra_timer, | 311 | .timer = &tegra_timer, |
308 | .init_machine = tegra_wario_init, | 312 | .init_machine = tegra_wario_init, |
309 | .restart = tegra_assert_system_reset, | 313 | .restart = tegra_assert_system_reset, |
diff --git a/arch/arm/mach-tegra/board-trimslice.c b/arch/arm/mach-tegra/board-trimslice.c index 1fa9e48e8ec..c242314a1db 100644 --- a/arch/arm/mach-tegra/board-trimslice.c +++ b/arch/arm/mach-tegra/board-trimslice.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/i2c.h> | 26 | #include <linux/i2c.h> |
27 | #include <linux/gpio.h> | 27 | #include <linux/gpio.h> |
28 | 28 | ||
29 | #include <asm/hardware/gic.h> | ||
29 | #include <asm/mach-types.h> | 30 | #include <asm/mach-types.h> |
30 | #include <asm/mach/arch.h> | 31 | #include <asm/mach/arch.h> |
31 | #include <asm/setup.h> | 32 | #include <asm/setup.h> |
@@ -176,6 +177,7 @@ MACHINE_START(TRIMSLICE, "trimslice") | |||
176 | .map_io = tegra_map_common_io, | 177 | .map_io = tegra_map_common_io, |
177 | .init_early = tegra_init_early, | 178 | .init_early = tegra_init_early, |
178 | .init_irq = tegra_init_irq, | 179 | .init_irq = tegra_init_irq, |
180 | .handle_irq = gic_handle_irq, | ||
179 | .timer = &tegra_timer, | 181 | .timer = &tegra_timer, |
180 | .init_machine = tegra_trimslice_init, | 182 | .init_machine = tegra_trimslice_init, |
181 | .restart = tegra_assert_system_reset, | 183 | .restart = tegra_assert_system_reset, |
diff --git a/arch/arm/mach-tegra/include/mach/entry-macro.S b/arch/arm/mach-tegra/include/mach/entry-macro.S index dd165c53889..ac11262149c 100644 --- a/arch/arm/mach-tegra/include/mach/entry-macro.S +++ b/arch/arm/mach-tegra/include/mach/entry-macro.S | |||
@@ -12,30 +12,15 @@ | |||
12 | * GNU General Public License for more details. | 12 | * GNU General Public License for more details. |
13 | * | 13 | * |
14 | */ | 14 | */ |
15 | #include <mach/iomap.h> | ||
16 | #include <mach/io.h> | ||
17 | |||
18 | #if defined(CONFIG_ARM_GIC) | ||
19 | #define HAVE_GET_IRQNR_PREAMBLE | ||
20 | #include <asm/hardware/entry-macro-gic.S> | ||
21 | |||
22 | /* Uses the GIC interrupt controller built into the cpu */ | ||
23 | #define ICTRL_BASE (IO_CPU_VIRT + 0x100) | ||
24 | 15 | ||
25 | .macro disable_fiq | 16 | .macro disable_fiq |
26 | .endm | 17 | .endm |
27 | 18 | ||
28 | .macro get_irqnr_preamble, base, tmp | 19 | .macro arch_ret_to_user, tmp1, tmp2 |
29 | movw \base, #(ICTRL_BASE & 0x0000ffff) | ||
30 | movt \base, #((ICTRL_BASE & 0xffff0000) >> 16) | ||
31 | .endm | 20 | .endm |
32 | 21 | ||
33 | .macro arch_ret_to_user, tmp1, tmp2 | 22 | #if !defined(CONFIG_ARM_GIC) |
34 | .endm | ||
35 | #else | ||
36 | /* legacy interrupt controller for AP16 */ | 23 | /* legacy interrupt controller for AP16 */ |
37 | .macro disable_fiq | ||
38 | .endm | ||
39 | 24 | ||
40 | .macro get_irqnr_preamble, base, tmp | 25 | .macro get_irqnr_preamble, base, tmp |
41 | @ enable imprecise aborts | 26 | @ enable imprecise aborts |
@@ -46,9 +31,6 @@ | |||
46 | orr \base, #0x0000f000 | 31 | orr \base, #0x0000f000 |
47 | .endm | 32 | .endm |
48 | 33 | ||
49 | .macro arch_ret_to_user, tmp1, tmp2 | ||
50 | .endm | ||
51 | |||
52 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | 34 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp |
53 | ldr \irqnr, [\base, #0x20] @ EVT_IRQ_STS | 35 | ldr \irqnr, [\base, #0x20] @ EVT_IRQ_STS |
54 | cmp \irqnr, #0x80 | 36 | cmp \irqnr, #0x80 |
diff --git a/arch/arm/mach-tegra/include/mach/io.h b/arch/arm/mach-tegra/include/mach/io.h index 35a011fbc42..f15defffb5d 100644 --- a/arch/arm/mach-tegra/include/mach/io.h +++ b/arch/arm/mach-tegra/include/mach/io.h | |||
@@ -71,12 +71,6 @@ | |||
71 | 71 | ||
72 | #ifndef __ASSEMBLER__ | 72 | #ifndef __ASSEMBLER__ |
73 | 73 | ||
74 | #define __arch_ioremap tegra_ioremap | ||
75 | #define __arch_iounmap tegra_iounmap | ||
76 | |||
77 | void __iomem *tegra_ioremap(unsigned long phys, size_t size, unsigned int type); | ||
78 | void tegra_iounmap(volatile void __iomem *addr); | ||
79 | |||
80 | #define IO_ADDRESS(n) (IO_TO_VIRT(n)) | 74 | #define IO_ADDRESS(n) (IO_TO_VIRT(n)) |
81 | 75 | ||
82 | #ifdef CONFIG_TEGRA_PCI | 76 | #ifdef CONFIG_TEGRA_PCI |
diff --git a/arch/arm/mach-tegra/include/mach/vmalloc.h b/arch/arm/mach-tegra/include/mach/vmalloc.h deleted file mode 100644 index fd6aa65b2dc..00000000000 --- a/arch/arm/mach-tegra/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,28 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-tegra/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 2010 Google, Inc. | ||
5 | * | ||
6 | * Author: | ||
7 | * Colin Cross <ccross@google.com> | ||
8 | * Erik Gilling <konkers@google.com> | ||
9 | * | ||
10 | * This software is licensed under the terms of the GNU General Public | ||
11 | * License version 2, as published by the Free Software Foundation, and | ||
12 | * may be copied, distributed, and modified under those terms. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, | ||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | * GNU General Public License for more details. | ||
18 | * | ||
19 | */ | ||
20 | |||
21 | #ifndef __MACH_TEGRA_VMALLOC_H | ||
22 | #define __MACH_TEGRA_VMALLOC_H | ||
23 | |||
24 | #include <asm/sizes.h> | ||
25 | |||
26 | #define VMALLOC_END 0xFE000000UL | ||
27 | |||
28 | #endif | ||
diff --git a/arch/arm/mach-tegra/io.c b/arch/arm/mach-tegra/io.c index 5489f8b5d6a..d23ee2db282 100644 --- a/arch/arm/mach-tegra/io.c +++ b/arch/arm/mach-tegra/io.c | |||
@@ -60,24 +60,3 @@ void __init tegra_map_common_io(void) | |||
60 | { | 60 | { |
61 | iotable_init(tegra_io_desc, ARRAY_SIZE(tegra_io_desc)); | 61 | iotable_init(tegra_io_desc, ARRAY_SIZE(tegra_io_desc)); |
62 | } | 62 | } |
63 | |||
64 | /* | ||
65 | * Intercept ioremap() requests for addresses in our fixed mapping regions. | ||
66 | */ | ||
67 | void __iomem *tegra_ioremap(unsigned long p, size_t size, unsigned int type) | ||
68 | { | ||
69 | void __iomem *v = IO_ADDRESS(p); | ||
70 | if (v == NULL) | ||
71 | v = __arm_ioremap(p, size, type); | ||
72 | return v; | ||
73 | } | ||
74 | EXPORT_SYMBOL(tegra_ioremap); | ||
75 | |||
76 | void tegra_iounmap(volatile void __iomem *addr) | ||
77 | { | ||
78 | unsigned long virt = (unsigned long)addr; | ||
79 | |||
80 | if (virt >= VMALLOC_START && virt < VMALLOC_END) | ||
81 | __iounmap(addr); | ||
82 | } | ||
83 | EXPORT_SYMBOL(tegra_iounmap); | ||
diff --git a/arch/arm/mach-tegra/timer.c b/arch/arm/mach-tegra/timer.c index e2272d263a8..732c724008b 100644 --- a/arch/arm/mach-tegra/timer.c +++ b/arch/arm/mach-tegra/timer.c | |||
@@ -19,7 +19,6 @@ | |||
19 | 19 | ||
20 | #include <linux/init.h> | 20 | #include <linux/init.h> |
21 | #include <linux/err.h> | 21 | #include <linux/err.h> |
22 | #include <linux/sched.h> | ||
23 | #include <linux/time.h> | 22 | #include <linux/time.h> |
24 | #include <linux/interrupt.h> | 23 | #include <linux/interrupt.h> |
25 | #include <linux/irq.h> | 24 | #include <linux/irq.h> |
@@ -106,25 +105,9 @@ static struct clock_event_device tegra_clockevent = { | |||
106 | .set_mode = tegra_timer_set_mode, | 105 | .set_mode = tegra_timer_set_mode, |
107 | }; | 106 | }; |
108 | 107 | ||
109 | static DEFINE_CLOCK_DATA(cd); | 108 | static u32 notrace tegra_read_sched_clock(void) |
110 | |||
111 | /* | ||
112 | * Constants generated by clocks_calc_mult_shift(m, s, 1MHz, NSEC_PER_SEC, 60). | ||
113 | * This gives a resolution of about 1us and a wrap period of about 1h11min. | ||
114 | */ | ||
115 | #define SC_MULT 4194304000u | ||
116 | #define SC_SHIFT 22 | ||
117 | |||
118 | unsigned long long notrace sched_clock(void) | ||
119 | { | ||
120 | u32 cyc = timer_readl(TIMERUS_CNTR_1US); | ||
121 | return cyc_to_fixed_sched_clock(&cd, cyc, (u32)~0, SC_MULT, SC_SHIFT); | ||
122 | } | ||
123 | |||
124 | static void notrace tegra_update_sched_clock(void) | ||
125 | { | 109 | { |
126 | u32 cyc = timer_readl(TIMERUS_CNTR_1US); | 110 | return timer_readl(TIMERUS_CNTR_1US); |
127 | update_sched_clock(&cd, cyc, (u32)~0); | ||
128 | } | 111 | } |
129 | 112 | ||
130 | /* | 113 | /* |
@@ -218,8 +201,7 @@ static void __init tegra_init_timer(void) | |||
218 | WARN(1, "Unknown clock rate"); | 201 | WARN(1, "Unknown clock rate"); |
219 | } | 202 | } |
220 | 203 | ||
221 | init_fixed_sched_clock(&cd, tegra_update_sched_clock, 32, | 204 | setup_sched_clock(tegra_read_sched_clock, 32, 1000000); |
222 | 1000000, SC_MULT, SC_SHIFT); | ||
223 | 205 | ||
224 | if (clocksource_mmio_init(timer_reg_base + TIMERUS_CNTR_1US, | 206 | if (clocksource_mmio_init(timer_reg_base + TIMERUS_CNTR_1US, |
225 | "timer_us", 1000000, 300, 32, clocksource_mmio_readl_up)) { | 207 | "timer_us", 1000000, 300, 32, clocksource_mmio_readl_up)) { |
diff --git a/arch/arm/mach-u300/include/mach/entry-macro.S b/arch/arm/mach-u300/include/mach/entry-macro.S index 20731ae39d3..7181d6ac665 100644 --- a/arch/arm/mach-u300/include/mach/entry-macro.S +++ b/arch/arm/mach-u300/include/mach/entry-macro.S | |||
@@ -8,33 +8,9 @@ | |||
8 | * Low-level IRQ helper macros for ST-Ericsson U300 | 8 | * Low-level IRQ helper macros for ST-Ericsson U300 |
9 | * Author: Linus Walleij <linus.walleij@stericsson.com> | 9 | * Author: Linus Walleij <linus.walleij@stericsson.com> |
10 | */ | 10 | */ |
11 | #include <mach/hardware.h> | ||
12 | #include <asm/hardware/vic.h> | ||
13 | 11 | ||
14 | .macro disable_fiq | 12 | .macro disable_fiq |
15 | .endm | 13 | .endm |
16 | 14 | ||
17 | .macro get_irqnr_preamble, base, tmp | ||
18 | .endm | ||
19 | |||
20 | .macro arch_ret_to_user, tmp1, tmp2 | 15 | .macro arch_ret_to_user, tmp1, tmp2 |
21 | .endm | 16 | .endm |
22 | |||
23 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
24 | ldr \base, = U300_AHB_PER_VIRT_BASE-U300_AHB_PER_PHYS_BASE+U300_INTCON0_BASE | ||
25 | ldr \irqstat, [\base, #VIC_IRQ_STATUS] @ get masked status | ||
26 | mov \irqnr, #0 | ||
27 | teq \irqstat, #0 | ||
28 | bne 1002f | ||
29 | 1001: ldr \base, = U300_AHB_PER_VIRT_BASE-U300_AHB_PER_PHYS_BASE+U300_INTCON1_BASE | ||
30 | ldr \irqstat, [\base, #VIC_IRQ_STATUS] @ get masked status | ||
31 | mov \irqnr, #32 | ||
32 | teq \irqstat, #0 | ||
33 | beq 1003f | ||
34 | 1002: tst \irqstat, #1 | ||
35 | bne 1003f | ||
36 | add \irqnr, \irqnr, #1 | ||
37 | movs \irqstat, \irqstat, lsr #1 | ||
38 | bne 1002b | ||
39 | 1003: /* EQ will be set if no irqs pending */ | ||
40 | .endm | ||
diff --git a/arch/arm/mach-u300/include/mach/vmalloc.h b/arch/arm/mach-u300/include/mach/vmalloc.h deleted file mode 100644 index ec423b92b81..00000000000 --- a/arch/arm/mach-u300/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,12 +0,0 @@ | |||
1 | /* | ||
2 | * | ||
3 | * arch/arm/mach-u300/include/mach/vmalloc.h | ||
4 | * | ||
5 | * | ||
6 | * Copyright (C) 2006-2009 ST-Ericsson AB | ||
7 | * License terms: GNU General Public License (GPL) version 2 | ||
8 | * Virtual memory allocations | ||
9 | * End must be above the I/O registers and on an even 2MiB boundary. | ||
10 | * Author: Linus Walleij <linus.walleij@stericsson.com> | ||
11 | */ | ||
12 | #define VMALLOC_END 0xfe800000UL | ||
diff --git a/arch/arm/mach-u300/timer.c b/arch/arm/mach-u300/timer.c index 5f51bdeef0e..bc1c7897e82 100644 --- a/arch/arm/mach-u300/timer.c +++ b/arch/arm/mach-u300/timer.c | |||
@@ -9,7 +9,6 @@ | |||
9 | * Author: Linus Walleij <linus.walleij@stericsson.com> | 9 | * Author: Linus Walleij <linus.walleij@stericsson.com> |
10 | */ | 10 | */ |
11 | #include <linux/interrupt.h> | 11 | #include <linux/interrupt.h> |
12 | #include <linux/sched.h> | ||
13 | #include <linux/time.h> | 12 | #include <linux/time.h> |
14 | #include <linux/timex.h> | 13 | #include <linux/timex.h> |
15 | #include <linux/clockchips.h> | 14 | #include <linux/clockchips.h> |
@@ -337,18 +336,10 @@ static struct irqaction u300_timer_irq = { | |||
337 | * this wraps around for now, since it is just a relative time | 336 | * this wraps around for now, since it is just a relative time |
338 | * stamp. (Inspired by OMAP implementation.) | 337 | * stamp. (Inspired by OMAP implementation.) |
339 | */ | 338 | */ |
340 | static DEFINE_CLOCK_DATA(cd); | ||
341 | 339 | ||
342 | unsigned long long notrace sched_clock(void) | 340 | static u32 notrace u300_read_sched_clock(void) |
343 | { | 341 | { |
344 | u32 cyc = readl(U300_TIMER_APP_VBASE + U300_TIMER_APP_GPT2CC); | 342 | return readl(U300_TIMER_APP_VBASE + U300_TIMER_APP_GPT2CC); |
345 | return cyc_to_sched_clock(&cd, cyc, (u32)~0); | ||
346 | } | ||
347 | |||
348 | static void notrace u300_update_sched_clock(void) | ||
349 | { | ||
350 | u32 cyc = readl(U300_TIMER_APP_VBASE + U300_TIMER_APP_GPT2CC); | ||
351 | update_sched_clock(&cd, cyc, (u32)~0); | ||
352 | } | 343 | } |
353 | 344 | ||
354 | 345 | ||
@@ -366,7 +357,7 @@ static void __init u300_timer_init(void) | |||
366 | clk_enable(clk); | 357 | clk_enable(clk); |
367 | rate = clk_get_rate(clk); | 358 | rate = clk_get_rate(clk); |
368 | 359 | ||
369 | init_sched_clock(&cd, u300_update_sched_clock, 32, rate); | 360 | setup_sched_clock(u300_read_sched_clock, 32, rate); |
370 | 361 | ||
371 | /* | 362 | /* |
372 | * Disable the "OS" and "DD" timers - these are designed for Symbian! | 363 | * Disable the "OS" and "DD" timers - these are designed for Symbian! |
diff --git a/arch/arm/mach-u300/u300.c b/arch/arm/mach-u300/u300.c index a75c9b83974..def45bda293 100644 --- a/arch/arm/mach-u300/u300.c +++ b/arch/arm/mach-u300/u300.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/io.h> | 19 | #include <linux/io.h> |
20 | #include <mach/hardware.h> | 20 | #include <mach/hardware.h> |
21 | #include <mach/platform.h> | 21 | #include <mach/platform.h> |
22 | #include <asm/hardware/vic.h> | ||
22 | #include <asm/mach-types.h> | 23 | #include <asm/mach-types.h> |
23 | #include <asm/mach/arch.h> | 24 | #include <asm/mach/arch.h> |
24 | #include <asm/memory.h> | 25 | #include <asm/memory.h> |
@@ -49,6 +50,7 @@ MACHINE_START(U300, MACH_U300_STRING) | |||
49 | .atag_offset = BOOT_PARAMS_OFFSET, | 50 | .atag_offset = BOOT_PARAMS_OFFSET, |
50 | .map_io = u300_map_io, | 51 | .map_io = u300_map_io, |
51 | .init_irq = u300_init_irq, | 52 | .init_irq = u300_init_irq, |
53 | .handle_irq = vic_handle_irq, | ||
52 | .timer = &u300_timer, | 54 | .timer = &u300_timer, |
53 | .init_machine = u300_init_machine, | 55 | .init_machine = u300_init_machine, |
54 | .restart = u300_restart, | 56 | .restart = u300_restart, |
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index bdd7b80dd7a..de1f5f8f733 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/leds.h> | 33 | #include <linux/leds.h> |
34 | #include <asm/mach-types.h> | 34 | #include <asm/mach-types.h> |
35 | #include <asm/mach/arch.h> | 35 | #include <asm/mach/arch.h> |
36 | #include <asm/hardware/gic.h> | ||
36 | 37 | ||
37 | #include <plat/i2c.h> | 38 | #include <plat/i2c.h> |
38 | #include <plat/ste_dma40.h> | 39 | #include <plat/ste_dma40.h> |
@@ -695,6 +696,7 @@ MACHINE_START(U8500, "ST-Ericsson MOP500 platform") | |||
695 | .init_irq = ux500_init_irq, | 696 | .init_irq = ux500_init_irq, |
696 | /* we re-use nomadik timer here */ | 697 | /* we re-use nomadik timer here */ |
697 | .timer = &ux500_timer, | 698 | .timer = &ux500_timer, |
699 | .handle_irq = gic_handle_irq, | ||
698 | .init_machine = mop500_init_machine, | 700 | .init_machine = mop500_init_machine, |
699 | MACHINE_END | 701 | MACHINE_END |
700 | 702 | ||
@@ -703,6 +705,7 @@ MACHINE_START(HREFV60, "ST-Ericsson U8500 Platform HREFv60+") | |||
703 | .map_io = u8500_map_io, | 705 | .map_io = u8500_map_io, |
704 | .init_irq = ux500_init_irq, | 706 | .init_irq = ux500_init_irq, |
705 | .timer = &ux500_timer, | 707 | .timer = &ux500_timer, |
708 | .handle_irq = gic_handle_irq, | ||
706 | .init_machine = hrefv60_init_machine, | 709 | .init_machine = hrefv60_init_machine, |
707 | MACHINE_END | 710 | MACHINE_END |
708 | 711 | ||
@@ -712,5 +715,6 @@ MACHINE_START(SNOWBALL, "Calao Systems Snowball platform") | |||
712 | .init_irq = ux500_init_irq, | 715 | .init_irq = ux500_init_irq, |
713 | /* we re-use nomadik timer here */ | 716 | /* we re-use nomadik timer here */ |
714 | .timer = &ux500_timer, | 717 | .timer = &ux500_timer, |
718 | .handle_irq = gic_handle_irq, | ||
715 | .init_machine = snowball_init_machine, | 719 | .init_machine = snowball_init_machine, |
716 | MACHINE_END | 720 | MACHINE_END |
diff --git a/arch/arm/mach-ux500/board-u5500.c b/arch/arm/mach-ux500/board-u5500.c index 82025ba70c0..fe1569b67c9 100644 --- a/arch/arm/mach-ux500/board-u5500.c +++ b/arch/arm/mach-ux500/board-u5500.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/i2c.h> | 12 | #include <linux/i2c.h> |
13 | #include <linux/mfd/ab5500/ab5500.h> | 13 | #include <linux/mfd/ab5500/ab5500.h> |
14 | 14 | ||
15 | #include <asm/hardware/gic.h> | ||
15 | #include <asm/mach/arch.h> | 16 | #include <asm/mach/arch.h> |
16 | #include <asm/mach-types.h> | 17 | #include <asm/mach-types.h> |
17 | 18 | ||
@@ -149,5 +150,6 @@ MACHINE_START(U5500, "ST-Ericsson U5500 Platform") | |||
149 | .map_io = u5500_map_io, | 150 | .map_io = u5500_map_io, |
150 | .init_irq = ux500_init_irq, | 151 | .init_irq = ux500_init_irq, |
151 | .timer = &ux500_timer, | 152 | .timer = &ux500_timer, |
153 | .handle_irq = gic_handle_irq, | ||
152 | .init_machine = u5500_init_machine, | 154 | .init_machine = u5500_init_machine, |
153 | MACHINE_END | 155 | MACHINE_END |
diff --git a/arch/arm/mach-ux500/cpu-db5500.c b/arch/arm/mach-ux500/cpu-db5500.c index 9de1af00809..5323286b265 100644 --- a/arch/arm/mach-ux500/cpu-db5500.c +++ b/arch/arm/mach-ux500/cpu-db5500.c | |||
@@ -30,12 +30,11 @@ static struct map_desc u5500_uart_io_desc[] __initdata = { | |||
30 | }; | 30 | }; |
31 | 31 | ||
32 | static struct map_desc u5500_io_desc[] __initdata = { | 32 | static struct map_desc u5500_io_desc[] __initdata = { |
33 | __IO_DEV_DESC(U5500_GIC_CPU_BASE, SZ_4K), | 33 | /* SCU base also covers GIC CPU BASE and TWD with its 4K page */ |
34 | __IO_DEV_DESC(U5500_SCU_BASE, SZ_4K), | ||
34 | __IO_DEV_DESC(U5500_GIC_DIST_BASE, SZ_4K), | 35 | __IO_DEV_DESC(U5500_GIC_DIST_BASE, SZ_4K), |
35 | __IO_DEV_DESC(U5500_L2CC_BASE, SZ_4K), | 36 | __IO_DEV_DESC(U5500_L2CC_BASE, SZ_4K), |
36 | __IO_DEV_DESC(U5500_TWD_BASE, SZ_4K), | ||
37 | __IO_DEV_DESC(U5500_MTU0_BASE, SZ_4K), | 37 | __IO_DEV_DESC(U5500_MTU0_BASE, SZ_4K), |
38 | __IO_DEV_DESC(U5500_SCU_BASE, SZ_4K), | ||
39 | __IO_DEV_DESC(U5500_BACKUPRAM0_BASE, SZ_8K), | 38 | __IO_DEV_DESC(U5500_BACKUPRAM0_BASE, SZ_8K), |
40 | 39 | ||
41 | __IO_DEV_DESC(U5500_GPIO0_BASE, SZ_4K), | 40 | __IO_DEV_DESC(U5500_GPIO0_BASE, SZ_4K), |
diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c index 13e8890a8b8..7f2729c05db 100644 --- a/arch/arm/mach-ux500/cpu-db8500.c +++ b/arch/arm/mach-ux500/cpu-db8500.c | |||
@@ -35,12 +35,11 @@ static struct map_desc u8500_uart_io_desc[] __initdata = { | |||
35 | }; | 35 | }; |
36 | 36 | ||
37 | static struct map_desc u8500_io_desc[] __initdata = { | 37 | static struct map_desc u8500_io_desc[] __initdata = { |
38 | __IO_DEV_DESC(U8500_GIC_CPU_BASE, SZ_4K), | 38 | /* SCU base also covers GIC CPU BASE and TWD with its 4K page */ |
39 | __IO_DEV_DESC(U8500_SCU_BASE, SZ_4K), | ||
39 | __IO_DEV_DESC(U8500_GIC_DIST_BASE, SZ_4K), | 40 | __IO_DEV_DESC(U8500_GIC_DIST_BASE, SZ_4K), |
40 | __IO_DEV_DESC(U8500_L2CC_BASE, SZ_4K), | 41 | __IO_DEV_DESC(U8500_L2CC_BASE, SZ_4K), |
41 | __IO_DEV_DESC(U8500_TWD_BASE, SZ_4K), | ||
42 | __IO_DEV_DESC(U8500_MTU0_BASE, SZ_4K), | 42 | __IO_DEV_DESC(U8500_MTU0_BASE, SZ_4K), |
43 | __IO_DEV_DESC(U8500_SCU_BASE, SZ_4K), | ||
44 | __IO_DEV_DESC(U8500_BACKUPRAM0_BASE, SZ_8K), | 43 | __IO_DEV_DESC(U8500_BACKUPRAM0_BASE, SZ_8K), |
45 | 44 | ||
46 | __IO_DEV_DESC(U8500_CLKRST1_BASE, SZ_4K), | 45 | __IO_DEV_DESC(U8500_CLKRST1_BASE, SZ_4K), |
diff --git a/arch/arm/mach-ux500/include/mach/entry-macro.S b/arch/arm/mach-ux500/include/mach/entry-macro.S index 071bba94f72..e16299e1020 100644 --- a/arch/arm/mach-ux500/include/mach/entry-macro.S +++ b/arch/arm/mach-ux500/include/mach/entry-macro.S | |||
@@ -10,8 +10,6 @@ | |||
10 | * License version 2. This program is licensed "as is" without any | 10 | * License version 2. This program is licensed "as is" without any |
11 | * warranty of any kind, whether express or implied. | 11 | * warranty of any kind, whether express or implied. |
12 | */ | 12 | */ |
13 | #include <mach/hardware.h> | ||
14 | #include <asm/hardware/entry-macro-gic.S> | ||
15 | 13 | ||
16 | .macro disable_fiq | 14 | .macro disable_fiq |
17 | .endm | 15 | .endm |
diff --git a/arch/arm/mach-ux500/include/mach/gpio.h b/arch/arm/mach-ux500/include/mach/gpio.h index 7389df911b1..c01ef66537f 100644 --- a/arch/arm/mach-ux500/include/mach/gpio.h +++ b/arch/arm/mach-ux500/include/mach/gpio.h | |||
@@ -1,10 +1,5 @@ | |||
1 | #ifndef __ASM_ARCH_GPIO_H | 1 | #ifndef __ASM_ARCH_GPIO_H |
2 | #define __ASM_ARCH_GPIO_H | 2 | #define __ASM_ARCH_GPIO_H |
3 | 3 | ||
4 | /* | ||
5 | * 288 (#267 is the highest one actually hooked up) onchip GPIOs, plus enough | ||
6 | * room for a couple of GPIO expanders. | ||
7 | */ | ||
8 | #define ARCH_NR_GPIOS 350 | ||
9 | 4 | ||
10 | #endif /* __ASM_ARCH_GPIO_H */ | 5 | #endif /* __ASM_ARCH_GPIO_H */ |
diff --git a/arch/arm/mach-ux500/include/mach/vmalloc.h b/arch/arm/mach-ux500/include/mach/vmalloc.h deleted file mode 100644 index a4945cb4117..00000000000 --- a/arch/arm/mach-ux500/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,18 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2009 ST-Ericsson | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
17 | */ | ||
18 | #define VMALLOC_END 0xf0000000UL | ||
diff --git a/arch/arm/mach-versatile/core.c b/arch/arm/mach-versatile/core.c index b7a6a4b1a1d..cbcda61162d 100644 --- a/arch/arm/mach-versatile/core.c +++ b/arch/arm/mach-versatile/core.c | |||
@@ -141,11 +141,6 @@ static struct map_desc versatile_io_desc[] __initdata = { | |||
141 | }, | 141 | }, |
142 | #ifdef CONFIG_MACH_VERSATILE_AB | 142 | #ifdef CONFIG_MACH_VERSATILE_AB |
143 | { | 143 | { |
144 | .virtual = IO_ADDRESS(VERSATILE_GPIO0_BASE), | ||
145 | .pfn = __phys_to_pfn(VERSATILE_GPIO0_BASE), | ||
146 | .length = SZ_4K, | ||
147 | .type = MT_DEVICE | ||
148 | }, { | ||
149 | .virtual = IO_ADDRESS(VERSATILE_IB2_BASE), | 144 | .virtual = IO_ADDRESS(VERSATILE_IB2_BASE), |
150 | .pfn = __phys_to_pfn(VERSATILE_IB2_BASE), | 145 | .pfn = __phys_to_pfn(VERSATILE_IB2_BASE), |
151 | .length = SZ_64M, | 146 | .length = SZ_64M, |
diff --git a/arch/arm/mach-versatile/include/mach/entry-macro.S b/arch/arm/mach-versatile/include/mach/entry-macro.S index e6f7c166316..b6f0dbf122e 100644 --- a/arch/arm/mach-versatile/include/mach/entry-macro.S +++ b/arch/arm/mach-versatile/include/mach/entry-macro.S | |||
@@ -7,39 +7,9 @@ | |||
7 | * License version 2. This program is licensed "as is" without any | 7 | * License version 2. This program is licensed "as is" without any |
8 | * warranty of any kind, whether express or implied. | 8 | * warranty of any kind, whether express or implied. |
9 | */ | 9 | */ |
10 | #include <mach/hardware.h> | ||
11 | #include <mach/platform.h> | ||
12 | #include <asm/hardware/vic.h> | ||
13 | 10 | ||
14 | .macro disable_fiq | 11 | .macro disable_fiq |
15 | .endm | 12 | .endm |
16 | 13 | ||
17 | .macro get_irqnr_preamble, base, tmp | ||
18 | ldr \base, =IO_ADDRESS(VERSATILE_VIC_BASE) | ||
19 | .endm | ||
20 | |||
21 | .macro arch_ret_to_user, tmp1, tmp2 | 14 | .macro arch_ret_to_user, tmp1, tmp2 |
22 | .endm | 15 | .endm |
23 | |||
24 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
25 | ldr \irqstat, [\base, #VIC_IRQ_STATUS] @ get masked status | ||
26 | mov \irqnr, #0 | ||
27 | teq \irqstat, #0 | ||
28 | beq 1003f | ||
29 | |||
30 | 1001: tst \irqstat, #15 | ||
31 | bne 1002f | ||
32 | add \irqnr, \irqnr, #4 | ||
33 | movs \irqstat, \irqstat, lsr #4 | ||
34 | bne 1001b | ||
35 | 1002: tst \irqstat, #1 | ||
36 | bne 1003f | ||
37 | add \irqnr, \irqnr, #1 | ||
38 | movs \irqstat, \irqstat, lsr #1 | ||
39 | bne 1002b | ||
40 | 1003: /* EQ will be set if no irqs pending */ | ||
41 | |||
42 | @ clz \irqnr, \irqstat | ||
43 | @1003: /* EQ will be set if we reach MAXIRQNUM */ | ||
44 | .endm | ||
45 | |||
diff --git a/arch/arm/mach-versatile/include/mach/vmalloc.h b/arch/arm/mach-versatile/include/mach/vmalloc.h deleted file mode 100644 index 7d8e069ad51..00000000000 --- a/arch/arm/mach-versatile/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,21 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-versatile/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 2003 ARM Limited | ||
5 | * Copyright (C) 2000 Russell King. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | */ | ||
21 | #define VMALLOC_END 0xd8000000UL | ||
diff --git a/arch/arm/mach-versatile/versatile_ab.c b/arch/arm/mach-versatile/versatile_ab.c index f1277ac92fa..63b8dd2b9f4 100644 --- a/arch/arm/mach-versatile/versatile_ab.c +++ b/arch/arm/mach-versatile/versatile_ab.c | |||
@@ -27,6 +27,7 @@ | |||
27 | 27 | ||
28 | #include <mach/hardware.h> | 28 | #include <mach/hardware.h> |
29 | #include <asm/irq.h> | 29 | #include <asm/irq.h> |
30 | #include <asm/hardware/vic.h> | ||
30 | #include <asm/mach-types.h> | 31 | #include <asm/mach-types.h> |
31 | 32 | ||
32 | #include <asm/mach/arch.h> | 33 | #include <asm/mach/arch.h> |
@@ -39,6 +40,7 @@ MACHINE_START(VERSATILE_AB, "ARM-Versatile AB") | |||
39 | .map_io = versatile_map_io, | 40 | .map_io = versatile_map_io, |
40 | .init_early = versatile_init_early, | 41 | .init_early = versatile_init_early, |
41 | .init_irq = versatile_init_irq, | 42 | .init_irq = versatile_init_irq, |
43 | .handle_irq = vic_handle_irq, | ||
42 | .timer = &versatile_timer, | 44 | .timer = &versatile_timer, |
43 | .init_machine = versatile_init, | 45 | .init_machine = versatile_init, |
44 | .restart = versatile_restart, | 46 | .restart = versatile_restart, |
diff --git a/arch/arm/mach-versatile/versatile_dt.c b/arch/arm/mach-versatile/versatile_dt.c index f48f2e4b667..ae5ad3c8f3d 100644 --- a/arch/arm/mach-versatile/versatile_dt.c +++ b/arch/arm/mach-versatile/versatile_dt.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/init.h> | 24 | #include <linux/init.h> |
25 | #include <linux/of_irq.h> | 25 | #include <linux/of_irq.h> |
26 | #include <linux/of_platform.h> | 26 | #include <linux/of_platform.h> |
27 | #include <asm/hardware/vic.h> | ||
27 | #include <asm/mach-types.h> | 28 | #include <asm/mach-types.h> |
28 | #include <asm/mach/arch.h> | 29 | #include <asm/mach/arch.h> |
29 | 30 | ||
@@ -45,6 +46,7 @@ DT_MACHINE_START(VERSATILE_PB, "ARM-Versatile (Device Tree Support)") | |||
45 | .map_io = versatile_map_io, | 46 | .map_io = versatile_map_io, |
46 | .init_early = versatile_init_early, | 47 | .init_early = versatile_init_early, |
47 | .init_irq = versatile_init_irq, | 48 | .init_irq = versatile_init_irq, |
49 | .handle_irq = vic_handle_irq, | ||
48 | .timer = &versatile_timer, | 50 | .timer = &versatile_timer, |
49 | .init_machine = versatile_dt_init, | 51 | .init_machine = versatile_dt_init, |
50 | .dt_compat = versatile_dt_match, | 52 | .dt_compat = versatile_dt_match, |
diff --git a/arch/arm/mach-versatile/versatile_pb.c b/arch/arm/mach-versatile/versatile_pb.c index 839bea63382..7aab79b665e 100644 --- a/arch/arm/mach-versatile/versatile_pb.c +++ b/arch/arm/mach-versatile/versatile_pb.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/io.h> | 28 | #include <linux/io.h> |
29 | 29 | ||
30 | #include <mach/hardware.h> | 30 | #include <mach/hardware.h> |
31 | #include <asm/hardware/vic.h> | ||
31 | #include <asm/irq.h> | 32 | #include <asm/irq.h> |
32 | #include <asm/mach-types.h> | 33 | #include <asm/mach-types.h> |
33 | 34 | ||
@@ -107,6 +108,7 @@ MACHINE_START(VERSATILE_PB, "ARM-Versatile PB") | |||
107 | .map_io = versatile_map_io, | 108 | .map_io = versatile_map_io, |
108 | .init_early = versatile_init_early, | 109 | .init_early = versatile_init_early, |
109 | .init_irq = versatile_init_irq, | 110 | .init_irq = versatile_init_irq, |
111 | .handle_irq = vic_handle_irq, | ||
110 | .timer = &versatile_timer, | 112 | .timer = &versatile_timer, |
111 | .init_machine = versatile_pb_init, | 113 | .init_machine = versatile_pb_init, |
112 | .restart = versatile_restart, | 114 | .restart = versatile_restart, |
diff --git a/arch/arm/mach-vexpress/Kconfig b/arch/arm/mach-vexpress/Kconfig index 931148487f0..9b3d0fbaee7 100644 --- a/arch/arm/mach-vexpress/Kconfig +++ b/arch/arm/mach-vexpress/Kconfig | |||
@@ -8,5 +8,7 @@ config ARCH_VEXPRESS_CA9X4 | |||
8 | select ARM_ERRATA_720789 | 8 | select ARM_ERRATA_720789 |
9 | select ARM_ERRATA_751472 | 9 | select ARM_ERRATA_751472 |
10 | select ARM_ERRATA_753970 | 10 | select ARM_ERRATA_753970 |
11 | select HAVE_SMP | ||
12 | select MIGHT_HAVE_CACHE_L2X0 | ||
11 | 13 | ||
12 | endmenu | 14 | endmenu |
diff --git a/arch/arm/mach-vexpress/include/mach/entry-macro.S b/arch/arm/mach-vexpress/include/mach/entry-macro.S index 73c11297509..a14f9e62ca9 100644 --- a/arch/arm/mach-vexpress/include/mach/entry-macro.S +++ b/arch/arm/mach-vexpress/include/mach/entry-macro.S | |||
@@ -1,5 +1,3 @@ | |||
1 | #include <asm/hardware/entry-macro-gic.S> | ||
2 | |||
3 | .macro disable_fiq | 1 | .macro disable_fiq |
4 | .endm | 2 | .endm |
5 | 3 | ||
diff --git a/arch/arm/mach-vexpress/include/mach/vmalloc.h b/arch/arm/mach-vexpress/include/mach/vmalloc.h deleted file mode 100644 index f43a36ef678..00000000000 --- a/arch/arm/mach-vexpress/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,21 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-vexpress/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 2003 ARM Limited | ||
5 | * Copyright (C) 2000 Russell King. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | */ | ||
21 | #define VMALLOC_END 0xf8000000UL | ||
diff --git a/arch/arm/mach-vexpress/v2m.c b/arch/arm/mach-vexpress/v2m.c index b9a465bd2d0..6dd10e320ef 100644 --- a/arch/arm/mach-vexpress/v2m.c +++ b/arch/arm/mach-vexpress/v2m.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <asm/hardware/arm_timer.h> | 23 | #include <asm/hardware/arm_timer.h> |
24 | #include <asm/hardware/timer-sp.h> | 24 | #include <asm/hardware/timer-sp.h> |
25 | #include <asm/hardware/sp810.h> | 25 | #include <asm/hardware/sp810.h> |
26 | #include <asm/hardware/gic.h> | ||
26 | 27 | ||
27 | #include <mach/ct-ca9x4.h> | 28 | #include <mach/ct-ca9x4.h> |
28 | #include <mach/motherboard.h> | 29 | #include <mach/motherboard.h> |
@@ -447,6 +448,7 @@ MACHINE_START(VEXPRESS, "ARM-Versatile Express") | |||
447 | .init_early = v2m_init_early, | 448 | .init_early = v2m_init_early, |
448 | .init_irq = v2m_init_irq, | 449 | .init_irq = v2m_init_irq, |
449 | .timer = &v2m_timer, | 450 | .timer = &v2m_timer, |
451 | .handle_irq = gic_handle_irq, | ||
450 | .init_machine = v2m_init, | 452 | .init_machine = v2m_init, |
451 | .restart = v2m_restart, | 453 | .restart = v2m_restart, |
452 | MACHINE_END | 454 | MACHINE_END |
diff --git a/arch/arm/mach-vt8500/include/mach/vmalloc.h b/arch/arm/mach-vt8500/include/mach/vmalloc.h deleted file mode 100644 index 4642290ce41..00000000000 --- a/arch/arm/mach-vt8500/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-vt8500/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 2000 Russell King. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | */ | ||
20 | #define VMALLOC_END 0xd0000000UL | ||
diff --git a/arch/arm/mach-w90x900/include/mach/vmalloc.h b/arch/arm/mach-w90x900/include/mach/vmalloc.h deleted file mode 100644 index b067e44500a..00000000000 --- a/arch/arm/mach-w90x900/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,23 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-w90x900/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (c) 2008 Nuvoton technology corporation | ||
5 | * All rights reserved. | ||
6 | * | ||
7 | * Wan ZongShun <mcuos.com@gmail.com> | ||
8 | * | ||
9 | * Based on arch/arm/mach-s3c2410/include/mach/vmalloc.h | ||
10 | * | ||
11 | * This program is free software; you can redistribute it and/or modify | ||
12 | * it under the terms of the GNU General Public License as published by | ||
13 | * the Free Software Foundation; either version 2 of the License, or | ||
14 | * (at your option) any later version. | ||
15 | * | ||
16 | */ | ||
17 | |||
18 | #ifndef __ASM_ARCH_VMALLOC_H | ||
19 | #define __ASM_ARCH_VMALLOC_H | ||
20 | |||
21 | #define VMALLOC_END (0xe0000000UL) | ||
22 | |||
23 | #endif /* __ASM_ARCH_VMALLOC_H */ | ||
diff --git a/arch/arm/mach-zynq/common.c b/arch/arm/mach-zynq/common.c index 73e93687b81..ab5cfddc0d7 100644 --- a/arch/arm/mach-zynq/common.c +++ b/arch/arm/mach-zynq/common.c | |||
@@ -112,6 +112,7 @@ static const char *xilinx_dt_match[] = { | |||
112 | MACHINE_START(XILINX_EP107, "Xilinx Zynq Platform") | 112 | MACHINE_START(XILINX_EP107, "Xilinx Zynq Platform") |
113 | .map_io = xilinx_map_io, | 113 | .map_io = xilinx_map_io, |
114 | .init_irq = xilinx_irq_init, | 114 | .init_irq = xilinx_irq_init, |
115 | .handle_irq = gic_handle_irq, | ||
115 | .init_machine = xilinx_init_machine, | 116 | .init_machine = xilinx_init_machine, |
116 | .timer = &xttcpss_sys_timer, | 117 | .timer = &xttcpss_sys_timer, |
117 | .dt_compat = xilinx_dt_match, | 118 | .dt_compat = xilinx_dt_match, |
diff --git a/arch/arm/mach-zynq/include/mach/entry-macro.S b/arch/arm/mach-zynq/include/mach/entry-macro.S index 3cfc01b3746..d621fb73256 100644 --- a/arch/arm/mach-zynq/include/mach/entry-macro.S +++ b/arch/arm/mach-zynq/include/mach/entry-macro.S | |||
@@ -20,9 +20,6 @@ | |||
20 | * GNU General Public License for more details. | 20 | * GNU General Public License for more details. |
21 | */ | 21 | */ |
22 | 22 | ||
23 | #include <mach/hardware.h> | ||
24 | #include <asm/hardware/entry-macro-gic.S> | ||
25 | |||
26 | .macro disable_fiq | 23 | .macro disable_fiq |
27 | .endm | 24 | .endm |
28 | 25 | ||
diff --git a/arch/arm/mach-zynq/include/mach/vmalloc.h b/arch/arm/mach-zynq/include/mach/vmalloc.h deleted file mode 100644 index 2398eff1e8b..00000000000 --- a/arch/arm/mach-zynq/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* arch/arm/mach-zynq/include/mach/vmalloc.h | ||
2 | * | ||
3 | * Copyright (C) 2011 Xilinx | ||
4 | * | ||
5 | * This software is licensed under the terms of the GNU General Public | ||
6 | * License version 2, as published by the Free Software Foundation, and | ||
7 | * may be copied, distributed, and modified under those terms. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | */ | ||
14 | |||
15 | #ifndef __MACH_VMALLOC_H__ | ||
16 | #define __MACH_VMALLOC_H__ | ||
17 | |||
18 | #define VMALLOC_END 0xE0000000UL | ||
19 | |||
20 | #endif | ||
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index 67f75a0b66d..4cefb57d9ed 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig | |||
@@ -629,6 +629,23 @@ config IO_36 | |||
629 | 629 | ||
630 | comment "Processor Features" | 630 | comment "Processor Features" |
631 | 631 | ||
632 | config ARM_LPAE | ||
633 | bool "Support for the Large Physical Address Extension" | ||
634 | depends on MMU && CPU_V7 | ||
635 | help | ||
636 | Say Y if you have an ARMv7 processor supporting the LPAE page | ||
637 | table format and you would like to access memory beyond the | ||
638 | 4GB limit. The resulting kernel image will not run on | ||
639 | processors without the LPA extension. | ||
640 | |||
641 | If unsure, say N. | ||
642 | |||
643 | config ARCH_PHYS_ADDR_T_64BIT | ||
644 | def_bool ARM_LPAE | ||
645 | |||
646 | config ARCH_DMA_ADDR_T_64BIT | ||
647 | bool | ||
648 | |||
632 | config ARM_THUMB | 649 | config ARM_THUMB |
633 | bool "Support Thumb user binaries" | 650 | bool "Support Thumb user binaries" |
634 | depends on CPU_ARM720T || CPU_ARM740T || CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM940T || CPU_ARM946E || CPU_ARM1020 || CPU_ARM1020E || CPU_ARM1022 || CPU_ARM1026 || CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_V6 || CPU_V6K || CPU_V7 || CPU_FEROCEON | 651 | depends on CPU_ARM720T || CPU_ARM740T || CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM940T || CPU_ARM946E || CPU_ARM1020 || CPU_ARM1020E || CPU_ARM1022 || CPU_ARM1026 || CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_V6 || CPU_V6K || CPU_V7 || CPU_FEROCEON |
@@ -816,14 +833,23 @@ config CACHE_FEROCEON_L2_WRITETHROUGH | |||
816 | Say Y here to use the Feroceon L2 cache in writethrough mode. | 833 | Say Y here to use the Feroceon L2 cache in writethrough mode. |
817 | Unless you specifically require this, say N for writeback mode. | 834 | Unless you specifically require this, say N for writeback mode. |
818 | 835 | ||
836 | config MIGHT_HAVE_CACHE_L2X0 | ||
837 | bool | ||
838 | help | ||
839 | This option should be selected by machines which have a L2x0 | ||
840 | or PL310 cache controller, but where its use is optional. | ||
841 | |||
842 | The only effect of this option is to make CACHE_L2X0 and | ||
843 | related options available to the user for configuration. | ||
844 | |||
845 | Boards or SoCs which always require the cache controller | ||
846 | support to be present should select CACHE_L2X0 directly | ||
847 | instead of this option, thus preventing the user from | ||
848 | inadvertently configuring a broken kernel. | ||
849 | |||
819 | config CACHE_L2X0 | 850 | config CACHE_L2X0 |
820 | bool "Enable the L2x0 outer cache controller" | 851 | bool "Enable the L2x0 outer cache controller" if MIGHT_HAVE_CACHE_L2X0 |
821 | depends on REALVIEW_EB_ARM11MP || MACH_REALVIEW_PB11MP || MACH_REALVIEW_PB1176 || \ | 852 | default MIGHT_HAVE_CACHE_L2X0 |
822 | REALVIEW_EB_A9MP || ARCH_IMX_V6_V7 || MACH_REALVIEW_PBX || \ | ||
823 | ARCH_NOMADIK || ARCH_OMAP4 || ARCH_EXYNOS4 || ARCH_TEGRA || \ | ||
824 | ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || ARCH_SHMOBILE || \ | ||
825 | ARCH_PRIMA2 || ARCH_ZYNQ || ARCH_CNS3XXX || ARCH_HIGHBANK | ||
826 | default y | ||
827 | select OUTER_CACHE | 853 | select OUTER_CACHE |
828 | select OUTER_CACHE_SYNC | 854 | select OUTER_CACHE_SYNC |
829 | help | 855 | help |
diff --git a/arch/arm/mm/alignment.c b/arch/arm/mm/alignment.c index c335c76e0d8..caf14dc059e 100644 --- a/arch/arm/mm/alignment.c +++ b/arch/arm/mm/alignment.c | |||
@@ -968,7 +968,7 @@ static int __init alignment_init(void) | |||
968 | ai_usermode = safe_usermode(ai_usermode, false); | 968 | ai_usermode = safe_usermode(ai_usermode, false); |
969 | } | 969 | } |
970 | 970 | ||
971 | hook_fault_code(1, do_alignment, SIGBUS, BUS_ADRALN, | 971 | hook_fault_code(FAULT_CODE_ALIGNMENT, do_alignment, SIGBUS, BUS_ADRALN, |
972 | "alignment exception"); | 972 | "alignment exception"); |
973 | 973 | ||
974 | /* | 974 | /* |
diff --git a/arch/arm/mm/context.c b/arch/arm/mm/context.c index 93aac068da9..ee9bb363d60 100644 --- a/arch/arm/mm/context.c +++ b/arch/arm/mm/context.c | |||
@@ -22,6 +22,21 @@ unsigned int cpu_last_asid = ASID_FIRST_VERSION; | |||
22 | DEFINE_PER_CPU(struct mm_struct *, current_mm); | 22 | DEFINE_PER_CPU(struct mm_struct *, current_mm); |
23 | #endif | 23 | #endif |
24 | 24 | ||
25 | #ifdef CONFIG_ARM_LPAE | ||
26 | #define cpu_set_asid(asid) { \ | ||
27 | unsigned long ttbl, ttbh; \ | ||
28 | asm volatile( \ | ||
29 | " mrrc p15, 0, %0, %1, c2 @ read TTBR0\n" \ | ||
30 | " mov %1, %2, lsl #(48 - 32) @ set ASID\n" \ | ||
31 | " mcrr p15, 0, %0, %1, c2 @ set TTBR0\n" \ | ||
32 | : "=&r" (ttbl), "=&r" (ttbh) \ | ||
33 | : "r" (asid & ~ASID_MASK)); \ | ||
34 | } | ||
35 | #else | ||
36 | #define cpu_set_asid(asid) \ | ||
37 | asm(" mcr p15, 0, %0, c13, c0, 1\n" : : "r" (asid)) | ||
38 | #endif | ||
39 | |||
25 | /* | 40 | /* |
26 | * We fork()ed a process, and we need a new context for the child | 41 | * We fork()ed a process, and we need a new context for the child |
27 | * to run in. We reserve version 0 for initial tasks so we will | 42 | * to run in. We reserve version 0 for initial tasks so we will |
@@ -37,7 +52,7 @@ void __init_new_context(struct task_struct *tsk, struct mm_struct *mm) | |||
37 | static void flush_context(void) | 52 | static void flush_context(void) |
38 | { | 53 | { |
39 | /* set the reserved ASID before flushing the TLB */ | 54 | /* set the reserved ASID before flushing the TLB */ |
40 | asm("mcr p15, 0, %0, c13, c0, 1\n" : : "r" (0)); | 55 | cpu_set_asid(0); |
41 | isb(); | 56 | isb(); |
42 | local_flush_tlb_all(); | 57 | local_flush_tlb_all(); |
43 | if (icache_is_vivt_asid_tagged()) { | 58 | if (icache_is_vivt_asid_tagged()) { |
@@ -99,7 +114,7 @@ static void reset_context(void *info) | |||
99 | set_mm_context(mm, asid); | 114 | set_mm_context(mm, asid); |
100 | 115 | ||
101 | /* set the new ASID */ | 116 | /* set the new ASID */ |
102 | asm("mcr p15, 0, %0, c13, c0, 1\n" : : "r" (mm->context.id)); | 117 | cpu_set_asid(mm->context.id); |
103 | isb(); | 118 | isb(); |
104 | } | 119 | } |
105 | 120 | ||
diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c index aa33949fef6..bb7eac381a8 100644 --- a/arch/arm/mm/fault.c +++ b/arch/arm/mm/fault.c | |||
@@ -27,19 +27,6 @@ | |||
27 | 27 | ||
28 | #include "fault.h" | 28 | #include "fault.h" |
29 | 29 | ||
30 | /* | ||
31 | * Fault status register encodings. We steal bit 31 for our own purposes. | ||
32 | */ | ||
33 | #define FSR_LNX_PF (1 << 31) | ||
34 | #define FSR_WRITE (1 << 11) | ||
35 | #define FSR_FS4 (1 << 10) | ||
36 | #define FSR_FS3_0 (15) | ||
37 | |||
38 | static inline int fsr_fs(unsigned int fsr) | ||
39 | { | ||
40 | return (fsr & FSR_FS3_0) | (fsr & FSR_FS4) >> 6; | ||
41 | } | ||
42 | |||
43 | #ifdef CONFIG_MMU | 30 | #ifdef CONFIG_MMU |
44 | 31 | ||
45 | #ifdef CONFIG_KPROBES | 32 | #ifdef CONFIG_KPROBES |
@@ -123,8 +110,10 @@ void show_pte(struct mm_struct *mm, unsigned long addr) | |||
123 | 110 | ||
124 | pte = pte_offset_map(pmd, addr); | 111 | pte = pte_offset_map(pmd, addr); |
125 | printk(", *pte=%08llx", (long long)pte_val(*pte)); | 112 | printk(", *pte=%08llx", (long long)pte_val(*pte)); |
113 | #ifndef CONFIG_ARM_LPAE | ||
126 | printk(", *ppte=%08llx", | 114 | printk(", *ppte=%08llx", |
127 | (long long)pte_val(pte[PTE_HWTABLE_PTRS])); | 115 | (long long)pte_val(pte[PTE_HWTABLE_PTRS])); |
116 | #endif | ||
128 | pte_unmap(pte); | 117 | pte_unmap(pte); |
129 | } while(0); | 118 | } while(0); |
130 | 119 | ||
@@ -231,7 +220,7 @@ static inline bool access_error(unsigned int fsr, struct vm_area_struct *vma) | |||
231 | 220 | ||
232 | static int __kprobes | 221 | static int __kprobes |
233 | __do_page_fault(struct mm_struct *mm, unsigned long addr, unsigned int fsr, | 222 | __do_page_fault(struct mm_struct *mm, unsigned long addr, unsigned int fsr, |
234 | struct task_struct *tsk) | 223 | unsigned int flags, struct task_struct *tsk) |
235 | { | 224 | { |
236 | struct vm_area_struct *vma; | 225 | struct vm_area_struct *vma; |
237 | int fault; | 226 | int fault; |
@@ -253,18 +242,7 @@ good_area: | |||
253 | goto out; | 242 | goto out; |
254 | } | 243 | } |
255 | 244 | ||
256 | /* | 245 | return handle_mm_fault(mm, vma, addr & PAGE_MASK, flags); |
257 | * If for any reason at all we couldn't handle the fault, make | ||
258 | * sure we exit gracefully rather than endlessly redo the fault. | ||
259 | */ | ||
260 | fault = handle_mm_fault(mm, vma, addr & PAGE_MASK, (fsr & FSR_WRITE) ? FAULT_FLAG_WRITE : 0); | ||
261 | if (unlikely(fault & VM_FAULT_ERROR)) | ||
262 | return fault; | ||
263 | if (fault & VM_FAULT_MAJOR) | ||
264 | tsk->maj_flt++; | ||
265 | else | ||
266 | tsk->min_flt++; | ||
267 | return fault; | ||
268 | 246 | ||
269 | check_stack: | 247 | check_stack: |
270 | if (vma->vm_flags & VM_GROWSDOWN && !expand_stack(vma, addr)) | 248 | if (vma->vm_flags & VM_GROWSDOWN && !expand_stack(vma, addr)) |
@@ -279,6 +257,9 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) | |||
279 | struct task_struct *tsk; | 257 | struct task_struct *tsk; |
280 | struct mm_struct *mm; | 258 | struct mm_struct *mm; |
281 | int fault, sig, code; | 259 | int fault, sig, code; |
260 | int write = fsr & FSR_WRITE; | ||
261 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE | | ||
262 | (write ? FAULT_FLAG_WRITE : 0); | ||
282 | 263 | ||
283 | if (notify_page_fault(regs, fsr)) | 264 | if (notify_page_fault(regs, fsr)) |
284 | return 0; | 265 | return 0; |
@@ -305,6 +286,7 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) | |||
305 | if (!down_read_trylock(&mm->mmap_sem)) { | 286 | if (!down_read_trylock(&mm->mmap_sem)) { |
306 | if (!user_mode(regs) && !search_exception_tables(regs->ARM_pc)) | 287 | if (!user_mode(regs) && !search_exception_tables(regs->ARM_pc)) |
307 | goto no_context; | 288 | goto no_context; |
289 | retry: | ||
308 | down_read(&mm->mmap_sem); | 290 | down_read(&mm->mmap_sem); |
309 | } else { | 291 | } else { |
310 | /* | 292 | /* |
@@ -320,14 +302,41 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) | |||
320 | #endif | 302 | #endif |
321 | } | 303 | } |
322 | 304 | ||
323 | fault = __do_page_fault(mm, addr, fsr, tsk); | 305 | fault = __do_page_fault(mm, addr, fsr, flags, tsk); |
324 | up_read(&mm->mmap_sem); | 306 | |
307 | /* If we need to retry but a fatal signal is pending, handle the | ||
308 | * signal first. We do not need to release the mmap_sem because | ||
309 | * it would already be released in __lock_page_or_retry in | ||
310 | * mm/filemap.c. */ | ||
311 | if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) | ||
312 | return 0; | ||
313 | |||
314 | /* | ||
315 | * Major/minor page fault accounting is only done on the | ||
316 | * initial attempt. If we go through a retry, it is extremely | ||
317 | * likely that the page will be found in page cache at that point. | ||
318 | */ | ||
325 | 319 | ||
326 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, addr); | 320 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, addr); |
327 | if (fault & VM_FAULT_MAJOR) | 321 | if (flags & FAULT_FLAG_ALLOW_RETRY) { |
328 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, regs, addr); | 322 | if (fault & VM_FAULT_MAJOR) { |
329 | else if (fault & VM_FAULT_MINOR) | 323 | tsk->maj_flt++; |
330 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1, regs, addr); | 324 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, |
325 | regs, addr); | ||
326 | } else { | ||
327 | tsk->min_flt++; | ||
328 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1, | ||
329 | regs, addr); | ||
330 | } | ||
331 | if (fault & VM_FAULT_RETRY) { | ||
332 | /* Clear FAULT_FLAG_ALLOW_RETRY to avoid any risk | ||
333 | * of starvation. */ | ||
334 | flags &= ~FAULT_FLAG_ALLOW_RETRY; | ||
335 | goto retry; | ||
336 | } | ||
337 | } | ||
338 | |||
339 | up_read(&mm->mmap_sem); | ||
331 | 340 | ||
332 | /* | 341 | /* |
333 | * Handle the "normal" case first - VM_FAULT_MAJOR / VM_FAULT_MINOR | 342 | * Handle the "normal" case first - VM_FAULT_MAJOR / VM_FAULT_MINOR |
@@ -441,6 +450,12 @@ do_translation_fault(unsigned long addr, unsigned int fsr, | |||
441 | pmd = pmd_offset(pud, addr); | 450 | pmd = pmd_offset(pud, addr); |
442 | pmd_k = pmd_offset(pud_k, addr); | 451 | pmd_k = pmd_offset(pud_k, addr); |
443 | 452 | ||
453 | #ifdef CONFIG_ARM_LPAE | ||
454 | /* | ||
455 | * Only one hardware entry per PMD with LPAE. | ||
456 | */ | ||
457 | index = 0; | ||
458 | #else | ||
444 | /* | 459 | /* |
445 | * On ARM one Linux PGD entry contains two hardware entries (see page | 460 | * On ARM one Linux PGD entry contains two hardware entries (see page |
446 | * tables layout in pgtable.h). We normally guarantee that we always | 461 | * tables layout in pgtable.h). We normally guarantee that we always |
@@ -450,6 +465,7 @@ do_translation_fault(unsigned long addr, unsigned int fsr, | |||
450 | * for the first of pair. | 465 | * for the first of pair. |
451 | */ | 466 | */ |
452 | index = (addr >> SECTION_SHIFT) & 1; | 467 | index = (addr >> SECTION_SHIFT) & 1; |
468 | #endif | ||
453 | if (pmd_none(pmd_k[index])) | 469 | if (pmd_none(pmd_k[index])) |
454 | goto bad_area; | 470 | goto bad_area; |
455 | 471 | ||
@@ -489,55 +505,20 @@ do_bad(unsigned long addr, unsigned int fsr, struct pt_regs *regs) | |||
489 | return 1; | 505 | return 1; |
490 | } | 506 | } |
491 | 507 | ||
492 | static struct fsr_info { | 508 | struct fsr_info { |
493 | int (*fn)(unsigned long addr, unsigned int fsr, struct pt_regs *regs); | 509 | int (*fn)(unsigned long addr, unsigned int fsr, struct pt_regs *regs); |
494 | int sig; | 510 | int sig; |
495 | int code; | 511 | int code; |
496 | const char *name; | 512 | const char *name; |
497 | } fsr_info[] = { | ||
498 | /* | ||
499 | * The following are the standard ARMv3 and ARMv4 aborts. ARMv5 | ||
500 | * defines these to be "precise" aborts. | ||
501 | */ | ||
502 | { do_bad, SIGSEGV, 0, "vector exception" }, | ||
503 | { do_bad, SIGBUS, BUS_ADRALN, "alignment exception" }, | ||
504 | { do_bad, SIGKILL, 0, "terminal exception" }, | ||
505 | { do_bad, SIGBUS, BUS_ADRALN, "alignment exception" }, | ||
506 | { do_bad, SIGBUS, 0, "external abort on linefetch" }, | ||
507 | { do_translation_fault, SIGSEGV, SEGV_MAPERR, "section translation fault" }, | ||
508 | { do_bad, SIGBUS, 0, "external abort on linefetch" }, | ||
509 | { do_page_fault, SIGSEGV, SEGV_MAPERR, "page translation fault" }, | ||
510 | { do_bad, SIGBUS, 0, "external abort on non-linefetch" }, | ||
511 | { do_bad, SIGSEGV, SEGV_ACCERR, "section domain fault" }, | ||
512 | { do_bad, SIGBUS, 0, "external abort on non-linefetch" }, | ||
513 | { do_bad, SIGSEGV, SEGV_ACCERR, "page domain fault" }, | ||
514 | { do_bad, SIGBUS, 0, "external abort on translation" }, | ||
515 | { do_sect_fault, SIGSEGV, SEGV_ACCERR, "section permission fault" }, | ||
516 | { do_bad, SIGBUS, 0, "external abort on translation" }, | ||
517 | { do_page_fault, SIGSEGV, SEGV_ACCERR, "page permission fault" }, | ||
518 | /* | ||
519 | * The following are "imprecise" aborts, which are signalled by bit | ||
520 | * 10 of the FSR, and may not be recoverable. These are only | ||
521 | * supported if the CPU abort handler supports bit 10. | ||
522 | */ | ||
523 | { do_bad, SIGBUS, 0, "unknown 16" }, | ||
524 | { do_bad, SIGBUS, 0, "unknown 17" }, | ||
525 | { do_bad, SIGBUS, 0, "unknown 18" }, | ||
526 | { do_bad, SIGBUS, 0, "unknown 19" }, | ||
527 | { do_bad, SIGBUS, 0, "lock abort" }, /* xscale */ | ||
528 | { do_bad, SIGBUS, 0, "unknown 21" }, | ||
529 | { do_bad, SIGBUS, BUS_OBJERR, "imprecise external abort" }, /* xscale */ | ||
530 | { do_bad, SIGBUS, 0, "unknown 23" }, | ||
531 | { do_bad, SIGBUS, 0, "dcache parity error" }, /* xscale */ | ||
532 | { do_bad, SIGBUS, 0, "unknown 25" }, | ||
533 | { do_bad, SIGBUS, 0, "unknown 26" }, | ||
534 | { do_bad, SIGBUS, 0, "unknown 27" }, | ||
535 | { do_bad, SIGBUS, 0, "unknown 28" }, | ||
536 | { do_bad, SIGBUS, 0, "unknown 29" }, | ||
537 | { do_bad, SIGBUS, 0, "unknown 30" }, | ||
538 | { do_bad, SIGBUS, 0, "unknown 31" } | ||
539 | }; | 513 | }; |
540 | 514 | ||
515 | /* FSR definition */ | ||
516 | #ifdef CONFIG_ARM_LPAE | ||
517 | #include "fsr-3level.c" | ||
518 | #else | ||
519 | #include "fsr-2level.c" | ||
520 | #endif | ||
521 | |||
541 | void __init | 522 | void __init |
542 | hook_fault_code(int nr, int (*fn)(unsigned long, unsigned int, struct pt_regs *), | 523 | hook_fault_code(int nr, int (*fn)(unsigned long, unsigned int, struct pt_regs *), |
543 | int sig, int code, const char *name) | 524 | int sig, int code, const char *name) |
@@ -573,42 +554,6 @@ do_DataAbort(unsigned long addr, unsigned int fsr, struct pt_regs *regs) | |||
573 | arm_notify_die("", regs, &info, fsr, 0); | 554 | arm_notify_die("", regs, &info, fsr, 0); |
574 | } | 555 | } |
575 | 556 | ||
576 | |||
577 | static struct fsr_info ifsr_info[] = { | ||
578 | { do_bad, SIGBUS, 0, "unknown 0" }, | ||
579 | { do_bad, SIGBUS, 0, "unknown 1" }, | ||
580 | { do_bad, SIGBUS, 0, "debug event" }, | ||
581 | { do_bad, SIGSEGV, SEGV_ACCERR, "section access flag fault" }, | ||
582 | { do_bad, SIGBUS, 0, "unknown 4" }, | ||
583 | { do_translation_fault, SIGSEGV, SEGV_MAPERR, "section translation fault" }, | ||
584 | { do_bad, SIGSEGV, SEGV_ACCERR, "page access flag fault" }, | ||
585 | { do_page_fault, SIGSEGV, SEGV_MAPERR, "page translation fault" }, | ||
586 | { do_bad, SIGBUS, 0, "external abort on non-linefetch" }, | ||
587 | { do_bad, SIGSEGV, SEGV_ACCERR, "section domain fault" }, | ||
588 | { do_bad, SIGBUS, 0, "unknown 10" }, | ||
589 | { do_bad, SIGSEGV, SEGV_ACCERR, "page domain fault" }, | ||
590 | { do_bad, SIGBUS, 0, "external abort on translation" }, | ||
591 | { do_sect_fault, SIGSEGV, SEGV_ACCERR, "section permission fault" }, | ||
592 | { do_bad, SIGBUS, 0, "external abort on translation" }, | ||
593 | { do_page_fault, SIGSEGV, SEGV_ACCERR, "page permission fault" }, | ||
594 | { do_bad, SIGBUS, 0, "unknown 16" }, | ||
595 | { do_bad, SIGBUS, 0, "unknown 17" }, | ||
596 | { do_bad, SIGBUS, 0, "unknown 18" }, | ||
597 | { do_bad, SIGBUS, 0, "unknown 19" }, | ||
598 | { do_bad, SIGBUS, 0, "unknown 20" }, | ||
599 | { do_bad, SIGBUS, 0, "unknown 21" }, | ||
600 | { do_bad, SIGBUS, 0, "unknown 22" }, | ||
601 | { do_bad, SIGBUS, 0, "unknown 23" }, | ||
602 | { do_bad, SIGBUS, 0, "unknown 24" }, | ||
603 | { do_bad, SIGBUS, 0, "unknown 25" }, | ||
604 | { do_bad, SIGBUS, 0, "unknown 26" }, | ||
605 | { do_bad, SIGBUS, 0, "unknown 27" }, | ||
606 | { do_bad, SIGBUS, 0, "unknown 28" }, | ||
607 | { do_bad, SIGBUS, 0, "unknown 29" }, | ||
608 | { do_bad, SIGBUS, 0, "unknown 30" }, | ||
609 | { do_bad, SIGBUS, 0, "unknown 31" }, | ||
610 | }; | ||
611 | |||
612 | void __init | 557 | void __init |
613 | hook_ifault_code(int nr, int (*fn)(unsigned long, unsigned int, struct pt_regs *), | 558 | hook_ifault_code(int nr, int (*fn)(unsigned long, unsigned int, struct pt_regs *), |
614 | int sig, int code, const char *name) | 559 | int sig, int code, const char *name) |
@@ -641,6 +586,7 @@ do_PrefetchAbort(unsigned long addr, unsigned int ifsr, struct pt_regs *regs) | |||
641 | arm_notify_die("", regs, &info, ifsr, 0); | 586 | arm_notify_die("", regs, &info, ifsr, 0); |
642 | } | 587 | } |
643 | 588 | ||
589 | #ifndef CONFIG_ARM_LPAE | ||
644 | static int __init exceptions_init(void) | 590 | static int __init exceptions_init(void) |
645 | { | 591 | { |
646 | if (cpu_architecture() >= CPU_ARCH_ARMv6) { | 592 | if (cpu_architecture() >= CPU_ARCH_ARMv6) { |
@@ -663,3 +609,4 @@ static int __init exceptions_init(void) | |||
663 | } | 609 | } |
664 | 610 | ||
665 | arch_initcall(exceptions_init); | 611 | arch_initcall(exceptions_init); |
612 | #endif | ||
diff --git a/arch/arm/mm/fault.h b/arch/arm/mm/fault.h index 49e9e3804de..cf08bdfbe0d 100644 --- a/arch/arm/mm/fault.h +++ b/arch/arm/mm/fault.h | |||
@@ -1,3 +1,28 @@ | |||
1 | void do_bad_area(unsigned long addr, unsigned int fsr, struct pt_regs *regs); | 1 | #ifndef __ARCH_ARM_FAULT_H |
2 | #define __ARCH_ARM_FAULT_H | ||
3 | |||
4 | /* | ||
5 | * Fault status register encodings. We steal bit 31 for our own purposes. | ||
6 | */ | ||
7 | #define FSR_LNX_PF (1 << 31) | ||
8 | #define FSR_WRITE (1 << 11) | ||
9 | #define FSR_FS4 (1 << 10) | ||
10 | #define FSR_FS3_0 (15) | ||
11 | #define FSR_FS5_0 (0x3f) | ||
12 | |||
13 | #ifdef CONFIG_ARM_LPAE | ||
14 | static inline int fsr_fs(unsigned int fsr) | ||
15 | { | ||
16 | return fsr & FSR_FS5_0; | ||
17 | } | ||
18 | #else | ||
19 | static inline int fsr_fs(unsigned int fsr) | ||
20 | { | ||
21 | return (fsr & FSR_FS3_0) | (fsr & FSR_FS4) >> 6; | ||
22 | } | ||
23 | #endif | ||
2 | 24 | ||
25 | void do_bad_area(unsigned long addr, unsigned int fsr, struct pt_regs *regs); | ||
3 | unsigned long search_exception_table(unsigned long addr); | 26 | unsigned long search_exception_table(unsigned long addr); |
27 | |||
28 | #endif /* __ARCH_ARM_FAULT_H */ | ||
diff --git a/arch/arm/mm/fsr-2level.c b/arch/arm/mm/fsr-2level.c new file mode 100644 index 00000000000..18ca74c0f34 --- /dev/null +++ b/arch/arm/mm/fsr-2level.c | |||
@@ -0,0 +1,78 @@ | |||
1 | static struct fsr_info fsr_info[] = { | ||
2 | /* | ||
3 | * The following are the standard ARMv3 and ARMv4 aborts. ARMv5 | ||
4 | * defines these to be "precise" aborts. | ||
5 | */ | ||
6 | { do_bad, SIGSEGV, 0, "vector exception" }, | ||
7 | { do_bad, SIGBUS, BUS_ADRALN, "alignment exception" }, | ||
8 | { do_bad, SIGKILL, 0, "terminal exception" }, | ||
9 | { do_bad, SIGBUS, BUS_ADRALN, "alignment exception" }, | ||
10 | { do_bad, SIGBUS, 0, "external abort on linefetch" }, | ||
11 | { do_translation_fault, SIGSEGV, SEGV_MAPERR, "section translation fault" }, | ||
12 | { do_bad, SIGBUS, 0, "external abort on linefetch" }, | ||
13 | { do_page_fault, SIGSEGV, SEGV_MAPERR, "page translation fault" }, | ||
14 | { do_bad, SIGBUS, 0, "external abort on non-linefetch" }, | ||
15 | { do_bad, SIGSEGV, SEGV_ACCERR, "section domain fault" }, | ||
16 | { do_bad, SIGBUS, 0, "external abort on non-linefetch" }, | ||
17 | { do_bad, SIGSEGV, SEGV_ACCERR, "page domain fault" }, | ||
18 | { do_bad, SIGBUS, 0, "external abort on translation" }, | ||
19 | { do_sect_fault, SIGSEGV, SEGV_ACCERR, "section permission fault" }, | ||
20 | { do_bad, SIGBUS, 0, "external abort on translation" }, | ||
21 | { do_page_fault, SIGSEGV, SEGV_ACCERR, "page permission fault" }, | ||
22 | /* | ||
23 | * The following are "imprecise" aborts, which are signalled by bit | ||
24 | * 10 of the FSR, and may not be recoverable. These are only | ||
25 | * supported if the CPU abort handler supports bit 10. | ||
26 | */ | ||
27 | { do_bad, SIGBUS, 0, "unknown 16" }, | ||
28 | { do_bad, SIGBUS, 0, "unknown 17" }, | ||
29 | { do_bad, SIGBUS, 0, "unknown 18" }, | ||
30 | { do_bad, SIGBUS, 0, "unknown 19" }, | ||
31 | { do_bad, SIGBUS, 0, "lock abort" }, /* xscale */ | ||
32 | { do_bad, SIGBUS, 0, "unknown 21" }, | ||
33 | { do_bad, SIGBUS, BUS_OBJERR, "imprecise external abort" }, /* xscale */ | ||
34 | { do_bad, SIGBUS, 0, "unknown 23" }, | ||
35 | { do_bad, SIGBUS, 0, "dcache parity error" }, /* xscale */ | ||
36 | { do_bad, SIGBUS, 0, "unknown 25" }, | ||
37 | { do_bad, SIGBUS, 0, "unknown 26" }, | ||
38 | { do_bad, SIGBUS, 0, "unknown 27" }, | ||
39 | { do_bad, SIGBUS, 0, "unknown 28" }, | ||
40 | { do_bad, SIGBUS, 0, "unknown 29" }, | ||
41 | { do_bad, SIGBUS, 0, "unknown 30" }, | ||
42 | { do_bad, SIGBUS, 0, "unknown 31" }, | ||
43 | }; | ||
44 | |||
45 | static struct fsr_info ifsr_info[] = { | ||
46 | { do_bad, SIGBUS, 0, "unknown 0" }, | ||
47 | { do_bad, SIGBUS, 0, "unknown 1" }, | ||
48 | { do_bad, SIGBUS, 0, "debug event" }, | ||
49 | { do_bad, SIGSEGV, SEGV_ACCERR, "section access flag fault" }, | ||
50 | { do_bad, SIGBUS, 0, "unknown 4" }, | ||
51 | { do_translation_fault, SIGSEGV, SEGV_MAPERR, "section translation fault" }, | ||
52 | { do_bad, SIGSEGV, SEGV_ACCERR, "page access flag fault" }, | ||
53 | { do_page_fault, SIGSEGV, SEGV_MAPERR, "page translation fault" }, | ||
54 | { do_bad, SIGBUS, 0, "external abort on non-linefetch" }, | ||
55 | { do_bad, SIGSEGV, SEGV_ACCERR, "section domain fault" }, | ||
56 | { do_bad, SIGBUS, 0, "unknown 10" }, | ||
57 | { do_bad, SIGSEGV, SEGV_ACCERR, "page domain fault" }, | ||
58 | { do_bad, SIGBUS, 0, "external abort on translation" }, | ||
59 | { do_sect_fault, SIGSEGV, SEGV_ACCERR, "section permission fault" }, | ||
60 | { do_bad, SIGBUS, 0, "external abort on translation" }, | ||
61 | { do_page_fault, SIGSEGV, SEGV_ACCERR, "page permission fault" }, | ||
62 | { do_bad, SIGBUS, 0, "unknown 16" }, | ||
63 | { do_bad, SIGBUS, 0, "unknown 17" }, | ||
64 | { do_bad, SIGBUS, 0, "unknown 18" }, | ||
65 | { do_bad, SIGBUS, 0, "unknown 19" }, | ||
66 | { do_bad, SIGBUS, 0, "unknown 20" }, | ||
67 | { do_bad, SIGBUS, 0, "unknown 21" }, | ||
68 | { do_bad, SIGBUS, 0, "unknown 22" }, | ||
69 | { do_bad, SIGBUS, 0, "unknown 23" }, | ||
70 | { do_bad, SIGBUS, 0, "unknown 24" }, | ||
71 | { do_bad, SIGBUS, 0, "unknown 25" }, | ||
72 | { do_bad, SIGBUS, 0, "unknown 26" }, | ||
73 | { do_bad, SIGBUS, 0, "unknown 27" }, | ||
74 | { do_bad, SIGBUS, 0, "unknown 28" }, | ||
75 | { do_bad, SIGBUS, 0, "unknown 29" }, | ||
76 | { do_bad, SIGBUS, 0, "unknown 30" }, | ||
77 | { do_bad, SIGBUS, 0, "unknown 31" }, | ||
78 | }; | ||
diff --git a/arch/arm/mm/fsr-3level.c b/arch/arm/mm/fsr-3level.c new file mode 100644 index 00000000000..05a4e943183 --- /dev/null +++ b/arch/arm/mm/fsr-3level.c | |||
@@ -0,0 +1,68 @@ | |||
1 | static struct fsr_info fsr_info[] = { | ||
2 | { do_bad, SIGBUS, 0, "unknown 0" }, | ||
3 | { do_bad, SIGBUS, 0, "unknown 1" }, | ||
4 | { do_bad, SIGBUS, 0, "unknown 2" }, | ||
5 | { do_bad, SIGBUS, 0, "unknown 3" }, | ||
6 | { do_bad, SIGBUS, 0, "reserved translation fault" }, | ||
7 | { do_translation_fault, SIGSEGV, SEGV_MAPERR, "level 1 translation fault" }, | ||
8 | { do_translation_fault, SIGSEGV, SEGV_MAPERR, "level 2 translation fault" }, | ||
9 | { do_page_fault, SIGSEGV, SEGV_MAPERR, "level 3 translation fault" }, | ||
10 | { do_bad, SIGBUS, 0, "reserved access flag fault" }, | ||
11 | { do_bad, SIGSEGV, SEGV_ACCERR, "level 1 access flag fault" }, | ||
12 | { do_bad, SIGSEGV, SEGV_ACCERR, "level 2 access flag fault" }, | ||
13 | { do_page_fault, SIGSEGV, SEGV_ACCERR, "level 3 access flag fault" }, | ||
14 | { do_bad, SIGBUS, 0, "reserved permission fault" }, | ||
15 | { do_bad, SIGSEGV, SEGV_ACCERR, "level 1 permission fault" }, | ||
16 | { do_sect_fault, SIGSEGV, SEGV_ACCERR, "level 2 permission fault" }, | ||
17 | { do_page_fault, SIGSEGV, SEGV_ACCERR, "level 3 permission fault" }, | ||
18 | { do_bad, SIGBUS, 0, "synchronous external abort" }, | ||
19 | { do_bad, SIGBUS, 0, "asynchronous external abort" }, | ||
20 | { do_bad, SIGBUS, 0, "unknown 18" }, | ||
21 | { do_bad, SIGBUS, 0, "unknown 19" }, | ||
22 | { do_bad, SIGBUS, 0, "synchronous abort (translation table walk)" }, | ||
23 | { do_bad, SIGBUS, 0, "synchronous abort (translation table walk)" }, | ||
24 | { do_bad, SIGBUS, 0, "synchronous abort (translation table walk)" }, | ||
25 | { do_bad, SIGBUS, 0, "synchronous abort (translation table walk)" }, | ||
26 | { do_bad, SIGBUS, 0, "synchronous parity error" }, | ||
27 | { do_bad, SIGBUS, 0, "asynchronous parity error" }, | ||
28 | { do_bad, SIGBUS, 0, "unknown 26" }, | ||
29 | { do_bad, SIGBUS, 0, "unknown 27" }, | ||
30 | { do_bad, SIGBUS, 0, "synchronous parity error (translation table walk" }, | ||
31 | { do_bad, SIGBUS, 0, "synchronous parity error (translation table walk" }, | ||
32 | { do_bad, SIGBUS, 0, "synchronous parity error (translation table walk" }, | ||
33 | { do_bad, SIGBUS, 0, "synchronous parity error (translation table walk" }, | ||
34 | { do_bad, SIGBUS, 0, "unknown 32" }, | ||
35 | { do_bad, SIGBUS, BUS_ADRALN, "alignment fault" }, | ||
36 | { do_bad, SIGBUS, 0, "debug event" }, | ||
37 | { do_bad, SIGBUS, 0, "unknown 35" }, | ||
38 | { do_bad, SIGBUS, 0, "unknown 36" }, | ||
39 | { do_bad, SIGBUS, 0, "unknown 37" }, | ||
40 | { do_bad, SIGBUS, 0, "unknown 38" }, | ||
41 | { do_bad, SIGBUS, 0, "unknown 39" }, | ||
42 | { do_bad, SIGBUS, 0, "unknown 40" }, | ||
43 | { do_bad, SIGBUS, 0, "unknown 41" }, | ||
44 | { do_bad, SIGBUS, 0, "unknown 42" }, | ||
45 | { do_bad, SIGBUS, 0, "unknown 43" }, | ||
46 | { do_bad, SIGBUS, 0, "unknown 44" }, | ||
47 | { do_bad, SIGBUS, 0, "unknown 45" }, | ||
48 | { do_bad, SIGBUS, 0, "unknown 46" }, | ||
49 | { do_bad, SIGBUS, 0, "unknown 47" }, | ||
50 | { do_bad, SIGBUS, 0, "unknown 48" }, | ||
51 | { do_bad, SIGBUS, 0, "unknown 49" }, | ||
52 | { do_bad, SIGBUS, 0, "unknown 50" }, | ||
53 | { do_bad, SIGBUS, 0, "unknown 51" }, | ||
54 | { do_bad, SIGBUS, 0, "implementation fault (lockdown abort)" }, | ||
55 | { do_bad, SIGBUS, 0, "unknown 53" }, | ||
56 | { do_bad, SIGBUS, 0, "unknown 54" }, | ||
57 | { do_bad, SIGBUS, 0, "unknown 55" }, | ||
58 | { do_bad, SIGBUS, 0, "unknown 56" }, | ||
59 | { do_bad, SIGBUS, 0, "unknown 57" }, | ||
60 | { do_bad, SIGBUS, 0, "implementation fault (coprocessor abort)" }, | ||
61 | { do_bad, SIGBUS, 0, "unknown 59" }, | ||
62 | { do_bad, SIGBUS, 0, "unknown 60" }, | ||
63 | { do_bad, SIGBUS, 0, "unknown 61" }, | ||
64 | { do_bad, SIGBUS, 0, "unknown 62" }, | ||
65 | { do_bad, SIGBUS, 0, "unknown 63" }, | ||
66 | }; | ||
67 | |||
68 | #define ifsr_info fsr_info | ||
diff --git a/arch/arm/mm/idmap.c b/arch/arm/mm/idmap.c index 296ad2eaddb..feacf4c7671 100644 --- a/arch/arm/mm/idmap.c +++ b/arch/arm/mm/idmap.c | |||
@@ -1,9 +1,38 @@ | |||
1 | #include <linux/kernel.h> | 1 | #include <linux/kernel.h> |
2 | 2 | ||
3 | #include <asm/cputype.h> | 3 | #include <asm/cputype.h> |
4 | #include <asm/idmap.h> | ||
4 | #include <asm/pgalloc.h> | 5 | #include <asm/pgalloc.h> |
5 | #include <asm/pgtable.h> | 6 | #include <asm/pgtable.h> |
7 | #include <asm/sections.h> | ||
6 | 8 | ||
9 | pgd_t *idmap_pgd; | ||
10 | |||
11 | #ifdef CONFIG_ARM_LPAE | ||
12 | static void idmap_add_pmd(pud_t *pud, unsigned long addr, unsigned long end, | ||
13 | unsigned long prot) | ||
14 | { | ||
15 | pmd_t *pmd; | ||
16 | unsigned long next; | ||
17 | |||
18 | if (pud_none_or_clear_bad(pud) || (pud_val(*pud) & L_PGD_SWAPPER)) { | ||
19 | pmd = pmd_alloc_one(&init_mm, addr); | ||
20 | if (!pmd) { | ||
21 | pr_warning("Failed to allocate identity pmd.\n"); | ||
22 | return; | ||
23 | } | ||
24 | pud_populate(&init_mm, pud, pmd); | ||
25 | pmd += pmd_index(addr); | ||
26 | } else | ||
27 | pmd = pmd_offset(pud, addr); | ||
28 | |||
29 | do { | ||
30 | next = pmd_addr_end(addr, end); | ||
31 | *pmd = __pmd((addr & PMD_MASK) | prot); | ||
32 | flush_pmd_entry(pmd); | ||
33 | } while (pmd++, addr = next, addr != end); | ||
34 | } | ||
35 | #else /* !CONFIG_ARM_LPAE */ | ||
7 | static void idmap_add_pmd(pud_t *pud, unsigned long addr, unsigned long end, | 36 | static void idmap_add_pmd(pud_t *pud, unsigned long addr, unsigned long end, |
8 | unsigned long prot) | 37 | unsigned long prot) |
9 | { | 38 | { |
@@ -15,6 +44,7 @@ static void idmap_add_pmd(pud_t *pud, unsigned long addr, unsigned long end, | |||
15 | pmd[1] = __pmd(addr); | 44 | pmd[1] = __pmd(addr); |
16 | flush_pmd_entry(pmd); | 45 | flush_pmd_entry(pmd); |
17 | } | 46 | } |
47 | #endif /* CONFIG_ARM_LPAE */ | ||
18 | 48 | ||
19 | static void idmap_add_pud(pgd_t *pgd, unsigned long addr, unsigned long end, | 49 | static void idmap_add_pud(pgd_t *pgd, unsigned long addr, unsigned long end, |
20 | unsigned long prot) | 50 | unsigned long prot) |
@@ -28,11 +58,11 @@ static void idmap_add_pud(pgd_t *pgd, unsigned long addr, unsigned long end, | |||
28 | } while (pud++, addr = next, addr != end); | 58 | } while (pud++, addr = next, addr != end); |
29 | } | 59 | } |
30 | 60 | ||
31 | void identity_mapping_add(pgd_t *pgd, unsigned long addr, unsigned long end) | 61 | static void identity_mapping_add(pgd_t *pgd, unsigned long addr, unsigned long end) |
32 | { | 62 | { |
33 | unsigned long prot, next; | 63 | unsigned long prot, next; |
34 | 64 | ||
35 | prot = PMD_TYPE_SECT | PMD_SECT_AP_WRITE; | 65 | prot = PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AF; |
36 | if (cpu_architecture() <= CPU_ARCH_ARMv5TEJ && !cpu_is_xscale()) | 66 | if (cpu_architecture() <= CPU_ARCH_ARMv5TEJ && !cpu_is_xscale()) |
37 | prot |= PMD_BIT4; | 67 | prot |= PMD_BIT4; |
38 | 68 | ||
@@ -43,48 +73,41 @@ void identity_mapping_add(pgd_t *pgd, unsigned long addr, unsigned long end) | |||
43 | } while (pgd++, addr = next, addr != end); | 73 | } while (pgd++, addr = next, addr != end); |
44 | } | 74 | } |
45 | 75 | ||
46 | #ifdef CONFIG_SMP | 76 | extern char __idmap_text_start[], __idmap_text_end[]; |
47 | static void idmap_del_pmd(pud_t *pud, unsigned long addr, unsigned long end) | ||
48 | { | ||
49 | pmd_t *pmd = pmd_offset(pud, addr); | ||
50 | pmd_clear(pmd); | ||
51 | } | ||
52 | 77 | ||
53 | static void idmap_del_pud(pgd_t *pgd, unsigned long addr, unsigned long end) | 78 | static int __init init_static_idmap(void) |
54 | { | 79 | { |
55 | pud_t *pud = pud_offset(pgd, addr); | 80 | phys_addr_t idmap_start, idmap_end; |
56 | unsigned long next; | ||
57 | 81 | ||
58 | do { | 82 | idmap_pgd = pgd_alloc(&init_mm); |
59 | next = pud_addr_end(addr, end); | 83 | if (!idmap_pgd) |
60 | idmap_del_pmd(pud, addr, next); | 84 | return -ENOMEM; |
61 | } while (pud++, addr = next, addr != end); | ||
62 | } | ||
63 | 85 | ||
64 | void identity_mapping_del(pgd_t *pgd, unsigned long addr, unsigned long end) | 86 | /* Add an identity mapping for the physical address of the section. */ |
65 | { | 87 | idmap_start = virt_to_phys((void *)__idmap_text_start); |
66 | unsigned long next; | 88 | idmap_end = virt_to_phys((void *)__idmap_text_end); |
67 | 89 | ||
68 | pgd += pgd_index(addr); | 90 | pr_info("Setting up static identity map for 0x%llx - 0x%llx\n", |
69 | do { | 91 | (long long)idmap_start, (long long)idmap_end); |
70 | next = pgd_addr_end(addr, end); | 92 | identity_mapping_add(idmap_pgd, idmap_start, idmap_end); |
71 | idmap_del_pud(pgd, addr, next); | 93 | |
72 | } while (pgd++, addr = next, addr != end); | 94 | return 0; |
73 | } | 95 | } |
74 | #endif | 96 | early_initcall(init_static_idmap); |
75 | 97 | ||
76 | /* | 98 | /* |
77 | * In order to soft-boot, we need to insert a 1:1 mapping in place of | 99 | * In order to soft-boot, we need to switch to a 1:1 mapping for the |
78 | * the user-mode pages. This will then ensure that we have predictable | 100 | * cpu_reset functions. This will then ensure that we have predictable |
79 | * results when turning the mmu off | 101 | * results when turning off the mmu. |
80 | */ | 102 | */ |
81 | void setup_mm_for_reboot(void) | 103 | void setup_mm_for_reboot(void) |
82 | { | 104 | { |
83 | /* | 105 | /* Clean and invalidate L1. */ |
84 | * We need to access to user-mode page tables here. For kernel threads | 106 | flush_cache_all(); |
85 | * we don't have any user-mode mappings so we use the context that we | 107 | |
86 | * "borrowed". | 108 | /* Switch to the identity mapping. */ |
87 | */ | 109 | cpu_switch_mm(idmap_pgd, &init_mm); |
88 | identity_mapping_add(current->active_mm->pgd, 0, TASK_SIZE); | 110 | |
111 | /* Flush the TLB. */ | ||
89 | local_flush_tlb_all(); | 112 | local_flush_tlb_all(); |
90 | } | 113 | } |
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index fbdd12ea3a5..786adddf1a8 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c | |||
@@ -20,7 +20,6 @@ | |||
20 | #include <linux/highmem.h> | 20 | #include <linux/highmem.h> |
21 | #include <linux/gfp.h> | 21 | #include <linux/gfp.h> |
22 | #include <linux/memblock.h> | 22 | #include <linux/memblock.h> |
23 | #include <linux/sort.h> | ||
24 | 23 | ||
25 | #include <asm/mach-types.h> | 24 | #include <asm/mach-types.h> |
26 | #include <asm/prom.h> | 25 | #include <asm/prom.h> |
@@ -134,30 +133,18 @@ void show_mem(unsigned int filter) | |||
134 | } | 133 | } |
135 | 134 | ||
136 | static void __init find_limits(unsigned long *min, unsigned long *max_low, | 135 | static void __init find_limits(unsigned long *min, unsigned long *max_low, |
137 | unsigned long *max_high) | 136 | unsigned long *max_high) |
138 | { | 137 | { |
139 | struct meminfo *mi = &meminfo; | 138 | struct meminfo *mi = &meminfo; |
140 | int i; | 139 | int i; |
141 | 140 | ||
142 | *min = -1UL; | 141 | /* This assumes the meminfo array is properly sorted */ |
143 | *max_low = *max_high = 0; | 142 | *min = bank_pfn_start(&mi->bank[0]); |
144 | 143 | for_each_bank (i, mi) | |
145 | for_each_bank (i, mi) { | 144 | if (mi->bank[i].highmem) |
146 | struct membank *bank = &mi->bank[i]; | 145 | break; |
147 | unsigned long start, end; | 146 | *max_low = bank_pfn_end(&mi->bank[i - 1]); |
148 | 147 | *max_high = bank_pfn_end(&mi->bank[mi->nr_banks - 1]); | |
149 | start = bank_pfn_start(bank); | ||
150 | end = bank_pfn_end(bank); | ||
151 | |||
152 | if (*min > start) | ||
153 | *min = start; | ||
154 | if (*max_high < end) | ||
155 | *max_high = end; | ||
156 | if (bank->highmem) | ||
157 | continue; | ||
158 | if (*max_low < end) | ||
159 | *max_low = end; | ||
160 | } | ||
161 | } | 148 | } |
162 | 149 | ||
163 | static void __init arm_bootmem_init(unsigned long start_pfn, | 150 | static void __init arm_bootmem_init(unsigned long start_pfn, |
@@ -319,19 +306,10 @@ static void arm_memory_present(void) | |||
319 | } | 306 | } |
320 | #endif | 307 | #endif |
321 | 308 | ||
322 | static int __init meminfo_cmp(const void *_a, const void *_b) | ||
323 | { | ||
324 | const struct membank *a = _a, *b = _b; | ||
325 | long cmp = bank_pfn_start(a) - bank_pfn_start(b); | ||
326 | return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; | ||
327 | } | ||
328 | |||
329 | void __init arm_memblock_init(struct meminfo *mi, struct machine_desc *mdesc) | 309 | void __init arm_memblock_init(struct meminfo *mi, struct machine_desc *mdesc) |
330 | { | 310 | { |
331 | int i; | 311 | int i; |
332 | 312 | ||
333 | sort(&meminfo.bank, meminfo.nr_banks, sizeof(meminfo.bank[0]), meminfo_cmp, NULL); | ||
334 | |||
335 | memblock_init(); | 313 | memblock_init(); |
336 | for (i = 0; i < mi->nr_banks; i++) | 314 | for (i = 0; i < mi->nr_banks; i++) |
337 | memblock_add(mi->bank[i].start, mi->bank[i].size); | 315 | memblock_add(mi->bank[i].start, mi->bank[i].size); |
@@ -403,8 +381,6 @@ void __init bootmem_init(void) | |||
403 | */ | 381 | */ |
404 | arm_bootmem_free(min, max_low, max_high); | 382 | arm_bootmem_free(min, max_low, max_high); |
405 | 383 | ||
406 | high_memory = __va(((phys_addr_t)max_low << PAGE_SHIFT) - 1) + 1; | ||
407 | |||
408 | /* | 384 | /* |
409 | * This doesn't seem to be used by the Linux memory manager any | 385 | * This doesn't seem to be used by the Linux memory manager any |
410 | * more, but is used by ll_rw_block. If we can get rid of it, we | 386 | * more, but is used by ll_rw_block. If we can get rid of it, we |
diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c index bdb248c4f55..80632e8d753 100644 --- a/arch/arm/mm/ioremap.c +++ b/arch/arm/mm/ioremap.c | |||
@@ -36,12 +36,6 @@ | |||
36 | #include <asm/mach/map.h> | 36 | #include <asm/mach/map.h> |
37 | #include "mm.h" | 37 | #include "mm.h" |
38 | 38 | ||
39 | /* | ||
40 | * Used by ioremap() and iounmap() code to mark (super)section-mapped | ||
41 | * I/O regions in vm_struct->flags field. | ||
42 | */ | ||
43 | #define VM_ARM_SECTION_MAPPING 0x80000000 | ||
44 | |||
45 | int ioremap_page(unsigned long virt, unsigned long phys, | 39 | int ioremap_page(unsigned long virt, unsigned long phys, |
46 | const struct mem_type *mtype) | 40 | const struct mem_type *mtype) |
47 | { | 41 | { |
@@ -64,7 +58,7 @@ void __check_kvm_seq(struct mm_struct *mm) | |||
64 | } while (seq != init_mm.context.kvm_seq); | 58 | } while (seq != init_mm.context.kvm_seq); |
65 | } | 59 | } |
66 | 60 | ||
67 | #ifndef CONFIG_SMP | 61 | #if !defined(CONFIG_SMP) && !defined(CONFIG_ARM_LPAE) |
68 | /* | 62 | /* |
69 | * Section support is unsafe on SMP - If you iounmap and ioremap a region, | 63 | * Section support is unsafe on SMP - If you iounmap and ioremap a region, |
70 | * the other CPUs will not see this change until their next context switch. | 64 | * the other CPUs will not see this change until their next context switch. |
@@ -79,13 +73,16 @@ static void unmap_area_sections(unsigned long virt, unsigned long size) | |||
79 | { | 73 | { |
80 | unsigned long addr = virt, end = virt + (size & ~(SZ_1M - 1)); | 74 | unsigned long addr = virt, end = virt + (size & ~(SZ_1M - 1)); |
81 | pgd_t *pgd; | 75 | pgd_t *pgd; |
76 | pud_t *pud; | ||
77 | pmd_t *pmdp; | ||
82 | 78 | ||
83 | flush_cache_vunmap(addr, end); | 79 | flush_cache_vunmap(addr, end); |
84 | pgd = pgd_offset_k(addr); | 80 | pgd = pgd_offset_k(addr); |
81 | pud = pud_offset(pgd, addr); | ||
82 | pmdp = pmd_offset(pud, addr); | ||
85 | do { | 83 | do { |
86 | pmd_t pmd, *pmdp = pmd_offset(pgd, addr); | 84 | pmd_t pmd = *pmdp; |
87 | 85 | ||
88 | pmd = *pmdp; | ||
89 | if (!pmd_none(pmd)) { | 86 | if (!pmd_none(pmd)) { |
90 | /* | 87 | /* |
91 | * Clear the PMD from the page table, and | 88 | * Clear the PMD from the page table, and |
@@ -104,8 +101,8 @@ static void unmap_area_sections(unsigned long virt, unsigned long size) | |||
104 | pte_free_kernel(&init_mm, pmd_page_vaddr(pmd)); | 101 | pte_free_kernel(&init_mm, pmd_page_vaddr(pmd)); |
105 | } | 102 | } |
106 | 103 | ||
107 | addr += PGDIR_SIZE; | 104 | addr += PMD_SIZE; |
108 | pgd++; | 105 | pmdp += 2; |
109 | } while (addr < end); | 106 | } while (addr < end); |
110 | 107 | ||
111 | /* | 108 | /* |
@@ -124,6 +121,8 @@ remap_area_sections(unsigned long virt, unsigned long pfn, | |||
124 | { | 121 | { |
125 | unsigned long addr = virt, end = virt + size; | 122 | unsigned long addr = virt, end = virt + size; |
126 | pgd_t *pgd; | 123 | pgd_t *pgd; |
124 | pud_t *pud; | ||
125 | pmd_t *pmd; | ||
127 | 126 | ||
128 | /* | 127 | /* |
129 | * Remove and free any PTE-based mapping, and | 128 | * Remove and free any PTE-based mapping, and |
@@ -132,17 +131,17 @@ remap_area_sections(unsigned long virt, unsigned long pfn, | |||
132 | unmap_area_sections(virt, size); | 131 | unmap_area_sections(virt, size); |
133 | 132 | ||
134 | pgd = pgd_offset_k(addr); | 133 | pgd = pgd_offset_k(addr); |
134 | pud = pud_offset(pgd, addr); | ||
135 | pmd = pmd_offset(pud, addr); | ||
135 | do { | 136 | do { |
136 | pmd_t *pmd = pmd_offset(pgd, addr); | ||
137 | |||
138 | pmd[0] = __pmd(__pfn_to_phys(pfn) | type->prot_sect); | 137 | pmd[0] = __pmd(__pfn_to_phys(pfn) | type->prot_sect); |
139 | pfn += SZ_1M >> PAGE_SHIFT; | 138 | pfn += SZ_1M >> PAGE_SHIFT; |
140 | pmd[1] = __pmd(__pfn_to_phys(pfn) | type->prot_sect); | 139 | pmd[1] = __pmd(__pfn_to_phys(pfn) | type->prot_sect); |
141 | pfn += SZ_1M >> PAGE_SHIFT; | 140 | pfn += SZ_1M >> PAGE_SHIFT; |
142 | flush_pmd_entry(pmd); | 141 | flush_pmd_entry(pmd); |
143 | 142 | ||
144 | addr += PGDIR_SIZE; | 143 | addr += PMD_SIZE; |
145 | pgd++; | 144 | pmd += 2; |
146 | } while (addr < end); | 145 | } while (addr < end); |
147 | 146 | ||
148 | return 0; | 147 | return 0; |
@@ -154,6 +153,8 @@ remap_area_supersections(unsigned long virt, unsigned long pfn, | |||
154 | { | 153 | { |
155 | unsigned long addr = virt, end = virt + size; | 154 | unsigned long addr = virt, end = virt + size; |
156 | pgd_t *pgd; | 155 | pgd_t *pgd; |
156 | pud_t *pud; | ||
157 | pmd_t *pmd; | ||
157 | 158 | ||
158 | /* | 159 | /* |
159 | * Remove and free any PTE-based mapping, and | 160 | * Remove and free any PTE-based mapping, and |
@@ -162,6 +163,8 @@ remap_area_supersections(unsigned long virt, unsigned long pfn, | |||
162 | unmap_area_sections(virt, size); | 163 | unmap_area_sections(virt, size); |
163 | 164 | ||
164 | pgd = pgd_offset_k(virt); | 165 | pgd = pgd_offset_k(virt); |
166 | pud = pud_offset(pgd, addr); | ||
167 | pmd = pmd_offset(pud, addr); | ||
165 | do { | 168 | do { |
166 | unsigned long super_pmd_val, i; | 169 | unsigned long super_pmd_val, i; |
167 | 170 | ||
@@ -170,14 +173,12 @@ remap_area_supersections(unsigned long virt, unsigned long pfn, | |||
170 | super_pmd_val |= ((pfn >> (32 - PAGE_SHIFT)) & 0xf) << 20; | 173 | super_pmd_val |= ((pfn >> (32 - PAGE_SHIFT)) & 0xf) << 20; |
171 | 174 | ||
172 | for (i = 0; i < 8; i++) { | 175 | for (i = 0; i < 8; i++) { |
173 | pmd_t *pmd = pmd_offset(pgd, addr); | ||
174 | |||
175 | pmd[0] = __pmd(super_pmd_val); | 176 | pmd[0] = __pmd(super_pmd_val); |
176 | pmd[1] = __pmd(super_pmd_val); | 177 | pmd[1] = __pmd(super_pmd_val); |
177 | flush_pmd_entry(pmd); | 178 | flush_pmd_entry(pmd); |
178 | 179 | ||
179 | addr += PGDIR_SIZE; | 180 | addr += PMD_SIZE; |
180 | pgd++; | 181 | pmd += 2; |
181 | } | 182 | } |
182 | 183 | ||
183 | pfn += SUPERSECTION_SIZE >> PAGE_SHIFT; | 184 | pfn += SUPERSECTION_SIZE >> PAGE_SHIFT; |
@@ -195,17 +196,13 @@ void __iomem * __arm_ioremap_pfn_caller(unsigned long pfn, | |||
195 | unsigned long addr; | 196 | unsigned long addr; |
196 | struct vm_struct * area; | 197 | struct vm_struct * area; |
197 | 198 | ||
199 | #ifndef CONFIG_ARM_LPAE | ||
198 | /* | 200 | /* |
199 | * High mappings must be supersection aligned | 201 | * High mappings must be supersection aligned |
200 | */ | 202 | */ |
201 | if (pfn >= 0x100000 && (__pfn_to_phys(pfn) & ~SUPERSECTION_MASK)) | 203 | if (pfn >= 0x100000 && (__pfn_to_phys(pfn) & ~SUPERSECTION_MASK)) |
202 | return NULL; | 204 | return NULL; |
203 | 205 | #endif | |
204 | /* | ||
205 | * Don't allow RAM to be mapped - this causes problems with ARMv6+ | ||
206 | */ | ||
207 | if (WARN_ON(pfn_valid(pfn))) | ||
208 | return NULL; | ||
209 | 206 | ||
210 | type = get_mem_type(mtype); | 207 | type = get_mem_type(mtype); |
211 | if (!type) | 208 | if (!type) |
@@ -216,12 +213,40 @@ void __iomem * __arm_ioremap_pfn_caller(unsigned long pfn, | |||
216 | */ | 213 | */ |
217 | size = PAGE_ALIGN(offset + size); | 214 | size = PAGE_ALIGN(offset + size); |
218 | 215 | ||
216 | /* | ||
217 | * Try to reuse one of the static mapping whenever possible. | ||
218 | */ | ||
219 | read_lock(&vmlist_lock); | ||
220 | for (area = vmlist; area; area = area->next) { | ||
221 | if (!size || (sizeof(phys_addr_t) == 4 && pfn >= 0x100000)) | ||
222 | break; | ||
223 | if (!(area->flags & VM_ARM_STATIC_MAPPING)) | ||
224 | continue; | ||
225 | if ((area->flags & VM_ARM_MTYPE_MASK) != VM_ARM_MTYPE(mtype)) | ||
226 | continue; | ||
227 | if (__phys_to_pfn(area->phys_addr) > pfn || | ||
228 | __pfn_to_phys(pfn) + size-1 > area->phys_addr + area->size-1) | ||
229 | continue; | ||
230 | /* we can drop the lock here as we know *area is static */ | ||
231 | read_unlock(&vmlist_lock); | ||
232 | addr = (unsigned long)area->addr; | ||
233 | addr += __pfn_to_phys(pfn) - area->phys_addr; | ||
234 | return (void __iomem *) (offset + addr); | ||
235 | } | ||
236 | read_unlock(&vmlist_lock); | ||
237 | |||
238 | /* | ||
239 | * Don't allow RAM to be mapped - this causes problems with ARMv6+ | ||
240 | */ | ||
241 | if (WARN_ON(pfn_valid(pfn))) | ||
242 | return NULL; | ||
243 | |||
219 | area = get_vm_area_caller(size, VM_IOREMAP, caller); | 244 | area = get_vm_area_caller(size, VM_IOREMAP, caller); |
220 | if (!area) | 245 | if (!area) |
221 | return NULL; | 246 | return NULL; |
222 | addr = (unsigned long)area->addr; | 247 | addr = (unsigned long)area->addr; |
223 | 248 | ||
224 | #ifndef CONFIG_SMP | 249 | #if !defined(CONFIG_SMP) && !defined(CONFIG_ARM_LPAE) |
225 | if (DOMAIN_IO == 0 && | 250 | if (DOMAIN_IO == 0 && |
226 | (((cpu_architecture() >= CPU_ARCH_ARMv6) && (get_cr() & CR_XP)) || | 251 | (((cpu_architecture() >= CPU_ARCH_ARMv6) && (get_cr() & CR_XP)) || |
227 | cpu_is_xsc3()) && pfn >= 0x100000 && | 252 | cpu_is_xsc3()) && pfn >= 0x100000 && |
@@ -313,28 +338,34 @@ __arm_ioremap_exec(unsigned long phys_addr, size_t size, bool cached) | |||
313 | void __iounmap(volatile void __iomem *io_addr) | 338 | void __iounmap(volatile void __iomem *io_addr) |
314 | { | 339 | { |
315 | void *addr = (void *)(PAGE_MASK & (unsigned long)io_addr); | 340 | void *addr = (void *)(PAGE_MASK & (unsigned long)io_addr); |
316 | #ifndef CONFIG_SMP | 341 | struct vm_struct *vm; |
317 | struct vm_struct **p, *tmp; | ||
318 | 342 | ||
319 | /* | 343 | read_lock(&vmlist_lock); |
320 | * If this is a section based mapping we need to handle it | 344 | for (vm = vmlist; vm; vm = vm->next) { |
321 | * specially as the VM subsystem does not know how to handle | 345 | if (vm->addr > addr) |
322 | * such a beast. We need the lock here b/c we need to clear | 346 | break; |
323 | * all the mappings before the area can be reclaimed | 347 | if (!(vm->flags & VM_IOREMAP)) |
324 | * by someone else. | 348 | continue; |
325 | */ | 349 | /* If this is a static mapping we must leave it alone */ |
326 | write_lock(&vmlist_lock); | 350 | if ((vm->flags & VM_ARM_STATIC_MAPPING) && |
327 | for (p = &vmlist ; (tmp = *p) ; p = &tmp->next) { | 351 | (vm->addr <= addr) && (vm->addr + vm->size > addr)) { |
328 | if ((tmp->flags & VM_IOREMAP) && (tmp->addr == addr)) { | 352 | read_unlock(&vmlist_lock); |
329 | if (tmp->flags & VM_ARM_SECTION_MAPPING) { | 353 | return; |
330 | unmap_area_sections((unsigned long)tmp->addr, | 354 | } |
331 | tmp->size); | 355 | #if !defined(CONFIG_SMP) && !defined(CONFIG_ARM_LPAE) |
332 | } | 356 | /* |
357 | * If this is a section based mapping we need to handle it | ||
358 | * specially as the VM subsystem does not know how to handle | ||
359 | * such a beast. | ||
360 | */ | ||
361 | if ((vm->addr == addr) && | ||
362 | (vm->flags & VM_ARM_SECTION_MAPPING)) { | ||
363 | unmap_area_sections((unsigned long)vm->addr, vm->size); | ||
333 | break; | 364 | break; |
334 | } | 365 | } |
335 | } | ||
336 | write_unlock(&vmlist_lock); | ||
337 | #endif | 366 | #endif |
367 | } | ||
368 | read_unlock(&vmlist_lock); | ||
338 | 369 | ||
339 | vunmap(addr); | 370 | vunmap(addr); |
340 | } | 371 | } |
diff --git a/arch/arm/mm/mm.h b/arch/arm/mm/mm.h index ad7cce3bc43..70f6d3ea483 100644 --- a/arch/arm/mm/mm.h +++ b/arch/arm/mm/mm.h | |||
@@ -21,6 +21,20 @@ const struct mem_type *get_mem_type(unsigned int type); | |||
21 | 21 | ||
22 | extern void __flush_dcache_page(struct address_space *mapping, struct page *page); | 22 | extern void __flush_dcache_page(struct address_space *mapping, struct page *page); |
23 | 23 | ||
24 | /* | ||
25 | * ARM specific vm_struct->flags bits. | ||
26 | */ | ||
27 | |||
28 | /* (super)section-mapped I/O regions used by ioremap()/iounmap() */ | ||
29 | #define VM_ARM_SECTION_MAPPING 0x80000000 | ||
30 | |||
31 | /* permanent static mappings from iotable_init() */ | ||
32 | #define VM_ARM_STATIC_MAPPING 0x40000000 | ||
33 | |||
34 | /* mapping type (attributes) for permanent static mappings */ | ||
35 | #define VM_ARM_MTYPE(mt) ((mt) << 20) | ||
36 | #define VM_ARM_MTYPE_MASK (0x1f << 20) | ||
37 | |||
24 | #endif | 38 | #endif |
25 | 39 | ||
26 | #ifdef CONFIG_ZONE_DMA | 40 | #ifdef CONFIG_ZONE_DMA |
diff --git a/arch/arm/mm/mmap.c b/arch/arm/mm/mmap.c index 44b628e4d6e..ce8cb1970d7 100644 --- a/arch/arm/mm/mmap.c +++ b/arch/arm/mm/mmap.c | |||
@@ -11,10 +11,49 @@ | |||
11 | #include <linux/random.h> | 11 | #include <linux/random.h> |
12 | #include <asm/cachetype.h> | 12 | #include <asm/cachetype.h> |
13 | 13 | ||
14 | static inline unsigned long COLOUR_ALIGN_DOWN(unsigned long addr, | ||
15 | unsigned long pgoff) | ||
16 | { | ||
17 | unsigned long base = addr & ~(SHMLBA-1); | ||
18 | unsigned long off = (pgoff << PAGE_SHIFT) & (SHMLBA-1); | ||
19 | |||
20 | if (base + off <= addr) | ||
21 | return base + off; | ||
22 | |||
23 | return base - off; | ||
24 | } | ||
25 | |||
14 | #define COLOUR_ALIGN(addr,pgoff) \ | 26 | #define COLOUR_ALIGN(addr,pgoff) \ |
15 | ((((addr)+SHMLBA-1)&~(SHMLBA-1)) + \ | 27 | ((((addr)+SHMLBA-1)&~(SHMLBA-1)) + \ |
16 | (((pgoff)<<PAGE_SHIFT) & (SHMLBA-1))) | 28 | (((pgoff)<<PAGE_SHIFT) & (SHMLBA-1))) |
17 | 29 | ||
30 | /* gap between mmap and stack */ | ||
31 | #define MIN_GAP (128*1024*1024UL) | ||
32 | #define MAX_GAP ((TASK_SIZE)/6*5) | ||
33 | |||
34 | static int mmap_is_legacy(void) | ||
35 | { | ||
36 | if (current->personality & ADDR_COMPAT_LAYOUT) | ||
37 | return 1; | ||
38 | |||
39 | if (rlimit(RLIMIT_STACK) == RLIM_INFINITY) | ||
40 | return 1; | ||
41 | |||
42 | return sysctl_legacy_va_layout; | ||
43 | } | ||
44 | |||
45 | static unsigned long mmap_base(unsigned long rnd) | ||
46 | { | ||
47 | unsigned long gap = rlimit(RLIMIT_STACK); | ||
48 | |||
49 | if (gap < MIN_GAP) | ||
50 | gap = MIN_GAP; | ||
51 | else if (gap > MAX_GAP) | ||
52 | gap = MAX_GAP; | ||
53 | |||
54 | return PAGE_ALIGN(TASK_SIZE - gap - rnd); | ||
55 | } | ||
56 | |||
18 | /* | 57 | /* |
19 | * We need to ensure that shared mappings are correctly aligned to | 58 | * We need to ensure that shared mappings are correctly aligned to |
20 | * avoid aliasing issues with VIPT caches. We need to ensure that | 59 | * avoid aliasing issues with VIPT caches. We need to ensure that |
@@ -68,13 +107,9 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, | |||
68 | if (len > mm->cached_hole_size) { | 107 | if (len > mm->cached_hole_size) { |
69 | start_addr = addr = mm->free_area_cache; | 108 | start_addr = addr = mm->free_area_cache; |
70 | } else { | 109 | } else { |
71 | start_addr = addr = TASK_UNMAPPED_BASE; | 110 | start_addr = addr = mm->mmap_base; |
72 | mm->cached_hole_size = 0; | 111 | mm->cached_hole_size = 0; |
73 | } | 112 | } |
74 | /* 8 bits of randomness in 20 address space bits */ | ||
75 | if ((current->flags & PF_RANDOMIZE) && | ||
76 | !(current->personality & ADDR_NO_RANDOMIZE)) | ||
77 | addr += (get_random_int() % (1 << 8)) << PAGE_SHIFT; | ||
78 | 113 | ||
79 | full_search: | 114 | full_search: |
80 | if (do_align) | 115 | if (do_align) |
@@ -111,6 +146,134 @@ full_search: | |||
111 | } | 146 | } |
112 | } | 147 | } |
113 | 148 | ||
149 | unsigned long | ||
150 | arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, | ||
151 | const unsigned long len, const unsigned long pgoff, | ||
152 | const unsigned long flags) | ||
153 | { | ||
154 | struct vm_area_struct *vma; | ||
155 | struct mm_struct *mm = current->mm; | ||
156 | unsigned long addr = addr0; | ||
157 | int do_align = 0; | ||
158 | int aliasing = cache_is_vipt_aliasing(); | ||
159 | |||
160 | /* | ||
161 | * We only need to do colour alignment if either the I or D | ||
162 | * caches alias. | ||
163 | */ | ||
164 | if (aliasing) | ||
165 | do_align = filp || (flags & MAP_SHARED); | ||
166 | |||
167 | /* requested length too big for entire address space */ | ||
168 | if (len > TASK_SIZE) | ||
169 | return -ENOMEM; | ||
170 | |||
171 | if (flags & MAP_FIXED) { | ||
172 | if (aliasing && flags & MAP_SHARED && | ||
173 | (addr - (pgoff << PAGE_SHIFT)) & (SHMLBA - 1)) | ||
174 | return -EINVAL; | ||
175 | return addr; | ||
176 | } | ||
177 | |||
178 | /* requesting a specific address */ | ||
179 | if (addr) { | ||
180 | if (do_align) | ||
181 | addr = COLOUR_ALIGN(addr, pgoff); | ||
182 | else | ||
183 | addr = PAGE_ALIGN(addr); | ||
184 | vma = find_vma(mm, addr); | ||
185 | if (TASK_SIZE - len >= addr && | ||
186 | (!vma || addr + len <= vma->vm_start)) | ||
187 | return addr; | ||
188 | } | ||
189 | |||
190 | /* check if free_area_cache is useful for us */ | ||
191 | if (len <= mm->cached_hole_size) { | ||
192 | mm->cached_hole_size = 0; | ||
193 | mm->free_area_cache = mm->mmap_base; | ||
194 | } | ||
195 | |||
196 | /* either no address requested or can't fit in requested address hole */ | ||
197 | addr = mm->free_area_cache; | ||
198 | if (do_align) { | ||
199 | unsigned long base = COLOUR_ALIGN_DOWN(addr - len, pgoff); | ||
200 | addr = base + len; | ||
201 | } | ||
202 | |||
203 | /* make sure it can fit in the remaining address space */ | ||
204 | if (addr > len) { | ||
205 | vma = find_vma(mm, addr-len); | ||
206 | if (!vma || addr <= vma->vm_start) | ||
207 | /* remember the address as a hint for next time */ | ||
208 | return (mm->free_area_cache = addr-len); | ||
209 | } | ||
210 | |||
211 | if (mm->mmap_base < len) | ||
212 | goto bottomup; | ||
213 | |||
214 | addr = mm->mmap_base - len; | ||
215 | if (do_align) | ||
216 | addr = COLOUR_ALIGN_DOWN(addr, pgoff); | ||
217 | |||
218 | do { | ||
219 | /* | ||
220 | * Lookup failure means no vma is above this address, | ||
221 | * else if new region fits below vma->vm_start, | ||
222 | * return with success: | ||
223 | */ | ||
224 | vma = find_vma(mm, addr); | ||
225 | if (!vma || addr+len <= vma->vm_start) | ||
226 | /* remember the address as a hint for next time */ | ||
227 | return (mm->free_area_cache = addr); | ||
228 | |||
229 | /* remember the largest hole we saw so far */ | ||
230 | if (addr + mm->cached_hole_size < vma->vm_start) | ||
231 | mm->cached_hole_size = vma->vm_start - addr; | ||
232 | |||
233 | /* try just below the current vma->vm_start */ | ||
234 | addr = vma->vm_start - len; | ||
235 | if (do_align) | ||
236 | addr = COLOUR_ALIGN_DOWN(addr, pgoff); | ||
237 | } while (len < vma->vm_start); | ||
238 | |||
239 | bottomup: | ||
240 | /* | ||
241 | * A failed mmap() very likely causes application failure, | ||
242 | * so fall back to the bottom-up function here. This scenario | ||
243 | * can happen with large stack limits and large mmap() | ||
244 | * allocations. | ||
245 | */ | ||
246 | mm->cached_hole_size = ~0UL; | ||
247 | mm->free_area_cache = TASK_UNMAPPED_BASE; | ||
248 | addr = arch_get_unmapped_area(filp, addr0, len, pgoff, flags); | ||
249 | /* | ||
250 | * Restore the topdown base: | ||
251 | */ | ||
252 | mm->free_area_cache = mm->mmap_base; | ||
253 | mm->cached_hole_size = ~0UL; | ||
254 | |||
255 | return addr; | ||
256 | } | ||
257 | |||
258 | void arch_pick_mmap_layout(struct mm_struct *mm) | ||
259 | { | ||
260 | unsigned long random_factor = 0UL; | ||
261 | |||
262 | /* 8 bits of randomness in 20 address space bits */ | ||
263 | if ((current->flags & PF_RANDOMIZE) && | ||
264 | !(current->personality & ADDR_NO_RANDOMIZE)) | ||
265 | random_factor = (get_random_int() % (1 << 8)) << PAGE_SHIFT; | ||
266 | |||
267 | if (mmap_is_legacy()) { | ||
268 | mm->mmap_base = TASK_UNMAPPED_BASE + random_factor; | ||
269 | mm->get_unmapped_area = arch_get_unmapped_area; | ||
270 | mm->unmap_area = arch_unmap_area; | ||
271 | } else { | ||
272 | mm->mmap_base = mmap_base(random_factor); | ||
273 | mm->get_unmapped_area = arch_get_unmapped_area_topdown; | ||
274 | mm->unmap_area = arch_unmap_area_topdown; | ||
275 | } | ||
276 | } | ||
114 | 277 | ||
115 | /* | 278 | /* |
116 | * You really shouldn't be using read() or write() on /dev/mem. This | 279 | * You really shouldn't be using read() or write() on /dev/mem. This |
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index dc8c550e6cb..94c5a0c94f5 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/nodemask.h> | 15 | #include <linux/nodemask.h> |
16 | #include <linux/memblock.h> | 16 | #include <linux/memblock.h> |
17 | #include <linux/fs.h> | 17 | #include <linux/fs.h> |
18 | #include <linux/vmalloc.h> | ||
18 | 19 | ||
19 | #include <asm/cputype.h> | 20 | #include <asm/cputype.h> |
20 | #include <asm/sections.h> | 21 | #include <asm/sections.h> |
@@ -150,6 +151,7 @@ static int __init early_nowrite(char *__unused) | |||
150 | } | 151 | } |
151 | early_param("nowb", early_nowrite); | 152 | early_param("nowb", early_nowrite); |
152 | 153 | ||
154 | #ifndef CONFIG_ARM_LPAE | ||
153 | static int __init early_ecc(char *p) | 155 | static int __init early_ecc(char *p) |
154 | { | 156 | { |
155 | if (memcmp(p, "on", 2) == 0) | 157 | if (memcmp(p, "on", 2) == 0) |
@@ -159,6 +161,7 @@ static int __init early_ecc(char *p) | |||
159 | return 0; | 161 | return 0; |
160 | } | 162 | } |
161 | early_param("ecc", early_ecc); | 163 | early_param("ecc", early_ecc); |
164 | #endif | ||
162 | 165 | ||
163 | static int __init noalign_setup(char *__unused) | 166 | static int __init noalign_setup(char *__unused) |
164 | { | 167 | { |
@@ -228,10 +231,12 @@ static struct mem_type mem_types[] = { | |||
228 | .prot_sect = PMD_TYPE_SECT | PMD_SECT_XN, | 231 | .prot_sect = PMD_TYPE_SECT | PMD_SECT_XN, |
229 | .domain = DOMAIN_KERNEL, | 232 | .domain = DOMAIN_KERNEL, |
230 | }, | 233 | }, |
234 | #ifndef CONFIG_ARM_LPAE | ||
231 | [MT_MINICLEAN] = { | 235 | [MT_MINICLEAN] = { |
232 | .prot_sect = PMD_TYPE_SECT | PMD_SECT_XN | PMD_SECT_MINICACHE, | 236 | .prot_sect = PMD_TYPE_SECT | PMD_SECT_XN | PMD_SECT_MINICACHE, |
233 | .domain = DOMAIN_KERNEL, | 237 | .domain = DOMAIN_KERNEL, |
234 | }, | 238 | }, |
239 | #endif | ||
235 | [MT_LOW_VECTORS] = { | 240 | [MT_LOW_VECTORS] = { |
236 | .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY | | 241 | .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY | |
237 | L_PTE_RDONLY, | 242 | L_PTE_RDONLY, |
@@ -429,6 +434,7 @@ static void __init build_mem_type_table(void) | |||
429 | * ARMv6 and above have extended page tables. | 434 | * ARMv6 and above have extended page tables. |
430 | */ | 435 | */ |
431 | if (cpu_arch >= CPU_ARCH_ARMv6 && (cr & CR_XP)) { | 436 | if (cpu_arch >= CPU_ARCH_ARMv6 && (cr & CR_XP)) { |
437 | #ifndef CONFIG_ARM_LPAE | ||
432 | /* | 438 | /* |
433 | * Mark cache clean areas and XIP ROM read only | 439 | * Mark cache clean areas and XIP ROM read only |
434 | * from SVC mode and no access from userspace. | 440 | * from SVC mode and no access from userspace. |
@@ -436,6 +442,7 @@ static void __init build_mem_type_table(void) | |||
436 | mem_types[MT_ROM].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE; | 442 | mem_types[MT_ROM].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE; |
437 | mem_types[MT_MINICLEAN].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE; | 443 | mem_types[MT_MINICLEAN].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE; |
438 | mem_types[MT_CACHECLEAN].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE; | 444 | mem_types[MT_CACHECLEAN].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE; |
445 | #endif | ||
439 | 446 | ||
440 | if (is_smp()) { | 447 | if (is_smp()) { |
441 | /* | 448 | /* |
@@ -474,6 +481,18 @@ static void __init build_mem_type_table(void) | |||
474 | mem_types[MT_MEMORY_NONCACHED].prot_sect |= PMD_SECT_BUFFERABLE; | 481 | mem_types[MT_MEMORY_NONCACHED].prot_sect |= PMD_SECT_BUFFERABLE; |
475 | } | 482 | } |
476 | 483 | ||
484 | #ifdef CONFIG_ARM_LPAE | ||
485 | /* | ||
486 | * Do not generate access flag faults for the kernel mappings. | ||
487 | */ | ||
488 | for (i = 0; i < ARRAY_SIZE(mem_types); i++) { | ||
489 | mem_types[i].prot_pte |= PTE_EXT_AF; | ||
490 | mem_types[i].prot_sect |= PMD_SECT_AF; | ||
491 | } | ||
492 | kern_pgprot |= PTE_EXT_AF; | ||
493 | vecs_pgprot |= PTE_EXT_AF; | ||
494 | #endif | ||
495 | |||
477 | for (i = 0; i < 16; i++) { | 496 | for (i = 0; i < 16; i++) { |
478 | unsigned long v = pgprot_val(protection_map[i]); | 497 | unsigned long v = pgprot_val(protection_map[i]); |
479 | protection_map[i] = __pgprot(v | user_pgprot); | 498 | protection_map[i] = __pgprot(v | user_pgprot); |
@@ -529,13 +548,18 @@ EXPORT_SYMBOL(phys_mem_access_prot); | |||
529 | 548 | ||
530 | #define vectors_base() (vectors_high() ? 0xffff0000 : 0) | 549 | #define vectors_base() (vectors_high() ? 0xffff0000 : 0) |
531 | 550 | ||
532 | static void __init *early_alloc(unsigned long sz) | 551 | static void __init *early_alloc_aligned(unsigned long sz, unsigned long align) |
533 | { | 552 | { |
534 | void *ptr = __va(memblock_alloc(sz, sz)); | 553 | void *ptr = __va(memblock_alloc(sz, align)); |
535 | memset(ptr, 0, sz); | 554 | memset(ptr, 0, sz); |
536 | return ptr; | 555 | return ptr; |
537 | } | 556 | } |
538 | 557 | ||
558 | static void __init *early_alloc(unsigned long sz) | ||
559 | { | ||
560 | return early_alloc_aligned(sz, sz); | ||
561 | } | ||
562 | |||
539 | static pte_t * __init early_pte_alloc(pmd_t *pmd, unsigned long addr, unsigned long prot) | 563 | static pte_t * __init early_pte_alloc(pmd_t *pmd, unsigned long addr, unsigned long prot) |
540 | { | 564 | { |
541 | if (pmd_none(*pmd)) { | 565 | if (pmd_none(*pmd)) { |
@@ -572,8 +596,10 @@ static void __init alloc_init_section(pud_t *pud, unsigned long addr, | |||
572 | if (((addr | end | phys) & ~SECTION_MASK) == 0) { | 596 | if (((addr | end | phys) & ~SECTION_MASK) == 0) { |
573 | pmd_t *p = pmd; | 597 | pmd_t *p = pmd; |
574 | 598 | ||
599 | #ifndef CONFIG_ARM_LPAE | ||
575 | if (addr & SECTION_SIZE) | 600 | if (addr & SECTION_SIZE) |
576 | pmd++; | 601 | pmd++; |
602 | #endif | ||
577 | 603 | ||
578 | do { | 604 | do { |
579 | *pmd = __pmd(phys | type->prot_sect); | 605 | *pmd = __pmd(phys | type->prot_sect); |
@@ -603,6 +629,7 @@ static void alloc_init_pud(pgd_t *pgd, unsigned long addr, unsigned long end, | |||
603 | } while (pud++, addr = next, addr != end); | 629 | } while (pud++, addr = next, addr != end); |
604 | } | 630 | } |
605 | 631 | ||
632 | #ifndef CONFIG_ARM_LPAE | ||
606 | static void __init create_36bit_mapping(struct map_desc *md, | 633 | static void __init create_36bit_mapping(struct map_desc *md, |
607 | const struct mem_type *type) | 634 | const struct mem_type *type) |
608 | { | 635 | { |
@@ -662,6 +689,7 @@ static void __init create_36bit_mapping(struct map_desc *md, | |||
662 | pgd += SUPERSECTION_SIZE >> PGDIR_SHIFT; | 689 | pgd += SUPERSECTION_SIZE >> PGDIR_SHIFT; |
663 | } while (addr != end); | 690 | } while (addr != end); |
664 | } | 691 | } |
692 | #endif /* !CONFIG_ARM_LPAE */ | ||
665 | 693 | ||
666 | /* | 694 | /* |
667 | * Create the page directory entries and any necessary | 695 | * Create the page directory entries and any necessary |
@@ -685,14 +713,16 @@ static void __init create_mapping(struct map_desc *md) | |||
685 | } | 713 | } |
686 | 714 | ||
687 | if ((md->type == MT_DEVICE || md->type == MT_ROM) && | 715 | if ((md->type == MT_DEVICE || md->type == MT_ROM) && |
688 | md->virtual >= PAGE_OFFSET && md->virtual < VMALLOC_END) { | 716 | md->virtual >= PAGE_OFFSET && |
717 | (md->virtual < VMALLOC_START || md->virtual >= VMALLOC_END)) { | ||
689 | printk(KERN_WARNING "BUG: mapping for 0x%08llx" | 718 | printk(KERN_WARNING "BUG: mapping for 0x%08llx" |
690 | " at 0x%08lx overlaps vmalloc space\n", | 719 | " at 0x%08lx out of vmalloc space\n", |
691 | (long long)__pfn_to_phys((u64)md->pfn), md->virtual); | 720 | (long long)__pfn_to_phys((u64)md->pfn), md->virtual); |
692 | } | 721 | } |
693 | 722 | ||
694 | type = &mem_types[md->type]; | 723 | type = &mem_types[md->type]; |
695 | 724 | ||
725 | #ifndef CONFIG_ARM_LPAE | ||
696 | /* | 726 | /* |
697 | * Catch 36-bit addresses | 727 | * Catch 36-bit addresses |
698 | */ | 728 | */ |
@@ -700,6 +730,7 @@ static void __init create_mapping(struct map_desc *md) | |||
700 | create_36bit_mapping(md, type); | 730 | create_36bit_mapping(md, type); |
701 | return; | 731 | return; |
702 | } | 732 | } |
733 | #endif | ||
703 | 734 | ||
704 | addr = md->virtual & PAGE_MASK; | 735 | addr = md->virtual & PAGE_MASK; |
705 | phys = __pfn_to_phys(md->pfn); | 736 | phys = __pfn_to_phys(md->pfn); |
@@ -729,18 +760,33 @@ static void __init create_mapping(struct map_desc *md) | |||
729 | */ | 760 | */ |
730 | void __init iotable_init(struct map_desc *io_desc, int nr) | 761 | void __init iotable_init(struct map_desc *io_desc, int nr) |
731 | { | 762 | { |
732 | int i; | 763 | struct map_desc *md; |
764 | struct vm_struct *vm; | ||
765 | |||
766 | if (!nr) | ||
767 | return; | ||
733 | 768 | ||
734 | for (i = 0; i < nr; i++) | 769 | vm = early_alloc_aligned(sizeof(*vm) * nr, __alignof__(*vm)); |
735 | create_mapping(io_desc + i); | 770 | |
771 | for (md = io_desc; nr; md++, nr--) { | ||
772 | create_mapping(md); | ||
773 | vm->addr = (void *)(md->virtual & PAGE_MASK); | ||
774 | vm->size = PAGE_ALIGN(md->length + (md->virtual & ~PAGE_MASK)); | ||
775 | vm->phys_addr = __pfn_to_phys(md->pfn); | ||
776 | vm->flags = VM_IOREMAP | VM_ARM_STATIC_MAPPING; | ||
777 | vm->flags |= VM_ARM_MTYPE(md->type); | ||
778 | vm->caller = iotable_init; | ||
779 | vm_area_add_early(vm++); | ||
780 | } | ||
736 | } | 781 | } |
737 | 782 | ||
738 | static void * __initdata vmalloc_min = (void *)(VMALLOC_END - SZ_128M); | 783 | static void * __initdata vmalloc_min = |
784 | (void *)(VMALLOC_END - (240 << 20) - VMALLOC_OFFSET); | ||
739 | 785 | ||
740 | /* | 786 | /* |
741 | * vmalloc=size forces the vmalloc area to be exactly 'size' | 787 | * vmalloc=size forces the vmalloc area to be exactly 'size' |
742 | * bytes. This can be used to increase (or decrease) the vmalloc | 788 | * bytes. This can be used to increase (or decrease) the vmalloc |
743 | * area - the default is 128m. | 789 | * area - the default is 240m. |
744 | */ | 790 | */ |
745 | static int __init early_vmalloc(char *arg) | 791 | static int __init early_vmalloc(char *arg) |
746 | { | 792 | { |
@@ -775,6 +821,9 @@ void __init sanity_check_meminfo(void) | |||
775 | struct membank *bank = &meminfo.bank[j]; | 821 | struct membank *bank = &meminfo.bank[j]; |
776 | *bank = meminfo.bank[i]; | 822 | *bank = meminfo.bank[i]; |
777 | 823 | ||
824 | if (bank->start > ULONG_MAX) | ||
825 | highmem = 1; | ||
826 | |||
778 | #ifdef CONFIG_HIGHMEM | 827 | #ifdef CONFIG_HIGHMEM |
779 | if (__va(bank->start) >= vmalloc_min || | 828 | if (__va(bank->start) >= vmalloc_min || |
780 | __va(bank->start) < (void *)PAGE_OFFSET) | 829 | __va(bank->start) < (void *)PAGE_OFFSET) |
@@ -786,7 +835,7 @@ void __init sanity_check_meminfo(void) | |||
786 | * Split those memory banks which are partially overlapping | 835 | * Split those memory banks which are partially overlapping |
787 | * the vmalloc area greatly simplifying things later. | 836 | * the vmalloc area greatly simplifying things later. |
788 | */ | 837 | */ |
789 | if (__va(bank->start) < vmalloc_min && | 838 | if (!highmem && __va(bank->start) < vmalloc_min && |
790 | bank->size > vmalloc_min - __va(bank->start)) { | 839 | bank->size > vmalloc_min - __va(bank->start)) { |
791 | if (meminfo.nr_banks >= NR_BANKS) { | 840 | if (meminfo.nr_banks >= NR_BANKS) { |
792 | printk(KERN_CRIT "NR_BANKS too low, " | 841 | printk(KERN_CRIT "NR_BANKS too low, " |
@@ -807,6 +856,17 @@ void __init sanity_check_meminfo(void) | |||
807 | bank->highmem = highmem; | 856 | bank->highmem = highmem; |
808 | 857 | ||
809 | /* | 858 | /* |
859 | * Highmem banks not allowed with !CONFIG_HIGHMEM. | ||
860 | */ | ||
861 | if (highmem) { | ||
862 | printk(KERN_NOTICE "Ignoring RAM at %.8llx-%.8llx " | ||
863 | "(!CONFIG_HIGHMEM).\n", | ||
864 | (unsigned long long)bank->start, | ||
865 | (unsigned long long)bank->start + bank->size - 1); | ||
866 | continue; | ||
867 | } | ||
868 | |||
869 | /* | ||
810 | * Check whether this memory bank would entirely overlap | 870 | * Check whether this memory bank would entirely overlap |
811 | * the vmalloc area. | 871 | * the vmalloc area. |
812 | */ | 872 | */ |
@@ -860,6 +920,7 @@ void __init sanity_check_meminfo(void) | |||
860 | } | 920 | } |
861 | #endif | 921 | #endif |
862 | meminfo.nr_banks = j; | 922 | meminfo.nr_banks = j; |
923 | high_memory = __va(lowmem_limit - 1) + 1; | ||
863 | memblock_set_current_limit(lowmem_limit); | 924 | memblock_set_current_limit(lowmem_limit); |
864 | } | 925 | } |
865 | 926 | ||
@@ -890,14 +951,20 @@ static inline void prepare_page_table(void) | |||
890 | 951 | ||
891 | /* | 952 | /* |
892 | * Clear out all the kernel space mappings, except for the first | 953 | * Clear out all the kernel space mappings, except for the first |
893 | * memory bank, up to the end of the vmalloc region. | 954 | * memory bank, up to the vmalloc region. |
894 | */ | 955 | */ |
895 | for (addr = __phys_to_virt(end); | 956 | for (addr = __phys_to_virt(end); |
896 | addr < VMALLOC_END; addr += PMD_SIZE) | 957 | addr < VMALLOC_START; addr += PMD_SIZE) |
897 | pmd_clear(pmd_off_k(addr)); | 958 | pmd_clear(pmd_off_k(addr)); |
898 | } | 959 | } |
899 | 960 | ||
961 | #ifdef CONFIG_ARM_LPAE | ||
962 | /* the first page is reserved for pgd */ | ||
963 | #define SWAPPER_PG_DIR_SIZE (PAGE_SIZE + \ | ||
964 | PTRS_PER_PGD * PTRS_PER_PMD * sizeof(pmd_t)) | ||
965 | #else | ||
900 | #define SWAPPER_PG_DIR_SIZE (PTRS_PER_PGD * sizeof(pgd_t)) | 966 | #define SWAPPER_PG_DIR_SIZE (PTRS_PER_PGD * sizeof(pgd_t)) |
967 | #endif | ||
901 | 968 | ||
902 | /* | 969 | /* |
903 | * Reserve the special regions of memory | 970 | * Reserve the special regions of memory |
@@ -920,8 +987,8 @@ void __init arm_mm_memblock_reserve(void) | |||
920 | } | 987 | } |
921 | 988 | ||
922 | /* | 989 | /* |
923 | * Set up device the mappings. Since we clear out the page tables for all | 990 | * Set up the device mappings. Since we clear out the page tables for all |
924 | * mappings above VMALLOC_END, we will remove any debug device mappings. | 991 | * mappings above VMALLOC_START, we will remove any debug device mappings. |
925 | * This means you have to be careful how you debug this function, or any | 992 | * This means you have to be careful how you debug this function, or any |
926 | * called function. This means you can't use any function or debugging | 993 | * called function. This means you can't use any function or debugging |
927 | * method which may touch any device, otherwise the kernel _will_ crash. | 994 | * method which may touch any device, otherwise the kernel _will_ crash. |
@@ -936,7 +1003,7 @@ static void __init devicemaps_init(struct machine_desc *mdesc) | |||
936 | */ | 1003 | */ |
937 | vectors_page = early_alloc(PAGE_SIZE); | 1004 | vectors_page = early_alloc(PAGE_SIZE); |
938 | 1005 | ||
939 | for (addr = VMALLOC_END; addr; addr += PMD_SIZE) | 1006 | for (addr = VMALLOC_START; addr; addr += PMD_SIZE) |
940 | pmd_clear(pmd_off_k(addr)); | 1007 | pmd_clear(pmd_off_k(addr)); |
941 | 1008 | ||
942 | /* | 1009 | /* |
diff --git a/arch/arm/mm/nommu.c b/arch/arm/mm/nommu.c index 88417514b2c..4fc6794cca4 100644 --- a/arch/arm/mm/nommu.c +++ b/arch/arm/mm/nommu.c | |||
@@ -29,6 +29,8 @@ void __init arm_mm_memblock_reserve(void) | |||
29 | 29 | ||
30 | void __init sanity_check_meminfo(void) | 30 | void __init sanity_check_meminfo(void) |
31 | { | 31 | { |
32 | phys_addr_t end = bank_phys_end(&meminfo.bank[meminfo.nr_banks - 1]); | ||
33 | high_memory = __va(end - 1) + 1; | ||
32 | } | 34 | } |
33 | 35 | ||
34 | /* | 36 | /* |
diff --git a/arch/arm/mm/pgd.c b/arch/arm/mm/pgd.c index b2027c154b2..a3e78ccabd6 100644 --- a/arch/arm/mm/pgd.c +++ b/arch/arm/mm/pgd.c | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <linux/mm.h> | 10 | #include <linux/mm.h> |
11 | #include <linux/gfp.h> | 11 | #include <linux/gfp.h> |
12 | #include <linux/highmem.h> | 12 | #include <linux/highmem.h> |
13 | #include <linux/slab.h> | ||
13 | 14 | ||
14 | #include <asm/pgalloc.h> | 15 | #include <asm/pgalloc.h> |
15 | #include <asm/page.h> | 16 | #include <asm/page.h> |
@@ -17,6 +18,14 @@ | |||
17 | 18 | ||
18 | #include "mm.h" | 19 | #include "mm.h" |
19 | 20 | ||
21 | #ifdef CONFIG_ARM_LPAE | ||
22 | #define __pgd_alloc() kmalloc(PTRS_PER_PGD * sizeof(pgd_t), GFP_KERNEL) | ||
23 | #define __pgd_free(pgd) kfree(pgd) | ||
24 | #else | ||
25 | #define __pgd_alloc() (pgd_t *)__get_free_pages(GFP_KERNEL, 2) | ||
26 | #define __pgd_free(pgd) free_pages((unsigned long)pgd, 2) | ||
27 | #endif | ||
28 | |||
20 | /* | 29 | /* |
21 | * need to get a 16k page for level 1 | 30 | * need to get a 16k page for level 1 |
22 | */ | 31 | */ |
@@ -27,7 +36,7 @@ pgd_t *pgd_alloc(struct mm_struct *mm) | |||
27 | pmd_t *new_pmd, *init_pmd; | 36 | pmd_t *new_pmd, *init_pmd; |
28 | pte_t *new_pte, *init_pte; | 37 | pte_t *new_pte, *init_pte; |
29 | 38 | ||
30 | new_pgd = (pgd_t *)__get_free_pages(GFP_KERNEL, 2); | 39 | new_pgd = __pgd_alloc(); |
31 | if (!new_pgd) | 40 | if (!new_pgd) |
32 | goto no_pgd; | 41 | goto no_pgd; |
33 | 42 | ||
@@ -42,10 +51,25 @@ pgd_t *pgd_alloc(struct mm_struct *mm) | |||
42 | 51 | ||
43 | clean_dcache_area(new_pgd, PTRS_PER_PGD * sizeof(pgd_t)); | 52 | clean_dcache_area(new_pgd, PTRS_PER_PGD * sizeof(pgd_t)); |
44 | 53 | ||
54 | #ifdef CONFIG_ARM_LPAE | ||
55 | /* | ||
56 | * Allocate PMD table for modules and pkmap mappings. | ||
57 | */ | ||
58 | new_pud = pud_alloc(mm, new_pgd + pgd_index(MODULES_VADDR), | ||
59 | MODULES_VADDR); | ||
60 | if (!new_pud) | ||
61 | goto no_pud; | ||
62 | |||
63 | new_pmd = pmd_alloc(mm, new_pud, 0); | ||
64 | if (!new_pmd) | ||
65 | goto no_pmd; | ||
66 | #endif | ||
67 | |||
45 | if (!vectors_high()) { | 68 | if (!vectors_high()) { |
46 | /* | 69 | /* |
47 | * On ARM, first page must always be allocated since it | 70 | * On ARM, first page must always be allocated since it |
48 | * contains the machine vectors. | 71 | * contains the machine vectors. The vectors are always high |
72 | * with LPAE. | ||
49 | */ | 73 | */ |
50 | new_pud = pud_alloc(mm, new_pgd, 0); | 74 | new_pud = pud_alloc(mm, new_pgd, 0); |
51 | if (!new_pud) | 75 | if (!new_pud) |
@@ -74,7 +98,7 @@ no_pte: | |||
74 | no_pmd: | 98 | no_pmd: |
75 | pud_free(mm, new_pud); | 99 | pud_free(mm, new_pud); |
76 | no_pud: | 100 | no_pud: |
77 | free_pages((unsigned long)new_pgd, 2); | 101 | __pgd_free(new_pgd); |
78 | no_pgd: | 102 | no_pgd: |
79 | return NULL; | 103 | return NULL; |
80 | } | 104 | } |
@@ -111,5 +135,24 @@ no_pud: | |||
111 | pgd_clear(pgd); | 135 | pgd_clear(pgd); |
112 | pud_free(mm, pud); | 136 | pud_free(mm, pud); |
113 | no_pgd: | 137 | no_pgd: |
114 | free_pages((unsigned long) pgd_base, 2); | 138 | #ifdef CONFIG_ARM_LPAE |
139 | /* | ||
140 | * Free modules/pkmap or identity pmd tables. | ||
141 | */ | ||
142 | for (pgd = pgd_base; pgd < pgd_base + PTRS_PER_PGD; pgd++) { | ||
143 | if (pgd_none_or_clear_bad(pgd)) | ||
144 | continue; | ||
145 | if (pgd_val(*pgd) & L_PGD_SWAPPER) | ||
146 | continue; | ||
147 | pud = pud_offset(pgd, 0); | ||
148 | if (pud_none_or_clear_bad(pud)) | ||
149 | continue; | ||
150 | pmd = pmd_offset(pud, 0); | ||
151 | pud_clear(pud); | ||
152 | pmd_free(mm, pmd); | ||
153 | pgd_clear(pgd); | ||
154 | pud_free(mm, pud); | ||
155 | } | ||
156 | #endif | ||
157 | __pgd_free(pgd_base); | ||
115 | } | 158 | } |
diff --git a/arch/arm/mm/proc-arm1020.S b/arch/arm/mm/proc-arm1020.S index 67469665d47..234951345eb 100644 --- a/arch/arm/mm/proc-arm1020.S +++ b/arch/arm/mm/proc-arm1020.S | |||
@@ -95,6 +95,7 @@ ENTRY(cpu_arm1020_proc_fin) | |||
95 | * loc: location to jump to for soft reset | 95 | * loc: location to jump to for soft reset |
96 | */ | 96 | */ |
97 | .align 5 | 97 | .align 5 |
98 | .pushsection .idmap.text, "ax" | ||
98 | ENTRY(cpu_arm1020_reset) | 99 | ENTRY(cpu_arm1020_reset) |
99 | mov ip, #0 | 100 | mov ip, #0 |
100 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 101 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
@@ -107,6 +108,8 @@ ENTRY(cpu_arm1020_reset) | |||
107 | bic ip, ip, #0x1100 @ ...i...s........ | 108 | bic ip, ip, #0x1100 @ ...i...s........ |
108 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 109 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
109 | mov pc, r0 | 110 | mov pc, r0 |
111 | ENDPROC(cpu_arm1020_reset) | ||
112 | .popsection | ||
110 | 113 | ||
111 | /* | 114 | /* |
112 | * cpu_arm1020_do_idle() | 115 | * cpu_arm1020_do_idle() |
diff --git a/arch/arm/mm/proc-arm1020e.S b/arch/arm/mm/proc-arm1020e.S index 4251421c0ed..c244b06caac 100644 --- a/arch/arm/mm/proc-arm1020e.S +++ b/arch/arm/mm/proc-arm1020e.S | |||
@@ -95,6 +95,7 @@ ENTRY(cpu_arm1020e_proc_fin) | |||
95 | * loc: location to jump to for soft reset | 95 | * loc: location to jump to for soft reset |
96 | */ | 96 | */ |
97 | .align 5 | 97 | .align 5 |
98 | .pushsection .idmap.text, "ax" | ||
98 | ENTRY(cpu_arm1020e_reset) | 99 | ENTRY(cpu_arm1020e_reset) |
99 | mov ip, #0 | 100 | mov ip, #0 |
100 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 101 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
@@ -107,6 +108,8 @@ ENTRY(cpu_arm1020e_reset) | |||
107 | bic ip, ip, #0x1100 @ ...i...s........ | 108 | bic ip, ip, #0x1100 @ ...i...s........ |
108 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 109 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
109 | mov pc, r0 | 110 | mov pc, r0 |
111 | ENDPROC(cpu_arm1020e_reset) | ||
112 | .popsection | ||
110 | 113 | ||
111 | /* | 114 | /* |
112 | * cpu_arm1020e_do_idle() | 115 | * cpu_arm1020e_do_idle() |
diff --git a/arch/arm/mm/proc-arm1022.S b/arch/arm/mm/proc-arm1022.S index d283cf3d06e..38fe22efd18 100644 --- a/arch/arm/mm/proc-arm1022.S +++ b/arch/arm/mm/proc-arm1022.S | |||
@@ -84,6 +84,7 @@ ENTRY(cpu_arm1022_proc_fin) | |||
84 | * loc: location to jump to for soft reset | 84 | * loc: location to jump to for soft reset |
85 | */ | 85 | */ |
86 | .align 5 | 86 | .align 5 |
87 | .pushsection .idmap.text, "ax" | ||
87 | ENTRY(cpu_arm1022_reset) | 88 | ENTRY(cpu_arm1022_reset) |
88 | mov ip, #0 | 89 | mov ip, #0 |
89 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 90 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
@@ -96,6 +97,8 @@ ENTRY(cpu_arm1022_reset) | |||
96 | bic ip, ip, #0x1100 @ ...i...s........ | 97 | bic ip, ip, #0x1100 @ ...i...s........ |
97 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 98 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
98 | mov pc, r0 | 99 | mov pc, r0 |
100 | ENDPROC(cpu_arm1022_reset) | ||
101 | .popsection | ||
99 | 102 | ||
100 | /* | 103 | /* |
101 | * cpu_arm1022_do_idle() | 104 | * cpu_arm1022_do_idle() |
diff --git a/arch/arm/mm/proc-arm1026.S b/arch/arm/mm/proc-arm1026.S index 678a1ceafed..3eb9c3c26c7 100644 --- a/arch/arm/mm/proc-arm1026.S +++ b/arch/arm/mm/proc-arm1026.S | |||
@@ -84,6 +84,7 @@ ENTRY(cpu_arm1026_proc_fin) | |||
84 | * loc: location to jump to for soft reset | 84 | * loc: location to jump to for soft reset |
85 | */ | 85 | */ |
86 | .align 5 | 86 | .align 5 |
87 | .pushsection .idmap.text, "ax" | ||
87 | ENTRY(cpu_arm1026_reset) | 88 | ENTRY(cpu_arm1026_reset) |
88 | mov ip, #0 | 89 | mov ip, #0 |
89 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 90 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
@@ -96,6 +97,8 @@ ENTRY(cpu_arm1026_reset) | |||
96 | bic ip, ip, #0x1100 @ ...i...s........ | 97 | bic ip, ip, #0x1100 @ ...i...s........ |
97 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 98 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
98 | mov pc, r0 | 99 | mov pc, r0 |
100 | ENDPROC(cpu_arm1026_reset) | ||
101 | .popsection | ||
99 | 102 | ||
100 | /* | 103 | /* |
101 | * cpu_arm1026_do_idle() | 104 | * cpu_arm1026_do_idle() |
diff --git a/arch/arm/mm/proc-arm6_7.S b/arch/arm/mm/proc-arm6_7.S index e5b974cddac..4fbeb5b8e6c 100644 --- a/arch/arm/mm/proc-arm6_7.S +++ b/arch/arm/mm/proc-arm6_7.S | |||
@@ -225,6 +225,7 @@ ENTRY(cpu_arm7_set_pte_ext) | |||
225 | * Params : r0 = address to jump to | 225 | * Params : r0 = address to jump to |
226 | * Notes : This sets up everything for a reset | 226 | * Notes : This sets up everything for a reset |
227 | */ | 227 | */ |
228 | .pushsection .idmap.text, "ax" | ||
228 | ENTRY(cpu_arm6_reset) | 229 | ENTRY(cpu_arm6_reset) |
229 | ENTRY(cpu_arm7_reset) | 230 | ENTRY(cpu_arm7_reset) |
230 | mov r1, #0 | 231 | mov r1, #0 |
@@ -235,6 +236,9 @@ ENTRY(cpu_arm7_reset) | |||
235 | mov r1, #0x30 | 236 | mov r1, #0x30 |
236 | mcr p15, 0, r1, c1, c0, 0 @ turn off MMU etc | 237 | mcr p15, 0, r1, c1, c0, 0 @ turn off MMU etc |
237 | mov pc, r0 | 238 | mov pc, r0 |
239 | ENDPROC(cpu_arm6_reset) | ||
240 | ENDPROC(cpu_arm7_reset) | ||
241 | .popsection | ||
238 | 242 | ||
239 | __CPUINIT | 243 | __CPUINIT |
240 | 244 | ||
diff --git a/arch/arm/mm/proc-arm720.S b/arch/arm/mm/proc-arm720.S index 55f4e290665..0ac908c7ade 100644 --- a/arch/arm/mm/proc-arm720.S +++ b/arch/arm/mm/proc-arm720.S | |||
@@ -101,6 +101,7 @@ ENTRY(cpu_arm720_set_pte_ext) | |||
101 | * Params : r0 = address to jump to | 101 | * Params : r0 = address to jump to |
102 | * Notes : This sets up everything for a reset | 102 | * Notes : This sets up everything for a reset |
103 | */ | 103 | */ |
104 | .pushsection .idmap.text, "ax" | ||
104 | ENTRY(cpu_arm720_reset) | 105 | ENTRY(cpu_arm720_reset) |
105 | mov ip, #0 | 106 | mov ip, #0 |
106 | mcr p15, 0, ip, c7, c7, 0 @ invalidate cache | 107 | mcr p15, 0, ip, c7, c7, 0 @ invalidate cache |
@@ -112,6 +113,8 @@ ENTRY(cpu_arm720_reset) | |||
112 | bic ip, ip, #0x2100 @ ..v....s........ | 113 | bic ip, ip, #0x2100 @ ..v....s........ |
113 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 114 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
114 | mov pc, r0 | 115 | mov pc, r0 |
116 | ENDPROC(cpu_arm720_reset) | ||
117 | .popsection | ||
115 | 118 | ||
116 | __CPUINIT | 119 | __CPUINIT |
117 | 120 | ||
diff --git a/arch/arm/mm/proc-arm740.S b/arch/arm/mm/proc-arm740.S index 4506be3adda..dc5de5d53f2 100644 --- a/arch/arm/mm/proc-arm740.S +++ b/arch/arm/mm/proc-arm740.S | |||
@@ -49,6 +49,7 @@ ENTRY(cpu_arm740_proc_fin) | |||
49 | * Params : r0 = address to jump to | 49 | * Params : r0 = address to jump to |
50 | * Notes : This sets up everything for a reset | 50 | * Notes : This sets up everything for a reset |
51 | */ | 51 | */ |
52 | .pushsection .idmap.text, "ax" | ||
52 | ENTRY(cpu_arm740_reset) | 53 | ENTRY(cpu_arm740_reset) |
53 | mov ip, #0 | 54 | mov ip, #0 |
54 | mcr p15, 0, ip, c7, c0, 0 @ invalidate cache | 55 | mcr p15, 0, ip, c7, c0, 0 @ invalidate cache |
@@ -56,6 +57,8 @@ ENTRY(cpu_arm740_reset) | |||
56 | bic ip, ip, #0x0000000c @ ............wc.. | 57 | bic ip, ip, #0x0000000c @ ............wc.. |
57 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 58 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
58 | mov pc, r0 | 59 | mov pc, r0 |
60 | ENDPROC(cpu_arm740_reset) | ||
61 | .popsection | ||
59 | 62 | ||
60 | __CPUINIT | 63 | __CPUINIT |
61 | 64 | ||
diff --git a/arch/arm/mm/proc-arm7tdmi.S b/arch/arm/mm/proc-arm7tdmi.S index 7e0e1fe4ed4..6ddea3e464b 100644 --- a/arch/arm/mm/proc-arm7tdmi.S +++ b/arch/arm/mm/proc-arm7tdmi.S | |||
@@ -45,8 +45,11 @@ ENTRY(cpu_arm7tdmi_proc_fin) | |||
45 | * Params : loc(r0) address to jump to | 45 | * Params : loc(r0) address to jump to |
46 | * Purpose : Sets up everything for a reset and jump to the location for soft reset. | 46 | * Purpose : Sets up everything for a reset and jump to the location for soft reset. |
47 | */ | 47 | */ |
48 | .pushsection .idmap.text, "ax" | ||
48 | ENTRY(cpu_arm7tdmi_reset) | 49 | ENTRY(cpu_arm7tdmi_reset) |
49 | mov pc, r0 | 50 | mov pc, r0 |
51 | ENDPROC(cpu_arm7tdmi_reset) | ||
52 | .popsection | ||
50 | 53 | ||
51 | __CPUINIT | 54 | __CPUINIT |
52 | 55 | ||
diff --git a/arch/arm/mm/proc-arm920.S b/arch/arm/mm/proc-arm920.S index 88fb3d9e064..cb941ae95f6 100644 --- a/arch/arm/mm/proc-arm920.S +++ b/arch/arm/mm/proc-arm920.S | |||
@@ -85,6 +85,7 @@ ENTRY(cpu_arm920_proc_fin) | |||
85 | * loc: location to jump to for soft reset | 85 | * loc: location to jump to for soft reset |
86 | */ | 86 | */ |
87 | .align 5 | 87 | .align 5 |
88 | .pushsection .idmap.text, "ax" | ||
88 | ENTRY(cpu_arm920_reset) | 89 | ENTRY(cpu_arm920_reset) |
89 | mov ip, #0 | 90 | mov ip, #0 |
90 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 91 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
@@ -97,6 +98,8 @@ ENTRY(cpu_arm920_reset) | |||
97 | bic ip, ip, #0x1100 @ ...i...s........ | 98 | bic ip, ip, #0x1100 @ ...i...s........ |
98 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 99 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
99 | mov pc, r0 | 100 | mov pc, r0 |
101 | ENDPROC(cpu_arm920_reset) | ||
102 | .popsection | ||
100 | 103 | ||
101 | /* | 104 | /* |
102 | * cpu_arm920_do_idle() | 105 | * cpu_arm920_do_idle() |
diff --git a/arch/arm/mm/proc-arm922.S b/arch/arm/mm/proc-arm922.S index 490e1883385..4ec0e074dd5 100644 --- a/arch/arm/mm/proc-arm922.S +++ b/arch/arm/mm/proc-arm922.S | |||
@@ -87,6 +87,7 @@ ENTRY(cpu_arm922_proc_fin) | |||
87 | * loc: location to jump to for soft reset | 87 | * loc: location to jump to for soft reset |
88 | */ | 88 | */ |
89 | .align 5 | 89 | .align 5 |
90 | .pushsection .idmap.text, "ax" | ||
90 | ENTRY(cpu_arm922_reset) | 91 | ENTRY(cpu_arm922_reset) |
91 | mov ip, #0 | 92 | mov ip, #0 |
92 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 93 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
@@ -99,6 +100,8 @@ ENTRY(cpu_arm922_reset) | |||
99 | bic ip, ip, #0x1100 @ ...i...s........ | 100 | bic ip, ip, #0x1100 @ ...i...s........ |
100 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 101 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
101 | mov pc, r0 | 102 | mov pc, r0 |
103 | ENDPROC(cpu_arm922_reset) | ||
104 | .popsection | ||
102 | 105 | ||
103 | /* | 106 | /* |
104 | * cpu_arm922_do_idle() | 107 | * cpu_arm922_do_idle() |
diff --git a/arch/arm/mm/proc-arm925.S b/arch/arm/mm/proc-arm925.S index 51d494be057..9dccd9a365b 100644 --- a/arch/arm/mm/proc-arm925.S +++ b/arch/arm/mm/proc-arm925.S | |||
@@ -108,6 +108,7 @@ ENTRY(cpu_arm925_proc_fin) | |||
108 | * loc: location to jump to for soft reset | 108 | * loc: location to jump to for soft reset |
109 | */ | 109 | */ |
110 | .align 5 | 110 | .align 5 |
111 | .pushsection .idmap.text, "ax" | ||
111 | ENTRY(cpu_arm925_reset) | 112 | ENTRY(cpu_arm925_reset) |
112 | /* Send software reset to MPU and DSP */ | 113 | /* Send software reset to MPU and DSP */ |
113 | mov ip, #0xff000000 | 114 | mov ip, #0xff000000 |
@@ -115,6 +116,8 @@ ENTRY(cpu_arm925_reset) | |||
115 | orr ip, ip, #0x0000ce00 | 116 | orr ip, ip, #0x0000ce00 |
116 | mov r4, #1 | 117 | mov r4, #1 |
117 | strh r4, [ip, #0x10] | 118 | strh r4, [ip, #0x10] |
119 | ENDPROC(cpu_arm925_reset) | ||
120 | .popsection | ||
118 | 121 | ||
119 | mov ip, #0 | 122 | mov ip, #0 |
120 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 123 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
diff --git a/arch/arm/mm/proc-arm926.S b/arch/arm/mm/proc-arm926.S index 9f8fd91f918..820259b81a1 100644 --- a/arch/arm/mm/proc-arm926.S +++ b/arch/arm/mm/proc-arm926.S | |||
@@ -77,6 +77,7 @@ ENTRY(cpu_arm926_proc_fin) | |||
77 | * loc: location to jump to for soft reset | 77 | * loc: location to jump to for soft reset |
78 | */ | 78 | */ |
79 | .align 5 | 79 | .align 5 |
80 | .pushsection .idmap.text, "ax" | ||
80 | ENTRY(cpu_arm926_reset) | 81 | ENTRY(cpu_arm926_reset) |
81 | mov ip, #0 | 82 | mov ip, #0 |
82 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 83 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
@@ -89,6 +90,8 @@ ENTRY(cpu_arm926_reset) | |||
89 | bic ip, ip, #0x1100 @ ...i...s........ | 90 | bic ip, ip, #0x1100 @ ...i...s........ |
90 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 91 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
91 | mov pc, r0 | 92 | mov pc, r0 |
93 | ENDPROC(cpu_arm926_reset) | ||
94 | .popsection | ||
92 | 95 | ||
93 | /* | 96 | /* |
94 | * cpu_arm926_do_idle() | 97 | * cpu_arm926_do_idle() |
diff --git a/arch/arm/mm/proc-arm940.S b/arch/arm/mm/proc-arm940.S index ac750d50615..9fdc0a17097 100644 --- a/arch/arm/mm/proc-arm940.S +++ b/arch/arm/mm/proc-arm940.S | |||
@@ -48,6 +48,7 @@ ENTRY(cpu_arm940_proc_fin) | |||
48 | * Params : r0 = address to jump to | 48 | * Params : r0 = address to jump to |
49 | * Notes : This sets up everything for a reset | 49 | * Notes : This sets up everything for a reset |
50 | */ | 50 | */ |
51 | .pushsection .idmap.text, "ax" | ||
51 | ENTRY(cpu_arm940_reset) | 52 | ENTRY(cpu_arm940_reset) |
52 | mov ip, #0 | 53 | mov ip, #0 |
53 | mcr p15, 0, ip, c7, c5, 0 @ flush I cache | 54 | mcr p15, 0, ip, c7, c5, 0 @ flush I cache |
@@ -58,6 +59,8 @@ ENTRY(cpu_arm940_reset) | |||
58 | bic ip, ip, #0x00001000 @ i-cache | 59 | bic ip, ip, #0x00001000 @ i-cache |
59 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 60 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
60 | mov pc, r0 | 61 | mov pc, r0 |
62 | ENDPROC(cpu_arm940_reset) | ||
63 | .popsection | ||
61 | 64 | ||
62 | /* | 65 | /* |
63 | * cpu_arm940_do_idle() | 66 | * cpu_arm940_do_idle() |
diff --git a/arch/arm/mm/proc-arm946.S b/arch/arm/mm/proc-arm946.S index 683af3a182b..f684cfedcca 100644 --- a/arch/arm/mm/proc-arm946.S +++ b/arch/arm/mm/proc-arm946.S | |||
@@ -55,6 +55,7 @@ ENTRY(cpu_arm946_proc_fin) | |||
55 | * Params : r0 = address to jump to | 55 | * Params : r0 = address to jump to |
56 | * Notes : This sets up everything for a reset | 56 | * Notes : This sets up everything for a reset |
57 | */ | 57 | */ |
58 | .pushsection .idmap.text, "ax" | ||
58 | ENTRY(cpu_arm946_reset) | 59 | ENTRY(cpu_arm946_reset) |
59 | mov ip, #0 | 60 | mov ip, #0 |
60 | mcr p15, 0, ip, c7, c5, 0 @ flush I cache | 61 | mcr p15, 0, ip, c7, c5, 0 @ flush I cache |
@@ -65,6 +66,8 @@ ENTRY(cpu_arm946_reset) | |||
65 | bic ip, ip, #0x00001000 @ i-cache | 66 | bic ip, ip, #0x00001000 @ i-cache |
66 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 67 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
67 | mov pc, r0 | 68 | mov pc, r0 |
69 | ENDPROC(cpu_arm946_reset) | ||
70 | .popsection | ||
68 | 71 | ||
69 | /* | 72 | /* |
70 | * cpu_arm946_do_idle() | 73 | * cpu_arm946_do_idle() |
diff --git a/arch/arm/mm/proc-arm9tdmi.S b/arch/arm/mm/proc-arm9tdmi.S index 2120f9e2af7..8881391dfb9 100644 --- a/arch/arm/mm/proc-arm9tdmi.S +++ b/arch/arm/mm/proc-arm9tdmi.S | |||
@@ -45,8 +45,11 @@ ENTRY(cpu_arm9tdmi_proc_fin) | |||
45 | * Params : loc(r0) address to jump to | 45 | * Params : loc(r0) address to jump to |
46 | * Purpose : Sets up everything for a reset and jump to the location for soft reset. | 46 | * Purpose : Sets up everything for a reset and jump to the location for soft reset. |
47 | */ | 47 | */ |
48 | .pushsection .idmap.text, "ax" | ||
48 | ENTRY(cpu_arm9tdmi_reset) | 49 | ENTRY(cpu_arm9tdmi_reset) |
49 | mov pc, r0 | 50 | mov pc, r0 |
51 | ENDPROC(cpu_arm9tdmi_reset) | ||
52 | .popsection | ||
50 | 53 | ||
51 | __CPUINIT | 54 | __CPUINIT |
52 | 55 | ||
diff --git a/arch/arm/mm/proc-fa526.S b/arch/arm/mm/proc-fa526.S index 4c7a5710472..272558a133a 100644 --- a/arch/arm/mm/proc-fa526.S +++ b/arch/arm/mm/proc-fa526.S | |||
@@ -57,6 +57,7 @@ ENTRY(cpu_fa526_proc_fin) | |||
57 | * loc: location to jump to for soft reset | 57 | * loc: location to jump to for soft reset |
58 | */ | 58 | */ |
59 | .align 4 | 59 | .align 4 |
60 | .pushsection .idmap.text, "ax" | ||
60 | ENTRY(cpu_fa526_reset) | 61 | ENTRY(cpu_fa526_reset) |
61 | /* TODO: Use CP8 if possible... */ | 62 | /* TODO: Use CP8 if possible... */ |
62 | mov ip, #0 | 63 | mov ip, #0 |
@@ -73,6 +74,8 @@ ENTRY(cpu_fa526_reset) | |||
73 | nop | 74 | nop |
74 | nop | 75 | nop |
75 | mov pc, r0 | 76 | mov pc, r0 |
77 | ENDPROC(cpu_fa526_reset) | ||
78 | .popsection | ||
76 | 79 | ||
77 | /* | 80 | /* |
78 | * cpu_fa526_do_idle() | 81 | * cpu_fa526_do_idle() |
diff --git a/arch/arm/mm/proc-feroceon.S b/arch/arm/mm/proc-feroceon.S index 8a6c2f78c1c..ba3c500584a 100644 --- a/arch/arm/mm/proc-feroceon.S +++ b/arch/arm/mm/proc-feroceon.S | |||
@@ -98,6 +98,7 @@ ENTRY(cpu_feroceon_proc_fin) | |||
98 | * loc: location to jump to for soft reset | 98 | * loc: location to jump to for soft reset |
99 | */ | 99 | */ |
100 | .align 5 | 100 | .align 5 |
101 | .pushsection .idmap.text, "ax" | ||
101 | ENTRY(cpu_feroceon_reset) | 102 | ENTRY(cpu_feroceon_reset) |
102 | mov ip, #0 | 103 | mov ip, #0 |
103 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 104 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
@@ -110,6 +111,8 @@ ENTRY(cpu_feroceon_reset) | |||
110 | bic ip, ip, #0x1100 @ ...i...s........ | 111 | bic ip, ip, #0x1100 @ ...i...s........ |
111 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 112 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
112 | mov pc, r0 | 113 | mov pc, r0 |
114 | ENDPROC(cpu_feroceon_reset) | ||
115 | .popsection | ||
113 | 116 | ||
114 | /* | 117 | /* |
115 | * cpu_feroceon_do_idle() | 118 | * cpu_feroceon_do_idle() |
diff --git a/arch/arm/mm/proc-macros.S b/arch/arm/mm/proc-macros.S index 307a4def8d3..2d8ff3ad86d 100644 --- a/arch/arm/mm/proc-macros.S +++ b/arch/arm/mm/proc-macros.S | |||
@@ -91,8 +91,9 @@ | |||
91 | #if L_PTE_SHARED != PTE_EXT_SHARED | 91 | #if L_PTE_SHARED != PTE_EXT_SHARED |
92 | #error PTE shared bit mismatch | 92 | #error PTE shared bit mismatch |
93 | #endif | 93 | #endif |
94 | #if (L_PTE_XN+L_PTE_USER+L_PTE_RDONLY+L_PTE_DIRTY+L_PTE_YOUNG+\ | 94 | #if !defined (CONFIG_ARM_LPAE) && \ |
95 | L_PTE_FILE+L_PTE_PRESENT) > L_PTE_SHARED | 95 | (L_PTE_XN+L_PTE_USER+L_PTE_RDONLY+L_PTE_DIRTY+L_PTE_YOUNG+\ |
96 | L_PTE_FILE+L_PTE_PRESENT) > L_PTE_SHARED | ||
96 | #error Invalid Linux PTE bit settings | 97 | #error Invalid Linux PTE bit settings |
97 | #endif | 98 | #endif |
98 | #endif /* CONFIG_MMU */ | 99 | #endif /* CONFIG_MMU */ |
diff --git a/arch/arm/mm/proc-mohawk.S b/arch/arm/mm/proc-mohawk.S index db52b0fb14a..cdfedc5b8ad 100644 --- a/arch/arm/mm/proc-mohawk.S +++ b/arch/arm/mm/proc-mohawk.S | |||
@@ -69,6 +69,7 @@ ENTRY(cpu_mohawk_proc_fin) | |||
69 | * (same as arm926) | 69 | * (same as arm926) |
70 | */ | 70 | */ |
71 | .align 5 | 71 | .align 5 |
72 | .pushsection .idmap.text, "ax" | ||
72 | ENTRY(cpu_mohawk_reset) | 73 | ENTRY(cpu_mohawk_reset) |
73 | mov ip, #0 | 74 | mov ip, #0 |
74 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 75 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
@@ -79,6 +80,8 @@ ENTRY(cpu_mohawk_reset) | |||
79 | bic ip, ip, #0x1100 @ ...i...s........ | 80 | bic ip, ip, #0x1100 @ ...i...s........ |
80 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 81 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
81 | mov pc, r0 | 82 | mov pc, r0 |
83 | ENDPROC(cpu_mohawk_reset) | ||
84 | .popsection | ||
82 | 85 | ||
83 | /* | 86 | /* |
84 | * cpu_mohawk_do_idle() | 87 | * cpu_mohawk_do_idle() |
diff --git a/arch/arm/mm/proc-sa110.S b/arch/arm/mm/proc-sa110.S index d50ada26edd..775d70fba93 100644 --- a/arch/arm/mm/proc-sa110.S +++ b/arch/arm/mm/proc-sa110.S | |||
@@ -62,6 +62,7 @@ ENTRY(cpu_sa110_proc_fin) | |||
62 | * loc: location to jump to for soft reset | 62 | * loc: location to jump to for soft reset |
63 | */ | 63 | */ |
64 | .align 5 | 64 | .align 5 |
65 | .pushsection .idmap.text, "ax" | ||
65 | ENTRY(cpu_sa110_reset) | 66 | ENTRY(cpu_sa110_reset) |
66 | mov ip, #0 | 67 | mov ip, #0 |
67 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 68 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
@@ -74,6 +75,8 @@ ENTRY(cpu_sa110_reset) | |||
74 | bic ip, ip, #0x1100 @ ...i...s........ | 75 | bic ip, ip, #0x1100 @ ...i...s........ |
75 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 76 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
76 | mov pc, r0 | 77 | mov pc, r0 |
78 | ENDPROC(cpu_sa110_reset) | ||
79 | .popsection | ||
77 | 80 | ||
78 | /* | 81 | /* |
79 | * cpu_sa110_do_idle(type) | 82 | * cpu_sa110_do_idle(type) |
diff --git a/arch/arm/mm/proc-sa1100.S b/arch/arm/mm/proc-sa1100.S index 7d91545d089..3aa0da11fd8 100644 --- a/arch/arm/mm/proc-sa1100.S +++ b/arch/arm/mm/proc-sa1100.S | |||
@@ -70,6 +70,7 @@ ENTRY(cpu_sa1100_proc_fin) | |||
70 | * loc: location to jump to for soft reset | 70 | * loc: location to jump to for soft reset |
71 | */ | 71 | */ |
72 | .align 5 | 72 | .align 5 |
73 | .pushsection .idmap.text, "ax" | ||
73 | ENTRY(cpu_sa1100_reset) | 74 | ENTRY(cpu_sa1100_reset) |
74 | mov ip, #0 | 75 | mov ip, #0 |
75 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 76 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
@@ -82,6 +83,8 @@ ENTRY(cpu_sa1100_reset) | |||
82 | bic ip, ip, #0x1100 @ ...i...s........ | 83 | bic ip, ip, #0x1100 @ ...i...s........ |
83 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 84 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
84 | mov pc, r0 | 85 | mov pc, r0 |
86 | ENDPROC(cpu_sa1100_reset) | ||
87 | .popsection | ||
85 | 88 | ||
86 | /* | 89 | /* |
87 | * cpu_sa1100_do_idle(type) | 90 | * cpu_sa1100_do_idle(type) |
diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S index d061d2fa550..5900cd520e8 100644 --- a/arch/arm/mm/proc-v6.S +++ b/arch/arm/mm/proc-v6.S | |||
@@ -55,6 +55,7 @@ ENTRY(cpu_v6_proc_fin) | |||
55 | * - loc - location to jump to for soft reset | 55 | * - loc - location to jump to for soft reset |
56 | */ | 56 | */ |
57 | .align 5 | 57 | .align 5 |
58 | .pushsection .idmap.text, "ax" | ||
58 | ENTRY(cpu_v6_reset) | 59 | ENTRY(cpu_v6_reset) |
59 | mrc p15, 0, r1, c1, c0, 0 @ ctrl register | 60 | mrc p15, 0, r1, c1, c0, 0 @ ctrl register |
60 | bic r1, r1, #0x1 @ ...............m | 61 | bic r1, r1, #0x1 @ ...............m |
@@ -62,6 +63,8 @@ ENTRY(cpu_v6_reset) | |||
62 | mov r1, #0 | 63 | mov r1, #0 |
63 | mcr p15, 0, r1, c7, c5, 4 @ ISB | 64 | mcr p15, 0, r1, c7, c5, 4 @ ISB |
64 | mov pc, r0 | 65 | mov pc, r0 |
66 | ENDPROC(cpu_v6_reset) | ||
67 | .popsection | ||
65 | 68 | ||
66 | /* | 69 | /* |
67 | * cpu_v6_do_idle() | 70 | * cpu_v6_do_idle() |
diff --git a/arch/arm/mm/proc-v7-2level.S b/arch/arm/mm/proc-v7-2level.S new file mode 100644 index 00000000000..3a4b3e7b888 --- /dev/null +++ b/arch/arm/mm/proc-v7-2level.S | |||
@@ -0,0 +1,171 @@ | |||
1 | /* | ||
2 | * arch/arm/mm/proc-v7-2level.S | ||
3 | * | ||
4 | * Copyright (C) 2001 Deep Blue Solutions Ltd. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #define TTB_S (1 << 1) | ||
12 | #define TTB_RGN_NC (0 << 3) | ||
13 | #define TTB_RGN_OC_WBWA (1 << 3) | ||
14 | #define TTB_RGN_OC_WT (2 << 3) | ||
15 | #define TTB_RGN_OC_WB (3 << 3) | ||
16 | #define TTB_NOS (1 << 5) | ||
17 | #define TTB_IRGN_NC ((0 << 0) | (0 << 6)) | ||
18 | #define TTB_IRGN_WBWA ((0 << 0) | (1 << 6)) | ||
19 | #define TTB_IRGN_WT ((1 << 0) | (0 << 6)) | ||
20 | #define TTB_IRGN_WB ((1 << 0) | (1 << 6)) | ||
21 | |||
22 | /* PTWs cacheable, inner WB not shareable, outer WB not shareable */ | ||
23 | #define TTB_FLAGS_UP TTB_IRGN_WB|TTB_RGN_OC_WB | ||
24 | #define PMD_FLAGS_UP PMD_SECT_WB | ||
25 | |||
26 | /* PTWs cacheable, inner WBWA shareable, outer WBWA not shareable */ | ||
27 | #define TTB_FLAGS_SMP TTB_IRGN_WBWA|TTB_S|TTB_NOS|TTB_RGN_OC_WBWA | ||
28 | #define PMD_FLAGS_SMP PMD_SECT_WBWA|PMD_SECT_S | ||
29 | |||
30 | /* | ||
31 | * cpu_v7_switch_mm(pgd_phys, tsk) | ||
32 | * | ||
33 | * Set the translation table base pointer to be pgd_phys | ||
34 | * | ||
35 | * - pgd_phys - physical address of new TTB | ||
36 | * | ||
37 | * It is assumed that: | ||
38 | * - we are not using split page tables | ||
39 | */ | ||
40 | ENTRY(cpu_v7_switch_mm) | ||
41 | #ifdef CONFIG_MMU | ||
42 | mov r2, #0 | ||
43 | ldr r1, [r1, #MM_CONTEXT_ID] @ get mm->context.id | ||
44 | ALT_SMP(orr r0, r0, #TTB_FLAGS_SMP) | ||
45 | ALT_UP(orr r0, r0, #TTB_FLAGS_UP) | ||
46 | #ifdef CONFIG_ARM_ERRATA_430973 | ||
47 | mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB | ||
48 | #endif | ||
49 | #ifdef CONFIG_ARM_ERRATA_754322 | ||
50 | dsb | ||
51 | #endif | ||
52 | mcr p15, 0, r2, c13, c0, 1 @ set reserved context ID | ||
53 | isb | ||
54 | 1: mcr p15, 0, r0, c2, c0, 0 @ set TTB 0 | ||
55 | isb | ||
56 | #ifdef CONFIG_ARM_ERRATA_754322 | ||
57 | dsb | ||
58 | #endif | ||
59 | mcr p15, 0, r1, c13, c0, 1 @ set context ID | ||
60 | isb | ||
61 | #endif | ||
62 | mov pc, lr | ||
63 | ENDPROC(cpu_v7_switch_mm) | ||
64 | |||
65 | /* | ||
66 | * cpu_v7_set_pte_ext(ptep, pte) | ||
67 | * | ||
68 | * Set a level 2 translation table entry. | ||
69 | * | ||
70 | * - ptep - pointer to level 2 translation table entry | ||
71 | * (hardware version is stored at +2048 bytes) | ||
72 | * - pte - PTE value to store | ||
73 | * - ext - value for extended PTE bits | ||
74 | */ | ||
75 | ENTRY(cpu_v7_set_pte_ext) | ||
76 | #ifdef CONFIG_MMU | ||
77 | str r1, [r0] @ linux version | ||
78 | |||
79 | bic r3, r1, #0x000003f0 | ||
80 | bic r3, r3, #PTE_TYPE_MASK | ||
81 | orr r3, r3, r2 | ||
82 | orr r3, r3, #PTE_EXT_AP0 | 2 | ||
83 | |||
84 | tst r1, #1 << 4 | ||
85 | orrne r3, r3, #PTE_EXT_TEX(1) | ||
86 | |||
87 | eor r1, r1, #L_PTE_DIRTY | ||
88 | tst r1, #L_PTE_RDONLY | L_PTE_DIRTY | ||
89 | orrne r3, r3, #PTE_EXT_APX | ||
90 | |||
91 | tst r1, #L_PTE_USER | ||
92 | orrne r3, r3, #PTE_EXT_AP1 | ||
93 | #ifdef CONFIG_CPU_USE_DOMAINS | ||
94 | @ allow kernel read/write access to read-only user pages | ||
95 | tstne r3, #PTE_EXT_APX | ||
96 | bicne r3, r3, #PTE_EXT_APX | PTE_EXT_AP0 | ||
97 | #endif | ||
98 | |||
99 | tst r1, #L_PTE_XN | ||
100 | orrne r3, r3, #PTE_EXT_XN | ||
101 | |||
102 | tst r1, #L_PTE_YOUNG | ||
103 | tstne r1, #L_PTE_PRESENT | ||
104 | moveq r3, #0 | ||
105 | |||
106 | ARM( str r3, [r0, #2048]! ) | ||
107 | THUMB( add r0, r0, #2048 ) | ||
108 | THUMB( str r3, [r0] ) | ||
109 | mcr p15, 0, r0, c7, c10, 1 @ flush_pte | ||
110 | #endif | ||
111 | mov pc, lr | ||
112 | ENDPROC(cpu_v7_set_pte_ext) | ||
113 | |||
114 | /* | ||
115 | * Memory region attributes with SCTLR.TRE=1 | ||
116 | * | ||
117 | * n = TEX[0],C,B | ||
118 | * TR = PRRR[2n+1:2n] - memory type | ||
119 | * IR = NMRR[2n+1:2n] - inner cacheable property | ||
120 | * OR = NMRR[2n+17:2n+16] - outer cacheable property | ||
121 | * | ||
122 | * n TR IR OR | ||
123 | * UNCACHED 000 00 | ||
124 | * BUFFERABLE 001 10 00 00 | ||
125 | * WRITETHROUGH 010 10 10 10 | ||
126 | * WRITEBACK 011 10 11 11 | ||
127 | * reserved 110 | ||
128 | * WRITEALLOC 111 10 01 01 | ||
129 | * DEV_SHARED 100 01 | ||
130 | * DEV_NONSHARED 100 01 | ||
131 | * DEV_WC 001 10 | ||
132 | * DEV_CACHED 011 10 | ||
133 | * | ||
134 | * Other attributes: | ||
135 | * | ||
136 | * DS0 = PRRR[16] = 0 - device shareable property | ||
137 | * DS1 = PRRR[17] = 1 - device shareable property | ||
138 | * NS0 = PRRR[18] = 0 - normal shareable property | ||
139 | * NS1 = PRRR[19] = 1 - normal shareable property | ||
140 | * NOS = PRRR[24+n] = 1 - not outer shareable | ||
141 | */ | ||
142 | .equ PRRR, 0xff0a81a8 | ||
143 | .equ NMRR, 0x40e040e0 | ||
144 | |||
145 | /* | ||
146 | * Macro for setting up the TTBRx and TTBCR registers. | ||
147 | * - \ttb0 and \ttb1 updated with the corresponding flags. | ||
148 | */ | ||
149 | .macro v7_ttb_setup, zero, ttbr0, ttbr1, tmp | ||
150 | mcr p15, 0, \zero, c2, c0, 2 @ TTB control register | ||
151 | ALT_SMP(orr \ttbr0, \ttbr0, #TTB_FLAGS_SMP) | ||
152 | ALT_UP(orr \ttbr0, \ttbr0, #TTB_FLAGS_UP) | ||
153 | ALT_SMP(orr \ttbr1, \ttbr1, #TTB_FLAGS_SMP) | ||
154 | ALT_UP(orr \ttbr1, \ttbr1, #TTB_FLAGS_UP) | ||
155 | mcr p15, 0, \ttbr1, c2, c0, 1 @ load TTB1 | ||
156 | .endm | ||
157 | |||
158 | __CPUINIT | ||
159 | |||
160 | /* AT | ||
161 | * TFR EV X F I D LR S | ||
162 | * .EEE ..EE PUI. .T.T 4RVI ZWRS BLDP WCAM | ||
163 | * rxxx rrxx xxx0 0101 xxxx xxxx x111 xxxx < forced | ||
164 | * 1 0 110 0011 1100 .111 1101 < we want | ||
165 | */ | ||
166 | .align 2 | ||
167 | .type v7_crval, #object | ||
168 | v7_crval: | ||
169 | crval clear=0x0120c302, mmuset=0x10c03c7d, ucset=0x00c01c7c | ||
170 | |||
171 | .previous | ||
diff --git a/arch/arm/mm/proc-v7-3level.S b/arch/arm/mm/proc-v7-3level.S new file mode 100644 index 00000000000..8de0f1dd154 --- /dev/null +++ b/arch/arm/mm/proc-v7-3level.S | |||
@@ -0,0 +1,150 @@ | |||
1 | /* | ||
2 | * arch/arm/mm/proc-v7-3level.S | ||
3 | * | ||
4 | * Copyright (C) 2001 Deep Blue Solutions Ltd. | ||
5 | * Copyright (C) 2011 ARM Ltd. | ||
6 | * Author: Catalin Marinas <catalin.marinas@arm.com> | ||
7 | * based on arch/arm/mm/proc-v7-2level.S | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License version 2 as | ||
11 | * published by the Free Software Foundation. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | * GNU General Public License for more details. | ||
17 | * | ||
18 | * You should have received a copy of the GNU General Public License | ||
19 | * along with this program; if not, write to the Free Software | ||
20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
21 | */ | ||
22 | |||
23 | #define TTB_IRGN_NC (0 << 8) | ||
24 | #define TTB_IRGN_WBWA (1 << 8) | ||
25 | #define TTB_IRGN_WT (2 << 8) | ||
26 | #define TTB_IRGN_WB (3 << 8) | ||
27 | #define TTB_RGN_NC (0 << 10) | ||
28 | #define TTB_RGN_OC_WBWA (1 << 10) | ||
29 | #define TTB_RGN_OC_WT (2 << 10) | ||
30 | #define TTB_RGN_OC_WB (3 << 10) | ||
31 | #define TTB_S (3 << 12) | ||
32 | #define TTB_EAE (1 << 31) | ||
33 | |||
34 | /* PTWs cacheable, inner WB not shareable, outer WB not shareable */ | ||
35 | #define TTB_FLAGS_UP (TTB_IRGN_WB|TTB_RGN_OC_WB) | ||
36 | #define PMD_FLAGS_UP (PMD_SECT_WB) | ||
37 | |||
38 | /* PTWs cacheable, inner WBWA shareable, outer WBWA not shareable */ | ||
39 | #define TTB_FLAGS_SMP (TTB_IRGN_WBWA|TTB_S|TTB_RGN_OC_WBWA) | ||
40 | #define PMD_FLAGS_SMP (PMD_SECT_WBWA|PMD_SECT_S) | ||
41 | |||
42 | /* | ||
43 | * cpu_v7_switch_mm(pgd_phys, tsk) | ||
44 | * | ||
45 | * Set the translation table base pointer to be pgd_phys (physical address of | ||
46 | * the new TTB). | ||
47 | */ | ||
48 | ENTRY(cpu_v7_switch_mm) | ||
49 | #ifdef CONFIG_MMU | ||
50 | ldr r1, [r1, #MM_CONTEXT_ID] @ get mm->context.id | ||
51 | and r3, r1, #0xff | ||
52 | mov r3, r3, lsl #(48 - 32) @ ASID | ||
53 | mcrr p15, 0, r0, r3, c2 @ set TTB 0 | ||
54 | isb | ||
55 | #endif | ||
56 | mov pc, lr | ||
57 | ENDPROC(cpu_v7_switch_mm) | ||
58 | |||
59 | /* | ||
60 | * cpu_v7_set_pte_ext(ptep, pte) | ||
61 | * | ||
62 | * Set a level 2 translation table entry. | ||
63 | * - ptep - pointer to level 3 translation table entry | ||
64 | * - pte - PTE value to store (64-bit in r2 and r3) | ||
65 | */ | ||
66 | ENTRY(cpu_v7_set_pte_ext) | ||
67 | #ifdef CONFIG_MMU | ||
68 | tst r2, #L_PTE_PRESENT | ||
69 | beq 1f | ||
70 | tst r3, #1 << (55 - 32) @ L_PTE_DIRTY | ||
71 | orreq r2, #L_PTE_RDONLY | ||
72 | 1: strd r2, r3, [r0] | ||
73 | mcr p15, 0, r0, c7, c10, 1 @ flush_pte | ||
74 | #endif | ||
75 | mov pc, lr | ||
76 | ENDPROC(cpu_v7_set_pte_ext) | ||
77 | |||
78 | /* | ||
79 | * Memory region attributes for LPAE (defined in pgtable-3level.h): | ||
80 | * | ||
81 | * n = AttrIndx[2:0] | ||
82 | * | ||
83 | * n MAIR | ||
84 | * UNCACHED 000 00000000 | ||
85 | * BUFFERABLE 001 01000100 | ||
86 | * DEV_WC 001 01000100 | ||
87 | * WRITETHROUGH 010 10101010 | ||
88 | * WRITEBACK 011 11101110 | ||
89 | * DEV_CACHED 011 11101110 | ||
90 | * DEV_SHARED 100 00000100 | ||
91 | * DEV_NONSHARED 100 00000100 | ||
92 | * unused 101 | ||
93 | * unused 110 | ||
94 | * WRITEALLOC 111 11111111 | ||
95 | */ | ||
96 | .equ PRRR, 0xeeaa4400 @ MAIR0 | ||
97 | .equ NMRR, 0xff000004 @ MAIR1 | ||
98 | |||
99 | /* | ||
100 | * Macro for setting up the TTBRx and TTBCR registers. | ||
101 | * - \ttbr1 updated. | ||
102 | */ | ||
103 | .macro v7_ttb_setup, zero, ttbr0, ttbr1, tmp | ||
104 | ldr \tmp, =swapper_pg_dir @ swapper_pg_dir virtual address | ||
105 | cmp \ttbr1, \tmp @ PHYS_OFFSET > PAGE_OFFSET? (branch below) | ||
106 | mrc p15, 0, \tmp, c2, c0, 2 @ TTB control register | ||
107 | orr \tmp, \tmp, #TTB_EAE | ||
108 | ALT_SMP(orr \tmp, \tmp, #TTB_FLAGS_SMP) | ||
109 | ALT_UP(orr \tmp, \tmp, #TTB_FLAGS_UP) | ||
110 | ALT_SMP(orr \tmp, \tmp, #TTB_FLAGS_SMP << 16) | ||
111 | ALT_UP(orr \tmp, \tmp, #TTB_FLAGS_UP << 16) | ||
112 | /* | ||
113 | * TTBR0/TTBR1 split (PAGE_OFFSET): | ||
114 | * 0x40000000: T0SZ = 2, T1SZ = 0 (not used) | ||
115 | * 0x80000000: T0SZ = 0, T1SZ = 1 | ||
116 | * 0xc0000000: T0SZ = 0, T1SZ = 2 | ||
117 | * | ||
118 | * Only use this feature if PHYS_OFFSET <= PAGE_OFFSET, otherwise | ||
119 | * booting secondary CPUs would end up using TTBR1 for the identity | ||
120 | * mapping set up in TTBR0. | ||
121 | */ | ||
122 | bhi 9001f @ PHYS_OFFSET > PAGE_OFFSET? | ||
123 | orr \tmp, \tmp, #(((PAGE_OFFSET >> 30) - 1) << 16) @ TTBCR.T1SZ | ||
124 | #if defined CONFIG_VMSPLIT_2G | ||
125 | /* PAGE_OFFSET == 0x80000000, T1SZ == 1 */ | ||
126 | add \ttbr1, \ttbr1, #1 << 4 @ skip two L1 entries | ||
127 | #elif defined CONFIG_VMSPLIT_3G | ||
128 | /* PAGE_OFFSET == 0xc0000000, T1SZ == 2 */ | ||
129 | add \ttbr1, \ttbr1, #4096 * (1 + 3) @ only L2 used, skip pgd+3*pmd | ||
130 | #endif | ||
131 | /* CONFIG_VMSPLIT_1G does not need TTBR1 adjustment */ | ||
132 | 9001: mcr p15, 0, \tmp, c2, c0, 2 @ TTB control register | ||
133 | mcrr p15, 1, \ttbr1, \zero, c2 @ load TTBR1 | ||
134 | .endm | ||
135 | |||
136 | __CPUINIT | ||
137 | |||
138 | /* | ||
139 | * AT | ||
140 | * TFR EV X F IHD LR S | ||
141 | * .EEE ..EE PUI. .TAT 4RVI ZWRS BLDP WCAM | ||
142 | * rxxx rrxx xxx0 0101 xxxx xxxx x111 xxxx < forced | ||
143 | * 11 0 110 1 0011 1100 .111 1101 < we want | ||
144 | */ | ||
145 | .align 2 | ||
146 | .type v7_crval, #object | ||
147 | v7_crval: | ||
148 | crval clear=0x0120c302, mmuset=0x30c23c7d, ucset=0x00c01c7c | ||
149 | |||
150 | .previous | ||
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index 2c559ac3814..7e9b5bf910c 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S | |||
@@ -19,24 +19,11 @@ | |||
19 | 19 | ||
20 | #include "proc-macros.S" | 20 | #include "proc-macros.S" |
21 | 21 | ||
22 | #define TTB_S (1 << 1) | 22 | #ifdef CONFIG_ARM_LPAE |
23 | #define TTB_RGN_NC (0 << 3) | 23 | #include "proc-v7-3level.S" |
24 | #define TTB_RGN_OC_WBWA (1 << 3) | 24 | #else |
25 | #define TTB_RGN_OC_WT (2 << 3) | 25 | #include "proc-v7-2level.S" |
26 | #define TTB_RGN_OC_WB (3 << 3) | 26 | #endif |
27 | #define TTB_NOS (1 << 5) | ||
28 | #define TTB_IRGN_NC ((0 << 0) | (0 << 6)) | ||
29 | #define TTB_IRGN_WBWA ((0 << 0) | (1 << 6)) | ||
30 | #define TTB_IRGN_WT ((1 << 0) | (0 << 6)) | ||
31 | #define TTB_IRGN_WB ((1 << 0) | (1 << 6)) | ||
32 | |||
33 | /* PTWs cacheable, inner WB not shareable, outer WB not shareable */ | ||
34 | #define TTB_FLAGS_UP TTB_IRGN_WB|TTB_RGN_OC_WB | ||
35 | #define PMD_FLAGS_UP PMD_SECT_WB | ||
36 | |||
37 | /* PTWs cacheable, inner WBWA shareable, outer WBWA not shareable */ | ||
38 | #define TTB_FLAGS_SMP TTB_IRGN_WBWA|TTB_S|TTB_NOS|TTB_RGN_OC_WBWA | ||
39 | #define PMD_FLAGS_SMP PMD_SECT_WBWA|PMD_SECT_S | ||
40 | 27 | ||
41 | ENTRY(cpu_v7_proc_init) | 28 | ENTRY(cpu_v7_proc_init) |
42 | mov pc, lr | 29 | mov pc, lr |
@@ -63,6 +50,7 @@ ENDPROC(cpu_v7_proc_fin) | |||
63 | * caches disabled. | 50 | * caches disabled. |
64 | */ | 51 | */ |
65 | .align 5 | 52 | .align 5 |
53 | .pushsection .idmap.text, "ax" | ||
66 | ENTRY(cpu_v7_reset) | 54 | ENTRY(cpu_v7_reset) |
67 | mrc p15, 0, r1, c1, c0, 0 @ ctrl register | 55 | mrc p15, 0, r1, c1, c0, 0 @ ctrl register |
68 | bic r1, r1, #0x1 @ ...............m | 56 | bic r1, r1, #0x1 @ ...............m |
@@ -71,6 +59,7 @@ ENTRY(cpu_v7_reset) | |||
71 | isb | 59 | isb |
72 | mov pc, r0 | 60 | mov pc, r0 |
73 | ENDPROC(cpu_v7_reset) | 61 | ENDPROC(cpu_v7_reset) |
62 | .popsection | ||
74 | 63 | ||
75 | /* | 64 | /* |
76 | * cpu_v7_do_idle() | 65 | * cpu_v7_do_idle() |
@@ -97,127 +86,12 @@ ENTRY(cpu_v7_dcache_clean_area) | |||
97 | mov pc, lr | 86 | mov pc, lr |
98 | ENDPROC(cpu_v7_dcache_clean_area) | 87 | ENDPROC(cpu_v7_dcache_clean_area) |
99 | 88 | ||
100 | /* | ||
101 | * cpu_v7_switch_mm(pgd_phys, tsk) | ||
102 | * | ||
103 | * Set the translation table base pointer to be pgd_phys | ||
104 | * | ||
105 | * - pgd_phys - physical address of new TTB | ||
106 | * | ||
107 | * It is assumed that: | ||
108 | * - we are not using split page tables | ||
109 | */ | ||
110 | ENTRY(cpu_v7_switch_mm) | ||
111 | #ifdef CONFIG_MMU | ||
112 | mov r2, #0 | ||
113 | ldr r1, [r1, #MM_CONTEXT_ID] @ get mm->context.id | ||
114 | ALT_SMP(orr r0, r0, #TTB_FLAGS_SMP) | ||
115 | ALT_UP(orr r0, r0, #TTB_FLAGS_UP) | ||
116 | #ifdef CONFIG_ARM_ERRATA_430973 | ||
117 | mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB | ||
118 | #endif | ||
119 | #ifdef CONFIG_ARM_ERRATA_754322 | ||
120 | dsb | ||
121 | #endif | ||
122 | mcr p15, 0, r2, c13, c0, 1 @ set reserved context ID | ||
123 | isb | ||
124 | 1: mcr p15, 0, r0, c2, c0, 0 @ set TTB 0 | ||
125 | isb | ||
126 | #ifdef CONFIG_ARM_ERRATA_754322 | ||
127 | dsb | ||
128 | #endif | ||
129 | mcr p15, 0, r1, c13, c0, 1 @ set context ID | ||
130 | isb | ||
131 | #endif | ||
132 | mov pc, lr | ||
133 | ENDPROC(cpu_v7_switch_mm) | ||
134 | |||
135 | /* | ||
136 | * cpu_v7_set_pte_ext(ptep, pte) | ||
137 | * | ||
138 | * Set a level 2 translation table entry. | ||
139 | * | ||
140 | * - ptep - pointer to level 2 translation table entry | ||
141 | * (hardware version is stored at +2048 bytes) | ||
142 | * - pte - PTE value to store | ||
143 | * - ext - value for extended PTE bits | ||
144 | */ | ||
145 | ENTRY(cpu_v7_set_pte_ext) | ||
146 | #ifdef CONFIG_MMU | ||
147 | str r1, [r0] @ linux version | ||
148 | |||
149 | bic r3, r1, #0x000003f0 | ||
150 | bic r3, r3, #PTE_TYPE_MASK | ||
151 | orr r3, r3, r2 | ||
152 | orr r3, r3, #PTE_EXT_AP0 | 2 | ||
153 | |||
154 | tst r1, #1 << 4 | ||
155 | orrne r3, r3, #PTE_EXT_TEX(1) | ||
156 | |||
157 | eor r1, r1, #L_PTE_DIRTY | ||
158 | tst r1, #L_PTE_RDONLY | L_PTE_DIRTY | ||
159 | orrne r3, r3, #PTE_EXT_APX | ||
160 | |||
161 | tst r1, #L_PTE_USER | ||
162 | orrne r3, r3, #PTE_EXT_AP1 | ||
163 | #ifdef CONFIG_CPU_USE_DOMAINS | ||
164 | @ allow kernel read/write access to read-only user pages | ||
165 | tstne r3, #PTE_EXT_APX | ||
166 | bicne r3, r3, #PTE_EXT_APX | PTE_EXT_AP0 | ||
167 | #endif | ||
168 | |||
169 | tst r1, #L_PTE_XN | ||
170 | orrne r3, r3, #PTE_EXT_XN | ||
171 | |||
172 | tst r1, #L_PTE_YOUNG | ||
173 | tstne r1, #L_PTE_PRESENT | ||
174 | moveq r3, #0 | ||
175 | |||
176 | ARM( str r3, [r0, #2048]! ) | ||
177 | THUMB( add r0, r0, #2048 ) | ||
178 | THUMB( str r3, [r0] ) | ||
179 | mcr p15, 0, r0, c7, c10, 1 @ flush_pte | ||
180 | #endif | ||
181 | mov pc, lr | ||
182 | ENDPROC(cpu_v7_set_pte_ext) | ||
183 | |||
184 | string cpu_v7_name, "ARMv7 Processor" | 89 | string cpu_v7_name, "ARMv7 Processor" |
185 | .align | 90 | .align |
186 | 91 | ||
187 | /* | ||
188 | * Memory region attributes with SCTLR.TRE=1 | ||
189 | * | ||
190 | * n = TEX[0],C,B | ||
191 | * TR = PRRR[2n+1:2n] - memory type | ||
192 | * IR = NMRR[2n+1:2n] - inner cacheable property | ||
193 | * OR = NMRR[2n+17:2n+16] - outer cacheable property | ||
194 | * | ||
195 | * n TR IR OR | ||
196 | * UNCACHED 000 00 | ||
197 | * BUFFERABLE 001 10 00 00 | ||
198 | * WRITETHROUGH 010 10 10 10 | ||
199 | * WRITEBACK 011 10 11 11 | ||
200 | * reserved 110 | ||
201 | * WRITEALLOC 111 10 01 01 | ||
202 | * DEV_SHARED 100 01 | ||
203 | * DEV_NONSHARED 100 01 | ||
204 | * DEV_WC 001 10 | ||
205 | * DEV_CACHED 011 10 | ||
206 | * | ||
207 | * Other attributes: | ||
208 | * | ||
209 | * DS0 = PRRR[16] = 0 - device shareable property | ||
210 | * DS1 = PRRR[17] = 1 - device shareable property | ||
211 | * NS0 = PRRR[18] = 0 - normal shareable property | ||
212 | * NS1 = PRRR[19] = 1 - normal shareable property | ||
213 | * NOS = PRRR[24+n] = 1 - not outer shareable | ||
214 | */ | ||
215 | .equ PRRR, 0xff0a81a8 | ||
216 | .equ NMRR, 0x40e040e0 | ||
217 | |||
218 | /* Suspend/resume support: derived from arch/arm/mach-s5pv210/sleep.S */ | 92 | /* Suspend/resume support: derived from arch/arm/mach-s5pv210/sleep.S */ |
219 | .globl cpu_v7_suspend_size | 93 | .globl cpu_v7_suspend_size |
220 | .equ cpu_v7_suspend_size, 4 * 7 | 94 | .equ cpu_v7_suspend_size, 4 * 8 |
221 | #ifdef CONFIG_ARM_CPU_SUSPEND | 95 | #ifdef CONFIG_ARM_CPU_SUSPEND |
222 | ENTRY(cpu_v7_do_suspend) | 96 | ENTRY(cpu_v7_do_suspend) |
223 | stmfd sp!, {r4 - r10, lr} | 97 | stmfd sp!, {r4 - r10, lr} |
@@ -226,10 +100,11 @@ ENTRY(cpu_v7_do_suspend) | |||
226 | stmia r0!, {r4 - r5} | 100 | stmia r0!, {r4 - r5} |
227 | mrc p15, 0, r6, c3, c0, 0 @ Domain ID | 101 | mrc p15, 0, r6, c3, c0, 0 @ Domain ID |
228 | mrc p15, 0, r7, c2, c0, 1 @ TTB 1 | 102 | mrc p15, 0, r7, c2, c0, 1 @ TTB 1 |
103 | mrc p15, 0, r11, c2, c0, 2 @ TTB control register | ||
229 | mrc p15, 0, r8, c1, c0, 0 @ Control register | 104 | mrc p15, 0, r8, c1, c0, 0 @ Control register |
230 | mrc p15, 0, r9, c1, c0, 1 @ Auxiliary control register | 105 | mrc p15, 0, r9, c1, c0, 1 @ Auxiliary control register |
231 | mrc p15, 0, r10, c1, c0, 2 @ Co-processor access control | 106 | mrc p15, 0, r10, c1, c0, 2 @ Co-processor access control |
232 | stmia r0, {r6 - r10} | 107 | stmia r0, {r6 - r11} |
233 | ldmfd sp!, {r4 - r10, pc} | 108 | ldmfd sp!, {r4 - r10, pc} |
234 | ENDPROC(cpu_v7_do_suspend) | 109 | ENDPROC(cpu_v7_do_suspend) |
235 | 110 | ||
@@ -241,13 +116,15 @@ ENTRY(cpu_v7_do_resume) | |||
241 | ldmia r0!, {r4 - r5} | 116 | ldmia r0!, {r4 - r5} |
242 | mcr p15, 0, r4, c13, c0, 0 @ FCSE/PID | 117 | mcr p15, 0, r4, c13, c0, 0 @ FCSE/PID |
243 | mcr p15, 0, r5, c13, c0, 3 @ User r/o thread ID | 118 | mcr p15, 0, r5, c13, c0, 3 @ User r/o thread ID |
244 | ldmia r0, {r6 - r10} | 119 | ldmia r0, {r6 - r11} |
245 | mcr p15, 0, r6, c3, c0, 0 @ Domain ID | 120 | mcr p15, 0, r6, c3, c0, 0 @ Domain ID |
121 | #ifndef CONFIG_ARM_LPAE | ||
246 | ALT_SMP(orr r1, r1, #TTB_FLAGS_SMP) | 122 | ALT_SMP(orr r1, r1, #TTB_FLAGS_SMP) |
247 | ALT_UP(orr r1, r1, #TTB_FLAGS_UP) | 123 | ALT_UP(orr r1, r1, #TTB_FLAGS_UP) |
124 | #endif | ||
248 | mcr p15, 0, r1, c2, c0, 0 @ TTB 0 | 125 | mcr p15, 0, r1, c2, c0, 0 @ TTB 0 |
249 | mcr p15, 0, r7, c2, c0, 1 @ TTB 1 | 126 | mcr p15, 0, r7, c2, c0, 1 @ TTB 1 |
250 | mcr p15, 0, ip, c2, c0, 2 @ TTB control register | 127 | mcr p15, 0, r11, c2, c0, 2 @ TTB control register |
251 | mrc p15, 0, r4, c1, c0, 1 @ Read Auxiliary control register | 128 | mrc p15, 0, r4, c1, c0, 1 @ Read Auxiliary control register |
252 | teq r4, r9 @ Is it already set? | 129 | teq r4, r9 @ Is it already set? |
253 | mcrne p15, 0, r9, c1, c0, 1 @ No, so write it | 130 | mcrne p15, 0, r9, c1, c0, 1 @ No, so write it |
@@ -284,6 +161,7 @@ __v7_ca5mp_setup: | |||
284 | __v7_ca9mp_setup: | 161 | __v7_ca9mp_setup: |
285 | mov r10, #(1 << 0) @ TLB ops broadcasting | 162 | mov r10, #(1 << 0) @ TLB ops broadcasting |
286 | b 1f | 163 | b 1f |
164 | __v7_ca7mp_setup: | ||
287 | __v7_ca15mp_setup: | 165 | __v7_ca15mp_setup: |
288 | mov r10, #0 | 166 | mov r10, #0 |
289 | 1: | 167 | 1: |
@@ -363,11 +241,13 @@ __v7_setup: | |||
363 | orreq r10, r10, #1 << 6 @ set bit #6 | 241 | orreq r10, r10, #1 << 6 @ set bit #6 |
364 | mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register | 242 | mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register |
365 | #endif | 243 | #endif |
366 | #ifdef CONFIG_ARM_ERRATA_751472 | 244 | #if defined(CONFIG_ARM_ERRATA_751472) && defined(CONFIG_SMP) |
367 | cmp r6, #0x30 @ present prior to r3p0 | 245 | ALT_SMP(cmp r6, #0x30) @ present prior to r3p0 |
246 | ALT_UP_B(1f) | ||
368 | mrclt p15, 0, r10, c15, c0, 1 @ read diagnostic register | 247 | mrclt p15, 0, r10, c15, c0, 1 @ read diagnostic register |
369 | orrlt r10, r10, #1 << 11 @ set bit #11 | 248 | orrlt r10, r10, #1 << 11 @ set bit #11 |
370 | mcrlt p15, 0, r10, c15, c0, 1 @ write diagnostic register | 249 | mcrlt p15, 0, r10, c15, c0, 1 @ write diagnostic register |
250 | 1: | ||
371 | #endif | 251 | #endif |
372 | 252 | ||
373 | 3: mov r10, #0 | 253 | 3: mov r10, #0 |
@@ -377,12 +257,7 @@ __v7_setup: | |||
377 | dsb | 257 | dsb |
378 | #ifdef CONFIG_MMU | 258 | #ifdef CONFIG_MMU |
379 | mcr p15, 0, r10, c8, c7, 0 @ invalidate I + D TLBs | 259 | mcr p15, 0, r10, c8, c7, 0 @ invalidate I + D TLBs |
380 | mcr p15, 0, r10, c2, c0, 2 @ TTB control register | 260 | v7_ttb_setup r10, r4, r8, r5 @ TTBCR, TTBRx setup |
381 | ALT_SMP(orr r4, r4, #TTB_FLAGS_SMP) | ||
382 | ALT_UP(orr r4, r4, #TTB_FLAGS_UP) | ||
383 | ALT_SMP(orr r8, r8, #TTB_FLAGS_SMP) | ||
384 | ALT_UP(orr r8, r8, #TTB_FLAGS_UP) | ||
385 | mcr p15, 0, r8, c2, c0, 1 @ load TTB1 | ||
386 | ldr r5, =PRRR @ PRRR | 261 | ldr r5, =PRRR @ PRRR |
387 | ldr r6, =NMRR @ NMRR | 262 | ldr r6, =NMRR @ NMRR |
388 | mcr p15, 0, r5, c10, c2, 0 @ write PRRR | 263 | mcr p15, 0, r5, c10, c2, 0 @ write PRRR |
@@ -404,16 +279,7 @@ __v7_setup: | |||
404 | mov pc, lr @ return to head.S:__ret | 279 | mov pc, lr @ return to head.S:__ret |
405 | ENDPROC(__v7_setup) | 280 | ENDPROC(__v7_setup) |
406 | 281 | ||
407 | /* AT | 282 | .align 2 |
408 | * TFR EV X F I D LR S | ||
409 | * .EEE ..EE PUI. .T.T 4RVI ZWRS BLDP WCAM | ||
410 | * rxxx rrxx xxx0 0101 xxxx xxxx x111 xxxx < forced | ||
411 | * 1 0 110 0011 1100 .111 1101 < we want | ||
412 | */ | ||
413 | .type v7_crval, #object | ||
414 | v7_crval: | ||
415 | crval clear=0x0120c302, mmuset=0x10c03c7d, ucset=0x00c01c7c | ||
416 | |||
417 | __v7_setup_stack: | 283 | __v7_setup_stack: |
418 | .space 4 * 11 @ 11 registers | 284 | .space 4 * 11 @ 11 registers |
419 | 285 | ||
@@ -435,11 +301,11 @@ __v7_setup_stack: | |||
435 | */ | 301 | */ |
436 | .macro __v7_proc initfunc, mm_mmuflags = 0, io_mmuflags = 0, hwcaps = 0 | 302 | .macro __v7_proc initfunc, mm_mmuflags = 0, io_mmuflags = 0, hwcaps = 0 |
437 | ALT_SMP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \ | 303 | ALT_SMP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \ |
438 | PMD_FLAGS_SMP | \mm_mmuflags) | 304 | PMD_SECT_AF | PMD_FLAGS_SMP | \mm_mmuflags) |
439 | ALT_UP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \ | 305 | ALT_UP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \ |
440 | PMD_FLAGS_UP | \mm_mmuflags) | 306 | PMD_SECT_AF | PMD_FLAGS_UP | \mm_mmuflags) |
441 | .long PMD_TYPE_SECT | PMD_SECT_XN | PMD_SECT_AP_WRITE | \ | 307 | .long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | \ |
442 | PMD_SECT_AP_READ | \io_mmuflags | 308 | PMD_SECT_AP_READ | PMD_SECT_AF | \io_mmuflags |
443 | W(b) \initfunc | 309 | W(b) \initfunc |
444 | .long cpu_arch_name | 310 | .long cpu_arch_name |
445 | .long cpu_elf_name | 311 | .long cpu_elf_name |
@@ -452,6 +318,7 @@ __v7_setup_stack: | |||
452 | .long v7_cache_fns | 318 | .long v7_cache_fns |
453 | .endm | 319 | .endm |
454 | 320 | ||
321 | #ifndef CONFIG_ARM_LPAE | ||
455 | /* | 322 | /* |
456 | * ARM Ltd. Cortex A5 processor. | 323 | * ARM Ltd. Cortex A5 processor. |
457 | */ | 324 | */ |
@@ -463,6 +330,16 @@ __v7_ca5mp_proc_info: | |||
463 | .size __v7_ca5mp_proc_info, . - __v7_ca5mp_proc_info | 330 | .size __v7_ca5mp_proc_info, . - __v7_ca5mp_proc_info |
464 | 331 | ||
465 | /* | 332 | /* |
333 | * ARM Ltd. Cortex A7 processor. | ||
334 | */ | ||
335 | .type __v7_ca7mp_proc_info, #object | ||
336 | __v7_ca7mp_proc_info: | ||
337 | .long 0x410fc070 | ||
338 | .long 0xff0ffff0 | ||
339 | __v7_proc __v7_ca7mp_setup, hwcaps = HWCAP_IDIV | ||
340 | .size __v7_ca7mp_proc_info, . - __v7_ca7mp_proc_info | ||
341 | |||
342 | /* | ||
466 | * ARM Ltd. Cortex A9 processor. | 343 | * ARM Ltd. Cortex A9 processor. |
467 | */ | 344 | */ |
468 | .type __v7_ca9mp_proc_info, #object | 345 | .type __v7_ca9mp_proc_info, #object |
@@ -471,6 +348,7 @@ __v7_ca9mp_proc_info: | |||
471 | .long 0xff0ffff0 | 348 | .long 0xff0ffff0 |
472 | __v7_proc __v7_ca9mp_setup | 349 | __v7_proc __v7_ca9mp_setup |
473 | .size __v7_ca9mp_proc_info, . - __v7_ca9mp_proc_info | 350 | .size __v7_ca9mp_proc_info, . - __v7_ca9mp_proc_info |
351 | #endif /* CONFIG_ARM_LPAE */ | ||
474 | 352 | ||
475 | /* | 353 | /* |
476 | * ARM Ltd. Cortex A15 processor. | 354 | * ARM Ltd. Cortex A15 processor. |
diff --git a/arch/arm/mm/proc-xsc3.S b/arch/arm/mm/proc-xsc3.S index abf0507a08a..b0d57869da2 100644 --- a/arch/arm/mm/proc-xsc3.S +++ b/arch/arm/mm/proc-xsc3.S | |||
@@ -105,6 +105,7 @@ ENTRY(cpu_xsc3_proc_fin) | |||
105 | * loc: location to jump to for soft reset | 105 | * loc: location to jump to for soft reset |
106 | */ | 106 | */ |
107 | .align 5 | 107 | .align 5 |
108 | .pushsection .idmap.text, "ax" | ||
108 | ENTRY(cpu_xsc3_reset) | 109 | ENTRY(cpu_xsc3_reset) |
109 | mov r1, #PSR_F_BIT|PSR_I_BIT|SVC_MODE | 110 | mov r1, #PSR_F_BIT|PSR_I_BIT|SVC_MODE |
110 | msr cpsr_c, r1 @ reset CPSR | 111 | msr cpsr_c, r1 @ reset CPSR |
@@ -119,6 +120,8 @@ ENTRY(cpu_xsc3_reset) | |||
119 | @ already containing those two last instructions to survive. | 120 | @ already containing those two last instructions to survive. |
120 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I and D TLBs | 121 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I and D TLBs |
121 | mov pc, r0 | 122 | mov pc, r0 |
123 | ENDPROC(cpu_xsc3_reset) | ||
124 | .popsection | ||
122 | 125 | ||
123 | /* | 126 | /* |
124 | * cpu_xsc3_do_idle() | 127 | * cpu_xsc3_do_idle() |
diff --git a/arch/arm/mm/proc-xscale.S b/arch/arm/mm/proc-xscale.S index 3277904beba..4ffebaa595e 100644 --- a/arch/arm/mm/proc-xscale.S +++ b/arch/arm/mm/proc-xscale.S | |||
@@ -142,6 +142,7 @@ ENTRY(cpu_xscale_proc_fin) | |||
142 | * Beware PXA270 erratum E7. | 142 | * Beware PXA270 erratum E7. |
143 | */ | 143 | */ |
144 | .align 5 | 144 | .align 5 |
145 | .pushsection .idmap.text, "ax" | ||
145 | ENTRY(cpu_xscale_reset) | 146 | ENTRY(cpu_xscale_reset) |
146 | mov r1, #PSR_F_BIT|PSR_I_BIT|SVC_MODE | 147 | mov r1, #PSR_F_BIT|PSR_I_BIT|SVC_MODE |
147 | msr cpsr_c, r1 @ reset CPSR | 148 | msr cpsr_c, r1 @ reset CPSR |
@@ -160,6 +161,8 @@ ENTRY(cpu_xscale_reset) | |||
160 | @ already containing those two last instructions to survive. | 161 | @ already containing those two last instructions to survive. |
161 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 162 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
162 | mov pc, r0 | 163 | mov pc, r0 |
164 | ENDPROC(cpu_xscale_reset) | ||
165 | .popsection | ||
163 | 166 | ||
164 | /* | 167 | /* |
165 | * cpu_xscale_do_idle() | 168 | * cpu_xscale_do_idle() |
diff --git a/arch/arm/nwfpe/entry.S b/arch/arm/nwfpe/entry.S index cafa1835433..d18dde95b8a 100644 --- a/arch/arm/nwfpe/entry.S +++ b/arch/arm/nwfpe/entry.S | |||
@@ -20,6 +20,8 @@ | |||
20 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 20 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
21 | */ | 21 | */ |
22 | 22 | ||
23 | #include <asm/opcodes.h> | ||
24 | |||
23 | /* This is the kernel's entry point into the floating point emulator. | 25 | /* This is the kernel's entry point into the floating point emulator. |
24 | It is called from the kernel with code similar to this: | 26 | It is called from the kernel with code similar to this: |
25 | 27 | ||
@@ -81,11 +83,11 @@ nwfpe_enter: | |||
81 | mov r6, r0 @ save the opcode | 83 | mov r6, r0 @ save the opcode |
82 | emulate: | 84 | emulate: |
83 | ldr r1, [sp, #S_PSR] @ fetch the PSR | 85 | ldr r1, [sp, #S_PSR] @ fetch the PSR |
84 | bl checkCondition @ check the condition | 86 | bl arm_check_condition @ check the condition |
85 | cmp r0, #0 @ r0 = 0 ==> condition failed | 87 | cmp r0, #ARM_OPCODE_CONDTEST_PASS @ condition passed? |
86 | 88 | ||
87 | @ if condition code failed to match, next insn | 89 | @ if condition code failed to match, next insn |
88 | beq next @ get the next instruction; | 90 | bne next @ get the next instruction; |
89 | 91 | ||
90 | mov r0, r6 @ prepare for EmulateAll() | 92 | mov r0, r6 @ prepare for EmulateAll() |
91 | bl EmulateAll @ emulate the instruction | 93 | bl EmulateAll @ emulate the instruction |
diff --git a/arch/arm/nwfpe/fpopcode.c b/arch/arm/nwfpe/fpopcode.c index 922b8110758..ff983467308 100644 --- a/arch/arm/nwfpe/fpopcode.c +++ b/arch/arm/nwfpe/fpopcode.c | |||
@@ -61,29 +61,3 @@ const float32 float32Constant[] = { | |||
61 | 0x41200000 /* single 10.0 */ | 61 | 0x41200000 /* single 10.0 */ |
62 | }; | 62 | }; |
63 | 63 | ||
64 | /* condition code lookup table | ||
65 | index into the table is test code: EQ, NE, ... LT, GT, AL, NV | ||
66 | bit position in short is condition code: NZCV */ | ||
67 | static const unsigned short aCC[16] = { | ||
68 | 0xF0F0, // EQ == Z set | ||
69 | 0x0F0F, // NE | ||
70 | 0xCCCC, // CS == C set | ||
71 | 0x3333, // CC | ||
72 | 0xFF00, // MI == N set | ||
73 | 0x00FF, // PL | ||
74 | 0xAAAA, // VS == V set | ||
75 | 0x5555, // VC | ||
76 | 0x0C0C, // HI == C set && Z clear | ||
77 | 0xF3F3, // LS == C clear || Z set | ||
78 | 0xAA55, // GE == (N==V) | ||
79 | 0x55AA, // LT == (N!=V) | ||
80 | 0x0A05, // GT == (!Z && (N==V)) | ||
81 | 0xF5FA, // LE == (Z || (N!=V)) | ||
82 | 0xFFFF, // AL always | ||
83 | 0 // NV | ||
84 | }; | ||
85 | |||
86 | unsigned int checkCondition(const unsigned int opcode, const unsigned int ccodes) | ||
87 | { | ||
88 | return (aCC[opcode >> 28] >> (ccodes >> 28)) & 1; | ||
89 | } | ||
diff --git a/arch/arm/nwfpe/fpopcode.h b/arch/arm/nwfpe/fpopcode.h index 786e4c96156..78f02dbfaa8 100644 --- a/arch/arm/nwfpe/fpopcode.h +++ b/arch/arm/nwfpe/fpopcode.h | |||
@@ -475,9 +475,6 @@ static inline unsigned int getDestinationSize(const unsigned int opcode) | |||
475 | return (nRc); | 475 | return (nRc); |
476 | } | 476 | } |
477 | 477 | ||
478 | extern unsigned int checkCondition(const unsigned int opcode, | ||
479 | const unsigned int ccodes); | ||
480 | |||
481 | extern const float64 float64Constant[]; | 478 | extern const float64 float64Constant[]; |
482 | extern const float32 float32Constant[]; | 479 | extern const float32 float32Constant[]; |
483 | 480 | ||
diff --git a/arch/arm/oprofile/common.c b/arch/arm/oprofile/common.c index c074e66ad22..4e0a371630b 100644 --- a/arch/arm/oprofile/common.c +++ b/arch/arm/oprofile/common.c | |||
@@ -116,7 +116,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops) | |||
116 | return oprofile_perf_init(ops); | 116 | return oprofile_perf_init(ops); |
117 | } | 117 | } |
118 | 118 | ||
119 | void __exit oprofile_arch_exit(void) | 119 | void oprofile_arch_exit(void) |
120 | { | 120 | { |
121 | oprofile_perf_exit(); | 121 | oprofile_perf_exit(); |
122 | } | 122 | } |
diff --git a/arch/arm/plat-iop/Makefile b/arch/arm/plat-iop/Makefile index f5aebfec4f2..a99dc15a70f 100644 --- a/arch/arm/plat-iop/Makefile +++ b/arch/arm/plat-iop/Makefile | |||
@@ -10,7 +10,6 @@ obj-$(CONFIG_ARCH_IOP32X) += i2c.o | |||
10 | obj-$(CONFIG_ARCH_IOP32X) += pci.o | 10 | obj-$(CONFIG_ARCH_IOP32X) += pci.o |
11 | obj-$(CONFIG_ARCH_IOP32X) += setup.o | 11 | obj-$(CONFIG_ARCH_IOP32X) += setup.o |
12 | obj-$(CONFIG_ARCH_IOP32X) += time.o | 12 | obj-$(CONFIG_ARCH_IOP32X) += time.o |
13 | obj-$(CONFIG_ARCH_IOP32X) += io.o | ||
14 | obj-$(CONFIG_ARCH_IOP32X) += cp6.o | 13 | obj-$(CONFIG_ARCH_IOP32X) += cp6.o |
15 | obj-$(CONFIG_ARCH_IOP32X) += adma.o | 14 | obj-$(CONFIG_ARCH_IOP32X) += adma.o |
16 | obj-$(CONFIG_ARCH_IOP32X) += pmu.o | 15 | obj-$(CONFIG_ARCH_IOP32X) += pmu.o |
@@ -22,7 +21,6 @@ obj-$(CONFIG_ARCH_IOP33X) += i2c.o | |||
22 | obj-$(CONFIG_ARCH_IOP33X) += pci.o | 21 | obj-$(CONFIG_ARCH_IOP33X) += pci.o |
23 | obj-$(CONFIG_ARCH_IOP33X) += setup.o | 22 | obj-$(CONFIG_ARCH_IOP33X) += setup.o |
24 | obj-$(CONFIG_ARCH_IOP33X) += time.o | 23 | obj-$(CONFIG_ARCH_IOP33X) += time.o |
25 | obj-$(CONFIG_ARCH_IOP33X) += io.o | ||
26 | obj-$(CONFIG_ARCH_IOP33X) += cp6.o | 24 | obj-$(CONFIG_ARCH_IOP33X) += cp6.o |
27 | obj-$(CONFIG_ARCH_IOP33X) += adma.o | 25 | obj-$(CONFIG_ARCH_IOP33X) += adma.o |
28 | obj-$(CONFIG_ARCH_IOP33X) += pmu.o | 26 | obj-$(CONFIG_ARCH_IOP33X) += pmu.o |
diff --git a/arch/arm/plat-iop/io.c b/arch/arm/plat-iop/io.c deleted file mode 100644 index e15bc17db90..00000000000 --- a/arch/arm/plat-iop/io.c +++ /dev/null | |||
@@ -1,59 +0,0 @@ | |||
1 | /* | ||
2 | * iop3xx custom ioremap implementation | ||
3 | * Copyright (c) 2006, Intel Corporation. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms and conditions of the GNU General Public License, | ||
7 | * version 2, as published by the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
12 | * more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License along with | ||
15 | * this program; if not, write to the Free Software Foundation, Inc., 59 Temple | ||
16 | * Place - Suite 330, Boston, MA 02111-1307 USA. | ||
17 | * | ||
18 | */ | ||
19 | #include <linux/kernel.h> | ||
20 | #include <linux/module.h> | ||
21 | #include <linux/io.h> | ||
22 | #include <mach/hardware.h> | ||
23 | |||
24 | void * __iomem __iop3xx_ioremap(unsigned long cookie, size_t size, | ||
25 | unsigned int mtype) | ||
26 | { | ||
27 | void __iomem * retval; | ||
28 | |||
29 | switch (cookie) { | ||
30 | case IOP3XX_PCI_LOWER_IO_PA ... IOP3XX_PCI_UPPER_IO_PA: | ||
31 | retval = (void *) IOP3XX_PCI_IO_PHYS_TO_VIRT(cookie); | ||
32 | break; | ||
33 | case IOP3XX_PERIPHERAL_PHYS_BASE ... IOP3XX_PERIPHERAL_UPPER_PA: | ||
34 | retval = (void *) IOP3XX_PMMR_PHYS_TO_VIRT(cookie); | ||
35 | break; | ||
36 | default: | ||
37 | retval = __arm_ioremap_caller(cookie, size, mtype, | ||
38 | __builtin_return_address(0)); | ||
39 | } | ||
40 | |||
41 | return retval; | ||
42 | } | ||
43 | EXPORT_SYMBOL(__iop3xx_ioremap); | ||
44 | |||
45 | void __iop3xx_iounmap(void __iomem *addr) | ||
46 | { | ||
47 | extern void __iounmap(volatile void __iomem *addr); | ||
48 | |||
49 | switch ((u32) addr) { | ||
50 | case IOP3XX_PCI_LOWER_IO_VA ... IOP3XX_PCI_UPPER_IO_VA: | ||
51 | case IOP3XX_PERIPHERAL_VIRT_BASE ... IOP3XX_PERIPHERAL_UPPER_VA: | ||
52 | goto skip; | ||
53 | } | ||
54 | __iounmap(addr); | ||
55 | |||
56 | skip: | ||
57 | return; | ||
58 | } | ||
59 | EXPORT_SYMBOL(__iop3xx_iounmap); | ||
diff --git a/arch/arm/plat-iop/time.c b/arch/arm/plat-iop/time.c index 568dd0223d1..cbfbbe46178 100644 --- a/arch/arm/plat-iop/time.c +++ b/arch/arm/plat-iop/time.c | |||
@@ -18,7 +18,6 @@ | |||
18 | #include <linux/time.h> | 18 | #include <linux/time.h> |
19 | #include <linux/init.h> | 19 | #include <linux/init.h> |
20 | #include <linux/timex.h> | 20 | #include <linux/timex.h> |
21 | #include <linux/sched.h> | ||
22 | #include <linux/io.h> | 21 | #include <linux/io.h> |
23 | #include <linux/clocksource.h> | 22 | #include <linux/clocksource.h> |
24 | #include <linux/clockchips.h> | 23 | #include <linux/clockchips.h> |
@@ -52,21 +51,12 @@ static struct clocksource iop_clocksource = { | |||
52 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | 51 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, |
53 | }; | 52 | }; |
54 | 53 | ||
55 | static DEFINE_CLOCK_DATA(cd); | ||
56 | |||
57 | /* | 54 | /* |
58 | * IOP sched_clock() implementation via its clocksource. | 55 | * IOP sched_clock() implementation via its clocksource. |
59 | */ | 56 | */ |
60 | unsigned long long notrace sched_clock(void) | 57 | static u32 notrace iop_read_sched_clock(void) |
61 | { | 58 | { |
62 | u32 cyc = 0xffffffffu - read_tcr1(); | 59 | return 0xffffffffu - read_tcr1(); |
63 | return cyc_to_sched_clock(&cd, cyc, (u32)~0); | ||
64 | } | ||
65 | |||
66 | static void notrace iop_update_sched_clock(void) | ||
67 | { | ||
68 | u32 cyc = 0xffffffffu - read_tcr1(); | ||
69 | update_sched_clock(&cd, cyc, (u32)~0); | ||
70 | } | 60 | } |
71 | 61 | ||
72 | /* | 62 | /* |
@@ -152,7 +142,7 @@ void __init iop_init_time(unsigned long tick_rate) | |||
152 | { | 142 | { |
153 | u32 timer_ctl; | 143 | u32 timer_ctl; |
154 | 144 | ||
155 | init_sched_clock(&cd, iop_update_sched_clock, 32, tick_rate); | 145 | setup_sched_clock(iop_read_sched_clock, 32, tick_rate); |
156 | 146 | ||
157 | ticks_per_jiffy = DIV_ROUND_CLOSEST(tick_rate, HZ); | 147 | ticks_per_jiffy = DIV_ROUND_CLOSEST(tick_rate, HZ); |
158 | iop_tick_rate = tick_rate; | 148 | iop_tick_rate = tick_rate; |
diff --git a/arch/arm/plat-mxc/Kconfig b/arch/arm/plat-mxc/Kconfig index b3a1f2b3ada..b30708e28c1 100644 --- a/arch/arm/plat-mxc/Kconfig +++ b/arch/arm/plat-mxc/Kconfig | |||
@@ -20,6 +20,7 @@ config ARCH_IMX_V6_V7 | |||
20 | bool "i.MX3, i.MX6" | 20 | bool "i.MX3, i.MX6" |
21 | select AUTO_ZRELADDR if !ZBOOT_ROM | 21 | select AUTO_ZRELADDR if !ZBOOT_ROM |
22 | select ARM_PATCH_PHYS_VIRT | 22 | select ARM_PATCH_PHYS_VIRT |
23 | select MIGHT_HAVE_CACHE_L2X0 | ||
23 | help | 24 | help |
24 | This enables support for systems based on the Freescale i.MX3 and i.MX6 | 25 | This enables support for systems based on the Freescale i.MX3 and i.MX6 |
25 | family. | 26 | family. |
diff --git a/arch/arm/plat-mxc/Makefile b/arch/arm/plat-mxc/Makefile index b9f0f5f499a..076db84f3e3 100644 --- a/arch/arm/plat-mxc/Makefile +++ b/arch/arm/plat-mxc/Makefile | |||
@@ -5,7 +5,6 @@ | |||
5 | # Common support | 5 | # Common support |
6 | obj-y := clock.o time.o devices.o cpu.o system.o irq-common.o | 6 | obj-y := clock.o time.o devices.o cpu.o system.o irq-common.o |
7 | 7 | ||
8 | obj-$(CONFIG_ARM_GIC) += gic.o | ||
9 | obj-$(CONFIG_MXC_TZIC) += tzic.o | 8 | obj-$(CONFIG_MXC_TZIC) += tzic.o |
10 | obj-$(CONFIG_MXC_AVIC) += avic.o | 9 | obj-$(CONFIG_MXC_AVIC) += avic.o |
11 | 10 | ||
diff --git a/arch/arm/plat-mxc/cpufreq.c b/arch/arm/plat-mxc/cpufreq.c index adbff706ef6..73db34bf588 100644 --- a/arch/arm/plat-mxc/cpufreq.c +++ b/arch/arm/plat-mxc/cpufreq.c | |||
@@ -98,7 +98,7 @@ static int mxc_set_target(struct cpufreq_policy *policy, | |||
98 | return ret; | 98 | return ret; |
99 | } | 99 | } |
100 | 100 | ||
101 | static int __init mxc_cpufreq_init(struct cpufreq_policy *policy) | 101 | static int mxc_cpufreq_init(struct cpufreq_policy *policy) |
102 | { | 102 | { |
103 | int ret; | 103 | int ret; |
104 | int i; | 104 | int i; |
diff --git a/arch/arm/plat-mxc/gic.c b/arch/arm/plat-mxc/gic.c deleted file mode 100644 index 12f8f810901..00000000000 --- a/arch/arm/plat-mxc/gic.c +++ /dev/null | |||
@@ -1,41 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright 2011 Freescale Semiconductor, Inc. | ||
3 | * Copyright 2011 Linaro Ltd. | ||
4 | * | ||
5 | * The code contained herein is licensed under the GNU General Public | ||
6 | * License. You may obtain a copy of the GNU General Public License | ||
7 | * Version 2 or later at the following locations: | ||
8 | * | ||
9 | * http://www.opensource.org/licenses/gpl-license.html | ||
10 | * http://www.gnu.org/copyleft/gpl.html | ||
11 | */ | ||
12 | |||
13 | #include <linux/io.h> | ||
14 | #include <asm/exception.h> | ||
15 | #include <asm/localtimer.h> | ||
16 | #include <asm/hardware/gic.h> | ||
17 | #ifdef CONFIG_SMP | ||
18 | #include <asm/smp.h> | ||
19 | #endif | ||
20 | |||
21 | asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs) | ||
22 | { | ||
23 | u32 irqstat, irqnr; | ||
24 | |||
25 | do { | ||
26 | irqstat = readl_relaxed(gic_cpu_base_addr + GIC_CPU_INTACK); | ||
27 | irqnr = irqstat & 0x3ff; | ||
28 | if (irqnr == 1023) | ||
29 | break; | ||
30 | |||
31 | if (irqnr > 15 && irqnr < 1021) | ||
32 | handle_IRQ(irqnr, regs); | ||
33 | #ifdef CONFIG_SMP | ||
34 | else { | ||
35 | writel_relaxed(irqstat, gic_cpu_base_addr + | ||
36 | GIC_CPU_EOI); | ||
37 | handle_IPI(irqnr, regs); | ||
38 | } | ||
39 | #endif | ||
40 | } while (1); | ||
41 | } | ||
diff --git a/arch/arm/plat-mxc/include/mach/common.h b/arch/arm/plat-mxc/include/mach/common.h index 18e5065df3c..83cca9bcfc9 100644 --- a/arch/arm/plat-mxc/include/mach/common.h +++ b/arch/arm/plat-mxc/include/mach/common.h | |||
@@ -89,7 +89,6 @@ extern void imx_print_silicon_rev(const char *cpu, int srev); | |||
89 | 89 | ||
90 | void avic_handle_irq(struct pt_regs *); | 90 | void avic_handle_irq(struct pt_regs *); |
91 | void tzic_handle_irq(struct pt_regs *); | 91 | void tzic_handle_irq(struct pt_regs *); |
92 | void gic_handle_irq(struct pt_regs *); | ||
93 | 92 | ||
94 | #define imx1_handle_irq avic_handle_irq | 93 | #define imx1_handle_irq avic_handle_irq |
95 | #define imx21_handle_irq avic_handle_irq | 94 | #define imx21_handle_irq avic_handle_irq |
diff --git a/arch/arm/plat-mxc/include/mach/entry-macro.S b/arch/arm/plat-mxc/include/mach/entry-macro.S index ca5cf26a04b..def5d30cb67 100644 --- a/arch/arm/plat-mxc/include/mach/entry-macro.S +++ b/arch/arm/plat-mxc/include/mach/entry-macro.S | |||
@@ -9,19 +9,8 @@ | |||
9 | * published by the Free Software Foundation. | 9 | * published by the Free Software Foundation. |
10 | */ | 10 | */ |
11 | 11 | ||
12 | /* Unused, we use CONFIG_MULTI_IRQ_HANDLER */ | ||
13 | |||
14 | .macro disable_fiq | 12 | .macro disable_fiq |
15 | .endm | 13 | .endm |
16 | 14 | ||
17 | .macro get_irqnr_preamble, base, tmp | ||
18 | .endm | ||
19 | |||
20 | .macro arch_ret_to_user, tmp1, tmp2 | 15 | .macro arch_ret_to_user, tmp1, tmp2 |
21 | .endm | 16 | .endm |
22 | |||
23 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
24 | .endm | ||
25 | |||
26 | .macro test_for_ipi, irqnr, irqstat, base, tmp | ||
27 | .endm | ||
diff --git a/arch/arm/plat-mxc/include/mach/mx1.h b/arch/arm/plat-mxc/include/mach/mx1.h index 97b19e7800b..2b7c08d13e8 100644 --- a/arch/arm/plat-mxc/include/mach/mx1.h +++ b/arch/arm/plat-mxc/include/mach/mx1.h | |||
@@ -12,8 +12,6 @@ | |||
12 | #ifndef __MACH_MX1_H__ | 12 | #ifndef __MACH_MX1_H__ |
13 | #define __MACH_MX1_H__ | 13 | #define __MACH_MX1_H__ |
14 | 14 | ||
15 | #include <mach/vmalloc.h> | ||
16 | |||
17 | /* | 15 | /* |
18 | * Memory map | 16 | * Memory map |
19 | */ | 17 | */ |
diff --git a/arch/arm/plat-mxc/include/mach/uncompress.h b/arch/arm/plat-mxc/include/mach/uncompress.h index 88fd4045256..477971b0093 100644 --- a/arch/arm/plat-mxc/include/mach/uncompress.h +++ b/arch/arm/plat-mxc/include/mach/uncompress.h | |||
@@ -98,6 +98,7 @@ static __inline__ void __arch_decomp_setup(unsigned long arch_id) | |||
98 | case MACH_TYPE_PCM043: | 98 | case MACH_TYPE_PCM043: |
99 | case MACH_TYPE_LILLY1131: | 99 | case MACH_TYPE_LILLY1131: |
100 | case MACH_TYPE_VPR200: | 100 | case MACH_TYPE_VPR200: |
101 | case MACH_TYPE_EUKREA_CPUIMX35SD: | ||
101 | uart_base = MX3X_UART1_BASE_ADDR; | 102 | uart_base = MX3X_UART1_BASE_ADDR; |
102 | break; | 103 | break; |
103 | case MACH_TYPE_MAGX_ZN5: | 104 | case MACH_TYPE_MAGX_ZN5: |
diff --git a/arch/arm/plat-mxc/include/mach/vmalloc.h b/arch/arm/plat-mxc/include/mach/vmalloc.h deleted file mode 100644 index ef6379c474b..00000000000 --- a/arch/arm/plat-mxc/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,22 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2000 Russell King. | ||
3 | * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation; either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | */ | ||
15 | |||
16 | #ifndef __ASM_ARCH_MXC_VMALLOC_H__ | ||
17 | #define __ASM_ARCH_MXC_VMALLOC_H__ | ||
18 | |||
19 | /* vmalloc ending address */ | ||
20 | #define VMALLOC_END 0xf4000000UL | ||
21 | |||
22 | #endif /* __ASM_ARCH_MXC_VMALLOC_H__ */ | ||
diff --git a/arch/arm/plat-mxc/pwm.c b/arch/arm/plat-mxc/pwm.c index 845de59f07e..e032717f7d0 100644 --- a/arch/arm/plat-mxc/pwm.c +++ b/arch/arm/plat-mxc/pwm.c | |||
@@ -77,6 +77,15 @@ int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns) | |||
77 | do_div(c, period_ns); | 77 | do_div(c, period_ns); |
78 | duty_cycles = c; | 78 | duty_cycles = c; |
79 | 79 | ||
80 | /* | ||
81 | * according to imx pwm RM, the real period value should be | ||
82 | * PERIOD value in PWMPR plus 2. | ||
83 | */ | ||
84 | if (period_cycles > 2) | ||
85 | period_cycles -= 2; | ||
86 | else | ||
87 | period_cycles = 0; | ||
88 | |||
80 | writel(duty_cycles, pwm->mmio_base + MX3_PWMSAR); | 89 | writel(duty_cycles, pwm->mmio_base + MX3_PWMSAR); |
81 | writel(period_cycles, pwm->mmio_base + MX3_PWMPR); | 90 | writel(period_cycles, pwm->mmio_base + MX3_PWMPR); |
82 | 91 | ||
diff --git a/arch/arm/plat-mxc/time.c b/arch/arm/plat-mxc/time.c index 4b0fe285e83..1c96cdb4c35 100644 --- a/arch/arm/plat-mxc/time.c +++ b/arch/arm/plat-mxc/time.c | |||
@@ -108,18 +108,9 @@ static void gpt_irq_acknowledge(void) | |||
108 | 108 | ||
109 | static void __iomem *sched_clock_reg; | 109 | static void __iomem *sched_clock_reg; |
110 | 110 | ||
111 | static DEFINE_CLOCK_DATA(cd); | 111 | static u32 notrace mxc_read_sched_clock(void) |
112 | unsigned long long notrace sched_clock(void) | ||
113 | { | 112 | { |
114 | cycle_t cyc = sched_clock_reg ? __raw_readl(sched_clock_reg) : 0; | 113 | return sched_clock_reg ? __raw_readl(sched_clock_reg) : 0; |
115 | |||
116 | return cyc_to_sched_clock(&cd, cyc, (u32)~0); | ||
117 | } | ||
118 | |||
119 | static void notrace mxc_update_sched_clock(void) | ||
120 | { | ||
121 | cycle_t cyc = sched_clock_reg ? __raw_readl(sched_clock_reg) : 0; | ||
122 | update_sched_clock(&cd, cyc, (u32)~0); | ||
123 | } | 114 | } |
124 | 115 | ||
125 | static int __init mxc_clocksource_init(struct clk *timer_clk) | 116 | static int __init mxc_clocksource_init(struct clk *timer_clk) |
@@ -129,7 +120,7 @@ static int __init mxc_clocksource_init(struct clk *timer_clk) | |||
129 | 120 | ||
130 | sched_clock_reg = reg; | 121 | sched_clock_reg = reg; |
131 | 122 | ||
132 | init_sched_clock(&cd, mxc_update_sched_clock, 32, c); | 123 | setup_sched_clock(mxc_read_sched_clock, 32, c); |
133 | return clocksource_mmio_init(reg, "mxc_timer1", c, 200, 32, | 124 | return clocksource_mmio_init(reg, "mxc_timer1", c, 200, 32, |
134 | clocksource_mmio_readl_up); | 125 | clocksource_mmio_readl_up); |
135 | } | 126 | } |
diff --git a/arch/arm/plat-nomadik/timer.c b/arch/arm/plat-nomadik/timer.c index 30b6433d910..ad1b45b605a 100644 --- a/arch/arm/plat-nomadik/timer.c +++ b/arch/arm/plat-nomadik/timer.c | |||
@@ -17,7 +17,6 @@ | |||
17 | #include <linux/clk.h> | 17 | #include <linux/clk.h> |
18 | #include <linux/jiffies.h> | 18 | #include <linux/jiffies.h> |
19 | #include <linux/err.h> | 19 | #include <linux/err.h> |
20 | #include <linux/sched.h> | ||
21 | #include <asm/mach/time.h> | 20 | #include <asm/mach/time.h> |
22 | #include <asm/sched_clock.h> | 21 | #include <asm/sched_clock.h> |
23 | 22 | ||
@@ -79,23 +78,12 @@ void __iomem *mtu_base; /* Assigned by machine code */ | |||
79 | * local implementation which uses the clocksource to get some | 78 | * local implementation which uses the clocksource to get some |
80 | * better resolution when scheduling the kernel. | 79 | * better resolution when scheduling the kernel. |
81 | */ | 80 | */ |
82 | static DEFINE_CLOCK_DATA(cd); | 81 | static u32 notrace nomadik_read_sched_clock(void) |
83 | |||
84 | unsigned long long notrace sched_clock(void) | ||
85 | { | 82 | { |
86 | u32 cyc; | ||
87 | |||
88 | if (unlikely(!mtu_base)) | 83 | if (unlikely(!mtu_base)) |
89 | return 0; | 84 | return 0; |
90 | 85 | ||
91 | cyc = -readl(mtu_base + MTU_VAL(0)); | 86 | return -readl(mtu_base + MTU_VAL(0)); |
92 | return cyc_to_sched_clock(&cd, cyc, (u32)~0); | ||
93 | } | ||
94 | |||
95 | static void notrace nomadik_update_sched_clock(void) | ||
96 | { | ||
97 | u32 cyc = -readl(mtu_base + MTU_VAL(0)); | ||
98 | update_sched_clock(&cd, cyc, (u32)~0); | ||
99 | } | 87 | } |
100 | #endif | 88 | #endif |
101 | 89 | ||
@@ -231,9 +219,11 @@ void __init nmdk_timer_init(void) | |||
231 | rate, 200, 32, clocksource_mmio_readl_down)) | 219 | rate, 200, 32, clocksource_mmio_readl_down)) |
232 | pr_err("timer: failed to initialize clock source %s\n", | 220 | pr_err("timer: failed to initialize clock source %s\n", |
233 | "mtu_0"); | 221 | "mtu_0"); |
222 | |||
234 | #ifdef CONFIG_NOMADIK_MTU_SCHED_CLOCK | 223 | #ifdef CONFIG_NOMADIK_MTU_SCHED_CLOCK |
235 | init_sched_clock(&cd, nomadik_update_sched_clock, 32, rate); | 224 | setup_sched_clock(nomadik_read_sched_clock, 32, rate); |
236 | #endif | 225 | #endif |
226 | |||
237 | /* Timer 1 is used for events */ | 227 | /* Timer 1 is used for events */ |
238 | 228 | ||
239 | clockevents_calc_mult_shift(&nmdk_clkevt, rate, MTU_MIN_RANGE); | 229 | clockevents_calc_mult_shift(&nmdk_clkevt, rate, MTU_MIN_RANGE); |
diff --git a/arch/arm/plat-omap/Makefile b/arch/arm/plat-omap/Makefile index 985262242f2..3df04d944e4 100644 --- a/arch/arm/plat-omap/Makefile +++ b/arch/arm/plat-omap/Makefile | |||
@@ -4,7 +4,7 @@ | |||
4 | 4 | ||
5 | # Common support | 5 | # Common support |
6 | obj-y := common.o sram.o clock.o devices.o dma.o mux.o \ | 6 | obj-y := common.o sram.o clock.o devices.o dma.o mux.o \ |
7 | usb.o fb.o io.o counter_32k.o | 7 | usb.o fb.o counter_32k.o |
8 | obj-m := | 8 | obj-m := |
9 | obj-n := | 9 | obj-n := |
10 | obj- := | 10 | obj- := |
diff --git a/arch/arm/plat-omap/common.c b/arch/arm/plat-omap/common.c index d9f10a31e60..2ee6341fffd 100644 --- a/arch/arm/plat-omap/common.c +++ b/arch/arm/plat-omap/common.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
16 | #include <linux/io.h> | 16 | #include <linux/io.h> |
17 | #include <linux/dma-mapping.h> | ||
17 | #include <linux/omapfb.h> | 18 | #include <linux/omapfb.h> |
18 | 19 | ||
19 | #include <plat/common.h> | 20 | #include <plat/common.h> |
@@ -66,3 +67,10 @@ void __init omap_reserve(void) | |||
66 | omap_vram_reserve_sdram_memblock(); | 67 | omap_vram_reserve_sdram_memblock(); |
67 | omap_dsp_reserve_sdram_memblock(); | 68 | omap_dsp_reserve_sdram_memblock(); |
68 | } | 69 | } |
70 | |||
71 | void __init omap_init_consistent_dma_size(void) | ||
72 | { | ||
73 | #ifdef CONFIG_FB_OMAP_CONSISTENT_DMA_SIZE | ||
74 | init_consistent_dma_size(CONFIG_FB_OMAP_CONSISTENT_DMA_SIZE << 20); | ||
75 | #endif | ||
76 | } | ||
diff --git a/arch/arm/plat-omap/counter_32k.c b/arch/arm/plat-omap/counter_32k.c index a6cbb712da5..5f0f2292b7f 100644 --- a/arch/arm/plat-omap/counter_32k.c +++ b/arch/arm/plat-omap/counter_32k.c | |||
@@ -17,7 +17,6 @@ | |||
17 | #include <linux/clk.h> | 17 | #include <linux/clk.h> |
18 | #include <linux/err.h> | 18 | #include <linux/err.h> |
19 | #include <linux/io.h> | 19 | #include <linux/io.h> |
20 | #include <linux/sched.h> | ||
21 | #include <linux/clocksource.h> | 20 | #include <linux/clocksource.h> |
22 | 21 | ||
23 | #include <asm/sched_clock.h> | 22 | #include <asm/sched_clock.h> |
@@ -37,41 +36,9 @@ static void __iomem *timer_32k_base; | |||
37 | 36 | ||
38 | #define OMAP16XX_TIMER_32K_SYNCHRONIZED 0xfffbc410 | 37 | #define OMAP16XX_TIMER_32K_SYNCHRONIZED 0xfffbc410 |
39 | 38 | ||
40 | /* | 39 | static u32 notrace omap_32k_read_sched_clock(void) |
41 | * Returns current time from boot in nsecs. It's OK for this to wrap | ||
42 | * around for now, as it's just a relative time stamp. | ||
43 | */ | ||
44 | static DEFINE_CLOCK_DATA(cd); | ||
45 | |||
46 | /* | ||
47 | * Constants generated by clocks_calc_mult_shift(m, s, 32768, NSEC_PER_SEC, 60). | ||
48 | * This gives a resolution of about 30us and a wrap period of about 36hrs. | ||
49 | */ | ||
50 | #define SC_MULT 4000000000u | ||
51 | #define SC_SHIFT 17 | ||
52 | |||
53 | static inline unsigned long long notrace _omap_32k_sched_clock(void) | ||
54 | { | ||
55 | u32 cyc = timer_32k_base ? __raw_readl(timer_32k_base) : 0; | ||
56 | return cyc_to_fixed_sched_clock(&cd, cyc, (u32)~0, SC_MULT, SC_SHIFT); | ||
57 | } | ||
58 | |||
59 | #if defined(CONFIG_OMAP_32K_TIMER) && !defined(CONFIG_OMAP_MPU_TIMER) | ||
60 | unsigned long long notrace sched_clock(void) | ||
61 | { | ||
62 | return _omap_32k_sched_clock(); | ||
63 | } | ||
64 | #else | ||
65 | unsigned long long notrace omap_32k_sched_clock(void) | ||
66 | { | ||
67 | return _omap_32k_sched_clock(); | ||
68 | } | ||
69 | #endif | ||
70 | |||
71 | static void notrace omap_update_sched_clock(void) | ||
72 | { | 40 | { |
73 | u32 cyc = timer_32k_base ? __raw_readl(timer_32k_base) : 0; | 41 | return timer_32k_base ? __raw_readl(timer_32k_base) : 0; |
74 | update_sched_clock(&cd, cyc, (u32)~0); | ||
75 | } | 42 | } |
76 | 43 | ||
77 | /** | 44 | /** |
@@ -147,8 +114,7 @@ int __init omap_init_clocksource_32k(void) | |||
147 | clocksource_mmio_readl_up)) | 114 | clocksource_mmio_readl_up)) |
148 | printk(err, "32k_counter"); | 115 | printk(err, "32k_counter"); |
149 | 116 | ||
150 | init_fixed_sched_clock(&cd, omap_update_sched_clock, 32, | 117 | setup_sched_clock(omap_32k_read_sched_clock, 32, 32768); |
151 | 32768, SC_MULT, SC_SHIFT); | ||
152 | } | 118 | } |
153 | return 0; | 119 | return 0; |
154 | } | 120 | } |
diff --git a/arch/arm/plat-omap/include/plat/common.h b/arch/arm/plat-omap/include/plat/common.h index 257f9770b2d..b4d7ec3fbfb 100644 --- a/arch/arm/plat-omap/include/plat/common.h +++ b/arch/arm/plat-omap/include/plat/common.h | |||
@@ -31,7 +31,6 @@ | |||
31 | #include <plat/omap_hwmod.h> | 31 | #include <plat/omap_hwmod.h> |
32 | 32 | ||
33 | extern int __init omap_init_clocksource_32k(void); | 33 | extern int __init omap_init_clocksource_32k(void); |
34 | extern unsigned long long notrace omap_32k_sched_clock(void); | ||
35 | 34 | ||
36 | extern void omap_reserve(void); | 35 | extern void omap_reserve(void); |
37 | extern int omap_dss_reset(struct omap_hwmod *); | 36 | extern int omap_dss_reset(struct omap_hwmod *); |
diff --git a/arch/arm/plat-omap/include/plat/io.h b/arch/arm/plat-omap/include/plat/io.h index 62f4477666c..1234944a4da 100644 --- a/arch/arm/plat-omap/include/plat/io.h +++ b/arch/arm/plat-omap/include/plat/io.h | |||
@@ -247,8 +247,6 @@ | |||
247 | * NOTE: Please use ioremap + __raw_read/write where possible instead of these | 247 | * NOTE: Please use ioremap + __raw_read/write where possible instead of these |
248 | */ | 248 | */ |
249 | 249 | ||
250 | void omap_ioremap_init(void); | ||
251 | |||
252 | extern u8 omap_readb(u32 pa); | 250 | extern u8 omap_readb(u32 pa); |
253 | extern u16 omap_readw(u32 pa); | 251 | extern u16 omap_readw(u32 pa); |
254 | extern u32 omap_readl(u32 pa); | 252 | extern u32 omap_readl(u32 pa); |
@@ -260,12 +258,6 @@ struct omap_sdrc_params; | |||
260 | extern void omap_sdrc_init(struct omap_sdrc_params *sdrc_cs0, | 258 | extern void omap_sdrc_init(struct omap_sdrc_params *sdrc_cs0, |
261 | struct omap_sdrc_params *sdrc_cs1); | 259 | struct omap_sdrc_params *sdrc_cs1); |
262 | 260 | ||
263 | #define __arch_ioremap omap_ioremap | ||
264 | #define __arch_iounmap omap_iounmap | ||
265 | |||
266 | void __iomem *omap_ioremap(unsigned long phys, size_t size, unsigned int type); | ||
267 | void omap_iounmap(volatile void __iomem *addr); | ||
268 | |||
269 | extern void __init omap_init_consistent_dma_size(void); | 261 | extern void __init omap_init_consistent_dma_size(void); |
270 | 262 | ||
271 | #endif | 263 | #endif |
diff --git a/arch/arm/plat-omap/include/plat/irqs.h b/arch/arm/plat-omap/include/plat/irqs.h index d3a9fcd53c4..ebda7382c65 100644 --- a/arch/arm/plat-omap/include/plat/irqs.h +++ b/arch/arm/plat-omap/include/plat/irqs.h | |||
@@ -436,10 +436,6 @@ | |||
436 | #define INTCPS_NR_MIR_REGS 3 | 436 | #define INTCPS_NR_MIR_REGS 3 |
437 | #define INTCPS_NR_IRQS 96 | 437 | #define INTCPS_NR_IRQS 96 |
438 | 438 | ||
439 | #ifndef __ASSEMBLY__ | ||
440 | extern void __iomem *omap_irq_base; | ||
441 | #endif | ||
442 | |||
443 | #include <mach/hardware.h> | 439 | #include <mach/hardware.h> |
444 | 440 | ||
445 | #ifdef CONFIG_FIQ | 441 | #ifdef CONFIG_FIQ |
diff --git a/arch/arm/plat-omap/io.c b/arch/arm/plat-omap/io.c deleted file mode 100644 index 333871f5999..00000000000 --- a/arch/arm/plat-omap/io.c +++ /dev/null | |||
@@ -1,159 +0,0 @@ | |||
1 | /* | ||
2 | * Common io.c file | ||
3 | * This file is created by Russell King <rmk+kernel@arm.linux.org.uk> | ||
4 | * | ||
5 | * Copyright (C) 2009 Texas Instruments | ||
6 | * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | #include <linux/module.h> | ||
13 | #include <linux/io.h> | ||
14 | #include <linux/mm.h> | ||
15 | #include <linux/dma-mapping.h> | ||
16 | |||
17 | #include <plat/omap7xx.h> | ||
18 | #include <plat/omap1510.h> | ||
19 | #include <plat/omap16xx.h> | ||
20 | #include <plat/omap24xx.h> | ||
21 | #include <plat/omap34xx.h> | ||
22 | #include <plat/omap44xx.h> | ||
23 | |||
24 | #define BETWEEN(p,st,sz) ((p) >= (st) && (p) < ((st) + (sz))) | ||
25 | #define XLATE(p,pst,vst) ((void __iomem *)((p) - (pst) + (vst))) | ||
26 | |||
27 | static int initialized; | ||
28 | |||
29 | /* | ||
30 | * Intercept ioremap() requests for addresses in our fixed mapping regions. | ||
31 | */ | ||
32 | void __iomem *omap_ioremap(unsigned long p, size_t size, unsigned int type) | ||
33 | { | ||
34 | |||
35 | WARN(!initialized, "Do not use ioremap before init_early\n"); | ||
36 | |||
37 | #ifdef CONFIG_ARCH_OMAP1 | ||
38 | if (cpu_class_is_omap1()) { | ||
39 | if (BETWEEN(p, OMAP1_IO_PHYS, OMAP1_IO_SIZE)) | ||
40 | return XLATE(p, OMAP1_IO_PHYS, OMAP1_IO_VIRT); | ||
41 | } | ||
42 | if (cpu_is_omap7xx()) { | ||
43 | if (BETWEEN(p, OMAP7XX_DSP_BASE, OMAP7XX_DSP_SIZE)) | ||
44 | return XLATE(p, OMAP7XX_DSP_BASE, OMAP7XX_DSP_START); | ||
45 | |||
46 | if (BETWEEN(p, OMAP7XX_DSPREG_BASE, OMAP7XX_DSPREG_SIZE)) | ||
47 | return XLATE(p, OMAP7XX_DSPREG_BASE, | ||
48 | OMAP7XX_DSPREG_START); | ||
49 | } | ||
50 | if (cpu_is_omap15xx()) { | ||
51 | if (BETWEEN(p, OMAP1510_DSP_BASE, OMAP1510_DSP_SIZE)) | ||
52 | return XLATE(p, OMAP1510_DSP_BASE, OMAP1510_DSP_START); | ||
53 | |||
54 | if (BETWEEN(p, OMAP1510_DSPREG_BASE, OMAP1510_DSPREG_SIZE)) | ||
55 | return XLATE(p, OMAP1510_DSPREG_BASE, | ||
56 | OMAP1510_DSPREG_START); | ||
57 | } | ||
58 | if (cpu_is_omap16xx()) { | ||
59 | if (BETWEEN(p, OMAP16XX_DSP_BASE, OMAP16XX_DSP_SIZE)) | ||
60 | return XLATE(p, OMAP16XX_DSP_BASE, OMAP16XX_DSP_START); | ||
61 | |||
62 | if (BETWEEN(p, OMAP16XX_DSPREG_BASE, OMAP16XX_DSPREG_SIZE)) | ||
63 | return XLATE(p, OMAP16XX_DSPREG_BASE, | ||
64 | OMAP16XX_DSPREG_START); | ||
65 | } | ||
66 | #endif | ||
67 | #ifdef CONFIG_ARCH_OMAP2 | ||
68 | if (cpu_is_omap24xx()) { | ||
69 | if (BETWEEN(p, L3_24XX_PHYS, L3_24XX_SIZE)) | ||
70 | return XLATE(p, L3_24XX_PHYS, L3_24XX_VIRT); | ||
71 | if (BETWEEN(p, L4_24XX_PHYS, L4_24XX_SIZE)) | ||
72 | return XLATE(p, L4_24XX_PHYS, L4_24XX_VIRT); | ||
73 | } | ||
74 | if (cpu_is_omap2420()) { | ||
75 | if (BETWEEN(p, DSP_MEM_2420_PHYS, DSP_MEM_2420_SIZE)) | ||
76 | return XLATE(p, DSP_MEM_2420_PHYS, DSP_MEM_2420_VIRT); | ||
77 | if (BETWEEN(p, DSP_IPI_2420_PHYS, DSP_IPI_2420_SIZE)) | ||
78 | return XLATE(p, DSP_IPI_2420_PHYS, DSP_IPI_2420_SIZE); | ||
79 | if (BETWEEN(p, DSP_MMU_2420_PHYS, DSP_MMU_2420_SIZE)) | ||
80 | return XLATE(p, DSP_MMU_2420_PHYS, DSP_MMU_2420_VIRT); | ||
81 | } | ||
82 | if (cpu_is_omap2430()) { | ||
83 | if (BETWEEN(p, L4_WK_243X_PHYS, L4_WK_243X_SIZE)) | ||
84 | return XLATE(p, L4_WK_243X_PHYS, L4_WK_243X_VIRT); | ||
85 | if (BETWEEN(p, OMAP243X_GPMC_PHYS, OMAP243X_GPMC_SIZE)) | ||
86 | return XLATE(p, OMAP243X_GPMC_PHYS, OMAP243X_GPMC_VIRT); | ||
87 | if (BETWEEN(p, OMAP243X_SDRC_PHYS, OMAP243X_SDRC_SIZE)) | ||
88 | return XLATE(p, OMAP243X_SDRC_PHYS, OMAP243X_SDRC_VIRT); | ||
89 | if (BETWEEN(p, OMAP243X_SMS_PHYS, OMAP243X_SMS_SIZE)) | ||
90 | return XLATE(p, OMAP243X_SMS_PHYS, OMAP243X_SMS_VIRT); | ||
91 | } | ||
92 | #endif | ||
93 | #ifdef CONFIG_ARCH_OMAP3 | ||
94 | if (cpu_is_ti816x()) { | ||
95 | if (BETWEEN(p, L4_34XX_PHYS, L4_34XX_SIZE)) | ||
96 | return XLATE(p, L4_34XX_PHYS, L4_34XX_VIRT); | ||
97 | } else if (cpu_is_omap34xx()) { | ||
98 | if (BETWEEN(p, L3_34XX_PHYS, L3_34XX_SIZE)) | ||
99 | return XLATE(p, L3_34XX_PHYS, L3_34XX_VIRT); | ||
100 | if (BETWEEN(p, L4_34XX_PHYS, L4_34XX_SIZE)) | ||
101 | return XLATE(p, L4_34XX_PHYS, L4_34XX_VIRT); | ||
102 | if (BETWEEN(p, OMAP34XX_GPMC_PHYS, OMAP34XX_GPMC_SIZE)) | ||
103 | return XLATE(p, OMAP34XX_GPMC_PHYS, OMAP34XX_GPMC_VIRT); | ||
104 | if (BETWEEN(p, OMAP343X_SMS_PHYS, OMAP343X_SMS_SIZE)) | ||
105 | return XLATE(p, OMAP343X_SMS_PHYS, OMAP343X_SMS_VIRT); | ||
106 | if (BETWEEN(p, OMAP343X_SDRC_PHYS, OMAP343X_SDRC_SIZE)) | ||
107 | return XLATE(p, OMAP343X_SDRC_PHYS, OMAP343X_SDRC_VIRT); | ||
108 | if (BETWEEN(p, L4_PER_34XX_PHYS, L4_PER_34XX_SIZE)) | ||
109 | return XLATE(p, L4_PER_34XX_PHYS, L4_PER_34XX_VIRT); | ||
110 | if (BETWEEN(p, L4_EMU_34XX_PHYS, L4_EMU_34XX_SIZE)) | ||
111 | return XLATE(p, L4_EMU_34XX_PHYS, L4_EMU_34XX_VIRT); | ||
112 | } | ||
113 | #endif | ||
114 | #ifdef CONFIG_ARCH_OMAP4 | ||
115 | if (cpu_is_omap44xx()) { | ||
116 | if (BETWEEN(p, L3_44XX_PHYS, L3_44XX_SIZE)) | ||
117 | return XLATE(p, L3_44XX_PHYS, L3_44XX_VIRT); | ||
118 | if (BETWEEN(p, L4_44XX_PHYS, L4_44XX_SIZE)) | ||
119 | return XLATE(p, L4_44XX_PHYS, L4_44XX_VIRT); | ||
120 | if (BETWEEN(p, OMAP44XX_GPMC_PHYS, OMAP44XX_GPMC_SIZE)) | ||
121 | return XLATE(p, OMAP44XX_GPMC_PHYS, OMAP44XX_GPMC_VIRT); | ||
122 | if (BETWEEN(p, OMAP44XX_EMIF1_PHYS, OMAP44XX_EMIF1_SIZE)) | ||
123 | return XLATE(p, OMAP44XX_EMIF1_PHYS, \ | ||
124 | OMAP44XX_EMIF1_VIRT); | ||
125 | if (BETWEEN(p, OMAP44XX_EMIF2_PHYS, OMAP44XX_EMIF2_SIZE)) | ||
126 | return XLATE(p, OMAP44XX_EMIF2_PHYS, \ | ||
127 | OMAP44XX_EMIF2_VIRT); | ||
128 | if (BETWEEN(p, OMAP44XX_DMM_PHYS, OMAP44XX_DMM_SIZE)) | ||
129 | return XLATE(p, OMAP44XX_DMM_PHYS, OMAP44XX_DMM_VIRT); | ||
130 | if (BETWEEN(p, L4_PER_44XX_PHYS, L4_PER_44XX_SIZE)) | ||
131 | return XLATE(p, L4_PER_44XX_PHYS, L4_PER_44XX_VIRT); | ||
132 | if (BETWEEN(p, L4_EMU_44XX_PHYS, L4_EMU_44XX_SIZE)) | ||
133 | return XLATE(p, L4_EMU_44XX_PHYS, L4_EMU_44XX_VIRT); | ||
134 | } | ||
135 | #endif | ||
136 | return __arm_ioremap_caller(p, size, type, __builtin_return_address(0)); | ||
137 | } | ||
138 | EXPORT_SYMBOL(omap_ioremap); | ||
139 | |||
140 | void omap_iounmap(volatile void __iomem *addr) | ||
141 | { | ||
142 | unsigned long virt = (unsigned long)addr; | ||
143 | |||
144 | if (virt >= VMALLOC_START && virt < VMALLOC_END) | ||
145 | __iounmap(addr); | ||
146 | } | ||
147 | EXPORT_SYMBOL(omap_iounmap); | ||
148 | |||
149 | void __init omap_init_consistent_dma_size(void) | ||
150 | { | ||
151 | #ifdef CONFIG_FB_OMAP_CONSISTENT_DMA_SIZE | ||
152 | init_consistent_dma_size(CONFIG_FB_OMAP_CONSISTENT_DMA_SIZE << 20); | ||
153 | #endif | ||
154 | } | ||
155 | |||
156 | void __init omap_ioremap_init(void) | ||
157 | { | ||
158 | initialized++; | ||
159 | } | ||
diff --git a/arch/arm/plat-orion/gpio.c b/arch/arm/plat-orion/gpio.c index 41ab97ebe4c..10d16088813 100644 --- a/arch/arm/plat-orion/gpio.c +++ b/arch/arm/plat-orion/gpio.c | |||
@@ -384,12 +384,16 @@ void __init orion_gpio_init(int gpio_base, int ngpio, | |||
384 | struct orion_gpio_chip *ochip; | 384 | struct orion_gpio_chip *ochip; |
385 | struct irq_chip_generic *gc; | 385 | struct irq_chip_generic *gc; |
386 | struct irq_chip_type *ct; | 386 | struct irq_chip_type *ct; |
387 | char gc_label[16]; | ||
387 | 388 | ||
388 | if (orion_gpio_chip_count == ARRAY_SIZE(orion_gpio_chips)) | 389 | if (orion_gpio_chip_count == ARRAY_SIZE(orion_gpio_chips)) |
389 | return; | 390 | return; |
390 | 391 | ||
392 | snprintf(gc_label, sizeof(gc_label), "orion_gpio%d", | ||
393 | orion_gpio_chip_count); | ||
394 | |||
391 | ochip = orion_gpio_chips + orion_gpio_chip_count; | 395 | ochip = orion_gpio_chips + orion_gpio_chip_count; |
392 | ochip->chip.label = "orion_gpio"; | 396 | ochip->chip.label = kstrdup(gc_label, GFP_KERNEL); |
393 | ochip->chip.request = orion_gpio_request; | 397 | ochip->chip.request = orion_gpio_request; |
394 | ochip->chip.direction_input = orion_gpio_direction_input; | 398 | ochip->chip.direction_input = orion_gpio_direction_input; |
395 | ochip->chip.get = orion_gpio_get; | 399 | ochip->chip.get = orion_gpio_get; |
diff --git a/arch/arm/plat-orion/time.c b/arch/arm/plat-orion/time.c index 69a61367e4b..1ed8d1397fc 100644 --- a/arch/arm/plat-orion/time.c +++ b/arch/arm/plat-orion/time.c | |||
@@ -12,7 +12,6 @@ | |||
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
15 | #include <linux/sched.h> | ||
16 | #include <linux/timer.h> | 15 | #include <linux/timer.h> |
17 | #include <linux/clockchips.h> | 16 | #include <linux/clockchips.h> |
18 | #include <linux/interrupt.h> | 17 | #include <linux/interrupt.h> |
@@ -60,24 +59,10 @@ static u32 ticks_per_jiffy; | |||
60 | * Orion's sched_clock implementation. It has a resolution of | 59 | * Orion's sched_clock implementation. It has a resolution of |
61 | * at least 7.5ns (133MHz TCLK). | 60 | * at least 7.5ns (133MHz TCLK). |
62 | */ | 61 | */ |
63 | static DEFINE_CLOCK_DATA(cd); | ||
64 | 62 | ||
65 | unsigned long long notrace sched_clock(void) | 63 | static u32 notrace orion_read_sched_clock(void) |
66 | { | 64 | { |
67 | u32 cyc = ~readl(timer_base + TIMER0_VAL_OFF); | 65 | return ~readl(timer_base + TIMER0_VAL_OFF); |
68 | return cyc_to_sched_clock(&cd, cyc, (u32)~0); | ||
69 | } | ||
70 | |||
71 | |||
72 | static void notrace orion_update_sched_clock(void) | ||
73 | { | ||
74 | u32 cyc = ~readl(timer_base + TIMER0_VAL_OFF); | ||
75 | update_sched_clock(&cd, cyc, (u32)~0); | ||
76 | } | ||
77 | |||
78 | static void __init setup_sched_clock(unsigned long tclk) | ||
79 | { | ||
80 | init_sched_clock(&cd, orion_update_sched_clock, 32, tclk); | ||
81 | } | 66 | } |
82 | 67 | ||
83 | /* | 68 | /* |
@@ -217,7 +202,7 @@ orion_time_init(u32 _bridge_base, u32 _bridge_timer1_clr_mask, | |||
217 | /* | 202 | /* |
218 | * Set scale and timer for sched_clock. | 203 | * Set scale and timer for sched_clock. |
219 | */ | 204 | */ |
220 | setup_sched_clock(tclk); | 205 | setup_sched_clock(orion_read_sched_clock, 32, tclk); |
221 | 206 | ||
222 | /* | 207 | /* |
223 | * Setup free-running clocksource timer (interrupts | 208 | * Setup free-running clocksource timer (interrupts |
diff --git a/arch/arm/plat-s5p/Kconfig b/arch/arm/plat-s5p/Kconfig index 9b9968fa869..8167ce66188 100644 --- a/arch/arm/plat-s5p/Kconfig +++ b/arch/arm/plat-s5p/Kconfig | |||
@@ -11,6 +11,7 @@ config PLAT_S5P | |||
11 | default y | 11 | default y |
12 | select ARM_VIC if !ARCH_EXYNOS4 | 12 | select ARM_VIC if !ARCH_EXYNOS4 |
13 | select ARM_GIC if ARCH_EXYNOS4 | 13 | select ARM_GIC if ARCH_EXYNOS4 |
14 | select GIC_NON_BANKED if ARCH_EXYNOS4 | ||
14 | select NO_IOPORT | 15 | select NO_IOPORT |
15 | select ARCH_REQUIRE_GPIOLIB | 16 | select ARCH_REQUIRE_GPIOLIB |
16 | select S3C_GPIO_TRACK | 17 | select S3C_GPIO_TRACK |
diff --git a/arch/arm/plat-s5p/s5p-time.c b/arch/arm/plat-s5p/s5p-time.c index c833e7b5759..17c0a2c58df 100644 --- a/arch/arm/plat-s5p/s5p-time.c +++ b/arch/arm/plat-s5p/s5p-time.c | |||
@@ -10,7 +10,6 @@ | |||
10 | * published by the Free Software Foundation. | 10 | * published by the Free Software Foundation. |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <linux/sched.h> | ||
14 | #include <linux/interrupt.h> | 13 | #include <linux/interrupt.h> |
15 | #include <linux/irq.h> | 14 | #include <linux/irq.h> |
16 | #include <linux/err.h> | 15 | #include <linux/err.h> |
@@ -321,26 +320,14 @@ static void __iomem *s5p_timer_reg(void) | |||
321 | * this wraps around for now, since it is just a relative time | 320 | * this wraps around for now, since it is just a relative time |
322 | * stamp. (Inspired by U300 implementation.) | 321 | * stamp. (Inspired by U300 implementation.) |
323 | */ | 322 | */ |
324 | static DEFINE_CLOCK_DATA(cd); | 323 | static u32 notrace s5p_read_sched_clock(void) |
325 | |||
326 | unsigned long long notrace sched_clock(void) | ||
327 | { | 324 | { |
328 | void __iomem *reg = s5p_timer_reg(); | 325 | void __iomem *reg = s5p_timer_reg(); |
329 | 326 | ||
330 | if (!reg) | 327 | if (!reg) |
331 | return 0; | 328 | return 0; |
332 | 329 | ||
333 | return cyc_to_sched_clock(&cd, ~__raw_readl(reg), (u32)~0); | 330 | return ~__raw_readl(reg); |
334 | } | ||
335 | |||
336 | static void notrace s5p_update_sched_clock(void) | ||
337 | { | ||
338 | void __iomem *reg = s5p_timer_reg(); | ||
339 | |||
340 | if (!reg) | ||
341 | return; | ||
342 | |||
343 | update_sched_clock(&cd, ~__raw_readl(reg), (u32)~0); | ||
344 | } | 331 | } |
345 | 332 | ||
346 | static void __init s5p_clocksource_init(void) | 333 | static void __init s5p_clocksource_init(void) |
@@ -358,7 +345,7 @@ static void __init s5p_clocksource_init(void) | |||
358 | s5p_time_setup(timer_source.source_id, TCNT_MAX); | 345 | s5p_time_setup(timer_source.source_id, TCNT_MAX); |
359 | s5p_time_start(timer_source.source_id, PERIODIC); | 346 | s5p_time_start(timer_source.source_id, PERIODIC); |
360 | 347 | ||
361 | init_sched_clock(&cd, s5p_update_sched_clock, 32, clock_rate); | 348 | setup_sched_clock(s5p_read_sched_clock, 32, clock_rate); |
362 | 349 | ||
363 | if (clocksource_mmio_init(s5p_timer_reg(), "s5p_clocksource_timer", | 350 | if (clocksource_mmio_init(s5p_timer_reg(), "s5p_clocksource_timer", |
364 | clock_rate, 250, 32, clocksource_mmio_readl_down)) | 351 | clock_rate, 250, 32, clocksource_mmio_readl_down)) |
diff --git a/arch/arm/plat-samsung/include/plat/cpu-freq-core.h b/arch/arm/plat-samsung/include/plat/cpu-freq-core.h index dac4760c0f0..95509d8eb14 100644 --- a/arch/arm/plat-samsung/include/plat/cpu-freq-core.h +++ b/arch/arm/plat-samsung/include/plat/cpu-freq-core.h | |||
@@ -202,14 +202,6 @@ extern int s3c_plltab_register(struct cpufreq_frequency_table *plls, | |||
202 | extern struct s3c_cpufreq_config *s3c_cpufreq_getconfig(void); | 202 | extern struct s3c_cpufreq_config *s3c_cpufreq_getconfig(void); |
203 | extern struct s3c_iotimings *s3c_cpufreq_getiotimings(void); | 203 | extern struct s3c_iotimings *s3c_cpufreq_getiotimings(void); |
204 | 204 | ||
205 | extern void s3c2410_iotiming_debugfs(struct seq_file *seq, | ||
206 | struct s3c_cpufreq_config *cfg, | ||
207 | union s3c_iobank *iob); | ||
208 | |||
209 | extern void s3c2412_iotiming_debugfs(struct seq_file *seq, | ||
210 | struct s3c_cpufreq_config *cfg, | ||
211 | union s3c_iobank *iob); | ||
212 | |||
213 | #ifdef CONFIG_CPU_FREQ_S3C24XX_DEBUGFS | 205 | #ifdef CONFIG_CPU_FREQ_S3C24XX_DEBUGFS |
214 | #define s3c_cpufreq_debugfs_call(x) x | 206 | #define s3c_cpufreq_debugfs_call(x) x |
215 | #else | 207 | #else |
@@ -226,6 +218,10 @@ extern void s3c2410_cpufreq_setrefresh(struct s3c_cpufreq_config *cfg); | |||
226 | extern void s3c2410_set_fvco(struct s3c_cpufreq_config *cfg); | 218 | extern void s3c2410_set_fvco(struct s3c_cpufreq_config *cfg); |
227 | 219 | ||
228 | #ifdef CONFIG_S3C2410_IOTIMING | 220 | #ifdef CONFIG_S3C2410_IOTIMING |
221 | extern void s3c2410_iotiming_debugfs(struct seq_file *seq, | ||
222 | struct s3c_cpufreq_config *cfg, | ||
223 | union s3c_iobank *iob); | ||
224 | |||
229 | extern int s3c2410_iotiming_calc(struct s3c_cpufreq_config *cfg, | 225 | extern int s3c2410_iotiming_calc(struct s3c_cpufreq_config *cfg, |
230 | struct s3c_iotimings *iot); | 226 | struct s3c_iotimings *iot); |
231 | 227 | ||
@@ -235,6 +231,7 @@ extern int s3c2410_iotiming_get(struct s3c_cpufreq_config *cfg, | |||
235 | extern void s3c2410_iotiming_set(struct s3c_cpufreq_config *cfg, | 231 | extern void s3c2410_iotiming_set(struct s3c_cpufreq_config *cfg, |
236 | struct s3c_iotimings *iot); | 232 | struct s3c_iotimings *iot); |
237 | #else | 233 | #else |
234 | #define s3c2410_iotiming_debugfs NULL | ||
238 | #define s3c2410_iotiming_calc NULL | 235 | #define s3c2410_iotiming_calc NULL |
239 | #define s3c2410_iotiming_get NULL | 236 | #define s3c2410_iotiming_get NULL |
240 | #define s3c2410_iotiming_set NULL | 237 | #define s3c2410_iotiming_set NULL |
@@ -242,8 +239,10 @@ extern void s3c2410_iotiming_set(struct s3c_cpufreq_config *cfg, | |||
242 | 239 | ||
243 | /* S3C2412 compatible routines */ | 240 | /* S3C2412 compatible routines */ |
244 | 241 | ||
245 | extern int s3c2412_iotiming_get(struct s3c_cpufreq_config *cfg, | 242 | #ifdef CONFIG_S3C2412_IOTIMING |
246 | struct s3c_iotimings *timings); | 243 | extern void s3c2412_iotiming_debugfs(struct seq_file *seq, |
244 | struct s3c_cpufreq_config *cfg, | ||
245 | union s3c_iobank *iob); | ||
247 | 246 | ||
248 | extern int s3c2412_iotiming_get(struct s3c_cpufreq_config *cfg, | 247 | extern int s3c2412_iotiming_get(struct s3c_cpufreq_config *cfg, |
249 | struct s3c_iotimings *timings); | 248 | struct s3c_iotimings *timings); |
@@ -253,6 +252,12 @@ extern int s3c2412_iotiming_calc(struct s3c_cpufreq_config *cfg, | |||
253 | 252 | ||
254 | extern void s3c2412_iotiming_set(struct s3c_cpufreq_config *cfg, | 253 | extern void s3c2412_iotiming_set(struct s3c_cpufreq_config *cfg, |
255 | struct s3c_iotimings *iot); | 254 | struct s3c_iotimings *iot); |
255 | #else | ||
256 | #define s3c2412_iotiming_debugfs NULL | ||
257 | #define s3c2412_iotiming_calc NULL | ||
258 | #define s3c2412_iotiming_get NULL | ||
259 | #define s3c2412_iotiming_set NULL | ||
260 | #endif /* CONFIG_S3C2412_IOTIMING */ | ||
256 | 261 | ||
257 | #ifdef CONFIG_CPU_FREQ_S3C24XX_DEBUG | 262 | #ifdef CONFIG_CPU_FREQ_S3C24XX_DEBUG |
258 | #define s3c_freq_dbg(x...) printk(KERN_INFO x) | 263 | #define s3c_freq_dbg(x...) printk(KERN_INFO x) |
diff --git a/arch/arm/plat-spear/include/plat/vmalloc.h b/arch/arm/plat-spear/include/plat/vmalloc.h deleted file mode 100644 index 8c8b24d0704..00000000000 --- a/arch/arm/plat-spear/include/plat/vmalloc.h +++ /dev/null | |||
@@ -1,19 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/plat-spear/include/plat/vmalloc.h | ||
3 | * | ||
4 | * Defining Vmalloc area for SPEAr platform | ||
5 | * | ||
6 | * Copyright (C) 2009 ST Microelectronics | ||
7 | * Viresh Kumar<viresh.kumar@st.com> | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | #ifndef __PLAT_VMALLOC_H | ||
15 | #define __PLAT_VMALLOC_H | ||
16 | |||
17 | #define VMALLOC_END 0xF0000000UL | ||
18 | |||
19 | #endif /* __PLAT_VMALLOC_H */ | ||
diff --git a/arch/arm/plat-versatile/sched-clock.c b/arch/arm/plat-versatile/sched-clock.c index 3d6a4c292ca..b33b74c8723 100644 --- a/arch/arm/plat-versatile/sched-clock.c +++ b/arch/arm/plat-versatile/sched-clock.c | |||
@@ -18,41 +18,24 @@ | |||
18 | * along with this program; if not, write to the Free Software | 18 | * along with this program; if not, write to the Free Software |
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
20 | */ | 20 | */ |
21 | #include <linux/kernel.h> | ||
21 | #include <linux/io.h> | 22 | #include <linux/io.h> |
22 | #include <linux/sched.h> | ||
23 | 23 | ||
24 | #include <asm/sched_clock.h> | 24 | #include <asm/sched_clock.h> |
25 | #include <plat/sched_clock.h> | 25 | #include <plat/sched_clock.h> |
26 | 26 | ||
27 | static DEFINE_CLOCK_DATA(cd); | ||
28 | static void __iomem *ctr; | 27 | static void __iomem *ctr; |
29 | 28 | ||
30 | /* | 29 | static u32 notrace versatile_read_sched_clock(void) |
31 | * Constants generated by clocks_calc_mult_shift(m, s, 24MHz, NSEC_PER_SEC, 60). | ||
32 | * This gives a resolution of about 41ns and a wrap period of about 178s. | ||
33 | */ | ||
34 | #define SC_MULT 2796202667u | ||
35 | #define SC_SHIFT 26 | ||
36 | |||
37 | unsigned long long notrace sched_clock(void) | ||
38 | { | 30 | { |
39 | if (ctr) { | 31 | if (ctr) |
40 | u32 cyc = readl(ctr); | 32 | return readl(ctr); |
41 | return cyc_to_fixed_sched_clock(&cd, cyc, (u32)~0, | ||
42 | SC_MULT, SC_SHIFT); | ||
43 | } else | ||
44 | return 0; | ||
45 | } | ||
46 | 33 | ||
47 | static void notrace versatile_update_sched_clock(void) | 34 | return 0; |
48 | { | ||
49 | u32 cyc = readl(ctr); | ||
50 | update_sched_clock(&cd, cyc, (u32)~0); | ||
51 | } | 35 | } |
52 | 36 | ||
53 | void __init versatile_sched_clock_init(void __iomem *reg, unsigned long rate) | 37 | void __init versatile_sched_clock_init(void __iomem *reg, unsigned long rate) |
54 | { | 38 | { |
55 | ctr = reg; | 39 | ctr = reg; |
56 | init_fixed_sched_clock(&cd, versatile_update_sched_clock, | 40 | setup_sched_clock(versatile_read_sched_clock, 32, rate); |
57 | 32, rate, SC_MULT, SC_SHIFT); | ||
58 | } | 41 | } |
diff --git a/arch/arm/tools/mach-types b/arch/arm/tools/mach-types index ccbe16f4722..f9c9f33f8cb 100644 --- a/arch/arm/tools/mach-types +++ b/arch/arm/tools/mach-types | |||
@@ -16,7 +16,7 @@ | |||
16 | # are merged into mainline or have been edited in the machine database | 16 | # are merged into mainline or have been edited in the machine database |
17 | # within the last 12 months. References to machine_is_NAME() do not count! | 17 | # within the last 12 months. References to machine_is_NAME() do not count! |
18 | # | 18 | # |
19 | # Last update: Sat May 7 08:48:24 2011 | 19 | # Last update: Tue Dec 6 11:07:38 2011 |
20 | # | 20 | # |
21 | # machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number | 21 | # machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number |
22 | # | 22 | # |
@@ -269,7 +269,7 @@ dns323 MACH_DNS323 DNS323 1542 | |||
269 | omap3_beagle MACH_OMAP3_BEAGLE OMAP3_BEAGLE 1546 | 269 | omap3_beagle MACH_OMAP3_BEAGLE OMAP3_BEAGLE 1546 |
270 | nokia_n810 MACH_NOKIA_N810 NOKIA_N810 1548 | 270 | nokia_n810 MACH_NOKIA_N810 NOKIA_N810 1548 |
271 | pcm038 MACH_PCM038 PCM038 1551 | 271 | pcm038 MACH_PCM038 PCM038 1551 |
272 | ts_x09 MACH_TS209 TS209 1565 | 272 | ts209 MACH_TS209 TS209 1565 |
273 | at91cap9adk MACH_AT91CAP9ADK AT91CAP9ADK 1566 | 273 | at91cap9adk MACH_AT91CAP9ADK AT91CAP9ADK 1566 |
274 | mx31moboard MACH_MX31MOBOARD MX31MOBOARD 1574 | 274 | mx31moboard MACH_MX31MOBOARD MX31MOBOARD 1574 |
275 | vision_ep9307 MACH_VISION_EP9307 VISION_EP9307 1578 | 275 | vision_ep9307 MACH_VISION_EP9307 VISION_EP9307 1578 |
@@ -321,7 +321,6 @@ lb88rc8480 MACH_LB88RC8480 LB88RC8480 1769 | |||
321 | mx25_3ds MACH_MX25_3DS MX25_3DS 1771 | 321 | mx25_3ds MACH_MX25_3DS MX25_3DS 1771 |
322 | omap3530_lv_som MACH_OMAP3530_LV_SOM OMAP3530_LV_SOM 1773 | 322 | omap3530_lv_som MACH_OMAP3530_LV_SOM OMAP3530_LV_SOM 1773 |
323 | davinci_da830_evm MACH_DAVINCI_DA830_EVM DAVINCI_DA830_EVM 1781 | 323 | davinci_da830_evm MACH_DAVINCI_DA830_EVM DAVINCI_DA830_EVM 1781 |
324 | at572d940hfek MACH_AT572D940HFEB AT572D940HFEB 1783 | ||
325 | dove_db MACH_DOVE_DB DOVE_DB 1788 | 324 | dove_db MACH_DOVE_DB DOVE_DB 1788 |
326 | overo MACH_OVERO OVERO 1798 | 325 | overo MACH_OVERO OVERO 1798 |
327 | at2440evb MACH_AT2440EVB AT2440EVB 1799 | 326 | at2440evb MACH_AT2440EVB AT2440EVB 1799 |
@@ -459,7 +458,7 @@ guruplug MACH_GURUPLUG GURUPLUG 2659 | |||
459 | spear310 MACH_SPEAR310 SPEAR310 2660 | 458 | spear310 MACH_SPEAR310 SPEAR310 2660 |
460 | spear320 MACH_SPEAR320 SPEAR320 2661 | 459 | spear320 MACH_SPEAR320 SPEAR320 2661 |
461 | aquila MACH_AQUILA AQUILA 2676 | 460 | aquila MACH_AQUILA AQUILA 2676 |
462 | sheeva_esata MACH_ESATA_SHEEVAPLUG ESATA_SHEEVAPLUG 2678 | 461 | esata_sheevaplug MACH_ESATA_SHEEVAPLUG ESATA_SHEEVAPLUG 2678 |
463 | msm7x30_surf MACH_MSM7X30_SURF MSM7X30_SURF 2679 | 462 | msm7x30_surf MACH_MSM7X30_SURF MSM7X30_SURF 2679 |
464 | ea2478devkit MACH_EA2478DEVKIT EA2478DEVKIT 2683 | 463 | ea2478devkit MACH_EA2478DEVKIT EA2478DEVKIT 2683 |
465 | terastation_wxl MACH_TERASTATION_WXL TERASTATION_WXL 2697 | 464 | terastation_wxl MACH_TERASTATION_WXL TERASTATION_WXL 2697 |
@@ -491,380 +490,53 @@ eukrea_cpuimx35sd MACH_EUKREA_CPUIMX35SD EUKREA_CPUIMX35SD 2821 | |||
491 | eukrea_cpuimx51sd MACH_EUKREA_CPUIMX51SD EUKREA_CPUIMX51SD 2822 | 490 | eukrea_cpuimx51sd MACH_EUKREA_CPUIMX51SD EUKREA_CPUIMX51SD 2822 |
492 | eukrea_cpuimx51 MACH_EUKREA_CPUIMX51 EUKREA_CPUIMX51 2823 | 491 | eukrea_cpuimx51 MACH_EUKREA_CPUIMX51 EUKREA_CPUIMX51 2823 |
493 | smdkc210 MACH_SMDKC210 SMDKC210 2838 | 492 | smdkc210 MACH_SMDKC210 SMDKC210 2838 |
494 | omap3_braillo MACH_OMAP3_BRAILLO OMAP3_BRAILLO 2839 | ||
495 | spyplug MACH_SPYPLUG SPYPLUG 2840 | ||
496 | ginger MACH_GINGER GINGER 2841 | ||
497 | tny_t3530 MACH_TNY_T3530 TNY_T3530 2842 | ||
498 | pca102 MACH_PCA102 PCA102 2843 | 493 | pca102 MACH_PCA102 PCA102 2843 |
499 | spade MACH_SPADE SPADE 2844 | ||
500 | mxc25_topaz MACH_MXC25_TOPAZ MXC25_TOPAZ 2845 | ||
501 | t5325 MACH_T5325 T5325 2846 | 494 | t5325 MACH_T5325 T5325 2846 |
502 | gw2361 MACH_GW2361 GW2361 2847 | ||
503 | elog MACH_ELOG ELOG 2848 | ||
504 | income MACH_INCOME INCOME 2849 | 495 | income MACH_INCOME INCOME 2849 |
505 | bcm589x MACH_BCM589X BCM589X 2850 | ||
506 | etna MACH_ETNA ETNA 2851 | ||
507 | hawks MACH_HAWKS HAWKS 2852 | ||
508 | meson MACH_MESON MESON 2853 | ||
509 | xsbase255 MACH_XSBASE255 XSBASE255 2854 | ||
510 | pvm2030 MACH_PVM2030 PVM2030 2855 | ||
511 | mioa502 MACH_MIOA502 MIOA502 2856 | ||
512 | vvbox_sdorig2 MACH_VVBOX_SDORIG2 VVBOX_SDORIG2 2857 | 496 | vvbox_sdorig2 MACH_VVBOX_SDORIG2 VVBOX_SDORIG2 2857 |
513 | vvbox_sdlite2 MACH_VVBOX_SDLITE2 VVBOX_SDLITE2 2858 | 497 | vvbox_sdlite2 MACH_VVBOX_SDLITE2 VVBOX_SDLITE2 2858 |
514 | vvbox_sdpro4 MACH_VVBOX_SDPRO4 VVBOX_SDPRO4 2859 | 498 | vvbox_sdpro4 MACH_VVBOX_SDPRO4 VVBOX_SDPRO4 2859 |
515 | htc_spv_m700 MACH_HTC_SPV_M700 HTC_SPV_M700 2860 | ||
516 | mx257sx MACH_MX257SX MX257SX 2861 | 499 | mx257sx MACH_MX257SX MX257SX 2861 |
517 | goni MACH_GONI GONI 2862 | 500 | goni MACH_GONI GONI 2862 |
518 | msm8x55_svlte_ffa MACH_MSM8X55_SVLTE_FFA MSM8X55_SVLTE_FFA 2863 | ||
519 | msm8x55_svlte_surf MACH_MSM8X55_SVLTE_SURF MSM8X55_SVLTE_SURF 2864 | ||
520 | quickstep MACH_QUICKSTEP QUICKSTEP 2865 | ||
521 | dmw96 MACH_DMW96 DMW96 2866 | ||
522 | hammerhead MACH_HAMMERHEAD HAMMERHEAD 2867 | ||
523 | trident MACH_TRIDENT TRIDENT 2868 | ||
524 | lightning MACH_LIGHTNING LIGHTNING 2869 | ||
525 | iconnect MACH_ICONNECT ICONNECT 2870 | ||
526 | autobot MACH_AUTOBOT AUTOBOT 2871 | ||
527 | coconut MACH_COCONUT COCONUT 2872 | ||
528 | durian MACH_DURIAN DURIAN 2873 | ||
529 | cayenne MACH_CAYENNE CAYENNE 2874 | ||
530 | fuji MACH_FUJI FUJI 2875 | ||
531 | synology_6282 MACH_SYNOLOGY_6282 SYNOLOGY_6282 2876 | ||
532 | em1sy MACH_EM1SY EM1SY 2877 | ||
533 | m502 MACH_M502 M502 2878 | ||
534 | matrix518 MACH_MATRIX518 MATRIX518 2879 | ||
535 | tiny_gurnard MACH_TINY_GURNARD TINY_GURNARD 2880 | ||
536 | spear1310 MACH_SPEAR1310 SPEAR1310 2881 | ||
537 | bv07 MACH_BV07 BV07 2882 | 501 | bv07 MACH_BV07 BV07 2882 |
538 | mxt_td61 MACH_MXT_TD61 MXT_TD61 2883 | ||
539 | openrd_ultimate MACH_OPENRD_ULTIMATE OPENRD_ULTIMATE 2884 | 502 | openrd_ultimate MACH_OPENRD_ULTIMATE OPENRD_ULTIMATE 2884 |
540 | devixp MACH_DEVIXP DEVIXP 2885 | 503 | devixp MACH_DEVIXP DEVIXP 2885 |
541 | miccpt MACH_MICCPT MICCPT 2886 | 504 | miccpt MACH_MICCPT MICCPT 2886 |
542 | mic256 MACH_MIC256 MIC256 2887 | 505 | mic256 MACH_MIC256 MIC256 2887 |
543 | as1167 MACH_AS1167 AS1167 2888 | ||
544 | omap3_ibiza MACH_OMAP3_IBIZA OMAP3_IBIZA 2889 | ||
545 | u5500 MACH_U5500 U5500 2890 | 506 | u5500 MACH_U5500 U5500 2890 |
546 | davinci_picto MACH_DAVINCI_PICTO DAVINCI_PICTO 2891 | ||
547 | mecha MACH_MECHA MECHA 2892 | ||
548 | bubba3 MACH_BUBBA3 BUBBA3 2893 | ||
549 | pupitre MACH_PUPITRE PUPITRE 2894 | ||
550 | tegra_vogue MACH_TEGRA_VOGUE TEGRA_VOGUE 2896 | ||
551 | tegra_e1165 MACH_TEGRA_E1165 TEGRA_E1165 2897 | ||
552 | simplenet MACH_SIMPLENET SIMPLENET 2898 | ||
553 | ec4350tbm MACH_EC4350TBM EC4350TBM 2899 | ||
554 | pec_tc MACH_PEC_TC PEC_TC 2900 | ||
555 | pec_hc2 MACH_PEC_HC2 PEC_HC2 2901 | ||
556 | esl_mobilis_a MACH_ESL_MOBILIS_A ESL_MOBILIS_A 2902 | ||
557 | esl_mobilis_b MACH_ESL_MOBILIS_B ESL_MOBILIS_B 2903 | ||
558 | esl_wave_a MACH_ESL_WAVE_A ESL_WAVE_A 2904 | ||
559 | esl_wave_b MACH_ESL_WAVE_B ESL_WAVE_B 2905 | ||
560 | unisense_mmm MACH_UNISENSE_MMM UNISENSE_MMM 2906 | ||
561 | blueshark MACH_BLUESHARK BLUESHARK 2907 | ||
562 | e10 MACH_E10 E10 2908 | ||
563 | app3k_robin MACH_APP3K_ROBIN APP3K_ROBIN 2909 | ||
564 | pov15hd MACH_POV15HD POV15HD 2910 | ||
565 | stella MACH_STELLA STELLA 2911 | ||
566 | linkstation_lschl MACH_LINKSTATION_LSCHL LINKSTATION_LSCHL 2913 | 507 | linkstation_lschl MACH_LINKSTATION_LSCHL LINKSTATION_LSCHL 2913 |
567 | netwalker MACH_NETWALKER NETWALKER 2914 | ||
568 | acsx106 MACH_ACSX106 ACSX106 2915 | ||
569 | atlas5_c1 MACH_ATLAS5_C1 ATLAS5_C1 2916 | ||
570 | nsb3ast MACH_NSB3AST NSB3AST 2917 | ||
571 | gnet_slc MACH_GNET_SLC GNET_SLC 2918 | ||
572 | af4000 MACH_AF4000 AF4000 2919 | ||
573 | ark9431 MACH_ARK9431 ARK9431 2920 | ||
574 | fs_s5pc100 MACH_FS_S5PC100 FS_S5PC100 2921 | ||
575 | omap3505nova8 MACH_OMAP3505NOVA8 OMAP3505NOVA8 2922 | ||
576 | omap3621_edp1 MACH_OMAP3621_EDP1 OMAP3621_EDP1 2923 | ||
577 | oratisaes MACH_ORATISAES ORATISAES 2924 | ||
578 | smdkv310 MACH_SMDKV310 SMDKV310 2925 | 508 | smdkv310 MACH_SMDKV310 SMDKV310 2925 |
579 | siemens_l0 MACH_SIEMENS_L0 SIEMENS_L0 2926 | ||
580 | ventana MACH_VENTANA VENTANA 2927 | ||
581 | wm8505_7in_netbook MACH_WM8505_7IN_NETBOOK WM8505_7IN_NETBOOK 2928 | 509 | wm8505_7in_netbook MACH_WM8505_7IN_NETBOOK WM8505_7IN_NETBOOK 2928 |
582 | ec4350sdb MACH_EC4350SDB EC4350SDB 2929 | ||
583 | mimas MACH_MIMAS MIMAS 2930 | ||
584 | titan MACH_TITAN TITAN 2931 | ||
585 | craneboard MACH_CRANEBOARD CRANEBOARD 2932 | 510 | craneboard MACH_CRANEBOARD CRANEBOARD 2932 |
586 | es2440 MACH_ES2440 ES2440 2933 | ||
587 | najay_a9263 MACH_NAJAY_A9263 NAJAY_A9263 2934 | ||
588 | htctornado MACH_HTCTORNADO HTCTORNADO 2935 | ||
589 | dimm_mx257 MACH_DIMM_MX257 DIMM_MX257 2936 | ||
590 | jigen301 MACH_JIGEN JIGEN 2937 | ||
591 | smdk6450 MACH_SMDK6450 SMDK6450 2938 | 511 | smdk6450 MACH_SMDK6450 SMDK6450 2938 |
592 | meno_qng MACH_MENO_QNG MENO_QNG 2939 | ||
593 | ns2416 MACH_NS2416 NS2416 2940 | ||
594 | rpc353 MACH_RPC353 RPC353 2941 | ||
595 | tq6410 MACH_TQ6410 TQ6410 2942 | ||
596 | sky6410 MACH_SKY6410 SKY6410 2943 | ||
597 | dynasty MACH_DYNASTY DYNASTY 2944 | ||
598 | vivo MACH_VIVO VIVO 2945 | ||
599 | bury_bl7582 MACH_BURY_BL7582 BURY_BL7582 2946 | ||
600 | bury_bps5270 MACH_BURY_BPS5270 BURY_BPS5270 2947 | ||
601 | basi MACH_BASI BASI 2948 | ||
602 | tn200 MACH_TN200 TN200 2949 | ||
603 | c2mmi MACH_C2MMI C2MMI 2950 | ||
604 | meson_6236m MACH_MESON_6236M MESON_6236M 2951 | ||
605 | meson_8626m MACH_MESON_8626M MESON_8626M 2952 | ||
606 | tube MACH_TUBE TUBE 2953 | ||
607 | messina MACH_MESSINA MESSINA 2954 | ||
608 | mx50_arm2 MACH_MX50_ARM2 MX50_ARM2 2955 | ||
609 | cetus9263 MACH_CETUS9263 CETUS9263 2956 | ||
610 | brownstone MACH_BROWNSTONE BROWNSTONE 2957 | 512 | brownstone MACH_BROWNSTONE BROWNSTONE 2957 |
611 | vmx25 MACH_VMX25 VMX25 2958 | ||
612 | vmx51 MACH_VMX51 VMX51 2959 | ||
613 | abacus MACH_ABACUS ABACUS 2960 | ||
614 | cm4745 MACH_CM4745 CM4745 2961 | ||
615 | oratislink MACH_ORATISLINK ORATISLINK 2962 | ||
616 | davinci_dm365_dvr MACH_DAVINCI_DM365_DVR DAVINCI_DM365_DVR 2963 | ||
617 | netviz MACH_NETVIZ NETVIZ 2964 | ||
618 | flexibity MACH_FLEXIBITY FLEXIBITY 2965 | 513 | flexibity MACH_FLEXIBITY FLEXIBITY 2965 |
619 | wlan_computer MACH_WLAN_COMPUTER WLAN_COMPUTER 2966 | ||
620 | lpc24xx MACH_LPC24XX LPC24XX 2967 | ||
621 | spica MACH_SPICA SPICA 2968 | ||
622 | gpsdisplay MACH_GPSDISPLAY GPSDISPLAY 2969 | ||
623 | bipnet MACH_BIPNET BIPNET 2970 | ||
624 | overo_ctu_inertial MACH_OVERO_CTU_INERTIAL OVERO_CTU_INERTIAL 2971 | ||
625 | davinci_dm355_mmm MACH_DAVINCI_DM355_MMM DAVINCI_DM355_MMM 2972 | ||
626 | pc9260_v2 MACH_PC9260_V2 PC9260_V2 2973 | ||
627 | ptx7545 MACH_PTX7545 PTX7545 2974 | ||
628 | tm_efdc MACH_TM_EFDC TM_EFDC 2975 | ||
629 | omap3_waldo1 MACH_OMAP3_WALDO1 OMAP3_WALDO1 2977 | ||
630 | flyer MACH_FLYER FLYER 2978 | ||
631 | tornado3240 MACH_TORNADO3240 TORNADO3240 2979 | ||
632 | soli_01 MACH_SOLI_01 SOLI_01 2980 | ||
633 | omapl138_europalc MACH_OMAPL138_EUROPALC OMAPL138_EUROPALC 2981 | ||
634 | helios_v1 MACH_HELIOS_V1 HELIOS_V1 2982 | ||
635 | netspace_lite_v2 MACH_NETSPACE_LITE_V2 NETSPACE_LITE_V2 2983 | ||
636 | ssc MACH_SSC SSC 2984 | ||
637 | premierwave_en MACH_PREMIERWAVE_EN PREMIERWAVE_EN 2985 | ||
638 | wasabi MACH_WASABI WASABI 2986 | ||
639 | mx50_rdp MACH_MX50_RDP MX50_RDP 2988 | 514 | mx50_rdp MACH_MX50_RDP MX50_RDP 2988 |
640 | universal_c210 MACH_UNIVERSAL_C210 UNIVERSAL_C210 2989 | 515 | universal_c210 MACH_UNIVERSAL_C210 UNIVERSAL_C210 2989 |
641 | real6410 MACH_REAL6410 REAL6410 2990 | 516 | real6410 MACH_REAL6410 REAL6410 2990 |
642 | spx_sakura MACH_SPX_SAKURA SPX_SAKURA 2991 | ||
643 | ij3k_2440 MACH_IJ3K_2440 IJ3K_2440 2992 | ||
644 | omap3_bc10 MACH_OMAP3_BC10 OMAP3_BC10 2993 | ||
645 | thebe MACH_THEBE THEBE 2994 | ||
646 | rv082 MACH_RV082 RV082 2995 | ||
647 | armlguest MACH_ARMLGUEST ARMLGUEST 2996 | ||
648 | tjinc1000 MACH_TJINC1000 TJINC1000 2997 | ||
649 | dockstar MACH_DOCKSTAR DOCKSTAR 2998 | 517 | dockstar MACH_DOCKSTAR DOCKSTAR 2998 |
650 | ax8008 MACH_AX8008 AX8008 2999 | ||
651 | gnet_sgce MACH_GNET_SGCE GNET_SGCE 3000 | ||
652 | pxwnas_500_1000 MACH_PXWNAS_500_1000 PXWNAS_500_1000 3001 | ||
653 | ea20 MACH_EA20 EA20 3002 | ||
654 | awm2 MACH_AWM2 AWM2 3003 | ||
655 | ti8148evm MACH_TI8148EVM TI8148EVM 3004 | 518 | ti8148evm MACH_TI8148EVM TI8148EVM 3004 |
656 | seaboard MACH_SEABOARD SEABOARD 3005 | 519 | seaboard MACH_SEABOARD SEABOARD 3005 |
657 | linkstation_chlv2 MACH_LINKSTATION_CHLV2 LINKSTATION_CHLV2 3006 | ||
658 | tera_pro2_rack MACH_TERA_PRO2_RACK TERA_PRO2_RACK 3007 | ||
659 | rubys MACH_RUBYS RUBYS 3008 | ||
660 | aquarius MACH_AQUARIUS AQUARIUS 3009 | ||
661 | mx53_ard MACH_MX53_ARD MX53_ARD 3010 | 520 | mx53_ard MACH_MX53_ARD MX53_ARD 3010 |
662 | mx53_smd MACH_MX53_SMD MX53_SMD 3011 | 521 | mx53_smd MACH_MX53_SMD MX53_SMD 3011 |
663 | lswxl MACH_LSWXL LSWXL 3012 | ||
664 | dove_avng_v3 MACH_DOVE_AVNG_V3 DOVE_AVNG_V3 3013 | ||
665 | sdi_ess_9263 MACH_SDI_ESS_9263 SDI_ESS_9263 3014 | ||
666 | jocpu550 MACH_JOCPU550 JOCPU550 3015 | ||
667 | msm8x60_rumi3 MACH_MSM8X60_RUMI3 MSM8X60_RUMI3 3016 | 522 | msm8x60_rumi3 MACH_MSM8X60_RUMI3 MSM8X60_RUMI3 3016 |
668 | msm8x60_ffa MACH_MSM8X60_FFA MSM8X60_FFA 3017 | 523 | msm8x60_ffa MACH_MSM8X60_FFA MSM8X60_FFA 3017 |
669 | yanomami MACH_YANOMAMI YANOMAMI 3018 | ||
670 | gta04 MACH_GTA04 GTA04 3019 | ||
671 | cm_a510 MACH_CM_A510 CM_A510 3020 | 524 | cm_a510 MACH_CM_A510 CM_A510 3020 |
672 | omap3_rfs200 MACH_OMAP3_RFS200 OMAP3_RFS200 3021 | ||
673 | kx33xx MACH_KX33XX KX33XX 3022 | ||
674 | ptx7510 MACH_PTX7510 PTX7510 3023 | ||
675 | top9000 MACH_TOP9000 TOP9000 3024 | ||
676 | teenote MACH_TEENOTE TEENOTE 3025 | ||
677 | ts3 MACH_TS3 TS3 3026 | ||
678 | a0 MACH_A0 A0 3027 | ||
679 | fsm9xxx_surf MACH_FSM9XXX_SURF FSM9XXX_SURF 3028 | ||
680 | fsm9xxx_ffa MACH_FSM9XXX_FFA FSM9XXX_FFA 3029 | ||
681 | frrhwcdma60w MACH_FRRHWCDMA60W FRRHWCDMA60W 3030 | ||
682 | remus MACH_REMUS REMUS 3031 | ||
683 | at91cap7xdk MACH_AT91CAP7XDK AT91CAP7XDK 3032 | ||
684 | at91cap7stk MACH_AT91CAP7STK AT91CAP7STK 3033 | ||
685 | kt_sbc_sam9_1 MACH_KT_SBC_SAM9_1 KT_SBC_SAM9_1 3034 | ||
686 | armada_xp_db MACH_ARMADA_XP_DB ARMADA_XP_DB 3036 | ||
687 | spdm MACH_SPDM SPDM 3037 | ||
688 | gtib MACH_GTIB GTIB 3038 | ||
689 | dgm3240 MACH_DGM3240 DGM3240 3039 | ||
690 | htcmega MACH_HTCMEGA HTCMEGA 3041 | ||
691 | tricorder MACH_TRICORDER TRICORDER 3042 | ||
692 | tx28 MACH_TX28 TX28 3043 | 525 | tx28 MACH_TX28 TX28 3043 |
693 | bstbrd MACH_BSTBRD BSTBRD 3044 | ||
694 | pwb3090 MACH_PWB3090 PWB3090 3045 | ||
695 | idea6410 MACH_IDEA6410 IDEA6410 3046 | ||
696 | qbc9263 MACH_QBC9263 QBC9263 3047 | ||
697 | borabora MACH_BORABORA BORABORA 3048 | ||
698 | valdez MACH_VALDEZ VALDEZ 3049 | ||
699 | ls9g20 MACH_LS9G20 LS9G20 3050 | ||
700 | mios_v1 MACH_MIOS_V1 MIOS_V1 3051 | ||
701 | s5pc110_crespo MACH_S5PC110_CRESPO S5PC110_CRESPO 3052 | ||
702 | controltek9g20 MACH_CONTROLTEK9G20 CONTROLTEK9G20 3053 | ||
703 | tin307 MACH_TIN307 TIN307 3054 | ||
704 | tin510 MACH_TIN510 TIN510 3055 | ||
705 | bluecheese MACH_BLUECHEESE BLUECHEESE 3057 | ||
706 | tem3x30 MACH_TEM3X30 TEM3X30 3058 | ||
707 | harvest_desoto MACH_HARVEST_DESOTO HARVEST_DESOTO 3059 | ||
708 | msm8x60_qrdc MACH_MSM8X60_QRDC MSM8X60_QRDC 3060 | ||
709 | spear900 MACH_SPEAR900 SPEAR900 3061 | ||
710 | pcontrol_g20 MACH_PCONTROL_G20 PCONTROL_G20 3062 | 526 | pcontrol_g20 MACH_PCONTROL_G20 PCONTROL_G20 3062 |
711 | rdstor MACH_RDSTOR RDSTOR 3063 | ||
712 | usdloader MACH_USDLOADER USDLOADER 3064 | ||
713 | tsoploader MACH_TSOPLOADER TSOPLOADER 3065 | ||
714 | kronos MACH_KRONOS KRONOS 3066 | ||
715 | ffcore MACH_FFCORE FFCORE 3067 | ||
716 | mone MACH_MONE MONE 3068 | ||
717 | unit2s MACH_UNIT2S UNIT2S 3069 | ||
718 | acer_a5 MACH_ACER_A5 ACER_A5 3070 | ||
719 | etherpro_isp MACH_ETHERPRO_ISP ETHERPRO_ISP 3071 | ||
720 | stretchs7000 MACH_STRETCHS7000 STRETCHS7000 3072 | ||
721 | p87_smartsim MACH_P87_SMARTSIM P87_SMARTSIM 3073 | ||
722 | tulip MACH_TULIP TULIP 3074 | ||
723 | sunflower MACH_SUNFLOWER SUNFLOWER 3075 | ||
724 | rib MACH_RIB RIB 3076 | ||
725 | clod MACH_CLOD CLOD 3077 | ||
726 | rump MACH_RUMP RUMP 3078 | ||
727 | tenderloin MACH_TENDERLOIN TENDERLOIN 3079 | ||
728 | shortloin MACH_SHORTLOIN SHORTLOIN 3080 | ||
729 | antares MACH_ANTARES ANTARES 3082 | ||
730 | wb40n MACH_WB40N WB40N 3083 | ||
731 | herring MACH_HERRING HERRING 3084 | ||
732 | naxy400 MACH_NAXY400 NAXY400 3085 | ||
733 | naxy1200 MACH_NAXY1200 NAXY1200 3086 | ||
734 | vpr200 MACH_VPR200 VPR200 3087 | 527 | vpr200 MACH_VPR200 VPR200 3087 |
735 | bug20 MACH_BUG20 BUG20 3088 | ||
736 | goflexnet MACH_GOFLEXNET GOFLEXNET 3089 | ||
737 | torbreck MACH_TORBRECK TORBRECK 3090 | 528 | torbreck MACH_TORBRECK TORBRECK 3090 |
738 | saarb_mg1 MACH_SAARB_MG1 SAARB_MG1 3091 | ||
739 | callisto MACH_CALLISTO CALLISTO 3092 | ||
740 | multhsu MACH_MULTHSU MULTHSU 3093 | ||
741 | saluda MACH_SALUDA SALUDA 3094 | ||
742 | pemp_omap3_apollo MACH_PEMP_OMAP3_APOLLO PEMP_OMAP3_APOLLO 3095 | ||
743 | vc0718 MACH_VC0718 VC0718 3096 | ||
744 | mvblx MACH_MVBLX MVBLX 3097 | ||
745 | inhand_apeiron MACH_INHAND_APEIRON INHAND_APEIRON 3098 | ||
746 | inhand_fury MACH_INHAND_FURY INHAND_FURY 3099 | ||
747 | inhand_siren MACH_INHAND_SIREN INHAND_SIREN 3100 | ||
748 | hdnvp MACH_HDNVP HDNVP 3101 | ||
749 | softwinner MACH_SOFTWINNER SOFTWINNER 3102 | ||
750 | prima2_evb MACH_PRIMA2_EVB PRIMA2_EVB 3103 | 529 | prima2_evb MACH_PRIMA2_EVB PRIMA2_EVB 3103 |
751 | nas6210 MACH_NAS6210 NAS6210 3104 | ||
752 | unisdev MACH_UNISDEV UNISDEV 3105 | ||
753 | sbca11 MACH_SBCA11 SBCA11 3106 | ||
754 | saga MACH_SAGA SAGA 3107 | ||
755 | ns_k330 MACH_NS_K330 NS_K330 3108 | ||
756 | tanna MACH_TANNA TANNA 3109 | ||
757 | imate8502 MACH_IMATE8502 IMATE8502 3110 | ||
758 | aspen MACH_ASPEN ASPEN 3111 | ||
759 | daintree_cwac MACH_DAINTREE_CWAC DAINTREE_CWAC 3112 | ||
760 | zmx25 MACH_ZMX25 ZMX25 3113 | ||
761 | maple1 MACH_MAPLE1 MAPLE1 3114 | ||
762 | qsd8x72_surf MACH_QSD8X72_SURF QSD8X72_SURF 3115 | ||
763 | qsd8x72_ffa MACH_QSD8X72_FFA QSD8X72_FFA 3116 | ||
764 | abilene MACH_ABILENE ABILENE 3117 | ||
765 | eigen_ttr MACH_EIGEN_TTR EIGEN_TTR 3118 | ||
766 | iomega_ix2_200 MACH_IOMEGA_IX2_200 IOMEGA_IX2_200 3119 | ||
767 | coretec_vcx7400 MACH_CORETEC_VCX7400 CORETEC_VCX7400 3120 | ||
768 | santiago MACH_SANTIAGO SANTIAGO 3121 | ||
769 | mx257sol MACH_MX257SOL MX257SOL 3122 | ||
770 | strasbourg MACH_STRASBOURG STRASBOURG 3123 | ||
771 | msm8x60_fluid MACH_MSM8X60_FLUID MSM8X60_FLUID 3124 | ||
772 | smartqv5 MACH_SMARTQV5 SMARTQV5 3125 | ||
773 | smartqv3 MACH_SMARTQV3 SMARTQV3 3126 | ||
774 | smartqv7 MACH_SMARTQV7 SMARTQV7 3127 | ||
775 | paz00 MACH_PAZ00 PAZ00 3128 | 530 | paz00 MACH_PAZ00 PAZ00 3128 |
776 | acmenetusfoxg20 MACH_ACMENETUSFOXG20 ACMENETUSFOXG20 3129 | 531 | acmenetusfoxg20 MACH_ACMENETUSFOXG20 ACMENETUSFOXG20 3129 |
777 | fwbd_0404 MACH_FWBD_0404 FWBD_0404 3131 | ||
778 | hdgu MACH_HDGU HDGU 3132 | ||
779 | pyramid MACH_PYRAMID PYRAMID 3133 | ||
780 | epiphan MACH_EPIPHAN EPIPHAN 3134 | ||
781 | omap_bender MACH_OMAP_BENDER OMAP_BENDER 3135 | ||
782 | gurnard MACH_GURNARD GURNARD 3136 | ||
783 | gtl_it5100 MACH_GTL_IT5100 GTL_IT5100 3137 | ||
784 | bcm2708 MACH_BCM2708 BCM2708 3138 | ||
785 | mx51_ggc MACH_MX51_GGC MX51_GGC 3139 | ||
786 | sharespace MACH_SHARESPACE SHARESPACE 3140 | ||
787 | haba_knx_explorer MACH_HABA_KNX_EXPLORER HABA_KNX_EXPLORER 3141 | ||
788 | simtec_kirkmod MACH_SIMTEC_KIRKMOD SIMTEC_KIRKMOD 3142 | ||
789 | crux MACH_CRUX CRUX 3143 | ||
790 | mx51_bravo MACH_MX51_BRAVO MX51_BRAVO 3144 | ||
791 | charon MACH_CHARON CHARON 3145 | ||
792 | picocom3 MACH_PICOCOM3 PICOCOM3 3146 | ||
793 | picocom4 MACH_PICOCOM4 PICOCOM4 3147 | ||
794 | serrano MACH_SERRANO SERRANO 3148 | ||
795 | doubleshot MACH_DOUBLESHOT DOUBLESHOT 3149 | ||
796 | evsy MACH_EVSY EVSY 3150 | ||
797 | huashan MACH_HUASHAN HUASHAN 3151 | ||
798 | lausanne MACH_LAUSANNE LAUSANNE 3152 | ||
799 | emerald MACH_EMERALD EMERALD 3153 | ||
800 | tqma35 MACH_TQMA35 TQMA35 3154 | ||
801 | marvel MACH_MARVEL MARVEL 3155 | ||
802 | manuae MACH_MANUAE MANUAE 3156 | ||
803 | chacha MACH_CHACHA CHACHA 3157 | ||
804 | lemon MACH_LEMON LEMON 3158 | ||
805 | csc MACH_CSC CSC 3159 | ||
806 | gira_knxip_router MACH_GIRA_KNXIP_ROUTER GIRA_KNXIP_ROUTER 3160 | ||
807 | t20 MACH_T20 T20 3161 | ||
808 | hdmini MACH_HDMINI HDMINI 3162 | ||
809 | sciphone_g2 MACH_SCIPHONE_G2 SCIPHONE_G2 3163 | ||
810 | express MACH_EXPRESS EXPRESS 3164 | ||
811 | express_kt MACH_EXPRESS_KT EXPRESS_KT 3165 | ||
812 | maximasp MACH_MAXIMASP MAXIMASP 3166 | ||
813 | nitrogen_imx51 MACH_NITROGEN_IMX51 NITROGEN_IMX51 3167 | ||
814 | nitrogen_imx53 MACH_NITROGEN_IMX53 NITROGEN_IMX53 3168 | ||
815 | sunfire MACH_SUNFIRE SUNFIRE 3169 | ||
816 | arowana MACH_AROWANA AROWANA 3170 | ||
817 | tegra_daytona MACH_TEGRA_DAYTONA TEGRA_DAYTONA 3171 | ||
818 | tegra_swordfish MACH_TEGRA_SWORDFISH TEGRA_SWORDFISH 3172 | ||
819 | edison MACH_EDISON EDISON 3173 | ||
820 | svp8500v1 MACH_SVP8500V1 SVP8500V1 3174 | ||
821 | svp8500v2 MACH_SVP8500V2 SVP8500V2 3175 | ||
822 | svp5500 MACH_SVP5500 SVP5500 3176 | ||
823 | b5500 MACH_B5500 B5500 3177 | ||
824 | s5500 MACH_S5500 S5500 3178 | ||
825 | icon MACH_ICON ICON 3179 | ||
826 | elephant MACH_ELEPHANT ELEPHANT 3180 | ||
827 | shooter MACH_SHOOTER SHOOTER 3182 | ||
828 | spade_lte MACH_SPADE_LTE SPADE_LTE 3183 | ||
829 | philhwani MACH_PHILHWANI PHILHWANI 3184 | ||
830 | gsncomm MACH_GSNCOMM GSNCOMM 3185 | ||
831 | strasbourg_a2 MACH_STRASBOURG_A2 STRASBOURG_A2 3186 | ||
832 | mmm MACH_MMM MMM 3187 | ||
833 | davinci_dm365_bv MACH_DAVINCI_DM365_BV DAVINCI_DM365_BV 3188 | ||
834 | ag5evm MACH_AG5EVM AG5EVM 3189 | 532 | ag5evm MACH_AG5EVM AG5EVM 3189 |
835 | sc575plc MACH_SC575PLC SC575PLC 3190 | ||
836 | sc575hmi MACH_SC575IPC SC575IPC 3191 | ||
837 | omap3_tdm3730 MACH_OMAP3_TDM3730 OMAP3_TDM3730 3192 | ||
838 | top9000_eval MACH_TOP9000_EVAL TOP9000_EVAL 3194 | ||
839 | top9000_su MACH_TOP9000_SU TOP9000_SU 3195 | ||
840 | utm300 MACH_UTM300 UTM300 3196 | ||
841 | tsunagi MACH_TSUNAGI TSUNAGI 3197 | 533 | tsunagi MACH_TSUNAGI TSUNAGI 3197 |
842 | ts75xx MACH_TS75XX TS75XX 3198 | ||
843 | ts47xx MACH_TS47XX TS47XX 3200 | ||
844 | da850_k5 MACH_DA850_K5 DA850_K5 3201 | ||
845 | ax502 MACH_AX502 AX502 3202 | ||
846 | igep0032 MACH_IGEP0032 IGEP0032 3203 | ||
847 | antero MACH_ANTERO ANTERO 3204 | ||
848 | synergy MACH_SYNERGY SYNERGY 3205 | ||
849 | ics_if_voip MACH_ICS_IF_VOIP ICS_IF_VOIP 3206 | 534 | ics_if_voip MACH_ICS_IF_VOIP ICS_IF_VOIP 3206 |
850 | wlf_cragg_6410 MACH_WLF_CRAGG_6410 WLF_CRAGG_6410 3207 | 535 | wlf_cragg_6410 MACH_WLF_CRAGG_6410 WLF_CRAGG_6410 3207 |
851 | punica MACH_PUNICA PUNICA 3208 | ||
852 | trimslice MACH_TRIMSLICE TRIMSLICE 3209 | 536 | trimslice MACH_TRIMSLICE TRIMSLICE 3209 |
853 | mx27_wmultra MACH_MX27_WMULTRA MX27_WMULTRA 3210 | ||
854 | mackerel MACH_MACKEREL MACKEREL 3211 | 537 | mackerel MACH_MACKEREL MACKEREL 3211 |
855 | fa9x27 MACH_FA9X27 FA9X27 3213 | ||
856 | ns2816tb MACH_NS2816TB NS2816TB 3214 | ||
857 | ns2816_ntpad MACH_NS2816_NTPAD NS2816_NTPAD 3215 | ||
858 | ns2816_ntnb MACH_NS2816_NTNB NS2816_NTNB 3216 | ||
859 | kaen MACH_KAEN KAEN 3217 | 538 | kaen MACH_KAEN KAEN 3217 |
860 | nv1000 MACH_NV1000 NV1000 3218 | ||
861 | nuc950ts MACH_NUC950TS NUC950TS 3219 | ||
862 | nokia_rm680 MACH_NOKIA_RM680 NOKIA_RM680 3220 | 539 | nokia_rm680 MACH_NOKIA_RM680 NOKIA_RM680 3220 |
863 | ast2200 MACH_AST2200 AST2200 3221 | ||
864 | lead MACH_LEAD LEAD 3222 | ||
865 | unino1 MACH_UNINO1 UNINO1 3223 | ||
866 | greeco MACH_GREECO GREECO 3224 | ||
867 | verdi MACH_VERDI VERDI 3225 | ||
868 | dm6446_adbox MACH_DM6446_ADBOX DM6446_ADBOX 3226 | 540 | dm6446_adbox MACH_DM6446_ADBOX DM6446_ADBOX 3226 |
869 | quad_salsa MACH_QUAD_SALSA QUAD_SALSA 3227 | 541 | quad_salsa MACH_QUAD_SALSA QUAD_SALSA 3227 |
870 | abb_gma_1_1 MACH_ABB_GMA_1_1 ABB_GMA_1_1 3228 | 542 | abb_gma_1_1 MACH_ABB_GMA_1_1 ABB_GMA_1_1 3228 |
@@ -949,13 +621,11 @@ koi MACH_KOI KOI 3312 | |||
949 | ts4800 MACH_TS4800 TS4800 3313 | 621 | ts4800 MACH_TS4800 TS4800 3313 |
950 | tqma9263 MACH_TQMA9263 TQMA9263 3314 | 622 | tqma9263 MACH_TQMA9263 TQMA9263 3314 |
951 | holiday MACH_HOLIDAY HOLIDAY 3315 | 623 | holiday MACH_HOLIDAY HOLIDAY 3315 |
952 | dma_6410 MACH_DMA6410 DMA6410 3316 | ||
953 | pcats_overlay MACH_PCATS_OVERLAY PCATS_OVERLAY 3317 | 624 | pcats_overlay MACH_PCATS_OVERLAY PCATS_OVERLAY 3317 |
954 | hwgw6410 MACH_HWGW6410 HWGW6410 3318 | 625 | hwgw6410 MACH_HWGW6410 HWGW6410 3318 |
955 | shenzhou MACH_SHENZHOU SHENZHOU 3319 | 626 | shenzhou MACH_SHENZHOU SHENZHOU 3319 |
956 | cwme9210 MACH_CWME9210 CWME9210 3320 | 627 | cwme9210 MACH_CWME9210 CWME9210 3320 |
957 | cwme9210js MACH_CWME9210JS CWME9210JS 3321 | 628 | cwme9210js MACH_CWME9210JS CWME9210JS 3321 |
958 | pgs_v1 MACH_PGS_SITARA PGS_SITARA 3322 | ||
959 | colibri_tegra2 MACH_COLIBRI_TEGRA2 COLIBRI_TEGRA2 3323 | 629 | colibri_tegra2 MACH_COLIBRI_TEGRA2 COLIBRI_TEGRA2 3323 |
960 | w21 MACH_W21 W21 3324 | 630 | w21 MACH_W21 W21 3324 |
961 | polysat1 MACH_POLYSAT1 POLYSAT1 3325 | 631 | polysat1 MACH_POLYSAT1 POLYSAT1 3325 |
@@ -1021,13 +691,11 @@ viprinet MACH_VIPRINET VIPRINET 3385 | |||
1021 | bockw MACH_BOCKW BOCKW 3386 | 691 | bockw MACH_BOCKW BOCKW 3386 |
1022 | eva2000 MACH_EVA2000 EVA2000 3387 | 692 | eva2000 MACH_EVA2000 EVA2000 3387 |
1023 | steelyard MACH_STEELYARD STEELYARD 3388 | 693 | steelyard MACH_STEELYARD STEELYARD 3388 |
1024 | sdh001 MACH_MACH_SDH001 MACH_SDH001 3390 | ||
1025 | nsslsboard MACH_NSSLSBOARD NSSLSBOARD 3392 | 694 | nsslsboard MACH_NSSLSBOARD NSSLSBOARD 3392 |
1026 | geneva_b5 MACH_GENEVA_B5 GENEVA_B5 3393 | 695 | geneva_b5 MACH_GENEVA_B5 GENEVA_B5 3393 |
1027 | spear1340 MACH_SPEAR1340 SPEAR1340 3394 | 696 | spear1340 MACH_SPEAR1340 SPEAR1340 3394 |
1028 | rexmas MACH_REXMAS REXMAS 3395 | 697 | rexmas MACH_REXMAS REXMAS 3395 |
1029 | msm8960_cdp MACH_MSM8960_CDP MSM8960_CDP 3396 | 698 | msm8960_cdp MACH_MSM8960_CDP MSM8960_CDP 3396 |
1030 | msm8960_mdp MACH_MSM8960_MDP MSM8960_MDP 3397 | ||
1031 | msm8960_fluid MACH_MSM8960_FLUID MSM8960_FLUID 3398 | 699 | msm8960_fluid MACH_MSM8960_FLUID MSM8960_FLUID 3398 |
1032 | msm8960_apq MACH_MSM8960_APQ MSM8960_APQ 3399 | 700 | msm8960_apq MACH_MSM8960_APQ MSM8960_APQ 3399 |
1033 | helios_v2 MACH_HELIOS_V2 HELIOS_V2 3400 | 701 | helios_v2 MACH_HELIOS_V2 HELIOS_V2 3400 |
@@ -1123,6 +791,381 @@ blissc MACH_BLISSC BLISSC 3491 | |||
1123 | thales_adc MACH_THALES_ADC THALES_ADC 3492 | 791 | thales_adc MACH_THALES_ADC THALES_ADC 3492 |
1124 | ubisys_p9d_evp MACH_UBISYS_P9D_EVP UBISYS_P9D_EVP 3493 | 792 | ubisys_p9d_evp MACH_UBISYS_P9D_EVP UBISYS_P9D_EVP 3493 |
1125 | atdgp318 MACH_ATDGP318 ATDGP318 3494 | 793 | atdgp318 MACH_ATDGP318 ATDGP318 3494 |
794 | dma210u MACH_DMA210U DMA210U 3495 | ||
795 | em_t3 MACH_EM_T3 EM_T3 3496 | ||
796 | htx3250 MACH_HTX3250 HTX3250 3497 | ||
797 | g50 MACH_G50 G50 3498 | ||
798 | eco5 MACH_ECO5 ECO5 3499 | ||
799 | wintergrasp MACH_WINTERGRASP WINTERGRASP 3500 | ||
800 | puro MACH_PURO PURO 3501 | ||
801 | shooter_k MACH_SHOOTER_K SHOOTER_K 3502 | ||
802 | nspire MACH_NSPIRE NSPIRE 3503 | ||
803 | mickxx MACH_MICKXX MICKXX 3504 | ||
804 | lxmb MACH_LXMB LXMB 3505 | ||
805 | adam MACH_ADAM ADAM 3507 | ||
806 | b1004 MACH_B1004 B1004 3508 | ||
807 | oboea MACH_OBOEA OBOEA 3509 | ||
808 | a1015 MACH_A1015 A1015 3510 | ||
809 | robin_vbdt30 MACH_ROBIN_VBDT30 ROBIN_VBDT30 3511 | ||
810 | tegra_enterprise MACH_TEGRA_ENTERPRISE TEGRA_ENTERPRISE 3512 | ||
811 | rfl108200_mk10 MACH_RFL108200_MK10 RFL108200_MK10 3513 | ||
812 | rfl108300_mk16 MACH_RFL108300_MK16 RFL108300_MK16 3514 | ||
813 | rover_v7 MACH_ROVER_V7 ROVER_V7 3515 | ||
814 | miphone MACH_MIPHONE MIPHONE 3516 | ||
815 | femtobts MACH_FEMTOBTS FEMTOBTS 3517 | ||
816 | monopoli MACH_MONOPOLI MONOPOLI 3518 | ||
817 | boss MACH_BOSS BOSS 3519 | ||
818 | davinci_dm368_vtam MACH_DAVINCI_DM368_VTAM DAVINCI_DM368_VTAM 3520 | ||
819 | clcon MACH_CLCON CLCON 3521 | ||
820 | nokia_rm696 MACH_NOKIA_RM696 NOKIA_RM696 3522 | ||
821 | tahiti MACH_TAHITI TAHITI 3523 | ||
822 | fighter MACH_FIGHTER FIGHTER 3524 | ||
823 | sgh_i710 MACH_SGH_I710 SGH_I710 3525 | ||
824 | integreproscb MACH_INTEGREPROSCB INTEGREPROSCB 3526 | ||
825 | monza MACH_MONZA MONZA 3527 | ||
826 | calimain MACH_CALIMAIN CALIMAIN 3528 | ||
827 | mx6q_sabreauto MACH_MX6Q_SABREAUTO MX6Q_SABREAUTO 3529 | ||
828 | gma01x MACH_GMA01X GMA01X 3530 | ||
829 | sbc51 MACH_SBC51 SBC51 3531 | ||
830 | fit MACH_FIT FIT 3532 | ||
831 | steelhead MACH_STEELHEAD STEELHEAD 3533 | ||
832 | panther MACH_PANTHER PANTHER 3534 | ||
833 | msm8960_liquid MACH_MSM8960_LIQUID MSM8960_LIQUID 3535 | ||
834 | lexikonct MACH_LEXIKONCT LEXIKONCT 3536 | ||
835 | ns2816_stb MACH_NS2816_STB NS2816_STB 3537 | ||
836 | sei_mm2_lpc3250 MACH_SEI_MM2_LPC3250 SEI_MM2_LPC3250 3538 | ||
837 | cmimx53 MACH_CMIMX53 CMIMX53 3539 | ||
838 | sandwich MACH_SANDWICH SANDWICH 3540 | ||
839 | chief MACH_CHIEF CHIEF 3541 | ||
840 | pogo_e02 MACH_POGO_E02 POGO_E02 3542 | ||
841 | mikrap_x168 MACH_MIKRAP_X168 MIKRAP_X168 3543 | ||
842 | htcmozart MACH_HTCMOZART HTCMOZART 3544 | ||
843 | htcgold MACH_HTCGOLD HTCGOLD 3545 | ||
844 | mt72xx MACH_MT72XX MT72XX 3546 | ||
845 | mx51_ivy MACH_MX51_IVY MX51_IVY 3547 | ||
846 | mx51_lvd MACH_MX51_LVD MX51_LVD 3548 | ||
847 | omap3_wiser2 MACH_OMAP3_WISER2 OMAP3_WISER2 3549 | ||
848 | dreamplug MACH_DREAMPLUG DREAMPLUG 3550 | ||
849 | cobas_c_111 MACH_COBAS_C_111 COBAS_C_111 3551 | ||
850 | cobas_u_411 MACH_COBAS_U_411 COBAS_U_411 3552 | ||
851 | hssd MACH_HSSD HSSD 3553 | ||
852 | iom35x MACH_IOM35X IOM35X 3554 | ||
853 | psom_omap MACH_PSOM_OMAP PSOM_OMAP 3555 | ||
854 | iphone_2g MACH_IPHONE_2G IPHONE_2G 3556 | ||
855 | iphone_3g MACH_IPHONE_3G IPHONE_3G 3557 | ||
856 | ipod_touch_1g MACH_IPOD_TOUCH_1G IPOD_TOUCH_1G 3558 | ||
857 | pharos_tpc MACH_PHAROS_TPC PHAROS_TPC 3559 | ||
858 | mx53_hydra MACH_MX53_HYDRA MX53_HYDRA 3560 | ||
859 | ns2816_dev_board MACH_NS2816_DEV_BOARD NS2816_DEV_BOARD 3561 | ||
860 | iphone_3gs MACH_IPHONE_3GS IPHONE_3GS 3562 | ||
861 | iphone_4 MACH_IPHONE_4 IPHONE_4 3563 | ||
862 | ipod_touch_4g MACH_IPOD_TOUCH_4G IPOD_TOUCH_4G 3564 | ||
863 | dragon_e1100 MACH_DRAGON_E1100 DRAGON_E1100 3565 | ||
864 | topside MACH_TOPSIDE TOPSIDE 3566 | ||
865 | irisiii MACH_IRISIII IRISIII 3567 | ||
866 | deto_macarm9 MACH_DETO_MACARM9 DETO_MACARM9 3568 | ||
867 | eti_d1 MACH_ETI_D1 ETI_D1 3569 | ||
868 | som3530sdk MACH_SOM3530SDK SOM3530SDK 3570 | ||
869 | oc_engine MACH_OC_ENGINE OC_ENGINE 3571 | ||
870 | apq8064_sim MACH_APQ8064_SIM APQ8064_SIM 3572 | ||
871 | alps MACH_ALPS ALPS 3575 | ||
872 | tny_t3730 MACH_TNY_T3730 TNY_T3730 3576 | ||
873 | geryon_nfe MACH_GERYON_NFE GERYON_NFE 3577 | ||
874 | ns2816_ref_board MACH_NS2816_REF_BOARD NS2816_REF_BOARD 3578 | ||
875 | silverstone MACH_SILVERSTONE SILVERSTONE 3579 | ||
876 | mtt2440 MACH_MTT2440 MTT2440 3580 | ||
877 | ynicdb MACH_YNICDB YNICDB 3581 | ||
878 | bct MACH_BCT BCT 3582 | ||
879 | tuscan MACH_TUSCAN TUSCAN 3583 | ||
880 | xbt_sam9g45 MACH_XBT_SAM9G45 XBT_SAM9G45 3584 | ||
881 | enbw_cmc MACH_ENBW_CMC ENBW_CMC 3585 | ||
882 | ch104mx257 MACH_CH104MX257 CH104MX257 3587 | ||
883 | openpri MACH_OPENPRI OPENPRI 3588 | ||
884 | am335xevm MACH_AM335XEVM AM335XEVM 3589 | ||
885 | picodmb MACH_PICODMB PICODMB 3590 | ||
886 | waluigi MACH_WALUIGI WALUIGI 3591 | ||
887 | punicag7 MACH_PUNICAG7 PUNICAG7 3592 | ||
888 | ipad_1g MACH_IPAD_1G IPAD_1G 3593 | ||
889 | appletv_2g MACH_APPLETV_2G APPLETV_2G 3594 | ||
890 | mach_ecog45 MACH_MACH_ECOG45 MACH_ECOG45 3595 | ||
891 | ait_cam_enc_4xx MACH_AIT_CAM_ENC_4XX AIT_CAM_ENC_4XX 3596 | ||
892 | runnymede MACH_RUNNYMEDE RUNNYMEDE 3597 | ||
893 | play MACH_PLAY PLAY 3598 | ||
894 | hw90260 MACH_HW90260 HW90260 3599 | ||
895 | tagh MACH_TAGH TAGH 3600 | ||
896 | filbert MACH_FILBERT FILBERT 3601 | ||
897 | getinge_netcomv3 MACH_GETINGE_NETCOMV3 GETINGE_NETCOMV3 3602 | ||
898 | cw20 MACH_CW20 CW20 3603 | ||
899 | cinema MACH_CINEMA CINEMA 3604 | ||
900 | cinema_tea MACH_CINEMA_TEA CINEMA_TEA 3605 | ||
901 | cinema_coffee MACH_CINEMA_COFFEE CINEMA_COFFEE 3606 | ||
902 | cinema_juice MACH_CINEMA_JUICE CINEMA_JUICE 3607 | ||
903 | mx53_mirage2 MACH_MX53_MIRAGE2 MX53_MIRAGE2 3609 | ||
904 | mx53_efikasb MACH_MX53_EFIKASB MX53_EFIKASB 3610 | ||
905 | stm_b2000 MACH_STM_B2000 STM_B2000 3612 | ||
1126 | m28evk MACH_M28EVK M28EVK 3613 | 906 | m28evk MACH_M28EVK M28EVK 3613 |
907 | pda MACH_PDA PDA 3614 | ||
908 | meraki_mr58 MACH_MERAKI_MR58 MERAKI_MR58 3615 | ||
909 | kota2 MACH_KOTA2 KOTA2 3616 | ||
910 | letcool MACH_LETCOOL LETCOOL 3617 | ||
911 | mx27iat MACH_MX27IAT MX27IAT 3618 | ||
912 | apollo_td MACH_APOLLO_TD APOLLO_TD 3619 | ||
913 | arena MACH_ARENA ARENA 3620 | ||
914 | gsngateway MACH_GSNGATEWAY GSNGATEWAY 3621 | ||
915 | lf2000 MACH_LF2000 LF2000 3622 | ||
916 | bonito MACH_BONITO BONITO 3623 | ||
917 | asymptote MACH_ASYMPTOTE ASYMPTOTE 3624 | ||
918 | bst2brd MACH_BST2BRD BST2BRD 3625 | ||
919 | tx335s MACH_TX335S TX335S 3626 | ||
920 | pelco_tesla MACH_PELCO_TESLA PELCO_TESLA 3627 | ||
921 | rrhtestplat MACH_RRHTESTPLAT RRHTESTPLAT 3628 | ||
922 | vidtonic_pro MACH_VIDTONIC_PRO VIDTONIC_PRO 3629 | ||
923 | pl_apollo MACH_PL_APOLLO PL_APOLLO 3630 | ||
924 | pl_phoenix MACH_PL_PHOENIX PL_PHOENIX 3631 | ||
925 | m28cu3 MACH_M28CU3 M28CU3 3632 | ||
926 | vvbox_hd MACH_VVBOX_HD VVBOX_HD 3633 | ||
927 | coreware_sam9260_ MACH_COREWARE_SAM9260_ COREWARE_SAM9260_ 3634 | ||
928 | marmaduke MACH_MARMADUKE MARMADUKE 3635 | ||
929 | amg_xlcore_camera MACH_AMG_XLCORE_CAMERA AMG_XLCORE_CAMERA 3636 | ||
930 | omap3_egf MACH_OMAP3_EGF OMAP3_EGF 3637 | ||
1127 | smdk4212 MACH_SMDK4212 SMDK4212 3638 | 931 | smdk4212 MACH_SMDK4212 SMDK4212 3638 |
932 | dnp9200 MACH_DNP9200 DNP9200 3639 | ||
933 | tf101 MACH_TF101 TF101 3640 | ||
934 | omap3silvio MACH_OMAP3SILVIO OMAP3SILVIO 3641 | ||
935 | picasso2 MACH_PICASSO2 PICASSO2 3642 | ||
936 | vangogh2 MACH_VANGOGH2 VANGOGH2 3643 | ||
937 | olpc_xo_1_75 MACH_OLPC_XO_1_75 OLPC_XO_1_75 3644 | ||
938 | gx400 MACH_GX400 GX400 3645 | ||
939 | gs300 MACH_GS300 GS300 3646 | ||
940 | acer_a9 MACH_ACER_A9 ACER_A9 3647 | ||
941 | vivow_evm MACH_VIVOW_EVM VIVOW_EVM 3648 | ||
942 | veloce_cxq MACH_VELOCE_CXQ VELOCE_CXQ 3649 | ||
943 | veloce_cxm MACH_VELOCE_CXM VELOCE_CXM 3650 | ||
944 | p1852 MACH_P1852 P1852 3651 | ||
945 | naxy100 MACH_NAXY100 NAXY100 3652 | ||
946 | taishan MACH_TAISHAN TAISHAN 3653 | ||
947 | touchlink MACH_TOUCHLINK TOUCHLINK 3654 | ||
948 | stm32f103ze MACH_STM32F103ZE STM32F103ZE 3655 | ||
949 | mcx MACH_MCX MCX 3656 | ||
950 | stm_nmhdk_fli7610 MACH_STM_NMHDK_FLI7610 STM_NMHDK_FLI7610 3657 | ||
951 | top28x MACH_TOP28X TOP28X 3658 | ||
952 | okl4vp_microvisor MACH_OKL4VP_MICROVISOR OKL4VP_MICROVISOR 3659 | ||
953 | pop MACH_POP POP 3660 | ||
954 | layer MACH_LAYER LAYER 3661 | ||
955 | trondheim MACH_TRONDHEIM TRONDHEIM 3662 | ||
956 | eva MACH_EVA EVA 3663 | ||
957 | trust_taurus MACH_TRUST_TAURUS TRUST_TAURUS 3664 | ||
958 | ns2816_huashan MACH_NS2816_HUASHAN NS2816_HUASHAN 3665 | ||
959 | ns2816_yangcheng MACH_NS2816_YANGCHENG NS2816_YANGCHENG 3666 | ||
960 | p852 MACH_P852 P852 3667 | ||
961 | flea3 MACH_FLEA3 FLEA3 3668 | ||
962 | bowfin MACH_BOWFIN BOWFIN 3669 | ||
963 | mv88de3100 MACH_MV88DE3100 MV88DE3100 3670 | ||
964 | pia_am35x MACH_PIA_AM35X PIA_AM35X 3671 | ||
965 | cedar MACH_CEDAR CEDAR 3672 | ||
966 | picasso_e MACH_PICASSO_E PICASSO_E 3673 | ||
967 | samsung_e60 MACH_SAMSUNG_E60 SAMSUNG_E60 3674 | ||
968 | sdvr_mini MACH_SDVR_MINI SDVR_MINI 3676 | ||
969 | omap3_ij3k MACH_OMAP3_IJ3K OMAP3_IJ3K 3677 | ||
970 | modasmc1 MACH_MODASMC1 MODASMC1 3678 | ||
971 | apq8064_rumi3 MACH_APQ8064_RUMI3 APQ8064_RUMI3 3679 | ||
972 | matrix506 MACH_MATRIX506 MATRIX506 3680 | ||
973 | msm9615_mtp MACH_MSM9615_MTP MSM9615_MTP 3681 | ||
974 | dm36x_spawndc MACH_DM36X_SPAWNDC DM36X_SPAWNDC 3682 | ||
975 | sff792 MACH_SFF792 SFF792 3683 | ||
976 | am335xiaevm MACH_AM335XIAEVM AM335XIAEVM 3684 | ||
977 | g3c2440 MACH_G3C2440 G3C2440 3685 | ||
978 | tion270 MACH_TION270 TION270 3686 | ||
979 | w22q7arm02 MACH_W22Q7ARM02 W22Q7ARM02 3687 | ||
980 | omap_cat MACH_OMAP_CAT OMAP_CAT 3688 | ||
981 | at91sam9n12ek MACH_AT91SAM9N12EK AT91SAM9N12EK 3689 | ||
982 | morrison MACH_MORRISON MORRISON 3690 | ||
983 | svdu MACH_SVDU SVDU 3691 | ||
984 | lpp01 MACH_LPP01 LPP01 3692 | ||
985 | ubc283 MACH_UBC283 UBC283 3693 | ||
986 | zeppelin MACH_ZEPPELIN ZEPPELIN 3694 | ||
987 | motus MACH_MOTUS MOTUS 3695 | ||
988 | neomainboard MACH_NEOMAINBOARD NEOMAINBOARD 3696 | ||
989 | devkit3250 MACH_DEVKIT3250 DEVKIT3250 3697 | ||
990 | devkit7000 MACH_DEVKIT7000 DEVKIT7000 3698 | ||
991 | fmc_uic MACH_FMC_UIC FMC_UIC 3699 | ||
992 | fmc_dcm MACH_FMC_DCM FMC_DCM 3700 | ||
993 | batwm MACH_BATWM BATWM 3701 | ||
994 | atlas6cb MACH_ATLAS6CB ATLAS6CB 3702 | ||
995 | blue MACH_BLUE BLUE 3705 | ||
996 | colorado MACH_COLORADO COLORADO 3706 | ||
997 | popc MACH_POPC POPC 3707 | ||
998 | promwad_jade MACH_PROMWAD_JADE PROMWAD_JADE 3708 | ||
999 | amp MACH_AMP AMP 3709 | ||
1000 | gnet_amp MACH_GNET_AMP GNET_AMP 3710 | ||
1001 | toques MACH_TOQUES TOQUES 3711 | ||
1002 | dct_storm MACH_DCT_STORM DCT_STORM 3713 | ||
1003 | owl MACH_OWL OWL 3715 | ||
1004 | cogent_csb1741 MACH_COGENT_CSB1741 COGENT_CSB1741 3716 | ||
1005 | adillustra610 MACH_ADILLUSTRA610 ADILLUSTRA610 3718 | ||
1006 | ecafe_na04 MACH_ECAFE_NA04 ECAFE_NA04 3719 | ||
1007 | popct MACH_POPCT POPCT 3720 | ||
1008 | omap3_helena MACH_OMAP3_HELENA OMAP3_HELENA 3721 | ||
1009 | ach MACH_ACH ACH 3722 | ||
1010 | module_dtb MACH_MODULE_DTB MODULE_DTB 3723 | ||
1011 | oslo_elisabeth MACH_OSLO_ELISABETH OSLO_ELISABETH 3725 | ||
1012 | tt01 MACH_TT01 TT01 3726 | ||
1013 | msm8930_cdp MACH_MSM8930_CDP MSM8930_CDP 3727 | ||
1014 | msm8930_mtp MACH_MSM8930_MTP MSM8930_MTP 3728 | ||
1015 | msm8930_fluid MACH_MSM8930_FLUID MSM8930_FLUID 3729 | ||
1016 | ltu11 MACH_LTU11 LTU11 3730 | ||
1017 | am1808_spawnco MACH_AM1808_SPAWNCO AM1808_SPAWNCO 3731 | ||
1018 | flx6410 MACH_FLX6410 FLX6410 3732 | ||
1019 | mx6q_qsb MACH_MX6Q_QSB MX6Q_QSB 3733 | ||
1020 | mx53_plt424 MACH_MX53_PLT424 MX53_PLT424 3734 | ||
1021 | jasmine MACH_JASMINE JASMINE 3735 | ||
1022 | l138_owlboard_plus MACH_L138_OWLBOARD_PLUS L138_OWLBOARD_PLUS 3736 | ||
1023 | wr21 MACH_WR21 WR21 3737 | ||
1024 | peaboy MACH_PEABOY PEABOY 3739 | ||
1025 | mx28_plato MACH_MX28_PLATO MX28_PLATO 3740 | ||
1026 | kacom2 MACH_KACOM2 KACOM2 3741 | ||
1027 | slco MACH_SLCO SLCO 3742 | ||
1028 | imx51pico MACH_IMX51PICO IMX51PICO 3743 | ||
1029 | glink1 MACH_GLINK1 GLINK1 3744 | ||
1030 | diamond MACH_DIAMOND DIAMOND 3745 | ||
1031 | d9000 MACH_D9000 D9000 3746 | ||
1032 | w5300e01 MACH_W5300E01 W5300E01 3747 | ||
1033 | im6000 MACH_IM6000 IM6000 3748 | ||
1034 | mx51_fred51 MACH_MX51_FRED51 MX51_FRED51 3749 | ||
1035 | stm32f2 MACH_STM32F2 STM32F2 3750 | ||
1036 | ville MACH_VILLE VILLE 3751 | ||
1037 | ptip_murnau MACH_PTIP_MURNAU PTIP_MURNAU 3752 | ||
1038 | ptip_classic MACH_PTIP_CLASSIC PTIP_CLASSIC 3753 | ||
1039 | mx53grb MACH_MX53GRB MX53GRB 3754 | ||
1040 | gagarin MACH_GAGARIN GAGARIN 3755 | ||
1041 | nas2big MACH_NAS2BIG NAS2BIG 3757 | ||
1042 | superfemto MACH_SUPERFEMTO SUPERFEMTO 3758 | ||
1043 | teufel MACH_TEUFEL TEUFEL 3759 | ||
1044 | dinara MACH_DINARA DINARA 3760 | ||
1045 | vanquish MACH_VANQUISH VANQUISH 3761 | ||
1046 | zipabox1 MACH_ZIPABOX1 ZIPABOX1 3762 | ||
1047 | u9540 MACH_U9540 U9540 3763 | ||
1048 | jet MACH_JET JET 3764 | ||
1128 | smdk4412 MACH_SMDK4412 SMDK4412 3765 | 1049 | smdk4412 MACH_SMDK4412 SMDK4412 3765 |
1050 | elite MACH_ELITE ELITE 3766 | ||
1051 | spear320_hmi MACH_SPEAR320_HMI SPEAR320_HMI 3767 | ||
1052 | ontario MACH_ONTARIO ONTARIO 3768 | ||
1053 | mx6q_sabrelite MACH_MX6Q_SABRELITE MX6Q_SABRELITE 3769 | ||
1054 | vc200 MACH_VC200 VC200 3770 | ||
1055 | msm7625a_ffa MACH_MSM7625A_FFA MSM7625A_FFA 3771 | ||
1056 | msm7625a_surf MACH_MSM7625A_SURF MSM7625A_SURF 3772 | ||
1057 | benthossbp MACH_BENTHOSSBP BENTHOSSBP 3773 | ||
1058 | smdk5210 MACH_SMDK5210 SMDK5210 3774 | ||
1059 | empq2300 MACH_EMPQ2300 EMPQ2300 3775 | ||
1060 | minipos MACH_MINIPOS MINIPOS 3776 | ||
1061 | omap5_sevm MACH_OMAP5_SEVM OMAP5_SEVM 3777 | ||
1062 | shelter MACH_SHELTER SHELTER 3778 | ||
1063 | omap3_devkit8500 MACH_OMAP3_DEVKIT8500 OMAP3_DEVKIT8500 3779 | ||
1064 | edgetd MACH_EDGETD EDGETD 3780 | ||
1065 | copperyard MACH_COPPERYARD COPPERYARD 3781 | ||
1066 | edge MACH_EDGE EDGE 3782 | ||
1067 | edge_u MACH_EDGE_U EDGE_U 3783 | ||
1068 | edge_td MACH_EDGE_TD EDGE_TD 3784 | ||
1069 | wdss MACH_WDSS WDSS 3785 | ||
1070 | dl_pb25 MACH_DL_PB25 DL_PB25 3786 | ||
1071 | dss11 MACH_DSS11 DSS11 3787 | ||
1072 | cpa MACH_CPA CPA 3788 | ||
1073 | aptp2000 MACH_APTP2000 APTP2000 3789 | ||
1074 | marzen MACH_MARZEN MARZEN 3790 | ||
1075 | st_turbine MACH_ST_TURBINE ST_TURBINE 3791 | ||
1076 | gtl_it3300 MACH_GTL_IT3300 GTL_IT3300 3792 | ||
1077 | mx6_mule MACH_MX6_MULE MX6_MULE 3793 | ||
1078 | v7pxa_dt MACH_V7PXA_DT V7PXA_DT 3794 | ||
1079 | v7mmp_dt MACH_V7MMP_DT V7MMP_DT 3795 | ||
1080 | dragon7 MACH_DRAGON7 DRAGON7 3796 | ||
1081 | krome MACH_KROME KROME 3797 | ||
1082 | oratisdante MACH_ORATISDANTE ORATISDANTE 3798 | ||
1083 | fathom MACH_FATHOM FATHOM 3799 | ||
1084 | dns325 MACH_DNS325 DNS325 3800 | ||
1085 | sarnen MACH_SARNEN SARNEN 3801 | ||
1086 | ubisys_g1 MACH_UBISYS_G1 UBISYS_G1 3802 | ||
1087 | mx53_pf1 MACH_MX53_PF1 MX53_PF1 3803 | ||
1088 | asanti MACH_ASANTI ASANTI 3804 | ||
1089 | volta MACH_VOLTA VOLTA 3805 | ||
1090 | knight MACH_KNIGHT KNIGHT 3807 | ||
1091 | beaglebone MACH_BEAGLEBONE BEAGLEBONE 3808 | ||
1092 | becker MACH_BECKER BECKER 3809 | ||
1093 | fc360 MACH_FC360 FC360 3810 | ||
1094 | pmi2_xls MACH_PMI2_XLS PMI2_XLS 3811 | ||
1095 | taranto MACH_TARANTO TARANTO 3812 | ||
1096 | plutux MACH_PLUTUX PLUTUX 3813 | ||
1097 | ipmp_medcom MACH_IPMP_MEDCOM IPMP_MEDCOM 3814 | ||
1098 | absolut MACH_ABSOLUT ABSOLUT 3815 | ||
1099 | awpb3 MACH_AWPB3 AWPB3 3816 | ||
1100 | nfp32xx_dt MACH_NFP32XX_DT NFP32XX_DT 3817 | ||
1101 | dl_pb53 MACH_DL_PB53 DL_PB53 3818 | ||
1102 | acu_ii MACH_ACU_II ACU_II 3819 | ||
1103 | avalon MACH_AVALON AVALON 3820 | ||
1104 | sphinx MACH_SPHINX SPHINX 3821 | ||
1105 | titan_t MACH_TITAN_T TITAN_T 3822 | ||
1106 | harvest_boris MACH_HARVEST_BORIS HARVEST_BORIS 3823 | ||
1107 | mach_msm7x30_m3s MACH_MACH_MSM7X30_M3S MACH_MSM7X30_M3S 3824 | ||
1108 | smdk5250 MACH_SMDK5250 SMDK5250 3825 | ||
1109 | imxt_lite MACH_IMXT_LITE IMXT_LITE 3826 | ||
1110 | imxt_std MACH_IMXT_STD IMXT_STD 3827 | ||
1111 | imxt_log MACH_IMXT_LOG IMXT_LOG 3828 | ||
1112 | imxt_nav MACH_IMXT_NAV IMXT_NAV 3829 | ||
1113 | imxt_full MACH_IMXT_FULL IMXT_FULL 3830 | ||
1114 | ag09015 MACH_AG09015 AG09015 3831 | ||
1115 | am3517_mt_ventoux MACH_AM3517_MT_VENTOUX AM3517_MT_VENTOUX 3832 | ||
1116 | dp1arm9 MACH_DP1ARM9 DP1ARM9 3833 | ||
1117 | picasso_m MACH_PICASSO_M PICASSO_M 3834 | ||
1118 | video_gadget MACH_VIDEO_GADGET VIDEO_GADGET 3835 | ||
1119 | mtt_om3x MACH_MTT_OM3X MTT_OM3X 3836 | ||
1120 | mx6q_arm2 MACH_MX6Q_ARM2 MX6Q_ARM2 3837 | ||
1121 | picosam9g45 MACH_PICOSAM9G45 PICOSAM9G45 3838 | ||
1122 | vpm_dm365 MACH_VPM_DM365 VPM_DM365 3839 | ||
1123 | bonfire MACH_BONFIRE BONFIRE 3840 | ||
1124 | mt2p2d MACH_MT2P2D MT2P2D 3841 | ||
1125 | sigpda01 MACH_SIGPDA01 SIGPDA01 3842 | ||
1126 | cn27 MACH_CN27 CN27 3843 | ||
1127 | mx25_cwtap MACH_MX25_CWTAP MX25_CWTAP 3844 | ||
1128 | apf28 MACH_APF28 APF28 3845 | ||
1129 | pelco_maxwell MACH_PELCO_MAXWELL PELCO_MAXWELL 3846 | ||
1130 | ge_phoenix MACH_GE_PHOENIX GE_PHOENIX 3847 | ||
1131 | empc_a500 MACH_EMPC_A500 EMPC_A500 3848 | ||
1132 | ims_arm9 MACH_IMS_ARM9 IMS_ARM9 3849 | ||
1133 | mini2416 MACH_MINI2416 MINI2416 3850 | ||
1134 | mini2450 MACH_MINI2450 MINI2450 3851 | ||
1135 | mini310 MACH_MINI310 MINI310 3852 | ||
1136 | spear_hurricane MACH_SPEAR_HURRICANE SPEAR_HURRICANE 3853 | ||
1137 | mt7208 MACH_MT7208 MT7208 3854 | ||
1138 | lpc178x MACH_LPC178X LPC178X 3855 | ||
1139 | farleys MACH_FARLEYS FARLEYS 3856 | ||
1140 | efm32gg_dk3750 MACH_EFM32GG_DK3750 EFM32GG_DK3750 3857 | ||
1141 | zeus_board MACH_ZEUS_BOARD ZEUS_BOARD 3858 | ||
1142 | cc51 MACH_CC51 CC51 3859 | ||
1143 | fxi_c210 MACH_FXI_C210 FXI_C210 3860 | ||
1144 | msm8627_cdp MACH_MSM8627_CDP MSM8627_CDP 3861 | ||
1145 | msm8627_mtp MACH_MSM8627_MTP MSM8627_MTP 3862 | ||
1146 | armadillo800eva MACH_ARMADILLO800EVA ARMADILLO800EVA 3863 | ||
1147 | primou MACH_PRIMOU PRIMOU 3864 | ||
1148 | primoc MACH_PRIMOC PRIMOC 3865 | ||
1149 | primoct MACH_PRIMOCT PRIMOCT 3866 | ||
1150 | a9500 MACH_A9500 A9500 3867 | ||
1151 | pluto MACH_PLUTO PLUTO 3869 | ||
1152 | acfx100 MACH_ACFX100 ACFX100 3870 | ||
1153 | msm8625_rumi3 MACH_MSM8625_RUMI3 MSM8625_RUMI3 3871 | ||
1154 | valente MACH_VALENTE VALENTE 3872 | ||
1155 | crfs_rfeye MACH_CRFS_RFEYE CRFS_RFEYE 3873 | ||
1156 | rfeye MACH_RFEYE RFEYE 3874 | ||
1157 | phidget_sbc3 MACH_PHIDGET_SBC3 PHIDGET_SBC3 3875 | ||
1158 | tcw_mika MACH_TCW_MIKA TCW_MIKA 3876 | ||
1159 | imx28_egf MACH_IMX28_EGF IMX28_EGF 3877 | ||
1160 | valente_wx MACH_VALENTE_WX VALENTE_WX 3878 | ||
1161 | huangshans MACH_HUANGSHANS HUANGSHANS 3879 | ||
1162 | bosphorus1 MACH_BOSPHORUS1 BOSPHORUS1 3880 | ||
1163 | prima MACH_PRIMA PRIMA 3881 | ||
1164 | evita_ulk MACH_EVITA_ULK EVITA_ULK 3884 | ||
1165 | merisc600 MACH_MERISC600 MERISC600 3885 | ||
1166 | dolak MACH_DOLAK DOLAK 3886 | ||
1167 | sbc53 MACH_SBC53 SBC53 3887 | ||
1168 | elite_ulk MACH_ELITE_ULK ELITE_ULK 3888 | ||
1169 | pov2 MACH_POV2 POV2 3889 | ||
1170 | ipod_touch_2g MACH_IPOD_TOUCH_2G IPOD_TOUCH_2G 3890 | ||
1171 | da850_pqab MACH_DA850_PQAB DA850_PQAB 3891 | ||
diff --git a/arch/ia64/include/asm/cputime.h b/arch/ia64/include/asm/cputime.h index 6073b187528..5a274af31b2 100644 --- a/arch/ia64/include/asm/cputime.h +++ b/arch/ia64/include/asm/cputime.h | |||
@@ -60,6 +60,7 @@ typedef u64 cputime64_t; | |||
60 | */ | 60 | */ |
61 | #define cputime_to_usecs(__ct) ((__ct) / NSEC_PER_USEC) | 61 | #define cputime_to_usecs(__ct) ((__ct) / NSEC_PER_USEC) |
62 | #define usecs_to_cputime(__usecs) ((__usecs) * NSEC_PER_USEC) | 62 | #define usecs_to_cputime(__usecs) ((__usecs) * NSEC_PER_USEC) |
63 | #define usecs_to_cputime64(__usecs) usecs_to_cputime(__usecs) | ||
63 | 64 | ||
64 | /* | 65 | /* |
65 | * Convert cputime <-> seconds | 66 | * Convert cputime <-> seconds |
diff --git a/arch/powerpc/include/asm/cputime.h b/arch/powerpc/include/asm/cputime.h index 1cf20bdfbec..98b7c4b49c9 100644 --- a/arch/powerpc/include/asm/cputime.h +++ b/arch/powerpc/include/asm/cputime.h | |||
@@ -150,6 +150,8 @@ static inline cputime_t usecs_to_cputime(const unsigned long us) | |||
150 | return ct; | 150 | return ct; |
151 | } | 151 | } |
152 | 152 | ||
153 | #define usecs_to_cputime64(us) usecs_to_cputime(us) | ||
154 | |||
153 | /* | 155 | /* |
154 | * Convert cputime <-> seconds | 156 | * Convert cputime <-> seconds |
155 | */ | 157 | */ |
diff --git a/arch/powerpc/include/asm/kvm_book3s.h b/arch/powerpc/include/asm/kvm_book3s.h index d4df013ad77..69c7377d207 100644 --- a/arch/powerpc/include/asm/kvm_book3s.h +++ b/arch/powerpc/include/asm/kvm_book3s.h | |||
@@ -381,39 +381,6 @@ static inline bool kvmppc_critical_section(struct kvm_vcpu *vcpu) | |||
381 | } | 381 | } |
382 | #endif | 382 | #endif |
383 | 383 | ||
384 | static inline unsigned long compute_tlbie_rb(unsigned long v, unsigned long r, | ||
385 | unsigned long pte_index) | ||
386 | { | ||
387 | unsigned long rb, va_low; | ||
388 | |||
389 | rb = (v & ~0x7fUL) << 16; /* AVA field */ | ||
390 | va_low = pte_index >> 3; | ||
391 | if (v & HPTE_V_SECONDARY) | ||
392 | va_low = ~va_low; | ||
393 | /* xor vsid from AVA */ | ||
394 | if (!(v & HPTE_V_1TB_SEG)) | ||
395 | va_low ^= v >> 12; | ||
396 | else | ||
397 | va_low ^= v >> 24; | ||
398 | va_low &= 0x7ff; | ||
399 | if (v & HPTE_V_LARGE) { | ||
400 | rb |= 1; /* L field */ | ||
401 | if (cpu_has_feature(CPU_FTR_ARCH_206) && | ||
402 | (r & 0xff000)) { | ||
403 | /* non-16MB large page, must be 64k */ | ||
404 | /* (masks depend on page size) */ | ||
405 | rb |= 0x1000; /* page encoding in LP field */ | ||
406 | rb |= (va_low & 0x7f) << 16; /* 7b of VA in AVA/LP field */ | ||
407 | rb |= (va_low & 0xfe); /* AVAL field (P7 doesn't seem to care) */ | ||
408 | } | ||
409 | } else { | ||
410 | /* 4kB page */ | ||
411 | rb |= (va_low & 0x7ff) << 12; /* remaining 11b of VA */ | ||
412 | } | ||
413 | rb |= (v >> 54) & 0x300; /* B field */ | ||
414 | return rb; | ||
415 | } | ||
416 | |||
417 | /* Magic register values loaded into r3 and r4 before the 'sc' assembly | 384 | /* Magic register values loaded into r3 and r4 before the 'sc' assembly |
418 | * instruction for the OSI hypercalls */ | 385 | * instruction for the OSI hypercalls */ |
419 | #define OSI_SC_MAGIC_R3 0x113724FA | 386 | #define OSI_SC_MAGIC_R3 0x113724FA |
diff --git a/arch/powerpc/include/asm/kvm_book3s_64.h b/arch/powerpc/include/asm/kvm_book3s_64.h index e43fe42b987..d0ac94f98f9 100644 --- a/arch/powerpc/include/asm/kvm_book3s_64.h +++ b/arch/powerpc/include/asm/kvm_book3s_64.h | |||
@@ -29,4 +29,37 @@ static inline struct kvmppc_book3s_shadow_vcpu *to_svcpu(struct kvm_vcpu *vcpu) | |||
29 | 29 | ||
30 | #define SPAPR_TCE_SHIFT 12 | 30 | #define SPAPR_TCE_SHIFT 12 |
31 | 31 | ||
32 | static inline unsigned long compute_tlbie_rb(unsigned long v, unsigned long r, | ||
33 | unsigned long pte_index) | ||
34 | { | ||
35 | unsigned long rb, va_low; | ||
36 | |||
37 | rb = (v & ~0x7fUL) << 16; /* AVA field */ | ||
38 | va_low = pte_index >> 3; | ||
39 | if (v & HPTE_V_SECONDARY) | ||
40 | va_low = ~va_low; | ||
41 | /* xor vsid from AVA */ | ||
42 | if (!(v & HPTE_V_1TB_SEG)) | ||
43 | va_low ^= v >> 12; | ||
44 | else | ||
45 | va_low ^= v >> 24; | ||
46 | va_low &= 0x7ff; | ||
47 | if (v & HPTE_V_LARGE) { | ||
48 | rb |= 1; /* L field */ | ||
49 | if (cpu_has_feature(CPU_FTR_ARCH_206) && | ||
50 | (r & 0xff000)) { | ||
51 | /* non-16MB large page, must be 64k */ | ||
52 | /* (masks depend on page size) */ | ||
53 | rb |= 0x1000; /* page encoding in LP field */ | ||
54 | rb |= (va_low & 0x7f) << 16; /* 7b of VA in AVA/LP field */ | ||
55 | rb |= (va_low & 0xfe); /* AVAL field (P7 doesn't seem to care) */ | ||
56 | } | ||
57 | } else { | ||
58 | /* 4kB page */ | ||
59 | rb |= (va_low & 0x7ff) << 12; /* remaining 11b of VA */ | ||
60 | } | ||
61 | rb |= (v >> 54) & 0x300; /* B field */ | ||
62 | return rb; | ||
63 | } | ||
64 | |||
32 | #endif /* __ASM_KVM_BOOK3S_64_H__ */ | 65 | #endif /* __ASM_KVM_BOOK3S_64_H__ */ |
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c index 0cb137a9b03..336983da9e7 100644 --- a/arch/powerpc/kvm/book3s_hv.c +++ b/arch/powerpc/kvm/book3s_hv.c | |||
@@ -538,7 +538,7 @@ static void kvmppc_start_thread(struct kvm_vcpu *vcpu) | |||
538 | tpaca->kvm_hstate.napping = 0; | 538 | tpaca->kvm_hstate.napping = 0; |
539 | vcpu->cpu = vc->pcpu; | 539 | vcpu->cpu = vc->pcpu; |
540 | smp_wmb(); | 540 | smp_wmb(); |
541 | #ifdef CONFIG_PPC_ICP_NATIVE | 541 | #if defined(CONFIG_PPC_ICP_NATIVE) && defined(CONFIG_SMP) |
542 | if (vcpu->arch.ptid) { | 542 | if (vcpu->arch.ptid) { |
543 | tpaca->cpu_start = 0x80; | 543 | tpaca->cpu_start = 0x80; |
544 | wmb(); | 544 | wmb(); |
diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c index 3c791e1eb67..e2cfb9e1e20 100644 --- a/arch/powerpc/kvm/book3s_pr.c +++ b/arch/powerpc/kvm/book3s_pr.c | |||
@@ -658,10 +658,12 @@ program_interrupt: | |||
658 | ulong cmd = kvmppc_get_gpr(vcpu, 3); | 658 | ulong cmd = kvmppc_get_gpr(vcpu, 3); |
659 | int i; | 659 | int i; |
660 | 660 | ||
661 | #ifdef CONFIG_KVM_BOOK3S_64_PR | ||
661 | if (kvmppc_h_pr(vcpu, cmd) == EMULATE_DONE) { | 662 | if (kvmppc_h_pr(vcpu, cmd) == EMULATE_DONE) { |
662 | r = RESUME_GUEST; | 663 | r = RESUME_GUEST; |
663 | break; | 664 | break; |
664 | } | 665 | } |
666 | #endif | ||
665 | 667 | ||
666 | run->papr_hcall.nr = cmd; | 668 | run->papr_hcall.nr = cmd; |
667 | for (i = 0; i < 9; ++i) { | 669 | for (i = 0; i < 9; ++i) { |
diff --git a/arch/powerpc/kvm/e500.c b/arch/powerpc/kvm/e500.c index 26d20903f2b..8c0d45a6faf 100644 --- a/arch/powerpc/kvm/e500.c +++ b/arch/powerpc/kvm/e500.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/kvm_host.h> | 15 | #include <linux/kvm_host.h> |
16 | #include <linux/slab.h> | 16 | #include <linux/slab.h> |
17 | #include <linux/err.h> | 17 | #include <linux/err.h> |
18 | #include <linux/export.h> | ||
18 | 19 | ||
19 | #include <asm/reg.h> | 20 | #include <asm/reg.h> |
20 | #include <asm/cputable.h> | 21 | #include <asm/cputable.h> |
diff --git a/arch/s390/include/asm/cputime.h b/arch/s390/include/asm/cputime.h index 08143487829..b9acaaa175d 100644 --- a/arch/s390/include/asm/cputime.h +++ b/arch/s390/include/asm/cputime.h | |||
@@ -87,6 +87,8 @@ usecs_to_cputime(const unsigned int m) | |||
87 | return (cputime_t) m * 4096; | 87 | return (cputime_t) m * 4096; |
88 | } | 88 | } |
89 | 89 | ||
90 | #define usecs_to_cputime64(m) usecs_to_cputime(m) | ||
91 | |||
90 | /* | 92 | /* |
91 | * Convert cputime to milliseconds and back. | 93 | * Convert cputime to milliseconds and back. |
92 | */ | 94 | */ |
diff --git a/arch/sh/oprofile/common.c b/arch/sh/oprofile/common.c index b4c2d2b946d..e4dd5d5a111 100644 --- a/arch/sh/oprofile/common.c +++ b/arch/sh/oprofile/common.c | |||
@@ -49,7 +49,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops) | |||
49 | return oprofile_perf_init(ops); | 49 | return oprofile_perf_init(ops); |
50 | } | 50 | } |
51 | 51 | ||
52 | void __exit oprofile_arch_exit(void) | 52 | void oprofile_arch_exit(void) |
53 | { | 53 | { |
54 | oprofile_perf_exit(); | 54 | oprofile_perf_exit(); |
55 | kfree(sh_pmu_op_name); | 55 | kfree(sh_pmu_op_name); |
@@ -60,5 +60,5 @@ int __init oprofile_arch_init(struct oprofile_operations *ops) | |||
60 | ops->backtrace = sh_backtrace; | 60 | ops->backtrace = sh_backtrace; |
61 | return -ENODEV; | 61 | return -ENODEV; |
62 | } | 62 | } |
63 | void __exit oprofile_arch_exit(void) {} | 63 | void oprofile_arch_exit(void) {} |
64 | #endif /* CONFIG_HW_PERF_EVENTS */ | 64 | #endif /* CONFIG_HW_PERF_EVENTS */ |
diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c index 8d601b18bf9..121f1be4da1 100644 --- a/arch/x86/kernel/cpu/perf_event_intel.c +++ b/arch/x86/kernel/cpu/perf_event_intel.c | |||
@@ -1169,7 +1169,7 @@ again: | |||
1169 | */ | 1169 | */ |
1170 | c = &unconstrained; | 1170 | c = &unconstrained; |
1171 | } else if (intel_try_alt_er(event, orig_idx)) { | 1171 | } else if (intel_try_alt_er(event, orig_idx)) { |
1172 | raw_spin_unlock(&era->lock); | 1172 | raw_spin_unlock_irqrestore(&era->lock, flags); |
1173 | goto again; | 1173 | goto again; |
1174 | } | 1174 | } |
1175 | raw_spin_unlock_irqrestore(&era->lock, flags); | 1175 | raw_spin_unlock_irqrestore(&era->lock, flags); |
diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c index 76e3f1cd036..405f2620392 100644 --- a/arch/x86/kvm/i8254.c +++ b/arch/x86/kvm/i8254.c | |||
@@ -338,11 +338,15 @@ static enum hrtimer_restart pit_timer_fn(struct hrtimer *data) | |||
338 | return HRTIMER_NORESTART; | 338 | return HRTIMER_NORESTART; |
339 | } | 339 | } |
340 | 340 | ||
341 | static void create_pit_timer(struct kvm_kpit_state *ps, u32 val, int is_period) | 341 | static void create_pit_timer(struct kvm *kvm, u32 val, int is_period) |
342 | { | 342 | { |
343 | struct kvm_kpit_state *ps = &kvm->arch.vpit->pit_state; | ||
343 | struct kvm_timer *pt = &ps->pit_timer; | 344 | struct kvm_timer *pt = &ps->pit_timer; |
344 | s64 interval; | 345 | s64 interval; |
345 | 346 | ||
347 | if (!irqchip_in_kernel(kvm)) | ||
348 | return; | ||
349 | |||
346 | interval = muldiv64(val, NSEC_PER_SEC, KVM_PIT_FREQ); | 350 | interval = muldiv64(val, NSEC_PER_SEC, KVM_PIT_FREQ); |
347 | 351 | ||
348 | pr_debug("create pit timer, interval is %llu nsec\n", interval); | 352 | pr_debug("create pit timer, interval is %llu nsec\n", interval); |
@@ -394,13 +398,13 @@ static void pit_load_count(struct kvm *kvm, int channel, u32 val) | |||
394 | /* FIXME: enhance mode 4 precision */ | 398 | /* FIXME: enhance mode 4 precision */ |
395 | case 4: | 399 | case 4: |
396 | if (!(ps->flags & KVM_PIT_FLAGS_HPET_LEGACY)) { | 400 | if (!(ps->flags & KVM_PIT_FLAGS_HPET_LEGACY)) { |
397 | create_pit_timer(ps, val, 0); | 401 | create_pit_timer(kvm, val, 0); |
398 | } | 402 | } |
399 | break; | 403 | break; |
400 | case 2: | 404 | case 2: |
401 | case 3: | 405 | case 3: |
402 | if (!(ps->flags & KVM_PIT_FLAGS_HPET_LEGACY)){ | 406 | if (!(ps->flags & KVM_PIT_FLAGS_HPET_LEGACY)){ |
403 | create_pit_timer(ps, val, 1); | 407 | create_pit_timer(kvm, val, 1); |
404 | } | 408 | } |
405 | break; | 409 | break; |
406 | default: | 410 | default: |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index c38efd7b792..4c938da2ba0 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -602,7 +602,6 @@ static void update_cpuid(struct kvm_vcpu *vcpu) | |||
602 | { | 602 | { |
603 | struct kvm_cpuid_entry2 *best; | 603 | struct kvm_cpuid_entry2 *best; |
604 | struct kvm_lapic *apic = vcpu->arch.apic; | 604 | struct kvm_lapic *apic = vcpu->arch.apic; |
605 | u32 timer_mode_mask; | ||
606 | 605 | ||
607 | best = kvm_find_cpuid_entry(vcpu, 1, 0); | 606 | best = kvm_find_cpuid_entry(vcpu, 1, 0); |
608 | if (!best) | 607 | if (!best) |
@@ -615,15 +614,12 @@ static void update_cpuid(struct kvm_vcpu *vcpu) | |||
615 | best->ecx |= bit(X86_FEATURE_OSXSAVE); | 614 | best->ecx |= bit(X86_FEATURE_OSXSAVE); |
616 | } | 615 | } |
617 | 616 | ||
618 | if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL && | 617 | if (apic) { |
619 | best->function == 0x1) { | 618 | if (best->ecx & bit(X86_FEATURE_TSC_DEADLINE_TIMER)) |
620 | best->ecx |= bit(X86_FEATURE_TSC_DEADLINE_TIMER); | 619 | apic->lapic_timer.timer_mode_mask = 3 << 17; |
621 | timer_mode_mask = 3 << 17; | 620 | else |
622 | } else | 621 | apic->lapic_timer.timer_mode_mask = 1 << 17; |
623 | timer_mode_mask = 1 << 17; | 622 | } |
624 | |||
625 | if (apic) | ||
626 | apic->lapic_timer.timer_mode_mask = timer_mode_mask; | ||
627 | } | 623 | } |
628 | 624 | ||
629 | int kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4) | 625 | int kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4) |
@@ -2135,6 +2131,9 @@ int kvm_dev_ioctl_check_extension(long ext) | |||
2135 | case KVM_CAP_TSC_CONTROL: | 2131 | case KVM_CAP_TSC_CONTROL: |
2136 | r = kvm_has_tsc_control; | 2132 | r = kvm_has_tsc_control; |
2137 | break; | 2133 | break; |
2134 | case KVM_CAP_TSC_DEADLINE_TIMER: | ||
2135 | r = boot_cpu_has(X86_FEATURE_TSC_DEADLINE_TIMER); | ||
2136 | break; | ||
2138 | default: | 2137 | default: |
2139 | r = 0; | 2138 | r = 0; |
2140 | break; | 2139 | break; |
diff --git a/block/blk-map.c b/block/blk-map.c index 164cd005970..623e1cd4cff 100644 --- a/block/blk-map.c +++ b/block/blk-map.c | |||
@@ -311,7 +311,7 @@ int blk_rq_map_kern(struct request_queue *q, struct request *rq, void *kbuf, | |||
311 | if (IS_ERR(bio)) | 311 | if (IS_ERR(bio)) |
312 | return PTR_ERR(bio); | 312 | return PTR_ERR(bio); |
313 | 313 | ||
314 | if (rq_data_dir(rq) == WRITE) | 314 | if (!reading) |
315 | bio->bi_rw |= REQ_WRITE; | 315 | bio->bi_rw |= REQ_WRITE; |
316 | 316 | ||
317 | if (do_copy) | 317 | if (do_copy) |
diff --git a/block/blk-tag.c b/block/blk-tag.c index e74d6d13838..4af6f5cc116 100644 --- a/block/blk-tag.c +++ b/block/blk-tag.c | |||
@@ -282,18 +282,9 @@ EXPORT_SYMBOL(blk_queue_resize_tags); | |||
282 | void blk_queue_end_tag(struct request_queue *q, struct request *rq) | 282 | void blk_queue_end_tag(struct request_queue *q, struct request *rq) |
283 | { | 283 | { |
284 | struct blk_queue_tag *bqt = q->queue_tags; | 284 | struct blk_queue_tag *bqt = q->queue_tags; |
285 | int tag = rq->tag; | 285 | unsigned tag = rq->tag; /* negative tags invalid */ |
286 | 286 | ||
287 | BUG_ON(tag == -1); | 287 | BUG_ON(tag >= bqt->real_max_depth); |
288 | |||
289 | if (unlikely(tag >= bqt->max_depth)) { | ||
290 | /* | ||
291 | * This can happen after tag depth has been reduced. | ||
292 | * But tag shouldn't be larger than real_max_depth. | ||
293 | */ | ||
294 | WARN_ON(tag >= bqt->real_max_depth); | ||
295 | return; | ||
296 | } | ||
297 | 288 | ||
298 | list_del_init(&rq->queuelist); | 289 | list_del_init(&rq->queuelist); |
299 | rq->cmd_flags &= ~REQ_QUEUED; | 290 | rq->cmd_flags &= ~REQ_QUEUED; |
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 4c12869fcf7..3548705b04e 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c | |||
@@ -1655,6 +1655,8 @@ cfq_merged_requests(struct request_queue *q, struct request *rq, | |||
1655 | struct request *next) | 1655 | struct request *next) |
1656 | { | 1656 | { |
1657 | struct cfq_queue *cfqq = RQ_CFQQ(rq); | 1657 | struct cfq_queue *cfqq = RQ_CFQQ(rq); |
1658 | struct cfq_data *cfqd = q->elevator->elevator_data; | ||
1659 | |||
1658 | /* | 1660 | /* |
1659 | * reposition in fifo if next is older than rq | 1661 | * reposition in fifo if next is older than rq |
1660 | */ | 1662 | */ |
@@ -1669,6 +1671,16 @@ cfq_merged_requests(struct request_queue *q, struct request *rq, | |||
1669 | cfq_remove_request(next); | 1671 | cfq_remove_request(next); |
1670 | cfq_blkiocg_update_io_merged_stats(&(RQ_CFQG(rq))->blkg, | 1672 | cfq_blkiocg_update_io_merged_stats(&(RQ_CFQG(rq))->blkg, |
1671 | rq_data_dir(next), rq_is_sync(next)); | 1673 | rq_data_dir(next), rq_is_sync(next)); |
1674 | |||
1675 | cfqq = RQ_CFQQ(next); | ||
1676 | /* | ||
1677 | * all requests of this queue are merged to other queues, delete it | ||
1678 | * from the service tree. If it's the active_queue, | ||
1679 | * cfq_dispatch_requests() will choose to expire it or do idle | ||
1680 | */ | ||
1681 | if (cfq_cfqq_on_rr(cfqq) && RB_EMPTY_ROOT(&cfqq->sort_list) && | ||
1682 | cfqq != cfqd->active_queue) | ||
1683 | cfq_del_cfqq_rr(cfqd, cfqq); | ||
1672 | } | 1684 | } |
1673 | 1685 | ||
1674 | static int cfq_allow_merge(struct request_queue *q, struct request *rq, | 1686 | static int cfq_allow_merge(struct request_queue *q, struct request *rq, |
diff --git a/drivers/clocksource/clksrc-dbx500-prcmu.c b/drivers/clocksource/clksrc-dbx500-prcmu.c index 59feefe0e3e..fb6b6d28b60 100644 --- a/drivers/clocksource/clksrc-dbx500-prcmu.c +++ b/drivers/clocksource/clksrc-dbx500-prcmu.c | |||
@@ -58,25 +58,15 @@ static struct clocksource clocksource_dbx500_prcmu = { | |||
58 | }; | 58 | }; |
59 | 59 | ||
60 | #ifdef CONFIG_CLKSRC_DBX500_PRCMU_SCHED_CLOCK | 60 | #ifdef CONFIG_CLKSRC_DBX500_PRCMU_SCHED_CLOCK |
61 | static DEFINE_CLOCK_DATA(cd); | ||
62 | 61 | ||
63 | unsigned long long notrace sched_clock(void) | 62 | static u32 notrace dbx500_prcmu_sched_clock_read(void) |
64 | { | 63 | { |
65 | u32 cyc; | ||
66 | |||
67 | if (unlikely(!clksrc_dbx500_timer_base)) | 64 | if (unlikely(!clksrc_dbx500_timer_base)) |
68 | return 0; | 65 | return 0; |
69 | 66 | ||
70 | cyc = clksrc_dbx500_prcmu_read(&clocksource_dbx500_prcmu); | 67 | return clksrc_dbx500_prcmu_read(&clocksource_dbx500_prcmu); |
71 | |||
72 | return cyc_to_sched_clock(&cd, cyc, (u32)~0); | ||
73 | } | 68 | } |
74 | 69 | ||
75 | static void notrace clksrc_dbx500_prcmu_update_sched_clock(void) | ||
76 | { | ||
77 | u32 cyc = clksrc_dbx500_prcmu_read(&clocksource_dbx500_prcmu); | ||
78 | update_sched_clock(&cd, cyc, (u32)~0); | ||
79 | } | ||
80 | #endif | 70 | #endif |
81 | 71 | ||
82 | void __init clksrc_dbx500_prcmu_init(void __iomem *base) | 72 | void __init clksrc_dbx500_prcmu_init(void __iomem *base) |
@@ -97,7 +87,7 @@ void __init clksrc_dbx500_prcmu_init(void __iomem *base) | |||
97 | clksrc_dbx500_timer_base + PRCMU_TIMER_REF); | 87 | clksrc_dbx500_timer_base + PRCMU_TIMER_REF); |
98 | } | 88 | } |
99 | #ifdef CONFIG_CLKSRC_DBX500_PRCMU_SCHED_CLOCK | 89 | #ifdef CONFIG_CLKSRC_DBX500_PRCMU_SCHED_CLOCK |
100 | init_sched_clock(&cd, clksrc_dbx500_prcmu_update_sched_clock, | 90 | setup_sched_clock(dbx500_prcmu_sched_clock_read, |
101 | 32, RATE_32K); | 91 | 32, RATE_32K); |
102 | #endif | 92 | #endif |
103 | clocksource_calc_mult_shift(&clocksource_dbx500_prcmu, | 93 | clocksource_calc_mult_shift(&clocksource_dbx500_prcmu, |
diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig index ab8f469f5cf..5a99bb3f255 100644 --- a/drivers/dma/Kconfig +++ b/drivers/dma/Kconfig | |||
@@ -124,7 +124,7 @@ config MV_XOR | |||
124 | 124 | ||
125 | config MX3_IPU | 125 | config MX3_IPU |
126 | bool "MX3x Image Processing Unit support" | 126 | bool "MX3x Image Processing Unit support" |
127 | depends on ARCH_MX3 | 127 | depends on SOC_IMX31 ||Â SOC_IMX35 |
128 | select DMA_ENGINE | 128 | select DMA_ENGINE |
129 | default y | 129 | default y |
130 | help | 130 | help |
@@ -216,7 +216,7 @@ config PCH_DMA | |||
216 | 216 | ||
217 | config IMX_SDMA | 217 | config IMX_SDMA |
218 | tristate "i.MX SDMA support" | 218 | tristate "i.MX SDMA support" |
219 | depends on ARCH_MX25 || ARCH_MX3 || ARCH_MX5 | 219 | depends on ARCH_MX25 || SOC_IMX31 ||Â SOC_IMX35 || ARCH_MX5 |
220 | select DMA_ENGINE | 220 | select DMA_ENGINE |
221 | help | 221 | help |
222 | Support the i.MX SDMA engine. This engine is integrated into | 222 | Support the i.MX SDMA engine. This engine is integrated into |
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index c681dc149d2..b9da8900ae4 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c | |||
@@ -756,9 +756,9 @@ intel_enable_semaphores(struct drm_device *dev) | |||
756 | if (i915_semaphores >= 0) | 756 | if (i915_semaphores >= 0) |
757 | return i915_semaphores; | 757 | return i915_semaphores; |
758 | 758 | ||
759 | /* Enable semaphores on SNB when IO remapping is off */ | 759 | /* Disable semaphores on SNB */ |
760 | if (INTEL_INFO(dev)->gen == 6) | 760 | if (INTEL_INFO(dev)->gen == 6) |
761 | return !intel_iommu_enabled; | 761 | return 0; |
762 | 762 | ||
763 | return 1; | 763 | return 1; |
764 | } | 764 | } |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index d809b038ca8..daa5743ccbd 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -7922,13 +7922,11 @@ static bool intel_enable_rc6(struct drm_device *dev) | |||
7922 | return 0; | 7922 | return 0; |
7923 | 7923 | ||
7924 | /* | 7924 | /* |
7925 | * Enable rc6 on Sandybridge if DMA remapping is disabled | 7925 | * Disable rc6 on Sandybridge |
7926 | */ | 7926 | */ |
7927 | if (INTEL_INFO(dev)->gen == 6) { | 7927 | if (INTEL_INFO(dev)->gen == 6) { |
7928 | DRM_DEBUG_DRIVER("Sandybridge: intel_iommu_enabled %s -- RC6 %sabled\n", | 7928 | DRM_DEBUG_DRIVER("Sandybridge: RC6 disabled\n"); |
7929 | intel_iommu_enabled ? "true" : "false", | 7929 | return 0; |
7930 | !intel_iommu_enabled ? "en" : "dis"); | ||
7931 | return !intel_iommu_enabled; | ||
7932 | } | 7930 | } |
7933 | DRM_DEBUG_DRIVER("RC6 enabled\n"); | 7931 | DRM_DEBUG_DRIVER("RC6 enabled\n"); |
7934 | return 1; | 7932 | return 1; |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 5e00d1670aa..92c9628c572 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
@@ -3276,6 +3276,18 @@ int evergreen_init(struct radeon_device *rdev) | |||
3276 | rdev->accel_working = false; | 3276 | rdev->accel_working = false; |
3277 | } | 3277 | } |
3278 | } | 3278 | } |
3279 | |||
3280 | /* Don't start up if the MC ucode is missing on BTC parts. | ||
3281 | * The default clocks and voltages before the MC ucode | ||
3282 | * is loaded are not suffient for advanced operations. | ||
3283 | */ | ||
3284 | if (ASIC_IS_DCE5(rdev)) { | ||
3285 | if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) { | ||
3286 | DRM_ERROR("radeon: MC ucode required for NI+.\n"); | ||
3287 | return -EINVAL; | ||
3288 | } | ||
3289 | } | ||
3290 | |||
3279 | return 0; | 3291 | return 0; |
3280 | } | 3292 | } |
3281 | 3293 | ||
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c index 8aa1dbb45c6..f94b33ae221 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | |||
@@ -1093,7 +1093,6 @@ static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev, | |||
1093 | struct vmw_surface *surface = NULL; | 1093 | struct vmw_surface *surface = NULL; |
1094 | struct vmw_dma_buffer *bo = NULL; | 1094 | struct vmw_dma_buffer *bo = NULL; |
1095 | struct ttm_base_object *user_obj; | 1095 | struct ttm_base_object *user_obj; |
1096 | u64 required_size; | ||
1097 | int ret; | 1096 | int ret; |
1098 | 1097 | ||
1099 | /** | 1098 | /** |
@@ -1102,8 +1101,9 @@ static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev, | |||
1102 | * requested framebuffer. | 1101 | * requested framebuffer. |
1103 | */ | 1102 | */ |
1104 | 1103 | ||
1105 | required_size = mode_cmd->pitch * mode_cmd->height; | 1104 | if (!vmw_kms_validate_mode_vram(dev_priv, |
1106 | if (unlikely(required_size > (u64) dev_priv->vram_size)) { | 1105 | mode_cmd->pitch, |
1106 | mode_cmd->height)) { | ||
1107 | DRM_ERROR("VRAM size is too small for requested mode.\n"); | 1107 | DRM_ERROR("VRAM size is too small for requested mode.\n"); |
1108 | return ERR_PTR(-ENOMEM); | 1108 | return ERR_PTR(-ENOMEM); |
1109 | } | 1109 | } |
diff --git a/drivers/input/mouse/sentelic.c b/drivers/input/mouse/sentelic.c index c5b12d2e955..86d6f39178b 100644 --- a/drivers/input/mouse/sentelic.c +++ b/drivers/input/mouse/sentelic.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * Finger Sensing Pad PS/2 mouse driver. | 2 | * Finger Sensing Pad PS/2 mouse driver. |
3 | * | 3 | * |
4 | * Copyright (C) 2005-2007 Asia Vital Components Co., Ltd. | 4 | * Copyright (C) 2005-2007 Asia Vital Components Co., Ltd. |
5 | * Copyright (C) 2005-2010 Tai-hwa Liang, Sentelic Corporation. | 5 | * Copyright (C) 2005-2011 Tai-hwa Liang, Sentelic Corporation. |
6 | * | 6 | * |
7 | * This program is free software; you can redistribute it and/or | 7 | * This program is free software; you can redistribute it and/or |
8 | * modify it under the terms of the GNU General Public License | 8 | * modify it under the terms of the GNU General Public License |
@@ -162,7 +162,7 @@ static int fsp_reg_write(struct psmouse *psmouse, int reg_addr, int reg_val) | |||
162 | ps2_sendbyte(ps2dev, v, FSP_CMD_TIMEOUT2); | 162 | ps2_sendbyte(ps2dev, v, FSP_CMD_TIMEOUT2); |
163 | 163 | ||
164 | if (ps2_sendbyte(ps2dev, 0xf3, FSP_CMD_TIMEOUT) < 0) | 164 | if (ps2_sendbyte(ps2dev, 0xf3, FSP_CMD_TIMEOUT) < 0) |
165 | return -1; | 165 | goto out; |
166 | 166 | ||
167 | if ((v = fsp_test_invert_cmd(reg_val)) != reg_val) { | 167 | if ((v = fsp_test_invert_cmd(reg_val)) != reg_val) { |
168 | /* inversion is required */ | 168 | /* inversion is required */ |
@@ -261,7 +261,7 @@ static int fsp_page_reg_write(struct psmouse *psmouse, int reg_val) | |||
261 | ps2_sendbyte(ps2dev, 0x88, FSP_CMD_TIMEOUT2); | 261 | ps2_sendbyte(ps2dev, 0x88, FSP_CMD_TIMEOUT2); |
262 | 262 | ||
263 | if (ps2_sendbyte(ps2dev, 0xf3, FSP_CMD_TIMEOUT) < 0) | 263 | if (ps2_sendbyte(ps2dev, 0xf3, FSP_CMD_TIMEOUT) < 0) |
264 | return -1; | 264 | goto out; |
265 | 265 | ||
266 | if ((v = fsp_test_invert_cmd(reg_val)) != reg_val) { | 266 | if ((v = fsp_test_invert_cmd(reg_val)) != reg_val) { |
267 | ps2_sendbyte(ps2dev, 0x47, FSP_CMD_TIMEOUT2); | 267 | ps2_sendbyte(ps2dev, 0x47, FSP_CMD_TIMEOUT2); |
@@ -309,7 +309,7 @@ static int fsp_get_buttons(struct psmouse *psmouse, int *btn) | |||
309 | }; | 309 | }; |
310 | int val; | 310 | int val; |
311 | 311 | ||
312 | if (fsp_reg_read(psmouse, FSP_REG_TMOD_STATUS1, &val) == -1) | 312 | if (fsp_reg_read(psmouse, FSP_REG_TMOD_STATUS, &val) == -1) |
313 | return -EIO; | 313 | return -EIO; |
314 | 314 | ||
315 | *btn = buttons[(val & 0x30) >> 4]; | 315 | *btn = buttons[(val & 0x30) >> 4]; |
diff --git a/drivers/input/mouse/sentelic.h b/drivers/input/mouse/sentelic.h index ed1395ac7b8..2e4af24f8c1 100644 --- a/drivers/input/mouse/sentelic.h +++ b/drivers/input/mouse/sentelic.h | |||
@@ -2,7 +2,7 @@ | |||
2 | * Finger Sensing Pad PS/2 mouse driver. | 2 | * Finger Sensing Pad PS/2 mouse driver. |
3 | * | 3 | * |
4 | * Copyright (C) 2005-2007 Asia Vital Components Co., Ltd. | 4 | * Copyright (C) 2005-2007 Asia Vital Components Co., Ltd. |
5 | * Copyright (C) 2005-2009 Tai-hwa Liang, Sentelic Corporation. | 5 | * Copyright (C) 2005-2011 Tai-hwa Liang, Sentelic Corporation. |
6 | * | 6 | * |
7 | * This program is free software; you can redistribute it and/or | 7 | * This program is free software; you can redistribute it and/or |
8 | * modify it under the terms of the GNU General Public License | 8 | * modify it under the terms of the GNU General Public License |
@@ -33,6 +33,7 @@ | |||
33 | /* Finger-sensing Pad control registers */ | 33 | /* Finger-sensing Pad control registers */ |
34 | #define FSP_REG_SYSCTL1 0x10 | 34 | #define FSP_REG_SYSCTL1 0x10 |
35 | #define FSP_BIT_EN_REG_CLK BIT(5) | 35 | #define FSP_BIT_EN_REG_CLK BIT(5) |
36 | #define FSP_REG_TMOD_STATUS 0x20 | ||
36 | #define FSP_REG_OPC_QDOWN 0x31 | 37 | #define FSP_REG_OPC_QDOWN 0x31 |
37 | #define FSP_BIT_EN_OPC_TAG BIT(7) | 38 | #define FSP_BIT_EN_OPC_TAG BIT(7) |
38 | #define FSP_REG_OPTZ_XLO 0x34 | 39 | #define FSP_REG_OPTZ_XLO 0x34 |
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index 2fb2963df55..5b5fa5cdaa3 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c | |||
@@ -90,7 +90,7 @@ struct iommu_domain *iommu_domain_alloc(struct bus_type *bus) | |||
90 | if (bus == NULL || bus->iommu_ops == NULL) | 90 | if (bus == NULL || bus->iommu_ops == NULL) |
91 | return NULL; | 91 | return NULL; |
92 | 92 | ||
93 | domain = kmalloc(sizeof(*domain), GFP_KERNEL); | 93 | domain = kzalloc(sizeof(*domain), GFP_KERNEL); |
94 | if (!domain) | 94 | if (!domain) |
95 | return NULL; | 95 | return NULL; |
96 | 96 | ||
diff --git a/drivers/media/video/gspca/gspca.c b/drivers/media/video/gspca/gspca.c index 881e04c7ffe..2ca10dfec91 100644 --- a/drivers/media/video/gspca/gspca.c +++ b/drivers/media/video/gspca/gspca.c | |||
@@ -838,13 +838,13 @@ static int gspca_init_transfer(struct gspca_dev *gspca_dev) | |||
838 | gspca_dev->usb_err = 0; | 838 | gspca_dev->usb_err = 0; |
839 | 839 | ||
840 | /* do the specific subdriver stuff before endpoint selection */ | 840 | /* do the specific subdriver stuff before endpoint selection */ |
841 | gspca_dev->alt = 0; | 841 | intf = usb_ifnum_to_if(gspca_dev->dev, gspca_dev->iface); |
842 | gspca_dev->alt = gspca_dev->cam.bulk ? intf->num_altsetting : 0; | ||
842 | if (gspca_dev->sd_desc->isoc_init) { | 843 | if (gspca_dev->sd_desc->isoc_init) { |
843 | ret = gspca_dev->sd_desc->isoc_init(gspca_dev); | 844 | ret = gspca_dev->sd_desc->isoc_init(gspca_dev); |
844 | if (ret < 0) | 845 | if (ret < 0) |
845 | goto unlock; | 846 | goto unlock; |
846 | } | 847 | } |
847 | intf = usb_ifnum_to_if(gspca_dev->dev, gspca_dev->iface); | ||
848 | xfer = gspca_dev->cam.bulk ? USB_ENDPOINT_XFER_BULK | 848 | xfer = gspca_dev->cam.bulk ? USB_ENDPOINT_XFER_BULK |
849 | : USB_ENDPOINT_XFER_ISOC; | 849 | : USB_ENDPOINT_XFER_ISOC; |
850 | 850 | ||
@@ -957,7 +957,7 @@ retry: | |||
957 | ret = -EIO; | 957 | ret = -EIO; |
958 | goto out; | 958 | goto out; |
959 | } | 959 | } |
960 | alt = ep_tb[--alt_idx].alt; | 960 | gspca_dev->alt = ep_tb[--alt_idx].alt; |
961 | } | 961 | } |
962 | } | 962 | } |
963 | out: | 963 | out: |
diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c index 50b5f9926f6..0726e59fd41 100644 --- a/drivers/mmc/host/mmci.c +++ b/drivers/mmc/host/mmci.c | |||
@@ -675,7 +675,8 @@ mmci_data_irq(struct mmci_host *host, struct mmc_data *data, | |||
675 | unsigned int status) | 675 | unsigned int status) |
676 | { | 676 | { |
677 | /* First check for errors */ | 677 | /* First check for errors */ |
678 | if (status & (MCI_DATACRCFAIL|MCI_DATATIMEOUT|MCI_TXUNDERRUN|MCI_RXOVERRUN)) { | 678 | if (status & (MCI_DATACRCFAIL|MCI_DATATIMEOUT|MCI_STARTBITERR| |
679 | MCI_TXUNDERRUN|MCI_RXOVERRUN)) { | ||
679 | u32 remain, success; | 680 | u32 remain, success; |
680 | 681 | ||
681 | /* Terminate the DMA transfer */ | 682 | /* Terminate the DMA transfer */ |
@@ -754,8 +755,12 @@ mmci_cmd_irq(struct mmci_host *host, struct mmc_command *cmd, | |||
754 | } | 755 | } |
755 | 756 | ||
756 | if (!cmd->data || cmd->error) { | 757 | if (!cmd->data || cmd->error) { |
757 | if (host->data) | 758 | if (host->data) { |
759 | /* Terminate the DMA transfer */ | ||
760 | if (dma_inprogress(host)) | ||
761 | mmci_dma_data_error(host); | ||
758 | mmci_stop_data(host); | 762 | mmci_stop_data(host); |
763 | } | ||
759 | mmci_request_end(host, cmd->mrq); | 764 | mmci_request_end(host, cmd->mrq); |
760 | } else if (!(cmd->data->flags & MMC_DATA_READ)) { | 765 | } else if (!(cmd->data->flags & MMC_DATA_READ)) { |
761 | mmci_start_data(host, cmd->data); | 766 | mmci_start_data(host, cmd->data); |
@@ -955,8 +960,9 @@ static irqreturn_t mmci_irq(int irq, void *dev_id) | |||
955 | dev_dbg(mmc_dev(host->mmc), "irq0 (data+cmd) %08x\n", status); | 960 | dev_dbg(mmc_dev(host->mmc), "irq0 (data+cmd) %08x\n", status); |
956 | 961 | ||
957 | data = host->data; | 962 | data = host->data; |
958 | if (status & (MCI_DATACRCFAIL|MCI_DATATIMEOUT|MCI_TXUNDERRUN| | 963 | if (status & (MCI_DATACRCFAIL|MCI_DATATIMEOUT|MCI_STARTBITERR| |
959 | MCI_RXOVERRUN|MCI_DATAEND|MCI_DATABLOCKEND) && data) | 964 | MCI_TXUNDERRUN|MCI_RXOVERRUN|MCI_DATAEND| |
965 | MCI_DATABLOCKEND) && data) | ||
960 | mmci_data_irq(host, data, status); | 966 | mmci_data_irq(host, data, status); |
961 | 967 | ||
962 | cmd = host->cmd; | 968 | cmd = host->cmd; |
diff --git a/drivers/net/ethernet/marvell/skge.c b/drivers/net/ethernet/marvell/skge.c index c7b60839ac9..dea0cb4400e 100644 --- a/drivers/net/ethernet/marvell/skge.c +++ b/drivers/net/ethernet/marvell/skge.c | |||
@@ -2606,6 +2606,9 @@ static int skge_up(struct net_device *dev) | |||
2606 | spin_unlock_irq(&hw->hw_lock); | 2606 | spin_unlock_irq(&hw->hw_lock); |
2607 | 2607 | ||
2608 | napi_enable(&skge->napi); | 2608 | napi_enable(&skge->napi); |
2609 | |||
2610 | skge_set_multicast(dev); | ||
2611 | |||
2609 | return 0; | 2612 | return 0; |
2610 | 2613 | ||
2611 | free_tx_ring: | 2614 | free_tx_ring: |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_cq.c b/drivers/net/ethernet/mellanox/mlx4/en_cq.c index 227997d775e..5829e0b47e7 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_cq.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_cq.c | |||
@@ -147,6 +147,7 @@ void mlx4_en_destroy_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq) | |||
147 | mlx4_free_hwq_res(mdev->dev, &cq->wqres, cq->buf_size); | 147 | mlx4_free_hwq_res(mdev->dev, &cq->wqres, cq->buf_size); |
148 | if (priv->mdev->dev->caps.comp_pool && cq->vector) | 148 | if (priv->mdev->dev->caps.comp_pool && cq->vector) |
149 | mlx4_release_eq(priv->mdev->dev, cq->vector); | 149 | mlx4_release_eq(priv->mdev->dev, cq->vector); |
150 | cq->vector = 0; | ||
150 | cq->buf_size = 0; | 151 | cq->buf_size = 0; |
151 | cq->buf = NULL; | 152 | cq->buf = NULL; |
152 | } | 153 | } |
diff --git a/drivers/of/platform.c b/drivers/of/platform.c index cbd5d701c7e..63b3ec48c20 100644 --- a/drivers/of/platform.c +++ b/drivers/of/platform.c | |||
@@ -314,7 +314,7 @@ static const struct of_dev_auxdata *of_dev_lookup(const struct of_dev_auxdata *l | |||
314 | if (!lookup) | 314 | if (!lookup) |
315 | return NULL; | 315 | return NULL; |
316 | 316 | ||
317 | for(; lookup->name != NULL; lookup++) { | 317 | for(; lookup->compatible != NULL; lookup++) { |
318 | if (!of_device_is_compatible(np, lookup->compatible)) | 318 | if (!of_device_is_compatible(np, lookup->compatible)) |
319 | continue; | 319 | continue; |
320 | if (of_address_to_resource(np, 0, &res)) | 320 | if (of_address_to_resource(np, 0, &res)) |
diff --git a/drivers/watchdog/coh901327_wdt.c b/drivers/watchdog/coh901327_wdt.c index 03f449a430d..5b89f7d6cd0 100644 --- a/drivers/watchdog/coh901327_wdt.c +++ b/drivers/watchdog/coh901327_wdt.c | |||
@@ -76,8 +76,6 @@ static int irq; | |||
76 | static void __iomem *virtbase; | 76 | static void __iomem *virtbase; |
77 | static unsigned long coh901327_users; | 77 | static unsigned long coh901327_users; |
78 | static unsigned long boot_status; | 78 | static unsigned long boot_status; |
79 | static u16 wdogenablestore; | ||
80 | static u16 irqmaskstore; | ||
81 | static struct device *parent; | 79 | static struct device *parent; |
82 | 80 | ||
83 | /* | 81 | /* |
@@ -461,6 +459,10 @@ out: | |||
461 | } | 459 | } |
462 | 460 | ||
463 | #ifdef CONFIG_PM | 461 | #ifdef CONFIG_PM |
462 | |||
463 | static u16 wdogenablestore; | ||
464 | static u16 irqmaskstore; | ||
465 | |||
464 | static int coh901327_suspend(struct platform_device *pdev, pm_message_t state) | 466 | static int coh901327_suspend(struct platform_device *pdev, pm_message_t state) |
465 | { | 467 | { |
466 | irqmaskstore = readw(virtbase + U300_WDOG_IMR) & 0x0001U; | 468 | irqmaskstore = readw(virtbase + U300_WDOG_IMR) & 0x0001U; |
diff --git a/drivers/watchdog/hpwdt.c b/drivers/watchdog/hpwdt.c index 3774c9b8dac..8464ea1c36a 100644 --- a/drivers/watchdog/hpwdt.c +++ b/drivers/watchdog/hpwdt.c | |||
@@ -231,6 +231,7 @@ static int __devinit cru_detect(unsigned long map_entry, | |||
231 | 231 | ||
232 | cmn_regs.u1.reax = CRU_BIOS_SIGNATURE_VALUE; | 232 | cmn_regs.u1.reax = CRU_BIOS_SIGNATURE_VALUE; |
233 | 233 | ||
234 | set_memory_x((unsigned long)bios32_entrypoint, (2 * PAGE_SIZE)); | ||
234 | asminline_call(&cmn_regs, bios32_entrypoint); | 235 | asminline_call(&cmn_regs, bios32_entrypoint); |
235 | 236 | ||
236 | if (cmn_regs.u1.ral != 0) { | 237 | if (cmn_regs.u1.ral != 0) { |
@@ -248,8 +249,10 @@ static int __devinit cru_detect(unsigned long map_entry, | |||
248 | if ((physical_bios_base + physical_bios_offset)) { | 249 | if ((physical_bios_base + physical_bios_offset)) { |
249 | cru_rom_addr = | 250 | cru_rom_addr = |
250 | ioremap(cru_physical_address, cru_length); | 251 | ioremap(cru_physical_address, cru_length); |
251 | if (cru_rom_addr) | 252 | if (cru_rom_addr) { |
253 | set_memory_x((unsigned long)cru_rom_addr, cru_length); | ||
252 | retval = 0; | 254 | retval = 0; |
255 | } | ||
253 | } | 256 | } |
254 | 257 | ||
255 | printk(KERN_DEBUG "hpwdt: CRU Base Address: 0x%lx\n", | 258 | printk(KERN_DEBUG "hpwdt: CRU Base Address: 0x%lx\n", |
diff --git a/drivers/watchdog/iTCO_wdt.c b/drivers/watchdog/iTCO_wdt.c index ba6ad662635..99796c5d913 100644 --- a/drivers/watchdog/iTCO_wdt.c +++ b/drivers/watchdog/iTCO_wdt.c | |||
@@ -384,10 +384,10 @@ MODULE_PARM_DESC(nowayout, | |||
384 | "Watchdog cannot be stopped once started (default=" | 384 | "Watchdog cannot be stopped once started (default=" |
385 | __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); | 385 | __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); |
386 | 386 | ||
387 | static int turn_SMI_watchdog_clear_off = 0; | 387 | static int turn_SMI_watchdog_clear_off = 1; |
388 | module_param(turn_SMI_watchdog_clear_off, int, 0); | 388 | module_param(turn_SMI_watchdog_clear_off, int, 0); |
389 | MODULE_PARM_DESC(turn_SMI_watchdog_clear_off, | 389 | MODULE_PARM_DESC(turn_SMI_watchdog_clear_off, |
390 | "Turn off SMI clearing watchdog (default=0)"); | 390 | "Turn off SMI clearing watchdog (depends on TCO-version)(default=1)"); |
391 | 391 | ||
392 | /* | 392 | /* |
393 | * Some TCO specific functions | 393 | * Some TCO specific functions |
@@ -813,7 +813,7 @@ static int __devinit iTCO_wdt_init(struct pci_dev *pdev, | |||
813 | ret = -EIO; | 813 | ret = -EIO; |
814 | goto out_unmap; | 814 | goto out_unmap; |
815 | } | 815 | } |
816 | if (turn_SMI_watchdog_clear_off) { | 816 | if (turn_SMI_watchdog_clear_off >= iTCO_wdt_private.iTCO_version) { |
817 | /* Bit 13: TCO_EN -> 0 = Disables TCO logic generating an SMI# */ | 817 | /* Bit 13: TCO_EN -> 0 = Disables TCO logic generating an SMI# */ |
818 | val32 = inl(SMI_EN); | 818 | val32 = inl(SMI_EN); |
819 | val32 &= 0xffffdfff; /* Turn off SMI clearing watchdog */ | 819 | val32 &= 0xffffdfff; /* Turn off SMI clearing watchdog */ |
diff --git a/drivers/watchdog/sp805_wdt.c b/drivers/watchdog/sp805_wdt.c index cc2cfbe33b3..bfaf9bb1ee0 100644 --- a/drivers/watchdog/sp805_wdt.c +++ b/drivers/watchdog/sp805_wdt.c | |||
@@ -351,7 +351,7 @@ static int __devexit sp805_wdt_remove(struct amba_device *adev) | |||
351 | return 0; | 351 | return 0; |
352 | } | 352 | } |
353 | 353 | ||
354 | static struct amba_id sp805_wdt_ids[] __initdata = { | 354 | static struct amba_id sp805_wdt_ids[] = { |
355 | { | 355 | { |
356 | .id = 0x00141805, | 356 | .id = 0x00141805, |
357 | .mask = 0x00ffffff, | 357 | .mask = 0x00ffffff, |
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index 3eeb9766126..98954003a8d 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c | |||
@@ -1094,42 +1094,19 @@ static int ceph_snapdir_d_revalidate(struct dentry *dentry, | |||
1094 | /* | 1094 | /* |
1095 | * Set/clear/test dir complete flag on the dir's dentry. | 1095 | * Set/clear/test dir complete flag on the dir's dentry. |
1096 | */ | 1096 | */ |
1097 | static struct dentry * __d_find_any_alias(struct inode *inode) | ||
1098 | { | ||
1099 | struct dentry *alias; | ||
1100 | |||
1101 | if (list_empty(&inode->i_dentry)) | ||
1102 | return NULL; | ||
1103 | alias = list_first_entry(&inode->i_dentry, struct dentry, d_alias); | ||
1104 | return alias; | ||
1105 | } | ||
1106 | |||
1107 | void ceph_dir_set_complete(struct inode *inode) | 1097 | void ceph_dir_set_complete(struct inode *inode) |
1108 | { | 1098 | { |
1109 | struct dentry *dentry = __d_find_any_alias(inode); | 1099 | /* not yet implemented */ |
1110 | |||
1111 | if (dentry && ceph_dentry(dentry)) { | ||
1112 | dout(" marking %p (%p) complete\n", inode, dentry); | ||
1113 | set_bit(CEPH_D_COMPLETE, &ceph_dentry(dentry)->flags); | ||
1114 | } | ||
1115 | } | 1100 | } |
1116 | 1101 | ||
1117 | void ceph_dir_clear_complete(struct inode *inode) | 1102 | void ceph_dir_clear_complete(struct inode *inode) |
1118 | { | 1103 | { |
1119 | struct dentry *dentry = __d_find_any_alias(inode); | 1104 | /* not yet implemented */ |
1120 | |||
1121 | if (dentry && ceph_dentry(dentry)) { | ||
1122 | dout(" marking %p (%p) NOT complete\n", inode, dentry); | ||
1123 | clear_bit(CEPH_D_COMPLETE, &ceph_dentry(dentry)->flags); | ||
1124 | } | ||
1125 | } | 1105 | } |
1126 | 1106 | ||
1127 | bool ceph_dir_test_complete(struct inode *inode) | 1107 | bool ceph_dir_test_complete(struct inode *inode) |
1128 | { | 1108 | { |
1129 | struct dentry *dentry = __d_find_any_alias(inode); | 1109 | /* not yet implemented */ |
1130 | |||
1131 | if (dentry && ceph_dentry(dentry)) | ||
1132 | return test_bit(CEPH_D_COMPLETE, &ceph_dentry(dentry)->flags); | ||
1133 | return false; | 1110 | return false; |
1134 | } | 1111 | } |
1135 | 1112 | ||
diff --git a/fs/locks.c b/fs/locks.c index 3b0d05dcd7c..637694bf3a0 100644 --- a/fs/locks.c +++ b/fs/locks.c | |||
@@ -1205,6 +1205,8 @@ int __break_lease(struct inode *inode, unsigned int mode) | |||
1205 | int want_write = (mode & O_ACCMODE) != O_RDONLY; | 1205 | int want_write = (mode & O_ACCMODE) != O_RDONLY; |
1206 | 1206 | ||
1207 | new_fl = lease_alloc(NULL, want_write ? F_WRLCK : F_RDLCK); | 1207 | new_fl = lease_alloc(NULL, want_write ? F_WRLCK : F_RDLCK); |
1208 | if (IS_ERR(new_fl)) | ||
1209 | return PTR_ERR(new_fl); | ||
1208 | 1210 | ||
1209 | lock_flocks(); | 1211 | lock_flocks(); |
1210 | 1212 | ||
@@ -1221,12 +1223,6 @@ int __break_lease(struct inode *inode, unsigned int mode) | |||
1221 | if (fl->fl_owner == current->files) | 1223 | if (fl->fl_owner == current->files) |
1222 | i_have_this_lease = 1; | 1224 | i_have_this_lease = 1; |
1223 | 1225 | ||
1224 | if (IS_ERR(new_fl) && !i_have_this_lease | ||
1225 | && ((mode & O_NONBLOCK) == 0)) { | ||
1226 | error = PTR_ERR(new_fl); | ||
1227 | goto out; | ||
1228 | } | ||
1229 | |||
1230 | break_time = 0; | 1226 | break_time = 0; |
1231 | if (lease_break_time > 0) { | 1227 | if (lease_break_time > 0) { |
1232 | break_time = jiffies + lease_break_time * HZ; | 1228 | break_time = jiffies + lease_break_time * HZ; |
@@ -1284,8 +1280,7 @@ restart: | |||
1284 | 1280 | ||
1285 | out: | 1281 | out: |
1286 | unlock_flocks(); | 1282 | unlock_flocks(); |
1287 | if (!IS_ERR(new_fl)) | 1283 | locks_free_lock(new_fl); |
1288 | locks_free_lock(new_fl); | ||
1289 | return error; | 1284 | return error; |
1290 | } | 1285 | } |
1291 | 1286 | ||
diff --git a/fs/proc/stat.c b/fs/proc/stat.c index 2a30d67dd6b..0855e6f2039 100644 --- a/fs/proc/stat.c +++ b/fs/proc/stat.c | |||
@@ -32,7 +32,7 @@ static cputime64_t get_idle_time(int cpu) | |||
32 | idle = kstat_cpu(cpu).cpustat.idle; | 32 | idle = kstat_cpu(cpu).cpustat.idle; |
33 | idle = cputime64_add(idle, arch_idle_time(cpu)); | 33 | idle = cputime64_add(idle, arch_idle_time(cpu)); |
34 | } else | 34 | } else |
35 | idle = nsecs_to_jiffies64(1000 * idle_time); | 35 | idle = usecs_to_cputime64(idle_time); |
36 | 36 | ||
37 | return idle; | 37 | return idle; |
38 | } | 38 | } |
@@ -46,7 +46,7 @@ static cputime64_t get_iowait_time(int cpu) | |||
46 | /* !NO_HZ so we can rely on cpustat.iowait */ | 46 | /* !NO_HZ so we can rely on cpustat.iowait */ |
47 | iowait = kstat_cpu(cpu).cpustat.iowait; | 47 | iowait = kstat_cpu(cpu).cpustat.iowait; |
48 | else | 48 | else |
49 | iowait = nsecs_to_jiffies64(1000 * iowait_time); | 49 | iowait = usecs_to_cputime64(iowait_time); |
50 | 50 | ||
51 | return iowait; | 51 | return iowait; |
52 | } | 52 | } |
diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 3eca58f51ae..8a899496fd5 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c | |||
@@ -869,27 +869,6 @@ xfs_fs_dirty_inode( | |||
869 | } | 869 | } |
870 | 870 | ||
871 | STATIC int | 871 | STATIC int |
872 | xfs_log_inode( | ||
873 | struct xfs_inode *ip) | ||
874 | { | ||
875 | struct xfs_mount *mp = ip->i_mount; | ||
876 | struct xfs_trans *tp; | ||
877 | int error; | ||
878 | |||
879 | tp = xfs_trans_alloc(mp, XFS_TRANS_FSYNC_TS); | ||
880 | error = xfs_trans_reserve(tp, 0, XFS_FSYNC_TS_LOG_RES(mp), 0, 0, 0); | ||
881 | if (error) { | ||
882 | xfs_trans_cancel(tp, 0); | ||
883 | return error; | ||
884 | } | ||
885 | |||
886 | xfs_ilock(ip, XFS_ILOCK_EXCL); | ||
887 | xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); | ||
888 | xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); | ||
889 | return xfs_trans_commit(tp, 0); | ||
890 | } | ||
891 | |||
892 | STATIC int | ||
893 | xfs_fs_write_inode( | 872 | xfs_fs_write_inode( |
894 | struct inode *inode, | 873 | struct inode *inode, |
895 | struct writeback_control *wbc) | 874 | struct writeback_control *wbc) |
@@ -902,10 +881,8 @@ xfs_fs_write_inode( | |||
902 | 881 | ||
903 | if (XFS_FORCED_SHUTDOWN(mp)) | 882 | if (XFS_FORCED_SHUTDOWN(mp)) |
904 | return -XFS_ERROR(EIO); | 883 | return -XFS_ERROR(EIO); |
905 | if (!ip->i_update_core) | ||
906 | return 0; | ||
907 | 884 | ||
908 | if (wbc->sync_mode == WB_SYNC_ALL) { | 885 | if (wbc->sync_mode == WB_SYNC_ALL || wbc->for_kupdate) { |
909 | /* | 886 | /* |
910 | * Make sure the inode has made it it into the log. Instead | 887 | * Make sure the inode has made it it into the log. Instead |
911 | * of forcing it all the way to stable storage using a | 888 | * of forcing it all the way to stable storage using a |
@@ -913,11 +890,14 @@ xfs_fs_write_inode( | |||
913 | * ->sync_fs call do that for thus, which reduces the number | 890 | * ->sync_fs call do that for thus, which reduces the number |
914 | * of synchronous log forces dramatically. | 891 | * of synchronous log forces dramatically. |
915 | */ | 892 | */ |
916 | error = xfs_log_inode(ip); | 893 | error = xfs_log_dirty_inode(ip, NULL, 0); |
917 | if (error) | 894 | if (error) |
918 | goto out; | 895 | goto out; |
919 | return 0; | 896 | return 0; |
920 | } else { | 897 | } else { |
898 | if (!ip->i_update_core) | ||
899 | return 0; | ||
900 | |||
921 | /* | 901 | /* |
922 | * We make this non-blocking if the inode is contended, return | 902 | * We make this non-blocking if the inode is contended, return |
923 | * EAGAIN to indicate to the caller that they did not succeed. | 903 | * EAGAIN to indicate to the caller that they did not succeed. |
diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c index be5c51d8f75..f0994aedcd1 100644 --- a/fs/xfs/xfs_sync.c +++ b/fs/xfs/xfs_sync.c | |||
@@ -336,6 +336,32 @@ xfs_sync_fsdata( | |||
336 | return error; | 336 | return error; |
337 | } | 337 | } |
338 | 338 | ||
339 | int | ||
340 | xfs_log_dirty_inode( | ||
341 | struct xfs_inode *ip, | ||
342 | struct xfs_perag *pag, | ||
343 | int flags) | ||
344 | { | ||
345 | struct xfs_mount *mp = ip->i_mount; | ||
346 | struct xfs_trans *tp; | ||
347 | int error; | ||
348 | |||
349 | if (!ip->i_update_core) | ||
350 | return 0; | ||
351 | |||
352 | tp = xfs_trans_alloc(mp, XFS_TRANS_FSYNC_TS); | ||
353 | error = xfs_trans_reserve(tp, 0, XFS_FSYNC_TS_LOG_RES(mp), 0, 0, 0); | ||
354 | if (error) { | ||
355 | xfs_trans_cancel(tp, 0); | ||
356 | return error; | ||
357 | } | ||
358 | |||
359 | xfs_ilock(ip, XFS_ILOCK_EXCL); | ||
360 | xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); | ||
361 | xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); | ||
362 | return xfs_trans_commit(tp, 0); | ||
363 | } | ||
364 | |||
339 | /* | 365 | /* |
340 | * When remounting a filesystem read-only or freezing the filesystem, we have | 366 | * When remounting a filesystem read-only or freezing the filesystem, we have |
341 | * two phases to execute. This first phase is syncing the data before we | 367 | * two phases to execute. This first phase is syncing the data before we |
@@ -359,6 +385,16 @@ xfs_quiesce_data( | |||
359 | { | 385 | { |
360 | int error, error2 = 0; | 386 | int error, error2 = 0; |
361 | 387 | ||
388 | /* | ||
389 | * Log all pending size and timestamp updates. The vfs writeback | ||
390 | * code is supposed to do this, but due to its overagressive | ||
391 | * livelock detection it will skip inodes where appending writes | ||
392 | * were written out in the first non-blocking sync phase if their | ||
393 | * completion took long enough that it happened after taking the | ||
394 | * timestamp for the cut-off in the blocking phase. | ||
395 | */ | ||
396 | xfs_inode_ag_iterator(mp, xfs_log_dirty_inode, 0); | ||
397 | |||
362 | xfs_qm_sync(mp, SYNC_TRYLOCK); | 398 | xfs_qm_sync(mp, SYNC_TRYLOCK); |
363 | xfs_qm_sync(mp, SYNC_WAIT); | 399 | xfs_qm_sync(mp, SYNC_WAIT); |
364 | 400 | ||
diff --git a/fs/xfs/xfs_sync.h b/fs/xfs/xfs_sync.h index 941202e7ac6..fa965479d78 100644 --- a/fs/xfs/xfs_sync.h +++ b/fs/xfs/xfs_sync.h | |||
@@ -34,6 +34,8 @@ void xfs_quiesce_attr(struct xfs_mount *mp); | |||
34 | 34 | ||
35 | void xfs_flush_inodes(struct xfs_inode *ip); | 35 | void xfs_flush_inodes(struct xfs_inode *ip); |
36 | 36 | ||
37 | int xfs_log_dirty_inode(struct xfs_inode *ip, struct xfs_perag *pag, int flags); | ||
38 | |||
37 | int xfs_reclaim_inodes(struct xfs_mount *mp, int mode); | 39 | int xfs_reclaim_inodes(struct xfs_mount *mp, int mode); |
38 | int xfs_reclaim_inodes_count(struct xfs_mount *mp); | 40 | int xfs_reclaim_inodes_count(struct xfs_mount *mp); |
39 | void xfs_reclaim_inodes_nr(struct xfs_mount *mp, int nr_to_scan); | 41 | void xfs_reclaim_inodes_nr(struct xfs_mount *mp, int nr_to_scan); |
diff --git a/include/asm-generic/cputime.h b/include/asm-generic/cputime.h index 62ce6823c0f..12a1764f612 100644 --- a/include/asm-generic/cputime.h +++ b/include/asm-generic/cputime.h | |||
@@ -40,6 +40,7 @@ typedef u64 cputime64_t; | |||
40 | */ | 40 | */ |
41 | #define cputime_to_usecs(__ct) jiffies_to_usecs(__ct) | 41 | #define cputime_to_usecs(__ct) jiffies_to_usecs(__ct) |
42 | #define usecs_to_cputime(__msecs) usecs_to_jiffies(__msecs) | 42 | #define usecs_to_cputime(__msecs) usecs_to_jiffies(__msecs) |
43 | #define usecs_to_cputime64(__msecs) nsecs_to_jiffies64((__msecs) * 1000) | ||
43 | 44 | ||
44 | /* | 45 | /* |
45 | * Convert cputime to seconds and back. | 46 | * Convert cputime to seconds and back. |
diff --git a/include/linux/irqdomain.h b/include/linux/irqdomain.h index 99834e581b9..bd4272b61a1 100644 --- a/include/linux/irqdomain.h +++ b/include/linux/irqdomain.h | |||
@@ -91,10 +91,11 @@ static inline unsigned int irq_domain_to_irq(struct irq_domain *d, | |||
91 | 91 | ||
92 | extern void irq_domain_add(struct irq_domain *domain); | 92 | extern void irq_domain_add(struct irq_domain *domain); |
93 | extern void irq_domain_del(struct irq_domain *domain); | 93 | extern void irq_domain_del(struct irq_domain *domain); |
94 | |||
95 | extern struct irq_domain_ops irq_domain_simple_ops; | ||
94 | #endif /* CONFIG_IRQ_DOMAIN */ | 96 | #endif /* CONFIG_IRQ_DOMAIN */ |
95 | 97 | ||
96 | #if defined(CONFIG_IRQ_DOMAIN) && defined(CONFIG_OF_IRQ) | 98 | #if defined(CONFIG_IRQ_DOMAIN) && defined(CONFIG_OF_IRQ) |
97 | extern struct irq_domain_ops irq_domain_simple_ops; | ||
98 | extern void irq_domain_add_simple(struct device_node *controller, int irq_base); | 99 | extern void irq_domain_add_simple(struct device_node *controller, int irq_base); |
99 | extern void irq_domain_generate_simple(const struct of_device_id *match, | 100 | extern void irq_domain_generate_simple(const struct of_device_id *match, |
100 | u64 phys_base, unsigned int irq_start); | 101 | u64 phys_base, unsigned int irq_start); |
diff --git a/include/linux/kvm.h b/include/linux/kvm.h index c3892fc1d53..68e67e50d02 100644 --- a/include/linux/kvm.h +++ b/include/linux/kvm.h | |||
@@ -557,6 +557,7 @@ struct kvm_ppc_pvinfo { | |||
557 | #define KVM_CAP_MAX_VCPUS 66 /* returns max vcpus per vm */ | 557 | #define KVM_CAP_MAX_VCPUS 66 /* returns max vcpus per vm */ |
558 | #define KVM_CAP_PPC_PAPR 68 | 558 | #define KVM_CAP_PPC_PAPR 68 |
559 | #define KVM_CAP_S390_GMAP 71 | 559 | #define KVM_CAP_S390_GMAP 71 |
560 | #define KVM_CAP_TSC_DEADLINE_TIMER 72 | ||
560 | 561 | ||
561 | #ifdef KVM_CAP_IRQ_ROUTING | 562 | #ifdef KVM_CAP_IRQ_ROUTING |
562 | 563 | ||
diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index 4bde182fcf9..dcdfc2bda92 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h | |||
@@ -131,6 +131,7 @@ extern long vwrite(char *buf, char *addr, unsigned long count); | |||
131 | */ | 131 | */ |
132 | extern rwlock_t vmlist_lock; | 132 | extern rwlock_t vmlist_lock; |
133 | extern struct vm_struct *vmlist; | 133 | extern struct vm_struct *vmlist; |
134 | extern __init void vm_area_add_early(struct vm_struct *vm); | ||
134 | extern __init void vm_area_register_early(struct vm_struct *vm, size_t align); | 135 | extern __init void vm_area_register_early(struct vm_struct *vm, size_t align); |
135 | 136 | ||
136 | #ifdef CONFIG_SMP | 137 | #ifdef CONFIG_SMP |
diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h index 873d5be7926..e5a7b9aaf55 100644 --- a/include/net/ip_vs.h +++ b/include/net/ip_vs.h | |||
@@ -1207,7 +1207,7 @@ extern void ip_vs_control_cleanup(void); | |||
1207 | extern struct ip_vs_dest * | 1207 | extern struct ip_vs_dest * |
1208 | ip_vs_find_dest(struct net *net, int af, const union nf_inet_addr *daddr, | 1208 | ip_vs_find_dest(struct net *net, int af, const union nf_inet_addr *daddr, |
1209 | __be16 dport, const union nf_inet_addr *vaddr, __be16 vport, | 1209 | __be16 dport, const union nf_inet_addr *vaddr, __be16 vport, |
1210 | __u16 protocol, __u32 fwmark); | 1210 | __u16 protocol, __u32 fwmark, __u32 flags); |
1211 | extern struct ip_vs_dest *ip_vs_try_bind_dest(struct ip_vs_conn *cp); | 1211 | extern struct ip_vs_dest *ip_vs_try_bind_dest(struct ip_vs_conn *cp); |
1212 | 1212 | ||
1213 | 1213 | ||
diff --git a/kernel/futex.c b/kernel/futex.c index ea87f4d2f45..1614be20173 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
@@ -314,17 +314,29 @@ again: | |||
314 | #endif | 314 | #endif |
315 | 315 | ||
316 | lock_page(page_head); | 316 | lock_page(page_head); |
317 | |||
318 | /* | ||
319 | * If page_head->mapping is NULL, then it cannot be a PageAnon | ||
320 | * page; but it might be the ZERO_PAGE or in the gate area or | ||
321 | * in a special mapping (all cases which we are happy to fail); | ||
322 | * or it may have been a good file page when get_user_pages_fast | ||
323 | * found it, but truncated or holepunched or subjected to | ||
324 | * invalidate_complete_page2 before we got the page lock (also | ||
325 | * cases which we are happy to fail). And we hold a reference, | ||
326 | * so refcount care in invalidate_complete_page's remove_mapping | ||
327 | * prevents drop_caches from setting mapping to NULL beneath us. | ||
328 | * | ||
329 | * The case we do have to guard against is when memory pressure made | ||
330 | * shmem_writepage move it from filecache to swapcache beneath us: | ||
331 | * an unlikely race, but we do need to retry for page_head->mapping. | ||
332 | */ | ||
317 | if (!page_head->mapping) { | 333 | if (!page_head->mapping) { |
334 | int shmem_swizzled = PageSwapCache(page_head); | ||
318 | unlock_page(page_head); | 335 | unlock_page(page_head); |
319 | put_page(page_head); | 336 | put_page(page_head); |
320 | /* | 337 | if (shmem_swizzled) |
321 | * ZERO_PAGE pages don't have a mapping. Avoid a busy loop | 338 | goto again; |
322 | * trying to find one. RW mapping would have COW'd (and thus | 339 | return -EFAULT; |
323 | * have a mapping) so this page is RO and won't ever change. | ||
324 | */ | ||
325 | if ((page_head == ZERO_PAGE(address))) | ||
326 | return -EFAULT; | ||
327 | goto again; | ||
328 | } | 340 | } |
329 | 341 | ||
330 | /* | 342 | /* |
diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c index 200ce832c58..7ca523b249e 100644 --- a/kernel/irq/irqdomain.c +++ b/kernel/irq/irqdomain.c | |||
@@ -143,11 +143,6 @@ int irq_domain_simple_dt_translate(struct irq_domain *d, | |||
143 | return 0; | 143 | return 0; |
144 | } | 144 | } |
145 | 145 | ||
146 | struct irq_domain_ops irq_domain_simple_ops = { | ||
147 | .dt_translate = irq_domain_simple_dt_translate, | ||
148 | }; | ||
149 | EXPORT_SYMBOL_GPL(irq_domain_simple_ops); | ||
150 | |||
151 | /** | 146 | /** |
152 | * irq_domain_create_simple() - Set up a 'simple' translation range | 147 | * irq_domain_create_simple() - Set up a 'simple' translation range |
153 | */ | 148 | */ |
@@ -182,3 +177,10 @@ void irq_domain_generate_simple(const struct of_device_id *match, | |||
182 | } | 177 | } |
183 | EXPORT_SYMBOL_GPL(irq_domain_generate_simple); | 178 | EXPORT_SYMBOL_GPL(irq_domain_generate_simple); |
184 | #endif /* CONFIG_OF_IRQ */ | 179 | #endif /* CONFIG_OF_IRQ */ |
180 | |||
181 | struct irq_domain_ops irq_domain_simple_ops = { | ||
182 | #ifdef CONFIG_OF_IRQ | ||
183 | .dt_translate = irq_domain_simple_dt_translate, | ||
184 | #endif /* CONFIG_OF_IRQ */ | ||
185 | }; | ||
186 | EXPORT_SYMBOL_GPL(irq_domain_simple_ops); | ||
diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c index c4eb71c8b2e..1ecd6ba36d6 100644 --- a/kernel/time/clockevents.c +++ b/kernel/time/clockevents.c | |||
@@ -387,7 +387,6 @@ void clockevents_exchange_device(struct clock_event_device *old, | |||
387 | * released list and do a notify add later. | 387 | * released list and do a notify add later. |
388 | */ | 388 | */ |
389 | if (old) { | 389 | if (old) { |
390 | old->event_handler = clockevents_handle_noop; | ||
391 | clockevents_set_mode(old, CLOCK_EVT_MODE_UNUSED); | 390 | clockevents_set_mode(old, CLOCK_EVT_MODE_UNUSED); |
392 | list_del(&old->list); | 391 | list_del(&old->list); |
393 | list_add(&old->list, &clockevents_released); | 392 | list_add(&old->list, &clockevents_released); |
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 73f17c0293c..2316840b337 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
@@ -901,7 +901,6 @@ retry: | |||
901 | h->resv_huge_pages += delta; | 901 | h->resv_huge_pages += delta; |
902 | ret = 0; | 902 | ret = 0; |
903 | 903 | ||
904 | spin_unlock(&hugetlb_lock); | ||
905 | /* Free the needed pages to the hugetlb pool */ | 904 | /* Free the needed pages to the hugetlb pool */ |
906 | list_for_each_entry_safe(page, tmp, &surplus_list, lru) { | 905 | list_for_each_entry_safe(page, tmp, &surplus_list, lru) { |
907 | if ((--needed) < 0) | 906 | if ((--needed) < 0) |
@@ -915,6 +914,7 @@ retry: | |||
915 | VM_BUG_ON(page_count(page)); | 914 | VM_BUG_ON(page_count(page)); |
916 | enqueue_huge_page(h, page); | 915 | enqueue_huge_page(h, page); |
917 | } | 916 | } |
917 | spin_unlock(&hugetlb_lock); | ||
918 | 918 | ||
919 | /* Free unnecessary surplus pages to the buddy allocator */ | 919 | /* Free unnecessary surplus pages to the buddy allocator */ |
920 | free: | 920 | free: |
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index adc39548181..c3fdbcb1765 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
@@ -636,6 +636,7 @@ static int mbind_range(struct mm_struct *mm, unsigned long start, | |||
636 | struct vm_area_struct *prev; | 636 | struct vm_area_struct *prev; |
637 | struct vm_area_struct *vma; | 637 | struct vm_area_struct *vma; |
638 | int err = 0; | 638 | int err = 0; |
639 | pgoff_t pgoff; | ||
639 | unsigned long vmstart; | 640 | unsigned long vmstart; |
640 | unsigned long vmend; | 641 | unsigned long vmend; |
641 | 642 | ||
@@ -643,13 +644,21 @@ static int mbind_range(struct mm_struct *mm, unsigned long start, | |||
643 | if (!vma || vma->vm_start > start) | 644 | if (!vma || vma->vm_start > start) |
644 | return -EFAULT; | 645 | return -EFAULT; |
645 | 646 | ||
647 | if (start > vma->vm_start) | ||
648 | prev = vma; | ||
649 | |||
646 | for (; vma && vma->vm_start < end; prev = vma, vma = next) { | 650 | for (; vma && vma->vm_start < end; prev = vma, vma = next) { |
647 | next = vma->vm_next; | 651 | next = vma->vm_next; |
648 | vmstart = max(start, vma->vm_start); | 652 | vmstart = max(start, vma->vm_start); |
649 | vmend = min(end, vma->vm_end); | 653 | vmend = min(end, vma->vm_end); |
650 | 654 | ||
655 | if (mpol_equal(vma_policy(vma), new_pol)) | ||
656 | continue; | ||
657 | |||
658 | pgoff = vma->vm_pgoff + | ||
659 | ((vmstart - vma->vm_start) >> PAGE_SHIFT); | ||
651 | prev = vma_merge(mm, prev, vmstart, vmend, vma->vm_flags, | 660 | prev = vma_merge(mm, prev, vmstart, vmend, vma->vm_flags, |
652 | vma->anon_vma, vma->vm_file, vma->vm_pgoff, | 661 | vma->anon_vma, vma->vm_file, pgoff, |
653 | new_pol); | 662 | new_pol); |
654 | if (prev) { | 663 | if (prev) { |
655 | vma = prev; | 664 | vma = prev; |
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 27be2f0d4cb..21fdf46ad5a 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c | |||
@@ -1118,6 +1118,32 @@ void *vm_map_ram(struct page **pages, unsigned int count, int node, pgprot_t pro | |||
1118 | EXPORT_SYMBOL(vm_map_ram); | 1118 | EXPORT_SYMBOL(vm_map_ram); |
1119 | 1119 | ||
1120 | /** | 1120 | /** |
1121 | * vm_area_add_early - add vmap area early during boot | ||
1122 | * @vm: vm_struct to add | ||
1123 | * | ||
1124 | * This function is used to add fixed kernel vm area to vmlist before | ||
1125 | * vmalloc_init() is called. @vm->addr, @vm->size, and @vm->flags | ||
1126 | * should contain proper values and the other fields should be zero. | ||
1127 | * | ||
1128 | * DO NOT USE THIS FUNCTION UNLESS YOU KNOW WHAT YOU'RE DOING. | ||
1129 | */ | ||
1130 | void __init vm_area_add_early(struct vm_struct *vm) | ||
1131 | { | ||
1132 | struct vm_struct *tmp, **p; | ||
1133 | |||
1134 | BUG_ON(vmap_initialized); | ||
1135 | for (p = &vmlist; (tmp = *p) != NULL; p = &tmp->next) { | ||
1136 | if (tmp->addr >= vm->addr) { | ||
1137 | BUG_ON(tmp->addr < vm->addr + vm->size); | ||
1138 | break; | ||
1139 | } else | ||
1140 | BUG_ON(tmp->addr + tmp->size > vm->addr); | ||
1141 | } | ||
1142 | vm->next = *p; | ||
1143 | *p = vm; | ||
1144 | } | ||
1145 | |||
1146 | /** | ||
1121 | * vm_area_register_early - register vmap area early during boot | 1147 | * vm_area_register_early - register vmap area early during boot |
1122 | * @vm: vm_struct to register | 1148 | * @vm: vm_struct to register |
1123 | * @align: requested alignment | 1149 | * @align: requested alignment |
@@ -1139,8 +1165,7 @@ void __init vm_area_register_early(struct vm_struct *vm, size_t align) | |||
1139 | 1165 | ||
1140 | vm->addr = (void *)addr; | 1166 | vm->addr = (void *)addr; |
1141 | 1167 | ||
1142 | vm->next = vmlist; | 1168 | vm_area_add_early(vm); |
1143 | vmlist = vm; | ||
1144 | } | 1169 | } |
1145 | 1170 | ||
1146 | void __init vmalloc_init(void) | 1171 | void __init vmalloc_init(void) |
diff --git a/net/netfilter/ipvs/ip_vs_conn.c b/net/netfilter/ipvs/ip_vs_conn.c index 12571fb2881..29fa5badde7 100644 --- a/net/netfilter/ipvs/ip_vs_conn.c +++ b/net/netfilter/ipvs/ip_vs_conn.c | |||
@@ -616,7 +616,7 @@ struct ip_vs_dest *ip_vs_try_bind_dest(struct ip_vs_conn *cp) | |||
616 | if ((cp) && (!cp->dest)) { | 616 | if ((cp) && (!cp->dest)) { |
617 | dest = ip_vs_find_dest(ip_vs_conn_net(cp), cp->af, &cp->daddr, | 617 | dest = ip_vs_find_dest(ip_vs_conn_net(cp), cp->af, &cp->daddr, |
618 | cp->dport, &cp->vaddr, cp->vport, | 618 | cp->dport, &cp->vaddr, cp->vport, |
619 | cp->protocol, cp->fwmark); | 619 | cp->protocol, cp->fwmark, cp->flags); |
620 | ip_vs_bind_dest(cp, dest); | 620 | ip_vs_bind_dest(cp, dest); |
621 | return dest; | 621 | return dest; |
622 | } else | 622 | } else |
diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c index 008bf97cc91..e1a66cf37f9 100644 --- a/net/netfilter/ipvs/ip_vs_ctl.c +++ b/net/netfilter/ipvs/ip_vs_ctl.c | |||
@@ -619,15 +619,21 @@ struct ip_vs_dest *ip_vs_find_dest(struct net *net, int af, | |||
619 | const union nf_inet_addr *daddr, | 619 | const union nf_inet_addr *daddr, |
620 | __be16 dport, | 620 | __be16 dport, |
621 | const union nf_inet_addr *vaddr, | 621 | const union nf_inet_addr *vaddr, |
622 | __be16 vport, __u16 protocol, __u32 fwmark) | 622 | __be16 vport, __u16 protocol, __u32 fwmark, |
623 | __u32 flags) | ||
623 | { | 624 | { |
624 | struct ip_vs_dest *dest; | 625 | struct ip_vs_dest *dest; |
625 | struct ip_vs_service *svc; | 626 | struct ip_vs_service *svc; |
627 | __be16 port = dport; | ||
626 | 628 | ||
627 | svc = ip_vs_service_get(net, af, fwmark, protocol, vaddr, vport); | 629 | svc = ip_vs_service_get(net, af, fwmark, protocol, vaddr, vport); |
628 | if (!svc) | 630 | if (!svc) |
629 | return NULL; | 631 | return NULL; |
630 | dest = ip_vs_lookup_dest(svc, daddr, dport); | 632 | if (fwmark && (flags & IP_VS_CONN_F_FWD_MASK) != IP_VS_CONN_F_MASQ) |
633 | port = 0; | ||
634 | dest = ip_vs_lookup_dest(svc, daddr, port); | ||
635 | if (!dest) | ||
636 | dest = ip_vs_lookup_dest(svc, daddr, port ^ dport); | ||
631 | if (dest) | 637 | if (dest) |
632 | atomic_inc(&dest->refcnt); | 638 | atomic_inc(&dest->refcnt); |
633 | ip_vs_service_put(svc); | 639 | ip_vs_service_put(svc); |
diff --git a/net/netfilter/ipvs/ip_vs_sync.c b/net/netfilter/ipvs/ip_vs_sync.c index 3cdd479f9b5..2b6678c0ce1 100644 --- a/net/netfilter/ipvs/ip_vs_sync.c +++ b/net/netfilter/ipvs/ip_vs_sync.c | |||
@@ -740,7 +740,7 @@ static void ip_vs_proc_conn(struct net *net, struct ip_vs_conn_param *param, | |||
740 | * but still handled. | 740 | * but still handled. |
741 | */ | 741 | */ |
742 | dest = ip_vs_find_dest(net, type, daddr, dport, param->vaddr, | 742 | dest = ip_vs_find_dest(net, type, daddr, dport, param->vaddr, |
743 | param->vport, protocol, fwmark); | 743 | param->vport, protocol, fwmark, flags); |
744 | 744 | ||
745 | /* Set the approprite ativity flag */ | 745 | /* Set the approprite ativity flag */ |
746 | if (protocol == IPPROTO_TCP) { | 746 | if (protocol == IPPROTO_TCP) { |
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index ef21b221f03..257e77256c5 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c | |||
@@ -135,7 +135,7 @@ nla_put_failure: | |||
135 | static inline int | 135 | static inline int |
136 | ctnetlink_dump_timeout(struct sk_buff *skb, const struct nf_conn *ct) | 136 | ctnetlink_dump_timeout(struct sk_buff *skb, const struct nf_conn *ct) |
137 | { | 137 | { |
138 | long timeout = (ct->timeout.expires - jiffies) / HZ; | 138 | long timeout = ((long)ct->timeout.expires - (long)jiffies) / HZ; |
139 | 139 | ||
140 | if (timeout < 0) | 140 | if (timeout < 0) |
141 | timeout = 0; | 141 | timeout = 0; |
@@ -1358,12 +1358,15 @@ ctnetlink_create_conntrack(struct net *net, u16 zone, | |||
1358 | nf_ct_protonum(ct)); | 1358 | nf_ct_protonum(ct)); |
1359 | if (helper == NULL) { | 1359 | if (helper == NULL) { |
1360 | rcu_read_unlock(); | 1360 | rcu_read_unlock(); |
1361 | spin_unlock_bh(&nf_conntrack_lock); | ||
1361 | #ifdef CONFIG_MODULES | 1362 | #ifdef CONFIG_MODULES |
1362 | if (request_module("nfct-helper-%s", helpname) < 0) { | 1363 | if (request_module("nfct-helper-%s", helpname) < 0) { |
1364 | spin_lock_bh(&nf_conntrack_lock); | ||
1363 | err = -EOPNOTSUPP; | 1365 | err = -EOPNOTSUPP; |
1364 | goto err1; | 1366 | goto err1; |
1365 | } | 1367 | } |
1366 | 1368 | ||
1369 | spin_lock_bh(&nf_conntrack_lock); | ||
1367 | rcu_read_lock(); | 1370 | rcu_read_lock(); |
1368 | helper = __nf_conntrack_helper_find(helpname, | 1371 | helper = __nf_conntrack_helper_find(helpname, |
1369 | nf_ct_l3num(ct), | 1372 | nf_ct_l3num(ct), |
@@ -1638,7 +1641,7 @@ ctnetlink_exp_dump_expect(struct sk_buff *skb, | |||
1638 | const struct nf_conntrack_expect *exp) | 1641 | const struct nf_conntrack_expect *exp) |
1639 | { | 1642 | { |
1640 | struct nf_conn *master = exp->master; | 1643 | struct nf_conn *master = exp->master; |
1641 | long timeout = (exp->timeout.expires - jiffies) / HZ; | 1644 | long timeout = ((long)exp->timeout.expires - (long)jiffies) / HZ; |
1642 | struct nf_conn_help *help; | 1645 | struct nf_conn_help *help; |
1643 | 1646 | ||
1644 | if (timeout < 0) | 1647 | if (timeout < 0) |
@@ -1869,25 +1872,30 @@ ctnetlink_get_expect(struct sock *ctnl, struct sk_buff *skb, | |||
1869 | 1872 | ||
1870 | err = -ENOMEM; | 1873 | err = -ENOMEM; |
1871 | skb2 = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); | 1874 | skb2 = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); |
1872 | if (skb2 == NULL) | 1875 | if (skb2 == NULL) { |
1876 | nf_ct_expect_put(exp); | ||
1873 | goto out; | 1877 | goto out; |
1878 | } | ||
1874 | 1879 | ||
1875 | rcu_read_lock(); | 1880 | rcu_read_lock(); |
1876 | err = ctnetlink_exp_fill_info(skb2, NETLINK_CB(skb).pid, | 1881 | err = ctnetlink_exp_fill_info(skb2, NETLINK_CB(skb).pid, |
1877 | nlh->nlmsg_seq, IPCTNL_MSG_EXP_NEW, exp); | 1882 | nlh->nlmsg_seq, IPCTNL_MSG_EXP_NEW, exp); |
1878 | rcu_read_unlock(); | 1883 | rcu_read_unlock(); |
1884 | nf_ct_expect_put(exp); | ||
1879 | if (err <= 0) | 1885 | if (err <= 0) |
1880 | goto free; | 1886 | goto free; |
1881 | 1887 | ||
1882 | nf_ct_expect_put(exp); | 1888 | err = netlink_unicast(ctnl, skb2, NETLINK_CB(skb).pid, MSG_DONTWAIT); |
1889 | if (err < 0) | ||
1890 | goto out; | ||
1883 | 1891 | ||
1884 | return netlink_unicast(ctnl, skb2, NETLINK_CB(skb).pid, MSG_DONTWAIT); | 1892 | return 0; |
1885 | 1893 | ||
1886 | free: | 1894 | free: |
1887 | kfree_skb(skb2); | 1895 | kfree_skb(skb2); |
1888 | out: | 1896 | out: |
1889 | nf_ct_expect_put(exp); | 1897 | /* this avoids a loop in nfnetlink. */ |
1890 | return err; | 1898 | return err == -EAGAIN ? -ENOBUFS : err; |
1891 | } | 1899 | } |
1892 | 1900 | ||
1893 | static int | 1901 | static int |
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 3891702b81d..d9d4970b9b0 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -2448,8 +2448,12 @@ static int packet_do_bind(struct sock *sk, struct net_device *dev, __be16 protoc | |||
2448 | { | 2448 | { |
2449 | struct packet_sock *po = pkt_sk(sk); | 2449 | struct packet_sock *po = pkt_sk(sk); |
2450 | 2450 | ||
2451 | if (po->fanout) | 2451 | if (po->fanout) { |
2452 | if (dev) | ||
2453 | dev_put(dev); | ||
2454 | |||
2452 | return -EINVAL; | 2455 | return -EINVAL; |
2456 | } | ||
2453 | 2457 | ||
2454 | lock_sock(sk); | 2458 | lock_sock(sk); |
2455 | 2459 | ||
diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c index eb3b9a86c6e..a4ab207cdc5 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c | |||
@@ -488,7 +488,7 @@ static int get_dist_table(struct Qdisc *sch, const struct nlattr *attr) | |||
488 | return -EINVAL; | 488 | return -EINVAL; |
489 | 489 | ||
490 | s = sizeof(struct disttable) + n * sizeof(s16); | 490 | s = sizeof(struct disttable) + n * sizeof(s16); |
491 | d = kmalloc(s, GFP_KERNEL); | 491 | d = kmalloc(s, GFP_KERNEL | __GFP_NOWARN); |
492 | if (!d) | 492 | if (!d) |
493 | d = vmalloc(s); | 493 | d = vmalloc(s); |
494 | if (!d) | 494 | if (!d) |
@@ -501,9 +501,10 @@ static int get_dist_table(struct Qdisc *sch, const struct nlattr *attr) | |||
501 | root_lock = qdisc_root_sleeping_lock(sch); | 501 | root_lock = qdisc_root_sleeping_lock(sch); |
502 | 502 | ||
503 | spin_lock_bh(root_lock); | 503 | spin_lock_bh(root_lock); |
504 | dist_free(q->delay_dist); | 504 | swap(q->delay_dist, d); |
505 | q->delay_dist = d; | ||
506 | spin_unlock_bh(root_lock); | 505 | spin_unlock_bh(root_lock); |
506 | |||
507 | dist_free(d); | ||
507 | return 0; | 508 | return 0; |
508 | } | 509 | } |
509 | 510 | ||
diff --git a/sound/soc/codecs/wm8776.c b/sound/soc/codecs/wm8776.c index bfdc52370ad..d3b0a20744f 100644 --- a/sound/soc/codecs/wm8776.c +++ b/sound/soc/codecs/wm8776.c | |||
@@ -235,6 +235,7 @@ static int wm8776_hw_params(struct snd_pcm_substream *substream, | |||
235 | switch (snd_pcm_format_width(params_format(params))) { | 235 | switch (snd_pcm_format_width(params_format(params))) { |
236 | case 16: | 236 | case 16: |
237 | iface = 0; | 237 | iface = 0; |
238 | break; | ||
238 | case 20: | 239 | case 20: |
239 | iface = 0x10; | 240 | iface = 0x10; |
240 | break; | 241 | break; |
diff --git a/virt/kvm/assigned-dev.c b/virt/kvm/assigned-dev.c index 3ad0925d23a..758e3b36d4c 100644 --- a/virt/kvm/assigned-dev.c +++ b/virt/kvm/assigned-dev.c | |||
@@ -17,6 +17,8 @@ | |||
17 | #include <linux/pci.h> | 17 | #include <linux/pci.h> |
18 | #include <linux/interrupt.h> | 18 | #include <linux/interrupt.h> |
19 | #include <linux/slab.h> | 19 | #include <linux/slab.h> |
20 | #include <linux/namei.h> | ||
21 | #include <linux/fs.h> | ||
20 | #include "irq.h" | 22 | #include "irq.h" |
21 | 23 | ||
22 | static struct kvm_assigned_dev_kernel *kvm_find_assigned_dev(struct list_head *head, | 24 | static struct kvm_assigned_dev_kernel *kvm_find_assigned_dev(struct list_head *head, |
@@ -480,12 +482,76 @@ out: | |||
480 | return r; | 482 | return r; |
481 | } | 483 | } |
482 | 484 | ||
485 | /* | ||
486 | * We want to test whether the caller has been granted permissions to | ||
487 | * use this device. To be able to configure and control the device, | ||
488 | * the user needs access to PCI configuration space and BAR resources. | ||
489 | * These are accessed through PCI sysfs. PCI config space is often | ||
490 | * passed to the process calling this ioctl via file descriptor, so we | ||
491 | * can't rely on access to that file. We can check for permissions | ||
492 | * on each of the BAR resource files, which is a pretty clear | ||
493 | * indicator that the user has been granted access to the device. | ||
494 | */ | ||
495 | static int probe_sysfs_permissions(struct pci_dev *dev) | ||
496 | { | ||
497 | #ifdef CONFIG_SYSFS | ||
498 | int i; | ||
499 | bool bar_found = false; | ||
500 | |||
501 | for (i = PCI_STD_RESOURCES; i <= PCI_STD_RESOURCE_END; i++) { | ||
502 | char *kpath, *syspath; | ||
503 | struct path path; | ||
504 | struct inode *inode; | ||
505 | int r; | ||
506 | |||
507 | if (!pci_resource_len(dev, i)) | ||
508 | continue; | ||
509 | |||
510 | kpath = kobject_get_path(&dev->dev.kobj, GFP_KERNEL); | ||
511 | if (!kpath) | ||
512 | return -ENOMEM; | ||
513 | |||
514 | /* Per sysfs-rules, sysfs is always at /sys */ | ||
515 | syspath = kasprintf(GFP_KERNEL, "/sys%s/resource%d", kpath, i); | ||
516 | kfree(kpath); | ||
517 | if (!syspath) | ||
518 | return -ENOMEM; | ||
519 | |||
520 | r = kern_path(syspath, LOOKUP_FOLLOW, &path); | ||
521 | kfree(syspath); | ||
522 | if (r) | ||
523 | return r; | ||
524 | |||
525 | inode = path.dentry->d_inode; | ||
526 | |||
527 | r = inode_permission(inode, MAY_READ | MAY_WRITE | MAY_ACCESS); | ||
528 | path_put(&path); | ||
529 | if (r) | ||
530 | return r; | ||
531 | |||
532 | bar_found = true; | ||
533 | } | ||
534 | |||
535 | /* If no resources, probably something special */ | ||
536 | if (!bar_found) | ||
537 | return -EPERM; | ||
538 | |||
539 | return 0; | ||
540 | #else | ||
541 | return -EINVAL; /* No way to control the device without sysfs */ | ||
542 | #endif | ||
543 | } | ||
544 | |||
483 | static int kvm_vm_ioctl_assign_device(struct kvm *kvm, | 545 | static int kvm_vm_ioctl_assign_device(struct kvm *kvm, |
484 | struct kvm_assigned_pci_dev *assigned_dev) | 546 | struct kvm_assigned_pci_dev *assigned_dev) |
485 | { | 547 | { |
486 | int r = 0, idx; | 548 | int r = 0, idx; |
487 | struct kvm_assigned_dev_kernel *match; | 549 | struct kvm_assigned_dev_kernel *match; |
488 | struct pci_dev *dev; | 550 | struct pci_dev *dev; |
551 | u8 header_type; | ||
552 | |||
553 | if (!(assigned_dev->flags & KVM_DEV_ASSIGN_ENABLE_IOMMU)) | ||
554 | return -EINVAL; | ||
489 | 555 | ||
490 | mutex_lock(&kvm->lock); | 556 | mutex_lock(&kvm->lock); |
491 | idx = srcu_read_lock(&kvm->srcu); | 557 | idx = srcu_read_lock(&kvm->srcu); |
@@ -513,6 +579,18 @@ static int kvm_vm_ioctl_assign_device(struct kvm *kvm, | |||
513 | r = -EINVAL; | 579 | r = -EINVAL; |
514 | goto out_free; | 580 | goto out_free; |
515 | } | 581 | } |
582 | |||
583 | /* Don't allow bridges to be assigned */ | ||
584 | pci_read_config_byte(dev, PCI_HEADER_TYPE, &header_type); | ||
585 | if ((header_type & PCI_HEADER_TYPE) != PCI_HEADER_TYPE_NORMAL) { | ||
586 | r = -EPERM; | ||
587 | goto out_put; | ||
588 | } | ||
589 | |||
590 | r = probe_sysfs_permissions(dev); | ||
591 | if (r) | ||
592 | goto out_put; | ||
593 | |||
516 | if (pci_enable_device(dev)) { | 594 | if (pci_enable_device(dev)) { |
517 | printk(KERN_INFO "%s: Could not enable PCI device\n", __func__); | 595 | printk(KERN_INFO "%s: Could not enable PCI device\n", __func__); |
518 | r = -EBUSY; | 596 | r = -EBUSY; |
@@ -544,16 +622,14 @@ static int kvm_vm_ioctl_assign_device(struct kvm *kvm, | |||
544 | 622 | ||
545 | list_add(&match->list, &kvm->arch.assigned_dev_head); | 623 | list_add(&match->list, &kvm->arch.assigned_dev_head); |
546 | 624 | ||
547 | if (assigned_dev->flags & KVM_DEV_ASSIGN_ENABLE_IOMMU) { | 625 | if (!kvm->arch.iommu_domain) { |
548 | if (!kvm->arch.iommu_domain) { | 626 | r = kvm_iommu_map_guest(kvm); |
549 | r = kvm_iommu_map_guest(kvm); | ||
550 | if (r) | ||
551 | goto out_list_del; | ||
552 | } | ||
553 | r = kvm_assign_device(kvm, match); | ||
554 | if (r) | 627 | if (r) |
555 | goto out_list_del; | 628 | goto out_list_del; |
556 | } | 629 | } |
630 | r = kvm_assign_device(kvm, match); | ||
631 | if (r) | ||
632 | goto out_list_del; | ||
557 | 633 | ||
558 | out: | 634 | out: |
559 | srcu_read_unlock(&kvm->srcu, idx); | 635 | srcu_read_unlock(&kvm->srcu, idx); |
@@ -593,8 +669,7 @@ static int kvm_vm_ioctl_deassign_device(struct kvm *kvm, | |||
593 | goto out; | 669 | goto out; |
594 | } | 670 | } |
595 | 671 | ||
596 | if (match->flags & KVM_DEV_ASSIGN_ENABLE_IOMMU) | 672 | kvm_deassign_device(kvm, match); |
597 | kvm_deassign_device(kvm, match); | ||
598 | 673 | ||
599 | kvm_free_assigned_device(kvm, match); | 674 | kvm_free_assigned_device(kvm, match); |
600 | 675 | ||