summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Durbin <adurbin@chromium.org>2013-04-24 22:33:08 -0500
committerRonald G. Minnich <rminnich@gmail.com>2013-05-01 07:07:33 +0200
commit0a6c20a2a3bc16aa12b04dd3db1d1260777edf0e (patch)
treed5ab49da23e52e262c016ed7cb3a11f8e6a1556e
parenta4feddf897023b37cfac2af529e787504849f985 (diff)
downloadcoreboot-0a6c20a2a3bc16aa12b04dd3db1d1260777edf0e.tar.xz
acpi: split resume check and actual resume code
It's helpful to provide a distinct state that affirmatively describes that OS resume will occur. The previous code included the check and the actual resuming in one function. Because of this grouping one had to annotate the innards of the ACPI resume path to perform specific actions before OS resume. By providing a distinct state in the boot state machine the necessary actions can be scheduled accordingly without modifying the ACPI code. Change-Id: I8b00aacaf820cbfbb21cb851c422a143371878bd Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: http://review.coreboot.org/3134 Tested-by: build bot (Jenkins) Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
-rw-r--r--src/arch/x86/boot/acpi.c40
-rw-r--r--src/arch/x86/include/arch/acpi.h2
-rw-r--r--src/include/bootstate.h1
-rw-r--r--src/lib/hardwaremain.c24
4 files changed, 39 insertions, 28 deletions
diff --git a/src/arch/x86/boot/acpi.c b/src/arch/x86/boot/acpi.c
index 96ece06af9..1c373ac6c0 100644
--- a/src/arch/x86/boot/acpi.c
+++ b/src/arch/x86/boot/acpi.c
@@ -622,37 +622,31 @@ void acpi_write_hest(acpi_hest_t *hest)
}
#if CONFIG_HAVE_ACPI_RESUME
-void suspend_resume(void)
+void acpi_resume(void *wake_vec)
{
- void *wake_vec;
-
- /* If we happen to be resuming find wakeup vector and jump to OS. */
- wake_vec = acpi_find_wakeup_vector();
- if (wake_vec) {
#if CONFIG_HAVE_SMI_HANDLER
- u32 *gnvs_address = cbmem_find(CBMEM_ID_ACPI_GNVS_PTR);
+ u32 *gnvs_address = cbmem_find(CBMEM_ID_ACPI_GNVS_PTR);
- /* Restore GNVS pointer in SMM if found */
- if (gnvs_address && *gnvs_address) {
- printk(BIOS_DEBUG, "Restore GNVS pointer to 0x%08x\n",
- *gnvs_address);
- smm_setup_structures((void *)*gnvs_address, NULL, NULL);
- }
+ /* Restore GNVS pointer in SMM if found */
+ if (gnvs_address && *gnvs_address) {
+ printk(BIOS_DEBUG, "Restore GNVS pointer to 0x%08x\n",
+ *gnvs_address);
+ smm_setup_structures((void *)*gnvs_address, NULL, NULL);
+ }
#endif
- /* Call mainboard resume handler first, if defined. */
- if (mainboard_suspend_resume)
- mainboard_suspend_resume();
+ /* Call mainboard resume handler first, if defined. */
+ if (mainboard_suspend_resume)
+ mainboard_suspend_resume();
#if CONFIG_COVERAGE
- coverage_exit();
+ coverage_exit();
#endif
- /* Tear down the caching of the ROM. */
- if (disable_cache_rom)
- disable_cache_rom();
+ /* Tear down the caching of the ROM. */
+ if (disable_cache_rom)
+ disable_cache_rom();
- post_code(POST_OS_RESUME);
- acpi_jump_to_wakeup(wake_vec);
- }
+ post_code(POST_OS_RESUME);
+ acpi_jump_to_wakeup(wake_vec);
}
/* This is to be filled by SB code - startup value what was found. */
diff --git a/src/arch/x86/include/arch/acpi.h b/src/arch/x86/include/arch/acpi.h
index 022a45fd52..306f7da046 100644
--- a/src/arch/x86/include/arch/acpi.h
+++ b/src/arch/x86/include/arch/acpi.h
@@ -558,7 +558,7 @@ void acpi_save_gnvs(u32 gnvs_address);
/* 0 = S0, 1 = S1 ...*/
extern u8 acpi_slp_type;
-void suspend_resume(void);
+void acpi_resume(void *wake_vec);
void __attribute__((weak)) mainboard_suspend_resume(void);
void *acpi_find_wakeup_vector(void);
void *acpi_get_wakeup_rsdp(void);
diff --git a/src/include/bootstate.h b/src/include/bootstate.h
index f28c07f17c..f732d1e1a2 100644
--- a/src/include/bootstate.h
+++ b/src/include/bootstate.h
@@ -96,6 +96,7 @@ typedef enum {
BS_DEV_ENABLE,
BS_DEV_INIT,
BS_POST_DEVICE,
+ BS_OS_RESUME_CHECK,
BS_OS_RESUME,
BS_WRITE_TABLES,
BS_PAYLOAD_LOAD,
diff --git a/src/lib/hardwaremain.c b/src/lib/hardwaremain.c
index 0a5a522b99..d8b9d433f6 100644
--- a/src/lib/hardwaremain.c
+++ b/src/lib/hardwaremain.c
@@ -54,6 +54,7 @@ static boot_state_t bs_dev_resources(void *arg);
static boot_state_t bs_dev_eanble(void *arg);
static boot_state_t bs_dev_init(void *arg);
static boot_state_t bs_post_device(void *arg);
+static boot_state_t bs_os_resume_check(void *arg);
static boot_state_t bs_os_resume(void *arg);
static boot_state_t bs_write_tables(void *arg);
static boot_state_t bs_payload_load(void *arg);
@@ -88,6 +89,7 @@ static struct boot_state boot_states[] = {
BS_INIT_ENTRY(BS_DEV_ENABLE, bs_dev_eanble),
BS_INIT_ENTRY(BS_DEV_INIT, bs_dev_init),
BS_INIT_ENTRY(BS_POST_DEVICE, bs_post_device),
+ BS_INIT_ENTRY(BS_OS_RESUME_CHECK, bs_os_resume_check),
BS_INIT_ENTRY(BS_OS_RESUME, bs_os_resume),
BS_INIT_ENTRY(BS_WRITE_TABLES, bs_write_tables),
BS_INIT_ENTRY(BS_PAYLOAD_LOAD, bs_payload_load),
@@ -157,21 +159,35 @@ static boot_state_t bs_post_device(void *arg)
timestamp_sync();
- return BS_OS_RESUME;
+ return BS_OS_RESUME_CHECK;
}
-static boot_state_t bs_os_resume(void *arg)
+static boot_state_t bs_os_resume_check(void *arg)
{
#if CONFIG_HAVE_ACPI_RESUME
- suspend_resume();
+ void *wake_vector;
+
+ wake_vector = acpi_find_wakeup_vector();
+
+ if (wake_vector != NULL) {
+ boot_states[BS_OS_RESUME].arg = wake_vector;
+ return BS_OS_RESUME;
+ }
post_code(0x8a);
#endif
-
timestamp_add_now(TS_CBMEM_POST);
return BS_WRITE_TABLES;
}
+static boot_state_t bs_os_resume(void *wake_vector)
+{
+#if CONFIG_HAVE_ACPI_RESUME
+ acpi_resume(wake_vector);
+#endif
+ return BS_WRITE_TABLES;
+}
+
static boot_state_t bs_write_tables(void *arg)
{
if (cbmem_post_handling)