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