]> xenbits.xensource.com Git - qemu-xen-4.5-testing.git/commitdiff
PCI passthrough merge completion
authorIan Jackson <ian@davenant.greenend.org.uk>
Fri, 30 May 2008 16:07:31 +0000 (17:07 +0100)
committerIan Jackson <iwj@mariner.uk.xensource.com>
Fri, 30 May 2008 16:07:31 +0000 (17:07 +0100)
Remaining parts of xen-unstable c/s
15891:acfa9290746f9c00e30dca7a62e9f7a96702b3b5:

    PCI passthru: tools changes (generic and vt-d)

    I have added CONFIG_PASSTHROUGH in ioemu/Makefile.target and
    ioemu/hw/pc.c in attached vtd_tools2.patch.  This should turn off
    libpci usage by default until user specifically enables it.

    This can be safely check-in without breaking builds for people who do
    not care about pass-through devices.  I will try to think of a better
    way to enable this.

Signed-off-by: Allen Kay <allen.m.kay@intel.com>
Signed-off-by: Guy Zana <guy@neocleus.com>
hw/boards.h
hw/pc.c
vl.c
xen-hooks.mak

index e0c310f911de1d11765f6e5af2b5b7e9d5057dfa..daad89924d378c74903912b34ee70f9b17f9ea3b 100644 (file)
@@ -8,7 +8,8 @@ typedef void QEMUMachineInitFunc(ram_addr_t ram_size, int vga_ram_size,
                                  const char *kernel_filename,
                                  const char *kernel_cmdline,
                                  const char *initrd_filename,
-                                 const char *cpu_model);
+                                 const char *cpu_model,
+                                const char *direct_pci);
 
 typedef struct QEMUMachine {
     const char *name;
diff --git a/hw/pc.c b/hw/pc.c
index b51bbbb71592c0ca78d4b8c69e2f9744785aa079..aebf1b7d5faf5bf75e2cb99ef69288e08a9e17e1 100644 (file)
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -742,7 +742,8 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_size,
                      const char *boot_device, DisplayState *ds,
                      const char *kernel_filename, const char *kernel_cmdline,
                      const char *initrd_filename,
-                     int pci_enabled, const char *cpu_model)
+                     int pci_enabled, const char *cpu_model,
+                    const char *direct_pci)
 {
     char buf[1024];
     int ret, linux_boot, i;
@@ -758,6 +759,7 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_size,
     int index;
     BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
     BlockDriverState *fd[MAX_FD];
+    int rc;
 
     if (ram_size >= 0xe0000000 ) {
         above_4g_mem_size = ram_size - 0xe0000000;
@@ -944,6 +946,19 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_size,
         }
     }
 
+#ifdef CONFIG_PASSTHROUGH
+    /* Pass-through Initialization */
+    if ( pci_enabled && direct_pci )
+    {
+        rc = pt_init(pci_bus, direct_pci); 
+        if ( rc < 0 )
+        {
+            fprintf(logfile, "Error: Initialization failed for pass-through devices\n");
+            exit(1);
+        }
+    }
+#endif
+
     rtc_state = rtc_init(0x70, i8259[8]);
 
     register_ioport_read(0x92, 1, 1, ioport92_read, NULL);
@@ -1087,11 +1102,13 @@ static void pc_init_pci(ram_addr_t ram_size, int vga_ram_size,
                         const char *kernel_filename,
                         const char *kernel_cmdline,
                         const char *initrd_filename,
-                        const char *cpu_model)
+                        const char *cpu_model,
+                        const char *direct_pci)
 {
     pc_init1(ram_size, vga_ram_size, boot_device, ds,
              kernel_filename, kernel_cmdline,
-             initrd_filename, 1, cpu_model);
+             initrd_filename, 1, cpu_model,
+             direct_pci);
 }
 
 static void pc_init_isa(ram_addr_t ram_size, int vga_ram_size,
@@ -1099,11 +1116,13 @@ static void pc_init_isa(ram_addr_t ram_size, int vga_ram_size,
                         const char *kernel_filename,
                         const char *kernel_cmdline,
                         const char *initrd_filename,
-                        const char *cpu_model)
+                        const char *cpu_model,
+                        const char *direct_pci)
 {
     pc_init1(ram_size, vga_ram_size, boot_device, ds,
              kernel_filename, kernel_cmdline,
-             initrd_filename, 0, cpu_model);
+             initrd_filename, 0, cpu_model,
+             direct_pci);
 }
 
 QEMUMachine pc_machine = {
diff --git a/vl.c b/vl.c
index 74ddc30a7c45a3ccb6906dd7ea8bdce037e117f2..2d35281c525b5e86b43721c4fae10bddc4325e27 100644 (file)
--- a/vl.c
+++ b/vl.c
@@ -7405,6 +7405,7 @@ enum {
     QEMU_OPTION_smp,
     QEMU_OPTION_vnc,
     QEMU_OPTION_vncunused,
+    QEMU_OPTION_pci,
     QEMU_OPTION_no_acpi,
     QEMU_OPTION_curses,
     QEMU_OPTION_no_reboot,
@@ -7506,6 +7507,7 @@ const QEMUOption qemu_options[] = {
     { "smp", HAS_ARG, QEMU_OPTION_smp },
     { "vnc", HAS_ARG, QEMU_OPTION_vnc },
     { "vncunused", 0, QEMU_OPTION_vncunused },
+    { "pci", HAS_ARG, QEMU_OPTION_pci },
 #ifdef CONFIG_CURSES
     { "curses", 0, QEMU_OPTION_curses },
 #endif
@@ -7746,6 +7748,8 @@ int main(int argc, char **argv)
     const char *pid_file = NULL;
     VLANState *vlan;
 
+    const char *direct_pci = NULL;
+
 #if !defined(__sun__) && !defined(CONFIG_STUBDOM)
     /* Maximise rlimits. Needed where default constraints are tight (*BSD). */
     if (getrlimit(RLIMIT_STACK, &rl) != 0) {
@@ -8115,6 +8119,9 @@ int main(int argc, char **argv)
                 }
                 ram_size = value;
                 break;
+            case QEMU_OPTION_pci:
+                direct_pci = optarg;
+                break;
             }
             case QEMU_OPTION_d:
                 {
@@ -8660,7 +8667,8 @@ int main(int argc, char **argv)
     }
 
     machine->init(ram_size, vga_ram_size, boot_devices, ds,
-                  kernel_filename, kernel_cmdline, initrd_filename, cpu_model);
+                  kernel_filename, kernel_cmdline, initrd_filename, cpu_model,
+                 direct_pci);
 
     /* init USB devices */
     if (usb_enabled) {
index de3ce3751bbdfc87b0453751ed208ca03c4eda60..6e16aa3fc58e832584e1f86393167910296c4884 100644 (file)
@@ -26,6 +26,10 @@ OBJS += xenfb.o
 OBJS += xen_console.o
 OBJS += xen_machine_fv.o
 
+ifdef CONFIG_PASSTHROUGH
+OBJS+= pass-through.o
+endif
+
 BAD_OBJS += loader.o monitor.o gdbstub.o acpi.o
 
 OBJS := $(filter-out $(BAD_OBJS), $(OBJS))