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 08F4745AAF; Fri, 4 Oct 2024 17:53:04 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 244FC42DE9; Fri, 4 Oct 2024 17:51:11 +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 754BC42DE3 for ; Fri, 4 Oct 2024 17:51:05 +0200 (CEST) Received: from EUR05-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05lp2169.outbound.protection.outlook.com [104.47.17.169]) by mx-outbound22-159.eu-central-1b.ess.aws.cudaops.com (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Fri, 04 Oct 2024 15:51:04 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=U36ta0wveqKEq5TlmEtRn1mhz3qkcWxeGOqybps6C+d0Hy2Hbk4H2JC1Es81uZONEQk6Ltq87n9O28hn4QNtiQ4CS+ddF2MsV5ISKTAtqAi+SDYvuhEhbB3uJDvzafyGS1FUGU2PxTioBJZhnUqW7hVUUzPOBY8q0P/kpkWUs/mmTOKwrpOJQB7X2Sqd5pLuEGdjlzdNjBXkmeArRgDo8DDpwEbiz3tWfw3AwzzkKmzy7mfn84zm8FJyuWbslOPv5DHfqBg2uQt3Az7vzMOFiGp5HZS57mOgyLDM/CaqwtH669beD4jwGJQXagrt9co7tNDJ4C8aSF5qNZknPnFaFg== 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=c2/wn3sLAmXr5NEnYQmhE9VB+O0RgQ9WoJidPG9il18+ZB6l4TQRVfylUIw2qLHWjk8IaHzc9m04AMCSTim3UD3bqO8Lo5mgcjal/+2qTeb9HdOvHf3IlDcvOPZZg8ty/eykUU/Qf7s61VdwoD0bb6+DqHW1xWBl1UzO+z9OgJwSmx8OkpFgkYi51X7Av+tEgxBj8gCiB7upBpZCOONgIx5stVM1x+WNlChiNk1DxvNoaaqnK3M0g0tvwyRACwX6D6r9GTkR33V9Md/SQFU8IvGSPbi1XSAj+0xbNCaxOdq+poso9yqdeGQQoxMDaHQxyJrA79khWHPag7869g0w4A== 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=HOfEFubxuK0BUQz/xg3vnVg6ifLl14zJf7V6K4yfcWgWn+TVYmT+sX9ga2KAOqU3uChRVyCNZQXNQWcYyTQlJZLnHf6eGP4CEmh5QmDDM8PevkpXxRjQnpY4RnGgfi3HA64LPL2+tMTAWDTjcxkwkj5YmZK9d0qA9lTCTkxna+0= Received: from AM0PR10CA0118.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:208:e6::35) by VE1P190MB1006.EURP190.PROD.OUTLOOK.COM (2603:10a6:800:1af::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8005.20; Fri, 4 Oct 2024 15:36:35 +0000 Received: from AM2PEPF0001C715.eurprd05.prod.outlook.com (2603:10a6:208:e6:cafe::f6) by AM0PR10CA0118.outlook.office365.com (2603:10a6:208:e6::35) 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:36:35 +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 AM2PEPF0001C715.mail.protection.outlook.com (10.167.16.185) with Microsoft SMTP Server id 15.20.7918.13 via Frontend Transport; Fri, 4 Oct 2024 15:36:35 +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:35:02 +0200 Message-ID: <20241004153551.267935-45-sil-plv@napatech.com> X-Mailer: git-send-email 2.45.0 In-Reply-To: <20241004153551.267935-1-sil-plv@napatech.com> References: <20241004153551.267935-1-sil-plv@napatech.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM2PEPF0001C715:EE_|VE1P190MB1006:EE_ Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: 4aa29923-2c37-447c-6be5-08dce48a5493 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|1800799024|376014|82310400026|36860700013; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?RP+1hLhlzLkjFT6I00zbi6wxHip2PM/A/K915qrJmArN6/prTgBx69cUH/7b?= =?us-ascii?Q?IBZEDjt3eDB+rA0vK4dAz9ZBQGS9UBbFpHCGeK4f/uzM2ToNU90HUahlg9Jb?= =?us-ascii?Q?hlxy9jKeE7K8cZEYKEhui2/+f/qXsbm0LDel87Wxthgi55r9BhZSrDjcgBax?= =?us-ascii?Q?k0ahSFRriacHeH7YZiGyMUCwknzVZS/etn4HSycK07QXo3uq3l0YuycGXcDy?= =?us-ascii?Q?ftxnigGxauP7kuQZeElBEHv3EJa6szb8usujPpJCMvp4byedk+yOODVaJG5P?= =?us-ascii?Q?6zZT2CrqZE91papQmAXVPXqMkzZdRnAedChPZI42s2MwPSyni7y4ttNNdBuh?= =?us-ascii?Q?EJ8ghCyvXtfKDz0oApA2wh2UZQdNI2sT51J2CfJw0N1KDXg1MHioKyyZUUjz?= =?us-ascii?Q?EQizSiCRxd57DGUoUdzQRpojs3gCz82Lm/6Lj/VW44xia8q+fJGeGFuw7a8C?= =?us-ascii?Q?QxVhuGP5tCb+g+vT4KLmK9kbvsnJ26kjJwfNBhVXRkPojF8ehuSYx+xE36ZB?= =?us-ascii?Q?fV5qlaLDQgOetSHvt9aUirjPu+4rFMTNi3UMVlzVurZ25/L2TyMt05pbVz1J?= =?us-ascii?Q?Yb5er6ixHvMkjmxwnfi2LP/IvnkU1NlA/rOnPLre/z+VlilAUGHiE25ouiPk?= =?us-ascii?Q?Z37PfYIk3IkLoInsJcl3y6zc/x5hdpln4zhw6ZBjdbtJpBUe7U660zT1rDKt?= =?us-ascii?Q?xzP1KTVeJCWv5uqCsS+2qLhd5IkbL+9JnPKWBnCJ6woK6idvP7+z/t6u8uig?= =?us-ascii?Q?2JMkEq/0g2iuhhd0rfrmS/hjH9BVY+icvas/jrLg0S8Itwcmwxy9s8RdaOjj?= =?us-ascii?Q?hEUFwXim5faE0a41b4NRdLEFkxT/4PhaLwmN5BuXJYxiXeSS17Km2+h6NVHm?= =?us-ascii?Q?o83U6xhhLarzfKRiYA1WUHYZ9XAfSBUc85yuCx9hG4AUInUyT7tp8EiE9ZjA?= =?us-ascii?Q?LOrZ9hx9DO4sgXDHmQAzcbsZkdm5/OyBgipGQKpb2v2BC0BnVK/Dq3ezaWEp?= =?us-ascii?Q?9rZUhVxqwPKnC2z7aTAxYaQgvgBUiXugvChjReuGA62KEWmEOuvGV1dM0cNO?= =?us-ascii?Q?U68yprXNBq3fKy+jnJzPzRolbtTUQQzSVMi9CS8R44MUd9h8mEi5SKIjj67H?= =?us-ascii?Q?gsp/vJHsMZirrkX8SRdSdxhRon7Rgle3u+J3PyYPzBS6+KlsBAo39+RAMXqw?= =?us-ascii?Q?z+hxzOmqCUI/2sj6xSoPgsii7LdRhkR58CCXsIsQlA7NBE43QwGT89xEx6Qm?= =?us-ascii?Q?y1ionP8eKuSRihr5xDwDq+ZkdWyssdh/dvfxl73ke/C0WphCwaUQiJ5yZyNr?= =?us-ascii?Q?KfVaJfuGpWErXlj5yBCErty2YPiS8x96A+Z7Dt/1ji1m23lLnObiVP7TY3br?= =?us-ascii?Q?HocoUjDCpGsTnsex0YG8TQyew1q0?= 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)(1800799024)(376014)(82310400026)(36860700013); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: KI5ZCR+U582B2iaEf+URMZceUvKam5dyKwmqhzXoIvsHjo8ECLibiLfc4CDDMX651MHhYYtNstXeN7sUK1bCxqtDM18LlrZisX9KU6Ci6zGTKvWutkbb/Uwd9Xa5Lhp+RtvkwVo6EY7j5xwRgAbYc5X6BkHk+aTiAuUl8zKg2UId+3VlaI/NPX4nvYhFDPK1uqlYQgb0hwVJ95A10EU1K5jTv6TCwaRRrnDDzyqbGV0FXHkqO1MvTvq1JwuVHFp9tzrPN9WoebTrhVh4bedNsHgHVYE3ajcbBjC7ZsHnYcuzO3AZojSeu+9kxJ3kY1jyAnu+OFKSAS/HBfACGKda7/ub71Fwo9yrF2gZ2uXK9/hbLl9ts0rw/dk9d8m5dkPLCTd6SU3s2Qu/BT4/ml5aBl/r8YxrrHaFUeaR5zvEbZfeQTN2lVWnoLgU66ncxHMrnz6s1YnwkHrt/reBTTCkbiToQFqjBpsEM1DJVaMKAh3S5bNRF3F7onP+xZ3ddY0QooAvEkjDCjSIjhCNYB4Ud/QLdStu8MRpe62VNqXRKkd0ofKzmllAnfynWzci++Jj/SpgQVblh04xWfVMN1Hc2lREuY+Rr+JvSWa8QY4JDymfCwMS63KGjqGUQ9uuRApMAx/3kK6ECHYCKbou660JpA== X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Oct 2024 15:36:35.3616 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 4aa29923-2c37-447c-6be5-08dce48a5493 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: AM2PEPF0001C715.eurprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: VE1P190MB1006 X-OriginatorOrg: napatech.com X-BESS-ID: 1728057063-305791-12644-36017-1 X-BESS-VER: 2019.1_20240924.1654 X-BESS-Apparent-Source-IP: 104.47.17.169 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 cloudscan23-144.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