blob: 75dd45064d96cdf9a7bf1eca7cd6cab6a931f14a [file] [log] [blame]
Angel Ponsf23ae0b2020-04-02 23:48:12 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Stefan Reinauercadc5452010-12-18 23:29:37 +00002
Stefan Reinauercadc5452010-12-18 23:29:37 +00003#include <cpu/x86/msr.h>
4#include <cpu/x86/mtrr.h>
5#include <cpu/amd/mtrr.h>
Stefan Reinauer991f1842015-11-22 23:40:29 +01006#include <cpu/amd/msr.h>
Stefan Reinauercadc5452010-12-18 23:29:37 +00007#include <cpu/x86/cache.h>
8#include <cpu/x86/smm.h>
Kyösti Mälkkic4fdb7b2019-08-10 15:51:59 +03009#include <cpu/x86/smi_deprecated.h>
Stefan Reinauercadc5452010-12-18 23:29:37 +000010#include <string.h>
11
Stefan Reinauercadc5452010-12-18 23:29:37 +000012void smm_init(void)
13{
Rudolf Marekb5b3b3b2011-07-02 16:36:17 +020014 msr_t msr, syscfg_orig, mtrr_aseg_orig;
Stefan Reinauercadc5452010-12-18 23:29:37 +000015
Rudolf Marekb5b3b3b2011-07-02 16:36:17 +020016 /* Back up MSRs for later restore */
17 syscfg_orig = rdmsr(SYSCFG_MSR);
Alexandru Gagniuc86091f92015-09-30 20:23:09 -070018 mtrr_aseg_orig = rdmsr(MTRR_FIX_16K_A0000);
Stefan Reinauercadc5452010-12-18 23:29:37 +000019
Rudolf Marekb5b3b3b2011-07-02 16:36:17 +020020 /* MTRR changes don't like an enabled cache */
21 disable_cache();
Stefan Reinauercadc5452010-12-18 23:29:37 +000022
Rudolf Marekb5b3b3b2011-07-02 16:36:17 +020023 msr = syscfg_orig;
Stefan Reinauercadc5452010-12-18 23:29:37 +000024
Rudolf Marekb5b3b3b2011-07-02 16:36:17 +020025 /* Allow changes to MTRR extended attributes */
26 msr.lo |= SYSCFG_MSR_MtrrFixDramModEn;
27 /* turn the extended attributes off until we fix
28 * them so A0000 is routed to memory
29 */
30 msr.lo &= ~SYSCFG_MSR_MtrrFixDramEn;
31 wrmsr(SYSCFG_MSR, msr);
Stefan Reinauercadc5452010-12-18 23:29:37 +000032
Rudolf Marekb5b3b3b2011-07-02 16:36:17 +020033 /* set DRAM access to 0xa0000 */
34 msr.lo = 0x18181818;
35 msr.hi = 0x18181818;
Alexandru Gagniuc86091f92015-09-30 20:23:09 -070036 wrmsr(MTRR_FIX_16K_A0000, msr);
Rudolf Marek2c366272010-12-18 23:30:59 +000037
Rudolf Marekb5b3b3b2011-07-02 16:36:17 +020038 /* enable the extended features */
39 msr = syscfg_orig;
40 msr.lo |= SYSCFG_MSR_MtrrFixDramModEn;
41 msr.lo |= SYSCFG_MSR_MtrrFixDramEn;
42 wrmsr(SYSCFG_MSR, msr);
Stefan Reinauercadc5452010-12-18 23:29:37 +000043
Rudolf Marekb5b3b3b2011-07-02 16:36:17 +020044 enable_cache();
45 /* copy the real SMM handler */
Elyes Haouas287048a2022-05-29 15:44:11 +020046 memcpy((void *)SMM_BASE, _binary_smm_start, _binary_smm_end - _binary_smm_start);
Rudolf Marekb5b3b3b2011-07-02 16:36:17 +020047 wbinvd();
48 disable_cache();
Stefan Reinauercadc5452010-12-18 23:29:37 +000049
Rudolf Marekb5b3b3b2011-07-02 16:36:17 +020050 /* Restore SYSCFG and MTRR */
51 wrmsr(SYSCFG_MSR, syscfg_orig);
Alexandru Gagniuc86091f92015-09-30 20:23:09 -070052 wrmsr(MTRR_FIX_16K_A0000, mtrr_aseg_orig);
Rudolf Marekb5b3b3b2011-07-02 16:36:17 +020053 enable_cache();
Stefan Reinauercadc5452010-12-18 23:29:37 +000054
Rudolf Marekb5b3b3b2011-07-02 16:36:17 +020055 /* CPU MSR are set in CPU init */
Stefan Reinauercadc5452010-12-18 23:29:37 +000056}
Rudolf Marek2c366272010-12-18 23:30:59 +000057
Kyösti Mälkkie09cd1b2017-08-18 20:58:33 +030058void smm_init_completion(void)
59{
60}