From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 75779A0547; Thu, 21 Oct 2021 11:53:18 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id BE9374117A; Thu, 21 Oct 2021 11:51:11 +0200 (CEST) Received: from smtpbguseast2.qq.com (smtpbguseast2.qq.com [54.204.34.130]) by mails.dpdk.org (Postfix) with ESMTP id 1921E411F5 for ; Thu, 21 Oct 2021 11:51:06 +0200 (CEST) X-QQ-mid: bizesmtp38t1634809860tyekae6e Received: from jiawenwu.trustnetic.com (unknown [183.129.236.74]) by esmtp6.qq.com (ESMTP) with id ; Thu, 21 Oct 2021 17:51:00 +0800 (CST) X-QQ-SSF: 01400000000000E0I000000A0000000 X-QQ-FEAT: 3u0oYPVhaeMuRPB0Xqzd/x32VPJ6dFpQWeXwXmWplf6RqW7+hWUAsqSraefFe Yd9UipgQXFsbgOAmDn9WVwUlVtJkgTxvxMctpv67+QfqRz+4oEQ14mD1j8GCFa99Dsjp1Ad CGCcrPsYBMki/z6YRU2D4in4covli9nsjURN5DupK6oBpTaLMvjFxUEFmaoBOWWBO8eUBQp IEl8QG2q8mDnUWw2hy8px7voHykuRc/rug3Ym/EOAtVV6TRS9p0rqbg/ql5yAwMQ1LGM8hv po0j3O4O7iUqhB4QN5IzZXvM1UpjAr6ExpVqxFeobd4rKNsAnZAZ75BjXU6prorBuovJLTD KjbgLZ6u/mclvD5WWd3BOkBY8yqZ+73Zm9wc6ipIRzOcDn5Xqg= X-QQ-GoodBg: 2 From: Jiawen Wu To: dev@dpdk.org Cc: Jiawen Wu Date: Thu, 21 Oct 2021 17:50:14 +0800 Message-Id: <20211021095023.18288-18-jiawenwu@trustnetic.com> X-Mailer: git-send-email 2.21.0.windows.1 In-Reply-To: <20211021095023.18288-1-jiawenwu@trustnetic.com> References: <20211021095023.18288-1-jiawenwu@trustnetic.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:trustnetic.com:qybgforeign:qybgforeign2 X-QQ-Bgrelay: 1 Subject: [dpdk-dev] [PATCH v2 17/26] net/ngbe: support SRIOV X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Initialize and configure PF module to support SRIOV. Signed-off-by: Jiawen Wu --- doc/guides/nics/features/ngbe.ini | 1 + doc/guides/rel_notes/release_21_11.rst | 1 + drivers/net/ngbe/base/meson.build | 1 + drivers/net/ngbe/base/ngbe_dummy.h | 17 +++ drivers/net/ngbe/base/ngbe_hw.c | 44 ++++++ drivers/net/ngbe/base/ngbe_hw.h | 2 + drivers/net/ngbe/base/ngbe_mbx.c | 30 ++++ drivers/net/ngbe/base/ngbe_mbx.h | 11 ++ drivers/net/ngbe/base/ngbe_type.h | 22 +++ drivers/net/ngbe/meson.build | 1 + drivers/net/ngbe/ngbe_ethdev.c | 32 +++- drivers/net/ngbe/ngbe_ethdev.h | 19 +++ drivers/net/ngbe/ngbe_pf.c | 196 +++++++++++++++++++++++++ drivers/net/ngbe/ngbe_rxtx.c | 26 ++-- 14 files changed, 391 insertions(+), 12 deletions(-) create mode 100644 drivers/net/ngbe/base/ngbe_mbx.c create mode 100644 drivers/net/ngbe/base/ngbe_mbx.h create mode 100644 drivers/net/ngbe/ngbe_pf.c diff --git a/doc/guides/nics/features/ngbe.ini b/doc/guides/nics/features/ngbe.ini index 6eb510f113..ffb91d17da 100644 --- a/doc/guides/nics/features/ngbe.ini +++ b/doc/guides/nics/features/ngbe.ini @@ -20,6 +20,7 @@ Multicast MAC filter = Y RSS hash = Y RSS key update = Y RSS reta update = Y +SR-IOV = Y VLAN filter = Y CRC offload = Y VLAN offload = Y diff --git a/doc/guides/rel_notes/release_21_11.rst b/doc/guides/rel_notes/release_21_11.rst index 3250f3b954..ad25e6aeb2 100644 --- a/doc/guides/rel_notes/release_21_11.rst +++ b/doc/guides/rel_notes/release_21_11.rst @@ -151,6 +151,7 @@ New Features * Added VLAN and MAC filters. * Added device basic statistics and extended stats. * Added multi-queue and RSS. + * Added SRIOV. * **Added multi-process support for testpmd.** diff --git a/drivers/net/ngbe/base/meson.build b/drivers/net/ngbe/base/meson.build index 6081281135..390b0f9c12 100644 --- a/drivers/net/ngbe/base/meson.build +++ b/drivers/net/ngbe/base/meson.build @@ -4,6 +4,7 @@ sources = [ 'ngbe_eeprom.c', 'ngbe_hw.c', + 'ngbe_mbx.c', 'ngbe_mng.c', 'ngbe_phy.c', 'ngbe_phy_rtl.c', diff --git a/drivers/net/ngbe/base/ngbe_dummy.h b/drivers/net/ngbe/base/ngbe_dummy.h index 7814fd6226..5cb09bfcaa 100644 --- a/drivers/net/ngbe/base/ngbe_dummy.h +++ b/drivers/net/ngbe/base/ngbe_dummy.h @@ -136,6 +136,14 @@ static inline s32 ngbe_mac_clear_vfta_dummy(struct ngbe_hw *TUP0) { return NGBE_ERR_OPS_DUMMY; } +static inline void ngbe_mac_set_mac_anti_spoofing_dummy(struct ngbe_hw *TUP0, + bool TUP1, int TUP2) +{ +} +static inline void ngbe_mac_set_vlan_anti_spoofing_dummy(struct ngbe_hw *TUP0, + bool TUP1, int TUP2) +{ +} static inline s32 ngbe_mac_init_thermal_ssth_dummy(struct ngbe_hw *TUP0) { return NGBE_ERR_OPS_DUMMY; @@ -187,6 +195,12 @@ static inline s32 ngbe_phy_check_link_dummy(struct ngbe_hw *TUP0, u32 *TUP1, { return NGBE_ERR_OPS_DUMMY; } + +/* struct ngbe_mbx_operations */ +static inline void ngbe_mbx_init_params_dummy(struct ngbe_hw *TUP0) +{ +} + static inline void ngbe_init_ops_dummy(struct ngbe_hw *hw) { hw->bus.set_lan_id = ngbe_bus_set_lan_id_dummy; @@ -214,6 +228,8 @@ static inline void ngbe_init_ops_dummy(struct ngbe_hw *hw) hw->mac.init_rx_addrs = ngbe_mac_init_rx_addrs_dummy; hw->mac.update_mc_addr_list = ngbe_mac_update_mc_addr_list_dummy; hw->mac.clear_vfta = ngbe_mac_clear_vfta_dummy; + hw->mac.set_mac_anti_spoofing = ngbe_mac_set_mac_anti_spoofing_dummy; + hw->mac.set_vlan_anti_spoofing = ngbe_mac_set_vlan_anti_spoofing_dummy; hw->mac.init_thermal_sensor_thresh = ngbe_mac_init_thermal_ssth_dummy; hw->mac.check_overtemp = ngbe_mac_check_overtemp_dummy; hw->phy.identify = ngbe_phy_identify_dummy; @@ -225,6 +241,7 @@ static inline void ngbe_init_ops_dummy(struct ngbe_hw *hw) hw->phy.write_reg_unlocked = ngbe_phy_write_reg_unlocked_dummy; hw->phy.setup_link = ngbe_phy_setup_link_dummy; hw->phy.check_link = ngbe_phy_check_link_dummy; + hw->mbx.init_params = ngbe_mbx_init_params_dummy; } #endif /* _NGBE_TYPE_DUMMY_H_ */ diff --git a/drivers/net/ngbe/base/ngbe_hw.c b/drivers/net/ngbe/base/ngbe_hw.c index 6d2cac3137..5a5f14b5ec 100644 --- a/drivers/net/ngbe/base/ngbe_hw.c +++ b/drivers/net/ngbe/base/ngbe_hw.c @@ -4,6 +4,7 @@ */ #include "ngbe_type.h" +#include "ngbe_mbx.h" #include "ngbe_phy.h" #include "ngbe_eeprom.h" #include "ngbe_mng.h" @@ -1008,6 +1009,44 @@ s32 ngbe_setup_mac_link_em(struct ngbe_hw *hw, return status; } +/** + * ngbe_set_mac_anti_spoofing - Enable/Disable MAC anti-spoofing + * @hw: pointer to hardware structure + * @enable: enable or disable switch for MAC anti-spoofing + * @vf: Virtual Function pool - VF Pool to set for MAC anti-spoofing + * + **/ +void ngbe_set_mac_anti_spoofing(struct ngbe_hw *hw, bool enable, int vf) +{ + u32 pfvfspoof; + + pfvfspoof = rd32(hw, NGBE_POOLTXASMAC); + if (enable) + pfvfspoof |= (1 << vf); + else + pfvfspoof &= ~(1 << vf); + wr32(hw, NGBE_POOLTXASMAC, pfvfspoof); +} + +/** + * ngbe_set_vlan_anti_spoofing - Enable/Disable VLAN anti-spoofing + * @hw: pointer to hardware structure + * @enable: enable or disable switch for VLAN anti-spoofing + * @vf: Virtual Function pool - VF Pool to set for VLAN anti-spoofing + * + **/ +void ngbe_set_vlan_anti_spoofing(struct ngbe_hw *hw, bool enable, int vf) +{ + u32 pfvfspoof; + + pfvfspoof = rd32(hw, NGBE_POOLTXASVLAN); + if (enable) + pfvfspoof |= (1 << vf); + else + pfvfspoof &= ~(1 << vf); + wr32(hw, NGBE_POOLTXASVLAN, pfvfspoof); +} + /** * ngbe_init_thermal_sensor_thresh - Inits thermal sensor thresholds * @hw: pointer to hardware structure @@ -1231,6 +1270,7 @@ s32 ngbe_init_ops_pf(struct ngbe_hw *hw) struct ngbe_mac_info *mac = &hw->mac; struct ngbe_phy_info *phy = &hw->phy; struct ngbe_rom_info *rom = &hw->rom; + struct ngbe_mbx_info *mbx = &hw->mbx; DEBUGFUNC("ngbe_init_ops_pf"); @@ -1266,6 +1306,8 @@ s32 ngbe_init_ops_pf(struct ngbe_hw *hw) mac->set_vmdq = ngbe_set_vmdq; mac->clear_vmdq = ngbe_clear_vmdq; mac->clear_vfta = ngbe_clear_vfta; + mac->set_mac_anti_spoofing = ngbe_set_mac_anti_spoofing; + mac->set_vlan_anti_spoofing = ngbe_set_vlan_anti_spoofing; /* Link */ mac->get_link_capabilities = ngbe_get_link_capabilities_em; @@ -1276,6 +1318,8 @@ s32 ngbe_init_ops_pf(struct ngbe_hw *hw) mac->init_thermal_sensor_thresh = ngbe_init_thermal_sensor_thresh; mac->check_overtemp = ngbe_mac_check_overtemp; + mbx->init_params = ngbe_init_mbx_params_pf; + /* EEPROM */ rom->init_params = ngbe_init_eeprom_params; rom->read32 = ngbe_ee_read32; diff --git a/drivers/net/ngbe/base/ngbe_hw.h b/drivers/net/ngbe/base/ngbe_hw.h index a27bd3e650..a7cb12d437 100644 --- a/drivers/net/ngbe/base/ngbe_hw.h +++ b/drivers/net/ngbe/base/ngbe_hw.h @@ -51,6 +51,8 @@ s32 ngbe_clear_vmdq(struct ngbe_hw *hw, u32 rar, u32 vmdq); s32 ngbe_init_uta_tables(struct ngbe_hw *hw); s32 ngbe_clear_vfta(struct ngbe_hw *hw); +void ngbe_set_mac_anti_spoofing(struct ngbe_hw *hw, bool enable, int vf); +void ngbe_set_vlan_anti_spoofing(struct ngbe_hw *hw, bool enable, int vf); s32 ngbe_init_thermal_sensor_thresh(struct ngbe_hw *hw); s32 ngbe_mac_check_overtemp(struct ngbe_hw *hw); void ngbe_disable_rx(struct ngbe_hw *hw); diff --git a/drivers/net/ngbe/base/ngbe_mbx.c b/drivers/net/ngbe/base/ngbe_mbx.c new file mode 100644 index 0000000000..1ac9531ceb --- /dev/null +++ b/drivers/net/ngbe/base/ngbe_mbx.c @@ -0,0 +1,30 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2018-2021 Beijing WangXun Technology Co., Ltd. + * Copyright(c) 2010-2017 Intel Corporation + */ + +#include "ngbe_type.h" + +#include "ngbe_mbx.h" + +/** + * ngbe_init_mbx_params_pf - set initial values for pf mailbox + * @hw: pointer to the HW structure + * + * Initializes the hw->mbx struct to correct values for pf mailbox + */ +void ngbe_init_mbx_params_pf(struct ngbe_hw *hw) +{ + struct ngbe_mbx_info *mbx = &hw->mbx; + + mbx->timeout = 0; + mbx->usec_delay = 0; + + mbx->size = NGBE_P2VMBX_SIZE; + + mbx->stats.msgs_tx = 0; + mbx->stats.msgs_rx = 0; + mbx->stats.reqs = 0; + mbx->stats.acks = 0; + mbx->stats.rsts = 0; +} diff --git a/drivers/net/ngbe/base/ngbe_mbx.h b/drivers/net/ngbe/base/ngbe_mbx.h new file mode 100644 index 0000000000..d280945baf --- /dev/null +++ b/drivers/net/ngbe/base/ngbe_mbx.h @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2018-2021 Beijing WangXun Technology Co., Ltd. + * Copyright(c) 2010-2017 Intel Corporation + */ + +#ifndef _NGBE_MBX_H_ +#define _NGBE_MBX_H_ + +void ngbe_init_mbx_params_pf(struct ngbe_hw *hw); + +#endif /* _NGBE_MBX_H_ */ diff --git a/drivers/net/ngbe/base/ngbe_type.h b/drivers/net/ngbe/base/ngbe_type.h index 5a88d38e84..bc95fcf609 100644 --- a/drivers/net/ngbe/base/ngbe_type.h +++ b/drivers/net/ngbe/base/ngbe_type.h @@ -254,6 +254,9 @@ struct ngbe_mac_info { u32 mc_addr_count, ngbe_mc_addr_itr func, bool clear); s32 (*clear_vfta)(struct ngbe_hw *hw); + void (*set_mac_anti_spoofing)(struct ngbe_hw *hw, bool enable, int vf); + void (*set_vlan_anti_spoofing)(struct ngbe_hw *hw, + bool enable, int vf); /* Manageability interface */ s32 (*init_thermal_sensor_thresh)(struct ngbe_hw *hw); @@ -305,6 +308,24 @@ struct ngbe_phy_info { u32 autoneg_advertised; }; +struct ngbe_mbx_stats { + u32 msgs_tx; + u32 msgs_rx; + + u32 acks; + u32 reqs; + u32 rsts; +}; + +struct ngbe_mbx_info { + void (*init_params)(struct ngbe_hw *hw); + + struct ngbe_mbx_stats stats; + u32 timeout; + u32 usec_delay; + u16 size; +}; + enum ngbe_isb_idx { NGBE_ISB_HEADER, NGBE_ISB_MISC, @@ -321,6 +342,7 @@ struct ngbe_hw { struct ngbe_phy_info phy; struct ngbe_rom_info rom; struct ngbe_bus_info bus; + struct ngbe_mbx_info mbx; u16 device_id; u16 vendor_id; u16 sub_device_id; diff --git a/drivers/net/ngbe/meson.build b/drivers/net/ngbe/meson.build index c55e6c20e8..8b5195aab3 100644 --- a/drivers/net/ngbe/meson.build +++ b/drivers/net/ngbe/meson.build @@ -13,6 +13,7 @@ objs = [base_objs] sources = files( 'ngbe_ethdev.c', 'ngbe_ptypes.c', + 'ngbe_pf.c', 'ngbe_rxtx.c', ) diff --git a/drivers/net/ngbe/ngbe_ethdev.c b/drivers/net/ngbe/ngbe_ethdev.c index 566a2fbd27..a93b220ba6 100644 --- a/drivers/net/ngbe/ngbe_ethdev.c +++ b/drivers/net/ngbe/ngbe_ethdev.c @@ -254,7 +254,7 @@ eth_ngbe_dev_init(struct rte_eth_dev *eth_dev, void *init_params __rte_unused) struct rte_intr_handle *intr_handle = &pci_dev->intr_handle; const struct rte_memzone *mz; uint32_t ctrl_ext; - int err; + int err, ret; PMD_INIT_FUNC_TRACE(); @@ -374,6 +374,16 @@ eth_ngbe_dev_init(struct rte_eth_dev *eth_dev, void *init_params __rte_unused) /* initialize the hw strip bitmap*/ memset(hwstrip, 0, sizeof(*hwstrip)); + /* initialize PF if max_vfs not zero */ + ret = ngbe_pf_host_init(eth_dev); + if (ret) { + rte_free(eth_dev->data->mac_addrs); + eth_dev->data->mac_addrs = NULL; + rte_free(eth_dev->data->hash_mac_addrs); + eth_dev->data->hash_mac_addrs = NULL; + return ret; + } + ctrl_ext = rd32(hw, NGBE_PORTCTL); /* let hardware know driver is loaded */ ctrl_ext |= NGBE_PORTCTL_DRVLOAD; @@ -877,6 +887,9 @@ ngbe_dev_start(struct rte_eth_dev *dev) hw->mac.start_hw(hw); hw->mac.get_link_status = true; + /* configure PF module if SRIOV enabled */ + ngbe_pf_host_configure(dev); + ngbe_dev_phy_intr_setup(dev); /* check and configure queue intr-vector mapping */ @@ -1038,8 +1051,10 @@ ngbe_dev_stop(struct rte_eth_dev *dev) struct rte_eth_link link; struct ngbe_adapter *adapter = ngbe_dev_adapter(dev); struct ngbe_hw *hw = ngbe_dev_hw(dev); + struct ngbe_vf_info *vfinfo = *NGBE_DEV_VFDATA(dev); struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev); struct rte_intr_handle *intr_handle = &pci_dev->intr_handle; + int vf; if (hw->adapter_stopped) return 0; @@ -1062,6 +1077,9 @@ ngbe_dev_stop(struct rte_eth_dev *dev) /* stop adapter */ ngbe_stop_hw(hw); + for (vf = 0; vfinfo != NULL && vf < pci_dev->max_vfs; vf++) + vfinfo[vf].clear_to_send = false; + ngbe_dev_clear_queues(dev); /* Clear stored conf */ @@ -1134,6 +1152,9 @@ ngbe_dev_close(struct rte_eth_dev *dev) rte_delay_ms(100); } while (retries++ < (10 + NGBE_LINK_UP_TIME)); + /* uninitialize PF if max_vfs not zero */ + ngbe_pf_host_uninit(dev); + rte_free(dev->data->mac_addrs); dev->data->mac_addrs = NULL; @@ -1151,6 +1172,15 @@ ngbe_dev_reset(struct rte_eth_dev *dev) { int ret; + /* When a DPDK PMD PF begin to reset PF port, it should notify all + * its VF to make them align with it. The detailed notification + * mechanism is PMD specific. As to ngbe PF, it is rather complex. + * To avoid unexpected behavior in VF, currently reset of PF with + * SR-IOV activation is not supported. It might be supported later. + */ + if (dev->data->sriov.active) + return -ENOTSUP; + ret = eth_ngbe_dev_uninit(dev); if (ret != 0) return ret; diff --git a/drivers/net/ngbe/ngbe_ethdev.h b/drivers/net/ngbe/ngbe_ethdev.h index f1bc2fee3b..840a7021ba 100644 --- a/drivers/net/ngbe/ngbe_ethdev.h +++ b/drivers/net/ngbe/ngbe_ethdev.h @@ -7,6 +7,8 @@ #define _NGBE_ETHDEV_H_ #include "ngbe_ptypes.h" +#include +#include /* need update link, bit flag */ #define NGBE_FLAG_NEED_LINK_UPDATE ((uint32_t)(1 << 0)) @@ -77,6 +79,12 @@ struct ngbe_uta_info { uint32_t uta_shadow[NGBE_MAX_UTA]; }; +struct ngbe_vf_info { + uint8_t vf_mac_addresses[RTE_ETHER_ADDR_LEN]; + bool clear_to_send; + uint16_t switch_domain_id; +}; + /* * Structure to store private data for each driver instance (for each port). */ @@ -87,6 +95,7 @@ struct ngbe_adapter { struct ngbe_stat_mappings stat_mappings; struct ngbe_vfta shadow_vfta; struct ngbe_hwstrip hwstrip; + struct ngbe_vf_info *vfdata; struct ngbe_uta_info uta_info; bool rx_bulk_alloc_allowed; @@ -131,6 +140,10 @@ ngbe_dev_intr(struct rte_eth_dev *dev) #define NGBE_DEV_HWSTRIP(dev) \ (&((struct ngbe_adapter *)(dev)->data->dev_private)->hwstrip) + +#define NGBE_DEV_VFDATA(dev) \ + (&((struct ngbe_adapter *)(dev)->data->dev_private)->vfdata) + #define NGBE_DEV_UTA_INFO(dev) \ (&((struct ngbe_adapter *)(dev)->data->dev_private)->uta_info) @@ -224,6 +237,12 @@ void ngbe_vlan_hw_filter_disable(struct rte_eth_dev *dev); void ngbe_vlan_hw_strip_config(struct rte_eth_dev *dev); +int ngbe_pf_host_init(struct rte_eth_dev *eth_dev); + +void ngbe_pf_host_uninit(struct rte_eth_dev *eth_dev); + +int ngbe_pf_host_configure(struct rte_eth_dev *eth_dev); + #define NGBE_LINK_DOWN_CHECK_TIMEOUT 4000 /* ms */ #define NGBE_LINK_UP_CHECK_TIMEOUT 1000 /* ms */ #define NGBE_VMDQ_NUM_UC_MAC 4096 /* Maximum nb. of UC MAC addr. */ diff --git a/drivers/net/ngbe/ngbe_pf.c b/drivers/net/ngbe/ngbe_pf.c new file mode 100644 index 0000000000..2f9dfc4284 --- /dev/null +++ b/drivers/net/ngbe/ngbe_pf.c @@ -0,0 +1,196 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2018-2021 Beijing WangXun Technology Co., Ltd. + * Copyright(c) 2010-2017 Intel Corporation + */ + +#include +#include +#include +#include + +#include "base/ngbe.h" +#include "ngbe_ethdev.h" + +#define NGBE_MAX_VFTA (128) + +static inline uint16_t +dev_num_vf(struct rte_eth_dev *eth_dev) +{ + struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); + + /* EM only support 7 VFs. */ + return pci_dev->max_vfs; +} + +static inline +int ngbe_vf_perm_addr_gen(struct rte_eth_dev *dev, uint16_t vf_num) +{ + unsigned char vf_mac_addr[RTE_ETHER_ADDR_LEN]; + struct ngbe_vf_info *vfinfo = *NGBE_DEV_VFDATA(dev); + uint16_t vfn; + + for (vfn = 0; vfn < vf_num; vfn++) { + rte_eth_random_addr(vf_mac_addr); + /* keep the random address as default */ + memcpy(vfinfo[vfn].vf_mac_addresses, vf_mac_addr, + RTE_ETHER_ADDR_LEN); + } + + return 0; +} + +int ngbe_pf_host_init(struct rte_eth_dev *eth_dev) +{ + struct ngbe_vf_info **vfinfo = NGBE_DEV_VFDATA(eth_dev); + struct ngbe_uta_info *uta_info = NGBE_DEV_UTA_INFO(eth_dev); + struct ngbe_hw *hw = ngbe_dev_hw(eth_dev); + uint16_t vf_num; + uint8_t nb_queue = 1; + int ret = 0; + + PMD_INIT_FUNC_TRACE(); + + RTE_ETH_DEV_SRIOV(eth_dev).active = 0; + vf_num = dev_num_vf(eth_dev); + if (vf_num == 0) + return ret; + + *vfinfo = rte_zmalloc("vf_info", + sizeof(struct ngbe_vf_info) * vf_num, 0); + if (*vfinfo == NULL) { + PMD_INIT_LOG(ERR, + "Cannot allocate memory for private VF data\n"); + return -ENOMEM; + } + + ret = rte_eth_switch_domain_alloc(&(*vfinfo)->switch_domain_id); + if (ret) { + PMD_INIT_LOG(ERR, + "failed to allocate switch domain for device %d", ret); + rte_free(*vfinfo); + *vfinfo = NULL; + return ret; + } + + memset(uta_info, 0, sizeof(struct ngbe_uta_info)); + hw->mac.mc_filter_type = 0; + + RTE_ETH_DEV_SRIOV(eth_dev).active = ETH_8_POOLS; + RTE_ETH_DEV_SRIOV(eth_dev).nb_q_per_pool = nb_queue; + RTE_ETH_DEV_SRIOV(eth_dev).def_pool_q_idx = + (uint16_t)(vf_num * nb_queue); + + ngbe_vf_perm_addr_gen(eth_dev, vf_num); + + /* init_mailbox_params */ + hw->mbx.init_params(hw); + + return ret; +} + +void ngbe_pf_host_uninit(struct rte_eth_dev *eth_dev) +{ + struct ngbe_vf_info **vfinfo; + uint16_t vf_num; + int ret; + + PMD_INIT_FUNC_TRACE(); + + RTE_ETH_DEV_SRIOV(eth_dev).active = 0; + RTE_ETH_DEV_SRIOV(eth_dev).nb_q_per_pool = 0; + RTE_ETH_DEV_SRIOV(eth_dev).def_pool_q_idx = 0; + + vf_num = dev_num_vf(eth_dev); + if (vf_num == 0) + return; + + vfinfo = NGBE_DEV_VFDATA(eth_dev); + if (*vfinfo == NULL) + return; + + ret = rte_eth_switch_domain_free((*vfinfo)->switch_domain_id); + if (ret) + PMD_INIT_LOG(WARNING, "failed to free switch domain: %d", ret); + + rte_free(*vfinfo); + *vfinfo = NULL; +} + +int ngbe_pf_host_configure(struct rte_eth_dev *eth_dev) +{ + uint32_t vtctl, fcrth; + uint32_t vfre_offset; + uint16_t vf_num; + const uint8_t VFRE_SHIFT = 5; /* VFRE 32 bits per slot */ + const uint8_t VFRE_MASK = (uint8_t)((1U << VFRE_SHIFT) - 1); + struct ngbe_hw *hw = ngbe_dev_hw(eth_dev); + uint32_t gpie; + uint32_t gcr_ext; + uint32_t vlanctrl; + int i; + + vf_num = dev_num_vf(eth_dev); + if (vf_num == 0) + return -1; + + /* set the default pool for PF */ + vtctl = rd32(hw, NGBE_POOLCTL); + vtctl &= ~NGBE_POOLCTL_DEFPL_MASK; + vtctl |= NGBE_POOLCTL_DEFPL(vf_num); + vtctl |= NGBE_POOLCTL_RPLEN; + wr32(hw, NGBE_POOLCTL, vtctl); + + vfre_offset = vf_num & VFRE_MASK; + + /* Enable pools reserved to PF only */ + wr32(hw, NGBE_POOLRXENA(0), (~0U) << vfre_offset); + wr32(hw, NGBE_POOLTXENA(0), (~0U) << vfre_offset); + + wr32(hw, NGBE_PSRCTL, NGBE_PSRCTL_LBENA); + + /* clear VMDq map to perment rar 0 */ + hw->mac.clear_vmdq(hw, 0, BIT_MASK32); + + /* clear VMDq map to scan rar 31 */ + wr32(hw, NGBE_ETHADDRIDX, hw->mac.num_rar_entries); + wr32(hw, NGBE_ETHADDRASS, 0); + + /* set VMDq map to default PF pool */ + hw->mac.set_vmdq(hw, 0, vf_num); + + /* + * SW msut set PORTCTL.VT_Mode the same as GPIE.VT_Mode + */ + gpie = rd32(hw, NGBE_GPIE); + gpie |= NGBE_GPIE_MSIX; + gcr_ext = rd32(hw, NGBE_PORTCTL); + gcr_ext &= ~NGBE_PORTCTL_NUMVT_MASK; + + if (RTE_ETH_DEV_SRIOV(eth_dev).active == ETH_8_POOLS) + gcr_ext |= NGBE_PORTCTL_NUMVT_8; + + wr32(hw, NGBE_PORTCTL, gcr_ext); + wr32(hw, NGBE_GPIE, gpie); + + /* + * enable vlan filtering and allow all vlan tags through + */ + vlanctrl = rd32(hw, NGBE_VLANCTL); + vlanctrl |= NGBE_VLANCTL_VFE; /* enable vlan filters */ + wr32(hw, NGBE_VLANCTL, vlanctrl); + + /* enable all vlan filters */ + for (i = 0; i < NGBE_MAX_VFTA; i++) + wr32(hw, NGBE_VLANTBL(i), 0xFFFFFFFF); + + /* Enable MAC Anti-Spoofing */ + hw->mac.set_mac_anti_spoofing(hw, FALSE, vf_num); + + /* set flow control threshold to max to avoid tx switch hang */ + wr32(hw, NGBE_FCWTRLO, 0); + fcrth = rd32(hw, NGBE_PBRXSIZE) - 32; + wr32(hw, NGBE_FCWTRHI, fcrth); + + return 0; +} + diff --git a/drivers/net/ngbe/ngbe_rxtx.c b/drivers/net/ngbe/ngbe_rxtx.c index 834c16f173..468a2a4a25 100644 --- a/drivers/net/ngbe/ngbe_rxtx.c +++ b/drivers/net/ngbe/ngbe_rxtx.c @@ -1911,7 +1911,8 @@ ngbe_dev_tx_queue_setup(struct rte_eth_dev *dev, txq->hthresh = tx_conf->tx_thresh.hthresh; txq->wthresh = tx_conf->tx_thresh.wthresh; txq->queue_id = queue_idx; - txq->reg_idx = queue_idx; + txq->reg_idx = (uint16_t)((RTE_ETH_DEV_SRIOV(dev).active == 0) ? + queue_idx : RTE_ETH_DEV_SRIOV(dev).def_pool_q_idx + queue_idx); txq->port_id = dev->data->port_id; txq->offloads = offloads; txq->ops = &def_txq_ops; @@ -2162,7 +2163,8 @@ ngbe_dev_rx_queue_setup(struct rte_eth_dev *dev, rxq->nb_rx_desc = nb_desc; rxq->rx_free_thresh = rx_conf->rx_free_thresh; rxq->queue_id = queue_idx; - rxq->reg_idx = queue_idx; + rxq->reg_idx = (uint16_t)((RTE_ETH_DEV_SRIOV(dev).active == 0) ? + queue_idx : RTE_ETH_DEV_SRIOV(dev).def_pool_q_idx + queue_idx); rxq->port_id = dev->data->port_id; if (dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_KEEP_CRC) rxq->crc_len = RTE_ETHER_CRC_LEN; @@ -2553,16 +2555,18 @@ ngbe_alloc_rx_queue_mbufs(struct ngbe_rx_queue *rxq) static int ngbe_dev_mq_rx_configure(struct rte_eth_dev *dev) { - switch (dev->data->dev_conf.rxmode.mq_mode) { - case ETH_MQ_RX_RSS: - ngbe_rss_configure(dev); - break; + if (RTE_ETH_DEV_SRIOV(dev).active == 0) { + switch (dev->data->dev_conf.rxmode.mq_mode) { + case ETH_MQ_RX_RSS: + ngbe_rss_configure(dev); + break; - case ETH_MQ_RX_NONE: - default: - /* if mq_mode is none, disable rss mode.*/ - ngbe_rss_disable(dev); - break; + case ETH_MQ_RX_NONE: + default: + /* if mq_mode is none, disable rss mode.*/ + ngbe_rss_disable(dev); + break; + } } return 0; -- 2.21.0.windows.1