1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * irqchip.c: Common API for in kernel interrupt controllers 4 * Copyright (c) 2007, Intel Corporation. 5 * Copyright 2010 Red Hat, Inc. and/or its affiliates. 6 * Copyright (c) 2013, Alexander Graf <agraf@suse.de> 7 * 8 * This file is derived from virt/kvm/irq_comm.c. 9 * 10 * Authors: 11 * Yaozu (Eddie) Dong <Eddie.dong@intel.com> 12 * Alexander Graf <agraf@suse.de> 13 */ 14 15#include <linux/kvm_host.h> 16#include <linux/slab.h> 17#include <linux/srcu.h> 18#include <linux/export.h> 19#include <trace/events/kvm.h> 20#include "irq.h" 21 22#if defined(CONFIG_CPU_LOONGSON64) 23#include "ls_irq.h" 24#endif 25 26int kvm_irq_map_gsi(struct kvm *kvm, 27 struct kvm_kernel_irq_routing_entry *entries, int gsi) 28{ 29 struct kvm_irq_routing_table *irq_rt; 30 struct kvm_kernel_irq_routing_entry *e; 31 int n = 0; 32 33 irq_rt = srcu_dereference_check(kvm->irq_routing, &kvm->irq_srcu, 34 lockdep_is_held(&kvm->irq_lock)); 35 if (irq_rt && gsi < irq_rt->nr_rt_entries) { 36 hlist_for_each_entry(e, &irq_rt->map[gsi], link) { 37 entries[n] = *e; 38 ++n; 39 } 40 } 41 42 return n; 43} 44 45int kvm_irq_map_chip_pin(struct kvm *kvm, unsigned irqchip, unsigned pin) 46{ 47 struct kvm_irq_routing_table *irq_rt; 48 49 irq_rt = srcu_dereference(kvm->irq_routing, &kvm->irq_srcu); 50 return irq_rt->chip[irqchip][pin]; 51} 52 53int kvm_send_userspace_msi(struct kvm *kvm, struct kvm_msi *msi) 54{ 55 struct kvm_kernel_irq_routing_entry route; 56 57 if (!irqchip_in_kernel(kvm) || (msi->flags & ~KVM_MSI_VALID_DEVID)) 58 return -EINVAL; 59 60 route.msi.address_lo = msi->address_lo; 61 route.msi.address_hi = msi->address_hi; 62 route.msi.data = msi->data; 63 route.msi.flags = msi->flags; 64 route.msi.devid = msi->devid; 65 66 return kvm_set_msi(&route, kvm, KVM_USERSPACE_IRQ_SOURCE_ID, 1, false); 67} 68 69/* 70 * Return value: 71 * < 0 Interrupt was ignored (masked or not delivered for other reasons) 72 * = 0 Interrupt was coalesced (previous irq is still pending) 73 * > 0 Number of CPUs interrupt was delivered to 74 */ 75int kvm_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level, 76 bool line_status) 77{ 78 struct kvm_kernel_irq_routing_entry irq_set[KVM_NR_IRQCHIPS]; 79 int ret = -1, i, idx; 80 81 trace_kvm_set_irq(irq, level, irq_source_id); 82 83 /* Not possible to detect if the guest uses the PIC or the 84 * IOAPIC. So set the bit in both. The guest will ignore 85 * writes to the unused one. 86 */ 87 idx = srcu_read_lock(&kvm->irq_srcu); 88 i = kvm_irq_map_gsi(kvm, irq_set, irq); 89 srcu_read_unlock(&kvm->irq_srcu, idx); 90 91 while (i--) { 92 int r; 93 r = irq_set[i].set(&irq_set[i], kvm, irq_source_id, level, 94 line_status); 95 if (r < 0) 96 continue; 97 98 ret = r + ((ret < 0) ? 0 : ret); 99 } 100 101 return ret; 102} 103 104static void free_irq_routing_table(struct kvm_irq_routing_table *rt) 105{ 106 int i; 107 108 if (!rt) 109 return; 110 111 for (i = 0; i < rt->nr_rt_entries; ++i) { 112 struct kvm_kernel_irq_routing_entry *e; 113 struct hlist_node *n; 114 115 hlist_for_each_entry_safe(e, n, &rt->map[i], link) { 116 hlist_del(&e->link); 117 kfree(e); 118 } 119 } 120 121 kfree(rt); 122} 123 124void kvm_free_irq_routing(struct kvm *kvm) 125{ 126 /* Called only during vm destruction. Nobody can use the pointer 127 at this stage */ 128 struct kvm_irq_routing_table *rt = rcu_access_pointer(kvm->irq_routing); 129 free_irq_routing_table(rt); 130} 131 132static int setup_routing_entry(struct kvm *kvm, 133 struct kvm_irq_routing_table *rt, 134 struct kvm_kernel_irq_routing_entry *e, 135 const struct kvm_irq_routing_entry *ue) 136{ 137 struct kvm_kernel_irq_routing_entry *ei; 138 int r; 139 u32 gsi = array_index_nospec(ue->gsi, KVM_MAX_IRQ_ROUTES); 140 141 /* 142 * Do not allow GSI to be mapped to the same irqchip more than once. 143 * Allow only one to one mapping between GSI and non-irqchip routing. 144 */ 145 hlist_for_each_entry(ei, &rt->map[gsi], link) 146 if (ei->type != KVM_IRQ_ROUTING_IRQCHIP || 147 ue->type != KVM_IRQ_ROUTING_IRQCHIP || 148 ue->u.irqchip.irqchip == ei->irqchip.irqchip) 149 return -EINVAL; 150 151 e->gsi = gsi; 152 e->type = ue->type; 153 r = kvm_set_routing_entry(kvm, e, ue); 154 if (r) 155 return r; 156 if (e->type == KVM_IRQ_ROUTING_IRQCHIP) 157 rt->chip[e->irqchip.irqchip][e->irqchip.pin] = e->gsi; 158 159 hlist_add_head(&e->link, &rt->map[e->gsi]); 160 161 return 0; 162} 163 164void __attribute__((weak)) kvm_arch_irq_routing_update(struct kvm *kvm) 165{ 166} 167 168bool __weak kvm_arch_can_set_irq_routing(struct kvm *kvm) 169{ 170 return true; 171} 172 173int kvm_set_irq_routing(struct kvm *kvm, 174 const struct kvm_irq_routing_entry *ue, 175 unsigned nr, 176 unsigned flags) 177{ 178 struct kvm_irq_routing_table *new, *old; 179 struct kvm_kernel_irq_routing_entry *e; 180 u32 i, j, nr_rt_entries = 0; 181 int r; 182 183 for (i = 0; i < nr; ++i) { 184 if (ue[i].gsi >= KVM_MAX_IRQ_ROUTES) 185 return -EINVAL; 186 nr_rt_entries = max(nr_rt_entries, ue[i].gsi); 187 } 188 189 nr_rt_entries += 1; 190 191 new = kzalloc(struct_size(new, map, nr_rt_entries), GFP_KERNEL_ACCOUNT); 192 if (!new) 193 return -ENOMEM; 194 195 new->nr_rt_entries = nr_rt_entries; 196 for (i = 0; i < KVM_NR_IRQCHIPS; i++) 197 for (j = 0; j < KVM_IRQCHIP_NUM_PINS; j++) 198 new->chip[i][j] = -1; 199 200 for (i = 0; i < nr; ++i) { 201 r = -ENOMEM; 202 e = kzalloc(sizeof(*e), GFP_KERNEL_ACCOUNT); 203 if (!e) 204 goto out; 205 206 r = -EINVAL; 207 switch (ue->type) { 208 case KVM_IRQ_ROUTING_MSI: 209 if (ue->flags & ~KVM_MSI_VALID_DEVID) 210 goto free_entry; 211 break; 212 default: 213 if (ue->flags) 214 goto free_entry; 215 break; 216 } 217 r = setup_routing_entry(kvm, new, e, ue); 218 if (r) 219 goto free_entry; 220 ++ue; 221 } 222 223 mutex_lock(&kvm->irq_lock); 224 old = rcu_dereference_protected(kvm->irq_routing, 1); 225 rcu_assign_pointer(kvm->irq_routing, new); 226 kvm_irq_routing_update(kvm); 227 kvm_arch_irq_routing_update(kvm); 228 mutex_unlock(&kvm->irq_lock); 229 230 kvm_arch_post_irq_routing_update(kvm); 231 232 synchronize_srcu_expedited(&kvm->irq_srcu); 233 234 new = old; 235 r = 0; 236 goto out; 237 238free_entry: 239 kfree(e); 240out: 241 free_irq_routing_table(new); 242 243 return r; 244} 245