and get the correct pci device during parsing Signed-off-by: Dominik Csapak <d.csa...@proxmox.com> --- PVE/QemuServer/PCI.pm | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-)
diff --git a/PVE/QemuServer/PCI.pm b/PVE/QemuServer/PCI.pm index 23fe508..1ff4bce 100644 --- a/PVE/QemuServer/PCI.pm +++ b/PVE/QemuServer/PCI.pm @@ -4,6 +4,7 @@ use warnings; use strict; use PVE::JSONSchema; +use PVE::HardwareMap; use PVE::SysFSTools; use PVE::Tools; @@ -23,8 +24,8 @@ my $hostpci_fmt = { host => { default_key => 1, type => 'string', - pattern => qr/$PCIRE(;$PCIRE)*/, - format_description => 'HOSTPCIID[;HOSTPCIID2...]', + pattern => qr/(:?$PCIRE(;$PCIRE)*)|(:?$PVE::JSONSchema::CONFIGID_RE)/, + format_description => 'HOSTPCIID[;HOSTPCIID2...] or configured mapping id', description => <<EODESCR, Host PCI device pass through. The PCI ID of a host's PCI device or a list of PCI virtual functions of the host. HOSTPCIID syntax is: @@ -32,6 +33,8 @@ of PCI virtual functions of the host. HOSTPCIID syntax is: 'bus:dev.func' (hexadecimal numbers) You can us the 'lspci' command to list existing PCI devices. + +Alternatively use the ID of a mapped pci device. EODESCR }, rombar => { @@ -383,6 +386,19 @@ sub parse_hostpci { my $res = PVE::JSONSchema::parse_property_string($hostpci_fmt, $value); + if ($res->{host} !~ m/:/) { + # we have no ordinary pci id, must be a mapping + my $device = PVE::HardwareMap::find_device_on_current_node('pci', $res->{host}); + die "PCI device mapping not found for '$res->{host}'\n" if !defined($device); + eval { + PVE::HardwareMap::assert_device_valid('pci', $device); + }; + if (my $err = $@) { + die "PCI device mapping invalid (hardware probably changed): $err\n"; + } + $res->{host} = $device->{path}; + } + my @idlist = split(/;/, $res->{host}); delete $res->{host}; foreach my $id (@idlist) { -- 2.30.2 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel