Lines Matching full:irq
8 #include <linux/irq.h>
29 * (ITS instance, device, event and irq) using a process that is
33 * identified by the routing entry) and the host irq, using the GICv4
70 * irq corresponding to the vcpu, then call its_make_vpe_resident().
84 static irqreturn_t vgic_v4_doorbell_handler(int irq, void *info) in vgic_v4_doorbell_handler() argument
90 !irqd_irq_disabled(&irq_to_desc(irq)->irq_data)) in vgic_v4_doorbell_handler()
91 disable_irq_nosync(irq); in vgic_v4_doorbell_handler()
108 static void vgic_v4_sync_sgi_config(struct its_vpe *vpe, struct vgic_irq *irq) in vgic_v4_sync_sgi_config() argument
110 vpe->sgi_config[irq->intid].enabled = irq->enabled; in vgic_v4_sync_sgi_config()
111 vpe->sgi_config[irq->intid].group = irq->group; in vgic_v4_sync_sgi_config()
112 vpe->sgi_config[irq->intid].priority = irq->priority; in vgic_v4_sync_sgi_config()
123 * IRQ. The SGI code will do its magic. in vgic_v4_enable_vsgis()
126 struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, i); in vgic_v4_enable_vsgis() local
131 raw_spin_lock_irqsave(&irq->irq_lock, flags); in vgic_v4_enable_vsgis()
133 if (irq->hw) in vgic_v4_enable_vsgis()
136 irq->hw = true; in vgic_v4_enable_vsgis()
137 irq->host_irq = irq_find_mapping(vpe->sgi_domain, i); in vgic_v4_enable_vsgis()
139 /* Transfer the full irq state to the vPE */ in vgic_v4_enable_vsgis()
140 vgic_v4_sync_sgi_config(vpe, irq); in vgic_v4_enable_vsgis()
141 desc = irq_to_desc(irq->host_irq); in vgic_v4_enable_vsgis()
146 ret = irq_set_irqchip_state(irq->host_irq, in vgic_v4_enable_vsgis()
148 irq->pending_latch); in vgic_v4_enable_vsgis()
150 irq->pending_latch = false; in vgic_v4_enable_vsgis()
153 raw_spin_unlock_irqrestore(&irq->irq_lock, flags); in vgic_v4_enable_vsgis()
154 vgic_put_irq(vcpu->kvm, irq); in vgic_v4_enable_vsgis()
163 struct vgic_irq *irq = vgic_get_vcpu_irq(vcpu, i); in vgic_v4_disable_vsgis() local
168 raw_spin_lock_irqsave(&irq->irq_lock, flags); in vgic_v4_disable_vsgis()
170 if (!irq->hw) in vgic_v4_disable_vsgis()
173 irq->hw = false; in vgic_v4_disable_vsgis()
174 ret = irq_get_irqchip_state(irq->host_irq, in vgic_v4_disable_vsgis()
176 &irq->pending_latch); in vgic_v4_disable_vsgis()
179 desc = irq_to_desc(irq->host_irq); in vgic_v4_disable_vsgis()
182 raw_spin_unlock_irqrestore(&irq->irq_lock, flags); in vgic_v4_disable_vsgis()
183 vgic_put_irq(vcpu->kvm, irq); in vgic_v4_disable_vsgis()
213 void vgic_v4_get_vlpi_state(struct vgic_irq *irq, bool *val) in vgic_v4_get_vlpi_state() argument
215 struct its_vpe *vpe = &irq->target_vcpu->arch.vgic_cpu.vgic_v3.its_vpe; in vgic_v4_get_vlpi_state()
216 int mask = BIT(irq->intid % BITS_PER_BYTE); in vgic_v4_get_vlpi_state()
221 ptr = va + irq->intid / BITS_PER_BYTE; in vgic_v4_get_vlpi_state()
226 int vgic_v4_request_vpe_irq(struct kvm_vcpu *vcpu, int irq) in vgic_v4_request_vpe_irq() argument
228 return request_irq(irq, vgic_v4_doorbell_handler, 0, "vcpu", vcpu); in vgic_v4_request_vpe_irq()
268 kvm_err("VPE IRQ allocation failure\n"); in vgic_v4_init()
276 int irq = dist->its_vm.vpes[i]->irq; in vgic_v4_init() local
291 irq_set_status_flags(irq, irq_flags); in vgic_v4_init()
293 ret = vgic_v4_request_vpe_irq(vcpu, irq); in vgic_v4_init()
295 kvm_err("failed to allocate vcpu IRQ%d\n", irq); in vgic_v4_init()
327 int irq = its_vm->vpes[i]->irq; in vgic_v4_teardown() local
329 irq_clear_status_flags(irq, DB_IRQ_FLAGS); in vgic_v4_teardown()
330 free_irq(irq, vcpu); in vgic_v4_teardown()
363 * doc in drivers/irqchip/irq-gic-v4.c to understand how this in vgic_v4_load()
366 err = irq_set_affinity(vpe->irq, cpumask_of(smp_processor_id())); in vgic_v4_load()
380 err = irq_set_irqchip_state(vpe->irq, IRQCHIP_STATE_PENDING, false); in vgic_v4_load()
415 struct vgic_irq *irq; in kvm_vgic_v4_set_forwarding() local
435 irq_entry->msi.data, &irq); in kvm_vgic_v4_set_forwarding()
440 if (irq->hw) in kvm_vgic_v4_set_forwarding()
451 .vpe = &irq->target_vcpu->arch.vgic_cpu.vgic_v3.its_vpe, in kvm_vgic_v4_set_forwarding()
452 .vintid = irq->intid, in kvm_vgic_v4_set_forwarding()
453 .properties = ((irq->priority & 0xfc) | in kvm_vgic_v4_set_forwarding()
454 (irq->enabled ? LPI_PROP_ENABLED : 0) | in kvm_vgic_v4_set_forwarding()
463 irq->hw = true; in kvm_vgic_v4_set_forwarding()
464 irq->host_irq = virq; in kvm_vgic_v4_set_forwarding()
468 raw_spin_lock_irqsave(&irq->irq_lock, flags); in kvm_vgic_v4_set_forwarding()
469 if (irq->pending_latch) { in kvm_vgic_v4_set_forwarding()
470 ret = irq_set_irqchip_state(irq->host_irq, in kvm_vgic_v4_set_forwarding()
472 irq->pending_latch); in kvm_vgic_v4_set_forwarding()
473 WARN_RATELIMIT(ret, "IRQ %d", irq->host_irq); in kvm_vgic_v4_set_forwarding()
479 irq->pending_latch = false; in kvm_vgic_v4_set_forwarding()
480 vgic_queue_irq_unlock(kvm, irq, flags); in kvm_vgic_v4_set_forwarding()
482 raw_spin_unlock_irqrestore(&irq->irq_lock, flags); in kvm_vgic_v4_set_forwarding()
494 struct vgic_irq *irq; in kvm_vgic_v4_unset_forwarding() local
511 irq_entry->msi.data, &irq); in kvm_vgic_v4_unset_forwarding()
515 WARN_ON(!(irq->hw && irq->host_irq == virq)); in kvm_vgic_v4_unset_forwarding()
516 if (irq->hw) { in kvm_vgic_v4_unset_forwarding()
517 atomic_dec(&irq->target_vcpu->arch.vgic_cpu.vgic_v3.its_vpe.vlpi_count); in kvm_vgic_v4_unset_forwarding()
518 irq->hw = false; in kvm_vgic_v4_unset_forwarding()