Home | History | Annotate | Line # | Download | only in pci
virtio_pci.c revision 1.2.2.1
      1 /* $NetBSD: virtio_pci.c,v 1.2.2.1 2018/06/25 07:26:01 pgoyette Exp $ */
      2 
      3 /*
      4  * Copyright (c) 2010 Minoura Makoto.
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     21  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26  */
     27 
     28 #include <sys/cdefs.h>
     29 __KERNEL_RCSID(0, "$NetBSD: virtio_pci.c,v 1.2.2.1 2018/06/25 07:26:01 pgoyette Exp $");
     30 
     31 #include <sys/param.h>
     32 #include <sys/systm.h>
     33 #include <sys/kmem.h>
     34 #include <sys/module.h>
     35 
     36 #include <sys/device.h>
     37 
     38 #include <dev/pci/pcidevs.h>
     39 #include <dev/pci/pcireg.h>
     40 #include <dev/pci/pcivar.h>
     41 
     42 #define VIRTIO_PRIVATE
     43 
     44 #include <dev/pci/virtioreg.h> /* XXX: move to non-pci */
     45 #include <dev/pci/virtiovar.h> /* XXX: move to non-pci */
     46 
     47 static int	virtio_pci_match(device_t, cfdata_t, void *);
     48 static void	virtio_pci_attach(device_t, device_t, void *);
     49 static int	virtio_pci_rescan(device_t, const char *, const int *);
     50 static int	virtio_pci_detach(device_t, int);
     51 
     52 struct virtio_pci_softc {
     53 	struct virtio_softc	sc_sc;
     54 	bus_space_tag_t		sc_iot;
     55 	bus_space_handle_t	sc_ioh;
     56 	bus_size_t		sc_iosize;
     57 	struct pci_attach_args	sc_pa;
     58 	pci_intr_handle_t	*sc_ihp;
     59 	void			**sc_ihs;
     60 	int			sc_ihs_num;
     61 	int			sc_config_offset;
     62 };
     63 
     64 static void	virtio_pci_kick(struct virtio_softc *, uint16_t);
     65 static uint8_t	virtio_pci_read_device_config_1(struct virtio_softc *, int);
     66 static uint16_t	virtio_pci_read_device_config_2(struct virtio_softc *, int);
     67 static uint32_t	virtio_pci_read_device_config_4(struct virtio_softc *, int);
     68 static uint64_t	virtio_pci_read_device_config_8(struct virtio_softc *, int);
     69 static void 	virtio_pci_write_device_config_1(struct virtio_softc *, int, uint8_t);
     70 static void	virtio_pci_write_device_config_2(struct virtio_softc *, int, uint16_t);
     71 static void	virtio_pci_write_device_config_4(struct virtio_softc *, int, uint32_t);
     72 static void	virtio_pci_write_device_config_8(struct virtio_softc *, int, uint64_t);
     73 static uint16_t	virtio_pci_read_queue_size(struct virtio_softc *, uint16_t);
     74 static void	virtio_pci_setup_queue(struct virtio_softc *, uint16_t, uint32_t);
     75 static void	virtio_pci_set_status(struct virtio_softc *, int);
     76 static uint32_t	virtio_pci_negotiate_features(struct virtio_softc *, uint32_t);
     77 static int	virtio_pci_setup_interrupts(struct virtio_softc *);
     78 static void	virtio_pci_free_interrupts(struct virtio_softc *);
     79 
     80 static int	virtio_pci_intr(void *arg);
     81 static int	virtio_pci_msix_queue_intr(void *);
     82 static int	virtio_pci_msix_config_intr(void *);
     83 static int	virtio_pci_setup_msix_vectors(struct virtio_softc *);
     84 static int	virtio_pci_setup_msix_interrupts(struct virtio_softc *,
     85 		    struct pci_attach_args *);
     86 static int	virtio_pci_setup_intx_interrupt(struct virtio_softc *,
     87 		    struct pci_attach_args *);
     88 
     89 #define VIRTIO_MSIX_CONFIG_VECTOR_INDEX	0
     90 #define VIRTIO_MSIX_QUEUE_VECTOR_INDEX	1
     91 
     92 /* we use the legacy virtio spec, so the PCI registers are host native
     93  * byte order, not PCI (i.e. LE) byte order */
     94 #if BYTE_ORDER == BIG_ENDIAN
     95 #define REG_HI_OFF      0
     96 #define REG_LO_OFF      4
     97 #ifndef __BUS_SPACE_HAS_STREAM_METHODS
     98 #define bus_space_read_stream_1 bus_space_read_1
     99 #define bus_space_write_stream_1 bus_space_write_1
    100 static inline uint16_t
    101 bus_space_read_stream_2(bus_space_tag_t t, bus_space_handle_t h,
    102     bus_size_t o)
    103 {
    104 	return le16toh(bus_space_read_2(t, h, o));
    105 }
    106 static inline void
    107 bus_space_write_stream_2(bus_space_tag_t t, bus_space_handle_t h,
    108     bus_size_t o, uint16_t v)
    109 {
    110 	bus_space_write_2(t, h, o, htole16(v));
    111 }
    112 static inline uint32_t
    113 bus_space_read_stream_4(bus_space_tag_t t, bus_space_handle_t h,
    114     bus_size_t o)
    115 {
    116 	return le32toh(bus_space_read_4(t, h, o));
    117 }
    118 static inline void
    119 bus_space_write_stream_4(bus_space_tag_t t, bus_space_handle_t h,
    120     bus_size_t o, uint32_t v)
    121 {
    122 	bus_space_write_4(t, h, o, htole32(v));
    123 }
    124 #endif
    125 #else
    126 #define REG_HI_OFF	4
    127 #define REG_LO_OFF	0
    128 #ifndef __BUS_SPACE_HAS_STREAM_METHODS
    129 #define bus_space_read_stream_1 bus_space_read_1
    130 #define bus_space_read_stream_2 bus_space_read_2
    131 #define bus_space_read_stream_4 bus_space_read_4
    132 #define bus_space_write_stream_1 bus_space_write_1
    133 #define bus_space_write_stream_2 bus_space_write_2
    134 #define bus_space_write_stream_4 bus_space_write_4
    135 #endif
    136 #endif
    137 
    138 
    139 static const char *virtio_device_name[] = {
    140 	"Unknown (0)",			/* 0 */
    141 	"Network",			/* 1 */
    142 	"Block",			/* 2 */
    143 	"Console",			/* 3 */
    144 	"Entropy",			/* 4 */
    145 	"Memory Balloon",		/* 5 */
    146 	"I/O Memory",			/* 6 */
    147 	"Remote Processor Messaging",	/* 7 */
    148 	"SCSI",				/* 8 */
    149 	"9P Transport",			/* 9 */
    150 	"mac80211 wlan",		/* 10 */
    151 };
    152 #define NDEVNAMES	__arraycount(virtio_device_name)
    153 
    154 CFATTACH_DECL3_NEW(virtio_pci, sizeof(struct virtio_pci_softc),
    155     virtio_pci_match, virtio_pci_attach, virtio_pci_detach, NULL,
    156     virtio_pci_rescan, NULL, DVF_DETACH_SHUTDOWN);
    157 
    158 static const struct virtio_ops virtio_pci_ops = {
    159 	.kick = virtio_pci_kick,
    160 	.read_dev_cfg_1 = virtio_pci_read_device_config_1,
    161 	.read_dev_cfg_2 = virtio_pci_read_device_config_2,
    162 	.read_dev_cfg_4 = virtio_pci_read_device_config_4,
    163 	.read_dev_cfg_8 = virtio_pci_read_device_config_8,
    164 	.write_dev_cfg_1 = virtio_pci_write_device_config_1,
    165 	.write_dev_cfg_2 = virtio_pci_write_device_config_2,
    166 	.write_dev_cfg_4 = virtio_pci_write_device_config_4,
    167 	.write_dev_cfg_8 = virtio_pci_write_device_config_8,
    168 	.read_queue_size = virtio_pci_read_queue_size,
    169 	.setup_queue = virtio_pci_setup_queue,
    170 	.set_status = virtio_pci_set_status,
    171 	.neg_features = virtio_pci_negotiate_features,
    172 	.setup_interrupts = virtio_pci_setup_interrupts,
    173 	.free_interrupts = virtio_pci_free_interrupts,
    174 };
    175 
    176 static int
    177 virtio_pci_match(device_t parent, cfdata_t match, void *aux)
    178 {
    179 	struct pci_attach_args *pa;
    180 
    181 	pa = (struct pci_attach_args *)aux;
    182 	switch (PCI_VENDOR(pa->pa_id)) {
    183 	case PCI_VENDOR_QUMRANET:
    184 		if ((PCI_PRODUCT_QUMRANET_VIRTIO_1000 <=
    185 		     PCI_PRODUCT(pa->pa_id)) &&
    186 		    (PCI_PRODUCT(pa->pa_id) <=
    187 		     PCI_PRODUCT_QUMRANET_VIRTIO_103F))
    188 			return 1;
    189 		break;
    190 	}
    191 
    192 	return 0;
    193 }
    194 
    195 static void
    196 virtio_pci_attach(device_t parent, device_t self, void *aux)
    197 {
    198 	struct virtio_pci_softc * const psc = device_private(self);
    199 	struct virtio_softc * const sc = &psc->sc_sc;
    200 	struct pci_attach_args *pa = (struct pci_attach_args *)aux;
    201 	pci_chipset_tag_t pc = pa->pa_pc;
    202 	pcitag_t tag = pa->pa_tag;
    203 	int revision;
    204 	pcireg_t id;
    205 	pcireg_t csr;
    206 
    207 	revision = PCI_REVISION(pa->pa_class);
    208 	if (revision != 0) {
    209 		aprint_normal(": unknown revision 0x%02x; giving up\n",
    210 			      revision);
    211 		return;
    212 	}
    213 	aprint_normal("\n");
    214 	aprint_naive("\n");
    215 
    216 	/* subsystem ID shows what I am */
    217 	id = pci_conf_read(pc, tag, PCI_SUBSYS_ID_REG);
    218 	aprint_normal_dev(self, "Virtio %s Device (rev. 0x%02x)\n",
    219 			  (PCI_SUBSYS_ID(id) < NDEVNAMES?
    220 			   virtio_device_name[PCI_SUBSYS_ID(id)] : "Unknown"),
    221 			  revision);
    222 
    223 	csr = pci_conf_read(pc, tag, PCI_COMMAND_STATUS_REG);
    224 	csr |= PCI_COMMAND_MASTER_ENABLE | PCI_COMMAND_IO_ENABLE;
    225 	pci_conf_write(pc, tag, PCI_COMMAND_STATUS_REG, csr);
    226 
    227 	sc->sc_dev = self;
    228 	sc->sc_ops = &virtio_pci_ops;
    229 	psc->sc_pa = *pa;
    230 	psc->sc_iot = pa->pa_iot;
    231 	if (pci_dma64_available(pa))
    232 		sc->sc_dmat = pa->pa_dmat64;
    233 	else
    234 		sc->sc_dmat = pa->pa_dmat;
    235 	psc->sc_config_offset = VIRTIO_CONFIG_DEVICE_CONFIG_NOMSI;
    236 
    237 	if (pci_mapreg_map(pa, PCI_MAPREG_START, PCI_MAPREG_TYPE_IO, 0,
    238 			   &psc->sc_iot, &psc->sc_ioh, NULL, &psc->sc_iosize)) {
    239 		aprint_error_dev(self, "can't map i/o space\n");
    240 		return;
    241 	}
    242 
    243 	virtio_device_reset(sc);
    244 	virtio_set_status(sc, VIRTIO_CONFIG_DEVICE_STATUS_ACK);
    245 	virtio_set_status(sc, VIRTIO_CONFIG_DEVICE_STATUS_DRIVER);
    246 
    247 	sc->sc_childdevid = PCI_SUBSYS_ID(id);
    248 	sc->sc_child = NULL;
    249 	virtio_pci_rescan(self, "virtio", 0);
    250 	return;
    251 }
    252 
    253 /* ARGSUSED */
    254 static int
    255 virtio_pci_rescan(device_t self, const char *attr, const int *scan_flags)
    256 {
    257 	struct virtio_pci_softc * const psc = device_private(self);
    258 	struct virtio_softc * const sc = &psc->sc_sc;
    259 	struct virtio_attach_args va;
    260 
    261 	if (sc->sc_child)	/* Child already attached? */
    262 		return 0;
    263 
    264 	memset(&va, 0, sizeof(va));
    265 	va.sc_childdevid = sc->sc_childdevid;
    266 
    267 	config_found_ia(self, attr, &va, NULL);
    268 
    269 	if (sc->sc_child == NULL) {
    270 		aprint_error_dev(self,
    271 				 "no matching child driver; not configured\n");
    272 		return 0;
    273 	}
    274 
    275 	if (sc->sc_child == VIRTIO_CHILD_FAILED) {
    276 		aprint_error_dev(self,
    277 				 "virtio configuration failed\n");
    278 		return 0;
    279 	}
    280 
    281 	/*
    282 	 * Make sure child drivers initialize interrupts via call
    283 	 * to virtio_child_attach_finish().
    284 	 */
    285 	KASSERT(psc->sc_ihs_num != 0);
    286 
    287 	return 0;
    288 }
    289 
    290 
    291 static int
    292 virtio_pci_detach(device_t self, int flags)
    293 {
    294 	struct virtio_pci_softc * const psc = device_private(self);
    295 	struct virtio_softc * const sc = &psc->sc_sc;
    296 	int r;
    297 
    298 	if (sc->sc_child != NULL) {
    299 		r = config_detach(sc->sc_child, flags);
    300 		if (r)
    301 			return r;
    302 	}
    303 
    304 	/* Check that child detached properly */
    305 	KASSERT(sc->sc_child == NULL);
    306 	KASSERT(sc->sc_vqs == NULL);
    307 	KASSERT(psc->sc_ihs_num == 0);
    308 
    309 	if (psc->sc_iosize)
    310 		bus_space_unmap(psc->sc_iot, psc->sc_ioh, psc->sc_iosize);
    311 	psc->sc_iosize = 0;
    312 
    313 	return 0;
    314 }
    315 
    316 static void
    317 virtio_pci_kick(struct virtio_softc *sc, uint16_t idx)
    318 {
    319 	struct virtio_pci_softc * const psc = (struct virtio_pci_softc *)sc;
    320 
    321 	bus_space_write_stream_2(psc->sc_iot, psc->sc_ioh,
    322 	    VIRTIO_CONFIG_QUEUE_NOTIFY, idx);
    323 }
    324 
    325 static uint8_t
    326 virtio_pci_read_device_config_1(struct virtio_softc *sc, int index)
    327 {
    328 	struct virtio_pci_softc * const psc = (struct virtio_pci_softc *)sc;
    329 	return bus_space_read_stream_1(psc->sc_iot, psc->sc_ioh,
    330 	    psc->sc_config_offset + index);
    331 }
    332 
    333 static uint16_t
    334 virtio_pci_read_device_config_2(struct virtio_softc *sc, int index)
    335 {
    336 	struct virtio_pci_softc * const psc = (struct virtio_pci_softc *)sc;
    337 	return bus_space_read_stream_2(psc->sc_iot, psc->sc_ioh,
    338 	    psc->sc_config_offset + index);
    339 }
    340 
    341 static uint32_t
    342 virtio_pci_read_device_config_4(struct virtio_softc *sc, int index)
    343 {
    344 	struct virtio_pci_softc * const psc = (struct virtio_pci_softc *)sc;
    345 	return bus_space_read_stream_4(psc->sc_iot, psc->sc_ioh,
    346 	    psc->sc_config_offset + index);
    347 }
    348 
    349 static uint64_t
    350 virtio_pci_read_device_config_8(struct virtio_softc *sc, int index)
    351 {
    352 	struct virtio_pci_softc * const psc = (struct virtio_pci_softc *)sc;
    353 	uint64_t r;
    354 
    355 	r = bus_space_read_stream_4(psc->sc_iot, psc->sc_ioh,
    356 	    psc->sc_config_offset + index + REG_HI_OFF);
    357 	r <<= 32;
    358 	r |= bus_space_read_stream_4(psc->sc_iot, psc->sc_ioh,
    359 	    psc->sc_config_offset + index + REG_LO_OFF);
    360 
    361 	return r;
    362 }
    363 
    364 static void
    365 virtio_pci_write_device_config_1(struct virtio_softc *sc, int index,
    366     uint8_t value)
    367 {
    368 	struct virtio_pci_softc * const psc = (struct virtio_pci_softc *)sc;
    369 
    370 	bus_space_write_stream_1(psc->sc_iot, psc->sc_ioh,
    371 	    psc->sc_config_offset + index, value);
    372 }
    373 
    374 static void
    375 virtio_pci_write_device_config_2(struct virtio_softc *sc, int index,
    376     uint16_t value)
    377 {
    378 	struct virtio_pci_softc * const psc = (struct virtio_pci_softc *)sc;
    379 
    380 	bus_space_write_stream_2(psc->sc_iot, psc->sc_ioh,
    381 	    psc->sc_config_offset + index, value);
    382 }
    383 
    384 static void
    385 virtio_pci_write_device_config_4(struct virtio_softc *sc, int index,
    386     uint32_t value)
    387 {
    388 	struct virtio_pci_softc * const psc = (struct virtio_pci_softc *)sc;
    389 
    390 	bus_space_write_stream_4(psc->sc_iot, psc->sc_ioh,
    391 	    psc->sc_config_offset + index, value);
    392 }
    393 
    394 static void
    395 virtio_pci_write_device_config_8(struct virtio_softc *sc, int index,
    396     uint64_t value)
    397 {
    398 	struct virtio_pci_softc * const psc = (struct virtio_pci_softc *)sc;
    399 
    400 	bus_space_write_stream_4(psc->sc_iot, psc->sc_ioh,
    401 	    psc->sc_config_offset + index + REG_LO_OFF,
    402 	    value & 0xffffffff);
    403 	bus_space_write_stream_4(psc->sc_iot, psc->sc_ioh,
    404 	    psc->sc_config_offset + index + REG_HI_OFF,
    405 	    value >> 32);
    406 }
    407 
    408 static uint16_t
    409 virtio_pci_read_queue_size(struct virtio_softc *sc, uint16_t idx)
    410 {
    411 	struct virtio_pci_softc * const psc = (struct virtio_pci_softc *)sc;
    412 
    413 	bus_space_write_stream_2(psc->sc_iot, psc->sc_ioh,
    414 	    VIRTIO_CONFIG_QUEUE_SELECT, idx);
    415 	return bus_space_read_stream_2(psc->sc_iot, psc->sc_ioh,
    416 	    VIRTIO_CONFIG_QUEUE_SIZE);
    417 }
    418 
    419 static void
    420 virtio_pci_setup_queue(struct virtio_softc *sc, uint16_t idx, uint32_t addr)
    421 {
    422 	struct virtio_pci_softc * const psc = (struct virtio_pci_softc *)sc;
    423 
    424 	bus_space_write_stream_2(psc->sc_iot, psc->sc_ioh,
    425 	    VIRTIO_CONFIG_QUEUE_SELECT, idx);
    426 	bus_space_write_stream_4(psc->sc_iot, psc->sc_ioh,
    427 	    VIRTIO_CONFIG_QUEUE_ADDRESS, addr);
    428 
    429 	if (psc->sc_ihs_num > 1) {
    430 		int vec = VIRTIO_MSIX_QUEUE_VECTOR_INDEX;
    431 		if (false) /* (for per-vq vectors) */
    432 			vec += idx;
    433 		bus_space_write_stream_2(psc->sc_iot, psc->sc_ioh,
    434 		    VIRTIO_CONFIG_MSI_QUEUE_VECTOR, vec);
    435 	}
    436 }
    437 
    438 static void
    439 virtio_pci_set_status(struct virtio_softc *sc, int status)
    440 {
    441 	struct virtio_pci_softc * const psc = (struct virtio_pci_softc *)sc;
    442 	int old = 0;
    443 
    444 	if (status != 0) {
    445 	    old = bus_space_read_stream_1(psc->sc_iot, psc->sc_ioh,
    446 		VIRTIO_CONFIG_DEVICE_STATUS);
    447 	}
    448 	bus_space_write_stream_1(psc->sc_iot, psc->sc_ioh,
    449 	    VIRTIO_CONFIG_DEVICE_STATUS, status|old);
    450 }
    451 
    452 static uint32_t
    453 virtio_pci_negotiate_features(struct virtio_softc *sc, uint32_t guest_features)
    454 {
    455 	struct virtio_pci_softc * const psc = (struct virtio_pci_softc *)sc;
    456 	uint32_t r;
    457 
    458 	r = bus_space_read_stream_4(psc->sc_iot, psc->sc_ioh,
    459 	    VIRTIO_CONFIG_DEVICE_FEATURES);
    460 	r &= guest_features;
    461 	bus_space_write_stream_4(psc->sc_iot, psc->sc_ioh,
    462 	    VIRTIO_CONFIG_GUEST_FEATURES, r);
    463 
    464 	return r;
    465 }
    466 
    467 
    468 static int
    469 virtio_pci_setup_msix_vectors(struct virtio_softc *sc)
    470 {
    471 	struct virtio_pci_softc * const psc = (struct virtio_pci_softc *)sc;
    472 	int offset, vector, ret, qid;
    473 
    474 	offset = VIRTIO_CONFIG_MSI_CONFIG_VECTOR;
    475 	vector = VIRTIO_MSIX_CONFIG_VECTOR_INDEX;
    476 
    477 	bus_space_write_stream_2(psc->sc_iot, psc->sc_ioh, offset, vector);
    478 	ret = bus_space_read_stream_2(psc->sc_iot, psc->sc_ioh, offset);
    479 	aprint_debug_dev(sc->sc_dev, "expected=%d, actual=%d\n",
    480 	    vector, ret);
    481 	if (ret != vector)
    482 		return -1;
    483 
    484 	for (qid = 0; qid < sc->sc_nvqs; qid++) {
    485 		offset = VIRTIO_CONFIG_QUEUE_SELECT;
    486 		bus_space_write_stream_2(psc->sc_iot, psc->sc_ioh, offset, qid);
    487 
    488 		offset = VIRTIO_CONFIG_MSI_QUEUE_VECTOR;
    489 		vector = VIRTIO_MSIX_QUEUE_VECTOR_INDEX;
    490 
    491 		bus_space_write_stream_2(psc->sc_iot, psc->sc_ioh, offset, vector);
    492 		ret = bus_space_read_stream_2(psc->sc_iot, psc->sc_ioh, offset);
    493 		aprint_debug_dev(sc->sc_dev, "expected=%d, actual=%d\n",
    494 		    vector, ret);
    495 		if (ret != vector)
    496 			return -1;
    497 	}
    498 
    499 	return 0;
    500 }
    501 
    502 static int
    503 virtio_pci_setup_msix_interrupts(struct virtio_softc *sc,
    504     struct pci_attach_args *pa)
    505 {
    506 	struct virtio_pci_softc * const psc = (struct virtio_pci_softc *)sc;
    507 	device_t self = sc->sc_dev;
    508 	pci_chipset_tag_t pc = pa->pa_pc;
    509 	char intrbuf[PCI_INTRSTR_LEN];
    510 	char const *intrstr;
    511 	int idx;
    512 
    513 	idx = VIRTIO_MSIX_CONFIG_VECTOR_INDEX;
    514 	if (sc->sc_flags & VIRTIO_F_PCI_INTR_MPSAFE)
    515 		pci_intr_setattr(pc, &psc->sc_ihp[idx], PCI_INTR_MPSAFE, true);
    516 
    517 	psc->sc_ihs[idx] = pci_intr_establish_xname(pc, psc->sc_ihp[idx],
    518 	    sc->sc_ipl, virtio_pci_msix_config_intr, sc, device_xname(sc->sc_dev));
    519 	if (psc->sc_ihs[idx] == NULL) {
    520 		aprint_error_dev(self, "couldn't establish MSI-X for config\n");
    521 		goto error;
    522 	}
    523 
    524 	idx = VIRTIO_MSIX_QUEUE_VECTOR_INDEX;
    525 	if (sc->sc_flags & VIRTIO_F_PCI_INTR_MPSAFE)
    526 		pci_intr_setattr(pc, &psc->sc_ihp[idx], PCI_INTR_MPSAFE, true);
    527 
    528 	psc->sc_ihs[idx] = pci_intr_establish_xname(pc, psc->sc_ihp[idx],
    529 	    sc->sc_ipl, virtio_pci_msix_queue_intr, sc, device_xname(sc->sc_dev));
    530 	if (psc->sc_ihs[idx] == NULL) {
    531 		aprint_error_dev(self, "couldn't establish MSI-X for queues\n");
    532 		goto error;
    533 	}
    534 
    535 	if (virtio_pci_setup_msix_vectors(sc) != 0) {
    536 		aprint_error_dev(self, "couldn't setup MSI-X vectors\n");
    537 		goto error;
    538 	}
    539 
    540 	idx = VIRTIO_MSIX_CONFIG_VECTOR_INDEX;
    541 	intrstr = pci_intr_string(pc, psc->sc_ihp[idx], intrbuf, sizeof(intrbuf));
    542 	aprint_normal_dev(self, "config interrupting at %s\n", intrstr);
    543 	idx = VIRTIO_MSIX_QUEUE_VECTOR_INDEX;
    544 	intrstr = pci_intr_string(pc, psc->sc_ihp[idx], intrbuf, sizeof(intrbuf));
    545 	aprint_normal_dev(self, "queues interrupting at %s\n", intrstr);
    546 
    547 	return 0;
    548 
    549 error:
    550 	idx = VIRTIO_MSIX_CONFIG_VECTOR_INDEX;
    551 	if (psc->sc_ihs[idx] != NULL)
    552 		pci_intr_disestablish(psc->sc_pa.pa_pc, psc->sc_ihs[idx]);
    553 	idx = VIRTIO_MSIX_QUEUE_VECTOR_INDEX;
    554 	if (psc->sc_ihs[idx] != NULL)
    555 		pci_intr_disestablish(psc->sc_pa.pa_pc, psc->sc_ihs[idx]);
    556 
    557 	return -1;
    558 }
    559 
    560 static int
    561 virtio_pci_setup_intx_interrupt(struct virtio_softc *sc,
    562     struct pci_attach_args *pa)
    563 {
    564 	struct virtio_pci_softc * const psc = (struct virtio_pci_softc *)sc;
    565 	device_t self = sc->sc_dev;
    566 	pci_chipset_tag_t pc = pa->pa_pc;
    567 	char intrbuf[PCI_INTRSTR_LEN];
    568 	char const *intrstr;
    569 
    570 	if (sc->sc_flags & VIRTIO_F_PCI_INTR_MPSAFE)
    571 		pci_intr_setattr(pc, &psc->sc_ihp[0], PCI_INTR_MPSAFE, true);
    572 
    573 	psc->sc_ihs[0] = pci_intr_establish_xname(pc, psc->sc_ihp[0],
    574 	    sc->sc_ipl, virtio_pci_intr, sc, device_xname(sc->sc_dev));
    575 	if (psc->sc_ihs[0] == NULL) {
    576 		aprint_error_dev(self, "couldn't establish INTx\n");
    577 		return -1;
    578 	}
    579 
    580 	intrstr = pci_intr_string(pc, psc->sc_ihp[0], intrbuf, sizeof(intrbuf));
    581 	aprint_normal_dev(self, "interrupting at %s\n", intrstr);
    582 
    583 	return 0;
    584 }
    585 
    586 static int
    587 virtio_pci_setup_interrupts(struct virtio_softc *sc)
    588 {
    589 	struct virtio_pci_softc * const psc = (struct virtio_pci_softc *)sc;
    590 	device_t self = sc->sc_dev;
    591 	pci_chipset_tag_t pc = psc->sc_pa.pa_pc;
    592 	int error;
    593 	int nmsix;
    594 	int counts[PCI_INTR_TYPE_SIZE];
    595 	pci_intr_type_t max_type;
    596 
    597 	nmsix = pci_msix_count(psc->sc_pa.pa_pc, psc->sc_pa.pa_tag);
    598 	aprint_debug_dev(self, "pci_msix_count=%d\n", nmsix);
    599 
    600 	/* We need at least two: one for config and the other for queues */
    601 	if ((sc->sc_flags & VIRTIO_F_PCI_INTR_MSIX) == 0 || nmsix < 2) {
    602 		/* Try INTx only */
    603 		max_type = PCI_INTR_TYPE_INTX;
    604 		counts[PCI_INTR_TYPE_INTX] = 1;
    605 	} else {
    606 		/* Try MSI-X first and INTx second */
    607 		max_type = PCI_INTR_TYPE_MSIX;
    608 		counts[PCI_INTR_TYPE_MSIX] = 2;
    609 		counts[PCI_INTR_TYPE_MSI] = 0;
    610 		counts[PCI_INTR_TYPE_INTX] = 1;
    611 	}
    612 
    613 retry:
    614 	error = pci_intr_alloc(&psc->sc_pa, &psc->sc_ihp, counts, max_type);
    615 	if (error != 0) {
    616 		aprint_error_dev(self, "couldn't map interrupt\n");
    617 		return -1;
    618 	}
    619 
    620 	if (pci_intr_type(pc, psc->sc_ihp[0]) == PCI_INTR_TYPE_MSIX) {
    621 		psc->sc_ihs = kmem_alloc(sizeof(*psc->sc_ihs) * 2,
    622 		    KM_SLEEP);
    623 
    624 		error = virtio_pci_setup_msix_interrupts(sc, &psc->sc_pa);
    625 		if (error != 0) {
    626 			kmem_free(psc->sc_ihs, sizeof(*psc->sc_ihs) * 2);
    627 			pci_intr_release(pc, psc->sc_ihp, 2);
    628 
    629 			/* Retry INTx */
    630 			max_type = PCI_INTR_TYPE_INTX;
    631 			counts[PCI_INTR_TYPE_INTX] = 1;
    632 			goto retry;
    633 		}
    634 
    635 		psc->sc_ihs_num = 2;
    636 		psc->sc_config_offset = VIRTIO_CONFIG_DEVICE_CONFIG_MSI;
    637 	} else if (pci_intr_type(pc, psc->sc_ihp[0]) == PCI_INTR_TYPE_INTX) {
    638 		psc->sc_ihs = kmem_alloc(sizeof(*psc->sc_ihs) * 1,
    639 		    KM_SLEEP);
    640 
    641 		error = virtio_pci_setup_intx_interrupt(sc, &psc->sc_pa);
    642 		if (error != 0) {
    643 			kmem_free(psc->sc_ihs, sizeof(*psc->sc_ihs) * 1);
    644 			pci_intr_release(pc, psc->sc_ihp, 1);
    645 			return -1;
    646 		}
    647 
    648 		psc->sc_ihs_num = 1;
    649 		psc->sc_config_offset = VIRTIO_CONFIG_DEVICE_CONFIG_NOMSI;
    650 	}
    651 
    652 	return 0;
    653 }
    654 
    655 static void
    656 virtio_pci_free_interrupts(struct virtio_softc *sc)
    657 {
    658 	struct virtio_pci_softc * const psc = (struct virtio_pci_softc *)sc;
    659 
    660 	for (int i = 0; i < psc->sc_ihs_num; i++) {
    661 		if (psc->sc_ihs[i] == NULL)
    662 			continue;
    663 		pci_intr_disestablish(psc->sc_pa.pa_pc, psc->sc_ihs[i]);
    664 		psc->sc_ihs[i] = NULL;
    665 	}
    666 
    667 	if (psc->sc_ihs_num > 0)
    668 		pci_intr_release(psc->sc_pa.pa_pc, psc->sc_ihp, psc->sc_ihs_num);
    669 
    670 	if (psc->sc_ihs != NULL) {
    671 		kmem_free(psc->sc_ihs, sizeof(*psc->sc_ihs) * psc->sc_ihs_num);
    672 		psc->sc_ihs = NULL;
    673 	}
    674 	psc->sc_ihs_num = 0;
    675 }
    676 
    677 /*
    678  * Interrupt handler.
    679  */
    680 static int
    681 virtio_pci_intr(void *arg)
    682 {
    683 	struct virtio_softc *sc = arg;
    684 	struct virtio_pci_softc * const psc = (struct virtio_pci_softc *)sc;
    685 	int isr, r = 0;
    686 
    687 	/* check and ack the interrupt */
    688 	isr = bus_space_read_stream_1(psc->sc_iot, psc->sc_ioh,
    689 			       VIRTIO_CONFIG_ISR_STATUS);
    690 	if (isr == 0)
    691 		return 0;
    692 	if ((isr & VIRTIO_CONFIG_ISR_CONFIG_CHANGE) &&
    693 	    (sc->sc_config_change != NULL))
    694 		r = (sc->sc_config_change)(sc);
    695 	if (sc->sc_intrhand != NULL) {
    696 		if (sc->sc_soft_ih != NULL)
    697 			softint_schedule(sc->sc_soft_ih);
    698 		else
    699 			r |= (sc->sc_intrhand)(sc);
    700 	}
    701 
    702 	return r;
    703 }
    704 
    705 static int
    706 virtio_pci_msix_queue_intr(void *arg)
    707 {
    708 	struct virtio_softc *sc = arg;
    709 	int r = 0;
    710 
    711 	if (sc->sc_intrhand != NULL) {
    712 		if (sc->sc_soft_ih != NULL)
    713 			softint_schedule(sc->sc_soft_ih);
    714 		else
    715 			r |= (sc->sc_intrhand)(sc);
    716 	}
    717 
    718 	return r;
    719 }
    720 
    721 static int
    722 virtio_pci_msix_config_intr(void *arg)
    723 {
    724 	struct virtio_softc *sc = arg;
    725 	int r = 0;
    726 
    727 	if (sc->sc_config_change != NULL)
    728 		r = (sc->sc_config_change)(sc);
    729 	return r;
    730 }
    731 
    732 MODULE(MODULE_CLASS_DRIVER, virtio_pci, "pci,virtio");
    733 
    734 #ifdef _MODULE
    735 #include "ioconf.c"
    736 #endif
    737 
    738 static int
    739 virtio_pci_modcmd(modcmd_t cmd, void *opaque)
    740 {
    741 	int error = 0;
    742 
    743 #ifdef _MODULE
    744 	switch (cmd) {
    745 	case MODULE_CMD_INIT:
    746 		error = config_init_component(cfdriver_ioconf_virtio_pci,
    747 		    cfattach_ioconf_virtio_pci, cfdata_ioconf_virtio_pci);
    748 		break;
    749 	case MODULE_CMD_FINI:
    750 		error = config_fini_component(cfdriver_ioconf_virtio_pci,
    751 		    cfattach_ioconf_virtio_pci, cfdata_ioconf_virtio_pci);
    752 		break;
    753 	default:
    754 		error = ENOTTY;
    755 		break;
    756 	}
    757 #endif
    758 
    759 	return error;
    760 }
    761 
    762