Lines Matching refs:sc

81 virtio_set_status(struct virtio_softc *sc, unsigned int status)  in virtio_set_status()  argument
86 old = ddi_get8(sc->sc_ioh, (uint8_t *)(sc->sc_io_addr + in virtio_set_status()
90 ddi_put8(sc->sc_ioh, (uint8_t *)(sc->sc_io_addr + 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, "host features: %x, guest features: %x", in virtio_negotiate_features()
111 ddi_put32(sc->sc_ioh, in virtio_negotiate_features()
113 (uint32_t *)(sc->sc_io_addr + VIRTIO_CONFIG_GUEST_FEATURES), in virtio_negotiate_features()
116 sc->sc_features = features; in virtio_negotiate_features()
141 virtio_has_feature(struct virtio_softc *sc, uint32_t feature) in virtio_has_feature() argument
143 return (sc->sc_features & feature); in virtio_has_feature()
150 virtio_read_device_config_1(struct virtio_softc *sc, unsigned int index) in virtio_read_device_config_1() argument
152 ASSERT(sc->sc_config_offset); in virtio_read_device_config_1()
153 return ddi_get8(sc->sc_ioh, in virtio_read_device_config_1()
154 (uint8_t *)(sc->sc_io_addr + sc->sc_config_offset + index)); in virtio_read_device_config_1()
158 virtio_read_device_config_2(struct virtio_softc *sc, unsigned int index) in virtio_read_device_config_2() argument
160 ASSERT(sc->sc_config_offset); in virtio_read_device_config_2()
161 return ddi_get16(sc->sc_ioh, in virtio_read_device_config_2()
163 (uint16_t *)(sc->sc_io_addr + sc->sc_config_offset + index)); in virtio_read_device_config_2()
167 virtio_read_device_config_4(struct virtio_softc *sc, unsigned int index) in virtio_read_device_config_4() argument
169 ASSERT(sc->sc_config_offset); in virtio_read_device_config_4()
170 return ddi_get32(sc->sc_ioh, in virtio_read_device_config_4()
172 (uint32_t *)(sc->sc_io_addr + sc->sc_config_offset + index)); in virtio_read_device_config_4()
176 virtio_read_device_config_8(struct virtio_softc *sc, unsigned int index) in virtio_read_device_config_8() argument
180 ASSERT(sc->sc_config_offset); in virtio_read_device_config_8()
181 r = ddi_get32(sc->sc_ioh, in virtio_read_device_config_8()
183 (uint32_t *)(sc->sc_io_addr + sc->sc_config_offset + in virtio_read_device_config_8()
188 r += ddi_get32(sc->sc_ioh, in virtio_read_device_config_8()
190 (uint32_t *)(sc->sc_io_addr + sc->sc_config_offset + index)); in virtio_read_device_config_8()
195 virtio_write_device_config_1(struct virtio_softc *sc, unsigned int index, in virtio_write_device_config_1() argument
198 ASSERT(sc->sc_config_offset); in virtio_write_device_config_1()
199 ddi_put8(sc->sc_ioh, in virtio_write_device_config_1()
200 (uint8_t *)(sc->sc_io_addr + sc->sc_config_offset + index), value); in virtio_write_device_config_1()
204 virtio_write_device_config_2(struct virtio_softc *sc, unsigned int index, in virtio_write_device_config_2() argument
207 ASSERT(sc->sc_config_offset); in virtio_write_device_config_2()
208 ddi_put16(sc->sc_ioh, in virtio_write_device_config_2()
210 (uint16_t *)(sc->sc_io_addr + sc->sc_config_offset + index), value); in virtio_write_device_config_2()
214 virtio_write_device_config_4(struct virtio_softc *sc, unsigned int index, in virtio_write_device_config_4() argument
217 ASSERT(sc->sc_config_offset); in virtio_write_device_config_4()
218 ddi_put32(sc->sc_ioh, in virtio_write_device_config_4()
220 (uint32_t *)(sc->sc_io_addr + sc->sc_config_offset + index), value); in virtio_write_device_config_4()
224 virtio_write_device_config_8(struct virtio_softc *sc, unsigned int index, in virtio_write_device_config_8() argument
227 ASSERT(sc->sc_config_offset); in virtio_write_device_config_8()
228 ddi_put32(sc->sc_ioh, in virtio_write_device_config_8()
230 (uint32_t *)(sc->sc_io_addr + sc->sc_config_offset + index), in virtio_write_device_config_8()
232 ddi_put32(sc->sc_ioh, in virtio_write_device_config_8()
234 (uint32_t *)(sc->sc_io_addr + sc->sc_config_offset + in virtio_write_device_config_8()
305 virtio_alloc_indirect(struct virtio_softc *sc, struct vq_entry *entry) in virtio_alloc_indirect() argument
317 ret = ddi_dma_alloc_handle(sc->sc_dev, &virtio_vq_indirect_dma_attr, in virtio_alloc_indirect()
320 dev_err(sc->sc_dev, CE_WARN, in virtio_alloc_indirect()
332 dev_err(sc->sc_dev, CE_WARN, in virtio_alloc_indirect()
346 dev_err(sc->sc_dev, CE_WARN, in virtio_alloc_indirect()
371 virtio_init_vq(struct virtio_softc *sc, struct virtqueue *vq) in virtio_init_vq() argument
390 ret = virtio_alloc_indirect(sc, entry); in virtio_init_vq()
397 DDI_INTR_PRI(sc->sc_intr_prio)); in virtio_init_vq()
399 DDI_INTR_PRI(sc->sc_intr_prio)); in virtio_init_vq()
401 DDI_INTR_PRI(sc->sc_intr_prio)); in virtio_init_vq()
419 virtio_alloc_vq(struct virtio_softc *sc, unsigned int index, unsigned int size, in virtio_alloc_vq() argument
428 ddi_put16(sc->sc_ioh, in virtio_alloc_vq()
430 (uint16_t *)(sc->sc_io_addr + VIRTIO_CONFIG_QUEUE_SELECT), index); in virtio_alloc_vq()
431 vq_size = ddi_get16(sc->sc_ioh, in virtio_alloc_vq()
433 (uint16_t *)(sc->sc_io_addr + VIRTIO_CONFIG_QUEUE_SIZE)); in virtio_alloc_vq()
435 dev_err(sc->sc_dev, CE_WARN, in virtio_alloc_vq()
455 ret = ddi_dma_alloc_handle(sc->sc_dev, &virtio_vq_dma_attr, in virtio_alloc_vq()
458 dev_err(sc->sc_dev, CE_WARN, in virtio_alloc_vq()
467 dev_err(sc->sc_dev, CE_WARN, in virtio_alloc_vq()
476 dev_err(sc->sc_dev, CE_WARN, in virtio_alloc_vq()
492 ddi_put32(sc->sc_ioh, in virtio_alloc_vq()
494 (uint32_t *)(sc->sc_io_addr + VIRTIO_CONFIG_QUEUE_ADDRESS), in virtio_alloc_vq()
498 vq->vq_owner = sc; in virtio_alloc_vq()
508 virtio_has_feature(sc, VIRTIO_F_RING_INDIRECT_DESC)); in virtio_alloc_vq()
515 ret = virtio_init_vq(sc, vq); in virtio_alloc_vq()
519 dev_debug(sc->sc_dev, CE_NOTE, in virtio_alloc_vq()
541 struct virtio_softc *sc = vq->vq_owner; in virtio_free_vq() local
545 ddi_put16(sc->sc_ioh, in virtio_free_vq()
547 (uint16_t *)(sc->sc_io_addr + VIRTIO_CONFIG_QUEUE_SELECT), in virtio_free_vq()
549 ddi_put32(sc->sc_ioh, in virtio_free_vq()
551 (uint32_t *)(sc->sc_io_addr + VIRTIO_CONFIG_QUEUE_ADDRESS), 0); in virtio_free_vq()
823 virtio_register_msi(struct virtio_softc *sc, in virtio_register_msi() argument
849 ret = ddi_intr_get_nintrs(sc->sc_dev, int_type, &count); in virtio_register_msi()
851 dev_err(sc->sc_dev, CE_WARN, "ddi_intr_get_nintrs failed"); in virtio_register_msi()
861 sc->sc_intr_htable = kmem_zalloc(sizeof (ddi_intr_handle_t) * in virtio_register_msi()
864 ret = ddi_intr_alloc(sc->sc_dev, sc->sc_intr_htable, int_type, 0, in virtio_register_msi()
867 dev_err(sc->sc_dev, CE_WARN, "Failed to allocate MSI: %d", ret); in virtio_register_msi()
872 dev_err(sc->sc_dev, CE_WARN, in virtio_register_msi()
878 sc->sc_intr_num = handler_count; in virtio_register_msi()
879 sc->sc_intr_config = B_FALSE; in virtio_register_msi()
881 sc->sc_intr_config = B_TRUE; in virtio_register_msi()
885 ret = ddi_intr_get_pri(sc->sc_intr_htable[0], &sc->sc_intr_prio); in virtio_register_msi()
887 dev_err(sc->sc_dev, CE_WARN, "ddi_intr_get_pri failed"); in virtio_register_msi()
893 ret = ddi_intr_add_handler(sc->sc_intr_htable[i], in virtio_register_msi()
894 vq_handlers[i].vh_func, sc, vq_handlers[i].vh_priv); in virtio_register_msi()
896 dev_err(sc->sc_dev, CE_WARN, in virtio_register_msi()
901 sc->sc_intr_htable[i]); in virtio_register_msi()
909 ret = ddi_intr_add_handler(sc->sc_intr_htable[i], in virtio_register_msi()
910 config_handler->vh_func, sc, config_handler->vh_priv); in virtio_register_msi()
912 dev_err(sc->sc_dev, CE_WARN, in virtio_register_msi()
917 sc->sc_intr_htable[i]); in virtio_register_msi()
923 ret = ddi_intr_get_cap(sc->sc_intr_htable[0], &sc->sc_intr_cap); in virtio_register_msi()
925 sc->sc_int_type = int_type; in virtio_register_msi()
933 (void) ddi_intr_free(sc->sc_intr_htable[i]); in virtio_register_msi()
935 kmem_free(sc->sc_intr_htable, in virtio_register_msi()
950 struct virtio_softc *sc = (void *)arg1; in virtio_intx_dispatch() local
955 isr_status = ddi_get8(sc->sc_ioh, (uint8_t *)(sc->sc_io_addr + in virtio_intx_dispatch()
963 vhc->config_handler.vh_func((void *)sc, in virtio_intx_dispatch()
969 vhc->vq_handlers[i].vh_func((void *)sc, in virtio_intx_dispatch()
981 virtio_register_intx(struct virtio_softc *sc, in virtio_register_intx() argument
1013 sc->sc_intr_htable = kmem_zalloc(sizeof (ddi_intr_handle_t), KM_SLEEP); in virtio_register_intx()
1015 ret = ddi_intr_alloc(sc->sc_dev, sc->sc_intr_htable, in virtio_register_intx()
1018 dev_err(sc->sc_dev, CE_WARN, in virtio_register_intx()
1024 sc->sc_intr_num = 1; in virtio_register_intx()
1026 ret = ddi_intr_get_pri(sc->sc_intr_htable[0], &sc->sc_intr_prio); in virtio_register_intx()
1028 dev_err(sc->sc_dev, CE_WARN, "ddi_intr_get_pri failed"); in virtio_register_intx()
1032 ret = ddi_intr_add_handler(sc->sc_intr_htable[0], in virtio_register_intx()
1033 virtio_intx_dispatch, sc, vhc); in virtio_register_intx()
1035 dev_err(sc->sc_dev, CE_WARN, "ddi_intr_add_handler failed"); in virtio_register_intx()
1039 sc->sc_int_type = DDI_INTR_TYPE_FIXED; in virtio_register_intx()
1045 (void) ddi_intr_free(sc->sc_intr_htable[0]); in virtio_register_intx()
1047 kmem_free(sc->sc_intr_htable, sizeof (ddi_intr_handle_t)); in virtio_register_intx()
1059 virtio_register_ints(struct virtio_softc *sc, in virtio_register_ints() argument
1067 sc->sc_config_offset = VIRTIO_CONFIG_DEVICE_CONFIG_NOMSIX; in virtio_register_ints()
1070 ret = ddi_intr_get_supported_types(sc->sc_dev, &intr_types); in virtio_register_ints()
1072 dev_err(sc->sc_dev, CE_WARN, "Can't get supported int types"); in virtio_register_ints()
1078 ret = virtio_register_msi(sc, config_handler, in virtio_register_ints()
1086 dev_debug(sc->sc_dev, CE_WARN, in virtio_register_ints()
1089 return (virtio_register_intx(sc, config_handler, vq_handlers)); in virtio_register_ints()
1092 dev_err(sc->sc_dev, CE_WARN, in virtio_register_ints()
1101 virtio_enable_msi(struct virtio_softc *sc) in virtio_enable_msi() argument
1104 int vq_handler_count = sc->sc_intr_num; in virtio_enable_msi()
1107 if (sc->sc_intr_config) in virtio_enable_msi()
1111 if (sc->sc_intr_cap & DDI_INTR_FLAG_BLOCK) { in virtio_enable_msi()
1112 ret = ddi_intr_block_enable(sc->sc_intr_htable, in virtio_enable_msi()
1113 sc->sc_intr_num); in virtio_enable_msi()
1115 dev_err(sc->sc_dev, CE_WARN, in virtio_enable_msi()
1120 for (i = 0; i < sc->sc_intr_num; i++) { in virtio_enable_msi()
1121 ret = ddi_intr_enable(sc->sc_intr_htable[i]); in virtio_enable_msi()
1123 dev_err(sc->sc_dev, CE_WARN, in virtio_enable_msi()
1129 sc->sc_intr_htable[i]); in virtio_enable_msi()
1140 ddi_put16(sc->sc_ioh, in virtio_enable_msi()
1142 (uint16_t *)(sc->sc_io_addr + in virtio_enable_msi()
1145 ddi_put16(sc->sc_ioh, in virtio_enable_msi()
1147 (uint16_t *)(sc->sc_io_addr + in virtio_enable_msi()
1150 check = ddi_get16(sc->sc_ioh, in virtio_enable_msi()
1152 (uint16_t *)(sc->sc_io_addr + in virtio_enable_msi()
1155 dev_err(sc->sc_dev, CE_WARN, "Failed to bind handler " in virtio_enable_msi()
1162 if (sc->sc_intr_config) { in virtio_enable_msi()
1165 ddi_put16(sc->sc_ioh, in virtio_enable_msi()
1167 (uint16_t *)(sc->sc_io_addr + in virtio_enable_msi()
1170 check = ddi_get16(sc->sc_ioh, in virtio_enable_msi()
1172 (uint16_t *)(sc->sc_io_addr + in virtio_enable_msi()
1175 dev_err(sc->sc_dev, CE_WARN, "Failed to bind handler " in virtio_enable_msi()
1183 if (sc->sc_int_type == DDI_INTR_TYPE_MSIX) in virtio_enable_msi()
1184 sc->sc_config_offset = VIRTIO_CONFIG_DEVICE_CONFIG_MSIX; in virtio_enable_msi()
1186 ASSERT(sc->sc_int_type == DDI_INTR_TYPE_MSI); in virtio_enable_msi()
1193 ddi_put16(sc->sc_ioh, in virtio_enable_msi()
1195 (uint16_t *)(sc->sc_io_addr + in virtio_enable_msi()
1198 ddi_put16(sc->sc_ioh, in virtio_enable_msi()
1200 (uint16_t *)(sc->sc_io_addr + in virtio_enable_msi()
1206 ddi_put16(sc->sc_ioh, (uint16_t *)(sc->sc_io_addr + in virtio_enable_msi()
1210 if (sc->sc_intr_cap & DDI_INTR_FLAG_BLOCK) { in virtio_enable_msi()
1211 ret = ddi_intr_block_disable(sc->sc_intr_htable, in virtio_enable_msi()
1212 sc->sc_intr_num); in virtio_enable_msi()
1214 dev_err(sc->sc_dev, CE_WARN, in virtio_enable_msi()
1219 for (i = 0; i < sc->sc_intr_num; i++) { in virtio_enable_msi()
1220 ret = ddi_intr_disable(sc->sc_intr_htable[i]); in virtio_enable_msi()
1222 dev_err(sc->sc_dev, CE_WARN, in virtio_enable_msi()
1236 virtio_enable_intx(struct virtio_softc *sc) in virtio_enable_intx() argument
1240 ret = ddi_intr_enable(sc->sc_intr_htable[0]); in virtio_enable_intx()
1242 dev_err(sc->sc_dev, CE_WARN, in virtio_enable_intx()
1254 virtio_enable_ints(struct virtio_softc *sc) in virtio_enable_ints() argument
1257 ASSERT(sc->sc_config_offset == VIRTIO_CONFIG_DEVICE_CONFIG_NOMSIX); in virtio_enable_ints()
1260 if (sc->sc_int_type == DDI_INTR_TYPE_MSIX || in virtio_enable_ints()
1261 sc->sc_int_type == DDI_INTR_TYPE_MSI) in virtio_enable_ints()
1262 return (virtio_enable_msi(sc)); in virtio_enable_ints()
1264 ASSERT(sc->sc_int_type == DDI_INTR_TYPE_FIXED); in virtio_enable_ints()
1265 return (virtio_enable_intx(sc)); in virtio_enable_ints()
1269 virtio_release_ints(struct virtio_softc *sc) in virtio_release_ints() argument
1275 if (sc->sc_int_type == DDI_INTR_TYPE_MSIX || in virtio_release_ints()
1276 sc->sc_int_type == DDI_INTR_TYPE_MSI) { in virtio_release_ints()
1278 for (i = 0; i < sc->sc_nvqs; i++) { in virtio_release_ints()
1279 ddi_put16(sc->sc_ioh, in virtio_release_ints()
1281 (uint16_t *)(sc->sc_io_addr + in virtio_release_ints()
1284 ddi_put16(sc->sc_ioh, in virtio_release_ints()
1286 (uint16_t *)(sc->sc_io_addr + in virtio_release_ints()
1292 ddi_put16(sc->sc_ioh, (uint16_t *)(sc->sc_io_addr + in virtio_release_ints()
1299 if (sc->sc_intr_cap & DDI_INTR_FLAG_BLOCK) { in virtio_release_ints()
1300 ret = ddi_intr_block_disable(sc->sc_intr_htable, in virtio_release_ints()
1301 sc->sc_intr_num); in virtio_release_ints()
1303 dev_err(sc->sc_dev, CE_WARN, in virtio_release_ints()
1308 for (i = 0; i < sc->sc_intr_num; i++) { in virtio_release_ints()
1309 ret = ddi_intr_disable(sc->sc_intr_htable[i]); in virtio_release_ints()
1311 dev_err(sc->sc_dev, CE_WARN, in virtio_release_ints()
1319 for (i = 0; i < sc->sc_intr_num; i++) { in virtio_release_ints()
1320 (void) ddi_intr_remove_handler(sc->sc_intr_htable[i]); in virtio_release_ints()
1323 for (i = 0; i < sc->sc_intr_num; i++) in virtio_release_ints()
1324 (void) ddi_intr_free(sc->sc_intr_htable[i]); in virtio_release_ints()
1326 kmem_free(sc->sc_intr_htable, sizeof (ddi_intr_handle_t) * in virtio_release_ints()
1327 sc->sc_intr_num); in virtio_release_ints()
1330 sc->sc_config_offset = VIRTIO_CONFIG_DEVICE_CONFIG_NOMSIX; in virtio_release_ints()