Changeset View
Changeset View
Standalone View
Standalone View
usr.sbin/bhyve/pci_virtio_scsi.c
Show First 20 Lines • Show All 250 Lines • ▼ Show 20 Lines | static struct virtio_consts vtscsi_vi_consts = { | ||||
"vtscsi", /* our name */ | "vtscsi", /* our name */ | ||||
VTSCSI_MAXQ, /* we support 2+n virtqueues */ | VTSCSI_MAXQ, /* we support 2+n virtqueues */ | ||||
sizeof(struct pci_vtscsi_config), /* config reg size */ | sizeof(struct pci_vtscsi_config), /* config reg size */ | ||||
pci_vtscsi_reset, /* reset */ | pci_vtscsi_reset, /* reset */ | ||||
NULL, /* device-wide qnotify */ | NULL, /* device-wide qnotify */ | ||||
pci_vtscsi_cfgread, /* read virtio config */ | pci_vtscsi_cfgread, /* read virtio config */ | ||||
pci_vtscsi_cfgwrite, /* write virtio config */ | pci_vtscsi_cfgwrite, /* write virtio config */ | ||||
pci_vtscsi_neg_features, /* apply negotiated features */ | pci_vtscsi_neg_features, /* apply negotiated features */ | ||||
0, /* our capabilities */ | 0, /* our capabilities (legacy) */ | ||||
0, /* our capabilities (modern) */ | |||||
true, /* Enable legacy */ | |||||
true, /* Enable modern */ | |||||
2, /* PCI BAR# for modern */ | |||||
}; | }; | ||||
static void * | static void * | ||||
pci_vtscsi_proc(void *arg) | pci_vtscsi_proc(void *arg) | ||||
{ | { | ||||
struct pci_vtscsi_worker *worker = (struct pci_vtscsi_worker *)arg; | struct pci_vtscsi_worker *worker = (struct pci_vtscsi_worker *)arg; | ||||
struct pci_vtscsi_queue *q = worker->vsw_queue; | struct pci_vtscsi_queue *q = worker->vsw_queue; | ||||
struct pci_vtscsi_request *req; | struct pci_vtscsi_request *req; | ||||
▲ Show 20 Lines • Show All 444 Lines • ▼ Show 20 Lines | pci_vtscsi_init(struct vmctx *ctx, struct pci_devinst *pi, nvlist_t *nvl) | ||||
/* request queues */ | /* request queues */ | ||||
for (i = 2; i < VTSCSI_MAXQ; i++) { | for (i = 2; i < VTSCSI_MAXQ; i++) { | ||||
sc->vss_vq[i].vq_qsize = VTSCSI_RINGSZ; | sc->vss_vq[i].vq_qsize = VTSCSI_RINGSZ; | ||||
sc->vss_vq[i].vq_notify = pci_vtscsi_requestq_notify; | sc->vss_vq[i].vq_notify = pci_vtscsi_requestq_notify; | ||||
pci_vtscsi_init_queue(sc, &sc->vss_queues[i - 2], i - 2); | pci_vtscsi_init_queue(sc, &sc->vss_queues[i - 2], i - 2); | ||||
} | } | ||||
/* initialize config space */ | /* initialize config space */ | ||||
pci_set_cfgdata16(pi, PCIR_DEVICE, VIRTIO_DEV_SCSI); | pci_set_cfgdata16(pi, PCIR_DEVICE, sc->vss_vs.vs_vc->vc_en_legacy ? | ||||
VIRTIO_DEV_SCSI : VIRTIO_ID_SCSI); | |||||
pci_set_cfgdata16(pi, PCIR_VENDOR, VIRTIO_VENDOR); | pci_set_cfgdata16(pi, PCIR_VENDOR, VIRTIO_VENDOR); | ||||
pci_set_cfgdata8(pi, PCIR_CLASS, PCIC_STORAGE); | pci_set_cfgdata8(pi, PCIR_CLASS, PCIC_STORAGE); | ||||
pci_set_cfgdata16(pi, PCIR_SUBDEV_0, VIRTIO_ID_SCSI); | pci_set_cfgdata16(pi, PCIR_SUBDEV_0, VIRTIO_ID_SCSI); | ||||
pci_set_cfgdata16(pi, PCIR_SUBVEND_0, VIRTIO_VENDOR); | pci_set_cfgdata16(pi, PCIR_SUBVEND_0, VIRTIO_VENDOR); | ||||
if (vi_intr_init(&sc->vss_vs, 1, fbsdrun_virtio_msix())) | if (vi_intr_init(&sc->vss_vs, 1, fbsdrun_virtio_msix())) | ||||
return (1); | return (1); | ||||
vi_set_io_bar(&sc->vss_vs, 0); | vi_setup_pci_bar(&sc->vss_vs); | ||||
return (0); | return (0); | ||||
} | } | ||||
struct pci_devemu pci_de_vscsi = { | struct pci_devemu pci_de_vscsi = { | ||||
.pe_emu = "virtio-scsi", | .pe_emu = "virtio-scsi", | ||||
.pe_init = pci_vtscsi_init, | .pe_init = pci_vtscsi_init, | ||||
.pe_legacy_config = pci_vtscsi_legacy_config, | .pe_legacy_config = pci_vtscsi_legacy_config, | ||||
.pe_cfgwrite = vi_pci_cfgwrite, | |||||
.pe_cfgread = vi_pci_cfgread, | |||||
.pe_barwrite = vi_pci_write, | .pe_barwrite = vi_pci_write, | ||||
.pe_barread = vi_pci_read | .pe_barread = vi_pci_read | ||||
}; | }; | ||||
PCI_EMUL_SET(pci_de_vscsi); | PCI_EMUL_SET(pci_de_vscsi); |