*x86: Support x2apic mode
Implement x2apic mode as existing code only supports apic mode. Use info from LAPIC_BASE_MSR (LAPIC_BASE_MSR_X2APIC_MODE) to check if apic mode or x2apic mode and implement x2apic mode according to x2apic specfication. Reference: https://software.intel.com/content/www/us/en/develop/download/intel-64-architecture-x2apic-specification.html BUG=None BRANCH=None TEST=boot to OS and check apic mode cat /proc/cpuinfo | grep "apicid" ex) can see apicid bigger than 255 apicid : 256 apicid : 260 Signed-off-by: Wonkyu Kim <wonkyu.kim@intel.com> Change-Id: I0bb729b0521fb9dc38b7981014755daeaf9ca817 Reviewed-on: https://review.coreboot.org/c/coreboot/+/51723 Reviewed-by: Ravishankar Sarawadi <ravishankar.sarawadi@intel.com> Reviewed-by: Jamie Ryu <jamie.m.ryu@intel.com> Reviewed-by: Patrick Georgi <pgeorgi@google.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
committed by
Patrick Georgi
parent
5c9bacca32
commit
26ab9bfeb5
@@ -435,6 +435,28 @@ static int start_aps(struct bus *cpu_bus, int ap_count, atomic_t *num_aps)
|
||||
|
||||
printk(BIOS_DEBUG, "Attempting to start %d APs\n", ap_count);
|
||||
|
||||
if (is_x2apic_mode()) {
|
||||
x2apic_send_ipi(LAPIC_DM_INIT | LAPIC_INT_LEVELTRIG |
|
||||
LAPIC_INT_ASSERT | LAPIC_DEST_ALLBUT, 0);
|
||||
mdelay(10);
|
||||
x2apic_send_ipi(LAPIC_DM_STARTUP | LAPIC_INT_LEVELTRIG |
|
||||
LAPIC_DEST_ALLBUT | sipi_vector, 0);
|
||||
|
||||
/* Wait for CPUs to check in up to 200 us. */
|
||||
wait_for_aps(num_aps, ap_count, 200 /* us */, 15 /* us */);
|
||||
|
||||
x2apic_send_ipi(LAPIC_DM_STARTUP | LAPIC_INT_LEVELTRIG |
|
||||
LAPIC_DEST_ALLBUT | sipi_vector, 0);
|
||||
|
||||
/* Wait for CPUs to check in. */
|
||||
if (wait_for_aps(num_aps, ap_count, 100000 /* 100 ms */, 50 /* us */)) {
|
||||
printk(BIOS_ERR, "Not all APs checked in: %d/%d.\n",
|
||||
atomic_read(num_aps), ap_count);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((lapic_read(LAPIC_ICR) & LAPIC_ICR_BUSY)) {
|
||||
printk(BIOS_DEBUG, "Waiting for ICR not to be busy...");
|
||||
if (apic_wait_timeout(1000 /* 1 ms */, 50)) {
|
||||
@@ -653,6 +675,11 @@ static void mp_initialize_cpu(void)
|
||||
|
||||
void smm_initiate_relocation_parallel(void)
|
||||
{
|
||||
if (is_x2apic_mode()) {
|
||||
x2apic_send_ipi(LAPIC_DM_SMI | LAPIC_INT_LEVELTRIG, lapicid());
|
||||
return;
|
||||
}
|
||||
|
||||
if ((lapic_read(LAPIC_ICR) & LAPIC_ICR_BUSY)) {
|
||||
printk(BIOS_DEBUG, "Waiting for ICR not to be busy...");
|
||||
if (apic_wait_timeout(1000 /* 1 ms */, 50)) {
|
||||
|
Reference in New Issue
Block a user