blob: 5d3aa7542f0145a024c9c994e7113bcd36b72d84 [file] [log] [blame]
Angel Ponsf23ae0b2020-04-02 23:48:12 +02001/* SPDX-License-Identifier: GPL-2.0-only */
2/* This file is part of the coreboot project. */
Stefan Reinauercadc5452010-12-18 23:29:37 +00003
Stefan Reinauercadc5452010-12-18 23:29:37 +00004#include <cpu/x86/lapic.h>
5#include <cpu/x86/msr.h>
6#include <cpu/x86/mtrr.h>
7#include <cpu/amd/mtrr.h>
Stefan Reinauer991f1842015-11-22 23:40:29 +01008#include <cpu/amd/msr.h>
Stefan Reinauercadc5452010-12-18 23:29:37 +00009#include <cpu/x86/cache.h>
10#include <cpu/x86/smm.h>
Kyösti Mälkkic4fdb7b2019-08-10 15:51:59 +030011#include <cpu/x86/smi_deprecated.h>
Stefan Reinauercadc5452010-12-18 23:29:37 +000012#include <string.h>
13
Stefan Reinauercadc5452010-12-18 23:29:37 +000014void smm_init(void)
15{
Rudolf Marekb5b3b3b2011-07-02 16:36:17 +020016 msr_t msr, syscfg_orig, mtrr_aseg_orig;
Stefan Reinauercadc5452010-12-18 23:29:37 +000017
Rudolf Marekb5b3b3b2011-07-02 16:36:17 +020018 /* Back up MSRs for later restore */
19 syscfg_orig = rdmsr(SYSCFG_MSR);
Alexandru Gagniuc86091f92015-09-30 20:23:09 -070020 mtrr_aseg_orig = rdmsr(MTRR_FIX_16K_A0000);
Stefan Reinauercadc5452010-12-18 23:29:37 +000021
Rudolf Marekb5b3b3b2011-07-02 16:36:17 +020022 /* MTRR changes don't like an enabled cache */
23 disable_cache();
Stefan Reinauercadc5452010-12-18 23:29:37 +000024
Rudolf Marekb5b3b3b2011-07-02 16:36:17 +020025 msr = syscfg_orig;
Stefan Reinauercadc5452010-12-18 23:29:37 +000026
Rudolf Marekb5b3b3b2011-07-02 16:36:17 +020027 /* Allow changes to MTRR extended attributes */
28 msr.lo |= SYSCFG_MSR_MtrrFixDramModEn;
29 /* turn the extended attributes off until we fix
30 * them so A0000 is routed to memory
31 */
32 msr.lo &= ~SYSCFG_MSR_MtrrFixDramEn;
33 wrmsr(SYSCFG_MSR, msr);
Stefan Reinauercadc5452010-12-18 23:29:37 +000034
Rudolf Marekb5b3b3b2011-07-02 16:36:17 +020035 /* set DRAM access to 0xa0000 */
36 msr.lo = 0x18181818;
37 msr.hi = 0x18181818;
Alexandru Gagniuc86091f92015-09-30 20:23:09 -070038 wrmsr(MTRR_FIX_16K_A0000, msr);
Rudolf Marek2c366272010-12-18 23:30:59 +000039
Rudolf Marekb5b3b3b2011-07-02 16:36:17 +020040 /* enable the extended features */
41 msr = syscfg_orig;
42 msr.lo |= SYSCFG_MSR_MtrrFixDramModEn;
43 msr.lo |= SYSCFG_MSR_MtrrFixDramEn;
44 wrmsr(SYSCFG_MSR, msr);
Stefan Reinauercadc5452010-12-18 23:29:37 +000045
Rudolf Marekb5b3b3b2011-07-02 16:36:17 +020046 enable_cache();
47 /* copy the real SMM handler */
Kyösti Mälkki9d8adc02016-12-04 22:17:37 +020048 memcpy((void *)SMM_BASE, _binary_smm_start,
49 _binary_smm_end - _binary_smm_start);
Rudolf Marekb5b3b3b2011-07-02 16:36:17 +020050 wbinvd();
51 disable_cache();
Stefan Reinauercadc5452010-12-18 23:29:37 +000052
Rudolf Marekb5b3b3b2011-07-02 16:36:17 +020053 /* Restore SYSCFG and MTRR */
54 wrmsr(SYSCFG_MSR, syscfg_orig);
Alexandru Gagniuc86091f92015-09-30 20:23:09 -070055 wrmsr(MTRR_FIX_16K_A0000, mtrr_aseg_orig);
Rudolf Marekb5b3b3b2011-07-02 16:36:17 +020056 enable_cache();
Stefan Reinauercadc5452010-12-18 23:29:37 +000057
Rudolf Marekb5b3b3b2011-07-02 16:36:17 +020058 /* CPU MSR are set in CPU init */
Stefan Reinauercadc5452010-12-18 23:29:37 +000059}
Rudolf Marek2c366272010-12-18 23:30:59 +000060
Kyösti Mälkkie09cd1b2017-08-18 20:58:33 +030061void smm_init_completion(void)
62{
63}