Commit 1f1e34f7 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus

Pull more MIPS fixes from Ralf Baechle:
 "Another round of 4.1 MIPS fixes, one fix to a MIPS-specific #if
  condition in lib/mpi, one fix to the MIPS GIC irqchip driver and one
  SSB fix.

  Details:
   - fix handling of clock in chipco SSB driver.
   - fix two MIPS-specific #if conditions to correctly work for GCC 5.1.
   - fix damage to R6 pgtable bits done by XPA support.
   - fix possible crash due to unloading modules that contain statically
     defined platform devices.
   - fix disabling of the MSA ASE on context switch to also work
     correctly when a new thread/process has the CPU for the very first
     time.

  This is part of linux-next and has been beaten to death on
  Imagination's test farm.

  While things are not looking too grim this pull request also means the
  rate of fixes for 4.1 remains nearly constant so I'd not be unhappy if
  you'd delay the release"

* 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus:
  MPI: MIPS: Fix compilation error with GCC 5.1
  IRQCHIP: mips-gic: Don't nest calls to do_IRQ()
  MIPS: MSA: bugfix - disable MSA correctly for new threads/processes.
  MIPS: Loongson: Do not register 8250 platform device from module.
  MIPS: Cobalt: Do not build MTD platform device registration code as module.
  SSB: Fix handling of ssb_pmu_get_alp_clock()
  MIPS: pgtable-bits: Fix XPA damage to R6 definitions.
parents baaae192 36f58113
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
# Makefile for the Cobalt micro systems family specific parts of the kernel # Makefile for the Cobalt micro systems family specific parts of the kernel
# #
obj-y := buttons.o irq.o lcd.o led.o reset.o rtc.o serial.o setup.o time.o obj-y := buttons.o irq.o lcd.o led.o mtd.o reset.o rtc.o serial.o setup.o time.o
obj-$(CONFIG_PCI) += pci.o obj-$(CONFIG_PCI) += pci.o
obj-$(CONFIG_MTD_PHYSMAP) += mtd.o
...@@ -113,7 +113,7 @@ ...@@ -113,7 +113,7 @@
#define _PAGE_PRESENT_SHIFT 0 #define _PAGE_PRESENT_SHIFT 0
#define _PAGE_PRESENT (1 << _PAGE_PRESENT_SHIFT) #define _PAGE_PRESENT (1 << _PAGE_PRESENT_SHIFT)
/* R2 or later cores check for RI/XI support to determine _PAGE_READ */ /* R2 or later cores check for RI/XI support to determine _PAGE_READ */
#ifdef CONFIG_CPU_MIPSR2 #if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6)
#define _PAGE_WRITE_SHIFT (_PAGE_PRESENT_SHIFT + 1) #define _PAGE_WRITE_SHIFT (_PAGE_PRESENT_SHIFT + 1)
#define _PAGE_WRITE (1 << _PAGE_WRITE_SHIFT) #define _PAGE_WRITE (1 << _PAGE_WRITE_SHIFT)
#else #else
...@@ -135,16 +135,16 @@ ...@@ -135,16 +135,16 @@
#define _PAGE_SPLITTING (1 << _PAGE_SPLITTING_SHIFT) #define _PAGE_SPLITTING (1 << _PAGE_SPLITTING_SHIFT)
/* Only R2 or newer cores have the XI bit */ /* Only R2 or newer cores have the XI bit */
#ifdef CONFIG_CPU_MIPSR2 #if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6)
#define _PAGE_NO_EXEC_SHIFT (_PAGE_SPLITTING_SHIFT + 1) #define _PAGE_NO_EXEC_SHIFT (_PAGE_SPLITTING_SHIFT + 1)
#else #else
#define _PAGE_GLOBAL_SHIFT (_PAGE_SPLITTING_SHIFT + 1) #define _PAGE_GLOBAL_SHIFT (_PAGE_SPLITTING_SHIFT + 1)
#define _PAGE_GLOBAL (1 << _PAGE_GLOBAL_SHIFT) #define _PAGE_GLOBAL (1 << _PAGE_GLOBAL_SHIFT)
#endif /* CONFIG_CPU_MIPSR2 */ #endif /* CONFIG_CPU_MIPSR2 || CONFIG_CPU_MIPSR6 */
#endif /* CONFIG_64BIT && CONFIG_MIPS_HUGE_TLB_SUPPORT */ #endif /* CONFIG_64BIT && CONFIG_MIPS_HUGE_TLB_SUPPORT */
#ifdef CONFIG_CPU_MIPSR2 #if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6)
/* XI - page cannot be executed */ /* XI - page cannot be executed */
#ifndef _PAGE_NO_EXEC_SHIFT #ifndef _PAGE_NO_EXEC_SHIFT
#define _PAGE_NO_EXEC_SHIFT (_PAGE_MODIFIED_SHIFT + 1) #define _PAGE_NO_EXEC_SHIFT (_PAGE_MODIFIED_SHIFT + 1)
...@@ -160,10 +160,10 @@ ...@@ -160,10 +160,10 @@
#define _PAGE_GLOBAL_SHIFT (_PAGE_NO_READ_SHIFT + 1) #define _PAGE_GLOBAL_SHIFT (_PAGE_NO_READ_SHIFT + 1)
#define _PAGE_GLOBAL (1 << _PAGE_GLOBAL_SHIFT) #define _PAGE_GLOBAL (1 << _PAGE_GLOBAL_SHIFT)
#else /* !CONFIG_CPU_MIPSR2 */ #else /* !CONFIG_CPU_MIPSR2 && !CONFIG_CPU_MIPSR6 */
#define _PAGE_GLOBAL_SHIFT (_PAGE_MODIFIED_SHIFT + 1) #define _PAGE_GLOBAL_SHIFT (_PAGE_MODIFIED_SHIFT + 1)
#define _PAGE_GLOBAL (1 << _PAGE_GLOBAL_SHIFT) #define _PAGE_GLOBAL (1 << _PAGE_GLOBAL_SHIFT)
#endif /* CONFIG_CPU_MIPSR2 */ #endif /* CONFIG_CPU_MIPSR2 || CONFIG_CPU_MIPSR6 */
#define _PAGE_VALID_SHIFT (_PAGE_GLOBAL_SHIFT + 1) #define _PAGE_VALID_SHIFT (_PAGE_GLOBAL_SHIFT + 1)
#define _PAGE_VALID (1 << _PAGE_VALID_SHIFT) #define _PAGE_VALID (1 << _PAGE_VALID_SHIFT)
...@@ -205,7 +205,7 @@ ...@@ -205,7 +205,7 @@
*/ */
static inline uint64_t pte_to_entrylo(unsigned long pte_val) static inline uint64_t pte_to_entrylo(unsigned long pte_val)
{ {
#ifdef CONFIG_CPU_MIPSR2 #if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6)
if (cpu_has_rixi) { if (cpu_has_rixi) {
int sa; int sa;
#ifdef CONFIG_32BIT #ifdef CONFIG_32BIT
......
...@@ -104,7 +104,6 @@ do { \ ...@@ -104,7 +104,6 @@ do { \
if (test_and_clear_tsk_thread_flag(prev, TIF_USEDMSA)) \ if (test_and_clear_tsk_thread_flag(prev, TIF_USEDMSA)) \
__fpsave = FP_SAVE_VECTOR; \ __fpsave = FP_SAVE_VECTOR; \
(last) = resume(prev, next, task_thread_info(next), __fpsave); \ (last) = resume(prev, next, task_thread_info(next), __fpsave); \
disable_msa(); \
} while (0) } while (0)
#define finish_arch_switch(prev) \ #define finish_arch_switch(prev) \
...@@ -122,6 +121,7 @@ do { \ ...@@ -122,6 +121,7 @@ do { \
if (cpu_has_userlocal) \ if (cpu_has_userlocal) \
write_c0_userlocal(current_thread_info()->tp_value); \ write_c0_userlocal(current_thread_info()->tp_value); \
__restore_watch(); \ __restore_watch(); \
disable_msa(); \
} while (0) } while (0)
#endif /* _ASM_SWITCH_TO_H */ #endif /* _ASM_SWITCH_TO_H */
...@@ -3,15 +3,13 @@ ...@@ -3,15 +3,13 @@
# #
obj-y += setup.o init.o cmdline.o env.o time.o reset.o irq.o \ obj-y += setup.o init.o cmdline.o env.o time.o reset.o irq.o \
bonito-irq.o mem.o machtype.o platform.o bonito-irq.o mem.o machtype.o platform.o serial.o
obj-$(CONFIG_PCI) += pci.o obj-$(CONFIG_PCI) += pci.o
# #
# Serial port support # Serial port support
# #
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
loongson-serial-$(CONFIG_SERIAL_8250) := serial.o
obj-y += $(loongson-serial-m) $(loongson-serial-y)
obj-$(CONFIG_LOONGSON_UART_BASE) += uart_base.o obj-$(CONFIG_LOONGSON_UART_BASE) += uart_base.o
obj-$(CONFIG_LOONGSON_MC146818) += rtc.o obj-$(CONFIG_LOONGSON_MC146818) += rtc.o
......
...@@ -271,7 +271,7 @@ int gic_get_c0_fdc_int(void) ...@@ -271,7 +271,7 @@ int gic_get_c0_fdc_int(void)
GIC_LOCAL_TO_HWIRQ(GIC_LOCAL_INT_FDC)); GIC_LOCAL_TO_HWIRQ(GIC_LOCAL_INT_FDC));
} }
static void gic_handle_shared_int(void) static void gic_handle_shared_int(bool chained)
{ {
unsigned int i, intr, virq; unsigned int i, intr, virq;
unsigned long *pcpu_mask; unsigned long *pcpu_mask;
...@@ -299,6 +299,9 @@ static void gic_handle_shared_int(void) ...@@ -299,6 +299,9 @@ static void gic_handle_shared_int(void)
while (intr != gic_shared_intrs) { while (intr != gic_shared_intrs) {
virq = irq_linear_revmap(gic_irq_domain, virq = irq_linear_revmap(gic_irq_domain,
GIC_SHARED_TO_HWIRQ(intr)); GIC_SHARED_TO_HWIRQ(intr));
if (chained)
generic_handle_irq(virq);
else
do_IRQ(virq); do_IRQ(virq);
/* go to next pending bit */ /* go to next pending bit */
...@@ -431,7 +434,7 @@ static struct irq_chip gic_edge_irq_controller = { ...@@ -431,7 +434,7 @@ static struct irq_chip gic_edge_irq_controller = {
#endif #endif
}; };
static void gic_handle_local_int(void) static void gic_handle_local_int(bool chained)
{ {
unsigned long pending, masked; unsigned long pending, masked;
unsigned int intr, virq; unsigned int intr, virq;
...@@ -445,6 +448,9 @@ static void gic_handle_local_int(void) ...@@ -445,6 +448,9 @@ static void gic_handle_local_int(void)
while (intr != GIC_NUM_LOCAL_INTRS) { while (intr != GIC_NUM_LOCAL_INTRS) {
virq = irq_linear_revmap(gic_irq_domain, virq = irq_linear_revmap(gic_irq_domain,
GIC_LOCAL_TO_HWIRQ(intr)); GIC_LOCAL_TO_HWIRQ(intr));
if (chained)
generic_handle_irq(virq);
else
do_IRQ(virq); do_IRQ(virq);
/* go to next pending bit */ /* go to next pending bit */
...@@ -509,13 +515,14 @@ static struct irq_chip gic_all_vpes_local_irq_controller = { ...@@ -509,13 +515,14 @@ static struct irq_chip gic_all_vpes_local_irq_controller = {
static void __gic_irq_dispatch(void) static void __gic_irq_dispatch(void)
{ {
gic_handle_local_int(); gic_handle_local_int(false);
gic_handle_shared_int(); gic_handle_shared_int(false);
} }
static void gic_irq_dispatch(unsigned int irq, struct irq_desc *desc) static void gic_irq_dispatch(unsigned int irq, struct irq_desc *desc)
{ {
__gic_irq_dispatch(); gic_handle_local_int(true);
gic_handle_shared_int(true);
} }
#ifdef CONFIG_MIPS_GIC_IPI #ifdef CONFIG_MIPS_GIC_IPI
......
...@@ -621,8 +621,8 @@ static u32 ssb_pmu_get_alp_clock_clk0(struct ssb_chipcommon *cc) ...@@ -621,8 +621,8 @@ static u32 ssb_pmu_get_alp_clock_clk0(struct ssb_chipcommon *cc)
u32 crystalfreq; u32 crystalfreq;
const struct pmu0_plltab_entry *e = NULL; const struct pmu0_plltab_entry *e = NULL;
crystalfreq = chipco_read32(cc, SSB_CHIPCO_PMU_CTL) & crystalfreq = (chipco_read32(cc, SSB_CHIPCO_PMU_CTL) &
SSB_CHIPCO_PMU_CTL_XTALFREQ >> SSB_CHIPCO_PMU_CTL_XTALFREQ_SHIFT; SSB_CHIPCO_PMU_CTL_XTALFREQ) >> SSB_CHIPCO_PMU_CTL_XTALFREQ_SHIFT;
e = pmu0_plltab_find_entry(crystalfreq); e = pmu0_plltab_find_entry(crystalfreq);
BUG_ON(!e); BUG_ON(!e);
return e->freq * 1000; return e->freq * 1000;
...@@ -634,7 +634,7 @@ u32 ssb_pmu_get_alp_clock(struct ssb_chipcommon *cc) ...@@ -634,7 +634,7 @@ u32 ssb_pmu_get_alp_clock(struct ssb_chipcommon *cc)
switch (bus->chip_id) { switch (bus->chip_id) {
case 0x5354: case 0x5354:
ssb_pmu_get_alp_clock_clk0(cc); return ssb_pmu_get_alp_clock_clk0(cc);
default: default:
ssb_err("ERROR: PMU alp clock unknown for device %04X\n", ssb_err("ERROR: PMU alp clock unknown for device %04X\n",
bus->chip_id); bus->chip_id);
......
...@@ -639,7 +639,7 @@ do { \ ...@@ -639,7 +639,7 @@ do { \
************** MIPS ***************** ************** MIPS *****************
***************************************/ ***************************************/
#if defined(__mips__) && W_TYPE_SIZE == 32 #if defined(__mips__) && W_TYPE_SIZE == 32
#if __GNUC__ >= 4 && __GNUC_MINOR__ >= 4 #if (__GNUC__ >= 5) || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 4)
#define umul_ppmm(w1, w0, u, v) \ #define umul_ppmm(w1, w0, u, v) \
do { \ do { \
UDItype __ll = (UDItype)(u) * (v); \ UDItype __ll = (UDItype)(u) * (v); \
...@@ -671,7 +671,7 @@ do { \ ...@@ -671,7 +671,7 @@ do { \
************** MIPS/64 ************** ************** MIPS/64 **************
***************************************/ ***************************************/
#if (defined(__mips) && __mips >= 3) && W_TYPE_SIZE == 64 #if (defined(__mips) && __mips >= 3) && W_TYPE_SIZE == 64
#if __GNUC__ >= 4 && __GNUC_MINOR__ >= 4 #if (__GNUC__ >= 5) || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 4)
#define umul_ppmm(w1, w0, u, v) \ #define umul_ppmm(w1, w0, u, v) \
do { \ do { \
typedef unsigned int __ll_UTItype __attribute__((mode(TI))); \ typedef unsigned int __ll_UTItype __attribute__((mode(TI))); \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment