xref: /openbmc/linux/arch/s390/include/asm/timex.h (revision 9ac8d3fb)
1 /*
2  *  include/asm-s390/timex.h
3  *
4  *  S390 version
5  *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
6  *
7  *  Derived from "include/asm-i386/timex.h"
8  *    Copyright (C) 1992, Linus Torvalds
9  */
10 
11 #ifndef _ASM_S390_TIMEX_H
12 #define _ASM_S390_TIMEX_H
13 
14 /* Inline functions for clock register access. */
15 static inline int set_clock(__u64 time)
16 {
17 	int cc;
18 
19 	asm volatile(
20 		"   sck   0(%2)\n"
21 		"   ipm   %0\n"
22 		"   srl   %0,28\n"
23 		: "=d" (cc) : "m" (time), "a" (&time) : "cc");
24 	return cc;
25 }
26 
27 static inline int store_clock(__u64 *time)
28 {
29 	int cc;
30 
31 	asm volatile(
32 		"   stck  0(%2)\n"
33 		"   ipm   %0\n"
34 		"   srl   %0,28\n"
35 		: "=d" (cc), "=m" (*time) : "a" (time) : "cc");
36 	return cc;
37 }
38 
39 static inline void set_clock_comparator(__u64 time)
40 {
41 	asm volatile("sckc 0(%1)" : : "m" (time), "a" (&time));
42 }
43 
44 static inline void store_clock_comparator(__u64 *time)
45 {
46 	asm volatile("stckc 0(%1)" : "=m" (*time) : "a" (time));
47 }
48 
49 #define CLOCK_TICK_RATE	1193180 /* Underlying HZ */
50 
51 typedef unsigned long long cycles_t;
52 
53 static inline unsigned long long get_clock (void)
54 {
55 	unsigned long long clk;
56 
57 #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2)
58 	asm volatile("stck %0" : "=Q" (clk) : : "cc");
59 #else /* __GNUC__ */
60 	asm volatile("stck 0(%1)" : "=m" (clk) : "a" (&clk) : "cc");
61 #endif /* __GNUC__ */
62 	return clk;
63 }
64 
65 static inline unsigned long long get_clock_xt(void)
66 {
67 	unsigned char clk[16];
68 
69 #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2)
70 	asm volatile("stcke %0" : "=Q" (clk) : : "cc");
71 #else /* __GNUC__ */
72 	asm volatile("stcke 0(%1)" : "=m" (clk)
73 				   : "a" (clk) : "cc");
74 #endif /* __GNUC__ */
75 
76 	return *((unsigned long long *)&clk[1]);
77 }
78 
79 static inline cycles_t get_cycles(void)
80 {
81 	return (cycles_t) get_clock() >> 2;
82 }
83 
84 int get_sync_clock(unsigned long long *clock);
85 void init_cpu_timer(void);
86 unsigned long long monotonic_clock(void);
87 
88 #endif
89