Changeset View
Changeset View
Standalone View
Standalone View
usr.sbin/bhyve/virtio.c
Show First 20 Lines • Show All 109 Lines • ▼ Show 20 Lines | for (vq = vs->vs_queues, i = 0; i < nvq; vq++, i++) { | ||||
vq->vq_next_used = 0; | vq->vq_next_used = 0; | ||||
vq->vq_save_used = 0; | vq->vq_save_used = 0; | ||||
vq->vq_pfn = 0; | vq->vq_pfn = 0; | ||||
vq->vq_msix_idx = VIRTIO_MSI_NO_VECTOR; | vq->vq_msix_idx = VIRTIO_MSI_NO_VECTOR; | ||||
} | } | ||||
vs->vs_negotiated_caps = 0; | vs->vs_negotiated_caps = 0; | ||||
vs->vs_curq = 0; | vs->vs_curq = 0; | ||||
/* vs->vs_status = 0; -- redundant */ | /* vs->vs_status = 0; -- redundant */ | ||||
#ifdef __amd64__ | |||||
if (vs->vs_isr) | if (vs->vs_isr) | ||||
pci_lintr_deassert(vs->vs_pi); | pci_lintr_deassert(vs->vs_pi); | ||||
#endif | |||||
vs->vs_isr = 0; | vs->vs_isr = 0; | ||||
vs->vs_msix_cfg_idx = VIRTIO_MSI_NO_VECTOR; | vs->vs_msix_cfg_idx = VIRTIO_MSI_NO_VECTOR; | ||||
} | } | ||||
/* | /* | ||||
* Set I/O BAR (usually 0) to map PCI config registers. | * Set I/O BAR (usually 0) to map PCI config registers. | ||||
*/ | */ | ||||
void | void | ||||
Show All 30 Lines | if (use_msix) { | ||||
if (pci_emul_add_msixcap(vs->vs_pi, nvec, barnum)) | if (pci_emul_add_msixcap(vs->vs_pi, nvec, barnum)) | ||||
return (1); | return (1); | ||||
} else | } else | ||||
vs->vs_flags &= ~VIRTIO_USE_MSIX; | vs->vs_flags &= ~VIRTIO_USE_MSIX; | ||||
/* Only 1 MSI vector for bhyve */ | /* Only 1 MSI vector for bhyve */ | ||||
pci_emul_add_msicap(vs->vs_pi, 1); | pci_emul_add_msicap(vs->vs_pi, 1); | ||||
/* XXX-MJ missing an implementation for arm64 */ | |||||
#ifdef __amd64__ | |||||
/* Legacy interrupts are mandatory for virtio devices */ | /* Legacy interrupts are mandatory for virtio devices */ | ||||
pci_lintr_request(vs->vs_pi); | pci_lintr_request(vs->vs_pi); | ||||
#endif | |||||
return (0); | return (0); | ||||
} | } | ||||
/* | /* | ||||
* Initialize the currently-selected virtio queue (vs->vs_curq). | * Initialize the currently-selected virtio queue (vs->vs_curq). | ||||
* The guest just gave us a page frame number, from which we can | * The guest just gave us a page frame number, from which we can | ||||
* calculate the addresses of the queue. | * calculate the addresses of the queue. | ||||
▲ Show 20 Lines • Show All 471 Lines • ▼ Show 20 Lines | case VIRTIO_PCI_QUEUE_NOTIFY: | ||||
value = 0; /* XXX */ | value = 0; /* XXX */ | ||||
break; | break; | ||||
case VIRTIO_PCI_STATUS: | case VIRTIO_PCI_STATUS: | ||||
value = vs->vs_status; | value = vs->vs_status; | ||||
break; | break; | ||||
case VIRTIO_PCI_ISR: | case VIRTIO_PCI_ISR: | ||||
value = vs->vs_isr; | value = vs->vs_isr; | ||||
vs->vs_isr = 0; /* a read clears this flag */ | vs->vs_isr = 0; /* a read clears this flag */ | ||||
#ifdef __amd64__ | |||||
if (value) | if (value) | ||||
pci_lintr_deassert(pi); | pci_lintr_deassert(pi); | ||||
#endif | |||||
break; | break; | ||||
case VIRTIO_MSI_CONFIG_VECTOR: | case VIRTIO_MSI_CONFIG_VECTOR: | ||||
value = vs->vs_msix_cfg_idx; | value = vs->vs_msix_cfg_idx; | ||||
break; | break; | ||||
case VIRTIO_MSI_QUEUE_VECTOR: | case VIRTIO_MSI_QUEUE_VECTOR: | ||||
value = vs->vs_curq < vc->vc_nvq ? | value = vs->vs_curq < vc->vc_nvq ? | ||||
vs->vs_queues[vs->vs_curq].vq_msix_idx : | vs->vs_queues[vs->vs_curq].vq_msix_idx : | ||||
VIRTIO_MSI_NO_VECTOR; | VIRTIO_MSI_NO_VECTOR; | ||||
▲ Show 20 Lines • Show All 300 Lines • Show Last 20 Lines |