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 D2FFC45ACC; Sun, 6 Oct 2024 22:42:44 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 022B140E3B; Sun, 6 Oct 2024 22:38:46 +0200 (CEST) Received: from egress-ip11a.ess.de.barracuda.com (egress-ip11a.ess.de.barracuda.com [18.184.203.234]) by mails.dpdk.org (Postfix) with ESMTP id 1663140BA6 for ; Sun, 6 Oct 2024 22:38:10 +0200 (CEST) Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05lp2111.outbound.protection.outlook.com [104.47.18.111]) by mx-outbound44-124.eu-central-1c.ess.aws.cudaops.com (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sun, 06 Oct 2024 20:38:08 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=zWi5xDcugbbaO0d3J5X/KeQ0lLmIGdUtEBOUPKOJQiWev7TLQPAR/MhednkE0Ms63fBOnLXjLjpdAPC2EhN1bL4RRSNobjz81cDj0xCfGUuI1krF2WcTDSHUdpcVgegLLwbERR3eVKWe+FcoVVtKwtCdHAmQxzdDjfedz5Mjl8VGuk/SDtQTNAzqEKcnH5yCSHfZiLg+IONZDsG7X2eZKQTAYhhfJb67Krhw/zRfBhVlD7OY3SWbipmMmxyV+RuM8j33GHenVgxWSA+BmtJFTR5EY+WJKGyrgWf9gP30F0x7mjeY7cn9Wl8aB6F/OD8gvBsgrQfPhA4jrtjJUjUy8A== 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=kh5epxbGVxNK2B2KvgUvs+SRRXy18GK3r4q5IFVFtqtQSBC8W9JI+A6RXxNMgW2I2F6CEFlPzKqwYYT3n9dnjJMEu7S/AumrgO9RFf8q20Y+vIUbpStdWj8EQTGotX4xADsjQJ08tt1txm/k8uLHa7ckaefVx1sJHW6HoT2/ajbw04aiD7S7B/Lz3rSNuDnjy73IGTAetBFemsmFmH7e9MwUcM4CBt2VftrNuKaTCxs0Dg3An6APwFz6uZpx6e/0/G9MbgVTX9csUJ5xJev/xJkLnKJChuMlM/JUv/8fEGlRAGTjCfpDeeaxnvWJV8QP06mHR0AD7uYl8bCie3+lvg== 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=YrUNzqMKTsxU/RAGJVAq+9YCRDB/SzdYUzMewN/YRfkQOPdEzKlK1dx7tBjniC0GQ/8L5Diaky8tgBQY7aqJs1ldOsUNGuXlPM3TMYR/YzNO0qWaQ0//+5KogxQrAaX47NvmqCWzcC6VAf5s+D+ewnuwUFB1IoQa2ckrD6QCam4= Received: from AM6P191CA0011.EURP191.PROD.OUTLOOK.COM (2603:10a6:209:8b::24) by AS8P190MB1045.EURP190.PROD.OUTLOOK.COM (2603:10a6:20b:2b7::11) 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:38:06 +0000 Received: from AMS0EPF00000190.eurprd05.prod.outlook.com (2603:10a6:209:8b:cafe::5e) by AM6P191CA0011.outlook.office365.com (2603:10a6:209:8b::24) 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:38:06 +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:38:06 +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 44/50] net/ntnic: add functions for availability monitor management Date: Sun, 6 Oct 2024 22:37:11 +0200 Message-ID: <20241006203728.330792-45-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_|AS8P190MB1045:EE_ Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: 8645689b-7e47-401c-cf65-08dce646c87e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|376014|1800799024|36860700013|82310400026; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?HNeMgp9zM90+sX42r6u6198AhMwfDuqxR0QRlLT4coCYoSXm70bA7B0EXRKM?= =?us-ascii?Q?SJRj5Snu8olKrTGujFBQ6Vs23yJJu8BCJ0yBxblMQ3Wb4w4JtZogn67nc8G1?= =?us-ascii?Q?xpLt7WfJNGtyBf2HOuSUP8KkhrCl8ycznFK5eIjeLzW/in6EvasNpB6ShKAE?= =?us-ascii?Q?DR7FoRia1DrG9Ttx2WhQhfBrWH4m+yxkh+8aKBrLB1bi+Uaw4K8c/h34rDvF?= =?us-ascii?Q?eaQCe+XqmJHmxk5ZkZWrt2Iw5sjwNxcqyKCCMNpu2UVpvo2RKUGZCO1kijEy?= =?us-ascii?Q?issjr8MmzdwIhqRLpo+J0ZoUF7/1/tWODTUmmtM0pb5eB14xePy4Y0b1qI0f?= =?us-ascii?Q?CCKZc2nOJifavu2NGrLuMEWFOxUl3k68cXj3vG+FNJ7uJ5HfM58n/zniYxNP?= =?us-ascii?Q?x8pUHuyMLvKJ4z82ofeI4LfAiH+zXcnow2RZOlDYiV5Pe9GXI1UUE0OeKyGw?= =?us-ascii?Q?pVl086ZyJyzR0cFZWawT+PLBHGT01lZD+TcJMTdSQMkEqhe0/jG9R2Dlcwd0?= =?us-ascii?Q?1Yn+T7BvKBNN/sktbBPvSrsXbZVAlUSpCBTXOcqkX4U14zBI5DAsym6bJ3Nd?= =?us-ascii?Q?+5GFuNRqIkV/n2qLo6Gr7Emvq0b2UA2RXRKAzJGaxEkVkBIEAH5gr4JErCjd?= =?us-ascii?Q?3YhifpdIT3KElTqsmdFZoZc0gtzEOyCdnv7Ir510rppFzBNLe8xPekSpbEun?= =?us-ascii?Q?CWet1V/pWfOIfAeAjCkzygC94atD+NH3mEY0/pLbFdFtd6B6jawxhP9wIIXD?= =?us-ascii?Q?VdRMQhfEc38suihWsA6lWroI/gxwxcNjXgoDmWztmj4+M9NOY0Rx3xj0pvo2?= =?us-ascii?Q?GQMFyHpckyydq1P9oxQz+7SFVIWvD3eGZbUefH+6hrHi9/ceTxaRCOnPKVaT?= =?us-ascii?Q?1An/G3HdhexqyPt8T3pqqH5xTm4KInJmSn6sXR5Cdw7uNmlE5nJP3PJcacWB?= =?us-ascii?Q?5UNuICTn6uWF1UbOFDRX0ojqyTyYQPq6Abg7pgNwo9F3UmXBgeUl7/wsDUl0?= =?us-ascii?Q?LRGzWZr6Q5OWsk11Hh3k3us7gAcZk+SkdUJt8wZNniaWP0tQ7zVaDlHGmf2/?= =?us-ascii?Q?2Mp/ywd0zsMjjPasXFMhKrPrxZdo1rWpvBZgILyuQQTL5NyGyNmht68K3Ifn?= =?us-ascii?Q?RL3m84BAOoOkn+klBR5dENYm4zVUN8x7h7R/e5DxvqLurux97y+Cp8kgy9sO?= =?us-ascii?Q?q6OFIW4kVB6fq96wAhUoFFH5cbQZthiqpWAAeaS4QilpC/VZRWSuBbsnzw24?= =?us-ascii?Q?+3bvTGKbLpf6BQvrULNXkB2RvJHe0BI3/iaN/Kt6+pOLiNBUkaoq+CYd1u3v?= =?us-ascii?Q?6FpeIWkefZ86S9PgLwEGL7L4xPn/yxJtlJQ2kmWQK/Y6/HnY+9J4ifLJbrWZ?= =?us-ascii?Q?wwP0QK2AdPwNVK1NBsUGigRplRpj?= 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)(1800799024)(36860700013)(82310400026); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: 1T42ZAW1EreaNaaWUv2PfsQKYYK4FjPnyuLDa1DPChgH1q4zPM5aEeydfybzLYhPEJkZP+Mh7cxy5r0AonyEDVvYZ7HS1iyZFJdpbK7sgNJ7MxYNyHFdHmCA6wJ1KbOEdI58tfZYpnMAgShhw1gMYuwyjBsL7LJdPPrxkMUuHsoFdBx63qdtYFQlef7UF4OB0KTbwvZcPxxeuBrRXWyo74fYOEGnKOATQ465tSKbDL1sIcdFVgCoSvP7iWRGjqLJo3LKSuczQQmykoBEiidXulm27R4upcW6i6np7/S6oElfgNyrX8Ls2em24BqLeHJHh/dwAPyc/f9v04Wdzgu4ZgblcBW7X4R52OO1t2jaeYBV0HS+3kZDWwaJy94I7L/wUXys9abxHLzvGpJCBvnYqQTX5HBuNC5rEQfv8XRc90hwgWB6pS3vSDpZvaFnTEq/g/y534BqnL1ARp3vdgZHydlG3lsXEHQ6MfKqV9B0ZnfAL9kpABSlQLTM32bFGrnypl4jSfcIJx4ngH5sjz/MhqbjIAGa4FfH8YdKjJIDlpKi3EciEDyjT2KJLPCxpWVGpffDovORwB4sHHAMrLkWhy9KAopFzQ4m+GEurGi7WhCqzopKoocJh+kFNcU8xb+kT+d0mdKdU4UYEigXRQh6bA== X-OriginatorOrg: napatech.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Oct 2024 20:38:06.4214 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 8645689b-7e47-401c-cf65-08dce646c87e 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: AS8P190MB1045 X-BESS-ID: 1728247088-311388-12690-123479-1 X-BESS-VER: 2019.1_20240924.1654 X-BESS-Apparent-Source-IP: 104.47.18.111 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.259547 [from cloudscan15-206.eu-central-1a.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