summaryrefslogtreecommitdiff
path: root/power
diff options
context:
space:
mode:
authorShawn Nematbakhsh <shawnn@chromium.org>2015-11-18 14:36:00 -0800
committerchrome-bot <chrome-bot@chromium.org>2015-11-19 14:41:40 -0800
commit1aa75c17c74fc497daaf5ce751479ebc31de4c34 (patch)
treee2dc166101da3b91131088689e7e0d0927a43ae0 /power
parent2c8817117a8c736ab2ed52496af00824d9a12332 (diff)
downloadchrome-ec-1aa75c17c74fc497daaf5ce751479ebc31de4c34.tar.gz
power: Add power signal interrupt storm detection
Power signal interrupt storms are difficult to detect without extensive debugging, so add a config option to help detect them in SW. BUG=chromium:557988 BRANCH=None TEST=None Change-Id: I590ac8883e7615d05fd326245abade212b79e297 Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/313170 Commit-Ready: Shawn N <shawnn@chromium.org> Tested-by: Shawn N <shawnn@chromium.org> Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Diffstat (limited to 'power')
-rw-r--r--power/common.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/power/common.c b/power/common.c
index 204ef2221e..c75865ea53 100644
--- a/power/common.c
+++ b/power/common.c
@@ -456,8 +456,42 @@ static void siglog_add(enum gpio_signal signal)
#define SIGLOG(S)
#endif /* CONFIG_BRINGUP */
+#ifdef CONFIG_POWER_SIGNAL_INTERRUPT_STORM_DETECT_THRESHOLD
+/*
+ * Print an interrupt storm warning when we receive more than
+ * CONFIG_POWER_SIGNAL_INTERRUPT_STORM_DETECT_THRESHOLD interrupts of a
+ * single source within 1 second.
+ */
+static int power_signal_interrupt_count[POWER_SIGNAL_COUNT];
+
+static void reset_power_signal_interrupt_count(void)
+{
+ int i;
+
+ for (i = 0; i < POWER_SIGNAL_COUNT; ++i)
+ power_signal_interrupt_count[i] = 0;
+}
+DECLARE_HOOK(HOOK_SECOND,
+ reset_power_signal_interrupt_count,
+ HOOK_PRIO_DEFAULT);
+#endif
+
void power_signal_interrupt(enum gpio_signal signal)
{
+#ifdef CONFIG_POWER_SIGNAL_INTERRUPT_STORM_DETECT_THRESHOLD
+ int i;
+
+ /* Tally our interrupts and print a warning if necessary. */
+ for (i = 0; i < POWER_SIGNAL_COUNT; ++i) {
+ if (power_signal_list[i].gpio == signal) {
+ if (power_signal_interrupt_count[i]++ ==
+ CONFIG_POWER_SIGNAL_INTERRUPT_STORM_DETECT_THRESHOLD)
+ CPRINTS("Interrupt storm! Signal %d\n", i);
+ break;
+ }
+ }
+#endif
+
SIGLOG(signal);
/* Shadow signals and compare with our desired signal state. */