Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 31 Jan 2014 01:20:32 +0000 (17:20 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 31 Jan 2014 01:20:32 +0000 (17:20 -0800)
Pull MIPS updates from Ralf Baechle:
 "The most notable new addition inside this pull request is the support
  for MIPS's latest and greatest core called "inter/proAptiv".  The
  patch series describes this core as follows.

    "The interAptiv is a power-efficient multi-core microprocessor
     for use in system-on-chip (SoC) applications. The interAptiv combines
     a multi-threading pipeline with a coherence manager to deliver improved
     computational throughput and power efficiency. The interAptiv can
     contain one to four MIPS32R3 interAptiv cores, system level
     coherence manager with L2 cache, optional coherent I/O port,
     and optional floating point unit."

  The platform specific patches touch all 3 Broadcom families.  It adds
  support for the new Broadcom/Netlogix XLP9xx Soc, building a common
  BCM63XX SMP kernel for all BCM63XX SoCs regardless of core type/count
  and full gpio button/led descriptions for BCM47xx.

  The rest of the series are cleanups and bug fixes that are MIPS
  generic and consist largely of changes that Imgtec/MIPS had published
  in their linux-mti-3.10.git stable tree.  Random other cleanups and
  patches preparing code to be merged in 3.15"

* 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus: (139 commits)
  mips: select ARCH_MIGHT_HAVE_PC_SERIO
  mips: delete non-required instances of include <linux/init.h>
  MIPS: KVM: remove shadow_tlb code
  MIPS: KVM: use common EHINV aware UNIQUE_ENTRYHI
  mips/ide: flush dcache also if icache does not snoop dcache
  MIPS: BCM47XX: fix position of cpu_wait disabling
  MIPS: BCM63XX: select correct MIPS_L1_CACHE_SHIFT value
  MIPS: update MIPS_L1_CACHE_SHIFT based on MIPS_L1_CACHE_SHIFT_<N>
  MIPS: introduce MIPS_L1_CACHE_SHIFT_<N>
  MIPS: ZBOOT: gather string functions into string.c
  arch/mips/pci: don't check resource with devm_ioremap_resource
  arch/mips/lantiq/xway: don't check resource with devm_ioremap_resource
  bcma: gpio: don't cast u32 to unsigned long
  ssb: gpio: add own IRQ domain
  MIPS: BCM47XX: fix sparse warnings in board.c
  MIPS: BCM47XX: add board detection for Linksys WRT54GS V1
  MIPS: BCM47XX: fix detection for some boards
  MIPS: BCM47XX: Enable buttons support on SSB
  MIPS: BCM47XX: Convert WNDR4500 to new syntax
  MIPS: BCM47XX: Use "timer" trigger for status LEDs
  ...

1  2 
arch/mips/Kconfig
arch/mips/Makefile
arch/mips/bcm47xx/setup.c
arch/mips/include/asm/vpe.h
arch/mips/kernel/vpe.c
arch/mips/mm/c-r4k.c
arch/mips/netlogic/xlp/setup.c
arch/mips/netlogic/xlr/setup.c

index c02f1c03a22e7e1dd2ce0d1de16f702104cac47c,69b3a090f4f163e81b212be19e04890ecda6a45a..dcae3a7035db55a278b1a8cac80faa5ac2199003
@@@ -2324,6 -2351,36 +2352,23 @@@ config SECCOM
  
          If unsure, say Y. Only embedded should say N here.
  
 -config CC_STACKPROTECTOR
 -      bool "Enable -fstack-protector buffer overflow detection (EXPERIMENTAL)"
 -      help
 -        This option turns on the -fstack-protector GCC feature. This
 -        feature puts, at the beginning of functions, a canary value on
 -        the stack just before the return address, and validates
 -        the value just before actually returning.  Stack based buffer
 -        overflows (that need to overwrite this return address) now also
 -        overwrite the canary, which gets detected and the attack is then
 -        neutralized via a kernel panic.
 -
 -        This feature requires gcc version 4.2 or above.
 -
+ config MIPS_O32_FP64_SUPPORT
+       bool "Support for O32 binaries using 64-bit FP"
+       depends on 32BIT || MIPS32_O32
+       default y
+       help
+         When this is enabled, the kernel will support use of 64-bit floating
+         point registers with binaries using the O32 ABI along with the
+         EF_MIPS_FP64 ELF header flag (typically built with -mfp64). On
+         32-bit MIPS systems this support is at the cost of increasing the
+         size and complexity of the compiled FPU emulator. Thus if you are
+         running a MIPS32 system and know that none of your userland binaries
+         will require 64-bit floating point, you may wish to reduce the size
+         of your kernel & potentially improve FP emulation performance by
+         saying N here.
+         If unsure, say Y.
  config USE_OF
        bool
        select OF
Simple merge
index 9057728ac56b4cfa2130b122f2130df966ca7275,12d77e9c2cb49233500e3398e226b949095e2720..025be218ea1518bebfac47c2ec2cef514fff4e83
   *  675 Mass Ave, Cambridge, MA 02139, USA.
   */
  
+ #include "bcm47xx_private.h"
  #include <linux/export.h>
  #include <linux/types.h>
 +#include <linux/ethtool.h>
 +#include <linux/phy.h>
 +#include <linux/phy_fixed.h>
  #include <linux/ssb/ssb.h>
  #include <linux/ssb/ssb_embedded.h>
  #include <linux/bcma/bcma_soc.h>
@@@ -226,14 -229,34 +232,40 @@@ void __init plat_mem_setup(void
        _machine_halt = bcm47xx_machine_halt;
        pm_power_off = bcm47xx_machine_halt;
        bcm47xx_board_detect();
+       mips_set_machine_name(bcm47xx_board_get_name());
  }
  
+ static int __init bcm47xx_cpu_fixes(void)
+ {
+       switch (bcm47xx_bus_type) {
+ #ifdef CONFIG_BCM47XX_SSB
+       case BCM47XX_BUS_TYPE_SSB:
+               /* Nothing to do */
+               break;
+ #endif
+ #ifdef CONFIG_BCM47XX_BCMA
+       case BCM47XX_BUS_TYPE_BCMA:
+               /* The BCM4706 has a problem with the CPU wait instruction.
+                * When r4k_wait or r4k_wait_irqoff is used will just hang and
+                * not return from a msleep(). Removing the cpu_wait
+                * functionality is a workaround for this problem. The BCM4716
+                * does not have this problem.
+                */
+               if (bcm47xx_bus.bcma.bus.chipinfo.id == BCMA_CHIP_ID_BCM4706)
+                       cpu_wait = NULL;
+               break;
+ #endif
+       }
+       return 0;
+ }
+ arch_initcall(bcm47xx_cpu_fixes);
 +static struct fixed_phy_status bcm47xx_fixed_phy_status __initdata = {
 +      .link   = 1,
 +      .speed  = SPEED_100,
 +      .duplex = DUPLEX_FULL,
 +};
 +
  static int __init bcm47xx_register_bus_complete(void)
  {
        switch (bcm47xx_bus_type) {
                break;
  #endif
        }
+       bcm47xx_buttons_register();
+       bcm47xx_leds_register();
 +      fixed_phy_add(PHY_POLL, 0, &bcm47xx_fixed_phy_status);
        return 0;
  }
  device_initcall(bcm47xx_register_bus_complete);
index 0880fe8809b19842a79da37e30aa94997b79c221,e0684f5f0054aa33b762606fd386479fe64513dd..7849f3978feafe09cd0d9e712526bcc13d5e6c37
@@@ -18,7 -9,88 +9,87 @@@
  #ifndef _ASM_VPE_H
  #define _ASM_VPE_H
  
 -      unsigned int uid, gid;
+ #include <linux/init.h>
+ #include <linux/list.h>
+ #include <linux/smp.h>
+ #include <linux/spinlock.h>
+ #define VPE_MODULE_NAME "vpe"
+ #define VPE_MODULE_MINOR 1
+ /* grab the likely amount of memory we will need. */
+ #ifdef CONFIG_MIPS_VPE_LOADER_TOM
+ #define P_SIZE (2 * 1024 * 1024)
+ #else
+ /* add an overhead to the max kmalloc size for non-striped symbols/etc */
+ #define P_SIZE (256 * 1024)
+ #endif
+ #define MAX_VPES 16
+ #define VPE_PATH_MAX 256
+ static inline int aprp_cpu_index(void)
+ {
+ #ifdef CONFIG_MIPS_CMP
+       return setup_max_cpus;
+ #else
+       extern int tclimit;
+       return tclimit;
+ #endif
+ }
+ enum vpe_state {
+       VPE_STATE_UNUSED = 0,
+       VPE_STATE_INUSE,
+       VPE_STATE_RUNNING
+ };
+ enum tc_state {
+       TC_STATE_UNUSED = 0,
+       TC_STATE_INUSE,
+       TC_STATE_RUNNING,
+       TC_STATE_DYNAMIC
+ };
+ struct vpe {
+       enum vpe_state state;
+       /* (device) minor associated with this vpe */
+       int minor;
+       /* elfloader stuff */
+       void *load_addr;
+       unsigned long len;
+       char *pbuffer;
+       unsigned long plen;
+       char cwd[VPE_PATH_MAX];
+       unsigned long __start;
+       /* tc's associated with this vpe */
+       struct list_head tc;
+       /* The list of vpe's */
+       struct list_head list;
+       /* shared symbol address */
+       void *shared_ptr;
+       /* the list of who wants to know when something major happens */
+       struct list_head notify;
+       unsigned int ntcs;
+ };
+ struct tc {
+       enum tc_state state;
+       int index;
+       struct vpe *pvpe;       /* parent VPE */
+       struct list_head tc;    /* The list of TC's with this VPE */
+       struct list_head list;  /* The global list of tc's */
+ };
  struct vpe_notifications {
        void (*start)(int vpe);
        void (*stop)(int vpe);
        struct list_head list;
  };
  
 -int vpe_getuid(int index);
 -int vpe_getgid(int index);
+ struct vpe_control {
+       spinlock_t vpe_list_lock;
+       struct list_head vpe_list;      /* Virtual processing elements */
+       spinlock_t tc_list_lock;
+       struct list_head tc_list;       /* Thread contexts */
+ };
+ extern unsigned long physical_memsize;
+ extern struct vpe_control vpecontrol;
+ extern const struct file_operations vpe_fops;
+ int vpe_notify(int index, struct vpe_notifications *notify);
+ void *vpe_get_shared(int index);
+ char *vpe_getcwd(int index);
+ struct vpe *get_vpe(int minor);
+ struct tc *get_tc(int index);
+ struct vpe *alloc_vpe(int minor);
+ struct tc *alloc_tc(int index);
+ void release_vpe(struct vpe *v);
  
- extern int vpe_notify(int index, struct vpe_notifications *notify);
+ void *alloc_progmem(unsigned long len);
+ void release_progmem(void *ptr);
  
extern void *vpe_get_shared(int index);
extern char *vpe_getcwd(int index);
int __weak vpe_run(struct vpe *v);
void cleanup_tc(struct tc *tc);
  
+ int __init vpe_module_init(void);
+ void __exit vpe_module_exit(void);
  #endif /* _ASM_VPE_H */
index 2d5c142bad67b0b10b20cd3a102559b056eb845b,42d3ca08bd281e3681226ccf9ffceb60ca2dd119..11da314565cc331a03ad2e5b75b834361842d831
@@@ -1262,14 -899,35 +896,13 @@@ void *vpe_get_shared(int index
  
        return v->shared_ptr;
  }
  EXPORT_SYMBOL(vpe_get_shared);
  
 -int vpe_getuid(int index)
 -{
 -      struct vpe *v = get_vpe(index);
 -
 -      if (v == NULL)
 -              return -1;
 -
 -      return v->uid;
 -}
 -EXPORT_SYMBOL(vpe_getuid);
 -
 -int vpe_getgid(int index)
 -{
 -      struct vpe *v = get_vpe(index);
 -
 -      if (v == NULL)
 -              return -1;
 -
 -      return v->gid;
 -}
 -EXPORT_SYMBOL(vpe_getgid);
 -
  int vpe_notify(int index, struct vpe_notifications *notify)
  {
-       struct vpe *v;
+       struct vpe *v = get_vpe(index);
  
-       if ((v = get_vpe(index)) == NULL)
+       if (v == NULL)
                return -1;
  
        list_add(&notify->list, &v->notify);
Simple merge
index 54e75c77184b883fdbec601e1b2e97e49b1aa8c9,c3af2d8772cf8e07d29d4f81ff8909832ce545f0..8c60a2dd9ef6bd5f2d86cd786b7c8c5e31627fe7
@@@ -92,6 -96,15 +96,14 @@@ static void __init xlp_init_mem_from_ba
  
  void __init plat_mem_setup(void)
  {
 -      panic_timeout   = 5;
+ #ifdef CONFIG_SMP
+       nlm_wakeup_secondary_cpus();
+       /* update TLB size after waking up threads */
+       current_cpu_data.tlbsize = ((read_c0_config6() >> 16) & 0xffff) + 1;
+       register_smp_ops(&nlm_smp_ops);
+ #endif
        _machine_restart = (void (*)(char *))nlm_linux_exit;
        _machine_halt   = nlm_linux_exit;
        pm_power_off    = nlm_linux_exit;
Simple merge