Re: [PATCH 1/7] virtio: adjust virtio_setup_queue prototype for 1.0

2019-01-19 Thread Mike Larkin
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

2019-01-19 Thread Stefan Fritsch
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 @@