home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / ia64 / include / asm / paravirt.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  5.8 KB  |  254 lines

  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.  
  46. static inline int paravirt_enabled(void)
  47. {
  48.     return pv_info.paravirt_enabled;
  49. }
  50.  
  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.  
  75. static inline void paravirt_banner(void)
  76. {
  77.     if (pv_init_ops.banner)
  78.         pv_init_ops.banner();
  79. }
  80.  
  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.  
  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.  
  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.  
  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.  
  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
  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*
  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
  142. __iosapic_read(char __iomem *iosapic, unsigned int reg)
  143. {
  144.     return pv_iosapic_ops.__read(iosapic, reg);
  145. }
  146.  
  147. static inline void
  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
  172. ia64_register_ipi(void)
  173. {
  174.     pv_irq_ops.register_ipi();
  175. }
  176.  
  177. static inline int
  178. assign_irq_vector(int irq)
  179. {
  180.     return pv_irq_ops.assign_irq_vector(irq);
  181. }
  182.  
  183. static inline void
  184. free_irq_vector(int vector)
  185. {
  186.     return pv_irq_ops.free_irq_vector(vector);
  187. }
  188.  
  189. static inline void
  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
  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
  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
  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.