ioapic.h 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #ifndef __KVM_IO_APIC_H
  2. #define __KVM_IO_APIC_H
  3. #include <linux/kvm_host.h>
  4. #include "iodev.h"
  5. struct kvm;
  6. struct kvm_vcpu;
  7. #define IOAPIC_NUM_PINS KVM_IOAPIC_NUM_PINS
  8. #define IOAPIC_VERSION_ID 0x11 /* IOAPIC version */
  9. #define IOAPIC_EDGE_TRIG 0
  10. #define IOAPIC_LEVEL_TRIG 1
  11. #define IOAPIC_DEFAULT_BASE_ADDRESS 0xfec00000
  12. #define IOAPIC_MEM_LENGTH 0x100
  13. /* Direct registers. */
  14. #define IOAPIC_REG_SELECT 0x00
  15. #define IOAPIC_REG_WINDOW 0x10
  16. #define IOAPIC_REG_EOI 0x40 /* IA64 IOSAPIC only */
  17. /* Indirect registers. */
  18. #define IOAPIC_REG_APIC_ID 0x00 /* x86 IOAPIC only */
  19. #define IOAPIC_REG_VERSION 0x01
  20. #define IOAPIC_REG_ARB_ID 0x02 /* x86 IOAPIC only */
  21. /*ioapic delivery mode*/
  22. #define IOAPIC_FIXED 0x0
  23. #define IOAPIC_LOWEST_PRIORITY 0x1
  24. #define IOAPIC_PMI 0x2
  25. #define IOAPIC_NMI 0x4
  26. #define IOAPIC_INIT 0x5
  27. #define IOAPIC_EXTINT 0x7
  28. struct kvm_ioapic {
  29. u64 base_address;
  30. u32 ioregsel;
  31. u32 id;
  32. u32 irr;
  33. u32 pad;
  34. union ioapic_redir_entry {
  35. u64 bits;
  36. struct {
  37. u8 vector;
  38. u8 delivery_mode:3;
  39. u8 dest_mode:1;
  40. u8 delivery_status:1;
  41. u8 polarity:1;
  42. u8 remote_irr:1;
  43. u8 trig_mode:1;
  44. u8 mask:1;
  45. u8 reserve:7;
  46. u8 reserved[4];
  47. u8 dest_id;
  48. } fields;
  49. } redirtbl[IOAPIC_NUM_PINS];
  50. struct kvm_io_device dev;
  51. struct kvm *kvm;
  52. };
  53. #ifdef DEBUG
  54. #define ASSERT(x) \
  55. do { \
  56. if (!(x)) { \
  57. printk(KERN_EMERG "assertion failed %s: %d: %s\n", \
  58. __FILE__, __LINE__, #x); \
  59. BUG(); \
  60. } \
  61. } while (0)
  62. #else
  63. #define ASSERT(x) do { } while (0)
  64. #endif
  65. static inline struct kvm_ioapic *ioapic_irqchip(struct kvm *kvm)
  66. {
  67. return kvm->arch.vioapic;
  68. }
  69. #ifdef CONFIG_IA64
  70. static inline int irqchip_in_kernel(struct kvm *kvm)
  71. {
  72. return 1;
  73. }
  74. #endif
  75. struct kvm_vcpu *kvm_get_lowest_prio_vcpu(struct kvm *kvm, u8 vector,
  76. unsigned long bitmap);
  77. void kvm_ioapic_update_eoi(struct kvm *kvm, int vector);
  78. int kvm_ioapic_init(struct kvm *kvm);
  79. void kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int level);
  80. void kvm_ioapic_reset(struct kvm_ioapic *ioapic);
  81. #endif