Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/virt/kvm/ioapic.h
10818 views
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 kvm_ioapic_redirect_entry redirtbl[IOAPIC_NUM_PINS];
44
unsigned long irq_states[IOAPIC_NUM_PINS];
45
struct kvm_io_device dev;
46
struct kvm *kvm;
47
void (*ack_notifier)(void *opaque, int irq);
48
spinlock_t lock;
49
DECLARE_BITMAP(handled_vectors, 256);
50
};
51
52
#ifdef DEBUG
53
#define ASSERT(x) \
54
do { \
55
if (!(x)) { \
56
printk(KERN_EMERG "assertion failed %s: %d: %s\n", \
57
__FILE__, __LINE__, #x); \
58
BUG(); \
59
} \
60
} while (0)
61
#else
62
#define ASSERT(x) do { } while (0)
63
#endif
64
65
static inline struct kvm_ioapic *ioapic_irqchip(struct kvm *kvm)
66
{
67
return kvm->arch.vioapic;
68
}
69
70
int kvm_apic_match_dest(struct kvm_vcpu *vcpu, struct kvm_lapic *source,
71
int short_hand, int dest, int dest_mode);
72
int kvm_apic_compare_prio(struct kvm_vcpu *vcpu1, struct kvm_vcpu *vcpu2);
73
void kvm_ioapic_update_eoi(struct kvm *kvm, int vector, int trigger_mode);
74
int kvm_ioapic_init(struct kvm *kvm);
75
void kvm_ioapic_destroy(struct kvm *kvm);
76
int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int level);
77
void kvm_ioapic_reset(struct kvm_ioapic *ioapic);
78
int kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src,
79
struct kvm_lapic_irq *irq);
80
int kvm_get_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state);
81
int kvm_set_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state);
82
83
#endif
84
85