KVM: selftests: Add helper for enabling LPIs on a redistributor
authorOliver Upton <oliver.upton@linux.dev>
Mon, 22 Apr 2024 20:01:56 +0000 (20:01 +0000)
committerMarc Zyngier <maz@kernel.org>
Thu, 25 Apr 2024 12:19:56 +0000 (13:19 +0100)
The selftests GIC library presently does not support LPIs. Add a
userspace helper for configuring a redistributor for LPIs, installing
an LPI configuration table and LPI pending table.

Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
Link: https://lore.kernel.org/r/20240422200158.2606761-18-oliver.upton@linux.dev
Signed-off-by: Marc Zyngier <maz@kernel.org>
tools/testing/selftests/kvm/include/aarch64/gic.h
tools/testing/selftests/kvm/lib/aarch64/gic_v3.c
tools/testing/selftests/kvm/lib/aarch64/vgic.c

index 6d03188435e437c08be0ad9ee73be82852aa4c74..baeb3c859389ddbd2c473d6cffc45a7b8edbced4 100644 (file)
@@ -58,4 +58,7 @@ void gic_irq_clear_pending(unsigned int intid);
 bool gic_irq_get_pending(unsigned int intid);
 void gic_irq_set_config(unsigned int intid, bool is_edge);
 
+void gic_rdist_enable_lpis(vm_paddr_t cfg_table, size_t cfg_table_size,
+                          vm_paddr_t pend_table);
+
 #endif /* SELFTEST_KVM_GIC_H */
index 5153351790459e8e6c58fe5ea134d863389e6423..66d05506f78b13b23cbf3970e2b910d8becf7cd4 100644 (file)
@@ -401,3 +401,27 @@ const struct gic_common_ops gicv3_ops = {
        .gic_irq_get_pending = gicv3_irq_get_pending,
        .gic_irq_set_config = gicv3_irq_set_config,
 };
+
+void gic_rdist_enable_lpis(vm_paddr_t cfg_table, size_t cfg_table_size,
+                          vm_paddr_t pend_table)
+{
+       volatile void *rdist_base = gicr_base_cpu(guest_get_vcpuid());
+
+       u32 ctlr;
+       u64 val;
+
+       val = (cfg_table |
+              GICR_PROPBASER_InnerShareable |
+              GICR_PROPBASER_RaWaWb |
+              ((ilog2(cfg_table_size) - 1) & GICR_PROPBASER_IDBITS_MASK));
+       writeq_relaxed(val, rdist_base + GICR_PROPBASER);
+
+       val = (pend_table |
+              GICR_PENDBASER_InnerShareable |
+              GICR_PENDBASER_RaWaWb);
+       writeq_relaxed(val, rdist_base + GICR_PENDBASER);
+
+       ctlr = readl_relaxed(rdist_base + GICR_CTLR);
+       ctlr |= GICR_CTLR_ENABLE_LPIS;
+       writel_relaxed(ctlr, rdist_base + GICR_CTLR);
+}
index 5e8f0d5382c27f6fb9300a53833ca47e2af91c62..4427f43f73ea16c1bec7d90b32eea58acab1fb2b 100644 (file)
@@ -3,8 +3,10 @@
  * ARM Generic Interrupt Controller (GIC) v3 host support
  */
 
+#include <linux/kernel.h>
 #include <linux/kvm.h>
 #include <linux/sizes.h>
+#include <asm/cputype.h>
 #include <asm/kvm_para.h>
 #include <asm/kvm.h>