diff --git a/src/mainboard/ocp/monolake/Kconfig b/src/mainboard/ocp/monolake/Kconfig index ad4e9c7208..7d85bbba70 100644 --- a/src/mainboard/ocp/monolake/Kconfig +++ b/src/mainboard/ocp/monolake/Kconfig @@ -13,6 +13,7 @@ config BOARD_SPECIFIC_OPTIONS select MAINBOARD_HAS_LPC_TPM select MAINBOARD_HAS_TPM1 select IPMI_KCS + select VPD config VBOOT select VBOOT_VBNV_CMOS diff --git a/src/mainboard/ocp/monolake/ipmi.c b/src/mainboard/ocp/monolake/ipmi.c index 37aacc842e..3f178dc2cc 100644 --- a/src/mainboard/ocp/monolake/ipmi.c +++ b/src/mainboard/ocp/monolake/ipmi.c @@ -17,8 +17,6 @@ #include #include "ipmi.h" -#define BMC_KCS_BASE 0xca2 - int is_ipmi_clear_cmos_set(ipmi_oem_rsp_t *rsp) { int ret; diff --git a/src/mainboard/ocp/monolake/ipmi.h b/src/mainboard/ocp/monolake/ipmi.h index 5863eb5082..04649111c2 100644 --- a/src/mainboard/ocp/monolake/ipmi.h +++ b/src/mainboard/ocp/monolake/ipmi.h @@ -23,7 +23,7 @@ #define GET_CMOS_BIT(x) ((x) & (1 << 1)) #define GET_VALID_BIT(x) ((x) & (1 << 7)) #define CLEAR_CMOS_AND_VALID_BIT(x) ((x) &= 0x7d) - +#define BMC_KCS_BASE 0xca2 typedef struct { u8 BootMode; /* Bit 1:CMOS clear, bit 7:valid bit. */ u8 Boot0000; diff --git a/src/mainboard/ocp/monolake/mainboard.c b/src/mainboard/ocp/monolake/mainboard.c index 010e064c35..dffd19f0f0 100644 --- a/src/mainboard/ocp/monolake/mainboard.c +++ b/src/mainboard/ocp/monolake/mainboard.c @@ -19,7 +19,46 @@ #include #include #include +#include +#include +#include #include "ipmi.h" +/* VPD variable for enabling/disabling FRB2 timer. */ +#define FRB2_TIMER "FRB2_TIMER" +/* VPD variable for setting FRB2 timer countdown value. */ +#define FRB2_COUNTDOWN "FRB2_COUNTDOWN" +#define VPD_LEN 10 +/* Default countdown is 15 minutes. */ +#define DEFAULT_COUNTDOWN 9000 + +static void init_frb2_wdt(void) +{ + + char val[VPD_LEN]; + /* Enable FRB2 timer by default. */ + u8 enable = 1; + uint16_t countdown; + + if (vpd_get_bool(FRB2_TIMER, VPD_RW, &enable)) { + if (!enable) { + printk(BIOS_DEBUG, "Disable FRB2 timer\n"); + ipmi_stop_bmc_wdt(BMC_KCS_BASE); + } + } + if (enable) { + if (vpd_gets(FRB2_COUNTDOWN, val, VPD_LEN, VPD_RW)) { + countdown = (uint16_t)atol(val); + printk(BIOS_DEBUG, "FRB2 timer countdown set to: %d\n", + countdown); + } else { + printk(BIOS_DEBUG, "FRB2 timer use default value: %d\n", + DEFAULT_COUNTDOWN); + countdown = DEFAULT_COUNTDOWN; + } + ipmi_init_and_start_bmc_wdt(BMC_KCS_BASE, countdown, + TIMEOUT_HARD_RESET); + } +} /* * mainboard_enable is executed as first thing after enumerate_buses(). @@ -29,6 +68,7 @@ static void mainboard_enable(struct device *dev) { ipmi_oem_rsp_t rsp; + init_frb2_wdt(); if (is_ipmi_clear_cmos_set(&rsp)) { /* TODO: Should also try to restore CMOS to cmos.default * if USE_OPTION_TABLE is set */