[pve-devel] [PATCH manager 1/6 v2] Scan.pm: add pci scan api call
Dominik Csapak
d.csapak at proxmox.com
Tue Nov 20 17:13:41 CET 2018
Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
changes from v1:
* more api documentation
* change filter-unusable to pci-class-blacklist
* define filter sub here
* define default class blacklist here
PVE/API2/Scan.pm | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 124 insertions(+)
diff --git a/PVE/API2/Scan.pm b/PVE/API2/Scan.pm
index b67c1041..15c8b48a 100644
--- a/PVE/API2/Scan.pm
+++ b/PVE/API2/Scan.pm
@@ -46,6 +46,7 @@ __PACKAGE__->register_method ({
{ method => 'usb' },
{ method => 'zfs' },
{ method => 'cifs' },
+ { method => 'pci' },
];
return $res;
@@ -422,4 +423,127 @@ __PACKAGE__->register_method ({
return PVE::SysFSTools::scan_usb();
}});
+my $default_class_blacklist = "05;06;08;0b";
+
+__PACKAGE__->register_method ({
+ name => 'pciscan',
+ path => 'pci',
+ method => 'GET',
+ description => "List local PCI devices.",
+ protected => 1,
+ proxyto => "node",
+ permissions => {
+ check => ['perm', '/', ['Sys.Modify']],
+ },
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ node => get_standard_option('pve-node'),
+ 'pci-class-blacklist' => {
+ type => 'string',
+ format => 'string-list',
+ default => $default_class_blacklist,
+ optional => 1,
+ description => "A list of blacklisted PCI classes, which will ".
+ "not be returned. Following are filtered by ".
+ "default: Memory Controller (05), Bridge (06), ".
+ "Generic System Peripheral (08) and ".
+ "Processor (0b).",
+ },
+ verbose => {
+ type => 'boolean',
+ default => 1,
+ optional => 1,
+ description => "If disabled, does only print the PCI IDs. "
+ ."Otherwise, additional information like vendor "
+ ."and device will be returned.",
+ },
+ },
+ },
+ returns => {
+ type => 'array',
+ items => {
+ type => "object",
+ properties => {
+ id => {
+ type => 'string',
+ description => "The PCI ID.",
+ },
+ class => {
+ type => 'string',
+ description => 'The PCI Class of the device.',
+ },
+ vendor => {
+ type => 'string',
+ description => 'The Vendor ID.',
+ },
+ vendor_name => {
+ type => 'string',
+ optional => 1,
+ },
+ device => {
+ type => 'string',
+ description => 'The Device ID.',
+ },
+ device_name => {
+ type => 'string',
+ optional => 1,
+ },
+ subsystem_vendor => {
+ type => 'string',
+ description => 'The Subsystem Vendor ID.',
+ optional => 1,
+ },
+ subsystem_vendor_name => {
+ type => 'string',
+ optional => 1,
+ },
+ subsystem_device => {
+ type => 'string',
+ description => 'The Subsystem Device ID.',
+ optional => 1,
+ },
+ subsystem_device_name => {
+ type => 'string',
+ optional => 1,
+ },
+ iommugroup => {
+ type => 'integer',
+ description => "The IOMMU group in which the device is in.".
+ " If no IOMMU group is detected, it is set to -1.",
+ },
+ mdev => {
+ type => 'boolean',
+ optional => 1,
+ description => "If set, marks that the device is capable "
+ ."of creating mediated devices.",
+ }
+ },
+ },
+ },
+ code => sub {
+ my ($param) = @_;
+
+ my $blacklist = $param->{'pci-class-blacklist'} // $default_class_blacklist;
+ my $class_regex = join('|', PVE::Tools::split_list($blacklist));
+
+ my $filter;
+
+ if ($class_regex ne '') {
+ $filter = sub {
+ my ($pcidevice) = @_;
+
+ if ($pcidevice->{class} =~ m/^0x(?:$class_regex)/) {
+ return 0;
+ }
+
+ return 1;
+ };
+ }
+
+ my $verbose = $param->{verbose} // 1;
+
+ return PVE::SysFSTools::lspci($filter, $verbose);
+ }});
+
1;
--
2.11.0
More information about the pve-devel
mailing list