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