6 #include <linux/irqchip/arm-gic.h>
8 #include <linux/kvm_host.h>
10 #include <asm/kvm_mmu.h>
18 writel_relaxed(val,
base + GICH_LR0 + (lr * 4));
38 return !(lr_val & GICH_LR_STATE) && (lr_val & GICH_LR_EOI) &&
39 !(lr_val & GICH_LR_HW);
61 u32 cpuid, intid = val & GICH_LR_VIRTUALID;
66 cpuid = val & GICH_LR_PHYSID_CPUID;
67 cpuid >>= GICH_LR_PHYSID_CPUID_SHIFT;
72 kvm_notify_acked_irq(
vcpu->kvm, 0,
80 deactivated = irq->
active && !(val & GICH_LR_ACTIVE_BIT);
81 irq->
active = !!(val & GICH_LR_ACTIVE_BIT);
88 (val & GICH_LR_PENDING_BIT)) {
92 irq->
source |= (1 << cpuid);
124 u32 val = irq->
intid;
125 bool allow_pending =
true;
128 val |= GICH_LR_ACTIVE_BIT;
132 allow_pending =
false;
138 val |= GICH_LR_GROUP1;
142 val |= irq->
hwintid << GICH_LR_PHYSID_CPUID_SHIFT;
149 allow_pending =
false;
159 allow_pending =
false;
164 val |= GICH_LR_PENDING_BIT;
170 u32 src = ffs(irq->
source);
172 if (WARN_RATELIMIT(!src,
"No SGI source for INTID %d\n",
176 val |= (src - 1) << GICH_LR_PHYSID_CPUID_SHIFT;
177 irq->
source &= ~(1 << (src - 1));
195 val |= (irq->
priority >> 3) << GICH_LR_PRIORITY_SHIFT;
197 vcpu->arch.vgic_cpu.vgic_v2.vgic_lr[lr] = val;
202 vcpu->arch.vgic_cpu.vgic_v2.vgic_lr[lr] = 0;
210 vmcr = (vmcrp->
grpen0 << GICH_VMCR_ENABLE_GRP0_SHIFT) &
211 GICH_VMCR_ENABLE_GRP0_MASK;
212 vmcr |= (vmcrp->
grpen1 << GICH_VMCR_ENABLE_GRP1_SHIFT) &
213 GICH_VMCR_ENABLE_GRP1_MASK;
214 vmcr |= (vmcrp->
ackctl << GICH_VMCR_ACK_CTL_SHIFT) &
215 GICH_VMCR_ACK_CTL_MASK;
216 vmcr |= (vmcrp->
fiqen << GICH_VMCR_FIQ_EN_SHIFT) &
217 GICH_VMCR_FIQ_EN_MASK;
218 vmcr |= (vmcrp->
cbpr << GICH_VMCR_CBPR_SHIFT) &
220 vmcr |= (vmcrp->
eoim << GICH_VMCR_EOI_MODE_SHIFT) &
221 GICH_VMCR_EOI_MODE_MASK;
222 vmcr |= (vmcrp->
abpr << GICH_VMCR_ALIAS_BINPOINT_SHIFT) &
223 GICH_VMCR_ALIAS_BINPOINT_MASK;
224 vmcr |= (vmcrp->
bpr << GICH_VMCR_BINPOINT_SHIFT) &
225 GICH_VMCR_BINPOINT_MASK;
226 vmcr |= ((vmcrp->
pmr >> GICV_PMR_PRIORITY_SHIFT) <<
227 GICH_VMCR_PRIMASK_SHIFT) & GICH_VMCR_PRIMASK_MASK;
239 vmcrp->
grpen0 = (vmcr & GICH_VMCR_ENABLE_GRP0_MASK) >>
240 GICH_VMCR_ENABLE_GRP0_SHIFT;
241 vmcrp->
grpen1 = (vmcr & GICH_VMCR_ENABLE_GRP1_MASK) >>
242 GICH_VMCR_ENABLE_GRP1_SHIFT;
243 vmcrp->
ackctl = (vmcr & GICH_VMCR_ACK_CTL_MASK) >>
244 GICH_VMCR_ACK_CTL_SHIFT;
245 vmcrp->
fiqen = (vmcr & GICH_VMCR_FIQ_EN_MASK) >>
246 GICH_VMCR_FIQ_EN_SHIFT;
247 vmcrp->
cbpr = (vmcr & GICH_VMCR_CBPR_MASK) >>
248 GICH_VMCR_CBPR_SHIFT;
249 vmcrp->
eoim = (vmcr & GICH_VMCR_EOI_MODE_MASK) >>
250 GICH_VMCR_EOI_MODE_SHIFT;
252 vmcrp->
abpr = (vmcr & GICH_VMCR_ALIAS_BINPOINT_MASK) >>
253 GICH_VMCR_ALIAS_BINPOINT_SHIFT;
254 vmcrp->
bpr = (vmcr & GICH_VMCR_BINPOINT_MASK) >>
255 GICH_VMCR_BINPOINT_SHIFT;
256 vmcrp->
pmr = ((vmcr & GICH_VMCR_PRIMASK_MASK) >>
257 GICH_VMCR_PRIMASK_SHIFT) << GICV_PMR_PRIORITY_SHIFT;
267 vcpu->arch.vgic_cpu.vgic_v2.vgic_vmcr = 0;
270 vcpu->arch.vgic_cpu.vgic_v2.vgic_hcr = GICH_HCR_EN;
276 if (dist_base + KVM_VGIC_V2_DIST_SIZE < dist_base)
278 if (cpu_base + KVM_VGIC_V2_CPU_SIZE < cpu_base)
281 if (dist_base + KVM_VGIC_V2_DIST_SIZE <= cpu_base)
283 if (cpu_base + KVM_VGIC_V2_CPU_SIZE <= dist_base)
291 struct vgic_dist *dist = &kvm->arch.vgic;
296 kvm_debug(
"Need to set vgic cpu and dist addresses first\n");
301 kvm_debug(
"VGIC CPU and dist frames overlap\n");
311 kvm_err(
"Unable to initialize VGIC dynamic data structures\n");
318 KVM_VGIC_V2_CPU_SIZE,
true);
320 kvm_err(
"Unable to remap VGIC CPU to VCPU\n");
342 if (is_protected_kvm_enabled()) {
343 kvm_err(
"GICv2 not supported in protected mode\n");
347 if (!info->vctrl.start) {
348 kvm_err(
"GICH not present in the firmware table\n");
352 if (!PAGE_ALIGNED(info->vcpu.start) ||
353 !PAGE_ALIGNED(resource_size(&info->vcpu))) {
354 kvm_info(
"GICV region size/alignment is unsafe, using trapping (reduced performance)\n");
357 resource_size(&info->vcpu),
361 kvm_err(
"Cannot map GICV into hyp\n");
369 resource_size(&info->vctrl),
373 kvm_err(
"Cannot map VCTRL into hyp\n");
382 kvm_err(
"Cannot register GICv2 KVM device\n");
391 kvm_debug(
"vgic-v2@%llx\n", info->vctrl.start);
410 elrsr = readl_relaxed(
base + GICH_ELRSR0);
412 elrsr |= ((u64)readl_relaxed(
base + GICH_ELRSR1)) << 32;
415 if (elrsr & (1UL << i))
416 cpu_if->
vgic_lr[i] &= ~GICH_LR_STATE;
418 cpu_if->
vgic_lr[i] = readl_relaxed(
base + GICH_LR0 + (i * 4));
420 writel_relaxed(0,
base + GICH_LR0 + (i * 4));
427 u64
used_lrs = vcpu->arch.vgic_cpu.vgic_v2.used_lrs;
434 writel_relaxed(0,
base + GICH_HCR);
451 writel_relaxed(cpu_if->
vgic_lr[i],
452 base + GICH_LR0 + (i * 4));
struct vgic_global kvm_vgic_global_state
struct static_key_false vgic_v2_cpuif_trap
static bool vgic_irq_needs_resampling(struct vgic_irq *irq)
#define vgic_valid_spi(k, i)
#define VGIC_NR_PRIVATE_IRQS
static unsigned long base
int kvm_phys_addr_ioremap(struct kvm *kvm, phys_addr_t guest_ipa, phys_addr_t pa, unsigned long size, bool writable)
int create_hyp_io_mappings(phys_addr_t phys_addr, size_t size, void __iomem **kaddr, void __iomem **haddr)
struct vgic_v2_cpu_if vgic_v2
void __iomem * vcpu_base_va
void __iomem * vcpu_hyp_va
void __iomem * vctrl_base
enum vgic_irq_config config
u32 vgic_lr[VGIC_V2_MAX_LRS]
int vgic_init(struct kvm *kvm)
static struct gic_kvm_info * gic_kvm_info
int kvm_register_vgic_device(unsigned long type)
void vgic_v2_set_underflow(struct kvm_vcpu *vcpu)
void vgic_v2_clear_lr(struct kvm_vcpu *vcpu, int lr)
void vgic_v2_init_lrs(void)
static bool vgic_v2_check_base(gpa_t dist_base, gpa_t cpu_base)
void vgic_v2_enable(struct kvm_vcpu *vcpu)
DEFINE_STATIC_KEY_FALSE(vgic_v2_cpuif_trap)
void vgic_v2_set_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcrp)
void vgic_v2_fold_lr_state(struct kvm_vcpu *vcpu)
void vgic_v2_put(struct kvm_vcpu *vcpu)
void vgic_v2_load(struct kvm_vcpu *vcpu)
void vgic_v2_populate_lr(struct kvm_vcpu *vcpu, struct vgic_irq *irq, int lr)
int vgic_v2_probe(const struct gic_kvm_info *info)
void vgic_v2_get_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcrp)
void vgic_v2_vmcr_sync(struct kvm_vcpu *vcpu)
void vgic_v2_restore_state(struct kvm_vcpu *vcpu)
void vgic_v2_save_state(struct kvm_vcpu *vcpu)
int vgic_v2_map_resources(struct kvm *kvm)
static void save_lrs(struct kvm_vcpu *vcpu, void __iomem *base)
static void vgic_v2_write_lr(int lr, u32 val)
static bool lr_signals_eoi_mi(u32 lr_val)
void vgic_irq_handle_resampling(struct vgic_irq *irq, bool lr_deactivated, bool lr_pending)
struct vgic_irq * vgic_get_irq(struct kvm *kvm, struct kvm_vcpu *vcpu, u32 intid)
void vgic_put_irq(struct kvm *kvm, struct vgic_irq *irq)
static bool vgic_irq_is_multi_sgi(struct vgic_irq *irq)
#define DEBUG_SPINLOCK_BUG_ON(p)
static bool irq_is_pending(struct vgic_irq *irq)
#define vgic_irq_is_sgi(intid)
static bool vgic_irq_is_mapped_level(struct vgic_irq *irq)
#define IS_VGIC_ADDR_UNDEF(_x)