• Nils Carlson's avatar
    hpet: hpet driver periodic timer setup bug fixes · ae21cf92
    Nils Carlson authored
    The periodic interrupt from drivers/char/hpet.c does not work correctly,
    both when using the periodic capability of the hardware and while
    emulating the periodic interrupt (when hardware does not support periodic
    mode).
    
    With timers capable of periodic interrupts, the comparator field is first
    set with the period value followed by set of hidden accumulator, which has
    the side effect of overwriting the comparator value.  This results in
    wrong periodicity for the interrupts.  For, periodic interrupts to work,
    following steps are necessary, in that order.
    
    * Set config with Tn_VAL_SET_CNF bit
    
    * Write to hidden accumulator, the value written is the time when the
      first interrupt should be generated
    
    * Write compartor with period interval for subsequent interrupts
      (http://www.intel.com/hardwaredesign/hpetspec_1.pdf )
    
    When emulating periodic timer with timers not capable of periodic
    interrupt, driver is adding the period to counter value instead of
    comparator value, which causes slow drift when using this emulation.
    
    Also, driver seems to add hpetp->hp_delta both while setting up periodic
    interrupt and while emulating periodic interrupts with timers not capable
    of doing periodic interrupts.  This hp_delta will result in slower than
    expected interrupt rate and should not be used while setting the interval.
    Signed-off-by: default avatarVenkatesh Pallipadi <venkatesh.pallipadi@intel.com>
    Signed-off-by: default avatarNils Carlson <nils.carlson@ericsson.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    ae21cf92
hpet.c 22.5 KB