/* SPDX-License-Identifier: GPL-2.0 */ /* linux/include/linux/clocksource.h * * This file contains the structure definitions for clocksources. * * If you are not a clocksource, or timekeeping code, you should * not be including this file!
*/ #ifndef _LINUX_CLOCKSOURCE_H #define _LINUX_CLOCKSOURCE_H
/** * struct clocksource - hardware abstraction for a free running counter * Provides mostly state-free accessors to the underlying hardware. * This is the structure used for system time. * * @read: Returns a cycle value, passes clocksource as argument * @mask: Bitmask for two's complement * subtraction of non 64 bit counters * @mult: Cycle to nanosecond multiplier * @shift: Cycle to nanosecond divisor (power of two) * @max_idle_ns: Maximum idle time permitted by the clocksource (nsecs) * @maxadj: Maximum adjustment value to mult (~11%) * @uncertainty_margin: Maximum uncertainty in nanoseconds per half second. * Zero says to use default WATCHDOG_THRESHOLD. * @archdata: Optional arch-specific data * @max_cycles: Maximum safe cycle value which won't overflow on * multiplication * @max_raw_delta: Maximum safe delta value for negative motion detection * @name: Pointer to clocksource name * @list: List head for registration (internal) * @freq_khz: Clocksource frequency in khz. * @rating: Rating value for selection (higher is better) * To avoid rating inflation the following * list should give you a guide as to how * to assign your clocksource a rating * 1-99: Unfit for real use * Only available for bootup and testing purposes. * 100-199: Base level usability. * Functional for real use, but not desired. * 200-299: Good. * A correct and usable clocksource. * 300-399: Desired. * A reasonably fast and accurate clocksource. * 400-499: Perfect * The ideal clocksource. A must-use where * available. * @id: Defaults to CSID_GENERIC. The id value is captured * in certain snapshot functions to allow callers to * validate the clocksource from which the snapshot was * taken. * @flags: Flags describing special properties * @base: Hardware abstraction for clock on which a clocksource * is based * @enable: Optional function to enable the clocksource * @disable: Optional function to disable the clocksource * @suspend: Optional suspend function for the clocksource * @resume: Optional resume function for the clocksource * @mark_unstable: Optional function to inform the clocksource driver that * the watchdog marked the clocksource unstable * @tick_stable: Optional function called periodically from the watchdog * code to provide stable synchronization points * @wd_list: List head to enqueue into the watchdog list (internal) * @cs_last: Last clocksource value for clocksource watchdog * @wd_last: Last watchdog value corresponding to @cs_last * @owner: Module reference, must be set by clocksource in modules * * Note: This struct is not used in hotpathes of the timekeeping code * because the timekeeper caches the hot path fields in its own data * structure, so no cache line alignment is required, * * The pointer to the clocksource itself is handed to the read * callback. If you need extra information there you can wrap struct * clocksource into your own struct. Depending on the amount of * information you need you should consider to cache line align that * structure.
*/ struct clocksource {
u64 (*read)(struct clocksource *cs);
u64 mask;
u32 mult;
u32 shift;
u64 max_idle_ns;
u32 maxadj;
u32 uncertainty_margin; #ifdef CONFIG_ARCH_CLOCKSOURCE_DATA struct arch_clocksource_data archdata; #endif
u64 max_cycles;
u64 max_raw_delta; constchar *name; struct list_head list;
u32 freq_khz; int rating; enum clocksource_ids id; enum vdso_clock_mode vdso_clock_mode; unsignedlong flags; struct clocksource_base *base;
staticinline u32 clocksource_freq2mult(u32 freq, u32 shift_constant, u64 from)
{ /* freq = cyc/from * mult/2^shift = ns/cyc * mult = ns/cyc * 2^shift * mult = from/freq * 2^shift * mult = from * 2^shift / freq * mult = (from<<shift) / freq
*/
u64 tmp = ((u64)from) << shift_constant;
tmp += freq/2; /* round for do_div */
do_div(tmp, freq);
return (u32)tmp;
}
/** * clocksource_khz2mult - calculates mult from khz and shift * @khz: Clocksource frequency in KHz * @shift_constant: Clocksource shift factor * * Helper functions that converts a khz counter frequency to a timsource * multiplier, given the clocksource shift value
*/ staticinline u32 clocksource_khz2mult(u32 khz, u32 shift_constant)
{ return clocksource_freq2mult(khz, shift_constant, NSEC_PER_MSEC);
}
/** * clocksource_hz2mult - calculates mult from hz and shift * @hz: Clocksource frequency in Hz * @shift_constant: Clocksource shift factor * * Helper functions that converts a hz counter * frequency to a timsource multiplier, given the * clocksource shift value
*/ staticinline u32 clocksource_hz2mult(u32 hz, u32 shift_constant)
{ return clocksource_freq2mult(hz, shift_constant, NSEC_PER_SEC);
}
/** * clocksource_cyc2ns - converts clocksource cycles to nanoseconds * @cycles: cycles * @mult: cycle to nanosecond multiplier * @shift: cycle to nanosecond divisor (power of two) * * Converts clocksource cycles to nanoseconds, using the given @mult and @shift. * The code is optimized for performance and is not intended to work * with absolute clocksource cycles (as those will easily overflow), * but is only intended to be used with relative (delta) clocksource cycles. * * XXX - This could use some mult_lxl_ll() asm optimization
*/ staticinline s64 clocksource_cyc2ns(u64 cycles, u32 mult, u32 shift)
{ return ((u64) cycles * mult) >> shift;
}
/* * Don't call this unless you are a default clocksource * (AKA: jiffies) and absolutely have to.
*/ staticinlineint __clocksource_register(struct clocksource *cs)
{ return __clocksource_register_scale(cs, 1, 0);
}
staticinlineunsignedint clocksource_get_max_watchdog_retry(void)
{ /* * When system is in the boot phase or under heavy workload, there * can be random big latencies during the clocksource/watchdog * read, so allow retries to filter the noise latency. As the * latency's frequency and maximum value goes up with the number of * CPUs, scale the number of retries with the number of online * CPUs.
*/ return (ilog2(num_online_cpus()) / 2) + 1;
}
/** * struct clocksource_base - hardware abstraction for clock on which a clocksource * is based * @id: Defaults to CSID_GENERIC. The id value is used for conversion * functions which require that the current clocksource is based * on a clocksource_base with a particular ID in certain snapshot * functions to allow callers to validate the clocksource from * which the snapshot was taken. * @freq_khz: Nominal frequency of the base clock in kHz * @offset: Offset between the base clock and the clocksource * @numerator: Numerator of the clock ratio between base clock and the clocksource * @denominator: Denominator of the clock ratio between base clock and the clocksource
*/ struct clocksource_base { enum clocksource_ids id;
u32 freq_khz;
u64 offset;
u32 numerator;
u32 denominator;
};
#endif/* _LINUX_CLOCKSOURCE_H */
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.