Commit 406bed11 authored by Ratheesh Kannoth's avatar Ratheesh Kannoth Committed by David S. Miller

octeontx2-af: Update/Fix NPC field hash extract feature

1. As per previous implementation, mask and control parameter to
generate the field hash value was not passed to the caller program.
Updated the secret key mbox to share that information as well,
as a part of the fix.
2. Earlier implementation did not consider hash reduction of both
source and destination IPv6 addresses. Only source IPv6 address
was considered. This fix solves that and provides option to hash

Fixes: 56d9f5fd ("octeontx2-af: Use hashed field in MCAM key")
Signed-off-by: default avatarRatheesh Kannoth <rkannoth@marvell.com>
Signed-off-by: default avatarSunil Kovvuri Goutham <sgoutham@marvell.com>
Signed-off-by: default avatarSai Krishna <saikrishnag@marvell.com>
Reviewed-by: default avatarSimon Horman <simon.horman@corigine.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 2075bf15
...@@ -245,9 +245,9 @@ M(NPC_MCAM_READ_BASE_RULE, 0x6011, npc_read_base_steer_rule, \ ...@@ -245,9 +245,9 @@ M(NPC_MCAM_READ_BASE_RULE, 0x6011, npc_read_base_steer_rule, \
M(NPC_MCAM_GET_STATS, 0x6012, npc_mcam_entry_stats, \ M(NPC_MCAM_GET_STATS, 0x6012, npc_mcam_entry_stats, \
npc_mcam_get_stats_req, \ npc_mcam_get_stats_req, \
npc_mcam_get_stats_rsp) \ npc_mcam_get_stats_rsp) \
M(NPC_GET_SECRET_KEY, 0x6013, npc_get_secret_key, \ M(NPC_GET_FIELD_HASH_INFO, 0x6013, npc_get_field_hash_info, \
npc_get_secret_key_req, \ npc_get_field_hash_info_req, \
npc_get_secret_key_rsp) \ npc_get_field_hash_info_rsp) \
M(NPC_GET_FIELD_STATUS, 0x6014, npc_get_field_status, \ M(NPC_GET_FIELD_STATUS, 0x6014, npc_get_field_status, \
npc_get_field_status_req, \ npc_get_field_status_req, \
npc_get_field_status_rsp) \ npc_get_field_status_rsp) \
...@@ -1524,14 +1524,20 @@ struct npc_mcam_get_stats_rsp { ...@@ -1524,14 +1524,20 @@ struct npc_mcam_get_stats_rsp {
u8 stat_ena; /* enabled */ u8 stat_ena; /* enabled */
}; };
struct npc_get_secret_key_req { struct npc_get_field_hash_info_req {
struct mbox_msghdr hdr; struct mbox_msghdr hdr;
u8 intf; u8 intf;
}; };
struct npc_get_secret_key_rsp { struct npc_get_field_hash_info_rsp {
struct mbox_msghdr hdr; struct mbox_msghdr hdr;
u64 secret_key[3]; u64 secret_key[3];
#define NPC_MAX_HASH 2
#define NPC_MAX_HASH_MASK 2
/* NPC_AF_INTF(0..1)_HASH(0..1)_MASK(0..1) */
u64 hash_mask[NPC_MAX_INTF][NPC_MAX_HASH][NPC_MAX_HASH_MASK];
/* NPC_AF_INTF(0..1)_HASH(0..1)_RESULT_CTRL */
u64 hash_ctrl[NPC_MAX_INTF][NPC_MAX_HASH];
}; };
enum ptp_op { enum ptp_op {
......
...@@ -110,8 +110,8 @@ static u64 npc_update_use_hash(int lt, int ld) ...@@ -110,8 +110,8 @@ static u64 npc_update_use_hash(int lt, int ld)
* in KEX_LD_CFG * in KEX_LD_CFG
*/ */
cfg = KEX_LD_CFG_USE_HASH(0x1, 0x03, cfg = KEX_LD_CFG_USE_HASH(0x1, 0x03,
ld ? 0x8 : 0x18, ld ? 0x18 : 0x8,
0x1, 0x0, 0x10); 0x1, 0x0, ld ? 0x14 : 0x10);
break; break;
} }
...@@ -134,7 +134,6 @@ static void npc_program_mkex_hash_rx(struct rvu *rvu, int blkaddr, ...@@ -134,7 +134,6 @@ static void npc_program_mkex_hash_rx(struct rvu *rvu, int blkaddr,
if (mkex_hash->lid_lt_ld_hash_en[intf][lid][lt][ld]) { if (mkex_hash->lid_lt_ld_hash_en[intf][lid][lt][ld]) {
u64 cfg = npc_update_use_hash(lt, ld); u64 cfg = npc_update_use_hash(lt, ld);
hash_cnt++;
if (hash_cnt == NPC_MAX_HASH) if (hash_cnt == NPC_MAX_HASH)
return; return;
...@@ -149,6 +148,8 @@ static void npc_program_mkex_hash_rx(struct rvu *rvu, int blkaddr, ...@@ -149,6 +148,8 @@ static void npc_program_mkex_hash_rx(struct rvu *rvu, int blkaddr,
mkex_hash->hash_mask[intf][ld][1]); mkex_hash->hash_mask[intf][ld][1]);
SET_KEX_LD_HASH_CTRL(intf, ld, SET_KEX_LD_HASH_CTRL(intf, ld,
mkex_hash->hash_ctrl[intf][ld]); mkex_hash->hash_ctrl[intf][ld]);
hash_cnt++;
} }
} }
} }
...@@ -171,7 +172,6 @@ static void npc_program_mkex_hash_tx(struct rvu *rvu, int blkaddr, ...@@ -171,7 +172,6 @@ static void npc_program_mkex_hash_tx(struct rvu *rvu, int blkaddr,
if (mkex_hash->lid_lt_ld_hash_en[intf][lid][lt][ld]) { if (mkex_hash->lid_lt_ld_hash_en[intf][lid][lt][ld]) {
u64 cfg = npc_update_use_hash(lt, ld); u64 cfg = npc_update_use_hash(lt, ld);
hash_cnt++;
if (hash_cnt == NPC_MAX_HASH) if (hash_cnt == NPC_MAX_HASH)
return; return;
...@@ -187,8 +187,6 @@ static void npc_program_mkex_hash_tx(struct rvu *rvu, int blkaddr, ...@@ -187,8 +187,6 @@ static void npc_program_mkex_hash_tx(struct rvu *rvu, int blkaddr,
SET_KEX_LD_HASH_CTRL(intf, ld, SET_KEX_LD_HASH_CTRL(intf, ld,
mkex_hash->hash_ctrl[intf][ld]); mkex_hash->hash_ctrl[intf][ld]);
hash_cnt++; hash_cnt++;
if (hash_cnt == NPC_MAX_HASH)
return;
} }
} }
} }
...@@ -238,8 +236,8 @@ void npc_update_field_hash(struct rvu *rvu, u8 intf, ...@@ -238,8 +236,8 @@ void npc_update_field_hash(struct rvu *rvu, u8 intf,
struct flow_msg *omask) struct flow_msg *omask)
{ {
struct npc_mcam_kex_hash *mkex_hash = rvu->kpu.mkex_hash; struct npc_mcam_kex_hash *mkex_hash = rvu->kpu.mkex_hash;
struct npc_get_secret_key_req req; struct npc_get_field_hash_info_req req;
struct npc_get_secret_key_rsp rsp; struct npc_get_field_hash_info_rsp rsp;
u64 ldata[2], cfg; u64 ldata[2], cfg;
u32 field_hash; u32 field_hash;
u8 hash_idx; u8 hash_idx;
...@@ -250,7 +248,7 @@ void npc_update_field_hash(struct rvu *rvu, u8 intf, ...@@ -250,7 +248,7 @@ void npc_update_field_hash(struct rvu *rvu, u8 intf,
} }
req.intf = intf; req.intf = intf;
rvu_mbox_handler_npc_get_secret_key(rvu, &req, &rsp); rvu_mbox_handler_npc_get_field_hash_info(rvu, &req, &rsp);
for (hash_idx = 0; hash_idx < NPC_MAX_HASH; hash_idx++) { for (hash_idx = 0; hash_idx < NPC_MAX_HASH; hash_idx++) {
cfg = rvu_read64(rvu, blkaddr, NPC_AF_INTFX_HASHX_CFG(intf, hash_idx)); cfg = rvu_read64(rvu, blkaddr, NPC_AF_INTFX_HASHX_CFG(intf, hash_idx));
...@@ -311,13 +309,13 @@ void npc_update_field_hash(struct rvu *rvu, u8 intf, ...@@ -311,13 +309,13 @@ void npc_update_field_hash(struct rvu *rvu, u8 intf,
} }
} }
int rvu_mbox_handler_npc_get_secret_key(struct rvu *rvu, int rvu_mbox_handler_npc_get_field_hash_info(struct rvu *rvu,
struct npc_get_secret_key_req *req, struct npc_get_field_hash_info_req *req,
struct npc_get_secret_key_rsp *rsp) struct npc_get_field_hash_info_rsp *rsp)
{ {
u64 *secret_key = rsp->secret_key; u64 *secret_key = rsp->secret_key;
u8 intf = req->intf; u8 intf = req->intf;
int blkaddr; int i, j, blkaddr;
blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0); blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0);
if (blkaddr < 0) { if (blkaddr < 0) {
...@@ -329,6 +327,19 @@ int rvu_mbox_handler_npc_get_secret_key(struct rvu *rvu, ...@@ -329,6 +327,19 @@ int rvu_mbox_handler_npc_get_secret_key(struct rvu *rvu,
secret_key[1] = rvu_read64(rvu, blkaddr, NPC_AF_INTFX_SECRET_KEY1(intf)); secret_key[1] = rvu_read64(rvu, blkaddr, NPC_AF_INTFX_SECRET_KEY1(intf));
secret_key[2] = rvu_read64(rvu, blkaddr, NPC_AF_INTFX_SECRET_KEY2(intf)); secret_key[2] = rvu_read64(rvu, blkaddr, NPC_AF_INTFX_SECRET_KEY2(intf));
for (i = 0; i < NPC_MAX_HASH; i++) {
for (j = 0; j < NPC_MAX_HASH_MASK; j++) {
rsp->hash_mask[NIX_INTF_RX][i][j] =
GET_KEX_LD_HASH_MASK(NIX_INTF_RX, i, j);
rsp->hash_mask[NIX_INTF_TX][i][j] =
GET_KEX_LD_HASH_MASK(NIX_INTF_TX, i, j);
}
}
for (i = 0; i < NPC_MAX_INTF; i++)
for (j = 0; j < NPC_MAX_HASH; j++)
rsp->hash_ctrl[i][j] = GET_KEX_LD_HASH_CTRL(i, j);
return 0; return 0;
} }
......
...@@ -31,6 +31,12 @@ ...@@ -31,6 +31,12 @@
rvu_write64(rvu, blkaddr, \ rvu_write64(rvu, blkaddr, \
NPC_AF_INTFX_HASHX_MASKX(intf, ld, mask_idx), cfg) NPC_AF_INTFX_HASHX_MASKX(intf, ld, mask_idx), cfg)
#define GET_KEX_LD_HASH_CTRL(intf, ld) \
rvu_read64(rvu, blkaddr, NPC_AF_INTFX_HASHX_RESULT_CTRL(intf, ld))
#define GET_KEX_LD_HASH_MASK(intf, ld, mask_idx) \
rvu_read64(rvu, blkaddr, NPC_AF_INTFX_HASHX_MASKX(intf, ld, mask_idx))
#define SET_KEX_LD_HASH_CTRL(intf, ld, cfg) \ #define SET_KEX_LD_HASH_CTRL(intf, ld, cfg) \
rvu_write64(rvu, blkaddr, \ rvu_write64(rvu, blkaddr, \
NPC_AF_INTFX_HASHX_RESULT_CTRL(intf, ld), cfg) NPC_AF_INTFX_HASHX_RESULT_CTRL(intf, ld), cfg)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment