[coreboot-gerrit] Patch set updated for coreboot: f7c0962 arm64: add timeout waiting for CPUs to come online

Patrick Georgi (pgeorgi@google.com) gerrit at coreboot.org
Fri Apr 10 15:00:26 CEST 2015


Patrick Georgi (pgeorgi at google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/9526

-gerrit

commit f7c0962124a9e092d210175bae71f17f2795a715
Author: Aaron Durbin <adurbin at chromium.org>
Date:   Thu Nov 20 11:11:01 2014 -0600

    arm64: add timeout waiting for CPUs to come online
    
    The initial MP code assumed all CPUs would come online. That's not
    very defensive, and it is a bad assumption. Provide a timeout
    mechanism for bring CPUs online.
    
    BUG=chrome-os-partner:33962
    BRANCH=None
    TEST=Multiple times with CPUs working and not working. Boot to kernel.
    
    Change-Id: Ib0aef31f5c732816d65c2e4b3c6a89e159974fdc
    Signed-off-by: Patrick Georgi <pgeorgi at chromium.org>
    Original-Commit-Id: 9cf5bc2844c8f4ad987cfcb69ef33c73551f0083
    Original-Signed-off-by: Aaron Durbin <adurbin at chromium.org>
    Original-Change-Id: Ifb3b72e3f122b79e9def554c037c9b3d6049a151
    Original-Reviewed-on: https://chromium-review.googlesource.com/231070
    Original-Reviewed-by: Furquan Shaikh <furquan at chromium.org>
---
 src/arch/arm64/cpu_ramstage.c | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/src/arch/arm64/cpu_ramstage.c b/src/arch/arm64/cpu_ramstage.c
index f286678..ce81f93 100644
--- a/src/arch/arm64/cpu_ramstage.c
+++ b/src/arch/arm64/cpu_ramstage.c
@@ -23,6 +23,7 @@
 #include <cpu/cpu.h>
 #include <console/console.h>
 #include <gic.h>
+#include <timer.h>
 #include "cpu-internal.h"
 
 static inline void cpu_disable_dev(device_t dev)
@@ -191,6 +192,7 @@ void arch_initialize_cpus(device_t cluster, struct cpu_control_ops *cntrl_ops)
 	for (i = 0; i < max_cpus; i++) {
 		device_t dev;
 		struct cpu_action action;
+		struct stopwatch sw;
 
 		ci = cpu_info_for_cpu(i);
 		dev = ci->cpu;
@@ -211,9 +213,23 @@ void arch_initialize_cpus(device_t cluster, struct cpu_control_ops *cntrl_ops)
 					"Failed to start CPU%x\n", ci->id);
 				continue;
 			}
+			stopwatch_init_msecs_expire(&sw, 1000);
 			/* Wait for CPU to come online. */
-			while (!cpu_online(ci));
-			printk(BIOS_DEBUG, "CPU%x online.\n", ci->id);
+			while (!stopwatch_expired(&sw)) {
+				if (!cpu_online(ci))
+					continue;
+				printk(BIOS_DEBUG,
+					"CPU%x online in %ld usecs.\n",
+					ci->id, stopwatch_duration_usecs(&sw));
+				break;
+			}
+		}
+
+		if (!cpu_online(ci)) {
+			printk(BIOS_DEBUG,
+				"CPU%x failed to come online in %ld usecs.\n",
+				ci->id, stopwatch_duration_usecs(&sw));
+			continue;
 		}
 
 		/* Send it the init action. */



More information about the coreboot-gerrit mailing list