10SN/A// SPDX-License-Identifier: GPL-2.0-only 20SN/A/* 30SN/A * irqchip.c: Common API for in kernel interrupt controllers 40SN/A * Copyright (c) 2007, Intel Corporation. 50SN/A * Copyright 2010 Red Hat, Inc. and/or its affiliates. 61113Sjoehw * Copyright (c) 2013, Alexander Graf <agraf@suse.de> 71113Sjoehw * 81113Sjoehw * This file is derived from virt/kvm/irq_comm.c. 91113Sjoehw * 101113Sjoehw * Authors: 111113Sjoehw * Yaozu (Eddie) Dong <Eddie.dong@intel.com> 120SN/A * Alexander Graf <agraf@suse.de> 130SN/A */ 140SN/A 150SN/A#include <linux/kvm_host.h> 160SN/A#include <linux/slab.h> 170SN/A#include <linux/srcu.h> 180SN/A#include <linux/export.h> 190SN/A#include <trace/events/kvm.h> 200SN/A 210SN/Aint kvm_irq_map_gsi(struct kvm *kvm, 220SN/A struct kvm_kernel_irq_routing_entry *entries, int gsi) 230SN/A{ 240SN/A struct kvm_irq_routing_table *irq_rt; 250SN/A struct kvm_kernel_irq_routing_entry *e; 260SN/A int n = 0; 270SN/A 280SN/A irq_rt = srcu_dereference_check(kvm->irq_routing, &kvm->irq_srcu, 290SN/A lockdep_is_held(&kvm->irq_lock)); 300SN/A if (irq_rt && gsi < irq_rt->nr_rt_entries) { 310SN/A hlist_for_each_entry(e, &irq_rt->map[gsi], link) { 320SN/A entries[n] = *e; 330SN/A ++n; 340SN/A } 350SN/A } 360SN/A 370SN/A return n; 380SN/A} 390SN/A 400SN/Aint kvm_irq_map_chip_pin(struct kvm *kvm, unsigned irqchip, unsigned pin) 410SN/A{ 420SN/A struct kvm_irq_routing_table *irq_rt; 430SN/A 440SN/A irq_rt = srcu_dereference(kvm->irq_routing, &kvm->irq_srcu); 450SN/A return irq_rt->chip[irqchip][pin]; 460SN/A} 470SN/A 480SN/Aint kvm_send_userspace_msi(struct kvm *kvm, struct kvm_msi *msi) 490SN/A{ 500SN/A struct kvm_kernel_irq_routing_entry route; 510SN/A 520SN/A if (!kvm_arch_irqchip_in_kernel(kvm) || (msi->flags & ~KVM_MSI_VALID_DEVID)) 530SN/A return -EINVAL; 540SN/A 550SN/A route.msi.address_lo = msi->address_lo; 560SN/A route.msi.address_hi = msi->address_hi; 570SN/A route.msi.data = msi->data; 580SN/A route.msi.flags = msi->flags; 590SN/A route.msi.devid = msi->devid; 600SN/A 610SN/A return kvm_set_msi(&route, kvm, KVM_USERSPACE_IRQ_SOURCE_ID, 1, false); 620SN/A} 630SN/A 640SN/A/* 650SN/A * Return value: 660SN/A * < 0 Interrupt was ignored (masked or not delivered for other reasons) 670SN/A * = 0 Interrupt was coalesced (previous irq is still pending) 680SN/A * > 0 Number of CPUs interrupt was delivered to 690SN/A */ 700SN/Aint kvm_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level, 710SN/A bool line_status) 720SN/A{ 730SN/A struct kvm_kernel_irq_routing_entry irq_set[KVM_NR_IRQCHIPS]; 740SN/A int ret = -1, i, idx; 750SN/A 760SN/A trace_kvm_set_irq(irq, level, irq_source_id); 770SN/A 780SN/A /* Not possible to detect if the guest uses the PIC or the 790SN/A * IOAPIC. So set the bit in both. The guest will ignore 800SN/A * writes to the unused one. 810SN/A */ 820SN/A idx = srcu_read_lock(&kvm->irq_srcu); 830SN/A i = kvm_irq_map_gsi(kvm, irq_set, irq); 840SN/A srcu_read_unlock(&kvm->irq_srcu, idx); 850SN/A 860SN/A while (i--) { 870SN/A int r; 880SN/A r = irq_set[i].set(&irq_set[i], kvm, irq_source_id, level, 890SN/A line_status); 900SN/A if (r < 0) 910SN/A continue; 920SN/A 930SN/A ret = r + ((ret < 0) ? 0 : ret); 940SN/A } 950SN/A 960SN/A return ret; 970SN/A} 980SN/A 990SN/Astatic void free_irq_routing_table(struct kvm_irq_routing_table *rt) 1000SN/A{ 1010SN/A int i; 1020SN/A 1030SN/A if (!rt) 1040SN/A return; 1050SN/A 1060SN/A for (i = 0; i < rt->nr_rt_entries; ++i) { 1070SN/A struct kvm_kernel_irq_routing_entry *e; 1080SN/A struct hlist_node *n; 1090SN/A 1100SN/A hlist_for_each_entry_safe(e, n, &rt->map[i], link) { 1110SN/A hlist_del(&e->link); 1120SN/A kfree(e); 1130SN/A } 1140SN/A } 1150SN/A 1160SN/A kfree(rt); 1170SN/A} 1180SN/A 1190SN/Avoid kvm_free_irq_routing(struct kvm *kvm) 1200SN/A{ 1210SN/A /* Called only during vm destruction. Nobody can use the pointer 1220SN/A at this stage */ 1230SN/A struct kvm_irq_routing_table *rt = rcu_access_pointer(kvm->irq_routing); 1240SN/A free_irq_routing_table(rt); 1250SN/A} 1260SN/A 1270SN/Astatic int setup_routing_entry(struct kvm *kvm, 1280SN/A struct kvm_irq_routing_table *rt, 1290SN/A struct kvm_kernel_irq_routing_entry *e, 1300SN/A const struct kvm_irq_routing_entry *ue) 1310SN/A{ 1320SN/A struct kvm_kernel_irq_routing_entry *ei; 1330SN/A int r; 1340SN/A u32 gsi = array_index_nospec(ue->gsi, KVM_MAX_IRQ_ROUTES); 1350SN/A 1360SN/A /* 1370SN/A * Do not allow GSI to be mapped to the same irqchip more than once. 1380SN/A * Allow only one to one mapping between GSI and non-irqchip routing. 1390SN/A */ 1400SN/A hlist_for_each_entry(ei, &rt->map[gsi], link) 1410SN/A if (ei->type != KVM_IRQ_ROUTING_IRQCHIP || 1420SN/A ue->type != KVM_IRQ_ROUTING_IRQCHIP || 1430SN/A ue->u.irqchip.irqchip == ei->irqchip.irqchip) 1440SN/A return -EINVAL; 1450SN/A 1460SN/A e->gsi = gsi; 1470SN/A e->type = ue->type; 1480SN/A r = kvm_set_routing_entry(kvm, e, ue); 1490SN/A if (r) 1500SN/A return r; 1510SN/A if (e->type == KVM_IRQ_ROUTING_IRQCHIP) 1520SN/A rt->chip[e->irqchip.irqchip][e->irqchip.pin] = e->gsi; 1530SN/A 1540SN/A hlist_add_head(&e->link, &rt->map[e->gsi]); 1550SN/A 1560SN/A return 0; 1570SN/A} 1580SN/A 1590SN/Avoid __attribute__((weak)) kvm_arch_irq_routing_update(struct kvm *kvm) 1600SN/A{ 1610SN/A} 1620SN/A 1630SN/Abool __weak kvm_arch_can_set_irq_routing(struct kvm *kvm) 1640SN/A{ 1650SN/A return true; 1660SN/A} 1670SN/A 1680SN/Aint kvm_set_irq_routing(struct kvm *kvm, 1690SN/A const struct kvm_irq_routing_entry *ue, 1700SN/A unsigned nr, 1710SN/A unsigned flags) 1720SN/A{ 1730SN/A struct kvm_irq_routing_table *new, *old; 1740SN/A struct kvm_kernel_irq_routing_entry *e; 1750SN/A u32 i, j, nr_rt_entries = 0; 1760SN/A int r; 1770SN/A 1780SN/A for (i = 0; i < nr; ++i) { 1790SN/A if (ue[i].gsi >= KVM_MAX_IRQ_ROUTES) 1800SN/A return -EINVAL; 1810SN/A nr_rt_entries = max(nr_rt_entries, ue[i].gsi); 1820SN/A } 1830SN/A 1840SN/A nr_rt_entries += 1; 1850SN/A 1860SN/A new = kzalloc(struct_size(new, map, nr_rt_entries), GFP_KERNEL_ACCOUNT); 1870SN/A if (!new) 1880SN/A return -ENOMEM; 1890SN/A 1900SN/A new->nr_rt_entries = nr_rt_entries; 1910SN/A for (i = 0; i < KVM_NR_IRQCHIPS; i++) 1920SN/A for (j = 0; j < KVM_IRQCHIP_NUM_PINS; j++) 1930SN/A new->chip[i][j] = -1; 1940SN/A 1950SN/A for (i = 0; i < nr; ++i) { 1960SN/A r = -ENOMEM; 1970SN/A e = kzalloc(sizeof(*e), GFP_KERNEL_ACCOUNT); 1980SN/A if (!e) 1990SN/A goto out; 2000SN/A 2010SN/A r = -EINVAL; 2020SN/A switch (ue->type) { 2030SN/A case KVM_IRQ_ROUTING_MSI: 2040SN/A if (ue->flags & ~KVM_MSI_VALID_DEVID) 2050SN/A goto free_entry; 2060SN/A break; 2070SN/A default: 2080SN/A if (ue->flags) 2090SN/A goto free_entry; 2100SN/A break; 2110SN/A } 2120SN/A r = setup_routing_entry(kvm, new, e, ue); 2130SN/A if (r) 2140SN/A goto free_entry; 2150SN/A ++ue; 2160SN/A } 2170SN/A 2180SN/A mutex_lock(&kvm->irq_lock); 2190SN/A old = rcu_dereference_protected(kvm->irq_routing, 1); 220 rcu_assign_pointer(kvm->irq_routing, new); 221 kvm_irq_routing_update(kvm); 222 kvm_arch_irq_routing_update(kvm); 223 mutex_unlock(&kvm->irq_lock); 224 225 kvm_arch_post_irq_routing_update(kvm); 226 227 synchronize_srcu_expedited(&kvm->irq_srcu); 228 229 new = old; 230 r = 0; 231 goto out; 232 233free_entry: 234 kfree(e); 235out: 236 free_irq_routing_table(new); 237 238 return r; 239} 240