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@chromium.org>
Original-Commit-Id: f41f9b07f155f0c719c36e0cd93081205624557e
Original-Change-Id: I8341782005b101be78f5c9a6b375c8f73179c1ad
Original-Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
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 <stefan.reinauer@coreboot.org>
This commit is contained in:
Vadim Bendebury 2015-03-06 17:49:47 -08:00 committed by Patrick Georgi
parent 73dd7b6d14
commit 5a2e23ef3b
2 changed files with 101 additions and 4 deletions

View File

@ -19,14 +19,83 @@
* MA 02110-1301 USA * MA 02110-1301 USA
*/ */
#include <stdlib.h>
#include <string.h>
#include <boardid.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, 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) uint8_t board_id(void)
{ {
static int id; if (cached_board_id == -1)
cached_board_id = retrieve_board_id();
id = IMG_PLATFORM_ID(); return cached_board_id;
return id;
} }

View File

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