Message ID | 20191011085611.4194-3-stefanha@redhat.com |
---|---|
State | New |
Headers | show |
Series | libqos: add VIRTIO PCI 1.0 support | expand |
Stefan Hajnoczi <stefanha@redhat.com> writes: > VIRTIO 1.0 PCI devices have multiple PCI_CAP_ID_VNDR capabilities so we > need a way to iterate over them. Extend qpci_find_capability() to take > the last address. > > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > --- > tests/libqos/pci.h | 2 +- > tests/libqos/pci.c | 18 ++++++++++++------ > 2 files changed, 13 insertions(+), 7 deletions(-) > > diff --git a/tests/libqos/pci.h b/tests/libqos/pci.h > index a5389a5845..590c175190 100644 > --- a/tests/libqos/pci.h > +++ b/tests/libqos/pci.h > @@ -86,7 +86,7 @@ bool qpci_has_buggy_msi(QPCIDevice *dev); > bool qpci_check_buggy_msi(QPCIDevice *dev); > > void qpci_device_enable(QPCIDevice *dev); > -uint8_t qpci_find_capability(QPCIDevice *dev, uint8_t id); > +uint8_t qpci_find_capability(QPCIDevice *dev, uint8_t id, uint8_t start_addr); > void qpci_msix_enable(QPCIDevice *dev); > void qpci_msix_disable(QPCIDevice *dev); > bool qpci_msix_pending(QPCIDevice *dev, uint16_t entry); > diff --git a/tests/libqos/pci.c b/tests/libqos/pci.c > index 662ee7a517..b8679dff1d 100644 > --- a/tests/libqos/pci.c > +++ b/tests/libqos/pci.c > @@ -115,10 +115,16 @@ void qpci_device_enable(QPCIDevice *dev) > g_assert_cmphex(cmd & PCI_COMMAND_MASTER, ==, PCI_COMMAND_MASTER); > } > > -uint8_t qpci_find_capability(QPCIDevice *dev, uint8_t id) > +uint8_t qpci_find_capability(QPCIDevice *dev, uint8_t id, uint8_t start_addr) > { > uint8_t cap; > - uint8_t addr = qpci_config_readb(dev, PCI_CAPABILITY_LIST); > + uint8_t addr; > + > + if (start_addr) { > + addr = qpci_config_readb(dev, start_addr + PCI_CAP_LIST_NEXT); > + } else { > + addr = qpci_config_readb(dev, PCI_CAPABILITY_LIST); > + } > > do { > cap = qpci_config_readb(dev, addr); > @@ -138,7 +144,7 @@ void qpci_msix_enable(QPCIDevice *dev) > uint8_t bir_table; > uint8_t bir_pba; > > - addr = qpci_find_capability(dev, PCI_CAP_ID_MSIX); > + addr = qpci_find_capability(dev, PCI_CAP_ID_MSIX, 0); > g_assert_cmphex(addr, !=, 0); > > val = qpci_config_readw(dev, addr + PCI_MSIX_FLAGS); > @@ -167,7 +173,7 @@ void qpci_msix_disable(QPCIDevice *dev) > uint16_t val; > > g_assert(dev->msix_enabled); > - addr = qpci_find_capability(dev, PCI_CAP_ID_MSIX); > + addr = qpci_find_capability(dev, PCI_CAP_ID_MSIX, 0); > g_assert_cmphex(addr, !=, 0); > val = qpci_config_readw(dev, addr + PCI_MSIX_FLAGS); > qpci_config_writew(dev, addr + PCI_MSIX_FLAGS, > @@ -203,7 +209,7 @@ bool qpci_msix_masked(QPCIDevice *dev, uint16_t entry) > uint64_t vector_off = dev->msix_table_off + entry * PCI_MSIX_ENTRY_SIZE; > > g_assert(dev->msix_enabled); > - addr = qpci_find_capability(dev, PCI_CAP_ID_MSIX); > + addr = qpci_find_capability(dev, PCI_CAP_ID_MSIX, 0); > g_assert_cmphex(addr, !=, 0); > val = qpci_config_readw(dev, addr + PCI_MSIX_FLAGS); > > @@ -221,7 +227,7 @@ uint16_t qpci_msix_table_size(QPCIDevice *dev) > uint8_t addr; > uint16_t control; > > - addr = qpci_find_capability(dev, PCI_CAP_ID_MSIX); > + addr = qpci_find_capability(dev, PCI_CAP_ID_MSIX, 0); > g_assert_cmphex(addr, !=, 0); > > control = qpci_config_readw(dev, addr + PCI_MSIX_FLAGS); Reviewed-by: Sergio Lopez <slp@redhat.com>
On 11/10/2019 10.56, Stefan Hajnoczi wrote: > VIRTIO 1.0 PCI devices have multiple PCI_CAP_ID_VNDR capabilities so we > need a way to iterate over them. Extend qpci_find_capability() to take > the last address. > > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > --- > tests/libqos/pci.h | 2 +- > tests/libqos/pci.c | 18 ++++++++++++------ > 2 files changed, 13 insertions(+), 7 deletions(-) > > diff --git a/tests/libqos/pci.h b/tests/libqos/pci.h > index a5389a5845..590c175190 100644 > --- a/tests/libqos/pci.h > +++ b/tests/libqos/pci.h > @@ -86,7 +86,7 @@ bool qpci_has_buggy_msi(QPCIDevice *dev); > bool qpci_check_buggy_msi(QPCIDevice *dev); > > void qpci_device_enable(QPCIDevice *dev); > -uint8_t qpci_find_capability(QPCIDevice *dev, uint8_t id); > +uint8_t qpci_find_capability(QPCIDevice *dev, uint8_t id, uint8_t start_addr); In case you respin, I'd like to suggest to add a comment in front of that prototype, explaining how the start_addr is meant to work (but the source code is trivial enough, so there's no need to respin just because of this, IMHO). Reviewed-by: Thomas Huth <thuth@redhat.com>
diff --git a/tests/libqos/pci.h b/tests/libqos/pci.h index a5389a5845..590c175190 100644 --- a/tests/libqos/pci.h +++ b/tests/libqos/pci.h @@ -86,7 +86,7 @@ bool qpci_has_buggy_msi(QPCIDevice *dev); bool qpci_check_buggy_msi(QPCIDevice *dev); void qpci_device_enable(QPCIDevice *dev); -uint8_t qpci_find_capability(QPCIDevice *dev, uint8_t id); +uint8_t qpci_find_capability(QPCIDevice *dev, uint8_t id, uint8_t start_addr); void qpci_msix_enable(QPCIDevice *dev); void qpci_msix_disable(QPCIDevice *dev); bool qpci_msix_pending(QPCIDevice *dev, uint16_t entry); diff --git a/tests/libqos/pci.c b/tests/libqos/pci.c index 662ee7a517..b8679dff1d 100644 --- a/tests/libqos/pci.c +++ b/tests/libqos/pci.c @@ -115,10 +115,16 @@ void qpci_device_enable(QPCIDevice *dev) g_assert_cmphex(cmd & PCI_COMMAND_MASTER, ==, PCI_COMMAND_MASTER); } -uint8_t qpci_find_capability(QPCIDevice *dev, uint8_t id) +uint8_t qpci_find_capability(QPCIDevice *dev, uint8_t id, uint8_t start_addr) { uint8_t cap; - uint8_t addr = qpci_config_readb(dev, PCI_CAPABILITY_LIST); + uint8_t addr; + + if (start_addr) { + addr = qpci_config_readb(dev, start_addr + PCI_CAP_LIST_NEXT); + } else { + addr = qpci_config_readb(dev, PCI_CAPABILITY_LIST); + } do { cap = qpci_config_readb(dev, addr); @@ -138,7 +144,7 @@ void qpci_msix_enable(QPCIDevice *dev) uint8_t bir_table; uint8_t bir_pba; - addr = qpci_find_capability(dev, PCI_CAP_ID_MSIX); + addr = qpci_find_capability(dev, PCI_CAP_ID_MSIX, 0); g_assert_cmphex(addr, !=, 0); val = qpci_config_readw(dev, addr + PCI_MSIX_FLAGS); @@ -167,7 +173,7 @@ void qpci_msix_disable(QPCIDevice *dev) uint16_t val; g_assert(dev->msix_enabled); - addr = qpci_find_capability(dev, PCI_CAP_ID_MSIX); + addr = qpci_find_capability(dev, PCI_CAP_ID_MSIX, 0); g_assert_cmphex(addr, !=, 0); val = qpci_config_readw(dev, addr + PCI_MSIX_FLAGS); qpci_config_writew(dev, addr + PCI_MSIX_FLAGS, @@ -203,7 +209,7 @@ bool qpci_msix_masked(QPCIDevice *dev, uint16_t entry) uint64_t vector_off = dev->msix_table_off + entry * PCI_MSIX_ENTRY_SIZE; g_assert(dev->msix_enabled); - addr = qpci_find_capability(dev, PCI_CAP_ID_MSIX); + addr = qpci_find_capability(dev, PCI_CAP_ID_MSIX, 0); g_assert_cmphex(addr, !=, 0); val = qpci_config_readw(dev, addr + PCI_MSIX_FLAGS); @@ -221,7 +227,7 @@ uint16_t qpci_msix_table_size(QPCIDevice *dev) uint8_t addr; uint16_t control; - addr = qpci_find_capability(dev, PCI_CAP_ID_MSIX); + addr = qpci_find_capability(dev, PCI_CAP_ID_MSIX, 0); g_assert_cmphex(addr, !=, 0); control = qpci_config_readw(dev, addr + PCI_MSIX_FLAGS);
VIRTIO 1.0 PCI devices have multiple PCI_CAP_ID_VNDR capabilities so we need a way to iterate over them. Extend qpci_find_capability() to take the last address. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> --- tests/libqos/pci.h | 2 +- tests/libqos/pci.c | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-)