aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorAvi Kivity <avi@redhat.com>2008-11-19 06:58:46 -0500
committerAvi Kivity <avi@redhat.com>2009-03-24 05:03:06 -0400
commit399ec807ddc38ecccf8c06dbde04531cbdc63e11 (patch)
tree75a4e3ee9cfffb4ecf7b4608bb592c89f2b62219 /include
parent193554750441d91e127dd5066b8aebe0f769101c (diff)
KVM: Userspace controlled irq routing
Currently KVM has a static routing from GSI numbers to interrupts (namely, 0-15 are mapped 1:1 to both PIC and IOAPIC, and 16:23 are mapped 1:1 to the IOAPIC). This is insufficient for several reasons: - HPET requires non 1:1 mapping for the timer interrupt - MSIs need a new method to assign interrupt numbers and dispatch them - ACPI APIC mode needs to be able to reassign the PCI LINK interrupts to the ioapics This patch implements an interrupt routing table (as a linked list, but this can be easily changed) and a userspace interface to replace the table. The routing table is initialized according to the current hardwired mapping. Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'include')
-rw-r--r--include/linux/kvm.h33
-rw-r--r--include/linux/kvm_host.h31
2 files changed, 64 insertions, 0 deletions
diff --git a/include/linux/kvm.h b/include/linux/kvm.h
index 73f348066866..7a5d73a8d4fa 100644
--- a/include/linux/kvm.h
+++ b/include/linux/kvm.h
@@ -399,6 +399,38 @@ struct kvm_trace_rec {
399#if defined(CONFIG_X86) 399#if defined(CONFIG_X86)
400#define KVM_CAP_REINJECT_CONTROL 24 400#define KVM_CAP_REINJECT_CONTROL 24
401#endif 401#endif
402#if defined(CONFIG_X86)||defined(CONFIG_IA64)
403#define KVM_CAP_IRQ_ROUTING 25
404#endif
405
406#ifdef KVM_CAP_IRQ_ROUTING
407
408struct kvm_irq_routing_irqchip {
409 __u32 irqchip;
410 __u32 pin;
411};
412
413/* gsi routing entry types */
414#define KVM_IRQ_ROUTING_IRQCHIP 1
415
416struct kvm_irq_routing_entry {
417 __u32 gsi;
418 __u32 type;
419 __u32 flags;
420 __u32 pad;
421 union {
422 struct kvm_irq_routing_irqchip irqchip;
423 __u32 pad[8];
424 } u;
425};
426
427struct kvm_irq_routing {
428 __u32 nr;
429 __u32 flags;
430 struct kvm_irq_routing_entry entries[0];
431};
432
433#endif
402 434
403/* 435/*
404 * ioctls for VM fds 436 * ioctls for VM fds
@@ -430,6 +462,7 @@ struct kvm_trace_rec {
430 _IOW(KVMIO, 0x68, struct kvm_coalesced_mmio_zone) 462 _IOW(KVMIO, 0x68, struct kvm_coalesced_mmio_zone)
431#define KVM_ASSIGN_PCI_DEVICE _IOR(KVMIO, 0x69, \ 463#define KVM_ASSIGN_PCI_DEVICE _IOR(KVMIO, 0x69, \
432 struct kvm_assigned_pci_dev) 464 struct kvm_assigned_pci_dev)
465#define KVM_SET_GSI_ROUTING _IOW(KVMIO, 0x6a, struct kvm_irq_routing)
433#define KVM_ASSIGN_IRQ _IOR(KVMIO, 0x70, \ 466#define KVM_ASSIGN_IRQ _IOR(KVMIO, 0x70, \
434 struct kvm_assigned_irq) 467 struct kvm_assigned_irq)
435#define KVM_REINJECT_CONTROL _IO(KVMIO, 0x71) 468#define KVM_REINJECT_CONTROL _IO(KVMIO, 0x71)
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index 99963f36a6db..ce285e01bd57 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -107,6 +107,19 @@ struct kvm_memory_slot {
107 int user_alloc; 107 int user_alloc;
108}; 108};
109 109
110struct kvm_kernel_irq_routing_entry {
111 u32 gsi;
112 void (*set)(struct kvm_kernel_irq_routing_entry *e,
113 struct kvm *kvm, int level);
114 union {
115 struct {
116 unsigned irqchip;
117 unsigned pin;
118 } irqchip;
119 };
120 struct list_head link;
121};
122
110struct kvm { 123struct kvm {
111 struct mutex lock; /* protects the vcpus array and APIC accesses */ 124 struct mutex lock; /* protects the vcpus array and APIC accesses */
112 spinlock_t mmu_lock; 125 spinlock_t mmu_lock;
@@ -128,6 +141,7 @@ struct kvm {
128#endif 141#endif
129 142
130#ifdef CONFIG_HAVE_KVM_IRQCHIP 143#ifdef CONFIG_HAVE_KVM_IRQCHIP
144 struct list_head irq_routing; /* of kvm_kernel_irq_routing_entry */
131 struct hlist_head mask_notifier_list; 145 struct hlist_head mask_notifier_list;
132#endif 146#endif
133 147
@@ -480,4 +494,21 @@ static inline int mmu_notifier_retry(struct kvm_vcpu *vcpu, unsigned long mmu_se
480} 494}
481#endif 495#endif
482 496
497#ifdef CONFIG_HAVE_KVM_IRQCHIP
498
499#define KVM_MAX_IRQ_ROUTES 1024
500
501int kvm_setup_default_irq_routing(struct kvm *kvm);
502int kvm_set_irq_routing(struct kvm *kvm,
503 const struct kvm_irq_routing_entry *entries,
504 unsigned nr,
505 unsigned flags);
506void kvm_free_irq_routing(struct kvm *kvm);
507
508#else
509
510static inline void kvm_free_irq_routing(struct kvm *kvm) {}
511
512#endif
513
483#endif 514#endif