Merge tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64...
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 31 Mar 2014 22:01:45 +0000 (15:01 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 31 Mar 2014 22:01:45 +0000 (15:01 -0700)
Pull ARM64 updates from Catalin Marinas:
 - KGDB support for arm64
 - PCI I/O space extended to 16M (in preparation of PCIe support
   patches)
 - Dropping ZONE_DMA32 in favour of ZONE_DMA (we only need one for the
   time being), together with swiotlb late initialisation to correctly
   setup the bounce buffer
 - DMA API cache maintenance support (not all ARMv8 platforms have
   hardware cache coherency)
 - Crypto extensions advertising via ELF_HWCAP2 for compat user space
 - Perf support for dwarf unwinding in compat mode
 - asm/tlb.h converted to the generic mmu_gather code
 - asm-generic rwsem implementation
 - Code clean-up

* tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux: (42 commits)
  arm64: Remove pgprot_dmacoherent()
  arm64: Support DMA_ATTR_WRITE_COMBINE
  arm64: Implement custom mmap functions for dma mapping
  arm64: Fix __range_ok macro
  arm64: Fix duplicated Kconfig entries
  arm64: mm: Route pmd thp functions through pte equivalents
  arm64: rwsem: use asm-generic rwsem implementation
  asm-generic: rwsem: de-PPCify rwsem.h
  arm64: enable generic CPU feature modalias matching for this architecture
  arm64: smp: make local symbol static
  arm64: debug: make local symbols static
  ARM64: perf: support dwarf unwinding in compat mode
  ARM64: perf: add support for frame pointer unwinding in compat mode
  ARM64: perf: add support for perf registers API
  arm64: Add boot time configuration of Intermediate Physical Address size
  arm64: Do not synchronise I and D caches for special ptes
  arm64: Make DMA coherent and strongly ordered mappings not executable
  arm64: barriers: add dmb barrier
  arm64: topology: Implement basic CPU topology support
  arm64: advertise ARMv8 extensions to 32-bit compat ELF binaries
  ...

1  2 
arch/arm64/include/asm/Kbuild
arch/arm64/include/asm/pgtable.h
arch/arm64/kernel/process.c

index 3bdfdda70567b0ab1a630d23020591fc91a758f9,41cde70943fb0cf31477c1ce17dad5de96837d5c..4bca4923fc0b7eef27e37532358fe7eb48aa1224
@@@ -12,7 -12,6 +12,7 @@@ generic-y += dma.
  generic-y += emergency-restart.h
  generic-y += errno.h
  generic-y += ftrace.h
 +generic-y += hash.h
  generic-y += hw_irq.h
  generic-y += ioctl.h
  generic-y += ioctls.h
@@@ -23,15 -22,14 +23,16 @@@ generic-y += kmap_types.
  generic-y += kvm_para.h
  generic-y += local.h
  generic-y += local64.h
 +generic-y += mcs_spinlock.h
  generic-y += mman.h
  generic-y += msgbuf.h
  generic-y += mutex.h
  generic-y += pci.h
  generic-y += poll.h
  generic-y += posix_types.h
 +generic-y += preempt.h
  generic-y += resource.h
+ generic-y += rwsem.h
  generic-y += scatterlist.h
  generic-y += sections.h
  generic-y += segment.h
@@@ -41,8 -39,8 +42,8 @@@ generic-y += shmbuf.
  generic-y += sizes.h
  generic-y += socket.h
  generic-y += sockios.h
 -generic-y += switch_to.h
  generic-y += swab.h
 +generic-y += switch_to.h
  generic-y += termbits.h
  generic-y += termios.h
  generic-y += topology.h
@@@ -52,3 -50,5 +53,3 @@@ generic-y += unaligned.
  generic-y += user.h
  generic-y += vga.h
  generic-y += xor.h
 -generic-y += preempt.h
 -generic-y += hash.h
index aa3917c8b62318aef9424735d560be305f3465d3,da92265bd79848ba07a229993e136c8e492670b7..90c811f05a2e3279a8709211a770725141491dd7
@@@ -136,11 -136,11 +136,11 @@@ extern struct page *empty_zero_page
  /*
   * The following only work if pte_present(). Undefined behaviour otherwise.
   */
 -#define pte_present(pte)      (pte_val(pte) & (PTE_VALID | PTE_PROT_NONE))
 -#define pte_dirty(pte)                (pte_val(pte) & PTE_DIRTY)
 -#define pte_young(pte)                (pte_val(pte) & PTE_AF)
 -#define pte_special(pte)      (pte_val(pte) & PTE_SPECIAL)
 -#define pte_write(pte)                (pte_val(pte) & PTE_WRITE)
 +#define pte_present(pte)      (!!(pte_val(pte) & (PTE_VALID | PTE_PROT_NONE)))
 +#define pte_dirty(pte)                (!!(pte_val(pte) & PTE_DIRTY))
 +#define pte_young(pte)                (!!(pte_val(pte) & PTE_AF))
 +#define pte_special(pte)      (!!(pte_val(pte) & PTE_SPECIAL))
 +#define pte_write(pte)                (!!(pte_val(pte) & PTE_WRITE))
  #define pte_exec(pte)         (!(pte_val(pte) & PTE_UXN))
  
  #define pte_valid_user(pte) \
@@@ -199,7 -199,7 +199,7 @@@ static inline void set_pte_at(struct mm
                              pte_t *ptep, pte_t pte)
  {
        if (pte_valid_user(pte)) {
-               if (pte_exec(pte))
+               if (!pte_special(pte) && pte_exec(pte))
                        __sync_icache_dcache(pte, addr);
                if (pte_dirty(pte) && pte_write(pte))
                        pte_val(pte) &= ~PTE_RDONLY;
  
  #define __HAVE_ARCH_PTE_SPECIAL
  
- /*
-  * Software PMD bits for THP
-  */
+ static inline pte_t pmd_pte(pmd_t pmd)
+ {
+       return __pte(pmd_val(pmd));
+ }
  
- #define PMD_SECT_DIRTY                (_AT(pmdval_t, 1) << 55)
- #define PMD_SECT_SPLITTING    (_AT(pmdval_t, 1) << 57)
+ static inline pmd_t pte_pmd(pte_t pte)
+ {
+       return __pmd(pte_val(pte));
+ }
  
  /*
   * THP definitions.
   */
- #define pmd_young(pmd)                (pmd_val(pmd) & PMD_SECT_AF)
- #define __HAVE_ARCH_PMD_WRITE
- #define pmd_write(pmd)                (!(pmd_val(pmd) & PMD_SECT_RDONLY))
  
  #ifdef CONFIG_TRANSPARENT_HUGEPAGE
  #define pmd_trans_huge(pmd)   (pmd_val(pmd) && !(pmd_val(pmd) & PMD_TABLE_BIT))
- #define pmd_trans_splitting(pmd) (pmd_val(pmd) & PMD_SECT_SPLITTING)
+ #define pmd_trans_splitting(pmd)      pte_special(pmd_pte(pmd))
  #endif
  
- #define PMD_BIT_FUNC(fn,op) \
- static inline pmd_t pmd_##fn(pmd_t pmd) { pmd_val(pmd) op; return pmd; }
+ #define pmd_young(pmd)                pte_young(pmd_pte(pmd))
+ #define pmd_wrprotect(pmd)    pte_pmd(pte_wrprotect(pmd_pte(pmd)))
+ #define pmd_mksplitting(pmd)  pte_pmd(pte_mkspecial(pmd_pte(pmd)))
+ #define pmd_mkold(pmd)                pte_pmd(pte_mkold(pmd_pte(pmd)))
+ #define pmd_mkwrite(pmd)      pte_pmd(pte_mkwrite(pmd_pte(pmd)))
+ #define pmd_mkdirty(pmd)      pte_pmd(pte_mkdirty(pmd_pte(pmd)))
+ #define pmd_mkyoung(pmd)      pte_pmd(pte_mkyoung(pmd_pte(pmd)))
+ #define pmd_mknotpresent(pmd) (__pmd(pmd_val(pmd) &= ~PMD_TYPE_MASK))
  
- PMD_BIT_FUNC(wrprotect,       |= PMD_SECT_RDONLY);
- PMD_BIT_FUNC(mkold,   &= ~PMD_SECT_AF);
- PMD_BIT_FUNC(mksplitting, |= PMD_SECT_SPLITTING);
- PMD_BIT_FUNC(mkwrite,   &= ~PMD_SECT_RDONLY);
- PMD_BIT_FUNC(mkdirty,   |= PMD_SECT_DIRTY);
- PMD_BIT_FUNC(mkyoung,   |= PMD_SECT_AF);
- PMD_BIT_FUNC(mknotpresent, &= ~PMD_TYPE_MASK);
+ #define __HAVE_ARCH_PMD_WRITE
+ #define pmd_write(pmd)                pte_write(pmd_pte(pmd))
  
  #define pmd_mkhuge(pmd)               (__pmd(pmd_val(pmd) & ~PMD_TABLE_BIT))
  
  
  #define pmd_page(pmd)           pfn_to_page(__phys_to_pfn(pmd_val(pmd) & PHYS_MASK))
  
- static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot)
- {
-       const pmdval_t mask = PMD_SECT_USER | PMD_SECT_PXN | PMD_SECT_UXN |
-                             PMD_SECT_RDONLY | PMD_SECT_PROT_NONE |
-                             PMD_SECT_VALID;
-       pmd_val(pmd) = (pmd_val(pmd) & ~mask) | (pgprot_val(newprot) & mask);
-       return pmd;
- }
  #define set_pmd_at(mm, addr, pmdp, pmd)       set_pmd(pmdp, pmd)
  
  static inline int has_transparent_hugepage(void)
   * Mark the prot value as uncacheable and unbufferable.
   */
  #define pgprot_noncached(prot) \
-       __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_DEVICE_nGnRnE))
+       __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_DEVICE_nGnRnE) | PTE_PXN | PTE_UXN)
  #define pgprot_writecombine(prot) \
-       __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC))
- #define pgprot_dmacoherent(prot) \
-       __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC))
+       __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC) | PTE_PXN | PTE_UXN)
  #define __HAVE_PHYS_MEM_ACCESS_PROT
  struct file;
  extern pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
@@@ -383,6 -372,11 +372,11 @@@ static inline pte_t pte_modify(pte_t pt
        return pte;
  }
  
+ static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot)
+ {
+       return pte_pmd(pte_modify(pmd_pte(pmd), newprot));
+ }
  extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
  extern pgd_t idmap_pg_dir[PTRS_PER_PGD];
  
index 9cce0098f4cde62139029ce954db7e4004e839ce,fa6b5bba15f6248c8b83f765cab516faf3775d37..6391485f342daaac57e207f129a62e28d169b114
@@@ -33,6 -33,7 +33,6 @@@
  #include <linux/kallsyms.h>
  #include <linux/init.h>
  #include <linux/cpu.h>
 -#include <linux/cpuidle.h>
  #include <linux/elfcore.h>
  #include <linux/pm.h>
  #include <linux/tick.h>
@@@ -71,8 -72,17 +71,17 @@@ static void setup_restart(void
  
  void soft_restart(unsigned long addr)
  {
+       typedef void (*phys_reset_t)(unsigned long);
+       phys_reset_t phys_reset;
        setup_restart();
-       cpu_reset(addr);
+       /* Switch to the identity mapping */
+       phys_reset = (phys_reset_t)virt_to_phys(cpu_reset);
+       phys_reset(addr);
+       /* Should never get here */
+       BUG();
  }
  
  /*
@@@ -93,8 -103,10 +102,8 @@@ void arch_cpu_idle(void
         * This should do all the clock switching and wait for interrupt
         * tricks
         */
 -      if (cpuidle_idle_call()) {
 -              cpu_do_idle();
 -              local_irq_enable();
 -      }
 +      cpu_do_idle();
 +      local_irq_enable();
  }
  
  #ifdef CONFIG_HOTPLUG_CPU