diff options
author | Shawn Nematbakhsh <shawnn@chromium.org> | 2015-11-18 14:36:00 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2015-11-19 14:41:40 -0800 |
commit | 1aa75c17c74fc497daaf5ce751479ebc31de4c34 (patch) | |
tree | e2dc166101da3b91131088689e7e0d0927a43ae0 /power | |
parent | 2c8817117a8c736ab2ed52496af00824d9a12332 (diff) | |
download | chrome-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.c | 34 |
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. */ |