summaryrefslogtreecommitdiff
path: root/src/arch/x86
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/x86')
-rw-r--r--src/arch/x86/boot/acpi.c8
-rw-r--r--src/arch/x86/boot/cbmem.c15
-rw-r--r--src/arch/x86/include/arch/acpi.h2
3 files changed, 24 insertions, 1 deletions
diff --git a/src/arch/x86/boot/acpi.c b/src/arch/x86/boot/acpi.c
index 96cb270814..0e09ec58c6 100644
--- a/src/arch/x86/boot/acpi.c
+++ b/src/arch/x86/boot/acpi.c
@@ -645,12 +645,18 @@ void acpi_resume(void *wake_vec)
/* This is to be filled by SB code - startup value what was found. */
u8 acpi_slp_type = 0;
-static int acpi_is_wakeup(void)
+int acpi_is_wakeup(void)
{
/* Both resume from S2 and resume from S3 restart at CPU reset */
return (acpi_slp_type == 3 || acpi_slp_type == 2);
}
+void acpi_fail_wakeup(void)
+{
+ if (acpi_slp_type == 3 || acpi_slp_type == 2)
+ acpi_slp_type = 0;
+}
+
static acpi_rsdp_t *valid_rsdp(acpi_rsdp_t *rsdp)
{
if (strncmp((char *)rsdp, RSDP_SIG, sizeof(RSDP_SIG) - 1) != 0)
diff --git a/src/arch/x86/boot/cbmem.c b/src/arch/x86/boot/cbmem.c
index bdc695c85d..01520187f9 100644
--- a/src/arch/x86/boot/cbmem.c
+++ b/src/arch/x86/boot/cbmem.c
@@ -17,6 +17,7 @@
#include <console/console.h>
#include <cbmem.h>
+#include <arch/acpi.h>
#if !CONFIG_DYNAMIC_CBMEM
void get_cbmem_table(uint64_t *base, uint64_t *size)
@@ -64,3 +65,17 @@ void *cbmem_top(void)
}
#endif /* DYNAMIC_CBMEM */
+
+#if !defined(__PRE_RAM__)
+
+/* ACPI resume needs to be cleared in the fail-to-recover case, but that
+ * condition is only handled during ramstage. */
+void cbmem_fail_resume(void)
+{
+#if CONFIG_HAVE_ACPI_RESUME
+ /* Something went wrong, our high memory area got wiped */
+ acpi_fail_wakeup();
+#endif
+}
+
+#endif /* !__PRE_RAM__ */
diff --git a/src/arch/x86/include/arch/acpi.h b/src/arch/x86/include/arch/acpi.h
index 306f7da046..d73c0469ca 100644
--- a/src/arch/x86/include/arch/acpi.h
+++ b/src/arch/x86/include/arch/acpi.h
@@ -558,6 +558,8 @@ void acpi_save_gnvs(u32 gnvs_address);
/* 0 = S0, 1 = S1 ...*/
extern u8 acpi_slp_type;
+int acpi_is_wakeup(void);
+void acpi_fail_wakeup(void);
void acpi_resume(void *wake_vec);
void __attribute__((weak)) mainboard_suspend_resume(void);
void *acpi_find_wakeup_vector(void);