5 #ifndef __KVM_ARM_VGIC_H
6 #define __KVM_ARM_VGIC_H
8 #include <linux/bits.h>
10 #include <linux/irqreturn.h>
11 #include <linux/kref.h>
12 #include <linux/mutex.h>
13 #include <linux/spinlock.h>
14 #include <linux/static_key.h>
15 #include <linux/types.h>
17 #include <linux/list.h>
18 #include <linux/jump_label.h>
20 #include <linux/irqchip/arm-gic-v4.h>
22 #define VGIC_V3_MAX_CPUS 512
23 #define VGIC_V2_MAX_CPUS 8
24 #define VGIC_NR_IRQS_LEGACY 256
25 #define VGIC_NR_SGIS 16
26 #define VGIC_NR_PPIS 16
27 #define VGIC_NR_PRIVATE_IRQS (VGIC_NR_SGIS + VGIC_NR_PPIS)
28 #define VGIC_MAX_PRIVATE (VGIC_NR_PRIVATE_IRQS - 1)
29 #define VGIC_MAX_SPI 1019
30 #define VGIC_MAX_RESERVED 1023
31 #define VGIC_MIN_LPI 8192
32 #define KVM_IRQCHIP_NUM_PINS (1020 - 32)
34 #define irq_is_ppi(irq) ((irq) >= VGIC_NR_SGIS && (irq) < VGIC_NR_PRIVATE_IRQS)
35 #define irq_is_spi(irq) ((irq) >= VGIC_NR_PRIVATE_IRQS && \
36 (irq) <= VGIC_MAX_SPI)
88 #define VGIC_V2_MAX_LRS (1 << 6)
89 #define VGIC_V3_MAX_LRS 16
90 #define VGIC_V3_LR_INDEX(lr) (VGIC_V3_MAX_LRS - 1 - lr)
107 #define VGIC_IRQ_SW_RESAMPLE BIT(0)
221 struct list_head
list;
234 #define KVM_VGIC_IMP_REV_2 2
235 #define KVM_VGIC_IMP_REV_3 3
236 #define KVM_VGIC_IMP_REV_LATEST KVM_VGIC_IMP_REV_3
379 unsigned int intid,
bool level,
void *owner);
381 u32 vintid,
struct irq_ops *ops);
392 #define irqchip_in_kernel(k) (!!((k)->arch.vgic.in_kernel))
393 #define vgic_initialized(k) ((k)->arch.vgic.initialized)
394 #define vgic_ready(k) ((k)->arch.vgic.ready)
395 #define vgic_valid_spi(k, i) (((i) >= VGIC_NR_PRIVATE_IRQS) && \
396 ((i) < (k)->arch.vgic.nr_spis + VGIC_NR_PRIVATE_IRQS))
424 struct kvm_kernel_irq_routing_entry;
427 struct kvm_kernel_irq_routing_entry *irq_entry);
430 struct kvm_kernel_irq_routing_entry *irq_entry);
void vgic_v4_commit(struct kvm_vcpu *vcpu)
void kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu)
int kvm_vgic_get_map(struct kvm_vcpu *vcpu, unsigned int vintid)
bool kvm_vgic_map_is_active(struct kvm_vcpu *vcpu, unsigned int vintid)
bool kvm_vcpu_has_pending_irqs(struct kvm_vcpu *vcpu)
void kvm_vgic_cpu_down(void)
int kvm_vgic_v4_unset_forwarding(struct kvm *kvm, int irq, struct kvm_kernel_irq_routing_entry *irq_entry)
int kvm_vgic_vcpu_pending_irq(struct kvm_vcpu *vcpu)
void kvm_vgic_reset_mapped_irq(struct kvm_vcpu *vcpu, u32 vintid)
static int kvm_vgic_get_max_vcpus(void)
int kvm_vgic_unmap_phys_irq(struct kvm_vcpu *vcpu, unsigned int vintid)
int kvm_vgic_create(struct kvm *kvm, u32 type)
struct vgic_global kvm_vgic_global_state
void kvm_vgic_load(struct kvm_vcpu *vcpu)
void kvm_vgic_cpu_up(void)
void kvm_vgic_flush_hwstate(struct kvm_vcpu *vcpu)
struct static_key_false vgic_v3_cpuif_trap
void kvm_vgic_vmcr_sync(struct kvm_vcpu *vcpu)
void kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu)
int kvm_set_legacy_vgic_v2_addr(struct kvm *kvm, struct kvm_arm_device_addr *dev_addr)
void vgic_v3_dispatch_sgi(struct kvm_vcpu *vcpu, u64 reg, bool allow_group1)
int kvm_vgic_map_resources(struct kvm *kvm)
int kvm_vgic_inject_irq(struct kvm *kvm, struct kvm_vcpu *vcpu, unsigned int intid, bool level, void *owner)
struct static_key_false vgic_v2_cpuif_trap
int kvm_vgic_v4_set_forwarding(struct kvm *kvm, int irq, struct kvm_kernel_irq_routing_entry *irq_entry)
void kvm_vgic_put(struct kvm_vcpu *vcpu)
int kvm_vgic_set_owner(struct kvm_vcpu *vcpu, unsigned int intid, void *owner)
#define VGIC_IRQ_SW_RESAMPLE
int kvm_vgic_map_phys_irq(struct kvm_vcpu *vcpu, unsigned int host_irq, u32 vintid, struct irq_ops *ops)
int kvm_vgic_setup_default_irq_routing(struct kvm *kvm)
void kvm_vgic_early_init(struct kvm *kvm)
int kvm_vgic_hyp_init(void)
int vgic_v4_load(struct kvm_vcpu *vcpu)
int kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu)
static bool vgic_irq_needs_resampling(struct vgic_irq *irq)
#define VGIC_NR_PRIVATE_IRQS
int vgic_v4_put(struct kvm_vcpu *vcpu)
void kvm_vgic_init_cpu_hardware(void)
void kvm_vgic_destroy(struct kvm *kvm)
bool(* get_input_level)(int vintid)
struct vgic_io_device rd_iodev
struct vgic_redist_region * rdreg
struct vgic_irq private_irqs[VGIC_NR_PRIVATE_IRQS]
raw_spinlock_t ap_list_lock
struct vgic_v3_cpu_if vgic_v3
struct vgic_v2_cpu_if vgic_v2
struct list_head ap_list_head
struct list_head rd_regions
struct vgic_io_device dist_iodev
struct list_head lpi_translation_cache
struct list_head lpi_list_head
bool v2_groups_user_writable
bool table_write_in_progress
raw_spinlock_t lpi_list_lock
struct vgic_state_iter * iter
void __iomem * vcpu_base_va
struct static_key_false gicv3_cpuif
void __iomem * vcpu_hyp_va
void __iomem * vctrl_base
struct kvm_vcpu * redist_vcpu
const struct vgic_register_region * regions
enum iodev_type iodev_type
struct list_head lpi_list
struct kvm_vcpu * target_vcpu
enum vgic_irq_config config
struct vgic_io_device iodev
struct list_head collection_list
struct list_head device_list
u32 vgic_lr[VGIC_V2_MAX_LRS]
u64 vgic_lr[VGIC_V3_MAX_LRS]