ARM: new VGIC: Handle virtual IRQ allocation/reservation

To find an unused virtual IRQ number Xen uses a scheme to track used
virtual IRQs.
Implement this interface in the new VGIC to make the Xen core/arch code
happy.
This is actually somewhat VGIC agnostic, so is mostly a copy of the code
from the old VGIC. But it has to live in the VGIC files, so we can't
easily reuse the existing implementation.

Signed-off-by: Andre Przywara <andre.przywara@linaro.org>
Acked-by: Julien Grall <julien.grall@arm.com>
Acked-by: Stefano Stabellini <sstabellini@kernel.org>
This commit is contained in:
Andre Przywara authored and Stefano Stabellini committed 2018-03-28 11:21:03 -07:00
1 parent 5baec9af20
commit fac8124ec1
1 file changed
+44
+44
View File
@@ -715,6 +715,50 @@ bool vgic_evtchn_irq_pending(struct vcpu *v)
return pending;
}
bool vgic_reserve_virq(struct domain *d, unsigned int virq)
{
if ( virq >= vgic_num_irqs(d) )
return false;
return !test_and_set_bit(virq, d->arch.vgic.allocated_irqs);
}
int vgic_allocate_virq(struct domain *d, bool spi)
{
int first, end;
unsigned int virq;
if ( !spi )
{
/* We only allocate PPIs. SGIs are all reserved */
first = 16;
end = 32;
}
else
{
first = 32;
end = vgic_num_irqs(d);
}
/*
* There is no spinlock to protect allocated_irqs, therefore
* test_and_set_bit may fail. If so retry it.
*/
do
{
virq = find_next_zero_bit(d->arch.vgic.allocated_irqs, end, first);
if ( virq >= end )
return -1;
} while ( test_and_set_bit(virq, d->arch.vgic.allocated_irqs) );
return virq;
}
void vgic_free_virq(struct domain *d, unsigned int virq)
{
clear_bit(virq, d->arch.vgic.allocated_irqs);
}
struct irq_desc *vgic_get_hw_irq_desc(struct domain *d, struct vcpu *v,
unsigned int virq)
{
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.