10
10
#include "rvu.h"
11
11
#include "rvu_reg.h"
12
12
#include "rvu_struct.h"
13
+ #include "rvu_npc_hash.h"
13
14
14
15
#define DRV_NAME "octeontx2-af"
15
16
@@ -1436,14 +1437,75 @@ static int rvu_af_dl_dwrr_mtu_get(struct devlink *devlink, u32 id,
1436
1437
enum rvu_af_dl_param_id {
1437
1438
RVU_AF_DEVLINK_PARAM_ID_BASE = DEVLINK_PARAM_GENERIC_ID_MAX ,
1438
1439
RVU_AF_DEVLINK_PARAM_ID_DWRR_MTU ,
1440
+ RVU_AF_DEVLINK_PARAM_ID_NPC_EXACT_FEATURE_DISABLE ,
1439
1441
};
1440
1442
1443
+ static int rvu_af_npc_exact_feature_get (struct devlink * devlink , u32 id ,
1444
+ struct devlink_param_gset_ctx * ctx )
1445
+ {
1446
+ struct rvu_devlink * rvu_dl = devlink_priv (devlink );
1447
+ struct rvu * rvu = rvu_dl -> rvu ;
1448
+ bool enabled ;
1449
+
1450
+ enabled = rvu_npc_exact_has_match_table (rvu );
1451
+
1452
+ snprintf (ctx -> val .vstr , sizeof (ctx -> val .vstr ), "%s" ,
1453
+ enabled ? "enabled" : "disabled" );
1454
+
1455
+ return 0 ;
1456
+ }
1457
+
1458
+ static int rvu_af_npc_exact_feature_disable (struct devlink * devlink , u32 id ,
1459
+ struct devlink_param_gset_ctx * ctx )
1460
+ {
1461
+ struct rvu_devlink * rvu_dl = devlink_priv (devlink );
1462
+ struct rvu * rvu = rvu_dl -> rvu ;
1463
+
1464
+ rvu_npc_exact_disable_feature (rvu );
1465
+
1466
+ return 0 ;
1467
+ }
1468
+
1469
+ static int rvu_af_npc_exact_feature_validate (struct devlink * devlink , u32 id ,
1470
+ union devlink_param_value val ,
1471
+ struct netlink_ext_ack * extack )
1472
+ {
1473
+ struct rvu_devlink * rvu_dl = devlink_priv (devlink );
1474
+ struct rvu * rvu = rvu_dl -> rvu ;
1475
+ u64 enable ;
1476
+
1477
+ if (kstrtoull (val .vstr , 10 , & enable )) {
1478
+ NL_SET_ERR_MSG_MOD (extack ,
1479
+ "Only 1 value is supported" );
1480
+ return - EINVAL ;
1481
+ }
1482
+
1483
+ if (enable != 1 ) {
1484
+ NL_SET_ERR_MSG_MOD (extack ,
1485
+ "Only disabling exact match feature is supported" );
1486
+ return - EINVAL ;
1487
+ }
1488
+
1489
+ if (rvu_npc_exact_can_disable_feature (rvu ))
1490
+ return 0 ;
1491
+
1492
+ NL_SET_ERR_MSG_MOD (extack ,
1493
+ "Can't disable exact match feature; Please try before any configuration" );
1494
+ return - EFAULT ;
1495
+ }
1496
+
1441
1497
static const struct devlink_param rvu_af_dl_params [] = {
1442
1498
DEVLINK_PARAM_DRIVER (RVU_AF_DEVLINK_PARAM_ID_DWRR_MTU ,
1443
1499
"dwrr_mtu" , DEVLINK_PARAM_TYPE_U32 ,
1444
1500
BIT (DEVLINK_PARAM_CMODE_RUNTIME ),
1445
1501
rvu_af_dl_dwrr_mtu_get , rvu_af_dl_dwrr_mtu_set ,
1446
1502
rvu_af_dl_dwrr_mtu_validate ),
1503
+ DEVLINK_PARAM_DRIVER (RVU_AF_DEVLINK_PARAM_ID_NPC_EXACT_FEATURE_DISABLE ,
1504
+ "npc_exact_feature_disable" , DEVLINK_PARAM_TYPE_STRING ,
1505
+ BIT (DEVLINK_PARAM_CMODE_RUNTIME ),
1506
+ rvu_af_npc_exact_feature_get ,
1507
+ rvu_af_npc_exact_feature_disable ,
1508
+ rvu_af_npc_exact_feature_validate ),
1447
1509
};
1448
1510
1449
1511
/* Devlink switch mode */
@@ -1501,6 +1563,7 @@ int rvu_register_dl(struct rvu *rvu)
1501
1563
{
1502
1564
struct rvu_devlink * rvu_dl ;
1503
1565
struct devlink * dl ;
1566
+ size_t size ;
1504
1567
int err ;
1505
1568
1506
1569
dl = devlink_alloc (& rvu_devlink_ops , sizeof (struct rvu_devlink ),
@@ -1522,8 +1585,12 @@ int rvu_register_dl(struct rvu *rvu)
1522
1585
goto err_dl_health ;
1523
1586
}
1524
1587
1525
- err = devlink_params_register (dl , rvu_af_dl_params ,
1526
- ARRAY_SIZE (rvu_af_dl_params ));
1588
+ /* Register exact match devlink only for CN10K-B */
1589
+ size = ARRAY_SIZE (rvu_af_dl_params );
1590
+ if (!rvu_npc_exact_has_match_table (rvu ))
1591
+ size -= 1 ;
1592
+
1593
+ err = devlink_params_register (dl , rvu_af_dl_params , size );
1527
1594
if (err ) {
1528
1595
dev_err (rvu -> dev ,
1529
1596
"devlink params register failed with error %d" , err );
0 commit comments