Commit e6252e7f authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'mips_fixes_4.15_2' of git://git.kernel.org/pub/scm/linux/kernel/git/jhogan/mips

Pull MIPS fixes from James Hogan:
 "Some final MIPS fixes for 4.15, including important build fixes and a
  MAINTAINERS update:

   - Add myself as MIPS co-maintainer.

   - Fix various all*config build failures (particularly as a result of
     switching the default MIPS platform to the "generic" platform).

   - Fix GCC7 build failures (duplicate const and questionable calls to
     missing __multi3 intrinsic on mips64r6).

   - Fix warnings when CPU Idle is enabled (4.14).

   - Fix AR7 serial output (since 3.17).

   - Fix ralink platform_get_irq error checking (since 3.12)"

* tag 'mips_fixes_4.15_2' of git://git.kernel.org/pub/scm/linux/kernel/git/jhogan/mips:
  MAINTAINERS: Add James as MIPS co-maintainer
  MIPS: Fix undefined reference to physical_memsize
  MIPS: Implement __multi3 for GCC7 MIPS64r6 builds
  MIPS: mm: Fix duplicate "const" on insn_table_MM
  MIPS: CM: Drop WARN_ON(vp != 0)
  MIPS: ralink: Fix platform_get_irq's error checking
  MIPS: Fix CPS SMP NS16550 UART defaults
  MIPS: BCM47XX Avoid compile error with MIPS allnoconfig
  MIPS: RB532: Avoid undefined mac_pton without GENERIC_NET_UTILS
  MIPS: RB532: Avoid undefined early_serial_setup() without SERIAL_8250_CONSOLE
  MIPS: ath25: Avoid undefined early_serial_setup() without SERIAL_8250_CONSOLE
  MIPS: AR7: ensure the port type's FCR value is used
parents 8dd903d2 18696edc
...@@ -9085,6 +9085,7 @@ F: drivers/usb/image/microtek.* ...@@ -9085,6 +9085,7 @@ F: drivers/usb/image/microtek.*
MIPS MIPS
M: Ralf Baechle <ralf@linux-mips.org> M: Ralf Baechle <ralf@linux-mips.org>
M: James Hogan <jhogan@kernel.org>
L: linux-mips@linux-mips.org L: linux-mips@linux-mips.org
W: http://www.linux-mips.org/ W: http://www.linux-mips.org/
T: git git://git.linux-mips.org/pub/scm/ralf/linux.git T: git git://git.linux-mips.org/pub/scm/ralf/linux.git
......
...@@ -259,6 +259,7 @@ config BCM47XX ...@@ -259,6 +259,7 @@ config BCM47XX
select LEDS_GPIO_REGISTER select LEDS_GPIO_REGISTER
select BCM47XX_NVRAM select BCM47XX_NVRAM
select BCM47XX_SPROM select BCM47XX_SPROM
select BCM47XX_SSB if !BCM47XX_BCMA
help help
Support for BCM47XX based boards Support for BCM47XX based boards
...@@ -389,6 +390,7 @@ config LANTIQ ...@@ -389,6 +390,7 @@ config LANTIQ
select SYS_SUPPORTS_32BIT_KERNEL select SYS_SUPPORTS_32BIT_KERNEL
select SYS_SUPPORTS_MIPS16 select SYS_SUPPORTS_MIPS16
select SYS_SUPPORTS_MULTITHREADING select SYS_SUPPORTS_MULTITHREADING
select SYS_SUPPORTS_VPE_LOADER
select SYS_HAS_EARLY_PRINTK select SYS_HAS_EARLY_PRINTK
select GPIOLIB select GPIOLIB
select SWAP_IO_SPACE select SWAP_IO_SPACE
...@@ -516,6 +518,7 @@ config MIPS_MALTA ...@@ -516,6 +518,7 @@ config MIPS_MALTA
select SYS_SUPPORTS_MIPS16 select SYS_SUPPORTS_MIPS16
select SYS_SUPPORTS_MULTITHREADING select SYS_SUPPORTS_MULTITHREADING
select SYS_SUPPORTS_SMARTMIPS select SYS_SUPPORTS_SMARTMIPS
select SYS_SUPPORTS_VPE_LOADER
select SYS_SUPPORTS_ZBOOT select SYS_SUPPORTS_ZBOOT
select SYS_SUPPORTS_RELOCATABLE select SYS_SUPPORTS_RELOCATABLE
select USE_OF select USE_OF
...@@ -2281,9 +2284,16 @@ config MIPSR2_TO_R6_EMULATOR ...@@ -2281,9 +2284,16 @@ config MIPSR2_TO_R6_EMULATOR
The only reason this is a build-time option is to save ~14K from the The only reason this is a build-time option is to save ~14K from the
final kernel image. final kernel image.
config SYS_SUPPORTS_VPE_LOADER
bool
depends on SYS_SUPPORTS_MULTITHREADING
help
Indicates that the platform supports the VPE loader, and provides
physical_memsize.
config MIPS_VPE_LOADER config MIPS_VPE_LOADER
bool "VPE loader support." bool "VPE loader support."
depends on SYS_SUPPORTS_MULTITHREADING && MODULES depends on SYS_SUPPORTS_VPE_LOADER && MODULES
select CPU_MIPSR2_IRQ_VI select CPU_MIPSR2_IRQ_VI
select CPU_MIPSR2_IRQ_EI select CPU_MIPSR2_IRQ_EI
select MIPS_MT select MIPS_MT
......
...@@ -124,30 +124,36 @@ config SCACHE_DEBUGFS ...@@ -124,30 +124,36 @@ config SCACHE_DEBUGFS
If unsure, say N. If unsure, say N.
menuconfig MIPS_CPS_NS16550 menuconfig MIPS_CPS_NS16550_BOOL
bool "CPS SMP NS16550 UART output" bool "CPS SMP NS16550 UART output"
depends on MIPS_CPS depends on MIPS_CPS
help help
Output debug information via an ns16550 compatible UART if exceptions Output debug information via an ns16550 compatible UART if exceptions
occur early in the boot process of a secondary core. occur early in the boot process of a secondary core.
if MIPS_CPS_NS16550 if MIPS_CPS_NS16550_BOOL
config MIPS_CPS_NS16550
def_bool MIPS_CPS_NS16550_BASE != 0
config MIPS_CPS_NS16550_BASE config MIPS_CPS_NS16550_BASE
hex "UART Base Address" hex "UART Base Address"
default 0x1b0003f8 if MIPS_MALTA default 0x1b0003f8 if MIPS_MALTA
default 0
help help
The base address of the ns16550 compatible UART on which to output The base address of the ns16550 compatible UART on which to output
debug information from the early stages of core startup. debug information from the early stages of core startup.
This is only used if non-zero.
config MIPS_CPS_NS16550_SHIFT config MIPS_CPS_NS16550_SHIFT
int "UART Register Shift" int "UART Register Shift"
default 0 if MIPS_MALTA default 0
help help
The number of bits to shift ns16550 register indices by in order to The number of bits to shift ns16550 register indices by in order to
form their addresses. That is, log base 2 of the span between form their addresses. That is, log base 2 of the span between
adjacent ns16550 registers in the system. adjacent ns16550 registers in the system.
endif # MIPS_CPS_NS16550 endif # MIPS_CPS_NS16550_BOOL
endmenu endmenu
...@@ -575,7 +575,7 @@ static int __init ar7_register_uarts(void) ...@@ -575,7 +575,7 @@ static int __init ar7_register_uarts(void)
uart_port.type = PORT_AR7; uart_port.type = PORT_AR7;
uart_port.uartclk = clk_get_rate(bus_clk) / 2; uart_port.uartclk = clk_get_rate(bus_clk) / 2;
uart_port.iotype = UPIO_MEM32; uart_port.iotype = UPIO_MEM32;
uart_port.flags = UPF_FIXED_TYPE; uart_port.flags = UPF_FIXED_TYPE | UPF_BOOT_AUTOCONF;
uart_port.regshift = 2; uart_port.regshift = 2;
uart_port.line = 0; uart_port.line = 0;
......
...@@ -73,6 +73,7 @@ const char *get_system_type(void) ...@@ -73,6 +73,7 @@ const char *get_system_type(void)
void __init ath25_serial_setup(u32 mapbase, int irq, unsigned int uartclk) void __init ath25_serial_setup(u32 mapbase, int irq, unsigned int uartclk)
{ {
#ifdef CONFIG_SERIAL_8250_CONSOLE
struct uart_port s; struct uart_port s;
memset(&s, 0, sizeof(s)); memset(&s, 0, sizeof(s));
...@@ -85,6 +86,7 @@ void __init ath25_serial_setup(u32 mapbase, int irq, unsigned int uartclk) ...@@ -85,6 +86,7 @@ void __init ath25_serial_setup(u32 mapbase, int irq, unsigned int uartclk)
s.uartclk = uartclk; s.uartclk = uartclk;
early_serial_setup(&s); early_serial_setup(&s);
#endif /* CONFIG_SERIAL_8250_CONSOLE */
} }
int __init ath25_add_wmac(int nr, u32 base, int irq) int __init ath25_add_wmac(int nr, u32 base, int irq)
......
...@@ -292,7 +292,6 @@ void mips_cm_lock_other(unsigned int cluster, unsigned int core, ...@@ -292,7 +292,6 @@ void mips_cm_lock_other(unsigned int cluster, unsigned int core,
*this_cpu_ptr(&cm_core_lock_flags)); *this_cpu_ptr(&cm_core_lock_flags));
} else { } else {
WARN_ON(cluster != 0); WARN_ON(cluster != 0);
WARN_ON(vp != 0);
WARN_ON(block != CM_GCR_Cx_OTHER_BLOCK_LOCAL); WARN_ON(block != CM_GCR_Cx_OTHER_BLOCK_LOCAL);
/* /*
......
...@@ -16,4 +16,5 @@ obj-$(CONFIG_CPU_R3000) += r3k_dump_tlb.o ...@@ -16,4 +16,5 @@ obj-$(CONFIG_CPU_R3000) += r3k_dump_tlb.o
obj-$(CONFIG_CPU_TX39XX) += r3k_dump_tlb.o obj-$(CONFIG_CPU_TX39XX) += r3k_dump_tlb.o
# libgcc-style stuff needed in the kernel # libgcc-style stuff needed in the kernel
obj-y += ashldi3.o ashrdi3.o bswapsi.o bswapdi.o cmpdi2.o lshrdi3.o ucmpdi2.o obj-y += ashldi3.o ashrdi3.o bswapsi.o bswapdi.o cmpdi2.o lshrdi3.o multi3.o \
ucmpdi2.o
...@@ -10,10 +10,18 @@ typedef int word_type __attribute__ ((mode (__word__))); ...@@ -10,10 +10,18 @@ typedef int word_type __attribute__ ((mode (__word__)));
struct DWstruct { struct DWstruct {
int high, low; int high, low;
}; };
struct TWstruct {
long long high, low;
};
#elif defined(__LITTLE_ENDIAN) #elif defined(__LITTLE_ENDIAN)
struct DWstruct { struct DWstruct {
int low, high; int low, high;
}; };
struct TWstruct {
long long low, high;
};
#else #else
#error I feel sick. #error I feel sick.
#endif #endif
...@@ -23,4 +31,13 @@ typedef union { ...@@ -23,4 +31,13 @@ typedef union {
long long ll; long long ll;
} DWunion; } DWunion;
#if defined(CONFIG_64BIT) && defined(CONFIG_CPU_MIPSR6)
typedef int ti_type __attribute__((mode(TI)));
typedef union {
struct TWstruct s;
ti_type ti;
} TWunion;
#endif
#endif /* __ASM_LIBGCC_H */ #endif /* __ASM_LIBGCC_H */
// SPDX-License-Identifier: GPL-2.0
#include <linux/export.h>
#include "libgcc.h"
/*
* GCC 7 suboptimally generates __multi3 calls for mips64r6, so for that
* specific case only we'll implement it here.
*
* See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82981
*/
#if defined(CONFIG_64BIT) && defined(CONFIG_CPU_MIPSR6) && (__GNUC__ == 7)
/* multiply 64-bit values, low 64-bits returned */
static inline long long notrace dmulu(long long a, long long b)
{
long long res;
asm ("dmulu %0,%1,%2" : "=r" (res) : "r" (a), "r" (b));
return res;
}
/* multiply 64-bit unsigned values, high 64-bits of 128-bit result returned */
static inline long long notrace dmuhu(long long a, long long b)
{
long long res;
asm ("dmuhu %0,%1,%2" : "=r" (res) : "r" (a), "r" (b));
return res;
}
/* multiply 128-bit values, low 128-bits returned */
ti_type notrace __multi3(ti_type a, ti_type b)
{
TWunion res, aa, bb;
aa.ti = a;
bb.ti = b;
/*
* a * b = (a.lo * b.lo)
* + 2^64 * (a.hi * b.lo + a.lo * b.hi)
* [+ 2^128 * (a.hi * b.hi)]
*/
res.s.low = dmulu(aa.s.low, bb.s.low);
res.s.high = dmuhu(aa.s.low, bb.s.low);
res.s.high += dmulu(aa.s.high, bb.s.low);
res.s.high += dmulu(aa.s.low, bb.s.high);
return res.ti;
}
EXPORT_SYMBOL(__multi3);
#endif /* 64BIT && CPU_MIPSR6 && GCC7 */
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
#include "uasm.c" #include "uasm.c"
static const struct insn const insn_table_MM[insn_invalid] = { static const struct insn insn_table_MM[insn_invalid] = {
[insn_addu] = {M(mm_pool32a_op, 0, 0, 0, 0, mm_addu32_op), RT | RS | RD}, [insn_addu] = {M(mm_pool32a_op, 0, 0, 0, 0, mm_addu32_op), RT | RS | RD},
[insn_addiu] = {M(mm_addiu32_op, 0, 0, 0, 0, 0), RT | RS | SIMM}, [insn_addiu] = {M(mm_addiu32_op, 0, 0, 0, 0, 0), RT | RS | SIMM},
[insn_and] = {M(mm_pool32a_op, 0, 0, 0, 0, mm_and_op), RT | RS | RD}, [insn_and] = {M(mm_pool32a_op, 0, 0, 0, 0, mm_and_op), RT | RS | RD},
......
...@@ -109,9 +109,9 @@ static int rt_timer_probe(struct platform_device *pdev) ...@@ -109,9 +109,9 @@ static int rt_timer_probe(struct platform_device *pdev)
} }
rt->irq = platform_get_irq(pdev, 0); rt->irq = platform_get_irq(pdev, 0);
if (!rt->irq) { if (rt->irq < 0) {
dev_err(&pdev->dev, "failed to load irq\n"); dev_err(&pdev->dev, "failed to load irq\n");
return -ENOENT; return rt->irq;
} }
rt->membase = devm_ioremap_resource(&pdev->dev, res); rt->membase = devm_ioremap_resource(&pdev->dev, res);
......
...@@ -2,4 +2,6 @@ ...@@ -2,4 +2,6 @@
# Makefile for the RB532 board specific parts of the kernel # Makefile for the RB532 board specific parts of the kernel
# #
obj-y += irq.o time.o setup.o serial.o prom.o gpio.o devices.o obj-$(CONFIG_SERIAL_8250_CONSOLE) += serial.o
obj-y += irq.o time.o setup.o prom.o gpio.o devices.o
...@@ -310,6 +310,8 @@ static int __init plat_setup_devices(void) ...@@ -310,6 +310,8 @@ static int __init plat_setup_devices(void)
return platform_add_devices(rb532_devs, ARRAY_SIZE(rb532_devs)); return platform_add_devices(rb532_devs, ARRAY_SIZE(rb532_devs));
} }
#ifdef CONFIG_NET
static int __init setup_kmac(char *s) static int __init setup_kmac(char *s)
{ {
printk(KERN_INFO "korina mac = %s\n", s); printk(KERN_INFO "korina mac = %s\n", s);
...@@ -322,4 +324,6 @@ static int __init setup_kmac(char *s) ...@@ -322,4 +324,6 @@ static int __init setup_kmac(char *s)
__setup("kmac=", setup_kmac); __setup("kmac=", setup_kmac);
#endif /* CONFIG_NET */
arch_initcall(plat_setup_devices); arch_initcall(plat_setup_devices);
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