Lines Matching refs:sc

80 virtio_set_status(struct virtio_softc *sc, unsigned int status)  in virtio_set_status()  argument
85 old = ddi_get8(sc->sc_ioh, in virtio_set_status()
86 (uint8_t *)(sc->sc_io_addr + in virtio_set_status()
89 ddi_put8(sc->sc_ioh, in virtio_set_status()
90 (uint8_t *)(sc->sc_io_addr + VIRTIO_CONFIG_DEVICE_STATUS), in virtio_set_status()
98 virtio_negotiate_features(struct virtio_softc *sc, uint32_t guest_features) in virtio_negotiate_features() argument
103 host_features = ddi_get32(sc->sc_ioh, in virtio_negotiate_features()
105 (uint32_t *)(sc->sc_io_addr + VIRTIO_CONFIG_DEVICE_FEATURES)); in virtio_negotiate_features()
107 dev_debug(sc->sc_dev, CE_NOTE, in virtio_negotiate_features()
112 ddi_put32(sc->sc_ioh, in virtio_negotiate_features()
114 (uint32_t *)(sc->sc_io_addr + VIRTIO_CONFIG_GUEST_FEATURES), in virtio_negotiate_features()
117 sc->sc_features = features; in virtio_negotiate_features()
143 virtio_has_feature(struct virtio_softc *sc, uint32_t feature) in virtio_has_feature() argument
145 return (sc->sc_features & feature); in virtio_has_feature()
152 virtio_read_device_config_1(struct virtio_softc *sc, unsigned int index) in virtio_read_device_config_1() argument
154 ASSERT(sc->sc_config_offset); in virtio_read_device_config_1()
155 return ddi_get8(sc->sc_ioh, in virtio_read_device_config_1()
156 (uint8_t *)(sc->sc_io_addr + sc->sc_config_offset + index)); in virtio_read_device_config_1()
160 virtio_read_device_config_2(struct virtio_softc *sc, unsigned int index) in virtio_read_device_config_2() argument
162 ASSERT(sc->sc_config_offset); in virtio_read_device_config_2()
163 return ddi_get16(sc->sc_ioh, in virtio_read_device_config_2()
165 (uint16_t *)(sc->sc_io_addr + sc->sc_config_offset + index)); in virtio_read_device_config_2()
169 virtio_read_device_config_4(struct virtio_softc *sc, unsigned int index) in virtio_read_device_config_4() argument
171 ASSERT(sc->sc_config_offset); in virtio_read_device_config_4()
172 return ddi_get32(sc->sc_ioh, in virtio_read_device_config_4()
174 (uint32_t *)(sc->sc_io_addr + sc->sc_config_offset + index)); in virtio_read_device_config_4()
178 virtio_read_device_config_8(struct virtio_softc *sc, unsigned int index) in virtio_read_device_config_8() argument
182 ASSERT(sc->sc_config_offset); in virtio_read_device_config_8()
183 r = ddi_get32(sc->sc_ioh, in virtio_read_device_config_8()
185 (uint32_t *)(sc->sc_io_addr + sc->sc_config_offset + in virtio_read_device_config_8()
190 r += ddi_get32(sc->sc_ioh, in virtio_read_device_config_8()
192 (uint32_t *)(sc->sc_io_addr + sc->sc_config_offset + index)); in virtio_read_device_config_8()
197 virtio_write_device_config_1(struct virtio_softc *sc, in virtio_write_device_config_1() argument
200 ASSERT(sc->sc_config_offset); in virtio_write_device_config_1()
201 ddi_put8(sc->sc_ioh, in virtio_write_device_config_1()
202 (uint8_t *)(sc->sc_io_addr + sc->sc_config_offset + index), value); in virtio_write_device_config_1()
206 virtio_write_device_config_2(struct virtio_softc *sc, in virtio_write_device_config_2() argument
209 ASSERT(sc->sc_config_offset); in virtio_write_device_config_2()
210 ddi_put16(sc->sc_ioh, in virtio_write_device_config_2()
212 (uint16_t *)(sc->sc_io_addr + sc->sc_config_offset + index), value); in virtio_write_device_config_2()
216 virtio_write_device_config_4(struct virtio_softc *sc, in virtio_write_device_config_4() argument
219 ASSERT(sc->sc_config_offset); in virtio_write_device_config_4()
220 ddi_put32(sc->sc_ioh, in virtio_write_device_config_4()
222 (uint32_t *)(sc->sc_io_addr + sc->sc_config_offset + index), value); in virtio_write_device_config_4()
226 virtio_write_device_config_8(struct virtio_softc *sc, in virtio_write_device_config_8() argument
229 ASSERT(sc->sc_config_offset); in virtio_write_device_config_8()
230 ddi_put32(sc->sc_ioh, in virtio_write_device_config_8()
232 (uint32_t *)(sc->sc_io_addr + sc->sc_config_offset + index), in virtio_write_device_config_8()
234 ddi_put32(sc->sc_ioh, in virtio_write_device_config_8()
236 (uint32_t *)(sc->sc_io_addr + sc->sc_config_offset + in virtio_write_device_config_8()
310 virtio_alloc_indirect(struct virtio_softc *sc, struct vq_entry *entry) in virtio_alloc_indirect() argument
322 ret = ddi_dma_alloc_handle(sc->sc_dev, &virtio_vq_indirect_dma_attr, in virtio_alloc_indirect()
325 dev_err(sc->sc_dev, CE_WARN, in virtio_alloc_indirect()
338 dev_err(sc->sc_dev, CE_WARN, in virtio_alloc_indirect()
352 dev_err(sc->sc_dev, CE_WARN, in virtio_alloc_indirect()
377 virtio_init_vq(struct virtio_softc *sc, struct virtqueue *vq) in virtio_init_vq() argument
396 ret = virtio_alloc_indirect(sc, entry); in virtio_init_vq()
403 MUTEX_DRIVER, DDI_INTR_PRI(sc->sc_intr_prio)); in virtio_init_vq()
405 MUTEX_DRIVER, DDI_INTR_PRI(sc->sc_intr_prio)); in virtio_init_vq()
407 MUTEX_DRIVER, DDI_INTR_PRI(sc->sc_intr_prio)); in virtio_init_vq()
427 virtio_alloc_vq(struct virtio_softc *sc, in virtio_alloc_vq() argument
440 ddi_put16(sc->sc_ioh, in virtio_alloc_vq()
442 (uint16_t *)(sc->sc_io_addr + VIRTIO_CONFIG_QUEUE_SELECT), index); in virtio_alloc_vq()
443 vq_size = ddi_get16(sc->sc_ioh, in virtio_alloc_vq()
445 (uint16_t *)(sc->sc_io_addr + VIRTIO_CONFIG_QUEUE_SIZE)); in virtio_alloc_vq()
447 dev_err(sc->sc_dev, CE_WARN, in virtio_alloc_vq()
468 ret = ddi_dma_alloc_handle(sc->sc_dev, &virtio_vq_dma_attr, in virtio_alloc_vq()
471 dev_err(sc->sc_dev, CE_WARN, in virtio_alloc_vq()
480 dev_err(sc->sc_dev, CE_WARN, in virtio_alloc_vq()
491 dev_err(sc->sc_dev, CE_WARN, in virtio_alloc_vq()
507 ddi_put32(sc->sc_ioh, in virtio_alloc_vq()
509 (uint32_t *)(sc->sc_io_addr + VIRTIO_CONFIG_QUEUE_ADDRESS), in virtio_alloc_vq()
513 vq->vq_owner = sc; in virtio_alloc_vq()
523 virtio_has_feature(sc, VIRTIO_F_RING_INDIRECT_DESC)); in virtio_alloc_vq()
530 ret = virtio_init_vq(sc, vq); in virtio_alloc_vq()
534 dev_debug(sc->sc_dev, CE_NOTE, in virtio_alloc_vq()
557 struct virtio_softc *sc = vq->vq_owner; in virtio_free_vq() local
561 ddi_put16(sc->sc_ioh, in virtio_free_vq()
563 (uint16_t *)(sc->sc_io_addr + VIRTIO_CONFIG_QUEUE_SELECT), in virtio_free_vq()
565 ddi_put32(sc->sc_ioh, in virtio_free_vq()
567 (uint32_t *)(sc->sc_io_addr + VIRTIO_CONFIG_QUEUE_ADDRESS), 0); in virtio_free_vq()
832 virtio_register_msi(struct virtio_softc *sc, in virtio_register_msi() argument
859 ret = ddi_intr_get_nintrs(sc->sc_dev, int_type, &count); in virtio_register_msi()
861 dev_err(sc->sc_dev, CE_WARN, "ddi_intr_get_nintrs failed"); in virtio_register_msi()
871 sc->sc_intr_htable = kmem_zalloc( in virtio_register_msi()
874 ret = ddi_intr_alloc(sc->sc_dev, sc->sc_intr_htable, int_type, 0, in virtio_register_msi()
877 dev_err(sc->sc_dev, CE_WARN, "Failed to allocate MSI: %d", ret); in virtio_register_msi()
882 dev_err(sc->sc_dev, CE_WARN, in virtio_register_msi()
888 sc->sc_intr_num = handler_count; in virtio_register_msi()
889 sc->sc_intr_config = B_FALSE; in virtio_register_msi()
891 sc->sc_intr_config = B_TRUE; in virtio_register_msi()
895 ret = ddi_intr_get_pri(sc->sc_intr_htable[0], &sc->sc_intr_prio); in virtio_register_msi()
897 dev_err(sc->sc_dev, CE_WARN, "ddi_intr_get_pri failed"); in virtio_register_msi()
903 ret = ddi_intr_add_handler(sc->sc_intr_htable[i], in virtio_register_msi()
905 sc, vq_handlers[i].vh_priv); in virtio_register_msi()
907 dev_err(sc->sc_dev, CE_WARN, in virtio_register_msi()
912 sc->sc_intr_htable[i]); in virtio_register_msi()
920 ret = ddi_intr_add_handler(sc->sc_intr_htable[i], in virtio_register_msi()
922 sc, config_handler->vh_priv); in virtio_register_msi()
924 dev_err(sc->sc_dev, CE_WARN, in virtio_register_msi()
929 sc->sc_intr_htable[i]); in virtio_register_msi()
936 sc->sc_config_offset = VIRTIO_CONFIG_DEVICE_CONFIG_MSI; in virtio_register_msi()
938 ret = ddi_intr_get_cap(sc->sc_intr_htable[0], in virtio_register_msi()
939 &sc->sc_intr_cap); in virtio_register_msi()
942 sc->sc_intr_cap = 0; in virtio_register_msi()
948 (void) ddi_intr_free(sc->sc_intr_htable[i]); in virtio_register_msi()
950 kmem_free(sc->sc_intr_htable, sizeof (ddi_intr_handle_t) * count); in virtio_register_msi()
964 struct virtio_softc *sc = (void *)arg1; in virtio_intx_dispatch() local
969 isr_status = ddi_get8(sc->sc_ioh, (uint8_t *)(sc->sc_io_addr + in virtio_intx_dispatch()
977 vhc->config_handler.vh_func((void *)sc, in virtio_intx_dispatch()
983 vhc->vq_handlers[i].vh_func((void *)sc, in virtio_intx_dispatch()
995 virtio_register_intx(struct virtio_softc *sc, in virtio_register_intx() argument
1028 sc->sc_intr_htable = kmem_zalloc(sizeof (ddi_intr_handle_t), KM_SLEEP); in virtio_register_intx()
1030 ret = ddi_intr_alloc(sc->sc_dev, sc->sc_intr_htable, in virtio_register_intx()
1034 dev_err(sc->sc_dev, CE_WARN, in virtio_register_intx()
1040 sc->sc_intr_num = 1; in virtio_register_intx()
1042 ret = ddi_intr_get_pri(sc->sc_intr_htable[0], &sc->sc_intr_prio); in virtio_register_intx()
1044 dev_err(sc->sc_dev, CE_WARN, "ddi_intr_get_pri failed"); in virtio_register_intx()
1048 ret = ddi_intr_add_handler(sc->sc_intr_htable[0], in virtio_register_intx()
1049 virtio_intx_dispatch, sc, vhc); in virtio_register_intx()
1051 dev_err(sc->sc_dev, CE_WARN, "ddi_intr_add_handler failed"); in virtio_register_intx()
1056 sc->sc_config_offset = VIRTIO_CONFIG_DEVICE_CONFIG_NOMSI; in virtio_register_intx()
1062 (void) ddi_intr_free(sc->sc_intr_htable[0]); in virtio_register_intx()
1064 kmem_free(sc->sc_intr_htable, sizeof (ddi_intr_handle_t)); in virtio_register_intx()
1076 virtio_register_ints(struct virtio_softc *sc, in virtio_register_ints() argument
1084 ret = ddi_intr_get_supported_types(sc->sc_dev, &intr_types); in virtio_register_ints()
1086 dev_err(sc->sc_dev, CE_WARN, "Can't get supported int types"); in virtio_register_ints()
1092 ret = virtio_register_msi(sc, config_handler, in virtio_register_ints()
1100 dev_debug(sc->sc_dev, CE_WARN, in virtio_register_ints()
1103 return (virtio_register_intx(sc, config_handler, vq_handlers)); in virtio_register_ints()
1106 dev_err(sc->sc_dev, CE_WARN, in virtio_register_ints()
1116 virtio_enable_msi(struct virtio_softc *sc) in virtio_enable_msi() argument
1119 int vq_handler_count = sc->sc_intr_num; in virtio_enable_msi()
1122 if (sc->sc_intr_config) in virtio_enable_msi()
1126 if (sc->sc_intr_cap & DDI_INTR_FLAG_BLOCK) { in virtio_enable_msi()
1127 ret = ddi_intr_block_enable(sc->sc_intr_htable, in virtio_enable_msi()
1128 sc->sc_intr_num); in virtio_enable_msi()
1130 dev_err(sc->sc_dev, CE_WARN, in virtio_enable_msi()
1135 for (i = 0; i < sc->sc_intr_num; i++) { in virtio_enable_msi()
1136 ret = ddi_intr_enable(sc->sc_intr_htable[i]); in virtio_enable_msi()
1138 dev_err(sc->sc_dev, CE_WARN, in virtio_enable_msi()
1144 sc->sc_intr_htable[i]); in virtio_enable_msi()
1154 ddi_put16(sc->sc_ioh, in virtio_enable_msi()
1156 (uint16_t *)(sc->sc_io_addr + in virtio_enable_msi()
1159 ddi_put16(sc->sc_ioh, in virtio_enable_msi()
1161 (uint16_t *)(sc->sc_io_addr + in virtio_enable_msi()
1164 check = ddi_get16(sc->sc_ioh, in virtio_enable_msi()
1166 (uint16_t *)(sc->sc_io_addr + in virtio_enable_msi()
1169 dev_err(sc->sc_dev, CE_WARN, "Failed to bind handler" in virtio_enable_msi()
1176 if (sc->sc_intr_config) { in virtio_enable_msi()
1178 ddi_put16(sc->sc_ioh, in virtio_enable_msi()
1180 (uint16_t *)(sc->sc_io_addr + in virtio_enable_msi()
1183 check = ddi_get16(sc->sc_ioh, in virtio_enable_msi()
1185 (uint16_t *)(sc->sc_io_addr + in virtio_enable_msi()
1188 dev_err(sc->sc_dev, CE_WARN, "Failed to bind handler " in virtio_enable_msi()
1200 ddi_put16(sc->sc_ioh, in virtio_enable_msi()
1202 (uint16_t *)(sc->sc_io_addr + in virtio_enable_msi()
1205 ddi_put16(sc->sc_ioh, in virtio_enable_msi()
1207 (uint16_t *)(sc->sc_io_addr + in virtio_enable_msi()
1213 ddi_put16(sc->sc_ioh, (uint16_t *)(sc->sc_io_addr + in virtio_enable_msi()
1222 static int virtio_enable_intx(struct virtio_softc *sc) in virtio_enable_intx() argument
1226 ret = ddi_intr_enable(sc->sc_intr_htable[0]); in virtio_enable_intx()
1228 dev_err(sc->sc_dev, CE_WARN, in virtio_enable_intx()
1238 virtio_enable_ints(struct virtio_softc *sc) in virtio_enable_ints() argument
1242 if (sc->sc_config_offset == VIRTIO_CONFIG_DEVICE_CONFIG_MSI) in virtio_enable_ints()
1243 return (virtio_enable_msi(sc)); in virtio_enable_ints()
1245 ASSERT(sc->sc_config_offset == VIRTIO_CONFIG_DEVICE_CONFIG_NOMSI); in virtio_enable_ints()
1247 return (virtio_enable_intx(sc)); in virtio_enable_ints()
1251 virtio_release_ints(struct virtio_softc *sc) in virtio_release_ints() argument
1257 if (sc->sc_config_offset == VIRTIO_CONFIG_DEVICE_CONFIG_MSI) { in virtio_release_ints()
1259 for (i = 0; i < sc->sc_nvqs; i++) { in virtio_release_ints()
1260 ddi_put16(sc->sc_ioh, in virtio_release_ints()
1262 (uint16_t *)(sc->sc_io_addr + in virtio_release_ints()
1265 ddi_put16(sc->sc_ioh, in virtio_release_ints()
1267 (uint16_t *)(sc->sc_io_addr + in virtio_release_ints()
1273 ddi_put16(sc->sc_ioh, (uint16_t *)(sc->sc_io_addr + in virtio_release_ints()
1280 if (sc->sc_intr_cap & DDI_INTR_FLAG_BLOCK) { in virtio_release_ints()
1281 ret = ddi_intr_block_disable(sc->sc_intr_htable, in virtio_release_ints()
1282 sc->sc_intr_num); in virtio_release_ints()
1284 dev_err(sc->sc_dev, CE_WARN, in virtio_release_ints()
1289 for (i = 0; i < sc->sc_intr_num; i++) { in virtio_release_ints()
1290 ret = ddi_intr_disable(sc->sc_intr_htable[i]); in virtio_release_ints()
1292 dev_err(sc->sc_dev, CE_WARN, in virtio_release_ints()
1301 for (i = 0; i < sc->sc_intr_num; i++) { in virtio_release_ints()
1302 (void) ddi_intr_remove_handler(sc->sc_intr_htable[i]); in virtio_release_ints()
1305 for (i = 0; i < sc->sc_intr_num; i++) in virtio_release_ints()
1306 (void) ddi_intr_free(sc->sc_intr_htable[i]); in virtio_release_ints()
1308 kmem_free(sc->sc_intr_htable, in virtio_release_ints()
1309 sizeof (ddi_intr_handle_t) * sc->sc_intr_num); in virtio_release_ints()
1313 sc->sc_config_offset = VIRTIO_CONFIG_DEVICE_CONFIG_NOMSI; in virtio_release_ints()