CN20K and legacy silicon differ in the size of key words used
in NPC MCAM. However, SoC-specific structures are not required
for low-level functions. Remove the SoC-specific structures
and rename the macros to improve readability.
Signed-off-by: Ratheesh Kannoth <rkannoth@marvell.com>
---
.../ethernet/marvell/octeontx2/af/cn20k/npc.c | 11 ++++---
.../net/ethernet/marvell/octeontx2/af/mbox.h | 18 +++++++----
.../net/ethernet/marvell/octeontx2/af/rvu.h | 2 +-
.../marvell/octeontx2/af/rvu_npc_fs.c | 31 ++++++++-----------
4 files changed, 32 insertions(+), 30 deletions(-)
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c b/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c
index 4c154cccbba1..593e319ae13e 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c
+++ b/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c
@@ -3903,10 +3903,10 @@ int rvu_mbox_handler_npc_get_num_kws(struct rvu *rvu,
struct npc_get_num_kws_req *req,
struct npc_get_num_kws_rsp *rsp)
{
+ u64 kw_mask[NPC_KWS_IN_KEY_SZ_MAX] = { 0 };
+ u64 kw[NPC_KWS_IN_KEY_SZ_MAX] = { 0 };
struct rvu_npc_mcam_rule dummy = { 0 };
- struct cn20k_mcam_entry cn20k_entry = { 0 };
struct mcam_entry_mdata mdata = { };
- struct mcam_entry entry = { 0 };
struct npc_install_flow_req *fl;
int i, cnt = 0, blkaddr;
@@ -3923,7 +3923,8 @@ int rvu_mbox_handler_npc_get_num_kws(struct rvu *rvu,
return NPC_MCAM_INVALID_REQ;
}
- npc_populate_mcam_mdata(rvu, &mdata, &cn20k_entry, &entry);
+ mdata.kw = kw;
+ mdata.kw_mask = kw_mask;
npc_update_flow(rvu, &mdata, fl->features, &fl->packet,
&fl->mask, &dummy, fl->intf, blkaddr);
@@ -3931,8 +3932,8 @@ int rvu_mbox_handler_npc_get_num_kws(struct rvu *rvu,
/* Find the most significant word valid. Traverse from
* MSB to LSB, check if cam0 or cam1 is set
*/
- for (i = NPC_CN20K_MAX_KWS_IN_KEY - 1; i >= 0; i--) {
- if (cn20k_entry.kw[i] || cn20k_entry.kw_mask[i]) {
+ for (i = NPC_KWS_IN_KEY_SZ_MAX - 1; i >= 0; i--) {
+ if (kw[i] || kw_mask[i]) {
cnt = i + 1;
break;
}
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/mbox.h b/drivers/net/ethernet/marvell/octeontx2/af/mbox.h
index 6f26f7393709..d65aaf4fae8b 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/mbox.h
+++ b/drivers/net/ethernet/marvell/octeontx2/af/mbox.h
@@ -1592,18 +1592,24 @@ struct mcam_entry_mdata {
u8 max_kw;
};
+enum npc_kws_in_key_sz {
+ NPC_KWS_IN_KEY_SZ_7 = 7,
+ NPC_KWS_IN_KEY_SZ_8 = 8,
+ NPC_KWS_IN_KEY_SZ_9 = 9,
+ NPC_KWS_IN_KEY_SZ_10 = 10,
+ NPC_KWS_IN_KEY_SZ_MAX,
+};
+
struct mcam_entry {
-#define NPC_MAX_KWS_IN_KEY 7 /* Number of keywords in max keywidth */
- u64 kw[NPC_MAX_KWS_IN_KEY];
- u64 kw_mask[NPC_MAX_KWS_IN_KEY];
+ u64 kw[NPC_KWS_IN_KEY_SZ_7];
+ u64 kw_mask[NPC_KWS_IN_KEY_SZ_7];
u64 action;
u64 vtag_action;
};
struct cn20k_mcam_entry {
-#define NPC_CN20K_MAX_KWS_IN_KEY 8 /* Number of keywords in max keywidth */
- u64 kw[NPC_CN20K_MAX_KWS_IN_KEY];
- u64 kw_mask[NPC_CN20K_MAX_KWS_IN_KEY];
+ u64 kw[NPC_KWS_IN_KEY_SZ_8];
+ u64 kw_mask[NPC_KWS_IN_KEY_SZ_8];
u64 action;
u64 vtag_action;
u64 action2;
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu.h b/drivers/net/ethernet/marvell/octeontx2/af/rvu.h
index f811d6b5c545..a466181cf908 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/rvu.h
+++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu.h
@@ -197,7 +197,7 @@ struct npc_key_field {
/* Masks where all set bits indicate position
* of a field in the key
*/
- u64 kw_mask[NPC_CN20K_MAX_KWS_IN_KEY];
+ u64 kw_mask[NPC_KWS_IN_KEY_SZ_MAX];
/* Number of words in the key a field spans. If a field is
* of 16 bytes and key offset is 4 then the field will use
* 4 bytes in KW0, 8 bytes in KW1 and 4 bytes in KW2 and
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c
index 2d569236882f..229f860d176d 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c
+++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c
@@ -254,7 +254,7 @@ static bool npc_check_overlap(struct rvu *rvu, int blkaddr,
* other field bits.
*/
if (npc_check_overlap_fields(dummy, input,
- NPC_MAX_KWS_IN_KEY))
+ NPC_KWS_IN_KEY_SZ_7))
return true;
}
}
@@ -285,7 +285,7 @@ static bool npc_check_overlap(struct rvu *rvu, int blkaddr,
start_kwi, offset, intf);
/* check any input field bits falls in any other field bits */
if (npc_check_overlap_fields(dummy, input,
- NPC_CN20K_MAX_KWS_IN_KEY))
+ NPC_KWS_IN_KEY_SZ_8))
return true;
}
}
@@ -456,9 +456,9 @@ static void npc_handle_multi_layer_fields(struct rvu *rvu, int blkaddr, u8 intf)
u8 start_lid;
if (is_cn20k(rvu->pdev))
- max_kw = NPC_CN20K_MAX_KWS_IN_KEY;
+ max_kw = NPC_KWS_IN_KEY_SZ_8;
else
- max_kw = NPC_MAX_KWS_IN_KEY;
+ max_kw = NPC_KWS_IN_KEY_SZ_7;
key_fields = mcam->rx_key_fields;
features = &mcam->rx_features;
@@ -901,12 +901,12 @@ void npc_update_entry(struct rvu *rvu, enum key_fields type,
struct mcam_entry_mdata *mdata, u64 val_lo,
u64 val_hi, u64 mask_lo, u64 mask_hi, u8 intf)
{
- struct cn20k_mcam_entry cn20k_dummy = { {0} };
+ u64 kw_mask[NPC_KWS_IN_KEY_SZ_MAX] = { 0 };
+ u64 kw[NPC_KWS_IN_KEY_SZ_MAX] = { 0 };
struct npc_mcam *mcam = &rvu->hw->mcam;
- struct mcam_entry dummy = { {0} };
- u64 *kw, *kw_mask, *val, *mask;
struct npc_key_field *field;
u64 kw1, kw2, kw3;
+ u64 *val, *mask;
int i, max_kw;
u8 shift;
@@ -917,15 +917,10 @@ void npc_update_entry(struct rvu *rvu, enum key_fields type,
if (!field->nr_kws)
return;
- if (is_cn20k(rvu->pdev)) {
- max_kw = NPC_CN20K_MAX_KWS_IN_KEY;
- kw = cn20k_dummy.kw;
- kw_mask = cn20k_dummy.kw_mask;
- } else {
- max_kw = NPC_MAX_KWS_IN_KEY;
- kw = dummy.kw;
- kw_mask = dummy.kw_mask;
- }
+ if (is_cn20k(rvu->pdev))
+ max_kw = NPC_KWS_IN_KEY_SZ_8;
+ else
+ max_kw = NPC_KWS_IN_KEY_SZ_7;
for (i = 0; i < max_kw; i++) {
if (!field->kw_mask[i])
@@ -1304,14 +1299,14 @@ npc_populate_mcam_mdata(struct rvu *rvu,
mdata->kw_mask = cn20k_entry->kw_mask;
mdata->action = &cn20k_entry->action;
mdata->vtag_action = &cn20k_entry->vtag_action;
- mdata->max_kw = NPC_CN20K_MAX_KWS_IN_KEY;
+ mdata->max_kw = NPC_KWS_IN_KEY_SZ_8;
return;
}
mdata->kw = entry->kw;
mdata->kw_mask = entry->kw_mask;
mdata->action = &entry->action;
mdata->vtag_action = &entry->vtag_action;
- mdata->max_kw = NPC_MAX_KWS_IN_KEY;
+ mdata->max_kw = NPC_KWS_IN_KEY_SZ_7;
}
static int npc_update_rx_entry(struct rvu *rvu, struct rvu_pfvf *pfvf,
--
2.43.0