X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fice%2Fice_ethdev.c;h=30ea3e84c2f5ad0e1c08288ae6af5933d66e6407;hb=63b094f8fa861de1b82e92fabeeede973fb84fb6;hp=022b58c017579ba58312d51a54d684f9d33b679e;hpb=c67c8c5c1449128339ff6378d1737b7c2e91afc4;p=dpdk.git diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c index 022b58c017..30ea3e84c2 100644 --- a/drivers/net/ice/ice_ethdev.c +++ b/drivers/net/ice/ice_ethdev.c @@ -15,14 +15,16 @@ #include "base/ice_dcb.h" #include "ice_ethdev.h" #include "ice_rxtx.h" -#include "ice_switch_filter.h" +#include "ice_generic_flow.h" /* devargs */ #define ICE_SAFE_MODE_SUPPORT_ARG "safe-mode-support" +#define ICE_PIPELINE_MODE_SUPPORT_ARG "pipeline-mode-support" #define ICE_PROTO_XTR_ARG "proto_xtr" static const char * const ice_valid_args[] = { ICE_SAFE_MODE_SUPPORT_ARG, + ICE_PIPELINE_MODE_SUPPORT_ARG, ICE_PROTO_XTR_ARG, NULL }; @@ -167,6 +169,8 @@ static const struct eth_dev_ops ice_eth_dev_ops = { .vlan_pvid_set = ice_vlan_pvid_set, .rxq_info_get = ice_rxq_info_get, .txq_info_get = ice_txq_info_get, + .rx_burst_mode_get = ice_rx_burst_mode_get, + .tx_burst_mode_get = ice_tx_burst_mode_get, .get_eeprom_length = ice_get_eeprom_length, .get_eeprom = ice_get_eeprom, .rx_queue_count = ice_rx_queue_count, @@ -428,8 +432,7 @@ parse_queue_proto_xtr(const char *queues, struct ice_devargs *devargs) if (xtr_type < 0) return -1; - memset(devargs->proto_xtr, xtr_type, - sizeof(devargs->proto_xtr)); + devargs->proto_xtr_dflt = xtr_type; return 0; } @@ -1302,6 +1305,7 @@ ice_interrupt_handler(void *param) uint8_t pf_num; uint8_t event; uint16_t queue; + int ret; #ifdef ICE_LSE_SPT uint32_t int_fw_ctl; #endif @@ -1329,7 +1333,10 @@ ice_interrupt_handler(void *param) #else if (oicr & PFINT_OICR_LINK_STAT_CHANGE_M) { PMD_DRV_LOG(INFO, "OICR: link state change event"); - ice_link_update(dev, 0); + ret = ice_link_update(dev, 0); + if (!ret) + _rte_eth_dev_callback_process + (dev, RTE_ETH_EVENT_INTR_LSC, NULL); } #endif @@ -1369,12 +1376,36 @@ done: rte_intr_ack(dev->intr_handle); } +static void +ice_init_proto_xtr(struct rte_eth_dev *dev) +{ + struct ice_adapter *ad = + ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); + struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private); + struct ice_hw *hw = ICE_PF_TO_HW(pf); + uint16_t i; + + if (!ice_proto_xtr_support(hw)) { + PMD_DRV_LOG(NOTICE, "Protocol extraction is not supported"); + return; + } + + pf->proto_xtr = rte_zmalloc(NULL, pf->lan_nb_qps, 0); + if (unlikely(pf->proto_xtr == NULL)) { + PMD_DRV_LOG(ERR, "No memory for setting up protocol extraction table"); + return; + } + + for (i = 0; i < pf->lan_nb_qps; i++) + pf->proto_xtr[i] = ad->devargs.proto_xtr[i] != PROTO_XTR_NONE ? + ad->devargs.proto_xtr[i] : + ad->devargs.proto_xtr_dflt; +} + /* Initialize SW parameters of PF */ static int ice_pf_sw_init(struct rte_eth_dev *dev) { - struct ice_adapter *ad = - ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private); struct ice_hw *hw = ICE_PF_TO_HW(pf); @@ -1384,20 +1415,22 @@ ice_pf_sw_init(struct rte_eth_dev *dev) pf->lan_nb_qps = pf->lan_nb_qp_max; - if (ice_proto_xtr_support(hw)) - pf->proto_xtr = rte_zmalloc(NULL, pf->lan_nb_qps, 0); + ice_init_proto_xtr(dev); - if (pf->proto_xtr != NULL) - rte_memcpy(pf->proto_xtr, ad->devargs.proto_xtr, - RTE_MIN((size_t)pf->lan_nb_qps, - sizeof(ad->devargs.proto_xtr))); - else - PMD_DRV_LOG(NOTICE, "Protocol extraction is disabled"); + if (hw->func_caps.fd_fltr_guar > 0 || + hw->func_caps.fd_fltr_best_effort > 0) { + pf->flags |= ICE_FLAG_FDIR; + pf->fdir_nb_qps = ICE_DEFAULT_QP_NUM_FDIR; + pf->lan_nb_qps = pf->lan_nb_qp_max - pf->fdir_nb_qps; + } else { + pf->fdir_nb_qps = 0; + } + pf->fdir_qp_offset = 0; return 0; } -static struct ice_vsi * +struct ice_vsi * ice_setup_vsi(struct ice_pf *pf, enum ice_vsi_type type) { struct ice_hw *hw = ICE_PF_TO_HW(pf); @@ -1409,6 +1442,7 @@ ice_setup_vsi(struct ice_pf *pf, enum ice_vsi_type type) struct rte_ether_addr mac_addr; uint16_t max_txqs[ICE_MAX_TRAFFIC_CLASS] = { 0 }; uint8_t tc_bitmap = 0x1; + uint16_t cfg; /* hw->num_lports = 1 in NIC mode */ vsi = rte_zmalloc(NULL, sizeof(struct ice_vsi), 0); @@ -1432,14 +1466,10 @@ ice_setup_vsi(struct ice_pf *pf, enum ice_vsi_type type) pf->flags |= ICE_FLAG_RSS_AQ_CAPABLE; memset(&vsi_ctx, 0, sizeof(vsi_ctx)); - /* base_queue in used in queue mapping of VSI add/update command. - * Suppose vsi->base_queue is 0 now, don't consider SRIOV, VMDQ - * cases in the first stage. Only Main VSI. - */ - vsi->base_queue = 0; switch (type) { case ICE_VSI_PF: vsi->nb_qps = pf->lan_nb_qps; + vsi->base_queue = 1; ice_vsi_config_default_rss(&vsi_ctx.info); vsi_ctx.alloc_from_pool = true; vsi_ctx.flags = ICE_AQ_VSI_TYPE_PF; @@ -1453,6 +1483,18 @@ ice_setup_vsi(struct ice_pf *pf, enum ice_vsi_type type) vsi_ctx.info.vlan_flags |= ICE_AQ_VSI_VLAN_EMOD_NOTHING; vsi_ctx.info.q_opt_rss = ICE_AQ_VSI_Q_OPT_RSS_LUT_PF | ICE_AQ_VSI_Q_OPT_RSS_TPLZ; + + /* FDIR */ + cfg = ICE_AQ_VSI_PROP_SECURITY_VALID | + ICE_AQ_VSI_PROP_FLOW_DIR_VALID; + vsi_ctx.info.valid_sections |= rte_cpu_to_le_16(cfg); + cfg = ICE_AQ_VSI_FD_ENABLE | ICE_AQ_VSI_FD_PROG_ENABLE; + vsi_ctx.info.fd_options = rte_cpu_to_le_16(cfg); + vsi_ctx.info.max_fd_fltr_dedicated = + rte_cpu_to_le_16(hw->func_caps.fd_fltr_guar); + vsi_ctx.info.max_fd_fltr_shared = + rte_cpu_to_le_16(hw->func_caps.fd_fltr_best_effort); + /* Enable VLAN/UP trip */ ret = ice_vsi_config_tc_queue_mapping(vsi, &vsi_ctx.info, @@ -1465,6 +1507,28 @@ ice_setup_vsi(struct ice_pf *pf, enum ice_vsi_type type) goto fail_mem; } + break; + case ICE_VSI_CTRL: + vsi->nb_qps = pf->fdir_nb_qps; + vsi->base_queue = ICE_FDIR_QUEUE_ID; + vsi_ctx.alloc_from_pool = true; + vsi_ctx.flags = ICE_AQ_VSI_TYPE_PF; + + cfg = ICE_AQ_VSI_PROP_FLOW_DIR_VALID; + vsi_ctx.info.valid_sections |= rte_cpu_to_le_16(cfg); + cfg = ICE_AQ_VSI_FD_ENABLE | ICE_AQ_VSI_FD_PROG_ENABLE; + vsi_ctx.info.fd_options = rte_cpu_to_le_16(cfg); + vsi_ctx.info.sw_id = hw->port_info->sw_id; + ret = ice_vsi_config_tc_queue_mapping(vsi, + &vsi_ctx.info, + ICE_DEFAULT_TCMAP); + if (ret) { + PMD_INIT_LOG(ERR, + "tc queue mapping with vsi failed, " + "err = %d", + ret); + goto fail_mem; + } break; default: /* for other types of VSI */ @@ -1483,6 +1547,14 @@ ice_setup_vsi(struct ice_pf *pf, enum ice_vsi_type type) } vsi->msix_intr = ret; vsi->nb_msix = RTE_MIN(vsi->nb_qps, RTE_MAX_RXTX_INTR_VEC_ID); + } else if (type == ICE_VSI_CTRL) { + ret = ice_res_pool_alloc(&pf->msix_pool, 1); + if (ret < 0) { + PMD_DRV_LOG(ERR, "VSI %d get heap failed %d", + vsi->vsi_id, ret); + } + vsi->msix_intr = ret; + vsi->nb_msix = 1; } else { vsi->msix_intr = 0; vsi->nb_msix = 0; @@ -1498,20 +1570,22 @@ ice_setup_vsi(struct ice_pf *pf, enum ice_vsi_type type) pf->vsis_allocated = vsi_ctx.vsis_allocd; pf->vsis_unallocated = vsi_ctx.vsis_unallocated; - /* MAC configuration */ - rte_memcpy(pf->dev_addr.addr_bytes, - hw->port_info->mac.perm_addr, - ETH_ADDR_LEN); + if (type == ICE_VSI_PF) { + /* MAC configuration */ + rte_memcpy(pf->dev_addr.addr_bytes, + hw->port_info->mac.perm_addr, + ETH_ADDR_LEN); - rte_memcpy(&mac_addr, &pf->dev_addr, RTE_ETHER_ADDR_LEN); - ret = ice_add_mac_filter(vsi, &mac_addr); - if (ret != ICE_SUCCESS) - PMD_INIT_LOG(ERR, "Failed to add dflt MAC filter"); + rte_memcpy(&mac_addr, &pf->dev_addr, RTE_ETHER_ADDR_LEN); + ret = ice_add_mac_filter(vsi, &mac_addr); + if (ret != ICE_SUCCESS) + PMD_INIT_LOG(ERR, "Failed to add dflt MAC filter"); - rte_memcpy(&mac_addr, &broadcast, RTE_ETHER_ADDR_LEN); - ret = ice_add_mac_filter(vsi, &mac_addr); - if (ret != ICE_SUCCESS) - PMD_INIT_LOG(ERR, "Failed to add MAC filter"); + rte_memcpy(&mac_addr, &broadcast, RTE_ETHER_ADDR_LEN); + ret = ice_add_mac_filter(vsi, &mac_addr); + if (ret != ICE_SUCCESS) + PMD_INIT_LOG(ERR, "Failed to add MAC filter"); + } /* At the beginning, only TC0. */ /* What we need here is the maximam number of the TX queues. @@ -1549,7 +1623,9 @@ ice_send_driver_ver(struct ice_hw *hw) static int ice_pf_setup(struct ice_pf *pf) { + struct ice_hw *hw = ICE_PF_TO_HW(pf); struct ice_vsi *vsi; + uint16_t unused; /* Clear all stats counters */ pf->offset_loaded = FALSE; @@ -1558,6 +1634,13 @@ ice_pf_setup(struct ice_pf *pf) memset(&pf->internal_stats, 0, sizeof(struct ice_eth_stats)); memset(&pf->internal_stats_offset, 0, sizeof(struct ice_eth_stats)); + /* force guaranteed filter pool for PF */ + ice_alloc_fd_guar_item(hw, &unused, + hw->func_caps.fd_fltr_guar); + /* force shared filter pool for PF */ + ice_alloc_fd_shrd_item(hw, &unused, + hw->func_caps.fd_fltr_best_effort); + vsi = ice_setup_vsi(pf, ICE_VSI_PF); if (!vsi) { PMD_INIT_LOG(ERR, "Failed to add vsi for PF"); @@ -1805,6 +1888,7 @@ static int ice_parse_devargs(struct rte_eth_dev *dev) return -EINVAL; } + ad->devargs.proto_xtr_dflt = PROTO_XTR_NONE; memset(ad->devargs.proto_xtr, PROTO_XTR_NONE, sizeof(ad->devargs.proto_xtr)); @@ -1815,6 +1899,11 @@ static int ice_parse_devargs(struct rte_eth_dev *dev) ret = rte_kvargs_process(kvlist, ICE_SAFE_MODE_SUPPORT_ARG, &parse_bool, &ad->devargs.safe_mode_support); + if (ret) + goto bail; + + ret = rte_kvargs_process(kvlist, ICE_PIPELINE_MODE_SUPPORT_ARG, + &parse_bool, &ad->devargs.pipe_mode_support); bail: rte_kvargs_free(kvlist); @@ -1984,7 +2073,11 @@ ice_dev_init(struct rte_eth_dev *dev) /* get base queue pairs index in the device */ ice_base_queue_get(pf); - TAILQ_INIT(&pf->flow_list); + ret = ice_flow_init(ad); + if (ret) { + PMD_INIT_LOG(ERR, "Failed to initialize flow"); + return ret; + } return 0; @@ -2002,7 +2095,7 @@ err_init_mac: return ret; } -static int +int ice_release_vsi(struct ice_vsi *vsi) { struct ice_hw *hw; @@ -2084,6 +2177,9 @@ ice_dev_stop(struct rte_eth_dev *dev) /* disable all queue interrupts */ ice_vsi_disable_queues_intr(main_vsi); + if (pf->fdir.fdir_vsi) + ice_vsi_disable_queues_intr(pf->fdir.fdir_vsi); + /* Clear all queues and release mbufs */ ice_clear_queues(dev); @@ -2106,7 +2202,8 @@ ice_dev_close(struct rte_eth_dev *dev) struct ice_hw *hw = ICE_DEV_PRIVATE_TO_HW(dev->data->dev_private); struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev); struct rte_intr_handle *intr_handle = &pci_dev->intr_handle; - struct rte_flow *p_flow; + struct ice_adapter *ad = + ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private); /* Since stop will make link down, then the link event will be * triggered, disable the irq firstly to avoid the port_infoe etc @@ -2117,6 +2214,8 @@ ice_dev_close(struct rte_eth_dev *dev) ice_dev_stop(dev); + ice_flow_uninit(ad); + /* release all queue resource */ ice_free_queues(dev); @@ -2126,6 +2225,8 @@ ice_dev_close(struct rte_eth_dev *dev) rte_free(hw->port_info); hw->port_info = NULL; ice_shutdown_all_ctrlq(hw); + rte_free(pf->proto_xtr); + pf->proto_xtr = NULL; dev->dev_ops = NULL; dev->rx_pkt_burst = NULL; @@ -2140,13 +2241,6 @@ ice_dev_close(struct rte_eth_dev *dev) /* unregister callback func from eal lib */ rte_intr_callback_unregister(intr_handle, ice_interrupt_handler, dev); - - /* Remove all flows */ - while ((p_flow = TAILQ_FIRST(&pf->flow_list))) { - TAILQ_REMOVE(&pf->flow_list, p_flow, node); - ice_free_switch_filter_rule(p_flow->rule); - rte_free(p_flow); - } } static int @@ -2425,6 +2519,12 @@ ice_rxq_intr_setup(struct rte_eth_dev *dev) /* Enable interrupts for all the queues */ ice_vsi_enable_queues_intr(vsi); + /* Enable FDIR MSIX interrupt */ + if (pf->fdir.fdir_vsi) { + ice_vsi_queues_bind_intr(pf->fdir.fdir_vsi); + ice_vsi_enable_queues_intr(pf->fdir.fdir_vsi); + } + rte_intr_enable(intr_handle); return 0; @@ -3183,8 +3283,8 @@ ice_get_rss_lut(struct ice_vsi *vsi, uint8_t *lut, uint16_t lut_size) return -EINVAL; if (pf->flags & ICE_FLAG_RSS_AQ_CAPABLE) { - ret = ice_aq_get_rss_lut(hw, vsi->idx, TRUE, - lut, lut_size); + ret = ice_aq_get_rss_lut(hw, vsi->idx, + ICE_AQC_GSET_RSS_LUT_TABLE_TYPE_PF, lut, lut_size); if (ret) { PMD_DRV_LOG(ERR, "Failed to get RSS lookup table"); return -EINVAL; @@ -3214,8 +3314,8 @@ ice_set_rss_lut(struct ice_vsi *vsi, uint8_t *lut, uint16_t lut_size) hw = ICE_VSI_TO_HW(vsi); if (pf->flags & ICE_FLAG_RSS_AQ_CAPABLE) { - ret = ice_aq_set_rss_lut(hw, vsi->idx, TRUE, - lut, lut_size); + ret = ice_aq_set_rss_lut(hw, vsi->idx, + ICE_AQC_GSET_RSS_LUT_TABLE_TYPE_PF, lut, lut_size); if (ret) { PMD_DRV_LOG(ERR, "Failed to set RSS lookup table"); return -EINVAL; @@ -4278,7 +4378,8 @@ RTE_PMD_REGISTER_PCI_TABLE(net_ice, pci_id_ice_map); RTE_PMD_REGISTER_KMOD_DEP(net_ice, "* igb_uio | uio_pci_generic | vfio-pci"); RTE_PMD_REGISTER_PARAM_STRING(net_ice, ICE_PROTO_XTR_ARG "=[queue:]" - ICE_SAFE_MODE_SUPPORT_ARG "=<0|1>"); + ICE_SAFE_MODE_SUPPORT_ARG "=<0|1>" + ICE_PIPELINE_MODE_SUPPORT_ARG "=<0|1>"); RTE_INIT(ice_init_log) {