Lines Matching +full:vm +full:- +full:map

1 // SPDX-License-Identifier: GPL-2.0-only
13 #include <linux/irqchip/arm-gic-v4.h>
25 * agnostic actually means KVM-specific - what were you thinking?).
30 * - Any guest-visible VLPI is backed by a Linux interrupt (and a
36 * - Enabling/disabling a VLPI is done by issuing mask/unmask calls.
38 * - Guest INT/CLEAR commands are implemented through
41 * - The *bizarre* stuff (mapping/unmapping an interrupt to a VLPI, or
45 * confines the crap to a single location. And map/unmap really is
61 * interrupts which are delivered when a VLPI targeting a non-running
70 * - VMs (or rather the VM abstraction that matters to the GIC)
75 * - mask/unmask do what is expected on the doorbell interrupt.
77 * - irq_set_affinity is used to move a VPE from one redistributor to
80 * - irq_set_vcpu_affinity once again gets hijacked for the purpose of
81 * creating a new sub-API, namely scheduling/descheduling a VPE
126 name = kasprintf(GFP_KERNEL, "GICv4-sgi-%d", task_pid_nr(current)); in its_alloc_vcpu_sgis()
130 vpe->fwnode = irq_domain_alloc_named_id_fwnode(name, idx); in its_alloc_vcpu_sgis()
131 if (!vpe->fwnode) in its_alloc_vcpu_sgis()
137 vpe->sgi_domain = irq_domain_create_linear(vpe->fwnode, 16, in its_alloc_vcpu_sgis()
139 if (!vpe->sgi_domain) in its_alloc_vcpu_sgis()
142 sgi_base = irq_domain_alloc_irqs(vpe->sgi_domain, 16, NUMA_NO_NODE, vpe); in its_alloc_vcpu_sgis()
149 if (vpe->sgi_domain) in its_alloc_vcpu_sgis()
150 irq_domain_remove(vpe->sgi_domain); in its_alloc_vcpu_sgis()
151 if (vpe->fwnode) in its_alloc_vcpu_sgis()
152 irq_domain_free_fwnode(vpe->fwnode); in its_alloc_vcpu_sgis()
154 return -ENOMEM; in its_alloc_vcpu_sgis()
157 int its_alloc_vcpu_irqs(struct its_vm *vm) in its_alloc_vcpu_irqs() argument
161 vm->fwnode = irq_domain_alloc_named_id_fwnode("GICv4-vpe", in its_alloc_vcpu_irqs()
163 if (!vm->fwnode) in its_alloc_vcpu_irqs()
166 vm->domain = irq_domain_create_hierarchy(gic_domain, 0, vm->nr_vpes, in its_alloc_vcpu_irqs()
167 vm->fwnode, vpe_domain_ops, in its_alloc_vcpu_irqs()
168 vm); in its_alloc_vcpu_irqs()
169 if (!vm->domain) in its_alloc_vcpu_irqs()
172 for (i = 0; i < vm->nr_vpes; i++) { in its_alloc_vcpu_irqs()
173 vm->vpes[i]->its_vm = vm; in its_alloc_vcpu_irqs()
174 vm->vpes[i]->idai = true; in its_alloc_vcpu_irqs()
177 vpe_base_irq = irq_domain_alloc_irqs(vm->domain, vm->nr_vpes, in its_alloc_vcpu_irqs()
178 NUMA_NO_NODE, vm); in its_alloc_vcpu_irqs()
182 for (i = 0; i < vm->nr_vpes; i++) { in its_alloc_vcpu_irqs()
184 vm->vpes[i]->irq = vpe_base_irq + i; in its_alloc_vcpu_irqs()
185 ret = its_alloc_vcpu_sgis(vm->vpes[i], i); in its_alloc_vcpu_irqs()
193 if (vm->domain) in its_alloc_vcpu_irqs()
194 irq_domain_remove(vm->domain); in its_alloc_vcpu_irqs()
195 if (vm->fwnode) in its_alloc_vcpu_irqs()
196 irq_domain_free_fwnode(vm->fwnode); in its_alloc_vcpu_irqs()
198 return -ENOMEM; in its_alloc_vcpu_irqs()
201 static void its_free_sgi_irqs(struct its_vm *vm) in its_free_sgi_irqs() argument
208 for (i = 0; i < vm->nr_vpes; i++) { in its_free_sgi_irqs()
209 unsigned int irq = irq_find_mapping(vm->vpes[i]->sgi_domain, 0); in its_free_sgi_irqs()
215 irq_domain_remove(vm->vpes[i]->sgi_domain); in its_free_sgi_irqs()
216 irq_domain_free_fwnode(vm->vpes[i]->fwnode); in its_free_sgi_irqs()
220 void its_free_vcpu_irqs(struct its_vm *vm) in its_free_vcpu_irqs() argument
222 its_free_sgi_irqs(vm); in its_free_vcpu_irqs()
223 irq_domain_free_irqs(vm->vpes[0]->irq, vm->nr_vpes); in its_free_vcpu_irqs()
224 irq_domain_remove(vm->domain); in its_free_vcpu_irqs()
225 irq_domain_free_fwnode(vm->fwnode); in its_free_vcpu_irqs()
230 return irq_set_vcpu_affinity(vpe->irq, info); in its_send_vpe_cmd()
235 struct irq_desc *desc = irq_to_desc(vpe->irq); in its_make_vpe_non_resident()
247 while (db && irqd_irq_disabled(&desc->irq_data)) in its_make_vpe_non_resident()
248 enable_irq(vpe->irq); in its_make_vpe_non_resident()
253 vpe->resident = false; in its_make_vpe_non_resident()
255 vpe->ready = false; in its_make_vpe_non_resident()
273 disable_irq_nosync(vpe->irq); in its_make_vpe_resident()
278 vpe->resident = true; in its_make_vpe_resident()
294 vpe->ready = true; in its_commit_vpe()
309 int its_map_vlpi(int irq, struct its_vlpi_map *map) in its_map_vlpi() argument
314 .map = map, in its_map_vlpi()
332 int its_get_vlpi(int irq, struct its_vlpi_map *map) in its_get_vlpi() argument
337 .map = map, in its_get_vlpi()
388 return -ENODEV; in its_init_v4()