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 * @mark_unstable:      Optional function to inform the clocksource driver that
  66 *                      the watchdog marked the clocksource unstable
  67 * @owner:              module reference, must be set by clocksource in modules
  68 *
  69 * Note: This struct is not used in hotpathes of the timekeeping code
  70 * because the timekeeper caches the hot path fields in its own data
  71 * structure, so no line cache alignment is required,
  72 *
  73 * The pointer to the clocksource itself is handed to the read
  74 * callback. If you need extra information there you can wrap struct
  75 * clocksource into your own struct. Depending on the amount of
  76 * information you need you should consider to cache line align that
  77 * structure.
  78 */
  79struct clocksource {
  80        u64 (*read)(struct clocksource *cs);
  81        u64 mask;
  82        u32 mult;
  83        u32 shift;
  84        u64 max_idle_ns;
  85        u32 maxadj;
  86#ifdef CONFIG_ARCH_CLOCKSOURCE_DATA
  87        struct arch_clocksource_data archdata;
  88#endif
  89        u64 max_cycles;
  90        const char *name;
  91        struct list_head list;
  92        int rating;
  93        int (*enable)(struct clocksource *cs);
  94        void (*disable)(struct clocksource *cs);
  95        unsigned long flags;
  96        void (*suspend)(struct clocksource *cs);
  97        void (*resume)(struct clocksource *cs);
  98        void (*mark_unstable)(struct clocksource *cs);
  99        void (*tick_stable)(struct clocksource *cs);
 100
 101        /* private: */
 102#ifdef CONFIG_CLOCKSOURCE_WATCHDOG
 103        /* Watchdog related data, used by the framework */
 104        struct list_head wd_list;
 105        u64 cs_last;
 106        u64 wd_last;
 107#endif
 108        struct module *owner;
 109};
 110
 111/*
 112 * Clock source flags bits::
 113 */
 114#define CLOCK_SOURCE_IS_CONTINUOUS              0x01
 115#define CLOCK_SOURCE_MUST_VERIFY                0x02
 116
 117#define CLOCK_SOURCE_WATCHDOG                   0x10
 118#define CLOCK_SOURCE_VALID_FOR_HRES             0x20
 119#define CLOCK_SOURCE_UNSTABLE                   0x40
 120#define CLOCK_SOURCE_SUSPEND_NONSTOP            0x80
 121#define CLOCK_SOURCE_RESELECT                   0x100
 122
 123/* simplify initialization of mask field */
 124#define CLOCKSOURCE_MASK(bits) GENMASK_ULL((bits) - 1, 0)
 125
 126static inline u32 clocksource_freq2mult(u32 freq, u32 shift_constant, u64 from)
 127{
 128        /*  freq = cyc/from
 129         *  mult/2^shift  = ns/cyc
 130         *  mult = ns/cyc * 2^shift
 131         *  mult = from/freq * 2^shift
 132         *  mult = from * 2^shift / freq
 133         *  mult = (from<<shift) / freq
 134         */
 135        u64 tmp = ((u64)from) << shift_constant;
 136
 137        tmp += freq/2; /* round for do_div */
 138        do_div(tmp, freq);
 139
 140        return (u32)tmp;
 141}
 142
 143/**
 144 * clocksource_khz2mult - calculates mult from khz and shift
 145 * @khz:                Clocksource frequency in KHz
 146 * @shift_constant:     Clocksource shift factor
 147 *
 148 * Helper functions that converts a khz counter frequency to a timsource
 149 * multiplier, given the clocksource shift value
 150 */
 151static inline u32 clocksource_khz2mult(u32 khz, u32 shift_constant)
 152{
 153        return clocksource_freq2mult(khz, shift_constant, NSEC_PER_MSEC);
 154}
 155
 156/**
 157 * clocksource_hz2mult - calculates mult from hz and shift
 158 * @hz:                 Clocksource frequency in Hz
 159 * @shift_constant:     Clocksource shift factor
 160 *
 161 * Helper functions that converts a hz counter
 162 * frequency to a timsource multiplier, given the
 163 * clocksource shift value
 164 */
 165static inline u32 clocksource_hz2mult(u32 hz, u32 shift_constant)
 166{
 167        return clocksource_freq2mult(hz, shift_constant, NSEC_PER_SEC);
 168}
 169
 170/**
 171 * clocksource_cyc2ns - converts clocksource cycles to nanoseconds
 172 * @cycles:     cycles
 173 * @mult:       cycle to nanosecond multiplier
 174 * @shift:      cycle to nanosecond divisor (power of two)
 175 *
 176 * Converts clocksource cycles to nanoseconds, using the given @mult and @shift.
 177 * The code is optimized for performance and is not intended to work
 178 * with absolute clocksource cycles (as those will easily overflow),
 179 * but is only intended to be used with relative (delta) clocksource cycles.
 180 *
 181 * XXX - This could use some mult_lxl_ll() asm optimization
 182 */
 183static inline s64 clocksource_cyc2ns(u64 cycles, u32 mult, u32 shift)
 184{
 185        return ((u64) cycles * mult) >> shift;
 186}
 187
 188
 189extern int clocksource_unregister(struct clocksource*);
 190extern void clocksource_touch_watchdog(void);
 191extern void clocksource_change_rating(struct clocksource *cs, int rating);
 192extern void clocksource_suspend(void);
 193extern void clocksource_resume(void);
 194extern struct clocksource * __init clocksource_default_clock(void);
 195extern void clocksource_mark_unstable(struct clocksource *cs);
 196
 197extern u64
 198clocks_calc_max_nsecs(u32 mult, u32 shift, u32 maxadj, u64 mask, u64 *max_cycles);
 199extern void
 200clocks_calc_mult_shift(u32 *mult, u32 *shift, u32 from, u32 to, u32 minsec);
 201
 202/*
 203 * Don't call __clocksource_register_scale directly, use
 204 * clocksource_register_hz/khz
 205 */
 206extern int
 207__clocksource_register_scale(struct clocksource *cs, u32 scale, u32 freq);
 208extern void
 209__clocksource_update_freq_scale(struct clocksource *cs, u32 scale, u32 freq);
 210
 211/*
 212 * Don't call this unless you are a default clocksource
 213 * (AKA: jiffies) and absolutely have to.
 214 */
 215static inline int __clocksource_register(struct clocksource *cs)
 216{
 217        return __clocksource_register_scale(cs, 1, 0);
 218}
 219
 220static inline int clocksource_register_hz(struct clocksource *cs, u32 hz)
 221{
 222        return __clocksource_register_scale(cs, 1, hz);
 223}
 224
 225static inline int clocksource_register_khz(struct clocksource *cs, u32 khz)
 226{
 227        return __clocksource_register_scale(cs, 1000, khz);
 228}
 229
 230static inline void __clocksource_update_freq_hz(struct clocksource *cs, u32 hz)
 231{
 232        __clocksource_update_freq_scale(cs, 1, hz);
 233}
 234
 235static inline void __clocksource_update_freq_khz(struct clocksource *cs, u32 khz)
 236{
 237        __clocksource_update_freq_scale(cs, 1000, khz);
 238}
 239
 240
 241extern int timekeeping_notify(struct clocksource *clock);
 242
 243extern u64 clocksource_mmio_readl_up(struct clocksource *);
 244extern u64 clocksource_mmio_readl_down(struct clocksource *);
 245extern u64 clocksource_mmio_readw_up(struct clocksource *);
 246extern u64 clocksource_mmio_readw_down(struct clocksource *);
 247
 248extern int clocksource_mmio_init(void __iomem *, const char *,
 249        unsigned long, int, unsigned, u64 (*)(struct clocksource *));
 250
 251extern int clocksource_i8253_init(void);
 252
 253#define TIMER_OF_DECLARE(name, compat, fn) \
 254        OF_DECLARE_1_RET(timer, name, compat, fn)
 255
 256#define CLOCKSOURCE_OF_DECLARE(name, compat, fn) \
 257        TIMER_OF_DECLARE(name, compat, fn)
 258
 259#ifdef CONFIG_TIMER_PROBE
 260extern void timer_probe(void);
 261#else
 262static inline void timer_probe(void) {}
 263#endif
 264
 265#define TIMER_ACPI_DECLARE(name, table_id, fn)          \
 266        ACPI_DECLARE_PROBE_ENTRY(timer, name, table_id, 0, NULL, 0, fn)
 267
 268#endif /* _LINUX_CLOCKSOURCE_H */
 269