Lines Matching +full:msi +full:- +full:map
1 // SPDX-License-Identifier: GPL-2.0-only
29 irq_rt = srcu_dereference_check(kvm->irq_routing, &kvm->irq_srcu, in kvm_irq_map_gsi()
30 lockdep_is_held(&kvm->irq_lock)); in kvm_irq_map_gsi()
31 if (irq_rt && gsi < irq_rt->nr_rt_entries) { in kvm_irq_map_gsi()
32 hlist_for_each_entry(e, &irq_rt->map[gsi], link) { in kvm_irq_map_gsi()
45 irq_rt = srcu_dereference(kvm->irq_routing, &kvm->irq_srcu); in kvm_irq_map_chip_pin()
46 return irq_rt->chip[irqchip][pin]; in kvm_irq_map_chip_pin()
49 int kvm_send_userspace_msi(struct kvm *kvm, struct kvm_msi *msi) in kvm_send_userspace_msi() argument
53 if (!irqchip_in_kernel(kvm) || (msi->flags & ~KVM_MSI_VALID_DEVID)) in kvm_send_userspace_msi()
54 return -EINVAL; in kvm_send_userspace_msi()
56 route.msi.address_lo = msi->address_lo; in kvm_send_userspace_msi()
57 route.msi.address_hi = msi->address_hi; in kvm_send_userspace_msi()
58 route.msi.data = msi->data; in kvm_send_userspace_msi()
59 route.msi.flags = msi->flags; in kvm_send_userspace_msi()
60 route.msi.devid = msi->devid; in kvm_send_userspace_msi()
75 int ret = -1, i, idx; in kvm_set_irq()
83 idx = srcu_read_lock(&kvm->irq_srcu); in kvm_set_irq()
85 srcu_read_unlock(&kvm->irq_srcu, idx); in kvm_set_irq()
87 while (i--) { in kvm_set_irq()
107 for (i = 0; i < rt->nr_rt_entries; ++i) { in free_irq_routing_table()
111 hlist_for_each_entry_safe(e, n, &rt->map[i], link) { in free_irq_routing_table()
112 hlist_del(&e->link); in free_irq_routing_table()
124 struct kvm_irq_routing_table *rt = rcu_access_pointer(kvm->irq_routing); in kvm_free_irq_routing()
135 u32 gsi = array_index_nospec(ue->gsi, KVM_MAX_IRQ_ROUTES); in setup_routing_entry()
139 * Allow only one to one mapping between GSI and non-irqchip routing. in setup_routing_entry()
141 hlist_for_each_entry(ei, &rt->map[gsi], link) in setup_routing_entry()
142 if (ei->type != KVM_IRQ_ROUTING_IRQCHIP || in setup_routing_entry()
143 ue->type != KVM_IRQ_ROUTING_IRQCHIP || in setup_routing_entry()
144 ue->u.irqchip.irqchip == ei->irqchip.irqchip) in setup_routing_entry()
145 return -EINVAL; in setup_routing_entry()
147 e->gsi = gsi; in setup_routing_entry()
148 e->type = ue->type; in setup_routing_entry()
152 if (e->type == KVM_IRQ_ROUTING_IRQCHIP) in setup_routing_entry()
153 rt->chip[e->irqchip.irqchip][e->irqchip.pin] = e->gsi; in setup_routing_entry()
155 hlist_add_head(&e->link, &rt->map[e->gsi]); in setup_routing_entry()
181 return -EINVAL; in kvm_set_irq_routing()
187 new = kzalloc(struct_size(new, map, nr_rt_entries), GFP_KERNEL_ACCOUNT); in kvm_set_irq_routing()
189 return -ENOMEM; in kvm_set_irq_routing()
191 new->nr_rt_entries = nr_rt_entries; in kvm_set_irq_routing()
194 new->chip[i][j] = -1; in kvm_set_irq_routing()
197 r = -ENOMEM; in kvm_set_irq_routing()
202 r = -EINVAL; in kvm_set_irq_routing()
203 switch (ue->type) { in kvm_set_irq_routing()
205 if (ue->flags & ~KVM_MSI_VALID_DEVID) in kvm_set_irq_routing()
209 if (ue->flags) in kvm_set_irq_routing()
219 mutex_lock(&kvm->irq_lock); in kvm_set_irq_routing()
220 old = rcu_dereference_protected(kvm->irq_routing, 1); in kvm_set_irq_routing()
221 rcu_assign_pointer(kvm->irq_routing, new); in kvm_set_irq_routing()
224 mutex_unlock(&kvm->irq_lock); in kvm_set_irq_routing()
228 synchronize_srcu_expedited(&kvm->irq_srcu); in kvm_set_irq_routing()