[ARM] 5133/2: at91sam9g20 defconfig file
[sfrench/cifs-2.6.git] / arch / x86 / xen / time.c
1 /*
2  * Xen time implementation.
3  *
4  * This is implemented in terms of a clocksource driver which uses
5  * the hypervisor clock as a nanosecond timebase, and a clockevent
6  * driver which uses the hypervisor's timer mechanism.
7  *
8  * Jeremy Fitzhardinge <jeremy@xensource.com>, XenSource Inc, 2007
9  */
10 #include <linux/kernel.h>
11 #include <linux/interrupt.h>
12 #include <linux/clocksource.h>
13 #include <linux/clockchips.h>
14 #include <linux/kernel_stat.h>
15
16 #include <asm/xen/hypervisor.h>
17 #include <asm/xen/hypercall.h>
18
19 #include <xen/events.h>
20 #include <xen/interface/xen.h>
21 #include <xen/interface/vcpu.h>
22
23 #include "xen-ops.h"
24
25 #define XEN_SHIFT 22
26
27 /* Xen may fire a timer up to this many ns early */
28 #define TIMER_SLOP      100000
29 #define NS_PER_TICK     (1000000000LL / HZ)
30
31 static cycle_t xen_clocksource_read(void);
32
33 /* These are perodically updated in shared_info, and then copied here. */
34 struct shadow_time_info {
35         u64 tsc_timestamp;     /* TSC at last update of time vals.  */
36         u64 system_timestamp;  /* Time, in nanosecs, since boot.    */
37         u32 tsc_to_nsec_mul;
38         int tsc_shift;
39         u32 version;
40 };
41
42 static DEFINE_PER_CPU(struct shadow_time_info, shadow_time);
43
44 /* runstate info updated by Xen */
45 static DEFINE_PER_CPU(struct vcpu_runstate_info, runstate);
46
47 /* snapshots of runstate info */
48 static DEFINE_PER_CPU(struct vcpu_runstate_info, runstate_snapshot);
49
50 /* unused ns of stolen and blocked time */
51 static DEFINE_PER_CPU(u64, residual_stolen);
52 static DEFINE_PER_CPU(u64, residual_blocked);
53
54 /* return an consistent snapshot of 64-bit time/counter value */
55 static u64 get64(const u64 *p)
56 {
57         u64 ret;
58
59         if (BITS_PER_LONG < 64) {
60                 u32 *p32 = (u32 *)p;
61                 u32 h, l;
62
63                 /*
64                  * Read high then low, and then make sure high is
65                  * still the same; this will only loop if low wraps
66                  * and carries into high.
67                  * XXX some clean way to make this endian-proof?
68                  */
69                 do {
70                         h = p32[1];
71                         barrier();
72                         l = p32[0];
73                         barrier();
74                 } while (p32[1] != h);
75
76                 ret = (((u64)h) << 32) | l;
77         } else
78                 ret = *p;
79
80         return ret;
81 }
82
83 /*
84  * Runstate accounting
85  */
86 static void get_runstate_snapshot(struct vcpu_runstate_info *res)
87 {
88         u64 state_time;
89         struct vcpu_runstate_info *state;
90
91         BUG_ON(preemptible());
92
93         state = &__get_cpu_var(runstate);
94
95         /*
96          * The runstate info is always updated by the hypervisor on
97          * the current CPU, so there's no need to use anything
98          * stronger than a compiler barrier when fetching it.
99          */
100         do {
101                 state_time = get64(&state->state_entry_time);
102                 barrier();
103                 *res = *state;
104                 barrier();
105         } while (get64(&state->state_entry_time) != state_time);
106 }
107
108 /* return true when a vcpu could run but has no real cpu to run on */
109 bool xen_vcpu_stolen(int vcpu)
110 {
111         return per_cpu(runstate, vcpu).state == RUNSTATE_runnable;
112 }
113
114 static void setup_runstate_info(int cpu)
115 {
116         struct vcpu_register_runstate_memory_area area;
117
118         area.addr.v = &per_cpu(runstate, cpu);
119
120         if (HYPERVISOR_vcpu_op(VCPUOP_register_runstate_memory_area,
121                                cpu, &area))
122                 BUG();
123 }
124
125 static void do_stolen_accounting(void)
126 {
127         struct vcpu_runstate_info state;
128         struct vcpu_runstate_info *snap;
129         s64 blocked, runnable, offline, stolen;
130         cputime_t ticks;
131
132         get_runstate_snapshot(&state);
133
134         WARN_ON(state.state != RUNSTATE_running);
135
136         snap = &__get_cpu_var(runstate_snapshot);
137
138         /* work out how much time the VCPU has not been runn*ing*  */
139         blocked = state.time[RUNSTATE_blocked] - snap->time[RUNSTATE_blocked];
140         runnable = state.time[RUNSTATE_runnable] - snap->time[RUNSTATE_runnable];
141         offline = state.time[RUNSTATE_offline] - snap->time[RUNSTATE_offline];
142
143         *snap = state;
144
145         /* Add the appropriate number of ticks of stolen time,
146            including any left-overs from last time.  Passing NULL to
147            account_steal_time accounts the time as stolen. */
148         stolen = runnable + offline + __get_cpu_var(residual_stolen);
149
150         if (stolen < 0)
151                 stolen = 0;
152
153         ticks = 0;
154         while (stolen >= NS_PER_TICK) {
155                 ticks++;
156                 stolen -= NS_PER_TICK;
157         }
158         __get_cpu_var(residual_stolen) = stolen;
159         account_steal_time(NULL, ticks);
160
161         /* Add the appropriate number of ticks of blocked time,
162            including any left-overs from last time.  Passing idle to
163            account_steal_time accounts the time as idle/wait. */
164         blocked += __get_cpu_var(residual_blocked);
165
166         if (blocked < 0)
167                 blocked = 0;
168
169         ticks = 0;
170         while (blocked >= NS_PER_TICK) {
171                 ticks++;
172                 blocked -= NS_PER_TICK;
173         }
174         __get_cpu_var(residual_blocked) = blocked;
175         account_steal_time(idle_task(smp_processor_id()), ticks);
176 }
177
178 /*
179  * Xen sched_clock implementation.  Returns the number of unstolen
180  * nanoseconds, which is nanoseconds the VCPU spent in RUNNING+BLOCKED
181  * states.
182  */
183 unsigned long long xen_sched_clock(void)
184 {
185         struct vcpu_runstate_info state;
186         cycle_t now;
187         u64 ret;
188         s64 offset;
189
190         /*
191          * Ideally sched_clock should be called on a per-cpu basis
192          * anyway, so preempt should already be disabled, but that's
193          * not current practice at the moment.
194          */
195         preempt_disable();
196
197         now = xen_clocksource_read();
198
199         get_runstate_snapshot(&state);
200
201         WARN_ON(state.state != RUNSTATE_running);
202
203         offset = now - state.state_entry_time;
204         if (offset < 0)
205                 offset = 0;
206
207         ret = state.time[RUNSTATE_blocked] +
208                 state.time[RUNSTATE_running] +
209                 offset;
210
211         preempt_enable();
212
213         return ret;
214 }
215
216
217 /* Get the CPU speed from Xen */
218 unsigned long xen_cpu_khz(void)
219 {
220         u64 xen_khz = 1000000ULL << 32;
221         const struct vcpu_time_info *info =
222                 &HYPERVISOR_shared_info->vcpu_info[0].time;
223
224         do_div(xen_khz, info->tsc_to_system_mul);
225         if (info->tsc_shift < 0)
226                 xen_khz <<= -info->tsc_shift;
227         else
228                 xen_khz >>= info->tsc_shift;
229
230         return xen_khz;
231 }
232
233 /*
234  * Reads a consistent set of time-base values from Xen, into a shadow data
235  * area.
236  */
237 static unsigned get_time_values_from_xen(void)
238 {
239         struct vcpu_time_info   *src;
240         struct shadow_time_info *dst;
241
242         /* src is shared memory with the hypervisor, so we need to
243            make sure we get a consistent snapshot, even in the face of
244            being preempted. */
245         src = &__get_cpu_var(xen_vcpu)->time;
246         dst = &__get_cpu_var(shadow_time);
247
248         do {
249                 dst->version = src->version;
250                 rmb();          /* fetch version before data */
251                 dst->tsc_timestamp     = src->tsc_timestamp;
252                 dst->system_timestamp  = src->system_time;
253                 dst->tsc_to_nsec_mul   = src->tsc_to_system_mul;
254                 dst->tsc_shift         = src->tsc_shift;
255                 rmb();          /* test version after fetching data */
256         } while ((src->version & 1) | (dst->version ^ src->version));
257
258         return dst->version;
259 }
260
261 /*
262  * Scale a 64-bit delta by scaling and multiplying by a 32-bit fraction,
263  * yielding a 64-bit result.
264  */
265 static inline u64 scale_delta(u64 delta, u32 mul_frac, int shift)
266 {
267         u64 product;
268 #ifdef __i386__
269         u32 tmp1, tmp2;
270 #endif
271
272         if (shift < 0)
273                 delta >>= -shift;
274         else
275                 delta <<= shift;
276
277 #ifdef __i386__
278         __asm__ (
279                 "mul  %5       ; "
280                 "mov  %4,%%eax ; "
281                 "mov  %%edx,%4 ; "
282                 "mul  %5       ; "
283                 "xor  %5,%5    ; "
284                 "add  %4,%%eax ; "
285                 "adc  %5,%%edx ; "
286                 : "=A" (product), "=r" (tmp1), "=r" (tmp2)
287                 : "a" ((u32)delta), "1" ((u32)(delta >> 32)), "2" (mul_frac) );
288 #elif __x86_64__
289         __asm__ (
290                 "mul %%rdx ; shrd $32,%%rdx,%%rax"
291                 : "=a" (product) : "0" (delta), "d" ((u64)mul_frac) );
292 #else
293 #error implement me!
294 #endif
295
296         return product;
297 }
298
299 static u64 get_nsec_offset(struct shadow_time_info *shadow)
300 {
301         u64 now, delta;
302         now = native_read_tsc();
303         delta = now - shadow->tsc_timestamp;
304         return scale_delta(delta, shadow->tsc_to_nsec_mul, shadow->tsc_shift);
305 }
306
307 static cycle_t xen_clocksource_read(void)
308 {
309         struct shadow_time_info *shadow = &get_cpu_var(shadow_time);
310         cycle_t ret;
311         unsigned version;
312
313         do {
314                 version = get_time_values_from_xen();
315                 barrier();
316                 ret = shadow->system_timestamp + get_nsec_offset(shadow);
317                 barrier();
318         } while (version != __get_cpu_var(xen_vcpu)->time.version);
319
320         put_cpu_var(shadow_time);
321
322         return ret;
323 }
324
325 static void xen_read_wallclock(struct timespec *ts)
326 {
327         const struct shared_info *s = HYPERVISOR_shared_info;
328         u32 version;
329         u64 delta;
330         struct timespec now;
331
332         /* get wallclock at system boot */
333         do {
334                 version = s->wc_version;
335                 rmb();          /* fetch version before time */
336                 now.tv_sec  = s->wc_sec;
337                 now.tv_nsec = s->wc_nsec;
338                 rmb();          /* fetch time before checking version */
339         } while ((s->wc_version & 1) | (version ^ s->wc_version));
340
341         delta = xen_clocksource_read(); /* time since system boot */
342         delta += now.tv_sec * (u64)NSEC_PER_SEC + now.tv_nsec;
343
344         now.tv_nsec = do_div(delta, NSEC_PER_SEC);
345         now.tv_sec = delta;
346
347         set_normalized_timespec(ts, now.tv_sec, now.tv_nsec);
348 }
349
350 unsigned long xen_get_wallclock(void)
351 {
352         struct timespec ts;
353
354         xen_read_wallclock(&ts);
355
356         return ts.tv_sec;
357 }
358
359 int xen_set_wallclock(unsigned long now)
360 {
361         /* do nothing for domU */
362         return -1;
363 }
364
365 static struct clocksource xen_clocksource __read_mostly = {
366         .name = "xen",
367         .rating = 400,
368         .read = xen_clocksource_read,
369         .mask = ~0,
370         .mult = 1<<XEN_SHIFT,           /* time directly in nanoseconds */
371         .shift = XEN_SHIFT,
372         .flags = CLOCK_SOURCE_IS_CONTINUOUS,
373 };
374
375 /*
376    Xen clockevent implementation
377
378    Xen has two clockevent implementations:
379
380    The old timer_op one works with all released versions of Xen prior
381    to version 3.0.4.  This version of the hypervisor provides a
382    single-shot timer with nanosecond resolution.  However, sharing the
383    same event channel is a 100Hz tick which is delivered while the
384    vcpu is running.  We don't care about or use this tick, but it will
385    cause the core time code to think the timer fired too soon, and
386    will end up resetting it each time.  It could be filtered, but
387    doing so has complications when the ktime clocksource is not yet
388    the xen clocksource (ie, at boot time).
389
390    The new vcpu_op-based timer interface allows the tick timer period
391    to be changed or turned off.  The tick timer is not useful as a
392    periodic timer because events are only delivered to running vcpus.
393    The one-shot timer can report when a timeout is in the past, so
394    set_next_event is capable of returning -ETIME when appropriate.
395    This interface is used when available.
396 */
397
398
399 /*
400   Get a hypervisor absolute time.  In theory we could maintain an
401   offset between the kernel's time and the hypervisor's time, and
402   apply that to a kernel's absolute timeout.  Unfortunately the
403   hypervisor and kernel times can drift even if the kernel is using
404   the Xen clocksource, because ntp can warp the kernel's clocksource.
405 */
406 static s64 get_abs_timeout(unsigned long delta)
407 {
408         return xen_clocksource_read() + delta;
409 }
410
411 static void xen_timerop_set_mode(enum clock_event_mode mode,
412                                  struct clock_event_device *evt)
413 {
414         switch (mode) {
415         case CLOCK_EVT_MODE_PERIODIC:
416                 /* unsupported */
417                 WARN_ON(1);
418                 break;
419
420         case CLOCK_EVT_MODE_ONESHOT:
421         case CLOCK_EVT_MODE_RESUME:
422                 break;
423
424         case CLOCK_EVT_MODE_UNUSED:
425         case CLOCK_EVT_MODE_SHUTDOWN:
426                 HYPERVISOR_set_timer_op(0);  /* cancel timeout */
427                 break;
428         }
429 }
430
431 static int xen_timerop_set_next_event(unsigned long delta,
432                                       struct clock_event_device *evt)
433 {
434         WARN_ON(evt->mode != CLOCK_EVT_MODE_ONESHOT);
435
436         if (HYPERVISOR_set_timer_op(get_abs_timeout(delta)) < 0)
437                 BUG();
438
439         /* We may have missed the deadline, but there's no real way of
440            knowing for sure.  If the event was in the past, then we'll
441            get an immediate interrupt. */
442
443         return 0;
444 }
445
446 static const struct clock_event_device xen_timerop_clockevent = {
447         .name = "xen",
448         .features = CLOCK_EVT_FEAT_ONESHOT,
449
450         .max_delta_ns = 0xffffffff,
451         .min_delta_ns = TIMER_SLOP,
452
453         .mult = 1,
454         .shift = 0,
455         .rating = 500,
456
457         .set_mode = xen_timerop_set_mode,
458         .set_next_event = xen_timerop_set_next_event,
459 };
460
461
462
463 static void xen_vcpuop_set_mode(enum clock_event_mode mode,
464                                 struct clock_event_device *evt)
465 {
466         int cpu = smp_processor_id();
467
468         switch (mode) {
469         case CLOCK_EVT_MODE_PERIODIC:
470                 WARN_ON(1);     /* unsupported */
471                 break;
472
473         case CLOCK_EVT_MODE_ONESHOT:
474                 if (HYPERVISOR_vcpu_op(VCPUOP_stop_periodic_timer, cpu, NULL))
475                         BUG();
476                 break;
477
478         case CLOCK_EVT_MODE_UNUSED:
479         case CLOCK_EVT_MODE_SHUTDOWN:
480                 if (HYPERVISOR_vcpu_op(VCPUOP_stop_singleshot_timer, cpu, NULL) ||
481                     HYPERVISOR_vcpu_op(VCPUOP_stop_periodic_timer, cpu, NULL))
482                         BUG();
483                 break;
484         case CLOCK_EVT_MODE_RESUME:
485                 break;
486         }
487 }
488
489 static int xen_vcpuop_set_next_event(unsigned long delta,
490                                      struct clock_event_device *evt)
491 {
492         int cpu = smp_processor_id();
493         struct vcpu_set_singleshot_timer single;
494         int ret;
495
496         WARN_ON(evt->mode != CLOCK_EVT_MODE_ONESHOT);
497
498         single.timeout_abs_ns = get_abs_timeout(delta);
499         single.flags = VCPU_SSHOTTMR_future;
500
501         ret = HYPERVISOR_vcpu_op(VCPUOP_set_singleshot_timer, cpu, &single);
502
503         BUG_ON(ret != 0 && ret != -ETIME);
504
505         return ret;
506 }
507
508 static const struct clock_event_device xen_vcpuop_clockevent = {
509         .name = "xen",
510         .features = CLOCK_EVT_FEAT_ONESHOT,
511
512         .max_delta_ns = 0xffffffff,
513         .min_delta_ns = TIMER_SLOP,
514
515         .mult = 1,
516         .shift = 0,
517         .rating = 500,
518
519         .set_mode = xen_vcpuop_set_mode,
520         .set_next_event = xen_vcpuop_set_next_event,
521 };
522
523 static const struct clock_event_device *xen_clockevent =
524         &xen_timerop_clockevent;
525 static DEFINE_PER_CPU(struct clock_event_device, xen_clock_events);
526
527 static irqreturn_t xen_timer_interrupt(int irq, void *dev_id)
528 {
529         struct clock_event_device *evt = &__get_cpu_var(xen_clock_events);
530         irqreturn_t ret;
531
532         ret = IRQ_NONE;
533         if (evt->event_handler) {
534                 evt->event_handler(evt);
535                 ret = IRQ_HANDLED;
536         }
537
538         do_stolen_accounting();
539
540         return ret;
541 }
542
543 void xen_setup_timer(int cpu)
544 {
545         const char *name;
546         struct clock_event_device *evt;
547         int irq;
548
549         printk(KERN_INFO "installing Xen timer for CPU %d\n", cpu);
550
551         name = kasprintf(GFP_KERNEL, "timer%d", cpu);
552         if (!name)
553                 name = "<timer kasprintf failed>";
554
555         irq = bind_virq_to_irqhandler(VIRQ_TIMER, cpu, xen_timer_interrupt,
556                                       IRQF_DISABLED|IRQF_PERCPU|IRQF_NOBALANCING,
557                                       name, NULL);
558
559         evt = &per_cpu(xen_clock_events, cpu);
560         memcpy(evt, xen_clockevent, sizeof(*evt));
561
562         evt->cpumask = cpumask_of_cpu(cpu);
563         evt->irq = irq;
564
565         setup_runstate_info(cpu);
566 }
567
568 void xen_setup_cpu_clockevents(void)
569 {
570         BUG_ON(preemptible());
571
572         clockevents_register_device(&__get_cpu_var(xen_clock_events));
573 }
574
575 __init void xen_time_init(void)
576 {
577         int cpu = smp_processor_id();
578
579         get_time_values_from_xen();
580
581         clocksource_register(&xen_clocksource);
582
583         if (HYPERVISOR_vcpu_op(VCPUOP_stop_periodic_timer, cpu, NULL) == 0) {
584                 /* Successfully turned off 100Hz tick, so we have the
585                    vcpuop-based timer interface */
586                 printk(KERN_DEBUG "Xen: using vcpuop timer interface\n");
587                 xen_clockevent = &xen_vcpuop_clockevent;
588         }
589
590         /* Set initial system time with full resolution */
591         xen_read_wallclock(&xtime);
592         set_normalized_timespec(&wall_to_monotonic,
593                                 -xtime.tv_sec, -xtime.tv_nsec);
594
595         setup_force_cpu_cap(X86_FEATURE_TSC);
596
597         xen_setup_timer(cpu);
598         xen_setup_cpu_clockevents();
599 }