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 Tatashinstatic inline void generic_sched_clock_init(void) { } 45364eba4bSDaniel Lezcano sched_clock_register(u64 (* read)(void),int bits,unsigned long rate)46364eba4bSDaniel Lezcanostatic 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