* [dpdk-dev] [PATCH 1/2] common/cnxk: support fragmented flags in KPU profile
@ 2025-03-21 9:48 psatheesh
2025-03-21 9:48 ` [dpdk-dev] [PATCH 2/2] common/cnxk: defragment MCAM bank during allocation psatheesh
0 siblings, 1 reply; 2+ messages in thread
From: psatheesh @ 2025-03-21 9:48 UTC (permalink / raw)
To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao,
Harman Kalra
Cc: dev, Satheesh Paul, Jerin Jacob
From: Satheesh Paul <psatheesh@marvell.com>
In the CN20K device, only 4 bits are available for flags.
Adjust the fragmented flags to fit into the lower 4 bits.
Signed-off-by: Kiran Kumar K <kirankumark@marvell.com>
Signed-off-by: Satheesh Paul <psatheesh@marvell.com>
Reviewed-by: Jerin Jacob <jerinj@marvell.com>
---
drivers/common/cnxk/hw/npc.h | 12 ++++++++++++
drivers/common/cnxk/roc_npc_parse.c | 12 ++++++++++--
2 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/drivers/common/cnxk/hw/npc.h b/drivers/common/cnxk/hw/npc.h
index 4164c6ac2e..52b41a1a54 100644
--- a/drivers/common/cnxk/hw/npc.h
+++ b/drivers/common/cnxk/hw/npc.h
@@ -314,6 +314,18 @@ enum npc_kpu_lb_lflag {
NPC_F_LB_L_FDSA,
};
+enum npc_cn20k_kpu_lc_uflag {
+ NPC_CN20K_F_LC_U_MPLS_IN_IP = 0x20,
+ NPC_CN20K_F_LC_U_IP6_TUN_IP6 = 0x40,
+ NPC_CN20K_F_LC_U_IP6_MPLS_IN_IP = 0x80,
+};
+
+enum npc_cn20k_kpu_lc_lflag {
+ NPC_CN20K_F_LC_L_IP_FRAG = 2,
+ NPC_CN20K_F_LC_L_IP6_FRAG,
+ NPC_CN20K_F_LC_L_6TO4,
+};
+
enum npc_kpu_lc_uflag {
NPC_F_LC_U_UNK_PROTO = 0x10,
NPC_F_LC_U_IP_FRAG = 0x20,
diff --git a/drivers/common/cnxk/roc_npc_parse.c b/drivers/common/cnxk/roc_npc_parse.c
index 0aaf86c768..b52024f434 100644
--- a/drivers/common/cnxk/roc_npc_parse.c
+++ b/drivers/common/cnxk/roc_npc_parse.c
@@ -1,7 +1,9 @@
/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(C) 2021 Marvell.
*/
+
#include "roc_api.h"
+#include "roc_model.h"
#include "roc_priv.h"
const struct roc_npc_item_info *
@@ -708,7 +710,10 @@ npc_handle_ipv6ext_attr(const struct roc_npc_flow_item_ipv6 *ipv6_spec,
flags_count++;
}
if (ipv6_spec->has_frag_ext) {
- *flags = NPC_F_LC_U_IP6_FRAG;
+ if (roc_model_is_cn20k())
+ *flags = NPC_CN20K_F_LC_L_IP6_FRAG;
+ else
+ *flags = NPC_F_LC_U_IP6_FRAG;
flags_count++;
}
if (ipv6_spec->has_dest_ext) {
@@ -822,7 +827,10 @@ npc_process_ipv6_item(struct npc_parse_state *pst)
} else if (pattern->type == ROC_NPC_ITEM_TYPE_IPV6_FRAG_EXT) {
item_count++;
ltype = NPC_LT_LC_IP6_EXT;
- flags = NPC_F_LC_U_IP6_FRAG;
+ if (roc_model_is_cn20k())
+ flags = NPC_CN20K_F_LC_L_IP6_FRAG;
+ else
+ flags = NPC_F_LC_U_IP6_FRAG;
parse_info.len =
sizeof(struct roc_ipv6_hdr) + sizeof(struct roc_ipv6_fragment_ext);
if (pattern->spec)
--
2.42.0
^ permalink raw reply [flat|nested] 2+ messages in thread
* [dpdk-dev] [PATCH 2/2] common/cnxk: defragment MCAM bank during allocation
2025-03-21 9:48 [dpdk-dev] [PATCH 1/2] common/cnxk: support fragmented flags in KPU profile psatheesh
@ 2025-03-21 9:48 ` psatheesh
0 siblings, 0 replies; 2+ messages in thread
From: psatheesh @ 2025-03-21 9:48 UTC (permalink / raw)
To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao,
Harman Kalra
Cc: dev, Satheesh Paul
From: Satheesh Paul <psatheesh@marvell.com>
If MCAM allocation fails, invoke MCAM bank defragmentation
and retry MCAM allocation for CN20K.
Signed-off-by: Satheesh Paul <psatheesh@marvell.com>
Reviewed-by: Kiran Kumar K <kirankumark@marvell.com>
---
drivers/common/cnxk/roc_npc.c | 40 +++++++++++++++++++++++--
drivers/common/cnxk/roc_npc.h | 3 ++
drivers/common/cnxk/roc_npc_mcam.c | 24 +++++++++++++--
drivers/common/cnxk/roc_npc_mcam_dump.c | 6 +++-
drivers/common/cnxk/roc_npc_priv.h | 16 +++++++---
drivers/common/cnxk/roc_npc_utils.c | 8 -----
drivers/common/cnxk/version.map | 3 ++
7 files changed, 83 insertions(+), 17 deletions(-)
diff --git a/drivers/common/cnxk/roc_npc.c b/drivers/common/cnxk/roc_npc.c
index 94d5cc84f8..3fd59667d8 100644
--- a/drivers/common/cnxk/roc_npc.c
+++ b/drivers/common/cnxk/roc_npc.c
@@ -5,6 +5,22 @@
#include "roc_api.h"
#include "roc_priv.h"
+uint8_t
+roc_npc_get_key_type(struct roc_npc *roc_npc, struct roc_npc_flow *flow)
+{
+ struct npc *npc = roc_npc_to_npc_priv(roc_npc);
+
+ return npc_get_key_type(npc, flow);
+}
+
+uint8_t
+roc_npc_kex_key_type_config_get(struct roc_npc *roc_npc)
+{
+ struct npc *npc = roc_npc_to_npc_priv(roc_npc);
+
+ return npc_kex_key_type_config_get(npc);
+}
+
int
roc_npc_mark_actions_get(struct roc_npc *roc_npc)
{
@@ -197,10 +213,30 @@ roc_npc_mcam_enable_all_entries(struct roc_npc *roc_npc, bool enable)
return npc_flow_enable_all_entries(npc, enable);
}
+void
+roc_npc_defrag_mcam_banks(struct roc_npc *roc_npc)
+{
+ struct npc *npc = roc_npc_to_npc_priv(roc_npc);
+ struct mbox *mbox = mbox_get(npc->mbox);
+ struct npc_mcam_defrag_req *req;
+ struct npc_mcam_defrag_rsp *rsp;
+ int rc = 0;
+
+ req = (struct npc_mcam_defrag_req *)mbox_alloc_msg_npc_defrag(mbox);
+ if (req == NULL)
+ goto exit;
+
+ rc = mbox_process_msg(mbox, (void *)&rsp);
+ if (rc)
+ plt_err("Error when defragmenting MCAM banks.");
+
+exit:
+ mbox_put(mbox);
+}
+
int
roc_npc_mcam_alloc_entry(struct roc_npc *roc_npc, struct roc_npc_flow *mcam,
- struct roc_npc_flow *ref_mcam, int prio,
- int *resp_count)
+ struct roc_npc_flow *ref_mcam, int prio, int *resp_count)
{
struct npc *npc = roc_npc_to_npc_priv(roc_npc);
diff --git a/drivers/common/cnxk/roc_npc.h b/drivers/common/cnxk/roc_npc.h
index 2a409cce99..91c84d7d97 100644
--- a/drivers/common/cnxk/roc_npc.h
+++ b/drivers/common/cnxk/roc_npc.h
@@ -462,6 +462,9 @@ int __roc_api roc_npc_mcam_alloc_entries(struct roc_npc *roc_npc, int ref_entry,
int __roc_api roc_npc_mcam_ena_dis_entry(struct roc_npc *roc_npc, struct roc_npc_flow *mcam,
bool enable);
int __roc_api roc_npc_mcam_write_entry(struct roc_npc *roc_npc, struct roc_npc_flow *mcam);
+void __roc_api roc_npc_defrag_mcam_banks(struct roc_npc *roc_npc);
+uint8_t __roc_api roc_npc_get_key_type(struct roc_npc *roc_npc, struct roc_npc_flow *flow);
+uint8_t __roc_api roc_npc_kex_key_type_config_get(struct roc_npc *roc_npc);
int __roc_api roc_npc_flow_parse(struct roc_npc *roc_npc, const struct roc_npc_attr *attr,
const struct roc_npc_item_info pattern[],
const struct roc_npc_action actions[], struct roc_npc_flow *flow);
diff --git a/drivers/common/cnxk/roc_npc_mcam.c b/drivers/common/cnxk/roc_npc_mcam.c
index 3aa7ff56a9..a9b923d31c 100644
--- a/drivers/common/cnxk/roc_npc_mcam.c
+++ b/drivers/common/cnxk/roc_npc_mcam.c
@@ -425,6 +425,21 @@ npc_mcam_alloc_entries(struct mbox *mbox, int ref_mcam, int *alloc_entry, int re
return rc;
}
+uint8_t
+npc_kex_key_type_config_get(struct npc *npc)
+{
+ /* KEX is configured just for X2 */
+ if (npc->keyw[ROC_NPC_INTF_RX] == 1)
+ return NPC_CN20K_MCAM_KEY_X2;
+
+ /* KEX is configured just for X4 */
+ if (npc->keyw[ROC_NPC_INTF_RX] == 2)
+ return NPC_CN20K_MCAM_KEY_X4;
+
+ /* KEX is configured for both X2 and X4 */
+ return NPC_CN20K_MCAM_KEY_DYN;
+}
+
int
npc_mcam_alloc_entry(struct npc *npc, struct roc_npc_flow *mcam, struct roc_npc_flow *ref_mcam,
uint8_t prio, int *resp_count)
@@ -437,15 +452,20 @@ npc_mcam_alloc_entry(struct npc *npc, struct roc_npc_flow *mcam, struct roc_npc_
req = mbox_alloc_msg_npc_mcam_alloc_entry(mbox);
if (req == NULL)
goto exit;
- req->contig = 1;
+
req->count = 1;
req->ref_priority = prio;
req->ref_entry = ref_mcam ? ref_mcam->mcam_id : 0;
req->kw_type = mcam->key_type;
+
+ if (npc_kex_key_type_config_get(npc) == NPC_CN20K_MCAM_KEY_DYN)
+ req->virt = 1;
+
rc = mbox_process_msg(mbox, (void *)&rsp);
if (rc)
goto exit;
- mcam->mcam_id = rsp->entry;
+
+ mcam->mcam_id = rsp->entry_list[0];
mcam->nix_intf = ref_mcam ? ref_mcam->nix_intf : 0;
*resp_count = rsp->count;
diff --git a/drivers/common/cnxk/roc_npc_mcam_dump.c b/drivers/common/cnxk/roc_npc_mcam_dump.c
index 29221a2169..d6ee0b982a 100644
--- a/drivers/common/cnxk/roc_npc_mcam_dump.c
+++ b/drivers/common/cnxk/roc_npc_mcam_dump.c
@@ -830,7 +830,11 @@ npc_flow_hw_mcam_entry_dump(FILE *file, struct npc *npc, struct roc_npc_flow *fl
else
mbox = npc->mbox;
- mcam_read_req = mbox_alloc_msg_npc_mcam_read_entry(mbox_get(mbox));
+ if (roc_model_is_cn20k())
+ mcam_read_req = mbox_alloc_msg_npc_cn20k_mcam_read_entry(mbox_get(mbox));
+ else
+ mcam_read_req = mbox_alloc_msg_npc_mcam_read_entry(mbox_get(mbox));
+
if (mcam_read_req == NULL) {
plt_err("Failed to alloc msg");
mbox_put(mbox);
diff --git a/drivers/common/cnxk/roc_npc_priv.h b/drivers/common/cnxk/roc_npc_priv.h
index 56471a6ca9..5812cf0f8d 100644
--- a/drivers/common/cnxk/roc_npc_priv.h
+++ b/drivers/common/cnxk/roc_npc_priv.h
@@ -332,10 +332,17 @@ enum npc_kpu_parser_flag {
NPC_F_LAST /* has to be the last item */
};
-#define NPC_ACTION_TERM \
- (ROC_NPC_ACTION_TYPE_DROP | ROC_NPC_ACTION_TYPE_QUEUE | \
- ROC_NPC_ACTION_TYPE_RSS | ROC_NPC_ACTION_TYPE_DUP | \
- ROC_NPC_ACTION_TYPE_SEC)
+enum npc_mcam_cn20k_key_width {
+ NPC_CN20K_MCAM_KEY_X1 = 0,
+ NPC_CN20K_MCAM_KEY_DYN = NPC_CN20K_MCAM_KEY_X1,
+ NPC_CN20K_MCAM_KEY_X2,
+ NPC_CN20K_MCAM_KEY_X4,
+ NPC_CN20K_MCAM_KEY_MAX,
+};
+
+#define NPC_ACTION_TERM \
+ (ROC_NPC_ACTION_TYPE_DROP | ROC_NPC_ACTION_TYPE_QUEUE | ROC_NPC_ACTION_TYPE_RSS | \
+ ROC_NPC_ACTION_TYPE_DUP | ROC_NPC_ACTION_TYPE_SEC)
struct npc_xtract_info {
/* Length in bytes of pkt data extracted. len = 0
@@ -498,6 +505,7 @@ int npc_update_parse_state(struct npc_parse_state *pst, struct npc_parse_item_in
void npc_get_hw_supp_mask(struct npc_parse_state *pst, struct npc_parse_item_info *info, int lid,
int lt);
uint8_t npc_get_key_type(struct npc *npc, struct roc_npc_flow *flow);
+uint8_t npc_kex_key_type_config_get(struct npc *npc);
int npc_mask_is_supported(const char *mask, const char *hw_mask, int len);
int npc_parse_item_basic(const struct roc_npc_item_info *item, struct npc_parse_item_info *info);
int npc_parse_meta_items(struct npc_parse_state *pst);
diff --git a/drivers/common/cnxk/roc_npc_utils.c b/drivers/common/cnxk/roc_npc_utils.c
index 75d3b0702c..d95dc0996c 100644
--- a/drivers/common/cnxk/roc_npc_utils.c
+++ b/drivers/common/cnxk/roc_npc_utils.c
@@ -4,14 +4,6 @@
#include "roc_api.h"
#include "roc_priv.h"
-enum npc_mcam_cn20k_key_width {
- NPC_CN20K_MCAM_KEY_X1 = 0,
- NPC_CN20K_MCAM_KEY_DYN = NPC_CN20K_MCAM_KEY_X1,
- NPC_CN20K_MCAM_KEY_X2,
- NPC_CN20K_MCAM_KEY_X4,
- NPC_CN20K_MCAM_KEY_MAX,
-};
-
uint8_t
npc_get_key_type(struct npc *npc, struct roc_npc_flow *flow)
{
diff --git a/drivers/common/cnxk/version.map b/drivers/common/cnxk/version.map
index cdbfc1d39a..bc2d7c2336 100644
--- a/drivers/common/cnxk/version.map
+++ b/drivers/common/cnxk/version.map
@@ -465,6 +465,8 @@ INTERNAL {
roc_npa_pool_range_update_check;
roc_npa_zero_aura_handle;
roc_npc_aged_flow_ctx_get;
+ roc_npc_defrag_mcam_banks;
+ roc_npc_get_key_type;
roc_npc_fini;
roc_npc_flow_create;
roc_npc_flow_destroy;
@@ -475,6 +477,7 @@ INTERNAL {
roc_npc_get_low_priority_mcam;
roc_npc_init;
roc_npc_kex_capa_get;
+ roc_npc_kex_key_type_config_get;
roc_npc_mark_actions_get;
roc_npc_mark_actions_sub_return;
roc_npc_vtag_actions_get;
--
2.42.0
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2025-03-21 9:48 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-03-21 9:48 [dpdk-dev] [PATCH 1/2] common/cnxk: support fragmented flags in KPU profile psatheesh
2025-03-21 9:48 ` [dpdk-dev] [PATCH 2/2] common/cnxk: defragment MCAM bank during allocation psatheesh
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).