Set virtqueues in virtio_child_attach_finish

The number of virtqueue maybe change in a part of VirtIO devices
(e.g. vioif(4)). And it is fixed after negotiation of features.
So the configuration is moved into the function.
This commit is contained in:
yamaguchi 2023-03-23 03:27:48 +00:00
parent 1639a2df8d
commit 86598168c1
10 changed files with 102 additions and 102 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: if_vioif.c,v 1.102 2023/03/23 03:02:17 yamaguchi Exp $ */
/* $NetBSD: if_vioif.c,v 1.103 2023/03/23 03:27:48 yamaguchi Exp $ */
/*
* Copyright (c) 2020 The NetBSD Foundation, Inc.
@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: if_vioif.c,v 1.102 2023/03/23 03:02:17 yamaguchi Exp $");
__KERNEL_RCSID(0, "$NetBSD: if_vioif.c,v 1.103 2023/03/23 03:27:48 yamaguchi Exp $");
#ifdef _KERNEL_OPT
#include "opt_net_mpsafe.h"
@ -465,7 +465,7 @@ vioif_attach(device_t parent, device_t self, void *aux)
u_int softint_flags;
int r, i, req_flags;
char xnamebuf[MAXCOMLEN];
size_t netq_num;
size_t nvqs;
if (virtio_child(vsc) != NULL) {
aprint_normal(": child already attached for %s; "
@ -509,11 +509,11 @@ vioif_attach(device_t parent, device_t self, void *aux)
#ifdef VIOIF_MULTIQ
req_features |= VIRTIO_NET_F_MQ;
#endif
virtio_child_attach_start(vsc, self, IPL_NET, NULL,
vioif_config_change, virtio_vq_intrhand, req_flags,
req_features, VIRTIO_NET_FLAG_BITS);
virtio_child_attach_start(vsc, self, IPL_NET,
req_features, VIRTIO_NET_FLAG_BITS);
features = virtio_features(vsc);
if (features == 0)
goto err;
@ -565,10 +565,12 @@ vioif_attach(device_t parent, device_t self, void *aux)
/* Limit the number of queue pairs to use */
sc->sc_req_nvq_pairs = MIN(sc->sc_max_nvq_pairs, ncpu);
if (sc->sc_max_nvq_pairs > 1)
req_flags |= VIRTIO_F_INTR_PERVQ;
}
vioif_alloc_queues(sc);
virtio_child_attach_set_vqs(vsc, sc->sc_vqs, sc->sc_req_nvq_pairs);
#ifdef VIOIF_MPSAFE
softint_flags = SOFTINT_NET | SOFTINT_MPSAFE;
@ -579,15 +581,17 @@ vioif_attach(device_t parent, device_t self, void *aux)
/*
* Initialize network queues
*/
netq_num = sc->sc_max_nvq_pairs * 2;
for (i = 0; i < netq_num; i++) {
nvqs = sc->sc_max_nvq_pairs * 2;
for (i = 0; i < nvqs; i++) {
r = vioif_netqueue_init(sc, vsc, i, softint_flags);
if (r != 0)
goto err;
}
if (sc->sc_has_ctrl) {
int ctrlq_idx = sc->sc_max_nvq_pairs * 2;
int ctrlq_idx = nvqs;
nvqs++;
/*
* Allocating a virtqueue for control channel
*/
@ -618,7 +622,9 @@ vioif_attach(device_t parent, device_t self, void *aux)
if (vioif_alloc_mems(sc) < 0)
goto err;
if (virtio_child_attach_finish(vsc) != 0)
r = virtio_child_attach_finish(vsc, sc->sc_vqs, nvqs,
vioif_config_change, virtio_vq_intrhand, req_flags);
if (r != 0)
goto err;
if (vioif_setup_sysctl(sc) != 0) {
@ -656,8 +662,8 @@ vioif_attach(device_t parent, device_t self, void *aux)
return;
err:
netq_num = sc->sc_max_nvq_pairs * 2;
for (i = 0; i < netq_num; i++) {
nvqs = sc->sc_max_nvq_pairs * 2;
for (i = 0; i < nvqs; i++) {
vioif_netqueue_teardown(sc, vsc, i);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: ld_virtio.c,v 1.30 2022/04/13 10:42:12 uwe Exp $ */
/* $NetBSD: ld_virtio.c,v 1.31 2023/03/23 03:27:48 yamaguchi Exp $ */
/*
* Copyright (c) 2010 Minoura Makoto.
@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: ld_virtio.c,v 1.30 2022/04/13 10:42:12 uwe Exp $");
__KERNEL_RCSID(0, "$NetBSD: ld_virtio.c,v 1.31 2023/03/23 03:27:48 yamaguchi Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -275,8 +275,7 @@ ld_virtio_attach(device_t parent, device_t self, void *aux)
sc->sc_dev = self;
sc->sc_virtio = vsc;
virtio_child_attach_start(vsc, self, IPL_BIO, &sc->sc_vq,
NULL, virtio_vq_intr, VIRTIO_F_INTR_MSIX,
virtio_child_attach_start(vsc, self, IPL_BIO,
(VIRTIO_BLK_F_SIZE_MAX | VIRTIO_BLK_F_SEG_MAX |
VIRTIO_BLK_F_GEOMETRY | VIRTIO_BLK_F_RO | VIRTIO_BLK_F_BLK_SIZE |
VIRTIO_BLK_F_FLUSH | VIRTIO_BLK_F_CONFIG_WCE),
@ -340,7 +339,8 @@ ld_virtio_attach(device_t parent, device_t self, void *aux)
qsize = sc->sc_vq.vq_num;
sc->sc_vq.vq_done = ld_virtio_vq_done;
if (virtio_child_attach_finish(vsc) != 0)
if (virtio_child_attach_finish(vsc, &sc->sc_vq, 1,
NULL, virtio_vq_intr, VIRTIO_F_INTR_MSIX) != 0)
goto err;
ld->sc_dv = self;

View File

@ -1,4 +1,4 @@
/* $NetBSD: vio9p.c,v 1.9 2022/04/20 22:08:10 uwe Exp $ */
/* $NetBSD: vio9p.c,v 1.10 2023/03/23 03:27:48 yamaguchi Exp $ */
/*
* Copyright (c) 2019 Internet Initiative Japan, Inc.
@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: vio9p.c,v 1.9 2022/04/20 22:08:10 uwe Exp $");
__KERNEL_RCSID(0, "$NetBSD: vio9p.c,v 1.10 2023/03/23 03:27:48 yamaguchi Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -500,11 +500,8 @@ vio9p_attach(device_t parent, device_t self, void *aux)
sc->sc_dev = self;
sc->sc_virtio = vsc;
virtio_child_attach_start(vsc, self, IPL_VM, sc->sc_vq,
NULL, virtio_vq_intr,
VIRTIO_F_INTR_MPSAFE | VIRTIO_F_INTR_SOFTINT,
VIO9P_F_MOUNT_TAG,
VIO9P_FLAG_BITS);
virtio_child_attach_start(vsc, self, IPL_VM,
VIO9P_F_MOUNT_TAG, VIO9P_FLAG_BITS);
features = virtio_features(vsc);
if ((features & VIO9P_F_MOUNT_TAG) == 0)
@ -517,8 +514,6 @@ vio9p_attach(device_t parent, device_t self, void *aux)
sc->sc_vq[0].vq_done = vio9p_request_done;
virtio_child_attach_set_vqs(vsc, sc->sc_vq, 1);
sc->sc_buf_tx = kmem_alloc(VIO9P_MAX_REQLEN, KM_SLEEP);
sc->sc_buf_rx = kmem_alloc(VIO9P_MAX_REQLEN, KM_SLEEP);
@ -559,7 +554,9 @@ vio9p_attach(device_t parent, device_t self, void *aux)
vio9p_read_config(sc);
aprint_normal_dev(self, "tagged as %s\n", sc->sc_tag);
error = virtio_child_attach_finish(vsc);
error = virtio_child_attach_finish(vsc, sc->sc_vq,
__arraycount(sc->sc_vq), NULL, virtio_vq_intr,
VIRTIO_F_INTR_MPSAFE | VIRTIO_F_INTR_SOFTINT);
if (error != 0)
goto err_mutex;

View File

@ -1,4 +1,4 @@
/* $NetBSD: viomb.c,v 1.13 2022/04/13 10:42:12 uwe Exp $ */
/* $NetBSD: viomb.c,v 1.14 2023/03/23 03:27:48 yamaguchi Exp $ */
/*
* Copyright (c) 2010 Minoura Makoto.
@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: viomb.c,v 1.13 2022/04/13 10:42:12 uwe Exp $");
__KERNEL_RCSID(0, "$NetBSD: viomb.c,v 1.14 2023/03/23 03:27:48 yamaguchi Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -148,8 +148,7 @@ viomb_attach(device_t parent, device_t self, void *aux)
sc->sc_dev = self;
sc->sc_virtio = vsc;
virtio_child_attach_start(vsc, self, IPL_VM, sc->sc_vq,
viomb_config_change, virtio_vq_intr, 0,
virtio_child_attach_start(vsc, self, IPL_VM,
VIRTIO_BALLOON_F_MUST_TELL_HOST, VIRTIO_BALLOON_FLAG_BITS);
features = virtio_features(vsc);
@ -190,7 +189,8 @@ viomb_attach(device_t parent, device_t self, void *aux)
goto err_dmamap;
}
if (virtio_child_attach_finish(vsc) != 0)
if (virtio_child_attach_finish(vsc, sc->sc_vq, __arraycount(sc->sc_vq),
viomb_config_change, virtio_vq_intr, 0) != 0)
goto err_out;
if (kthread_create(PRI_IDLE, KTHREAD_MPSAFE, NULL,

View File

@ -1,4 +1,4 @@
/* $NetBSD: viornd.c,v 1.18 2022/04/14 19:47:14 riastradh Exp $ */
/* $NetBSD: viornd.c,v 1.19 2023/03/23 03:27:48 yamaguchi Exp $ */
/* $OpenBSD: viornd.c,v 1.1 2014/01/21 21:14:58 sf Exp $ */
/*
@ -176,8 +176,7 @@ viornd_attach(device_t parent, device_t self, void *aux)
goto load_failed;
}
virtio_child_attach_start(vsc, self, IPL_NET, &sc->sc_vq,
NULL, virtio_vq_intr, 0,
virtio_child_attach_start(vsc, self, IPL_NET,
0, VIRTIO_COMMON_FLAG_BITS);
error = virtio_alloc_vq(vsc, &sc->sc_vq, 0, VIORND_BUFSIZE, 1,
@ -189,7 +188,9 @@ viornd_attach(device_t parent, device_t self, void *aux)
}
sc->sc_vq.vq_done = viornd_vq_done;
if (virtio_child_attach_finish(vsc) != 0) {
error = virtio_child_attach_finish(vsc, &sc->sc_vq, 1,
NULL, virtio_vq_intr, 0);
if (error) {
virtio_free_vq(vsc, &sc->sc_vq);
goto vio_failed;
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: vioscsi.c,v 1.30 2022/10/11 22:03:37 andvar Exp $ */
/* $NetBSD: vioscsi.c,v 1.31 2023/03/23 03:27:48 yamaguchi Exp $ */
/* $OpenBSD: vioscsi.c,v 1.3 2015/03/14 03:38:49 jsg Exp $ */
/*
@ -18,7 +18,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: vioscsi.c,v 1.30 2022/10/11 22:03:37 andvar Exp $");
__KERNEL_RCSID(0, "$NetBSD: vioscsi.c,v 1.31 2023/03/23 03:27:48 yamaguchi Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -128,8 +128,7 @@ vioscsi_attach(device_t parent, device_t self, void *aux)
sc->sc_dev = self;
virtio_child_attach_start(vsc, self, ipl, sc->sc_vqs,
NULL, virtio_vq_intr, VIRTIO_F_INTR_MSIX,
virtio_child_attach_start(vsc, self, ipl,
0, VIRTIO_COMMON_FLAG_BITS);
mutex_init(&sc->sc_mutex, MUTEX_DEFAULT, ipl);
@ -171,7 +170,9 @@ vioscsi_attach(device_t parent, device_t self, void *aux)
" max_lun %u\n",
cmd_per_lun, qsize, seg_max, max_target, max_lun);
if (virtio_child_attach_finish(vsc) != 0)
if (virtio_child_attach_finish(vsc, sc->sc_vqs,
__arraycount(sc->sc_vqs), NULL, virtio_vq_intr,
VIRTIO_F_INTR_MSIX) != 0)
goto err;
/*

View File

@ -1,4 +1,4 @@
/* $NetBSD: virtio.c,v 1.65 2023/01/03 19:33:31 jakllsch Exp $ */
/* $NetBSD: virtio.c,v 1.66 2023/03/23 03:27:48 yamaguchi Exp $ */
/*
* Copyright (c) 2020 The NetBSD Foundation, Inc.
@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: virtio.c,v 1.65 2023/01/03 19:33:31 jakllsch Exp $");
__KERNEL_RCSID(0, "$NetBSD: virtio.c,v 1.66 2023/03/23 03:27:48 yamaguchi Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -762,9 +762,6 @@ virtio_alloc_vq(struct virtio_softc *sc, struct virtqueue *vq, int index,
int rsegs, r, hdrlen;
#define VIRTQUEUE_ALIGN(n) roundup(n, VIRTIO_PAGE_SIZE)
/* Make sure callers allocate vqs in order */
KASSERT(sc->sc_nvqs == index);
memset(vq, 0, sizeof(*vq));
vq_size = sc->sc_ops->read_queue_size(sc, index);
@ -864,8 +861,6 @@ virtio_alloc_vq(struct virtio_softc *sc, struct virtqueue *vq, int index,
"using %d byte (%d entries) indirect descriptors\n",
allocsize3, maxnsegs * vq_size);
sc->sc_nvqs++;
return 0;
err:
@ -913,8 +908,6 @@ virtio_free_vq(struct virtio_softc *sc, struct virtqueue *vq)
mutex_destroy(&vq->vq_aring_lock);
memset(vq, 0, sizeof(*vq));
sc->sc_nvqs--;
return 0;
}
@ -1270,19 +1263,12 @@ virtio_dequeue_commit(struct virtio_softc *sc, struct virtqueue *vq, int slot)
*/
void
virtio_child_attach_start(struct virtio_softc *sc, device_t child, int ipl,
struct virtqueue *vqs,
virtio_callback config_change,
virtio_callback intr_hand,
int req_flags, int req_features, const char *feat_bits)
uint64_t req_features, const char *feat_bits)
{
char buf[1024];
sc->sc_child = child;
sc->sc_ipl = ipl;
sc->sc_vqs = vqs;
sc->sc_config_change = config_change;
sc->sc_intrhand = intr_hand;
sc->sc_flags = req_flags;
virtio_negotiate_features(sc, req_features);
snprintb(buf, sizeof(buf), feat_bits, sc->sc_active_features);
@ -1290,25 +1276,35 @@ virtio_child_attach_start(struct virtio_softc *sc, device_t child, int ipl,
aprint_naive("\n");
}
void
virtio_child_attach_set_vqs(struct virtio_softc *sc,
struct virtqueue *vqs, int nvq_pairs)
{
KASSERT(nvq_pairs == 1 ||
(sc->sc_flags & VIRTIO_F_INTR_SOFTINT) == 0);
if (nvq_pairs > 1)
sc->sc_child_mq = true;
sc->sc_vqs = vqs;
}
int
virtio_child_attach_finish(struct virtio_softc *sc)
virtio_child_attach_finish(struct virtio_softc *sc,
struct virtqueue *vqs, size_t nvqs,
virtio_callback config_change, virtio_callback intr_hand,
int req_flags)
{
int r;
#ifdef DIAGNOSTIC
KASSERT(nvqs > 0);
#define VIRTIO_ASSERT_FLAGS (VIRTIO_F_INTR_SOFTINT | VIRTIO_F_INTR_PERVQ)
KASSERT((req_flags & VIRTIO_ASSERT_FLAGS) != VIRTIO_ASSERT_FLAGS);
#undef VIRTIO_ASSERT_FLAGS
for (size_t _i = 0; _i < nvqs; _i++){
KASSERT(vqs[_i].vq_index == _i);
KASSERT((req_flags & VIRTIO_F_INTR_PERVQ) == 0 ||
vqs[_i].vq_intrhand != NULL);
}
#endif
sc->sc_finished_called = true;
sc->sc_vqs = vqs;
sc->sc_nvqs = nvqs;
sc->sc_config_change = config_change;
sc->sc_intrhand = intr_hand;
sc->sc_flags = req_flags;
r = sc->sc_ops->alloc_interrupts(sc);
if (r != 0) {
aprint_error_dev(sc->sc_dev,

View File

@ -1,4 +1,4 @@
/* $NetBSD: virtio_pci.c,v 1.38 2022/05/30 20:28:18 riastradh Exp $ */
/* $NetBSD: virtio_pci.c,v 1.39 2023/03/23 03:27:48 yamaguchi Exp $ */
/*
* Copyright (c) 2020 The NetBSD Foundation, Inc.
@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: virtio_pci.c,v 1.38 2022/05/30 20:28:18 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: virtio_pci.c,v 1.39 2023/03/23 03:27:48 yamaguchi Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -73,6 +73,7 @@ static int virtio_pci_detach(device_t, int);
sizeof(pcireg_t))
struct virtio_pci_softc {
struct virtio_softc sc_sc;
bool sc_intr_pervq;
/* IO space */
bus_space_tag_t sc_iot;
@ -629,7 +630,7 @@ virtio_pci_setup_queue_09(struct virtio_softc *sc, uint16_t idx, uint64_t addr)
if (psc->sc_ihs_num > 1) {
int vec = VIRTIO_MSIX_QUEUE_VECTOR_INDEX;
if (sc->sc_child_mq)
if (psc->sc_intr_pervq)
vec += idx;
bus_space_write_2(psc->sc_iot, psc->sc_ioh,
VIRTIO_CONFIG_MSI_QUEUE_VECTOR, vec);
@ -751,7 +752,7 @@ virtio_pci_setup_queue_10(struct virtio_softc *sc, uint16_t idx, uint64_t addr)
if (psc->sc_ihs_num > 1) {
int vec = VIRTIO_MSIX_QUEUE_VECTOR_INDEX;
if (sc->sc_child_mq)
if (psc->sc_intr_pervq)
vec += idx;
bus_space_write_2(iot, ioh,
VIRTIO_CONFIG1_QUEUE_MSIX_VECTOR, vec);
@ -849,7 +850,7 @@ virtio_pci_setup_interrupts_10(struct virtio_softc *sc, int reinit)
for (qid = 0; qid < sc->sc_nvqs; qid++) {
vector = VIRTIO_MSIX_QUEUE_VECTOR_INDEX;
if (sc->sc_child_mq)
if (psc->sc_intr_pervq)
vector += qid;
bus_space_write_2(iot, ioh, VIRTIO_CONFIG1_QUEUE_SELECT, qid);
bus_space_write_2(iot, ioh, VIRTIO_CONFIG1_QUEUE_MSIX_VECTOR,
@ -895,7 +896,7 @@ virtio_pci_setup_interrupts_09(struct virtio_softc *sc, int reinit)
offset = VIRTIO_CONFIG_MSI_QUEUE_VECTOR;
vector = VIRTIO_MSIX_QUEUE_VECTOR_INDEX;
if (sc->sc_child_mq)
if (psc->sc_intr_pervq)
vector += qid;
bus_space_write_2(psc->sc_iot, psc->sc_ioh, offset, vector);
@ -941,7 +942,7 @@ virtio_pci_establish_msix_interrupts(struct virtio_softc *sc,
}
idx = VIRTIO_MSIX_QUEUE_VECTOR_INDEX;
if (sc->sc_child_mq) {
if (psc->sc_intr_pervq) {
for (qid = 0; qid < sc->sc_nvqs; qid++) {
n = idx + qid;
vq = &sc->sc_vqs[qid];
@ -979,7 +980,7 @@ virtio_pci_establish_msix_interrupts(struct virtio_softc *sc,
intrstr = pci_intr_string(pc, psc->sc_ihp[idx], intrbuf, sizeof(intrbuf));
aprint_normal_dev(self, "config interrupting at %s\n", intrstr);
idx = VIRTIO_MSIX_QUEUE_VECTOR_INDEX;
if (sc->sc_child_mq) {
if (psc->sc_intr_pervq) {
kcpuset_t *affinity;
int affinity_to, r;
@ -1019,7 +1020,7 @@ error:
if (psc->sc_ihs[idx] != NULL)
pci_intr_disestablish(psc->sc_pa.pa_pc, psc->sc_ihs[idx]);
idx = VIRTIO_MSIX_QUEUE_VECTOR_INDEX;
if (sc->sc_child_mq) {
if (psc->sc_intr_pervq) {
for (qid = 0; qid < sc->sc_nvqs; qid++) {
n = idx + qid;
if (psc->sc_ihs[n] == NULL)
@ -1085,13 +1086,10 @@ virtio_pci_alloc_interrupts(struct virtio_softc *sc)
counts[PCI_INTR_TYPE_INTX] = 1;
} else {
/* Try MSI-X first and INTx second */
if (sc->sc_nvqs + VIRTIO_MSIX_QUEUE_VECTOR_INDEX <= nmsix) {
if (ISSET(sc->sc_flags, VIRTIO_F_INTR_PERVQ) &&
sc->sc_nvqs + VIRTIO_MSIX_QUEUE_VECTOR_INDEX <= nmsix) {
nmsix = sc->sc_nvqs + VIRTIO_MSIX_QUEUE_VECTOR_INDEX;
} else {
sc->sc_child_mq = false;
}
if (sc->sc_child_mq == false) {
nmsix = 2;
}
@ -1109,6 +1107,7 @@ retry:
}
if (pci_intr_type(pc, psc->sc_ihp[0]) == PCI_INTR_TYPE_MSIX) {
psc->sc_intr_pervq = nmsix > 2 ? true : false;
psc->sc_ihs = kmem_zalloc(sizeof(*psc->sc_ihs) * nmsix,
KM_SLEEP);
@ -1127,6 +1126,7 @@ retry:
psc->sc_devcfg_offset = VIRTIO_CONFIG_DEVICE_CONFIG_MSI;
virtio_pci_adjust_config_region(psc);
} else if (pci_intr_type(pc, psc->sc_ihp[0]) == PCI_INTR_TYPE_INTX) {
psc->sc_intr_pervq = false;
psc->sc_ihs = kmem_zalloc(sizeof(*psc->sc_ihs) * 1,
KM_SLEEP);
@ -1149,6 +1149,8 @@ retry:
}
}
if (!psc->sc_intr_pervq)
CLR(sc->sc_flags, VIRTIO_F_INTR_PERVQ);
return 0;
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: virtiovar.h,v 1.24 2022/03/24 08:08:05 andvar Exp $ */
/* $NetBSD: virtiovar.h,v 1.25 2023/03/23 03:27:48 yamaguchi Exp $ */
/*
* Copyright (c) 2010 Minoura Makoto.
@ -171,7 +171,6 @@ struct virtio_softc {
int sc_childdevid;
device_t sc_child; /* set by child */
bool sc_child_mq;
virtio_callback sc_config_change; /* set by child */
virtio_callback sc_intrhand; /* set by child */
};
@ -184,6 +183,7 @@ struct virtio_softc;
#define VIRTIO_F_INTR_MPSAFE (1 << 0)
#define VIRTIO_F_INTR_SOFTINT (1 << 1)
#define VIRTIO_F_INTR_MSIX (1 << 2)
#define VIRTIO_F_INTR_PERVQ (1 << 3)
#define VIRTIO_CHILD_FAILED ((void *)1)
@ -211,12 +211,10 @@ void virtio_reset(struct virtio_softc *);
int virtio_reinit_start(struct virtio_softc *);
void virtio_reinit_end(struct virtio_softc *);
void virtio_child_attach_start(struct virtio_softc *, device_t, int,
struct virtqueue *,
virtio_callback, virtio_callback, int,
int, const char *);
void virtio_child_attach_set_vqs(struct virtio_softc *,
struct virtqueue *, int);
int virtio_child_attach_finish(struct virtio_softc *);
uint64_t, const char *);
int virtio_child_attach_finish(struct virtio_softc *,
struct virtqueue *, size_t,
virtio_callback, virtio_callback, int);
void virtio_child_attach_failed(struct virtio_softc *);
void virtio_child_detach(struct virtio_softc *);

View File

@ -1,4 +1,4 @@
/* $NetBSD: viocon.c,v 1.5 2022/08/13 17:31:32 riastradh Exp $ */
/* $NetBSD: viocon.c,v 1.6 2023/03/23 03:27:48 yamaguchi Exp $ */
/* $OpenBSD: viocon.c,v 1.8 2021/11/05 11:38:29 mpi Exp $ */
/*
@ -18,7 +18,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: viocon.c,v 1.5 2022/08/13 17:31:32 riastradh Exp $");
__KERNEL_RCSID(0, "$NetBSD: viocon.c,v 1.6 2023/03/23 03:27:48 yamaguchi Exp $");
#include <sys/param.h>
#include <sys/types.h>
@ -209,10 +209,8 @@ viocon_attach(struct device *parent, struct device *self, void *aux)
sc->sc_ports = kmem_zalloc(maxports * sizeof(sc->sc_ports[0]),
KM_SLEEP);
virtio_child_attach_start(vsc, self, IPL_TTY, sc->sc_vqs,
/*config_change*/NULL, virtio_vq_intr,
/*req_flags*/0, /*req_features*/VIRTIO_CONSOLE_F_SIZE,
VIRTIO_CONSOLE_FLAG_BITS);
virtio_child_attach_start(vsc, self, IPL_TTY,
/*req_features*/VIRTIO_CONSOLE_F_SIZE, VIRTIO_CONSOLE_FLAG_BITS);
DPRINTF("%s: softc: %p\n", __func__, sc);
if (viocon_port_create(sc, 0) != 0) {
@ -221,7 +219,8 @@ viocon_attach(struct device *parent, struct device *self, void *aux)
}
viocon_rx_fill(sc->sc_ports[0]);
if (virtio_child_attach_finish(vsc) != 0)
if (virtio_child_attach_finish(vsc, sc->sc_vqs, sc->sc_max_ports * 2,
/*config_change*/NULL, virtio_vq_intr, /*req_flags*/0) != 0)
goto err;
return;