<p>Arthur Heymans has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/27585">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">cpu/intel/smm/gen1: Use correct MSR for model_6fx and model_1067x<br><br>According to the "Intel® 64 and IA-32 Architectures Software Developer’s Manual"<br>the SMRR MSR are at a different offset for model_6fx and model_1067x.<br><br>This still need SMRR enabled and lock bit set in MSR_FEATURE_CONTROL.<br><br>Change-Id: I8ee8292ab038e58deb8c24745ec1a9b5da8c31a9<br>Signed-off-by: Arthur Heymans <arthur@aheymans.xyz><br>---<br>M src/cpu/intel/smm/gen1/smmrelocate.c<br>M src/include/cpu/x86/mtrr.h<br>2 files changed, 31 insertions(+), 4 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/85/27585/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/cpu/intel/smm/gen1/smmrelocate.c b/src/cpu/intel/smm/gen1/smmrelocate.c</span><br><span>index e3cb11b..fc9e36a 100644</span><br><span>--- a/src/cpu/intel/smm/gen1/smmrelocate.c</span><br><span>+++ b/src/cpu/intel/smm/gen1/smmrelocate.c</span><br><span>@@ -57,12 +57,28 @@</span><br><span> static struct smm_relocation_params smm_reloc_params;</span><br><span> static void *default_smm_area = NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static inline void write_smrr(struct smm_relocation_params *relo_params)</span><br><span style="color: hsl(120, 100%, 40%);">+static void write_smrr(struct smm_relocation_params *relo_params)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+   struct cpuinfo_x86 c;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      printk(BIOS_DEBUG, "Writing SMRR. base = 0x%08x, mask=0x%08x\n",</span><br><span>          relo_params->smrr_base.lo, relo_params->smrr_mask.lo);</span><br><span style="color: hsl(0, 100%, 40%);">-     wrmsr(IA32_SMRR_PHYSBASE, relo_params->smrr_base);</span><br><span style="color: hsl(0, 100%, 40%);">-   wrmsr(IA32_SMRR_PHYSMASK, relo_params->smrr_mask);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* model_6fx and model_1067x have a different msr */</span><br><span style="color: hsl(120, 100%, 40%);">+  get_fms(&c, cpuid_eax(1));</span><br><span style="color: hsl(120, 100%, 40%);">+        if (c.x86 == 6 && (c.x86_model == 0xf || c.x86_model == 0x17)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              msr_t msr;</span><br><span style="color: hsl(120, 100%, 40%);">+            msr = rdmsr(MSR_FEATURE_CONTROL);</span><br><span style="color: hsl(120, 100%, 40%);">+             /* SMRR enabled and feature locked */</span><br><span style="color: hsl(120, 100%, 40%);">+         if (!((msr.lo & (1 << 3)) && (msr.lo & (1 <<0)))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       printk(BIOS_WARNING, "SMRR not enabled, skip writing SMRR...\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                   return;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+             wrmsr(MSR_SMRR_PHYSBASE, relo_params->smrr_base);</span><br><span style="color: hsl(120, 100%, 40%);">+          wrmsr(MSR_SMRR_PHYSMASK, relo_params->smrr_mask);</span><br><span style="color: hsl(120, 100%, 40%);">+  } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              wrmsr(IA32_SMRR_PHYSBASE, relo_params->smrr_base);</span><br><span style="color: hsl(120, 100%, 40%);">+         wrmsr(IA32_SMRR_PHYSMASK, relo_params->smrr_mask);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> </span><br><span> /* The relocation work is actually performed in SMM context, but the code</span><br><span>@@ -137,7 +153,14 @@</span><br><span>               params->smram_size -= CONFIG_SMM_RESERVED_SIZE;</span><br><span> </span><br><span>       /* SMRR has 32-bits of valid address aligned to 4KiB. */</span><br><span style="color: hsl(0, 100%, 40%);">-        params->smrr_base.lo = (params->smram_base & rmask) | MTRR_TYPE_WRBACK;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct cpuinfo_x86 c;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* for model_6fx and model_1067x byte [0:11] on smrr_base are reserved */</span><br><span style="color: hsl(120, 100%, 40%);">+     get_fms(&c, cpuid_eax(1));</span><br><span style="color: hsl(120, 100%, 40%);">+        if (c.x86 == 6 && (c.x86_model == 0xf || c.x86_model == 0x17))</span><br><span style="color: hsl(120, 100%, 40%);">+                params->smrr_base.lo = (params->smram_base & rmask);</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+          params->smrr_base.lo = (params->smram_base & rmask) | MTRR_TYPE_WRBACK;</span><br><span>    params->smrr_base.hi = 0;</span><br><span>         params->smrr_mask.lo = (~(tseg_size - 1) & rmask)</span><br><span>             | MTRR_PHYS_MASK_VALID;</span><br><span>diff --git a/src/include/cpu/x86/mtrr.h b/src/include/cpu/x86/mtrr.h</span><br><span>index 58a3ce5..be2bfa9 100644</span><br><span>--- a/src/include/cpu/x86/mtrr.h</span><br><span>+++ b/src/include/cpu/x86/mtrr.h</span><br><span>@@ -31,6 +31,10 @@</span><br><span> #define IA32_SMRR_PHYSBASE                 0x1f2</span><br><span> #define IA32_SMRR_PHYSMASK                     0x1f3</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define MSR_FEATURE_CONTROL                  0x3a</span><br><span style="color: hsl(120, 100%, 40%);">+#define MSR_SMRR_PHYSBASE                 0xa0</span><br><span style="color: hsl(120, 100%, 40%);">+#define MSR_SMRR_PHYSMASK                 0xa1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #define MTRR_PHYS_BASE(reg)           (0x200 + 2 * (reg))</span><br><span> #define MTRR_PHYS_MASK(reg)              (MTRR_PHYS_BASE(reg) + 1)</span><br><span> #define  MTRR_PHYS_MASK_VALID              (1 << 11)</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/27585">change 27585</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/27585"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I8ee8292ab038e58deb8c24745ec1a9b5da8c31a9 </div>
<div style="display:none"> Gerrit-Change-Number: 27585 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Arthur Heymans <arthur@aheymans.xyz> </div>