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>
This commit is contained in:
Timothy Pearson 2015-11-24 14:12:02 -06:00 committed by Martin Roth
parent b410d267e3
commit cb1dec57dc
2 changed files with 21 additions and 0 deletions

View File

@ -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;

View File

@ -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);