From: Beilei Xing <beilei.x...@intel.com> Add vport init/deinit in common module.
Signed-off-by: Wenjun Wu <wenjun1...@intel.com> Signed-off-by: Beilei Xing <beilei.x...@intel.com> --- drivers/common/idpf/idpf_common_device.c | 128 +++++++++++++++++++ drivers/common/idpf/idpf_common_device.h | 8 ++ drivers/common/idpf/idpf_common_virtchnl.c | 16 +-- drivers/common/idpf/idpf_common_virtchnl.h | 2 - drivers/common/idpf/version.map | 4 +- drivers/net/idpf/idpf_ethdev.c | 138 ++------------------- 6 files changed, 156 insertions(+), 140 deletions(-) diff --git a/drivers/common/idpf/idpf_common_device.c b/drivers/common/idpf/idpf_common_device.c index b2b42443e4..2aad9bcdd3 100644 --- a/drivers/common/idpf/idpf_common_device.c +++ b/drivers/common/idpf/idpf_common_device.c @@ -158,4 +158,132 @@ idpf_adapter_deinit(struct idpf_adapter *adapter) return 0; } +int +idpf_vport_init(struct idpf_vport *vport, + struct virtchnl2_create_vport *create_vport_info, + void *dev_data) +{ + struct virtchnl2_create_vport *vport_info; + int i, type, ret; + + vport->vport_info = rte_zmalloc(NULL, IDPF_DFLT_MBX_BUF_SIZE, 0); + if (vport->vport_info == NULL) { + DRV_LOG(ERR, "Failed to allocate vport_info"); + ret = -ENOMEM; + goto err_vport_info; + } + + ret = idpf_vc_create_vport(vport, create_vport_info); + if (ret != 0) { + DRV_LOG(ERR, "Failed to create vport."); + goto err_create_vport; + } + + vport_info = vport->vport_info; + vport->vport_id = vport_info->vport_id; + vport->txq_model = vport_info->txq_model; + vport->rxq_model = vport_info->rxq_model; + vport->num_tx_q = vport_info->num_tx_q; + vport->num_tx_complq = vport_info->num_tx_complq; + vport->num_rx_q = vport_info->num_rx_q; + vport->num_rx_bufq = vport_info->num_rx_bufq; + vport->max_mtu = vport_info->max_mtu; + rte_memcpy(vport->default_mac_addr, + vport_info->default_mac_addr, ETH_ALEN); + vport->rss_algorithm = vport_info->rss_algorithm; + vport->rss_key_size = RTE_MIN(IDPF_RSS_KEY_LEN, + vport_info->rss_key_size); + vport->rss_lut_size = vport_info->rss_lut_size; + + for (i = 0; i < vport_info->chunks.num_chunks; i++) { + type = vport_info->chunks.chunks[i].type; + switch (type) { + case VIRTCHNL2_QUEUE_TYPE_TX: + vport->chunks_info.tx_start_qid = + vport_info->chunks.chunks[i].start_queue_id; + vport->chunks_info.tx_qtail_start = + vport_info->chunks.chunks[i].qtail_reg_start; + vport->chunks_info.tx_qtail_spacing = + vport_info->chunks.chunks[i].qtail_reg_spacing; + break; + case VIRTCHNL2_QUEUE_TYPE_RX: + vport->chunks_info.rx_start_qid = + vport_info->chunks.chunks[i].start_queue_id; + vport->chunks_info.rx_qtail_start = + vport_info->chunks.chunks[i].qtail_reg_start; + vport->chunks_info.rx_qtail_spacing = + vport_info->chunks.chunks[i].qtail_reg_spacing; + break; + case VIRTCHNL2_QUEUE_TYPE_TX_COMPLETION: + vport->chunks_info.tx_compl_start_qid = + vport_info->chunks.chunks[i].start_queue_id; + vport->chunks_info.tx_compl_qtail_start = + vport_info->chunks.chunks[i].qtail_reg_start; + vport->chunks_info.tx_compl_qtail_spacing = + vport_info->chunks.chunks[i].qtail_reg_spacing; + break; + case VIRTCHNL2_QUEUE_TYPE_RX_BUFFER: + vport->chunks_info.rx_buf_start_qid = + vport_info->chunks.chunks[i].start_queue_id; + vport->chunks_info.rx_buf_qtail_start = + vport_info->chunks.chunks[i].qtail_reg_start; + vport->chunks_info.rx_buf_qtail_spacing = + vport_info->chunks.chunks[i].qtail_reg_spacing; + break; + default: + DRV_LOG(ERR, "Unsupported queue type"); + break; + } + } + + vport->dev_data = dev_data; + + vport->rss_key = rte_zmalloc("rss_key", + vport->rss_key_size, 0); + if (vport->rss_key == NULL) { + DRV_LOG(ERR, "Failed to allocate RSS key"); + ret = -ENOMEM; + goto err_rss_key; + } + + vport->rss_lut = rte_zmalloc("rss_lut", + sizeof(uint32_t) * vport->rss_lut_size, 0); + if (vport->rss_lut == NULL) { + DRV_LOG(ERR, "Failed to allocate RSS lut"); + ret = -ENOMEM; + goto err_rss_lut; + } + + return 0; + +err_rss_lut: + vport->dev_data = NULL; + rte_free(vport->rss_key); + vport->rss_key = NULL; +err_rss_key: + idpf_vc_destroy_vport(vport); +err_create_vport: + rte_free(vport->vport_info); + vport->vport_info = NULL; +err_vport_info: + return ret; +} +int +idpf_vport_deinit(struct idpf_vport *vport) +{ + rte_free(vport->rss_lut); + vport->rss_lut = NULL; + + rte_free(vport->rss_key); + vport->rss_key = NULL; + + vport->dev_data = NULL; + + rte_free(vport->vport_info); + vport->vport_info = NULL; + + idpf_vc_destroy_vport(vport); + + return 0; +} RTE_LOG_REGISTER_SUFFIX(idpf_common_logtype, common, NOTICE); diff --git a/drivers/common/idpf/idpf_common_device.h b/drivers/common/idpf/idpf_common_device.h index e4344ea392..1f7483fd85 100644 --- a/drivers/common/idpf/idpf_common_device.h +++ b/drivers/common/idpf/idpf_common_device.h @@ -9,6 +9,8 @@ #include <base/virtchnl2.h> #include <idpf_common_logs.h> +#define IDPF_RSS_KEY_LEN 52 + #define IDPF_CTLQ_ID -1 #define IDPF_CTLQ_LEN 64 #define IDPF_DFLT_MBX_BUF_SIZE 4096 @@ -142,5 +144,11 @@ __rte_internal int idpf_adapter_init(struct idpf_adapter *adapter); __rte_internal int idpf_adapter_deinit(struct idpf_adapter *adapter); +__rte_internal +int idpf_vport_init(struct idpf_vport *vport, + struct virtchnl2_create_vport *vport_req_info, + void *dev_data); +__rte_internal +int idpf_vport_deinit(struct idpf_vport *vport); #endif /* _IDPF_COMMON_DEVICE_H_ */ diff --git a/drivers/common/idpf/idpf_common_virtchnl.c b/drivers/common/idpf/idpf_common_virtchnl.c index 2e94a95876..e7ba32c532 100644 --- a/drivers/common/idpf/idpf_common_virtchnl.c +++ b/drivers/common/idpf/idpf_common_virtchnl.c @@ -355,7 +355,7 @@ idpf_vc_get_caps(struct idpf_adapter *adapter) int idpf_vc_create_vport(struct idpf_vport *vport, - struct virtchnl2_create_vport *vport_req_info) + struct virtchnl2_create_vport *create_vport_info) { struct idpf_adapter *adapter = vport->adapter; struct virtchnl2_create_vport vport_msg; @@ -363,13 +363,13 @@ idpf_vc_create_vport(struct idpf_vport *vport, int err = -1; memset(&vport_msg, 0, sizeof(struct virtchnl2_create_vport)); - vport_msg.vport_type = vport_req_info->vport_type; - vport_msg.txq_model = vport_req_info->txq_model; - vport_msg.rxq_model = vport_req_info->rxq_model; - vport_msg.num_tx_q = vport_req_info->num_tx_q; - vport_msg.num_tx_complq = vport_req_info->num_tx_complq; - vport_msg.num_rx_q = vport_req_info->num_rx_q; - vport_msg.num_rx_bufq = vport_req_info->num_rx_bufq; + vport_msg.vport_type = create_vport_info->vport_type; + vport_msg.txq_model = create_vport_info->txq_model; + vport_msg.rxq_model = create_vport_info->rxq_model; + vport_msg.num_tx_q = create_vport_info->num_tx_q; + vport_msg.num_tx_complq = create_vport_info->num_tx_complq; + vport_msg.num_rx_q = create_vport_info->num_rx_q; + vport_msg.num_rx_bufq = create_vport_info->num_rx_bufq; memset(&args, 0, sizeof(args)); args.ops = VIRTCHNL2_OP_CREATE_VPORT; diff --git a/drivers/common/idpf/idpf_common_virtchnl.h b/drivers/common/idpf/idpf_common_virtchnl.h index a1bae81372..e9e1c172eb 100644 --- a/drivers/common/idpf/idpf_common_virtchnl.h +++ b/drivers/common/idpf/idpf_common_virtchnl.h @@ -9,10 +9,8 @@ int idpf_vc_check_api_version(struct idpf_adapter *adapter); int idpf_vc_get_caps(struct idpf_adapter *adapter); -__rte_internal int idpf_vc_create_vport(struct idpf_vport *vport, struct virtchnl2_create_vport *vport_info); -__rte_internal int idpf_vc_destroy_vport(struct idpf_vport *vport); __rte_internal int idpf_vc_set_rss_key(struct idpf_vport *vport); diff --git a/drivers/common/idpf/version.map b/drivers/common/idpf/version.map index 535fa1fc24..172906fcfa 100644 --- a/drivers/common/idpf/version.map +++ b/drivers/common/idpf/version.map @@ -7,8 +7,6 @@ INTERNAL { idpf_ctlq_recv; idpf_ctlq_send; idpf_ctlq_post_rx_buffs; - idpf_vc_create_vport; - idpf_vc_destroy_vport; idpf_vc_set_rss_key; idpf_vc_set_rss_lut; idpf_vc_set_rss_hash; @@ -23,6 +21,8 @@ INTERNAL { idpf_execute_vc_cmd; idpf_adapter_init; idpf_adapter_deinit; + idpf_vport_init; + idpf_vport_deinit; local: *; }; diff --git a/drivers/net/idpf/idpf_ethdev.c b/drivers/net/idpf/idpf_ethdev.c index 46529cebf9..f56d1171c9 100644 --- a/drivers/net/idpf/idpf_ethdev.c +++ b/drivers/net/idpf/idpf_ethdev.c @@ -169,73 +169,6 @@ idpf_init_vport_req_info(struct rte_eth_dev *dev, return 0; } -#define IDPF_RSS_KEY_LEN 52 - -static int -idpf_init_vport(struct idpf_vport *vport) -{ - struct virtchnl2_create_vport *vport_info = vport->vport_info; - int i, type; - - vport->vport_id = vport_info->vport_id; - vport->txq_model = vport_info->txq_model; - vport->rxq_model = vport_info->rxq_model; - vport->num_tx_q = vport_info->num_tx_q; - vport->num_tx_complq = vport_info->num_tx_complq; - vport->num_rx_q = vport_info->num_rx_q; - vport->num_rx_bufq = vport_info->num_rx_bufq; - vport->max_mtu = vport_info->max_mtu; - rte_memcpy(vport->default_mac_addr, - vport_info->default_mac_addr, ETH_ALEN); - vport->rss_algorithm = vport_info->rss_algorithm; - vport->rss_key_size = RTE_MIN(IDPF_RSS_KEY_LEN, - vport_info->rss_key_size); - vport->rss_lut_size = vport_info->rss_lut_size; - - for (i = 0; i < vport_info->chunks.num_chunks; i++) { - type = vport_info->chunks.chunks[i].type; - switch (type) { - case VIRTCHNL2_QUEUE_TYPE_TX: - vport->chunks_info.tx_start_qid = - vport_info->chunks.chunks[i].start_queue_id; - vport->chunks_info.tx_qtail_start = - vport_info->chunks.chunks[i].qtail_reg_start; - vport->chunks_info.tx_qtail_spacing = - vport_info->chunks.chunks[i].qtail_reg_spacing; - break; - case VIRTCHNL2_QUEUE_TYPE_RX: - vport->chunks_info.rx_start_qid = - vport_info->chunks.chunks[i].start_queue_id; - vport->chunks_info.rx_qtail_start = - vport_info->chunks.chunks[i].qtail_reg_start; - vport->chunks_info.rx_qtail_spacing = - vport_info->chunks.chunks[i].qtail_reg_spacing; - break; - case VIRTCHNL2_QUEUE_TYPE_TX_COMPLETION: - vport->chunks_info.tx_compl_start_qid = - vport_info->chunks.chunks[i].start_queue_id; - vport->chunks_info.tx_compl_qtail_start = - vport_info->chunks.chunks[i].qtail_reg_start; - vport->chunks_info.tx_compl_qtail_spacing = - vport_info->chunks.chunks[i].qtail_reg_spacing; - break; - case VIRTCHNL2_QUEUE_TYPE_RX_BUFFER: - vport->chunks_info.rx_buf_start_qid = - vport_info->chunks.chunks[i].start_queue_id; - vport->chunks_info.rx_buf_qtail_start = - vport_info->chunks.chunks[i].qtail_reg_start; - vport->chunks_info.rx_buf_qtail_spacing = - vport_info->chunks.chunks[i].qtail_reg_spacing; - break; - default: - PMD_INIT_LOG(ERR, "Unsupported queue type"); - break; - } - } - - return 0; -} - static int idpf_config_rss(struct idpf_vport *vport) { @@ -267,63 +200,34 @@ idpf_init_rss(struct idpf_vport *vport) { struct rte_eth_rss_conf *rss_conf; struct rte_eth_dev_data *dev_data; - uint16_t i, nb_q, lut_size; + uint16_t i, nb_q; int ret = 0; dev_data = vport->dev_data; rss_conf = &dev_data->dev_conf.rx_adv_conf.rss_conf; nb_q = dev_data->nb_rx_queues; - vport->rss_key = rte_zmalloc("rss_key", - vport->rss_key_size, 0); - if (vport->rss_key == NULL) { - PMD_INIT_LOG(ERR, "Failed to allocate RSS key"); - ret = -ENOMEM; - goto err_alloc_key; - } - - lut_size = vport->rss_lut_size; - vport->rss_lut = rte_zmalloc("rss_lut", - sizeof(uint32_t) * lut_size, 0); - if (vport->rss_lut == NULL) { - PMD_INIT_LOG(ERR, "Failed to allocate RSS lut"); - ret = -ENOMEM; - goto err_alloc_lut; - } - if (rss_conf->rss_key == NULL) { for (i = 0; i < vport->rss_key_size; i++) vport->rss_key[i] = (uint8_t)rte_rand(); } else if (rss_conf->rss_key_len != vport->rss_key_size) { PMD_INIT_LOG(ERR, "Invalid RSS key length in RSS configuration, should be %d", vport->rss_key_size); - ret = -EINVAL; - goto err_cfg_key; + return -EINVAL; } else { rte_memcpy(vport->rss_key, rss_conf->rss_key, vport->rss_key_size); } - for (i = 0; i < lut_size; i++) + for (i = 0; i < vport->rss_lut_size; i++) vport->rss_lut[i] = i % nb_q; vport->rss_hf = IDPF_DEFAULT_RSS_HASH_EXPANDED; ret = idpf_config_rss(vport); - if (ret != 0) { + if (ret != 0) PMD_INIT_LOG(ERR, "Failed to configure RSS"); - goto err_cfg_key; - } - - return ret; -err_cfg_key: - rte_free(vport->rss_lut); - vport->rss_lut = NULL; -err_alloc_lut: - rte_free(vport->rss_key); - vport->rss_key = NULL; -err_alloc_key: return ret; } @@ -597,13 +501,7 @@ idpf_dev_close(struct rte_eth_dev *dev) idpf_dev_stop(dev); - idpf_vc_destroy_vport(vport); - - rte_free(vport->rss_lut); - vport->rss_lut = NULL; - - rte_free(vport->rss_key); - vport->rss_key = NULL; + idpf_vport_deinit(vport); rte_free(vport->recv_vectors); vport->recv_vectors = NULL; @@ -887,13 +785,6 @@ idpf_dev_vport_init(struct rte_eth_dev *dev, void *init_params) vport->sw_idx = param->idx; vport->devarg_id = param->devarg_id; - vport->vport_info = rte_zmalloc(NULL, IDPF_DFLT_MBX_BUF_SIZE, 0); - if (vport->vport_info == NULL) { - PMD_INIT_LOG(ERR, "Failed to allocate vport_info"); - ret = -ENOMEM; - goto err; - } - memset(&vport_req_info, 0, sizeof(vport_req_info)); ret = idpf_init_vport_req_info(dev, &vport_req_info); if (ret != 0) { @@ -901,19 +792,12 @@ idpf_dev_vport_init(struct rte_eth_dev *dev, void *init_params) goto err; } - ret = idpf_vc_create_vport(vport, &vport_req_info); - if (ret != 0) { - PMD_INIT_LOG(ERR, "Failed to create vport."); - goto err_create_vport; - } - - ret = idpf_init_vport(vport); + ret = idpf_vport_init(vport, &vport_req_info, dev->data); if (ret != 0) { PMD_INIT_LOG(ERR, "Failed to init vports."); - goto err_init_vport; + goto err; } - vport->dev_data = dev->data; adapter->vports[param->idx] = vport; adapter->cur_vports |= RTE_BIT32(param->devarg_id); adapter->cur_vport_nb++; @@ -922,7 +806,7 @@ idpf_dev_vport_init(struct rte_eth_dev *dev, void *init_params) if (dev->data->mac_addrs == NULL) { PMD_INIT_LOG(ERR, "Cannot allocate mac_addr memory."); ret = -ENOMEM; - goto err_init_vport; + goto err_mac_addrs; } rte_ether_addr_copy((struct rte_ether_addr *)vport->default_mac_addr, @@ -930,11 +814,9 @@ idpf_dev_vport_init(struct rte_eth_dev *dev, void *init_params) return 0; -err_init_vport: +err_mac_addrs: adapter->vports[param->idx] = NULL; /* reset */ - idpf_vc_destroy_vport(vport); -err_create_vport: - rte_free(vport->vport_info); + idpf_vport_deinit(vport); err: return ret; } -- 2.26.2