On Thu, Oct 17, 2019 at 04:52:54PM +0200, Thomas Huth wrote: > On 11/10/2019 10.56, Stefan Hajnoczi wrote: > > Implement the VIRTIO 1.0 virtio-pci interface. The main change here is > > that the register layout is no longer a fixed layout in BAR 0. Instead > > we have to iterate of PCI Capabilities to find descriptions of where > > various registers are located. The vring registers are also more > > fine-grained, allowing for more flexible vring layouts, but we don't > > take advantage of that. > > > > Note that test cases do not negotiate VIRTIO_F_VERSION_1 yet and are > > therefore not running in VIRTIO 1.0 mode. > > > > Signed-off-by: Stefan Hajnoczi <stefa...@redhat.com> > > --- > > tests/Makefile.include | 1 + > > tests/libqos/virtio-pci-modern.h | 17 ++ > > tests/libqos/virtio-pci.h | 10 + > > tests/libqos/virtio-pci-modern.c | 412 +++++++++++++++++++++++++++++++ > > tests/libqos/virtio-pci.c | 6 +- > > 5 files changed, 445 insertions(+), 1 deletion(-) > > create mode 100644 tests/libqos/virtio-pci-modern.h > > create mode 100644 tests/libqos/virtio-pci-modern.c > [...] > > +static bool probe_device_type(QVirtioPCIDevice *dev) > > +{ > > + uint16_t vendor_id; > > + uint16_t device_id; > > + > > + /* "Drivers MUST match devices with the PCI Vendor ID 0x1AF4" */ > > + vendor_id = qpci_config_readw(dev->pdev, PCI_VENDOR_ID); > > + if (vendor_id != 0x1af4) { > > + return false; > > + } > > + > > + /* > > + * "Any PCI device with ... PCI Device ID 0x1000 through 0x107F > > inclusive > > + * is a virtio device" > > + */ > > + device_id = qpci_config_readw(dev->pdev, PCI_DEVICE_ID); > > + if (device_id < 0x1000 || device_id > 0x107f) { > > + return false; > > + } > > + > > + /* > > + * "Devices MAY utilize a Transitional PCI Device ID range, 0x1000 to > > + * 0x103F depending on the device type" > > + */ > > + if (device_id < 0x1040) { > > + /* > > + * "Transitional devices MUST have the PCI Subsystem Device ID > > matching > > + * the Virtio Device ID" > > + */ > > + dev->vdev.device_type = qpci_config_readw(dev->pdev, > > PCI_SUBSYSTEM_ID); > > Shouldn't you return "false" here in case the device_type is 0 ? Which > likely means that it is a legacy or broken device ...?
The real decision whether to use this PCI device or not happens in probe_device_layout(). If it's broken or a legacy device then that function will fail. Stefan
signature.asc
Description: PGP signature