Lines Matching refs:vs

57 #define	DEV_SOFTC(vs) ((void *)(vs))
64 vi_softc_linkup(struct virtio_softc *vs, struct virtio_consts *vc,
70 /* vs and dev_softc addresses must match */
71 assert((void *)vs == dev_softc);
72 vs->vs_vc = vc;
73 vs->vs_pi = pi;
74 pi->pi_arg = vs;
76 vs->vs_queues = queues;
78 queues[i].vq_vs = vs;
93 vi_reset_dev(struct virtio_softc *vs)
98 if (vs->vs_mtx)
99 assert(pthread_mutex_isowned_np(vs->vs_mtx));
101 nvq = vs->vs_vc->vc_nvq;
102 for (vq = vs->vs_queues, i = 0; i < nvq; vq++, i++) {
109 vs->vs_negotiated_caps = 0;
110 vs->vs_curq = 0;
111 /* vs->vs_status = 0; -- redundant */
112 if (vs->vs_isr)
113 pci_lintr_deassert(vs->vs_pi);
114 vs->vs_isr = 0;
115 vs->vs_msix_cfg_idx = VIRTIO_MSI_NO_VECTOR;
122 vi_set_io_bar(struct virtio_softc *vs, int barnum)
130 size = VTCFG_R_CFG1 + vs->vs_vc->vc_cfgsize;
131 pci_emul_alloc_bar(vs->vs_pi, barnum, PCIBAR_IO, size);
142 vi_intr_init(struct virtio_softc *vs, int barnum, int use_msix)
147 vs->vs_flags |= VIRTIO_USE_MSIX;
148 VS_LOCK(vs);
149 vi_reset_dev(vs); /* set all vectors to NO_VECTOR */
150 VS_UNLOCK(vs);
151 nvec = vs->vs_vc->vc_nvq + 1;
152 if (pci_emul_add_msixcap(vs->vs_pi, nvec, barnum))
155 vs->vs_flags &= ~VIRTIO_USE_MSIX;
158 pci_emul_add_msicap(vs->vs_pi, 1);
161 pci_lintr_request(vs->vs_pi);
167 * Initialize the currently-selected virtio queue (vs->vs_curq).
172 vi_vq_init(struct virtio_softc *vs, uint32_t pfn)
179 vq = &vs->vs_queues[vs->vs_curq];
183 base = paddr_guest2host(vs->vs_pi->pi_vmctx, phys, size);
238 * at vs->vs_pi) so that it can find indirect descriptors.
270 struct virtio_softc *vs;
273 vs = vq->vq_vs;
274 name = vs->vs_vc->vc_name;
309 ctx = vs->vs_pi->pi_vmctx;
324 } else if ((vs->vs_vc->vc_hv_caps &
456 struct virtio_softc *vs;
469 vs = vq->vq_vs;
480 (vs->vs_negotiated_caps & VIRTIO_F_NOTIFY_ON_EMPTY))
482 else if (vs->vs_negotiated_caps & VIRTIO_RING_F_EVENT_IDX) {
495 vq_interrupt(vs, vq);
547 struct virtio_softc *vs = pi->pi_arg;
556 if (vs->vs_flags & VIRTIO_USE_MSIX) {
566 if (vs->vs_mtx)
567 pthread_mutex_lock(vs->vs_mtx);
569 vc = vs->vs_vc;
591 error = (*vc->vc_cfgread)(DEV_SOFTC(vs), newoff, size, &value);
617 value = vs->vs_negotiated_caps;
620 if (vs->vs_curq < vc->vc_nvq)
621 value = vs->vs_queues[vs->vs_curq].vq_pfn;
624 value = vs->vs_curq < vc->vc_nvq ?
625 vs->vs_queues[vs->vs_curq].vq_qsize : 0;
628 value = vs->vs_curq;
634 value = vs->vs_status;
637 value = vs->vs_isr;
638 vs->vs_isr = 0; /* a read clears this flag */
643 value = vs->vs_msix_cfg_idx;
646 value = vs->vs_curq < vc->vc_nvq ?
647 vs->vs_queues[vs->vs_curq].vq_msix_idx :
652 if (vs->vs_mtx)
653 pthread_mutex_unlock(vs->vs_mtx);
667 struct virtio_softc *vs = pi->pi_arg;
676 if (vs->vs_flags & VIRTIO_USE_MSIX) {
687 if (vs->vs_mtx)
688 pthread_mutex_lock(vs->vs_mtx);
690 vc = vs->vs_vc;
710 error = (*vc->vc_cfgwrite)(DEV_SOFTC(vs), newoff, size, value);
738 vs->vs_negotiated_caps = value & vc->vc_hv_caps;
740 (*vc->vc_apply_features)(DEV_SOFTC(vs),
741 vs->vs_negotiated_caps);
744 if (vs->vs_curq >= vc->vc_nvq)
746 vi_vq_init(vs, value);
754 vs->vs_curq = value;
762 vq = &vs->vs_queues[value];
764 (*vq->vq_notify)(DEV_SOFTC(vs), vq);
766 (*vc->vc_qnotify)(DEV_SOFTC(vs), vq);
773 vs->vs_status = value;
775 (*vc->vc_reset)(DEV_SOFTC(vs));
778 vs->vs_msix_cfg_idx = value;
781 if (vs->vs_curq >= vc->vc_nvq)
783 vq = &vs->vs_queues[vs->vs_curq];
792 name, cr->cr_name, vs->vs_curq, vc->vc_nvq);
794 if (vs->vs_mtx)
795 pthread_mutex_unlock(vs->vs_mtx);