diff options
Diffstat (limited to 'src/soc/intel/baytrail/cpu.c')
-rw-r--r-- | src/soc/intel/baytrail/cpu.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/soc/intel/baytrail/cpu.c b/src/soc/intel/baytrail/cpu.c index 1bbcb087dd..97d1f04b97 100644 --- a/src/soc/intel/baytrail/cpu.c +++ b/src/soc/intel/baytrail/cpu.c @@ -30,6 +30,7 @@ #include <cpu/x86/smm.h> #include <reg_script.h> +#include <baytrail/iosf.h> #include <baytrail/msr.h> #include <baytrail/pattrs.h> #include <baytrail/ramstage.h> @@ -103,6 +104,8 @@ void baytrail_init_cpus(device_t dev) struct bus *cpu_bus = dev->link_list; const struct pattrs *pattrs = pattrs_get(); struct mp_params mp_params; + uint32_t bsmrwac; + void *default_smm_area; /* Set up MTRRs based on physical address size. */ x86_setup_fixed_mtrrs(); @@ -116,6 +119,16 @@ void baytrail_init_cpus(device_t dev) mp_params.num_records = ARRAY_SIZE(mp_steps); mp_params.microcode_pointer = pattrs->microcode_patch; + default_smm_area = backup_default_smm_area(); + + /* + * Configure the BUNIT to allow dirty cache line evictions in non-SMM + * mode for the lines that were dirtied while in SMM mode. Otherwise + * the writes would be silently dropped. + */ + bsmrwac = iosf_bunit_read(BUNIT_SMRWAC) | SAI_IA_UNTRUSTED; + iosf_bunit_write(BUNIT_SMRWAC, bsmrwac); + /* Set package MSRs */ reg_script_run(package_msr_script); @@ -125,6 +138,8 @@ void baytrail_init_cpus(device_t dev) if (mp_init(cpu_bus, &mp_params)) { printk(BIOS_ERR, "MP initialization failure.\n"); } + + restore_default_smm_area(default_smm_area); } static void baytrail_core_init(device_t cpu) |