From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:58293) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SWX4W-0008NT-GN for qemu-devel@nongnu.org; Mon, 21 May 2012 14:11:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SWX4T-0001AX-CQ for qemu-devel@nongnu.org; Mon, 21 May 2012 14:11:08 -0400 Received: from mx1.redhat.com ([209.132.183.28]:28147) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SWX4T-00018K-4g for qemu-devel@nongnu.org; Mon, 21 May 2012 14:11:05 -0400 From: Avi Kivity Date: Mon, 21 May 2012 19:37:41 +0300 Message-Id: <1337618267-16669-14-git-send-email-avi@redhat.com> In-Reply-To: <1337618267-16669-1-git-send-email-avi@redhat.com> References: <1337618267-16669-1-git-send-email-avi@redhat.com> Subject: [Qemu-devel] [PATCH 13/19] kvm: Introduce kvm_irqchip_add_msi_route List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Anthony Liguori Cc: Jan Kiszka , Marcelo Tosatti , qemu-devel@nongnu.org, kvm@vger.kernel.org From: Jan Kiszka Add a service that establishes a static route from a virtual IRQ line to an MSI message. Will be used for IRQFD and device assignment. As we will use this service outside of CONFIG_KVM protected code, stub it properly. Signed-off-by: Jan Kiszka Signed-off-by: Avi Kivity --- kvm-all.c | 31 +++++++++++++++++++++++++++++++ kvm-stub.c | 8 ++++++++ kvm.h | 10 ++++++---- 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/kvm-all.c b/kvm-all.c index 0117837..7f906ca 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -1080,6 +1080,32 @@ int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg) return kvm_irqchip_set_irq(s, route->kroute.gsi, 1); } +int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg) +{ + struct kvm_irq_routing_entry kroute; + int virq; + + if (!kvm_irqchip_in_kernel()) { + return -ENOSYS; + } + + virq = kvm_irqchip_get_virq(s); + if (virq < 0) { + return virq; + } + + kroute.gsi = virq; + kroute.type = KVM_IRQ_ROUTING_MSI; + kroute.flags = 0; + kroute.u.msi.address_lo = (uint32_t)msg.address; + kroute.u.msi.address_hi = msg.address >> 32; + kroute.u.msi.data = msg.data; + + kvm_add_routing_entry(s, &kroute); + + return virq; +} + #else /* !KVM_CAP_IRQ_ROUTING */ static void kvm_init_irq_routing(KVMState *s) @@ -1090,6 +1116,11 @@ int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg) { abort(); } + +int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg) +{ + abort(); +} #endif /* !KVM_CAP_IRQ_ROUTING */ static int kvm_irqchip_create(KVMState *s) diff --git a/kvm-stub.c b/kvm-stub.c index 47c573d..db3a7dc 100644 --- a/kvm-stub.c +++ b/kvm-stub.c @@ -12,10 +12,13 @@ #include "qemu-common.h" #include "hw/hw.h" +#include "hw/msi.h" #include "cpu.h" #include "gdbstub.h" #include "kvm.h" +KVMState *kvm_state; + int kvm_init_vcpu(CPUArchState *env) { return -ENOSYS; @@ -128,3 +131,8 @@ int kvm_on_sigbus(int code, void *addr) { return 1; } + +int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg) +{ + return -ENOSYS; +} diff --git a/kvm.h b/kvm.h index 8b061bd..67df1f1 100644 --- a/kvm.h +++ b/kvm.h @@ -44,6 +44,10 @@ typedef struct KVMCapabilityInfo { #define KVM_CAP_INFO(CAP) { "KVM_CAP_" stringify(CAP), KVM_CAP_##CAP } #define KVM_CAP_LAST_INFO { NULL, 0 } +struct KVMState; +typedef struct KVMState KVMState; +extern KVMState *kvm_state; + /* external API */ int kvm_init(void); @@ -88,10 +92,6 @@ int kvm_on_sigbus(int code, void *addr); /* internal API */ -struct KVMState; -typedef struct KVMState KVMState; -extern KVMState *kvm_state; - int kvm_ioctl(KVMState *s, int type, ...); int kvm_vm_ioctl(KVMState *s, int type, ...); @@ -213,4 +213,6 @@ int kvm_set_ioeventfd_mmio(int fd, uint32_t adr, uint32_t val, bool assign, uint32_t size); int kvm_set_ioeventfd_pio_word(int fd, uint16_t adr, uint16_t val, bool assign); + +int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg); #endif -- 1.7.10.1