From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <dev-bounces@dpdk.org>
Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124])
	by inbox.dpdk.org (Postfix) with ESMTP id 292CC45ACC;
	Sun,  6 Oct 2024 22:42:38 +0200 (CEST)
Received: from mails.dpdk.org (localhost [127.0.0.1])
	by mails.dpdk.org (Postfix) with ESMTP id C6E8440E50;
	Sun,  6 Oct 2024 22:38:44 +0200 (CEST)
Received: from egress-ip11b.ess.de.barracuda.com
 (egress-ip11b.ess.de.barracuda.com [18.185.115.215])
 by mails.dpdk.org (Postfix) with ESMTP id 6D19440B9C
 for <dev@dpdk.org>; Sun,  6 Oct 2024 22:38:08 +0200 (CEST)
Received: from EUR05-VI1-obe.outbound.protection.outlook.com
 (mail-vi1eur05lp2175.outbound.protection.outlook.com [104.47.17.175]) 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:38:07 +0000
ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;
 b=qg6gf7aSp8xhppQPgwldkdZ/7/gbC+2V/5B0f8aB867Jxh4uqtkl/jENp3nVstBKaSzgeZrchw4TNtzWvJUutcF4LUxXueR1gHOdt7w2Kqyl2qv7wzHNdd9BwDwZewWLp7NCdjnrOTTwbzCBDwn5V2iIJJt2YPSejLWYlsms06xGtAOc0/WCKf36lpQAM1HoOLPSPh/D+8SKhzbxuvavbN7ylkojkYmqV8kkUoYMb1A0JQ3/W2XtpGBj/Vp0D4nqZCgk686AJP7GQv7oROcOl43eyiwMQttC437FU51/B4VcMUl8MfmwScAVgtODw/C3zSA4hTqnlnsxCamI83MViw==
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=CIUKQRa+9m6X8SaN5snGHAk/5MeLQCpmIvri8PwYaBE=;
 b=hbP2SmZWvAAmcNsNfeYOxEwjN7L7qO9nd6I2wAV1zhib5+ceIDWjvlXDAHDk/RsjBhehwc04CkepowGc9yDkdqi51HTQyo5AMQvI5dRkEA3kd4KVVI0ame7ZC18nfX9y9kvaQUJdaccJCqytYX6Z52134D3dvYqsCAT/2OffLRYk92gRGjLBQ5q1j9vamxPpUb49ohjZYbnHlMgmyuiQY6j7aHbgAVLQw0pea0KBe3jfplzHwwdysEjfENjXSjXylCbN6B00lIlGbOTBe5XBiZJ/aUGlm+bJ+iZ37dRO+vU8P9+UoyzJ3n+CcHNLIuI14KZqWIk57kJ0vxdId8EJJw==
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=CIUKQRa+9m6X8SaN5snGHAk/5MeLQCpmIvri8PwYaBE=;
 b=NoI29IG/JsR+qfvLBmIATUpMGW1lOLSXpWu6srz6Rga7KW9vrxMoGG9wPl9b443MhGdQvskefT6WfN8FQVexaE1wlNA22SCEKXix97JCI9u+fNYRobAcT1e6vbkbM0b1/NqAHoqkrrMk0chlhh2xdNIdEO0AIOZdif3/LParHUw=
Received: from AM6P191CA0008.EURP191.PROD.OUTLOOK.COM (2603:10a6:209:8b::21)
 by AS8P190MB1061.EURP190.PROD.OUTLOOK.COM (2603:10a6:20b:2e7::17) with
 Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8026.22; Sun, 6 Oct
 2024 20:38:05 +0000
Received: from AMS0EPF00000190.eurprd05.prod.outlook.com
 (2603:10a6:209:8b:cafe::c7) by AM6P191CA0008.outlook.office365.com
 (2603:10a6:209:8b::21) with Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8026.21 via Frontend
 Transport; Sun, 6 Oct 2024 20:38:05 +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:05
 +0000
From: Serhii Iliushyk <sil-plv@napatech.com>
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 <dvo-plv@napatech.com>
Subject: [PATCH v1 42/50] net/ntnic: add init for virt queues in the DBS
Date: Sun,  6 Oct 2024 22:37:09 +0200
Message-ID: <20241006203728.330792-43-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_|AS8P190MB1061:EE_
Content-Type: text/plain
X-MS-Office365-Filtering-Correlation-Id: 516c0a5f-7e20-44c3-9c5c-08dce646c7c9
X-MS-Exchange-SenderADCheck: 1
X-MS-Exchange-AntiSpam-Relay: 0
X-Microsoft-Antispam: BCL:0;
 ARA:13230040|1800799024|82310400026|36860700013|376014; 
X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?TNQRAsWaMvDzQF4rI8ivZ5AX8IlfglpyWJGz2eb/5HpP6dBkYA0CEjf3l//O?=
 =?us-ascii?Q?lIcklrfqkTw0L37izI2YssJs3biWbUnvCpHXfNeYcLIrLCs4xpns2Bcx2SHX?=
 =?us-ascii?Q?FnqULK3uVuZUrkCTjEamsuqIDar6HsZFszKO9fCZmqII8cSLiw4Ipd2I4Cu/?=
 =?us-ascii?Q?jk/q9R3SPWlnJcuW+0HqXYkZsYy8vnSFopmeMz4esgvLzKlQqTyhcqGylEa0?=
 =?us-ascii?Q?96G5kh5cAbb3JLYOYyd7jVY+vhYsqMgV8jZnNepI2EBC3qmkxPNm24eS+7is?=
 =?us-ascii?Q?qTiy0JlJ8LOaAkpat4tqbqgLaSSEuTAQZe+E27PPJuOQ8nbxL2oEf/xLJ6nl?=
 =?us-ascii?Q?zasWYyVlXNFg4pE6TmaWFdiK37zAx1woHRrFrmkMN7NNrLlJMG0XY1OSz41C?=
 =?us-ascii?Q?0WZagWWo3ftHXxfUh5BWM6tnOyz5sesbV/ajTdJ+ty0pvBztl2XozMm0/LUh?=
 =?us-ascii?Q?XCv07jBvFjbbL6tgUEuiGDg6WC52fB3BRW8GOcU604/b036q3GM+qSRUm+um?=
 =?us-ascii?Q?dO48KW/f5MJnwzCtW4Fqk3Ca12z7qOG1nUEYWR06zGpcSrkAsKodaMexLDsO?=
 =?us-ascii?Q?yOrmH2mI4F0HJcOPYuPFRIJc4y8daY5Z9yfzA1i/7ajwcW3o9Ctj+2tx2teG?=
 =?us-ascii?Q?MluKAfulJm8PgKnzw7Yjp4wThU3uhbQwJIcPoAZbVbGogewH06jazBuurZPq?=
 =?us-ascii?Q?jfWImflicG1wT4m7Zxfup2AmUEUyR9lvqf0wT1Mgee+vnrSIJJa8xHW66c4b?=
 =?us-ascii?Q?Dd7XDTgowKxnqJUgIOtxlzhPCB5aQwt9jXfN6L038k43JNlgf3FS21/L0bXh?=
 =?us-ascii?Q?Yp7l5BY9GamdM64oJln8KXsUKd2nwodI0nfx+PQUkxHt9cN/bLDzCVXL8+p5?=
 =?us-ascii?Q?4AUBmgygWd2/1RtmeUeFIcDBjqETjCBnw3S4e52gD20wWbrxiaFHW2zwlQX0?=
 =?us-ascii?Q?zYmWmmnN/9/ysdrYnVpzqifF+kRFCIysIwjudminQpEUG/UtmQtXjVwqeCwJ?=
 =?us-ascii?Q?kEsG37s1m1pbljn0hXyVzLo9XTKpQPt9BF9kbaO8b3EzjtXHC0W0cDuPyyPM?=
 =?us-ascii?Q?2MUgdiUhPZ3hEnRz/b3W2vD5Z374ldkfXaNXxxmaz8PZ7/1AzhgMPhsvdVGO?=
 =?us-ascii?Q?nRdP8jntvEK82WY8SwNYy43chB/homJnsRDP8oE4T1xkJzqdmsEOmG/ST4EM?=
 =?us-ascii?Q?Fsy+kvP6p35Z8nLC7EZ3rlC5tLVg0gkuoWymcBKIIRhLTvMRnoeRfl3gEg9G?=
 =?us-ascii?Q?lnbgKqhPv0aSe1UxQ8WGx18J0h4hUxrWseebCKN1bpGB7386oX+u9jN+nTPN?=
 =?us-ascii?Q?BuksGIgrxpohvBZlcBqnFp2j2tVC4m3A6910Y1jlYPMdKtb485grHLLP4GcG?=
 =?us-ascii?Q?g2NAPhg=3D?=
X-Forefront-Antispam-Report: CIP:178.72.21.4; CTRY:DK; LANG:en; SCL:1; SRV:;
 IPV:NLI; SFV:NSPM; H:localhost.localdomain; PTR:InfoDomainNonexistent;
 CAT:NONE; SFS:(13230040)(1800799024)(82310400026)(36860700013)(376014);
 DIR:OUT; SFP:1102; 
X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1
X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: LCyQCjl+G5uT++eJ69ljldkLg91ld+6E5XY/ObeY9tPa6MXOBdum3+jYIp5EUc1Wh8VoAvj++IwKOIqAZVLYGQVGUJmjwciLBPgv8meFe6wsJg+IVIkLO6xpzZin8hCi4ey1VoOglFlb7Z1BOc3ZN2WtXiaTrSbK3dLD24swBH4bAv30A6b/NhitzpaUOKntFRsUaOSwE3fsHXQf8pNg2j8vgmXVnBGnKN5K9Hv9ycJgdco2ZgIpQ0Pqvosstl95+iAf0DZjYsJCxqO1C4P/k1IVoU40LSf8JdWabrgUBdW69Il0doxbX3kxI8TtQu5ez2DFcYguy1msra4cjWZmtCINmOHSrkTv+aQ7uprQzNvQcWL8evg8+eNOtxS/ctTh+8YppmL4hntUz/7WrkAB2RboScTSM+tODtweZITgzX8mhwJFtGIxB2yA1JGVOLXAKW5wxm48R9jdPUALXewhSXmt5h4BOEH8OLT3wzuhZg1BliTKbfA6jyEshBqgKPGsUdfUpPexWQl5V1diH2rlgdKls4zTjzhHLiPJG/WfQvSQvJSbtgITxeS47Y54g1IQPh5EemZJ1iyA4kNKr3MCn66rxUmTQPhzw/zM/vGjMiQ8vfkRWhUhuWScH3DSvRu34xiOchz+8b7cEfuzDxVgkQ==
X-OriginatorOrg: napatech.com
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Oct 2024 20:38:05.2339 (UTC)
X-MS-Exchange-CrossTenant-Network-Message-Id: 516c0a5f-7e20-44c3-9c5c-08dce646c7c9
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: AS8P190MB1061
X-BESS-ID: 1728247087-305791-12647-147805-1
X-BESS-VER: 2019.1_20240924.1654
X-BESS-Apparent-Source-IP: 104.47.17.175
X-BESS-Parts: H4sIAAAAAAACA4uuVkqtKFGyUioBkjpK+cVKVoYmZuaWQGYGUDTVwMwk0TTZ2M
 zQwMLSxCDRyMjEzDjR0NLSIMnCMs3EQqk2FgA+0MfCQgAAAA==
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 <dev.dpdk.org>
List-Unsubscribe: <https://mails.dpdk.org/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://mails.dpdk.org/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <https://mails.dpdk.org/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
Errors-To: dev-bounces@dpdk.org

From: Danylo Vodopianov <dvo-plv@napatech.com>

DBS (DVIO Buffer System) module controls the scatter-gather buffer system
that let's the host CPU interact with packets.

Macros and Definitions: Defined constants for queue management and
polling speeds.

Data Structures: Added structures and arrays for RX and TX
queue management.

Procedures: Implemented initialization routines for setting up
queues and configuring Direct Buffer Storage (DBS) in FPGA.

Main Initialization: Allocates DBS modules, resets, and configures
RX and TX queues.

Signed-off-by: Danylo Vodopianov <dvo-plv@napatech.com>
---
 drivers/net/ntnic/dbsconfig/ntnic_dbsconfig.c | 154 ++++++++++++++++++
 drivers/net/ntnic/include/ntnic_dbs.h         |  71 +++++++-
 drivers/net/ntnic/meson.build                 |   2 +
 drivers/net/ntnic/nthw/dbs/nthw_dbs.c         | 135 +++++++++++++++
 .../ntnic/nthw/supported/nthw_fpga_mod_defs.h |   1 +
 drivers/net/ntnic/ntnic_mod_reg.c             |  11 +-
 drivers/net/ntnic/ntnic_mod_reg.h             |   2 +
 7 files changed, 374 insertions(+), 2 deletions(-)
 create mode 100644 drivers/net/ntnic/dbsconfig/ntnic_dbsconfig.c
 create mode 100644 drivers/net/ntnic/nthw/dbs/nthw_dbs.c

diff --git a/drivers/net/ntnic/dbsconfig/ntnic_dbsconfig.c b/drivers/net/ntnic/dbsconfig/ntnic_dbsconfig.c
new file mode 100644
index 0000000000..fc1dab6c5f
--- /dev/null
+++ b/drivers/net/ntnic/dbsconfig/ntnic_dbsconfig.c
@@ -0,0 +1,154 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2023 Napatech A/S
+ */
+
+#include <unistd.h>
+
+#include "ntos_drv.h"
+#include "ntnic_virt_queue.h"
+#include "ntnic_mod_reg.h"
+#include "ntlog.h"
+
+#define MAX_VIRT_QUEUES 128
+
+#define LAST_QUEUE 127
+#define DISABLE 0
+#define ENABLE 1
+#define RX_AM_DISABLE DISABLE
+#define RX_AM_ENABLE ENABLE
+#define RX_UW_DISABLE DISABLE
+#define RX_UW_ENABLE ENABLE
+#define RX_Q_DISABLE DISABLE
+#define RX_Q_ENABLE ENABLE
+#define RX_AM_POLL_SPEED 5
+#define RX_UW_POLL_SPEED 9
+#define INIT_QUEUE 1
+
+#define TX_AM_DISABLE DISABLE
+#define TX_AM_ENABLE ENABLE
+#define TX_UW_DISABLE DISABLE
+#define TX_UW_ENABLE ENABLE
+#define TX_Q_DISABLE DISABLE
+#define TX_Q_ENABLE ENABLE
+#define TX_AM_POLL_SPEED 5
+#define TX_UW_POLL_SPEED 8
+
+enum nthw_virt_queue_usage {
+	NTHW_VIRTQ_UNUSED = 0
+};
+
+struct nthw_virt_queue {
+	enum nthw_virt_queue_usage usage;
+};
+
+static struct nthw_virt_queue rxvq[MAX_VIRT_QUEUES];
+static struct nthw_virt_queue txvq[MAX_VIRT_QUEUES];
+
+static void dbs_init_rx_queue(nthw_dbs_t *p_nthw_dbs, uint32_t queue, uint32_t start_idx,
+	uint32_t start_ptr)
+{
+	uint32_t busy;
+	uint32_t init;
+	uint32_t dummy;
+
+	do {
+		get_rx_init(p_nthw_dbs, &init, &dummy, &busy);
+	} while (busy != 0);
+
+	set_rx_init(p_nthw_dbs, start_idx, start_ptr, INIT_QUEUE, queue);
+
+	do {
+		get_rx_init(p_nthw_dbs, &init, &dummy, &busy);
+	} while (busy != 0);
+}
+
+static void dbs_init_tx_queue(nthw_dbs_t *p_nthw_dbs, uint32_t queue, uint32_t start_idx,
+	uint32_t start_ptr)
+{
+	uint32_t busy;
+	uint32_t init;
+	uint32_t dummy;
+
+	do {
+		get_tx_init(p_nthw_dbs, &init, &dummy, &busy);
+	} while (busy != 0);
+
+	set_tx_init(p_nthw_dbs, start_idx, start_ptr, INIT_QUEUE, queue);
+
+	do {
+		get_tx_init(p_nthw_dbs, &init, &dummy, &busy);
+	} while (busy != 0);
+}
+
+static int nthw_virt_queue_init(struct fpga_info_s *p_fpga_info)
+{
+	assert(p_fpga_info);
+
+	nthw_fpga_t *const p_fpga = p_fpga_info->mp_fpga;
+	nthw_dbs_t *p_nthw_dbs;
+	int res = 0;
+	uint32_t i;
+
+	p_fpga_info->mp_nthw_dbs = NULL;
+
+	p_nthw_dbs = nthw_dbs_new();
+
+	if (p_nthw_dbs == NULL)
+		return -1;
+
+	res = dbs_init(NULL, p_fpga, 0);/* Check that DBS exists in FPGA */
+
+	if (res) {
+		free(p_nthw_dbs);
+		return res;
+	}
+
+	res = dbs_init(p_nthw_dbs, p_fpga, 0);	/* Create DBS module */
+
+	if (res) {
+		free(p_nthw_dbs);
+		return res;
+	}
+
+	p_fpga_info->mp_nthw_dbs = p_nthw_dbs;
+
+	for (i = 0; i < MAX_VIRT_QUEUES; ++i) {
+		rxvq[i].usage = NTHW_VIRTQ_UNUSED;
+		txvq[i].usage = NTHW_VIRTQ_UNUSED;
+	}
+
+	dbs_reset(p_nthw_dbs);
+
+	for (i = 0; i < NT_DBS_RX_QUEUES_MAX; ++i)
+		dbs_init_rx_queue(p_nthw_dbs, i, 0, 0);
+
+	for (i = 0; i < NT_DBS_TX_QUEUES_MAX; ++i)
+		dbs_init_tx_queue(p_nthw_dbs, i, 0, 0);
+
+	set_rx_control(p_nthw_dbs, LAST_QUEUE, RX_AM_DISABLE, RX_AM_POLL_SPEED, RX_UW_DISABLE,
+		RX_UW_POLL_SPEED, RX_Q_DISABLE);
+	set_rx_control(p_nthw_dbs, LAST_QUEUE, RX_AM_ENABLE, RX_AM_POLL_SPEED, RX_UW_ENABLE,
+		RX_UW_POLL_SPEED, RX_Q_DISABLE);
+	set_rx_control(p_nthw_dbs, LAST_QUEUE, RX_AM_ENABLE, RX_AM_POLL_SPEED, RX_UW_ENABLE,
+		RX_UW_POLL_SPEED, RX_Q_ENABLE);
+
+	set_tx_control(p_nthw_dbs, LAST_QUEUE, TX_AM_DISABLE, TX_AM_POLL_SPEED, TX_UW_DISABLE,
+		TX_UW_POLL_SPEED, TX_Q_DISABLE);
+	set_tx_control(p_nthw_dbs, LAST_QUEUE, TX_AM_ENABLE, TX_AM_POLL_SPEED, TX_UW_ENABLE,
+		TX_UW_POLL_SPEED, TX_Q_DISABLE);
+	set_tx_control(p_nthw_dbs, LAST_QUEUE, TX_AM_ENABLE, TX_AM_POLL_SPEED, TX_UW_ENABLE,
+		TX_UW_POLL_SPEED, TX_Q_ENABLE);
+
+	return 0;
+}
+
+static struct sg_ops_s sg_ops = {
+	.nthw_virt_queue_init = nthw_virt_queue_init
+};
+
+void sg_init(void)
+{
+	NT_LOG(INF, NTNIC, "SG ops initialized\n");
+	register_sg_ops(&sg_ops);
+}
diff --git a/drivers/net/ntnic/include/ntnic_dbs.h b/drivers/net/ntnic/include/ntnic_dbs.h
index 551c6ade43..a64d2a0aeb 100644
--- a/drivers/net/ntnic/include/ntnic_dbs.h
+++ b/drivers/net/ntnic/include/ntnic_dbs.h
@@ -8,12 +8,81 @@
 
 #include "nthw_fpga_model.h"
 
+#define NT_DBS_RX_QUEUES_MAX (128)
+#define NT_DBS_TX_QUEUES_MAX (128)
+
 /*
  * Struct for implementation of memory bank shadows
  */
 
-struct nthw_dbs_s;
+struct nthw_dbs_s {
+	nthw_fpga_t *mp_fpga;
+	nthw_module_t *mp_mod_dbs;
+	int mn_instance;
+
+	int mn_param_dbs_present;
+
+	nthw_register_t *mp_reg_rx_control;
+	nthw_field_t *mp_fld_rx_control_last_queue;
+	nthw_field_t *mp_fld_rx_control_avail_monitor_enable;
+	nthw_field_t *mp_fld_rx_control_avail_monitor_scan_speed;
+	nthw_field_t *mp_fld_rx_control_used_write_enable;
+	nthw_field_t *mp_fld_rx_control_used_writer_update_speed;
+	nthw_field_t *mp_fld_rx_control_rx_queues_enable;
+
+	nthw_register_t *mp_reg_tx_control;
+	nthw_field_t *mp_fld_tx_control_last_queue;
+	nthw_field_t *mp_fld_tx_control_avail_monitor_enable;
+	nthw_field_t *mp_fld_tx_control_avail_monitor_scan_speed;
+	nthw_field_t *mp_fld_tx_control_used_write_enable;
+	nthw_field_t *mp_fld_tx_control_used_writer_update_speed;
+	nthw_field_t *mp_fld_tx_control_tx_queues_enable;
+
+	nthw_register_t *mp_reg_rx_init;
+	nthw_field_t *mp_fld_rx_init_init;
+	nthw_field_t *mp_fld_rx_init_queue;
+	nthw_field_t *mp_fld_rx_init_busy;
+
+	nthw_register_t *mp_reg_rx_init_val;
+	nthw_field_t *mp_fld_rx_init_val_idx;
+	nthw_field_t *mp_fld_rx_init_val_ptr;
+
+	nthw_register_t *mp_reg_tx_init;
+	nthw_field_t *mp_fld_tx_init_init;
+	nthw_field_t *mp_fld_tx_init_queue;
+	nthw_field_t *mp_fld_tx_init_busy;
+
+	nthw_register_t *mp_reg_tx_init_val;
+	nthw_field_t *mp_fld_tx_init_val_idx;
+	nthw_field_t *mp_fld_tx_init_val_ptr;
+
+};
 
 typedef struct nthw_dbs_s nthw_dbs_t;
 
+nthw_dbs_t *nthw_dbs_new(void);
+int dbs_init(nthw_dbs_t *p, nthw_fpga_t *p_fpga, int n_instance);
+void dbs_reset(nthw_dbs_t *p);
+
+int set_rx_control(nthw_dbs_t *p,
+	uint32_t last_queue,
+	uint32_t avail_monitor_enable,
+	uint32_t avail_monitor_speed,
+	uint32_t used_write_enable,
+	uint32_t used_write_speed,
+	uint32_t rx_queue_enable);
+int set_tx_control(nthw_dbs_t *p,
+	uint32_t last_queue,
+	uint32_t avail_monitor_enable,
+	uint32_t avail_monitor_speed,
+	uint32_t used_write_enable,
+	uint32_t used_write_speed,
+	uint32_t tx_queue_enable);
+int set_rx_init(nthw_dbs_t *p, uint32_t start_idx, uint32_t start_ptr, uint32_t init,
+	uint32_t queue);
+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);
+
 #endif	/* _NTNIC_DBS_H_ */
diff --git a/drivers/net/ntnic/meson.build b/drivers/net/ntnic/meson.build
index 66d2770da7..3d9566a52e 100644
--- a/drivers/net/ntnic/meson.build
+++ b/drivers/net/ntnic/meson.build
@@ -24,9 +24,11 @@ includes = [
 # all sources
 sources = files(
         'adapter/nt4ga_adapter.c',
+        'dbsconfig/ntnic_dbsconfig.c',
         'link_mgmt/link_100g/nt4ga_link_100g.c',
         'link_mgmt/nt4ga_link.c',
         'nim/i2c_nim.c',
+        'nthw/dbs/nthw_dbs.c',
         'nthw/supported/nthw_fpga_9563_055_049_0000.c',
         'nthw/supported/nthw_fpga_instances.c',
         'nthw/supported/nthw_fpga_mod_str_map.c',
diff --git a/drivers/net/ntnic/nthw/dbs/nthw_dbs.c b/drivers/net/ntnic/nthw/dbs/nthw_dbs.c
new file mode 100644
index 0000000000..853d7bc1ec
--- /dev/null
+++ b/drivers/net/ntnic/nthw/dbs/nthw_dbs.c
@@ -0,0 +1,135 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2023 Napatech A/S
+ */
+
+#include <errno.h>
+#include "ntlog.h"
+
+#include "nthw_drv.h"
+#include "nthw_register.h"
+
+nthw_dbs_t *nthw_dbs_new(void)
+{
+	nthw_dbs_t *p = malloc(sizeof(nthw_dbs_t));
+
+	if (p)
+		memset(p, 0, sizeof(nthw_dbs_t));
+
+	return p;
+}
+
+int dbs_init(nthw_dbs_t *p, nthw_fpga_t *p_fpga, int n_instance)
+{
+	nthw_module_t *mod = nthw_fpga_query_module(p_fpga, MOD_DBS, n_instance);
+
+	if (p == NULL)
+		return mod == NULL ? -1 : 0;
+
+	if (mod == NULL) {
+		NT_LOG(ERR, NTHW, "%s: DBS %d: no such instance\n",
+			p_fpga->p_fpga_info->mp_adapter_id_str, n_instance);
+		return -1;
+	}
+
+	p->mp_fpga = p_fpga;
+	p->mn_instance = n_instance;
+	p->mp_mod_dbs = mod;
+
+	p->mn_param_dbs_present = nthw_fpga_get_product_param(p_fpga, NT_DBS_PRESENT, 0);
+
+	if (p->mn_param_dbs_present == 0) {
+		NT_LOG(WRN, NTHW,
+			"%s: DBS %d: logical error: module found but not flagged at present\n",
+			p->mp_fpga->p_fpga_info->mp_adapter_id_str, p->mn_instance);
+	}
+
+	return 0;
+}
+
+void dbs_reset(nthw_dbs_t *p)
+{
+	(void)p;
+}
+
+int set_rx_control(nthw_dbs_t *p,
+	uint32_t last_queue,
+	uint32_t avail_monitor_enable,
+	uint32_t avail_monitor_speed,
+	uint32_t used_write_enable,
+	uint32_t used_write_speed,
+	uint32_t rx_queue_enable)
+{
+	nthw_field_set_val32(p->mp_fld_rx_control_last_queue, last_queue);
+	nthw_field_set_val32(p->mp_fld_rx_control_avail_monitor_enable, avail_monitor_enable);
+	nthw_field_set_val32(p->mp_fld_rx_control_avail_monitor_scan_speed, avail_monitor_speed);
+	nthw_field_set_val32(p->mp_fld_rx_control_used_write_enable, used_write_enable);
+	nthw_field_set_val32(p->mp_fld_rx_control_used_writer_update_speed, used_write_speed);
+	nthw_field_set_val32(p->mp_fld_rx_control_rx_queues_enable, rx_queue_enable);
+	nthw_register_flush(p->mp_reg_rx_control, 1);
+	return 0;
+}
+
+int set_tx_control(nthw_dbs_t *p,
+	uint32_t last_queue,
+	uint32_t avail_monitor_enable,
+	uint32_t avail_monitor_speed,
+	uint32_t used_write_enable,
+	uint32_t used_write_speed,
+	uint32_t tx_queue_enable)
+{
+	nthw_field_set_val32(p->mp_fld_tx_control_last_queue, last_queue);
+	nthw_field_set_val32(p->mp_fld_tx_control_avail_monitor_enable, avail_monitor_enable);
+	nthw_field_set_val32(p->mp_fld_tx_control_avail_monitor_scan_speed, avail_monitor_speed);
+	nthw_field_set_val32(p->mp_fld_tx_control_used_write_enable, used_write_enable);
+	nthw_field_set_val32(p->mp_fld_tx_control_used_writer_update_speed, used_write_speed);
+	nthw_field_set_val32(p->mp_fld_tx_control_tx_queues_enable, tx_queue_enable);
+	nthw_register_flush(p->mp_reg_tx_control, 1);
+	return 0;
+}
+
+int set_rx_init(nthw_dbs_t *p, uint32_t start_idx, uint32_t start_ptr, uint32_t init,
+	uint32_t queue)
+{
+	if (p->mp_reg_rx_init_val) {
+		nthw_field_set_val32(p->mp_fld_rx_init_val_idx, start_idx);
+		nthw_field_set_val32(p->mp_fld_rx_init_val_ptr, start_ptr);
+		nthw_register_flush(p->mp_reg_rx_init_val, 1);
+	}
+
+	nthw_field_set_val32(p->mp_fld_rx_init_init, init);
+	nthw_field_set_val32(p->mp_fld_rx_init_queue, queue);
+	nthw_register_flush(p->mp_reg_rx_init, 1);
+	return 0;
+}
+
+int get_rx_init(nthw_dbs_t *p, uint32_t *init, uint32_t *queue, uint32_t *busy)
+{
+	*init = nthw_field_get_val32(p->mp_fld_rx_init_init);
+	*queue = nthw_field_get_val32(p->mp_fld_rx_init_queue);
+	*busy = nthw_field_get_val32(p->mp_fld_rx_init_busy);
+	return 0;
+}
+
+int set_tx_init(nthw_dbs_t *p, uint32_t start_idx, uint32_t start_ptr, uint32_t init,
+	uint32_t queue)
+{
+	if (p->mp_reg_tx_init_val) {
+		nthw_field_set_val32(p->mp_fld_tx_init_val_idx, start_idx);
+		nthw_field_set_val32(p->mp_fld_tx_init_val_ptr, start_ptr);
+		nthw_register_flush(p->mp_reg_tx_init_val, 1);
+	}
+
+	nthw_field_set_val32(p->mp_fld_tx_init_init, init);
+	nthw_field_set_val32(p->mp_fld_tx_init_queue, queue);
+	nthw_register_flush(p->mp_reg_tx_init, 1);
+	return 0;
+}
+
+int get_tx_init(nthw_dbs_t *p, uint32_t *init, uint32_t *queue, uint32_t *busy)
+{
+	*init = nthw_field_get_val32(p->mp_fld_tx_init_init);
+	*queue = nthw_field_get_val32(p->mp_fld_tx_init_queue);
+	*busy = nthw_field_get_val32(p->mp_fld_tx_init_busy);
+	return 0;
+}
diff --git a/drivers/net/ntnic/nthw/supported/nthw_fpga_mod_defs.h b/drivers/net/ntnic/nthw/supported/nthw_fpga_mod_defs.h
index 5d6aac122c..b6be02f45e 100644
--- a/drivers/net/ntnic/nthw/supported/nthw_fpga_mod_defs.h
+++ b/drivers/net/ntnic/nthw/supported/nthw_fpga_mod_defs.h
@@ -16,6 +16,7 @@
 #define MOD_UNKNOWN (0L)/* Unknown/uninitialized - keep this as the first element */
 #define MOD_CAT (0x30b447c2UL)
 #define MOD_CSU (0x3f470787UL)
+#define MOD_DBS (0x80b29727UL)
 #define MOD_FLM (0xe7ba53a4UL)
 #define MOD_GFG (0xfc423807UL)
 #define MOD_GMF (0x68b1d15aUL)
diff --git a/drivers/net/ntnic/ntnic_mod_reg.c b/drivers/net/ntnic/ntnic_mod_reg.c
index 8fe5193027..a03c97801b 100644
--- a/drivers/net/ntnic/ntnic_mod_reg.c
+++ b/drivers/net/ntnic/ntnic_mod_reg.c
@@ -5,9 +5,18 @@
 
 #include "ntnic_mod_reg.h"
 
+static struct sg_ops_s *sg_ops;
+
+void register_sg_ops(struct sg_ops_s *ops)
+{
+	sg_ops = ops;
+}
+
 const struct sg_ops_s *get_sg_ops(void)
 {
-	return NULL;
+	if (sg_ops == NULL)
+		sg_init();
+	return sg_ops;
 }
 
 static struct link_ops_s *link_100g_ops;
diff --git a/drivers/net/ntnic/ntnic_mod_reg.h b/drivers/net/ntnic/ntnic_mod_reg.h
index e9dff51935..5b97b3d8ac 100644
--- a/drivers/net/ntnic/ntnic_mod_reg.h
+++ b/drivers/net/ntnic/ntnic_mod_reg.h
@@ -105,7 +105,9 @@ struct sg_ops_s {
 	int (*nthw_virt_queue_init)(struct fpga_info_s *p_fpga_info);
 };
 
+void register_sg_ops(struct sg_ops_s *ops);
 const struct sg_ops_s *get_sg_ops(void);
+void sg_init(void);
 
 struct link_ops_s {
 	int (*link_init)(struct adapter_info_s *p_adapter_info, nthw_fpga_t *p_fpga);
-- 
2.45.0