From: Ian Jackson Date: Fri, 30 May 2008 16:07:31 +0000 (+0100) Subject: PCI passthrough merge completion X-Git-Tag: xen-3.3.0-rc1~143 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=24a047fe49da1d279f7d8db1c8a7749b456f987a;p=qemu-xen-4.0-testing.git PCI passthrough merge completion 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 Signed-off-by: Guy Zana --- diff --git a/hw/boards.h b/hw/boards.h index e0c310f9..daad8992 100644 --- a/hw/boards.h +++ b/hw/boards.h @@ -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 b51bbbb7..aebf1b7d 100644 --- 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 74ddc30a..2d35281c 100644 --- 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) { diff --git a/xen-hooks.mak b/xen-hooks.mak index de3ce375..6e16aa3f 100644 --- a/xen-hooks.mak +++ b/xen-hooks.mak @@ -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))