Message ID | 20191011085611.4194-4-stefanha@redhat.com |
---|---|
State | New |
Headers | show |
Series | libqos: add VIRTIO PCI 1.0 support | expand |
Stefan Hajnoczi <stefanha@redhat.com> writes: > Instead of just passing the vring page frame number, pass the full > QVirtQueue. This will allow the VIRTIO 1.0 transport to program the > fine-grained vring address registers in the future. > > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > --- > tests/libqos/virtio.h | 2 +- > tests/libqos/virtio-mmio.c | 6 ++++-- > tests/libqos/virtio-pci.c | 6 ++++-- > 3 files changed, 9 insertions(+), 5 deletions(-) > > diff --git a/tests/libqos/virtio.h b/tests/libqos/virtio.h > index 2cb2448f46..37f55b6ade 100644 > --- a/tests/libqos/virtio.h > +++ b/tests/libqos/virtio.h > @@ -79,7 +79,7 @@ struct QVirtioBus { > uint16_t (*get_queue_size)(QVirtioDevice *d); > > /* Set the address of the selected queue */ > - void (*set_queue_address)(QVirtioDevice *d, uint32_t pfn); > + void (*set_queue_address)(QVirtioDevice *d, QVirtQueue *vq); > > /* Setup the virtqueue specified by index */ > QVirtQueue *(*virtqueue_setup)(QVirtioDevice *d, QGuestAllocator *alloc, > diff --git a/tests/libqos/virtio-mmio.c b/tests/libqos/virtio-mmio.c > index d0047876a8..43ca4e49c1 100644 > --- a/tests/libqos/virtio-mmio.c > +++ b/tests/libqos/virtio-mmio.c > @@ -127,9 +127,11 @@ static uint16_t qvirtio_mmio_get_queue_size(QVirtioDevice *d) > return (uint16_t)qtest_readl(dev->qts, dev->addr + QVIRTIO_MMIO_QUEUE_NUM_MAX); > } > > -static void qvirtio_mmio_set_queue_address(QVirtioDevice *d, uint32_t pfn) > +static void qvirtio_mmio_set_queue_address(QVirtioDevice *d, QVirtQueue *vq) > { > QVirtioMMIODevice *dev = container_of(d, QVirtioMMIODevice, vdev); > + uint64_t pfn = vq->desc / dev->page_size; > + > qtest_writel(dev->qts, dev->addr + QVIRTIO_MMIO_QUEUE_PFN, pfn); > } > > @@ -162,7 +164,7 @@ static QVirtQueue *qvirtio_mmio_virtqueue_setup(QVirtioDevice *d, > > addr = guest_alloc(alloc, qvring_size(vq->size, dev->page_size)); > qvring_init(dev->qts, alloc, vq, addr); > - qvirtio_mmio_set_queue_address(d, vq->desc / dev->page_size); > + qvirtio_mmio_set_queue_address(d, vq); > > return vq; > } > diff --git a/tests/libqos/virtio-pci.c b/tests/libqos/virtio-pci.c > index c8d736f4d1..4772239b61 100644 > --- a/tests/libqos/virtio-pci.c > +++ b/tests/libqos/virtio-pci.c > @@ -190,9 +190,11 @@ static uint16_t qvirtio_pci_get_queue_size(QVirtioDevice *d) > return qpci_io_readw(dev->pdev, dev->bar, VIRTIO_PCI_QUEUE_NUM); > } > > -static void qvirtio_pci_set_queue_address(QVirtioDevice *d, uint32_t pfn) > +static void qvirtio_pci_set_queue_address(QVirtioDevice *d, QVirtQueue *vq) > { > QVirtioPCIDevice *dev = container_of(d, QVirtioPCIDevice, vdev); > + uint64_t pfn = vq->desc / VIRTIO_PCI_VRING_ALIGN; > + > qpci_io_writel(dev->pdev, dev->bar, VIRTIO_PCI_QUEUE_PFN, pfn); > } > > @@ -229,7 +231,7 @@ static QVirtQueue *qvirtio_pci_virtqueue_setup(QVirtioDevice *d, > addr = guest_alloc(alloc, qvring_size(vqpci->vq.size, > VIRTIO_PCI_VRING_ALIGN)); > qvring_init(qvpcidev->pdev->bus->qts, alloc, &vqpci->vq, addr); > - qvirtio_pci_set_queue_address(d, vqpci->vq.desc / VIRTIO_PCI_VRING_ALIGN); > + qvirtio_pci_set_queue_address(d, &vqpci->vq); > > return &vqpci->vq; > } Reviewed-by: Sergio Lopez <slp@redhat.com>
On 11/10/2019 10.56, Stefan Hajnoczi wrote: > Instead of just passing the vring page frame number, pass the full > QVirtQueue. This will allow the VIRTIO 1.0 transport to program the > fine-grained vring address registers in the future. > > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > --- > tests/libqos/virtio.h | 2 +- > tests/libqos/virtio-mmio.c | 6 ++++-- > tests/libqos/virtio-pci.c | 6 ++++-- > 3 files changed, 9 insertions(+), 5 deletions(-) Reviewed-by: Thomas Huth <thuth@redhat.com>
diff --git a/tests/libqos/virtio.h b/tests/libqos/virtio.h index 2cb2448f46..37f55b6ade 100644 --- a/tests/libqos/virtio.h +++ b/tests/libqos/virtio.h @@ -79,7 +79,7 @@ struct QVirtioBus { uint16_t (*get_queue_size)(QVirtioDevice *d); /* Set the address of the selected queue */ - void (*set_queue_address)(QVirtioDevice *d, uint32_t pfn); + void (*set_queue_address)(QVirtioDevice *d, QVirtQueue *vq); /* Setup the virtqueue specified by index */ QVirtQueue *(*virtqueue_setup)(QVirtioDevice *d, QGuestAllocator *alloc, diff --git a/tests/libqos/virtio-mmio.c b/tests/libqos/virtio-mmio.c index d0047876a8..43ca4e49c1 100644 --- a/tests/libqos/virtio-mmio.c +++ b/tests/libqos/virtio-mmio.c @@ -127,9 +127,11 @@ static uint16_t qvirtio_mmio_get_queue_size(QVirtioDevice *d) return (uint16_t)qtest_readl(dev->qts, dev->addr + QVIRTIO_MMIO_QUEUE_NUM_MAX); } -static void qvirtio_mmio_set_queue_address(QVirtioDevice *d, uint32_t pfn) +static void qvirtio_mmio_set_queue_address(QVirtioDevice *d, QVirtQueue *vq) { QVirtioMMIODevice *dev = container_of(d, QVirtioMMIODevice, vdev); + uint64_t pfn = vq->desc / dev->page_size; + qtest_writel(dev->qts, dev->addr + QVIRTIO_MMIO_QUEUE_PFN, pfn); } @@ -162,7 +164,7 @@ static QVirtQueue *qvirtio_mmio_virtqueue_setup(QVirtioDevice *d, addr = guest_alloc(alloc, qvring_size(vq->size, dev->page_size)); qvring_init(dev->qts, alloc, vq, addr); - qvirtio_mmio_set_queue_address(d, vq->desc / dev->page_size); + qvirtio_mmio_set_queue_address(d, vq); return vq; } diff --git a/tests/libqos/virtio-pci.c b/tests/libqos/virtio-pci.c index c8d736f4d1..4772239b61 100644 --- a/tests/libqos/virtio-pci.c +++ b/tests/libqos/virtio-pci.c @@ -190,9 +190,11 @@ static uint16_t qvirtio_pci_get_queue_size(QVirtioDevice *d) return qpci_io_readw(dev->pdev, dev->bar, VIRTIO_PCI_QUEUE_NUM); } -static void qvirtio_pci_set_queue_address(QVirtioDevice *d, uint32_t pfn) +static void qvirtio_pci_set_queue_address(QVirtioDevice *d, QVirtQueue *vq) { QVirtioPCIDevice *dev = container_of(d, QVirtioPCIDevice, vdev); + uint64_t pfn = vq->desc / VIRTIO_PCI_VRING_ALIGN; + qpci_io_writel(dev->pdev, dev->bar, VIRTIO_PCI_QUEUE_PFN, pfn); } @@ -229,7 +231,7 @@ static QVirtQueue *qvirtio_pci_virtqueue_setup(QVirtioDevice *d, addr = guest_alloc(alloc, qvring_size(vqpci->vq.size, VIRTIO_PCI_VRING_ALIGN)); qvring_init(qvpcidev->pdev->bus->qts, alloc, &vqpci->vq, addr); - qvirtio_pci_set_queue_address(d, vqpci->vq.desc / VIRTIO_PCI_VRING_ALIGN); + qvirtio_pci_set_queue_address(d, &vqpci->vq); return &vqpci->vq; }
Instead of just passing the vring page frame number, pass the full QVirtQueue. This will allow the VIRTIO 1.0 transport to program the fine-grained vring address registers in the future. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> --- tests/libqos/virtio.h | 2 +- tests/libqos/virtio-mmio.c | 6 ++++-- tests/libqos/virtio-pci.c | 6 ++++-- 3 files changed, 9 insertions(+), 5 deletions(-)