boot: add disable_cache_rom() function

On certain architectures such as x86 the bootstrap processor
does most of the work. When CACHE_ROM is employed it's appropriate
to ensure that the caching enablement of the ROM is disabled so that
the caching settings are symmetric before booting the payload or OS.

Tested this on an x86 machine that turned on ROM caching. Linux did not
complain about asymmetric MTRR settings nor did the ROM show up as
cached in the MTRR settings.

Change-Id: Ia32ff9fdb1608667a0e9a5f23b9c8af27d589047
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: http://review.coreboot.org/2980
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
This commit is contained in:
Aaron Durbin 2013-03-29 16:23:23 -05:00 committed by Stefan Reinauer
parent b39ba2efcf
commit ebf142a12c
4 changed files with 18 additions and 0 deletions

View File

@ -646,6 +646,10 @@ void suspend_resume(void)
#if CONFIG_COVERAGE #if CONFIG_COVERAGE
coverage_exit(); coverage_exit();
#endif #endif
/* Tear down the caching of the ROM. */
if (disable_cache_rom)
disable_cache_rom();
post_code(POST_OS_RESUME); post_code(POST_OS_RESUME);
acpi_jump_to_wakeup(wake_vec); acpi_jump_to_wakeup(wake_vec);
} }

View File

@ -29,6 +29,7 @@
#include <string.h> #include <string.h>
#include <console/console.h> #include <console/console.h>
#include <device/device.h> #include <device/device.h>
#include <cpu/cpu.h>
#include <cpu/x86/msr.h> #include <cpu/x86/msr.h>
#include <cpu/x86/mtrr.h> #include <cpu/x86/mtrr.h>
#include <cpu/x86/cache.h> #include <cpu/x86/cache.h>
@ -406,6 +407,11 @@ void x86_mtrr_disable_rom_caching(void)
wrmsr(MTRRphysBase_MSR(index), msr_val); wrmsr(MTRRphysBase_MSR(index), msr_val);
enable_cache(); enable_cache();
} }
void disable_cache_rom(void)
{
x86_mtrr_disable_rom_caching();
}
#endif #endif
struct var_mtrr_state { struct var_mtrr_state {

View File

@ -9,6 +9,9 @@ struct bus;
void initialize_cpus(struct bus *cpu_bus); void initialize_cpus(struct bus *cpu_bus);
void asmlinkage secondary_cpu_init(unsigned int cpu_index); 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 #if CONFIG_HAVE_SMI_HANDLER
void smm_init(void); void smm_init(void);
void smm_lock(void); void smm_lock(void);

View File

@ -20,6 +20,7 @@
#include <arch/byteorder.h> #include <arch/byteorder.h>
#include <console/console.h> #include <console/console.h>
#include <cpu/cpu.h>
#include <fallback.h> #include <fallback.h>
#include <boot/elf.h> #include <boot/elf.h>
#include <boot/elf_boot.h> #include <boot/elf_boot.h>
@ -540,6 +541,10 @@ int selfboot(struct lb_memory *mem, struct cbfs_payload *payload)
coverage_exit(); coverage_exit();
#endif #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 /* Before we go off to run the payload, see if
* we stayed within our bounds. * we stayed within our bounds.
*/ */