summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Vaccaro <nvaccaro@google.com>2022-03-17 13:06:49 -0700
committerSubrata Banik <subratabanik@google.com>2022-03-18 07:24:04 +0000
commit1abbb96c36978b5af167c0ed682403a48f32ab05 (patch)
treeae238d94edddadd6ce3f42728a62d75ea1821405
parent96669864bdbda9f75abf3e7845a84921ea95c1a9 (diff)
Revert "Revert "drivers/intel/fsp2_0: Allow `mp_startup_all_cpus()` to run serially""
This reverts a change that was causing hangs and exceptions during boot on an ADL brya4es. The hang (or APIC exception) occurs at what appears to be the FSP MP initialization sequence, prior to the "Display FSP Version Info HOB" log being displayed : [DEBUG] Detected 10 core, 12 thread CPU. [DEBUG] Display FSP Version Info HOB This reverts commit 40ca79714ad7d5f2aa201d83db4d97f21260d924. BUG=b:224873032 TEST=`emerge-brya coreboot chromeos-bootimage`, flash and verify brya4es is able to successfully reboot 200 times without any issues. Change-Id: I88c15a51c5d27fbd243478c923e75962d3f8d67d Signed-off-by: Nick Vaccaro <nvaccaro@google.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/62907 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Subrata Banik <subratabanik@google.com> Reviewed-by: Ronak Kanabar <ronak.kanabar@intel.com> Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
-rw-r--r--src/drivers/intel/fsp2_0/ppi/mp_service_ppi.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/src/drivers/intel/fsp2_0/ppi/mp_service_ppi.c b/src/drivers/intel/fsp2_0/ppi/mp_service_ppi.c
index 50e35b0e8f..9aef1b6dce 100644
--- a/src/drivers/intel/fsp2_0/ppi/mp_service_ppi.c
+++ b/src/drivers/intel/fsp2_0/ppi/mp_service_ppi.c
@@ -94,10 +94,23 @@ efi_return_status_t mp_startup_all_cpus(efi_ap_procedure procedure,
/* Run on BSP */
procedure(argument);
- /* Run on APs */
- if (mp_run_on_aps((void *)procedure, argument,
- MP_RUN_ON_ALL_CPUS, timeout_usec) != CB_SUCCESS) {
- printk(BIOS_ERR, "%s: Exit with Failure\n", __func__);
+ /*
+ * Run on APs Serially
+ *
+ * FIXME: As per MP service specification, EDK2 is allowed to specify the mode
+ * in which a 'func' routine should be executed on APs (i.e. execute serially
+ * or concurrently).
+ *
+ * MP service API `StartupAllCPUs` doesn't specify such requirement.
+ * Hence, running the `CpuCacheInfoCollectCoreAndCacheData`
+ * (UefiCpuPkg/Library/CpuCacheInfoLib/CpuCacheInfoLib.c#194)
+ * simultaneously on APs results in a coherency issue (hang while executing `func`)
+ * due to lack of acquiring a spin lock while accessing common data structure in
+ * multiprocessor environment.
+ */
+ if (mp_run_on_all_aps((void *)procedure, argument, timeout_usec, false) !=
+ CB_SUCCESS) {
+ printk(BIOS_DEBUG, "%s: Exit with Failure\n", __func__);
return FSP_NOT_STARTED;
}