This is a long story. RedHat has relicensed Windows KVM device drivers in 2018 and there was an agreement that to avoid WHQL driver conflict software manufacturers should set proper PCI subsystem vendor ID in their distributions. Thus PCI subsystem vendor id becomes actively used.
The problem is that this field is applied by us via hardware compats. Thus technically it could be lost. This patch adds PCI susbsystem id and vendor id to exportable parameters for validation. Signed-off-by: Denis V. Lunev <d...@openvz.org> CC: "Dr. David Alan Gilbert" <dgilb...@redhat.com> CC: Eric Blake <ebl...@redhat.com> CC: Markus Armbruster <arm...@redhat.com> --- hmp.c | 2 ++ hw/pci/pci.c | 3 +++ qapi-schema.json | 7 ++++++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/hmp.c b/hmp.c index 2874bcd789..8fb0957cfd 100644 --- a/hmp.c +++ b/hmp.c @@ -803,6 +803,8 @@ static void hmp_info_pci_device(Monitor *mon, const PciDeviceInfo *dev) monitor_printf(mon, ": PCI device %04" PRIx64 ":%04" PRIx64 "\n", dev->id->vendor, dev->id->device); + monitor_printf(mon, " PCI subsystem %04" PRIx64 ":%04" PRIx64 "\n", + dev->id->subsystem_vendor, dev->id->subsystem); if (dev->has_irq) { monitor_printf(mon, " IRQ %" PRId64 ".\n", dev->irq); diff --git a/hw/pci/pci.c b/hw/pci/pci.c index f0c98cd0ae..be70dd425c 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -1724,6 +1724,9 @@ static PciDeviceInfo *qmp_query_pci_device(PCIDevice *dev, PCIBus *bus, info->id = g_new0(PciDeviceId, 1); info->id->vendor = pci_get_word(dev->config + PCI_VENDOR_ID); info->id->device = pci_get_word(dev->config + PCI_DEVICE_ID); + info->id->subsystem = pci_get_word(dev->config + PCI_SUBSYSTEM_ID); + info->id->subsystem_vendor = + pci_get_word(dev->config + PCI_SUBSYSTEM_VENDOR_ID); info->regions = qmp_query_pci_regions(dev); info->qdev_id = g_strdup(dev->qdev.id ? dev->qdev.id : ""); diff --git a/qapi/misc.json b/qapi/misc.json index dfef6faf81..1704a8d437 100644 --- a/qapi/misc.json +++ b/qapi/misc.json @@ -2162,10 +2162,15 @@ # # @vendor: the PCI vendor id # +# @subsystem: the PCI subsystem id (since 3.1) +# +# @subsystem-vendor: the PCI subsystem vendor id (since 3.1) +# # Since: 2.4 ## { 'struct': 'PciDeviceId', - 'data': {'device': 'int', 'vendor': 'int'} } + 'data': {'device': 'int', 'vendor': 'int', 'subsystem': 'int', + 'subsystem-vendor': 'int'} } ## # @PciDeviceInfo: -- 2.17.1