]> Git Repo - linux.git/commitdiff
Merge branch 'devel-stable' into for-linus
authorRussell King <[email protected]>
Thu, 5 Jan 2012 13:24:33 +0000 (13:24 +0000)
committerRussell King <[email protected]>
Thu, 5 Jan 2012 13:24:33 +0000 (13:24 +0000)
Conflicts:
arch/arm/kernel/setup.c
arch/arm/mach-shmobile/board-kota2.c

13 files changed:
1  2 
arch/arm/Kconfig
arch/arm/include/asm/pgtable.h
arch/arm/kernel/perf_event.c
arch/arm/kernel/setup.c
arch/arm/mach-exynos/cpu.c
arch/arm/mach-imx/Kconfig
arch/arm/mach-omap2/board-rx51-peripherals.c
arch/arm/mach-s5pv210/mach-smdkv210.c
arch/arm/mach-shmobile/board-ag5evm.c
arch/arm/mach-shmobile/board-kota2.c
arch/arm/mm/fault.c
arch/arm/mm/proc-v7.S
mm/vmalloc.c

diff --combined arch/arm/Kconfig
index 3a07864905d2c4892d892320d604c9be4308e0f2,3ee1818540e71cb718e73918dd5befcbef73a9f4..afcb76ecea53bf519d8ea92ef836843b84d71db7
@@@ -220,9 -220,8 +220,9 @@@ config NEED_MACH_MEMORY_
          be avoided when possible.
  
  config PHYS_OFFSET
 -      hex "Physical address of main memory"
 +      hex "Physical address of main memory" if MMU
        depends on !ARM_PATCH_PHYS_VIRT && !NEED_MACH_MEMORY_H
 +      default DRAM_BASE if !MMU
        help
          Please provide the physical address corresponding to the
          location of main memory in your system.
@@@ -258,7 -257,6 +258,7 @@@ config ARCH_INTEGRATO
        select ARCH_HAS_CPUFREQ
        select CLKDEV_LOOKUP
        select HAVE_MACH_CLKDEV
 +      select HAVE_TCM
        select ICST
        select GENERIC_CLOCKEVENTS
        select PLAT_VERSATILE
@@@ -342,10 -340,12 +342,12 @@@ config ARCH_HIGHBAN
        select ARM_AMBA
        select ARM_GIC
        select ARM_TIMER_SP804
+       select CACHE_L2X0
        select CLKDEV_LOOKUP
        select CPU_V7
        select GENERIC_CLOCKEVENTS
        select HAVE_ARM_SCU
+       select HAVE_SMP
        select USE_OF
        help
          Support for the Calxeda Highbank SoC based boards.
@@@ -363,6 -363,7 +365,7 @@@ config ARCH_CNS3XX
        select CPU_V6K
        select GENERIC_CLOCKEVENTS
        select ARM_GIC
+       select MIGHT_HAVE_CACHE_L2X0
        select MIGHT_HAVE_PCI
        select PCI_DOMAINS if PCI
        help
@@@ -383,6 -384,7 +386,7 @@@ config ARCH_PRIMA
        select GENERIC_CLOCKEVENTS
        select CLKDEV_LOOKUP
        select GENERIC_IRQ_CHIP
+       select MIGHT_HAVE_CACHE_L2X0
        select USE_OF
        select ZONE_DMA
        help
@@@ -635,6 -637,8 +639,8 @@@ config ARCH_TEGR
        select GENERIC_GPIO
        select HAVE_CLK
        select HAVE_SCHED_CLOCK
+       select HAVE_SMP
+       select MIGHT_HAVE_CACHE_L2X0
        select ARCH_HAS_CPUFREQ
        help
          This enables support for NVIDIA Tegra based systems (Tegra APX,
@@@ -704,7 -708,9 +710,9 @@@ config ARCH_SHMOBIL
        select HAVE_CLK
        select CLKDEV_LOOKUP
        select HAVE_MACH_CLKDEV
+       select HAVE_SMP
        select GENERIC_CLOCKEVENTS
+       select MIGHT_HAVE_CACHE_L2X0
        select NO_IOPORT
        select SPARSE_IRQ
        select MULTI_IRQ_HANDLER
@@@ -906,6 -912,8 +914,8 @@@ config ARCH_U850
        select CLKDEV_LOOKUP
        select ARCH_REQUIRE_GPIOLIB
        select ARCH_HAS_CPUFREQ
+       select HAVE_SMP
+       select MIGHT_HAVE_CACHE_L2X0
        help
          Support for ST-Ericsson's Ux500 architecture
  
@@@ -916,6 -924,7 +926,7 @@@ config ARCH_NOMADI
        select CPU_ARM926T
        select CLKDEV_LOOKUP
        select GENERIC_CLOCKEVENTS
+       select MIGHT_HAVE_CACHE_L2X0
        select ARCH_REQUIRE_GPIOLIB
        help
          Support for the Nomadik platform by ST-Ericsson
@@@ -975,6 -984,7 +986,7 @@@ config ARCH_ZYN
        select ARM_GIC
        select ARM_AMBA
        select ICST
+       select MIGHT_HAVE_CACHE_L2X0
        select USE_OF
        help
          Support for Xilinx Zynq ARM Cortex A9 Platform
@@@ -1127,11 -1137,6 +1139,11 @@@ config ARM_TIMER_SP80
  
  source arch/arm/mm/Kconfig
  
 +config ARM_NR_BANKS
 +      int
 +      default 16 if ARCH_EP93XX
 +      default 8
 +
  config IWMMXT
        bool "Enable iWMMXt support"
        depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4
@@@ -1252,7 -1257,7 +1264,7 @@@ config PL310_ERRATA_58836
  
  config ARM_ERRATA_720789
        bool "ARM errata: TLBIASIDIS and TLBIMVAIS operations can broadcast a faulty ASID"
 -      depends on CPU_V7 && SMP
 +      depends on CPU_V7
        help
          This option enables the workaround for the 720789 Cortex-A9 (prior to
          r2p0) erratum. A faulty ASID can be sent to the other CPUs for the
@@@ -1288,7 -1293,7 +1300,7 @@@ config ARM_ERRATA_74362
  
  config ARM_ERRATA_751472
        bool "ARM errata: Interrupted ICIALLUIS may prevent completion of broadcasted operation"
 -      depends on CPU_V7 && SMP
 +      depends on CPU_V7
        help
          This option enables the workaround for the 751472 Cortex-A9 (prior
          to r3p0) erratum. An interrupted ICIALLUIS operation may prevent the
@@@ -1441,14 -1446,20 +1453,20 @@@ menu "Kernel Features
  
  source "kernel/time/Kconfig"
  
+ config HAVE_SMP
+       bool
+       help
+         This option should be selected by machines which have an SMP-
+         capable CPU.
+         The only effect of this option is to make the SMP-related
+         options available to the user for configuration.
  config SMP
        bool "Symmetric Multi-Processing"
        depends on CPU_V6K || CPU_V7
        depends on GENERIC_CLOCKEVENTS
-       depends on REALVIEW_EB_ARM11MP || REALVIEW_EB_A9MP || \
-                MACH_REALVIEW_PB11MP || MACH_REALVIEW_PBX || ARCH_OMAP4 || \
-                ARCH_EXYNOS4 || ARCH_TEGRA || ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || \
-                ARCH_MSM_SCORPIONMP || ARCH_SHMOBILE || ARCH_HIGHBANK || SOC_IMX6Q
+       depends on HAVE_SMP
        depends on MMU
        select USE_GENERIC_SMP_HELPERS
        select HAVE_ARM_SCU if !ARCH_MSM_SCORPIONMP
@@@ -1566,16 -1577,6 +1584,16 @@@ config LOCAL_TIMER
          accounting to be spread across the timer interval, preventing a
          "thundering herd" at every timer tick.
  
 +config ARCH_NR_GPIO
 +      int
 +      default 1024 if ARCH_SHMOBILE || ARCH_TEGRA
 +      default 350 if ARCH_U8500
 +      default 0
 +      help
 +        Maximum number of GPIOs in the system.
 +
 +        If unsure, leave the default value.
 +
  source kernel/Kconfig.preempt
  
  config HZ
@@@ -1988,7 -1989,7 +2006,7 @@@ endchoic
  
  config XIP_KERNEL
        bool "Kernel Execute-In-Place from ROM"
-       depends on !ZBOOT_ROM
+       depends on !ZBOOT_ROM && !ARM_LPAE
        help
          Execute-In-Place allows the kernel to run from non-volatile storage
          directly addressable by the CPU, such as NOR flash. This saves RAM
@@@ -2018,7 -2019,7 +2036,7 @@@ config XIP_PHYS_ADD
  
  config KEXEC
        bool "Kexec system call (EXPERIMENTAL)"
-       depends on EXPERIMENTAL
+       depends on EXPERIMENTAL && (!SMP || HOTPLUG_CPU)
        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
index 2f659e2397271e7c2fce8de3c832fb456b20fc6c,111979057e6a2036537fb3c4484d0bdd3cabbab1..f66626d71e7d1a304ad2c750fc4b00be9a436901
  #define _ASMARM_PGTABLE_H
  
  #include <linux/const.h>
- #include <asm-generic/4level-fixup.h>
  #include <asm/proc-fns.h>
  
  #ifndef CONFIG_MMU
  
+ #include <asm-generic/4level-fixup.h>
  #include "pgtable-nommu.h"
  
  #else
  
+ #include <asm-generic/pgtable-nopud.h>
  #include <asm/memory.h>
- #include <mach/vmalloc.h>
  #include <asm/pgtable-hwdef.h>
  
+ #ifdef CONFIG_ARM_LPAE
+ #include <asm/pgtable-3level.h>
+ #else
  #include <asm/pgtable-2level.h>
+ #endif
  
  /*
   * Just any arbitrary offset to the start of the vmalloc VM area: the
   * any out-of-bounds memory accesses will hopefully be caught.
   * The vmalloc() routines leaves a hole of 4kB between each vmalloced
   * area for the same reason. ;)
-  *
-  * Note that platforms may override VMALLOC_START, but they must provide
-  * VMALLOC_END.  VMALLOC_END defines the (exclusive) limit of this space,
-  * which may not overlap IO space.
   */
- #ifndef VMALLOC_START
  #define VMALLOC_OFFSET                (8*1024*1024)
  #define VMALLOC_START         (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
- #endif
+ #define VMALLOC_END           0xff000000UL
  
  #define LIBRARY_TEXT_START    0x0c000000
  
@@@ -163,39 -162,8 +162,8 @@@ extern pgd_t swapper_pg_dir[PTRS_PER_PG
  /* to find an entry in a kernel page-table-directory */
  #define pgd_offset_k(addr)    pgd_offset(&init_mm, addr)
  
- /*
-  * The "pgd_xxx()" functions here are trivial for a folded two-level
-  * setup: the pgd is never bad, and a pmd always exists (as it's folded
-  * into the pgd entry)
-  */
- #define pgd_none(pgd)         (0)
- #define pgd_bad(pgd)          (0)
- #define pgd_present(pgd)      (1)
- #define pgd_clear(pgdp)               do { } while (0)
- #define set_pgd(pgd,pgdp)     do { } while (0)
- #define set_pud(pud,pudp)     do { } while (0)
- /* Find an entry in the second-level page table.. */
- #define pmd_offset(dir, addr) ((pmd_t *)(dir))
  #define pmd_none(pmd)         (!pmd_val(pmd))
  #define pmd_present(pmd)      (pmd_val(pmd))
- #define pmd_bad(pmd)          (pmd_val(pmd) & 2)
- #define copy_pmd(pmdpd,pmdps)         \
-       do {                            \
-               pmdpd[0] = pmdps[0];    \
-               pmdpd[1] = pmdps[1];    \
-               flush_pmd_entry(pmdpd); \
-       } while (0)
- #define pmd_clear(pmdp)                       \
-       do {                            \
-               pmdp[0] = __pmd(0);     \
-               pmdp[1] = __pmd(0);     \
-               clean_pmd_entry(pmdp);  \
-       } while (0)
  
  static inline pte_t *pmd_page_vaddr(pmd_t pmd)
  {
  
  #define pmd_page(pmd)         pfn_to_page(__phys_to_pfn(pmd_val(pmd) & PHYS_MASK))
  
- /* we don't need complex calculations here as the pmd is folded into the pgd */
- #define pmd_addr_end(addr,end)        (end)
  #ifndef CONFIG_HIGHPTE
  #define __pte_map(pmd)                pmd_page_vaddr(*(pmd))
  #define __pte_unmap(pte)      do { } while (0)
  #define pte_page(pte)         pfn_to_page(pte_pfn(pte))
  #define mk_pte(page,prot)     pfn_pte(page_to_pfn(page), prot)
  
- #define set_pte_ext(ptep,pte,ext) cpu_set_pte_ext(ptep,pte,ext)
  #define pte_clear(mm,addr,ptep)       set_pte_ext(ptep, __pte(0), 0)
  
  #if __LINUX_ARM_ARCH__ < 6
@@@ -336,7 -299,6 +299,7 @@@ static inline pte_t pte_modify(pte_t pt
   * We provide our own arch_get_unmapped_area to cope with VIPT caches.
   */
  #define HAVE_ARCH_UNMAPPED_AREA
 +#define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN
  
  /*
   * remap a physical page `pfn' of size `size' with page protection `prot'
  
  #define pgtable_cache_init() do { } while (0)
  
- void identity_mapping_add(pgd_t *, unsigned long, unsigned long);
- void identity_mapping_del(pgd_t *, unsigned long, unsigned long);
  #endif /* !__ASSEMBLY__ */
  
  #endif /* CONFIG_MMU */
index 88b0941ce51ec674bbf46d604fcbb46f5dc25255,172101ac97de5a1125a014a02f1c1d71922a1640..5bb91bf3d47f24c9c6fb75324535c39e54b2c62e
@@@ -59,8 -59,7 +59,7 @@@ armpmu_get_pmu_id(void
  }
  EXPORT_SYMBOL_GPL(armpmu_get_pmu_id);
  
- int
- armpmu_get_max_events(void)
+ int perf_num_counters(void)
  {
        int max_events = 0;
  
  
        return max_events;
  }
- EXPORT_SYMBOL_GPL(armpmu_get_max_events);
- int perf_num_counters(void)
- {
-       return armpmu_get_max_events();
- }
  EXPORT_SYMBOL_GPL(perf_num_counters);
  
  #define HW_OP_UNSUPPORTED             0xFFFF
@@@ -353,15 -346,15 +346,15 @@@ validate_group(struct perf_event *event
        fake_pmu.used_mask = fake_used_mask;
  
        if (!validate_event(&fake_pmu, leader))
 -              return -ENOSPC;
 +              return -EINVAL;
  
        list_for_each_entry(sibling, &leader->sibling_list, group_entry) {
                if (!validate_event(&fake_pmu, sibling))
 -                      return -ENOSPC;
 +                      return -EINVAL;
        }
  
        if (!validate_event(&fake_pmu, event))
 -              return -ENOSPC;
 +              return -EINVAL;
  
        return 0;
  }
@@@ -380,6 -373,8 +373,8 @@@ armpmu_release_hardware(struct arm_pmu 
  {
        int i, irq, irqs;
        struct platform_device *pmu_device = armpmu->plat_device;
+       struct arm_pmu_platdata *plat =
+               dev_get_platdata(&pmu_device->dev);
  
        irqs = min(pmu_device->num_resources, num_possible_cpus());
  
                if (!cpumask_test_and_clear_cpu(i, &armpmu->active_irqs))
                        continue;
                irq = platform_get_irq(pmu_device, i);
-               if (irq >= 0)
+               if (irq >= 0) {
+                       if (plat && plat->disable_irq)
+                               plat->disable_irq(irq);
                        free_irq(irq, armpmu);
+               }
        }
  
        release_pmu(armpmu->type);
@@@ -448,7 -446,8 +446,8 @@@ armpmu_reserve_hardware(struct arm_pmu 
                                irq);
                        armpmu_release_hardware(armpmu);
                        return err;
-               }
+               } else if (plat && plat->enable_irq)
+                       plat->enable_irq(irq);
  
                cpumask_set_cpu(i, &armpmu->active_irqs);
        }
@@@ -640,9 -639,6 +639,9 @@@ static struct platform_device_id armpmu
  
  static int __devinit armpmu_device_probe(struct platform_device *pdev)
  {
 +      if (!cpu_pmu)
 +              return -ENODEV;
 +
        cpu_pmu->plat_device = pdev;
        return 0;
  }
diff --combined arch/arm/kernel/setup.c
index 8fc2c8fcbdc646a4a8babecbf4a758f88e6d8d60,5c7094e8f6e9e5f765e0ef2ac79c3711fc7fc923..095d6611c84e60443ae429e2c5e36b4074a02df7
@@@ -31,6 -31,7 +31,7 @@@
  #include <linux/memblock.h>
  #include <linux/bug.h>
  #include <linux/compiler.h>
+ #include <linux/sort.h>
  
  #include <asm/unified.h>
  #include <asm/cpu.h>
@@@ -890,11 -891,19 +891,17 @@@ static struct machine_desc * __init set
        return mdesc;
  }
  
+ static int __init meminfo_cmp(const void *_a, const void *_b)
+ {
+       const struct membank *a = _a, *b = _b;
+       long cmp = bank_pfn_start(a) - bank_pfn_start(b);
+       return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
+ }
  
  void __init setup_arch(char **cmdline_p)
  {
        struct machine_desc *mdesc;
  
 -      unwind_init();
 -
        setup_processor();
        mdesc = setup_machine_fdt(__atags_pointer);
        if (!mdesc)
        machine_desc = mdesc;
        machine_name = mdesc->name;
  
-       if (mdesc->soft_reboot)
-               reboot_setup("s");
 +#ifdef CONFIG_ZONE_DMA
 +      if (mdesc->dma_zone_size) {
 +              extern unsigned long arm_dma_zone_size;
 +              arm_dma_zone_size = mdesc->dma_zone_size;
 +      }
 +#endif
+       if (mdesc->restart_mode)
+               reboot_setup(&mdesc->restart_mode);
  
        init_mm.start_code = (unsigned long) _text;
        init_mm.end_code   = (unsigned long) _etext;
  
        parse_early_param();
  
+       sort(&meminfo.bank, meminfo.nr_banks, sizeof(meminfo.bank[0]), meminfo_cmp, NULL);
        sanity_check_meminfo();
        arm_memblock_init(&meminfo, mdesc);
  
        paging_init(mdesc);
        request_standard_resources(mdesc);
  
+       if (mdesc->restart)
+               arm_pm_restart = mdesc->restart;
        unflatten_device_tree();
  
  #ifdef CONFIG_SMP
  
        tcm_init();
  
 -#ifdef CONFIG_ZONE_DMA
 -      if (mdesc->dma_zone_size) {
 -              extern unsigned long arm_dma_zone_size;
 -              arm_dma_zone_size = mdesc->dma_zone_size;
 -      }
 -#endif
  #ifdef CONFIG_MULTI_IRQ_HANDLER
        handle_arch_irq = mdesc->handle_irq;
  #endif
index cc8d4bd6d0f71666f4fe369dab28908bbd7af741,22316cb31a8c4ff136d0f8b52c4df79f05f2669c..699774cbf11232cd295e85c26b31833c95b01180
@@@ -15,6 -15,7 +15,7 @@@
  #include <asm/mach/irq.h>
  
  #include <asm/proc-fns.h>
+ #include <asm/exception.h>
  #include <asm/hardware/cache-l2x0.h>
  #include <asm/hardware/gic.h>
  
@@@ -33,8 -34,6 +34,6 @@@
  #include <mach/regs-irq.h>
  #include <mach/regs-pmu.h>
  
- unsigned int gic_bank_offset __read_mostly;
  extern int combiner_init(unsigned int combiner_nr, void __iomem *base,
                         unsigned int irq_start);
  extern void combiner_cascade_irq(unsigned int combiner_nr, unsigned int irq);
@@@ -110,6 -109,11 +109,6 @@@ static struct map_desc exynos4_iodesc[
                .pfn            = __phys_to_pfn(EXYNOS4_PA_DMC0),
                .length         = SZ_4K,
                .type           = MT_DEVICE,
 -      }, {
 -              .virtual        = (unsigned long)S5P_VA_SROMC,
 -              .pfn            = __phys_to_pfn(EXYNOS4_PA_SROMC),
 -              .length         = SZ_4K,
 -              .type           = MT_DEVICE,
        }, {
                .virtual        = (unsigned long)S3C_VA_USB_HSPHY,
                .pfn            = __phys_to_pfn(EXYNOS4_PA_HSPHY),
@@@ -202,27 -206,14 +201,14 @@@ void __init exynos4_init_clocks(int xta
        exynos4_setup_clocks();
  }
  
- static void exynos4_gic_irq_fix_base(struct irq_data *d)
- {
-       struct gic_chip_data *gic_data = irq_data_get_irq_chip_data(d);
-       gic_data->cpu_base = S5P_VA_GIC_CPU +
-                           (gic_bank_offset * smp_processor_id());
-       gic_data->dist_base = S5P_VA_GIC_DIST +
-                           (gic_bank_offset * smp_processor_id());
- }
  void __init exynos4_init_irq(void)
  {
        int irq;
+       unsigned int gic_bank_offset;
  
        gic_bank_offset = soc_is_exynos4412() ? 0x4000 : 0x8000;
  
-       gic_init(0, IRQ_PPI(0), S5P_VA_GIC_DIST, S5P_VA_GIC_CPU);
-       gic_arch_extn.irq_eoi = exynos4_gic_irq_fix_base;
-       gic_arch_extn.irq_unmask = exynos4_gic_irq_fix_base;
-       gic_arch_extn.irq_mask = exynos4_gic_irq_fix_base;
+       gic_init_bases(0, IRQ_PPI(0), S5P_VA_GIC_DIST, S5P_VA_GIC_CPU, gic_bank_offset);
  
        for (irq = 0; irq < MAX_COMBINER_NR; irq++) {
  
index 0e6f1af260b651b1894a9203f449ae8ecb5cac26,188ecc00915b1d3103c49308edf2aa733b91ce67..35a218cb5c7e96db49f67587606e6425c0ae9083
@@@ -132,7 -132,7 +132,7 @@@ config MACH_MX25_3D
        select IMX_HAVE_PLATFORM_MXC_NAND
        select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
  
 -config MACH_EUKREA_CPUIMX25
 +config MACH_EUKREA_CPUIMX25SD
        bool "Support Eukrea CPUIMX25 Platform"
        select SOC_IMX25
        select IMX_HAVE_PLATFORM_FLEXCAN
  
  choice
        prompt "Baseboard"
 -      depends on MACH_EUKREA_CPUIMX25
 +      depends on MACH_EUKREA_CPUIMX25SD
        default MACH_EUKREA_MBIMXSD25_BASEBOARD
  
  config MACH_EUKREA_MBIMXSD25_BASEBOARD
@@@ -542,7 -542,7 +542,7 @@@ config MACH_MX35_3D
          Include support for MX35PDK platform. This includes specific
          configurations for the board and its peripherals.
  
 -config MACH_EUKREA_CPUIMX35
 +config MACH_EUKREA_CPUIMX35SD
        bool "Support Eukrea CPUIMX35 Platform"
        select SOC_IMX35
        select IMX_HAVE_PLATFORM_FLEXCAN
  
  choice
        prompt "Baseboard"
 -      depends on MACH_EUKREA_CPUIMX35
 +      depends on MACH_EUKREA_CPUIMX35SD
        default MACH_EUKREA_MBIMXSD35_BASEBOARD
  
  config MACH_EUKREA_MBIMXSD35_BASEBOARD
@@@ -596,12 -596,12 +596,12 @@@ comment "i.MX6 family:
  config SOC_IMX6Q
        bool "i.MX6 Quad support"
        select ARM_GIC
-       select CACHE_L2X0
        select CPU_V7
        select HAVE_ARM_SCU
        select HAVE_IMX_GPC
        select HAVE_IMX_MMDC
        select HAVE_IMX_SRC
+       select HAVE_SMP
        select USE_OF
  
        help
index c15c5c9c9085fa5e0a3eba9942ba57678b25db12,bd18d691c6ad9e9558703feff60c02b82b237a73..108fee6146fc45d4e615b342aa0f47a06ea213b9
@@@ -27,7 -27,7 +27,7 @@@
  
  #include <plat/mcspi.h>
  #include <plat/board.h>
- #include <plat/common.h>
+ #include "common.h"
  #include <plat/dma.h>
  #include <plat/gpmc.h>
  #include <plat/onenand.h>
@@@ -193,7 -193,7 +193,7 @@@ static struct platform_device rx51_char
  static void __init rx51_charger_init(void)
  {
        WARN_ON(gpio_request_one(RX51_USB_TRANSCEIVER_RST_GPIO,
 -              GPIOF_OUT_INIT_LOW, "isp1704_reset"));
 +              GPIOF_OUT_INIT_HIGH, "isp1704_reset"));
  
        platform_device_register(&rx51_charger_device);
  }
index 8662ef6e5681a40df5eaaf7eb4dce07127e1b594,4ca77c41d4996fc3074ff55dd91ab6efc3bca2a5..3ac9e57d9705ce252d804d4755673f5e9576fb2f
@@@ -20,6 -20,7 +20,7 @@@
  #include <linux/delay.h>
  #include <linux/pwm_backlight.h>
  
+ #include <asm/hardware/vic.h>
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
  #include <asm/setup.h>
@@@ -273,7 -274,6 +274,7 @@@ static struct samsung_bl_gpio_info smdk
  
  static struct platform_pwm_backlight_data smdkv210_bl_data = {
        .pwm_id = 3,
 +      .pwm_period_ns = 1000,
  };
  
  static void __init smdkv210_map_io(void)
@@@ -316,6 -316,7 +317,7 @@@ MACHINE_START(SMDKV210, "SMDKV210"
        /* Maintainer: Kukjin Kim <[email protected]> */
        .atag_offset    = 0x100,
        .init_irq       = s5pv210_init_irq,
+       .handle_irq     = vic_handle_irq,
        .map_io         = smdkv210_map_io,
        .init_machine   = smdkv210_machine_init,
        .timer          = &s5p_timer,
index 7119b87cbfa0caa2727334b7815a8cf388ff6077,83c270949465d1b49734759460e18d1ffdeae1e1..a4e6ca04e319534dfc4a0a94fa2a8fd7bb3e5caa
@@@ -466,8 -466,6 +466,6 @@@ static struct map_desc ag5evm_io_desc[
  static void __init ag5evm_map_io(void)
  {
        iotable_init(ag5evm_io_desc, ARRAY_SIZE(ag5evm_io_desc));
-       /* DMA memory at 0xf6000000 - 0xffdfffff */
-       init_consistent_dma_size(158 << 20);
  
        /* setup early devices and console here as well */
        sh73a0_add_early_devices();
@@@ -607,9 -605,8 +605,9 @@@ struct sys_timer ag5evm_timer = 
  
  MACHINE_START(AG5EVM, "ag5evm")
        .map_io         = ag5evm_map_io,
 +      .nr_irqs        = NR_IRQS_LEGACY,
        .init_irq       = sh73a0_init_irq,
-       .handle_irq     = shmobile_handle_irq_gic,
+       .handle_irq     = gic_handle_irq,
        .init_machine   = ag5evm_init,
        .timer          = &ag5evm_timer,
  MACHINE_END
index f44150b5ae46fc3a9f9c7ef57d04a30b2031dde3,1b4439d3f9d51e41b9c3c0824eb5990389cd1343..857ceeec1bb0e9975eb589deb82fbde7a9be856a
@@@ -33,7 -33,6 +33,7 @@@
  #include <linux/input/sh_keysc.h>
  #include <linux/gpio_keys.h>
  #include <linux/leds.h>
 +#include <linux/platform_data/leds-renesas-tpu.h>
  #include <linux/mmc/host.h>
  #include <linux/mmc/sh_mmcif.h>
  #include <linux/mfd/tmio.h>
@@@ -57,7 -56,7 +57,7 @@@ static struct resource smsc9220_resourc
                .flags          = IORESOURCE_MEM,
        },
        [1] = {
 -              .start          = gic_spi(33), /* PINTA2 @ PORT144 */
 +              .start          = SH73A0_PINT0_IRQ(2), /* PINTA2 */
                .flags          = IORESOURCE_IRQ,
        },
  };
@@@ -158,6 -157,10 +158,6 @@@ static struct platform_device gpio_keys
  #define GPIO_LED(n, g) { .name = n, .gpio = g }
  
  static struct gpio_led gpio_leds[] = {
 -      GPIO_LED("V2513", GPIO_PORT153), /* PORT153 [TPU1T02] -> V2513 */
 -      GPIO_LED("V2514", GPIO_PORT199), /* PORT199 [TPU4TO1] -> V2514 */
 -      GPIO_LED("V2515", GPIO_PORT197), /* PORT197 [TPU2TO1] -> V2515 */
 -      GPIO_LED("KEYLED", GPIO_PORT163), /* PORT163 [TPU3TO0] -> KEYLED */
        GPIO_LED("G", GPIO_PORT20), /* PORT20 [GPO0] -> LED7 -> "G" */
        GPIO_LED("H", GPIO_PORT21), /* PORT21 [GPO1] -> LED8 -> "H" */
        GPIO_LED("J", GPIO_PORT22), /* PORT22 [GPO2] -> LED9 -> "J" */
@@@ -176,119 -179,6 +176,119 @@@ static struct platform_device gpio_leds
        },
  };
  
 +/* TPU LED */
 +static struct led_renesas_tpu_config led_renesas_tpu12_pdata = {
 +      .name           = "V2513",
 +      .pin_gpio_fn    = GPIO_FN_TPU1TO2,
 +      .pin_gpio       = GPIO_PORT153,
 +      .channel_offset = 0x90,
 +      .timer_bit = 2,
 +      .max_brightness = 1000,
 +};
 +
 +static struct resource tpu12_resources[] = {
 +      [0] = {
 +              .name   = "TPU12",
 +              .start  = 0xe6610090,
 +              .end    = 0xe66100b5,
 +              .flags  = IORESOURCE_MEM,
 +      },
 +};
 +
 +static struct platform_device leds_tpu12_device = {
 +      .name = "leds-renesas-tpu",
 +      .id = 12,
 +      .dev = {
 +              .platform_data  = &led_renesas_tpu12_pdata,
 +      },
 +      .num_resources  = ARRAY_SIZE(tpu12_resources),
 +      .resource       = tpu12_resources,
 +};
 +
 +static struct led_renesas_tpu_config led_renesas_tpu41_pdata = {
 +      .name           = "V2514",
 +      .pin_gpio_fn    = GPIO_FN_TPU4TO1,
 +      .pin_gpio       = GPIO_PORT199,
 +      .channel_offset = 0x50,
 +      .timer_bit = 1,
 +      .max_brightness = 1000,
 +};
 +
 +static struct resource tpu41_resources[] = {
 +      [0] = {
 +              .name   = "TPU41",
 +              .start  = 0xe6640050,
 +              .end    = 0xe6640075,
 +              .flags  = IORESOURCE_MEM,
 +      },
 +};
 +
 +static struct platform_device leds_tpu41_device = {
 +      .name = "leds-renesas-tpu",
 +      .id = 41,
 +      .dev = {
 +              .platform_data  = &led_renesas_tpu41_pdata,
 +      },
 +      .num_resources  = ARRAY_SIZE(tpu41_resources),
 +      .resource       = tpu41_resources,
 +};
 +
 +static struct led_renesas_tpu_config led_renesas_tpu21_pdata = {
 +      .name           = "V2515",
 +      .pin_gpio_fn    = GPIO_FN_TPU2TO1,
 +      .pin_gpio       = GPIO_PORT197,
 +      .channel_offset = 0x50,
 +      .timer_bit = 1,
 +      .max_brightness = 1000,
 +};
 +
 +static struct resource tpu21_resources[] = {
 +      [0] = {
 +              .name   = "TPU21",
 +              .start  = 0xe6620050,
 +              .end    = 0xe6620075,
 +              .flags  = IORESOURCE_MEM,
 +      },
 +};
 +
 +static struct platform_device leds_tpu21_device = {
 +      .name = "leds-renesas-tpu",
 +      .id = 21,
 +      .dev = {
 +              .platform_data  = &led_renesas_tpu21_pdata,
 +      },
 +      .num_resources  = ARRAY_SIZE(tpu21_resources),
 +      .resource       = tpu21_resources,
 +};
 +
 +static struct led_renesas_tpu_config led_renesas_tpu30_pdata = {
 +      .name           = "KEYLED",
 +      .pin_gpio_fn    = GPIO_FN_TPU3TO0,
 +      .pin_gpio       = GPIO_PORT163,
 +      .channel_offset = 0x10,
 +      .timer_bit = 0,
 +      .max_brightness = 1000,
 +};
 +
 +static struct resource tpu30_resources[] = {
 +      [0] = {
 +              .name   = "TPU30",
 +              .start  = 0xe6630010,
 +              .end    = 0xe6630035,
 +              .flags  = IORESOURCE_MEM,
 +      },
 +};
 +
 +static struct platform_device leds_tpu30_device = {
 +      .name = "leds-renesas-tpu",
 +      .id = 30,
 +      .dev = {
 +              .platform_data  = &led_renesas_tpu30_pdata,
 +      },
 +      .num_resources  = ARRAY_SIZE(tpu30_resources),
 +      .resource       = tpu30_resources,
 +};
 +
  /* MMCIF */
  static struct resource mmcif_resources[] = {
        [0] = {
@@@ -401,10 -291,6 +401,10 @@@ static struct platform_device *kota2_de
        &keysc_device,
        &gpio_keys_device,
        &gpio_leds_device,
 +      &leds_tpu12_device,
 +      &leds_tpu41_device,
 +      &leds_tpu21_device,
 +      &leds_tpu30_device,
        &mmcif_device,
        &sdhi0_device,
        &sdhi1_device,
@@@ -431,6 -317,18 +431,6 @@@ static void __init kota2_map_io(void
        shmobile_setup_console();
  }
  
 -#define PINTER0A      0xe69000a0
 -#define PINTCR0A      0xe69000b0
 -
 -void __init kota2_init_irq(void)
 -{
 -      sh73a0_init_irq();
 -
 -      /* setup PINT: enable PINTA2 as active low */
 -      __raw_writel(1 << 29, PINTER0A);
 -      __raw_writew(2 << 10, PINTCR0A);
 -}
 -
  static void __init kota2_init(void)
  {
        sh73a0_pinmux_init();
@@@ -549,9 -447,8 +549,9 @@@ struct sys_timer kota2_timer = 
  
  MACHINE_START(KOTA2, "kota2")
        .map_io         = kota2_map_io,
 -      .init_irq       = kota2_init_irq,
 +      .nr_irqs        = NR_IRQS_LEGACY,
 +      .init_irq       = sh73a0_init_irq,
-       .handle_irq     = shmobile_handle_irq_gic,
+       .handle_irq     = gic_handle_irq,
        .init_machine   = kota2_init,
        .timer          = &kota2_timer,
  MACHINE_END
diff --combined arch/arm/mm/fault.c
index 4aabeaec25dfeaaf153c2178b3c3e212002dce9c,eb5520fc755facac778bfac4da1383cb23794cfb..bb7eac381a8e60f619591e7c80c4ad30cc972d62
  
  #include "fault.h"
  
- /*
-  * Fault status register encodings.  We steal bit 31 for our own purposes.
-  */
- #define FSR_LNX_PF            (1 << 31)
- #define FSR_WRITE             (1 << 11)
- #define FSR_FS4                       (1 << 10)
- #define FSR_FS3_0             (15)
- static inline int fsr_fs(unsigned int fsr)
- {
-       return (fsr & FSR_FS3_0) | (fsr & FSR_FS4) >> 6;
- }
  #ifdef CONFIG_MMU
  
  #ifdef CONFIG_KPROBES
@@@ -123,8 -110,10 +110,10 @@@ void show_pte(struct mm_struct *mm, uns
  
                pte = pte_offset_map(pmd, addr);
                printk(", *pte=%08llx", (long long)pte_val(*pte));
+ #ifndef CONFIG_ARM_LPAE
                printk(", *ppte=%08llx",
                       (long long)pte_val(pte[PTE_HWTABLE_PTRS]));
+ #endif
                pte_unmap(pte);
        } while(0);
  
@@@ -231,7 -220,7 +220,7 @@@ static inline bool access_error(unsigne
  
  static int __kprobes
  __do_page_fault(struct mm_struct *mm, unsigned long addr, unsigned int fsr,
 -              struct task_struct *tsk)
 +              unsigned int flags, struct task_struct *tsk)
  {
        struct vm_area_struct *vma;
        int fault;
@@@ -253,7 -242,18 +242,7 @@@ good_area
                goto out;
        }
  
 -      /*
 -       * If for any reason at all we couldn't handle the fault, make
 -       * sure we exit gracefully rather than endlessly redo the fault.
 -       */
 -      fault = handle_mm_fault(mm, vma, addr & PAGE_MASK, (fsr & FSR_WRITE) ? FAULT_FLAG_WRITE : 0);
 -      if (unlikely(fault & VM_FAULT_ERROR))
 -              return fault;
 -      if (fault & VM_FAULT_MAJOR)
 -              tsk->maj_flt++;
 -      else
 -              tsk->min_flt++;
 -      return fault;
 +      return handle_mm_fault(mm, vma, addr & PAGE_MASK, flags);
  
  check_stack:
        if (vma->vm_flags & VM_GROWSDOWN && !expand_stack(vma, addr))
@@@ -268,9 -268,6 +257,9 @@@ do_page_fault(unsigned long addr, unsig
        struct task_struct *tsk;
        struct mm_struct *mm;
        int fault, sig, code;
 +      int write = fsr & FSR_WRITE;
 +      unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE |
 +                              (write ? FAULT_FLAG_WRITE : 0);
  
        if (notify_page_fault(regs, fsr))
                return 0;
        if (!down_read_trylock(&mm->mmap_sem)) {
                if (!user_mode(regs) && !search_exception_tables(regs->ARM_pc))
                        goto no_context;
 +retry:
                down_read(&mm->mmap_sem);
        } else {
                /*
  #endif
        }
  
 -      fault = __do_page_fault(mm, addr, fsr, tsk);
 -      up_read(&mm->mmap_sem);
 +      fault = __do_page_fault(mm, addr, fsr, flags, tsk);
 +
 +      /* If we need to retry but a fatal signal is pending, handle the
 +       * signal first. We do not need to release the mmap_sem because
 +       * it would already be released in __lock_page_or_retry in
 +       * mm/filemap.c. */
 +      if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current))
 +              return 0;
 +
 +      /*
 +       * Major/minor page fault accounting is only done on the
 +       * initial attempt. If we go through a retry, it is extremely
 +       * likely that the page will be found in page cache at that point.
 +       */
  
        perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, addr);
 -      if (fault & VM_FAULT_MAJOR)
 -              perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, regs, addr);
 -      else if (fault & VM_FAULT_MINOR)
 -              perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1, regs, addr);
 +      if (flags & FAULT_FLAG_ALLOW_RETRY) {
 +              if (fault & VM_FAULT_MAJOR) {
 +                      tsk->maj_flt++;
 +                      perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1,
 +                                      regs, addr);
 +              } else {
 +                      tsk->min_flt++;
 +                      perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1,
 +                                      regs, addr);
 +              }
 +              if (fault & VM_FAULT_RETRY) {
 +                      /* Clear FAULT_FLAG_ALLOW_RETRY to avoid any risk
 +                      * of starvation. */
 +                      flags &= ~FAULT_FLAG_ALLOW_RETRY;
 +                      goto retry;
 +              }
 +      }
 +
 +      up_read(&mm->mmap_sem);
  
        /*
         * Handle the "normal" case first - VM_FAULT_MAJOR / VM_FAULT_MINOR
@@@ -461,6 -430,12 +450,12 @@@ do_translation_fault(unsigned long addr
        pmd = pmd_offset(pud, addr);
        pmd_k = pmd_offset(pud_k, addr);
  
+ #ifdef CONFIG_ARM_LPAE
+       /*
+        * Only one hardware entry per PMD with LPAE.
+        */
+       index = 0;
+ #else
        /*
         * On ARM one Linux PGD entry contains two hardware entries (see page
         * tables layout in pgtable.h). We normally guarantee that we always
         * for the first of pair.
         */
        index = (addr >> SECTION_SHIFT) & 1;
+ #endif
        if (pmd_none(pmd_k[index]))
                goto bad_area;
  
@@@ -509,55 -485,20 +505,20 @@@ do_bad(unsigned long addr, unsigned in
        return 1;
  }
  
- static struct fsr_info {
+ struct fsr_info {
        int     (*fn)(unsigned long addr, unsigned int fsr, struct pt_regs *regs);
        int     sig;
        int     code;
        const char *name;
- } fsr_info[] = {
-       /*
-        * The following are the standard ARMv3 and ARMv4 aborts.  ARMv5
-        * defines these to be "precise" aborts.
-        */
-       { do_bad,               SIGSEGV, 0,             "vector exception"                 },
-       { do_bad,               SIGBUS,  BUS_ADRALN,    "alignment exception"              },
-       { do_bad,               SIGKILL, 0,             "terminal exception"               },
-       { do_bad,               SIGBUS,  BUS_ADRALN,    "alignment exception"              },
-       { do_bad,               SIGBUS,  0,             "external abort on linefetch"      },
-       { do_translation_fault, SIGSEGV, SEGV_MAPERR,   "section translation fault"        },
-       { do_bad,               SIGBUS,  0,             "external abort on linefetch"      },
-       { do_page_fault,        SIGSEGV, SEGV_MAPERR,   "page translation fault"           },
-       { do_bad,               SIGBUS,  0,             "external abort on non-linefetch"  },
-       { do_bad,               SIGSEGV, SEGV_ACCERR,   "section domain fault"             },
-       { do_bad,               SIGBUS,  0,             "external abort on non-linefetch"  },
-       { do_bad,               SIGSEGV, SEGV_ACCERR,   "page domain fault"                },
-       { do_bad,               SIGBUS,  0,             "external abort on translation"    },
-       { do_sect_fault,        SIGSEGV, SEGV_ACCERR,   "section permission fault"         },
-       { do_bad,               SIGBUS,  0,             "external abort on translation"    },
-       { do_page_fault,        SIGSEGV, SEGV_ACCERR,   "page permission fault"            },
-       /*
-        * The following are "imprecise" aborts, which are signalled by bit
-        * 10 of the FSR, and may not be recoverable.  These are only
-        * supported if the CPU abort handler supports bit 10.
-        */
-       { do_bad,               SIGBUS,  0,             "unknown 16"                       },
-       { do_bad,               SIGBUS,  0,             "unknown 17"                       },
-       { do_bad,               SIGBUS,  0,             "unknown 18"                       },
-       { do_bad,               SIGBUS,  0,             "unknown 19"                       },
-       { do_bad,               SIGBUS,  0,             "lock abort"                       }, /* xscale */
-       { do_bad,               SIGBUS,  0,             "unknown 21"                       },
-       { do_bad,               SIGBUS,  BUS_OBJERR,    "imprecise external abort"         }, /* xscale */
-       { do_bad,               SIGBUS,  0,             "unknown 23"                       },
-       { do_bad,               SIGBUS,  0,             "dcache parity error"              }, /* xscale */
-       { do_bad,               SIGBUS,  0,             "unknown 25"                       },
-       { do_bad,               SIGBUS,  0,             "unknown 26"                       },
-       { do_bad,               SIGBUS,  0,             "unknown 27"                       },
-       { do_bad,               SIGBUS,  0,             "unknown 28"                       },
-       { do_bad,               SIGBUS,  0,             "unknown 29"                       },
-       { do_bad,               SIGBUS,  0,             "unknown 30"                       },
-       { do_bad,               SIGBUS,  0,             "unknown 31"                       }
  };
  
+ /* FSR definition */
+ #ifdef CONFIG_ARM_LPAE
+ #include "fsr-3level.c"
+ #else
+ #include "fsr-2level.c"
+ #endif
  void __init
  hook_fault_code(int nr, int (*fn)(unsigned long, unsigned int, struct pt_regs *),
                int sig, int code, const char *name)
@@@ -593,42 -534,6 +554,6 @@@ do_DataAbort(unsigned long addr, unsign
        arm_notify_die("", regs, &info, fsr, 0);
  }
  
- static struct fsr_info ifsr_info[] = {
-       { do_bad,               SIGBUS,  0,             "unknown 0"                        },
-       { do_bad,               SIGBUS,  0,             "unknown 1"                        },
-       { do_bad,               SIGBUS,  0,             "debug event"                      },
-       { do_bad,               SIGSEGV, SEGV_ACCERR,   "section access flag fault"        },
-       { do_bad,               SIGBUS,  0,             "unknown 4"                        },
-       { do_translation_fault, SIGSEGV, SEGV_MAPERR,   "section translation fault"        },
-       { do_bad,               SIGSEGV, SEGV_ACCERR,   "page access flag fault"           },
-       { do_page_fault,        SIGSEGV, SEGV_MAPERR,   "page translation fault"           },
-       { do_bad,               SIGBUS,  0,             "external abort on non-linefetch"  },
-       { do_bad,               SIGSEGV, SEGV_ACCERR,   "section domain fault"             },
-       { do_bad,               SIGBUS,  0,             "unknown 10"                       },
-       { do_bad,               SIGSEGV, SEGV_ACCERR,   "page domain fault"                },
-       { do_bad,               SIGBUS,  0,             "external abort on translation"    },
-       { do_sect_fault,        SIGSEGV, SEGV_ACCERR,   "section permission fault"         },
-       { do_bad,               SIGBUS,  0,             "external abort on translation"    },
-       { do_page_fault,        SIGSEGV, SEGV_ACCERR,   "page permission fault"            },
-       { do_bad,               SIGBUS,  0,             "unknown 16"                       },
-       { do_bad,               SIGBUS,  0,             "unknown 17"                       },
-       { do_bad,               SIGBUS,  0,             "unknown 18"                       },
-       { do_bad,               SIGBUS,  0,             "unknown 19"                       },
-       { do_bad,               SIGBUS,  0,             "unknown 20"                       },
-       { do_bad,               SIGBUS,  0,             "unknown 21"                       },
-       { do_bad,               SIGBUS,  0,             "unknown 22"                       },
-       { do_bad,               SIGBUS,  0,             "unknown 23"                       },
-       { do_bad,               SIGBUS,  0,             "unknown 24"                       },
-       { do_bad,               SIGBUS,  0,             "unknown 25"                       },
-       { do_bad,               SIGBUS,  0,             "unknown 26"                       },
-       { do_bad,               SIGBUS,  0,             "unknown 27"                       },
-       { do_bad,               SIGBUS,  0,             "unknown 28"                       },
-       { do_bad,               SIGBUS,  0,             "unknown 29"                       },
-       { do_bad,               SIGBUS,  0,             "unknown 30"                       },
-       { do_bad,               SIGBUS,  0,             "unknown 31"                       },
- };
  void __init
  hook_ifault_code(int nr, int (*fn)(unsigned long, unsigned int, struct pt_regs *),
                 int sig, int code, const char *name)
@@@ -661,6 -566,7 +586,7 @@@ do_PrefetchAbort(unsigned long addr, un
        arm_notify_die("", regs, &info, ifsr, 0);
  }
  
+ #ifndef CONFIG_ARM_LPAE
  static int __init exceptions_init(void)
  {
        if (cpu_architecture() >= CPU_ARCH_ARMv6) {
  }
  
  arch_initcall(exceptions_init);
+ #endif
diff --combined arch/arm/mm/proc-v7.S
index 69a98a4204a5b3374d29152332dac6055cb6a759,7efa2a721d5dd9dbc0853eab8b9c8980c47c5e17..7e9b5bf910c199cba4fc2fce9bead46e91d470b8
  
  #include "proc-macros.S"
  
- #define TTB_S         (1 << 1)
- #define TTB_RGN_NC    (0 << 3)
- #define TTB_RGN_OC_WBWA       (1 << 3)
- #define TTB_RGN_OC_WT (2 << 3)
- #define TTB_RGN_OC_WB (3 << 3)
- #define TTB_NOS               (1 << 5)
- #define TTB_IRGN_NC   ((0 << 0) | (0 << 6))
- #define TTB_IRGN_WBWA ((0 << 0) | (1 << 6))
- #define TTB_IRGN_WT   ((1 << 0) | (0 << 6))
- #define TTB_IRGN_WB   ((1 << 0) | (1 << 6))
- /* PTWs cacheable, inner WB not shareable, outer WB not shareable */
- #define TTB_FLAGS_UP  TTB_IRGN_WB|TTB_RGN_OC_WB
- #define PMD_FLAGS_UP  PMD_SECT_WB
- /* PTWs cacheable, inner WBWA shareable, outer WBWA not shareable */
- #define TTB_FLAGS_SMP TTB_IRGN_WBWA|TTB_S|TTB_NOS|TTB_RGN_OC_WBWA
- #define PMD_FLAGS_SMP PMD_SECT_WBWA|PMD_SECT_S
+ #ifdef CONFIG_ARM_LPAE
+ #include "proc-v7-3level.S"
+ #else
+ #include "proc-v7-2level.S"
+ #endif
  
  ENTRY(cpu_v7_proc_init)
        mov     pc, lr
@@@ -63,6 -50,7 +50,7 @@@ ENDPROC(cpu_v7_proc_fin
   *      caches disabled.
   */
        .align  5
+       .pushsection    .idmap.text, "ax"
  ENTRY(cpu_v7_reset)
        mrc     p15, 0, r1, c1, c0, 0           @ ctrl register
        bic     r1, r1, #0x1                    @ ...............m
@@@ -71,6 -59,7 +59,7 @@@
        isb
        mov     pc, r0
  ENDPROC(cpu_v7_reset)
+       .popsection
  
  /*
   *    cpu_v7_do_idle()
@@@ -97,127 -86,12 +86,12 @@@ ENTRY(cpu_v7_dcache_clean_area
        mov     pc, lr
  ENDPROC(cpu_v7_dcache_clean_area)
  
- /*
-  *    cpu_v7_switch_mm(pgd_phys, tsk)
-  *
-  *    Set the translation table base pointer to be pgd_phys
-  *
-  *    - pgd_phys - physical address of new TTB
-  *
-  *    It is assumed that:
-  *    - we are not using split page tables
-  */
- ENTRY(cpu_v7_switch_mm)
- #ifdef CONFIG_MMU
-       mov     r2, #0
-       ldr     r1, [r1, #MM_CONTEXT_ID]        @ get mm->context.id
-       ALT_SMP(orr     r0, r0, #TTB_FLAGS_SMP)
-       ALT_UP(orr      r0, r0, #TTB_FLAGS_UP)
- #ifdef CONFIG_ARM_ERRATA_430973
-       mcr     p15, 0, r2, c7, c5, 6           @ flush BTAC/BTB
- #endif
- #ifdef CONFIG_ARM_ERRATA_754322
-       dsb
- #endif
-       mcr     p15, 0, r2, c13, c0, 1          @ set reserved context ID
-       isb
- 1:    mcr     p15, 0, r0, c2, c0, 0           @ set TTB 0
-       isb
- #ifdef CONFIG_ARM_ERRATA_754322
-       dsb
- #endif
-       mcr     p15, 0, r1, c13, c0, 1          @ set context ID
-       isb
- #endif
-       mov     pc, lr
- ENDPROC(cpu_v7_switch_mm)
- /*
-  *    cpu_v7_set_pte_ext(ptep, pte)
-  *
-  *    Set a level 2 translation table entry.
-  *
-  *    - ptep  - pointer to level 2 translation table entry
-  *              (hardware version is stored at +2048 bytes)
-  *    - pte   - PTE value to store
-  *    - ext   - value for extended PTE bits
-  */
- ENTRY(cpu_v7_set_pte_ext)
- #ifdef CONFIG_MMU
-       str     r1, [r0]                        @ linux version
-       bic     r3, r1, #0x000003f0
-       bic     r3, r3, #PTE_TYPE_MASK
-       orr     r3, r3, r2
-       orr     r3, r3, #PTE_EXT_AP0 | 2
-       tst     r1, #1 << 4
-       orrne   r3, r3, #PTE_EXT_TEX(1)
-       eor     r1, r1, #L_PTE_DIRTY
-       tst     r1, #L_PTE_RDONLY | L_PTE_DIRTY
-       orrne   r3, r3, #PTE_EXT_APX
-       tst     r1, #L_PTE_USER
-       orrne   r3, r3, #PTE_EXT_AP1
- #ifdef CONFIG_CPU_USE_DOMAINS
-       @ allow kernel read/write access to read-only user pages
-       tstne   r3, #PTE_EXT_APX
-       bicne   r3, r3, #PTE_EXT_APX | PTE_EXT_AP0
- #endif
-       tst     r1, #L_PTE_XN
-       orrne   r3, r3, #PTE_EXT_XN
-       tst     r1, #L_PTE_YOUNG
-       tstne   r1, #L_PTE_PRESENT
-       moveq   r3, #0
-  ARM( str     r3, [r0, #2048]! )
-  THUMB(       add     r0, r0, #2048 )
-  THUMB(       str     r3, [r0] )
-       mcr     p15, 0, r0, c7, c10, 1          @ flush_pte
- #endif
-       mov     pc, lr
- ENDPROC(cpu_v7_set_pte_ext)
        string  cpu_v7_name, "ARMv7 Processor"
        .align
  
-       /*
-        * Memory region attributes with SCTLR.TRE=1
-        *
-        *   n = TEX[0],C,B
-        *   TR = PRRR[2n+1:2n]         - memory type
-        *   IR = NMRR[2n+1:2n]         - inner cacheable property
-        *   OR = NMRR[2n+17:2n+16]     - outer cacheable property
-        *
-        *                      n       TR      IR      OR
-        *   UNCACHED           000     00
-        *   BUFFERABLE         001     10      00      00
-        *   WRITETHROUGH       010     10      10      10
-        *   WRITEBACK          011     10      11      11
-        *   reserved           110
-        *   WRITEALLOC         111     10      01      01
-        *   DEV_SHARED         100     01
-        *   DEV_NONSHARED      100     01
-        *   DEV_WC             001     10
-        *   DEV_CACHED         011     10
-        *
-        * Other attributes:
-        *
-        *   DS0 = PRRR[16] = 0         - device shareable property
-        *   DS1 = PRRR[17] = 1         - device shareable property
-        *   NS0 = PRRR[18] = 0         - normal shareable property
-        *   NS1 = PRRR[19] = 1         - normal shareable property
-        *   NOS = PRRR[24+n] = 1       - not outer shareable
-        */
- .equ  PRRR,   0xff0a81a8
- .equ  NMRR,   0x40e040e0
  /* Suspend/resume support: derived from arch/arm/mach-s5pv210/sleep.S */
  .globl        cpu_v7_suspend_size
- .equ  cpu_v7_suspend_size, 4 * 7
+ .equ  cpu_v7_suspend_size, 4 * 8
  #ifdef CONFIG_ARM_CPU_SUSPEND
  ENTRY(cpu_v7_do_suspend)
        stmfd   sp!, {r4 - r10, lr}
        stmia   r0!, {r4 - r5}
        mrc     p15, 0, r6, c3, c0, 0   @ Domain ID
        mrc     p15, 0, r7, c2, c0, 1   @ TTB 1
+       mrc     p15, 0, r11, c2, c0, 2  @ TTB control register
        mrc     p15, 0, r8, c1, c0, 0   @ Control register
        mrc     p15, 0, r9, c1, c0, 1   @ Auxiliary control register
        mrc     p15, 0, r10, c1, c0, 2  @ Co-processor access control
-       stmia   r0, {r6 - r10}
+       stmia   r0, {r6 - r11}
        ldmfd   sp!, {r4 - r10, pc}
  ENDPROC(cpu_v7_do_suspend)
  
@@@ -241,13 -116,15 +116,15 @@@ ENTRY(cpu_v7_do_resume
        ldmia   r0!, {r4 - r5}
        mcr     p15, 0, r4, c13, c0, 0  @ FCSE/PID
        mcr     p15, 0, r5, c13, c0, 3  @ User r/o thread ID
-       ldmia   r0, {r6 - r10}
+       ldmia   r0, {r6 - r11}
        mcr     p15, 0, r6, c3, c0, 0   @ Domain ID
+ #ifndef CONFIG_ARM_LPAE
        ALT_SMP(orr     r1, r1, #TTB_FLAGS_SMP)
        ALT_UP(orr      r1, r1, #TTB_FLAGS_UP)
+ #endif
        mcr     p15, 0, r1, c2, c0, 0   @ TTB 0
        mcr     p15, 0, r7, c2, c0, 1   @ TTB 1
-       mcr     p15, 0, ip, c2, c0, 2   @ TTB control register
+       mcr     p15, 0, r11, c2, c0, 2  @ TTB control register
        mrc     p15, 0, r4, c1, c0, 1   @ Read Auxiliary control register
        teq     r4, r9                  @ Is it already set?
        mcrne   p15, 0, r9, c1, c0, 1   @ No, so write it
@@@ -284,7 -161,6 +161,7 @@@ __v7_ca5mp_setup
  __v7_ca9mp_setup:
        mov     r10, #(1 << 0)                  @ TLB ops broadcasting
        b       1f
 +__v7_ca7mp_setup:
  __v7_ca15mp_setup:
        mov     r10, #0
  1:
@@@ -364,13 -240,11 +241,13 @@@ __v7_setup
        orreq   r10, r10, #1 << 6               @ set bit #6
        mcreq   p15, 0, r10, c15, c0, 1         @ write diagnostic register
  #endif
 -#ifdef CONFIG_ARM_ERRATA_751472
 -      cmp     r6, #0x30                       @ present prior to r3p0
 +#if defined(CONFIG_ARM_ERRATA_751472) && defined(CONFIG_SMP)
 +      ALT_SMP(cmp r6, #0x30)                  @ present prior to r3p0
 +      ALT_UP_B(1f)
        mrclt   p15, 0, r10, c15, c0, 1         @ read diagnostic register
        orrlt   r10, r10, #1 << 11              @ set bit #11
        mcrlt   p15, 0, r10, c15, c0, 1         @ write diagnostic register
 +1:
  #endif
  
  3:    mov     r10, #0
        dsb
  #ifdef CONFIG_MMU
        mcr     p15, 0, r10, c8, c7, 0          @ invalidate I + D TLBs
-       mcr     p15, 0, r10, c2, c0, 2          @ TTB control register
-       ALT_SMP(orr     r4, r4, #TTB_FLAGS_SMP)
-       ALT_UP(orr      r4, r4, #TTB_FLAGS_UP)
-       ALT_SMP(orr     r8, r8, #TTB_FLAGS_SMP)
-       ALT_UP(orr      r8, r8, #TTB_FLAGS_UP)
-       mcr     p15, 0, r8, c2, c0, 1           @ load TTB1
+       v7_ttb_setup r10, r4, r8, r5            @ TTBCR, TTBRx setup
        ldr     r5, =PRRR                       @ PRRR
        ldr     r6, =NMRR                       @ NMRR
        mcr     p15, 0, r5, c10, c2, 0          @ write PRRR
        mov     pc, lr                          @ return to head.S:__ret
  ENDPROC(__v7_setup)
  
-       /*   AT
-        *  TFR   EV X F   I D LR    S
-        * .EEE ..EE PUI. .T.T 4RVI ZWRS BLDP WCAM
-        * rxxx rrxx xxx0 0101 xxxx xxxx x111 xxxx < forced
-        *    1    0 110       0011 1100 .111 1101 < we want
-        */
-       .type   v7_crval, #object
- v7_crval:
-       crval   clear=0x0120c302, mmuset=0x10c03c7d, ucset=0x00c01c7c
+       .align  2
  __v7_setup_stack:
        .space  4 * 11                          @ 11 registers
  
         */
  .macro __v7_proc initfunc, mm_mmuflags = 0, io_mmuflags = 0, hwcaps = 0
        ALT_SMP(.long   PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \
-                       PMD_FLAGS_SMP | \mm_mmuflags)
+                       PMD_SECT_AF | PMD_FLAGS_SMP | \mm_mmuflags)
        ALT_UP(.long    PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \
-                       PMD_FLAGS_UP | \mm_mmuflags)
-       .long   PMD_TYPE_SECT | PMD_SECT_XN | PMD_SECT_AP_WRITE | \
-               PMD_SECT_AP_READ | \io_mmuflags
+                       PMD_SECT_AF | PMD_FLAGS_UP | \mm_mmuflags)
+       .long   PMD_TYPE_SECT | PMD_SECT_AP_WRITE | \
+               PMD_SECT_AP_READ | PMD_SECT_AF | \io_mmuflags
        W(b)    \initfunc
        .long   cpu_arch_name
        .long   cpu_elf_name
        .long   v7_cache_fns
  .endm
  
+ #ifndef CONFIG_ARM_LPAE
        /*
         * ARM Ltd. Cortex A5 processor.
         */
@@@ -465,16 -326,6 +329,16 @@@ __v7_ca5mp_proc_info
        __v7_proc __v7_ca5mp_setup
        .size   __v7_ca5mp_proc_info, . - __v7_ca5mp_proc_info
  
 +      /*
 +       * ARM Ltd. Cortex A7 processor.
 +       */
 +      .type   __v7_ca7mp_proc_info, #object
 +__v7_ca7mp_proc_info:
 +      .long   0x410fc070
 +      .long   0xff0ffff0
 +      __v7_proc __v7_ca7mp_setup, hwcaps = HWCAP_IDIV
 +      .size   __v7_ca7mp_proc_info, . - __v7_ca7mp_proc_info
 +
        /*
         * ARM Ltd. Cortex A9 processor.
         */
@@@ -484,6 -335,7 +348,7 @@@ __v7_ca9mp_proc_info
        .long   0xff0ffff0
        __v7_proc __v7_ca9mp_setup
        .size   __v7_ca9mp_proc_info, . - __v7_ca9mp_proc_info
+ #endif        /* CONFIG_ARM_LPAE */
  
        /*
         * ARM Ltd. Cortex A15 processor.
diff --combined mm/vmalloc.c
index 27be2f0d4cb707b4c817175a4c4452e915fc1aa4,e583f770dfee5228e0e6a71b4bef574e8d88c552..21fdf46ad5aac727111834d0955af07472daaec2
@@@ -1117,6 -1117,32 +1117,32 @@@ void *vm_map_ram(struct page **pages, u
  }
  EXPORT_SYMBOL(vm_map_ram);
  
+ /**
+  * vm_area_add_early - add vmap area early during boot
+  * @vm: vm_struct to add
+  *
+  * This function is used to add fixed kernel vm area to vmlist before
+  * vmalloc_init() is called.  @vm->addr, @vm->size, and @vm->flags
+  * should contain proper values and the other fields should be zero.
+  *
+  * DO NOT USE THIS FUNCTION UNLESS YOU KNOW WHAT YOU'RE DOING.
+  */
+ void __init vm_area_add_early(struct vm_struct *vm)
+ {
+       struct vm_struct *tmp, **p;
+       BUG_ON(vmap_initialized);
+       for (p = &vmlist; (tmp = *p) != NULL; p = &tmp->next) {
+               if (tmp->addr >= vm->addr) {
+                       BUG_ON(tmp->addr < vm->addr + vm->size);
+                       break;
+               } else
+                       BUG_ON(tmp->addr + tmp->size > vm->addr);
+       }
+       vm->next = *p;
+       *p = vm;
+ }
  /**
   * vm_area_register_early - register vmap area early during boot
   * @vm: vm_struct to register
@@@ -1139,8 -1165,7 +1165,7 @@@ void __init vm_area_register_early(stru
  
        vm->addr = (void *)addr;
  
-       vm->next = vmlist;
-       vmlist = vm;
+       vm_area_add_early(vm);
  }
  
  void __init vmalloc_init(void)
@@@ -1290,7 -1315,7 +1315,7 @@@ static struct vm_struct *__get_vm_area_
                unsigned long align, unsigned long flags, unsigned long start,
                unsigned long end, int node, gfp_t gfp_mask, void *caller)
  {
 -      static struct vmap_area *va;
 +      struct vmap_area *va;
        struct vm_struct *area;
  
        BUG_ON(in_interrupt());
@@@ -1633,8 -1658,6 +1658,8 @@@ void *__vmalloc_node_range(unsigned lon
                goto fail;
  
        addr = __vmalloc_area_node(area, gfp_mask, prot, node, caller);
 +      if (!addr)
 +              return NULL;
  
        /*
         * In this function, newly allocated vm_struct is not added
This page took 0.142589 seconds and 4 git commands to generate.