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@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/173982 Reviewed-on: http://review.coreboot.org/4891 Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com> Tested-by: build bot (Jenkins)
This commit is contained in:
parent
d0520406ed
commit
cd3f8ad235
|
@ -584,3 +584,34 @@ int mp_get_apic_id(int cpu_slot)
|
||||||
|
|
||||||
return cpus[cpu_slot].apic_id;
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -117,4 +117,13 @@ void mp_initialize_cpu(void *unused);
|
||||||
/* Returns apic id for coreboot cpu number or < 0 on failure. */
|
/* Returns apic id for coreboot cpu number or < 0 on failure. */
|
||||||
int mp_get_apic_id(int cpu_slot);
|
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_ */
|
#endif /* _X86_MP_H_ */
|
||||||
|
|
Loading…
Reference in New Issue