-/* $OpenBSD: virtio_pci.c,v 1.34 2023/07/05 18:11:08 patrick Exp $ */
+/* $OpenBSD: virtio_pci.c,v 1.35 2023/07/07 10:23:39 patrick Exp $ */
/* $NetBSD: virtio.c,v 1.3 2011/11/02 23:05:52 njoly Exp $ */
/*
struct virtio_softc *vsc = &sc->sc_sc;
int i;
+ /* Shared needs config + queue */
+ if (shared && pci_intr_msix_count(pa) < 1 + 1)
+ return 1;
+ /* Per VQ needs config + N * queue */
+ if (!shared && pci_intr_msix_count(pa) < 1 + vsc->sc_nvqs)
+ return 1;
+
if (virtio_pci_msix_establish(sc, pa, 0, virtio_pci_config_intr, vsc))
return 1;
sc->sc_devcfg_offset = VIRTIO_CONFIG_DEVICE_CONFIG_MSI;
virtio_pci_queue_intr(void *arg)
{
struct virtqueue *vq = arg;
+ struct virtio_softc *vsc = vq->vq_owner;
- if (vq->vq_done)
- return (vq->vq_done)(vq);
- return 0;
+ return virtio_check_vq(vsc, vq);
}
int
-/* $OpenBSD: virtio.c,v 1.22 2023/04/20 19:28:31 jcs Exp $ */
+/* $OpenBSD: virtio.c,v 1.23 2023/07/07 10:23:39 patrick Exp $ */
/* $NetBSD: virtio.c,v 1.3 2011/11/02 23:05:52 njoly Exp $ */
/*
int
virtio_check_vqs(struct virtio_softc *sc)
{
- struct virtqueue *vq;
int i, r = 0;
/* going backwards is better for if_vio */
- for (i = sc->sc_nvqs - 1; i >= 0; i--) {
- vq = &sc->sc_vqs[i];
- if (vq->vq_queued) {
- vq->vq_queued = 0;
- vq_sync_aring(sc, vq, BUS_DMASYNC_POSTWRITE);
- }
- vq_sync_uring(sc, vq, BUS_DMASYNC_POSTREAD);
- if (vq->vq_used_idx != vq->vq_used->idx) {
- if (vq->vq_done)
- r |= (vq->vq_done)(vq);
- }
- }
+ for (i = sc->sc_nvqs - 1; i >= 0; i--)
+ r |= virtio_check_vq(sc, &sc->sc_vqs[i]);
return r;
}
+int
+virtio_check_vq(struct virtio_softc *sc, struct virtqueue *vq)
+{
+ if (vq->vq_queued) {
+ vq->vq_queued = 0;
+ vq_sync_aring(sc, vq, BUS_DMASYNC_POSTWRITE);
+ }
+ vq_sync_uring(sc, vq, BUS_DMASYNC_POSTREAD);
+ if (vq->vq_used_idx != vq->vq_used->idx) {
+ if (vq->vq_done)
+ return (vq->vq_done)(vq);
+ }
+
+ return 0;
+}
+
/*
* Initialize vq structure.
*/
-/* $OpenBSD: virtiovar.h,v 1.14 2019/05/26 15:22:31 sf Exp $ */
+/* $OpenBSD: virtiovar.h,v 1.15 2023/07/07 10:23:39 patrick Exp $ */
/* $NetBSD: virtiovar.h,v 1.1 2011/10/30 12:12:21 hannken Exp $ */
/*
int virtio_intr(void *arg);
int virtio_check_vqs(struct virtio_softc *);
+int virtio_check_vq(struct virtio_softc *, struct virtqueue *);
void virtio_stop_vq_intr(struct virtio_softc *, struct virtqueue *);
int virtio_start_vq_intr(struct virtio_softc *, struct virtqueue *);