From 5a2e23ef3b5d64b62ed7b93bb015989a2c49e261 Mon Sep 17 00:00:00 2001 From: Vadim Bendebury Date: Fri, 6 Mar 2015 17:49:47 -0800 Subject: [PATCH] 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 Original-Commit-Id: f41f9b07f155f0c719c36e0cd93081205624557e Original-Change-Id: I8341782005b101be78f5c9a6b375c8f73179c1ad Original-Signed-off-by: Vadim Bendebury Original-Reviewed-on: https://chromium-review.googlesource.com/257170 Reviewed-on: http://review.coreboot.org/9856 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer --- src/mainboard/google/urara/boardid.c | 77 ++++++++++++++++++++-- src/mainboard/google/urara/urara_boardid.h | 28 ++++++++ 2 files changed, 101 insertions(+), 4 deletions(-) create mode 100644 src/mainboard/google/urara/urara_boardid.h diff --git a/src/mainboard/google/urara/boardid.c b/src/mainboard/google/urara/boardid.c index b6f30401eb..02cfa05ee0 100644 --- a/src/mainboard/google/urara/boardid.c +++ b/src/mainboard/google/urara/boardid.c @@ -19,14 +19,83 @@ * MA 02110-1301 USA */ +#include +#include + #include -#include +#include +#include + +#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, NULL); + + 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 0000000000..e497e5ac0a --- /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