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 <asm/div64.h> 19 #include <asm/io.h> 20 21 /* clocksource cycle base type */ 22 typedef u64 cycle_t; 23 struct clocksource; 24 struct module; 25 26 #ifdef CONFIG_ARCH_CLOCKSOURCE_DATA 27 #include <asm/clocksource.h> 28 #endif 29 30 /** 31 * struct cyclecounter - hardware abstraction for a free running counter 32 * Provides completely state-free accessors to the underlying hardware. 33 * Depending on which hardware it reads, the cycle counter may wrap 34 * around quickly. Locking rules (if necessary) have to be defined 35 * by the implementor and user of specific instances of this API. 36 * 37 * @read: returns the current cycle value 38 * @mask: bitmask for two's complement 39 * subtraction of non 64 bit counters, 40 * see CLOCKSOURCE_MASK() helper macro 41 * @mult: cycle to nanosecond multiplier 42 * @shift: cycle to nanosecond divisor (power of two) 43 */ 44 struct cyclecounter { 45 cycle_t (*read)(const struct cyclecounter *cc); 46 cycle_t mask; 47 u32 mult; 48 u32 shift; 49 }; 50 51 /** 52 * struct timecounter - layer above a %struct cyclecounter which counts nanoseconds 53 * Contains the state needed by timecounter_read() to detect 54 * cycle counter wrap around. Initialize with 55 * timecounter_init(). Also used to convert cycle counts into the 56 * corresponding nanosecond counts with timecounter_cyc2time(). Users 57 * of this code are responsible for initializing the underlying 58 * cycle counter hardware, locking issues and reading the time 59 * more often than the cycle counter wraps around. The nanosecond 60 * counter will only wrap around after ~585 years. 61 * 62 * @cc: the cycle counter used by this instance 63 * @cycle_last: most recent cycle counter value seen by 64 * timecounter_read() 65 * @nsec: continuously increasing count 66 */ 67 struct timecounter { 68 const struct cyclecounter *cc; 69 cycle_t cycle_last; 70 u64 nsec; 71 }; 72 73 /** 74 * cyclecounter_cyc2ns - converts cycle counter cycles to nanoseconds 75 * @cc: Pointer to cycle counter. 76 * @cycles: Cycles 77 * 78 * XXX - This could use some mult_lxl_ll() asm optimization. Same code 79 * as in cyc2ns, but with unsigned result. 80 */ 81 static inline u64 cyclecounter_cyc2ns(const struct cyclecounter *cc, 82 cycle_t cycles) 83 { 84 u64 ret = (u64)cycles; 85 ret = (ret * cc->mult) >> cc->shift; 86 return ret; 87 } 88 89 /** 90 * timecounter_init - initialize a time counter 91 * @tc: Pointer to time counter which is to be initialized/reset 92 * @cc: A cycle counter, ready to be used. 93 * @start_tstamp: Arbitrary initial time stamp. 94 * 95 * After this call the current cycle register (roughly) corresponds to 96 * the initial time stamp. Every call to timecounter_read() increments 97 * the time stamp counter by the number of elapsed nanoseconds. 98 */ 99 extern void timecounter_init(struct timecounter *tc, 100 const struct cyclecounter *cc, 101 u64 start_tstamp); 102 103 /** 104 * timecounter_read - return nanoseconds elapsed since timecounter_init() 105 * plus the initial time stamp 106 * @tc: Pointer to time counter. 107 * 108 * In other words, keeps track of time since the same epoch as 109 * the function which generated the initial time stamp. 110 */ 111 extern u64 timecounter_read(struct timecounter *tc); 112 113 /** 114 * timecounter_cyc2time - convert a cycle counter to same 115 * time base as values returned by 116 * timecounter_read() 117 * @tc: Pointer to time counter. 118 * @cycle_tstamp: a value returned by tc->cc->read() 119 * 120 * Cycle counts that are converted correctly as long as they 121 * fall into the interval [-1/2 max cycle count, +1/2 max cycle count], 122 * with "max cycle count" == cs->mask+1. 123 * 124 * This allows conversion of cycle counter values which were generated 125 * in the past. 126 */ 127 extern u64 timecounter_cyc2time(struct timecounter *tc, 128 cycle_t cycle_tstamp); 129 130 /** 131 * struct clocksource - hardware abstraction for a free running counter 132 * Provides mostly state-free accessors to the underlying hardware. 133 * This is the structure used for system time. 134 * 135 * @name: ptr to clocksource name 136 * @list: list head for registration 137 * @rating: rating value for selection (higher is better) 138 * To avoid rating inflation the following 139 * list should give you a guide as to how 140 * to assign your clocksource a rating 141 * 1-99: Unfit for real use 142 * Only available for bootup and testing purposes. 143 * 100-199: Base level usability. 144 * Functional for real use, but not desired. 145 * 200-299: Good. 146 * A correct and usable clocksource. 147 * 300-399: Desired. 148 * A reasonably fast and accurate clocksource. 149 * 400-499: Perfect 150 * The ideal clocksource. A must-use where 151 * available. 152 * @read: returns a cycle value, passes clocksource as argument 153 * @enable: optional function to enable the clocksource 154 * @disable: optional function to disable the clocksource 155 * @mask: bitmask for two's complement 156 * subtraction of non 64 bit counters 157 * @mult: cycle to nanosecond multiplier 158 * @shift: cycle to nanosecond divisor (power of two) 159 * @max_idle_ns: max idle time permitted by the clocksource (nsecs) 160 * @maxadj: maximum adjustment value to mult (~11%) 161 * @flags: flags describing special properties 162 * @archdata: arch-specific data 163 * @suspend: suspend function for the clocksource, if necessary 164 * @resume: resume function for the clocksource, if necessary 165 * @owner: module reference, must be set by clocksource in modules 166 */ 167 struct clocksource { 168 /* 169 * Hotpath data, fits in a single cache line when the 170 * clocksource itself is cacheline aligned. 171 */ 172 cycle_t (*read)(struct clocksource *cs); 173 cycle_t mask; 174 u32 mult; 175 u32 shift; 176 u64 max_idle_ns; 177 u32 maxadj; 178 #ifdef CONFIG_ARCH_CLOCKSOURCE_DATA 179 struct arch_clocksource_data archdata; 180 #endif 181 182 const char *name; 183 struct list_head list; 184 int rating; 185 int (*enable)(struct clocksource *cs); 186 void (*disable)(struct clocksource *cs); 187 unsigned long flags; 188 void (*suspend)(struct clocksource *cs); 189 void (*resume)(struct clocksource *cs); 190 191 /* private: */ 192 #ifdef CONFIG_CLOCKSOURCE_WATCHDOG 193 /* Watchdog related data, used by the framework */ 194 struct list_head wd_list; 195 cycle_t cs_last; 196 cycle_t wd_last; 197 #endif 198 struct module *owner; 199 } ____cacheline_aligned; 200 201 /* 202 * Clock source flags bits:: 203 */ 204 #define CLOCK_SOURCE_IS_CONTINUOUS 0x01 205 #define CLOCK_SOURCE_MUST_VERIFY 0x02 206 207 #define CLOCK_SOURCE_WATCHDOG 0x10 208 #define CLOCK_SOURCE_VALID_FOR_HRES 0x20 209 #define CLOCK_SOURCE_UNSTABLE 0x40 210 #define CLOCK_SOURCE_SUSPEND_NONSTOP 0x80 211 #define CLOCK_SOURCE_RESELECT 0x100 212 213 /* simplify initialization of mask field */ 214 #define CLOCKSOURCE_MASK(bits) (cycle_t)((bits) < 64 ? ((1ULL<<(bits))-1) : -1) 215 216 /** 217 * clocksource_khz2mult - calculates mult from khz and shift 218 * @khz: Clocksource frequency in KHz 219 * @shift_constant: Clocksource shift factor 220 * 221 * Helper functions that converts a khz counter frequency to a timsource 222 * multiplier, given the clocksource shift value 223 */ 224 static inline u32 clocksource_khz2mult(u32 khz, u32 shift_constant) 225 { 226 /* khz = cyc/(Million ns) 227 * mult/2^shift = ns/cyc 228 * mult = ns/cyc * 2^shift 229 * mult = 1Million/khz * 2^shift 230 * mult = 1000000 * 2^shift / khz 231 * mult = (1000000<<shift) / khz 232 */ 233 u64 tmp = ((u64)1000000) << shift_constant; 234 235 tmp += khz/2; /* round for do_div */ 236 do_div(tmp, khz); 237 238 return (u32)tmp; 239 } 240 241 /** 242 * clocksource_hz2mult - calculates mult from hz and shift 243 * @hz: Clocksource frequency in Hz 244 * @shift_constant: Clocksource shift factor 245 * 246 * Helper functions that converts a hz counter 247 * frequency to a timsource multiplier, given the 248 * clocksource shift value 249 */ 250 static inline u32 clocksource_hz2mult(u32 hz, u32 shift_constant) 251 { 252 /* hz = cyc/(Billion ns) 253 * mult/2^shift = ns/cyc 254 * mult = ns/cyc * 2^shift 255 * mult = 1Billion/hz * 2^shift 256 * mult = 1000000000 * 2^shift / hz 257 * mult = (1000000000<<shift) / hz 258 */ 259 u64 tmp = ((u64)1000000000) << shift_constant; 260 261 tmp += hz/2; /* round for do_div */ 262 do_div(tmp, hz); 263 264 return (u32)tmp; 265 } 266 267 /** 268 * clocksource_cyc2ns - converts clocksource cycles to nanoseconds 269 * @cycles: cycles 270 * @mult: cycle to nanosecond multiplier 271 * @shift: cycle to nanosecond divisor (power of two) 272 * 273 * Converts cycles to nanoseconds, using the given mult and shift. 274 * 275 * XXX - This could use some mult_lxl_ll() asm optimization 276 */ 277 static inline s64 clocksource_cyc2ns(cycle_t cycles, u32 mult, u32 shift) 278 { 279 return ((u64) cycles * mult) >> shift; 280 } 281 282 283 extern int clocksource_register(struct clocksource*); 284 extern int clocksource_unregister(struct clocksource*); 285 extern void clocksource_touch_watchdog(void); 286 extern struct clocksource* clocksource_get_next(void); 287 extern void clocksource_change_rating(struct clocksource *cs, int rating); 288 extern void clocksource_suspend(void); 289 extern void clocksource_resume(void); 290 extern struct clocksource * __init clocksource_default_clock(void); 291 extern void clocksource_mark_unstable(struct clocksource *cs); 292 293 extern u64 294 clocks_calc_max_nsecs(u32 mult, u32 shift, u32 maxadj, u64 mask); 295 extern void 296 clocks_calc_mult_shift(u32 *mult, u32 *shift, u32 from, u32 to, u32 minsec); 297 298 /* 299 * Don't call __clocksource_register_scale directly, use 300 * clocksource_register_hz/khz 301 */ 302 extern int 303 __clocksource_register_scale(struct clocksource *cs, u32 scale, u32 freq); 304 extern void 305 __clocksource_updatefreq_scale(struct clocksource *cs, u32 scale, u32 freq); 306 307 static inline int clocksource_register_hz(struct clocksource *cs, u32 hz) 308 { 309 return __clocksource_register_scale(cs, 1, hz); 310 } 311 312 static inline int clocksource_register_khz(struct clocksource *cs, u32 khz) 313 { 314 return __clocksource_register_scale(cs, 1000, khz); 315 } 316 317 static inline void __clocksource_updatefreq_hz(struct clocksource *cs, u32 hz) 318 { 319 __clocksource_updatefreq_scale(cs, 1, hz); 320 } 321 322 static inline void __clocksource_updatefreq_khz(struct clocksource *cs, u32 khz) 323 { 324 __clocksource_updatefreq_scale(cs, 1000, khz); 325 } 326 327 328 extern int timekeeping_notify(struct clocksource *clock); 329 330 extern cycle_t clocksource_mmio_readl_up(struct clocksource *); 331 extern cycle_t clocksource_mmio_readl_down(struct clocksource *); 332 extern cycle_t clocksource_mmio_readw_up(struct clocksource *); 333 extern cycle_t clocksource_mmio_readw_down(struct clocksource *); 334 335 extern int clocksource_mmio_init(void __iomem *, const char *, 336 unsigned long, int, unsigned, cycle_t (*)(struct clocksource *)); 337 338 extern int clocksource_i8253_init(void); 339 340 #define CLOCKSOURCE_OF_DECLARE(name, compat, fn) \ 341 OF_DECLARE_1(clksrc, name, compat, fn) 342 343 #ifdef CONFIG_CLKSRC_OF 344 extern void clocksource_of_init(void); 345 #else 346 static inline void clocksource_of_init(void) {} 347 #endif 348 349 #endif /* _LINUX_CLOCKSOURCE_H */ 350
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.