Lines Matching refs:vq
62 virtio_dev_map_vq(struct vfu_virtio_dev *dev, struct vfu_virtio_vq *vq) in virtio_dev_map_vq() argument
67 if (!vq->enabled || (vq->q_state == VFU_VQ_ACTIVE)) { in virtio_dev_map_vq()
71 SPDK_DEBUGLOG(vfu_virtio, "%s: try to map vq %u\n", dev->name, vq->id); in virtio_dev_map_vq()
73 len = virtio_queue_desc_size(dev, vq); in virtio_dev_map_vq()
74 phys_addr = ((((uint64_t)vq->desc_hi) << 32) | vq->desc_lo); in virtio_dev_map_vq()
75 ret = vfu_virtio_map_q(dev, &vq->desc, phys_addr, len); in virtio_dev_map_vq()
81 len = virtio_queue_avail_size(dev, vq); in virtio_dev_map_vq()
82 phys_addr = ((((uint64_t)vq->avail_hi) << 32) | vq->avail_lo); in virtio_dev_map_vq()
83 ret = vfu_virtio_map_q(dev, &vq->avail, phys_addr, len); in virtio_dev_map_vq()
85 vfu_virtio_unmap_q(dev, &vq->desc); in virtio_dev_map_vq()
90 len = virtio_queue_used_size(dev, vq); in virtio_dev_map_vq()
91 phys_addr = ((((uint64_t)vq->used_hi) << 32) | vq->used_lo); in virtio_dev_map_vq()
92 ret = vfu_virtio_map_q(dev, &vq->used, phys_addr, len); in virtio_dev_map_vq()
94 vfu_virtio_unmap_q(dev, &vq->desc); in virtio_dev_map_vq()
95 vfu_virtio_unmap_q(dev, &vq->avail); in virtio_dev_map_vq()
102 vq->used.device_event->flags = VRING_PACKED_EVENT_FLAG_DISABLE; in virtio_dev_map_vq()
104 vq->used.used->flags = VRING_USED_F_NO_NOTIFY; in virtio_dev_map_vq()
107 SPDK_DEBUGLOG(vfu_virtio, "%s: map vq %u successfully\n", dev->name, vq->id); in virtio_dev_map_vq()
108 vq->q_state = VFU_VQ_ACTIVE; in virtio_dev_map_vq()
114 virtio_dev_unmap_vq(struct vfu_virtio_dev *dev, struct vfu_virtio_vq *vq) in virtio_dev_unmap_vq() argument
116 SPDK_DEBUGLOG(vfu_virtio, "%s: unmap vq %u\n", dev->name, vq->id); in virtio_dev_unmap_vq()
117 vq->q_state = VFU_VQ_INACTIVE; in virtio_dev_unmap_vq()
119 vfu_virtio_unmap_q(dev, &vq->desc); in virtio_dev_unmap_vq()
120 vfu_virtio_unmap_q(dev, &vq->avail); in virtio_dev_unmap_vq()
121 vfu_virtio_unmap_q(dev, &vq->used); in virtio_dev_unmap_vq()
125 vfu_virtio_vq_should_unmap(struct vfu_virtio_vq *vq, void *map_start, void *map_end) in vfu_virtio_vq_should_unmap() argument
132 if (vq->desc.addr >= map_start && vq->desc.addr < map_end) { in vfu_virtio_vq_should_unmap()
136 if (vq->avail.addr >= map_start && vq->avail.addr < map_end) { in vfu_virtio_vq_should_unmap()
140 if (vq->used.addr >= map_start && vq->used.addr < map_end) { in vfu_virtio_vq_should_unmap()
151 struct vfu_virtio_vq *vq; in vfu_virtio_dev_unmap_vqs() local
154 vq = &dev->vqs[i]; in vfu_virtio_dev_unmap_vqs()
155 if (!vq->enabled) { in vfu_virtio_dev_unmap_vqs()
159 if (!vfu_virtio_vq_should_unmap(vq, map_start, map_end)) { in vfu_virtio_dev_unmap_vqs()
162 virtio_dev_unmap_vq(dev, vq); in vfu_virtio_dev_unmap_vqs()
188 struct vfu_virtio_vq *vq; in vfu_virtio_dev_reset() local
193 vq = &dev->vqs[i]; in vfu_virtio_dev_reset()
195 vq->q_state = VFU_VQ_CREATED; in vfu_virtio_dev_reset()
196 vq->vector = 0; in vfu_virtio_dev_reset()
197 vq->enabled = false; in vfu_virtio_dev_reset()
198 vq->last_avail_idx = 0; in vfu_virtio_dev_reset()
199 vq->last_used_idx = 0; in vfu_virtio_dev_reset()
201 vq->packed.packed_ring = false; in vfu_virtio_dev_reset()
202 vq->packed.avail_phase = 0; in vfu_virtio_dev_reset()
203 vq->packed.used_phase = 0; in vfu_virtio_dev_reset()
265 struct vfu_virtio_vq *vq; in virtio_dev_enable_vq() local
269 vq = &dev->vqs[qid]; in virtio_dev_enable_vq()
270 if (vq->enabled) { in virtio_dev_enable_vq()
274 vq->enabled = true; in virtio_dev_enable_vq()
276 if (virtio_dev_map_vq(dev, vq)) { in virtio_dev_enable_vq()
281 vq->avail.avail->idx = 0; in virtio_dev_enable_vq()
282 vq->last_avail_idx = 0; in virtio_dev_enable_vq()
283 vq->used.used->idx = 0; in virtio_dev_enable_vq()
284 vq->last_used_idx = 0; in virtio_dev_enable_vq()
288 vq->packed.packed_ring = true; in virtio_dev_enable_vq()
289 vq->packed.avail_phase = true; in virtio_dev_enable_vq()
290 vq->packed.used_phase = true; in virtio_dev_enable_vq()
299 struct vfu_virtio_vq *vq; in virtio_dev_disable_vq() local
303 vq = &dev->vqs[qid]; in virtio_dev_disable_vq()
304 if (!vq->enabled) { in virtio_dev_disable_vq()
309 virtio_dev_unmap_vq(dev, vq); in virtio_dev_disable_vq()
311 vq->q_state = VFU_VQ_CREATED; in virtio_dev_disable_vq()
312 vq->vector = 0; in virtio_dev_disable_vq()
313 vq->enabled = false; in virtio_dev_disable_vq()
314 vq->last_avail_idx = 0; in virtio_dev_disable_vq()
315 vq->last_used_idx = 0; in virtio_dev_disable_vq()
316 vq->packed.packed_ring = false; in virtio_dev_disable_vq()
317 vq->packed.avail_phase = 0; in virtio_dev_disable_vq()
318 vq->packed.used_phase = 0; in virtio_dev_disable_vq()
324 virtio_dev_split_get_avail_reqs(struct vfu_virtio_dev *dev, struct vfu_virtio_vq *vq, in virtio_dev_split_get_avail_reqs() argument
329 last_idx = vq->last_avail_idx; in virtio_dev_split_get_avail_reqs()
330 avail_idx = vq->avail.avail->idx; in virtio_dev_split_get_avail_reqs()
340 vq->last_avail_idx += count; in virtio_dev_split_get_avail_reqs()
343 reqs[i] = vq->avail.avail->ring[(last_idx + i) & (vq->qsize - 1)]; in virtio_dev_split_get_avail_reqs()
348 vq->id, last_idx, avail_idx, count); in virtio_dev_split_get_avail_reqs()
387 virtio_split_vring_get_desc(struct vfu_virtio_dev *dev, struct vfu_virtio_vq *vq, uint16_t desc_idx, in virtio_split_vring_get_desc() argument
392 *desc = &vq->desc.desc[desc_idx]; in virtio_split_vring_get_desc()
404 *desc_table = vq->desc.desc; in virtio_split_vring_get_desc()
405 *desc_table_size = vq->qsize; in virtio_split_vring_get_desc()
417 vfu_virtio_dev_get_req(struct vfu_virtio_endpoint *virtio_endpoint, struct vfu_virtio_vq *vq) in vfu_virtio_dev_get_req() argument
421 req = STAILQ_FIRST(&vq->free_reqs); in vfu_virtio_dev_get_req()
425 STAILQ_REMOVE_HEAD(&vq->free_reqs, link); in vfu_virtio_dev_get_req()
455 STAILQ_INSERT_HEAD(&req->vq->free_reqs, req, link); in vfu_virtio_dev_put_req()
468 virtio_vq_used_ring_split_enqueue(req->vq, req->req_idx, req->used_len); in vfu_virtio_finish_req()
470 virtio_vq_used_ring_packed_enqueue(req->vq, req->buffer_id, req->num_descs, req->used_len); in vfu_virtio_finish_req()
480 struct vfu_virtio_vq *vq; in vfu_virtio_dev_free_reqs() local
484 vq = &dev->vqs[i]; in vfu_virtio_dev_free_reqs()
485 while (!STAILQ_EMPTY(&vq->free_reqs)) { in vfu_virtio_dev_free_reqs()
486 req = STAILQ_FIRST(&vq->free_reqs); in vfu_virtio_dev_free_reqs()
487 STAILQ_REMOVE_HEAD(&vq->free_reqs, link); in vfu_virtio_dev_free_reqs()
488 vfu_virtio_vq_free_req(virtio_endpoint, vq, req); in vfu_virtio_dev_free_reqs()
494 virtio_dev_split_iovs_setup(struct vfu_virtio_dev *dev, struct vfu_virtio_vq *vq, in virtio_dev_split_iovs_setup() argument
502 rc = virtio_split_vring_get_desc(dev, vq, desc_idx, &desc, in virtio_dev_split_iovs_setup()
544 virtio_vq_used_ring_split_enqueue(struct vfu_virtio_vq *vq, uint16_t req_idx, uint32_t used_len) in virtio_vq_used_ring_split_enqueue() argument
546 uint16_t last_idx = vq->last_used_idx & (vq->qsize - 1); in virtio_vq_used_ring_split_enqueue()
550 vq->id, last_idx, req_idx, used_len); in virtio_vq_used_ring_split_enqueue()
552 vq->used.used->ring[last_idx].id = req_idx; in virtio_vq_used_ring_split_enqueue()
553 vq->used.used->ring[last_idx].len = used_len; in virtio_vq_used_ring_split_enqueue()
554 vq->last_used_idx++; in virtio_vq_used_ring_split_enqueue()
558 *(volatile uint16_t *)&vq->used.used->idx = vq->last_used_idx; in virtio_vq_used_ring_split_enqueue()
560 vq->used_req_cnt++; in virtio_vq_used_ring_split_enqueue()
564 virtio_vq_used_ring_packed_enqueue(struct vfu_virtio_vq *vq, uint16_t buffer_id, uint32_t num_descs, in virtio_vq_used_ring_packed_enqueue() argument
567 struct vring_packed_desc *desc = &vq->desc.desc_packed[vq->last_used_idx]; in virtio_vq_used_ring_packed_enqueue()
571 vq->id, buffer_id, num_descs, used_len); in virtio_vq_used_ring_packed_enqueue()
573 if (spdk_unlikely(virtio_vring_packed_is_used(desc, vq->packed.used_phase))) { in virtio_vq_used_ring_packed_enqueue()
604 if (vq->packed.used_phase) { in virtio_vq_used_ring_packed_enqueue()
612 vq->last_used_idx += num_descs; in virtio_vq_used_ring_packed_enqueue()
613 if (vq->last_used_idx >= vq->qsize) { in virtio_vq_used_ring_packed_enqueue()
614 vq->last_used_idx -= vq->qsize; in virtio_vq_used_ring_packed_enqueue()
615 vq->packed.used_phase = !vq->packed.used_phase; in virtio_vq_used_ring_packed_enqueue()
618 vq->used_req_cnt++; in virtio_vq_used_ring_packed_enqueue()
622 vfu_virtio_vq_post_irq(struct vfu_virtio_dev *dev, struct vfu_virtio_vq *vq) in vfu_virtio_vq_post_irq() argument
627 vq->used_req_cnt = 0; in vfu_virtio_vq_post_irq()
632 vq->id, vq->vector); in vfu_virtio_vq_post_irq()
633 return vfu_irq_trigger(vfu_ctx, vq->vector); in vfu_virtio_vq_post_irq()
642 spdk_vfu_get_endpoint_id(virtio_endpoint->endpoint), vq->id); in vfu_virtio_vq_post_irq()
649 vfu_virtio_vq_flush_irq(struct vfu_virtio_dev *dev, struct vfu_virtio_vq *vq) in vfu_virtio_vq_flush_irq() argument
654 if (vq->used_req_cnt == 0) { in vfu_virtio_vq_flush_irq()
659 if (virtio_queue_event_is_suppressed(dev, vq)) { in vfu_virtio_vq_flush_irq()
665 vfu_virtio_vq_post_irq(dev, vq); in vfu_virtio_vq_flush_irq()
670 if (spdk_get_ticks() < vq->next_event_time) { in vfu_virtio_vq_flush_irq()
674 vfu_virtio_vq_post_irq(dev, vq); in vfu_virtio_vq_flush_irq()
677 vq->next_event_time = spdk_get_ticks() + delay_us * spdk_get_ticks_hz() / (1000000ULL); in vfu_virtio_vq_flush_irq()
681 vfu_virtio_dev_process_split_ring(struct vfu_virtio_dev *dev, struct vfu_virtio_vq *vq) in vfu_virtio_dev_process_split_ring() argument
689 reqs_cnt = virtio_dev_split_get_avail_reqs(dev, vq, reqs_idx, VIRTIO_DEV_VRING_MAX_REQS); in vfu_virtio_dev_process_split_ring()
697 req = vfu_virtio_dev_get_req(virtio_endpoint, vq); in vfu_virtio_dev_process_split_ring()
705 ret = virtio_dev_split_iovs_setup(dev, vq, req->req_idx, req); in vfu_virtio_dev_process_split_ring()
713 virtio_endpoint->virtio_ops.exec_request(virtio_endpoint, vq, req); in vfu_virtio_dev_process_split_ring()
720 virito_dev_split_ring_get_next_avail_req(struct vfu_virtio_dev *dev, struct vfu_virtio_vq *vq) in virito_dev_split_ring_get_next_avail_req() argument
728 reqs_cnt = virtio_dev_split_get_avail_reqs(dev, vq, reqs_idx, 1); in virito_dev_split_ring_get_next_avail_req()
736 req = vfu_virtio_dev_get_req(virtio_endpoint, vq); in virito_dev_split_ring_get_next_avail_req()
743 ret = virtio_dev_split_iovs_setup(dev, vq, req->req_idx, req); in virito_dev_split_ring_get_next_avail_req()
764 virtio_dev_packed_iovs_setup(struct vfu_virtio_dev *dev, struct vfu_virtio_vq *vq, in virtio_dev_packed_iovs_setup() argument
827 new_idx = (new_idx + 1) % vq->qsize; in virtio_dev_packed_iovs_setup()
828 desc = &vq->desc.desc_packed[new_idx]; in virtio_dev_packed_iovs_setup()
840 vq->last_avail_idx = (new_idx + 1) % vq->qsize; in virtio_dev_packed_iovs_setup()
841 if (vq->last_avail_idx < last_avail_idx) { in virtio_dev_packed_iovs_setup()
842 vq->packed.avail_phase = !vq->packed.avail_phase; in virtio_dev_packed_iovs_setup()
853 vfu_virtio_dev_process_packed_ring(struct vfu_virtio_dev *dev, struct vfu_virtio_vq *vq) in vfu_virtio_dev_process_packed_ring() argument
863 desc = &vq->desc.desc_packed[vq->last_avail_idx]; in vfu_virtio_dev_process_packed_ring()
864 if (!virtio_vring_packed_is_avail(desc, vq->packed.avail_phase)) { in vfu_virtio_dev_process_packed_ring()
868 req = vfu_virtio_dev_get_req(virtio_endpoint, vq); in vfu_virtio_dev_process_packed_ring()
876 ret = virtio_dev_packed_iovs_setup(dev, vq, vq->last_avail_idx, desc, req); in vfu_virtio_dev_process_packed_ring()
884 virtio_endpoint->virtio_ops.exec_request(virtio_endpoint, vq, req); in vfu_virtio_dev_process_packed_ring()
891 virito_dev_packed_ring_get_next_avail_req(struct vfu_virtio_dev *dev, struct vfu_virtio_vq *vq) in virito_dev_packed_ring_get_next_avail_req() argument
898 desc = &vq->desc.desc_packed[vq->last_avail_idx]; in virito_dev_packed_ring_get_next_avail_req()
899 if (!virtio_vring_packed_is_avail(desc, vq->packed.avail_phase)) { in virito_dev_packed_ring_get_next_avail_req()
905 req = vfu_virtio_dev_get_req(virtio_endpoint, vq); in virito_dev_packed_ring_get_next_avail_req()
911 ret = virtio_dev_packed_iovs_setup(dev, vq, vq->last_avail_idx, desc, req); in virito_dev_packed_ring_get_next_avail_req()
1432 struct vfu_virtio_vq *vq; in vfu_virtio_attach_device() local
1444 vq = &dev->vqs[i]; in vfu_virtio_attach_device()
1445 vq->id = i; in vfu_virtio_attach_device()
1446 vq->qsize = virtio_endpoint->qsize; in vfu_virtio_attach_device()
1447 vq->avail.sg = (dma_sg_t *)(dev->sg + i * dma_sg_size() * 3); in vfu_virtio_attach_device()
1448 vq->used.sg = (dma_sg_t *)((uint8_t *)vq->avail.sg + dma_sg_size()); in vfu_virtio_attach_device()
1449 vq->desc.sg = (dma_sg_t *)((uint8_t *)vq->used.sg + dma_sg_size()); in vfu_virtio_attach_device()
1451 STAILQ_INIT(&vq->free_reqs); in vfu_virtio_attach_device()
1452 for (j = 0; j <= vq->qsize; j++) { in vfu_virtio_attach_device()
1453 req = vfu_virtio_vq_alloc_req(virtio_endpoint, vq); in vfu_virtio_attach_device()
1462 req->vq = vq; in vfu_virtio_attach_device()
1463 STAILQ_INSERT_TAIL(&vq->free_reqs, req, link); in vfu_virtio_attach_device()