summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2014-05-06 15:44:14 -0700
committerMarc Jones <marc.jones@se-eng.com>2014-12-26 19:39:54 +0100
commitc85220654f03e1c0815627c36fb3928aef4e6850 (patch)
tree27b17d775af5a353478cdecbd59ffda063822977
parent4dc3e28c741cd0b5ce6effeaec58eeda45b12303 (diff)
nyan*: Detect watchdog resets and reset the whole machine.
When a watchdog reset happens, the SOC will reset but other parts of the system might not. That puts the machine in a funny state and may prevent it from booting properly. BUG=chrome-os-partner:28559 TEST=Built for nyan, nyan_big and nyan_blaze. Booted normally, through EC reset, software reset ("reboot" command from the terminal), and through watch dog reset. Verified that the new code only triggered during the watchdog reset and that the system rebooted and was able to boot without going into recovery mode unnecessarily. BRANCH=nyan Change-Id: Id92411c928344547fcd97e45063e4aff52d2e9e8 Signed-off-by: Gabe Black <gabeblack@google.com> Reviewed-on: https://chromium-review.googlesource.com/198582 Reviewed-by: Tom Warren <twarren@nvidia.com> Reviewed-by: Andrew Bresticker <abrestic@chromium.org> Commit-Queue: Gabe Black <gabeblack@chromium.org> Tested-by: Gabe Black <gabeblack@chromium.org> (cherry picked from commit b298be41c0959c58aeb8be5bf15141549da2504c) Signed-off-by: Marc Jones <marc.jones@se-eng.com> Reviewed-on: http://review.coreboot.org/7900 Tested-by: build bot (Jenkins) Reviewed-by: Edward O'Callaghan <eocallaghan@alterapraxis.com>
-rw-r--r--src/mainboard/google/nyan/Makefile.inc1
-rw-r--r--src/mainboard/google/nyan/romstage.c11
-rw-r--r--src/mainboard/google/nyan_big/Makefile.inc1
-rw-r--r--src/mainboard/google/nyan_big/romstage.c11
-rw-r--r--src/mainboard/google/nyan_blaze/Makefile.inc1
-rw-r--r--src/mainboard/google/nyan_blaze/romstage.c11
6 files changed, 36 insertions, 0 deletions
diff --git a/src/mainboard/google/nyan/Makefile.inc b/src/mainboard/google/nyan/Makefile.inc
index 30cd27d9fc..b66cd555fb 100644
--- a/src/mainboard/google/nyan/Makefile.inc
+++ b/src/mainboard/google/nyan/Makefile.inc
@@ -32,6 +32,7 @@ bootblock-y += bootblock.c
bootblock-y += pmic.c
bootblock-y += reset.c
+romstage-y += reset.c
romstage-y += romstage.c
romstage-y += sdram_configs.c
romstage-$(CONFIG_CHROMEOS) += chromeos.c
diff --git a/src/mainboard/google/nyan/romstage.c b/src/mainboard/google/nyan/romstage.c
index b4e27330ac..4e023654e7 100644
--- a/src/mainboard/google/nyan/romstage.c
+++ b/src/mainboard/google/nyan/romstage.c
@@ -27,12 +27,14 @@
#include <cbmem.h>
#include <console/cbmem_console.h>
#include <console/console.h>
+#include <mainboard/google/nyan/reset.h>
#include <romstage_handoff.h>
#include <vendorcode/google/chromeos/chromeos.h>
#include "sdram_configs.h"
#include <soc/nvidia/tegra/i2c.h>
#include <soc/nvidia/tegra124/chip.h>
#include <soc/nvidia/tegra124/clk_rst.h>
+#include <soc/nvidia/tegra124/power.h>
#include <soc/nvidia/tegra124/sdram.h>
#include <soc/addressmap.h>
#include <soc/clock.h>
@@ -181,6 +183,15 @@ static void __attribute__((noinline)) romstage(void)
mmu_disable_range(0, 1);
dcache_mmu_enable();
+ /*
+ * A watchdog reset only resets part of the system so it ends up in
+ * a funny state. If that happens, we need to reset the whole machine.
+ */
+ if (power_reset_status() == POWER_RESET_WATCHDOG) {
+ printk(BIOS_INFO, "Watchdog reset detected, rebooting.\n");
+ cpu_reset();
+ }
+
/* For quality of the user experience, it's important to get
* the video going ASAP. Because there are long delays in some
* of the powerup steps, we do some very early setup here in
diff --git a/src/mainboard/google/nyan_big/Makefile.inc b/src/mainboard/google/nyan_big/Makefile.inc
index 30cd27d9fc..b66cd555fb 100644
--- a/src/mainboard/google/nyan_big/Makefile.inc
+++ b/src/mainboard/google/nyan_big/Makefile.inc
@@ -32,6 +32,7 @@ bootblock-y += bootblock.c
bootblock-y += pmic.c
bootblock-y += reset.c
+romstage-y += reset.c
romstage-y += romstage.c
romstage-y += sdram_configs.c
romstage-$(CONFIG_CHROMEOS) += chromeos.c
diff --git a/src/mainboard/google/nyan_big/romstage.c b/src/mainboard/google/nyan_big/romstage.c
index b4e27330ac..4e023654e7 100644
--- a/src/mainboard/google/nyan_big/romstage.c
+++ b/src/mainboard/google/nyan_big/romstage.c
@@ -27,12 +27,14 @@
#include <cbmem.h>
#include <console/cbmem_console.h>
#include <console/console.h>
+#include <mainboard/google/nyan/reset.h>
#include <romstage_handoff.h>
#include <vendorcode/google/chromeos/chromeos.h>
#include "sdram_configs.h"
#include <soc/nvidia/tegra/i2c.h>
#include <soc/nvidia/tegra124/chip.h>
#include <soc/nvidia/tegra124/clk_rst.h>
+#include <soc/nvidia/tegra124/power.h>
#include <soc/nvidia/tegra124/sdram.h>
#include <soc/addressmap.h>
#include <soc/clock.h>
@@ -181,6 +183,15 @@ static void __attribute__((noinline)) romstage(void)
mmu_disable_range(0, 1);
dcache_mmu_enable();
+ /*
+ * A watchdog reset only resets part of the system so it ends up in
+ * a funny state. If that happens, we need to reset the whole machine.
+ */
+ if (power_reset_status() == POWER_RESET_WATCHDOG) {
+ printk(BIOS_INFO, "Watchdog reset detected, rebooting.\n");
+ cpu_reset();
+ }
+
/* For quality of the user experience, it's important to get
* the video going ASAP. Because there are long delays in some
* of the powerup steps, we do some very early setup here in
diff --git a/src/mainboard/google/nyan_blaze/Makefile.inc b/src/mainboard/google/nyan_blaze/Makefile.inc
index 30cd27d9fc..b66cd555fb 100644
--- a/src/mainboard/google/nyan_blaze/Makefile.inc
+++ b/src/mainboard/google/nyan_blaze/Makefile.inc
@@ -32,6 +32,7 @@ bootblock-y += bootblock.c
bootblock-y += pmic.c
bootblock-y += reset.c
+romstage-y += reset.c
romstage-y += romstage.c
romstage-y += sdram_configs.c
romstage-$(CONFIG_CHROMEOS) += chromeos.c
diff --git a/src/mainboard/google/nyan_blaze/romstage.c b/src/mainboard/google/nyan_blaze/romstage.c
index b4e27330ac..4e023654e7 100644
--- a/src/mainboard/google/nyan_blaze/romstage.c
+++ b/src/mainboard/google/nyan_blaze/romstage.c
@@ -27,12 +27,14 @@
#include <cbmem.h>
#include <console/cbmem_console.h>
#include <console/console.h>
+#include <mainboard/google/nyan/reset.h>
#include <romstage_handoff.h>
#include <vendorcode/google/chromeos/chromeos.h>
#include "sdram_configs.h"
#include <soc/nvidia/tegra/i2c.h>
#include <soc/nvidia/tegra124/chip.h>
#include <soc/nvidia/tegra124/clk_rst.h>
+#include <soc/nvidia/tegra124/power.h>
#include <soc/nvidia/tegra124/sdram.h>
#include <soc/addressmap.h>
#include <soc/clock.h>
@@ -181,6 +183,15 @@ static void __attribute__((noinline)) romstage(void)
mmu_disable_range(0, 1);
dcache_mmu_enable();
+ /*
+ * A watchdog reset only resets part of the system so it ends up in
+ * a funny state. If that happens, we need to reset the whole machine.
+ */
+ if (power_reset_status() == POWER_RESET_WATCHDOG) {
+ printk(BIOS_INFO, "Watchdog reset detected, rebooting.\n");
+ cpu_reset();
+ }
+
/* For quality of the user experience, it's important to get
* the video going ASAP. Because there are long delays in some
* of the powerup steps, we do some very early setup here in