[S390] cputime: add sparse checking and cleanup
[platform/adaptation/renesas_rcar/renesas_kernel.git] / arch / s390 / include / asm / cputime.h
1 /*
2  *  include/asm-s390/cputime.h
3  *
4  *  (C) Copyright IBM Corp. 2004
5  *
6  *  Author: Martin Schwidefsky <schwidefsky@de.ibm.com>
7  */
8
9 #ifndef _S390_CPUTIME_H
10 #define _S390_CPUTIME_H
11
12 #include <linux/types.h>
13 #include <linux/percpu.h>
14 #include <linux/spinlock.h>
15 #include <asm/div64.h>
16
17 /* We want to use full resolution of the CPU timer: 2**-12 micro-seconds. */
18
19 typedef unsigned long long __nocast cputime_t;
20 typedef unsigned long long __nocast cputime64_t;
21
22 static inline unsigned long __div(unsigned long long n, unsigned long base)
23 {
24 #ifndef __s390x__
25         register_pair rp;
26
27         rp.pair = n >> 1;
28         asm ("dr %0,%1" : "+d" (rp) : "d" (base >> 1));
29         return rp.subreg.odd;
30 #else /* __s390x__ */
31         return n / base;
32 #endif /* __s390x__ */
33 }
34
35 #define cputime_one_jiffy               jiffies_to_cputime(1)
36
37 /*
38  * Convert cputime to jiffies and back.
39  */
40 static inline unsigned long cputime_to_jiffies(const cputime_t cputime)
41 {
42         return __div((__force unsigned long long) cputime, 4096000000ULL / HZ);
43 }
44
45 static inline cputime_t jiffies_to_cputime(const unsigned int jif)
46 {
47         return (__force cputime_t)(jif * (4096000000ULL / HZ));
48 }
49
50 static inline u64 cputime64_to_jiffies64(cputime64_t cputime)
51 {
52         unsigned long long jif = (__force unsigned long long) cputime;
53         do_div(jif, 4096000000ULL / HZ);
54         return jif;
55 }
56
57 static inline cputime64_t jiffies64_to_cputime64(const u64 jif)
58 {
59         return (__force cputime64_t)(jif * (4096000000ULL / HZ));
60 }
61
62 /*
63  * Convert cputime to microseconds and back.
64  */
65 static inline unsigned int cputime_to_usecs(const cputime_t cputime)
66 {
67         return (__force unsigned long long) cputime >> 12;
68 }
69
70 static inline cputime_t usecs_to_cputime(const unsigned int m)
71 {
72         return (__force cputime_t)(m * 4096ULL);
73 }
74
75 /*
76  * Convert cputime to milliseconds and back.
77  */
78 static inline unsigned int cputime_to_secs(const cputime_t cputime)
79 {
80         return __div((__force unsigned long long) cputime, 2048000000) >> 1;
81 }
82
83 static inline cputime_t secs_to_cputime(const unsigned int s)
84 {
85         return (__force cputime_t)(s * 4096000000ULL);
86 }
87
88 /*
89  * Convert cputime to timespec and back.
90  */
91 static inline cputime_t timespec_to_cputime(const struct timespec *value)
92 {
93         unsigned long long ret = value->tv_sec * 4096000000ULL;
94         return (__force cputime_t)(ret + value->tv_nsec * 4096 / 1000);
95 }
96
97 static inline void cputime_to_timespec(const cputime_t cputime,
98                                        struct timespec *value)
99 {
100         unsigned long long __cputime = (__force unsigned long long) cputime;
101 #ifndef __s390x__
102         register_pair rp;
103
104         rp.pair = __cputime >> 1;
105         asm ("dr %0,%1" : "+d" (rp) : "d" (2048000000UL));
106         value->tv_nsec = rp.subreg.even * 1000 / 4096;
107         value->tv_sec = rp.subreg.odd;
108 #else
109         value->tv_nsec = (__cputime % 4096000000ULL) * 1000 / 4096;
110         value->tv_sec = __cputime / 4096000000ULL;
111 #endif
112 }
113
114 /*
115  * Convert cputime to timeval and back.
116  * Since cputime and timeval have the same resolution (microseconds)
117  * this is easy.
118  */
119 static inline cputime_t timeval_to_cputime(const struct timeval *value)
120 {
121         unsigned long long ret = value->tv_sec * 4096000000ULL;
122         return (__force cputime_t)(ret + value->tv_usec * 4096ULL);
123 }
124
125 static inline void cputime_to_timeval(const cputime_t cputime,
126                                       struct timeval *value)
127 {
128         unsigned long long __cputime = (__force unsigned long long) cputime;
129 #ifndef __s390x__
130         register_pair rp;
131
132         rp.pair = __cputime >> 1;
133         asm ("dr %0,%1" : "+d" (rp) : "d" (2048000000UL));
134         value->tv_usec = rp.subreg.even / 4096;
135         value->tv_sec = rp.subreg.odd;
136 #else
137         value->tv_usec = (__cputime % 4096000000ULL) / 4096;
138         value->tv_sec = __cputime / 4096000000ULL;
139 #endif
140 }
141
142 /*
143  * Convert cputime to clock and back.
144  */
145 static inline clock_t cputime_to_clock_t(cputime_t cputime)
146 {
147         unsigned long long clock = (__force unsigned long long) cputime;
148         do_div(clock, 4096000000ULL / USER_HZ);
149         return clock;
150 }
151
152 static inline cputime_t clock_t_to_cputime(unsigned long x)
153 {
154         return (__force cputime_t)(x * (4096000000ULL / USER_HZ));
155 }
156
157 /*
158  * Convert cputime64 to clock.
159  */
160 static inline clock_t cputime64_to_clock_t(cputime64_t cputime)
161 {
162         unsigned long long clock = (__force unsigned long long) cputime;
163         do_div(clock, 4096000000ULL / USER_HZ);
164         return clock;
165 }
166
167 struct s390_idle_data {
168         unsigned int sequence;
169         unsigned long long idle_count;
170         unsigned long long idle_enter;
171         unsigned long long idle_time;
172         int nohz_delay;
173 };
174
175 DECLARE_PER_CPU(struct s390_idle_data, s390_idle);
176
177 void vtime_start_cpu(__u64 int_clock, __u64 enter_timer);
178 cputime64_t s390_get_idle_time(int cpu);
179
180 #define arch_idle_time(cpu) s390_get_idle_time(cpu)
181
182 static inline void s390_idle_check(struct pt_regs *regs, __u64 int_clock,
183                                    __u64 enter_timer)
184 {
185         if (regs->psw.mask & PSW_MASK_WAIT)
186                 vtime_start_cpu(int_clock, enter_timer);
187 }
188
189 static inline int s390_nohz_delay(int cpu)
190 {
191         return __get_cpu_var(s390_idle).nohz_delay != 0;
192 }
193
194 #define arch_needs_cpu(cpu) s390_nohz_delay(cpu)
195
196 #endif /* _S390_CPUTIME_H */