Commit | Line | Data |
---|---|---|
1da177e4 LT |
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 | ||
b6112ccb MS |
14 | /* The value of the TOD clock for 1.1.1970. */ |
15 | #define TOD_UNIX_EPOCH 0x7d91048bca000000ULL | |
16 | ||
d54853ef MS |
17 | /* Inline functions for clock register access. */ |
18 | static inline int set_clock(__u64 time) | |
19 | { | |
20 | int cc; | |
21 | ||
22 | asm volatile( | |
23 | " sck 0(%2)\n" | |
24 | " ipm %0\n" | |
25 | " srl %0,28\n" | |
26 | : "=d" (cc) : "m" (time), "a" (&time) : "cc"); | |
27 | return cc; | |
28 | } | |
29 | ||
30 | static inline int store_clock(__u64 *time) | |
31 | { | |
32 | int cc; | |
33 | ||
34 | asm volatile( | |
35 | " stck 0(%2)\n" | |
36 | " ipm %0\n" | |
37 | " srl %0,28\n" | |
38 | : "=d" (cc), "=m" (*time) : "a" (time) : "cc"); | |
39 | return cc; | |
40 | } | |
41 | ||
42 | static inline void set_clock_comparator(__u64 time) | |
43 | { | |
44 | asm volatile("sckc 0(%1)" : : "m" (time), "a" (&time)); | |
45 | } | |
46 | ||
47 | static inline void store_clock_comparator(__u64 *time) | |
48 | { | |
49 | asm volatile("stckc 0(%1)" : "=m" (*time) : "a" (time)); | |
50 | } | |
51 | ||
1da177e4 LT |
52 | #define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ |
53 | ||
54 | typedef unsigned long long cycles_t; | |
55 | ||
1da177e4 LT |
56 | static inline unsigned long long get_clock (void) |
57 | { | |
58 | unsigned long long clk; | |
59 | ||
94c12cc7 MS |
60 | #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2) |
61 | asm volatile("stck %0" : "=Q" (clk) : : "cc"); | |
62 | #else /* __GNUC__ */ | |
63 | asm volatile("stck 0(%1)" : "=m" (clk) : "a" (&clk) : "cc"); | |
64 | #endif /* __GNUC__ */ | |
1da177e4 LT |
65 | return clk; |
66 | } | |
67 | ||
c0015f91 | 68 | static inline unsigned long long get_clock_xt(void) |
1b278294 | 69 | { |
c0015f91 | 70 | unsigned char clk[16]; |
1b278294 JG |
71 | |
72 | #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2) | |
c0015f91 | 73 | asm volatile("stcke %0" : "=Q" (clk) : : "cc"); |
1b278294 | 74 | #else /* __GNUC__ */ |
c0015f91 JG |
75 | asm volatile("stcke 0(%1)" : "=m" (clk) |
76 | : "a" (clk) : "cc"); | |
1b278294 | 77 | #endif /* __GNUC__ */ |
c0015f91 JG |
78 | |
79 | return *((unsigned long long *)&clk[1]); | |
1b278294 JG |
80 | } |
81 | ||
94c12cc7 MS |
82 | static inline cycles_t get_cycles(void) |
83 | { | |
84 | return (cycles_t) get_clock() >> 2; | |
85 | } | |
86 | ||
d54853ef | 87 | int get_sync_clock(unsigned long long *clock); |
2b67fc46 | 88 | void init_cpu_timer(void); |
a806170e | 89 | unsigned long long monotonic_clock(void); |
2b67fc46 | 90 | |
b6112ccb MS |
91 | extern u64 sched_clock_base_cc; |
92 | ||
05e7ff7d HC |
93 | /** |
94 | * get_clock_monotonic - returns current time in clock rate units | |
95 | * | |
96 | * The caller must ensure that preemption is disabled. | |
97 | * The clock and sched_clock_base get changed via stop_machine. | |
98 | * Therefore preemption must be disabled when calling this | |
99 | * function, otherwise the returned value is not guaranteed to | |
100 | * be monotonic. | |
101 | */ | |
102 | static inline unsigned long long get_clock_monotonic(void) | |
103 | { | |
104 | return get_clock_xt() - sched_clock_base_cc; | |
105 | } | |
106 | ||
1da177e4 | 107 | #endif |