[PATCH] mtrr: check memory type above 4GB on AMD platforms
Alex Hung
alex.hung at canonical.com
Mon Jan 7 19:14:56 UTC 2019
On AMD platforms, Tom2ForceMemTypeWB in MSR SYS_CFG (C001_0010)
specifies the memory type above 4GB. If Tom2ForceMemTypeWB is set,
memory above 4GB will be write-back instead of any other types
(usually "uncached").
More information can be found in AMD's PPR document:
http://support.amd.com/TechDocs/54945_PPR_Family_17h_Models_00h-0Fh.pdf
Signed-off-by: Alex Hung <alex.hung at canonical.com>
---
src/bios/mtrr/mtrr.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/src/bios/mtrr/mtrr.c b/src/bios/mtrr/mtrr.c
index a614ffbb..53d1a807 100644
--- a/src/bios/mtrr/mtrr.c
+++ b/src/bios/mtrr/mtrr.c
@@ -50,8 +50,10 @@ static fwts_cpuinfo_x86 *fwts_cpuinfo;
#define UNKNOWN 0x0080
#define MTRR_DEF_TYPE_MSR 0x2FF
+#define AMD_SYS_CFG_MSR 0xC0010010
static uint64_t mtrr_default;
+static bool amd_Tom2ForceMemTypeWB = false;
struct mtrr_entry {
uint8_t reg;
@@ -184,6 +186,17 @@ static int get_mtrrs(void)
static int get_default_mtrr(fwts_framework *fw)
{
+ uint64_t amd_sys_conf;
+
+ /* Get the default memory type of memory between 4GB and second top of
+ * memory (TOM2) - i.e. is it write back (WB)
+ */
+ if (strstr(fwts_cpuinfo->vendor_id, "AMD")) {
+ if (fwts_cpu_readmsr(fw, 0, AMD_SYS_CFG_MSR, &amd_sys_conf) == FWTS_OK)
+ if (amd_sys_conf | 0x200000)
+ amd_Tom2ForceMemTypeWB = true;
+ }
+
if (fwts_cpu_readmsr(fw, 0, MTRR_DEF_TYPE_MSR, &mtrr_default) == FWTS_OK) {
switch (mtrr_default & 0xFF) {
case 0:
@@ -216,6 +229,12 @@ static int cache_types(uint64_t start, uint64_t end)
struct mtrr_entry *entry;
int type = 0;
+ /* On AMD platforms, Tom2ForceMemTypeWB overwrites other memory types */
+ if (amd_Tom2ForceMemTypeWB && start >= 0x100000000) {
+ type = WRITE_BACK;
+ return type;
+ }
+
fwts_list_foreach(item, mtrr_list) {
entry = fwts_list_data(struct mtrr_entry*, item);
--
2.19.1
More information about the fwts-devel
mailing list