From patchwork Fri Oct 27 02:59:51 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chaoyong He X-Patchwork-Id: 133457 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id B89684320F; Fri, 27 Oct 2023 05:02:48 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1E87742E37; Fri, 27 Oct 2023 05:01:08 +0200 (CEST) Received: from NAM11-CO1-obe.outbound.protection.outlook.com (mail-co1nam11on2103.outbound.protection.outlook.com [40.107.220.103]) by mails.dpdk.org (Postfix) with ESMTP id 82EB24025E for ; Fri, 27 Oct 2023 05:00:53 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=HyFCRYUswzscz94qkTGHU5CKNxCCg5qJvg920bPeaI9SNSHx+4SvvHwjqOy4UQZVYGpruZuxsLIuFVByVqRDPvjELA8RsCccoSHx0QdLCGlwSdVzTXB9BDScANL6G15yuxuyTaS5pS/6Sa2VGklOisj/CYK0Ild8XBprtZ/+3AVTKvnmcNJtd1gj1Qq9WP18Y5HTgGD7BbS8oz7APTfHDvHPbsr76zHA0kLAXxyy8/iA5FJZI6K94KdDRs5emES/yNEopDAuDZKHxTSueW4Xp5MD5iMKoZ7FyhF8a9hysHzdLvz5Rg1EF8ye1mBL0sltJ18uezp5MZx3lBlKJJFbqA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=fDwI5Zoi65eCMgzPUHQX9XViemhw7FCUOUzA1XaHSbo=; b=VbKJnzE7JjZXDTIo0tV20LSF0KXryv7ncKyqJMS18W+W+F9Ro8O2nUq/S1wG7pNEYn/Opk+XuUNzSTNsdu36RtxzgbIpiuElwECFBhSS+KBl8mKJc9jhhvY9/zJ6SRjOCPAL42ZV0qtSGbllFjUR8PJ9WeAZz7SxnOzTjWSxDU4auI7XI0QvLak2QvXDXdrUgh+FBvvhMwzYFCgLVm3vQ1OlW6I/vIYf9VIQQ4I74L5Gwj8H/yQwrxFKhvXS3INK4k/zpC1CZwH93peTw+c/kwmoAzUrbifdYhJDQm0pXACy0w1VWpm/V/+thLAVR7eu2QT7xDLYX6/3aVAf4id/wA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=corigine.com; dmarc=pass action=none header.from=corigine.com; dkim=pass header.d=corigine.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=corigine.onmicrosoft.com; s=selector2-corigine-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=fDwI5Zoi65eCMgzPUHQX9XViemhw7FCUOUzA1XaHSbo=; b=k8VOjJxysgRzk95tCiED4KaGpaKpFYB9HmjgCd0GmKAgG2+haykgLYeCDxE2ZiXUyNnM257FPFUGv8coxvjHyUWP9ClnO42VHXlP3QC3MOar2Y2Gn18StuDzQZ+8AZsmMO1fnDEgeqZP0Y/iysksuOtq/Be6MHOzah8wWlcoRZA= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=corigine.com; Received: from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5) by DM6PR13MB4493.namprd13.prod.outlook.com (2603:10b6:5:1b9::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6907.33; Fri, 27 Oct 2023 03:00:51 +0000 Received: from SJ0PR13MB5545.namprd13.prod.outlook.com ([fe80::45b3:d83c:cff2:4a1b]) by SJ0PR13MB5545.namprd13.prod.outlook.com ([fe80::45b3:d83c:cff2:4a1b%6]) with mapi id 15.20.6933.022; Fri, 27 Oct 2023 03:00:51 +0000 From: Chaoyong He To: dev@dpdk.org Cc: oss-drivers@corigine.com, Chaoyong He , Long Wu , Peng Zhang Subject: [PATCH v4 14/24] common/nfp: add common module Date: Fri, 27 Oct 2023 10:59:51 +0800 Message-Id: <20231027030001.602639-15-chaoyong.he@corigine.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20231027030001.602639-1-chaoyong.he@corigine.com> References: <20231026064324.177531-1-chaoyong.he@corigine.com> <20231027030001.602639-1-chaoyong.he@corigine.com> X-ClientProxiedBy: BYAPR08CA0065.namprd08.prod.outlook.com (2603:10b6:a03:117::42) To SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ0PR13MB5545:EE_|DM6PR13MB4493:EE_ X-MS-Office365-Filtering-Correlation-Id: 6b276d46-092a-4537-a429-08dbd698ed80 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: NlV324cjgKvSFT+PVrmnqrYzbaA4BD6CSbc4q8rdr4zhb+e5lDMUI5tT5uMCrnneke+R5JqGXGTedBfX4v/B2nFdP6EJ5sXnG6/gxCaTre4RxLQY+i8bqvPD0aCh2fOlp7XvGRCOR1tiCXEoN9QK32Clcl9WXc5to/SS5I6Y8E1L6vKC6+Om2tEJBf5gztvM0PHkMDZu4VB15cLw1e+1MZCwUg4rDJZYFw35QifWNAg/p1RueVzGRDvvAcEiOmDsvF6VA3R6uXTGPSveazDo4+pLl4kVMzZGZpCYbRr5L7gcHtj3xNhXOhNxBPyLJtjYGzMhhX8ZkBIr7WTnB2Jltgom9C1kPy2Ib1kR0zOtpj4gOJxjf2HSiTF82Gp3Tdi9wScPNge+0zAU+aQxk/fC0SKExvI+m/G/Rpf0wg5XxFoN2M0SiL8jq+9r/adnLBP/HGh3kGIWB+O6ciBS2DtXsTWOO/qBdUS26HKb7jZxtb8m+ZvISyyUiBKNqaeKMfAYMsglJFiwKGBrUMppFoU/dD5BhATBSy70HDfuB8ptY48M2bHmuZ0N8ugufF8QTD7+MX+Lm66ZlyC0z8luUErYD1E65fgms/hya8GPQEwVvau8kVBkxgi8kB+NlLosGg+MdvlHcxmB+Aia97Yt0Fz4mBDhjAuSt6ja7gqQPF7Dhjg= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SJ0PR13MB5545.namprd13.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230031)(396003)(136003)(366004)(346002)(376002)(39840400004)(230922051799003)(186009)(1800799009)(64100799003)(451199024)(38350700005)(83380400001)(30864003)(4326008)(52116002)(2906002)(38100700002)(107886003)(44832011)(8936002)(26005)(2616005)(1076003)(36756003)(8676002)(54906003)(5660300002)(66476007)(6916009)(6506007)(316002)(6486002)(6512007)(41300700001)(66556008)(66946007)(86362001)(478600001); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: jD7X7MkXDcwkoRQMu+G5+MP39brdZaPqVhRHpiw//LPWHShBss6mgMAds0q0PHIqjQx2SkGopySor/KLFVW9rCaJGYfxDexq/lsIXAL8DBpAPb9vgFKS7R9wDHr2yMzrtI+d6KdjwTO7BtTPtjYCDkc9UDj7XVGUOM2JXFVF1Jc1zmZlHMdAiS9Gb/PsxUZRoPKZ4BhAcw9tYbvmO2O9NQS7GRgmM09M9jl7IV8uwkVjrAEUVQ9L6Q4ERKqzml3fLRdDvFqm5ZQGaspWDzbH9BLggTmh7Is4z3SyYAHmmgHQ53xJyydYrYOcbN4wKAiyf+clhDO0WVMxzttDipI/Lvt8GsuPoBz0BfgeMuiKBVSTIjIxgChtZkKlD0CkE/6hlqNGcsqvUjjw4bQWJEC1keXP7iBuDKTLo56X4OttzXjUJvqKU6s4h1qSGXDaILgIqpWeqQwP3X1GWBuxJx3Ce9wi4ETpgEUX8OYKmiQvbrcAl1QsW/ZzIfwaDiCFxsC4yeKrFwTSPbBFUph/y4hgRonKfiShO+oFVZ0tWogWp5T3OlqMiCgj67NJZz/6xxArq3uBUkOdq49N1GWSiusQzediPZF9CAHiUWFx/vHyKEHMkVroez6BaZuzL/S/A8CBw+jvVe8Nw372x+ezjqyejOHAKDGTAunR1JWb8pZagWiEabnQbvwxdeZ1etEddYtNkkDGxYT9Ti1A6dfqKDS7Grk/zJNBz/fvy+3h0L9/gYvjIjXFvkB+EgEwtX9WZjrpkjod4UXydoHkHT0qM9f410jw9rYZZ5Ny7D+iG0i9HNSVhpe3z4GWbZMYuSyp16unA6G+yRE0PY9Yje3+21dmv25l1PHBfbY5QDdmi3F0N/N1zrnJYv08k8vzAC+c/ZAqTG9pyu9n3j5XTeS6O+TTHyz3Buorp7IB+ZfcxFHFGvzQJ4EFTS1ivM7A9mBqs/eB4BAMSInRAzFeV0FG7u1F3CYi0Qz95pHcqCMpbS5CYy+r0cu14X3a+t9tZlwtm0hJarZRkHajrNUbol3xIjSsoBHmtWZUVMnSFuIMTO/a+uwLvy0MiSvsqpFmK5fsu5c+S41mmjhUvhFJinwgBkq0JEm4VKHUE2YF8heiC9Q+V4gvQlJff2sXb/ujTJNmdbhBGQq9L2aE8mRTYtun/WUMfR1WM/YXrpRgPHbtMDD8SxJieSYOkmi9SYuFjYtqRLQfW8n//vU1Kwv9c19QzM/kOlYWg2YpYktoAowM+h2NDwcDTXAn/FLLbWJt/DFRzgPvqoWN6qvfcEYmgDySOJ5Lv3rat6FiUTUUvmwDS+zFnS5nZVGMY33/fscIBm8M55jSgr+FnD1sq51Hniot7c+ELni5RMkicjjwXv5HSxVCw5s41HnrQandFeoVz4KCBskdctrbSbPzRglF9/dZfGRIDELE3zxWwrfoDw18ERxMxbjmMb3XmI+fY0ITsSVRvnnG6kzR1SswCRP2pQ44naCbzn3hxpVBwCMF6lFk7zVJki0nKpRpgvKvlwmlqK6SXgAjoOC+5x8A4NmPs6lhykeHrRpuX9DEeJBFbaIATAt+nl8FZanTvHNm/a8FlTLlZNR6Ein8/URBuF8aUA3HCoHAqA== X-OriginatorOrg: corigine.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6b276d46-092a-4537-a429-08dbd698ed80 X-MS-Exchange-CrossTenant-AuthSource: SJ0PR13MB5545.namprd13.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Oct 2023 03:00:51.3905 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: fe128f2c-073b-4c20-818e-7246a585940c X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 8rssZhrTjUJyaVVTMHXfjXxgqL7uh+tORx2ddMGj4Y49RqF4icjUlobj0az49PV6z3J7pWI/AOQNK1OAyXpjL0Wti7W9ZeIHQZfm5kUGexo= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR13MB4493 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 Add the nfp common module in the nfp common library. Signed-off-by: Chaoyong He Reviewed-by: Long Wu Reviewed-by: Peng Zhang --- drivers/common/nfp/meson.build | 3 +- drivers/common/nfp/nfp_common.c | 177 +++++++++++++++++++++++ drivers/common/nfp/nfp_common.h | 232 +++++++++++++++++++++++++++++++ drivers/common/nfp/version.map | 6 + drivers/net/nfp/nfp_ethdev.c | 4 +- drivers/net/nfp/nfp_ethdev_vf.c | 16 +-- drivers/net/nfp/nfp_net_common.c | 159 +-------------------- drivers/net/nfp/nfp_net_common.h | 206 +-------------------------- 8 files changed, 423 insertions(+), 380 deletions(-) create mode 100644 drivers/common/nfp/nfp_common.c create mode 100644 drivers/common/nfp/nfp_common.h diff --git a/drivers/common/nfp/meson.build b/drivers/common/nfp/meson.build index cda5a930c7..cca7fb7796 100644 --- a/drivers/common/nfp/meson.build +++ b/drivers/common/nfp/meson.build @@ -7,8 +7,9 @@ if not is_linux or not dpdk_conf.get('RTE_ARCH_64') endif sources = files( + 'nfp_common.c', 'nfp_common_log.c', 'nfp_common_pci.c', ) -deps += ['bus_pci'] +deps += ['bus_pci', 'net'] diff --git a/drivers/common/nfp/nfp_common.c b/drivers/common/nfp/nfp_common.c new file mode 100644 index 0000000000..1a98326980 --- /dev/null +++ b/drivers/common/nfp/nfp_common.c @@ -0,0 +1,177 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2023 Corigine, Inc. + * All rights reserved. + */ + +#include "nfp_common.h" + +#include "nfp_common_log.h" + +/* + * This is used by the reconfig protocol. It sets the maximum time waiting in + * milliseconds before a reconfig timeout happens. + */ +#define NFP_NET_POLL_TIMEOUT 5000 + +int +nfp_reconfig_real(struct nfp_hw *hw, + uint32_t update) +{ + uint32_t cnt; + uint32_t new; + struct timespec wait; + + PMD_DRV_LOG(DEBUG, "Writing to the configuration queue (%p)...", + hw->qcp_cfg); + + if (hw->qcp_cfg == NULL) { + PMD_DRV_LOG(ERR, "Bad configuration queue pointer"); + return -ENXIO; + } + + nfp_qcp_ptr_add(hw->qcp_cfg, NFP_QCP_WRITE_PTR, 1); + + wait.tv_sec = 0; + wait.tv_nsec = 1000000; /* 1ms */ + + PMD_DRV_LOG(DEBUG, "Polling for update ack..."); + + /* Poll update field, waiting for NFP to ack the config */ + for (cnt = 0; ; cnt++) { + new = nn_cfg_readl(hw, NFP_NET_CFG_UPDATE); + if (new == 0) + break; + + if ((new & NFP_NET_CFG_UPDATE_ERR) != 0) { + PMD_DRV_LOG(ERR, "Reconfig error: %#08x", new); + return -1; + } + + if (cnt >= NFP_NET_POLL_TIMEOUT) { + PMD_DRV_LOG(ERR, "Reconfig timeout for %#08x after %u ms", + update, cnt); + return -EIO; + } + + nanosleep(&wait, 0); /* waiting for a 1ms */ + } + + PMD_DRV_LOG(DEBUG, "Ack DONE"); + return 0; +} + +/** + * Reconfigure the NIC. + * + * Write the update word to the BAR and ping the reconfig queue. Then poll + * until the firmware has acknowledged the update by zeroing the update word. + * + * @param hw + * Device to reconfigure. + * @param ctrl + * The value for the ctrl field in the BAR config. + * @param update + * The value for the update field in the BAR config. + * + * @return + * - (0) if OK to reconfigure the device. + * - (-EIO) if I/O err and fail to reconfigure the device. + */ +int +nfp_reconfig(struct nfp_hw *hw, + uint32_t ctrl, + uint32_t update) +{ + int ret; + + rte_spinlock_lock(&hw->reconfig_lock); + + nn_cfg_writel(hw, NFP_NET_CFG_CTRL, ctrl); + nn_cfg_writel(hw, NFP_NET_CFG_UPDATE, update); + + rte_wmb(); + + ret = nfp_reconfig_real(hw, update); + + rte_spinlock_unlock(&hw->reconfig_lock); + + if (ret != 0) { + PMD_DRV_LOG(ERR, "Error nfp reconfig: ctrl=%#08x update=%#08x", + ctrl, update); + return -EIO; + } + + return 0; +} + +/** + * Reconfigure the NIC for the extend ctrl BAR. + * + * Write the update word to the BAR and ping the reconfig queue. Then poll + * until the firmware has acknowledged the update by zeroing the update word. + * + * @param hw + * Device to reconfigure. + * @param ctrl_ext + * The value for the first word of extend ctrl field in the BAR config. + * @param update + * The value for the update field in the BAR config. + * + * @return + * - (0) if OK to reconfigure the device. + * - (-EIO) if I/O err and fail to reconfigure the device. + */ +int +nfp_ext_reconfig(struct nfp_hw *hw, + uint32_t ctrl_ext, + uint32_t update) +{ + int ret; + + rte_spinlock_lock(&hw->reconfig_lock); + + nn_cfg_writel(hw, NFP_NET_CFG_CTRL_WORD1, ctrl_ext); + nn_cfg_writel(hw, NFP_NET_CFG_UPDATE, update); + + rte_wmb(); + + ret = nfp_reconfig_real(hw, update); + + rte_spinlock_unlock(&hw->reconfig_lock); + + if (ret != 0) { + PMD_DRV_LOG(ERR, "Error nfp ext reconfig: ctrl_ext=%#08x update=%#08x", + ctrl_ext, update); + return -EIO; + } + + return 0; +} + +void +nfp_read_mac(struct nfp_hw *hw) +{ + uint32_t tmp; + + tmp = rte_be_to_cpu_32(nn_cfg_readl(hw, NFP_NET_CFG_MACADDR)); + memcpy(&hw->mac_addr.addr_bytes[0], &tmp, 4); + + tmp = rte_be_to_cpu_32(nn_cfg_readl(hw, NFP_NET_CFG_MACADDR + 4)); + memcpy(&hw->mac_addr.addr_bytes[4], &tmp, 2); +} + +void +nfp_write_mac(struct nfp_hw *hw, + uint8_t *mac) +{ + uint32_t mac0; + uint16_t mac1; + + mac0 = *(uint32_t *)mac; + nn_writel(rte_cpu_to_be_32(mac0), hw->ctrl_bar + NFP_NET_CFG_MACADDR); + + mac += 4; + mac1 = *(uint16_t *)mac; + nn_writew(rte_cpu_to_be_16(mac1), + hw->ctrl_bar + NFP_NET_CFG_MACADDR + 6); +} diff --git a/drivers/common/nfp/nfp_common.h b/drivers/common/nfp/nfp_common.h new file mode 100644 index 0000000000..5615cde6af --- /dev/null +++ b/drivers/common/nfp/nfp_common.h @@ -0,0 +1,232 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2023 Corigine, Inc. + * All rights reserved. + */ + +#ifndef __NFP_COMMON_H__ +#define __NFP_COMMON_H__ + +#include +#include +#include +#include + +#include "nfp_common_ctrl.h" + +#define NFP_QCP_QUEUE_ADDR_SZ (0x800) + +/* Macros for accessing the Queue Controller Peripheral 'CSRs' */ +#define NFP_QCP_QUEUE_OFF(_x) ((_x) * 0x800) +#define NFP_QCP_QUEUE_ADD_RPTR 0x0000 +#define NFP_QCP_QUEUE_ADD_WPTR 0x0004 +#define NFP_QCP_QUEUE_STS_LO 0x0008 +#define NFP_QCP_QUEUE_STS_LO_READPTR_MASK (0x3ffff) +#define NFP_QCP_QUEUE_STS_HI 0x000c +#define NFP_QCP_QUEUE_STS_HI_WRITEPTR_MASK (0x3ffff) + +/* Read or Write Pointer of a queue */ +enum nfp_qcp_ptr { + NFP_QCP_READ_PTR = 0, + NFP_QCP_WRITE_PTR +}; + +struct nfp_hw { + uint8_t *ctrl_bar; + uint8_t *qcp_cfg; + uint32_t cap; + uint32_t cap_ext; + uint32_t ctrl; + uint32_t ctrl_ext; + rte_spinlock_t reconfig_lock; + struct rte_ether_addr mac_addr; +}; + +static inline uint8_t +nn_readb(volatile const void *addr) +{ + return rte_read8(addr); +} + +static inline void +nn_writeb(uint8_t val, + volatile void *addr) +{ + rte_write8(val, addr); +} + +static inline uint32_t +nn_readl(volatile const void *addr) +{ + return rte_read32(addr); +} + +static inline void +nn_writel(uint32_t val, + volatile void *addr) +{ + rte_write32(val, addr); +} + +static inline uint16_t +nn_readw(volatile const void *addr) +{ + return rte_read16(addr); +} + +static inline void +nn_writew(uint16_t val, + volatile void *addr) +{ + rte_write16(val, addr); +} + +static inline uint64_t +nn_readq(volatile void *addr) +{ + uint32_t low; + uint32_t high; + const volatile uint32_t *p = addr; + + high = nn_readl((volatile const void *)(p + 1)); + low = nn_readl((volatile const void *)p); + + return low + ((uint64_t)high << 32); +} + +static inline void +nn_writeq(uint64_t val, + volatile void *addr) +{ + nn_writel(val >> 32, (volatile char *)addr + 4); + nn_writel(val, addr); +} + +static inline uint8_t +nn_cfg_readb(struct nfp_hw *hw, + uint32_t off) +{ + return nn_readb(hw->ctrl_bar + off); +} + +static inline void +nn_cfg_writeb(struct nfp_hw *hw, + uint32_t off, + uint8_t val) +{ + nn_writeb(val, hw->ctrl_bar + off); +} + +static inline uint16_t +nn_cfg_readw(struct nfp_hw *hw, + uint32_t off) +{ + return rte_le_to_cpu_16(nn_readw(hw->ctrl_bar + off)); +} + +static inline void +nn_cfg_writew(struct nfp_hw *hw, + uint32_t off, + uint16_t val) +{ + nn_writew(rte_cpu_to_le_16(val), hw->ctrl_bar + off); +} + +static inline uint32_t +nn_cfg_readl(struct nfp_hw *hw, + uint32_t off) +{ + return rte_le_to_cpu_32(nn_readl(hw->ctrl_bar + off)); +} + +static inline void +nn_cfg_writel(struct nfp_hw *hw, + uint32_t off, + uint32_t val) +{ + nn_writel(rte_cpu_to_le_32(val), hw->ctrl_bar + off); +} + +static inline uint64_t +nn_cfg_readq(struct nfp_hw *hw, + uint32_t off) +{ + return rte_le_to_cpu_64(nn_readq(hw->ctrl_bar + off)); +} + +static inline void +nn_cfg_writeq(struct nfp_hw *hw, + uint32_t off, + uint64_t val) +{ + nn_writeq(rte_cpu_to_le_64(val), hw->ctrl_bar + off); +} + +/** + * Add the value to the selected pointer of a queue. + * + * @param queue + * Base address for queue structure + * @param ptr + * Add to the read or write pointer + * @param val + * Value to add to the queue pointer + */ +static inline void +nfp_qcp_ptr_add(uint8_t *queue, + enum nfp_qcp_ptr ptr, + uint32_t val) +{ + uint32_t off; + + if (ptr == NFP_QCP_READ_PTR) + off = NFP_QCP_QUEUE_ADD_RPTR; + else + off = NFP_QCP_QUEUE_ADD_WPTR; + + nn_writel(rte_cpu_to_le_32(val), queue + off); +} + +/** + * Read the current read/write pointer value for a queue. + * + * @param queue + * Base address for queue structure + * @param ptr + * Read or Write pointer + */ +static inline uint32_t +nfp_qcp_read(uint8_t *queue, + enum nfp_qcp_ptr ptr) +{ + uint32_t off; + uint32_t val; + + if (ptr == NFP_QCP_READ_PTR) + off = NFP_QCP_QUEUE_STS_LO; + else + off = NFP_QCP_QUEUE_STS_HI; + + val = rte_cpu_to_le_32(nn_readl(queue + off)); + + if (ptr == NFP_QCP_READ_PTR) + return val & NFP_QCP_QUEUE_STS_LO_READPTR_MASK; + else + return val & NFP_QCP_QUEUE_STS_HI_WRITEPTR_MASK; +} + +__rte_internal +int nfp_reconfig_real(struct nfp_hw *hw, uint32_t update); + +__rte_internal +int nfp_reconfig(struct nfp_hw *hw, uint32_t ctrl, uint32_t update); + +__rte_internal +int nfp_ext_reconfig(struct nfp_hw *hw, uint32_t ctrl_ext, uint32_t update); + +__rte_internal +void nfp_read_mac(struct nfp_hw *hw); + +__rte_internal +void nfp_write_mac(struct nfp_hw *hw, uint8_t *mac); + +#endif/* __NFP_COMMON_H__ */ diff --git a/drivers/common/nfp/version.map b/drivers/common/nfp/version.map index 25e48c39d6..f6a54a97cd 100644 --- a/drivers/common/nfp/version.map +++ b/drivers/common/nfp/version.map @@ -3,5 +3,11 @@ INTERNAL { nfp_class_driver_register; + nfp_reconfig; + nfp_ext_reconfig; + nfp_reconfig_real; + nfp_read_mac; + nfp_write_mac; + local: *; }; diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c index 3d4b78fbf1..76317925ec 100644 --- a/drivers/net/nfp/nfp_ethdev.c +++ b/drivers/net/nfp/nfp_ethdev.c @@ -600,13 +600,13 @@ nfp_net_init(struct rte_eth_dev *eth_dev) } nfp_net_pf_read_mac(app_fw_nic, port); - nfp_net_write_mac(hw, &hw->mac_addr.addr_bytes[0]); + nfp_write_mac(hw, &hw->mac_addr.addr_bytes[0]); if (rte_is_valid_assigned_ether_addr(&hw->mac_addr) == 0) { PMD_INIT_LOG(INFO, "Using random mac address for port %d", port); /* Using random mac addresses for VFs */ rte_eth_random_addr(&hw->mac_addr.addr_bytes[0]); - nfp_net_write_mac(hw, &hw->mac_addr.addr_bytes[0]); + nfp_write_mac(hw, &hw->mac_addr.addr_bytes[0]); } /* Copying mac address to DPDK eth_dev struct */ diff --git a/drivers/net/nfp/nfp_ethdev_vf.c b/drivers/net/nfp/nfp_ethdev_vf.c index 049728d30c..b9cfb48021 100644 --- a/drivers/net/nfp/nfp_ethdev_vf.c +++ b/drivers/net/nfp/nfp_ethdev_vf.c @@ -15,18 +15,6 @@ #include "nfp_logs.h" #include "nfp_net_common.h" -static void -nfp_netvf_read_mac(struct nfp_hw *hw) -{ - uint32_t tmp; - - tmp = rte_be_to_cpu_32(nn_cfg_readl(hw, NFP_NET_CFG_MACADDR)); - memcpy(&hw->mac_addr.addr_bytes[0], &tmp, 4); - - tmp = rte_be_to_cpu_32(nn_cfg_readl(hw, NFP_NET_CFG_MACADDR + 4)); - memcpy(&hw->mac_addr.addr_bytes[4], &tmp, 2); -} - static int nfp_netvf_start(struct rte_eth_dev *dev) { @@ -334,12 +322,12 @@ nfp_netvf_init(struct rte_eth_dev *eth_dev) goto dev_err_ctrl_map; } - nfp_netvf_read_mac(hw); + nfp_read_mac(hw); if (rte_is_valid_assigned_ether_addr(&hw->mac_addr) == 0) { PMD_INIT_LOG(INFO, "Using random mac address for port %hu", port); /* Using random mac addresses for VFs */ rte_eth_random_addr(&hw->mac_addr.addr_bytes[0]); - nfp_net_write_mac(hw, &hw->mac_addr.addr_bytes[0]); + nfp_write_mac(hw, &hw->mac_addr.addr_bytes[0]); } /* Copying mac address to DPDK eth_dev struct */ diff --git a/drivers/net/nfp/nfp_net_common.c b/drivers/net/nfp/nfp_net_common.c index 01574de963..711532b466 100644 --- a/drivers/net/nfp/nfp_net_common.c +++ b/drivers/net/nfp/nfp_net_common.c @@ -19,12 +19,6 @@ #define NFP_TX_MAX_SEG UINT8_MAX #define NFP_TX_MAX_MTU_SEG 8 -/* - * This is used by the reconfig protocol. It sets the maximum time waiting in - * milliseconds before a reconfig timeout happens. - */ -#define NFP_NET_POLL_TIMEOUT 5000 - #define NFP_NET_LINK_DOWN_CHECK_TIMEOUT 4000 /* ms */ #define NFP_NET_LINK_UP_CHECK_TIMEOUT 1000 /* ms */ @@ -198,141 +192,6 @@ nfp_net_notify_port_speed(struct nfp_net_hw *hw, /* The length of firmware version string */ #define FW_VER_LEN 32 -static int -nfp_reconfig_real(struct nfp_hw *hw, - uint32_t update) -{ - uint32_t cnt; - uint32_t new; - struct timespec wait; - - PMD_DRV_LOG(DEBUG, "Writing to the configuration queue (%p)...", - hw->qcp_cfg); - - if (hw->qcp_cfg == NULL) { - PMD_DRV_LOG(ERR, "Bad configuration queue pointer"); - return -ENXIO; - } - - nfp_qcp_ptr_add(hw->qcp_cfg, NFP_QCP_WRITE_PTR, 1); - - wait.tv_sec = 0; - wait.tv_nsec = 1000000; /* 1ms */ - - PMD_DRV_LOG(DEBUG, "Polling for update ack..."); - - /* Poll update field, waiting for NFP to ack the config */ - for (cnt = 0; ; cnt++) { - new = nn_cfg_readl(hw, NFP_NET_CFG_UPDATE); - if (new == 0) - break; - - if ((new & NFP_NET_CFG_UPDATE_ERR) != 0) { - PMD_DRV_LOG(ERR, "Reconfig error: %#08x", new); - return -1; - } - - if (cnt >= NFP_NET_POLL_TIMEOUT) { - PMD_DRV_LOG(ERR, "Reconfig timeout for %#08x after %u ms", - update, cnt); - return -EIO; - } - - nanosleep(&wait, 0); /* Waiting for a 1ms */ - } - - PMD_DRV_LOG(DEBUG, "Ack DONE"); - return 0; -} - -/** - * Reconfigure the NIC. - * - * Write the update word to the BAR and ping the reconfig queue. Then poll - * until the firmware has acknowledged the update by zeroing the update word. - * - * @param hw - * Device to reconfigure. - * @param ctrl - * The value for the ctrl field in the BAR config. - * @param update - * The value for the update field in the BAR config. - * - * @return - * - (0) if OK to reconfigure the device. - * - (-EIO) if I/O err and fail to reconfigure the device. - */ -int -nfp_reconfig(struct nfp_hw *hw, - uint32_t ctrl, - uint32_t update) -{ - int ret; - - rte_spinlock_lock(&hw->reconfig_lock); - - nn_cfg_writel(hw, NFP_NET_CFG_CTRL, ctrl); - nn_cfg_writel(hw, NFP_NET_CFG_UPDATE, update); - - rte_wmb(); - - ret = nfp_reconfig_real(hw, update); - - rte_spinlock_unlock(&hw->reconfig_lock); - - if (ret != 0) { - PMD_DRV_LOG(ERR, "Error nfp reconfig: ctrl=%#08x update=%#08x", - ctrl, update); - return -EIO; - } - - return 0; -} - -/** - * Reconfigure the NIC for the extend ctrl BAR. - * - * Write the update word to the BAR and ping the reconfig queue. Then poll - * until the firmware has acknowledged the update by zeroing the update word. - * - * @param hw - * Device to reconfigure. - * @param ctrl_ext - * The value for the first word of extend ctrl field in the BAR config. - * @param update - * The value for the update field in the BAR config. - * - * @return - * - (0) if OK to reconfigure the device. - * - (-EIO) if I/O err and fail to reconfigure the device. - */ -int -nfp_ext_reconfig(struct nfp_hw *hw, - uint32_t ctrl_ext, - uint32_t update) -{ - int ret; - - rte_spinlock_lock(&hw->reconfig_lock); - - nn_cfg_writel(hw, NFP_NET_CFG_CTRL_WORD1, ctrl_ext); - nn_cfg_writel(hw, NFP_NET_CFG_UPDATE, update); - - rte_wmb(); - - ret = nfp_reconfig_real(hw, update); - - rte_spinlock_unlock(&hw->reconfig_lock); - - if (ret != 0) { - PMD_DRV_LOG(ERR, "Error nfp ext reconfig: ctrl_ext=%#08x update=%#08x", - ctrl_ext, update); - return -EIO; - } - - return 0; -} - /** * Reconfigure the firmware via the mailbox * @@ -531,22 +390,6 @@ nfp_net_cfg_queue_setup(struct nfp_net_hw *hw) hw->super.qcp_cfg = hw->tx_bar + NFP_QCP_QUEUE_ADDR_SZ; } -void -nfp_net_write_mac(struct nfp_hw *hw, - uint8_t *mac) -{ - uint32_t mac0; - uint16_t mac1; - - mac0 = *(uint32_t *)mac; - nn_writel(rte_cpu_to_be_32(mac0), hw->ctrl_bar + NFP_NET_CFG_MACADDR); - - mac += 4; - mac1 = *(uint16_t *)mac; - nn_writew(rte_cpu_to_be_16(mac1), - hw->ctrl_bar + NFP_NET_CFG_MACADDR + 6); -} - int nfp_net_set_mac_addr(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr) @@ -565,7 +408,7 @@ nfp_net_set_mac_addr(struct rte_eth_dev *dev, } /* Writing new MAC to the specific port BAR address */ - nfp_net_write_mac(hw, (uint8_t *)mac_addr); + nfp_write_mac(hw, (uint8_t *)mac_addr); update = NFP_NET_CFG_UPDATE_MACADDR; ctrl = hw->ctrl; diff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h index e997756091..9461440d0b 100644 --- a/drivers/net/nfp/nfp_net_common.h +++ b/drivers/net/nfp/nfp_net_common.h @@ -8,21 +8,12 @@ #include #include -#include +#include #include #include "nfp_net_ctrl.h" #include "nfpcore/nfp_dev.h" -/* Macros for accessing the Queue Controller Peripheral 'CSRs' */ -#define NFP_QCP_QUEUE_OFF(_x) ((_x) * 0x800) -#define NFP_QCP_QUEUE_ADD_RPTR 0x0000 -#define NFP_QCP_QUEUE_ADD_WPTR 0x0004 -#define NFP_QCP_QUEUE_STS_LO 0x0008 -#define NFP_QCP_QUEUE_STS_LO_READPTR_MASK (0x3ffff) -#define NFP_QCP_QUEUE_STS_HI 0x000c -#define NFP_QCP_QUEUE_STS_HI_WRITEPTR_MASK (0x3ffff) - /* Interrupt definitions */ #define NFP_NET_IRQ_LSC_IDX 0 @@ -42,8 +33,6 @@ /* Alignment for dma zones */ #define NFP_MEMZONE_ALIGN 128 -#define NFP_QCP_QUEUE_ADDR_SZ (0x800) - /* Number of supported physical ports */ #define NFP_MAX_PHYPORTS 12 @@ -53,12 +42,6 @@ enum nfp_app_fw_id { NFP_APP_FW_FLOWER_NIC = 0x3, }; -/* Read or Write Pointer of a queue */ -enum nfp_qcp_ptr { - NFP_QCP_READ_PTR = 0, - NFP_QCP_WRITE_PTR -}; - enum nfp_net_meta_format { NFP_NET_METAFORMAT_SINGLE, NFP_NET_METAFORMAT_CHAINED, @@ -112,17 +95,6 @@ struct nfp_app_fw_nic { uint8_t total_phyports; }; -struct nfp_hw { - uint8_t *ctrl_bar; - uint8_t *qcp_cfg; - uint32_t cap; - uint32_t cap_ext; - uint32_t ctrl; - uint32_t ctrl_ext; - rte_spinlock_t reconfig_lock; - struct rte_ether_addr mac_addr; -}; - struct nfp_net_hw { /** The parent class */ struct nfp_hw super; @@ -184,179 +156,6 @@ struct nfp_net_adapter { struct nfp_net_hw hw; }; -static inline uint8_t -nn_readb(volatile const void *addr) -{ - return rte_read8(addr); -} - -static inline void -nn_writeb(uint8_t val, - volatile void *addr) -{ - rte_write8(val, addr); -} - -static inline uint32_t -nn_readl(volatile const void *addr) -{ - return rte_read32(addr); -} - -static inline void -nn_writel(uint32_t val, - volatile void *addr) -{ - rte_write32(val, addr); -} - -static inline uint16_t -nn_readw(volatile const void *addr) -{ - return rte_read16(addr); -} - -static inline void -nn_writew(uint16_t val, - volatile void *addr) -{ - rte_write16(val, addr); -} - -static inline uint64_t -nn_readq(volatile void *addr) -{ - uint32_t low; - uint32_t high; - const volatile uint32_t *p = addr; - - high = nn_readl((volatile const void *)(p + 1)); - low = nn_readl((volatile const void *)p); - - return low + ((uint64_t)high << 32); -} - -static inline void -nn_writeq(uint64_t val, - volatile void *addr) -{ - nn_writel(val >> 32, (volatile char *)addr + 4); - nn_writel(val, addr); -} - -static inline uint8_t -nn_cfg_readb(struct nfp_hw *hw, - uint32_t off) -{ - return nn_readb(hw->ctrl_bar + off); -} - -static inline void -nn_cfg_writeb(struct nfp_hw *hw, - uint32_t off, - uint8_t val) -{ - nn_writeb(val, hw->ctrl_bar + off); -} - -static inline uint16_t -nn_cfg_readw(struct nfp_hw *hw, - uint32_t off) -{ - return rte_le_to_cpu_16(nn_readw(hw->ctrl_bar + off)); -} - -static inline void -nn_cfg_writew(struct nfp_hw *hw, - uint32_t off, - uint16_t val) -{ - nn_writew(rte_cpu_to_le_16(val), hw->ctrl_bar + off); -} - -static inline uint32_t -nn_cfg_readl(struct nfp_hw *hw, - uint32_t off) -{ - return rte_le_to_cpu_32(nn_readl(hw->ctrl_bar + off)); -} - -static inline void -nn_cfg_writel(struct nfp_hw *hw, - uint32_t off, - uint32_t val) -{ - nn_writel(rte_cpu_to_le_32(val), hw->ctrl_bar + off); -} - -static inline uint64_t -nn_cfg_readq(struct nfp_hw *hw, - uint32_t off) -{ - return rte_le_to_cpu_64(nn_readq(hw->ctrl_bar + off)); -} - -static inline void -nn_cfg_writeq(struct nfp_hw *hw, - uint32_t off, - uint64_t val) -{ - nn_writeq(rte_cpu_to_le_64(val), hw->ctrl_bar + off); -} - -/** - * Add the value to the selected pointer of a queue. - * - * @param queue - * Base address for queue structure - * @param ptr - * Add to the read or write pointer - * @param val - * Value to add to the queue pointer - */ -static inline void -nfp_qcp_ptr_add(uint8_t *queue, - enum nfp_qcp_ptr ptr, - uint32_t val) -{ - uint32_t off; - - if (ptr == NFP_QCP_READ_PTR) - off = NFP_QCP_QUEUE_ADD_RPTR; - else - off = NFP_QCP_QUEUE_ADD_WPTR; - - nn_writel(rte_cpu_to_le_32(val), queue + off); -} - -/** - * Read the current read/write pointer value for a queue. - * - * @param queue - * Base address for queue structure - * @param ptr - * Read or Write pointer - */ -static inline uint32_t -nfp_qcp_read(uint8_t *queue, - enum nfp_qcp_ptr ptr) -{ - uint32_t off; - uint32_t val; - - if (ptr == NFP_QCP_READ_PTR) - off = NFP_QCP_QUEUE_STS_LO; - else - off = NFP_QCP_QUEUE_STS_HI; - - val = rte_cpu_to_le_32(nn_readl(queue + off)); - - if (ptr == NFP_QCP_READ_PTR) - return val & NFP_QCP_QUEUE_STS_LO_READPTR_MASK; - else - return val & NFP_QCP_QUEUE_STS_HI_WRITEPTR_MASK; -} - static inline uint32_t nfp_qcp_queue_offset(const struct nfp_dev_info *dev_info, uint16_t queue) @@ -366,8 +165,6 @@ nfp_qcp_queue_offset(const struct nfp_dev_info *dev_info, } /* Prototypes for common NFP functions */ -int nfp_reconfig(struct nfp_hw *hw, uint32_t ctrl, uint32_t update); -int nfp_ext_reconfig(struct nfp_hw *hw, uint32_t ctrl_ext, uint32_t update); int nfp_net_mbox_reconfig(struct nfp_net_hw *hw, uint32_t mbox_cmd); int nfp_net_configure(struct rte_eth_dev *dev); int nfp_net_common_init(struct rte_pci_device *pci_dev, struct nfp_net_hw *hw); @@ -375,7 +172,6 @@ void nfp_net_log_device_information(const struct nfp_net_hw *hw); void nfp_net_enable_queues(struct rte_eth_dev *dev); void nfp_net_disable_queues(struct rte_eth_dev *dev); void nfp_net_params_setup(struct nfp_net_hw *hw); -void nfp_net_write_mac(struct nfp_hw *hw, uint8_t *mac); int nfp_net_set_mac_addr(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr); int nfp_configure_rx_interrupt(struct rte_eth_dev *dev, struct rte_intr_handle *intr_handle);