<p>Philipp Deppenwiese <strong>merged</strong> this change.</p><p><a href="https://review.coreboot.org/25399">View Change</a></p><div style="white-space:pre-wrap">Approvals:
build bot (Jenkins): Verified
Paul Menzel: Looks good to me, but someone else must approve
Philipp Deppenwiese: Looks good to me, approved
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">util/intelmetool: Add support for platforms without RCBA<br><br>Only try to unhide MEI if the PCI device wasn't found and<br>probe for RCBA before trying to use it.<br><br>Allows to run the utility on Skylake and newer hardware that<br>do not have RCBA any more.<br><br>TODO: Use sideband interface to unhide MEI.<br><br>Change-Id: I7926aa80b132d5be9fece0724516701d74dd4d3d<br>Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com><br>Reviewed-on: https://review.coreboot.org/25399<br>Tested-by: build bot (Jenkins) <no-reply@coreboot.org><br>Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net><br>Reviewed-by: Philipp Deppenwiese <zaolin.daisuki@gmail.com><br>---<br>M util/intelmetool/intelmetool.c<br>M util/intelmetool/rcba.c<br>M util/intelmetool/rcba.h<br>3 files changed, 56 insertions(+), 37 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/util/intelmetool/intelmetool.c b/util/intelmetool/intelmetool.c</span><br><span>index bc5f26c..66353bc 100644</span><br><span>--- a/util/intelmetool/intelmetool.c</span><br><span>+++ b/util/intelmetool/intelmetool.c</span><br><span>@@ -179,38 +179,45 @@</span><br><span> </span><br><span> static int activate_me(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- if (read_rcba32(FD2, &fd2)) {</span><br><span style="color: hsl(0, 100%, 40%);">- printf("Error reading RCBA\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return 1;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- if (write_rcba32(FD2, fd2 & ~0x2)) {</span><br><span style="color: hsl(0, 100%, 40%);">- printf("Error writing RCBA\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return 1;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- if (debug) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (fd2 & 0x2)</span><br><span style="color: hsl(120, 100%, 40%);">+ const uint32_t rcba = get_rcba_phys();</span><br><span style="color: hsl(120, 100%, 40%);">+ if (debug)</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("RCBA addr: 0x%08x\n", rcba);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rcba > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (read_rcba32(FD2, &fd2)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("Error reading RCBA\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (write_rcba32(FD2, fd2 & ~0x2)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("Error writing RCBA\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (debug && (fd2 & 0x2))</span><br><span> printf("MEI was hidden on PCI, now unlocked\n");</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(120, 100%, 40%);">+ else if (debug)</span><br><span> printf("MEI not hidden on PCI, checking if visible\n");</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> return 0;</span><br><span> }</span><br><span> </span><br><span> static void rehide_me(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- if (fd2 & 0x2) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (debug)</span><br><span style="color: hsl(0, 100%, 40%);">- printf("Re-hiding MEI device...");</span><br><span style="color: hsl(0, 100%, 40%);">- if (read_rcba32(FD2, &fd2)) {</span><br><span style="color: hsl(0, 100%, 40%);">- printf("Error reading RCBA\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(120, 100%, 40%);">+ const uint32_t rcba = get_rcba_phys();</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rcba > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (fd2 & 0x2) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (debug)</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("Re-hiding MEI device...");</span><br><span style="color: hsl(120, 100%, 40%);">+ if (read_rcba32(FD2, &fd2)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("Error reading RCBA\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%);">+ if (write_rcba32(FD2, fd2 | 0x2)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("Error writing RCBA\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%);">+ if (debug)</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("done\n");</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- if (write_rcba32(FD2, fd2 | 0x2)) {</span><br><span style="color: hsl(0, 100%, 40%);">- printf("Error writing RCBA\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- if (debug)</span><br><span style="color: hsl(0, 100%, 40%);">- printf("done\n");</span><br><span> }</span><br><span> }</span><br><span> </span><br><span>@@ -244,7 +251,6 @@</span><br><span> if (!me) {</span><br><span> rehide_me();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- printf("MEI device not found\n");</span><br><span> pci_cleanup(pacc);</span><br><span> return NULL;</span><br><span> }</span><br><span>@@ -260,14 +266,21 @@</span><br><span> const char *name = NULL;</span><br><span> </span><br><span> if (pci_platform_scan())</span><br><span style="color: hsl(0, 100%, 40%);">- exit(1);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (activate_me())</span><br><span style="color: hsl(0, 100%, 40%);">- exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span> </span><br><span> dev = pci_me_interface_scan(&name, namebuf, sizeof(namebuf));</span><br><span style="color: hsl(0, 100%, 40%);">- if (!dev)</span><br><span style="color: hsl(0, 100%, 40%);">- exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!dev) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (debug)</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("ME PCI device is hidden\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (activate_me())</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+ dev = pci_me_interface_scan(&name, namebuf, sizeof(namebuf));</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!dev) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("Can't find ME PCI device\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%);">+ }</span><br><span> </span><br><span> if (name == NULL)</span><br><span> name = "<unknown>";</span><br><span>@@ -314,15 +327,20 @@</span><br><span> uint64_t bootguard = 0;</span><br><span> </span><br><span> if (pci_platform_scan())</span><br><span style="color: hsl(0, 100%, 40%);">- exit(1);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (activate_me())</span><br><span style="color: hsl(0, 100%, 40%);">- exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span> </span><br><span> dev = pci_me_interface_scan(&name, namebuf, sizeof(namebuf));</span><br><span> if (!dev) {</span><br><span style="color: hsl(0, 100%, 40%);">- printf("Can't access ME PCI device\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (debug)</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("ME PCI device is hidden\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (activate_me())</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+ dev = pci_me_interface_scan(&name, namebuf, sizeof(namebuf));</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!dev) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("Can't find ME PCI device\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> </span><br><span> if (debug) {</span><br><span>diff --git a/util/intelmetool/rcba.c b/util/intelmetool/rcba.c</span><br><span>index fcc9bc5..c138e89 100644</span><br><span>--- a/util/intelmetool/rcba.c</span><br><span>+++ b/util/intelmetool/rcba.c</span><br><span>@@ -22,7 +22,7 @@</span><br><span> static const int size = 0x4000;</span><br><span> </span><br><span> /* Returns the physical RCBA base address or zero on error. */</span><br><span style="color: hsl(0, 100%, 40%);">-static u32 get_rcba_phys(void)</span><br><span style="color: hsl(120, 100%, 40%);">+u32 get_rcba_phys(void)</span><br><span> {</span><br><span> struct pci_access *pacc;</span><br><span> struct pci_dev *sb;</span><br><span>diff --git a/util/intelmetool/rcba.h b/util/intelmetool/rcba.h</span><br><span>index e1a22be..e349d3d 100644</span><br><span>--- a/util/intelmetool/rcba.h</span><br><span>+++ b/util/intelmetool/rcba.h</span><br><span>@@ -13,3 +13,4 @@</span><br><span> </span><br><span> int write_rcba32(uint32_t addr, uint32_t val);</span><br><span> int read_rcba32(uint32_t addr, uint32_t *val);</span><br><span style="color: hsl(120, 100%, 40%);">+u32 get_rcba_phys(void);</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/25399">change 25399</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/25399"/><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: merged </div>
<div style="display:none"> Gerrit-Change-Id: I7926aa80b132d5be9fece0724516701d74dd4d3d </div>
<div style="display:none"> Gerrit-Change-Number: 25399 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: Patrick Rudolph <patrick.rudolph@9elements.com> </div>
<div style="display:none"> Gerrit-Reviewer: Paul Menzel <paulepanter@users.sourceforge.net> </div>
<div style="display:none"> Gerrit-Reviewer: Philipp Deppenwiese <zaolin.daisuki@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: build bot (Jenkins) <no-reply@coreboot.org> </div>