10 #define MTRR_TYPE_UNCACHEABLE 0
11 #define MTRR_TYPE_WRCOMB 1
12 #define MTRR_TYPE_WRTHROUGH 4
13 #define MTRR_TYPE_WRPROT 5
14 #define MTRR_TYPE_WRBACK 6
15 #define MTRR_NUM_TYPES 7
17 #define MTRR_CAP_MSR 0x0fe
19 #define MTRR_CAP_PRMRR (1 << 12)
20 #define MTRR_CAP_SMRR (1 << 11)
21 #define MTRR_CAP_WC (1 << 10)
22 #define MTRR_CAP_FIX (1 << 8)
23 #define MTRR_CAP_VCNT 0xff
25 #define MTRR_DEF_TYPE_MSR 0x2ff
26 #define MTRR_DEF_TYPE_MASK 0xff
27 #define MTRR_DEF_TYPE_EN (1 << 11)
28 #define MTRR_DEF_TYPE_FIX_EN (1 << 10)
30 #define IA32_SMRR_PHYS_BASE 0x1f2
31 #define IA32_SMRR_PHYS_MASK 0x1f3
32 #define SMRR_PHYS_MASK_LOCK (1 << 10)
36 #define CORE2_SMRR_PHYS_BASE 0xa0
37 #define CORE2_SMRR_PHYS_MASK 0xa1
39 #define MTRR_PHYS_BASE(reg) (0x200 + 2 * (reg))
40 #define MTRR_PHYS_MASK(reg) (MTRR_PHYS_BASE(reg) + 1)
41 #define MTRR_PHYS_MASK_VALID (1 << 11)
43 #define NUM_FIXED_RANGES 88
44 #define RANGES_PER_FIXED_MTRR 8
45 #define MTRR_FIX_64K_00000 0x250
46 #define MTRR_FIX_16K_80000 0x258
47 #define MTRR_FIX_16K_A0000 0x259
48 #define MTRR_FIX_4K_C0000 0x268
49 #define MTRR_FIX_4K_C8000 0x269
50 #define MTRR_FIX_4K_D0000 0x26a
51 #define MTRR_FIX_4K_D8000 0x26b
52 #define MTRR_FIX_4K_E0000 0x26c
53 #define MTRR_FIX_4K_E8000 0x26d
54 #define MTRR_FIX_4K_F0000 0x26e
55 #define MTRR_FIX_4K_F8000 0x26f
57 #if !defined(__ASSEMBLER__)
156 static inline unsigned int fms(
unsigned int x)
160 __asm__(
"bsrl %1,%0\n\t"
163 "1:" :
"=r" (r) :
"mr" (
x));
168 static inline unsigned int fls(
unsigned int x)
172 __asm__(
"bsfl %1,%0\n\t"
175 "1:" :
"=r" (r) :
"mr" (
x));
182 #define _POW2_MASK(x) ((x>>1)|(x>>2)|(x>>3)|(x>>4)|(x>>5)| \
183 (x>>6)|(x>>7)|(x>>8)|((1<<18)-1))
184 #define _ALIGN_UP_POW2(x) ((x + _POW2_MASK(x)) & ~_POW2_MASK(x))
185 #define _ALIGN_DOWN_POW2(x) ((x) & ~_POW2_MASK(x))
188 #define _FROM_4G_TOP(x) ((0xffffffff - (x)) + 1)
194 #define CACHE_TMP_RAMTOP (16<<20)
197 #define OPTIMAL_CACHE_ROM_SIZE _ALIGN_UP_POW2(CONFIG_ROM_SIZE)
198 #define OPTIMAL_CACHE_ROM_BASE _FROM_4G_TOP(OPTIMAL_CACHE_ROM_SIZE)
199 #if (OPTIMAL_CACHE_ROM_SIZE < CONFIG_ROM_SIZE) || \
200 (OPTIMAL_CACHE_ROM_SIZE >= (2 * CONFIG_ROM_SIZE))
201 # error "Optimal CACHE_ROM_SIZE can't be derived, _POW2_MASK needs refinement."
208 #define CAR_END (CONFIG_DCACHE_RAM_BASE + CONFIG_DCACHE_RAM_SIZE)
209 #if CAR_END > OPTIMAL_CACHE_ROM_BASE
210 # define CAR_CACHE_ROM_SIZE _ALIGN_DOWN_POW2(_FROM_4G_TOP(CAR_END))
212 # define CAR_CACHE_ROM_SIZE OPTIMAL_CACHE_ROM_SIZE
214 #if ((CAR_CACHE_ROM_SIZE & (CAR_CACHE_ROM_SIZE - 1)) != 0)
215 # error "CAR CACHE_ROM_SIZE is not a power of 2, _POW2_MASK needs refinement."
220 #if CAR_CACHE_ROM_SIZE >= 16 << 20
221 # define CACHE_ROM_SIZE (16 << 20)
223 # define CACHE_ROM_SIZE CAR_CACHE_ROM_SIZE
226 #define CACHE_ROM_BASE _FROM_4G_TOP(CACHE_ROM_SIZE)
static __always_inline msr_t rdmsr(unsigned int index)
void fixed_mtrrs_hide_amd_rwdram(void)
static unsigned int fms(unsigned int x)
void enable_fixed_mtrr(void)
void var_mtrr_context_init(struct var_mtrr_context *ctx, void *arg)
static unsigned int fls(unsigned int x)
void need_restore_mtrr(void)
void x86_setup_var_mtrrs(unsigned int address_bits, unsigned int above4gb)
static int get_var_mtrr_count(void)
int get_free_var_mtrr(void)
void x86_mtrr_check(void)
asmlinkage void * soc_set_mtrrs(void *top_of_stack)
void mtrr_use_temp_range(uintptr_t begin, size_t size, int type)
void clear_all_var_mtrr(void)
static int var_mtrr_context_current_mtrr(const struct var_mtrr_context *ctx)
void x86_setup_mtrrs_with_detect_no_above_4gb(void)
int var_mtrr_set_with_cb(struct var_mtrr_context *ctx, uintptr_t addr, size_t size, int type, void(*callback)(const struct var_mtrr_context *ctx, uintptr_t base_addr, size_t size, msr_t base, msr_t mask))
void x86_setup_fixed_mtrrs_no_enable(void)
asmlinkage void soc_enable_mtrrs(void)
void x86_setup_mtrrs_with_detect(void)
asmlinkage void display_mtrrs(void)
void fixed_mtrrs_expose_amd_rwdram(void)
void x86_setup_mtrrs(void)
void set_var_mtrr(unsigned int reg, unsigned int base, unsigned int size, unsigned int type)
int var_mtrr_set(struct var_mtrr_context *ctx, uintptr_t addr, size_t size, int type)
void x86_setup_fixed_mtrrs(void)