@@ -1202,6 +1202,25 @@ static int ice_devlink_set_parent(struct devlink_rate *devlink_rate,
1202
1202
return status ;
1203
1203
}
1204
1204
1205
+ static void ice_set_min_max_msix (struct ice_pf * pf )
1206
+ {
1207
+ struct devlink * devlink = priv_to_devlink (pf );
1208
+ union devlink_param_value val ;
1209
+ int err ;
1210
+
1211
+ err = devl_param_driverinit_value_get (devlink ,
1212
+ DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MIN ,
1213
+ & val );
1214
+ if (!err )
1215
+ pf -> msix .min = val .vu32 ;
1216
+
1217
+ err = devl_param_driverinit_value_get (devlink ,
1218
+ DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MAX ,
1219
+ & val );
1220
+ if (!err )
1221
+ pf -> msix .max = val .vu32 ;
1222
+ }
1223
+
1205
1224
/**
1206
1225
* ice_devlink_reinit_up - do reinit of the given PF
1207
1226
* @pf: pointer to the PF struct
@@ -1217,6 +1236,9 @@ static int ice_devlink_reinit_up(struct ice_pf *pf)
1217
1236
return err ;
1218
1237
}
1219
1238
1239
+ /* load MSI-X values */
1240
+ ice_set_min_max_msix (pf );
1241
+
1220
1242
err = ice_init_dev (pf );
1221
1243
if (err )
1222
1244
goto unroll_hw_init ;
@@ -1530,6 +1552,30 @@ static int ice_devlink_local_fwd_validate(struct devlink *devlink, u32 id,
1530
1552
return 0 ;
1531
1553
}
1532
1554
1555
+ static int
1556
+ ice_devlink_msix_max_pf_validate (struct devlink * devlink , u32 id ,
1557
+ union devlink_param_value val ,
1558
+ struct netlink_ext_ack * extack )
1559
+ {
1560
+ struct ice_pf * pf = devlink_priv (devlink );
1561
+
1562
+ if (val .vu32 > pf -> hw .func_caps .common_cap .num_msix_vectors )
1563
+ return - EINVAL ;
1564
+
1565
+ return 0 ;
1566
+ }
1567
+
1568
+ static int
1569
+ ice_devlink_msix_min_pf_validate (struct devlink * devlink , u32 id ,
1570
+ union devlink_param_value val ,
1571
+ struct netlink_ext_ack * extack )
1572
+ {
1573
+ if (val .vu32 < ICE_MIN_MSIX )
1574
+ return - EINVAL ;
1575
+
1576
+ return 0 ;
1577
+ }
1578
+
1533
1579
enum ice_param_id {
1534
1580
ICE_DEVLINK_PARAM_ID_BASE = DEVLINK_PARAM_GENERIC_ID_MAX ,
1535
1581
ICE_DEVLINK_PARAM_ID_TX_SCHED_LAYERS ,
@@ -1547,6 +1593,15 @@ static const struct devlink_param ice_dvl_rdma_params[] = {
1547
1593
ice_devlink_enable_iw_validate ),
1548
1594
};
1549
1595
1596
+ static const struct devlink_param ice_dvl_msix_params [] = {
1597
+ DEVLINK_PARAM_GENERIC (MSIX_VEC_PER_PF_MAX ,
1598
+ BIT (DEVLINK_PARAM_CMODE_DRIVERINIT ),
1599
+ NULL , NULL , ice_devlink_msix_max_pf_validate ),
1600
+ DEVLINK_PARAM_GENERIC (MSIX_VEC_PER_PF_MIN ,
1601
+ BIT (DEVLINK_PARAM_CMODE_DRIVERINIT ),
1602
+ NULL , NULL , ice_devlink_msix_min_pf_validate ),
1603
+ };
1604
+
1550
1605
static const struct devlink_param ice_dvl_sched_params [] = {
1551
1606
DEVLINK_PARAM_DRIVER (ICE_DEVLINK_PARAM_ID_TX_SCHED_LAYERS ,
1552
1607
"tx_scheduling_layers" ,
@@ -1648,6 +1703,7 @@ void ice_devlink_unregister(struct ice_pf *pf)
1648
1703
int ice_devlink_register_params (struct ice_pf * pf )
1649
1704
{
1650
1705
struct devlink * devlink = priv_to_devlink (pf );
1706
+ union devlink_param_value value ;
1651
1707
struct ice_hw * hw = & pf -> hw ;
1652
1708
int status ;
1653
1709
@@ -1656,10 +1712,33 @@ int ice_devlink_register_params(struct ice_pf *pf)
1656
1712
if (status )
1657
1713
return status ;
1658
1714
1715
+ status = devl_params_register (devlink , ice_dvl_msix_params ,
1716
+ ARRAY_SIZE (ice_dvl_msix_params ));
1717
+ if (status )
1718
+ goto unregister_rdma_params ;
1719
+
1659
1720
if (hw -> func_caps .common_cap .tx_sched_topo_comp_mode_en )
1660
1721
status = devl_params_register (devlink , ice_dvl_sched_params ,
1661
1722
ARRAY_SIZE (ice_dvl_sched_params ));
1723
+ if (status )
1724
+ goto unregister_msix_params ;
1725
+
1726
+ value .vu32 = pf -> msix .max ;
1727
+ devl_param_driverinit_value_set (devlink ,
1728
+ DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MAX ,
1729
+ value );
1730
+ value .vu32 = pf -> msix .min ;
1731
+ devl_param_driverinit_value_set (devlink ,
1732
+ DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MIN ,
1733
+ value );
1734
+ return 0 ;
1662
1735
1736
+ unregister_msix_params :
1737
+ devl_params_unregister (devlink , ice_dvl_msix_params ,
1738
+ ARRAY_SIZE (ice_dvl_msix_params ));
1739
+ unregister_rdma_params :
1740
+ devl_params_unregister (devlink , ice_dvl_rdma_params ,
1741
+ ARRAY_SIZE (ice_dvl_rdma_params ));
1663
1742
return status ;
1664
1743
}
1665
1744
@@ -1670,6 +1749,8 @@ void ice_devlink_unregister_params(struct ice_pf *pf)
1670
1749
1671
1750
devl_params_unregister (devlink , ice_dvl_rdma_params ,
1672
1751
ARRAY_SIZE (ice_dvl_rdma_params ));
1752
+ devl_params_unregister (devlink , ice_dvl_msix_params ,
1753
+ ARRAY_SIZE (ice_dvl_msix_params ));
1673
1754
1674
1755
if (hw -> func_caps .common_cap .tx_sched_topo_comp_mode_en )
1675
1756
devl_params_unregister (devlink , ice_dvl_sched_params ,
0 commit comments