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 54D8A45BA3; Tue, 22 Oct 2024 18:56:29 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 27DBD406B6; Tue, 22 Oct 2024 18:56:13 +0200 (CEST) Received: from egress-ip11b.ess.de.barracuda.com (egress-ip11b.ess.de.barracuda.com [18.185.115.215]) by mails.dpdk.org (Postfix) with ESMTP id 547BE40612 for ; Tue, 22 Oct 2024 18:56:07 +0200 (CEST) Received: from EUR03-AM7-obe.outbound.protection.outlook.com (mail-am7eur03lp2232.outbound.protection.outlook.com [104.47.51.232]) by mx-outbound19-119.eu-central-1b.ess.aws.cudaops.com (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Tue, 22 Oct 2024 16:56:01 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=O1JLVS8NRc0v9CDsPQG5iO5SLrYLkYhOXS/NKeTFkn5RzFJ1PprK7ScFhulfh4JTeOJN3f5IYOe3zeFkveQf/nxu/VEgiMCq2prh8Ub2m5Y/hWc3Kvp67/3hjZIb+GVF1SoCH/Gv36HcCxqXcqN0K9sgBqG5yKReGtkfXxhB01tlRDzi/0wCCmuplPU6P3/lvl/Eo+QL3YRJmoiMkfoyFZKTmJd94vrZHJhSzM0NBG+MNsovHTGUX94lkaJQniYAXSV2DL6gafaEBLnFUBGsB7Cm/RZ3tk7NFTRm25ZJdd5Esm7khGEgV/mHj3LEWdNSTsty3kBXh0GGv895jiDBhQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=Ka/w6o4fiuPPcBa6MrrIv6UYm/lMdw0rqmM2G4pJXOc=; b=TZC7b2GDK+Jw5EdeNaRRXERAwTEVZ1yMqqCXKr4/3OQ/J53cVWQmrLJvEX9ki8qxVMy3n/wypF2MXAlpdugBSzlDRDmMqCv9QVTh7lkIFuAt29kANy+FpxlxAburuhlOoliEBbrztQjDAMBR2xCAnK+CdLtsv4/GVXi0t4v5f6Fv/+49xtp3dsEVnjPyI/+X4t0zjgCEZjlSnpUJAS4i9XUCLsM8e9CVzM8Y3kPkSXGT+gbmBXSlDZ3KtaNK7mZrcege+ytxm9ri926KfcrPC6Y0zxKH/AaQ1AUezifo69W7doi3sdSLPlnovAYhu1lYNnbXA/nKmYjSgi936zjOgQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=fail (sender ip is 178.72.21.4) smtp.rcpttodomain=dpdk.org smtp.mailfrom=napatech.com; dmarc=fail (p=reject sp=reject pct=100) action=oreject header.from=napatech.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=napatech.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Ka/w6o4fiuPPcBa6MrrIv6UYm/lMdw0rqmM2G4pJXOc=; b=QqAAnreCSmuy4pKWQbAhYweU+BKpVEFOmYIe8sd0bjAfRnAWtmVKvc2+lGpSDIjCGNRMKukUe75j0X2cqwFVCx/oPYidV67afy8RGn/qL74uOQTTAQ1yNejHcUbOsHqjDor26iEagzxkF0bwj9SBC1WR9mszdrqkws0Gol1vXLA= Received: from DB9PR06CA0007.eurprd06.prod.outlook.com (2603:10a6:10:1db::12) by AM8P190MB0849.EURP190.PROD.OUTLOOK.COM (2603:10a6:20b:1db::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8093.16; Tue, 22 Oct 2024 16:55:59 +0000 Received: from DU2PEPF0001E9C2.eurprd03.prod.outlook.com (2603:10a6:10:1db:cafe::ae) by DB9PR06CA0007.outlook.office365.com (2603:10a6:10:1db::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8069.29 via Frontend Transport; Tue, 22 Oct 2024 16:55:59 +0000 X-MS-Exchange-Authentication-Results: spf=fail (sender IP is 178.72.21.4) smtp.mailfrom=napatech.com; dkim=none (message not signed) header.d=none;dmarc=fail action=oreject header.from=napatech.com; Received-SPF: Fail (protection.outlook.com: domain of napatech.com does not designate 178.72.21.4 as permitted sender) receiver=protection.outlook.com; client-ip=178.72.21.4; helo=localhost.localdomain; Received: from localhost.localdomain (178.72.21.4) by DU2PEPF0001E9C2.mail.protection.outlook.com (10.167.8.71) with Microsoft SMTP Server id 15.20.8093.14 via Frontend Transport; Tue, 22 Oct 2024 16:55:59 +0000 From: Serhii Iliushyk To: dev@dpdk.org Cc: mko-plv@napatech.com, sil-plv@napatech.com, ckm@napatech.com, andrew.rybchenko@oktetlabs.ru, ferruh.yigit@amd.com, stephen@networkplumber.org, Danylo Vodopianov Subject: [PATCH v2 01/73] net/ntnic: add API for configuration NT flow dev Date: Tue, 22 Oct 2024 18:54:18 +0200 Message-ID: <20241022165541.3186140-2-sil-plv@napatech.com> X-Mailer: git-send-email 2.45.0 In-Reply-To: <20241022165541.3186140-1-sil-plv@napatech.com> References: <20241021210527.2075431-1-sil-plv@napatech.com> <20241022165541.3186140-1-sil-plv@napatech.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DU2PEPF0001E9C2:EE_|AM8P190MB0849:EE_ Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: 902aa5f4-1bba-414a-b90b-08dcf2ba677f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|36860700013|1800799024|82310400026|376014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?D4fDq5wF2P62j4RrFsDoMVaJvHOcAHQw5hM00EWWouifUuWP03PkpfuD2ZUa?= =?us-ascii?Q?0X8lHod8G1SjXiaJ15HptHC5QkCQORK7h26fZH5FhDSUPCS5fJ6Z/feH9v6c?= =?us-ascii?Q?x99WRruN0nIx2OIdTWexvP02kt72wOLvSZs9fkyIG57gf8330X4UYHh4cBJX?= =?us-ascii?Q?93L/pxYqy0OWPMH9LFcvZccrzxlfcI3cMFJ+Gs4nLLuRxZizjKtN5gc/fi/Y?= =?us-ascii?Q?7C5OQVj4PdxcamCCIf1OOJtg2t0hND2z2HACMVDe0xu67kuHhdisB6RD3ZYv?= =?us-ascii?Q?g45aatefKyh+COg9lHc9dQ4UpOjqO/25E4wJypBrIU8d0ZHugN5G0kXJakUf?= =?us-ascii?Q?gx9+Lx3RwrzXwogIG0mlxpe3ZkoZ5bbPI8Yl0hjsr4uLzZ9wa8cEQ6dBiJ3g?= =?us-ascii?Q?MvAlmIUz7m8jLjfqio9j0Re7ov677ywUGC6sy5B1w4CcQGgv+ny942h4nnkM?= =?us-ascii?Q?MG/T4AVkQ30W9uuVFBB1F1vYd7FcfGcALHrujhpRIYi8rpixJu7JgsyGREHW?= =?us-ascii?Q?ROf8cvv1NbOE/rxTe4gWHVKjrU5CcNMJTyZszB02wVT7mM3LfASgjX/3YJ0N?= =?us-ascii?Q?qA++hp3OOV3IxkHQ9uO4oGV8yH62SCHXyDXlNbLCDFIqSdBgqBp/U4a7HPa5?= =?us-ascii?Q?GQbQHtLY3/rotLjhoxdpqqvozQu6u8VaLHJQyfMd1XVC1fEXnNZYyNqF7Ugt?= =?us-ascii?Q?C6CnXW8xl7j6rPXBqM4RM56pOpp4JhIhR6Qyh1jINpVO7AZPOCwMCJv0fgzx?= =?us-ascii?Q?Jimky+ka5iIDLwMM12S05BtZoF1/gENTxiXgMj+wUoVPnEge/2njvBVgteSj?= =?us-ascii?Q?gRJdcRCKvaqAB5hUJJ8C+iTgRWrR9jmm6/75tLk1ewOg7C5XEVwnlE+6Npxx?= =?us-ascii?Q?7rAGXUjRpmYaXWw9UzGUgbhSthxjCNokm/2DuWaVZ168eDUuCQAMvuhGbPJi?= =?us-ascii?Q?MsLapRrfwzfIBcgoe8q96mbr1mkePSTbYMfSMHQh8FX8Q9K4QJVJYUDWjjY6?= =?us-ascii?Q?1AGcuUjtDhyVTR/SbvtFTj26Z3/Z3X5BmFIMTOsVN2eibszOPldmv2zOLIlm?= =?us-ascii?Q?jmYexZ3Mc2R919lTJDg+e8Q07hWkyJG5vg3kL1/hEK59eijDhiQcSQvaMpOM?= =?us-ascii?Q?/Uo7+z918cV6lkl7dnnVtlGt471mt18DE8lhz+7A5UVUXvdIkX+G9fXDzzrO?= =?us-ascii?Q?/2xho6zOyYZySRKDk8d13G10i79OQ/SB1+uHLKELCLoEIL6s1ZHV/66L6GTE?= =?us-ascii?Q?rBI3x6NC2x7MUeB8EJbqQCMNdW48Jk29wKmQHEIMMvQjO1sm7+Sn3Uf8q9vP?= =?us-ascii?Q?UTeuy9xJ8FMxE70/o9OB2Ir2PLV2UnWF/Sg+4h5cV0v1reqmgO2pCtLNMrW5?= =?us-ascii?Q?fxcquGt41CxXOIYQH31RMhRhKMHWq4dEBFkOLQ7yESNliLR53w=3D=3D?= X-Forefront-Antispam-Report: CIP:178.72.21.4; CTRY:DK; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:localhost.localdomain; PTR:InfoDomainNonexistent; CAT:NONE; SFS:(13230040)(36860700013)(1800799024)(82310400026)(376014); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: bYCdzPwsN8J+IXvjbBI5iGQK06ShwWUrcoHjiRR91wmk9aXLRqIWtaYFf2UG+DyXc1307i17RrD6jUi8eZsqub/smXXZRLB1e3cb9N/ZaxDo0lSEasMfTFOrnMTCrCYWD8kztt3ib6OSDth+ua+QM6guyBU/1ShRwcIhvDIIh6ifiTKrJCG6af35wM1tsdkuV0Ziepd0SRNg56Dd1O0qcE1izavAqMb/gHZ2dAWEXQ7yYLjUFqac5tI7a2uaCorTjOPYBDjxRNbbK6S+mwN0fF/cdCixsizgF4dEPV9YDR1jqOHLlUN8WaWr0P66B7z8/VwtsMNBPF1zmgdo3E60BGYn1gpO921Bd17eBcat36d3gtXWUs6TKXjAJqec9FYjYp3Nc8iChc26z0K7KX5BpeIbw5Wat53zRQg6CCn4ltd5dQ3+iOcnSmyW0PssDkZvq1tfKsG4LoMb/eZAhKniCIInnGIP0pWnpDrJ5CP91aGgSLHcA5Qk9nCoAZQfX4A6q29MVF/3BMJfzPW/CF9wA90eKpajN6qGzXSDn6WYkajs3BYLxj3fWQIVvMMBI/DsHlZLBMU0pzv//TDOpihJGPbRBnQFyhHvjkA/LC3saKTdgzE619NDgk+nSeQ/Vh8B0Lb/hd8F72whjMqde0IMrq9dLUmgDWKQhZ1zLqhGAlM= X-OriginatorOrg: napatech.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Oct 2024 16:55:59.0905 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 902aa5f4-1bba-414a-b90b-08dcf2ba677f X-MS-Exchange-CrossTenant-Id: c4540d0b-728a-4233-9da5-9ea30c7ec3ed X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=c4540d0b-728a-4233-9da5-9ea30c7ec3ed; Ip=[178.72.21.4]; Helo=[localhost.localdomain] X-MS-Exchange-CrossTenant-AuthSource: DU2PEPF0001E9C2.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM8P190MB0849 X-BESS-ID: 1729616161-304983-12656-14356-1 X-BESS-VER: 2019.1_20241018.1852 X-BESS-Apparent-Source-IP: 104.47.51.232 X-BESS-Parts: H4sIAAAAAAACA4uuVkqtKFGyUioBkjpK+cVKVoZm5pYWQGYGUNTYOM00zdI8xT IpKTHNwNLUItXI0NzSMM3C2NDMwsAoTak2FgC21O+8QgAAAA== X-BESS-Outbound-Spam-Score: 0.00 X-BESS-Outbound-Spam-Report: Code version 3.2, rules version 3.2.2.259902 [from cloudscan12-62.eu-central-1a.ess.aws.cudaops.com] Rule breakdown below pts rule name description ---- ---------------------- -------------------------------- 0.00 BSF_BESS_OUTBOUND META: BESS Outbound X-BESS-Outbound-Spam-Status: SCORE=0.00 using account:ESS113687 scores of KILL_LEVEL=7.0 tests=BSF_BESS_OUTBOUND X-BESS-BRTS-Status: 1 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 From: Danylo Vodopianov This API allows to enable of flow profile for NT SmartNIC Signed-off-by: Danylo Vodopianov --- drivers/net/ntnic/include/flow_api.h | 30 +++ drivers/net/ntnic/include/flow_api_engine.h | 5 + drivers/net/ntnic/include/ntos_drv.h | 1 + .../ntnic/include/stream_binary_flow_api.h | 9 + drivers/net/ntnic/nthw/flow_api/flow_api.c | 221 ++++++++++++++++++ drivers/net/ntnic/ntnic_ethdev.c | 22 ++ drivers/net/ntnic/ntnic_mod_reg.c | 5 + drivers/net/ntnic/ntnic_mod_reg.h | 14 ++ 8 files changed, 307 insertions(+) diff --git a/drivers/net/ntnic/include/flow_api.h b/drivers/net/ntnic/include/flow_api.h index 984450afdc..c80906ec50 100644 --- a/drivers/net/ntnic/include/flow_api.h +++ b/drivers/net/ntnic/include/flow_api.h @@ -34,6 +34,8 @@ struct flow_eth_dev { struct flow_nic_dev *ndev; /* NIC port id */ uint8_t port; + /* App assigned port_id - may be DPDK port_id */ + uint32_t port_id; /* 0th for exception */ struct flow_queue_id_s rx_queue[FLOW_MAX_QUEUES + 1]; @@ -41,6 +43,9 @@ struct flow_eth_dev { /* VSWITCH has exceptions sent on queue 0 per design */ int num_queues; + /* QSL_HSH index if RSS needed QSL v6+ */ + int rss_target_id; + struct flow_eth_dev *next; }; @@ -48,6 +53,8 @@ struct flow_eth_dev { struct flow_nic_dev { uint8_t adapter_no; /* physical adapter no in the host system */ uint16_t ports; /* number of in-ports addressable on this NIC */ + /* flow profile this NIC is initially prepared for */ + enum flow_eth_dev_profile flow_profile; struct hw_mod_resource_s res[RES_COUNT];/* raw NIC resource allocation table */ void *km_res_handle; @@ -73,6 +80,14 @@ struct flow_nic_dev { extern const char *dbg_res_descr[]; +#define flow_nic_set_bit(arr, x) \ + do { \ + uint8_t *_temp_arr = (arr); \ + size_t _temp_x = (x); \ + _temp_arr[_temp_x / 8] = \ + (uint8_t)(_temp_arr[_temp_x / 8] | (uint8_t)(1 << (_temp_x % 8))); \ + } while (0) + #define flow_nic_unset_bit(arr, x) \ do { \ size_t _temp_x = (x); \ @@ -85,6 +100,18 @@ extern const char *dbg_res_descr[]; (arr[_temp_x / 8] & (uint8_t)(1 << (_temp_x % 8))); \ }) +#define flow_nic_mark_resource_used(_ndev, res_type, index) \ + do { \ + struct flow_nic_dev *_temp_ndev = (_ndev); \ + typeof(res_type) _temp_res_type = (res_type); \ + size_t _temp_index = (index); \ + NT_LOG(DBG, FILTER, "mark resource used: %s idx %zu", \ + dbg_res_descr[_temp_res_type], _temp_index); \ + assert(flow_nic_is_bit_set(_temp_ndev->res[_temp_res_type].alloc_bm, \ + _temp_index) == 0); \ + flow_nic_set_bit(_temp_ndev->res[_temp_res_type].alloc_bm, _temp_index); \ + } while (0) + #define flow_nic_mark_resource_unused(_ndev, res_type, index) \ do { \ typeof(res_type) _temp_res_type = (res_type); \ @@ -97,6 +124,9 @@ extern const char *dbg_res_descr[]; #define flow_nic_is_resource_used(_ndev, res_type, index) \ (!!flow_nic_is_bit_set((_ndev)->res[res_type].alloc_bm, index)) +int flow_nic_alloc_resource(struct flow_nic_dev *ndev, enum res_type_e res_type, + uint32_t alignment); + void flow_nic_free_resource(struct flow_nic_dev *ndev, enum res_type_e res_type, int idx); int flow_nic_deref_resource(struct flow_nic_dev *ndev, enum res_type_e res_type, int index); diff --git a/drivers/net/ntnic/include/flow_api_engine.h b/drivers/net/ntnic/include/flow_api_engine.h index db5e6fe09d..d025677e25 100644 --- a/drivers/net/ntnic/include/flow_api_engine.h +++ b/drivers/net/ntnic/include/flow_api_engine.h @@ -41,6 +41,11 @@ enum res_type_e { RES_INVALID }; +/* + * Flow NIC offload management + */ +#define MAX_OUTPUT_DEST (128) + void km_free_ndev_resource_management(void **handle); void kcc_free_ndev_resource_management(void **handle); diff --git a/drivers/net/ntnic/include/ntos_drv.h b/drivers/net/ntnic/include/ntos_drv.h index d51d1e3677..8fd577dfe3 100644 --- a/drivers/net/ntnic/include/ntos_drv.h +++ b/drivers/net/ntnic/include/ntos_drv.h @@ -86,6 +86,7 @@ struct __rte_cache_aligned ntnic_tx_queue { struct pmd_internals { const struct rte_pci_device *pci_dev; + struct flow_eth_dev *flw_dev; char name[20]; int n_intf_no; int lpbk_mode; diff --git a/drivers/net/ntnic/include/stream_binary_flow_api.h b/drivers/net/ntnic/include/stream_binary_flow_api.h index 10529b8843..47e5353344 100644 --- a/drivers/net/ntnic/include/stream_binary_flow_api.h +++ b/drivers/net/ntnic/include/stream_binary_flow_api.h @@ -12,11 +12,20 @@ #define FLOW_MAX_QUEUES 128 +/* + * Flow eth dev profile determines how the FPGA module resources are + * managed and what features are available + */ +enum flow_eth_dev_profile { + FLOW_ETH_DEV_PROFILE_INLINE = 0, +}; + struct flow_queue_id_s { int id; int hw_id; }; struct flow_eth_dev; /* port device */ +struct flow_handle; #endif /* _STREAM_BINARY_FLOW_API_H_ */ diff --git a/drivers/net/ntnic/nthw/flow_api/flow_api.c b/drivers/net/ntnic/nthw/flow_api/flow_api.c index 34e84559eb..f49aca79c1 100644 --- a/drivers/net/ntnic/nthw/flow_api/flow_api.c +++ b/drivers/net/ntnic/nthw/flow_api/flow_api.c @@ -7,6 +7,7 @@ #include "flow_api_nic_setup.h" #include "ntnic_mod_reg.h" +#include "flow_api.h" #include "flow_filter.h" const char *dbg_res_descr[] = { @@ -35,6 +36,24 @@ const char *dbg_res_descr[] = { static struct flow_nic_dev *dev_base; static pthread_mutex_t base_mtx = PTHREAD_MUTEX_INITIALIZER; +/* + * Resources + */ + +int flow_nic_alloc_resource(struct flow_nic_dev *ndev, enum res_type_e res_type, + uint32_t alignment) +{ + for (unsigned int i = 0; i < ndev->res[res_type].resource_count; i += alignment) { + if (!flow_nic_is_resource_used(ndev, res_type, i)) { + flow_nic_mark_resource_used(ndev, res_type, i); + ndev->res[res_type].ref[i] = 1; + return i; + } + } + + return -1; +} + void flow_nic_free_resource(struct flow_nic_dev *ndev, enum res_type_e res_type, int idx) { flow_nic_mark_resource_unused(ndev, res_type, idx); @@ -55,10 +74,60 @@ int flow_nic_deref_resource(struct flow_nic_dev *ndev, enum res_type_e res_type, return !!ndev->res[res_type].ref[index];/* if 0 resource has been freed */ } +/* + * Nic port/adapter lookup + */ + +static struct flow_eth_dev *nic_and_port_to_eth_dev(uint8_t adapter_no, uint8_t port) +{ + struct flow_nic_dev *nic_dev = dev_base; + + while (nic_dev) { + if (nic_dev->adapter_no == adapter_no) + break; + + nic_dev = nic_dev->next; + } + + if (!nic_dev) + return NULL; + + struct flow_eth_dev *dev = nic_dev->eth_base; + + while (dev) { + if (port == dev->port) + return dev; + + dev = dev->next; + } + + return NULL; +} + +static struct flow_nic_dev *get_nic_dev_from_adapter_no(uint8_t adapter_no) +{ + struct flow_nic_dev *ndev = dev_base; + + while (ndev) { + if (adapter_no == ndev->adapter_no) + break; + + ndev = ndev->next; + } + + return ndev; +} + /* * Device Management API */ +static void nic_insert_eth_port_dev(struct flow_nic_dev *ndev, struct flow_eth_dev *dev) +{ + dev->next = ndev->eth_base; + ndev->eth_base = dev; +} + static int nic_remove_eth_port_dev(struct flow_nic_dev *ndev, struct flow_eth_dev *eth_dev) { struct flow_eth_dev *dev = ndev->eth_base, *prev = NULL; @@ -242,6 +311,154 @@ static int list_remove_flow_nic(struct flow_nic_dev *ndev) return -1; } +/* + * adapter_no physical adapter no + * port_no local port no + * alloc_rx_queues number of rx-queues to allocate for this eth_dev + */ +static struct flow_eth_dev *flow_get_eth_dev(uint8_t adapter_no, uint8_t port_no, uint32_t port_id, + int alloc_rx_queues, struct flow_queue_id_s queue_ids[], + int *rss_target_id, enum flow_eth_dev_profile flow_profile, + uint32_t exception_path) +{ + const struct profile_inline_ops *profile_inline_ops = get_profile_inline_ops(); + + if (profile_inline_ops == NULL) + NT_LOG(ERR, FILTER, "%s: profile_inline module uninitialized", __func__); + + int i; + struct flow_eth_dev *eth_dev = NULL; + + NT_LOG(DBG, FILTER, + "Get eth-port adapter %i, port %i, port_id %u, rx queues %i, profile %i", + adapter_no, port_no, port_id, alloc_rx_queues, flow_profile); + + if (MAX_OUTPUT_DEST < FLOW_MAX_QUEUES) { + assert(0); + NT_LOG(ERR, FILTER, + "ERROR: Internal array for multiple queues too small for API"); + } + + pthread_mutex_lock(&base_mtx); + struct flow_nic_dev *ndev = get_nic_dev_from_adapter_no(adapter_no); + + if (!ndev) { + /* Error - no flow api found on specified adapter */ + NT_LOG(ERR, FILTER, "ERROR: no flow interface registered for adapter %d", + adapter_no); + pthread_mutex_unlock(&base_mtx); + return NULL; + } + + if (ndev->ports < ((uint16_t)port_no + 1)) { + NT_LOG(ERR, FILTER, "ERROR: port exceeds supported port range for adapter"); + pthread_mutex_unlock(&base_mtx); + return NULL; + } + + if ((alloc_rx_queues - 1) > FLOW_MAX_QUEUES) { /* 0th is exception so +1 */ + NT_LOG(ERR, FILTER, + "ERROR: Exceeds supported number of rx queues per eth device"); + pthread_mutex_unlock(&base_mtx); + return NULL; + } + + /* don't accept multiple eth_dev's on same NIC and same port */ + eth_dev = nic_and_port_to_eth_dev(adapter_no, port_no); + + if (eth_dev) { + NT_LOG(DBG, FILTER, "Re-opening existing NIC port device: NIC DEV: %i Port %i", + adapter_no, port_no); + pthread_mutex_unlock(&base_mtx); + flow_delete_eth_dev(eth_dev); + eth_dev = NULL; + } + + eth_dev = calloc(1, sizeof(struct flow_eth_dev)); + + if (!eth_dev) { + NT_LOG(ERR, FILTER, "ERROR: calloc failed"); + goto err_exit1; + } + + pthread_mutex_lock(&ndev->mtx); + + eth_dev->ndev = ndev; + eth_dev->port = port_no; + eth_dev->port_id = port_id; + + /* Allocate the requested queues in HW for this dev */ + + for (i = 0; i < alloc_rx_queues; i++) { +#ifdef SCATTER_GATHER + eth_dev->rx_queue[i] = queue_ids[i]; +#else + int queue_id = flow_nic_alloc_resource(ndev, RES_QUEUE, 1); + + if (queue_id < 0) { + NT_LOG(ERR, FILTER, "ERROR: no more free queue IDs in NIC"); + goto err_exit0; + } + + eth_dev->rx_queue[eth_dev->num_queues].id = (uint8_t)queue_id; + eth_dev->rx_queue[eth_dev->num_queues].hw_id = + ndev->be.iface->alloc_rx_queue(ndev->be.be_dev, + eth_dev->rx_queue[eth_dev->num_queues].id); + + if (eth_dev->rx_queue[eth_dev->num_queues].hw_id < 0) { + NT_LOG(ERR, FILTER, "ERROR: could not allocate a new queue"); + goto err_exit0; + } + + if (queue_ids) + queue_ids[eth_dev->num_queues] = eth_dev->rx_queue[eth_dev->num_queues]; +#endif + + if (i == 0 && (flow_profile == FLOW_ETH_DEV_PROFILE_INLINE && exception_path)) { + /* + * Init QSL UNM - unmatched - redirects otherwise discarded + * packets in QSL + */ + if (hw_mod_qsl_unmq_set(&ndev->be, HW_QSL_UNMQ_DEST_QUEUE, eth_dev->port, + eth_dev->rx_queue[0].hw_id) < 0) + goto err_exit0; + + if (hw_mod_qsl_unmq_set(&ndev->be, HW_QSL_UNMQ_EN, eth_dev->port, 1) < 0) + goto err_exit0; + + if (hw_mod_qsl_unmq_flush(&ndev->be, eth_dev->port, 1) < 0) + goto err_exit0; + } + + eth_dev->num_queues++; + } + + eth_dev->rss_target_id = -1; + + *rss_target_id = eth_dev->rss_target_id; + + nic_insert_eth_port_dev(ndev, eth_dev); + + pthread_mutex_unlock(&ndev->mtx); + pthread_mutex_unlock(&base_mtx); + return eth_dev; + +err_exit0: + pthread_mutex_unlock(&ndev->mtx); + pthread_mutex_unlock(&base_mtx); + +err_exit1: + if (eth_dev) + free(eth_dev); + +#ifdef FLOW_DEBUG + ndev->be.iface->set_debug_mode(ndev->be.be_dev, FLOW_BACKEND_DEBUG_MODE_NONE); +#endif + + NT_LOG(DBG, FILTER, "ERR in %s", __func__); + return NULL; /* Error exit */ +} + struct flow_nic_dev *flow_api_create(uint8_t adapter_no, const struct flow_api_backend_ops *be_if, void *be_dev) { @@ -383,6 +600,10 @@ void *flow_api_get_be_dev(struct flow_nic_dev *ndev) static const struct flow_filter_ops ops = { .flow_filter_init = flow_filter_init, .flow_filter_done = flow_filter_done, + /* + * Device Management API + */ + .flow_get_eth_dev = flow_get_eth_dev, }; void init_flow_filter(void) diff --git a/drivers/net/ntnic/ntnic_ethdev.c b/drivers/net/ntnic/ntnic_ethdev.c index bff893ec7a..510c0e5d23 100644 --- a/drivers/net/ntnic/ntnic_ethdev.c +++ b/drivers/net/ntnic/ntnic_ethdev.c @@ -1355,6 +1355,13 @@ static const struct eth_dev_ops nthw_eth_dev_ops = { static int nthw_pci_dev_init(struct rte_pci_device *pci_dev) { + const struct flow_filter_ops *flow_filter_ops = get_flow_filter_ops(); + + if (flow_filter_ops == NULL) { + NT_LOG_DBGX(ERR, NTNIC, "flow_filter module uninitialized"); + /* Return statement is not necessary here to allow traffic processing by SW */ + } + nt_vfio_init(); const struct port_ops *port_ops = get_port_ops(); @@ -1378,10 +1385,13 @@ nthw_pci_dev_init(struct rte_pci_device *pci_dev) uint32_t n_port_mask = -1; /* All ports enabled by default */ uint32_t nb_rx_queues = 1; uint32_t nb_tx_queues = 1; + uint32_t exception_path = 0; struct flow_queue_id_s queue_ids[MAX_QUEUES]; int n_phy_ports; struct port_link_speed pls_mbps[NUM_ADAPTER_PORTS_MAX] = { 0 }; int num_port_speeds = 0; + enum flow_eth_dev_profile profile = FLOW_ETH_DEV_PROFILE_INLINE; + NT_LOG_DBGX(DBG, NTNIC, "Dev %s PF #%i Init : %02x:%02x:%i", pci_dev->name, pci_dev->addr.function, pci_dev->addr.bus, pci_dev->addr.devid, pci_dev->addr.function); @@ -1681,6 +1691,18 @@ nthw_pci_dev_init(struct rte_pci_device *pci_dev) return -1; } + if (flow_filter_ops != NULL) { + internals->flw_dev = flow_filter_ops->flow_get_eth_dev(0, n_intf_no, + eth_dev->data->port_id, nb_rx_queues, queue_ids, + &internals->txq_scg[0].rss_target_id, profile, exception_path); + + if (!internals->flw_dev) { + NT_LOG(ERR, NTNIC, + "Error creating port. Resource exhaustion in HW"); + return -1; + } + } + /* connect structs */ internals->p_drv = p_drv; eth_dev->data->dev_private = internals; diff --git a/drivers/net/ntnic/ntnic_mod_reg.c b/drivers/net/ntnic/ntnic_mod_reg.c index a03c97801b..ac8afdef6a 100644 --- a/drivers/net/ntnic/ntnic_mod_reg.c +++ b/drivers/net/ntnic/ntnic_mod_reg.c @@ -118,6 +118,11 @@ const struct flow_backend_ops *get_flow_backend_ops(void) return flow_backend_ops; } +const struct profile_inline_ops *get_profile_inline_ops(void) +{ + return NULL; +} + static const struct flow_filter_ops *flow_filter_ops; void register_flow_filter_ops(const struct flow_filter_ops *ops) diff --git a/drivers/net/ntnic/ntnic_mod_reg.h b/drivers/net/ntnic/ntnic_mod_reg.h index 5b97b3d8ac..017d15d7bc 100644 --- a/drivers/net/ntnic/ntnic_mod_reg.h +++ b/drivers/net/ntnic/ntnic_mod_reg.h @@ -8,6 +8,7 @@ #include #include "flow_api.h" +#include "stream_binary_flow_api.h" #include "nthw_fpga_model.h" #include "nthw_platform_drv.h" #include "nthw_drv.h" @@ -223,10 +224,23 @@ void register_flow_backend_ops(const struct flow_backend_ops *ops); const struct flow_backend_ops *get_flow_backend_ops(void); void flow_backend_init(void); +const struct profile_inline_ops *get_profile_inline_ops(void); + struct flow_filter_ops { int (*flow_filter_init)(nthw_fpga_t *p_fpga, struct flow_nic_dev **p_flow_device, int adapter_no); int (*flow_filter_done)(struct flow_nic_dev *dev); + /* + * Device Management API + */ + struct flow_eth_dev *(*flow_get_eth_dev)(uint8_t adapter_no, + uint8_t hw_port_no, + uint32_t port_id, + int alloc_rx_queues, + struct flow_queue_id_s queue_ids[], + int *rss_target_id, + enum flow_eth_dev_profile flow_profile, + uint32_t exception_path); }; void register_flow_filter_ops(const struct flow_filter_ops *ops); -- 2.45.0