Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
[linux-2.6] / include / asm-x86 / vmi_time.h
1 /*
2  * VMI Time wrappers
3  *
4  * Copyright (C) 2006, VMware, Inc.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
14  * NON INFRINGEMENT.  See the GNU General Public License for more
15  * details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20  *
21  * Send feedback to dhecht@vmware.com
22  *
23  */
24
25 #ifndef __VMI_TIME_H
26 #define __VMI_TIME_H
27
28 /*
29  * Raw VMI call indices for timer functions
30  */
31 #define VMI_CALL_GetCycleFrequency      66
32 #define VMI_CALL_GetCycleCounter        67
33 #define VMI_CALL_SetAlarm               68
34 #define VMI_CALL_CancelAlarm            69
35 #define VMI_CALL_GetWallclockTime       70
36 #define VMI_CALL_WallclockUpdated       71
37
38 /* Cached VMI timer operations */
39 extern struct vmi_timer_ops {
40         u64 (*get_cycle_frequency)(void);
41         u64 (*get_cycle_counter)(int);
42         u64 (*get_wallclock)(void);
43         int (*wallclock_updated)(void);
44         void (*set_alarm)(u32 flags, u64 expiry, u64 period);
45         void (*cancel_alarm)(u32 flags);
46 } vmi_timer_ops;
47
48 /* Prototypes */
49 extern void __init vmi_time_init(void);
50 extern unsigned long vmi_get_wallclock(void);
51 extern int vmi_set_wallclock(unsigned long now);
52 extern unsigned long long vmi_sched_clock(void);
53 extern unsigned long vmi_cpu_khz(void);
54
55 #ifdef CONFIG_X86_LOCAL_APIC
56 extern void __devinit vmi_time_bsp_init(void);
57 extern void __devinit vmi_time_ap_init(void);
58 #endif
59
60 /*
61  * When run under a hypervisor, a vcpu is always in one of three states:
62  * running, halted, or ready.  The vcpu is in the 'running' state if it
63  * is executing.  When the vcpu executes the halt interface, the vcpu
64  * enters the 'halted' state and remains halted until there is some work
65  * pending for the vcpu (e.g. an alarm expires, host I/O completes on
66  * behalf of virtual I/O).  At this point, the vcpu enters the 'ready'
67  * state (waiting for the hypervisor to reschedule it).  Finally, at any
68  * time when the vcpu is not in the 'running' state nor the 'halted'
69  * state, it is in the 'ready' state.
70  *
71  * Real time is advances while the vcpu is 'running', 'ready', or
72  * 'halted'.  Stolen time is the time in which the vcpu is in the
73  * 'ready' state.  Available time is the remaining time -- the vcpu is
74  * either 'running' or 'halted'.
75  *
76  * All three views of time are accessible through the VMI cycle
77  * counters.
78  */
79
80 /* The cycle counters. */
81 #define VMI_CYCLES_REAL         0
82 #define VMI_CYCLES_AVAILABLE    1
83 #define VMI_CYCLES_STOLEN       2
84
85 /* The alarm interface 'flags' bits */
86 #define VMI_ALARM_COUNTERS      2
87
88 #define VMI_ALARM_COUNTER_MASK  0x000000ff
89
90 #define VMI_ALARM_WIRED_IRQ0    0x00000000
91 #define VMI_ALARM_WIRED_LVTT    0x00010000
92
93 #define VMI_ALARM_IS_ONESHOT    0x00000000
94 #define VMI_ALARM_IS_PERIODIC   0x00000100
95
96 #define CONFIG_VMI_ALARM_HZ     100
97
98 #endif