Skip to content

Commit 2f2f7e3

Browse files
author
Marc Zyngier
committed
KVM: arm64: timer: Refactor IRQ configuration
As we are about to add some more things to the timer IRQ configuration, move this code out of the main timer init code into its own set of functions. No functional changes. Signed-off-by: Marc Zyngier <maz@kernel.org>
1 parent 354920e commit 2f2f7e3

1 file changed

Lines changed: 33 additions & 24 deletions

File tree

arch/arm64/kvm/arch_timer.c

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -973,6 +973,35 @@ static int kvm_timer_dying_cpu(unsigned int cpu)
973973
return 0;
974974
}
975975

976+
static void kvm_irq_fixup_flags(unsigned int virq, u32 *flags)
977+
{
978+
*flags = irq_get_trigger_type(virq);
979+
if (*flags != IRQF_TRIGGER_HIGH && *flags != IRQF_TRIGGER_LOW) {
980+
kvm_err("Invalid trigger for timer IRQ%d, assuming level low\n",
981+
virq);
982+
*flags = IRQF_TRIGGER_LOW;
983+
}
984+
}
985+
986+
static int kvm_irq_init(struct arch_timer_kvm_info *info)
987+
{
988+
if (info->virtual_irq <= 0) {
989+
kvm_err("kvm_arch_timer: invalid virtual timer IRQ: %d\n",
990+
info->virtual_irq);
991+
return -ENODEV;
992+
}
993+
994+
host_vtimer_irq = info->virtual_irq;
995+
kvm_irq_fixup_flags(host_vtimer_irq, &host_vtimer_irq_flags);
996+
997+
if (info->physical_irq > 0) {
998+
host_ptimer_irq = info->physical_irq;
999+
kvm_irq_fixup_flags(host_ptimer_irq, &host_ptimer_irq_flags);
1000+
}
1001+
1002+
return 0;
1003+
}
1004+
9761005
int kvm_timer_hyp_init(bool has_gic)
9771006
{
9781007
struct arch_timer_kvm_info *info;
@@ -986,22 +1015,11 @@ int kvm_timer_hyp_init(bool has_gic)
9861015
return -ENODEV;
9871016
}
9881017

989-
/* First, do the virtual EL1 timer irq */
990-
991-
if (info->virtual_irq <= 0) {
992-
kvm_err("kvm_arch_timer: invalid virtual timer IRQ: %d\n",
993-
info->virtual_irq);
994-
return -ENODEV;
995-
}
996-
host_vtimer_irq = info->virtual_irq;
1018+
err = kvm_irq_init(info);
1019+
if (err)
1020+
return err;
9971021

998-
host_vtimer_irq_flags = irq_get_trigger_type(host_vtimer_irq);
999-
if (host_vtimer_irq_flags != IRQF_TRIGGER_HIGH &&
1000-
host_vtimer_irq_flags != IRQF_TRIGGER_LOW) {
1001-
kvm_err("Invalid trigger for vtimer IRQ%d, assuming level low\n",
1002-
host_vtimer_irq);
1003-
host_vtimer_irq_flags = IRQF_TRIGGER_LOW;
1004-
}
1022+
/* First, do the virtual EL1 timer irq */
10051023

10061024
err = request_percpu_irq(host_vtimer_irq, kvm_arch_timer_handler,
10071025
"kvm guest vtimer", kvm_get_running_vcpus());
@@ -1027,15 +1045,6 @@ int kvm_timer_hyp_init(bool has_gic)
10271045
/* Now let's do the physical EL1 timer irq */
10281046

10291047
if (info->physical_irq > 0) {
1030-
host_ptimer_irq = info->physical_irq;
1031-
host_ptimer_irq_flags = irq_get_trigger_type(host_ptimer_irq);
1032-
if (host_ptimer_irq_flags != IRQF_TRIGGER_HIGH &&
1033-
host_ptimer_irq_flags != IRQF_TRIGGER_LOW) {
1034-
kvm_err("Invalid trigger for ptimer IRQ%d, assuming level low\n",
1035-
host_ptimer_irq);
1036-
host_ptimer_irq_flags = IRQF_TRIGGER_LOW;
1037-
}
1038-
10391048
err = request_percpu_irq(host_ptimer_irq, kvm_arch_timer_handler,
10401049
"kvm guest ptimer", kvm_get_running_vcpus());
10411050
if (err) {

0 commit comments

Comments
 (0)