summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mainboard/google/urara/boardid.c77
-rw-r--r--src/mainboard/google/urara/urara_boardid.h28
2 files changed, 101 insertions, 4 deletions
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 <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, 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