soc/*: mp_run_on_all_cpus: Remove configurable timeout

Some timeouts given were too small when serial console is enabled due to
its spinlock making code runtime worse with every AP present.

In addition we usually don't know how long specific code runs and how
long ago it was sent to the APs.

Remove the timeout argument from mp_run_on_all_cpus and instead wait up
to 1 second, to prevent possible crashing of secondary APs still
processing the old job.

Tested on Supermicro X11SSH-TF.

Change-Id: I456be647b159f7a2ea7d94986a24424e56dcc8c4
Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/34587
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Reviewed-by: Philipp Deppenwiese <zaolin.daisuki@gmail.com>
This commit is contained in:
Patrick Rudolph 2019-07-26 14:47:32 +02:00 committed by Patrick Rudolph
parent 1bc6bf1152
commit 5ec97cea67
8 changed files with 13 additions and 12 deletions

View File

@ -964,12 +964,13 @@ int mp_run_on_aps(void (*func)(void *), void *arg, int logical_cpu_num,
return run_ap_work(&lcb, expire_us);
}
int mp_run_on_all_cpus(void (*func)(void *), void *arg, long expire_us)
int mp_run_on_all_cpus(void (*func)(void *), void *arg)
{
/* Run on BSP first. */
func(arg);
return mp_run_on_aps(func, arg, MP_RUN_ON_ALL_CPUS, expire_us);
/* For up to 1 second for AP to finish previous work. */
return mp_run_on_aps(func, arg, MP_RUN_ON_ALL_CPUS, 1000 * USECS_PER_MSEC);
}
int mp_park_aps(void)
@ -981,7 +982,7 @@ int mp_park_aps(void)
stopwatch_init(&sw);
ret = mp_run_on_aps(park_this_cpu, NULL, MP_RUN_ON_ALL_CPUS,
250 * USECS_PER_MSEC);
1000 * USECS_PER_MSEC);
duration_msecs = stopwatch_duration_msecs(&sw);

View File

@ -137,7 +137,7 @@ int mp_run_on_aps(void (*func)(void *), void *arg, int logical_cpu_num,
long expire_us);
/* Like mp_run_on_aps() but also runs func on BSP. */
int mp_run_on_all_cpus(void (*func)(void *), void *arg, long expire_us);
int mp_run_on_all_cpus(void (*func)(void *), void *arg);
/*
* Park all APs to prepare for OS boot. This is handled automatically

View File

@ -44,7 +44,7 @@ static void finalize_cores(void)
int r;
printk(BIOS_SPEW, "Lock SMM configuration\n");
r = mp_run_on_all_cpus(per_core_finalize, NULL, 10 * USECS_PER_MSEC);
r = mp_run_on_all_cpus(per_core_finalize, NULL);
if (r)
printk(BIOS_WARNING, "Failed to finalize all cores\n");
}

View File

@ -44,7 +44,7 @@ static void finalize_cores(void)
int r;
printk(BIOS_SPEW, "Lock SMM configuration\n");
r = mp_run_on_all_cpus(per_core_finalize, NULL, 10 * USECS_PER_MSEC);
r = mp_run_on_all_cpus(per_core_finalize, NULL);
if (r)
printk(BIOS_WARNING, "Failed to finalize all cores\n");
}

View File

@ -764,7 +764,7 @@ struct chip_operations soc_intel_apollolake_ops = {
static void drop_privilege_all(void)
{
/* Drop privilege level on all the CPUs */
if (mp_run_on_all_cpus(&cpu_enable_untrusted_mode, NULL, 1000) < 0)
if (mp_run_on_all_cpus(&cpu_enable_untrusted_mode, NULL) < 0)
printk(BIOS_ERR, "failed to enable untrusted mode\n");
}

View File

@ -256,7 +256,7 @@ static void post_mp_init(void)
smm_southbridge_enable(PWRBTN_EN | GBL_EN);
if (CONFIG(SOC_INTEL_COMMON_BLOCK_SGX))
mp_run_on_all_cpus(sgx_configure, NULL, 2000);
mp_run_on_all_cpus(sgx_configure, NULL);
}
static const struct mp_ops mp_ops = {

View File

@ -159,7 +159,7 @@ static void post_cpus_init(void *unused)
if (CONFIG(USE_INTEL_FSP_MP_INIT))
return;
if (mp_run_on_all_cpus(&wrapper_x86_setup_mtrrs, NULL, 1000) < 0)
if (mp_run_on_all_cpus(&wrapper_x86_setup_mtrrs, NULL) < 0)
printk(BIOS_ERR, "MTRR programming failure\n");
x86_mtrr_check();

View File

@ -491,11 +491,11 @@ static void post_mp_init(void)
if (CONFIG(HAVE_SMI_HANDLER))
smm_lock();
ret |= mp_run_on_all_cpus(vmx_configure, NULL, 2 * USECS_PER_MSEC);
ret |= mp_run_on_all_cpus(vmx_configure, NULL);
ret |= mp_run_on_all_cpus(sgx_configure, NULL, 14 * USECS_PER_MSEC);
ret |= mp_run_on_all_cpus(sgx_configure, NULL);
ret |= mp_run_on_all_cpus(fc_lock_configure, NULL, 2 * USECS_PER_MSEC);
ret |= mp_run_on_all_cpus(fc_lock_configure, NULL);
if (ret)
printk(BIOS_CRIT, "CRITICAL ERROR: MP post init failed\n");