<p>Patrick Rudolph has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/22521">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">util/intelmetool: Fix lint errors and warnings<br><br>Clean the code to fix all errors and warnings.<br>No functional change.<br><br>Changes:<br>* Fix lines over 80chars<br>* Fix typos<br>* Restructure code to reduce ident level<br>* Move RCBA handling into own files<br>* Introduce helper functions for RCBA access<br>* Move GPL string into header<br>* Fix whitespace in macros<br><br>Change-Id: Ib8e3617ebb34c47959d6619dfbc7189045e6b8f7<br>Signed-off-by: Patrick Rudolph <siro@das-labor.org><br>---<br>M util/intelmetool/Makefile<br>M util/intelmetool/intelmetool.c<br>M util/intelmetool/intelmetool.h<br>A util/intelmetool/rcba.c<br>A util/intelmetool/rcba.h<br>5 files changed, 331 insertions(+), 217 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/21/22521/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">diff --git a/util/intelmetool/Makefile b/util/intelmetool/Makefile<br>index 8857d95..5862dca 100644<br>--- a/util/intelmetool/Makefile<br>+++ b/util/intelmetool/Makefile<br>@@ -20,7 +20,7 @@<br> CFLAGS  ?= -O0 -g -Wall -W -Wno-unused-parameter -Wno-sign-compare -Wno-unused-function<br> LDFLAGS += -lpci -lz<br> <br>-OBJS = intelmetool.o me.o me_status.o mmap.o<br>+OBJS = intelmetool.o me.o me_status.o mmap.o rcba.o<br> <br> OS_ARCH      = $(shell uname)<br> ifeq ($(OS_ARCH), Darwin)<br>diff --git a/util/intelmetool/intelmetool.c b/util/intelmetool/intelmetool.c<br>index 2acfec2..6f3d0b3 100644<br>--- a/util/intelmetool/intelmetool.c<br>+++ b/util/intelmetool/intelmetool.c<br>@@ -24,6 +24,7 @@<br> #include "me.h"<br> #include "mmap.h"<br> #include "intelmetool.h"<br>+#include "rcba.h"<br> <br> #define FD2 0x3428<br> #define ME_COMMAND_DELAY 10000<br>@@ -32,8 +33,6 @@<br> int debug = 0;<br> <br> static uint32_t fd2 = 0;<br>-static const int size = 0x4000;<br>-static volatile uint8_t *rcba;<br> <br> static void dumpmem(uint8_t *phys, uint32_t size)<br> {<br>@@ -61,16 +60,6 @@<br>            fprintf(fp, "%c", *((uint8_t *) (phys + i)));<br>       }<br>     fclose(fp);<br>-}<br>-<br>-static void rehide_me(void)<br>-{<br>- if (fd2 & 0x2) {<br>-         printf("Re-hiding MEI device...");<br>-         fd2 = *(uint32_t *)(rcba + FD2);<br>-             *(uint32_t *)(rcba + FD2) = fd2 | 0x2;<br>-               printf("done\n");<br>-  }<br> }<br> <br> /* You need >4GB total ram, in kernel cmdline, use 'mem=1000m'<br>@@ -103,7 +92,9 @@<br>              printf("done\n\nHere are the first bytes:\n");<br>              dumpmemfile(dump, 0x2000000);<br>                 //printf("Try reading 0x%zx with other mmap tool...\n"<br>-             //      "Press enter to quit, you only get one chance to run this tool before reboot required for some reason\n", me_clone);<br>+               //       "Press enter to quit, you only get one chance to run"<br>+             //       "this tool before reboot required for some reason\n",<br>+             //       me_clone);<br>           while (getc(stdin) != '\n') {};<br>               unmap_physical(dump, 0x2000000);<br>      }<br>@@ -123,27 +114,35 @@<br>      pci_scan_bus(pacc);<br> <br>        for (dev=pacc->devices; dev; dev=dev->next) {<br>-          pci_fill_info(dev, PCI_FILL_IDENT | PCI_FILL_BASES | PCI_FILL_SIZES | PCI_FILL_CLASS);<br>+               pci_fill_info(dev, PCI_FILL_IDENT | PCI_FILL_BASES |<br>+                            PCI_FILL_SIZES | PCI_FILL_CLASS);<br>          name = pci_lookup_name(pacc, namebuf, sizeof(namebuf),<br>                        PCI_LOOKUP_DEVICE, dev->vendor_id, dev->device_id);<br>             if (name == NULL)<br>                     name = "<unknown>";<br>-          if (dev->vendor_id == PCI_VENDOR_ID_INTEL) {<br>-                      if (PCI_DEV_HAS_ME_DISABLE(dev->device_id)) {<br>-                             printf(CGRN "Good news, you have a `%s` so ME is present but can be disabled, continuing...\n\n" RESET, name);<br>-                             break;<br>-                       } else if (PCI_DEV_HAS_ME_DIFFICULT(dev->device_id)) {<br>-                            printf(CRED "Bad news, you have a `%s` so you have ME hardware on board and you can't control or disable it, continuing...\n\n" RESET, name);<br>-                          break;<br>-                       } else if (PCI_DEV_CAN_DISABLE_ME_IF_PRESENT(dev->device_id)) {<br>-                           printf(CYEL "Not sure if ME hardware is present because you have a `%s`, but it is possible to disable it if you do, continuing...\n\n" RESET, name);<br>-                              break;<br>-                       } else if (PCI_DEV_ME_NOT_SURE(dev->device_id)) {<br>-                         printf(CYEL "Found `%s`. Not sure whether you have ME hardware, exiting\n\n" RESET, name);<br>-                         pci_cleanup(pacc);<br>-                           return 1;<br>-                            break;<br>-                       }<br>+            if (dev->vendor_id != PCI_VENDOR_ID_INTEL)<br>+                        continue;<br>+<br>+         if (PCI_DEV_HAS_ME_DISABLE(dev->device_id)) {<br>+                     printf(CGRN "Good news, you have a `%s` so ME is "<br>+                        "present but can be disabled, continuing...\n\n"<br>+                           RESET, name);<br>+                 break;<br>+               } else if (PCI_DEV_HAS_ME_DIFFICULT(dev->device_id)) {<br>+                    printf(CRED "Bad news, you have a `%s` so you have ME"<br>+                            "hardware on board and you can't control or "<br>+                          "disable it, continuing...\n\n" RESET, name);<br>+                       break;<br>+               } else if (PCI_DEV_CAN_DISABLE_ME_IF_PRESENT(dev->device_id)) {<br>+                   printf(CYEL "Not sure if ME hardware is present because"<br>+                          "you have a `%s`, but it is possible to disable"<br>+                           "it if you do, continuing...\n\n" RESET, name);<br>+                     break;<br>+               } else if (PCI_DEV_ME_NOT_SURE(dev->device_id)) {<br>+                 printf(CYEL "Found `%s`. Not sure whether you have ME"<br>+                            "hardware, exiting\n\n" RESET, name);<br>+                       pci_cleanup(pacc);<br>+                   return 1;<br>             }<br>     }<br> <br>@@ -152,7 +151,8 @@<br>         !PCI_DEV_HAS_ME_DIFFICULT(dev->device_id) &&<br>       !PCI_DEV_CAN_DISABLE_ME_IF_PRESENT(dev->device_id) &&<br>      !PCI_DEV_ME_NOT_SURE(dev->device_id)) {<br>-               printf(CCYN "ME is not present on your board or unkown\n\n" RESET);<br>+                printf(CCYN "ME is not present on your board or unknown\n\n"<br>+                      RESET);<br>                pci_cleanup(pacc);<br>            return 1;<br>     }<br>@@ -160,6 +160,43 @@<br>       pci_cleanup(pacc);<br> <br>         return 0;<br>+}<br>+<br>+static int activate_me(void)<br>+{<br>+  if (read_rcba32(FD2, &fd2)) {<br>+            printf("Error reading RCBA\n");<br>+            return 1;<br>+    }<br>+    if (write_rcba32(FD2, fd2 & ~0x2)) {<br>+             printf("Error writing RCBA\n");<br>+            return 1;<br>+    }<br>+    if (debug) {<br>+         if (fd2 & 0x2)<br>+                   printf("MEI was hidden on PCI, now unlocked\n");<br>+           else<br>+                 printf("MEI not hidden on PCI, checking if visible\n");<br>+    }<br>+    return 0;<br>+}<br>+<br>+static void rehide_me(void)<br>+{<br>+   if (fd2 & 0x2) {<br>+         if (debug)<br>+                   printf("Re-hiding MEI device...");<br>+         if (read_rcba32(FD2, &fd2)) {<br>+                    printf("Error reading RCBA\n");<br>+                    return;<br>+              }<br>+            if (write_rcba32(FD2, fd2 | 0x2)) {<br>+                  printf("Error writing RCBA\n");<br>+                    return;<br>+              }<br>+            if (debug)<br>+                   printf("done\n");<br>+  }<br> }<br> <br> static struct pci_dev *pci_me_interface_scan(const char **name, char *namebuf,<br>@@ -176,14 +213,16 @@<br>      pci_scan_bus(pacc);<br> <br>        for (dev=pacc->devices; dev; dev=dev->next) {<br>-          pci_fill_info(dev, PCI_FILL_IDENT | PCI_FILL_BASES | PCI_FILL_SIZES | PCI_FILL_CLASS);<br>+               pci_fill_info(dev, PCI_FILL_IDENT | PCI_FILL_BASES |<br>+                            PCI_FILL_SIZES | PCI_FILL_CLASS);<br>          *name = pci_lookup_name(pacc, namebuf, namebuf_size,<br>                  PCI_LOOKUP_DEVICE, dev->vendor_id, dev->device_id);<br>-            if (dev->vendor_id == PCI_VENDOR_ID_INTEL) {<br>-                      if (PCI_DEV_HAS_SUPPORTED_ME(dev->device_id)) {<br>-                           me = 1;<br>-                              break;<br>-                       }<br>+            if (dev->vendor_id != PCI_VENDOR_ID_INTEL)<br>+                        continue;<br>+<br>+         if (PCI_DEV_HAS_SUPPORTED_ME(dev->device_id)) {<br>+                   me = 1;<br>+                      break;<br>                }<br>     }<br> <br>@@ -198,74 +237,28 @@<br>   return dev;<br> }<br> <br>-static int activate_me(void)<br>-{<br>-        struct pci_access *pacc;<br>-     struct pci_dev *sb;<br>-  uint32_t rcba_phys;<br>-<br>-       pacc = pci_alloc();<br>-  pacc->method = PCI_ACCESS_I386_TYPE1;<br>-<br>-  pci_init(pacc);<br>-      pci_scan_bus(pacc);<br>-<br>-       sb = pci_get_dev(pacc, 0, 0, 0x1f, 0);<br>-       if (!sb) {<br>-           printf("Uh oh, southbridge not on BDF(0:31:0), please report this error, exiting.\n");<br>-             pci_cleanup(pacc);<br>-           return 1;<br>-    }<br>-    pci_fill_info(sb, PCI_FILL_IDENT | PCI_FILL_BASES | PCI_FILL_SIZES | PCI_FILL_CLASS);<br>-<br>-     rcba_phys = pci_read_long(sb, 0xf0) & 0xfffffffe;<br>-        rcba = map_physical((off_t)rcba_phys, size);<br>- if (rcba == NULL) {<br>-          printf("Could not map MEI PCI device memory\n");<br>-           pci_free_dev(sb);<br>-            pci_cleanup(pacc);<br>-           return 1;<br>-    }<br>-<br>- //printf("RCBA at 0x%08" PRIx32 "\n", (uint32_t)rcba_phys);<br>-      fd2 = *(uint32_t *)(rcba + FD2);<br>-     *(uint32_t *)(rcba + FD2) = fd2 & ~0x2;<br>-  if (fd2 & 0x2) {<br>-         printf("MEI was hidden on PCI, now unlocked\n");<br>-   } else {<br>-             printf("MEI not hidden on PCI, checking if visible\n");<br>-    }<br>-<br>- pci_free_dev(sb);<br>-    pci_cleanup(pacc);<br>-<br>-        return 0;<br>-}<br>-<br> static void dump_me_info(void)<br> {<br>         struct pci_dev *dev;<br>  uint32_t stat, stat2;<br>         char namebuf[1024];<br>-  const char *name;<br>+    const char *name = NULL;<br> <br>-  if (pci_platform_scan()) {<br>+   if (pci_platform_scan())<br>              exit(1);<br>-     }<br> <br>- if (activate_me()) {<br>+ if (activate_me())<br>            exit(1);<br>-     }<br> <br>  dev = pci_me_interface_scan(&name, namebuf, sizeof(namebuf));<br>-    if (!dev) {<br>+  if (!dev)<br>             exit(1);<br>-     }<br> <br>  if (name == NULL)<br>             name = "<unknown>";<br> <br>-       printf("MEI found: [%x:%x] %s\n\n", dev->vendor_id, dev->device_id, name);<br>+   printf("MEI found: [%x:%x] %s\n\n",<br>+               dev->vendor_id, dev->device_id, name);<br>   stat = pci_read_long(dev, 0x40);<br>      printf("ME Status   : 0x%x\n", stat);<br>       stat2 = pci_read_long(dev, 0x48);<br>@@ -276,9 +269,9 @@<br>        intel_me_extend_valid(dev);<br>   printf("\n");<br> <br>-   if (stat & 0xf000) {<br>-             printf("ME: has a broken implementation on your board with this BIOS\n");<br>-  }<br>+    if (stat & 0xf000)<br>+               printf("ME: has a broken implementation on your board with"<br>+                       "this firmware\n");<br> <br>       intel_mei_setup(dev);<br>         usleep(ME_COMMAND_DELAY);<br>@@ -292,33 +285,24 @@<br>      usleep(ME_COMMAND_DELAY);<br> <br>  rehide_me();<br>-<br>-      munmap((void*)rcba, size);<br> }<br> <br> static void print_version(void)<br> {<br>       printf("intelmetool v%s -- ", INTELMETOOL_VERSION);<br>         printf("Copyright (C) 2015 Damien Zammit\n\n");<br>-    printf(<br>-              "This program is free software: you can redistribute it and/or modify\n"<br>-           "it under the terms of the GNU General Public License as published by\n"<br>-           "the Free Software Foundation, version 2 of the License.\n\n"<br>-              "This program is distributed in the hope that it will be useful,\n"<br>-                "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"<br>-         "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"<br>-          "GNU General Public License for more details.\n\n");<br>+       printf(GPLV2COPYRIGHT);<br> }<br> <br> static void print_usage(const char *name)<br> {<br>        printf("usage: %s [-vh?sd]\n", name);<br>       printf("\n"<br>-                         "   -v | --version:                   print the version\n"<br>-                         "   -h | --help:                      print this help\n\n"<br>-                         "   -s | --show:                      dump all me information on console\n"<br>-                        "   -d | --debug:                     enable debug output\n"<br>-                       "\n");<br>+           "   -v | --version:         print the version\n"<br>+           "   -h | --help:            print this help\n\n"<br>+           "   -s | --show:            dump all me information on console\n"<br>+          "   -d | --debug:           enable debug output\n"<br>+         "\n");<br>       exit(1);<br> }<br> <br>@@ -377,7 +361,8 @@<br>          }<br> <br>  #ifndef __DARWIN__<br>-           if ((fd_mem = open("/dev/mem", O_RDWR)) < 0) {<br>+          fd_mem = open("/dev/mem", O_RDWR);<br>+         if (fd_mem < 0) {<br>                  perror("Can not open /dev/mem");<br>                    exit(1);<br>              }<br>diff --git a/util/intelmetool/intelmetool.h b/util/intelmetool/intelmetool.h<br>index b5fe35a..874df16 100644<br>--- a/util/intelmetool/intelmetool.h<br>+++ b/util/intelmetool/intelmetool.h<br>@@ -24,6 +24,15 @@<br> <br> #define INTELMETOOL_VERSION "1.0"<br> <br>+#define GPLV2COPYRIGHT \<br>+"This program is free software: you can redistribute it and/or modify\n" \<br>+"it under the terms of the GNU General Public License as published by\n" \<br>+"the Free Software Foundation, version 2 of the License.\n\n" \<br>+"This program is distributed in the hope that it will be useful,\n" \<br>+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n" \<br>+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n" \<br>+"GNU General Public License for more details.\n\n"<br>+<br> #if defined(__GLIBC__)<br> #include <sys/io.h><br> #endif<br>@@ -58,9 +67,9 @@<br> #define PCI_DEVICE_ID_INTEL_ICH9M               0x2919<br> <br> #define PCI_DEV_HAS_ME_DISABLE(x) ( \<br>-    ( (x) == PCI_DEVICE_ID_INTEL_ICH8ME ) || \<br>-   ( (x) == PCI_DEVICE_ID_INTEL_ICH9ME ) || \<br>-   ( (x) == PCI_DEVICE_ID_INTEL_ICH9M  ))<br>+       ((x) == PCI_DEVICE_ID_INTEL_ICH8ME) || \<br>+     ((x) == PCI_DEVICE_ID_INTEL_ICH9ME) || \<br>+     ((x) == PCI_DEVICE_ID_INTEL_ICH9M  ))<br> <br> // Definitely has ME and is very difficult to remove<br> #define PCI_DEVICE_ID_INTEL_ICH10R            0x3a16<br>@@ -120,61 +129,61 @@<br> #define PCI_DEVICE_ID_INTEL_X99                 0x8d47<br> <br> #define PCI_DEV_HAS_ME_DIFFICULT(x) ( \<br>-  ( (x) == PCI_DEVICE_ID_INTEL_ICH10R ) || \<br>-   ( (x) == PCI_DEVICE_ID_INTEL_3400_DESKTOP ) || \<br>-     ( (x) == PCI_DEVICE_ID_INTEL_3400_MOBILE ) || \<br>-      ( (x) == PCI_DEVICE_ID_INTEL_P55        ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_PM55       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_H55        ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_QM57       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_H57        ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_HM55       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_Q57        ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_HM57       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_3400_MOBILE_SFF ) || \<br>-  ( (x) == PCI_DEVICE_ID_INTEL_B55_A      ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_QS57       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_3400       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_3420       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_3450       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_B55_B      ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_Z68        ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_P67        ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_UM67       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_HM65       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_H67        ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_HM67       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_Q65        ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_QS67       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_Q67        ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_QM67       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_B65        ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_C202       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_C204       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_C206       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_H61        ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_Z77        ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_Z75        ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_Q77        ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_Q75        ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_B75        ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_H77        ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_C216       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_QM77       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_QS77       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_HM77       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_UM77       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_HM76       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_HM75       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_HM70       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_NM70       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_QM87       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_DH89XXCC   ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_FULL  ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_PREM  ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_BASE  ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_WILDCATPOINT_LP    ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_X99        ))<br>+   ((x) == PCI_DEVICE_ID_INTEL_ICH10R) || \<br>+     ((x) == PCI_DEVICE_ID_INTEL_3400_DESKTOP) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_3400_MOBILE) || \<br>+        ((x) == PCI_DEVICE_ID_INTEL_P55 ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_PM55        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_H55 ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_QM57        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_H57 ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_HM55        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_Q57 ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_HM57        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_3400_MOBILE_SFF) || \<br>+    ((x) == PCI_DEVICE_ID_INTEL_B55_A       ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_QS57        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_3400        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_3420        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_3450        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_B55_B       ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_Z68 ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_P67 ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_UM67        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_HM65        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_H67 ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_HM67        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_Q65 ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_QS67        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_Q67 ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_QM67        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_B65 ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_C202        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_C204        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_C206        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_H61 ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_Z77 ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_Z75 ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_Q77 ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_Q75 ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_B75 ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_H77 ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_C216        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_QM77        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_QS77        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_HM77        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_UM77        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_HM76        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_HM75        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_HM70        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_NM70        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_QM87        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_DH89XXCC    ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_FULL   ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_PREM   ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_BASE   ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_WILDCATPOINT_LP     ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_X99 ))<br> <br> // Not sure if ME present, but should be able to disable it easily<br> #define PCI_DEVICE_ID_INTEL_ICH8           0x2810<br>@@ -185,20 +194,20 @@<br> #define PCI_DEVICE_ID_INTEL_ICH9                0x2918<br> <br> #define PCI_DEV_CAN_DISABLE_ME_IF_PRESENT(x) ( \<br>- ( (x) == PCI_DEVICE_ID_INTEL_ICH8       ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_ICH8M      ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_ICH9DH     ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_ICH9DO     ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_ICH9R      ) || \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_ICH9       ))<br>+   ((x) == PCI_DEVICE_ID_INTEL_ICH8        ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_ICH8M       ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_ICH9DH      ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_ICH9DO      ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_ICH9R       ) || \<br>+       ((x) == PCI_DEVICE_ID_INTEL_ICH9        ))<br> <br> // Not sure at all<br> #define PCI_DEVICE_ID_INTEL_SCH_POULSBO_LPC        0x8119<br> #define PCI_DEVICE_ID_INTEL_SCH_POULSBO                0x8100<br> <br> #define PCI_DEV_ME_NOT_SURE(x) ( \<br>-       ( (x) == PCI_DEVICE_ID_INTEL_SCH_POULSBO_LPC ) || \<br>-  ( (x) == PCI_DEVICE_ID_INTEL_SCH_POULSBO))<br>+   ((x) == PCI_DEVICE_ID_INTEL_SCH_POULSBO_LPC) || \<br>+    ((x) == PCI_DEVICE_ID_INTEL_SCH_POULSBO))<br> <br> #define PCI_DEVICE_ID_INTEL_COUGARPOINT_1        0x1C3A /* Cougar Point */<br> #define PCI_DEVICE_ID_INTEL_PATSBURG_1      0x1D3A /* C600/X79 Patsburg */<br>@@ -244,45 +253,45 @@<br> #define PCI_DEVICE_ID_INTEL_SUNRISE_LP 0x9d3a /* SUNRISE Point-LP */<br> <br> #define PCI_DEV_HAS_SUPPORTED_ME(x) ( \<br>-    ( (x) ==  PCI_DEVICE_ID_INTEL_COUGARPOINT_1 ) || \<br>-   ( (x) ==  PCI_DEVICE_ID_INTEL_PATSBURG_1 ) || \<br>-      ( (x) ==  PCI_DEVICE_ID_INTEL_PANTHERPOINT_1 ) || \<br>-  ( (x) ==  PCI_DEVICE_ID_INTEL_PANTHERPOINT_2 ) || \<br>-  ( (x) ==  PCI_DEVICE_ID_INTEL_PANTHERPOINT_3 ) || \<br>-  ( (x) ==  PCI_DEVICE_ID_INTEL_CAVECREEK ) || \<br>-       ( (x) ==  PCI_DEVICE_ID_INTEL_BEARLAKE_1 ) || \<br>-      ( (x) ==  PCI_DEVICE_ID_INTEL_BEARLAKE_2 ) || \<br>-      ( (x) ==  PCI_DEVICE_ID_INTEL_BEARLAKE_3 ) || \<br>-      ( (x) ==  PCI_DEVICE_ID_INTEL_BEARLAKE_4 ) || \<br>-      ( (x) ==  PCI_DEVICE_ID_INTEL_BEARLAKE_5 ) || \<br>-      ( (x) ==  PCI_DEVICE_ID_INTEL_82946GZ ) || \<br>- ( (x) ==  PCI_DEVICE_ID_INTEL_82G35 ) || \<br>-   ( (x) ==  PCI_DEVICE_ID_INTEL_82Q963 ) || \<br>-  ( (x) ==  PCI_DEVICE_ID_INTEL_82P965 ) || \<br>-  ( (x) ==  PCI_DEVICE_ID_INTEL_82Q35 ) || \<br>-   ( (x) ==  PCI_DEVICE_ID_INTEL_82G33 ) || \<br>-   ( (x) ==  PCI_DEVICE_ID_INTEL_82Q33 ) || \<br>-   ( (x) ==  PCI_DEVICE_ID_INTEL_82X38 ) || \<br>-   ( (x) ==  PCI_DEVICE_ID_INTEL_3200 ) || \<br>-    ( (x) ==  PCI_DEVICE_ID_INTEL_PM965 ) || \<br>-   ( (x) ==  PCI_DEVICE_ID_INTEL_GME965 ) || \<br>-  ( (x) ==  PCI_DEVICE_ID_INTEL_CANTIGA_1 ) || \<br>-       ( (x) ==  PCI_DEVICE_ID_INTEL_CANTIGA_2 ) || \<br>-       ( (x) ==  PCI_DEVICE_ID_INTEL_CANTIGA_3 ) || \<br>-       ( (x) ==  PCI_DEVICE_ID_INTEL_CANTIGA_4 ) || \<br>-       ( (x) ==  PCI_DEVICE_ID_INTEL_CANTIGA_5 ) || \<br>-       ( (x) ==  PCI_DEVICE_ID_INTEL_EAGLELAKE_1 ) || \<br>-     ( (x) ==  PCI_DEVICE_ID_INTEL_EAGLELAKE_2 ) || \<br>-     ( (x) ==  PCI_DEVICE_ID_INTEL_EAGLELAKE_3 ) || \<br>-     ( (x) ==  PCI_DEVICE_ID_INTEL_EAGLELAKE_4 ) || \<br>-     ( (x) ==  PCI_DEVICE_ID_INTEL_CALPELLA_1 ) || \<br>-      ( (x) ==  PCI_DEVICE_ID_INTEL_CALPELLA_2 ) || \<br>-      ( (x) ==  PCI_DEVICE_ID_INTEL_LYNXPOINT_1 ) || \<br>-     ( (x) ==  PCI_DEVICE_ID_INTEL_LYNXPOINT_2 ) || \<br>-     ( (x) ==  PCI_DEVICE_ID_INTEL_LYNXPOINT_3 ) || \<br>-     ( (x) ==  PCI_DEVICE_ID_INTEL_LYNXPOINT_4 ) || \<br>-     ( (x) ==  PCI_DEVICE_ID_INTEL_WILDCAT_1 ) || \<br>-       ( (x) ==  PCI_DEVICE_ID_INTEL_WILDCAT_2 ) || \<br>-       ( (x) ==  PCI_DEVICE_ID_INTEL_SUNRISE_H1 ) || \<br>-      ( (x) ==  PCI_DEVICE_ID_INTEL_SUNRISE_H2 ) || \<br>-      ( (x) ==  PCI_DEVICE_ID_INTEL_SUNRISE_LP))<br>+   ((x) ==  PCI_DEVICE_ID_INTEL_COUGARPOINT_1) || \<br>+     ((x) ==  PCI_DEVICE_ID_INTEL_PATSBURG_1) || \<br>+        ((x) ==  PCI_DEVICE_ID_INTEL_PANTHERPOINT_1) || \<br>+    ((x) ==  PCI_DEVICE_ID_INTEL_PANTHERPOINT_2) || \<br>+    ((x) ==  PCI_DEVICE_ID_INTEL_PANTHERPOINT_3) || \<br>+    ((x) ==  PCI_DEVICE_ID_INTEL_CAVECREEK) || \<br>+ ((x) ==  PCI_DEVICE_ID_INTEL_BEARLAKE_1) || \<br>+        ((x) ==  PCI_DEVICE_ID_INTEL_BEARLAKE_2) || \<br>+        ((x) ==  PCI_DEVICE_ID_INTEL_BEARLAKE_3) || \<br>+        ((x) ==  PCI_DEVICE_ID_INTEL_BEARLAKE_4) || \<br>+        ((x) ==  PCI_DEVICE_ID_INTEL_BEARLAKE_5) || \<br>+        ((x) ==  PCI_DEVICE_ID_INTEL_82946GZ) || \<br>+   ((x) ==  PCI_DEVICE_ID_INTEL_82G35) || \<br>+     ((x) ==  PCI_DEVICE_ID_INTEL_82Q963) || \<br>+    ((x) ==  PCI_DEVICE_ID_INTEL_82P965) || \<br>+    ((x) ==  PCI_DEVICE_ID_INTEL_82Q35) || \<br>+     ((x) ==  PCI_DEVICE_ID_INTEL_82G33) || \<br>+     ((x) ==  PCI_DEVICE_ID_INTEL_82Q33) || \<br>+     ((x) ==  PCI_DEVICE_ID_INTEL_82X38) || \<br>+     ((x) ==  PCI_DEVICE_ID_INTEL_3200) || \<br>+      ((x) ==  PCI_DEVICE_ID_INTEL_PM965) || \<br>+     ((x) ==  PCI_DEVICE_ID_INTEL_GME965) || \<br>+    ((x) ==  PCI_DEVICE_ID_INTEL_CANTIGA_1) || \<br>+ ((x) ==  PCI_DEVICE_ID_INTEL_CANTIGA_2) || \<br>+ ((x) ==  PCI_DEVICE_ID_INTEL_CANTIGA_3) || \<br>+ ((x) ==  PCI_DEVICE_ID_INTEL_CANTIGA_4) || \<br>+ ((x) ==  PCI_DEVICE_ID_INTEL_CANTIGA_5) || \<br>+ ((x) ==  PCI_DEVICE_ID_INTEL_EAGLELAKE_1) || \<br>+       ((x) ==  PCI_DEVICE_ID_INTEL_EAGLELAKE_2) || \<br>+       ((x) ==  PCI_DEVICE_ID_INTEL_EAGLELAKE_3) || \<br>+       ((x) ==  PCI_DEVICE_ID_INTEL_EAGLELAKE_4) || \<br>+       ((x) ==  PCI_DEVICE_ID_INTEL_CALPELLA_1) || \<br>+        ((x) ==  PCI_DEVICE_ID_INTEL_CALPELLA_2) || \<br>+        ((x) ==  PCI_DEVICE_ID_INTEL_LYNXPOINT_1) || \<br>+       ((x) ==  PCI_DEVICE_ID_INTEL_LYNXPOINT_2) || \<br>+       ((x) ==  PCI_DEVICE_ID_INTEL_LYNXPOINT_3) || \<br>+       ((x) ==  PCI_DEVICE_ID_INTEL_LYNXPOINT_4) || \<br>+       ((x) ==  PCI_DEVICE_ID_INTEL_WILDCAT_1) || \<br>+ ((x) ==  PCI_DEVICE_ID_INTEL_WILDCAT_2) || \<br>+ ((x) ==  PCI_DEVICE_ID_INTEL_SUNRISE_H1) || \<br>+        ((x) ==  PCI_DEVICE_ID_INTEL_SUNRISE_H2) || \<br>+        ((x) ==  PCI_DEVICE_ID_INTEL_SUNRISE_LP))<br>diff --git a/util/intelmetool/rcba.c b/util/intelmetool/rcba.c<br>new file mode 100644<br>index 0000000..fcc9bc5<br>--- /dev/null<br>+++ b/util/intelmetool/rcba.c<br>@@ -0,0 +1,104 @@<br>+/*<br>+ * Copyright (C) 2014  Damien Zammit <damien@zamaudio.com><br>+ * Copyright (C) 2017  Patrick Rudolph <siro@das-labor.org><br>+ *<br>+ * This program is free software; you can redistribute it and/or modify<br>+ * it under the terms of the GNU General Public License as published by<br>+ * the Free Software Foundation; version 2 of the License.<br>+ *<br>+ * This program is distributed in the hope that it will be useful,<br>+ * but WITHOUT ANY WARRANTY; without even the implied warranty of<br>+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the<br>+ * GNU General Public License for more details.<br>+ */<br>+<br>+#include <stdio.h><br>+#include <inttypes.h><br>+<br>+#include "intelmetool.h"<br>+#include "mmap.h"<br>+#include "rcba.h"<br>+<br>+static const int size = 0x4000;<br>+<br>+/* Returns the physical RCBA base address or zero on error. */<br>+static u32 get_rcba_phys(void)<br>+{<br>+    struct pci_access *pacc;<br>+     struct pci_dev *sb;<br>+  uint32_t rcba_phys;<br>+<br>+       pacc = pci_alloc();<br>+  pacc->method = PCI_ACCESS_I386_TYPE1;<br>+<br>+  pci_init(pacc);<br>+      pci_scan_bus(pacc);<br>+<br>+       sb = pci_get_dev(pacc, 0, 0, 0x1f, 0);<br>+       if (!sb) {<br>+           printf("Uh oh, southbridge not on BDF(0:31:0), please report "<br>+                    "this error, exiting.\n");<br>+          pci_cleanup(pacc);<br>+           return 0;<br>+    }<br>+    pci_fill_info(sb, PCI_FILL_IDENT | PCI_FILL_BASES | PCI_FILL_SIZES |<br>+                   PCI_FILL_CLASS);<br>+<br>+        rcba_phys = pci_read_long(sb, 0xf0) & 0xfffffffe;<br>+<br>+     pci_free_dev(sb);<br>+    pci_cleanup(pacc);<br>+<br>+        return rcba_phys;<br>+}<br>+<br>+/*<br>+ * Writes 'val' to RCBA register at address 'addr'.<br>+ * Returns 1 on error and 0 on success.<br>+ */<br>+int write_rcba32(uint32_t addr, uint32_t val)<br>+{<br>+      volatile uint8_t *rcba;<br>+      const uint32_t rcba_phys = get_rcba_phys();<br>+<br>+       if (!rcba_phys) {<br>+            printf("Could not get RCBA address\n");<br>+            return 1;<br>+    }<br>+<br>+ rcba = map_physical((off_t)rcba_phys, size);<br>+ if (rcba == NULL) {<br>+          printf("Could not map RCBA\n");<br>+            return 1;<br>+    }<br>+    *(uint32_t *)(rcba + addr) = val;<br>+<br>+ munmap((void *)rcba, size);<br>+  return 0;<br>+}<br>+<br>+/*<br>+ * Reads RCBA register at address 'addr' and stores it in 'val'.<br>+ * Returns 1 on error and 0 on success.<br>+ */<br>+int read_rcba32(uint32_t addr, uint32_t *val)<br>+{<br>+ volatile uint8_t *rcba;<br>+      const uint32_t rcba_phys = get_rcba_phys();<br>+<br>+       if (!rcba_phys) {<br>+            printf("Could not get RCBA address\n");<br>+            return 1;<br>+    }<br>+<br>+ rcba = map_physical((off_t)rcba_phys, size);<br>+ if (rcba == NULL) {<br>+          printf("Could not map RCBA\n");<br>+            return 1;<br>+    }<br>+<br>+ *val = *(uint32_t *)(rcba + addr);<br>+<br>+        munmap((void *)rcba, size);<br>+  return 0;<br>+}<br>diff --git a/util/intelmetool/rcba.h b/util/intelmetool/rcba.h<br>new file mode 100644<br>index 0000000..a2c5817<br>--- /dev/null<br>+++ b/util/intelmetool/rcba.h<br>@@ -0,0 +1,16 @@<br>+/*<br>+ * Copyright (C) 2017  Patrick Rudolph <siro@das-labor.org><br>+ *<br>+ * This program is free software; you can redistribute it and/or modify<br>+ * it under the terms of the GNU General Public License as published by<br>+ * the Free Software Foundation; version 2 of the License.<br>+ *<br>+ * This program is distributed in the hope that it will be useful,<br>+ * but WITHOUT ANY WARRANTY; without even the implied warranty of<br>+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the<br>+ * GNU General Public License for more details.<br>+ */<br>+<br>+int write_rcba32(uint32_t addr, uint32_t val);<br>+int read_rcba32(uint32_t addr, uint32_t *val);<br>+<br></pre><p>To view, visit <a href="https://review.coreboot.org/22521">change 22521</a>. To unsubscribe, 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/22521"/><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: Ib8e3617ebb34c47959d6619dfbc7189045e6b8f7 </div>
<div style="display:none"> Gerrit-Change-Number: 22521 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Patrick Rudolph <siro@das-labor.org> </div>