From: Beilei Xing <beilei.x...@intel.com>

This patch supports Rx/Tx queue configuration APIs.

Signed-off-by: Mingxia Liu <mingxia....@intel.com>
Signed-off-by: Beilei Xing <beilei.x...@intel.com>
---
 drivers/common/idpf/idpf_common_virtchnl.c | 70 ++++++++++++++++++++++
 drivers/common/idpf/idpf_common_virtchnl.h |  6 ++
 drivers/common/idpf/version.map            |  2 +
 3 files changed, 78 insertions(+)

diff --git a/drivers/common/idpf/idpf_common_virtchnl.c 
b/drivers/common/idpf/idpf_common_virtchnl.c
index a3fe55c897..211b44a88e 100644
--- a/drivers/common/idpf/idpf_common_virtchnl.c
+++ b/drivers/common/idpf/idpf_common_virtchnl.c
@@ -1050,6 +1050,41 @@ idpf_vc_rxq_config(struct idpf_vport *vport, struct 
idpf_rx_queue *rxq)
        return err;
 }
 
+int idpf_vc_rxq_config_by_info(struct idpf_vport *vport, struct 
virtchnl2_rxq_info *rxq_info,
+                              uint16_t num_qs)
+{
+       struct idpf_adapter *adapter = vport->adapter;
+       struct virtchnl2_config_rx_queues *vc_rxqs = NULL;
+       struct idpf_cmd_info args;
+       int size, err, i;
+
+       size = sizeof(*vc_rxqs) + (num_qs - 1) *
+               sizeof(struct virtchnl2_rxq_info);
+       vc_rxqs = rte_zmalloc("cfg_rxqs", size, 0);
+       if (vc_rxqs == NULL) {
+               DRV_LOG(ERR, "Failed to allocate virtchnl2_config_rx_queues");
+               err = -ENOMEM;
+               return err;
+       }
+       vc_rxqs->vport_id = vport->vport_id;
+       vc_rxqs->num_qinfo = num_qs;
+       memcpy(vc_rxqs->qinfo, rxq_info, num_qs * sizeof(struct 
virtchnl2_rxq_info));
+
+       memset(&args, 0, sizeof(args));
+       args.ops = VIRTCHNL2_OP_CONFIG_RX_QUEUES;
+       args.in_args = (uint8_t *)vc_rxqs;
+       args.in_args_size = size;
+       args.out_buffer = adapter->mbx_resp;
+       args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
+
+       err = idpf_vc_cmd_execute(adapter, &args);
+       rte_free(vc_rxqs);
+       if (err != 0)
+               DRV_LOG(ERR, "Failed to execute command of 
VIRTCHNL2_OP_CONFIG_RX_QUEUES");
+
+       return err;
+}
+
 int
 idpf_vc_txq_config(struct idpf_vport *vport, struct idpf_tx_queue *txq)
 {
@@ -1121,6 +1156,41 @@ idpf_vc_txq_config(struct idpf_vport *vport, struct 
idpf_tx_queue *txq)
        return err;
 }
 
+int
+idpf_vc_txq_config_by_info(struct idpf_vport *vport, struct virtchnl2_txq_info 
*txq_info,
+                      uint16_t num_qs)
+{
+       struct idpf_adapter *adapter = vport->adapter;
+       struct virtchnl2_config_tx_queues *vc_txqs = NULL;
+       struct idpf_cmd_info args;
+       int size, err;
+
+       size = sizeof(*vc_txqs) + (num_qs - 1) * sizeof(struct 
virtchnl2_txq_info);
+       vc_txqs = rte_zmalloc("cfg_txqs", size, 0);
+       if (vc_txqs == NULL) {
+               DRV_LOG(ERR, "Failed to allocate virtchnl2_config_tx_queues");
+               err = -ENOMEM;
+               return err;
+       }
+       vc_txqs->vport_id = vport->vport_id;
+       vc_txqs->num_qinfo = num_qs;
+       memcpy(vc_txqs->qinfo, txq_info, num_qs * sizeof(struct 
virtchnl2_txq_info));
+
+       memset(&args, 0, sizeof(args));
+       args.ops = VIRTCHNL2_OP_CONFIG_TX_QUEUES;
+       args.in_args = (uint8_t *)vc_txqs;
+       args.in_args_size = size;
+       args.out_buffer = adapter->mbx_resp;
+       args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
+
+       err = idpf_vc_cmd_execute(adapter, &args);
+       rte_free(vc_txqs);
+       if (err != 0)
+               DRV_LOG(ERR, "Failed to execute command of 
VIRTCHNL2_OP_CONFIG_TX_QUEUES");
+
+       return err;
+}
+
 int
 idpf_vc_ctlq_recv(struct idpf_ctlq_info *cq, u16 *num_q_msg,
                  struct idpf_ctlq_msg *q_msg)
diff --git a/drivers/common/idpf/idpf_common_virtchnl.h 
b/drivers/common/idpf/idpf_common_virtchnl.h
index 58b16e1c5d..db83761a5e 100644
--- a/drivers/common/idpf/idpf_common_virtchnl.h
+++ b/drivers/common/idpf/idpf_common_virtchnl.h
@@ -65,6 +65,12 @@ __rte_internal
 int idpf_vc_ctlq_post_rx_buffs(struct idpf_hw *hw, struct idpf_ctlq_info *cq,
                           u16 *buff_count, struct idpf_dma_mem **buffs);
 __rte_internal
+int idpf_vc_rxq_config_by_info(struct idpf_vport *vport, struct 
virtchnl2_rxq_info *rxq_info,
+                              uint16_t num_qs);
+__rte_internal
+int idpf_vc_txq_config_by_info(struct idpf_vport *vport, struct 
virtchnl2_txq_info *txq_info,
+                              uint16_t num_qs);
+__rte_internal
 int idpf_vc_queue_grps_del(struct idpf_vport *vport,
                           uint16_t num_q_grps,
                           struct virtchnl2_queue_group_id *qg_ids);
diff --git a/drivers/common/idpf/version.map b/drivers/common/idpf/version.map
index 01d18f3f3f..17e77884ce 100644
--- a/drivers/common/idpf/version.map
+++ b/drivers/common/idpf/version.map
@@ -54,8 +54,10 @@ INTERNAL {
        idpf_vc_rss_lut_get;
        idpf_vc_rss_lut_set;
        idpf_vc_rxq_config;
+       idpf_vc_rxq_config_by_info;
        idpf_vc_stats_query;
        idpf_vc_txq_config;
+       idpf_vc_txq_config_by_info;
        idpf_vc_vectors_alloc;
        idpf_vc_vectors_dealloc;
        idpf_vc_vport_create;
-- 
2.26.2

Reply via email to