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