[coreboot-gerrit] Patch set updated for coreboot: 4419591 x86: Add SMM helper functions to MP infrastructure

Aaron Durbin (adurbin@google.com) gerrit at coreboot.org
Tue Jan 28 06:45:25 CET 2014


Aaron Durbin (adurbin at google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/4891

-gerrit

commit 44195917f734bd8623febc96e99a9c8da4a8bdc5
Author: Aaron Durbin <adurbin at chromium.org>
Date:   Mon Oct 21 22:24:40 2013 -0500

    x86: Add SMM helper functions to MP infrastructure
    
    In order for the cpu code to start SMM relocation 2 new
    functions are added to be shared:
    - void smm_initiate_relocation_parallel()
    - void smm_initiate_relocation()
    The both initiate an SMI on the currently running cpu.
    The 2 variants allow for parallel relocation or serialized
    relocation.
    
    BUG=chrome-os-partner:22862
    BRANCH=None
    TEST=Built and booted rambi using these functions.
    
    Change-Id: I325777bac27e9a0efc3f54f7223c38310604c5a2
    Signed-off-by: Aaron Durbin <adurbin at chromium.org>
    Reviewed-on: https://chromium-review.googlesource.com/173982
---
 src/cpu/x86/mp_init.c    | 31 +++++++++++++++++++++++++++++++
 src/include/cpu/x86/mp.h |  9 +++++++++
 2 files changed, 40 insertions(+)

diff --git a/src/cpu/x86/mp_init.c b/src/cpu/x86/mp_init.c
index 242d656..676c2f6 100644
--- a/src/cpu/x86/mp_init.c
+++ b/src/cpu/x86/mp_init.c
@@ -584,3 +584,34 @@ int mp_get_apic_id(int cpu_slot)
 
 	return cpus[cpu_slot].apic_id;
 }
+
+void smm_initiate_relocation_parallel(void)
+{
+	if ((lapic_read(LAPIC_ICR) & LAPIC_ICR_BUSY)) {
+		printk(BIOS_DEBUG, "Waiting for ICR not to be busy...");
+		if (apic_wait_timeout(1000 /* 1 ms */, 50)) {
+			printk(BIOS_DEBUG, "timed out. Aborting.\n");
+			return;
+		} else
+			printk(BIOS_DEBUG, "done.\n");
+	}
+
+	lapic_write_around(LAPIC_ICR2, SET_LAPIC_DEST_FIELD(lapicid()));
+	lapic_write_around(LAPIC_ICR, LAPIC_INT_ASSERT | LAPIC_DM_SMI);
+	if (apic_wait_timeout(1000 /* 1 ms */, 100 /* us */)) {
+		printk(BIOS_DEBUG, "SMI Relocation timed out.\n");
+	} else
+		printk(BIOS_DEBUG, "Relocation complete.\n");
+
+}
+
+DECLARE_SPIN_LOCK(smm_relocation_lock);
+
+/* Send SMI to self with single user serialization. */
+void smm_initiate_relocation(void)
+{
+	spin_lock(&smm_relocation_lock);
+	smm_initiate_relocation_parallel();
+	spin_unlock(&smm_relocation_lock);
+}
+
diff --git a/src/include/cpu/x86/mp.h b/src/include/cpu/x86/mp.h
index 5112848..7e90ee4 100644
--- a/src/include/cpu/x86/mp.h
+++ b/src/include/cpu/x86/mp.h
@@ -117,4 +117,13 @@ void mp_initialize_cpu(void *unused);
 /* Returns apic id for coreboot cpu number or < 0 on failure. */
 int mp_get_apic_id(int cpu_slot);
 
+/*
+ * SMM helpers to use with initializing CPUs.
+ */
+
+/* Send SMI to self without any serialization. */
+void smm_initiate_relocation_parallel(void);
+/* Send SMI to self with single execution. */
+void smm_initiate_relocation(void);
+
 #endif /* _X86_MP_H_ */



More information about the coreboot-gerrit mailing list