diff options
Diffstat (limited to 'arch/s390/include/asm/timex.h')
| -rw-r--r-- | arch/s390/include/asm/timex.h | 46 | 
1 files changed, 37 insertions, 9 deletions
diff --git a/arch/s390/include/asm/timex.h b/arch/s390/include/asm/timex.h index fba4d66788a..8ad8af91503 100644 --- a/arch/s390/include/asm/timex.h +++ b/arch/s390/include/asm/timex.h @@ -15,7 +15,7 @@  #define TOD_UNIX_EPOCH 0x7d91048bca000000ULL  /* Inline functions for clock register access. */ -static inline int set_clock(__u64 time) +static inline int set_tod_clock(__u64 time)  {  	int cc; @@ -27,7 +27,7 @@ static inline int set_clock(__u64 time)  	return cc;  } -static inline int store_clock(__u64 *time) +static inline int store_tod_clock(__u64 *time)  {  	int cc; @@ -71,7 +71,7 @@ static inline void local_tick_enable(unsigned long long comp)  typedef unsigned long long cycles_t; -static inline unsigned long long get_clock(void) +static inline unsigned long long get_tod_clock(void)  {  	unsigned long long clk; @@ -83,21 +83,21 @@ static inline unsigned long long get_clock(void)  	return clk;  } -static inline void get_clock_ext(char *clk) +static inline void get_tod_clock_ext(char *clk)  {  	asm volatile("stcke %0" : "=Q" (*clk) : : "cc");  } -static inline unsigned long long get_clock_xt(void) +static inline unsigned long long get_tod_clock_xt(void)  {  	unsigned char clk[16]; -	get_clock_ext(clk); +	get_tod_clock_ext(clk);  	return *((unsigned long long *)&clk[1]);  }  static inline cycles_t get_cycles(void)  { -	return (cycles_t) get_clock() >> 2; +	return (cycles_t) get_tod_clock() >> 2;  }  int get_sync_clock(unsigned long long *clock); @@ -123,9 +123,37 @@ extern u64 sched_clock_base_cc;   * function, otherwise the returned value is not guaranteed to   * be monotonic.   */ -static inline unsigned long long get_clock_monotonic(void) +static inline unsigned long long get_tod_clock_monotonic(void)  { -	return get_clock_xt() - sched_clock_base_cc; +	return get_tod_clock_xt() - sched_clock_base_cc; +} + +/** + * tod_to_ns - convert a TOD format value to nanoseconds + * @todval: to be converted TOD format value + * Returns: number of nanoseconds that correspond to the TOD format value + * + * Converting a 64 Bit TOD format value to nanoseconds means that the value + * must be divided by 4.096. In order to achieve that we multiply with 125 + * and divide by 512: + * + *    ns = (todval * 125) >> 9; + * + * In order to avoid an overflow with the multiplication we can rewrite this. + * With a split todval == 2^32 * th + tl (th upper 32 bits, tl lower 32 bits) + * we end up with + * + *    ns = ((2^32 * th + tl) * 125 ) >> 9; + * -> ns = (2^23 * th * 125) + ((tl * 125) >> 9); + * + */ +static inline unsigned long long tod_to_ns(unsigned long long todval) +{ +	unsigned long long ns; + +	ns = ((todval >> 32) << 23) * 125; +	ns += ((todval & 0xffffffff) * 125) >> 9; +	return ns;  }  #endif  |