GICv5 DT specifiers use absolute PPI numbers due to having separate namespaces for the different interrupt types. Keep the existing GICv2/v3 specifiers by subtracting the legacy PPI base for those irqchips. Tested-by: Vladimir Murzin Signed-off-by: Sascha Bischoff --- arm64/timer.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/arm64/timer.c b/arm64/timer.c index 2ac6144f..01b9875c 100644 --- a/arm64/timer.c +++ b/arm64/timer.c @@ -9,16 +9,18 @@ void timer__generate_fdt_nodes(void *fdt, struct kvm *kvm) { const char compatible[] = "arm,armv8-timer\0arm,armv7-timer"; u32 cpu_mask = gic__get_fdt_irq_cpumask(kvm); - int irqs[5] = {13, 14, 11, 10, 12}; + const int irqs[5] = { 29, 30, 27, 26, 28 }; int nr = ARRAY_SIZE(irqs); u32 irq_prop[nr * 3]; + u32 type = gic__get_ppi_fdt_type(); + int ppi_base = gic__get_ppi_base(); if (!kvm->cfg.arch.nested_virt) nr--; for (int i = 0; i < nr; i++) { - irq_prop[i * 3 + 0] = cpu_to_fdt32(GIC_FDT_IRQ_TYPE_PPI); - irq_prop[i * 3 + 1] = cpu_to_fdt32(irqs[i]); + irq_prop[i * 3 + 0] = cpu_to_fdt32(type); + irq_prop[i * 3 + 1] = cpu_to_fdt32(irqs[i] - ppi_base); irq_prop[i * 3 + 2] = cpu_to_fdt32(cpu_mask | IRQ_TYPE_LEVEL_LOW); } @@ -30,4 +32,3 @@ void timer__generate_fdt_nodes(void *fdt, struct kvm *kvm) _FDT(fdt_property_cell(fdt, "clock-frequency", kvm->cfg.arch.force_cntfrq)); _FDT(fdt_end_node(fdt)); } - -- 2.34.1