Skip to content
  • Shinya Kuribayashi's avatar
    [MIPS] lib_mips/time.c: Fix CP0 count register usage and timer routines · a55d4817
    Shinya Kuribayashi authored
    
    
    MIPS port has two problems in timer routines. One is now we assume CFG_HZ
    equals to CP0 counter frequency, but this is wrong. CFG_HZ has to be 1000
    in the U-Boot system.
    
    The other is we don't have a proper time management counter like timestamp
    other ARCHs have. We need the 32-bit millisecond clock counter.
    
    This patch introduces timestamp and CYCLES_PER_JIFFY. timestamp is a
    32-bit non-overflowing CFG_HZ counter, and CYCLES_PER_JIFFY is the number
    of calculated CP0 counter cycles in a CFG_HZ.
    
    STRATEGY:
    
    * Fix improper CFG_HZ value to have 1000
    
    * Use CFG_MIPS_TIMER_FREQ for timer counter frequency, instead.
    
    * timer_init: initialize timestamp and set up the first timer expiration.
      Note that we don't need to initialize CP0 count/compare registers here
      as they have been already zeroed out on the system reset. Leave them as
      they are.
    
    * get_timer: calculate how many timestamps have been passed, then return
      base-relative timestamp. Make sure we can easily count missed timestamps
      regardless of CP0 count/compare value.
    
    * get_ticks: return the current timestamp, that is get_timer(0).
    
    Most parts are from good old Linux v2.6.16 kernel.
    
    v2:
    - Remove FIXME comments as they turned out to be trivial.
    - Use CP0 compare register as a global variable for expirelo.
    - Kill a global variable 'cycles_per_jiffy'. Use #define CYCLES_PER_JIFFY
      instead.
    
    Signed-off-by: default avatarShinya Kuribayashi <skuribay@ruby.dti.ne.jp>
    a55d4817