mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 06:44:00 -04:00
KVM: arm64: gic: Introduce queue_irq_unlock to irq_ops
There are times when the default behaviour of vgic_queue_irq_unlock() is undesirable. This is because some GICs, such a GICv5 which is the main driver for this change, handle the majority of the interrupt lifecycle in hardware. In this case, there is no need for a per-VCPU AP list as the interrupt can be made pending directly. This is done either via the ICH_PPI_x_EL2 registers for PPIs, or with the VDPEND system instruction for SPIs and LPIs. The vgic_queue_irq_unlock() function is made overridable using a new function pointer in struct irq_ops. vgic_queue_irq_unlock() is overridden if the function pointer is non-null. This new irq_op is unused in this change - it is purely providing the infrastructure itself. The subsequent PPI injection changes provide a demonstration of the usage of the queue_irq_unlock irq_op. Signed-off-by: Sascha Bischoff <sascha.bischoff@arm.com> Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com> Link: https://patch.msgid.link/20260319154937.3619520-20-sascha.bischoff@arm.com Signed-off-by: Marc Zyngier <maz@kernel.org>
This commit is contained in:
committed by
Marc Zyngier
parent
8f1fbe2fd2
commit
4a9a32d353
@@ -189,6 +189,8 @@ enum vgic_irq_config {
|
||||
VGIC_CONFIG_LEVEL
|
||||
};
|
||||
|
||||
struct vgic_irq;
|
||||
|
||||
/*
|
||||
* Per-irq ops overriding some common behavious.
|
||||
*
|
||||
@@ -207,6 +209,12 @@ struct irq_ops {
|
||||
* peaking into the physical GIC.
|
||||
*/
|
||||
bool (*get_input_level)(int vintid);
|
||||
|
||||
/*
|
||||
* Function pointer to override the queuing of an IRQ.
|
||||
*/
|
||||
bool (*queue_irq_unlock)(struct kvm *kvm, struct vgic_irq *irq,
|
||||
unsigned long flags) __releases(&irq->irq_lock);
|
||||
};
|
||||
|
||||
struct vgic_irq {
|
||||
|
||||
Reference in New Issue
Block a user