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 40ca79714a.

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>
This commit is contained in:
Nick Vaccaro 2022-03-17 13:06:49 -07:00 committed by Subrata Banik
parent 96669864bd
commit 1abbb96c36
1 changed files with 17 additions and 4 deletions

View File

@ -94,10 +94,23 @@ efi_return_status_t mp_startup_all_cpus(efi_ap_procedure procedure,
/* Run on BSP */ /* Run on BSP */
procedure(argument); procedure(argument);
/* Run on APs */ /*
if (mp_run_on_aps((void *)procedure, argument, * Run on APs Serially
MP_RUN_ON_ALL_CPUS, timeout_usec) != CB_SUCCESS) { *
printk(BIOS_ERR, "%s: Exit with Failure\n", __func__); * 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; return FSP_NOT_STARTED;
} }