mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-30 15:43:08 -04:00
mips: econet: add multi-vpe capability to EN751221
EN751221 is a 34Kc so it has two VPEs (threads) but MIPS_SMP_MT
requires VEIC to be enabled in the interrupt controller, which only
became supported in
commit 2ee2a685ee ("irqchip/econet-en751221: Support MIPS 34Kc VEIC mode")
Register SMP_MT on startup and override init_secondary with CPU
interrupt unmasking as required by the EN751221 VEIC intc hardware.
Signed-off-by: Caleb James DeLisle <cjd@cjdns.fr>
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
This commit is contained in:
committed by
Thomas Bogendoerfer
parent
5475c03fa2
commit
8ae6e79ee0
@@ -16,9 +16,7 @@ choice
|
||||
select HAVE_PCI
|
||||
select IRQ_MIPS_CPU
|
||||
select PCI_DRIVERS_GENERIC
|
||||
select SMP
|
||||
select SMP_UP
|
||||
select SYS_SUPPORTS_SMP
|
||||
select SYS_SUPPORTS_MULTITHREADING
|
||||
help
|
||||
The EN751221 family includes EN7512, RN7513, EN7521, EN7526.
|
||||
They are based on single core MIPS 34Kc processors. To boot
|
||||
|
||||
@@ -28,6 +28,41 @@ static void hw_reset(char *command)
|
||||
iowrite32(RESET, CR_AHB_RSTCR);
|
||||
}
|
||||
|
||||
/*
|
||||
* vsmp_init_secondary expects either GIC or cascading interrupt configuration.
|
||||
* The EN751221 is a 34Kc with VEIC, but not GIC compatible. The cascading
|
||||
* configuration enables lines 6 and 7 for performance counters, but when this
|
||||
* is done on the EN751221 intc with VEIC enabled, it causes the whole intc to
|
||||
* stop sending interrupts.
|
||||
* Only unmask lines 0 and 1 (software interrupts) in init_secondary.
|
||||
*/
|
||||
#ifdef CONFIG_MIPS_MT_SMP
|
||||
extern const struct plat_smp_ops vsmp_smp_ops;
|
||||
static struct plat_smp_ops en75_smp_ops __ro_after_init;
|
||||
|
||||
static void en751221_init_secondary(void)
|
||||
{
|
||||
write_c0_status((read_c0_status() & ~ST0_IM) |
|
||||
(STATUSF_IP0 | STATUSF_IP1));
|
||||
}
|
||||
|
||||
static int __init en751221_register_vsmp_smp_ops(void)
|
||||
{
|
||||
if (!cpu_has_mipsmt)
|
||||
return -ENODEV;
|
||||
|
||||
en75_smp_ops = vsmp_smp_ops;
|
||||
en75_smp_ops.init_secondary = en751221_init_secondary;
|
||||
register_smp_ops(&en75_smp_ops);
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static int __init en751221_register_vsmp_smp_ops(void)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif /* CONFIG_MIPS_MT_SMP */
|
||||
|
||||
/* 1. Bring up early printk. */
|
||||
void __init prom_init(void)
|
||||
{
|
||||
@@ -51,11 +86,16 @@ void __init plat_mem_setup(void)
|
||||
early_init_dt_scan_memory();
|
||||
}
|
||||
|
||||
/* 3. Overload __weak device_tree_init(), add SMP_UP ops */
|
||||
/* 3. Overload __weak device_tree_init(), add SMP ops */
|
||||
void __init device_tree_init(void)
|
||||
{
|
||||
unflatten_and_copy_device_tree();
|
||||
|
||||
/* EN751221 dual-vpe */
|
||||
if (!en751221_register_vsmp_smp_ops())
|
||||
return;
|
||||
|
||||
/* EN751221 with MT_SMP disabled */
|
||||
register_up_smp_ops();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user