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 8CBBC4265E for ; Thu, 28 Sep 2023 11:37:25 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id A3CBD40EA5; Thu, 28 Sep 2023 11:37:24 +0200 (CEST) Received: from smtpbguseast3.qq.com (smtpbguseast3.qq.com [54.243.244.52]) by mails.dpdk.org (Postfix) with ESMTP id EF82640DDC; Thu, 28 Sep 2023 11:37:17 +0200 (CEST) X-QQ-mid: bizesmtp74t1695893828ti0imlrj Received: from wxdbg.localdomain.com ( [115.200.229.121]) by bizesmtp.qq.com (ESMTP) with id ; Thu, 28 Sep 2023 17:37:08 +0800 (CST) X-QQ-SSF: 01400000000000K0Z000000A0000000 X-QQ-FEAT: 83ShfzFP0oDfoMv8XYBuUgxrOQub0a/aGXDYZd+79xzsMgAxTZHaNHwl6CN0W iCJoUR70CUVOBYuliihuorZ8oAx4o9XoF5a+l7d0zC8dB1O28JFUgISFOI0i/urpz0vEYr/ K003pbIZhGByqD9R1KmqmoQgtW/jSlup3scV0CjDZd1KBsRUT2a38DcOtcU81+GXzbv+3s6 tYC4AOBn7oqO6hxXlMEY6KhpWF/cElAhfxLFGvh0lOknKr+88FeLQw2Toc1qeQN3mxYQrXZ 3oCIIDUo5v11wCku80epqoz46chnjHI3C9n4lC2ER7EsqjxKlZ0QhDeHEH5fjzR3y5+ZFo6 TO8O5tr5GVQriGPeonOe9Vq8ywIxH622OnSp55AZAJJXk0ziCA8a6edz+3t54LEP7D0TJT+ P0WPa8feZ+g= X-QQ-GoodBg: 2 X-BIZMAIL-ID: 14509841638707047749 From: Jiawen Wu To: dev@dpdk.org Cc: Jiawen Wu , stable@dpdk.org Subject: [PATCH 03/11] net/ngbe: fix to set flow control Date: Thu, 28 Sep 2023 17:47:50 +0800 Message-Id: <20230928094758.1076236-4-jiawenwu@trustnetic.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20230928094758.1076236-1-jiawenwu@trustnetic.com> References: <20230928094758.1076236-1-jiawenwu@trustnetic.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:trustnetic.com:qybglogicsvrgz:qybglogicsvrgz5a-1 X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org Fix flow control high/low water limit. Fixes: f40e9f0e2278 ("net/ngbe: support flow control") Cc: stable@dpdk.org Signed-off-by: Jiawen Wu --- drivers/net/ngbe/base/ngbe_type.h | 40 ++++++++++++++ drivers/net/ngbe/ngbe_ethdev.c | 89 +++++++++++++++++++++++++++++++ 2 files changed, 129 insertions(+) diff --git a/drivers/net/ngbe/base/ngbe_type.h b/drivers/net/ngbe/base/ngbe_type.h index 37be288a74..8a7d2cd331 100644 --- a/drivers/net/ngbe/base/ngbe_type.h +++ b/drivers/net/ngbe/base/ngbe_type.h @@ -116,6 +116,46 @@ struct ngbe_fc_info { enum ngbe_fc_mode requested_mode; /* FC mode requested by caller */ }; +/* Flow Control Data Sheet defined values + * Calculation and defines taken from 802.1bb Annex O + */ +/* BitTimes (BT) conversion */ +#define NGBE_BT2KB(BT) (((BT) + (8 * 1024 - 1)) / (8 * 1024)) +#define NGBE_B2BT(BT) ((BT) * 8) + +/* Calculate Delay to respond to PFC */ +#define NGBE_PFC_D 672 + +/* Calculate Cable Delay */ +#define NGBE_CABLE_DC 5556 /* Delay Copper */ + +/* Calculate Interface Delay */ +#define NGBE_PHY_D 12800 +#define NGBE_MAC_D 4096 +#define NGBE_XAUI_D (2 * 1024) + +#define NGBE_ID (NGBE_MAC_D + NGBE_XAUI_D + NGBE_PHY_D) + +/* Calculate Delay incurred from higher layer */ +#define NGBE_HD 6144 + +/* Calculate PCI Bus delay for low thresholds */ +#define NGBE_PCI_DELAY 10000 + +/* Calculate delay value in bit times */ +#define NGBE_DV(_max_frame_link, _max_frame_tc) \ + ((36 * \ + (NGBE_B2BT(_max_frame_link) + \ + NGBE_PFC_D + \ + (2 * NGBE_CABLE_DC) + \ + (2 * NGBE_ID) + \ + NGBE_HD) / 25 + 1) + \ + 2 * NGBE_B2BT(_max_frame_tc)) + +#define NGBE_LOW_DV(_max_frame_tc) \ + (2 * ((2 * NGBE_B2BT(_max_frame_tc) + \ + (36 * NGBE_PCI_DELAY / 25) + 1))) + /* Statistics counters collected by the MAC */ /* PB[] RxTx */ struct ngbe_pb_stats { diff --git a/drivers/net/ngbe/ngbe_ethdev.c b/drivers/net/ngbe/ngbe_ethdev.c index af77081d9a..039c3c35a8 100644 --- a/drivers/net/ngbe/ngbe_ethdev.c +++ b/drivers/net/ngbe/ngbe_ethdev.c @@ -90,6 +90,7 @@ static int ngbe_dev_misc_interrupt_setup(struct rte_eth_dev *dev); static int ngbe_dev_rxq_interrupt_setup(struct rte_eth_dev *dev); static void ngbe_dev_interrupt_handler(void *param); static void ngbe_configure_msix(struct rte_eth_dev *dev); +static void ngbe_pbthresh_set(struct rte_eth_dev *dev); #define NGBE_SET_HWSTRIP(h, q) do {\ uint32_t idx = (q) / (sizeof((h)->bitmap[0]) * NBBY); \ @@ -1037,6 +1038,7 @@ ngbe_dev_start(struct rte_eth_dev *dev) } hw->mac.setup_pba(hw); + ngbe_pbthresh_set(dev); ngbe_configure_port(dev); err = ngbe_dev_rxtx_start(dev); @@ -2386,6 +2388,93 @@ ngbe_flow_ctrl_set(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf) return -EIO; } +/* Additional bittime to account for NGBE framing */ +#define NGBE_ETH_FRAMING 20 + +/* + * ngbe_fc_hpbthresh_set - calculate high water mark for flow control + * + * @dv_id: device interface delay + * @pb: packet buffer to calculate + */ +static s32 +ngbe_fc_hpbthresh_set(struct rte_eth_dev *dev) +{ + struct ngbe_hw *hw = ngbe_dev_hw(dev); + struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev); + u32 max_frame_size, tc, dv_id, rx_pb; + s32 kb, marker; + + /* Calculate max LAN frame size */ + max_frame_size = rd32m(hw, NGBE_FRMSZ, NGBE_FRMSZ_MAX_MASK); + tc = max_frame_size + NGBE_ETH_FRAMING; + + /* Calculate delay value for device */ + dv_id = NGBE_DV(tc, tc); + + /* Loopback switch introduces additional latency */ + if (pci_dev->max_vfs) + dv_id += NGBE_B2BT(tc); + + /* Delay value is calculated in bit times convert to KB */ + kb = NGBE_BT2KB(dv_id); + rx_pb = rd32(hw, NGBE_PBRXSIZE) >> 10; + + marker = rx_pb - kb; + + /* It is possible that the packet buffer is not large enough + * to provide required headroom. In this case throw an error + * to user and do the best we can. + */ + if (marker < 0) { + PMD_DRV_LOG(WARNING, "Packet Buffer can not provide enough headroom to support flow control."); + marker = tc + 1; + } + + return marker; +} + +/* + * ngbe_fc_lpbthresh_set - calculate low water mark for for flow control + * + * @dv_id: device interface delay + */ +static s32 +ngbe_fc_lpbthresh_set(struct rte_eth_dev *dev) +{ + struct ngbe_hw *hw = ngbe_dev_hw(dev); + u32 max_frame_size, tc, dv_id; + s32 kb; + + /* Calculate max LAN frame size */ + max_frame_size = rd32m(hw, NGBE_FRMSZ, NGBE_FRMSZ_MAX_MASK); + tc = max_frame_size + NGBE_ETH_FRAMING; + + /* Calculate delay value for device */ + dv_id = NGBE_LOW_DV(tc); + + /* Delay value is calculated in bit times convert to KB */ + kb = NGBE_BT2KB(dv_id); + + return kb; +} + +/* + * ngbe_pbthresh_setup - calculate and setup high low water marks + */ +static void +ngbe_pbthresh_set(struct rte_eth_dev *dev) +{ + struct ngbe_hw *hw = ngbe_dev_hw(dev); + + hw->fc.high_water = ngbe_fc_hpbthresh_set(dev); + hw->fc.low_water = ngbe_fc_lpbthresh_set(dev); + + /* Low water marks must not be larger than high water marks */ + if (hw->fc.low_water > hw->fc.high_water) + hw->fc.low_water = 0; +} + int ngbe_dev_rss_reta_update(struct rte_eth_dev *dev, struct rte_eth_rss_reta_entry64 *reta_conf, -- 2.27.0