aboutsummaryrefslogtreecommitdiff
path: root/src/mainboard/ocp/monolake/mainboard.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mainboard/ocp/monolake/mainboard.c')
-rw-r--r--src/mainboard/ocp/monolake/mainboard.c40
1 files changed, 40 insertions, 0 deletions
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 <cf9_reset.h>
#include <smbios.h>
#include <string.h>
+#include <drivers/vpd/vpd.h>
+#include <console/console.h>
+#include <drivers/ipmi/ipmi_ops.h>
#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 */