Lines Matching defs:mvq

330 		       struct mlx5_vdpa_virtqueue *mvq, u32 num_ent)
336 vqp = fw ? &mvq->fwqp : &mvq->vqqp;
356 MLX5_SET(qpc, qpc, cqn_rcv, mvq->cq.mcq.cqn);
375 static int qp_create(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq,
386 vqp = &mvq->vqqp;
387 err = rq_buf_alloc(ndev, vqp, mvq->num_ent);
403 qp_prepare(ndev, vqp->fw, in, mvq, mvq->num_ent);
421 rx_post(vqp, mvq->num_ent);
467 static void mlx5_vdpa_handle_completions(struct mlx5_vdpa_virtqueue *mvq, int num)
469 mlx5_cq_set_ci(&mvq->cq.mcq);
475 rx_post(&mvq->vqqp, num);
476 if (mvq->event_cb.callback)
477 mvq->event_cb.callback(mvq->event_cb.private);
482 struct mlx5_vdpa_virtqueue *mvq = container_of(mcq, struct mlx5_vdpa_virtqueue, cq.mcq);
483 struct mlx5_vdpa_net *ndev = mvq->ndev;
487 while (!mlx5_vdpa_poll_one(&mvq->cq)) {
489 if (num > mvq->num_ent / 2) {
496 mlx5_vdpa_handle_completions(mvq, num);
502 mlx5_vdpa_handle_completions(mvq, num);
504 mlx5_cq_arm(&mvq->cq.mcq, MLX5_CQ_DB_REQ_NOT, uar_page, mvq->cq.mcq.cons_index);
509 struct mlx5_vdpa_virtqueue *mvq = &ndev->vqs[idx];
513 struct mlx5_vdpa_cq *vcq = &mvq->cq;
571 mlx5_cq_arm(&mvq->cq.mcq, MLX5_CQ_DB_REQ_NOT, uar_page, mvq->cq.mcq.cons_index);
586 struct mlx5_vdpa_virtqueue *mvq = &ndev->vqs[idx];
588 struct mlx5_vdpa_cq *vcq = &mvq->cq;
598 static void set_umem_size(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq, int num,
609 *umemp = &mvq->umem1;
614 *umemp = &mvq->umem2;
619 *umemp = &mvq->umem3;
622 (*umemp)->size = p_a * mvq->num_ent + p_b;
630 static int create_umem(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq, int num)
640 set_umem_size(ndev, mvq, num, &umem);
680 static void umem_destroy(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq, int num)
688 umem = &mvq->umem1;
691 umem = &mvq->umem2;
694 umem = &mvq->umem3;
706 static int umems_create(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
712 err = create_umem(ndev, mvq, num);
720 umem_destroy(ndev, mvq, num);
725 static void umems_destroy(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
730 umem_destroy(ndev, mvq, num);
761 static int create_virtqueue(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
771 err = umems_create(ndev, mvq);
788 MLX5_SET(virtio_net_q_object, obj_context, hw_available_index, mvq->avail_idx);
789 MLX5_SET(virtio_net_q_object, obj_context, hw_used_index, mvq->used_idx);
795 if (vq_is_tx(mvq->index))
799 MLX5_SET(virtio_q, vq_ctx, queue_index, mvq->index);
800 MLX5_SET(virtio_q, vq_ctx, event_qpn_or_msix, mvq->fwqp.mqp.qpn);
801 MLX5_SET(virtio_q, vq_ctx, queue_size, mvq->num_ent);
804 MLX5_SET64(virtio_q, vq_ctx, desc_addr, mvq->desc_addr);
805 MLX5_SET64(virtio_q, vq_ctx, used_addr, mvq->device_addr);
806 MLX5_SET64(virtio_q, vq_ctx, available_addr, mvq->driver_addr);
808 MLX5_SET(virtio_q, vq_ctx, umem_1_id, mvq->umem1.id);
809 MLX5_SET(virtio_q, vq_ctx, umem_1_size, mvq->umem1.size);
810 MLX5_SET(virtio_q, vq_ctx, umem_2_id, mvq->umem2.id);
811 MLX5_SET(virtio_q, vq_ctx, umem_2_size, mvq->umem2.size);
812 MLX5_SET(virtio_q, vq_ctx, umem_3_id, mvq->umem3.id);
813 MLX5_SET(virtio_q, vq_ctx, umem_3_size, mvq->umem3.size);
821 mvq->virtq_id = MLX5_GET(general_obj_out_cmd_hdr, out, obj_id);
828 umems_destroy(ndev, mvq);
832 static void destroy_virtqueue(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
839 MLX5_SET(destroy_virtio_net_q_in, in, general_obj_out_cmd_hdr.obj_id, mvq->virtq_id);
844 mlx5_vdpa_warn(&ndev->mvdev, "destroy virtqueue 0x%x\n", mvq->virtq_id);
847 umems_destroy(ndev, mvq);
850 static u32 get_rqpn(struct mlx5_vdpa_virtqueue *mvq, bool fw)
852 return fw ? mvq->vqqp.mqp.qpn : mvq->fwqp.mqp.qpn;
855 static u32 get_qpn(struct mlx5_vdpa_virtqueue *mvq, bool fw)
857 return fw ? mvq->fwqp.mqp.qpn : mvq->vqqp.mqp.qpn;
955 static int modify_qp(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq, bool fw, int cmd)
963 alloc_inout(ndev, cmd, &in, &inlen, &out, &outlen, get_qpn(mvq, fw), get_rqpn(mvq, fw));
972 static int connect_qps(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
976 err = modify_qp(ndev, mvq, true, MLX5_CMD_OP_2RST_QP);
980 err = modify_qp(ndev, mvq, false, MLX5_CMD_OP_2RST_QP);
984 err = modify_qp(ndev, mvq, true, MLX5_CMD_OP_RST2INIT_QP);
988 err = modify_qp(ndev, mvq, false, MLX5_CMD_OP_RST2INIT_QP);
992 err = modify_qp(ndev, mvq, true, MLX5_CMD_OP_INIT2RTR_QP);
996 err = modify_qp(ndev, mvq, false, MLX5_CMD_OP_INIT2RTR_QP);
1000 return modify_qp(ndev, mvq, true, MLX5_CMD_OP_RTR2RTS_QP);
1009 static int query_virtqueue(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq,
1027 MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, obj_id, mvq->virtq_id);
1046 static int modify_virtqueue(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq, int state)
1063 MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, obj_id, mvq->virtq_id);
1073 mvq->fw_state = state;
1078 static int setup_vq(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
1080 u16 idx = mvq->index;
1083 if (!mvq->num_ent)
1086 if (mvq->initialized) {
1091 err = cq_create(ndev, idx, mvq->num_ent);
1095 err = qp_create(ndev, mvq, &mvq->fwqp);
1099 err = qp_create(ndev, mvq, &mvq->vqqp);
1103 err = connect_qps(ndev, mvq);
1107 err = create_virtqueue(ndev, mvq);
1111 if (mvq->ready) {
1112 err = modify_virtqueue(ndev, mvq, MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY);
1120 mvq->initialized = true;
1124 qp_destroy(ndev, &mvq->vqqp);
1126 qp_destroy(ndev, &mvq->fwqp);
1132 static void suspend_vq(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
1136 if (!mvq->initialized)
1139 if (mvq->fw_state != MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY)
1142 if (modify_virtqueue(ndev, mvq, MLX5_VIRTIO_NET_Q_OBJECT_STATE_SUSPEND))
1145 if (query_virtqueue(ndev, mvq, &attr)) {
1149 mvq->avail_idx = attr.available_index;
1150 mvq->used_idx = attr.used_index;
1161 static void teardown_vq(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
1163 if (!mvq->initialized)
1166 suspend_vq(ndev, mvq);
1167 destroy_virtqueue(ndev, mvq);
1168 qp_destroy(ndev, &mvq->vqqp);
1169 qp_destroy(ndev, &mvq->fwqp);
1170 cq_destroy(ndev, mvq->index);
1171 mvq->initialized = false;
1335 struct mlx5_vdpa_virtqueue *mvq = &ndev->vqs[idx];
1337 if (unlikely(!mvq->ready))
1348 struct mlx5_vdpa_virtqueue *mvq = &ndev->vqs[idx];
1350 mvq->desc_addr = desc_area;
1351 mvq->device_addr = device_area;
1352 mvq->driver_addr = driver_area;
1360 struct mlx5_vdpa_virtqueue *mvq;
1362 mvq = &ndev->vqs[idx];
1363 mvq->num_ent = num;
1379 struct mlx5_vdpa_virtqueue *mvq = &ndev->vqs[idx];
1382 suspend_vq(ndev, mvq);
1384 mvq->ready = ready;
1391 struct mlx5_vdpa_virtqueue *mvq = &ndev->vqs[idx];
1393 return mvq->ready;
1401 struct mlx5_vdpa_virtqueue *mvq = &ndev->vqs[idx];
1403 if (mvq->fw_state == MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY) {
1408 mvq->used_idx = state->avail_index;
1409 mvq->avail_idx = state->avail_index;
1417 struct mlx5_vdpa_virtqueue *mvq = &ndev->vqs[idx];
1425 if (!mvq->initialized) {
1430 state->avail_index = mvq->used_idx;
1434 err = query_virtqueue(ndev, mvq, &attr);
1529 struct mlx5_vdpa_virtqueue *mvq;
1533 mvq = &ndev->vqs[i];
1534 if (!mvq->initialized)
1537 teardown_vq(ndev, mvq);
1602 static int save_channel_info(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
1604 struct mlx5_vq_restore_info *ri = &mvq->ri;
1608 if (!mvq->initialized)
1611 err = query_virtqueue(ndev, mvq, &attr);
1617 ri->ready = mvq->ready;
1618 ri->num_ent = mvq->num_ent;
1619 ri->desc_addr = mvq->desc_addr;
1620 ri->device_addr = mvq->device_addr;
1621 ri->driver_addr = mvq->driver_addr;
1622 ri->cb = mvq->event_cb;
1648 struct mlx5_vdpa_virtqueue *mvq;
1655 mvq = &ndev->vqs[i];
1656 ri = &mvq->ri;
1660 mvq->avail_idx = ri->avail_index;
1661 mvq->used_idx = ri->used_index;
1662 mvq->ready = ri->ready;
1663 mvq->num_ent = ri->num_ent;
1664 mvq->desc_addr = ri->desc_addr;
1665 mvq->device_addr = ri->device_addr;
1666 mvq->driver_addr = ri->driver_addr;
1667 mvq->event_cb = ri->cb;
1965 struct mlx5_vdpa_virtqueue *mvq;
1969 mvq = &ndev->vqs[i];
1970 memset(mvq, 0, offsetof(struct mlx5_vdpa_virtqueue, ri));
1971 mvq->index = i;
1972 mvq->ndev = ndev;
1973 mvq->fwqp.fw = true;
1976 mvq = &ndev->vqs[i];
1977 memset(mvq, 0, offsetof(struct mlx5_vdpa_virtqueue, ri));
1978 mvq->index = i;
1979 mvq->ndev = ndev;