mb/emulation/x86: Add optional parallel_mp init support

This makes it possible to select both the legacy LAPIC AP init or the
newer parallel MP init.

Tested on i440fx with -smp 32.

Change-Id: I007b052ccd3c34648cd172344d55768232acfd88
Signed-off-by: Arthur Heymans <arthur@aheymans.xyz>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/48210
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Patrick Rudolph <siro@das-labor.org>
This commit is contained in:
Arthur Heymans 2020-12-01 15:20:10 +01:00
parent 5e31a1939b
commit a75a2fa1d6
2 changed files with 29 additions and 1 deletions

View File

@ -9,6 +9,19 @@ config CPU_QEMU_X86
if CPU_QEMU_X86 if CPU_QEMU_X86
# coreboot i440fx does not support SMM # coreboot i440fx does not support SMM
choice
prompt "AP init"
default CPU_QEMU_X86_LAPIC_INIT
config CPU_QEMU_X86_LAPIC_INIT
bool "Legacy serial LAPIC init"
config CPU_QEMU_X86_PARALLEL_MP
bool "Parallel MP init"
select PARALLEL_MP
endchoice
choice choice
prompt "SMM support" prompt "SMM support"
default CPU_QEMU_X86_ASEG_SMM default CPU_QEMU_X86_ASEG_SMM
@ -20,6 +33,7 @@ config CPU_QEMU_X86_NO_SMM
config CPU_QEMU_X86_ASEG_SMM config CPU_QEMU_X86_ASEG_SMM
bool "SMM in ASEG" bool "SMM in ASEG"
depends on !PARALLEL_MP
select SMM_ASEG select SMM_ASEG
#config CPU_QEMU_X86_TSEG_SMM #config CPU_QEMU_X86_TSEG_SMM

View File

@ -3,6 +3,7 @@
#include <console/console.h> #include <console/console.h>
#include <cpu/cpu.h> #include <cpu/cpu.h>
#include <cpu/x86/lapic_def.h> #include <cpu/x86/lapic_def.h>
#include <cpu/x86/mp.h>
#include <arch/io.h> #include <arch/io.h>
#include <device/pci_def.h> #include <device/pci_def.h>
#include <device/pci_ops.h> #include <device/pci_ops.h>
@ -244,9 +245,22 @@ static struct device_operations pci_domain_ops = {
#endif #endif
}; };
static const struct mp_ops mp_ops_no_smm = {
.get_cpu_count = fw_cfg_max_cpus,
};
void mp_init_cpus(struct bus *cpu_bus)
{
if (mp_init_with_smm(cpu_bus, &mp_ops_no_smm))
printk(BIOS_ERR, "MP initialization failure.\n");
}
static void cpu_bus_init(struct device *dev) static void cpu_bus_init(struct device *dev)
{ {
initialize_cpus(dev->link_list); if (CONFIG(PARALLEL_MP))
mp_cpu_bus_init(dev);
else
initialize_cpus(dev->link_list);
} }
static void cpu_bus_scan(struct device *bus) static void cpu_bus_scan(struct device *bus)