linux/include/linux/clocksource.h
<<
>>
Prefs
   1/*  linux/include/linux/clocksource.h
   2 *
   3 *  This file contains the structure definitions for clocksources.
   4 *
   5 *  If you are not a clocksource, or timekeeping code, you should
   6 *  not be including this file!
   7 */
   8#ifndef _LINUX_CLOCKSOURCE_H
   9#define _LINUX_CLOCKSOURCE_H
  10
  11#include <linux/types.h>
  12#include <linux/timex.h>
  13#include <linux/time.h>
  14#include <linux/list.h>
  15#include <linux/cache.h>
  16#include <linux/timer.h>
  17#include <linux/init.h>
  18#include <linux/of.h>
  19#include <asm/div64.h>
  20#include <asm/io.h>
  21
  22struct clocksource;
  23struct module;
  24
  25#ifdef CONFIG_ARCH_CLOCKSOURCE_DATA
  26#include <asm/clocksource.h>
  27#endif
  28
  29/**
  30 * struct clocksource - hardware abstraction for a free running counter
  31 *      Provides mostly state-free accessors to the underlying hardware.
  32 *      This is the structure used for system time.
  33 *
  34 * @name:               ptr to clocksource name
  35 * @list:               list head for registration
  36 * @rating:             rating value for selection (higher is better)
  37 *                      To avoid rating inflation the following
  38 *                      list should give you a guide as to how
  39 *                      to assign your clocksource a rating
  40 *                      1-99: Unfit for real use
  41 *                              Only available for bootup and testing purposes.
  42 *                      100-199: Base level usability.
  43 *                              Functional for real use, but not desired.
  44 *                      200-299: Good.
  45 *                              A correct and usable clocksource.
  46 *                      300-399: Desired.
  47 *                              A reasonably fast and accurate clocksource.
  48 *                      400-499: Perfect
  49 *                              The ideal clocksource. A must-use where
  50 *                              available.
  51 * @read:               returns a cycle value, passes clocksource as argument
  52 * @enable:             optional function to enable the clocksource
  53 * @disable:            optional function to disable the clocksource
  54 * @mask:               bitmask for two's complement
  55 *                      subtraction of non 64 bit counters
  56 * @mult:               cycle to nanosecond multiplier
  57 * @shift:              cycle to nanosecond divisor (power of two)
  58 * @max_idle_ns:        max idle time permitted by the clocksource (nsecs)
  59 * @maxadj:             maximum adjustment value to mult (~11%)
  60 * @max_cycles:         maximum safe cycle value which won't overflow on multiplication
  61 * @flags:              flags describing special properties
  62 * @archdata:           arch-specific data
  63 * @suspend:            suspend function for the clocksource, if necessary
  64 * @resume:             resume function for the clocksource, if necessary
  65 * @owner:              module reference, must be set by clocksource in modules
  66 *
  67 * Note: This struct is not used in hotpathes of the timekeeping code
  68 * because the timekeeper caches the hot path fields in its own data
  69 * structure, so no line cache alignment is required,
  70 *
  71 * The pointer to the clocksource itself is handed to the read
  72 * callback. If you need extra information there you can wrap struct
  73 * clocksource into your own struct. Depending on the amount of
  74 * information you need you should consider to cache line align that
  75 * structure.
  76 */
  77struct clocksource {
  78        cycle_t (*read)(struct clocksource *cs);
  79        cycle_t mask;
  80        u32 mult;
  81        u32 shift;
  82        u64 max_idle_ns;
  83        u32 maxadj;
  84#ifdef CONFIG_ARCH_CLOCKSOURCE_DATA
  85        struct arch_clocksource_data archdata;
  86#endif
  87        u64 max_cycles;
  88        const char *name;
  89        struct list_head list;
  90        int rating;
  91        int (*enable)(struct clocksource *cs);
  92        void (*disable)(struct clocksource *cs);
  93        unsigned long flags;
  94        void (*suspend)(struct clocksource *cs);
  95        void (*resume)(struct clocksource *cs);
  96
  97        /* private: */
  98#ifdef CONFIG_CLOCKSOURCE_WATCHDOG
  99        /* Watchdog related data, used by the framework */
 100        struct list_head wd_list;
 101        cycle_t cs_last;
 102        cycle_t wd_last;
 103#endif
 104        struct module *owner;
 105};
 106
 107/*
 108 * Clock source flags bits::
 109 */
 110#define CLOCK_SOURCE_IS_CONTINUOUS              0x01
 111#define CLOCK_SOURCE_MUST_VERIFY                0x02
 112
 113#define CLOCK_SOURCE_WATCHDOG                   0x10
 114#define CLOCK_SOURCE_VALID_FOR_HRES             0x20
 115#define CLOCK_SOURCE_UNSTABLE                   0x40
 116#define CLOCK_SOURCE_SUSPEND_NONSTOP            0x80
 117#define CLOCK_SOURCE_RESELECT                   0x100
 118
 119/* simplify initialization of mask field */
 120#define CLOCKSOURCE_MASK(bits) (cycle_t)((bits) < 64 ? ((1ULL<<(bits))-1) : -1)
 121
 122static inline u32 clocksource_freq2mult(u32 freq, u32 shift_constant, u64 from)
 123{
 124        /*  freq = cyc/from
 125         *  mult/2^shift  = ns/cyc
 126         *  mult = ns/cyc * 2^shift
 127         *  mult = from/freq * 2^shift
 128         *  mult = from * 2^shift / freq
 129         *  mult = (from<<shift) / freq
 130         */
 131        u64 tmp = ((u64)from) << shift_constant;
 132
 133        tmp += freq/2; /* round for do_div */
 134        do_div(tmp, freq);
 135
 136        return (u32)tmp;
 137}
 138
 139/**
 140 * clocksource_khz2mult - calculates mult from khz and shift
 141 * @khz:                Clocksource frequency in KHz
 142 * @shift_constant:     Clocksource shift factor
 143 *
 144 * Helper functions that converts a khz counter frequency to a timsource
 145 * multiplier, given the clocksource shift value
 146 */
 147static inline u32 clocksource_khz2mult(u32 khz, u32 shift_constant)
 148{
 149        return clocksource_freq2mult(khz, shift_constant, NSEC_PER_MSEC);
 150}
 151
 152/**
 153 * clocksource_hz2mult - calculates mult from hz and shift
 154 * @hz:                 Clocksource frequency in Hz
 155 * @shift_constant:     Clocksource shift factor
 156 *
 157 * Helper functions that converts a hz counter
 158 * frequency to a timsource multiplier, given the
 159 * clocksource shift value
 160 */
 161static inline u32 clocksource_hz2mult(u32 hz, u32 shift_constant)
 162{
 163        return clocksource_freq2mult(hz, shift_constant, NSEC_PER_SEC);
 164}
 165
 166/**
 167 * clocksource_cyc2ns - converts clocksource cycles to nanoseconds
 168 * @cycles:     cycles
 169 * @mult:       cycle to nanosecond multiplier
 170 * @shift:      cycle to nanosecond divisor (power of two)
 171 *
 172 * Converts cycles to nanoseconds, using the given mult and shift.
 173 *
 174 * XXX - This could use some mult_lxl_ll() asm optimization
 175 */
 176static inline s64 clocksource_cyc2ns(cycle_t cycles, u32 mult, u32 shift)
 177{
 178        return ((u64) cycles * mult) >> shift;
 179}
 180
 181
 182extern int clocksource_unregister(struct clocksource*);
 183extern void clocksource_touch_watchdog(void);
 184extern void clocksource_change_rating(struct clocksource *cs, int rating);
 185extern void clocksource_suspend(void);
 186extern void clocksource_resume(void);
 187extern struct clocksource * __init clocksource_default_clock(void);
 188extern void clocksource_mark_unstable(struct clocksource *cs);
 189
 190extern u64
 191clocks_calc_max_nsecs(u32 mult, u32 shift, u32 maxadj, u64 mask, u64 *max_cycles);
 192extern void
 193clocks_calc_mult_shift(u32 *mult, u32 *shift, u32 from, u32 to, u32 minsec);
 194
 195/*
 196 * Don't call __clocksource_register_scale directly, use
 197 * clocksource_register_hz/khz
 198 */
 199extern int
 200__clocksource_register_scale(struct clocksource *cs, u32 scale, u32 freq);
 201extern void
 202__clocksource_update_freq_scale(struct clocksource *cs, u32 scale, u32 freq);
 203
 204/*
 205 * Don't call this unless you are a default clocksource
 206 * (AKA: jiffies) and absolutely have to.
 207 */
 208static inline int __clocksource_register(struct clocksource *cs)
 209{
 210        return __clocksource_register_scale(cs, 1, 0);
 211}
 212
 213static inline int clocksource_register_hz(struct clocksource *cs, u32 hz)
 214{
 215        return __clocksource_register_scale(cs, 1, hz);
 216}
 217
 218static inline int clocksource_register_khz(struct clocksource *cs, u32 khz)
 219{
 220        return __clocksource_register_scale(cs, 1000, khz);
 221}
 222
 223static inline void __clocksource_update_freq_hz(struct clocksource *cs, u32 hz)
 224{
 225        __clocksource_update_freq_scale(cs, 1, hz);
 226}
 227
 228static inline void __clocksource_update_freq_khz(struct clocksource *cs, u32 khz)
 229{
 230        __clocksource_update_freq_scale(cs, 1000, khz);
 231}
 232
 233
 234extern int timekeeping_notify(struct clocksource *clock);
 235
 236extern cycle_t clocksource_mmio_readl_up(struct clocksource *);
 237extern cycle_t clocksource_mmio_readl_down(struct clocksource *);
 238extern cycle_t clocksource_mmio_readw_up(struct clocksource *);
 239extern cycle_t clocksource_mmio_readw_down(struct clocksource *);
 240
 241extern int clocksource_mmio_init(void __iomem *, const char *,
 242        unsigned long, int, unsigned, cycle_t (*)(struct clocksource *));
 243
 244extern int clocksource_i8253_init(void);
 245
 246#define CLOCKSOURCE_OF_DECLARE(name, compat, fn) \
 247        OF_DECLARE_1_RET(clksrc, name, compat, fn)
 248
 249#ifdef CONFIG_CLKSRC_PROBE
 250extern void clocksource_probe(void);
 251#else
 252static inline void clocksource_probe(void) {}
 253#endif
 254
 255#define CLOCKSOURCE_ACPI_DECLARE(name, table_id, fn)            \
 256        ACPI_DECLARE_PROBE_ENTRY(clksrc, name, table_id, 0, NULL, 0, fn)
 257
 258#endif /* _LINUX_CLOCKSOURCE_H */
 259