From: Nicholas Sherlock <nick@nicksherlock.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH v2 qemu-server] pci: allow override of PCI vendor/device ids
Date: Tue, 18 Jan 2022 21:38:39 +0000 [thread overview]
Message-ID: <0100017e6f20ab89-937c99e8-c40c-492b-85cf-f349752b86a5-000000@email.amazonses.com> (raw)
In-Reply-To: <pci-id-override2@nicksherlock.com>
From: Nicholas Sherlock <n.sherlock@gmail.com>
This allows mobile- and vGPUs to be presented to the guest as if they were the original desktop variants of the card. It also allows device-ID variants that guests don't know about to be renamed to match compatible sibling devices the guest does have drivers for (e.g. to remove manufacturer-specific vendor ID variants that prevent the use of a device which would otherwise have a supported chipset)
e.g. hostpci0: 03:00,vendor-id=0x8086,device-id=0x10f6
Signed-off-by: Nicholas Sherlock <n.sherlock@gmail.com>
---
PVE/QemuServer/PCI.pm | 31 ++++++++++++++++
.../q35-linux-hostpci-x-pci-overrides.conf | 16 +++++++++
...q35-linux-hostpci-x-pci-overrides.conf.cmd | 35 +++++++++++++++++++
3 files changed, 82 insertions(+)
create mode 100644 test/cfg2cmd/q35-linux-hostpci-x-pci-overrides.conf
create mode 100644 test/cfg2cmd/q35-linux-hostpci-x-pci-overrides.conf.cmd
diff --git a/PVE/QemuServer/PCI.pm b/PVE/QemuServer/PCI.pm
index 4033784..70987d8 100644
--- a/PVE/QemuServer/PCI.pm
+++ b/PVE/QemuServer/PCI.pm
@@ -77,6 +77,34 @@ The type of mediated device to use.
An instance of this type will be created on startup of the VM and
will be cleaned up when the VM stops.
EODESCR
+ },
+ 'vendor-id' => {
+ type => 'string',
+ pattern => qr/^0x[0-9a-fA-F]{4}$/,
+ format_description => 'hex id',
+ optional => 1,
+ description => "Override PCI vendor ID visible to guest"
+ },
+ 'device-id' => {
+ type => 'string',
+ pattern => qr/^0x[0-9a-fA-F]{4}$/,
+ format_description => 'hex id',
+ optional => 1,
+ description => "Override PCI device ID visible to guest"
+ },
+ 'sub-vendor-id' => {
+ type => 'string',
+ pattern => qr/^0x[0-9a-fA-F]{4}$/,
+ format_description => 'hex id',
+ optional => 1,
+ description => "Override PCI subsystem vendor ID visible to guest"
+ },
+ 'sub-device-id' => {
+ type => 'string',
+ pattern => qr/^0x[0-9a-fA-F]{4}$/,
+ format_description => 'hex id',
+ optional => 1,
+ description => "Override PCI subsystem device ID visible to guest"
}
};
PVE::JSONSchema::register_format('pve-qm-hostpci', $hostpci_fmt);
@@ -457,6 +485,9 @@ sub print_hostpci_devices {
$devicestr .= ",multifunction=on" if $multifunction;
$devicestr .= ",romfile=/usr/share/kvm/$d->{romfile}" if $d->{romfile};
$devicestr .= ",bootindex=$bootorder->{$id}" if $bootorder->{$id};
+ for my $option (qw(vendor-id device-id sub-vendor-id sub-device-id)) {
+ $devicestr .= ",x-pci-$option=$d->{$option}" if $d->{$option};
+ }
}
push @$devices, '-device', $devicestr;
diff --git a/test/cfg2cmd/q35-linux-hostpci-x-pci-overrides.conf b/test/cfg2cmd/q35-linux-hostpci-x-pci-overrides.conf
new file mode 100644
index 0000000..b726a3a
--- /dev/null
+++ b/test/cfg2cmd/q35-linux-hostpci-x-pci-overrides.conf
@@ -0,0 +1,16 @@
+# TEST: Overriding PCI vendor/device IDs reported to guest
+bios: ovmf
+bootdisk: scsi0
+cores: 1
+efidisk0: local:100/vm-100-disk-1.qcow2,size=128K
+hostpci0: 00:ff.1,vendor-id=0x1234,device-id=0x5678,sub-vendor-id=0x2233,sub-device-id=0x0000
+hostpci1: d0:13.0,pcie=1,vendor-id=0x1234,device-id=0x5678
+machine: q35
+memory: 512
+net0: virtio=2E:01:68:F9:9C:87,bridge=vmbr0
+numa: 1
+ostype: l26
+scsihw: virtio-scsi-pci
+smbios1: uuid=3dd750ce-d910-44d0-9493-525c0be4e687
+sockets: 2
+vmgenid: 54d1c06c-8f5b-440f-b5b2-6eab1380e13d
diff --git a/test/cfg2cmd/q35-linux-hostpci-x-pci-overrides.conf.cmd b/test/cfg2cmd/q35-linux-hostpci-x-pci-overrides.conf.cmd
new file mode 100644
index 0000000..7a215c9
--- /dev/null
+++ b/test/cfg2cmd/q35-linux-hostpci-x-pci-overrides.conf.cmd
@@ -0,0 +1,35 @@
+/usr/bin/kvm \
+ -id 8006 \
+ -name vm8006 \
+ -no-shutdown \
+ -chardev 'socket,id=qmp,path=/var/run/qemu-server/8006.qmp,server=on,wait=off' \
+ -mon 'chardev=qmp,mode=control' \
+ -chardev 'socket,id=qmp-event,path=/var/run/qmeventd.sock,reconnect=5' \
+ -mon 'chardev=qmp-event,mode=control' \
+ -pidfile /var/run/qemu-server/8006.pid \
+ -daemonize \
+ -smbios 'type=1,uuid=3dd750ce-d910-44d0-9493-525c0be4e687' \
+ -drive 'if=pflash,unit=0,format=raw,readonly=on,file=/usr/share/pve-edk2-firmware//OVMF_CODE.fd' \
+ -drive 'if=pflash,unit=1,format=qcow2,id=drive-efidisk0,file=/var/lib/vz/images/100/vm-100-disk-1.qcow2' \
+ -global 'ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off' \
+ -smp '2,sockets=2,cores=1,maxcpus=2' \
+ -nodefaults \
+ -boot 'menu=on,strict=on,reboot-timeout=1000,splash=/usr/share/qemu-server/bootsplash.jpg' \
+ -vnc 'unix:/var/run/qemu-server/8006.vnc,password=on' \
+ -cpu kvm64,enforce,+kvm_pv_eoi,+kvm_pv_unhalt,+lahf_lm,+sep \
+ -m 512 \
+ -object 'memory-backend-ram,id=ram-node0,size=256M' \
+ -numa 'node,nodeid=0,cpus=0,memdev=ram-node0' \
+ -object 'memory-backend-ram,id=ram-node1,size=256M' \
+ -numa 'node,nodeid=1,cpus=1,memdev=ram-node1' \
+ -readconfig /usr/share/qemu-server/pve-q35-4.0.cfg \
+ -device 'vmgenid,guid=54d1c06c-8f5b-440f-b5b2-6eab1380e13d' \
+ -device 'usb-tablet,id=tablet,bus=ehci.0,port=1' \
+ -device 'vfio-pci,host=0000:00:ff.1,id=hostpci0,bus=pci.0,addr=0x10,x-pci-vendor-id=0x1234,x-pci-device-id=0x5678,x-pci-sub-vendor-id=0x2233,x-pci-sub-device-id=0x0000' \
+ -device 'vfio-pci,host=0000:d0:13.0,id=hostpci1,bus=ich9-pcie-port-2,addr=0x0,x-pci-vendor-id=0x1234,x-pci-device-id=0x5678' \
+ -device 'VGA,id=vga,bus=pcie.0,addr=0x1' \
+ -device 'virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3' \
+ -iscsi 'initiator-name=iqn.1993-08.org.debian:01:aabbccddeeff' \
+ -netdev 'type=tap,id=net0,ifname=tap8006i0,script=/var/lib/qemu-server/pve-bridge,downscript=/var/lib/qemu-server/pve-bridgedown,vhost=on' \
+ -device 'virtio-net-pci,mac=2E:01:68:F9:9C:87,netdev=net0,bus=pci.0,addr=0x12,id=net0,bootindex=300' \
+ -machine 'type=q35+pve0'
--
2.34.1
next prev parent reply other threads:[~2022-01-18 21:51 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <pci-id-override2@nicksherlock.com>
2022-01-18 21:38 ` [pve-devel] [PATCH v2 qemu-server 0/1] " Nicholas Sherlock
2022-01-20 15:48 ` Dominik Csapak
2022-01-20 21:21 ` Nicholas Sherlock
2022-01-18 21:38 ` Nicholas Sherlock [this message]
2022-01-25 10:02 ` [pve-devel] applied: [PATCH v2 qemu-server] " Thomas Lamprecht
2022-01-18 21:38 ` [pve-devel] [PATCH v2 pve-manager] ui: pci passthrough: editor for pci-id overrides Nicholas Sherlock
2022-01-27 14:21 ` [pve-devel] applied: " Thomas Lamprecht
[not found] ` <0100017e9be9fa51-bfe8d998-0793-4d1a-8403-26d7b78478ac-000000@email.amazonses.com>
2022-01-28 9:38 ` Nicholas Sherlock
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=0100017e6f20ab89-937c99e8-c40c-492b-85cf-f349752b86a5-000000@email.amazonses.com \
--to=nick@nicksherlock.com \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.