summaryrefslogtreecommitdiff
path: root/board/cr50/board.c
diff options
context:
space:
mode:
Diffstat (limited to 'board/cr50/board.c')
-rw-r--r--board/cr50/board.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/board/cr50/board.c b/board/cr50/board.c
index 3cf0156c26..cfe2d9a4d7 100644
--- a/board/cr50/board.c
+++ b/board/cr50/board.c
@@ -828,6 +828,46 @@ static void maybe_trigger_ite_sync(void)
generate_ite_sync();
}
+/*
+ * Save the logged events, the system reset flags, and the config for the
+ * event in flog.
+ */
+static struct brdprop_payload bp_flog;
+
+/* Each event can be logged once per boot. */
+static void flog_brdprop_event(enum brdprop_ev event, uint8_t config)
+{
+ if (event >= BRDPROP_COUNT) {
+ CPRINTS("%s: invalid event %d", __func__, event);
+ return;
+ }
+ bp_flog.events |= (1 << event);
+ bp_flog.configs[event] = config;
+}
+
+/*
+ * The flog isn't initialized when board properties are calculated. Save the
+ * information in flog once it's ready.
+ */
+static void process_brdprop_flog(void)
+{
+ if (!bp_flog.events)
+ return;
+ /*
+ * Boards with closed loop reset are going to have ambiguous straps
+ * after reboot. Don't log those errors. Only log invalid strap errors
+ * on those boards.
+ * Filter these here, because cr50 doesn't know the board properties
+ * when it's initially logging the errors.
+ */
+ if (board_uses_closed_loop_reset() &&
+ bp_flog.events == (1 << BRDPROP_AMBIGUOUS))
+ return;
+
+ bp_flog.reset_flags = system_get_reset_flags();
+ flash_log_add_event(FE_LOG_BRDPROP, sizeof(bp_flog), &bp_flog);
+}
+
static void process_board_cfg(void)
{
uint32_t tpm_board_cfg = board_cfg_reg_read();
@@ -874,6 +914,9 @@ static void board_init(void)
*/
if (system_get_reset_flags() & EC_RESET_FLAG_HIBERNATE)
system_decrement_retry_counter();
+
+ process_brdprop_flog();
+
configure_board_specific_gpios();
init_pmu();
reset_wake_logic();
@@ -1519,6 +1562,7 @@ static int get_strap_config(uint8_t *config)
* unused config pins the AP is interfering with.
*/
if (use_i2c && use_spi) {
+ flog_brdprop_event(BRDPROP_AMBIGUOUS, *config);
spi_prop = (GREG32(PMU, LONG_LIFE_SCRATCH1) &
BOARD_PERIPH_CONFIG_SPI);
i2c_prop = (GREG32(PMU, LONG_LIFE_SCRATCH1) &
@@ -1544,6 +1588,7 @@ static uint32_t get_properties(void)
uint32_t properties;
if (get_strap_config(&config) != EC_SUCCESS) {
+ flog_brdprop_event(BRDPROP_INVALID, config);
#ifdef H1_RED_BOARD
CPRINTS("Unconditionally enabling SPI and platform reset");
return (BOARD_PERIPH_CONFIG_SPI | BOARD_USE_PLT_RESET);
@@ -1586,6 +1631,7 @@ static uint32_t get_properties(void)
/* All I2C boards use same default properties. */
properties = BOARD_PROPERTIES_DEFAULT;
}
+ flog_brdprop_event(BRDPROP_NO_ENTRY, config);
CPRINTS("strap_cfg 0x%x has no table entry, prop = 0x%x",
config, properties);
return properties;