Marc Jones (marc.jones(a)se-eng.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8721
-gerrit
commit a1ea9b7c1cf1eefd6bbcbf44a9db435745079d29
Author: Vadim Bendebury <vbendeb(a)chromium.org>
Date: Mon Jul 28 16:47:08 2014 -0700
storm: Add board ID calculation function
storm uses three GPIOs in tertiary mode, such that proto0 returns
value of 8 when the GPIOs are interpreted as a single tertiary number.
Adjust the calculated value to return board ID of 0 on proto0, and
monotonously incrementing values on newer boards.
BUG=chrome-os-partner:30489
TEST=when enabled, the board ID value of zero is reported on the console.
Original-Change-Id: I2ff8fd5cbc8d568877b6f8bf220e146893f1e4be
Original-Signed-off-by: Vadim Bendebury <vbendeb(a)chromium.org>
Original-Reviewed-on: https://chromium-review.googlesource.com/210118
(cherry picked from commit 6ba24f31583933f02be111c8767ae9df56537011)
Signed-off-by: Marc Jones <marc.jones(a)se-eng.com>
Change-Id: I35ee218df35a0924d4bb8fcbc6c875450a609f24
---
src/mainboard/google/storm/Makefile.inc | 3 +-
src/mainboard/google/storm/boardid.c | 50 +++++++++++++++++++++++++++++++++
2 files changed, 52 insertions(+), 1 deletion(-)
diff --git a/src/mainboard/google/storm/Makefile.inc b/src/mainboard/google/storm/Makefile.inc
index 4a47c9e..907638a 100644
--- a/src/mainboard/google/storm/Makefile.inc
+++ b/src/mainboard/google/storm/Makefile.inc
@@ -22,5 +22,6 @@ bootblock-y += cdp.c
romstage-y += romstage.c
romstage-y += cdp.c
-ramstage-y += mainboard.c
+ramstage-y += boardid.c
ramstage-y += cdp.c
+ramstage-y += mainboard.c
diff --git a/src/mainboard/google/storm/boardid.c b/src/mainboard/google/storm/boardid.c
new file mode 100644
index 0000000..7cbb92a
--- /dev/null
+++ b/src/mainboard/google/storm/boardid.c
@@ -0,0 +1,50 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright 2014 Google Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <stdlib.h>
+#include <boardid.h>
+#include <gpiolib.h>
+#include <console/console.h>
+
+/*
+ * Storm boards dedicate to the board ID three GPIOs in tertiary mode: 29, 30
+ * and 68. On proto0 GPIO68 is used and tied low, so it reads as 'zero' by
+ * gpio_board_id(), whereas the other two pins are not connected and read as
+ * 'two'. This results in gpio_board_id() returning 8 on proto0.
+ *
+ * Three tertitiary signals could represent 27 different values. To make
+ * calculated board ID value continuous and starting at zero, offset the
+ * calculated value by 19 (i.e. 27 - 8) and return modulo 27 of the offset
+ * number. This results in proto0 returning zero as the board ID, the future
+ * revisions will have the inputs configured to match the actual board
+ * revision.
+ */
+
+uint8_t board_id(void)
+{
+ uint8_t bid;
+ gpio_t hw_rev_gpios[] = {68, 30, 29};
+ int offset = 19;
+
+ bid = gpio_board_id(hw_rev_gpios, ARRAY_SIZE(hw_rev_gpios), 1);
+ bid = (bid + offset) % 27;
+ printk(BIOS_INFO, "Board ID %d\n", bid);
+
+ return bid;
+}
Marc Jones (marc.jones(a)se-eng.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8719
-gerrit
commit e978c734ee5d0759b087795566c7f824b38dd601
Author: Vadim Bendebury <vbendeb(a)chromium.org>
Date: Mon Jul 28 16:03:07 2014 -0700
Publish the board ID value in coreboot table, when configured
Board ID value is usually of interest to bootloaders. Instead of
duplicating the board ID discovery code in different bootloaders let's
determine it in coreboot and publish it through coreboot table, when
configured.
BUG=chrome-os-partner:30489
TEST=none yet
Original-Change-Id: Iee247c44a1c91dbcedcc9058e8742c75ff951f43
Original-Signed-off-by: Vadim Bendebury <vbendeb(a)chromium.org>
Original-Reviewed-on: https://chromium-review.googlesource.com/210116
Original-Reviewed-by: David Hendricks <dhendrix(a)chromium.org>
(cherry picked from commit b2057a02db9391e2085b138eea843e6bb09d3ea2)
Signed-off-by: Marc Jones <marc.jones(a)se-eng.com>
Change-Id: Ia1e36b907ac15b0aafce0711f827cb83622e27bb
---
src/Kconfig | 8 ++++++++
src/include/boot/coreboot_tables.h | 8 ++++++++
src/lib/Makefile.inc | 2 +-
src/lib/coreboot_table.c | 18 ++++++++++++++++++
4 files changed, 35 insertions(+), 1 deletion(-)
diff --git a/src/Kconfig b/src/Kconfig
index ec6a3b3..7beb64c 100644
--- a/src/Kconfig
+++ b/src/Kconfig
@@ -1117,6 +1117,14 @@ config DEBUG_COVERAGE
If enabled, the code coverage hooks in coreboot will output some
information about the coverage data that is dumped.
+config BOARD_ID_SUPPORT
+ bool "Discover board ID and store it in coreboot table"
+ default n
+ help
+ If enabled, coreboot discovers the board id of the hardware it is
+ running on and reports it through the coreboot table to the rest of
+ the system.
+
config TERTIARY_BOARD_ID
bool "Interpret board ID GPIOs as tertiary inputs"
default n if ARCH_X86
diff --git a/src/include/boot/coreboot_tables.h b/src/include/boot/coreboot_tables.h
index 3dc8fb6..fc44a3c 100644
--- a/src/include/boot/coreboot_tables.h
+++ b/src/include/boot/coreboot_tables.h
@@ -254,6 +254,14 @@ struct lb_x86_rom_mtrr {
uint32_t index;
};
+#define LB_TAG_BOARD_ID 0x0025
+struct lb_board_id {
+ uint32_t tag;
+ uint32_t size;
+ /* Board ID as retrieved from the board revision GPIOs. */
+ uint32_t board_id;
+};
+
/* The following structures are for the cmos definitions table */
#define LB_TAG_CMOS_OPTION_TABLE 200
/* cmos header record */
diff --git a/src/lib/Makefile.inc b/src/lib/Makefile.inc
index 48c06bc..b3f3fbf 100644
--- a/src/lib/Makefile.inc
+++ b/src/lib/Makefile.inc
@@ -54,7 +54,6 @@ ifeq ($(CONFIG_COMPILER_GCC),y)
romstage-$(CONFIG_ARCH_ROMSTAGE_X86_32) += gcc.c
ramstage-$(CONFIG_ARCH_RAMSTAGE_X86_32) += gcc.c
endif
-romstage-$(CONFIG_TERTIARY_BOARD_ID) += tristate_gpios.c
ramstage-y += hardwaremain.c
ramstage-y += selfboot.c
@@ -82,6 +81,7 @@ ramstage-$(CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT) += edid.c
ramstage-y += memrange.c
ramstage-$(CONFIG_COOP_MULTITASKING) += thread.c
ramstage-$(CONFIG_TIMER_QUEUE) += timer_queue.c
+ramstage--${CONFIG_TERTIARY_BOARD_ID} += tristate_gpios.c
romstage-y += cbmem_common.c dynamic_cbmem.c
ramstage-y += cbmem_common.c dynamic_cbmem.c
diff --git a/src/lib/coreboot_table.c b/src/lib/coreboot_table.c
index abcb0ed..2b484d4 100644
--- a/src/lib/coreboot_table.c
+++ b/src/lib/coreboot_table.c
@@ -26,6 +26,7 @@
#include <boot/coreboot_tables.h>
#include <string.h>
#include <version.h>
+#include <boardid.h>
#include <device/device.h>
#include <stdlib.h>
#include <cbfs.h>
@@ -212,6 +213,19 @@ static inline void lb_vboot_handoff(struct lb_header *header) {}
#endif /* CONFIG_VBOOT_VERIFY_FIRMWARE */
#endif /* CONFIG_CHROMEOS */
+static void lb_board_id(struct lb_header *header)
+{
+#if CONFIG_BOARD_ID_SUPPORT
+ struct lb_board_id *bid;
+
+ bid = (struct lb_board_id *)lb_new_record(header);
+
+ bid->tag = LB_TAG_BOARD_ID;
+ bid->size = sizeof(*bid);
+ bid->board_id = board_id();
+#endif
+}
+
static void add_cbmem_pointers(struct lb_header *header)
{
/*
@@ -432,6 +446,10 @@ unsigned long write_coreboot_table(
/* pass along the vboot_handoff address. */
lb_vboot_handoff(head);
#endif
+
+ /* Add board ID if available */
+ lb_board_id(head);
+
add_cbmem_pointers(head);
/* Add board-specific table entries, if any. */