1 /******************************************************************************
2 * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
3 * VA Linux Systems Japan K.K.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 *
19 */
20
21
22 #ifndef __ASM_PARAVIRT_H
23 #define __ASM_PARAVIRT_H
24
25 #ifdef CONFIG_PARAVIRT_GUEST
26
27 #define PARAVIRT_HYPERVISOR_TYPE_DEFAULT 0
28 #define PARAVIRT_HYPERVISOR_TYPE_XEN 1
29
30 #ifndef __ASSEMBLY__
31
32 #include <asm/hw_irq.h>
33 #include <asm/meminit.h>
34
35 /******************************************************************************
36 * general info
37 */
38 struct pv_info {
39 unsigned int kernel_rpl;
40 int paravirt_enabled;
41 const char *name;
42 };
43
44 extern struct pv_info pv_info;
45
paravirt_enabled(void)46 static inline int paravirt_enabled(void)
47 {
48 return pv_info.paravirt_enabled;
49 }
50
get_kernel_rpl(void)51 static inline unsigned int get_kernel_rpl(void)
52 {
53 return pv_info.kernel_rpl;
54 }
55
56 /******************************************************************************
57 * initialization hooks.
58 */
59 struct rsvd_region;
60
61 struct pv_init_ops {
62 void (*banner)(void);
63
64 int (*reserve_memory)(struct rsvd_region *region);
65
66 void (*arch_setup_early)(void);
67 void (*arch_setup_console)(char **cmdline_p);
68 int (*arch_setup_nomca)(void);
69
70 void (*post_smp_prepare_boot_cpu)(void);
71 };
72
73 extern struct pv_init_ops pv_init_ops;
74
paravirt_banner(void)75 static inline void paravirt_banner(void)
76 {
77 if (pv_init_ops.banner)
78 pv_init_ops.banner();
79 }
80
paravirt_reserve_memory(struct rsvd_region * region)81 static inline int paravirt_reserve_memory(struct rsvd_region *region)
82 {
83 if (pv_init_ops.reserve_memory)
84 return pv_init_ops.reserve_memory(region);
85 return 0;
86 }
87
paravirt_arch_setup_early(void)88 static inline void paravirt_arch_setup_early(void)
89 {
90 if (pv_init_ops.arch_setup_early)
91 pv_init_ops.arch_setup_early();
92 }
93
paravirt_arch_setup_console(char ** cmdline_p)94 static inline void paravirt_arch_setup_console(char **cmdline_p)
95 {
96 if (pv_init_ops.arch_setup_console)
97 pv_init_ops.arch_setup_console(cmdline_p);
98 }
99
paravirt_arch_setup_nomca(void)100 static inline int paravirt_arch_setup_nomca(void)
101 {
102 if (pv_init_ops.arch_setup_nomca)
103 return pv_init_ops.arch_setup_nomca();
104 return 0;
105 }
106
paravirt_post_smp_prepare_boot_cpu(void)107 static inline void paravirt_post_smp_prepare_boot_cpu(void)
108 {
109 if (pv_init_ops.post_smp_prepare_boot_cpu)
110 pv_init_ops.post_smp_prepare_boot_cpu();
111 }
112
113 /******************************************************************************
114 * replacement of iosapic operations.
115 */
116
117 struct pv_iosapic_ops {
118 void (*pcat_compat_init)(void);
119
120 struct irq_chip *(*__get_irq_chip)(unsigned long trigger);
121
122 unsigned int (*__read)(char __iomem *iosapic, unsigned int reg);
123 void (*__write)(char __iomem *iosapic, unsigned int reg, u32 val);
124 };
125
126 extern struct pv_iosapic_ops pv_iosapic_ops;
127
128 static inline void
iosapic_pcat_compat_init(void)129 iosapic_pcat_compat_init(void)
130 {
131 if (pv_iosapic_ops.pcat_compat_init)
132 pv_iosapic_ops.pcat_compat_init();
133 }
134
135 static inline struct irq_chip*
iosapic_get_irq_chip(unsigned long trigger)136 iosapic_get_irq_chip(unsigned long trigger)
137 {
138 return pv_iosapic_ops.__get_irq_chip(trigger);
139 }
140
141 static inline unsigned int
__iosapic_read(char __iomem * iosapic,unsigned int reg)142 __iosapic_read(char __iomem *iosapic, unsigned int reg)
143 {
144 return pv_iosapic_ops.__read(iosapic, reg);
145 }
146
147 static inline void
__iosapic_write(char __iomem * iosapic,unsigned int reg,u32 val)148 __iosapic_write(char __iomem *iosapic, unsigned int reg, u32 val)
149 {
150 return pv_iosapic_ops.__write(iosapic, reg, val);
151 }
152
153 /******************************************************************************
154 * replacement of irq operations.
155 */
156
157 struct pv_irq_ops {
158 void (*register_ipi)(void);
159
160 int (*assign_irq_vector)(int irq);
161 void (*free_irq_vector)(int vector);
162
163 void (*register_percpu_irq)(ia64_vector vec,
164 struct irqaction *action);
165
166 void (*resend_irq)(unsigned int vector);
167 };
168
169 extern struct pv_irq_ops pv_irq_ops;
170
171 static inline void
ia64_register_ipi(void)172 ia64_register_ipi(void)
173 {
174 pv_irq_ops.register_ipi();
175 }
176
177 static inline int
assign_irq_vector(int irq)178 assign_irq_vector(int irq)
179 {
180 return pv_irq_ops.assign_irq_vector(irq);
181 }
182
183 static inline void
free_irq_vector(int vector)184 free_irq_vector(int vector)
185 {
186 return pv_irq_ops.free_irq_vector(vector);
187 }
188
189 static inline void
register_percpu_irq(ia64_vector vec,struct irqaction * action)190 register_percpu_irq(ia64_vector vec, struct irqaction *action)
191 {
192 pv_irq_ops.register_percpu_irq(vec, action);
193 }
194
195 static inline void
ia64_resend_irq(unsigned int vector)196 ia64_resend_irq(unsigned int vector)
197 {
198 pv_irq_ops.resend_irq(vector);
199 }
200
201 /******************************************************************************
202 * replacement of time operations.
203 */
204
205 extern struct itc_jitter_data_t itc_jitter_data;
206 extern volatile int time_keeper_id;
207
208 struct pv_time_ops {
209 void (*init_missing_ticks_accounting)(int cpu);
210 int (*do_steal_accounting)(unsigned long *new_itm);
211
212 void (*clocksource_resume)(void);
213 };
214
215 extern struct pv_time_ops pv_time_ops;
216
217 static inline void
paravirt_init_missing_ticks_accounting(int cpu)218 paravirt_init_missing_ticks_accounting(int cpu)
219 {
220 if (pv_time_ops.init_missing_ticks_accounting)
221 pv_time_ops.init_missing_ticks_accounting(cpu);
222 }
223
224 static inline int
paravirt_do_steal_accounting(unsigned long * new_itm)225 paravirt_do_steal_accounting(unsigned long *new_itm)
226 {
227 return pv_time_ops.do_steal_accounting(new_itm);
228 }
229
230 #endif /* !__ASSEMBLY__ */
231
232 #else
233 /* fallback for native case */
234
235 #ifndef __ASSEMBLY__
236
237 #define paravirt_banner() do { } while (0)
238 #define paravirt_reserve_memory(region) 0
239
240 #define paravirt_arch_setup_early() do { } while (0)
241 #define paravirt_arch_setup_console(cmdline_p) do { } while (0)
242 #define paravirt_arch_setup_nomca() 0
243 #define paravirt_post_smp_prepare_boot_cpu() do { } while (0)
244
245 #define paravirt_init_missing_ticks_accounting(cpu) do { } while (0)
246 #define paravirt_do_steal_accounting(new_itm) 0
247
248 #endif /* __ASSEMBLY__ */
249
250
251 #endif /* CONFIG_PARAVIRT_GUEST */
252
253 #endif /* __ASM_PARAVIRT_H */
254