coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
debug.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <console/console.h>
4 #include <cpu/cpu.h>
5 #include <cpu/x86/mtrr.h>
6 #include <stdint.h>
7 
8 static const char *display_mtrr_type(uint32_t type)
9 {
10  switch (type) {
11  default: return "reserved";
12  case 0: return "UC";
13  case 1: return "WC";
14  case 4: return "WT";
15  case 5: return "WP";
16  case 6: return "WB";
17  case 7: return "UC-";
18  }
19 }
20 
22  uint32_t starting_address, uint32_t memory_size)
23 {
24  uint32_t base_address;
25  uint32_t index;
26  uint32_t next_address;
27  uint32_t next_type;
28  uint32_t type;
29 
30  type = msr & MTRR_DEF_TYPE_MASK;
31  base_address = starting_address;
32  next_address = base_address;
33  for (index = 0; index < 64; index += 8) {
34  next_address = starting_address + (memory_size *
35  ((index >> 3) + 1));
36  next_type = (msr >> index) & MTRR_DEF_TYPE_MASK;
37  if (next_type != type) {
38  printk(BIOS_DEBUG, " 0x%08x - 0x%08x: %s\n",
39  base_address, next_address - 1,
41  base_address = next_address;
42  type = next_type;
43  }
44  }
45  if (base_address != next_address)
46  printk(BIOS_DEBUG, " 0x%08x - 0x%08x: %s\n",
47  base_address, next_address - 1,
49 }
50 
51 static void display_4k_mtrr(uint32_t msr_reg, uint32_t starting_address,
52  const char *name)
53 {
54  union {
55  uint64_t u64;
56  msr_t s;
57  } msr;
58 
59  msr.s = rdmsr(msr_reg);
60  printk(BIOS_DEBUG, "0x%016llx: %s\n", msr.u64, name);
61  display_mtrr_fixed_types(msr.u64, starting_address, 0x1000);
62 }
63 
64 static void display_16k_mtrr(uint32_t msr_reg, uint32_t starting_address,
65  const char *name)
66 {
67  union {
68  uint64_t u64;
69  msr_t s;
70  } msr;
71 
72  msr.s = rdmsr(msr_reg);
73  printk(BIOS_DEBUG, "0x%016llx: %s\n", msr.u64, name);
74  display_mtrr_fixed_types(msr.u64, starting_address, 0x4000);
75 }
76 
77 static void display_64k_mtrr(void)
78 {
79  union {
80  uint64_t u64;
81  msr_t s;
82  } msr;
83 
84  msr.s = rdmsr(MTRR_FIX_64K_00000);
85  printk(BIOS_DEBUG, "0x%016llx: IA32_MTRR_FIX64K_00000\n", msr.u64);
86  display_mtrr_fixed_types(msr.u64, 0, 0x10000);
87 }
88 
89 static void display_mtrrcap(void)
90 {
91  msr_t msr;
92 
93  msr = rdmsr(MTRR_CAP_MSR);
95  "0x%08x%08x: IA32_MTRRCAP: %s%s%s%s%u variable MTRRs\n",
96  msr.hi, msr.lo,
97  (msr.lo & MTRR_CAP_PRMRR) ? "PRMRR, " : "",
98  (msr.lo & MTRR_CAP_SMRR) ? "SMRR, " : "",
99  (msr.lo & MTRR_CAP_WC) ? "WC, " : "",
100  (msr.lo & MTRR_CAP_FIX) ? "FIX, " : "",
101  msr.lo & MTRR_CAP_VCNT);
102 }
103 
104 static void display_mtrr_def_type(void)
105 {
106  union {
107  uint64_t u64;
108  msr_t s;
109  } msr;
110 
111  msr.s = rdmsr(MTRR_DEF_TYPE_MSR);
112  printk(BIOS_DEBUG, "0x%016llx: IA32_MTRR_DEF_TYPE:%s%s %s\n",
113  msr.u64,
114  (msr.u64 & MTRR_DEF_TYPE_EN) ? " E," : "",
115  (msr.u64 & MTRR_DEF_TYPE_FIX_EN) ? " FE," : "",
116  display_mtrr_type((uint32_t)(msr.u64 &
118 }
119 
120 static void display_variable_mtrr(int index, uint64_t address_mask)
121 {
122  const uint32_t msr_reg = MTRR_PHYS_BASE(index);
123  uint64_t base_address;
125  uint64_t mask;
126  union {
127  uint64_t u64;
128  msr_t s;
129  } msr_a;
130  union {
131  uint64_t u64;
132  msr_t s;
133  } msr_m;
134 
135  msr_a.s = rdmsr(msr_reg);
136  msr_m.s = rdmsr(msr_reg + 1);
137  if (msr_m.u64 & MTRR_PHYS_MASK_VALID) {
138  base_address = (msr_a.u64 & 0xfffffffffffff000ULL)
139  & address_mask;
141  "0x%016llx: PHYBASE%d: Address = 0x%016llx, %s\n",
142  msr_a.u64, index, base_address,
144  mask = (msr_m.u64 & 0xfffffffffffff000ULL) & address_mask;
145  length = (~mask & address_mask) + 1;
147  "0x%016llx: PHYMASK%d: Length = 0x%016llx, Valid\n",
148  msr_m.u64, index, length);
149  } else {
150  printk(BIOS_DEBUG, "0x%016llx: PHYBASE%d\n", msr_a.u64, index);
151  printk(BIOS_DEBUG, "0x%016llx: PHYMASK%d: Disabled\n",
152  msr_m.u64, index);
153  }
154 }
155 
156 static void _display_mtrrs(void)
157 {
158  uint32_t address_bits;
159  uint64_t address_mask;
160  int i;
161  int variable_mtrrs;
162 
163  /* Display the fixed MTRRs */
164  display_mtrrcap();
167  display_16k_mtrr(MTRR_FIX_16K_80000, 0x80000, "IA32_MTRR_FIX16K_80000");
168  display_16k_mtrr(MTRR_FIX_16K_A0000, 0xa0000, "IA32_MTRR_FIX16K_A0000");
169  display_4k_mtrr(MTRR_FIX_4K_C0000, 0xc0000, "IA32_MTRR_FIX4K_C0000");
170  display_4k_mtrr(MTRR_FIX_4K_C8000, 0xc8000, "IA32_MTRR_FIX4K_C8000");
171  display_4k_mtrr(MTRR_FIX_4K_D0000, 0xd0000, "IA32_MTRR_FIX4K_D0000");
172  display_4k_mtrr(MTRR_FIX_4K_D8000, 0xd8000, "IA32_MTRR_FIX4K_D8000");
173  display_4k_mtrr(MTRR_FIX_4K_E0000, 0xe0000, "IA32_MTRR_FIX4K_E0000");
174  display_4k_mtrr(MTRR_FIX_4K_E8000, 0xe8000, "IA32_MTRR_FIX4K_E8000");
175  display_4k_mtrr(MTRR_FIX_4K_F0000, 0xf0000, "IA32_MTRR_FIX4K_F0000");
176  display_4k_mtrr(MTRR_FIX_4K_F8000, 0xf8000, "IA32_MTRR_FIX4K_F8000");
177  address_bits = cpu_phys_address_size();
178  address_mask = (1ULL << address_bits) - 1;
179 
180  /* Display the variable MTRRs */
181  variable_mtrrs = get_var_mtrr_count();
182  for (i = 0; i < variable_mtrrs; i++)
183  display_variable_mtrr(i, address_mask);
184 }
185 
187 {
188  if (CONFIG(DISPLAY_MTRRS))
189  _display_mtrrs();
190 }
const char * name
Definition: mmu.c:92
#define asmlinkage
Definition: cpu.h:8
#define printk(level,...)
Definition: stdlib.h:16
static void display_mtrrcap(void)
Definition: debug.c:89
static void display_variable_mtrr(int index, uint64_t address_mask)
Definition: debug.c:120
static void display_64k_mtrr(void)
Definition: debug.c:77
static void display_16k_mtrr(uint32_t msr_reg, uint32_t starting_address, const char *name)
Definition: debug.c:64
static void _display_mtrrs(void)
Definition: debug.c:156
static const char * display_mtrr_type(uint32_t type)
Definition: debug.c:8
static void display_4k_mtrr(uint32_t msr_reg, uint32_t starting_address, const char *name)
Definition: debug.c:51
static void display_mtrr_def_type(void)
Definition: debug.c:104
asmlinkage void display_mtrrs(void)
Definition: debug.c:186
static void display_mtrr_fixed_types(uint64_t msr, uint32_t starting_address, uint32_t memory_size)
Definition: debug.c:21
int cpu_phys_address_size(void)
Definition: cpu_common.c:46
@ CONFIG
Definition: dsi_common.h:201
uint64_t length
Definition: fw_cfg_if.h:1
static __always_inline msr_t rdmsr(unsigned int index)
Definition: msr.h:146
unsigned int type
Definition: edid.c:57
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition: loglevel.h:128
static const int mask[4]
Definition: gpio.c:308
uint64_t u64
Definition: stdint.h:54
unsigned int uint32_t
Definition: stdint.h:14
unsigned long long uint64_t
Definition: stdint.h:17
unsigned int hi
Definition: msr.h:112
unsigned int lo
Definition: msr.h:111
#define s(param, src_bits, pmcreg, dst_bits)
#define MTRR_FIX_4K_E0000
Definition: mtrr.h:52
#define MTRR_FIX_64K_00000
Definition: mtrr.h:45
#define MTRR_PHYS_BASE(reg)
Definition: mtrr.h:39
#define MTRR_DEF_TYPE_MASK
Definition: mtrr.h:26
static int get_var_mtrr_count(void)
Definition: mtrr.h:105
#define MTRR_FIX_4K_D8000
Definition: mtrr.h:51
#define MTRR_FIX_4K_C8000
Definition: mtrr.h:49
#define MTRR_FIX_4K_E8000
Definition: mtrr.h:53
#define MTRR_FIX_16K_A0000
Definition: mtrr.h:47
#define MTRR_DEF_TYPE_EN
Definition: mtrr.h:27
#define MTRR_DEF_TYPE_FIX_EN
Definition: mtrr.h:28
#define MTRR_CAP_PRMRR
Definition: mtrr.h:19
#define MTRR_CAP_SMRR
Definition: mtrr.h:20
#define MTRR_CAP_VCNT
Definition: mtrr.h:23
#define MTRR_FIX_4K_D0000
Definition: mtrr.h:50
#define MTRR_FIX_4K_F0000
Definition: mtrr.h:54
#define MTRR_FIX_4K_C0000
Definition: mtrr.h:48
#define MTRR_CAP_MSR
Definition: mtrr.h:17
#define MTRR_CAP_FIX
Definition: mtrr.h:22
#define MTRR_FIX_16K_80000
Definition: mtrr.h:46
#define MTRR_FIX_4K_F8000
Definition: mtrr.h:55
#define MTRR_CAP_WC
Definition: mtrr.h:21
#define MTRR_DEF_TYPE_MSR
Definition: mtrr.h:25
#define MTRR_PHYS_MASK_VALID
Definition: mtrr.h:41