- attr.hw_available_index = last_avail_idx;
- attr.hw_used_index = last_used_idx;
- attr.q_size = vq.size;
- attr.mkey = priv->gpa_mkey_index;
- attr.tis_id = priv->tiss[(index / 2) % priv->num_lag_ports]->id;
- attr.queue_index = index;
- attr.pd = priv->pdn;
- attr.hw_latency_mode = priv->hw_latency_mode;
- attr.hw_max_latency_us = priv->hw_max_latency_us;
- attr.hw_max_pending_comp = priv->hw_max_pending_comp;
- virtq->virtq = mlx5_devx_cmd_create_virtq(priv->ctx, &attr);
+ attr->hw_available_index = last_avail_idx;
+ attr->hw_used_index = last_used_idx;
+ attr->q_size = vq->size;
+ attr->mkey = priv->gpa_mkey_index;
+ attr->tis_id = priv->tiss[(index / 2) % priv->num_lag_ports]->id;
+ attr->queue_index = index;
+ attr->pd = priv->cdev->pdn;
+ attr->hw_latency_mode = priv->hw_latency_mode;
+ attr->hw_max_latency_us = priv->hw_max_latency_us;
+ attr->hw_max_pending_comp = priv->hw_max_pending_comp;
+ if (attr->hw_latency_mode || attr->hw_max_latency_us ||
+ attr->hw_max_pending_comp)
+ attr->mod_fields_bitmap |= MLX5_VIRTQ_MODIFY_TYPE_QUEUE_PERIOD;
+ return 0;
+}
+
+bool
+mlx5_vdpa_is_modify_virtq_supported(struct mlx5_vdpa_priv *priv)
+{
+ return (priv->caps.vnet_modify_ext &&
+ priv->caps.virtio_net_q_addr_modify &&
+ priv->caps.virtio_q_index_modify) ? true : false;
+}
+
+static int
+mlx5_vdpa_virtq_setup(struct mlx5_vdpa_priv *priv, int index)
+{
+ struct mlx5_vdpa_virtq *virtq = &priv->virtqs[index];
+ struct rte_vhost_vring vq;
+ struct mlx5_devx_virtq_attr attr = {0};
+ int ret;
+ uint16_t event_num = MLX5_EVENT_TYPE_OBJECT_CHANGE;
+ uint64_t cookie;
+
+ ret = rte_vhost_get_vhost_vring(priv->vid, index, &vq);
+ if (ret)
+ return -1;
+ if (vq.size == 0)
+ return 0;