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 E779545ACC; Sun, 6 Oct 2024 22:41:06 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id B39CE40E13; Sun, 6 Oct 2024 22:38:19 +0200 (CEST) Received: from egress-ip42b.ess.de.barracuda.com (egress-ip42b.ess.de.barracuda.com [18.185.115.246]) by mails.dpdk.org (Postfix) with ESMTP id E967240A76 for ; Sun, 6 Oct 2024 22:37:56 +0200 (CEST) Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05lp2107.outbound.protection.outlook.com [104.47.18.107]) by mx-outbound22-159.eu-central-1b.ess.aws.cudaops.com (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sun, 06 Oct 2024 20:37:55 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=uFagtTu0olMZZyi5mQ7iAOJ9XZzk5rAbwrOUWpek9y1aaP0Fa63jNciMsShqqg0MPYpgIu3E39/0C3Zp32V0sISOA4bkB3VpdDLiy29JywE3AbKodYATuhDK0KlxFmxZ6f3Bw8JLQPv7QxgwxlFwByiTKnBhab67xGsyYDxXoxwtTylm2TPrbv3uYsAW1VBLc4temRl4DQYzuUoyVoghUZyRhU9gS3r4xsxfYXdlsgLzUonaxF1hWelJhCnrSVs0uV6Mh5vbmaLnhmCRzmvK3r9CGD0UPQ3zyiKG1cNfiPvJtZEu1GAMc0uKWSaM6xqaZsnvL0WOKJZCP7inVx0Oeg== 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=7fSrAPbIXCZWRqzpYyQASISpbewcK9OD37S8nc/SOqg=; b=PPgpzcH1I4l1ttmq7IGnA0tYPhHknLNX0ewgX7UJDltTxIMu6NHGgDIGkpnxbCVUh+dOMSneZIROP1M/C+9wtrYAsTL0GuyczfaFb86oKlozSs/T4xK7Ma2hs3gagc0WdfYHYa2CfzQ0WAzKQP4n2caImMoeHK5K3kNzw07Cw8GDbzdCH4Q+UIkNYwmbsHLQIq53H2R4BM29lX6FafcTYBp++jsa4iHysZ246GsDdRTntLaGU9QxTBHdcY6vfkh6JJngT3MbC/iqGURLx5+RDtfeQsWBRj2gJdcWLv1CK1a+hbmf4ik+JAhXWqjtWDYrUaBskyYMlYjz4KIxOiPadQ== 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=7fSrAPbIXCZWRqzpYyQASISpbewcK9OD37S8nc/SOqg=; b=RE5FBH1t25m0d8wnTNbCXio7PzHb0cSG8dysdbnO3Oz7qDisObUQowQiyiWko9azNBp8cYJZMAVXwoJXkOrBPl/5Tcn/BkbjL1KfZFFeqCBjeSV+lZ0GEkJA8jafM6l3TIMertIws3SiKOsR3kbUY1ip1gwrAd4XMYhMau4JRgM= Received: from AM6PR04CA0007.eurprd04.prod.outlook.com (2603:10a6:20b:92::20) by GV1P190MB2019.EURP190.PROD.OUTLOOK.COM (2603:10a6:150:5b::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8026.20; Sun, 6 Oct 2024 20:37:52 +0000 Received: from AMS0EPF00000190.eurprd05.prod.outlook.com (2603:10a6:20b:92:cafe::96) by AM6PR04CA0007.outlook.office365.com (2603:10a6:20b:92::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8026.20 via Frontend Transport; Sun, 6 Oct 2024 20:37:51 +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 AMS0EPF00000190.mail.protection.outlook.com (10.167.16.213) with Microsoft SMTP Server id 15.20.7918.13 via Frontend Transport; Sun, 6 Oct 2024 20:37:51 +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, Oleksandr Kolomeiets Subject: [PATCH v1 26/50] net/ntnic: add base init and deinit of the NT flow API Date: Sun, 6 Oct 2024 22:36:53 +0200 Message-ID: <20241006203728.330792-27-sil-plv@napatech.com> X-Mailer: git-send-email 2.45.0 In-Reply-To: <20241006203728.330792-1-sil-plv@napatech.com> References: <20241006203728.330792-1-sil-plv@napatech.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AMS0EPF00000190:EE_|GV1P190MB2019:EE_ Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: ce853c7e-d1d6-4002-326e-08dce646bfc7 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|82310400026|1800799024|376014|36860700013; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?/uia3/X3Q7a170oDHO9TaiPHc5+1P0ITYOu7eO+zRndHMYhpvU+6wgra/m6m?= =?us-ascii?Q?bmP5MbaxQN9shTVQ5508t+ZZzT86alm5CgO629tnf6PDa5SMDMPVfYrUHJYg?= =?us-ascii?Q?nzZFA2nvo6uAak7sxFKKJXHHpS5GgTynxL3Idzd7tDq6iFFpA4NysOhE2mXJ?= =?us-ascii?Q?XzAnUl3WdqZtmOLjcGkcQ+WVqQqelPP4QPqFiz10WjJ3vfRYD0aCKwJRGIlG?= =?us-ascii?Q?jCoRb3sFTxw3MaXPKXLGxhJLwZmo6YnDd6fX6BdmyGliDOKk8lYCU2oqMe4z?= =?us-ascii?Q?QRuq4QGaB1CSDQCqc+XniTrzh2yFrjbeW1M6vI3YiKDge1aV2j+bG2gUXk1Z?= =?us-ascii?Q?ldubKoyr8moFvSTkzDs+7LuoOecieSbnLMjpO++T5Pl0RJ7HKhYwEOWcYXeu?= =?us-ascii?Q?3ARo4F2jferszUYAJzy7vwq7TLmruz4U6zxfDlWnSM4qKtcBy0VLetqE1FPc?= =?us-ascii?Q?S6SUkIxOcOyrtqByn6EVtrllrbTYtKPTz4RA6vHc2rWwKGUmi4gYEQr3lqNY?= =?us-ascii?Q?sD1dfOnEprPhZVqS2hwinbLyRX8ZCID7v/v1wA3wAFBGYSAECXYzUy8aucIO?= =?us-ascii?Q?O5hC3tIjw6cxKASHQtgsg8OivOlfeOGZ/YyeMGh7vTasnNsgnMulxv5IvDJg?= =?us-ascii?Q?GeWJyoLQepxtPC6wuvkfZ/OPZM1I8s/GsbGZPtcs98FJEzDakNARqHtwTEdp?= =?us-ascii?Q?9KMwKdiV6cZF2KwN9W/IM4Rv3CgP7+Dl/5bGsKGHUkKmryM0aVWaY8CPYVBg?= =?us-ascii?Q?oTRsa85D3jmZm0MCR+CJyWFsN8UUSPAC3wdB3RnYJVHPPLg8lPv5AD/LX0lN?= =?us-ascii?Q?nlHaibkTX/s3Dj/1uOdo9XUUqJvpMRbaAerBFqNdzYnB5twliWbTpwSeYxvM?= =?us-ascii?Q?rSrYqaHOQ02RPoGyVdLBssgAeJpThq/iwxot3X5I4UVx8uSPuKSJB/tYcHS4?= =?us-ascii?Q?nqB5DQHkyzBistcx0eFA9UJ7IcoLKeEvh4yVuBfVCVIit4Hlm+Bc2P78/do8?= =?us-ascii?Q?/nCvKHhk5s2fUBFXf6dR1TzZwNKh3lNuCbzsEhiAKtjYxVX9Jr8VDqOOuqt8?= =?us-ascii?Q?5nAOHMeJ4wSLiNoSfvSixpgV53Xp3oBjDtF0fUaIbA6m0QX+chtAZjFy7al7?= =?us-ascii?Q?btiRnWY2aR8E4by5hu7QKH31vop3+ZjP4LAHiX0sXIkOBUNhcGtREiykK+qj?= =?us-ascii?Q?Ae1bjY412JwKOlX7R0ko1wMmps4saMPSAcI7F1RpKwP0DnJ/XJIR/qjgCVYF?= =?us-ascii?Q?Upfh79h3praCo55c2J9/1RpdmQQgI23JiBZK622mPBQCxSG2X8V8AYn+dJaL?= =?us-ascii?Q?8ZHwbkPf3Ys4mPhln1mZJod9QZb5WXlYN3OxvHJhr9dtOoHVS2uXdrFfMlvv?= =?us-ascii?Q?dnl6VJP6Onn7OZmzj/Ow5i/JfZhT?= 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)(82310400026)(1800799024)(376014)(36860700013); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: QwTtQ9rhmg6W/Zyc8lFqeSEZYLsVXDl8zpOyfogM/zQxYYlEOn/FY4xN3OHXVC8vSIZzqssAylqv6fcgomCeH0tPwIGmK+EysFIpMti3w5GkWX82l0mb0/eV89WqfwhMie4vd/4hEKB5yQG48Frxv79h8nEfOpVWAQWFRieKGj8g4oBq0u8CSAcVdLMnoadYc7mNVFl+YSqaMs5DbnJOoymn3J6d0Y3T4zkTtbNlB/qwHelIBxUjFEEu5juaufJtISU66L0tbSbSdEEJfMbEggvMd9aPL4KrwE7Xj+fBlrsRf7FP4w2WLbYgyJ8To5EQbQuQsY+0Wgf4byitXzifw6nW+8eH6AxGNp7nuf+GHh3ll+cH34Rm3LezmGDoP5KKywuoIc5swe0OuS79qG+MlkI+wsOUhAcy6A8N3MUcZYQw90K8qtTEEq1TBjr9Tv+NByotd5wDpn2oFUG5xE51Z1ITXlgZQY1MWKbavinGSh8mf14hNDaGK8ZIzswwI+O0h0h+RbAk1jgtSkm3fKuIAaV7+WH3EOrvEV67t8n678vI3pnDgRYNeH4Tb+mlAJtpazCI6hYpql6upq53E283c/yQBrGugHig6Eu+aMWlPHwaHyK6B3ML+wDShwr0i0mzl7wIAd1RRprPA+pHNqW5ug== X-OriginatorOrg: napatech.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Oct 2024 20:37:51.7963 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: ce853c7e-d1d6-4002-326e-08dce646bfc7 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: AMS0EPF00000190.eurprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV1P190MB2019 X-BESS-ID: 1728247075-305791-12645-147785-1 X-BESS-VER: 2019.1_20240924.1654 X-BESS-Apparent-Source-IP: 104.47.18.107 X-BESS-Parts: H4sIAAAAAAACA4uuVkqtKFGyUioBkjpK+cVKVobmhiZGQGYGUNTEJCUt1cLUMM UsxSDRIMU4Mc0kOS3RyMjMxDQ1NcnAUqk2FgDeqWUbQgAAAA== X-BESS-Outbound-Spam-Score: 0.00 X-BESS-Outbound-Spam-Report: Code version 3.2, rules version 3.2.2.259547 [from cloudscan15-206.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: Oleksandr Kolomeiets Add basic API for initialization resources required by flow filter API Signed-off-by: Oleksandr Kolomeiets --- drivers/net/ntnic/include/flow_api.h | 82 ++++++ drivers/net/ntnic/include/flow_api_engine.h | 43 +++ drivers/net/ntnic/include/hw_mod_backend.h | 3 + .../ntnic/include/stream_binary_flow_api.h | 22 ++ drivers/net/ntnic/meson.build | 2 + drivers/net/ntnic/nthw/flow_api/flow_api.c | 245 ++++++++++++++++++ .../ntnic/nthw/flow_api/flow_api_nic_setup.h | 6 + drivers/net/ntnic/nthw/flow_api/flow_filter.c | 17 +- drivers/net/ntnic/nthw/flow_api/flow_kcc.c | 19 ++ drivers/net/ntnic/nthw/flow_api/flow_km.c | 19 ++ 10 files changed, 453 insertions(+), 5 deletions(-) create mode 100644 drivers/net/ntnic/include/flow_api_engine.h create mode 100644 drivers/net/ntnic/include/stream_binary_flow_api.h create mode 100644 drivers/net/ntnic/nthw/flow_api/flow_kcc.c create mode 100644 drivers/net/ntnic/nthw/flow_api/flow_km.c diff --git a/drivers/net/ntnic/include/flow_api.h b/drivers/net/ntnic/include/flow_api.h index 6a2277c2ca..bad1f72868 100644 --- a/drivers/net/ntnic/include/flow_api.h +++ b/drivers/net/ntnic/include/flow_api.h @@ -6,14 +6,96 @@ #ifndef _FLOW_API_H_ #define _FLOW_API_H_ +#include + #include "ntlog.h" +#include "flow_api_engine.h" #include "hw_mod_backend.h" +#include "stream_binary_flow_api.h" + +/* + * Flow NIC and Eth port device management + */ + +struct hw_mod_resource_s { + uint8_t *alloc_bm; /* allocation bitmap */ + uint32_t *ref; /* reference counter for each resource element */ + uint32_t resource_count;/* number of total available entries */ +}; + +/* + * Device Management API + */ +int flow_delete_eth_dev(struct flow_eth_dev *eth_dev); + +struct flow_eth_dev { + /* NIC that owns this port device */ + struct flow_nic_dev *ndev; + /* NIC port id */ + uint8_t port; + + /* 0th for exception */ + struct flow_queue_id_s rx_queue[FLOW_MAX_QUEUES + 1]; + + /* VSWITCH has exceptions sent on queue 0 per design */ + int num_queues; + + struct flow_eth_dev *next; +}; /* registered NIC backends */ struct flow_nic_dev { + struct hw_mod_resource_s res[RES_COUNT];/* raw NIC resource allocation table */ + void *km_res_handle; + void *kcc_res_handle; + + uint32_t flow_unique_id_counter; + /* linked list of all flows created on this NIC */ + struct flow_handle *flow_base; + /* NIC backend API */ struct flow_api_backend_s be; + /* linked list of created eth-port devices on this NIC */ + struct flow_eth_dev *eth_base; + pthread_mutex_t mtx; + + /* next NIC linked list */ + struct flow_nic_dev *next; }; +/* + * Resources + */ + +extern const char *dbg_res_descr[]; + +#define flow_nic_unset_bit(arr, x) \ + do { \ + size_t _temp_x = (x); \ + arr[_temp_x / 8] &= (uint8_t)(~(1 << (_temp_x % 8))); \ + } while (0) + +#define flow_nic_is_bit_set(arr, x) \ + ({ \ + size_t _temp_x = (x); \ + (arr[_temp_x / 8] & (uint8_t)(1 << (_temp_x % 8))); \ + }) + +#define flow_nic_mark_resource_unused(_ndev, res_type, index) \ + do { \ + typeof(res_type) _temp_res_type = (res_type); \ + size_t _temp_index = (index); \ + NT_LOG(DBG, FILTER, "mark resource unused: %s idx %zu\n", \ + dbg_res_descr[_temp_res_type], _temp_index); \ + flow_nic_unset_bit((_ndev)->res[_temp_res_type].alloc_bm, _temp_index); \ + } while (0) + +#define flow_nic_is_resource_used(_ndev, res_type, index) \ + (!!flow_nic_is_bit_set((_ndev)->res[res_type].alloc_bm, index)) + +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); + #endif diff --git a/drivers/net/ntnic/include/flow_api_engine.h b/drivers/net/ntnic/include/flow_api_engine.h new file mode 100644 index 0000000000..724b68c3e8 --- /dev/null +++ b/drivers/net/ntnic/include/flow_api_engine.h @@ -0,0 +1,43 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2023 Napatech A/S + */ + +#ifndef _FLOW_API_ENGINE_H_ +#define _FLOW_API_ENGINE_H_ + +/* + * Resource management + * These are free resources in FPGA + * Other FPGA memory lists are linked to one of these + * and will implicitly follow them + */ +enum res_type_e { + RES_QUEUE, + RES_CAT_CFN, + RES_CAT_COT, + RES_CAT_EXO, + RES_CAT_LEN, + RES_KM_FLOW_TYPE, + RES_KM_CATEGORY, + RES_HSH_RCP, + RES_PDB_RCP, + RES_QSL_RCP, + RES_QSL_QST, + RES_SLC_LR_RCP, + + RES_FLM_FLOW_TYPE, + RES_FLM_RCP, + RES_TPE_RCP, + RES_TPE_EXT, + RES_TPE_RPL, + RES_SCRUB_RCP, + RES_COUNT, + RES_INVALID +}; + +void km_free_ndev_resource_management(void **handle); + +void kcc_free_ndev_resource_management(void **handle); + +#endif /* _FLOW_API_ENGINE_H_ */ diff --git a/drivers/net/ntnic/include/hw_mod_backend.h b/drivers/net/ntnic/include/hw_mod_backend.h index 29c33306d1..3c6c15c896 100644 --- a/drivers/net/ntnic/include/hw_mod_backend.h +++ b/drivers/net/ntnic/include/hw_mod_backend.h @@ -8,6 +8,8 @@ #include +#include "ntlog.h" + #include "hw_mod_cat_v18.h" #include "hw_mod_cat_v21.h" #include "hw_mod_flm_v25.h" @@ -275,6 +277,7 @@ struct flow_api_backend_ops { struct flow_api_backend_s { void *be_dev; + const struct flow_api_backend_ops *iface; }; #endif /* _HW_MOD_BACKEND_H_ */ diff --git a/drivers/net/ntnic/include/stream_binary_flow_api.h b/drivers/net/ntnic/include/stream_binary_flow_api.h new file mode 100644 index 0000000000..10529b8843 --- /dev/null +++ b/drivers/net/ntnic/include/stream_binary_flow_api.h @@ -0,0 +1,22 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2023 Napatech A/S + */ + +#ifndef _STREAM_BINARY_FLOW_API_H_ +#define _STREAM_BINARY_FLOW_API_H_ + +/* + * Flow frontend for binary programming interface + */ + +#define FLOW_MAX_QUEUES 128 + +struct flow_queue_id_s { + int id; + int hw_id; +}; + +struct flow_eth_dev; /* port device */ + +#endif /* _STREAM_BINARY_FLOW_API_H_ */ diff --git a/drivers/net/ntnic/meson.build b/drivers/net/ntnic/meson.build index e236b82b36..15549e1c94 100644 --- a/drivers/net/ntnic/meson.build +++ b/drivers/net/ntnic/meson.build @@ -46,6 +46,8 @@ sources = files( 'nthw/flow_api/flow_api.c', 'nthw/flow_api/flow_backend/flow_backend.c', 'nthw/flow_api/flow_filter.c', + 'nthw/flow_api/flow_kcc.c', + 'nthw/flow_api/flow_km.c', 'nthw/flow_filter/flow_nthw_cat.c', 'nthw/flow_filter/flow_nthw_csu.c', 'nthw/flow_filter/flow_nthw_flm.c', diff --git a/drivers/net/ntnic/nthw/flow_api/flow_api.c b/drivers/net/ntnic/nthw/flow_api/flow_api.c index 9671a20e0b..92b8d083e0 100644 --- a/drivers/net/ntnic/nthw/flow_api/flow_api.c +++ b/drivers/net/ntnic/nthw/flow_api/flow_api.c @@ -3,11 +3,256 @@ * Copyright(c) 2023 Napatech A/S */ +#include "flow_api_engine.h" #include "flow_api_nic_setup.h" #include "ntnic_mod_reg.h" #include "flow_filter.h" +const char *dbg_res_descr[] = { + /* RES_QUEUE */ "RES_QUEUE", + /* RES_CAT_CFN */ "RES_CAT_CFN", + /* RES_CAT_COT */ "RES_CAT_COT", + /* RES_CAT_EXO */ "RES_CAT_EXO", + /* RES_CAT_LEN */ "RES_CAT_LEN", + /* RES_KM_FLOW_TYPE */ "RES_KM_FLOW_TYPE", + /* RES_KM_CATEGORY */ "RES_KM_CATEGORY", + /* RES_HSH_RCP */ "RES_HSH_RCP", + /* RES_PDB_RCP */ "RES_PDB_RCP", + /* RES_QSL_RCP */ "RES_QSL_RCP", + /* RES_QSL_LTX */ "RES_QSL_LTX", + /* RES_QSL_QST */ "RES_QSL_QST", + /* RES_SLC_LR_RCP */ "RES_SLC_LR_RCP", + /* RES_FLM_FLOW_TYPE */ "RES_FLM_FLOW_TYPE", + /* RES_FLM_RCP */ "RES_FLM_RCP", + /* RES_TPE_RCP */ "RES_TPE_RCP", + /* RES_TPE_EXT */ "RES_TPE_EXT", + /* RES_TPE_RPL */ "RES_TPE_RPL", + /* RES_COUNT */ "RES_COUNT", + /* RES_INVALID */ "RES_INVALID" +}; + +static struct flow_nic_dev *dev_base; +static pthread_mutex_t base_mtx = PTHREAD_MUTEX_INITIALIZER; + +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); +} + +int flow_nic_deref_resource(struct flow_nic_dev *ndev, enum res_type_e res_type, int index) +{ + NT_LOG(DBG, FILTER, "De-reference resource %s idx %i (before ref cnt %i)\n", + dbg_res_descr[res_type], index, ndev->res[res_type].ref[index]); + assert(flow_nic_is_resource_used(ndev, res_type, index)); + assert(ndev->res[res_type].ref[index]); + /* deref */ + ndev->res[res_type].ref[index]--; + + if (!ndev->res[res_type].ref[index]) + flow_nic_free_resource(ndev, res_type, index); + + return !!ndev->res[res_type].ref[index];/* if 0 resource has been freed */ +} + +/* + * Device Management API + */ + +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; + + while (dev) { + if (dev == eth_dev) { + if (prev) + prev->next = dev->next; + + else + ndev->eth_base = dev->next; + + return 0; + } + + prev = dev; + dev = dev->next; + } + + return -1; +} + +static void flow_ndev_reset(struct flow_nic_dev *ndev) +{ + /* Delete all eth-port devices created on this NIC device */ + while (ndev->eth_base) + flow_delete_eth_dev(ndev->eth_base); + + km_free_ndev_resource_management(&ndev->km_res_handle); + kcc_free_ndev_resource_management(&ndev->kcc_res_handle); + + ndev->flow_unique_id_counter = 0; + +#ifdef FLOW_DEBUG + /* + * free all resources default allocated, initially for this NIC DEV + * Is not really needed since the bitmap will be freed in a sec. Therefore + * only in debug mode + */ + + /* Check if all resources has been released */ + NT_LOG(DBG, FILTER, "Delete NIC DEV Adaptor %i\n", ndev->adapter_no); + + for (unsigned int i = 0; i < RES_COUNT; i++) { + int err = 0; +#if defined(FLOW_DEBUG) + NT_LOG(DBG, FILTER, "RES state for: %s\n", dbg_res_descr[i]); +#endif + + for (unsigned int ii = 0; ii < ndev->res[i].resource_count; ii++) { + int ref = ndev->res[i].ref[ii]; + int used = flow_nic_is_resource_used(ndev, i, ii); + + if (ref || used) { + NT_LOG(DBG, FILTER, " [%i]: ref cnt %i, used %i\n", ii, ref, + used); + err = 1; + } + } + + if (err) + NT_LOG(DBG, FILTER, "ERROR - some resources not freed\n"); + } + +#endif +} + +int flow_delete_eth_dev(struct flow_eth_dev *eth_dev) +{ + struct flow_nic_dev *ndev = eth_dev->ndev; + + if (!ndev) { + /* Error invalid nic device */ + return -1; + } + + NT_LOG(DBG, FILTER, "Delete eth-port device %p, port %i\n", eth_dev, eth_dev->port); + +#ifdef FLOW_DEBUG + ndev->be.iface->set_debug_mode(ndev->be.be_dev, FLOW_BACKEND_DEBUG_MODE_WRITE); +#endif + + /* delete all created flows from this device */ + pthread_mutex_lock(&ndev->mtx); + +#ifdef FLOW_DEBUG + ndev->be.iface->set_debug_mode(ndev->be.be_dev, FLOW_BACKEND_DEBUG_MODE_NONE); +#endif + +#ifndef SCATTER_GATHER + + /* free rx queues */ + for (int i = 0; i < eth_dev->num_queues; i++) { + ndev->be.iface->free_rx_queue(ndev->be.be_dev, eth_dev->rx_queue[i].hw_id); + flow_nic_deref_resource(ndev, RES_QUEUE, eth_dev->rx_queue[i].id); + } + +#endif + + /* take eth_dev out of ndev list */ + if (nic_remove_eth_port_dev(ndev, eth_dev) != 0) + NT_LOG(ERR, FILTER, "ERROR : eth_dev %p not found\n", eth_dev); + + pthread_mutex_unlock(&ndev->mtx); + + /* free eth_dev */ + free(eth_dev); + + return 0; +} + +/* + * Flow API NIC Setup + * Flow backend creation function - register and initialize common backend API to FPA modules + */ + +static void done_resource_elements(struct flow_nic_dev *ndev, enum res_type_e res_type) +{ + assert(ndev); + + if (ndev->res[res_type].alloc_bm) + free(ndev->res[res_type].alloc_bm); +} + +static int list_remove_flow_nic(struct flow_nic_dev *ndev) +{ + pthread_mutex_lock(&base_mtx); + struct flow_nic_dev *nic_dev = dev_base, *prev = NULL; + + while (nic_dev) { + if (nic_dev == ndev) { + if (prev) + prev->next = nic_dev->next; + + else + dev_base = nic_dev->next; + + pthread_mutex_unlock(&base_mtx); + return 0; + } + + prev = nic_dev; + nic_dev = nic_dev->next; + } + + pthread_mutex_unlock(&base_mtx); + return -1; +} + +struct flow_nic_dev *flow_api_create(uint8_t adapter_no, const struct flow_api_backend_ops *be_if, + void *be_dev) +{ + (void)adapter_no; + + if (!be_if || be_if->version != 1) { + NT_LOG(DBG, FILTER, "ERR: %s\n", __func__); + return NULL; + } + + struct flow_nic_dev *ndev = calloc(1, sizeof(struct flow_nic_dev)); + + if (!ndev) { + NT_LOG(ERR, FILTER, "ERROR: calloc failed\n"); + return NULL; + } + + /* + * To dump module initialization writes use + * FLOW_BACKEND_DEBUG_MODE_WRITE + * then remember to set it ...NONE afterwards again + */ + be_if->set_debug_mode(be_dev, FLOW_BACKEND_DEBUG_MODE_NONE); + + return ndev; +} + +int flow_api_done(struct flow_nic_dev *ndev) +{ + NT_LOG(DBG, FILTER, "FLOW API DONE\n"); + + if (ndev) { + flow_ndev_reset(ndev); + + /* delete resource management allocations for this ndev */ + for (int i = 0; i < RES_COUNT; i++) + done_resource_elements(ndev, i); + + list_remove_flow_nic(ndev); + free(ndev); + } + + return 0; +} + void *flow_api_get_be_dev(struct flow_nic_dev *ndev) { if (!ndev) { diff --git a/drivers/net/ntnic/nthw/flow_api/flow_api_nic_setup.h b/drivers/net/ntnic/nthw/flow_api/flow_api_nic_setup.h index da083f050a..eeb070c569 100644 --- a/drivers/net/ntnic/nthw/flow_api/flow_api_nic_setup.h +++ b/drivers/net/ntnic/nthw/flow_api/flow_api_nic_setup.h @@ -9,6 +9,12 @@ #include "hw_mod_backend.h" #include "flow_api.h" +/* + * Flow capable NIC backend - creating flow api instance for adapter nr (backend) + */ +struct flow_nic_dev *flow_api_create(uint8_t adapter_no, const struct flow_api_backend_ops *be_if, + void *be_dev); +int flow_api_done(struct flow_nic_dev *dev); void *flow_api_get_be_dev(struct flow_nic_dev *dev); #endif /* __FLOW_API_NIC_SETUP_H__ */ diff --git a/drivers/net/ntnic/nthw/flow_api/flow_filter.c b/drivers/net/ntnic/nthw/flow_api/flow_filter.c index e822ba7df9..69e5972f5d 100644 --- a/drivers/net/ntnic/nthw/flow_api/flow_filter.c +++ b/drivers/net/ntnic/nthw/flow_api/flow_filter.c @@ -9,10 +9,8 @@ int flow_filter_init(nthw_fpga_t *p_fpga, struct flow_nic_dev **p_flow_device, int adapter_no) { - (void)p_flow_device; - (void)adapter_no; - void *be_dev = NULL; + struct flow_nic_dev *flow_nic; const struct flow_backend_ops *flow_backend_ops = get_flow_backend_ops(); @@ -22,8 +20,17 @@ int flow_filter_init(nthw_fpga_t *p_fpga, struct flow_nic_dev **p_flow_device, i } NT_LOG(DBG, FILTER, "Initializing flow filter api\n"); - flow_backend_ops->bin_flow_backend_init(p_fpga, &be_dev); + const struct flow_api_backend_ops *iface = + flow_backend_ops->bin_flow_backend_init(p_fpga, &be_dev); + + flow_nic = flow_api_create((uint8_t)adapter_no, iface, be_dev); + + if (!flow_nic) { + *p_flow_device = NULL; + return -1; + } + *p_flow_device = flow_nic; return 0; } @@ -31,7 +38,7 @@ int flow_filter_done(struct flow_nic_dev *dev) { void *be_dev = flow_api_get_be_dev(dev); - int res = 0; + int res = flow_api_done(dev); if (be_dev) { const struct flow_backend_ops *flow_backend_ops = get_flow_backend_ops(); diff --git a/drivers/net/ntnic/nthw/flow_api/flow_kcc.c b/drivers/net/ntnic/nthw/flow_api/flow_kcc.c new file mode 100644 index 0000000000..dc5e5474c1 --- /dev/null +++ b/drivers/net/ntnic/nthw/flow_api/flow_kcc.c @@ -0,0 +1,19 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2023 Napatech A/S + */ + +#include + +#include "hw_mod_backend.h" +#include "flow_api_engine.h" + +void kcc_free_ndev_resource_management(void **handle) +{ + if (*handle) { + free(*handle); + NT_LOG(DBG, FILTER, "Free NIC DEV KCC-CAM record manager\n"); + } + + *handle = NULL; +} diff --git a/drivers/net/ntnic/nthw/flow_api/flow_km.c b/drivers/net/ntnic/nthw/flow_api/flow_km.c new file mode 100644 index 0000000000..1ba7ed7da2 --- /dev/null +++ b/drivers/net/ntnic/nthw/flow_api/flow_km.c @@ -0,0 +1,19 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2023 Napatech A/S + */ + +#include + +#include "hw_mod_backend.h" +#include "flow_api_engine.h" + +void km_free_ndev_resource_management(void **handle) +{ + if (*handle) { + free(*handle); + NT_LOG(DBG, FILTER, "Free NIC DEV CAM and TCAM record manager\n"); + } + + *handle = NULL; +} -- 2.45.0