Skip to content

Commit dd78428

Browse files
sumang-mrvldavem330
authored andcommitted
octeontx2-af: Add new devlink param to configure maximum usable NIX block LFs
On some silicon variants the number of available CAM entries are less. Reserving one entry for each NIX-LF for default DMAC based pkt forwarding rules will reduce the number of available CAM entries further. Hence add configurability via devlink to set maximum number of NIX-LFs needed which inturn frees up some CAM entries. Signed-off-by: Suman Ghosh <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 3a3af3a commit dd78428

File tree

3 files changed

+133
-24
lines changed

3 files changed

+133
-24
lines changed

drivers/net/ethernet/marvell/octeontx2/af/rvu.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -949,6 +949,8 @@ int npc_install_mcam_drop_rule(struct rvu *rvu, int mcam_idx, u16 *counter_idx,
949949
u64 bcast_mcast_val, u64 bcast_mcast_mask);
950950
void npc_mcam_rsrcs_reserve(struct rvu *rvu, int blkaddr, int entry_idx);
951951
bool npc_is_feature_supported(struct rvu *rvu, u64 features, u8 intf);
952+
int npc_mcam_rsrcs_init(struct rvu *rvu, int blkaddr);
953+
void npc_mcam_rsrcs_deinit(struct rvu *rvu);
952954

953955
/* CPT APIs */
954956
int rvu_cpt_register_interrupts(struct rvu *rvu);

drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.c

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1237,6 +1237,7 @@ enum rvu_af_dl_param_id {
12371237
RVU_AF_DEVLINK_PARAM_ID_DWRR_MTU,
12381238
RVU_AF_DEVLINK_PARAM_ID_NPC_EXACT_FEATURE_DISABLE,
12391239
RVU_AF_DEVLINK_PARAM_ID_NPC_MCAM_ZONE_PERCENT,
1240+
RVU_AF_DEVLINK_PARAM_ID_NIX_MAXLF,
12401241
};
12411242

12421243
static int rvu_af_npc_exact_feature_get(struct devlink *devlink, u32 id,
@@ -1354,6 +1355,79 @@ static int rvu_af_dl_npc_mcam_high_zone_percent_validate(struct devlink *devlink
13541355
return 0;
13551356
}
13561357

1358+
static int rvu_af_dl_nix_maxlf_get(struct devlink *devlink, u32 id,
1359+
struct devlink_param_gset_ctx *ctx)
1360+
{
1361+
struct rvu_devlink *rvu_dl = devlink_priv(devlink);
1362+
struct rvu *rvu = rvu_dl->rvu;
1363+
1364+
ctx->val.vu16 = (u16)rvu_get_nixlf_count(rvu);
1365+
1366+
return 0;
1367+
}
1368+
1369+
static int rvu_af_dl_nix_maxlf_set(struct devlink *devlink, u32 id,
1370+
struct devlink_param_gset_ctx *ctx)
1371+
{
1372+
struct rvu_devlink *rvu_dl = devlink_priv(devlink);
1373+
struct rvu *rvu = rvu_dl->rvu;
1374+
struct rvu_block *block;
1375+
int blkaddr = 0;
1376+
1377+
npc_mcam_rsrcs_deinit(rvu);
1378+
blkaddr = rvu_get_next_nix_blkaddr(rvu, blkaddr);
1379+
while (blkaddr) {
1380+
block = &rvu->hw->block[blkaddr];
1381+
block->lf.max = ctx->val.vu16;
1382+
blkaddr = rvu_get_next_nix_blkaddr(rvu, blkaddr);
1383+
}
1384+
1385+
blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0);
1386+
npc_mcam_rsrcs_init(rvu, blkaddr);
1387+
1388+
return 0;
1389+
}
1390+
1391+
static int rvu_af_dl_nix_maxlf_validate(struct devlink *devlink, u32 id,
1392+
union devlink_param_value val,
1393+
struct netlink_ext_ack *extack)
1394+
{
1395+
struct rvu_devlink *rvu_dl = devlink_priv(devlink);
1396+
struct rvu *rvu = rvu_dl->rvu;
1397+
u16 max_nix0_lf, max_nix1_lf;
1398+
struct npc_mcam *mcam;
1399+
u64 cfg;
1400+
1401+
cfg = rvu_read64(rvu, BLKADDR_NIX0, NIX_AF_CONST2);
1402+
max_nix0_lf = cfg & 0xFFF;
1403+
cfg = rvu_read64(rvu, BLKADDR_NIX1, NIX_AF_CONST2);
1404+
max_nix1_lf = cfg & 0xFFF;
1405+
1406+
/* Do not allow user to modify maximum NIX LFs while mcam entries
1407+
* have already been assigned.
1408+
*/
1409+
mcam = &rvu->hw->mcam;
1410+
if (mcam->bmap_fcnt < mcam->bmap_entries) {
1411+
NL_SET_ERR_MSG_MOD(extack,
1412+
"mcam entries have already been assigned, can't resize");
1413+
return -EPERM;
1414+
}
1415+
1416+
if (max_nix0_lf && val.vu16 > max_nix0_lf) {
1417+
NL_SET_ERR_MSG_MOD(extack,
1418+
"requested nixlf is greater than the max supported nix0_lf");
1419+
return -EPERM;
1420+
}
1421+
1422+
if (max_nix1_lf && val.vu16 > max_nix1_lf) {
1423+
NL_SET_ERR_MSG_MOD(extack,
1424+
"requested nixlf is greater than the max supported nix1_lf");
1425+
return -EINVAL;
1426+
}
1427+
1428+
return 0;
1429+
}
1430+
13571431
static const struct devlink_param rvu_af_dl_params[] = {
13581432
DEVLINK_PARAM_DRIVER(RVU_AF_DEVLINK_PARAM_ID_DWRR_MTU,
13591433
"dwrr_mtu", DEVLINK_PARAM_TYPE_U32,
@@ -1375,6 +1449,12 @@ static const struct devlink_param rvu_af_dl_param_exact_match[] = {
13751449
rvu_af_dl_npc_mcam_high_zone_percent_get,
13761450
rvu_af_dl_npc_mcam_high_zone_percent_set,
13771451
rvu_af_dl_npc_mcam_high_zone_percent_validate),
1452+
DEVLINK_PARAM_DRIVER(RVU_AF_DEVLINK_PARAM_ID_NIX_MAXLF,
1453+
"nix_maxlf", DEVLINK_PARAM_TYPE_U16,
1454+
BIT(DEVLINK_PARAM_CMODE_RUNTIME),
1455+
rvu_af_dl_nix_maxlf_get,
1456+
rvu_af_dl_nix_maxlf_set,
1457+
rvu_af_dl_nix_maxlf_validate),
13781458
};
13791459

13801460
/* Devlink switch mode */

drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c

Lines changed: 51 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1846,7 +1846,21 @@ static void npc_parser_profile_init(struct rvu *rvu, int blkaddr)
18461846
npc_program_kpu_profile(rvu, blkaddr, idx, &rvu->kpu.kpu[idx]);
18471847
}
18481848

1849-
static int npc_mcam_rsrcs_init(struct rvu *rvu, int blkaddr)
1849+
void npc_mcam_rsrcs_deinit(struct rvu *rvu)
1850+
{
1851+
struct npc_mcam *mcam = &rvu->hw->mcam;
1852+
1853+
kfree(mcam->bmap);
1854+
kfree(mcam->bmap_reverse);
1855+
kfree(mcam->entry2pfvf_map);
1856+
kfree(mcam->cntr2pfvf_map);
1857+
kfree(mcam->entry2cntr_map);
1858+
kfree(mcam->cntr_refcnt);
1859+
kfree(mcam->entry2target_pffunc);
1860+
kfree(mcam->counters.bmap);
1861+
}
1862+
1863+
int npc_mcam_rsrcs_init(struct rvu *rvu, int blkaddr)
18501864
{
18511865
int nixlf_count = rvu_get_nixlf_count(rvu);
18521866
struct npc_mcam *mcam = &rvu->hw->mcam;
@@ -1890,24 +1904,23 @@ static int npc_mcam_rsrcs_init(struct rvu *rvu, int blkaddr)
18901904
mcam->pf_offset = mcam->nixlf_offset + nixlf_count;
18911905

18921906
/* Allocate bitmaps for managing MCAM entries */
1893-
mcam->bmap = devm_kcalloc(rvu->dev, BITS_TO_LONGS(mcam->bmap_entries),
1894-
sizeof(long), GFP_KERNEL);
1907+
mcam->bmap = kmalloc_array(BITS_TO_LONGS(mcam->bmap_entries),
1908+
sizeof(long), GFP_KERNEL);
18951909
if (!mcam->bmap)
18961910
return -ENOMEM;
18971911

1898-
mcam->bmap_reverse = devm_kcalloc(rvu->dev,
1899-
BITS_TO_LONGS(mcam->bmap_entries),
1900-
sizeof(long), GFP_KERNEL);
1912+
mcam->bmap_reverse = kmalloc_array(BITS_TO_LONGS(mcam->bmap_entries),
1913+
sizeof(long), GFP_KERNEL);
19011914
if (!mcam->bmap_reverse)
1902-
return -ENOMEM;
1915+
goto free_bmap;
19031916

19041917
mcam->bmap_fcnt = mcam->bmap_entries;
19051918

19061919
/* Alloc memory for saving entry to RVU PFFUNC allocation mapping */
1907-
mcam->entry2pfvf_map = devm_kcalloc(rvu->dev, mcam->bmap_entries,
1908-
sizeof(u16), GFP_KERNEL);
1920+
mcam->entry2pfvf_map = kmalloc_array(mcam->bmap_entries,
1921+
sizeof(u16), GFP_KERNEL);
19091922
if (!mcam->entry2pfvf_map)
1910-
return -ENOMEM;
1923+
goto free_bmap_reverse;
19111924

19121925
/* Reserve 1/8th of MCAM entries at the bottom for low priority
19131926
* allocations and another 1/8th at the top for high priority
@@ -1926,31 +1939,31 @@ static int npc_mcam_rsrcs_init(struct rvu *rvu, int blkaddr)
19261939
*/
19271940
err = rvu_alloc_bitmap(&mcam->counters);
19281941
if (err)
1929-
return err;
1942+
goto free_entry_map;
19301943

1931-
mcam->cntr2pfvf_map = devm_kcalloc(rvu->dev, mcam->counters.max,
1932-
sizeof(u16), GFP_KERNEL);
1944+
mcam->cntr2pfvf_map = kmalloc_array(mcam->counters.max,
1945+
sizeof(u16), GFP_KERNEL);
19331946
if (!mcam->cntr2pfvf_map)
1934-
goto free_mem;
1947+
goto free_cntr_bmap;
19351948

19361949
/* Alloc memory for MCAM entry to counter mapping and for tracking
19371950
* counter's reference count.
19381951
*/
1939-
mcam->entry2cntr_map = devm_kcalloc(rvu->dev, mcam->bmap_entries,
1940-
sizeof(u16), GFP_KERNEL);
1952+
mcam->entry2cntr_map = kmalloc_array(mcam->bmap_entries,
1953+
sizeof(u16), GFP_KERNEL);
19411954
if (!mcam->entry2cntr_map)
1942-
goto free_mem;
1955+
goto free_cntr_map;
19431956

1944-
mcam->cntr_refcnt = devm_kcalloc(rvu->dev, mcam->counters.max,
1945-
sizeof(u16), GFP_KERNEL);
1957+
mcam->cntr_refcnt = kmalloc_array(mcam->counters.max,
1958+
sizeof(u16), GFP_KERNEL);
19461959
if (!mcam->cntr_refcnt)
1947-
goto free_mem;
1960+
goto free_entry_cntr_map;
19481961

19491962
/* Alloc memory for saving target device of mcam rule */
1950-
mcam->entry2target_pffunc = devm_kcalloc(rvu->dev, mcam->total_entries,
1951-
sizeof(u16), GFP_KERNEL);
1963+
mcam->entry2target_pffunc = kmalloc_array(mcam->total_entries,
1964+
sizeof(u16), GFP_KERNEL);
19521965
if (!mcam->entry2target_pffunc)
1953-
goto free_mem;
1966+
goto free_cntr_refcnt;
19541967

19551968
for (index = 0; index < mcam->bmap_entries; index++) {
19561969
mcam->entry2pfvf_map[index] = NPC_MCAM_INVALID_MAP;
@@ -1964,8 +1977,21 @@ static int npc_mcam_rsrcs_init(struct rvu *rvu, int blkaddr)
19641977

19651978
return 0;
19661979

1967-
free_mem:
1980+
free_cntr_refcnt:
1981+
kfree(mcam->cntr_refcnt);
1982+
free_entry_cntr_map:
1983+
kfree(mcam->entry2cntr_map);
1984+
free_cntr_map:
1985+
kfree(mcam->cntr2pfvf_map);
1986+
free_cntr_bmap:
1987+
kfree(mcam->counters.bmap);
1988+
free_entry_map:
1989+
kfree(mcam->entry2pfvf_map);
1990+
free_bmap_reverse:
1991+
kfree(mcam->bmap_reverse);
1992+
free_bmap:
19681993
kfree(mcam->counters.bmap);
1994+
19691995
return -ENOMEM;
19701996
}
19711997

@@ -2173,6 +2199,7 @@ void rvu_npc_freemem(struct rvu *rvu)
21732199
struct npc_mcam *mcam = &rvu->hw->mcam;
21742200

21752201
kfree(pkind->rsrc.bmap);
2202+
npc_mcam_rsrcs_deinit(rvu);
21762203
kfree(mcam->counters.bmap);
21772204
if (rvu->kpu_prfl_addr)
21782205
iounmap(rvu->kpu_prfl_addr);

0 commit comments

Comments
 (0)