Lines Matching refs:irq
119 static void add_sgi_source(struct kvm_vcpu *vcpu, int irq, int source) in add_sgi_source() argument
121 vcpu->kvm->arch.vgic.vm_ops.add_sgi_source(vcpu, irq, source); in add_sgi_source()
124 static bool queue_sgi(struct kvm_vcpu *vcpu, int irq) in queue_sgi() argument
126 return vcpu->kvm->arch.vgic.vm_ops.queue_sgi(vcpu, irq); in queue_sgi()
198 int cpuid, int irq) in vgic_bitmap_get_irq_val() argument
200 if (irq < VGIC_NR_PRIVATE_IRQS) in vgic_bitmap_get_irq_val()
201 return test_bit(irq, x->private + cpuid); in vgic_bitmap_get_irq_val()
203 return test_bit(irq - VGIC_NR_PRIVATE_IRQS, x->shared); in vgic_bitmap_get_irq_val()
207 int irq, int val) in vgic_bitmap_set_irq_val() argument
211 if (irq < VGIC_NR_PRIVATE_IRQS) { in vgic_bitmap_set_irq_val()
215 irq -= VGIC_NR_PRIVATE_IRQS; in vgic_bitmap_set_irq_val()
219 set_bit(irq, reg); in vgic_bitmap_set_irq_val()
221 clear_bit(irq, reg); in vgic_bitmap_set_irq_val()
274 static bool vgic_irq_is_edge(struct kvm_vcpu *vcpu, int irq) in vgic_irq_is_edge() argument
279 irq_val = vgic_bitmap_get_irq_val(&dist->irq_cfg, vcpu->vcpu_id, irq); in vgic_irq_is_edge()
283 static int vgic_irq_is_enabled(struct kvm_vcpu *vcpu, int irq) in vgic_irq_is_enabled() argument
287 return vgic_bitmap_get_irq_val(&dist->irq_enabled, vcpu->vcpu_id, irq); in vgic_irq_is_enabled()
290 static int vgic_irq_is_queued(struct kvm_vcpu *vcpu, int irq) in vgic_irq_is_queued() argument
294 return vgic_bitmap_get_irq_val(&dist->irq_queued, vcpu->vcpu_id, irq); in vgic_irq_is_queued()
297 static int vgic_irq_is_active(struct kvm_vcpu *vcpu, int irq) in vgic_irq_is_active() argument
301 return vgic_bitmap_get_irq_val(&dist->irq_active, vcpu->vcpu_id, irq); in vgic_irq_is_active()
304 static void vgic_irq_set_queued(struct kvm_vcpu *vcpu, int irq) in vgic_irq_set_queued() argument
308 vgic_bitmap_set_irq_val(&dist->irq_queued, vcpu->vcpu_id, irq, 1); in vgic_irq_set_queued()
311 static void vgic_irq_clear_queued(struct kvm_vcpu *vcpu, int irq) in vgic_irq_clear_queued() argument
315 vgic_bitmap_set_irq_val(&dist->irq_queued, vcpu->vcpu_id, irq, 0); in vgic_irq_clear_queued()
318 static void vgic_irq_set_active(struct kvm_vcpu *vcpu, int irq) in vgic_irq_set_active() argument
322 vgic_bitmap_set_irq_val(&dist->irq_active, vcpu->vcpu_id, irq, 1); in vgic_irq_set_active()
325 static void vgic_irq_clear_active(struct kvm_vcpu *vcpu, int irq) in vgic_irq_clear_active() argument
329 vgic_bitmap_set_irq_val(&dist->irq_active, vcpu->vcpu_id, irq, 0); in vgic_irq_clear_active()
332 static int vgic_dist_irq_get_level(struct kvm_vcpu *vcpu, int irq) in vgic_dist_irq_get_level() argument
336 return vgic_bitmap_get_irq_val(&dist->irq_level, vcpu->vcpu_id, irq); in vgic_dist_irq_get_level()
339 static void vgic_dist_irq_set_level(struct kvm_vcpu *vcpu, int irq) in vgic_dist_irq_set_level() argument
343 vgic_bitmap_set_irq_val(&dist->irq_level, vcpu->vcpu_id, irq, 1); in vgic_dist_irq_set_level()
346 static void vgic_dist_irq_clear_level(struct kvm_vcpu *vcpu, int irq) in vgic_dist_irq_clear_level() argument
350 vgic_bitmap_set_irq_val(&dist->irq_level, vcpu->vcpu_id, irq, 0); in vgic_dist_irq_clear_level()
353 static int vgic_dist_irq_soft_pend(struct kvm_vcpu *vcpu, int irq) in vgic_dist_irq_soft_pend() argument
357 return vgic_bitmap_get_irq_val(&dist->irq_soft_pend, vcpu->vcpu_id, irq); in vgic_dist_irq_soft_pend()
360 static void vgic_dist_irq_clear_soft_pend(struct kvm_vcpu *vcpu, int irq) in vgic_dist_irq_clear_soft_pend() argument
364 vgic_bitmap_set_irq_val(&dist->irq_soft_pend, vcpu->vcpu_id, irq, 0); in vgic_dist_irq_clear_soft_pend()
365 if (!vgic_dist_irq_get_level(vcpu, irq)) { in vgic_dist_irq_clear_soft_pend()
366 vgic_dist_irq_clear_pending(vcpu, irq); in vgic_dist_irq_clear_soft_pend()
372 static int vgic_dist_irq_is_pending(struct kvm_vcpu *vcpu, int irq) in vgic_dist_irq_is_pending() argument
376 return vgic_bitmap_get_irq_val(&dist->irq_pending, vcpu->vcpu_id, irq); in vgic_dist_irq_is_pending()
379 void vgic_dist_irq_set_pending(struct kvm_vcpu *vcpu, int irq) in vgic_dist_irq_set_pending() argument
383 vgic_bitmap_set_irq_val(&dist->irq_pending, vcpu->vcpu_id, irq, 1); in vgic_dist_irq_set_pending()
386 void vgic_dist_irq_clear_pending(struct kvm_vcpu *vcpu, int irq) in vgic_dist_irq_clear_pending() argument
390 vgic_bitmap_set_irq_val(&dist->irq_pending, vcpu->vcpu_id, irq, 0); in vgic_dist_irq_clear_pending()
393 static void vgic_cpu_irq_set(struct kvm_vcpu *vcpu, int irq) in vgic_cpu_irq_set() argument
395 if (irq < VGIC_NR_PRIVATE_IRQS) in vgic_cpu_irq_set()
396 set_bit(irq, vcpu->arch.vgic_cpu.pending_percpu); in vgic_cpu_irq_set()
398 set_bit(irq - VGIC_NR_PRIVATE_IRQS, in vgic_cpu_irq_set()
402 void vgic_cpu_irq_clear(struct kvm_vcpu *vcpu, int irq) in vgic_cpu_irq_clear() argument
404 if (irq < VGIC_NR_PRIVATE_IRQS) in vgic_cpu_irq_clear()
405 clear_bit(irq, vcpu->arch.vgic_cpu.pending_percpu); in vgic_cpu_irq_clear()
407 clear_bit(irq - VGIC_NR_PRIVATE_IRQS, in vgic_cpu_irq_clear()
411 static bool vgic_can_sample_irq(struct kvm_vcpu *vcpu, int irq) in vgic_can_sample_irq() argument
413 return !vgic_irq_is_queued(vcpu, irq); in vgic_can_sample_irq()
712 if (lr.irq < VGIC_NR_SGIS) in vgic_unqueue_irqs()
713 add_sgi_source(vcpu, lr.irq, lr.source); in vgic_unqueue_irqs()
721 vgic_irq_set_active(vcpu, lr.irq); in vgic_unqueue_irqs()
752 int irq; in vgic_validate_access() local
757 irq = offset * 8 / range->bits_per_irq; in vgic_validate_access()
758 if (irq >= dist->nr_irqs) in vgic_validate_access()
1084 vgic_irq_clear_queued(vcpu, vlr.irq); in vgic_retire_lr()
1091 vgic_dist_irq_set_pending(vcpu, vlr.irq); in vgic_retire_lr()
1113 if (vlr.irq == map->virt_irq && vlr.state & LR_STATE_ACTIVE) in kvm_vgic_map_is_active()
1138 if (!vgic_irq_is_enabled(vcpu, vlr.irq)) in vgic_retire_disabled_irqs()
1143 static void vgic_queue_irq_to_lr(struct kvm_vcpu *vcpu, int irq, in vgic_queue_irq_to_lr() argument
1146 if (vgic_irq_is_active(vcpu, irq)) { in vgic_queue_irq_to_lr()
1149 vgic_irq_clear_active(vcpu, irq); in vgic_queue_irq_to_lr()
1152 WARN_ON(!vgic_dist_irq_is_pending(vcpu, irq)); in vgic_queue_irq_to_lr()
1157 if (!vgic_irq_is_edge(vcpu, irq)) in vgic_queue_irq_to_lr()
1160 if (vlr.irq >= VGIC_NR_SGIS) { in vgic_queue_irq_to_lr()
1162 map = vgic_irq_map_search(vcpu, irq); in vgic_queue_irq_to_lr()
1174 vgic_irq_set_queued(vcpu, irq); in vgic_queue_irq_to_lr()
1186 bool vgic_queue_irq(struct kvm_vcpu *vcpu, u8 sgi_source_id, int irq) in vgic_queue_irq() argument
1196 BUG_ON(sgi_source_id && irq >= VGIC_NR_SGIS); in vgic_queue_irq()
1197 BUG_ON(irq >= dist->nr_irqs); in vgic_queue_irq()
1199 kvm_debug("Queue IRQ%d\n", irq); in vgic_queue_irq()
1204 if (vlr.irq == irq && vlr.source == sgi_source_id) { in vgic_queue_irq()
1205 kvm_debug("LR%d piggyback for IRQ%d\n", lr, vlr.irq); in vgic_queue_irq()
1206 vgic_queue_irq_to_lr(vcpu, irq, lr, vlr); in vgic_queue_irq()
1216 kvm_debug("LR%d allocated for IRQ%d %x\n", lr, irq, sgi_source_id); in vgic_queue_irq()
1218 vlr.irq = irq; in vgic_queue_irq()
1221 vgic_queue_irq_to_lr(vcpu, irq, lr, vlr); in vgic_queue_irq()
1226 static bool vgic_queue_hwirq(struct kvm_vcpu *vcpu, int irq) in vgic_queue_hwirq() argument
1228 if (!vgic_can_sample_irq(vcpu, irq)) in vgic_queue_hwirq()
1231 if (vgic_queue_irq(vcpu, 0, irq)) { in vgic_queue_hwirq()
1232 if (vgic_irq_is_edge(vcpu, irq)) { in vgic_queue_hwirq()
1233 vgic_dist_irq_clear_pending(vcpu, irq); in vgic_queue_hwirq()
1234 vgic_cpu_irq_clear(vcpu, irq); in vgic_queue_hwirq()
1236 vgic_irq_set_queued(vcpu, irq); in vgic_queue_hwirq()
1327 vgic_dist_irq_clear_soft_pend(vcpu, vlr.irq); in process_queued_irq()
1332 vgic_irq_clear_queued(vcpu, vlr.irq); in process_queued_irq()
1335 if (vgic_irq_is_edge(vcpu, vlr.irq)) { in process_queued_irq()
1337 pending = vgic_dist_irq_is_pending(vcpu, vlr.irq); in process_queued_irq()
1339 if (vgic_dist_irq_get_level(vcpu, vlr.irq)) { in process_queued_irq()
1340 vgic_cpu_irq_set(vcpu, vlr.irq); in process_queued_irq()
1343 vgic_dist_irq_clear_pending(vcpu, vlr.irq); in process_queued_irq()
1344 vgic_cpu_irq_clear(vcpu, vlr.irq); in process_queued_irq()
1380 WARN_ON(vgic_irq_is_edge(vcpu, vlr.irq)); in vgic_process_maintenance()
1390 vlr.irq - VGIC_NR_PRIVATE_IRQS); in vgic_process_maintenance()
1450 BUG_ON(vlr.irq >= dist->nr_irqs); in __kvm_vgic_sync_hwstate()
1506 static int vgic_validate_injection(struct kvm_vcpu *vcpu, int irq, int level) in vgic_validate_injection() argument
1508 int edge_triggered = vgic_irq_is_edge(vcpu, irq); in vgic_validate_injection()
1516 int state = vgic_dist_irq_is_pending(vcpu, irq); in vgic_validate_injection()
1519 int state = vgic_dist_irq_get_level(vcpu, irq); in vgic_validate_injection()
1693 static irqreturn_t vgic_maintenance_handler(int irq, void *data) in vgic_maintenance_handler() argument
1727 int virt_irq, int irq) in kvm_vgic_map_phys_irq() argument
1737 desc = irq_to_desc(irq); in kvm_vgic_map_phys_irq()
1761 map->irq != irq) in kvm_vgic_map_phys_irq()
1771 map->irq = irq; in kvm_vgic_map_phys_irq()
2455 u32 irq, int level, bool line_status) in kvm_set_irq() argument
2457 unsigned int spi = irq + VGIC_NR_PRIVATE_IRQS; in kvm_set_irq()
2459 trace_kvm_set_irq(irq, level, irq_source_id); in kvm_set_irq()