Merge branches 'fixes' and 'ioremap' into for-linus
authorRussell King <rmk+kernel@arm.linux.org.uk>
Tue, 7 Jul 2015 11:35:33 +0000 (12:35 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Tue, 7 Jul 2015 11:35:33 +0000 (12:35 +0100)
1  2 
arch/arm/Kconfig
arch/arm/Kconfig.debug
arch/arm/include/asm/memory.h
arch/arm/kernel/entry-armv.S
arch/arm/kernel/smp.c
arch/arm/mm/mmu.c

diff --combined arch/arm/Kconfig
index cc0ea0c6cfc9b8f0144a1fe661d487bde0001920,a750c1425c3a64e8a1f2d138b8bc4d9fd2224b8e..1c5021002fe40b06a2e57daad459bf1b4181b822
@@@ -15,6 -15,8 +15,8 @@@ config AR
        select CLONE_BACKWARDS
        select CPU_PM if (SUSPEND || CPU_IDLE)
        select DCACHE_WORD_ACCESS if HAVE_EFFICIENT_UNALIGNED_ACCESS
+       select EDAC_SUPPORT
+       select EDAC_ATOMIC_SCRUB
        select GENERIC_ALLOCATOR
        select GENERIC_ATOMIC64 if (CPU_V7M || CPU_V6 || !CPU_32v6K || !AEABI)
        select GENERIC_CLOCKEVENTS_BROADCAST if SMP
@@@ -31,8 -33,8 +33,8 @@@
        select HARDIRQS_SW_RESEND
        select HAVE_ARCH_AUDITSYSCALL if (AEABI && !OABI_COMPAT)
        select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6
-       select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL
-       select HAVE_ARCH_KGDB
+       select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32
+       select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32
        select HAVE_ARCH_SECCOMP_FILTER if (AEABI && !OABI_COMPAT)
        select HAVE_ARCH_TRACEHOOK
        select HAVE_BPF_JIT
@@@ -43,7 -45,7 +45,7 @@@
        select HAVE_DMA_API_DEBUG
        select HAVE_DMA_ATTRS
        select HAVE_DMA_CONTIGUOUS if MMU
-       select HAVE_DYNAMIC_FTRACE if (!XIP_KERNEL)
+       select HAVE_DYNAMIC_FTRACE if (!XIP_KERNEL) && !CPU_ENDIAN_BE32
        select HAVE_EFFICIENT_UNALIGNED_ACCESS if (CPU_V6 || CPU_V6K || CPU_V7) && MMU
        select HAVE_FTRACE_MCOUNT_RECORD if (!XIP_KERNEL)
        select HAVE_FUNCTION_GRAPH_TRACER if (!THUMB2_KERNEL)
        select HAVE_KERNEL_LZMA
        select HAVE_KERNEL_LZO
        select HAVE_KERNEL_XZ
-       select HAVE_KPROBES if !XIP_KERNEL
+       select HAVE_KPROBES if !XIP_KERNEL && !CPU_ENDIAN_BE32 && !CPU_V7M
        select HAVE_KRETPROBES if (HAVE_KPROBES)
        select HAVE_MEMBLOCK
-       select HAVE_MOD_ARCH_SPECIFIC if ARM_UNWIND
+       select HAVE_MOD_ARCH_SPECIFIC
        select HAVE_OPROFILE if (HAVE_PERF_EVENTS)
        select HAVE_OPTPROBES if !THUMB2_KERNEL
        select HAVE_PERF_EVENTS
@@@ -171,7 -173,7 +173,7 @@@ config LOCKDEP_SUPPOR
  
  config TRACE_IRQFLAGS_SUPPORT
        bool
-       default y
+       default !CPU_V7M
  
  config RWSEM_XCHGADD_ALGORITHM
        bool
@@@ -329,6 -331,20 +331,20 @@@ config ARCH_MULTIPLATFOR
        select SPARSE_IRQ
        select USE_OF
  
+ config ARM_SINGLE_ARMV7M
+       bool "ARMv7-M based platforms (Cortex-M0/M3/M4)"
+       depends on !MMU
+       select ARCH_WANT_OPTIONAL_GPIOLIB
+       select ARM_NVIC
+       select AUTO_ZRELADDR
+       select CLKSRC_OF
+       select COMMON_CLK
+       select CPU_V7M
+       select GENERIC_CLOCKEVENTS
+       select NO_IOPORT_MAP
+       select SPARSE_IRQ
+       select USE_OF
  config ARCH_REALVIEW
        bool "ARM Ltd. RealView family"
        select ARCH_WANT_OPTIONAL_GPIOLIB
@@@ -398,24 -414,6 +414,6 @@@ config ARCH_EBSA11
          Ethernet interface, two PCMCIA sockets, two serial ports and a
          parallel port.
  
- config ARCH_EFM32
-       bool "Energy Micro efm32"
-       depends on !MMU
-       select ARCH_REQUIRE_GPIOLIB
-       select ARM_NVIC
-       select AUTO_ZRELADDR
-       select CLKSRC_OF
-       select COMMON_CLK
-       select CPU_V7M
-       select GENERIC_CLOCKEVENTS
-       select NO_DMA
-       select NO_IOPORT_MAP
-       select SPARSE_IRQ
-       select USE_OF
-       help
-         Support for Energy Micro's (now Silicon Labs) efm32 Giant Gecko
-         processors.
  config ARCH_EP93XX
        bool "EP93xx-based"
        select ARCH_HAS_HOLES_MEMORYMODEL
@@@ -606,6 -604,7 +604,7 @@@ config ARCH_PX
        select ARCH_REQUIRE_GPIOLIB
        select ARM_CPU_SUSPEND if PM
        select AUTO_ZRELADDR
+       select COMMON_CLK
        select CLKDEV_LOOKUP
        select CLKSRC_MMIO
        select CLKSRC_OF
@@@ -752,8 -751,10 +751,10 @@@ config ARCH_OMAP
        select GENERIC_IRQ_CHIP
        select HAVE_IDE
        select IRQ_DOMAIN
+       select MULTI_IRQ_HANDLER
        select NEED_MACH_IO_H if PCCARD
        select NEED_MACH_MEMORY_H
+       select SPARSE_IRQ
        help
          Support for older TI OMAP1 (omap7xx, omap15xx or omap16xx)
  
@@@ -937,6 -938,8 +938,8 @@@ source "arch/arm/mach-tegra/Kconfig
  
  source "arch/arm/mach-u300/Kconfig"
  
+ source "arch/arm/mach-uniphier/Kconfig"
  source "arch/arm/mach-ux500/Kconfig"
  
  source "arch/arm/mach-versatile/Kconfig"
@@@ -948,8 -951,40 +951,40 @@@ source "arch/arm/mach-vt8500/Kconfig
  
  source "arch/arm/mach-w90x900/Kconfig"
  
+ source "arch/arm/mach-zx/Kconfig"
  source "arch/arm/mach-zynq/Kconfig"
  
+ # ARMv7-M architecture
+ config ARCH_EFM32
+       bool "Energy Micro efm32"
+       depends on ARM_SINGLE_ARMV7M
+       select ARCH_REQUIRE_GPIOLIB
+       help
+         Support for Energy Micro's (now Silicon Labs) efm32 Giant Gecko
+         processors.
+ config ARCH_LPC18XX
+       bool "NXP LPC18xx/LPC43xx"
+       depends on ARM_SINGLE_ARMV7M
+       select ARCH_HAS_RESET_CONTROLLER
+       select ARM_AMBA
+       select CLKSRC_LPC32XX
+       select PINCTRL
+       help
+         Support for NXP's LPC18xx Cortex-M3 and LPC43xx Cortex-M4
+         high performance microcontrollers.
+ config ARCH_STM32
+       bool "STMicrolectronics STM32"
+       depends on ARM_SINGLE_ARMV7M
+       select ARCH_HAS_RESET_CONTROLLER
+       select ARMV7M_SYSTICK
+       select CLKSRC_STM32
+       select RESET_CONTROLLER
+       help
+         Support for STMicroelectronics STM32 processors.
  # Definitions to make life easier
  config ARCH_ACORN
        bool
@@@ -975,11 -1010,6 +1010,6 @@@ config PLAT_PX
  config PLAT_VERSATILE
        bool
  
- config ARM_TIMER_SP804
-       bool
-       select CLKSRC_MMIO
-       select CLKSRC_OF if OF
  source "arch/arm/firmware/Kconfig"
  
  source arch/arm/mm/Kconfig
@@@ -1307,6 -1337,7 +1337,7 @@@ config SM
        depends on GENERIC_CLOCKEVENTS
        depends on HAVE_SMP
        depends on MMU || ARM_MPU
+       select IRQ_WORK
        help
          This enables support for systems with more than one CPU. If you have
          a system with only one CPU, say N. If you have a system with more
@@@ -1477,7 -1508,8 +1508,8 @@@ config ARM_PSC
  # selected platforms.
  config ARCH_NR_GPIO
        int
-       default 1024 if ARCH_SHMOBILE || ARCH_TEGRA || ARCH_ZYNQ
+       default 1024 if ARCH_BRCMSTB || ARCH_SHMOBILE || ARCH_TEGRA || \
+               ARCH_ZYNQ
        default 512 if ARCH_EXYNOS || ARCH_KEYSTONE || SOC_OMAP5 || \
                SOC_DRA7XX || ARCH_S3C24XX || ARCH_S3C64XX || ARCH_S5PV210
        default 416 if ARCH_SUNXI
@@@ -1661,12 -1693,6 +1693,12 @@@ config HIGHME
  config HIGHPTE
        bool "Allocate 2nd-level pagetables from highmem"
        depends on HIGHMEM
 +      help
 +        The VM uses one page of physical memory for each page table.
 +        For systems with a lot of processes, this can use a lot of
 +        precious low memory, eventually leading to low memory being
 +        consumed by page tables.  Setting this option will allow
 +        user-space 2nd level page tables to reside in high memory.
  
  config HW_PERF_EVENTS
        bool "Enable hardware performance counter support for perf events"
@@@ -1687,6 -1713,21 +1719,21 @@@ config HAVE_ARCH_TRANSPARENT_HUGEPAG
  config ARCH_WANT_GENERAL_HUGETLB
        def_bool y
  
+ config ARM_MODULE_PLTS
+       bool "Use PLTs to allow module memory to spill over into vmalloc area"
+       depends on MODULES
+       help
+         Allocate PLTs when loading modules so that jumps and calls whose
+         targets are too far away for their relative offsets to be encoded
+         in the instructions themselves can be bounced via veneers in the
+         module's PLT. This allows modules to be allocated in the generic
+         vmalloc area after the dedicated module memory area has been
+         exhausted. The modules will use slightly more memory, but after
+         rounding up to page size, the actual memory footprint is usually
+         the same.
+         Say y if you are getting out of memory errors while loading modules
  source "mm/Kconfig"
  
  config FORCE_MAX_ZONEORDER
@@@ -1957,6 -1998,7 +2004,7 @@@ config XIP_PHYS_ADD
  config KEXEC
        bool "Kexec system call (EXPERIMENTAL)"
        depends on (!SMP || PM_SLEEP_SMP)
+       depends on !CPU_V7M
        help
          kexec is a system call that implements the ability to shutdown your
          current kernel, and to start another kernel.  It is like a reboot
diff --combined arch/arm/Kconfig.debug
index dfa21cb58f36799c291ae3ad9ab1b05955c67013,f1b15797136649872ab20aa87b89cdcf667b9a05..a2e16f940394c301cdcbdaa00bbd8488127867f2
@@@ -5,6 -5,7 +5,7 @@@ source "lib/Kconfig.debug
  config ARM_PTDUMP
        bool "Export kernel pagetable layout to userspace via debugfs"
        depends on DEBUG_KERNEL
+       depends on MMU
        select DEBUG_FS
        ---help---
          Say Y here if you want to show the kernel pagetable layout in a
@@@ -410,6 -411,13 +411,13 @@@ choic
                  Say Y here if you want kernel low-level debugging support
                  on i.MX6SX.
  
+       config DEBUG_IMX7D_UART
+               bool "i.MX7D Debug UART"
+               depends on SOC_IMX7D
+               help
+                 Say Y here if you want kernel low-level debugging support
+                 on i.MX7D.
        config DEBUG_KEYSTONE_UART0
                bool "Kernel low-level debugging on KEYSTONE2 using UART0"
                depends on ARCH_KEYSTONE
                  Say Y here if you want kernel low-level debugging support
                  on KS8695.
  
+       config DEBUG_LPC18XX_UART0
+               bool "Kernel low-level debugging via LPC18xx/43xx UART0"
+               depends on ARCH_LPC18XX
+               select DEBUG_UART_8250
+               help
+                 Say Y here if you want kernel low-level debugging support
+                 on NXP LPC18xx/43xx UART0.
        config DEBUG_MESON_UARTAO
                bool "Kernel low-level debugging via Meson6 UARTAO"
                depends on ARCH_MESON
                  on SA-11x0 UART ports. The kernel will check for the first
                  enabled UART in a sequence 3-1-2.
  
-       config DEBUG_SOCFPGA_UART
+       config DEBUG_SOCFPGA_UART0
                depends on ARCH_SOCFPGA
-               bool "Use SOCFPGA UART for low-level debug"
+               bool "Use SOCFPGA UART0 for low-level debug"
                select DEBUG_UART_8250
                help
                  Say Y here if you want kernel low-level debugging support
-                 on SOCFPGA based platforms.
+                 on SOCFPGA(Cyclone 5 and Arria 5) based platforms.
+       config DEBUG_SOCFPGA_UART1
+               depends on ARCH_SOCFPGA
+               bool "Use SOCFPGA UART1 for low-level debug"
+               select DEBUG_UART_8250
+               help
+                 Say Y here if you want kernel low-level debugging support
+                 on SOCFPGA(Arria 10) based platforms.
  
        config DEBUG_SUN9I_UART0
                bool "Kernel low-level debugging messages via sun9i UART0"
                  For more details about semihosting, please see
                  chapter 8 of DUI0203I_rvct_developer_guide.pdf from ARM Ltd.
  
+       config DEBUG_ZTE_ZX
+               bool "Use ZTE ZX UART"
+               select DEBUG_UART_PL01X
+               depends on ARCH_ZX
+               help
+                 Say Y here if you are enabling ZTE ZX296702 SOC and need
+                 debug uart support.
+                 This option is preferred over the platform specific
+                 options; the platform specific options are deprecated
+                 and will be soon removed.
        config DEBUG_LL_UART_8250
                bool "Kernel low-level debugging via 8250 UART"
                help
@@@ -1231,7 -1268,8 +1268,8 @@@ config DEBUG_IMX_UART_POR
                                                DEBUG_IMX53_UART || \
                                                DEBUG_IMX6Q_UART || \
                                                DEBUG_IMX6SL_UART || \
-                                               DEBUG_IMX6SX_UART
+                                               DEBUG_IMX6SX_UART || \
+                                               DEBUG_IMX7D_UART
        default 1
        depends on ARCH_MXC
        help
@@@ -1281,7 -1319,8 +1319,8 @@@ config DEBUG_LL_INCLUD
                                 DEBUG_IMX53_UART ||\
                                 DEBUG_IMX6Q_UART || \
                                 DEBUG_IMX6SL_UART || \
-                                DEBUG_IMX6SX_UART
+                                DEBUG_IMX6SX_UART || \
+                                DEBUG_IMX7D_UART
        default "debug/ks8695.S" if DEBUG_KS8695_UART
        default "debug/msm.S" if DEBUG_QCOM_UARTDM
        default "debug/netx.S" if DEBUG_NETX_UART
@@@ -1337,6 -1376,7 +1376,7 @@@ config DEBUG_UART_PHY
        default 0x02531000 if DEBUG_KEYSTONE_UART1
        default 0x03010fe0 if ARCH_RPC
        default 0x07000000 if DEBUG_SUN9I_UART0
+       default 0x09405000 if DEBUG_ZTE_ZX
        default 0x10009000 if DEBUG_REALVIEW_STD_PORT || \
                                DEBUG_VEXPRESS_UART0_CA9
        default 0x1010c000 if DEBUG_REALVIEW_PB1176_PORT
        default 0x20201000 if DEBUG_BCM2835
        default 0x3e000000 if DEBUG_BCM_KONA_UART
        default 0x4000e400 if DEBUG_LL_UART_EFM32
+       default 0x40081000 if DEBUG_LPC18XX_UART0
        default 0x40090000 if ARCH_LPC32XX
        default 0x40100000 if DEBUG_PXA_UART1
        default 0x42000000 if ARCH_GEMINI
        default 0xfd883000 if DEBUG_ALPINE_UART0
        default 0xfe800000 if ARCH_IOP32X
        default 0xff690000 if DEBUG_RK32_UART2
-       default 0xffc02000 if DEBUG_SOCFPGA_UART
+       default 0xffc02000 if DEBUG_SOCFPGA_UART0
+       default 0xffc02100 if DEBUG_SOCFPGA_UART1
        default 0xffd82340 if ARCH_IOP13XX
        default 0xffe40000 if DEBUG_RCAR_GEN1_SCIF0
        default 0xffe42000 if DEBUG_RCAR_GEN1_SCIF2
@@@ -1466,6 -1508,7 +1508,7 @@@ config DEBUG_UART_VIR
        default 0xfb009000 if DEBUG_REALVIEW_STD_PORT
        default 0xfb10c000 if DEBUG_REALVIEW_PB1176_PORT
        default 0xfc40ab00 if DEBUG_BRCMSTB_UART
+       default 0xfc705000 if DEBUG_ZTE_ZX
        default 0xfcfe8600 if DEBUG_UART_BCM63XX
        default 0xfd000000 if ARCH_SPEAR3XX || ARCH_SPEAR6XX
        default 0xfd000000 if ARCH_SPEAR13XX
        default 0xfeb26000 if DEBUG_RK3X_UART1
        default 0xfeb30c00 if DEBUG_KEYSTONE_UART0
        default 0xfeb31000 if DEBUG_KEYSTONE_UART1
-       default 0xfec02000 if DEBUG_SOCFPGA_UART
+       default 0xfec02000 if DEBUG_SOCFPGA_UART0
+       default 0xfec02100 if DEBUG_SOCFPGA_UART1
        default 0xfec12000 if DEBUG_MVEBU_UART0 || DEBUG_MVEBU_UART0_ALTERNATE
        default 0xfec12100 if DEBUG_MVEBU_UART1_ALTERNATE
        default 0xfec10000 if DEBUG_SIRFATLAS7_UART0
@@@ -1530,8 -1574,9 +1574,9 @@@ config DEBUG_UART_8250_WOR
        bool "Use 32-bit accesses for 8250 UART"
        depends on DEBUG_LL_UART_8250 || DEBUG_UART_8250
        depends on DEBUG_UART_8250_SHIFT >= 2
-       default y if DEBUG_PICOXCELL_UART || DEBUG_SOCFPGA_UART || \
-               ARCH_KEYSTONE || DEBUG_ALPINE_UART0 || \
+       default y if DEBUG_PICOXCELL_UART || DEBUG_SOCFPGA_UART0 || \
+               DEBUG_SOCFPGA_UART1 || ARCH_KEYSTONE || \
+               DEBUG_ALPINE_UART0 || \
                DEBUG_DAVINCI_DMx_UART0 || DEBUG_DAVINCI_DA8XX_UART1 || \
                DEBUG_DAVINCI_DA8XX_UART2 || \
                DEBUG_BCM_KONA_UART || DEBUG_RK32_UART2 || \
@@@ -1544,7 -1589,7 +1589,7 @@@ config DEBUG_UART_8250_FLOW_CONTRO
  
  config DEBUG_UNCOMPRESS
        bool
-       depends on ARCH_MULTIPLATFORM || PLAT_SAMSUNG
+       depends on ARCH_MULTIPLATFORM || PLAT_SAMSUNG || ARM_SINGLE_ARMV7M
        default y if DEBUG_LL && !DEBUG_OMAP2PLUS_UART && \
                     (!DEBUG_TEGRA_UART || !ZBOOT_ROM)
        help
  config UNCOMPRESS_INCLUDE
        string
        default "debug/uncompress.h" if ARCH_MULTIPLATFORM || ARCH_MSM || \
-                                       PLAT_SAMSUNG || ARCH_EFM32 || \
+                                       PLAT_SAMSUNG || ARM_SINGLE_ARMV7M || \
                                        ARCH_SHMOBILE_LEGACY
        default "mach/uncompress.h"
  
@@@ -1590,7 -1635,7 +1635,7 @@@ config PID_IN_CONTEXTID
  
  config DEBUG_SET_MODULE_RONX
        bool "Set loadable kernel module data as NX and text as RO"
 -      depends on MODULES
 +      depends on MODULES && MMU
        ---help---
          This option helps catch unintended modifications to loadable
          kernel module's text and read-only data. It also prevents execution
index 063ef314cca956bbbabdbc621a2e3ca9b03523a2,3a72d69b3255e8fa0d53c41ae4df90c126777020..6f225acc07c56bdef12a3ca68ae526d8fe836bf4
@@@ -18,8 -18,6 +18,6 @@@
  #include <linux/types.h>
  #include <linux/sizes.h>
  
- #include <asm/cache.h>
  #ifdef CONFIG_NEED_MACH_MEMORY_H
  #include <mach/memory.h>
  #endif
  #define page_to_phys(page)    (__pfn_to_phys(page_to_pfn(page)))
  #define phys_to_page(phys)    (pfn_to_page(__phys_to_pfn(phys)))
  
- /*
-  * Minimum guaranted alignment in pgd_alloc().  The page table pointers passed
-  * around in head.S and proc-*.S are shifted by this amount, in order to
-  * leave spare high bits for systems with physical address extension.  This
-  * does not fully accomodate the 40-bit addressing capability of ARM LPAE, but
-  * gives us about 38-bits or so.
-  */
- #ifdef CONFIG_ARM_LPAE
- #define ARCH_PGD_SHIFT                L1_CACHE_SHIFT
- #else
- #define ARCH_PGD_SHIFT                0
- #endif
- #define ARCH_PGD_MASK         ((1 << ARCH_PGD_SHIFT) - 1)
  /*
   * PLAT_PHYS_OFFSET is the offset (from zero) of the start of physical
   * memory.  This is used for XIP and NoMMU kernels, and on platforms that don't
@@@ -291,7 -275,7 +275,7 @@@ static inline void *phys_to_virt(phys_a
   */
  #define __pa(x)                       __virt_to_phys((unsigned long)(x))
  #define __va(x)                       ((void *)__phys_to_virt((phys_addr_t)(x)))
 -#define pfn_to_kaddr(pfn)     __va((pfn) << PAGE_SHIFT)
 +#define pfn_to_kaddr(pfn)     __va((phys_addr_t)(pfn) << PAGE_SHIFT)
  
  extern phys_addr_t (*arch_virt_to_idmap)(unsigned long x);
  
index dba6cf65c9e4b6ea112a9512e75df88f09cd98ea,f8f7398c74c2d355d63a2bf3ef3faec225d2011c..7335fc60d6cd5c054680e5e5d4e37b33fa1c51b9
@@@ -40,7 -40,7 +40,7 @@@
  #ifdef CONFIG_MULTI_IRQ_HANDLER
        ldr     r1, =handle_arch_irq
        mov     r0, sp
-       adr     lr, BSYM(9997f)
+       badr    lr, 9997f
        ldr     pc, [r1]
  #else
        arch_irq_handler_default
@@@ -273,7 -273,7 +273,7 @@@ __und_svc
        str     r4, [sp, #S_PC]
        orr     r0, r9, r0, lsl #16
  #endif
-       adr     r9, BSYM(__und_svc_finish)
+       badr    r9, __und_svc_finish
        mov     r2, r4
        bl      call_fpe
  
@@@ -408,7 -408,7 +408,7 @@@ ENDPROC(__fiq_abt
        zero_fp
  
        .if     \trace
 -#ifdef CONFIG_IRQSOFF_TRACER
 +#ifdef CONFIG_TRACE_IRQFLAGS
        bl      trace_hardirqs_off
  #endif
        ct_user_exit save = 0
@@@ -469,7 -469,7 +469,7 @@@ __und_usr
        @ instruction, or the more conventional lr if we are to treat
        @ this as a real undefined instruction
        @
-       adr     r9, BSYM(ret_from_exception)
+       badr    r9, ret_from_exception
  
        @ IRQs must be enabled before attempting to read the instruction from
        @ user space since that could cause a page/translation fault if the
        @ r2 = PC value for the following instruction (:= regs->ARM_pc)
        @ r4 = PC value for the faulting instruction
        @ lr = 32-bit undefined instruction function
-       adr     lr, BSYM(__und_usr_fault_32)
+       badr    lr, __und_usr_fault_32
        b       call_fpe
  
  __und_usr_thumb:
@@@ -522,7 -522,7 +522,7 @@@ ARM_BE8(rev16      r0, r0)                         @ little endia
        add     r2, r2, #2                      @ r2 is PC + 2, make it PC + 4
        str     r2, [sp, #S_PC]                 @ it's a 2x16bit instr, update
        orr     r0, r0, r5, lsl #16
-       adr     lr, BSYM(__und_usr_fault_32)
+       badr    lr, __und_usr_fault_32
        @ r0 = the two 16-bit Thumb instructions which caused the exception
        @ r2 = PC value for the following Thumb instruction (:= regs->ARM_pc)
        @ r4 = PC value for the first 16-bit Thumb instruction
@@@ -716,7 -716,7 +716,7 @@@ __und_usr_fault_32
  __und_usr_fault_16:
        mov     r1, #2
  1:    mov     r0, sp
-       adr     lr, BSYM(ret_from_exception)
+       badr    lr, ret_from_exception
        b       __und_fault
  ENDPROC(__und_usr_fault_32)
  ENDPROC(__und_usr_fault_16)
diff --combined arch/arm/kernel/smp.c
index f11d8252707619cfcf7e1c5f214bbdca75ef90b6,90dfbedfbfb8527b74ddcfcef125beb151f875f5..3d6b7821cff8c952e73c72cad5a1f8d90cdf1758
@@@ -86,9 -86,11 +86,11 @@@ void __init smp_set_ops(struct smp_oper
  
  static unsigned long get_arch_pgd(pgd_t *pgd)
  {
-       phys_addr_t pgdir = virt_to_idmap(pgd);
-       BUG_ON(pgdir & ARCH_PGD_MASK);
-       return pgdir >> ARCH_PGD_SHIFT;
+ #ifdef CONFIG_ARM_LPAE
+       return __phys_to_pfn(virt_to_phys(pgd));
+ #else
+       return virt_to_phys(pgd);
+ #endif
  }
  
  int __cpu_up(unsigned int cpu, struct task_struct *idle)
  #endif
  
  #ifdef CONFIG_MMU
-       secondary_data.pgdir = get_arch_pgd(idmap_pgd);
+       secondary_data.pgdir = virt_to_phys(idmap_pgd);
        secondary_data.swapper_pg_dir = get_arch_pgd(swapper_pg_dir);
  #endif
        sync_cache_w(&secondary_data);
@@@ -576,7 -578,7 +578,7 @@@ void handle_IPI(int ipinr, struct pt_re
        struct pt_regs *old_regs = set_irq_regs(regs);
  
        if ((unsigned)ipinr < NR_IPI) {
 -              trace_ipi_entry(ipi_types[ipinr]);
 +              trace_ipi_entry_rcuidle(ipi_types[ipinr]);
                __inc_irq_stat(cpu, ipi_irqs[ipinr]);
        }
  
        }
  
        if ((unsigned)ipinr < NR_IPI)
 -              trace_ipi_exit(ipi_types[ipinr]);
 +              trace_ipi_exit_rcuidle(ipi_types[ipinr]);
        set_irq_regs(old_regs);
  }
  
diff --combined arch/arm/mm/mmu.c
index 79de062c6077124fde71b9f3e3a1380e9400be9f,6ca7d9aa896f4e14804e1096407b16e9b1020456..870838a46d524141a9cb1d65980c1ba7456465cb
@@@ -1072,7 -1072,6 +1072,7 @@@ void __init sanity_check_meminfo(void
        int highmem = 0;
        phys_addr_t vmalloc_limit = __pa(vmalloc_min - 1) + 1;
        struct memblock_region *reg;
 +      bool should_use_highmem = false;
  
        for_each_memblock(memory, reg) {
                phys_addr_t block_start = reg->base;
                                pr_notice("Ignoring RAM at %pa-%pa (!CONFIG_HIGHMEM)\n",
                                          &block_start, &block_end);
                                memblock_remove(reg->base, reg->size);
 +                              should_use_highmem = true;
                                continue;
                        }
  
                                          &block_start, &block_end, &vmalloc_limit);
                                memblock_remove(vmalloc_limit, overlap_size);
                                block_end = vmalloc_limit;
 +                              should_use_highmem = true;
                        }
                }
  
                }
        }
  
 +      if (should_use_highmem)
 +              pr_notice("Consider using a HIGHMEM enabled kernel.\n");
 +
        high_memory = __va(arm_lowmem_limit - 1) + 1;
  
        /*
@@@ -1393,123 -1387,98 +1393,98 @@@ static void __init map_lowmem(void
        }
  }
  
- #ifdef CONFIG_ARM_LPAE
+ #ifdef CONFIG_ARM_PV_FIXUP
+ extern unsigned long __atags_pointer;
+ typedef void pgtables_remap(long long offset, unsigned long pgd, void *bdata);
+ pgtables_remap lpae_pgtables_remap_asm;
  /*
   * early_paging_init() recreates boot time page table setup, allowing machines
   * to switch over to a high (>4G) address space on LPAE systems
   */
- void __init early_paging_init(const struct machine_desc *mdesc,
-                             struct proc_info_list *procinfo)
+ void __init early_paging_init(const struct machine_desc *mdesc)
  {
-       pmdval_t pmdprot = procinfo->__cpu_mm_mmu_flags;
-       unsigned long map_start, map_end;
-       pgd_t *pgd0, *pgdk;
-       pud_t *pud0, *pudk, *pud_start;
-       pmd_t *pmd0, *pmdk;
-       phys_addr_t phys;
-       int i;
+       pgtables_remap *lpae_pgtables_remap;
+       unsigned long pa_pgd;
+       unsigned int cr, ttbcr;
+       long long offset;
+       void *boot_data;
  
-       if (!(mdesc->init_meminfo))
+       if (!mdesc->pv_fixup)
                return;
  
-       /* remap kernel code and data */
-       map_start = init_mm.start_code & PMD_MASK;
-       map_end   = ALIGN(init_mm.brk, PMD_SIZE);
+       offset = mdesc->pv_fixup();
+       if (offset == 0)
+               return;
  
-       /* get a handle on things... */
-       pgd0 = pgd_offset_k(0);
-       pud_start = pud0 = pud_offset(pgd0, 0);
-       pmd0 = pmd_offset(pud0, 0);
+       /*
+        * Get the address of the remap function in the 1:1 identity
+        * mapping setup by the early page table assembly code.  We
+        * must get this prior to the pv update.  The following barrier
+        * ensures that this is complete before we fixup any P:V offsets.
+        */
+       lpae_pgtables_remap = (pgtables_remap *)(unsigned long)__pa(lpae_pgtables_remap_asm);
+       pa_pgd = __pa(swapper_pg_dir);
+       boot_data = __va(__atags_pointer);
+       barrier();
  
-       pgdk = pgd_offset_k(map_start);
-       pudk = pud_offset(pgdk, map_start);
-       pmdk = pmd_offset(pudk, map_start);
+       pr_info("Switching physical address space to 0x%08llx\n",
+               (u64)PHYS_OFFSET + offset);
  
-       mdesc->init_meminfo();
+       /* Re-set the phys pfn offset, and the pv offset */
+       __pv_offset += offset;
+       __pv_phys_pfn_offset += PFN_DOWN(offset);
  
        /* Run the patch stub to update the constants */
        fixup_pv_table(&__pv_table_begin,
                (&__pv_table_end - &__pv_table_begin) << 2);
  
        /*
-        * Cache cleaning operations for self-modifying code
-        * We should clean the entries by MVA but running a
-        * for loop over every pv_table entry pointer would
-        * just complicate the code.
-        */
-       flush_cache_louis();
-       dsb(ishst);
-       isb();
-       /*
-        * FIXME: This code is not architecturally compliant: we modify
-        * the mappings in-place, indeed while they are in use by this
-        * very same code.  This may lead to unpredictable behaviour of
-        * the CPU.
-        *
-        * Even modifying the mappings in a separate page table does
-        * not resolve this.
-        *
-        * The architecture strongly recommends that when a mapping is
-        * changed, that it is changed by first going via an invalid
-        * mapping and back to the new mapping.  This is to ensure that
-        * no TLB conflicts (caused by the TLB having more than one TLB
-        * entry match a translation) can occur.  However, doing that
-        * here will result in unmapping the code we are running.
-        */
-       pr_warn("WARNING: unsafe modification of in-place page tables - tainting kernel\n");
-       add_taint(TAINT_CPU_OUT_OF_SPEC, LOCKDEP_STILL_OK);
-       /*
-        * Remap level 1 table.  This changes the physical addresses
-        * used to refer to the level 2 page tables to the high
-        * physical address alias, leaving everything else the same.
-        */
-       for (i = 0; i < PTRS_PER_PGD; pud0++, i++) {
-               set_pud(pud0,
-                       __pud(__pa(pmd0) | PMD_TYPE_TABLE | L_PGD_SWAPPER));
-               pmd0 += PTRS_PER_PMD;
-       }
-       /*
-        * Remap the level 2 table, pointing the mappings at the high
-        * physical address alias of these pages.
-        */
-       phys = __pa(map_start);
-       do {
-               *pmdk++ = __pmd(phys | pmdprot);
-               phys += PMD_SIZE;
-       } while (phys < map_end);
-       /*
-        * Ensure that the above updates are flushed out of the cache.
-        * This is not strictly correct; on a system where the caches
-        * are coherent with each other, but the MMU page table walks
-        * may not be coherent, flush_cache_all() may be a no-op, and
-        * this will fail.
+        * We changing not only the virtual to physical mapping, but also
+        * the physical addresses used to access memory.  We need to flush
+        * all levels of cache in the system with caching disabled to
+        * ensure that all data is written back, and nothing is prefetched
+        * into the caches.  We also need to prevent the TLB walkers
+        * allocating into the caches too.  Note that this is ARMv7 LPAE
+        * specific.
         */
+       cr = get_cr();
+       set_cr(cr & ~(CR_I | CR_C));
+       asm("mrc p15, 0, %0, c2, c0, 2" : "=r" (ttbcr));
+       asm volatile("mcr p15, 0, %0, c2, c0, 2"
+               : : "r" (ttbcr & ~(3 << 8 | 3 << 10)));
        flush_cache_all();
  
        /*
-        * Re-write the TTBR values to point them at the high physical
-        * alias of the page tables.  We expect __va() will work on
-        * cpu_get_pgd(), which returns the value of TTBR0.
+        * Fixup the page tables - this must be in the idmap region as
+        * we need to disable the MMU to do this safely, and hence it
+        * needs to be assembly.  It's fairly simple, as we're using the
+        * temporary tables setup by the initial assembly code.
         */
-       cpu_switch_mm(pgd0, &init_mm);
-       cpu_set_ttbr(1, __pa(pgd0) + TTBR1_OFFSET);
+       lpae_pgtables_remap(offset, pa_pgd, boot_data);
  
-       /* Finally flush any stale TLB values. */
-       local_flush_bp_all();
-       local_flush_tlb_all();
+       /* Re-enable the caches and cacheable TLB walks */
+       asm volatile("mcr p15, 0, %0, c2, c0, 2" : : "r" (ttbcr));
+       set_cr(cr);
  }
  
  #else
  
- void __init early_paging_init(const struct machine_desc *mdesc,
-                             struct proc_info_list *procinfo)
+ void __init early_paging_init(const struct machine_desc *mdesc)
  {
-       if (mdesc->init_meminfo)
-               mdesc->init_meminfo();
+       long long offset;
+       if (!mdesc->pv_fixup)
+               return;
+       offset = mdesc->pv_fixup();
+       if (offset == 0)
+               return;
+       pr_crit("Physical address space modification is only to support Keystone2.\n");
+       pr_crit("Please enable ARM_LPAE and ARM_PATCH_PHYS_VIRT support to use this\n");
+       pr_crit("feature. Your kernel may crash now, have a good day.\n");
+       add_taint(TAINT_CPU_OUT_OF_SPEC, LOCKDEP_STILL_OK);
  }
  
  #endif
@@@ -1525,7 -1494,6 +1500,7 @@@ void __init paging_init(const struct ma
        build_mem_type_table();
        prepare_page_table();
        map_lowmem();
 +      memblock_set_current_limit(arm_lowmem_limit);
        dma_contiguous_remap();
        devicemaps_init(mdesc);
        kmap_init();