From patchwork Fri Aug 12 09:22:02 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Chaoyong He X-Patchwork-Id: 114867 X-Patchwork-Delegate: andrew.rybchenko@oktetlabs.ru 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 86E6BA0543; Fri, 12 Aug 2022 11:22:45 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 9D85A42C05; Fri, 12 Aug 2022 11:22:40 +0200 (CEST) Received: from NAM02-DM3-obe.outbound.protection.outlook.com (mail-dm3nam02on2122.outbound.protection.outlook.com [40.107.95.122]) by mails.dpdk.org (Postfix) with ESMTP id B55DB410D2 for ; Fri, 12 Aug 2022 11:22:38 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=W5W9AFDu4pR78s676R7747i8SHqJmqNMOQsQjXrxvdgJ5DOZH+0PLrNQhZWv4i8/tg20GKNKw2dFMyhbMt2fiPZ/itiWKFBzwqMe5qJ8emuscGiq/vOuNCTkv90mMJzyH7z2bdy7j+f709itfXKICqpnrk3/lm6oGW9GT4QpIMnTMIakvThDIGfUdrZgOEp3OnlI0RWmiSZAKlFSwe/JLDcOld0mcup8wDM6LMtcfTP99PvWJfxjAuXFLAMxnXR0mCZ7hRq6RZecS0sKDmFj2HiWJZtPVB5m/kgu7/ZadiU9ZAKgfDK8+0gEiz2KVNA1oJKVkNCQz8JMHTuvc1zEzA== 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=b1LW4TQSq8hmuCS5t872eqfMRGX9RQDe0rOpTmczfOM=; b=QmbcUu8Y6ajpBFsqTB/EFS8XqVvbL8sPVDLdB2oO8dRP0uQocdbhMTaCj4YA1bUGWtij/wNZNMhS2xp6uRdb05CEwqqa5VCuCxyoMLRcVoOaSN6PiXZKM514oWRYOvUGdT4mMohwiJS2ZV1mE4ldpuNS937HejREwyzZ5jOEBSAccW0E2TI7+oczbewCzfowrBkhx3UiG+wY0ptTMOtXkhRMW4UGojZP9SUlZ53jmfxUrZhBF1lIY4OMfhRDaojmUPOqnZyN/flOuhyH/cTdnV/goYvXP8AItscMLcIk22jIW4dlh4Rw/FIPYXpxq+ICJQ9fIiG9631MTJ0H8F0jaA== 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=b1LW4TQSq8hmuCS5t872eqfMRGX9RQDe0rOpTmczfOM=; b=kAN4+lbEL6w7Eo8na6/5gV1xEaNw5xM/NV4eR0Q8R9cDB481mEOKZLA0iqaXeLPb7tT+4YcqxR41j1UEjlJYHn7WP+4Bdx0QLZYvy+gng8+4gpZC562hsyt+wcX//lU8xPXQHjv3etKlZseKuyn1DhrGIq11JePvbQoLe9Uyx9Q= 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 PH0PR13MB5284.namprd13.prod.outlook.com (2603:10b6:510:f5::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5525.9; Fri, 12 Aug 2022 09:22:37 +0000 Received: from SJ0PR13MB5545.namprd13.prod.outlook.com ([fe80::402d:6abc:83a8:2431]) by SJ0PR13MB5545.namprd13.prod.outlook.com ([fe80::402d:6abc:83a8:2431%5]) with mapi id 15.20.5525.009; Fri, 12 Aug 2022 09:22:37 +0000 From: Chaoyong He To: dev@dpdk.org Cc: oss-drivers@corigine.com, niklas.soderlund@corigine.com, Chaoyong He , Heinrich Kuhn Subject: [PATCH v6 01/12] net/nfp: move app specific attributes to own struct Date: Fri, 12 Aug 2022 17:22:02 +0800 Message-Id: <1660296133-35266-2-git-send-email-chaoyong.he@corigine.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1660296133-35266-1-git-send-email-chaoyong.he@corigine.com> References: <1660296133-35266-1-git-send-email-chaoyong.he@corigine.com> X-ClientProxiedBy: SI2PR01CA0046.apcprd01.prod.exchangelabs.com (2603:1096:4:193::18) To SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 9836ea1c-f0a4-41b6-0a3b-08da7c443259 X-MS-TrafficTypeDiagnostic: PH0PR13MB5284:EE_ X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: r0K6EQPA8XdaQ5+jCM6Bk9epT5UnS35IHWH0o+gx0sl3xkRFJaltwpZc+TvBjVTuAroHb0FkAQYNl65iLCO6o5i920E4dAAiM4vQlPAAL9ZF5Nh7xYRW0lEcbiBUdOX88JjtQdcbM9bXuAwgkMEXRpjleMq2wVukYhBmYqC6weDEQoi6935RAb5U6S4cOKT7wyRlHtciOfbc0NitFALfdQxz8CAiqx2oFt6W820ndsTsDLU00mv0GASOVVdvvMBMjM9zxWOn3M6gLDY32L/xv+5SDrvULoc+Um8KuxXS1fAbBQsg1M9dhFTug1AJzNEhCuSnwhgHxYA2Ad++8Eggtoq7Ghnb424HtfjAMem8aeECcDYR00ZmLvXIoC9zqYaxrAYRabssdRFLw8LfzZ/CkrLB+H7Pg40XhJ5cslRh9lyu9eP4hwasN9w75LiOuJFkcOCM8YQ/SNvFJdrFlMYB8o2X3yoFg7kCUf6NsbCNvmOUC0t4MRzuZj7KiI2nwnCFeU7V3pd4gBx209C8u7JJ/ulDCl+xn+6Tt5ZTKhXb8shDkREwXxa0Oi0Id+HN8WgIG7zk1hYg8HB81PR7f52AUV5FZBxMVycGpC8QlvZrjFmJ5klOCBCqzgoVMY1RB2ip1CBKOtSVHXTRZUiNVIxXazoJfXtbsz0HOe3KLL0URu6/jPL7Yl0SS4hTy/+qp+4Kn97KkjNcM/2hI+zeDyC11UBnfCtMUlg+Q8wJtSmf3Ta4TXJKqKf3sTleoe0ji+KH7s5LyMHLNxbGjrRX0KQ+Grs1ON0/hZM+LNV+ah/FiKkYZbazGIPmoNzf92nfYkAcVao0Rz8JH/jyS17UTcvOqSHzVrCDDG4L0UTGdO/KJbg= 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:(13230016)(4636009)(346002)(376002)(39850400004)(136003)(396003)(366004)(86362001)(36756003)(6666004)(41300700001)(30864003)(44832011)(38100700002)(38350700002)(83380400001)(186003)(6506007)(66574015)(6916009)(26005)(107886003)(6512007)(2616005)(5660300002)(8936002)(478600001)(52116002)(2906002)(6486002)(8676002)(316002)(54906003)(66476007)(4326008)(66946007)(66556008); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?JtkDq+sI09/AqDQo5FKCMq7euasl?= =?utf-8?q?FjFisuCzZ/Sp7kk8jAp/GrePiRAYnYxdKS1VOHCDnmb0qWsAx5ZG3PQd+VR9yE08K?= =?utf-8?q?lCq/Ip+b0fjO1/x5TrQeQ17d2+dz+Zuzq1BSXwzA/858C3gyXqh336HBXwKLbqYF7?= =?utf-8?q?ll5wYcW1Xxrr+aH8MSUd1yeEORI975gWWGRqUhJqIh2ZgowfbWlnztZfpc8AbXzTS?= =?utf-8?q?pZkZe6B1Jbo3h4BVFAKOEau9qTuGZx7W3QNg2AdR6Ofh2jHVbc50way/zSkF1oF3h?= =?utf-8?q?2rdOj5eB8w4yk3yqeXCz7WFe9OHjdmuvOPyV0gQ4wbaYrFCKQ4vIO31oHOVNjWgv2?= =?utf-8?q?uD4RcUCvmHW8B0UBkbPz07DU3YJmQlEO1gIgNcj6PZSvU4wMTL9laAfvqWo9DScIS?= =?utf-8?q?Mw8WCwybMs35cJtEWl05/Mnq1zHclcvaDVoTZ6fljXvBOFO0UyR1Z8/hfW+MxMeQ1?= =?utf-8?q?Qy2zx5qfmJLSMaxmQZPXSTFSyxaSiyf28qcWRHbqd5SimTSEpKubaVFftRJDDmBFH?= =?utf-8?q?N6tVb6Ui4n9oWTbzKtWYxo/d3WD/5W+0QcpszCJYxApzoMc8W9Z0XcaTolUZLlNZh?= =?utf-8?q?43BXDZUr9042/GuWfVfIhFH4+xJBIahvC15Jm8YF/j77mTLVUkEyv7W2FTIH40Q4+?= =?utf-8?q?AQh5l1KR2USCiLCRISdskGuZV/tg4kQlxsMhAxaUpa+rIMJwmL9ieU0S5W82kq+Mq?= =?utf-8?q?t90tMUToyBx6SvCSfG8DveIWTE1t93btyHhUOEgbdDYguXL+XTEDwYXuVUw8+swni?= =?utf-8?q?ZWmXQGyEQKDemgu0t6kCHldAgUyhCHosn9BIfvN4iuFG+6Wt4BzxzebJHudjoVTiy?= =?utf-8?q?PFshtjpxB4GLMenDk5QEDTs9p4ZmHBRDUEmEoEROG5jpqlE6TN3FuKohVJY9IOVYO?= =?utf-8?q?6+SbjPiDXZgjYQ3Rc1gcEjxJhatuWOQE70BN2idwINpRpIGcOVsjsl9JrIJ9zbZvR?= =?utf-8?q?kcFHJSpdy0nX1qv/AqmmDawIqNTHJXxwOd2Ks032M21mb9t7cnwU60FpYFKyb4mlr?= =?utf-8?q?HafnaX+94FFCxjo3/Sf32WM/x6Xwz7Us3UhdW3Mc1Te/MeHhJ+E85/pzKvdCYHpxs?= =?utf-8?q?rE3pBwdK8ljiPbGM3A56UQrvSUAQlKl+CJlErxS0R1fRP8xw6PuV5u2WJVWteXbea?= =?utf-8?q?BKxoU4zBmcmceVeXAufm575AlXXQioA/2AKtc/ib44MMHDEbpKCW696kS3b/zT0gi?= =?utf-8?q?3G4C2bONYQ5gvKPem7fIuaE6t2S9qkxgHKctxStM9FNY/rg9PSvLfaeN1qpMDvB8D?= =?utf-8?q?iD3MksVg/9O4PerGNYRoC/Y/o+YgNAxNTlbuFpi7P15dkNwJB9rhuNKupfil0A9pZ?= =?utf-8?q?UVPfHsGYE3+ynbw1yNaBB+q9JK22ECpAyBfFB8cLk5h3CED1OnqFEZkKKz3Vu9Q3r?= =?utf-8?q?YzVUo0C4erH0T4r8cGtbUZ33eymisdLLhZRkGN99uqAV10W8ocGIWpR8RGKFTXyzc?= =?utf-8?q?m0SkJITs6OKGFAvJaddbJpLHqPlISZOBEftmz2qMGAlPRib2LNCw8a6DcTgdpXC70?= =?utf-8?q?wfVJiekusMinq9ZiV75185YfSUZBuyUsUw=3D=3D?= X-OriginatorOrg: corigine.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9836ea1c-f0a4-41b6-0a3b-08da7c443259 X-MS-Exchange-CrossTenant-AuthSource: SJ0PR13MB5545.namprd13.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Aug 2022 09:22:37.1287 (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: j2n7JqfC2aPqpztvD3qlG2ljRV9rt7opDLWp2U++LOqiU8IFuSikH/MM7/V7AEIMZmdztyrfzGGiH1Zzb2cDfBFupUxLtFWHXEhJgHFPvws= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR13MB5284 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 The NFP Card can load different firmware applications. Currently only the CoreNIC application is supported. This commit makes needed infrastructure changes in order to support other firmware applications too. Clearer separation is made between the PF device and any application specific concepts. The PF struct is now generic regardless of the application loaded. A new struct is also made for the CoreNIC application. Future additions to support other applications should also add an applications specific struct. Signed-off-by: Chaoyong He Signed-off-by: Heinrich Kuhn Reviewed-by: Niklas Söderlund --- drivers/net/nfp/nfp_common.h | 38 ++++++++- drivers/net/nfp/nfp_ethdev.c | 196 +++++++++++++++++++++++++++---------------- 2 files changed, 159 insertions(+), 75 deletions(-) diff --git a/drivers/net/nfp/nfp_common.h b/drivers/net/nfp/nfp_common.h index 6d917e4..42e322b 100644 --- a/drivers/net/nfp/nfp_common.h +++ b/drivers/net/nfp/nfp_common.h @@ -111,6 +111,11 @@ #include #include +/* Firmware application ID's */ +enum nfp_app_id { + NFP_APP_CORE_NIC = 0x1, +}; + /* nfp_qcp_ptr - Read or Write Pointer of a queue */ enum nfp_qcp_ptr { NFP_QCP_READ_PTR = 0, @@ -121,8 +126,10 @@ struct nfp_pf_dev { /* Backpointer to associated pci device */ struct rte_pci_device *pci_dev; - /* Array of physical ports belonging to this PF */ - struct nfp_net_hw *ports[NFP_MAX_PHYPORTS]; + enum nfp_app_id app_id; + + /* Pointer to the app running on the PF */ + void *app_priv; /* Current values for control */ uint32_t ctrl; @@ -151,8 +158,6 @@ struct nfp_pf_dev { struct nfp_cpp_area *msix_area; uint8_t *hw_queues; - uint8_t total_phyports; - bool multiport; union eth_table_entry *eth_table; @@ -161,6 +166,20 @@ struct nfp_pf_dev { uint32_t nfp_cpp_service_id; }; +struct nfp_app_nic { + /* Backpointer to the PF device */ + struct nfp_pf_dev *pf_dev; + + /* + * Array of physical ports belonging to the this CoreNIC app + * This is really a list of vNIC's. One for each physical port + */ + struct nfp_net_hw *ports[NFP_MAX_PHYPORTS]; + + bool multiport; + uint8_t total_phyports; +}; + struct nfp_net_hw { /* Backpointer to the PF this port belongs to */ struct nfp_pf_dev *pf_dev; @@ -372,6 +391,17 @@ static inline void nn_writeq(uint64_t val, volatile void *addr) } } +static inline struct nfp_app_nic * +nfp_app_nic_priv_get(struct nfp_pf_dev *pf_dev) +{ + if (pf_dev == NULL) + return NULL; + else if (pf_dev->app_id != NFP_APP_CORE_NIC) + return NULL; + else + return (struct nfp_app_nic *)pf_dev->app_priv; +} + /* Prototypes for common NFP functions */ int nfp_net_reconfig(struct nfp_net_hw *hw, uint32_t ctrl, uint32_t update); int nfp_net_configure(struct rte_eth_dev *dev); diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c index 5cdd34e..3e3a264 100644 --- a/drivers/net/nfp/nfp_ethdev.c +++ b/drivers/net/nfp/nfp_ethdev.c @@ -39,15 +39,15 @@ #include "nfp_cpp_bridge.h" static int -nfp_net_pf_read_mac(struct nfp_pf_dev *pf_dev, int port) +nfp_net_pf_read_mac(struct nfp_app_nic *app_nic, int port) { struct nfp_eth_table *nfp_eth_table; struct nfp_net_hw *hw = NULL; /* Grab a pointer to the correct physical port */ - hw = pf_dev->ports[port]; + hw = app_nic->ports[port]; - nfp_eth_table = nfp_eth_read_ports(pf_dev->cpp); + nfp_eth_table = nfp_eth_read_ports(app_nic->pf_dev->cpp); nfp_eth_copy_mac((uint8_t *)&hw->mac_addr, (uint8_t *)&nfp_eth_table->ports[port].mac_addr); @@ -64,6 +64,7 @@ uint32_t new_ctrl, update = 0; struct nfp_net_hw *hw; struct nfp_pf_dev *pf_dev; + struct nfp_app_nic *app_nic; struct rte_eth_conf *dev_conf; struct rte_eth_rxmode *rxmode; uint32_t intr_vector; @@ -71,6 +72,7 @@ hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private); pf_dev = NFP_NET_DEV_PRIVATE_TO_PF(dev->data->dev_private); + app_nic = nfp_app_nic_priv_get(pf_dev); PMD_INIT_LOG(DEBUG, "Start"); @@ -82,7 +84,7 @@ /* check and configure queue intr-vector mapping */ if (dev->data->dev_conf.intr_conf.rxq != 0) { - if (pf_dev->multiport) { + if (app_nic->multiport) { PMD_INIT_LOG(ERR, "PMD rx interrupt is not supported " "with NFP multiport PF"); return -EINVAL; @@ -250,6 +252,7 @@ struct nfp_net_hw *hw; struct rte_pci_device *pci_dev; struct nfp_pf_dev *pf_dev; + struct nfp_app_nic *app_nic; int i; if (rte_eal_process_type() != RTE_PROC_PRIMARY) @@ -260,6 +263,7 @@ pf_dev = NFP_NET_DEV_PRIVATE_TO_PF(dev->data->dev_private); hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private); pci_dev = RTE_ETH_DEV_TO_PCI(dev); + app_nic = nfp_app_nic_priv_get(pf_dev); /* * We assume that the DPDK application is stopping all the @@ -280,12 +284,12 @@ /* Only free PF resources after all physical ports have been closed */ /* Mark this port as unused and free device priv resources*/ nn_cfg_writeb(hw, NFP_NET_CFG_LSC, 0xff); - pf_dev->ports[hw->idx] = NULL; + app_nic->ports[hw->idx] = NULL; rte_eth_dev_release_port(dev); - for (i = 0; i < pf_dev->total_phyports; i++) { + for (i = 0; i < app_nic->total_phyports; i++) { /* Check to see if ports are still in use */ - if (pf_dev->ports[i]) + if (app_nic->ports[i]) return 0; } @@ -296,6 +300,7 @@ free(pf_dev->hwinfo); free(pf_dev->sym_tbl); nfp_cpp_free(pf_dev->cpp); + rte_free(app_nic); rte_free(pf_dev); rte_intr_disable(pci_dev->intr_handle); @@ -404,6 +409,7 @@ { struct rte_pci_device *pci_dev; struct nfp_pf_dev *pf_dev; + struct nfp_app_nic *app_nic; struct nfp_net_hw *hw; struct rte_ether_addr *tmp_ether_addr; uint64_t rx_bar_off = 0; @@ -420,6 +426,9 @@ /* Use backpointer here to the PF of this eth_dev */ pf_dev = NFP_NET_DEV_PRIVATE_TO_PF(eth_dev->data->dev_private); + /* Use backpointer to the CoreNIC app struct */ + app_nic = nfp_app_nic_priv_get(pf_dev); + /* NFP can not handle DMA addresses requiring more than 40 bits */ if (rte_mem_check_dma_mask(40)) { RTE_LOG(ERR, PMD, @@ -438,7 +447,7 @@ * Use PF array of physical ports to get pointer to * this specific port */ - hw = pf_dev->ports[port]; + hw = app_nic->ports[port]; PMD_INIT_LOG(DEBUG, "Working with physical port number: %d, " "NFP internal port number: %d", port, hw->nfp_idx); @@ -568,7 +577,7 @@ goto dev_err_queues_map; } - nfp_net_pf_read_mac(pf_dev, port); + nfp_net_pf_read_mac(app_nic, port); nfp_net_write_mac(hw, (uint8_t *)&hw->mac_addr); tmp_ether_addr = (struct rte_ether_addr *)&hw->mac_addr; @@ -718,25 +727,67 @@ } static int -nfp_init_phyports(struct nfp_pf_dev *pf_dev) +nfp_init_app_nic(struct nfp_pf_dev *pf_dev, + struct nfp_eth_table *nfp_eth_table) { int i; - int ret = 0; + int ret; + int err = 0; + int total_vnics; struct nfp_net_hw *hw; + unsigned int numa_node; struct rte_eth_dev *eth_dev; - struct nfp_eth_table *nfp_eth_table; + struct nfp_app_nic *app_nic; + char port_name[RTE_ETH_NAME_MAX_LEN]; - nfp_eth_table = nfp_eth_read_ports(pf_dev->cpp); - if (nfp_eth_table == NULL) { - PMD_INIT_LOG(ERR, "Error reading NFP ethernet table"); - return -EIO; + PMD_INIT_LOG(INFO, "Total physical ports: %d", nfp_eth_table->count); + + /* Allocate memory for the CoreNIC app */ + app_nic = rte_zmalloc("nfp_app_nic", sizeof(*app_nic), 0); + if (app_nic == NULL) + return -ENOMEM; + + /* Point the app_priv pointer in the PF to the coreNIC app */ + pf_dev->app_priv = app_nic; + + /* Read the number of vNIC's created for the PF */ + total_vnics = nfp_rtsym_read_le(pf_dev->sym_tbl, "nfd_cfg_pf0_num_ports", &err); + if (err != 0 || total_vnics <= 0 || total_vnics > 8) { + PMD_INIT_LOG(ERR, "nfd_cfg_pf0_num_ports symbol with wrong value"); + ret = -ENODEV; + goto app_cleanup; } - /* Loop through all physical ports on PF */ - for (i = 0; i < pf_dev->total_phyports; i++) { - const unsigned int numa_node = rte_socket_id(); - char port_name[RTE_ETH_NAME_MAX_LEN]; + /* + * For coreNIC the number of vNICs exposed should be the same as the + * number of physical ports + */ + if (total_vnics != (int)nfp_eth_table->count) { + PMD_INIT_LOG(ERR, "Total physical ports do not match number of vNICs"); + ret = -ENODEV; + goto app_cleanup; + } + /* Populate coreNIC app properties*/ + app_nic->total_phyports = total_vnics; + app_nic->pf_dev = pf_dev; + if (total_vnics > 1) + app_nic->multiport = true; + + /* Map the symbol table */ + pf_dev->ctrl_bar = nfp_rtsym_map(pf_dev->sym_tbl, "_pf0_net_bar0", + app_nic->total_phyports * 32768, &pf_dev->ctrl_area); + if (pf_dev->ctrl_bar == NULL) { + PMD_INIT_LOG(ERR, "nfp_rtsym_map fails for _pf0_net_ctrl_bar"); + ret = -EIO; + goto app_cleanup; + } + + PMD_INIT_LOG(DEBUG, "ctrl bar: %p", pf_dev->ctrl_bar); + + /* Loop through all physical ports on PF */ + numa_node = rte_socket_id(); + for (i = 0; i < app_nic->total_phyports; i++) { snprintf(port_name, sizeof(port_name), "%s_port%d", pf_dev->pci_dev->device.name, i); @@ -760,7 +811,7 @@ hw = NFP_NET_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private); /* Add this device to the PF's array of physical ports */ - pf_dev->ports[i] = hw; + app_nic->ports[i] = hw; hw->pf_dev = pf_dev; hw->cpp = pf_dev->cpp; @@ -783,20 +834,21 @@ rte_eth_dev_probing_finish(eth_dev); } /* End loop, all ports on this PF */ - ret = 0; - goto eth_table_cleanup; + + return 0; port_cleanup: - for (i = 0; i < pf_dev->total_phyports; i++) { - if (pf_dev->ports[i] && pf_dev->ports[i]->eth_dev) { + for (i = 0; i < app_nic->total_phyports; i++) { + if (app_nic->ports[i] && app_nic->ports[i]->eth_dev) { struct rte_eth_dev *tmp_dev; - tmp_dev = pf_dev->ports[i]->eth_dev; + tmp_dev = app_nic->ports[i]->eth_dev; rte_eth_dev_release_port(tmp_dev); - pf_dev->ports[i] = NULL; + app_nic->ports[i] = NULL; } } -eth_table_cleanup: - free(nfp_eth_table); + nfp_cpp_area_free(pf_dev->ctrl_area); +app_cleanup: + rte_free(app_nic); return ret; } @@ -804,11 +856,11 @@ static int nfp_pf_init(struct rte_pci_device *pci_dev) { - int err; - int ret = 0; + int ret; + int err = 0; uint64_t addr; - int total_ports; struct nfp_cpp *cpp; + enum nfp_app_id app_id; struct nfp_pf_dev *pf_dev; struct nfp_hwinfo *hwinfo; char name[RTE_ETH_NAME_MAX_LEN]; @@ -840,9 +892,10 @@ if (hwinfo == NULL) { PMD_INIT_LOG(ERR, "Error reading hwinfo table"); ret = -EIO; - goto error; + goto cpp_cleanup; } + /* Read the number of physical ports from hardware */ nfp_eth_table = nfp_eth_read_ports(cpp); if (nfp_eth_table == NULL) { PMD_INIT_LOG(ERR, "Error reading NFP ethernet table"); @@ -865,20 +918,14 @@ goto eth_table_cleanup; } - total_ports = nfp_rtsym_read_le(sym_tbl, "nfd_cfg_pf0_num_ports", &err); - if (total_ports != (int)nfp_eth_table->count) { - PMD_DRV_LOG(ERR, "Inconsistent number of ports"); + /* Read the app ID of the firmware loaded */ + app_id = nfp_rtsym_read_le(sym_tbl, "_pf0_net_app_id", &err); + if (err != 0) { + PMD_INIT_LOG(ERR, "Couldn't read app_id from fw"); ret = -EIO; goto sym_tbl_cleanup; } - PMD_INIT_LOG(INFO, "Total physical ports: %d", total_ports); - - if (total_ports <= 0 || total_ports > 8) { - PMD_INIT_LOG(ERR, "nfd_cfg_pf0_num_ports symbol with wrong value"); - ret = -ENODEV; - goto sym_tbl_cleanup; - } /* Allocate memory for the PF "device" */ snprintf(name, sizeof(name), "nfp_pf%d", 0); pf_dev = rte_zmalloc(name, sizeof(*pf_dev), 0); @@ -888,27 +935,12 @@ } /* Populate the newly created PF device */ + pf_dev->app_id = app_id; pf_dev->cpp = cpp; pf_dev->hwinfo = hwinfo; pf_dev->sym_tbl = sym_tbl; - pf_dev->total_phyports = total_ports; - - if (total_ports > 1) - pf_dev->multiport = true; - pf_dev->pci_dev = pci_dev; - /* Map the symbol table */ - pf_dev->ctrl_bar = nfp_rtsym_map(pf_dev->sym_tbl, "_pf0_net_bar0", - pf_dev->total_phyports * 32768, &pf_dev->ctrl_area); - if (pf_dev->ctrl_bar == NULL) { - PMD_INIT_LOG(ERR, "nfp_rtsym_map fails for _pf0_net_ctrl_bar"); - ret = -EIO; - goto pf_cleanup; - } - - PMD_INIT_LOG(DEBUG, "ctrl bar: %p", pf_dev->ctrl_bar); - /* configure access to tx/rx vNIC BARs */ switch (pci_dev->id.device_id) { case PCI_DEVICE_ID_NFP3800_PF_NIC: @@ -923,7 +955,7 @@ default: PMD_INIT_LOG(ERR, "nfp_net: no device ID matching"); err = -ENODEV; - goto ctrl_area_cleanup; + goto pf_cleanup; } pf_dev->hw_queues = nfp_cpp_map_area(pf_dev->cpp, 0, 0, @@ -932,18 +964,27 @@ if (pf_dev->hw_queues == NULL) { PMD_INIT_LOG(ERR, "nfp_rtsym_map fails for net.qc"); ret = -EIO; - goto ctrl_area_cleanup; + goto pf_cleanup; } PMD_INIT_LOG(DEBUG, "tx/rx bar address: 0x%p", pf_dev->hw_queues); /* - * Initialize and prep physical ports now - * This will loop through all physical ports + * PF initialization has been done at this point. Call app specific + * init code now */ - ret = nfp_init_phyports(pf_dev); - if (ret) { - PMD_INIT_LOG(ERR, "Could not create physical ports"); + switch (pf_dev->app_id) { + case NFP_APP_CORE_NIC: + PMD_INIT_LOG(INFO, "Initializing coreNIC"); + ret = nfp_init_app_nic(pf_dev, nfp_eth_table); + if (ret != 0) { + PMD_INIT_LOG(ERR, "Could not initialize coreNIC!"); + goto hwqueues_cleanup; + } + break; + default: + PMD_INIT_LOG(ERR, "Unsupported Firmware loaded"); + ret = -EINVAL; goto hwqueues_cleanup; } @@ -954,8 +995,6 @@ hwqueues_cleanup: nfp_cpp_area_free(pf_dev->hwqueues_area); -ctrl_area_cleanup: - nfp_cpp_area_free(pf_dev->ctrl_area); pf_cleanup: rte_free(pf_dev); sym_tbl_cleanup: @@ -964,6 +1003,8 @@ free(nfp_eth_table); hwinfo_cleanup: free(hwinfo); +cpp_cleanup: + nfp_cpp_free(cpp); error: return ret; } @@ -977,7 +1018,8 @@ nfp_pf_secondary_init(struct rte_pci_device *pci_dev) { int i; - int err; + int err = 0; + int ret = 0; int total_ports; struct nfp_cpp *cpp; struct nfp_net_hw *hw; @@ -1015,6 +1057,11 @@ } total_ports = nfp_rtsym_read_le(sym_tbl, "nfd_cfg_pf0_num_ports", &err); + if (err != 0 || total_ports <= 0 || total_ports > 8) { + PMD_INIT_LOG(ERR, "nfd_cfg_pf0_num_ports symbol with wrong value"); + ret = -ENODEV; + goto sym_tbl_cleanup; + } for (i = 0; i < total_ports; i++) { struct rte_eth_dev *eth_dev; @@ -1028,7 +1075,8 @@ if (eth_dev == NULL) { RTE_LOG(ERR, EAL, "secondary process attach failed, ethdev doesn't exist"); - return -ENODEV; + ret = -ENODEV; + break; } hw = NFP_NET_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private); @@ -1041,10 +1089,16 @@ rte_eth_dev_probing_finish(eth_dev); } + if (ret != 0) + goto sym_tbl_cleanup; + /* Register the CPP bridge service for the secondary too */ nfp_register_cpp_service(cpp); - return 0; +sym_tbl_cleanup: + free(sym_tbl); + + return ret; } static int