<p>Patrick Rudolph has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/25399">View Change</a></p><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>---<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;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/99/25399/1</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 9de6bb5..4c74a0a 100644</span><br><span>--- a/util/intelmetool/intelmetool.c</span><br><span>+++ b/util/intelmetool/intelmetool.c</span><br><span>@@ -178,38 +178,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>@@ -243,7 +250,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>@@ -259,14 +265,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>@@ -313,15 +326,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: newchange </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: 1 </div>
<div style="display:none"> Gerrit-Owner: Patrick Rudolph <patrick.rudolph@9elements.com> </div>