From f8e83f054871b7968d2ba6ae4a9efab56fe7b3cd Mon Sep 17 00:00:00 2001 From: Alexandre Derumier Date: Mon, 26 May 2014 09:49:56 +0200 Subject: [PATCH] enable q35 machine support q35 use pcie.0 root by default. so currently we can't start machine model q35. we need to add 3 pci-bridge pci.0, pci.1, pci.2, to handle our devices. pcie.0 does not support hotplug. so pci-bridge are defined at startup. I use an pve-q35.cfg (mostly the same than q35-chipset.cfg from qemu docs). Signed-off-by: Alexandre Derumier --- Makefile | 1 + PVE/QemuServer.pm | 43 ++++++++------ pve-q35.cfg | 147 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 174 insertions(+), 17 deletions(-) create mode 100644 pve-q35.cfg diff --git a/Makefile b/Makefile index 61a25e0e..41206257 100644 --- a/Makefile +++ b/Makefile @@ -75,6 +75,7 @@ install: ${PKGSOURCES} install -d ${DESTDIR}/usr/share/man/man5 install -d ${DESTDIR}/usr/share/${PACKAGE} install -m 0644 pve-usb.cfg ${DESTDIR}/usr/share/${PACKAGE} + install -m 0644 pve-q35.cfg ${DESTDIR}/usr/share/${PACKAGE} make -C PVE install install -m 0755 qm ${DESTDIR}${SBINDIR} install -m 0755 qmrestore ${DESTDIR}${SBINDIR} diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm index 3b3c0ab8..d26da8cc 100644 --- a/PVE/QemuServer.pm +++ b/PVE/QemuServer.pm @@ -2331,6 +2331,7 @@ sub config_to_command { my $have_ovz = -f '/proc/vz/vestat'; + my $q35 = 1 if($conf->{machine} && $conf->{machine} =~ m/q35/); push @$cmd, '/usr/bin/kvm'; push @$cmd, '-id', $vmid; @@ -2348,16 +2349,20 @@ sub config_to_command { push @$cmd, '-daemonize'; - $pciaddr = print_pci_addr("piix3", $bridges); - push @$devices, '-device', "piix3-usb-uhci,id=uhci$pciaddr.0x2"; + if($q35){ + push @$devices, '-readconfig', '/usr/share/qemu-server/pve-q35.cfg'; + }else{ + $pciaddr = print_pci_addr("piix3", $bridges); + push @$devices, '-device', "piix3-usb-uhci,id=uhci$pciaddr.0x2"; - my $use_usb2 = 0; - for (my $i = 0; $i < $MAX_USB_DEVICES; $i++) { - next if !$conf->{"usb$i"}; - $use_usb2 = 1; + my $use_usb2 = 0; + for (my $i = 0; $i < $MAX_USB_DEVICES; $i++) { + next if !$conf->{"usb$i"}; + $use_usb2 = 1; + } + # include usb device config + push @$devices, '-readconfig', '/usr/share/qemu-server/pve-usb.cfg' if $use_usb2; } - # include usb device config - push @$devices, '-readconfig', '/usr/share/qemu-server/pve-usb.cfg' if $use_usb2; my $vga = $conf->{vga}; @@ -2384,7 +2389,8 @@ sub config_to_command { $tablet = 0 if $vga =~ m/^serial\d+$/; # disable if we use serial terminal (no vga card) } - push @$devices, '-device', 'usb-tablet,id=tablet,bus=uhci.0,port=1' if $tablet; + my $usbbus = $q35 ? "ehci" : "uhci"; + push @$devices, '-device', "usb-tablet,id=tablet,bus=$usbbus.0,port=1" if $tablet; # host pci devices for (my $i = 0; $i < $MAX_HOSTPCI_DEVICES; $i++) { @@ -2671,13 +2677,14 @@ sub config_to_command { push @$devices, '-device', $netdevicefull; } - #bridges - while (my ($k, $v) = each %$bridges) { - $pciaddr = print_pci_addr("pci.$k"); - unshift @$devices, '-device', "pci-bridge,id=pci.$k,chassis_nr=$k$pciaddr" if $k > 0; + if(!$q35){ + #bridges + while (my ($k, $v) = each %$bridges) { + $pciaddr = print_pci_addr("pci.$k"); + unshift @$devices, '-device', "pci-bridge,id=pci.$k,chassis_nr=$k$pciaddr" if $k > 0; + } } - # hack: virtio with fairsched is unreliable, so we do not use fairsched # when the VM uses virtio devices. if (!$use_virtio && $have_ovz) { @@ -2756,9 +2763,10 @@ sub vm_deviceplug { my ($storecfg, $conf, $vmid, $deviceid, $device) = @_; return 1 if !check_running($vmid); - + my $q35 = 1 if ($conf->{machine} && $conf->{machine} =~ m/q35/); if ($deviceid eq 'tablet') { - my $devicefull = "usb-tablet,id=tablet,bus=uhci.0,port=1"; + my $usbbus = $q35 ? "ehci" : "uhci"; + my $devicefull = "usb-tablet,id=tablet,bus=$usbbus.0,port=1"; qemu_deviceadd($vmid, $devicefull); return 1; } @@ -2809,7 +2817,8 @@ sub vm_deviceplug { } } - if ($deviceid =~ m/^(pci\.)(\d+)$/) { + + if (!$q35 && $deviceid =~ m/^(pci\.)(\d+)$/) { my $bridgeid = $2; my $pciaddr = print_pci_addr($deviceid); my $devicefull = "pci-bridge,id=pci.$bridgeid,chassis_nr=$bridgeid$pciaddr"; diff --git a/pve-q35.cfg b/pve-q35.cfg new file mode 100644 index 00000000..f9f72fc4 --- /dev/null +++ b/pve-q35.cfg @@ -0,0 +1,147 @@ +[device "ehci"] + driver = "ich9-usb-ehci1" + multifunction = "on" + bus = "pcie.0" + addr = "1d.7" + +[device "uhci-1"] + driver = "ich9-usb-uhci1" + multifunction = "on" + bus = "pcie.0" + addr = "1d.0" + masterbus = "ehci.0" + firstport = "0" + +[device "uhci-2"] + driver = "ich9-usb-uhci2" + multifunction = "on" + bus = "pcie.0" + addr = "1d.1" + masterbus = "ehci.0" + firstport = "2" + +[device "uhci-3"] + driver = "ich9-usb-uhci3" + multifunction = "on" + bus = "pcie.0" + addr = "1d.2" + masterbus = "ehci.0" + firstport = "4" + +[device "ehci-2"] + driver = "ich9-usb-ehci2" + multifunction = "on" + bus = "pcie.0" + addr = "1a.7" + +[device "uhci-4"] + driver = "ich9-usb-uhci4" + multifunction = "on" + bus = "pcie.0" + addr = "1a.0" + masterbus = "ehci-2.0" + firstport = "0" + +[device "uhci-5"] + driver = "ich9-usb-uhci5" + multifunction = "on" + bus = "pcie.0" + addr = "1a.1" + masterbus = "ehci-2.0" + firstport = "2" + +[device "uhci-6"] + driver = "ich9-usb-uhci6" + multifunction = "on" + bus = "pcie.0" + addr = "1a.2" + masterbus = "ehci-2.0" + firstport = "4" + + +[device "audio0"] + driver = "ich9-intel-hda" + bus = "pcie.0" + addr = "1b.0" + + +[device "ich9-pcie-port-1"] + driver = "ioh3420" + multifunction = "on" + bus = "pcie.0" + addr = "1c.0" + port = "1" + chassis = "1" + +[device "ich9-pcie-port-2"] + driver = "ioh3420" + multifunction = "on" + bus = "pcie.0" + addr = "1c.1" + port = "2" + chassis = "2" + +[device "ich9-pcie-port-3"] + driver = "ioh3420" + multifunction = "on" + bus = "pcie.0" + addr = "1c.2" + port = "3" + chassis = "3" + +[device "ich9-pcie-port-4"] + driver = "ioh3420" + multifunction = "on" + bus = "pcie.0" + addr = "1c.3" + port = "4" + chassis = "4" + +## +# Example PCIe switch with two downstream ports +# +#[device "pcie-switch-upstream-port-1"] +# driver = "x3130-upstream" +# bus = "ich9-pcie-port-4" +# addr = "00.0" +# +#[device "pcie-switch-downstream-port-1-1"] +# driver = "xio3130-downstream" +# multifunction = "on" +# bus = "pcie-switch-upstream-port-1" +# addr = "00.0" +# port = "1" +# chassis = "5" +# +#[device "pcie-switch-downstream-port-1-2"] +# driver = "xio3130-downstream" +# multifunction = "on" +# bus = "pcie-switch-upstream-port-1" +# addr = "00.1" +# port = "1" +# chassis = "6" + + + +[device "pcidmi"} + driver = "i82801b11-bridge" + bus = "pcie.0" + addr = "1e.0" + +[device "pci.0"] + driver = "pci-bridge" + bus = "pcidmi" + addr = "1.0" + chassis_nr = "1" + +[device "pci.1"] + driver = "pci-bridge" + bus = "pcidmi" + addr = "2.0" + chassis_nr = "2" + +[device "pci.2"] + driver = "pci-bridge" + bus = "pcidmi" + addr = "3.0" + chassis_nr = "3"