forked from luck/tmp_suning_uos_patched
KVM: arm/arm64: vgic: Signal IRQs using their configured group
Now when we have a group configuration on the struct IRQ, use this state when populating the LR and signaling interrupts as either group 0 or group 1 to the VM. Depending on the model of the emulated GIC, and the guest's configuration of the VMCR, interrupts may be signaled as IRQs or FIQs to the VM. Reviewed-by: Andrew Jones <drjones@redhat.com> Signed-off-by: Christoffer Dall <christoffer.dall@arm.com> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
This commit is contained in:
parent
8df3c8f33f
commit
8732209905
|
@ -104,6 +104,7 @@
|
||||||
#define GICH_LR_PENDING_BIT (1 << 28)
|
#define GICH_LR_PENDING_BIT (1 << 28)
|
||||||
#define GICH_LR_ACTIVE_BIT (1 << 29)
|
#define GICH_LR_ACTIVE_BIT (1 << 29)
|
||||||
#define GICH_LR_EOI (1 << 19)
|
#define GICH_LR_EOI (1 << 19)
|
||||||
|
#define GICH_LR_GROUP1 (1 << 30)
|
||||||
#define GICH_LR_HW (1 << 31)
|
#define GICH_LR_HW (1 << 31)
|
||||||
|
|
||||||
#define GICH_VMCR_ENABLE_GRP0_SHIFT 0
|
#define GICH_VMCR_ENABLE_GRP0_SHIFT 0
|
||||||
|
|
|
@ -159,6 +159,9 @@ void vgic_v2_populate_lr(struct kvm_vcpu *vcpu, struct vgic_irq *irq, int lr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (irq->group)
|
||||||
|
val |= GICH_LR_GROUP1;
|
||||||
|
|
||||||
if (irq->hw) {
|
if (irq->hw) {
|
||||||
val |= GICH_LR_HW;
|
val |= GICH_LR_HW;
|
||||||
val |= irq->hwintid << GICH_LR_PHYSID_CPUID_SHIFT;
|
val |= irq->hwintid << GICH_LR_PHYSID_CPUID_SHIFT;
|
||||||
|
|
|
@ -197,11 +197,7 @@ void vgic_v3_populate_lr(struct kvm_vcpu *vcpu, struct vgic_irq *irq, int lr)
|
||||||
if (vgic_irq_is_mapped_level(irq) && (val & ICH_LR_PENDING_BIT))
|
if (vgic_irq_is_mapped_level(irq) && (val & ICH_LR_PENDING_BIT))
|
||||||
irq->line_level = false;
|
irq->line_level = false;
|
||||||
|
|
||||||
/*
|
if (irq->group)
|
||||||
* We currently only support Group1 interrupts, which is a
|
|
||||||
* known defect. This needs to be addressed at some point.
|
|
||||||
*/
|
|
||||||
if (model == KVM_DEV_TYPE_ARM_VGIC_V3)
|
|
||||||
val |= ICH_LR_GROUP;
|
val |= ICH_LR_GROUP;
|
||||||
|
|
||||||
val |= (u64)irq->priority << ICH_LR_PRIORITY_SHIFT;
|
val |= (u64)irq->priority << ICH_LR_PRIORITY_SHIFT;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user