[coreboot-gerrit] New patch to review for coreboot: WIP:cpu/x86: allow the number of APs to be specified for running code in parallel to BSP.

Bora Guvendik (bora.guvendik@intel.com) gerrit at coreboot.org
Thu Dec 29 00:51:33 CET 2016


Bora Guvendik (bora.guvendik at intel.com) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/17986

-gerrit

commit eaaf23b76c0b3c2657dfede852bf364417d22409
Author: Bora Guvendik <bora.guvendik at intel.com>
Date:   Wed Dec 28 14:46:11 2016 -0800

    WIP:cpu/x86: allow the number of APs to be specified for running
    	     code in parallel to BSP.
    
    Allow the number of APs,that will run a piece of code, to be specified.
    In some cases, a single AP needs to run the code alone.
    
    BUG=chrome-os-partner:56656
    BRANCH=reef
    TEST=None
    
    Change-Id: I39d0210886428187cd7c6e75b3473dd5c733842c
    Signed-off-by: Bora Guvendik <bora.guvendik at intel.com>
---
 src/cpu/x86/mp_init.c    | 22 ++++++++++++++++++----
 src/include/cpu/x86/mp.h |  3 +++
 2 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/src/cpu/x86/mp_init.c b/src/cpu/x86/mp_init.c
index c989963..57f670b 100644
--- a/src/cpu/x86/mp_init.c
+++ b/src/cpu/x86/mp_init.c
@@ -855,10 +855,11 @@ static void store_callback(mp_callback_t *slot, mp_callback_t value)
 	*(volatile mp_callback_t *)slot = value;
 }
 
-static int run_ap_work(mp_callback_t func, long expire_us)
+static int run_ap_work(mp_callback_t func, long expire_us, int num_aps_needed)
 {
 	int i;
 	int cpus_accepted;
+	int cpus_signaled = 0;
 	struct stopwatch sw;
 	int cur_cpu = cpu_index();
 
@@ -867,11 +868,17 @@ static int run_ap_work(mp_callback_t func, long expire_us)
 		return -1;
 	}
 
+	if ( num_aps_needed > ARRAY_SIZE(ap_callbacks) )
+		return -1;
+
 	/* Signal to all the APs to run the func. */
 	for (i = 0; i < ARRAY_SIZE(ap_callbacks); i++) {
 		if (cur_cpu == i)
 			continue;
 		store_callback(&ap_callbacks[i], func);
+		cpus_signaled++;
+		if ( cpus_signaled == num_aps_needed )
+			break;
 	}
 	mfence();
 
@@ -883,13 +890,15 @@ static int run_ap_work(mp_callback_t func, long expire_us)
 				continue;
 			if (read_callback(&ap_callbacks[i]) == NULL)
 				cpus_accepted++;
+			if ( cpus_accepted == num_aps_needed )
+				break;
 		}
-		if (cpus_accepted == global_num_aps)
+		if (cpus_accepted == num_aps_needed)
 			return 0;
 	}
 
 	printk(BIOS_ERR, "AP call expired. %d/%d CPUs accepted.\n",
-		cpus_accepted, global_num_aps);
+		cpus_accepted, num_aps_needed);
 	return -1;
 }
 
@@ -916,7 +925,12 @@ static void ap_wait_for_instruction(void)
 
 int mp_run_on_aps(void (*func)(void), long expire_us)
 {
-	return run_ap_work(func, expire_us);
+	return run_ap_work(func, expire_us, ARRAY_SIZE(ap_callbacks));
+}
+
+int mp_run_on_single_ap(void (*func)(void), long expire_us)
+{
+	return run_ap_work(func, expire_us, 1);
 }
 
 int mp_run_on_all_cpus(void (*func)(void), long expire_us)
diff --git a/src/include/cpu/x86/mp.h b/src/include/cpu/x86/mp.h
index b9b4d57..8220530 100644
--- a/src/include/cpu/x86/mp.h
+++ b/src/include/cpu/x86/mp.h
@@ -133,6 +133,9 @@ int mp_init_with_smm(struct bus *cpu_bus, const struct mp_ops *mp_ops);
  */
 int mp_run_on_aps(void (*func)(void), long expire_us);
 
+/* Like mp_run_on_aps() but runs func on only one ap */
+int mp_run_on_single_ap(void (*func)(void), long expire_us);
+
 /* Like mp_run_on_aps() but also runs func on BSP. */
 int mp_run_on_all_cpus(void (*func)(void), long expire_us);
 



More information about the coreboot-gerrit mailing list