]> git.ipfire.org Git - people/arne_f/kernel.git/commitdiff
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/scottwood/linux.git
authorMichael Ellerman <mpe@ellerman.id.au>
Fri, 3 Oct 2014 22:59:06 +0000 (08:59 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 3 Oct 2014 22:59:06 +0000 (08:59 +1000)
Freescale updates from Scott (27 commits):

  "Highlights include DMA32 zone support (SATA, USB, etc now works on 64-bit
   FSL kernels), MSI changes, 8xx optimizations and cleanup, t104x board
   support, and PrPMC PCI enumeration."

1  2 
arch/powerpc/Kconfig
arch/powerpc/configs/corenet64_smp_defconfig
arch/powerpc/include/asm/reg.h
arch/powerpc/kernel/dma.c
arch/powerpc/mm/mem.c
arch/powerpc/mm/numa.c

diff --combined arch/powerpc/Kconfig
index 56da47247fcc3cb13df2b3ea44d89a0fac989217,d003409b5f9856185bee9e377116e8c9b1bb7b6c..98ae8b714d316cb43c1bb46fa137b092fd53108d
@@@ -111,7 -111,6 +111,7 @@@ config PP
        select HAVE_DMA_API_DEBUG
        select HAVE_OPROFILE
        select HAVE_DEBUG_KMEMLEAK
 +      select ARCH_HAS_SG_CHAIN
        select GENERIC_ATOMIC64 if PPC32
        select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
        select HAVE_PERF_EVENTS
        select HAVE_IRQ_EXIT_ON_IRQ_STACK
        select ARCH_USE_CMPXCHG_LOCKREF if PPC64
        select HAVE_ARCH_AUDITSYSCALL
 +      select ARCH_SUPPORTS_ATOMIC_RMW
 +      select DCACHE_WORD_ACCESS if PPC64 && CPU_LITTLE_ENDIAN
  
  config GENERIC_CSUM
        def_bool CPU_LITTLE_ENDIAN
@@@ -183,7 -180,7 +183,7 @@@ config SCHED_OMIT_FRAME_POINTE
  
  config ARCH_MAY_HAVE_PC_FDC
        bool
 -      default !PPC_PSERIES || PCI
 +      default PCI
  
  config PPC_OF
        def_bool y
@@@ -288,6 -285,10 +288,10 @@@ config PPC_EMULATE_SSTE
        bool
        default y if KPROBES || UPROBES || XMON || HAVE_HW_BREAKPOINT
  
+ config ZONE_DMA32
+       bool
+       default y if PPC64
  source "init/Kconfig"
  
  source "kernel/Kconfig.freezer"
@@@ -417,7 -418,7 +421,7 @@@ config KEXE
  config CRASH_DUMP
        bool "Build a kdump crash kernel"
        depends on PPC64 || 6xx || FSL_BOOKE || (44x && !SMP)
 -      select RELOCATABLE if PPC64 || 44x || FSL_BOOKE
 +      select RELOCATABLE if (PPC64 && !COMPILE_TEST) || 44x || FSL_BOOKE
        help
          Build a kernel suitable for use as a kdump capture kernel.
          The same kernel binary can be used as production kernel and dump
@@@ -1020,7 -1021,6 +1024,7 @@@ endmen
  if PPC64
  config RELOCATABLE
        bool "Build a relocatable kernel"
 +      depends on !COMPILE_TEST
        select NONSTATIC_KERNEL
        help
          This builds a kernel image that is capable of running anywhere
index 269d6e47c67d2a998272f27545ec238766c68dc8,2eb27046434e7c3499656e4e2026cc1e8230d217..6db97e4414b2eabaa92b82af533f7facd646e675
@@@ -4,7 -4,6 +4,7 @@@ CONFIG_ALTIVEC=
  CONFIG_SMP=y
  CONFIG_NR_CPUS=24
  CONFIG_SYSVIPC=y
 +CONFIG_FHANDLE=y
  CONFIG_IRQ_DOMAIN_DEBUG=y
  CONFIG_NO_HZ=y
  CONFIG_HIGH_RES_TIMERS=y
@@@ -50,7 -49,6 +50,6 @@@ CONFIG_NET_IPIP=
  CONFIG_IP_MROUTE=y
  CONFIG_IP_PIMSM_V1=y
  CONFIG_IP_PIMSM_V2=y
- CONFIG_ARPD=y
  CONFIG_INET_ESP=y
  # CONFIG_INET_XFRM_MODE_BEET is not set
  # CONFIG_INET_LRO is not set
@@@ -60,33 -58,17 +59,17 @@@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplu
  CONFIG_DEVTMPFS=y
  CONFIG_DEVTMPFS_MOUNT=y
  CONFIG_MTD=y
- CONFIG_MTD_OF_PARTS=y
  CONFIG_MTD_CMDLINE_PARTS=y
- CONFIG_MTD_CHAR=y
- CONFIG_MTD_BLKDEVS=y
  CONFIG_MTD_BLOCK=y
  CONFIG_FTL=y
  CONFIG_MTD_CFI=y
- CONFIG_MTD_GEN_PROBE=y
- CONFIG_MTD_MAP_BANK_WIDTH_1=y
- CONFIG_MTD_MAP_BANK_WIDTH_2=y
- CONFIG_MTD_MAP_BANK_WIDTH_4=y
- CONFIG_MTD_CFI_I1=y
- CONFIG_MTD_CFI_I2=y
  CONFIG_MTD_CFI_INTELEXT=y
  CONFIG_MTD_CFI_AMDSTD=y
  CONFIG_MTD_PHYSMAP_OF=y
- CONFIG_MTD_M25P80=y
- CONFIG_MTD_CFI_UTIL=y
- CONFIG_MTD_NAND_ECC=y
  CONFIG_MTD_NAND=y
- CONFIG_MTD_NAND_IDS=y
  CONFIG_MTD_NAND_FSL_ELBC=y
  CONFIG_MTD_NAND_FSL_IFC=y
  CONFIG_MTD_UBI=y
- CONFIG_MTD_UBI_WL_THRESHOLD=4096
- CONFIG_MTD_UBI_BEB_RESERVE=1
- CONFIG_PROC_DEVICETREE=y
  CONFIG_BLK_DEV_LOOP=y
  CONFIG_BLK_DEV_RAM=y
  CONFIG_BLK_DEV_RAM_SIZE=131072
@@@ -102,6 -84,7 +85,7 @@@ CONFIG_INPUT_FF_MEMLESS=
  # CONFIG_INPUT_KEYBOARD is not set
  # CONFIG_INPUT_MOUSE is not set
  CONFIG_SERIO_LIBPS2=y
+ CONFIG_PPC_EPAPR_HV_BYTECHAN=y
  CONFIG_SERIAL_8250=y
  CONFIG_SERIAL_8250_CONSOLE=y
  CONFIG_SERIAL_8250_MANY_PORTS=y
@@@ -115,7 -98,6 +99,6 @@@ CONFIG_SPI_GPIO=
  CONFIG_SPI_FSL_SPI=y
  CONFIG_SPI_FSL_ESPI=y
  # CONFIG_HWMON is not set
- CONFIG_VIDEO_OUTPUT_CONTROL=y
  CONFIG_USB_HID=m
  CONFIG_USB=y
  CONFIG_USB_MON=y
@@@ -124,14 -106,17 +107,17 @@@ CONFIG_USB_EHCI_FSL=
  CONFIG_USB_STORAGE=y
  CONFIG_MMC=y
  CONFIG_MMC_SDHCI=y
+ CONFIG_EDAC=y
+ CONFIG_EDAC_MM_EDAC=y
  CONFIG_RTC_CLASS=y
  CONFIG_RTC_DRV_DS1307=y
  CONFIG_RTC_DRV_DS1374=y
  CONFIG_RTC_DRV_DS3232=y
- CONFIG_EDAC=y
- CONFIG_EDAC_MM_EDAC=y
  CONFIG_DMADEVICES=y
  CONFIG_FSL_DMA=y
+ CONFIG_VIRT_DRIVERS=y
+ CONFIG_FSL_HV_MANAGER=y
+ CONFIG_FSL_CORENET_CF=y
  CONFIG_EXT2_FS=y
  CONFIG_EXT3_FS=y
  CONFIG_ISO9660_FS=m
@@@ -144,35 -129,24 +130,24 @@@ CONFIG_NTFS_FS=
  CONFIG_PROC_KCORE=y
  CONFIG_TMPFS=y
  CONFIG_HUGETLBFS=y
- CONFIG_MISC_FILESYSTEMS=y
  CONFIG_JFFS2_FS=y
  CONFIG_JFFS2_FS_DEBUG=1
- CONFIG_JFFS2_FS_WRITEBUFFER=y
- CONFIG_JFFS2_ZLIB=y
- CONFIG_JFFS2_RTIME=y
  CONFIG_UBIFS_FS=y
- CONFIG_UBIFS_FS_XATTR=y
- CONFIG_UBIFS_FS_LZO=y
- CONFIG_UBIFS_FS_ZLIB=y
  CONFIG_NFS_FS=y
  CONFIG_NFS_V4=y
  CONFIG_ROOT_NFS=y
  CONFIG_NFSD=m
+ CONFIG_NLS_CODEPAGE_437=y
+ CONFIG_NLS_CODEPAGE_850=y
  CONFIG_NLS_ISO8859_1=y
  CONFIG_NLS_UTF8=m
  CONFIG_CRC_T10DIF=y
- CONFIG_CRC16=y
- CONFIG_ZLIB_DEFLATE=y
- CONFIG_LZO_COMPRESS=y
- CONFIG_LZO_DECOMPRESS=y
- CONFIG_CRYPTO_DEFLATE=y
- CONFIG_CRYPTO_LZO=y
+ CONFIG_DEBUG_INFO=y
  CONFIG_FRAME_WARN=1024
- CONFIG_MAGIC_SYSRQ=y
  CONFIG_DEBUG_FS=y
+ CONFIG_MAGIC_SYSRQ=y
  CONFIG_DEBUG_SHIRQ=y
  CONFIG_DETECT_HUNG_TASK=y
- CONFIG_DEBUG_INFO=y
  CONFIG_CRYPTO_NULL=y
  CONFIG_CRYPTO_PCBC=m
  CONFIG_CRYPTO_MD4=y
@@@ -180,4 -154,3 +155,3 @@@ CONFIG_CRYPTO_SHA256=
  CONFIG_CRYPTO_SHA512=y
  # CONFIG_CRYPTO_ANSI_CPRNG is not set
  CONFIG_CRYPTO_DEV_FSL_CAAM=y
- CONFIG_FSL_CORENET_CF=y
index 0c0505956a296bd83a185042a04e4e096880a04c,1ff8ba94b9f428486acd5674e72bbdcafbd8a7b2..fe3f9488f321e5ec20448ac92c6e6a3e16d4fc77
  #define SPRN_ACOP     0x1F    /* Available Coprocessor Register */
  #define SPRN_TFIAR    0x81    /* Transaction Failure Inst Addr   */
  #define SPRN_TEXASR   0x82    /* Transaction EXception & Summary */
 -#define   TEXASR_FS   __MASK(63-36)   /* Transaction Failure Summary */
  #define SPRN_TEXASRU  0x83    /* ''      ''      ''    Upper 32  */
 -#define   TEXASR_FS     __MASK(63-36) /* TEXASR Failure Summary */
 +#define   TEXASR_FS   __MASK(63-36) /* TEXASR Failure Summary */
  #define SPRN_TFHAR    0x80    /* Transaction Failure Handler Addr */
  #define SPRN_CTRLF    0x088
  #define SPRN_CTRLT    0x098
  #define   CTRL_TE     0x00c00000      /* thread enable */
  #define   CTRL_RUNLATCH       0x1
  #define SPRN_DAWR     0xB4
 +#define SPRN_MPPR     0xB8    /* Micro Partition Prefetch Register */
  #define SPRN_RPR      0xBA    /* Relative Priority Register */
  #define SPRN_CIABR    0xBB
  #define   CIABR_PRIV          0x3
  #define   DSISR_PROTFAULT     0x08000000      /* protection fault */
  #define   DSISR_ISSTORE               0x02000000      /* access was a store */
  #define   DSISR_DABRMATCH     0x00400000      /* hit data breakpoint */
 -#define   DSISR_NOSEGMENT     0x00200000      /* STAB/SLB miss */
 +#define   DSISR_NOSEGMENT     0x00200000      /* SLB miss */
  #define   DSISR_KEYFAULT      0x00200000      /* Key fault */
  #define SPRN_TBRL     0x10C   /* Time Base Read Lower Register (user, R/O) */
  #define SPRN_TBRU     0x10D   /* Time Base Read Upper Register (user, R/O) */
   *      readable variant for reads, which can avoid a fault
   *      with KVM type virtualization.
   *
 - *      (*) Under KVM, the host SPRG1 is used to point to
 - *      the current VCPU data structure
 - *
   * 32-bit 8xx:
   *    - SPRG0 scratch for exception vectors
   *    - SPRG1 scratch for exception vectors
-  *    - SPRG2 apparently unused but initialized
+  *    - SPRG2 scratch for exception vectors
   *
   */
  #ifdef CONFIG_PPC64
  #ifdef CONFIG_8xx
  #define SPRN_SPRG_SCRATCH0    SPRN_SPRG0
  #define SPRN_SPRG_SCRATCH1    SPRN_SPRG1
+ #define SPRN_SPRG_SCRATCH2    SPRN_SPRG2
  #endif
  
  
                                     : "r" ((unsigned long)(v)) \
                                     : "memory")
  
 +static inline unsigned long mfvtb (void)
 +{
 +#ifdef CONFIG_PPC_BOOK3S_64
 +      if (cpu_has_feature(CPU_FTR_ARCH_207S))
 +              return mfspr(SPRN_VTB);
 +#endif
 +      return 0;
 +}
 +
  #ifdef __powerpc64__
  #if defined(CONFIG_PPC_CELL) || defined(CONFIG_PPC_FSL_BOOK3E)
  #define mftb()                ({unsigned long rval;                           \
index 210ff9d3c182821001f9025ddb80fd696121d10c,a7b0156586dd40f63342326ad74a4acd2cfcb1d4..adac9dc54aeed2c748ae62a7a3cd1ad9fad8eb2f
@@@ -15,6 -15,7 +15,7 @@@
  #include <asm/vio.h>
  #include <asm/bug.h>
  #include <asm/machdep.h>
+ #include <asm/swiotlb.h>
  
  /*
   * Generic direct DMA implementation
   * default the offset is PCI_DRAM_OFFSET.
   */
  
+ static u64 __maybe_unused get_pfn_limit(struct device *dev)
+ {
+       u64 pfn = (dev->coherent_dma_mask >> PAGE_SHIFT) + 1;
+       struct dev_archdata __maybe_unused *sd = &dev->archdata;
+ #ifdef CONFIG_SWIOTLB
+       if (sd->max_direct_dma_addr && sd->dma_ops == &swiotlb_dma_ops)
+               pfn = min_t(u64, pfn, sd->max_direct_dma_addr >> PAGE_SHIFT);
+ #endif
+       return pfn;
+ }
  
  void *dma_direct_alloc_coherent(struct device *dev, size_t size,
                                dma_addr_t *dma_handle, gfp_t flag,
  #else
        struct page *page;
        int node = dev_to_node(dev);
+       u64 pfn = get_pfn_limit(dev);
+       int zone;
+       zone = dma_pfn_limit_to_zone(pfn);
+       if (zone < 0) {
+               dev_err(dev, "%s: No suitable zone for pfn %#llx\n",
+                       __func__, pfn);
+               return NULL;
+       }
+       switch (zone) {
+       case ZONE_DMA:
+               flag |= GFP_DMA;
+               break;
+ #ifdef CONFIG_ZONE_DMA32
+       case ZONE_DMA32:
+               flag |= GFP_DMA32;
+               break;
+ #endif
+       };
  
        /* ignore region specifiers */
        flag  &= ~(__GFP_HIGHMEM);
@@@ -202,7 -235,6 +235,7 @@@ int __dma_set_mask(struct device *dev, 
        *dev->dma_mask = dma_mask;
        return 0;
  }
 +
  int dma_set_mask(struct device *dev, u64 dma_mask)
  {
        if (ppc_md.dma_set_mask)
  }
  EXPORT_SYMBOL(dma_set_mask);
  
 -u64 dma_get_required_mask(struct device *dev)
 +u64 __dma_get_required_mask(struct device *dev)
  {
        struct dma_map_ops *dma_ops = get_dma_ops(dev);
  
 -      if (ppc_md.dma_get_required_mask)
 -              return ppc_md.dma_get_required_mask(dev);
 -
        if (unlikely(dma_ops == NULL))
                return 0;
  
  
        return DMA_BIT_MASK(8 * sizeof(dma_addr_t));
  }
 +
 +u64 dma_get_required_mask(struct device *dev)
 +{
 +      if (ppc_md.dma_get_required_mask)
 +              return ppc_md.dma_get_required_mask(dev);
 +
 +      return __dma_get_required_mask(dev);
 +}
  EXPORT_SYMBOL_GPL(dma_get_required_mask);
  
  static int __init dma_init(void)
diff --combined arch/powerpc/mm/mem.c
index e0f7a189c48ea440dc2e05ac659eb46895490590,420dfff22ba5089ccf2c04e59227e4c6085d5edb..8ebaac75c940ad7c5e9752a71c7dd7894e2bdedf
@@@ -128,8 -128,7 +128,8 @@@ int arch_add_memory(int nid, u64 start
                return -EINVAL;
  
        /* this should work for most non-highmem platforms */
 -      zone = pgdata->node_zones;
 +      zone = pgdata->node_zones +
 +              zone_for_memory(nid, start, size, 0);
  
        return __add_pages(nid, zone, start_pfn, nr_pages);
  }
@@@ -260,6 -259,60 +260,60 @@@ static int __init mark_nonram_nosave(vo
        }
        return 0;
  }
+ #else /* CONFIG_NEED_MULTIPLE_NODES */
+ static int __init mark_nonram_nosave(void)
+ {
+       return 0;
+ }
+ #endif
+ static bool zone_limits_final;
+ static unsigned long max_zone_pfns[MAX_NR_ZONES] = {
+       [0 ... MAX_NR_ZONES - 1] = ~0UL
+ };
+ /*
+  * Restrict the specified zone and all more restrictive zones
+  * to be below the specified pfn.  May not be called after
+  * paging_init().
+  */
+ void __init limit_zone_pfn(enum zone_type zone, unsigned long pfn_limit)
+ {
+       int i;
+       if (WARN_ON(zone_limits_final))
+               return;
+       for (i = zone; i >= 0; i--) {
+               if (max_zone_pfns[i] > pfn_limit)
+                       max_zone_pfns[i] = pfn_limit;
+       }
+ }
+ /*
+  * Find the least restrictive zone that is entirely below the
+  * specified pfn limit.  Returns < 0 if no suitable zone is found.
+  *
+  * pfn_limit must be u64 because it can exceed 32 bits even on 32-bit
+  * systems -- the DMA limit can be higher than any possible real pfn.
+  */
+ int dma_pfn_limit_to_zone(u64 pfn_limit)
+ {
+       enum zone_type top_zone = ZONE_NORMAL;
+       int i;
+ #ifdef CONFIG_HIGHMEM
+       top_zone = ZONE_HIGHMEM;
+ #endif
+       for (i = top_zone; i >= 0; i--) {
+               if (max_zone_pfns[i] <= pfn_limit)
+                       return i;
+       }
+       return -EPERM;
+ }
  
  /*
   * paging_init() sets up the page tables - in fact we've already done this.
@@@ -268,7 -321,7 +322,7 @@@ void __init paging_init(void
  {
        unsigned long long total_ram = memblock_phys_mem_size();
        phys_addr_t top_of_ram = memblock_end_of_DRAM();
-       unsigned long max_zone_pfns[MAX_NR_ZONES];
+       enum zone_type top_zone;
  
  #ifdef CONFIG_PPC32
        unsigned long v = __fix_to_virt(__end_of_fixed_addresses - 1);
               (unsigned long long)top_of_ram, total_ram);
        printk(KERN_DEBUG "Memory hole size: %ldMB\n",
               (long int)((top_of_ram - total_ram) >> 20));
-       memset(max_zone_pfns, 0, sizeof(max_zone_pfns));
  #ifdef CONFIG_HIGHMEM
-       max_zone_pfns[ZONE_DMA] = lowmem_end_addr >> PAGE_SHIFT;
-       max_zone_pfns[ZONE_HIGHMEM] = top_of_ram >> PAGE_SHIFT;
+       top_zone = ZONE_HIGHMEM;
+       limit_zone_pfn(ZONE_NORMAL, lowmem_end_addr >> PAGE_SHIFT);
  #else
-       max_zone_pfns[ZONE_DMA] = top_of_ram >> PAGE_SHIFT;
+       top_zone = ZONE_NORMAL;
  #endif
+       limit_zone_pfn(top_zone, top_of_ram >> PAGE_SHIFT);
+       zone_limits_final = true;
        free_area_init_nodes(max_zone_pfns);
  
        mark_nonram_nosave();
  }
- #endif /* ! CONFIG_NEED_MULTIPLE_NODES */
  
  static void __init register_page_bootmem_info(void)
  {
diff --combined arch/powerpc/mm/numa.c
index ec32d463cad916d7e3320cbb23a1bb9d3c0a9b73,5eb07f332de1d0fe46fd30bf22f06ba7eb9cb615..649666d5d1c20520ed554a3375c11393660871e1
@@@ -538,7 -538,7 +538,7 @@@ static int of_drconf_to_nid_single(stru
   */
  static int numa_setup_cpu(unsigned long lcpu)
  {
 -      int nid;
 +      int nid = -1;
        struct device_node *cpu;
  
        /*
  
        if (!cpu) {
                WARN_ON(1);
 -              nid = 0;
 -              goto out;
 +              if (cpu_present(lcpu))
 +                      goto out_present;
 +              else
 +                      goto out;
        }
  
        nid = of_node_to_nid_single(cpu);
  
 +out_present:
        if (nid < 0 || !node_online(nid))
                nid = first_online_node;
 -out:
 -      map_cpu_to_node(lcpu, nid);
  
 +      map_cpu_to_node(lcpu, nid);
        of_node_put(cpu);
 -
 +out:
        return nid;
  }
  
@@@ -613,8 -611,8 +613,8 @@@ static int cpu_numa_callback(struct not
        case CPU_UP_CANCELED:
        case CPU_UP_CANCELED_FROZEN:
                unmap_cpu_from_node(lcpu);
 -              break;
                ret = NOTIFY_OK;
 +              break;
  #endif
        }
        return ret;
@@@ -1051,7 -1049,7 +1051,7 @@@ static void __init mark_reserved_region
  
  void __init do_init_bootmem(void)
  {
 -      int nid;
 +      int nid, cpu;
  
        min_low_pfn = 0;
        max_low_pfn = memblock_end_of_DRAM() >> PAGE_SHIFT;
  
        reset_numa_cpu_lookup_table();
        register_cpu_notifier(&ppc64_numa_nb);
 -      cpu_numa_callback(&ppc64_numa_nb, CPU_UP_PREPARE,
 -                        (void *)(unsigned long)boot_cpuid);
 +      /*
 +       * We need the numa_cpu_lookup_table to be accurate for all CPUs,
 +       * even before we online them, so that we can use cpu_to_{node,mem}
 +       * early in boot, cf. smp_prepare_cpus().
 +       */
 +      for_each_present_cpu(cpu) {
 +              numa_setup_cpu((unsigned long)cpu);
 +      }
  }
  
- void __init paging_init(void)
- {
-       unsigned long max_zone_pfns[MAX_NR_ZONES];
-       memset(max_zone_pfns, 0, sizeof(max_zone_pfns));
-       max_zone_pfns[ZONE_DMA] = memblock_end_of_DRAM() >> PAGE_SHIFT;
-       free_area_init_nodes(max_zone_pfns);
- }
  static int __init early_numa(char *p)
  {
        if (!p)