summaryrefslogtreecommitdiffstats
path: root/resources/libreboot/patch/coreboot/369b561315ca68d0cdedc38208105a513c7139b5/grub/kcma-d8/0036-cpu-amd-fam10h-fam15h-Add-new-wait_ap_stopped-functi.patch
diff options
context:
space:
mode:
Diffstat (limited to 'resources/libreboot/patch/coreboot/369b561315ca68d0cdedc38208105a513c7139b5/grub/kcma-d8/0036-cpu-amd-fam10h-fam15h-Add-new-wait_ap_stopped-functi.patch')
-rw-r--r--resources/libreboot/patch/coreboot/369b561315ca68d0cdedc38208105a513c7139b5/grub/kcma-d8/0036-cpu-amd-fam10h-fam15h-Add-new-wait_ap_stopped-functi.patch66
1 files changed, 66 insertions, 0 deletions
diff --git a/resources/libreboot/patch/coreboot/369b561315ca68d0cdedc38208105a513c7139b5/grub/kcma-d8/0036-cpu-amd-fam10h-fam15h-Add-new-wait_ap_stopped-functi.patch b/resources/libreboot/patch/coreboot/369b561315ca68d0cdedc38208105a513c7139b5/grub/kcma-d8/0036-cpu-amd-fam10h-fam15h-Add-new-wait_ap_stopped-functi.patch
new file mode 100644
index 0000000..ec82f70
--- /dev/null
+++ b/resources/libreboot/patch/coreboot/369b561315ca68d0cdedc38208105a513c7139b5/grub/kcma-d8/0036-cpu-amd-fam10h-fam15h-Add-new-wait_ap_stopped-functi.patch
@@ -0,0 +1,66 @@
+From 3b1c5530e745b77411f3a9db1872a8592ac79bf5 Mon Sep 17 00:00:00 2001
+From: Timothy Pearson <tpearson@raptorengineeringinc.com>
+Date: Tue, 24 Nov 2015 14:12:02 -0600
+Subject: [PATCH 36/45] 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.
+
+Signed-off-by: Timothy Pearson <tpearson@raptorengineeringinc.com>
+---
+ src/cpu/amd/family_10h-family_15h/init_cpus.c | 20 ++++++++++++++++++++
+ src/include/cpu/amd/multicore.h | 1 +
+ 2 files changed, 21 insertions(+)
+
+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 e8e81d2..e2a1bf3 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 b3a8237..0ddf866 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);
+--
+2.1.4
+