<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>