[coreboot-gerrit] Patch set updated for coreboot: 35674eb7 chromeos: move VPD MAC address retrieval function

Patrick Georgi (pgeorgi@google.com) gerrit at coreboot.org
Fri Apr 10 08:47:40 CEST 2015


Patrick Georgi (pgeorgi at google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/9398

-gerrit

commit 35674eb7e251aad8c7645ddaf17701f62d209773
Author: Vadim Bendebury <vbendeb at chromium.org>
Date:   Thu Oct 16 13:02:37 2014 -0700

    chromeos: move VPD MAC address retrieval function
    
    Retrieval of the MAC address from the VPD is a Chrome OS specific
    feature, required just on one platform so far. There is no need to
    look for the MAC address in the VPD on all other Chrome OS boards.
    
    BRANCH=storm
    BUG=chromium:417117
    TEST=with the upcoming patch applied verified that MAC addresses still
         show up in the device tree on storm
    
    Change-Id: If5fd4895bffc758563df7d21f38995f0c8594330
    Signed-off-by: Patrick Georgi <pgeorgi at chromium.org>
    Original-Commit-Id: fb4906ac559634321a01b4814f338611b9e98b2b
    Original-Change-Id: I8e6f8dc38294d3ab11965931be575360fd12b2fc
    Original-Signed-off-by: Vadim Bendebury <vbendeb at chromium.org>
    Original-Reviewed-on: https://chromium-review.googlesource.com/223796
    Original-Reviewed-by: Julius Werner <jwerner at chromium.org>
---
 src/include/boot/coreboot_tables.h          |  6 ++
 src/lib/coreboot_table.c                    | 73 ----------------------
 src/vendorcode/google/chromeos/Makefile.inc |  2 +-
 src/vendorcode/google/chromeos/vpd_mac.c    | 93 +++++++++++++++++++++++++++++
 4 files changed, 100 insertions(+), 74 deletions(-)

diff --git a/src/include/boot/coreboot_tables.h b/src/include/boot/coreboot_tables.h
index 0efb8fd..db55ada 100644
--- a/src/include/boot/coreboot_tables.h
+++ b/src/include/boot/coreboot_tables.h
@@ -366,6 +366,12 @@ void lb_add_console(uint16_t consoletype, void *data);
 /* Define this in mainboard.c to add board-specific table entries. */
 void lb_board(struct lb_header *header);
 
+/*
+ * Function to retrieve MAC address(es) from the VPD and store them in the
+ * coreboot table.
+ */
+void lb_table_add_macs_from_vpd(struct lb_header *header);
+
 struct lb_record *lb_new_record(struct lb_header *header);
 
 #endif /* COREBOOT_TABLES_H */
diff --git a/src/lib/coreboot_table.c b/src/lib/coreboot_table.c
index a8b5edf..365283f 100644
--- a/src/lib/coreboot_table.c
+++ b/src/lib/coreboot_table.c
@@ -38,7 +38,6 @@
 #endif
 #include <vendorcode/google/chromeos/chromeos.h>
 #include <vendorcode/google/chromeos/gnvs.h>
-#include <vendorcode/google/chromeos/cros_vpd.h>
 #endif
 #if CONFIG_ARCH_X86
 #include <cpu/x86/mtrr.h>
@@ -158,75 +157,6 @@ void fill_lb_gpio(struct lb_gpio *gpio, int num,
 }
 
 #if CONFIG_CHROMEOS
-static void lb_macs(struct lb_header *header)
-{
-	/*
-	 * In case there is one or more MAC addresses stored in the VPD, the
-	 * key is "ethernet_mac{0..9}", up to 10 values.
-	 */
-	static const char mac_addr_key_base[] = "ethernet_mac0";
-	char mac_addr_key[sizeof(mac_addr_key_base)];
-	char mac_addr_str[13]; /* 12 symbols and the trailing zero. */
-	int count;
-	struct lb_macs *macs = NULL;
-	const int index_of_index = sizeof(mac_addr_key) - 2;
-
-	/*
-	 * MAC addresses are stored in the VPD as strings of hex numbers,
-	 * which need to be converted into binary for storing in the coreboot
-	 * table.
-	 */
-	strcpy(mac_addr_key, mac_addr_key_base);
-	count = 0;
-	do {
-		int i;
-
-		if (!cros_vpd_gets(mac_addr_key, mac_addr_str,
-				   sizeof(mac_addr_str)))
-			break; /* No more MAC addresses in VPD */
-
-		if (!macs) {
-			macs = (struct lb_macs *)lb_new_record(header);
-			macs->tag = LB_TAG_MAC_ADDRS;
-		}
-
-		/* MAC address in symbolic form is in mac_addr_str. */
-		for (i = 0; i < sizeof(macs->mac_addrs[0].mac_addr); i++) {
-			int j;
-			uint8_t n = 0;
-
-			for (j = 0; j < 2; j++) {
-				char c = mac_addr_str[i * 2 + j];
-
-				if (isxdigit(c)) {
-					if (isdigit(c))
-						c -= '0';
-					else
-						c = tolower(c) - 'a' + 10;
-				} else {
-					printk(BIOS_ERR,
-					       "%s: non hexadecimal symbol "
-					       "%#2.2x in the VPD field %s\n",
-					       __func__, (uint8_t)c,
-					       mac_addr_key);
-					c = 0;
-				}
-				n <<= 4;
-				n |= c;
-			}
-			macs->mac_addrs[count].mac_addr[i] = n;
-		}
-		count++;
-		mac_addr_key[index_of_index] = '0' + count;
-	} while (count < 10);
-
-	if (!count)
-		return; /* No MAC addresses in the VPD. */
-
-	macs->count = count;
-	macs->size = sizeof(*macs) + count * sizeof(struct mac_address);
-}
-
 static void lb_gpios(struct lb_header *header)
 {
 	struct lb_gpios *gpios;
@@ -517,9 +447,6 @@ unsigned long write_coreboot_table(
 
 	/* pass along the vboot_handoff address. */
 	lb_vboot_handoff(head);
-
-	/* Retrieve mac addresses from VPD, if any. */
-	lb_macs(head);
 #endif
 
 	/* Add board ID if available */
diff --git a/src/vendorcode/google/chromeos/Makefile.inc b/src/vendorcode/google/chromeos/Makefile.inc
index f43a87e..da1db8b 100644
--- a/src/vendorcode/google/chromeos/Makefile.inc
+++ b/src/vendorcode/google/chromeos/Makefile.inc
@@ -29,7 +29,7 @@ ramstage-y += fmap.c
 ramstage-$(CONFIG_CHROMEOS_RAMOOPS) += ramoops.c
 smm-y += fmap.c
 romstage-y += vpd_decode.c cros_vpd.c
-ramstage-y += vpd_decode.c cros_vpd.c
+ramstage-y += vpd_decode.c cros_vpd.c vpd_mac.c
 
 ifeq ($(MOCK_TPM),1)
 CFLAGS_common += -DMOCK_TPM=1
diff --git a/src/vendorcode/google/chromeos/vpd_mac.c b/src/vendorcode/google/chromeos/vpd_mac.c
new file mode 100644
index 0000000..ad4174c
--- /dev/null
+++ b/src/vendorcode/google/chromeos/vpd_mac.c
@@ -0,0 +1,93 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright 2014 Google Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <boot/coreboot_tables.h>
+#include <console/console.h>
+#include <string.h>
+
+#include <vendorcode/google/chromeos/cros_vpd.h>
+
+void lb_table_add_macs_from_vpd(struct lb_header *header)
+{
+	/*
+	 * In case there is one or more MAC addresses stored in the VPD, the
+	 * key is "ethernet_mac{0..9}", up to 10 values.
+	 */
+	static const char mac_addr_key_base[] = "ethernet_mac0";
+	char mac_addr_key[sizeof(mac_addr_key_base)];
+	char mac_addr_str[13]; /* 12 symbols and the trailing zero. */
+	int count;
+	struct lb_macs *macs = NULL;
+	const int index_of_index = sizeof(mac_addr_key) - 2;
+
+	/*
+	 * MAC addresses are stored in the VPD as strings of hex numbers,
+	 * which need to be converted into binary for storing in the coreboot
+	 * table.
+	 */
+	strcpy(mac_addr_key, mac_addr_key_base);
+	count = 0;
+	do {
+		int i;
+
+		if (!cros_vpd_gets(mac_addr_key, mac_addr_str,
+				   sizeof(mac_addr_str)))
+			break; /* No more MAC addresses in VPD */
+
+		if (!macs) {
+			macs = (struct lb_macs *)lb_new_record(header);
+			macs->tag = LB_TAG_MAC_ADDRS;
+		}
+
+		/* MAC address in symbolic form is in mac_addr_str. */
+		for (i = 0; i < sizeof(macs->mac_addrs[0].mac_addr); i++) {
+			int j;
+			uint8_t n = 0;
+
+			for (j = 0; j < 2; j++) {
+				char c = mac_addr_str[i * 2 + j];
+
+				if (isxdigit(c)) {
+					if (isdigit(c))
+						c -= '0';
+					else
+						c = tolower(c) - 'a' + 10;
+				} else {
+					printk(BIOS_ERR,
+					       "%s: non hexadecimal symbol "
+					       "%#2.2x in the VPD field %s\n",
+					       __func__, (uint8_t)c,
+					       mac_addr_key);
+					c = 0;
+				}
+				n <<= 4;
+				n |= c;
+			}
+			macs->mac_addrs[count].mac_addr[i] = n;
+		}
+		count++;
+		mac_addr_key[index_of_index] = '0' + count;
+	} while (count < 10);
+
+	if (!count)
+		return; /* No MAC addresses in the VPD. */
+
+	macs->count = count;
+	macs->size = sizeof(*macs) + count * sizeof(struct mac_address);
+}



More information about the coreboot-gerrit mailing list