From: Nithin Dabilpuram <ndabilpuram@marvell.com>
To: Nithin Dabilpuram <ndabilpuram@marvell.com>,
Kiran Kumar K <kirankumark@marvell.com>,
Sunil Kumar Kori <skori@marvell.com>,
Satha Rao <skoteshwar@marvell.com>,
Harman Kalra <hkalra@marvell.com>
Cc: <jerinj@marvell.com>, <dev@dpdk.org>
Subject: [PATCH 07/19] common/cnxk: add IPv4 fragmentation offload
Date: Mon, 1 Sep 2025 13:00:23 +0530 [thread overview]
Message-ID: <20250901073036.1381560-7-ndabilpuram@marvell.com> (raw)
In-Reply-To: <20250901073036.1381560-1-ndabilpuram@marvell.com>
From: Satha Rao <skoteshwar@marvell.com>
Extend LSO offload to support IPv4 fragmentation.
Signed-off-by: Satha Rao <skoteshwar@marvell.com>
---
drivers/common/cnxk/hw/nix.h | 2 +-
drivers/common/cnxk/roc_nix.h | 8 ++
drivers/common/cnxk/roc_nix_ops.c | 113 +++++++++++++++++-
drivers/common/cnxk/roc_nix_priv.h | 1 +
.../common/cnxk/roc_platform_base_symbols.c | 2 +
5 files changed, 124 insertions(+), 2 deletions(-)
diff --git a/drivers/common/cnxk/hw/nix.h b/drivers/common/cnxk/hw/nix.h
index f5811ee1ab..8956b95040 100644
--- a/drivers/common/cnxk/hw/nix.h
+++ b/drivers/common/cnxk/hw/nix.h
@@ -2692,7 +2692,7 @@ typedef union nix_lso_alt_flg_format {
#define NIX_LSO_SEG_MAX 256
#define NIX_LSO_MPS_MAX (BIT_ULL(14) - 1)
-/* Software defined LSO base format IDX */
+/* Kernel defined LSO base format IDX */
#define NIX_LSO_FORMAT_IDX_TSOV4 0
#define NIX_LSO_FORMAT_IDX_TSOV6 1
diff --git a/drivers/common/cnxk/roc_nix.h b/drivers/common/cnxk/roc_nix.h
index a156d83200..35eb855986 100644
--- a/drivers/common/cnxk/roc_nix.h
+++ b/drivers/common/cnxk/roc_nix.h
@@ -28,6 +28,11 @@
#define ROC_NIX_INTF_TYPE_CPT_NIX 254
#define ROC_NIX_INTF_TYPE_SSO 253
+/* Software defined LSO base format IDX */
+#define ROC_NIX_LSO_FORMAT_IDX_TSOV4 0
+#define ROC_NIX_LSO_FORMAT_IDX_TSOV6 1
+#define ROC_NIX_LSO_FORMAT_IDX_IPV4 2
+
enum roc_nix_rss_reta_sz {
ROC_NIX_RSS_RETA_SZ_64 = 64,
ROC_NIX_RSS_RETA_SZ_128 = 128,
@@ -878,9 +883,12 @@ int __roc_api roc_nix_lso_fmt_setup(struct roc_nix *roc_nix);
int __roc_api roc_nix_lso_fmt_get(struct roc_nix *roc_nix,
uint8_t udp_tun[ROC_NIX_LSO_TUN_MAX],
uint8_t tun[ROC_NIX_LSO_TUN_MAX]);
+int __roc_api roc_nix_lso_fmt_ipv4_frag_get(struct roc_nix *roc_nix);
int __roc_api roc_nix_lso_custom_fmt_setup(struct roc_nix *roc_nix,
struct nix_lso_format *fields,
uint16_t nb_fields);
+int __roc_api roc_nix_lso_alt_flags_profile_setup(struct roc_nix *roc_nix,
+ nix_lso_alt_flg_format_t *fmt);
int __roc_api roc_nix_eeprom_info_get(struct roc_nix *roc_nix,
struct roc_nix_eeprom_info *info);
diff --git a/drivers/common/cnxk/roc_nix_ops.c b/drivers/common/cnxk/roc_nix_ops.c
index efb0a41d07..138090317a 100644
--- a/drivers/common/cnxk/roc_nix_ops.c
+++ b/drivers/common/cnxk/roc_nix_ops.c
@@ -5,6 +5,8 @@
#include "roc_api.h"
#include "roc_priv.h"
+#define NIX_LSO_FRMT_IPV4_OFFSET_SHFT 3
+
static void
nix_lso_tcp(struct nix_lso_format_cfg *req, bool v4)
{
@@ -159,6 +161,34 @@ nix_lso_tun_tcp(struct nix_lso_format_cfg *req, bool outer_v4, bool inner_v4)
field++;
}
+int
+roc_nix_lso_alt_flags_profile_setup(struct roc_nix *roc_nix, nix_lso_alt_flg_format_t *fmt)
+{
+ struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+ struct dev *dev = &nix->dev;
+ struct mbox *mbox = mbox_get(dev->mbox);
+ struct nix_lso_alt_flags_cfg_rsp *rsp;
+ struct nix_lso_alt_flags_cfg_req *req;
+ int rc = -ENOSPC;
+
+ req = mbox_alloc_msg_nix_lso_alt_flags_cfg(mbox);
+ if (req == NULL)
+ goto exit;
+
+ req->cfg = fmt->u[0];
+ req->cfg1 = fmt->u[1];
+
+ rc = mbox_process_msg(mbox, (void *)&rsp);
+ if (rc)
+ goto exit;
+
+ plt_nix_dbg("Setup alt flags format %u", rsp->lso_alt_flags_idx);
+ rc = rsp->lso_alt_flags_idx;
+exit:
+ mbox_put(mbox);
+ return rc;
+}
+
int
roc_nix_lso_custom_fmt_setup(struct roc_nix *roc_nix,
struct nix_lso_format *fields, uint16_t nb_fields)
@@ -194,6 +224,74 @@ roc_nix_lso_custom_fmt_setup(struct roc_nix *roc_nix,
return rc;
}
+static int
+nix_lso_ipv4(struct roc_nix *roc_nix)
+{
+ struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+ struct nix_lso_format_cfg_rsp *rsp;
+ nix_lso_alt_flg_format_t alt_flags;
+
+ __io struct nix_lso_format *field;
+ struct nix_lso_format_cfg *req;
+ int flag_idx = 0, rc = -ENOSPC;
+ struct dev *dev = &nix->dev;
+ struct mbox *mbox;
+
+ /* First get flags profile to update v4 flags */
+ memset(&alt_flags, 0, sizeof(alt_flags));
+ alt_flags.s.alt_fsf_set = 0x2000;
+ alt_flags.s.alt_fsf_mask = 0x1FFF;
+ alt_flags.s.alt_msf_set = 0x2000;
+ alt_flags.s.alt_msf_mask = 0x1FFF;
+ alt_flags.s.alt_lsf_set = 0x0000;
+ alt_flags.s.alt_lsf_mask = 0x1FFF;
+ flag_idx = roc_nix_lso_alt_flags_profile_setup(roc_nix, &alt_flags);
+ if (flag_idx < 0)
+ return rc;
+
+ mbox = mbox_get(dev->mbox);
+
+ /*
+ * IPv4 Fragmentation
+ */
+ req = mbox_alloc_msg_nix_lso_format_cfg(mbox);
+ if (req == NULL) {
+ rc = -ENOSPC;
+ goto exit;
+ }
+
+ /* Format works only with TCP packet marked by OL3/OL4 */
+ field = (__io struct nix_lso_format *)&req->fields[0];
+ req->field_mask = NIX_LSO_FIELD_MASK;
+ /* Update Payload Length */
+ field->layer = NIX_TXLAYER_OL3;
+ field->offset = 2;
+ field->sizem1 = 1; /* 2B */
+ field->alg = NIX_LSOALG_ADD_PAYLEN;
+ field++;
+
+ /* Update fragment offset and flags */
+ field->layer = NIX_TXLAYER_OL3;
+ field->offset = 6;
+ field->sizem1 = 1;
+ field->shift = NIX_LSO_FRMT_IPV4_OFFSET_SHFT;
+ field->alt_flags_index = flag_idx;
+ field->alt_flags = 1;
+ /* Cumulative length of previous segments */
+ field->alg = NIX_LSOALG_ADD_OFFSET;
+ field++;
+ rc = mbox_process_msg(mbox, (void *)&rsp);
+ if (rc)
+ goto exit;
+
+ /* IPv4 fragment offset shifted by 3 bits, store this value in profile ID */
+ nix->lso_ipv4_idx = (NIX_LSO_FRMT_IPV4_OFFSET_SHFT << 8) | (rsp->lso_format_idx & 0x1F);
+ plt_nix_dbg("ipv4 fmt=%u", rsp->lso_format_idx);
+exit:
+ mbox_put(mbox);
+ return rc;
+}
+
int
roc_nix_lso_fmt_setup(struct roc_nix *roc_nix)
{
@@ -370,12 +468,25 @@ roc_nix_lso_fmt_setup(struct roc_nix *roc_nix)
nix->lso_tun_idx[ROC_NIX_LSO_TUN_V6V6] = rsp->lso_format_idx;
plt_nix_dbg("tun v6v6 fmt=%u", rsp->lso_format_idx);
- rc = 0;
+
exit:
mbox_put(mbox);
+
+ nix->lso_ipv4_idx = 0; /* IPv4 fragmentation not supported */
+ if (!rc && roc_model_is_cn20k())
+ return nix_lso_ipv4(roc_nix);
+
return rc;
}
+int
+roc_nix_lso_fmt_ipv4_frag_get(struct roc_nix *roc_nix)
+{
+ struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+
+ return nix->lso_ipv4_idx;
+}
+
int
roc_nix_lso_fmt_get(struct roc_nix *roc_nix,
uint8_t udp_tun[ROC_NIX_LSO_TUN_MAX],
diff --git a/drivers/common/cnxk/roc_nix_priv.h b/drivers/common/cnxk/roc_nix_priv.h
index d7ea3c6be2..dc61a55d1b 100644
--- a/drivers/common/cnxk/roc_nix_priv.h
+++ b/drivers/common/cnxk/roc_nix_priv.h
@@ -152,6 +152,7 @@ struct nix {
uint8_t lso_tsov4_idx;
uint8_t lso_udp_tun_idx[ROC_NIX_LSO_TUN_MAX];
uint8_t lso_tun_idx[ROC_NIX_LSO_TUN_MAX];
+ uint16_t lso_ipv4_idx;
uint8_t lf_rx_stats;
uint8_t lf_tx_stats;
uint8_t rx_chan_cnt;
diff --git a/drivers/common/cnxk/roc_platform_base_symbols.c b/drivers/common/cnxk/roc_platform_base_symbols.c
index cc35c46456..7174e5fe08 100644
--- a/drivers/common/cnxk/roc_platform_base_symbols.c
+++ b/drivers/common/cnxk/roc_platform_base_symbols.c
@@ -323,9 +323,11 @@ RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_npc_mac_addr_set)
RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_npc_mac_addr_get)
RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_npc_rx_ena_dis)
RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_npc_mcast_config)
+RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_lso_alt_flags_profile_setup)
RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_lso_custom_fmt_setup)
RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_lso_fmt_setup)
RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_lso_fmt_get)
+RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_lso_fmt_ipv4_frag_get)
RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_switch_hdr_set)
RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_eeprom_info_get)
RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_rx_drop_re_set)
--
2.34.1
next prev parent reply other threads:[~2025-09-01 7:32 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-01 7:30 [PATCH 01/19] common/cnxk: add new TM tree for SDP interface Nithin Dabilpuram
2025-09-01 7:30 ` [PATCH 02/19] net/cnxk: new " Nithin Dabilpuram
2025-09-01 7:30 ` [PATCH 03/19] net/cnxk: disable CQ when SQ stopped Nithin Dabilpuram
2025-09-01 7:30 ` [PATCH 04/19] net/cnxk: update scatter check as warning for SDP Nithin Dabilpuram
2025-09-01 7:30 ` [PATCH 05/19] common/cnxk: fix inline device API Nithin Dabilpuram
2025-09-01 7:30 ` [PATCH 06/19] common/cnxk: add new mailbox to configure LSO alt flags Nithin Dabilpuram
2025-09-01 7:30 ` Nithin Dabilpuram [this message]
2025-09-01 7:30 ` [PATCH 08/19] common/cnxk: update DF flag in IPv4 fragments Nithin Dabilpuram
2025-09-01 7:30 ` [PATCH 09/19] common/cnxk: add support for per packet SQ count update Nithin Dabilpuram
2025-09-01 7:30 ` [PATCH 10/19] common/cnxk: feature fn to check 16B alignment Nithin Dabilpuram
2025-09-01 7:30 ` [PATCH 11/19] common/cnxk: add API to configure backpressure on pool Nithin Dabilpuram
2025-09-01 7:30 ` [PATCH 12/19] common/cnxk: fix max number of SQB bufs in clean up Nithin Dabilpuram
2025-09-01 7:30 ` [PATCH 13/19] common/cnxk: add support for SQ resize Nithin Dabilpuram
2025-09-01 7:30 ` [PATCH 14/19] common/cnxk: increase Tx schedular count Nithin Dabilpuram
2025-09-01 7:30 ` [PATCH 15/19] common/cnxk: resolve klocwork issues Nithin Dabilpuram
2025-09-01 7:30 ` [PATCH 16/19] common/cnxk: avoid null SQ access Nithin Dabilpuram
2025-09-01 7:30 ` [PATCH 17/19] common/cnxk: change in aura field width Nithin Dabilpuram
2025-09-01 7:30 ` [PATCH 18/19] common/cnxk: fix error handling on inline inbound setup Nithin Dabilpuram
2025-09-01 7:30 ` [PATCH 19/19] drivers: fix Klocwork issues Nithin Dabilpuram
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250901073036.1381560-7-ndabilpuram@marvell.com \
--to=ndabilpuram@marvell.com \
--cc=dev@dpdk.org \
--cc=hkalra@marvell.com \
--cc=jerinj@marvell.com \
--cc=kirankumark@marvell.com \
--cc=skori@marvell.com \
--cc=skoteshwar@marvell.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).