summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTimothy Pearson <tpearson@raptorengineeringinc.com>2015-11-24 14:12:02 -0600
committerMartin Roth <martinroth@google.com>2016-02-01 22:57:08 +0100
commitcb1dec57dc9458869692ff23c0b5ac2461ae0bcb (patch)
tree6f1e548e5111e40c78c032cf15f0846d172d0cae /src
parentb410d267e33ca2e4a154fc2cb0221d1afed18a56 (diff)
downloadcoreboot-cb1dec57dc9458869692ff23c0b5ac2461ae0bcb.tar.xz
cpu/amd/fam10h-fam15h: Add new wait_ap_stopped function
Under certain conditions, such as when microcode updates are being performed, it is important to make sure all APs have finished updates and are halted before continuing with the boot process. Add a new wait_ap_stopped() function to allow for this functionality to be added to the appropriate mainboard romstage source files. Change-Id: Ib455c937888a58b283bd3f8fda1b486eea41b0a7 Signed-off-by: Timothy Pearson <tpearson@raptorengineeringinc.com> Reviewed-on: https://review.coreboot.org/13168 Tested-by: build bot (Jenkins) Tested-by: Raptor Engineering Automated Test Stand <noreply@raptorengineeringinc.com> Reviewed-by: Martin Roth <martinroth@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/cpu/amd/family_10h-family_15h/init_cpus.c20
-rw-r--r--src/include/cpu/amd/multicore.h1
2 files changed, 21 insertions, 0 deletions
diff --git a/src/cpu/amd/family_10h-family_15h/init_cpus.c b/src/cpu/amd/family_10h-family_15h/init_cpus.c
index e8e81d2fd8..e2a1bf3688 100644
--- a/src/cpu/amd/family_10h-family_15h/init_cpus.c
+++ b/src/cpu/amd/family_10h-family_15h/init_cpus.c
@@ -299,6 +299,26 @@ void allow_all_aps_stop(u32 bsp_apicid)
lapic_write(LAPIC_MSG_REG, (bsp_apicid << 24) | F10_APSTATE_STOPPED);
}
+static void wait_ap_stopped(u32 ap_apicid, void *gp)
+{
+ u32 timeout;
+ timeout = wait_cpu_state(ap_apicid, F10_APSTATE_ASLEEP, F10_APSTATE_ASLEEP);
+ printk(BIOS_DEBUG, "* AP %02x", ap_apicid);
+ if (timeout) {
+ printk(BIOS_DEBUG, " timed out:%08x\n", timeout);
+ } else {
+ printk(BIOS_DEBUG, "stopped\n");
+ }
+}
+
+void wait_all_other_cores_stopped(u32 bsp_apicid)
+{
+ // all aps other than core0
+ printk(BIOS_DEBUG, "stopped ap apicid: ");
+ for_each_ap(bsp_apicid, 2, -1, wait_ap_stopped, (void *)0);
+ printk(BIOS_DEBUG, "\n");
+}
+
static void enable_apic_ext_id(u32 node)
{
u32 val;
diff --git a/src/include/cpu/amd/multicore.h b/src/include/cpu/amd/multicore.h
index b3a82379b4..0ddf866f64 100644
--- a/src/include/cpu/amd/multicore.h
+++ b/src/include/cpu/amd/multicore.h
@@ -35,6 +35,7 @@ void amd_sibling_init(struct device *cpu);
void wait_all_core0_started(void);
void wait_all_other_cores_started(u32 bsp_apicid);
void wait_all_aps_started(u32 bsp_apicid);
+void wait_all_other_cores_stopped(uint32_t bsp_apicid);
void allow_all_aps_stop(u32 bsp_apicid);
#endif
u32 get_initial_apicid(void);