Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/x86/kvm/irq.h
26424 views
1
/* SPDX-License-Identifier: GPL-2.0-only */
2
/*
3
* irq.h: in kernel interrupt controller related definitions
4
* Copyright (c) 2007, Intel Corporation.
5
*
6
* Authors:
7
* Yaozu (Eddie) Dong <[email protected]>
8
*/
9
10
#ifndef __IRQ_H
11
#define __IRQ_H
12
13
#include <linux/mm_types.h>
14
#include <linux/hrtimer.h>
15
#include <linux/kvm_host.h>
16
#include <linux/spinlock.h>
17
18
#include <kvm/iodev.h>
19
#include "lapic.h"
20
21
#ifdef CONFIG_KVM_IOAPIC
22
23
#define PIC_NUM_PINS 16
24
#define SELECT_PIC(irq) \
25
((irq) < 8 ? KVM_IRQCHIP_PIC_MASTER : KVM_IRQCHIP_PIC_SLAVE)
26
27
struct kvm;
28
struct kvm_vcpu;
29
30
struct kvm_kpic_state {
31
u8 last_irr; /* edge detection */
32
u8 irr; /* interrupt request register */
33
u8 imr; /* interrupt mask register */
34
u8 isr; /* interrupt service register */
35
u8 priority_add; /* highest irq priority */
36
u8 irq_base;
37
u8 read_reg_select;
38
u8 poll;
39
u8 special_mask;
40
u8 init_state;
41
u8 auto_eoi;
42
u8 rotate_on_auto_eoi;
43
u8 special_fully_nested_mode;
44
u8 init4; /* true if 4 byte init */
45
u8 elcr; /* PIIX edge/trigger selection */
46
u8 elcr_mask;
47
u8 isr_ack; /* interrupt ack detection */
48
struct kvm_pic *pics_state;
49
};
50
51
struct kvm_pic {
52
spinlock_t lock;
53
bool wakeup_needed;
54
unsigned pending_acks;
55
struct kvm *kvm;
56
struct kvm_kpic_state pics[2]; /* 0 is master pic, 1 is slave pic */
57
int output; /* intr from master PIC */
58
struct kvm_io_device dev_master;
59
struct kvm_io_device dev_slave;
60
struct kvm_io_device dev_elcr;
61
unsigned long irq_states[PIC_NUM_PINS];
62
};
63
64
int kvm_pic_init(struct kvm *kvm);
65
void kvm_pic_destroy(struct kvm *kvm);
66
int kvm_pic_read_irq(struct kvm *kvm);
67
void kvm_pic_update_irq(struct kvm_pic *s);
68
int kvm_pic_set_irq(struct kvm_kernel_irq_routing_entry *e, struct kvm *kvm,
69
int irq_source_id, int level, bool line_status);
70
71
int kvm_setup_default_ioapic_and_pic_routing(struct kvm *kvm);
72
73
int kvm_vm_ioctl_get_irqchip(struct kvm *kvm, struct kvm_irqchip *chip);
74
int kvm_vm_ioctl_set_irqchip(struct kvm *kvm, struct kvm_irqchip *chip);
75
76
static inline int irqchip_full(struct kvm *kvm)
77
{
78
int mode = kvm->arch.irqchip_mode;
79
80
/* Matches smp_wmb() when setting irqchip_mode */
81
smp_rmb();
82
return mode == KVM_IRQCHIP_KERNEL;
83
}
84
#else /* CONFIG_KVM_IOAPIC */
85
static __always_inline int irqchip_full(struct kvm *kvm)
86
{
87
return false;
88
}
89
#endif
90
91
static inline int pic_in_kernel(struct kvm *kvm)
92
{
93
return irqchip_full(kvm);
94
}
95
96
97
static inline int irqchip_split(struct kvm *kvm)
98
{
99
int mode = kvm->arch.irqchip_mode;
100
101
/* Matches smp_wmb() when setting irqchip_mode */
102
smp_rmb();
103
return mode == KVM_IRQCHIP_SPLIT;
104
}
105
106
static inline int irqchip_in_kernel(struct kvm *kvm)
107
{
108
int mode = kvm->arch.irqchip_mode;
109
110
/* Matches smp_wmb() when setting irqchip_mode */
111
smp_rmb();
112
return mode != KVM_IRQCHIP_NONE;
113
}
114
115
void kvm_inject_pending_timer_irqs(struct kvm_vcpu *vcpu);
116
void kvm_inject_apic_timer_irqs(struct kvm_vcpu *vcpu);
117
void kvm_apic_nmi_wd_deliver(struct kvm_vcpu *vcpu);
118
void __kvm_migrate_apic_timer(struct kvm_vcpu *vcpu);
119
void __kvm_migrate_pit_timer(struct kvm_vcpu *vcpu);
120
void __kvm_migrate_timers(struct kvm_vcpu *vcpu);
121
122
int apic_has_pending_timer(struct kvm_vcpu *vcpu);
123
124
int kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src,
125
struct kvm_lapic_irq *irq,
126
struct dest_map *dest_map);
127
128
#endif
129
130