@@ -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+
9761005int 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