This series introduces GICv4 direct LPI injection for Xen. Direct LPI injection relies on the GIC tracking the mapping between physical and virtual CPUs. Each VCPU requires a VPE that is created and registered with the GIC via the `VMAPP` ITS command. The GIC is then informed of the current VPE-to-PCPU placement by programming `VPENDBASER` and `VPROPBASER` in the appropriate redistributor. LPIs are associated with VPEs through the `VMAPTI` ITS command, after which the GIC handles delivery without trapping into the hypervisor for each interrupt.
When a VPE is not scheduled but has pending interrupts, the GIC raises a per-VPE doorbell LPI. Doorbells are owned by the hypervisor and prompt rescheduling so the VPE can drain its pending LPIs. Because GICv4 lacks a native doorbell invalidation mechanism, this series includes a helper that invalidates doorbell LPIs via synthetic “proxy” devices, following the approach used until GICv4.1. All of this work is mostly based on the work of Penny Zheng <[email protected]> and Luca Fancellu <[email protected]>. And also from Linux patches by Mark Zyngier. Some patches are still a little rough and need some styling fixes and more testing, as all of them needed to be carved line by line from a giant ~4000 line patch. This RFC is directed mostly to get a general idea if the proposed approach is suitable and OK with everyone. And there is still an open question of how to handle Signed-off-by lines for Penny and Luca, since they have not indicated their preference yet. Mykyta Poturai (19): arm/gicv4 add management structure definitions arm/gicv4-its: Add GICv4 ITS command definitions arm/its: Export struct its_device arm/its: Add vlpi configuration arm/irq: Add hw flag to pending_irq arm/gicv4-its: Add VLPI map/unmap operations xen/domain: Alloc enough pages for VCPU struct arm/gic: Keep track of GIC features arm/its: Implement LPI invalidation arm/its: Keep track of BASER regs arm/its: Add ITS VM and VPE allocation/teardown arm/gic: Add VPENDBASER/VPROPBASER accessors arm/gic: VPE scheduling arm/its: VPE affinity changes arm: Add gicv4 to domain creation arm/gic: Fix LR group handling for GICv4 arm/gicv4: Handle doorbells arm/gic: Add VPE proxy support arm/gicv4: Add GICv4 to the build system xen/arch/arm/Kconfig | 6 + xen/arch/arm/Makefile | 1 + xen/arch/arm/dom0less-build.c | 1 + xen/arch/arm/domain.c | 16 + xen/arch/arm/gic-v2.c | 2 +- xen/arch/arm/gic-v3-its.c | 339 +++++-- xen/arch/arm/gic-v3-lpi.c | 169 +++- xen/arch/arm/gic-v3.c | 215 ++++- xen/arch/arm/gic-v4-its.c | 1136 ++++++++++++++++++++++++ xen/arch/arm/gic-vgic.c | 6 + xen/arch/arm/include/asm/gic.h | 4 +- xen/arch/arm/include/asm/gic_v3_defs.h | 22 + xen/arch/arm/include/asm/gic_v3_its.h | 139 ++- xen/arch/arm/include/asm/gic_v4_its.h | 114 +++ xen/arch/arm/include/asm/vgic.h | 79 +- xen/arch/arm/vgic-v3-its.c | 60 +- xen/arch/arm/vgic.c | 37 +- xen/common/domain.c | 14 +- xen/include/public/arch-arm.h | 2 + 19 files changed, 2174 insertions(+), 188 deletions(-) create mode 100644 xen/arch/arm/gic-v4-its.c create mode 100644 xen/arch/arm/include/asm/gic_v4_its.h -- 2.51.2
