mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
ARM: VGIC: factor out vgic_get_hw_irq_desc()
At the moment we happily access the VGIC internal struct pending_irq (which describes a virtual IRQ) in irq.c. Factor out the actually needed functionality to learn the associated hardware IRQ and move that into gic-vgic.c to improve abstraction. Signed-off-by: Andre Przywara <andre.przywara@linaro.org> Acked-by: Stefano Stabellini <sstabellini@kernel.org> Reviewed-by: Julien Grall <julien.grall@arm.com>
This commit is contained in:
1 parent
ec2a2f1de4
commit
2ab72fa18d
3 files changed
+21
-5
No files matched your search
@@ -397,6 +397,23 @@ void gic_dump_vgic_info(struct vcpu *v)
|
||||
printk("Pending irq=%d\n", p->irq);
|
||||
}
|
||||
|
||||
struct irq_desc *vgic_get_hw_irq_desc(struct domain *d, struct vcpu *v,
|
||||
unsigned int virq)
|
||||
{
|
||||
struct pending_irq *p;
|
||||
|
||||
ASSERT(!v && virq >= 32);
|
||||
|
||||
if ( !v )
|
||||
v = d->vcpu[0];
|
||||
|
||||
p = irq_to_pending(v, virq);
|
||||
if ( !p )
|
||||
return NULL;
|
||||
|
||||
return p->desc;
|
||||
}
|
||||
|
||||
int vgic_connect_hw_irq(struct domain *d, struct vcpu *v, unsigned int virq,
|
||||
struct irq_desc *desc, bool connect)
|
||||
{
|
||||
|
||||
+2
-5
@@ -534,19 +534,16 @@ int release_guest_irq(struct domain *d, unsigned int virq)
|
||||
struct irq_desc *desc;
|
||||
struct irq_guest *info;
|
||||
unsigned long flags;
|
||||
struct pending_irq *p;
|
||||
int ret;
|
||||
|
||||
/* Only SPIs are supported */
|
||||
if ( virq < NR_LOCAL_IRQS || virq >= vgic_num_irqs(d) )
|
||||
return -EINVAL;
|
||||
|
||||
p = spi_to_pending(d, virq);
|
||||
if ( !p->desc )
|
||||
desc = vgic_get_hw_irq_desc(d, NULL, virq);
|
||||
if ( !desc )
|
||||
return -EINVAL;
|
||||
|
||||
desc = p->desc;
|
||||
|
||||
spin_lock_irqsave(&desc->lock, flags);
|
||||
|
||||
ret = -EINVAL;
|
||||
|
||||
@@ -219,6 +219,8 @@ int vgic_v2_init(struct domain *d, int *mmio_count);
|
||||
int vgic_v3_init(struct domain *d, int *mmio_count);
|
||||
|
||||
bool vgic_evtchn_irq_pending(struct vcpu *v);
|
||||
struct irq_desc *vgic_get_hw_irq_desc(struct domain *d, struct vcpu *v,
|
||||
unsigned int virq);
|
||||
int vgic_connect_hw_irq(struct domain *d, struct vcpu *v, unsigned int virq,
|
||||
struct irq_desc *desc, bool connect);
|
||||
|
||||
|
||||