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 5128645AAF; Fri, 4 Oct 2024 17:14:52 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2299542E9E; Fri, 4 Oct 2024 17:09:10 +0200 (CEST) Received: from egress-ip42a.ess.de.barracuda.com (egress-ip42a.ess.de.barracuda.com [18.185.115.201]) by mails.dpdk.org (Postfix) with ESMTP id 88C1142DA6 for ; Fri, 4 Oct 2024 17:08:40 +0200 (CEST) Received: from EUR02-AM0-obe.outbound.protection.outlook.com (mail-am0eur02lp2233.outbound.protection.outlook.com [104.47.11.233]) by mx-outbound8-201.eu-central-1a.ess.aws.cudaops.com (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Fri, 04 Oct 2024 15:08:39 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=eq847aGUE7pdy3Lb4I/rimPeJwxDbQ1OprvMKF5EjRp71h4sLyzph4UsBviWVyUEoS7tC9Ma70RO/vxQ+7JIT3s9ECFQw8P2wbnQmhwCUJm/SDbR/UqVkGDw+FvwhIzF1nkjnVdJvzgPzUS5djOwVZ9o3sPRgwAFkzbW4R6mBw0Pcdir4ScyveaXCRmMpgcoY9x87FUjtOIjHcngWcOk+01RrCEZGlrWIQOZ1XqAYdVtb29zPScOWZ9X4fIYgZpHx4oAieV+HsN1hyXTowSwD/nX/Kevg0Dt+TOItxfCUm8pU/B1Z1jXspyJPf5bN3//CffQXNLcSL8xiBriAsftsA== 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=Kf5W40MjFUjUahx7DUtinZAxpybiLZ1LtQAFOHSJ3Co=; b=YuSOYZ1AepVIciHeryyOQH4mpAcdfhfxT/23FGr1otvqu85OBQ17uFN0YBRCXrotRWm+h/8VZ9gwFWlQzEy3/MKsyVAY0aE7OqYxtx/iSlcjKV0P+dsP/adv1TsdxHM7UF60ltaa4+WbLeG11200LGKyIyjq8uILdw2sSy5su2VvauOT1X7THDDLkI/lLCQy3aV0wfoH3KSXQlk3/nVr9afy1/LwKy5cxhXx1dFwO49i0Td7nobJ7o3BdwJuxW2RfUvTlTYnnjXBftOWxCli6E+1zGkPKlYKww41uCF3e5uHS2sT5AOmbmMFWpkCDAPZF6K+4Ee81y4iaW8ZEVDUIg== 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=Kf5W40MjFUjUahx7DUtinZAxpybiLZ1LtQAFOHSJ3Co=; b=KFl0tU32BLK8Fcqm0Yoc0vye8JHmIw3cQMdd7RwWx3ClIhyH5z7Q5sPH6kJjbAEWML5Ps5NhN85pjqj90wruN5g8rhbsW8dUdhnZS8SY31doM1dCB6rgrEuPLXBSktIpJJji6WeLowPzxZEcssXHu580FANA14JJV1yPusR9Aeo= Received: from AM0PR02CA0028.eurprd02.prod.outlook.com (2603:10a6:208:3e::41) by AM8P190MB0834.EURP190.PROD.OUTLOOK.COM (2603:10a6:20b:1d8::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7982.17; Fri, 4 Oct 2024 15:08:37 +0000 Received: from AMS0EPF000001AC.eurprd05.prod.outlook.com (2603:10a6:208:3e:cafe::8a) by AM0PR02CA0028.outlook.office365.com (2603:10a6:208:3e::41) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8026.18 via Frontend Transport; Fri, 4 Oct 2024 15:08:37 +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 AMS0EPF000001AC.mail.protection.outlook.com (10.167.16.152) with Microsoft SMTP Server id 15.20.7918.13 via Frontend Transport; Fri, 4 Oct 2024 15:08:37 +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, Danylo Vodopianov Subject: [PATCH v1 08/14] net/ntnic: add functions for availability monitor management Date: Fri, 4 Oct 2024 17:07:33 +0200 Message-ID: <20241004150749.261020-47-sil-plv@napatech.com> X-Mailer: git-send-email 2.45.0 In-Reply-To: <20241004150749.261020-1-sil-plv@napatech.com> References: <20241004150749.261020-1-sil-plv@napatech.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AMS0EPF000001AC:EE_|AM8P190MB0834:EE_ Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: f39aa3cf-47e2-4d19-2d18-08dce4866c58 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|376014|36860700013|82310400026|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?w6lYyLKb767WWxXEYi9VtMcyk1rhPixZGScC/RT/Sq/BbE4Rmp40U6SNOw7e?= =?us-ascii?Q?00EOfukjUHzHVIHHOhwFDBXkrtq3KZ9hcgqxGdtWnzfkUdmgFZwu4fLDePu3?= =?us-ascii?Q?zfa0yFrs5nBbhYG/u76wEkPEpQPRiyGH3wKzAlRFUiyK3UWUZDbb/4bk7JMd?= =?us-ascii?Q?8y04EjsYwqkXg1hkAtPR7gTE5z0ttDeqlffsmN/ab4cUKCIwQEm0HiB8/Zz9?= =?us-ascii?Q?PELnw1AX3205WYOHVMid/2PaUCrowze/3qpY3ovIJUWYbPMFMP7jNvEEBQB7?= =?us-ascii?Q?jt5qtuPQ7EF+ORIx2CbE0qwcKsq8UUyjMGjuqeGgySohoIgadC3W2jtA2gLL?= =?us-ascii?Q?SNnp93Jpy9ZAB+YYAHakTEoMYejZYV9nS6IfDdJR5uY3As+Ti8VxNXuSnmAb?= =?us-ascii?Q?yEUw8mveWhslT7aql2TljHtoroG/kp0fDm1wnhQ4yNe9ClDWzSP+HNIa4vp2?= =?us-ascii?Q?aHAnkrQHtWw+2ciYb37ZxfaIIc3VPFsGfBEG9kzuHxhMG7sdtMTCd6uAyTrh?= =?us-ascii?Q?dXoqttDvCQ6RXCdvHSipJX1uaZQXCnk88hH1Jo4RQHQAIypTHF1MXbIzHNEA?= =?us-ascii?Q?GvYapSGVtRgaAjbOk5P2Eam5CJxEeVEzZlZtJpx/bxE3ndtlKUBk3wt4BT2t?= =?us-ascii?Q?Nomd4b513DNfxcc2+ZqgQ+XNJZGW3VZj8+PZMnHJ1tSDTEjpJtQnb0L50Kjs?= =?us-ascii?Q?zonRKsr7rpFCQCIZyGQHjJ5+zN4aity1UT/4Cc8caKqS0pq5UG2Jl7hlXajI?= =?us-ascii?Q?LuDlFIv+gV0O3MsHQ1O8ZoH6UV3xQv4Ln9WWkc0mTJh5ime5FckBxstvW9QG?= =?us-ascii?Q?er4cW01f40TwAoGpLDY9q/GXucw2T8pyOSvhueNh/KE+95SLfXaPxVUKEtyQ?= =?us-ascii?Q?rKvfG9TOALkDN9z0xPjH/f3183+Dk7Zs2c3Zgx5JTITF07DuN0SQjJaod1TV?= =?us-ascii?Q?o427bcoQMjd6Us/J7QhSnMvT/JIGQhglPhZ1kNaqWSpeEPpeNE3Ryb4gJLsC?= =?us-ascii?Q?6h7hNy+SBLgXNhzxkT6UQFjzUL6VVEZKFqzNrv812p1B/z6i/Rc1x86fAsqU?= =?us-ascii?Q?3gK64TKtRVgf8NH2ULTI7too70hfoxX9sYPPSfkXiANzkf99dT92QAWK/LPT?= =?us-ascii?Q?XZ+XDrWAZLXX6F9TjSElNwV/Zt6TcNnlIwcMVOM3jKfvvnAIhYSxOzC4gZIL?= =?us-ascii?Q?pFHUyy+x09e2HIpp0okxeTamIpO/xeKay80L9CjkLjf84eEZSthZBYI9tfsf?= =?us-ascii?Q?FGdSRLoMzQmC138CAJ4kKWfRv86WeAbevVfjOuuBKFF/uHrL0ec0wwirCIAV?= =?us-ascii?Q?y15yrwwhf+cppZj9XRvSk9sbVLzuZe8/ptZbXhsaP2uHlpnKtlkAnbuxZo6N?= =?us-ascii?Q?7YvYZ1lr//HfhCxT48J90Ev5aeSc?= 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)(376014)(36860700013)(82310400026)(1800799024); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: CzcseMwuZWoA5gjazVUBHRP8A7bqA+QqJdimkbi6Zz+bm1UzLIEYmvBtnyc3Kqq6DRZzd9iPYMEbLwSgCTslMZ9CPUaYQc8C33hv7MEQl4us75sT2w3DlqtnB62gCVXbh+Qd4iIvjjIQa8KSWJ+vSxk8MeHavjPaDEOjFl8cLHWJzw0dsjgcUQGgZfHyGhV7UkUW5ae+WTX+EGp2SrTzaXF5B8Zi3BVa6a92G+xO+nhHG/q84rKcS+WRKcwmlsfZ7vwUtTGxm2mPNYh6NV1pyYfn6S53y/6wnFJf0MsOFQQLxlZLJ+fmeehTa9Zv09sU0B1MrOvOEVtiqP9ZBu9pr66eAY5xDiw8r2dlpkQfaMlfcFI2uWg6xL/hHI7tqbqGMbq+ZhAD2w3MSfXPxlJqI7FOUDyW57H5Eqp8eKQAwYLagm441fBWY8NCAoB58t+wI8vYlusqAxbXwWp2NbpziknLZkrK85xLixiqraUwW7Emb9uACOhx4pbxAMDZAi68PRym4t6AI4rKFvaIn2JDfrO8WjJ/HKQKI/mnzB6uSD6O+BeiJbk5JWBsRewY6msiIMSK9V+oAi42h+EktK1Ass/6/fITQ7M6JJINGV+dWIqGG3+NfvHjCajD8RjI3aCPWr49lt/8M3WhyclrNraC1A== X-OriginatorOrg: napatech.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Oct 2024 15:08:37.2517 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: f39aa3cf-47e2-4d19-2d18-08dce4866c58 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: AMS0EPF000001AC.eurprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM8P190MB0834 X-BESS-ID: 1728054519-302249-12645-31692-1 X-BESS-VER: 2019.1_20240924.1654 X-BESS-Apparent-Source-IP: 104.47.11.233 X-BESS-Parts: H4sIAAAAAAACA4uuVkqtKFGyUioBkjpK+cVKVkYGZgbGQGYGUNTSIMnCwjjVxM wwxSDJwCQlMc08OS3JxNAiNc3UzCTVTKk2FgA0S4jyQgAAAA== X-BESS-Outbound-Spam-Score: 0.50 X-BESS-Outbound-Spam-Report: Code version 3.2, rules version 3.2.2.259494 [from cloudscan22-131.eu-central-1b.ess.aws.cudaops.com] Rule breakdown below pts rule name description ---- ---------------------- -------------------------------- 0.50 BSF_RULE7568M META: Custom Rule 7568M 0.00 BSF_BESS_OUTBOUND META: BESS Outbound X-BESS-Outbound-Spam-Status: SCORE=0.50 using account:ESS113687 scores of KILL_LEVEL=7.0 tests=BSF_RULE7568M, 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 Implemented functions to configure and manage availability monitor data. Added functions to set and flush availability monitor data. Signed-off-by: Danylo Vodopianov --- drivers/net/ntnic/dbsconfig/ntnic_dbsconfig.c | 61 +++- drivers/net/ntnic/include/ntnic_dbs.h | 72 +++++ drivers/net/ntnic/nthw/dbs/nthw_dbs.c | 271 ++++++++++++++++++ .../nthw/supported/nthw_fpga_reg_defs_dbs.h | 23 ++ 4 files changed, 420 insertions(+), 7 deletions(-) diff --git a/drivers/net/ntnic/dbsconfig/ntnic_dbsconfig.c b/drivers/net/ntnic/dbsconfig/ntnic_dbsconfig.c index e69cf7ad21..065dac6af0 100644 --- a/drivers/net/ntnic/dbsconfig/ntnic_dbsconfig.c +++ b/drivers/net/ntnic/dbsconfig/ntnic_dbsconfig.c @@ -103,11 +103,7 @@ struct nthw_virt_queue { * 0: VirtIO-Net header (12 bytes). * 1: Napatech DVIO0 descriptor (12 bytes). */ -}; - -struct pvirtq_struct_layout_s { - size_t driver_event_offset; - size_t device_event_offset; + void *avail_struct_phys_addr; }; static struct nthw_virt_queue rxvq[MAX_VIRT_QUEUES]; @@ -304,9 +300,22 @@ static struct nthw_virt_queue *nthw_setup_rx_virt_queue(nthw_dbs_t *p_nthw_dbs, { (void)header; (void)desc_struct_phys_addr; - (void)avail_struct_phys_addr; (void)used_struct_phys_addr; + /* + * 2. Configure the DBS.RX_AM_DATA memory and enable the queues you plan to use; + * good idea to initialize all DBS_RX_QUEUES entries. + * Notice: We do this only for queues that don't require interrupts (i.e. if + * irq_vector < 0). Queues that require interrupts will have RX_AM_DATA enabled + * at a later time (after we have enabled vfio interrupts in the kernel). + */ + if (irq_vector < 0) { + if (set_rx_am_data(p_nthw_dbs, index, (uint64_t)avail_struct_phys_addr, + RX_AM_DISABLE, host_id, 0, + irq_vector >= 0 ? 1 : 0) != 0) { + return NULL; + } + } /* * 5. Initialize all RX queues (all DBS_RX_QUEUES of them) using the @@ -314,6 +323,15 @@ static struct nthw_virt_queue *nthw_setup_rx_virt_queue(nthw_dbs_t *p_nthw_dbs, */ dbs_init_rx_queue(p_nthw_dbs, index, start_idx, start_ptr); + /* + * 2. Configure the DBS.RX_AM_DATA memory and enable the queues you plan to use; + * good idea to initialize all DBS_RX_QUEUES entries. + */ + if (set_rx_am_data(p_nthw_dbs, index, (uint64_t)avail_struct_phys_addr, RX_AM_ENABLE, + host_id, 0, irq_vector >= 0 ? 1 : 0) != 0) { + return NULL; + } + /* Save queue state */ rxvq[index].usage = NTHW_VIRTQ_UNMANAGED; rxvq[index].mp_nthw_dbs = p_nthw_dbs; @@ -321,6 +339,7 @@ static struct nthw_virt_queue *nthw_setup_rx_virt_queue(nthw_dbs_t *p_nthw_dbs, rxvq[index].queue_size = queue_size; rxvq[index].am_enable = (irq_vector < 0) ? RX_AM_ENABLE : RX_AM_DISABLE; rxvq[index].host_id = host_id; + rxvq[index].avail_struct_phys_addr = avail_struct_phys_addr; rxvq[index].vq_type = vq_type; rxvq[index].in_order = 0; /* not used */ rxvq[index].irq_vector = irq_vector; @@ -347,15 +366,42 @@ static struct nthw_virt_queue *nthw_setup_tx_virt_queue(nthw_dbs_t *p_nthw_dbs, { (void)header; (void)desc_struct_phys_addr; - (void)avail_struct_phys_addr; (void)used_struct_phys_addr; + /* + * 2. Configure the DBS.TX_AM_DATA memory and enable the queues you plan to use; + * good idea to initialize all DBS_TX_QUEUES entries. + */ + if (set_tx_am_data(p_nthw_dbs, index, (uint64_t)avail_struct_phys_addr, TX_AM_DISABLE, + host_id, 0, irq_vector >= 0 ? 1 : 0) != 0) { + return NULL; + } + /* * 5. Initialize all TX queues (all DBS_TX_QUEUES of them) using the * DBS.TX_INIT register. */ dbs_init_tx_queue(p_nthw_dbs, index, start_idx, start_ptr); + if (nthw_dbs_set_tx_qp_data(p_nthw_dbs, index, virtual_port) != 0) + return NULL; + + /* + * 2. Configure the DBS.TX_AM_DATA memory and enable the queues you plan to use; + * good idea to initialize all DBS_TX_QUEUES entries. + * Notice: We do this only for queues that don't require interrupts (i.e. if + * irq_vector < 0). Queues that require interrupts will have TX_AM_DATA + * enabled at a later time (after we have enabled vfio interrupts in the + * kernel). + */ + if (irq_vector < 0) { + if (set_tx_am_data(p_nthw_dbs, index, (uint64_t)avail_struct_phys_addr, + TX_AM_ENABLE, host_id, 0, + irq_vector >= 0 ? 1 : 0) != 0) { + return NULL; + } + } + /* Save queue state */ txvq[index].usage = NTHW_VIRTQ_UNMANAGED; txvq[index].mp_nthw_dbs = p_nthw_dbs; @@ -365,6 +411,7 @@ static struct nthw_virt_queue *nthw_setup_tx_virt_queue(nthw_dbs_t *p_nthw_dbs, txvq[index].host_id = host_id; txvq[index].port = port; txvq[index].virtual_port = virtual_port; + txvq[index].avail_struct_phys_addr = avail_struct_phys_addr; txvq[index].vq_type = vq_type; txvq[index].in_order = in_order; txvq[index].irq_vector = irq_vector; diff --git a/drivers/net/ntnic/include/ntnic_dbs.h b/drivers/net/ntnic/include/ntnic_dbs.h index 4e6236e8b4..438f1858f5 100644 --- a/drivers/net/ntnic/include/ntnic_dbs.h +++ b/drivers/net/ntnic/include/ntnic_dbs.h @@ -15,6 +15,29 @@ * Struct for implementation of memory bank shadows */ +/* DBS_RX_AM_DATA */ +struct nthw_dbs_rx_am_data_s { + uint64_t guest_physical_address; + uint32_t enable; + uint32_t host_id; + uint32_t packed; + uint32_t int_enable; +}; + +/* DBS_TX_AM_DATA */ +struct nthw_dbs_tx_am_data_s { + uint64_t guest_physical_address; + uint32_t enable; + uint32_t host_id; + uint32_t packed; + uint32_t int_enable; +}; + +/* DBS_TX_QP_DATA */ +struct nthw_dbs_tx_qp_data_s { + uint32_t virtual_port; +}; + struct nthw_dbs_s { nthw_fpga_t *mp_fpga; nthw_module_t *mp_mod_dbs; @@ -75,6 +98,40 @@ struct nthw_dbs_s { nthw_field_t *mp_fld_tx_idle_idle; nthw_field_t *mp_fld_tx_idle_queue; nthw_field_t *mp_fld_tx_idle_busy; + + nthw_register_t *mp_reg_rx_avail_monitor_control; + nthw_field_t *mp_fld_rx_avail_monitor_control_adr; + nthw_field_t *mp_fld_rx_avail_monitor_control_cnt; + + nthw_register_t *mp_reg_rx_avail_monitor_data; + nthw_field_t *mp_fld_rx_avail_monitor_data_guest_physical_address; + nthw_field_t *mp_fld_rx_avail_monitor_data_enable; + nthw_field_t *mp_fld_rx_avail_monitor_data_host_id; + nthw_field_t *mp_fld_rx_avail_monitor_data_packed; + nthw_field_t *mp_fld_rx_avail_monitor_data_int; + + nthw_register_t *mp_reg_tx_avail_monitor_control; + nthw_field_t *mp_fld_tx_avail_monitor_control_adr; + nthw_field_t *mp_fld_tx_avail_monitor_control_cnt; + + nthw_register_t *mp_reg_tx_avail_monitor_data; + nthw_field_t *mp_fld_tx_avail_monitor_data_guest_physical_address; + nthw_field_t *mp_fld_tx_avail_monitor_data_enable; + nthw_field_t *mp_fld_tx_avail_monitor_data_host_id; + nthw_field_t *mp_fld_tx_avail_monitor_data_packed; + nthw_field_t *mp_fld_tx_avail_monitor_data_int; + + nthw_register_t *mp_reg_tx_queue_property_control; + nthw_field_t *mp_fld_tx_queue_property_control_adr; + nthw_field_t *mp_fld_tx_queue_property_control_cnt; + + nthw_register_t *mp_reg_tx_queue_property_data; + nthw_field_t *mp_fld_tx_queue_property_data_v_port; + + struct nthw_dbs_rx_am_data_s m_rx_am_shadow[NT_DBS_RX_QUEUES_MAX]; + + struct nthw_dbs_tx_am_data_s m_tx_am_shadow[NT_DBS_TX_QUEUES_MAX]; + struct nthw_dbs_tx_qp_data_s m_tx_qp_shadow[NT_DBS_TX_QUEUES_MAX]; }; typedef struct nthw_dbs_s nthw_dbs_t; @@ -103,5 +160,20 @@ int get_rx_init(nthw_dbs_t *p, uint32_t *init, uint32_t *queue, uint32_t *busy); int set_tx_init(nthw_dbs_t *p, uint32_t start_idx, uint32_t start_ptr, uint32_t init, uint32_t queue); int get_tx_init(nthw_dbs_t *p, uint32_t *init, uint32_t *queue, uint32_t *busy); +int set_rx_am_data(nthw_dbs_t *p, + uint32_t index, + uint64_t guest_physical_address, + uint32_t enable, + uint32_t host_id, + uint32_t packed, + uint32_t int_enable); +int set_tx_am_data(nthw_dbs_t *p, + uint32_t index, + uint64_t guest_physical_address, + uint32_t enable, + uint32_t host_id, + uint32_t packed, + uint32_t int_enable); +int nthw_dbs_set_tx_qp_data(nthw_dbs_t *p, uint32_t index, uint32_t virtual_port); #endif /* _NTNIC_DBS_H_ */ diff --git a/drivers/net/ntnic/nthw/dbs/nthw_dbs.c b/drivers/net/ntnic/nthw/dbs/nthw_dbs.c index cd1123b6f3..99a1575036 100644 --- a/drivers/net/ntnic/nthw/dbs/nthw_dbs.c +++ b/drivers/net/ntnic/nthw/dbs/nthw_dbs.c @@ -9,6 +9,25 @@ #include "nthw_drv.h" #include "nthw_register.h" +static void set_shadow_tx_qp_data(nthw_dbs_t *p, uint32_t index, uint32_t virtual_port); +static void flush_tx_qp_data(nthw_dbs_t *p, uint32_t index); +static void set_shadow_rx_am_data(nthw_dbs_t *p, + uint32_t index, + uint64_t guest_physical_address, + uint32_t enable, + uint32_t host_id, + uint32_t packed, + uint32_t int_enable); +static void flush_rx_am_data(nthw_dbs_t *p, uint32_t index); +static void set_shadow_tx_am_data(nthw_dbs_t *p, + uint32_t index, + uint64_t guest_physical_address, + uint32_t enable, + uint32_t host_id, + uint32_t packed, + uint32_t int_enable); +static void flush_tx_am_data(nthw_dbs_t *p, uint32_t index); + nthw_dbs_t *nthw_dbs_new(void) { nthw_dbs_t *p = malloc(sizeof(nthw_dbs_t)); @@ -142,6 +161,55 @@ int dbs_init(nthw_dbs_t *p, nthw_fpga_t *p_fpga, int n_instance) nthw_register_query_field(p->mp_reg_tx_idle, DBS_TX_IDLE_BUSY); } + p->mp_reg_rx_avail_monitor_control = + nthw_module_get_register(p->mp_mod_dbs, DBS_RX_AM_CTRL); + p->mp_fld_rx_avail_monitor_control_adr = + nthw_register_get_field(p->mp_reg_rx_avail_monitor_control, DBS_RX_AM_CTRL_ADR); + p->mp_fld_rx_avail_monitor_control_cnt = + nthw_register_get_field(p->mp_reg_rx_avail_monitor_control, DBS_RX_AM_CTRL_CNT); + + p->mp_reg_rx_avail_monitor_data = nthw_module_get_register(p->mp_mod_dbs, DBS_RX_AM_DATA); + p->mp_fld_rx_avail_monitor_data_guest_physical_address = + nthw_register_get_field(p->mp_reg_rx_avail_monitor_data, DBS_RX_AM_DATA_GPA); + p->mp_fld_rx_avail_monitor_data_enable = + nthw_register_get_field(p->mp_reg_rx_avail_monitor_data, DBS_RX_AM_DATA_ENABLE); + p->mp_fld_rx_avail_monitor_data_host_id = + nthw_register_get_field(p->mp_reg_rx_avail_monitor_data, DBS_RX_AM_DATA_HID); + p->mp_fld_rx_avail_monitor_data_packed = + nthw_register_query_field(p->mp_reg_rx_avail_monitor_data, DBS_RX_AM_DATA_PCKED); + p->mp_fld_rx_avail_monitor_data_int = + nthw_register_query_field(p->mp_reg_rx_avail_monitor_data, DBS_RX_AM_DATA_INT); + + p->mp_reg_tx_avail_monitor_control = + nthw_module_get_register(p->mp_mod_dbs, DBS_TX_AM_CTRL); + p->mp_fld_tx_avail_monitor_control_adr = + nthw_register_get_field(p->mp_reg_tx_avail_monitor_control, DBS_TX_AM_CTRL_ADR); + p->mp_fld_tx_avail_monitor_control_cnt = + nthw_register_get_field(p->mp_reg_tx_avail_monitor_control, DBS_TX_AM_CTRL_CNT); + + p->mp_reg_tx_avail_monitor_data = nthw_module_get_register(p->mp_mod_dbs, DBS_TX_AM_DATA); + p->mp_fld_tx_avail_monitor_data_guest_physical_address = + nthw_register_get_field(p->mp_reg_tx_avail_monitor_data, DBS_TX_AM_DATA_GPA); + p->mp_fld_tx_avail_monitor_data_enable = + nthw_register_get_field(p->mp_reg_tx_avail_monitor_data, DBS_TX_AM_DATA_ENABLE); + p->mp_fld_tx_avail_monitor_data_host_id = + nthw_register_get_field(p->mp_reg_tx_avail_monitor_data, DBS_TX_AM_DATA_HID); + p->mp_fld_tx_avail_monitor_data_packed = + nthw_register_query_field(p->mp_reg_tx_avail_monitor_data, DBS_TX_AM_DATA_PCKED); + p->mp_fld_tx_avail_monitor_data_int = + nthw_register_query_field(p->mp_reg_tx_avail_monitor_data, DBS_TX_AM_DATA_INT); + + p->mp_reg_tx_queue_property_control = + nthw_module_get_register(p->mp_mod_dbs, DBS_TX_QP_CTRL); + p->mp_fld_tx_queue_property_control_adr = + nthw_register_get_field(p->mp_reg_tx_queue_property_control, DBS_TX_QP_CTRL_ADR); + p->mp_fld_tx_queue_property_control_cnt = + nthw_register_get_field(p->mp_reg_tx_queue_property_control, DBS_TX_QP_CTRL_CNT); + + p->mp_reg_tx_queue_property_data = nthw_module_get_register(p->mp_mod_dbs, DBS_TX_QP_DATA); + p->mp_fld_tx_queue_property_data_v_port = + nthw_register_get_field(p->mp_reg_tx_queue_property_data, DBS_TX_QP_DATA_VPORT); + return 0; } @@ -171,8 +239,24 @@ static int dbs_reset_tx_control(nthw_dbs_t *p) void dbs_reset(nthw_dbs_t *p) { + int i; dbs_reset_rx_control(p); dbs_reset_tx_control(p); + + /* Reset RX memory banks and shado */ + for (i = 0; i < NT_DBS_RX_QUEUES_MAX; ++i) { + set_shadow_rx_am_data(p, i, 0, 0, 0, 0, 0); + flush_rx_am_data(p, i); + } + + /* Reset TX memory banks and shado */ + for (i = 0; i < NT_DBS_TX_QUEUES_MAX; ++i) { + set_shadow_tx_am_data(p, i, 0, 0, 0, 0, 0); + flush_tx_am_data(p, i); + + set_shadow_tx_qp_data(p, i, 0); + flush_tx_qp_data(p, i); + } } int set_rx_control(nthw_dbs_t *p, @@ -256,3 +340,190 @@ int get_tx_init(nthw_dbs_t *p, uint32_t *init, uint32_t *queue, uint32_t *busy) *busy = nthw_field_get_val32(p->mp_fld_tx_init_busy); return 0; } + +static void set_rx_am_data_index(nthw_dbs_t *p, uint32_t index) +{ + nthw_field_set_val32(p->mp_fld_rx_avail_monitor_control_adr, index); + nthw_field_set_val32(p->mp_fld_rx_avail_monitor_control_cnt, 1); + nthw_register_flush(p->mp_reg_rx_avail_monitor_control, 1); +} + +static void set_shadow_rx_am_data_guest_physical_address(nthw_dbs_t *p, uint32_t index, + uint64_t guest_physical_address) +{ + p->m_rx_am_shadow[index].guest_physical_address = guest_physical_address; +} + +static void nthw_dbs_set_shadow_rx_am_data_enable(nthw_dbs_t *p, uint32_t index, uint32_t enable) +{ + p->m_rx_am_shadow[index].enable = enable; +} + +static void set_shadow_rx_am_data_host_id(nthw_dbs_t *p, uint32_t index, uint32_t host_id) +{ + p->m_rx_am_shadow[index].host_id = host_id; +} + +static void set_shadow_rx_am_data_packed(nthw_dbs_t *p, uint32_t index, uint32_t packed) +{ + p->m_rx_am_shadow[index].packed = packed; +} + +static void set_shadow_rx_am_data_int_enable(nthw_dbs_t *p, uint32_t index, uint32_t int_enable) +{ + p->m_rx_am_shadow[index].int_enable = int_enable; +} + +static void set_shadow_rx_am_data(nthw_dbs_t *p, + uint32_t index, + uint64_t guest_physical_address, + uint32_t enable, + uint32_t host_id, + uint32_t packed, + uint32_t int_enable) +{ + set_shadow_rx_am_data_guest_physical_address(p, index, guest_physical_address); + nthw_dbs_set_shadow_rx_am_data_enable(p, index, enable); + set_shadow_rx_am_data_host_id(p, index, host_id); + set_shadow_rx_am_data_packed(p, index, packed); + set_shadow_rx_am_data_int_enable(p, index, int_enable); +} + +static void flush_rx_am_data(nthw_dbs_t *p, uint32_t index) +{ + nthw_field_set_val(p->mp_fld_rx_avail_monitor_data_guest_physical_address, + (uint32_t *)&p->m_rx_am_shadow[index].guest_physical_address, 2); + nthw_field_set_val32(p->mp_fld_rx_avail_monitor_data_enable, + p->m_rx_am_shadow[index].enable); + nthw_field_set_val32(p->mp_fld_rx_avail_monitor_data_host_id, + p->m_rx_am_shadow[index].host_id); + + if (p->mp_fld_rx_avail_monitor_data_packed) { + nthw_field_set_val32(p->mp_fld_rx_avail_monitor_data_packed, + p->m_rx_am_shadow[index].packed); + } + + if (p->mp_fld_rx_avail_monitor_data_int) { + nthw_field_set_val32(p->mp_fld_rx_avail_monitor_data_int, + p->m_rx_am_shadow[index].int_enable); + } + + set_rx_am_data_index(p, index); + nthw_register_flush(p->mp_reg_rx_avail_monitor_data, 1); +} + +int set_rx_am_data(nthw_dbs_t *p, + uint32_t index, + uint64_t guest_physical_address, + uint32_t enable, + uint32_t host_id, + uint32_t packed, + uint32_t int_enable) +{ + if (!p->mp_reg_rx_avail_monitor_data) + return -ENOTSUP; + + set_shadow_rx_am_data(p, index, guest_physical_address, enable, host_id, packed, + int_enable); + flush_rx_am_data(p, index); + return 0; +} + +static void set_tx_am_data_index(nthw_dbs_t *p, uint32_t index) +{ + nthw_field_set_val32(p->mp_fld_tx_avail_monitor_control_adr, index); + nthw_field_set_val32(p->mp_fld_tx_avail_monitor_control_cnt, 1); + nthw_register_flush(p->mp_reg_tx_avail_monitor_control, 1); +} + +static void set_shadow_tx_am_data(nthw_dbs_t *p, + uint32_t index, + uint64_t guest_physical_address, + uint32_t enable, + uint32_t host_id, + uint32_t packed, + uint32_t int_enable) +{ + p->m_tx_am_shadow[index].guest_physical_address = guest_physical_address; + p->m_tx_am_shadow[index].enable = enable; + p->m_tx_am_shadow[index].host_id = host_id; + p->m_tx_am_shadow[index].packed = packed; + p->m_tx_am_shadow[index].int_enable = int_enable; +} + +static void flush_tx_am_data(nthw_dbs_t *p, uint32_t index) +{ + nthw_field_set_val(p->mp_fld_tx_avail_monitor_data_guest_physical_address, + (uint32_t *)&p->m_tx_am_shadow[index].guest_physical_address, 2); + nthw_field_set_val32(p->mp_fld_tx_avail_monitor_data_enable, + p->m_tx_am_shadow[index].enable); + nthw_field_set_val32(p->mp_fld_tx_avail_monitor_data_host_id, + p->m_tx_am_shadow[index].host_id); + + if (p->mp_fld_tx_avail_monitor_data_packed) { + nthw_field_set_val32(p->mp_fld_tx_avail_monitor_data_packed, + p->m_tx_am_shadow[index].packed); + } + + if (p->mp_fld_tx_avail_monitor_data_int) { + nthw_field_set_val32(p->mp_fld_tx_avail_monitor_data_int, + p->m_tx_am_shadow[index].int_enable); + } + + set_tx_am_data_index(p, index); + nthw_register_flush(p->mp_reg_tx_avail_monitor_data, 1); +} + +int set_tx_am_data(nthw_dbs_t *p, + uint32_t index, + uint64_t guest_physical_address, + uint32_t enable, + uint32_t host_id, + uint32_t packed, + uint32_t int_enable) +{ + if (!p->mp_reg_tx_avail_monitor_data) + return -ENOTSUP; + + set_shadow_tx_am_data(p, index, guest_physical_address, enable, host_id, packed, + int_enable); + flush_tx_am_data(p, index); + return 0; +} + +static void set_tx_qp_data_index(nthw_dbs_t *p, uint32_t index) +{ + nthw_field_set_val32(p->mp_fld_tx_queue_property_control_adr, index); + nthw_field_set_val32(p->mp_fld_tx_queue_property_control_cnt, 1); + nthw_register_flush(p->mp_reg_tx_queue_property_control, 1); +} + +static void set_shadow_tx_qp_data_virtual_port(nthw_dbs_t *p, uint32_t index, + uint32_t virtual_port) +{ + p->m_tx_qp_shadow[index].virtual_port = virtual_port; +} + +static void set_shadow_tx_qp_data(nthw_dbs_t *p, uint32_t index, uint32_t virtual_port) +{ + set_shadow_tx_qp_data_virtual_port(p, index, virtual_port); +} + +static void flush_tx_qp_data(nthw_dbs_t *p, uint32_t index) +{ + nthw_field_set_val32(p->mp_fld_tx_queue_property_data_v_port, + p->m_tx_qp_shadow[index].virtual_port); + + set_tx_qp_data_index(p, index); + nthw_register_flush(p->mp_reg_tx_queue_property_data, 1); +} + +int nthw_dbs_set_tx_qp_data(nthw_dbs_t *p, uint32_t index, uint32_t virtual_port) +{ + if (!p->mp_reg_tx_queue_property_data) + return -ENOTSUP; + + set_shadow_tx_qp_data(p, index, virtual_port); + flush_tx_qp_data(p, index); + return 0; +} diff --git a/drivers/net/ntnic/nthw/supported/nthw_fpga_reg_defs_dbs.h b/drivers/net/ntnic/nthw/supported/nthw_fpga_reg_defs_dbs.h index ee5d726aab..00570fa8af 100644 --- a/drivers/net/ntnic/nthw/supported/nthw_fpga_reg_defs_dbs.h +++ b/drivers/net/ntnic/nthw/supported/nthw_fpga_reg_defs_dbs.h @@ -14,6 +14,15 @@ #define _NTHW_FPGA_REG_DEFS_DBS_ /* DBS */ +#define DBS_RX_AM_CTRL (0x7359feUL) +#define DBS_RX_AM_CTRL_ADR (0x4704a1UL) +#define DBS_RX_AM_CTRL_CNT (0x104f9d70UL) +#define DBS_RX_AM_DATA (0xafa2dbe7UL) +#define DBS_RX_AM_DATA_ENABLE (0x11658278UL) +#define DBS_RX_AM_DATA_GPA (0xbf307344UL) +#define DBS_RX_AM_DATA_HID (0x5f0669eeUL) +#define DBS_RX_AM_DATA_INT (0xc32857aUL) +#define DBS_RX_AM_DATA_PCKED (0x7d840fb4UL) #define DBS_RX_CONTROL (0xb18b2866UL) #define DBS_RX_CONTROL_AME (0x1f9219acUL) #define DBS_RX_CONTROL_AMS (0xeb46acfdUL) @@ -38,6 +47,15 @@ #define DBS_RX_PTR_VALID (0xbcc5ec4dUL) #define DBS_STATUS (0xb5f35220UL) #define DBS_STATUS_OK (0xcf09a30fUL) +#define DBS_TX_AM_CTRL (0xd6d29b9UL) +#define DBS_TX_AM_CTRL_ADR (0xf8854f17UL) +#define DBS_TX_AM_CTRL_CNT (0xe88dd6c6UL) +#define DBS_TX_AM_DATA (0xa2bcaba0UL) +#define DBS_TX_AM_DATA_ENABLE (0xb6513570UL) +#define DBS_TX_AM_DATA_GPA (0x47f238f2UL) +#define DBS_TX_AM_DATA_HID (0xa7c42258UL) +#define DBS_TX_AM_DATA_INT (0xf4f0ceccUL) +#define DBS_TX_AM_DATA_PCKED (0x2e156650UL) #define DBS_TX_CONTROL (0xbc955821UL) #define DBS_TX_CONTROL_AME (0xe750521aUL) #define DBS_TX_CONTROL_AMS (0x1384e74bUL) @@ -71,6 +89,11 @@ #define DBS_TX_QOS_RATE (0xe6e27cc5UL) #define DBS_TX_QOS_RATE_DIV (0x8cd07ba3UL) #define DBS_TX_QOS_RATE_MUL (0x9814e40bUL) +#define DBS_TX_QP_CTRL (0xd5fba432UL) +#define DBS_TX_QP_CTRL_ADR (0x84238184UL) +#define DBS_TX_QP_CTRL_CNT (0x942b1855UL) +#define DBS_TX_QP_DATA (0x7a2a262bUL) +#define DBS_TX_QP_DATA_VPORT (0xda741d67UL) #endif /* _NTHW_FPGA_REG_DEFS_DBS_ */ -- 2.45.0