From: Xiantao Zhang <[EMAIL PROTECTED]>

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]>
Signed-off-by: Avi Kivity <[EMAIL PROTECTED]>

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 62a1b4e..685280d 100644
--- a/qemu/Makefile.target
+++ b/qemu/Makefile.target
@@ -721,15 +721,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 bab08fa..e1c3372 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..37f2de7 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,6 +645,24 @@ 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,
@@ -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 b3400b0..f22e3fd 100644
--- a/qemu/vl.c
+++ b/qemu/vl.c
@@ -4932,7 +4932,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"
@@ -5057,7 +5057,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,
@@ -5149,7 +5149,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
@@ -6096,7 +6096,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");
--
To unsubscribe from this list: send the line "unsubscribe kvm-commits" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to