1
2
3
4
5#ifndef __KVM_ARM_VGIC_H
6#define __KVM_ARM_VGIC_H
7
8#include <linux/kernel.h>
9#include <linux/kvm.h>
10#include <linux/irqreturn.h>
11#include <linux/spinlock.h>
12#include <linux/static_key.h>
13#include <linux/types.h>
14#include <kvm/iodev.h>
15#include <linux/list.h>
16#include <linux/jump_label.h>
17
18#include <linux/irqchip/arm-gic-v4.h>
19
20#define VGIC_V3_MAX_CPUS 512
21#define VGIC_V2_MAX_CPUS 8
22#define VGIC_NR_IRQS_LEGACY 256
23#define VGIC_NR_SGIS 16
24#define VGIC_NR_PPIS 16
25#define VGIC_NR_PRIVATE_IRQS (VGIC_NR_SGIS + VGIC_NR_PPIS)
26#define VGIC_MAX_PRIVATE (VGIC_NR_PRIVATE_IRQS - 1)
27#define VGIC_MAX_SPI 1019
28#define VGIC_MAX_RESERVED 1023
29#define VGIC_MIN_LPI 8192
30#define KVM_IRQCHIP_NUM_PINS (1020 - 32)
31
32#define irq_is_ppi(irq) ((irq) >= VGIC_NR_SGIS && (irq) < VGIC_NR_PRIVATE_IRQS)
33#define irq_is_spi(irq) ((irq) >= VGIC_NR_PRIVATE_IRQS && \
34 (irq) <= VGIC_MAX_SPI)
35
36enum vgic_type {
37 VGIC_V2,
38 VGIC_V3,
39};
40
41
42struct vgic_global {
43
44 enum vgic_type type;
45
46
47 phys_addr_t vcpu_base;
48
49
50 void __iomem *vcpu_base_va;
51
52 void __iomem *vcpu_hyp_va;
53
54
55 void __iomem *vctrl_base;
56
57 void __iomem *vctrl_hyp;
58
59
60 int nr_lr;
61
62
63 unsigned int maint_irq;
64
65
66 int max_gic_vcpus;
67
68
69 bool can_emulate_gicv2;
70
71
72 bool has_gicv4;
73 bool has_gicv4_1;
74
75
76 struct static_key_false gicv3_cpuif;
77
78 u32 ich_vtr_el2;
79};
80
81extern struct vgic_global kvm_vgic_global_state;
82
83#define VGIC_V2_MAX_LRS (1 << 6)
84#define VGIC_V3_MAX_LRS 16
85#define VGIC_V3_LR_INDEX(lr) (VGIC_V3_MAX_LRS - 1 - lr)
86
87enum vgic_irq_config {
88 VGIC_CONFIG_EDGE = 0,
89 VGIC_CONFIG_LEVEL
90};
91
92struct vgic_irq {
93 raw_spinlock_t irq_lock;
94 struct list_head lpi_list;
95 struct list_head ap_list;
96
97 struct kvm_vcpu *vcpu;
98
99
100
101
102 struct kvm_vcpu *target_vcpu;
103
104
105
106
107
108 u32 intid;
109 bool line_level;
110 bool pending_latch;
111
112
113 bool active;
114 bool enabled;
115 bool hw;
116 struct kref refcount;
117 u32 hwintid;
118 unsigned int host_irq;
119 union {
120 u8 targets;
121 u32 mpidr;
122 };
123 u8 source;
124 u8 active_source;
125 u8 priority;
126 u8 group;
127 enum vgic_irq_config config;
128
129
130
131
132
133
134
135
136
137
138 bool (*get_input_level)(int vintid);
139
140 void *owner;
141
142};
143
144struct vgic_register_region;
145struct vgic_its;
146
147enum iodev_type {
148 IODEV_CPUIF,
149 IODEV_DIST,
150 IODEV_REDIST,
151 IODEV_ITS
152};
153
154struct vgic_io_device {
155 gpa_t base_addr;
156 union {
157 struct kvm_vcpu *redist_vcpu;
158 struct vgic_its *its;
159 };
160 const struct vgic_register_region *regions;
161 enum iodev_type iodev_type;
162 int nr_regions;
163 struct kvm_io_device dev;
164};
165
166struct vgic_its {
167
168 gpa_t vgic_its_base;
169
170 bool enabled;
171 struct vgic_io_device iodev;
172 struct kvm_device *dev;
173
174
175 u64 baser_device_table;
176 u64 baser_coll_table;
177
178
179 struct mutex cmd_lock;
180 u64 cbaser;
181 u32 creadr;
182 u32 cwriter;
183
184
185 u32 abi_rev;
186
187
188 struct mutex its_lock;
189 struct list_head device_list;
190 struct list_head collection_list;
191};
192
193struct vgic_state_iter;
194
195struct vgic_redist_region {
196 u32 index;
197 gpa_t base;
198 u32 count;
199 u32 free_index;
200 struct list_head list;
201};
202
203struct vgic_dist {
204 bool in_kernel;
205 bool ready;
206 bool initialized;
207
208
209 u32 vgic_model;
210
211
212 u32 implementation_rev;
213
214
215 bool v2_groups_user_writable;
216
217
218 bool msis_require_devid;
219
220 int nr_spis;
221
222
223 gpa_t vgic_dist_base;
224 union {
225
226 gpa_t vgic_cpu_base;
227
228 struct list_head rd_regions;
229 };
230
231
232 bool enabled;
233
234
235 bool nassgireq;
236
237 struct vgic_irq *spis;
238
239 struct vgic_io_device dist_iodev;
240
241 bool has_its;
242
243
244
245
246
247
248
249 u64 propbaser;
250
251
252 raw_spinlock_t lpi_list_lock;
253 struct list_head lpi_list_head;
254 int lpi_list_count;
255
256
257 struct list_head lpi_translation_cache;
258
259
260 struct vgic_state_iter *iter;
261
262
263
264
265
266
267
268
269 struct its_vm its_vm;
270};
271
272struct vgic_v2_cpu_if {
273 u32 vgic_hcr;
274 u32 vgic_vmcr;
275 u32 vgic_apr;
276 u32 vgic_lr[VGIC_V2_MAX_LRS];
277
278 unsigned int used_lrs;
279};
280
281struct vgic_v3_cpu_if {
282 u32 vgic_hcr;
283 u32 vgic_vmcr;
284 u32 vgic_sre;
285 u32 vgic_ap0r[4];
286 u32 vgic_ap1r[4];
287 u64 vgic_lr[VGIC_V3_MAX_LRS];
288
289
290
291
292
293
294
295 struct its_vpe its_vpe;
296
297 unsigned int used_lrs;
298};
299
300struct vgic_cpu {
301
302 union {
303 struct vgic_v2_cpu_if vgic_v2;
304 struct vgic_v3_cpu_if vgic_v3;
305 };
306
307 struct vgic_irq private_irqs[VGIC_NR_PRIVATE_IRQS];
308
309 raw_spinlock_t ap_list_lock;
310
311
312
313
314
315
316
317 struct list_head ap_list_head;
318
319
320
321
322
323 struct vgic_io_device rd_iodev;
324 struct vgic_redist_region *rdreg;
325
326
327 u64 pendbaser;
328
329 bool lpis_enabled;
330
331
332 u32 num_pri_bits;
333
334
335 u32 num_id_bits;
336};
337
338extern struct static_key_false vgic_v2_cpuif_trap;
339extern struct static_key_false vgic_v3_cpuif_trap;
340
341int kvm_vgic_addr(struct kvm *kvm, unsigned long type, u64 *addr, bool write);
342void kvm_vgic_early_init(struct kvm *kvm);
343int kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu);
344int kvm_vgic_create(struct kvm *kvm, u32 type);
345void kvm_vgic_destroy(struct kvm *kvm);
346void kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu);
347int kvm_vgic_map_resources(struct kvm *kvm);
348int kvm_vgic_hyp_init(void);
349void kvm_vgic_init_cpu_hardware(void);
350
351int kvm_vgic_inject_irq(struct kvm *kvm, int cpuid, unsigned int intid,
352 bool level, void *owner);
353int kvm_vgic_map_phys_irq(struct kvm_vcpu *vcpu, unsigned int host_irq,
354 u32 vintid, bool (*get_input_level)(int vindid));
355int kvm_vgic_unmap_phys_irq(struct kvm_vcpu *vcpu, unsigned int vintid);
356bool kvm_vgic_map_is_active(struct kvm_vcpu *vcpu, unsigned int vintid);
357
358int kvm_vgic_vcpu_pending_irq(struct kvm_vcpu *vcpu);
359
360void kvm_vgic_load(struct kvm_vcpu *vcpu);
361void kvm_vgic_put(struct kvm_vcpu *vcpu);
362void kvm_vgic_vmcr_sync(struct kvm_vcpu *vcpu);
363
364#define irqchip_in_kernel(k) (!!((k)->arch.vgic.in_kernel))
365#define vgic_initialized(k) ((k)->arch.vgic.initialized)
366#define vgic_ready(k) ((k)->arch.vgic.ready)
367#define vgic_valid_spi(k, i) (((i) >= VGIC_NR_PRIVATE_IRQS) && \
368 ((i) < (k)->arch.vgic.nr_spis + VGIC_NR_PRIVATE_IRQS))
369
370bool kvm_vcpu_has_pending_irqs(struct kvm_vcpu *vcpu);
371void kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu);
372void kvm_vgic_flush_hwstate(struct kvm_vcpu *vcpu);
373void kvm_vgic_reset_mapped_irq(struct kvm_vcpu *vcpu, u32 vintid);
374
375void vgic_v3_dispatch_sgi(struct kvm_vcpu *vcpu, u64 reg, bool allow_group1);
376
377
378
379
380
381
382
383static inline int kvm_vgic_get_max_vcpus(void)
384{
385 return kvm_vgic_global_state.max_gic_vcpus;
386}
387
388
389
390
391
392int kvm_vgic_setup_default_irq_routing(struct kvm *kvm);
393
394int kvm_vgic_set_owner(struct kvm_vcpu *vcpu, unsigned int intid, void *owner);
395
396struct kvm_kernel_irq_routing_entry;
397
398int kvm_vgic_v4_set_forwarding(struct kvm *kvm, int irq,
399 struct kvm_kernel_irq_routing_entry *irq_entry);
400
401int kvm_vgic_v4_unset_forwarding(struct kvm *kvm, int irq,
402 struct kvm_kernel_irq_routing_entry *irq_entry);
403
404int vgic_v4_load(struct kvm_vcpu *vcpu);
405int vgic_v4_put(struct kvm_vcpu *vcpu, bool need_db);
406
407#endif
408