[coreboot-gerrit] Patch set updated for coreboot: da99285 google/urara: retrieve board ID from a CBFS file

Patrick Georgi (pgeorgi@google.com) gerrit at coreboot.org
Tue Apr 21 10:44:14 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/9856

-gerrit

commit da992857973cf65ebd6747aa723344d16bf54ee9
Author: Vadim Bendebury <vbendeb at chromium.org>
Date:   Fri Mar 6 17:49:47 2015 -0800

    google/urara: retrieve board ID from a CBFS file
    
    Concerto board does not have the means of detecting the identity of
    the device it is controlling. But it is very beneficial to be able to
    use the same firmware image on Concerto boards running different
    devices.
    
    The suggested solution is to keep the device identity as a string in a
    raw CBFS file called 'board_id'.
    
    With this patch coreboot maintains a table of possible board name
    strings and their matching board IDs.
    
    BRANCH=none
    BUG=chrome-os-partner:37593
    TEST=verified that without the board id file addition the default
        Board ID of zero is used. Adding the file as follows:
    
          echo -n 'concerto' > /tmp/bid
          cbfstool /build/urara/firmware/image.serial.bin  add -f /tmp/bid  \
               -t raw -n 'board_id'
    
        results in firmware reporting board ID setting of 1.
    
    board_id: failed to locate CBFS file board_id
    board_id: name urara, ID 0
    
    Change-Id: I5a02192740dc94b1ea8090092cc325fe0ac42aa6
    Signed-off-by: Patrick Georgi <pgeorgi at chromium.org>
    Original-Commit-Id: f41f9b07f155f0c719c36e0cd93081205624557e
    Original-Change-Id: I8341782005b101be78f5c9a6b375c8f73179c1ad
    Original-Signed-off-by: Vadim Bendebury <vbendeb at chromium.org>
    Original-Reviewed-on: https://chromium-review.googlesource.com/257170
---
 src/mainboard/google/urara/boardid.c       | 77 ++++++++++++++++++++++++++++--
 src/mainboard/google/urara/urara_boardid.h | 28 +++++++++++
 2 files changed, 101 insertions(+), 4 deletions(-)

diff --git a/src/mainboard/google/urara/boardid.c b/src/mainboard/google/urara/boardid.c
index b6f3040..4bdb805 100644
--- a/src/mainboard/google/urara/boardid.c
+++ b/src/mainboard/google/urara/boardid.c
@@ -19,14 +19,83 @@
  * MA 02110-1301 USA
  */
 
+#include <stdlib.h>
+#include <string.h>
+
 #include <boardid.h>
-#include <soc/cpu.h>
+#include <cbfs_core.h>
+#include <console/console.h>
+
+#include "mainboard/google/urara/urara_boardid.h"
+
+/* Name of the CBFS file were the board ID string is read from. */
+#define CBFS_BOARD_ID_FILE_NAME "board_id"
+
+const struct bid_map {
+	const char *board_name;
+	uint8_t   board_id;
+} board_id_map[] = {
+	{"urara", URARA_BOARD_ID_BUB},
+	{"buranku", URARA_BOARD_ID_BURANKU},
+	{"derwent", URARA_BOARD_ID_DERWENT},
+	{"jaguar", URARA_BOARD_ID_JAGUAR},
+	{"kennet", URARA_BOARD_ID_KENNET},
+	{"space", URARA_BOARD_ID_SPACE},
+};
+
+static int cached_board_id = -1;
+
+static uint8_t retrieve_board_id(void)
+{
+	struct cbfs_file *board_id_file;
+	const char *board_id_file_name = CBFS_BOARD_ID_FILE_NAME;
+	char *file_contents;
+	int i;
+	unsigned length;
+
+	board_id_file = cbfs_get_file(CBFS_DEFAULT_MEDIA, board_id_file_name);
+	if (!board_id_file) {
+		printk(BIOS_WARNING,
+		       "board_id: failed to locate file '%s'\n",
+		       board_id_file_name);
+		return 0;
+	}
+
+	length = be32_to_cpu(board_id_file->len);
+
+	file_contents = cbfs_get_file_content(CBFS_DEFAULT_MEDIA,
+					      board_id_file_name,
+					      CBFS_TYPE_RAW);
+
+	if (!file_contents) {
+		printk(BIOS_WARNING, "board_id: failed to read file '%s'\n",
+		       board_id_file_name);
+		return 0;
+	}
+
+	for (i = 0; i < ARRAY_SIZE(board_id_map); i++) {
+		const struct bid_map *entry = board_id_map + i;
+
+		if ((strlen(entry->board_name) == length) &&
+		    !strncmp(entry->board_name, file_contents, length)) {
+			printk(BIOS_INFO, "board_id: name '%s', ID %d\n",
+			       entry->board_name, entry->board_id);
+			return entry->board_id;
+		}
+	}
+
+	printk(BIOS_WARNING, "board_id: no match for board name '%.*s'\n",
+	       length, file_contents);
+	printk(BIOS_WARNING, "board_id: will use default board ID 0\n");
+
+	return 0;
+}
 
 uint8_t board_id(void)
 {
-	static int id;
+	if (cached_board_id == -1)
+		cached_board_id = retrieve_board_id();
 
-	id = IMG_PLATFORM_ID();
-	return id;
+	return cached_board_id;
 }
 
diff --git a/src/mainboard/google/urara/urara_boardid.h b/src/mainboard/google/urara/urara_boardid.h
new file mode 100644
index 0000000..e497e5a
--- /dev/null
+++ b/src/mainboard/google/urara/urara_boardid.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2015 Google, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * 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.
+ */
+
+#ifndef __MAINBOARD_GOOGLE_URARA_URARA_BOARDID_H__
+#define __MAINBOARD_GOOGLE_URARA_URARA_BOARDID_H__
+
+/*
+ * List of URARA derivatives board ID defintions. They are stored in uint8_t
+ * across the code, using #defines here not to imply any specific size.
+ */
+#define URARA_BOARD_ID_BUB	0
+#define URARA_BOARD_ID_BURANKU	1
+#define URARA_BOARD_ID_DERWENT	2
+#define URARA_BOARD_ID_JAGUAR	3
+#define URARA_BOARD_ID_KENNET	4
+#define URARA_BOARD_ID_SPACE	5
+
+#endif



More information about the coreboot-gerrit mailing list