--- sys/dev/pci/virtio_pci.c | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-)
diff --git a/sys/dev/pci/virtio_pci.c b/sys/dev/pci/virtio_pci.c index d69db1968d0..7be93684a68 100644 --- a/sys/dev/pci/virtio_pci.c +++ b/sys/dev/pci/virtio_pci.c @@ -69,6 +69,8 @@ void virtio_pci_setup_queue(struct virtio_softc *, struct virtqueue *, uint64_t void virtio_pci_set_status(struct virtio_softc *, int); uint64_t virtio_pci_negotiate_features(struct virtio_softc *, uint64_t, const struct virtio_feature_name *); +void virtio_pci_set_msix_queue_vector(struct virtio_pci_softc *, uint32_t, uint16_t); +void virtio_pci_set_msix_config_vector(struct virtio_pci_softc *, uint16_t); int virtio_pci_msix_establish(struct virtio_pci_softc *, struct pci_attach_args *, int, int (*)(void *), void *); int virtio_pci_setup_msix(struct virtio_pci_softc *, struct pci_attach_args *, int); void virtio_pci_free_irqs(struct virtio_pci_softc *); @@ -503,6 +505,22 @@ virtio_pci_msix_establish(struct virtio_pci_softc *sc, return 0; } +void +virtio_pci_set_msix_queue_vector(struct virtio_pci_softc *sc, uint32_t idx, uint16_t vector) +{ + bus_space_write_2(sc->sc_iot, sc->sc_ioh, + VIRTIO_CONFIG_QUEUE_SELECT, idx); + bus_space_write_2(sc->sc_iot, sc->sc_ioh, + VIRTIO_MSI_QUEUE_VECTOR, vector); +} + +void +virtio_pci_set_msix_config_vector(struct virtio_pci_softc *sc, uint16_t vector) +{ + bus_space_write_2(sc->sc_iot, sc->sc_ioh, + VIRTIO_MSI_CONFIG_VECTOR, vector); +} + void virtio_pci_free_irqs(struct virtio_pci_softc *sc) { @@ -511,10 +529,8 @@ virtio_pci_free_irqs(struct virtio_pci_softc *sc) if (sc->sc_devcfg_offset == VIRTIO_CONFIG_DEVICE_CONFIG_MSI) { for (i = 0; i < vsc->sc_nvqs; i++) { - bus_space_write_2(sc->sc_iot, sc->sc_ioh, - VIRTIO_CONFIG_QUEUE_SELECT, i); - bus_space_write_2(sc->sc_iot, sc->sc_ioh, - VIRTIO_MSI_QUEUE_VECTOR, VIRTIO_MSI_NO_VECTOR); + virtio_pci_set_msix_queue_vector(sc, i, + VIRTIO_MSI_NO_VECTOR); } } @@ -540,6 +556,7 @@ virtio_pci_setup_msix(struct virtio_pci_softc *sc, struct pci_attach_args *pa, return 1; sc->sc_devcfg_offset = VIRTIO_CONFIG_DEVICE_CONFIG_MSI; virtio_pci_adjust_config_region(sc); + virtio_pci_set_msix_config_vector(sc, 0); if (shared) { if (virtio_pci_msix_establish(sc, pa, 1, @@ -547,22 +564,15 @@ virtio_pci_setup_msix(struct virtio_pci_softc *sc, struct pci_attach_args *pa, goto fail; } - for (i = 0; i < vsc->sc_nvqs; i++) { - bus_space_write_2(sc->sc_iot, sc->sc_ioh, - VIRTIO_CONFIG_QUEUE_SELECT, i); - bus_space_write_2(sc->sc_iot, sc->sc_ioh, - VIRTIO_MSI_QUEUE_VECTOR, 1); - } + for (i = 0; i < vsc->sc_nvqs; i++) + virtio_pci_set_msix_queue_vector(sc, i, 1); } else { for (i = 0; i <= vsc->sc_nvqs; i++) { if (virtio_pci_msix_establish(sc, pa, i + 1, virtio_pci_queue_intr, &vsc->sc_vqs[i])) { goto fail; } - bus_space_write_2(sc->sc_iot, sc->sc_ioh, - VIRTIO_CONFIG_QUEUE_SELECT, i); - bus_space_write_2(sc->sc_iot, sc->sc_ioh, - VIRTIO_MSI_QUEUE_VECTOR, i + 1); + virtio_pci_set_msix_queue_vector(sc, i, i + 1); } } -- 2.19.0