Merge tag 'mips_5.9' of git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux
Pull MIPS upates from Thomas Bogendoerfer: - improvements for Loongson64 - extended ingenic support - removal of not maintained paravirt system type - cleanups and fixes * tag 'mips_5.9' of git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux: (81 commits) MIPS: SGI-IP27: always enable NUMA in Kconfig MAINTAINERS: Update KVM/MIPS maintainers MIPS: Update default config file for Loongson-3 MIPS: KVM: Add kvm guest support for Loongson-3 dt-bindings: mips: Document Loongson kvm guest board MIPS: handle Loongson-specific GSExc exception MIPS: add definitions for Loongson-specific CP0.Diag1 register MIPS: only register FTLBPar exception handler for supported models MIPS: ingenic: Hardcode mem size for qi,lb60 board MIPS: DTS: ingenic/qi,lb60: Add model and memory node MIPS: ingenic: Use fw_passed_dtb even if CONFIG_BUILTIN_DTB MIPS: head.S: Init fw_passed_dtb to builtin DTB of: address: Fix parser address/size cells initialization of_address: Guard of_bus_pci_get_flags with CONFIG_PCI MIPS: DTS: Fix number of msi vectors for Loongson64G MIPS: Loongson64: Add ISA node for LS7A PCH MIPS: Loongson64: DTS: Fix ISA and PCI I/O ranges for RS780E PCH MIPS: Loongson64: Enlarge IO_SPACE_LIMIT MIPS: Loongson64: Process ISA Node in DeviceTree of_address: Add bus type match for pci ranges parser ...
This commit is contained in:
@@ -93,7 +93,6 @@ obj-$(CONFIG_CRASH_DUMP) += crash_dump.o
|
||||
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
|
||||
obj-$(CONFIG_EARLY_PRINTK_8250) += early_printk_8250.o
|
||||
obj-$(CONFIG_SPINLOCK_TEST) += spinlock_test.o
|
||||
obj-$(CONFIG_MIPS_MACHINE) += mips_machine.o
|
||||
obj-$(CONFIG_MIPSR2_TO_R6_EMULATOR) += mips-r2-to-r6-emul.o
|
||||
|
||||
CFLAGS_cpu-bugs64.o = $(shell if $(CC) $(KBUILD_CFLAGS) -Wa,-mdaddi -c -o /dev/null -x c /dev/null >/dev/null 2>&1; then echo "-DHAVE_AS_SET_DADDI"; fi)
|
||||
|
@@ -635,14 +635,14 @@ static int set_ftlb_enable(struct cpuinfo_mips *c, enum ftlb_flags flags)
|
||||
config = read_c0_config6();
|
||||
|
||||
if (flags & FTLB_EN)
|
||||
config |= MIPS_CONF6_MTI_FTLBEN;
|
||||
config |= MTI_CONF6_FTLBEN;
|
||||
else
|
||||
config &= ~MIPS_CONF6_MTI_FTLBEN;
|
||||
config &= ~MTI_CONF6_FTLBEN;
|
||||
|
||||
if (flags & FTLB_SET_PROB) {
|
||||
config &= ~(3 << MIPS_CONF6_MTI_FTLBP_SHIFT);
|
||||
config &= ~(3 << MTI_CONF6_FTLBP_SHIFT);
|
||||
config |= calculate_ftlb_probability(c)
|
||||
<< MIPS_CONF6_MTI_FTLBP_SHIFT;
|
||||
<< MTI_CONF6_FTLBP_SHIFT;
|
||||
}
|
||||
|
||||
write_c0_config6(config);
|
||||
@@ -662,10 +662,10 @@ static int set_ftlb_enable(struct cpuinfo_mips *c, enum ftlb_flags flags)
|
||||
config = read_c0_config6();
|
||||
if (flags & FTLB_EN)
|
||||
/* Enable FTLB */
|
||||
write_c0_config6(config & ~MIPS_CONF6_LOONGSON_FTLBDIS);
|
||||
write_c0_config6(config & ~LOONGSON_CONF6_FTLBDIS);
|
||||
else
|
||||
/* Disable FTLB */
|
||||
write_c0_config6(config | MIPS_CONF6_LOONGSON_FTLBDIS);
|
||||
write_c0_config6(config | LOONGSON_CONF6_FTLBDIS);
|
||||
break;
|
||||
default:
|
||||
return 1;
|
||||
@@ -1827,6 +1827,19 @@ static inline void cpu_probe_mips(struct cpuinfo_mips *c, unsigned int cpu)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/* Recent MIPS cores use the implementation-dependent ExcCode 16 for
|
||||
* cache/FTLB parity exceptions.
|
||||
*/
|
||||
switch (__get_cpu_type(c->cputype)) {
|
||||
case CPU_PROAPTIV:
|
||||
case CPU_P5600:
|
||||
case CPU_P6600:
|
||||
case CPU_I6400:
|
||||
case CPU_I6500:
|
||||
c->options |= MIPS_CPU_FTLBPAREX;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void cpu_probe_alchemy(struct cpuinfo_mips *c, unsigned int cpu)
|
||||
@@ -2030,6 +2043,9 @@ static inline void cpu_probe_loongson(struct cpuinfo_mips *c, unsigned int cpu)
|
||||
{
|
||||
decode_configs(c);
|
||||
|
||||
/* All Loongson processors covered here define ExcCode 16 as GSExc. */
|
||||
c->options |= MIPS_CPU_GSEXCEX;
|
||||
|
||||
switch (c->processor_id & PRID_IMP_MASK) {
|
||||
case PRID_IMP_LOONGSON_64R: /* Loongson-64 Reduced */
|
||||
switch (c->processor_id & PRID_REV_MASK) {
|
||||
@@ -2110,6 +2126,8 @@ static inline void cpu_probe_ingenic(struct cpuinfo_mips *c, unsigned int cpu)
|
||||
BUG_ON(!__builtin_constant_p(cpu_has_counter) || cpu_has_counter);
|
||||
|
||||
switch (c->processor_id & PRID_IMP_MASK) {
|
||||
|
||||
/* XBurst®1 with MXU1.0/MXU1.1 SIMD ISA */
|
||||
case PRID_IMP_XBURST_REV1:
|
||||
|
||||
/*
|
||||
@@ -2148,12 +2166,20 @@ static inline void cpu_probe_ingenic(struct cpuinfo_mips *c, unsigned int cpu)
|
||||
break;
|
||||
}
|
||||
fallthrough;
|
||||
|
||||
/* XBurst®1 with MXU2.0 SIMD ISA */
|
||||
case PRID_IMP_XBURST_REV2:
|
||||
c->cputype = CPU_XBURST;
|
||||
c->writecombine = _CACHE_UNCACHED_ACCELERATED;
|
||||
__cpu_name[cpu] = "Ingenic XBurst";
|
||||
break;
|
||||
|
||||
/* XBurst®2 with MXU2.1 SIMD ISA */
|
||||
case PRID_IMP_XBURST2:
|
||||
c->cputype = CPU_XBURST;
|
||||
__cpu_name[cpu] = "Ingenic XBurst II";
|
||||
break;
|
||||
|
||||
default:
|
||||
panic("Unknown Ingenic Processor ID!");
|
||||
break;
|
||||
@@ -2299,6 +2325,7 @@ void cpu_probe(void)
|
||||
case PRID_COMP_LOONGSON:
|
||||
cpu_probe_loongson(c, cpu);
|
||||
break;
|
||||
case PRID_COMP_INGENIC_13:
|
||||
case PRID_COMP_INGENIC_D0:
|
||||
case PRID_COMP_INGENIC_D1:
|
||||
case PRID_COMP_INGENIC_E1:
|
||||
|
@@ -498,6 +498,19 @@ NESTED(nmi_handler, PT_SIZE, sp)
|
||||
KMODE
|
||||
.endm
|
||||
|
||||
.macro __build_clear_gsexc
|
||||
.set push
|
||||
/*
|
||||
* We need to specify a selector to access the CP0.Diag1 (GSCause)
|
||||
* register. All GSExc-equipped processors have MIPS32.
|
||||
*/
|
||||
.set mips32
|
||||
mfc0 a1, CP0_DIAGNOSTIC1
|
||||
.set pop
|
||||
TRACE_IRQS_ON
|
||||
STI
|
||||
.endm
|
||||
|
||||
.macro __BUILD_silent exception
|
||||
.endm
|
||||
|
||||
@@ -556,6 +569,7 @@ NESTED(nmi_handler, PT_SIZE, sp)
|
||||
BUILD_HANDLER fpe fpe fpe silent /* #15 */
|
||||
#endif
|
||||
BUILD_HANDLER ftlb ftlb none silent /* #16 */
|
||||
BUILD_HANDLER gsexc gsexc gsexc silent /* #16 */
|
||||
BUILD_HANDLER msa msa sti silent /* #21 */
|
||||
BUILD_HANDLER mdmx mdmx sti silent /* #22 */
|
||||
#ifdef CONFIG_HARDWARE_WATCHPOINTS
|
||||
|
@@ -111,6 +111,12 @@ NESTED(kernel_entry, 16, sp) # kernel entry point
|
||||
move t2, a1
|
||||
beq a0, t1, dtb_found
|
||||
|
||||
#ifdef CONFIG_BUILTIN_DTB
|
||||
PTR_LA t2, __dtb_start
|
||||
PTR_LA t1, __dtb_end
|
||||
bne t1, t2, dtb_found
|
||||
#endif /* CONFIG_BUILTIN_DTB */
|
||||
|
||||
li t2, 0
|
||||
dtb_found:
|
||||
#endif /* CONFIG_USE_OF */
|
||||
|
@@ -1,62 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
|
||||
*/
|
||||
#include <linux/mm.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <asm/mips_machine.h>
|
||||
#include <asm/prom.h>
|
||||
|
||||
static struct mips_machine *mips_machine __initdata;
|
||||
|
||||
#define for_each_machine(mach) \
|
||||
for ((mach) = (struct mips_machine *)&__mips_machines_start; \
|
||||
(mach) && \
|
||||
(unsigned long)(mach) < (unsigned long)&__mips_machines_end; \
|
||||
(mach)++)
|
||||
|
||||
__init int mips_machtype_setup(char *id)
|
||||
{
|
||||
struct mips_machine *mach;
|
||||
|
||||
for_each_machine(mach) {
|
||||
if (mach->mach_id == NULL)
|
||||
continue;
|
||||
|
||||
if (strcmp(mach->mach_id, id) == 0) {
|
||||
mips_machtype = mach->mach_type;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
pr_err("MIPS: no machine found for id '%s', supported machines:\n", id);
|
||||
pr_err("%-24s %s\n", "id", "name");
|
||||
for_each_machine(mach)
|
||||
pr_err("%-24s %s\n", mach->mach_id, mach->mach_name);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
__setup("machtype=", mips_machtype_setup);
|
||||
|
||||
__init void mips_machine_setup(void)
|
||||
{
|
||||
struct mips_machine *mach;
|
||||
|
||||
for_each_machine(mach) {
|
||||
if (mips_machtype == mach->mach_type) {
|
||||
mips_machine = mach;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!mips_machine)
|
||||
return;
|
||||
|
||||
mips_set_machine_name(mips_machine->mach_name);
|
||||
|
||||
if (mips_machine->mach_setup)
|
||||
mips_machine->mach_setup();
|
||||
}
|
@@ -497,7 +497,7 @@ static void __init mips_parse_crashkernel(void)
|
||||
if (ret != 0 || crash_size <= 0)
|
||||
return;
|
||||
|
||||
if (!memblock_find_in_range(crash_base, crash_base + crash_size, crash_size, 0)) {
|
||||
if (!memblock_find_in_range(crash_base, crash_base + crash_size, crash_size, 1)) {
|
||||
pr_warn("Invalid memory region reserved for crash kernel\n");
|
||||
return;
|
||||
}
|
||||
|
@@ -20,7 +20,7 @@ static int __init topology_init(void)
|
||||
for_each_present_cpu(i) {
|
||||
struct cpu *c = &per_cpu(cpu_devices, i);
|
||||
|
||||
c->hotpluggable = 1;
|
||||
c->hotpluggable = !!i;
|
||||
ret = register_cpu(c, i);
|
||||
if (ret)
|
||||
printk(KERN_WARNING "topology_init: register_cpu %d "
|
||||
|
@@ -90,6 +90,7 @@ extern asmlinkage void handle_tr(void);
|
||||
extern asmlinkage void handle_msa_fpe(void);
|
||||
extern asmlinkage void handle_fpe(void);
|
||||
extern asmlinkage void handle_ftlb(void);
|
||||
extern asmlinkage void handle_gsexc(void);
|
||||
extern asmlinkage void handle_msa(void);
|
||||
extern asmlinkage void handle_mdmx(void);
|
||||
extern asmlinkage void handle_watch(void);
|
||||
@@ -1680,7 +1681,7 @@ __setup("nol2par", nol2parity);
|
||||
* Some MIPS CPUs can enable/disable for cache parity detection, but do
|
||||
* it different ways.
|
||||
*/
|
||||
static inline void parity_protection_init(void)
|
||||
static inline __init void parity_protection_init(void)
|
||||
{
|
||||
#define ERRCTL_PE 0x80000000
|
||||
#define ERRCTL_L2P 0x00800000
|
||||
@@ -1902,6 +1903,37 @@ asmlinkage void do_ftlb(void)
|
||||
cache_parity_error();
|
||||
}
|
||||
|
||||
asmlinkage void do_gsexc(struct pt_regs *regs, u32 diag1)
|
||||
{
|
||||
u32 exccode = (diag1 & LOONGSON_DIAG1_EXCCODE) >>
|
||||
LOONGSON_DIAG1_EXCCODE_SHIFT;
|
||||
enum ctx_state prev_state;
|
||||
|
||||
prev_state = exception_enter();
|
||||
|
||||
switch (exccode) {
|
||||
case 0x08:
|
||||
/* Undocumented exception, will trigger on certain
|
||||
* also-undocumented instructions accessible from userspace.
|
||||
* Processor state is not otherwise corrupted, but currently
|
||||
* we don't know how to proceed. Maybe there is some
|
||||
* undocumented control flag to enable the instructions?
|
||||
*/
|
||||
force_sig(SIGILL);
|
||||
break;
|
||||
|
||||
default:
|
||||
/* None of the other exceptions, documented or not, have
|
||||
* further details given; none are encountered in the wild
|
||||
* either. Panic in case some of them turn out to be fatal.
|
||||
*/
|
||||
show_regs(regs);
|
||||
panic("Unhandled Loongson exception - GSCause = %08x", diag1);
|
||||
}
|
||||
|
||||
exception_exit(prev_state);
|
||||
}
|
||||
|
||||
/*
|
||||
* SDBBP EJTAG debug exception handler.
|
||||
* We skip the instruction and return to the next instruction.
|
||||
@@ -2457,7 +2489,11 @@ void __init trap_init(void)
|
||||
if (cpu_has_fpu && !cpu_has_nofpuex)
|
||||
set_except_vector(EXCCODE_FPE, handle_fpe);
|
||||
|
||||
set_except_vector(MIPS_EXCCODE_TLBPAR, handle_ftlb);
|
||||
if (cpu_has_ftlbparex)
|
||||
set_except_vector(MIPS_EXCCODE_TLBPAR, handle_ftlb);
|
||||
|
||||
if (cpu_has_gsexcex)
|
||||
set_except_vector(LOONGSON_EXCCODE_GSEXC, handle_gsexc);
|
||||
|
||||
if (cpu_has_rixiex) {
|
||||
set_except_vector(EXCCODE_TLBRI, tlb_do_page_fault_0);
|
||||
|
Reference in New Issue
Block a user