Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at beda2c7ea2c15ed01eef00a997d2b0496c3a502d 393 lines 10 kB view raw
1/* 2 * irq_comm.c: Common API for in kernel interrupt controller 3 * Copyright (c) 2007, Intel Corporation. 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms and conditions of the GNU General Public License, 7 * version 2, as published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 * more details. 13 * 14 * You should have received a copy of the GNU General Public License along with 15 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple 16 * Place - Suite 330, Boston, MA 02111-1307 USA. 17 * Authors: 18 * Yaozu (Eddie) Dong <Eddie.dong@intel.com> 19 * 20 */ 21 22#include <linux/kvm_host.h> 23 24#include <asm/msidef.h> 25#ifdef CONFIG_IA64 26#include <asm/iosapic.h> 27#endif 28 29#include "irq.h" 30 31#include "ioapic.h" 32 33static int kvm_set_pic_irq(struct kvm_kernel_irq_routing_entry *e, 34 struct kvm *kvm, int level) 35{ 36#ifdef CONFIG_X86 37 return kvm_pic_set_irq(pic_irqchip(kvm), e->irqchip.pin, level); 38#else 39 return -1; 40#endif 41} 42 43static int kvm_set_ioapic_irq(struct kvm_kernel_irq_routing_entry *e, 44 struct kvm *kvm, int level) 45{ 46 return kvm_ioapic_set_irq(kvm->arch.vioapic, e->irqchip.pin, level); 47} 48 49inline static bool kvm_is_dm_lowest_prio(struct kvm_lapic_irq *irq) 50{ 51#ifdef CONFIG_IA64 52 return irq->delivery_mode == 53 (IOSAPIC_LOWEST_PRIORITY << IOSAPIC_DELIVERY_SHIFT); 54#else 55 return irq->delivery_mode == APIC_DM_LOWEST; 56#endif 57} 58 59int kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src, 60 struct kvm_lapic_irq *irq) 61{ 62 int i, r = -1; 63 struct kvm_vcpu *vcpu, *lowest = NULL; 64 65 if (irq->dest_mode == 0 && irq->dest_id == 0xff && 66 kvm_is_dm_lowest_prio(irq)) 67 printk(KERN_INFO "kvm: apic: phys broadcast and lowest prio\n"); 68 69 for (i = 0; i < KVM_MAX_VCPUS; i++) { 70 vcpu = kvm->vcpus[i]; 71 72 if (!vcpu || !kvm_apic_present(vcpu)) 73 continue; 74 75 if (!kvm_apic_match_dest(vcpu, src, irq->shorthand, 76 irq->dest_id, irq->dest_mode)) 77 continue; 78 79 if (!kvm_is_dm_lowest_prio(irq)) { 80 if (r < 0) 81 r = 0; 82 r += kvm_apic_set_irq(vcpu, irq); 83 } else { 84 if (!lowest) 85 lowest = vcpu; 86 else if (kvm_apic_compare_prio(vcpu, lowest) < 0) 87 lowest = vcpu; 88 } 89 } 90 91 if (lowest) 92 r = kvm_apic_set_irq(lowest, irq); 93 94 return r; 95} 96 97static int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e, 98 struct kvm *kvm, int level) 99{ 100 struct kvm_lapic_irq irq; 101 102 irq.dest_id = (e->msi.address_lo & 103 MSI_ADDR_DEST_ID_MASK) >> MSI_ADDR_DEST_ID_SHIFT; 104 irq.vector = (e->msi.data & 105 MSI_DATA_VECTOR_MASK) >> MSI_DATA_VECTOR_SHIFT; 106 irq.dest_mode = (1 << MSI_ADDR_DEST_MODE_SHIFT) & e->msi.address_lo; 107 irq.trig_mode = (1 << MSI_DATA_TRIGGER_SHIFT) & e->msi.data; 108 irq.delivery_mode = e->msi.data & 0x700; 109 irq.level = 1; 110 irq.shorthand = 0; 111 112 /* TODO Deal with RH bit of MSI message address */ 113 return kvm_irq_delivery_to_apic(kvm, NULL, &irq); 114} 115 116/* This should be called with the kvm->lock mutex held 117 * Return value: 118 * < 0 Interrupt was ignored (masked or not delivered for other reasons) 119 * = 0 Interrupt was coalesced (previous irq is still pending) 120 * > 0 Number of CPUs interrupt was delivered to 121 */ 122int kvm_set_irq(struct kvm *kvm, int irq_source_id, int irq, int level) 123{ 124 struct kvm_kernel_irq_routing_entry *e; 125 unsigned long *irq_state, sig_level; 126 int ret = -1; 127 128 if (irq < KVM_IOAPIC_NUM_PINS) { 129 irq_state = (unsigned long *)&kvm->arch.irq_states[irq]; 130 131 /* Logical OR for level trig interrupt */ 132 if (level) 133 set_bit(irq_source_id, irq_state); 134 else 135 clear_bit(irq_source_id, irq_state); 136 sig_level = !!(*irq_state); 137 } else /* Deal with MSI/MSI-X */ 138 sig_level = 1; 139 140 /* Not possible to detect if the guest uses the PIC or the 141 * IOAPIC. So set the bit in both. The guest will ignore 142 * writes to the unused one. 143 */ 144 list_for_each_entry(e, &kvm->irq_routing, link) 145 if (e->gsi == irq) { 146 int r = e->set(e, kvm, sig_level); 147 if (r < 0) 148 continue; 149 150 ret = r + ((ret < 0) ? 0 : ret); 151 } 152 return ret; 153} 154 155void kvm_notify_acked_irq(struct kvm *kvm, unsigned irqchip, unsigned pin) 156{ 157 struct kvm_kernel_irq_routing_entry *e; 158 struct kvm_irq_ack_notifier *kian; 159 struct hlist_node *n; 160 unsigned gsi = pin; 161 162 list_for_each_entry(e, &kvm->irq_routing, link) 163 if (e->type == KVM_IRQ_ROUTING_IRQCHIP && 164 e->irqchip.irqchip == irqchip && 165 e->irqchip.pin == pin) { 166 gsi = e->gsi; 167 break; 168 } 169 170 hlist_for_each_entry(kian, n, &kvm->arch.irq_ack_notifier_list, link) 171 if (kian->gsi == gsi) 172 kian->irq_acked(kian); 173} 174 175void kvm_register_irq_ack_notifier(struct kvm *kvm, 176 struct kvm_irq_ack_notifier *kian) 177{ 178 hlist_add_head(&kian->link, &kvm->arch.irq_ack_notifier_list); 179} 180 181void kvm_unregister_irq_ack_notifier(struct kvm_irq_ack_notifier *kian) 182{ 183 hlist_del_init(&kian->link); 184} 185 186/* The caller must hold kvm->lock mutex */ 187int kvm_request_irq_source_id(struct kvm *kvm) 188{ 189 unsigned long *bitmap = &kvm->arch.irq_sources_bitmap; 190 int irq_source_id = find_first_zero_bit(bitmap, 191 sizeof(kvm->arch.irq_sources_bitmap)); 192 193 if (irq_source_id >= sizeof(kvm->arch.irq_sources_bitmap)) { 194 printk(KERN_WARNING "kvm: exhaust allocatable IRQ sources!\n"); 195 return -EFAULT; 196 } 197 198 ASSERT(irq_source_id != KVM_USERSPACE_IRQ_SOURCE_ID); 199 set_bit(irq_source_id, bitmap); 200 201 return irq_source_id; 202} 203 204void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id) 205{ 206 int i; 207 208 ASSERT(irq_source_id != KVM_USERSPACE_IRQ_SOURCE_ID); 209 210 if (irq_source_id < 0 || 211 irq_source_id >= sizeof(kvm->arch.irq_sources_bitmap)) { 212 printk(KERN_ERR "kvm: IRQ source ID out of range!\n"); 213 return; 214 } 215 for (i = 0; i < KVM_IOAPIC_NUM_PINS; i++) 216 clear_bit(irq_source_id, &kvm->arch.irq_states[i]); 217 clear_bit(irq_source_id, &kvm->arch.irq_sources_bitmap); 218} 219 220void kvm_register_irq_mask_notifier(struct kvm *kvm, int irq, 221 struct kvm_irq_mask_notifier *kimn) 222{ 223 kimn->irq = irq; 224 hlist_add_head(&kimn->link, &kvm->mask_notifier_list); 225} 226 227void kvm_unregister_irq_mask_notifier(struct kvm *kvm, int irq, 228 struct kvm_irq_mask_notifier *kimn) 229{ 230 hlist_del(&kimn->link); 231} 232 233void kvm_fire_mask_notifiers(struct kvm *kvm, int irq, bool mask) 234{ 235 struct kvm_irq_mask_notifier *kimn; 236 struct hlist_node *n; 237 238 hlist_for_each_entry(kimn, n, &kvm->mask_notifier_list, link) 239 if (kimn->irq == irq) 240 kimn->func(kimn, mask); 241} 242 243static void __kvm_free_irq_routing(struct list_head *irq_routing) 244{ 245 struct kvm_kernel_irq_routing_entry *e, *n; 246 247 list_for_each_entry_safe(e, n, irq_routing, link) 248 kfree(e); 249} 250 251void kvm_free_irq_routing(struct kvm *kvm) 252{ 253 __kvm_free_irq_routing(&kvm->irq_routing); 254} 255 256static int setup_routing_entry(struct kvm_kernel_irq_routing_entry *e, 257 const struct kvm_irq_routing_entry *ue) 258{ 259 int r = -EINVAL; 260 int delta; 261 262 e->gsi = ue->gsi; 263 e->type = ue->type; 264 switch (ue->type) { 265 case KVM_IRQ_ROUTING_IRQCHIP: 266 delta = 0; 267 switch (ue->u.irqchip.irqchip) { 268 case KVM_IRQCHIP_PIC_MASTER: 269 e->set = kvm_set_pic_irq; 270 break; 271 case KVM_IRQCHIP_PIC_SLAVE: 272 e->set = kvm_set_pic_irq; 273 delta = 8; 274 break; 275 case KVM_IRQCHIP_IOAPIC: 276 e->set = kvm_set_ioapic_irq; 277 break; 278 default: 279 goto out; 280 } 281 e->irqchip.irqchip = ue->u.irqchip.irqchip; 282 e->irqchip.pin = ue->u.irqchip.pin + delta; 283 break; 284 case KVM_IRQ_ROUTING_MSI: 285 e->set = kvm_set_msi; 286 e->msi.address_lo = ue->u.msi.address_lo; 287 e->msi.address_hi = ue->u.msi.address_hi; 288 e->msi.data = ue->u.msi.data; 289 break; 290 default: 291 goto out; 292 } 293 r = 0; 294out: 295 return r; 296} 297 298 299int kvm_set_irq_routing(struct kvm *kvm, 300 const struct kvm_irq_routing_entry *ue, 301 unsigned nr, 302 unsigned flags) 303{ 304 struct list_head irq_list = LIST_HEAD_INIT(irq_list); 305 struct list_head tmp = LIST_HEAD_INIT(tmp); 306 struct kvm_kernel_irq_routing_entry *e = NULL; 307 unsigned i; 308 int r; 309 310 for (i = 0; i < nr; ++i) { 311 r = -EINVAL; 312 if (ue->gsi >= KVM_MAX_IRQ_ROUTES) 313 goto out; 314 if (ue->flags) 315 goto out; 316 r = -ENOMEM; 317 e = kzalloc(sizeof(*e), GFP_KERNEL); 318 if (!e) 319 goto out; 320 r = setup_routing_entry(e, ue); 321 if (r) 322 goto out; 323 ++ue; 324 list_add(&e->link, &irq_list); 325 e = NULL; 326 } 327 328 mutex_lock(&kvm->lock); 329 list_splice(&kvm->irq_routing, &tmp); 330 INIT_LIST_HEAD(&kvm->irq_routing); 331 list_splice(&irq_list, &kvm->irq_routing); 332 INIT_LIST_HEAD(&irq_list); 333 list_splice(&tmp, &irq_list); 334 mutex_unlock(&kvm->lock); 335 336 r = 0; 337 338out: 339 kfree(e); 340 __kvm_free_irq_routing(&irq_list); 341 return r; 342} 343 344#define IOAPIC_ROUTING_ENTRY(irq) \ 345 { .gsi = irq, .type = KVM_IRQ_ROUTING_IRQCHIP, \ 346 .u.irqchip.irqchip = KVM_IRQCHIP_IOAPIC, .u.irqchip.pin = (irq) } 347#define ROUTING_ENTRY1(irq) IOAPIC_ROUTING_ENTRY(irq) 348 349#ifdef CONFIG_X86 350# define PIC_ROUTING_ENTRY(irq) \ 351 { .gsi = irq, .type = KVM_IRQ_ROUTING_IRQCHIP, \ 352 .u.irqchip.irqchip = SELECT_PIC(irq), .u.irqchip.pin = (irq) % 8 } 353# define ROUTING_ENTRY2(irq) \ 354 IOAPIC_ROUTING_ENTRY(irq), PIC_ROUTING_ENTRY(irq) 355#else 356# define ROUTING_ENTRY2(irq) \ 357 IOAPIC_ROUTING_ENTRY(irq) 358#endif 359 360static const struct kvm_irq_routing_entry default_routing[] = { 361 ROUTING_ENTRY2(0), ROUTING_ENTRY2(1), 362 ROUTING_ENTRY2(2), ROUTING_ENTRY2(3), 363 ROUTING_ENTRY2(4), ROUTING_ENTRY2(5), 364 ROUTING_ENTRY2(6), ROUTING_ENTRY2(7), 365 ROUTING_ENTRY2(8), ROUTING_ENTRY2(9), 366 ROUTING_ENTRY2(10), ROUTING_ENTRY2(11), 367 ROUTING_ENTRY2(12), ROUTING_ENTRY2(13), 368 ROUTING_ENTRY2(14), ROUTING_ENTRY2(15), 369 ROUTING_ENTRY1(16), ROUTING_ENTRY1(17), 370 ROUTING_ENTRY1(18), ROUTING_ENTRY1(19), 371 ROUTING_ENTRY1(20), ROUTING_ENTRY1(21), 372 ROUTING_ENTRY1(22), ROUTING_ENTRY1(23), 373#ifdef CONFIG_IA64 374 ROUTING_ENTRY1(24), ROUTING_ENTRY1(25), 375 ROUTING_ENTRY1(26), ROUTING_ENTRY1(27), 376 ROUTING_ENTRY1(28), ROUTING_ENTRY1(29), 377 ROUTING_ENTRY1(30), ROUTING_ENTRY1(31), 378 ROUTING_ENTRY1(32), ROUTING_ENTRY1(33), 379 ROUTING_ENTRY1(34), ROUTING_ENTRY1(35), 380 ROUTING_ENTRY1(36), ROUTING_ENTRY1(37), 381 ROUTING_ENTRY1(38), ROUTING_ENTRY1(39), 382 ROUTING_ENTRY1(40), ROUTING_ENTRY1(41), 383 ROUTING_ENTRY1(42), ROUTING_ENTRY1(43), 384 ROUTING_ENTRY1(44), ROUTING_ENTRY1(45), 385 ROUTING_ENTRY1(46), ROUTING_ENTRY1(47), 386#endif 387}; 388 389int kvm_setup_default_irq_routing(struct kvm *kvm) 390{ 391 return kvm_set_irq_routing(kvm, default_routing, 392 ARRAY_SIZE(default_routing), 0); 393}