xref: /openbmc/linux/include/linux/sched_clock.h (revision d0b9d6dc)
1d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
238ff87f7SStephen Boyd /*
338ff87f7SStephen Boyd  * sched_clock.h: support for extending counters to full 64-bit ns counter
438ff87f7SStephen Boyd  */
538ff87f7SStephen Boyd #ifndef LINUX_SCHED_CLOCK
638ff87f7SStephen Boyd #define LINUX_SCHED_CLOCK
738ff87f7SStephen Boyd 
8*d0b9d6dcSIngo Molnar #include <linux/types.h>
9*d0b9d6dcSIngo Molnar 
1038ff87f7SStephen Boyd #ifdef CONFIG_GENERIC_SCHED_CLOCK
111b86abc1SPeter Zijlstra /**
121b86abc1SPeter Zijlstra  * struct clock_read_data - data required to read from sched_clock()
131b86abc1SPeter Zijlstra  *
141b86abc1SPeter Zijlstra  * @epoch_ns:		sched_clock() value at last update
151b86abc1SPeter Zijlstra  * @epoch_cyc:		Clock cycle value at last update.
161b86abc1SPeter Zijlstra  * @sched_clock_mask:   Bitmask for two's complement subtraction of non 64bit
171b86abc1SPeter Zijlstra  *			clocks.
181b86abc1SPeter Zijlstra  * @read_sched_clock:	Current clock source (or dummy source when suspended).
19cc00c198SIngo Molnar  * @mult:		Multiplier for scaled math conversion.
201b86abc1SPeter Zijlstra  * @shift:		Shift value for scaled math conversion.
211b86abc1SPeter Zijlstra  *
221b86abc1SPeter Zijlstra  * Care must be taken when updating this structure; it is read by
231b86abc1SPeter Zijlstra  * some very hot code paths. It occupies <=40 bytes and, when combined
241b86abc1SPeter Zijlstra  * with the seqcount used to synchronize access, comfortably fits into
251b86abc1SPeter Zijlstra  * a 64 byte cache line.
261b86abc1SPeter Zijlstra  */
271b86abc1SPeter Zijlstra struct clock_read_data {
281b86abc1SPeter Zijlstra 	u64 epoch_ns;
291b86abc1SPeter Zijlstra 	u64 epoch_cyc;
301b86abc1SPeter Zijlstra 	u64 sched_clock_mask;
311b86abc1SPeter Zijlstra 	u64 (*read_sched_clock)(void);
321b86abc1SPeter Zijlstra 	u32 mult;
331b86abc1SPeter Zijlstra 	u32 shift;
341b86abc1SPeter Zijlstra };
351b86abc1SPeter Zijlstra 
361b86abc1SPeter Zijlstra extern struct clock_read_data *sched_clock_read_begin(unsigned int *seq);
371b86abc1SPeter Zijlstra extern int sched_clock_read_retry(unsigned int seq);
381b86abc1SPeter Zijlstra 
395d2a4e91SPavel Tatashin extern void generic_sched_clock_init(void);
4038ff87f7SStephen Boyd 
41e7e3ff1bSStephen Boyd extern void sched_clock_register(u64 (*read)(void), int bits,
42e7e3ff1bSStephen Boyd 				 unsigned long rate);
43364eba4bSDaniel Lezcano #else
generic_sched_clock_init(void)445d2a4e91SPavel Tatashin static inline void generic_sched_clock_init(void) { }
45364eba4bSDaniel Lezcano 
sched_clock_register(u64 (* read)(void),int bits,unsigned long rate)46364eba4bSDaniel Lezcano static inline void sched_clock_register(u64 (*read)(void), int bits,
47364eba4bSDaniel Lezcano 					unsigned long rate)
48364eba4bSDaniel Lezcano {
49364eba4bSDaniel Lezcano }
50364eba4bSDaniel Lezcano #endif
5138ff87f7SStephen Boyd 
5238ff87f7SStephen Boyd #endif
53