[PATCH] KVM: Userspace: Make device-assignment work for kvm/ia64.

"Zhang, Xiantao" <[email protected]>
Newsgroups org.kernel.vger.kvm-ia64,org.kernel.vger.kvm
Message-ID <706158FABBBA044BAD4FE898A02E4BC21983F921@pdsmsx503.ccr.corp.intel.com>
From 45b40eecff85b9a7ae4caf4ae184905a79e5a139 Mon Sep 17 00:00:00 2001
From: Xiantao Zhang <[email protected]>
Date: Fri, 7 Nov 2008 18:13:13 +0800
Subject: [PATCH] KVM: Userspace: Make device-assignment work for kvm/ia64.

kvm/ia64 have supported vt-d from 2.6.28rc1, this patch
enables its userspace's support.

Signed-off-by: Xiantao Zhang <[email protected]>
---
 kernel/ia64/Kbuild          |    4 ++++
 qemu/Makefile.target        |    7 ++++---
 qemu/hw/device-assignment.c |    4 ++++
 qemu/hw/ipf.c               |   27 +++++++++++++++++++++++++--
 qemu/hw/pc.h                |    2 ++
 qemu/vl.c                   |    8 ++++----
 6 files changed, 43 insertions(+), 9 deletions(-)

diff --git a/kernel/ia64/Kbuild b/kernel/ia64/Kbuild
index e9660ba..88eaa39 100644
--- a/kernel/ia64/Kbuild
+++ b/kernel/ia64/Kbuild
@@ -3,6 +3,10 @@ obj-m := kvm.o kvm-intel.o
 kvm-objs := kvm_main.o ioapic.o coalesced_mmio.o kvm-ia64.o kvm_fw.o \
 	irq_comm.o ../anon_inodes.o ../external-module-compat.o
 
+ifeq ($(CONFIG_DMAR),y)
+kvm-objs += vtd.o
+endif
+
 EXTRA_CFLAGS_vcpu.o += -mfixed-range=f2-f5,f12-f127
 kvm-intel-objs := vmm.o vmm_ivt.o trampoline.o vcpu.o optvfault.o mmio.o \
                vtlb.o process.o memset.o memcpy.o
diff --git a/qemu/Makefile.target b/qemu/Makefile.target
index d504b75..229b1c6 100644
--- a/qemu/Makefile.target
+++ b/qemu/Makefile.target
@@ -720,15 +720,16 @@ OBJS += virtio.o virtio-net.o virtio-blk.o virtio-balloon.o
 
 OBJS += device-hotplug.o
 
+ifeq ($(USE_KVM_DEVICE_ASSIGNMENT), 1)
+OBJS+= device-assignment.o
+endif
+
 ifeq ($(TARGET_BASE_ARCH), i386)
 # Hardware support
 OBJS+= ide.o pckbd.o ps2.o vga.o $(SOUND_HW) dma.o
 OBJS+= fdc.o mc146818rtc.o serial.o i8259.o i8254.o pcspk.o pc.o
 OBJS+= cirrus_vga.o apic.o parallel.o acpi.o piix_pci.o
 OBJS+= usb-uhci.o vmmouse.o vmport.o vmware_vga.o extboot.o
-ifeq ($(USE_KVM_DEVICE_ASSIGNMENT), 1)
-OBJS+= device-assignment.o
-endif
 ifeq ($(USE_KVM_PIT), 1)
 OBJS+= i8254-kvm.o
 endif
diff --git a/qemu/hw/device-assignment.c b/qemu/hw/device-assignment.c
index 78b7e14..5cda7d9 100644
--- a/qemu/hw/device-assignment.c
+++ b/qemu/hw/device-assignment.c
@@ -457,6 +457,10 @@ void assigned_dev_update_irq(PCIDevice *d)
         irq = pci_map_irq(&assigned_dev->dev, assigned_dev->intpin);
         irq = piix_get_irq(irq);
 
+#ifdef TARGET_IA64
+	irq = ipf_map_irq(d, irq);
+#endif
+
         if (irq != assigned_dev->girq) {
             struct kvm_assigned_irq assigned_irq_data;
 
diff --git a/qemu/hw/ipf.c b/qemu/hw/ipf.c
index 337c854..f4a2853 100644
--- a/qemu/hw/ipf.c
+++ b/qemu/hw/ipf.c
@@ -38,6 +38,7 @@
 #include "firmware.h"
 #include "ia64intrin.h"
 #include <unistd.h>
+#include "device-assignment.h"
 
 #include "qemu-kvm.h"
 
@@ -450,7 +451,6 @@ static void ipf_init1(ram_addr_t ram_size, int vga_ram_size,
 
     /*Load firware to its proper position.*/
     if (kvm_enabled()) {
-        int r;
         unsigned long  image_size;
         char *image = NULL;
         uint8_t *fw_image_start;
@@ -645,8 +645,26 @@ static void ipf_init1(ram_addr_t ram_size, int vga_ram_size,
 	    unit_id++;
 	}
     }
-}
 
+#ifdef USE_KVM_DEVICE_ASSIGNMENT
+    if (kvm_enabled()) {
+	int i;
+        for (i = 0; i < assigned_devices_index; i++) {
+            if (add_assigned_device(assigned_devices[i]) < 0) {
+                fprintf(stderr, "Warning: could not add assigned device %s\n",
+                        assigned_devices[i]);
+            }
+        }
+
+	if (init_all_assigned_devices(pci_bus)) {
+	    fprintf(stderr, "Failed to initialize assigned devices\n");
+	    exit (1);
+	}
+    }
+#endif /* USE_KVM_DEVICE_ASSIGNMENT */
+
+}
+ 
 static void ipf_init_pci(ram_addr_t ram_size, int vga_ram_size,
                          const char *boot_device, DisplayState *ds,
                          const char *kernel_filename,
@@ -695,3 +713,8 @@ void ioapic_set_irq(void *opaque, int irq_num, int level)
 	    return;
     }
 }
+
+int ipf_map_irq(PCIDevice *pci_dev, int irq_num)
+{
+	return ioapic_map_irq(pci_dev->devfn, irq_num);
+}
diff --git a/qemu/hw/pc.h b/qemu/hw/pc.h
index fddfdfa..074195d 100644
--- a/qemu/hw/pc.h
+++ b/qemu/hw/pc.h
@@ -118,6 +118,8 @@ int piix4_init(PCIBus *bus, int devfn);
 
 int piix_get_irq(int pin);
 
+int ipf_map_irq(PCIDevice *pci_dev, int irq_num);
+
 /* vga.c */
 enum vga_retrace_method {
     VGA_RETRACE_DUMB,
diff --git a/qemu/vl.c b/qemu/vl.c
index 561e254..c383587 100644
--- a/qemu/vl.c
+++ b/qemu/vl.c
@@ -8694,7 +8694,7 @@ static void help(int exitcode)
 #endif
 	   "-no-kvm-irqchip disable KVM kernel mode PIC/IOAPIC/LAPIC\n"
 	   "-no-kvm-pit	    disable KVM kernel mode PIT\n"
-#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(__linux__)
+#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(TARGET_IA64) || defined(__linux__)
            "-pcidevice host=bus:dev.func[,dma=none][,name=string]\n"
            "                expose a PCI device to the guest OS.\n"
            "                dma=none: don't perform any dma translations (default is to use an iommu)\n"
@@ -8819,7 +8819,7 @@ enum {
     QEMU_OPTION_no_kvm,
     QEMU_OPTION_no_kvm_irqchip,
     QEMU_OPTION_no_kvm_pit,
-#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(__linux__)
+#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(TARGET_IA64) || defined(__linux__)
     QEMU_OPTION_pcidevice,
 #endif
     QEMU_OPTION_no_reboot,
@@ -8911,7 +8911,7 @@ static const QEMUOption qemu_options[] = {
 #endif
     { "no-kvm-irqchip", 0, QEMU_OPTION_no_kvm_irqchip },
     { "no-kvm-pit", 0, QEMU_OPTION_no_kvm_pit },
-#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(__linux__)
+#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(TARGET_IA64) || defined(__linux__)
     { "pcidevice", HAS_ARG, QEMU_OPTION_pcidevice },
 #endif
 #endif
@@ -9859,7 +9859,7 @@ int main(int argc, char **argv)
 		kvm_pit = 0;
 		break;
 	    }
-#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(__linux__)
+#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(TARGET_IA64) || defined(__linux__)
             case QEMU_OPTION_pcidevice:
 		if (assigned_devices_index >= MAX_DEV_ASSIGN_CMDLINE) {
                     fprintf(stderr, "Too many assigned devices\n");
-- 
1.6.0
0001-KVM-Userspace-Make-device-assignment-work-for-kvm.patch (application/octet-stream, 6.2 KB)
From 45b40eecff85b9a7ae4caf4ae184905a79e5a139 Mon Sep 17 00:00:00 2001
From: Xiantao Zhang <[email protected]>
Date: Fri, 7 Nov 2008 18:13:13 +0800
Subject: [PATCH] KVM: Userspace: Make device-assignment work for kvm/ia64.

kvm/ia64 have supported vt-d support from 2.6.28rc1, this patch
enables its userspace's support.

Signed-off-by: Xiantao Zhang <[email protected]>
---
 kernel/ia64/Kbuild          |    4 ++++
 qemu/Makefile.target        |    7 ++++---
 qemu/hw/device-assignment.c |    4 ++++
 qemu/hw/ipf.c               |   27 +++++++++++++++++++++++++--
 qemu/hw/pc.h                |    2 ++
 qemu/vl.c                   |    8 ++++----
 6 files changed, 43 insertions(+), 9 deletions(-)

diff --git a/kernel/ia64/Kbuild b/kernel/ia64/Kbuild
index e9660ba..88eaa39 100644
--- a/kernel/ia64/Kbuild
+++ b/kernel/ia64/Kbuild
@@ -3,6 +3,10 @@ obj-m := kvm.o kvm-intel.o
 kvm-objs := kvm_main.o ioapic.o coalesced_mmio.o kvm-ia64.o kvm_fw.o \
 	irq_comm.o ../anon_inodes.o ../external-module-compat.o
 
+ifeq ($(CONFIG_DMAR),y)
+kvm-objs += vtd.o
+endif
+
 EXTRA_CFLAGS_vcpu.o += -mfixed-range=f2-f5,f12-f127
 kvm-intel-objs := vmm.o vmm_ivt.o trampoline.o vcpu.o optvfault.o mmio.o \
                vtlb.o process.o memset.o memcpy.o
diff --git a/qemu/Makefile.target b/qemu/Makefile.target
index d504b75..229b1c6 100644
--- a/qemu/Makefile.target
+++ b/qemu/Makefile.target
@@ -720,15 +720,16 @@ OBJS += virtio.o virtio-net.o virtio-blk.o virtio-balloon.o
 
 OBJS += device-hotplug.o
 
+ifeq ($(USE_KVM_DEVICE_ASSIGNMENT), 1)
+OBJS+= device-assignment.o
+endif
+
 ifeq ($(TARGET_BASE_ARCH), i386)
 # Hardware support
 OBJS+= ide.o pckbd.o ps2.o vga.o $(SOUND_HW) dma.o
 OBJS+= fdc.o mc146818rtc.o serial.o i8259.o i8254.o pcspk.o pc.o
 OBJS+= cirrus_vga.o apic.o parallel.o acpi.o piix_pci.o
 OBJS+= usb-uhci.o vmmouse.o vmport.o vmware_vga.o extboot.o
-ifeq ($(USE_KVM_DEVICE_ASSIGNMENT), 1)
-OBJS+= device-assignment.o
-endif
 ifeq ($(USE_KVM_PIT), 1)
 OBJS+= i8254-kvm.o
 endif
diff --git a/qemu/hw/device-assignment.c b/qemu/hw/device-assignment.c
index 78b7e14..5cda7d9 100644
--- a/qemu/hw/device-assignment.c
+++ b/qemu/hw/device-assignment.c
@@ -457,6 +457,10 @@ void assigned_dev_update_irq(PCIDevice *d)
         irq = pci_map_irq(&assigned_dev->dev, assigned_dev->intpin);
         irq = piix_get_irq(irq);
 
+#ifdef TARGET_IA64
+	irq = ipf_map_irq(d, irq);
+#endif
+
         if (irq != assigned_dev->girq) {
             struct kvm_assigned_irq assigned_irq_data;
 
diff --git a/qemu/hw/ipf.c b/qemu/hw/ipf.c
index 337c854..f4a2853 100644
--- a/qemu/hw/ipf.c
+++ b/qemu/hw/ipf.c
@@ -38,6 +38,7 @@
 #include "firmware.h"
 #include "ia64intrin.h"
 #include <unistd.h>
+#include "device-assignment.h"
 
 #include "qemu-kvm.h"
 
@@ -450,7 +451,6 @@ static void ipf_init1(ram_addr_t ram_size, int vga_ram_size,
 
     /*Load firware to its proper position.*/
     if (kvm_enabled()) {
-        int r;
         unsigned long  image_size;
         char *image = NULL;
         uint8_t *fw_image_start;
@@ -645,8 +645,26 @@ static void ipf_init1(ram_addr_t ram_size, int vga_ram_size,
 	    unit_id++;
 	}
     }
-}
 
+#ifdef USE_KVM_DEVICE_ASSIGNMENT
+    if (kvm_enabled()) {
+	int i;
+        for (i = 0; i < assigned_devices_index; i++) {
+            if (add_assigned_device(assigned_devices[i]) < 0) {
+                fprintf(stderr, "Warning: could not add assigned device %s\n",
+                        assigned_devices[i]);
+            }
+        }
+
+	if (init_all_assigned_devices(pci_bus)) {
+	    fprintf(stderr, "Failed to initialize assigned devices\n");
+	    exit (1);
+	}
+    }
+#endif /* USE_KVM_DEVICE_ASSIGNMENT */
+
+}
+ 
 static void ipf_init_pci(ram_addr_t ram_size, int vga_ram_size,
                          const char *boot_device, DisplayState *ds,
                          const char *kernel_filename,
@@ -695,3 +713,8 @@ void ioapic_set_irq(void *opaque, int irq_num, int level)
 	    return;
     }
 }
+
+int ipf_map_irq(PCIDevice *pci_dev, int irq_num)
+{
+	return ioapic_map_irq(pci_dev->devfn, irq_num);
+}
diff --git a/qemu/hw/pc.h b/qemu/hw/pc.h
index fddfdfa..074195d 100644
--- a/qemu/hw/pc.h
+++ b/qemu/hw/pc.h
@@ -118,6 +118,8 @@ int piix4_init(PCIBus *bus, int devfn);
 
 int piix_get_irq(int pin);
 
+int ipf_map_irq(PCIDevice *pci_dev, int irq_num);
+
 /* vga.c */
 enum vga_retrace_method {
     VGA_RETRACE_DUMB,
diff --git a/qemu/vl.c b/qemu/vl.c
index 561e254..c383587 100644
--- a/qemu/vl.c
+++ b/qemu/vl.c
@@ -8694,7 +8694,7 @@ static void help(int exitcode)
 #endif
 	   "-no-kvm-irqchip disable KVM kernel mode PIC/IOAPIC/LAPIC\n"
 	   "-no-kvm-pit	    disable KVM kernel mode PIT\n"
-#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(__linux__)
+#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(TARGET_IA64) || defined(__linux__)
            "-pcidevice host=bus:dev.func[,dma=none][,name=string]\n"
            "                expose a PCI device to the guest OS.\n"
            "                dma=none: don't perform any dma translations (default is to use an iommu)\n"
@@ -8819,7 +8819,7 @@ enum {
     QEMU_OPTION_no_kvm,
     QEMU_OPTION_no_kvm_irqchip,
     QEMU_OPTION_no_kvm_pit,
-#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(__linux__)
+#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(TARGET_IA64) || defined(__linux__)
     QEMU_OPTION_pcidevice,
 #endif
     QEMU_OPTION_no_reboot,
@@ -8911,7 +8911,7 @@ static const QEMUOption qemu_options[] = {
 #endif
     { "no-kvm-irqchip", 0, QEMU_OPTION_no_kvm_irqchip },
     { "no-kvm-pit", 0, QEMU_OPTION_no_kvm_pit },
-#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(__linux__)
+#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(TARGET_IA64) || defined(__linux__)
     { "pcidevice", HAS_ARG, QEMU_OPTION_pcidevice },
 #endif
 #endif
@@ -9859,7 +9859,7 @@ int main(int argc, char **argv)
 		kvm_pit = 0;
 		break;
 	    }
-#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(__linux__)
+#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(TARGET_IA64) || defined(__linux__)
             case QEMU_OPTION_pcidevice:
 		if (assigned_devices_index >= MAX_DEV_ASSIGN_CMDLINE) {
                     fprintf(stderr, "Too many assigned devices\n");
-- 
1.6.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.