Subrata Banik has uploaded this change for review. ( https://review.coreboot.org/25622
Change subject: cpu/x86: Refactor run_ap_work() function to support no timeout ......................................................................
cpu/x86: Refactor run_ap_work() function to support no timeout
There might be certain requirement in user function where user might not want to pass any timeout value, in those cases run_ap_work() should consider infinity as timeout and perform all APs initialization as per specification.
BRANCH=none BUG=b:74436746 TEST=run_ap_work() is running successfully with 0 expire_us.
Change-Id: Iacd67768c8a120f6a01baaa6817468f6b9a3b764 Signed-off-by: Subrata Banik subrata.banik@intel.com --- M src/cpu/x86/mp_init.c 1 file changed, 37 insertions(+), 16 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/22/25622/1
diff --git a/src/cpu/x86/mp_init.c b/src/cpu/x86/mp_init.c index 52feca9..f1600fd 100644 --- a/src/cpu/x86/mp_init.c +++ b/src/cpu/x86/mp_init.c @@ -946,6 +946,24 @@ *(volatile mp_callback_t *)slot = value; }
+static int execute_callback_on_ap(void) +{ + int cpus_accepted; + int i; + int cur_cpu = cpu_index(); + + cpus_accepted = 0; + + for (i = 0; i < ARRAY_SIZE(ap_callbacks); i++) { + if (cur_cpu == i) + continue; + if (read_callback(&ap_callbacks[i]) == NULL) + cpus_accepted++; + } + + return cpus_accepted; +} + static int run_ap_work(mp_callback_t func, long expire_us) { int i; @@ -966,22 +984,25 @@ } mfence();
- /* Wait for all the APs to signal back that call has been accepted. */ - stopwatch_init_usecs_expire(&sw, expire_us); - do { - cpus_accepted = 0; - - for (i = 0; i < ARRAY_SIZE(ap_callbacks); i++) { - if (cur_cpu == i) - continue; - if (read_callback(&ap_callbacks[i]) == NULL) - cpus_accepted++; - } - - if (cpus_accepted == global_num_aps) - return 0; - } while (!stopwatch_expired(&sw)); - + if (expire_us) { + /* + * Wait for all the APs to signal back that call has been + * accepted. + */ + stopwatch_init_usecs_expire(&sw, expire_us); + do { + cpus_accepted = execute_callback_on_ap(); + if (cpus_accepted == global_num_aps) + return 0; + } while (!stopwatch_expired(&sw)); + } else { + /* Wait for all the APs to signal back with no timeout */ + do { + cpus_accepted = execute_callback_on_ap(); + if (cpus_accepted == global_num_aps) + return 0; + } while (1); + } printk(BIOS_ERR, "AP call expired. %d/%d CPUs accepted.\n", cpus_accepted, global_num_aps); return -1;