Nadim Taha 00c1a0993f Timer initialization & conversion bug fixes
This fixes two race conditions that lead to a watchdog timeout:

1) ticks_to_usecs()

common/timer.c:process_timers() wraps its body in a
"while (next.val <= get_time().val)" loop meant to ensure that
it never returns after having scheduled an expired timer
(to address potential __hw_clock_event_set() overflows/underflows).
However get_time() through __hw_clock_source_read() calls ticks_to_usecs()
which "expands" the hw_rollover_count by a truncated clock_div_factor which
causes that loop condition to observe a "current time" that is up to ~15us
in the past (assuming a 24MHz clock). This race arises frequently with
workloads that repeatedly sleep for a short duration.

2) __hw_clock_event_irq()

The HW timer rollover interrupt was configured to be higher priority than
the event timer interrupt (i.e. it can preempt it) which is problematic if:
- There is a scheduled deadline soon after a "clksrc_high / .le.hi" boundary
- An earlier (before the clksrc_high rollover) event timer interrupt kicks in
- After the event timer interrupt handler gets to "now = get_time()"
  in common/timer.c:process_timers() the rollover interrupt triggers
  incrementing clksrc_high (i.e. the overflow case)
- The rollover interrupt handler arms the event timer to trigger at
  that deadline (mentioned in the first bullet) and returns
- The original event timer interrupt handler resumes execution but finds
  no events to schedule since the "timer_deadline[tskid].le.hi == now.le.hi"
  clause won't evaluate to true. It will then call __hw_clock_event_clear()
  before returning causing a watchdog timeout

This commit also contains a fix to properly initialize the HW timer
after a sysjump.

BRANCH=none
BUG=none
TEST=Reproduced both races and successfully tested the fix. The workload I was
     using to reproduce (typically within an hour) has been running smoothly
     for the past 24 hours.

Change-Id: Ic0b0958e66e701b52481fcfe506745ca1c892dd1
Signed-off-by: Nadim Taha <ntaha@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/347465
Reviewed-by: Bill Richardson <wfrichar@chromium.org>
2016-05-28 01:45:31 +00:00
2015-05-07 00:00:47 +00:00
2016-05-20 17:08:34 -07:00
2012-05-11 09:11:52 -07:00
2014-04-02 19:58:53 +00:00
2015-12-08 20:05:05 -08:00

For an overview of the Embedded Controller firmware, refer to

http://www.chromium.org/chromium-os/2014-firmware-summit

For instructions on building from source, refer to

http://www.chromium.org/chromium-os/ec-development/getting-started-building-ec-images-quickly
Description
No description provided
Readme 1.4 GiB
Languages
C 64.7%
Lasso 20.7%
ASL 3.6%
JavaScript 3.2%
C# 2.9%
Other 4.6%