Re: [PATCH 1/7] virtio: adjust virtio_setup_queue prototype for 1.0
On Sat, Jan 19, 2019 at 05:37:29PM +0100, Stefan Fritsch wrote: > Make it take an address instead of a PFN. > Pass the virtqueue pointer. In virtio 1.0, more information has to be > configured in the device. Also call virtio_setup_queue() after the > information has been filled in. > --- > sys/dev/fdt/virtio_mmio.c | 11 +++ > sys/dev/pci/virtio_pci.c | 11 ++- > sys/dev/pv/virtio.c | 11 --- > sys/dev/pv/virtiovar.h| 2 +- > 4 files changed, 18 insertions(+), 17 deletions(-) > This part reads ok to me, thanks for splitting the diff up. > diff --git a/sys/dev/fdt/virtio_mmio.c b/sys/dev/fdt/virtio_mmio.c > index 11867a43173..3a74e647c19 100644 > --- a/sys/dev/fdt/virtio_mmio.c > +++ b/sys/dev/fdt/virtio_mmio.c > @@ -89,7 +89,7 @@ void > virtio_mmio_write_device_config_2(struct virtio_softc *, int, uint16_t); > void virtio_mmio_write_device_config_4(struct virtio_softc *, int, > uint32_t); > void virtio_mmio_write_device_config_8(struct virtio_softc *, int, > uint64_t); > uint16_t virtio_mmio_read_queue_size(struct virtio_softc *, uint16_t); > -void virtio_mmio_setup_queue(struct virtio_softc *, uint16_t, > uint32_t); > +void virtio_mmio_setup_queue(struct virtio_softc *, struct virtqueue > *, uint64_t); > void virtio_mmio_set_status(struct virtio_softc *, int); > uint32_t virtio_mmio_negotiate_features(struct virtio_softc *, uint32_t, > const struct virtio_feature_name > *); > @@ -151,15 +151,18 @@ virtio_mmio_read_queue_size(struct virtio_softc *vsc, > uint16_t idx) > } > > void > -virtio_mmio_setup_queue(struct virtio_softc *vsc, uint16_t idx, uint32_t > addr) > +virtio_mmio_setup_queue(struct virtio_softc *vsc, struct virtqueue *vq, > +uint64_t addr) > { > struct virtio_mmio_softc *sc = (struct virtio_mmio_softc *)vsc; > - bus_space_write_4(sc->sc_iot, sc->sc_ioh, VIRTIO_MMIO_QUEUE_SEL, idx); > + bus_space_write_4(sc->sc_iot, sc->sc_ioh, VIRTIO_MMIO_QUEUE_SEL, > + vq->vq_index); > bus_space_write_4(sc->sc_iot, sc->sc_ioh, VIRTIO_MMIO_QUEUE_NUM, > bus_space_read_4(sc->sc_iot, sc->sc_ioh, > VIRTIO_MMIO_QUEUE_NUM_MAX)); > bus_space_write_4(sc->sc_iot, sc->sc_ioh, VIRTIO_MMIO_QUEUE_ALIGN, > PAGE_SIZE); > - bus_space_write_4(sc->sc_iot, sc->sc_ioh, VIRTIO_MMIO_QUEUE_PFN, addr); > + bus_space_write_4(sc->sc_iot, sc->sc_ioh, VIRTIO_MMIO_QUEUE_PFN, > + addr / VIRTIO_PAGE_SIZE); > } > > void > diff --git a/sys/dev/pci/virtio_pci.c b/sys/dev/pci/virtio_pci.c > index cce99e3d720..d1ab7481df6 100644 > --- a/sys/dev/pci/virtio_pci.c > +++ b/sys/dev/pci/virtio_pci.c > @@ -64,7 +64,7 @@ voidvirtio_pci_write_device_config_2(struct > virtio_softc *, int, uint16_t); > void virtio_pci_write_device_config_4(struct virtio_softc *, int, > uint32_t); > void virtio_pci_write_device_config_8(struct virtio_softc *, int, > uint64_t); > uint16_t virtio_pci_read_queue_size(struct virtio_softc *, uint16_t); > -void virtio_pci_setup_queue(struct virtio_softc *, uint16_t, > uint32_t); > +void virtio_pci_setup_queue(struct virtio_softc *, struct virtqueue > *, uint64_t); > void virtio_pci_set_status(struct virtio_softc *, int); > uint32_t virtio_pci_negotiate_features(struct virtio_softc *, uint32_t, > const struct virtio_feature_name > *); > @@ -134,13 +134,14 @@ virtio_pci_read_queue_size(struct virtio_softc *vsc, > uint16_t idx) > } > > void > -virtio_pci_setup_queue(struct virtio_softc *vsc, uint16_t idx, uint32_t addr) > +virtio_pci_setup_queue(struct virtio_softc *vsc, struct virtqueue *vq, > +uint64_t addr) > { > struct virtio_pci_softc *sc = (struct virtio_pci_softc *)vsc; > bus_space_write_2(sc->sc_iot, sc->sc_ioh, VIRTIO_CONFIG_QUEUE_SELECT, > - idx); > + vq->vq_index); > bus_space_write_4(sc->sc_iot, sc->sc_ioh, VIRTIO_CONFIG_QUEUE_ADDRESS, > - addr); > + addr / VIRTIO_PAGE_SIZE); > > /* >* This path is only executed if this function is called after > @@ -150,7 +151,7 @@ virtio_pci_setup_queue(struct virtio_softc *vsc, uint16_t > idx, uint32_t addr) > if (sc->sc_irq_type != IRQ_NO_MSIX) { > int vec = 1; > if (sc->sc_irq_type == IRQ_MSIX_PER_VQ) > -vec += idx; > +vec += vq->vq_index; > bus_space_write_2(sc->sc_iot, sc->sc_ioh, > VIRTIO_MSI_QUEUE_VECTOR, vec); > } > diff --git a/sys/dev/pv/virtio.c b/sys/dev/pv/virtio.c > index e6cd1ace5aa..be81878642f 100644 > --- a/sys/dev/pv/virtio.c > +++ b/sys/dev/pv/virtio.c > @@ -154,8 +154,7 @@ virtio_reinit_start(struct virtio_softc *sc) > sc->sc_dev.dv_xname, vq->vq_index); > } >
[PATCH 1/7] virtio: adjust virtio_setup_queue prototype for 1.0
Make it take an address instead of a PFN. Pass the virtqueue pointer. In virtio 1.0, more information has to be configured in the device. Also call virtio_setup_queue() after the information has been filled in. --- sys/dev/fdt/virtio_mmio.c | 11 +++ sys/dev/pci/virtio_pci.c | 11 ++- sys/dev/pv/virtio.c | 11 --- sys/dev/pv/virtiovar.h| 2 +- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/sys/dev/fdt/virtio_mmio.c b/sys/dev/fdt/virtio_mmio.c index 11867a43173..3a74e647c19 100644 --- a/sys/dev/fdt/virtio_mmio.c +++ b/sys/dev/fdt/virtio_mmio.c @@ -89,7 +89,7 @@ void virtio_mmio_write_device_config_2(struct virtio_softc *, int, uint16_t); void virtio_mmio_write_device_config_4(struct virtio_softc *, int, uint32_t); void virtio_mmio_write_device_config_8(struct virtio_softc *, int, uint64_t); uint16_t virtio_mmio_read_queue_size(struct virtio_softc *, uint16_t); -void virtio_mmio_setup_queue(struct virtio_softc *, uint16_t, uint32_t); +void virtio_mmio_setup_queue(struct virtio_softc *, struct virtqueue *, uint64_t); void virtio_mmio_set_status(struct virtio_softc *, int); uint32_t virtio_mmio_negotiate_features(struct virtio_softc *, uint32_t, const struct virtio_feature_name *); @@ -151,15 +151,18 @@ virtio_mmio_read_queue_size(struct virtio_softc *vsc, uint16_t idx) } void -virtio_mmio_setup_queue(struct virtio_softc *vsc, uint16_t idx, uint32_t addr) +virtio_mmio_setup_queue(struct virtio_softc *vsc, struct virtqueue *vq, +uint64_t addr) { struct virtio_mmio_softc *sc = (struct virtio_mmio_softc *)vsc; - bus_space_write_4(sc->sc_iot, sc->sc_ioh, VIRTIO_MMIO_QUEUE_SEL, idx); + bus_space_write_4(sc->sc_iot, sc->sc_ioh, VIRTIO_MMIO_QUEUE_SEL, + vq->vq_index); bus_space_write_4(sc->sc_iot, sc->sc_ioh, VIRTIO_MMIO_QUEUE_NUM, bus_space_read_4(sc->sc_iot, sc->sc_ioh, VIRTIO_MMIO_QUEUE_NUM_MAX)); bus_space_write_4(sc->sc_iot, sc->sc_ioh, VIRTIO_MMIO_QUEUE_ALIGN, PAGE_SIZE); - bus_space_write_4(sc->sc_iot, sc->sc_ioh, VIRTIO_MMIO_QUEUE_PFN, addr); + bus_space_write_4(sc->sc_iot, sc->sc_ioh, VIRTIO_MMIO_QUEUE_PFN, + addr / VIRTIO_PAGE_SIZE); } void diff --git a/sys/dev/pci/virtio_pci.c b/sys/dev/pci/virtio_pci.c index cce99e3d720..d1ab7481df6 100644 --- a/sys/dev/pci/virtio_pci.c +++ b/sys/dev/pci/virtio_pci.c @@ -64,7 +64,7 @@ void virtio_pci_write_device_config_2(struct virtio_softc *, int, uint16_t); void virtio_pci_write_device_config_4(struct virtio_softc *, int, uint32_t); void virtio_pci_write_device_config_8(struct virtio_softc *, int, uint64_t); uint16_t virtio_pci_read_queue_size(struct virtio_softc *, uint16_t); -void virtio_pci_setup_queue(struct virtio_softc *, uint16_t, uint32_t); +void virtio_pci_setup_queue(struct virtio_softc *, struct virtqueue *, uint64_t); void virtio_pci_set_status(struct virtio_softc *, int); uint32_t virtio_pci_negotiate_features(struct virtio_softc *, uint32_t, const struct virtio_feature_name *); @@ -134,13 +134,14 @@ virtio_pci_read_queue_size(struct virtio_softc *vsc, uint16_t idx) } void -virtio_pci_setup_queue(struct virtio_softc *vsc, uint16_t idx, uint32_t addr) +virtio_pci_setup_queue(struct virtio_softc *vsc, struct virtqueue *vq, +uint64_t addr) { struct virtio_pci_softc *sc = (struct virtio_pci_softc *)vsc; bus_space_write_2(sc->sc_iot, sc->sc_ioh, VIRTIO_CONFIG_QUEUE_SELECT, - idx); + vq->vq_index); bus_space_write_4(sc->sc_iot, sc->sc_ioh, VIRTIO_CONFIG_QUEUE_ADDRESS, - addr); + addr / VIRTIO_PAGE_SIZE); /* * This path is only executed if this function is called after @@ -150,7 +151,7 @@ virtio_pci_setup_queue(struct virtio_softc *vsc, uint16_t idx, uint32_t addr) if (sc->sc_irq_type != IRQ_NO_MSIX) { int vec = 1; if (sc->sc_irq_type == IRQ_MSIX_PER_VQ) - vec += idx; + vec += vq->vq_index; bus_space_write_2(sc->sc_iot, sc->sc_ioh, VIRTIO_MSI_QUEUE_VECTOR, vec); } diff --git a/sys/dev/pv/virtio.c b/sys/dev/pv/virtio.c index e6cd1ace5aa..be81878642f 100644 --- a/sys/dev/pv/virtio.c +++ b/sys/dev/pv/virtio.c @@ -154,8 +154,7 @@ virtio_reinit_start(struct virtio_softc *sc) sc->sc_dev.dv_xname, vq->vq_index); } virtio_init_vq(sc, vq, 1); - virtio_setup_queue(sc, vq->vq_index, - vq->vq_dmamap->dm_segs[0].ds_addr / VIRTIO_PAGE_SIZE); + virtio_setup_queue(sc, vq, vq->vq_dmamap->dm_segs[0].ds_addr); } } @@ -345,9 +344,6 @@