aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/arch/x86/boot/acpi.c4
-rw-r--r--src/cpu/x86/mtrr/mtrr.c6
-rw-r--r--src/include/cpu/cpu.h3
-rw-r--r--src/lib/selfboot.c5
4 files changed, 18 insertions, 0 deletions
diff --git a/src/arch/x86/boot/acpi.c b/src/arch/x86/boot/acpi.c
index b04cbe52bf..7b207b48bf 100644
--- a/src/arch/x86/boot/acpi.c
+++ b/src/arch/x86/boot/acpi.c
@@ -646,6 +646,10 @@ void suspend_resume(void)
#if CONFIG_COVERAGE
coverage_exit();
#endif
+ /* 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);
}
diff --git a/src/cpu/x86/mtrr/mtrr.c b/src/cpu/x86/mtrr/mtrr.c
index 253a7c318b..608912754c 100644
--- a/src/cpu/x86/mtrr/mtrr.c
+++ b/src/cpu/x86/mtrr/mtrr.c
@@ -29,6 +29,7 @@
#include <string.h>
#include <console/console.h>
#include <device/device.h>
+#include <cpu/cpu.h>
#include <cpu/x86/msr.h>
#include <cpu/x86/mtrr.h>
#include <cpu/x86/cache.h>
@@ -406,6 +407,11 @@ void x86_mtrr_disable_rom_caching(void)
wrmsr(MTRRphysBase_MSR(index), msr_val);
enable_cache();
}
+
+void disable_cache_rom(void)
+{
+ x86_mtrr_disable_rom_caching();
+}
#endif
struct var_mtrr_state {
diff --git a/src/include/cpu/cpu.h b/src/include/cpu/cpu.h
index bed77de017..a2272f3e84 100644
--- a/src/include/cpu/cpu.h
+++ b/src/include/cpu/cpu.h
@@ -9,6 +9,9 @@ struct bus;
void initialize_cpus(struct bus *cpu_bus);
void asmlinkage secondary_cpu_init(unsigned int cpu_index);
+/* If a ROM cache was set up disable it before jumping to the payload or OS. */
+void __attribute__((weak)) disable_cache_rom(void);
+
#if CONFIG_HAVE_SMI_HANDLER
void smm_init(void);
void smm_lock(void);
diff --git a/src/lib/selfboot.c b/src/lib/selfboot.c
index f933142144..be03b853a6 100644
--- a/src/lib/selfboot.c
+++ b/src/lib/selfboot.c
@@ -20,6 +20,7 @@
#include <arch/byteorder.h>
#include <console/console.h>
+#include <cpu/cpu.h>
#include <fallback.h>
#include <boot/elf.h>
#include <boot/elf_boot.h>
@@ -540,6 +541,10 @@ int selfboot(struct lb_memory *mem, struct cbfs_payload *payload)
coverage_exit();
#endif
+ /* Tear down the caching of the ROM. */
+ if (disable_cache_rom)
+ disable_cache_rom();
+
/* Before we go off to run the payload, see if
* we stayed within our bounds.
*/