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
 100        /* private: */
 101#ifdef CONFIG_CLOCKSOURCE_WATCHDOG
 102        /* Watchdog related data, used by the framework */
 103        struct list_head wd_list;
 104        u64 cs_last;
 105        u64 wd_last;
 106#endif
 107        struct module *owner;
 108};
 109
 110/*
 111 * Clock source flags bits::
 112 */
 113#define CLOCK_SOURCE_IS_CONTINUOUS              0x01
 114#define CLOCK_SOURCE_MUST_VERIFY                0x02
 115
 116#define CLOCK_SOURCE_WATCHDOG                   0x10
 117#define CLOCK_SOURCE_VALID_FOR_HRES             0x20
 118#define CLOCK_SOURCE_UNSTABLE                   0x40
 119#define CLOCK_SOURCE_SUSPEND_NONSTOP            0x80
 120#define CLOCK_SOURCE_RESELECT                   0x100
 121
 122/* simplify initialization of mask field */
 123#define CLOCKSOURCE_MASK(bits) GENMASK_ULL((bits) - 1, 0)
 124
 125static inline u32 clocksource_freq2mult(u32 freq, u32 shift_constant, u64 from)
 126{
 127        /*  freq = cyc/from
 128         *  mult/2^shift  = ns/cyc
 129         *  mult = ns/cyc * 2^shift
 130         *  mult = from/freq * 2^shift
 131         *  mult = from * 2^shift / freq
 132         *  mult = (from<<shift) / freq
 133         */
 134        u64 tmp = ((u64)from) << shift_constant;
 135
 136        tmp += freq/2; /* round for do_div */
 137        do_div(tmp, freq);
 138
 139        return (u32)tmp;
 140}
 141
 142/**
 143 * clocksource_khz2mult - calculates mult from khz and shift
 144 * @khz:                Clocksource frequency in KHz
 145 * @shift_constant:     Clocksource shift factor
 146 *
 147 * Helper functions that converts a khz counter frequency to a timsource
 148 * multiplier, given the clocksource shift value
 149 */
 150static inline u32 clocksource_khz2mult(u32 khz, u32 shift_constant)
 151{
 152        return clocksource_freq2mult(khz, shift_constant, NSEC_PER_MSEC);
 153}
 154
 155/**
 156 * clocksource_hz2mult - calculates mult from hz and shift
 157 * @hz:                 Clocksource frequency in Hz
 158 * @shift_constant:     Clocksource shift factor
 159 *
 160 * Helper functions that converts a hz counter
 161 * frequency to a timsource multiplier, given the
 162 * clocksource shift value
 163 */
 164static inline u32 clocksource_hz2mult(u32 hz, u32 shift_constant)
 165{
 166        return clocksource_freq2mult(hz, shift_constant, NSEC_PER_SEC);
 167}
 168
 169/**
 170 * clocksource_cyc2ns - converts clocksource cycles to nanoseconds
 171 * @cycles:     cycles
 172 * @mult:       cycle to nanosecond multiplier
 173 * @shift:      cycle to nanosecond divisor (power of two)
 174 *
 175 * Converts clocksource cycles to nanoseconds, using the given @mult and @shift.
 176 * The code is optimized for performance and is not intended to work
 177 * with absolute clocksource cycles (as those will easily overflow),
 178 * but is only intended to be used with relative (delta) clocksource cycles.
 179 *
 180 * XXX - This could use some mult_lxl_ll() asm optimization
 181 */
 182static inline s64 clocksource_cyc2ns(u64 cycles, u32 mult, u32 shift)
 183{
 184        return ((u64) cycles * mult) >> shift;
 185}
 186
 187
 188extern int clocksource_unregister(struct clocksource*);
 189extern void clocksource_touch_watchdog(void);
 190extern void clocksource_change_rating(struct clocksource *cs, int rating);
 191extern void clocksource_suspend(void);
 192extern void clocksource_resume(void);
 193extern struct clocksource * __init clocksource_default_clock(void);
 194extern void clocksource_mark_unstable(struct clocksource *cs);
 195
 196extern u64
 197clocks_calc_max_nsecs(u32 mult, u32 shift, u32 maxadj, u64 mask, u64 *max_cycles);
 198extern void
 199clocks_calc_mult_shift(u32 *mult, u32 *shift, u32 from, u32 to, u32 minsec);
 200
 201/*
 202 * Don't call __clocksource_register_scale directly, use
 203 * clocksource_register_hz/khz
 204 */
 205extern int
 206__clocksource_register_scale(struct clocksource *cs, u32 scale, u32 freq);
 207extern void
 208__clocksource_update_freq_scale(struct clocksource *cs, u32 scale, u32 freq);
 209
 210/*
 211 * Don't call this unless you are a default clocksource
 212 * (AKA: jiffies) and absolutely have to.
 213 */
 214static inline int __clocksource_register(struct clocksource *cs)
 215{
 216        return __clocksource_register_scale(cs, 1, 0);
 217}
 218
 219static inline int clocksource_register_hz(struct clocksource *cs, u32 hz)
 220{
 221        return __clocksource_register_scale(cs, 1, hz);
 222}
 223
 224static inline int clocksource_register_khz(struct clocksource *cs, u32 khz)
 225{
 226        return __clocksource_register_scale(cs, 1000, khz);
 227}
 228
 229static inline void __clocksource_update_freq_hz(struct clocksource *cs, u32 hz)
 230{
 231        __clocksource_update_freq_scale(cs, 1, hz);
 232}
 233
 234static inline void __clocksource_update_freq_khz(struct clocksource *cs, u32 khz)
 235{
 236        __clocksource_update_freq_scale(cs, 1000, khz);
 237}
 238
 239
 240extern int timekeeping_notify(struct clocksource *clock);
 241
 242extern u64 clocksource_mmio_readl_up(struct clocksource *);
 243extern u64 clocksource_mmio_readl_down(struct clocksource *);
 244extern u64 clocksource_mmio_readw_up(struct clocksource *);
 245extern u64 clocksource_mmio_readw_down(struct clocksource *);
 246
 247extern int clocksource_mmio_init(void __iomem *, const char *,
 248        unsigned long, int, unsigned, u64 (*)(struct clocksource *));
 249
 250extern int clocksource_i8253_init(void);
 251
 252#define CLOCKSOURCE_OF_DECLARE(name, compat, fn) \
 253        OF_DECLARE_1_RET(clksrc, name, compat, fn)
 254
 255#ifdef CONFIG_CLKSRC_PROBE
 256extern void clocksource_probe(void);
 257#else
 258static inline void clocksource_probe(void) {}
 259#endif
 260
 261#define CLOCKSOURCE_ACPI_DECLARE(name, table_id, fn)            \
 262        ACPI_DECLARE_PROBE_ENTRY(clksrc, name, table_id, 0, NULL, 0, fn)
 263
 264#endif /* _LINUX_CLOCKSOURCE_H */
 265