mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-17 17:24:17 +08:00
mlxsw: Add a resource describing number of RIFs
The Spectrum ASIC has a limit on how many L3 devices (called RIFs) can be created. The limit depends on the ASIC and FW revision, and mlxsw reads it from the FW. In order to communicate both the number of RIFs that there can be, and how many are taken now (i.e. occupancy), introduce a corresponding devlink resource. Signed-off-by: Petr Machata <petrm@nvidia.com> Reviewed-by: Amit Cohen <amcohen@nvidia.com> Signed-off-by: Ido Schimmel <idosch@nvidia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
b9840fe035
commit
4ec2feb26c
@ -3580,6 +3580,25 @@ mlxsw_sp_resources_rif_mac_profile_register(struct mlxsw_core *mlxsw_core)
|
|||||||
&size_params);
|
&size_params);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int mlxsw_sp_resources_rifs_register(struct mlxsw_core *mlxsw_core)
|
||||||
|
{
|
||||||
|
struct devlink *devlink = priv_to_devlink(mlxsw_core);
|
||||||
|
struct devlink_resource_size_params size_params;
|
||||||
|
u64 max_rifs;
|
||||||
|
|
||||||
|
if (!MLXSW_CORE_RES_VALID(mlxsw_core, MAX_RIFS))
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
|
max_rifs = MLXSW_CORE_RES_GET(mlxsw_core, MAX_RIFS);
|
||||||
|
devlink_resource_size_params_init(&size_params, max_rifs, max_rifs,
|
||||||
|
1, DEVLINK_RESOURCE_UNIT_ENTRY);
|
||||||
|
|
||||||
|
return devlink_resource_register(devlink, "rifs", max_rifs,
|
||||||
|
MLXSW_SP_RESOURCE_RIFS,
|
||||||
|
DEVLINK_RESOURCE_ID_PARENT_TOP,
|
||||||
|
&size_params);
|
||||||
|
}
|
||||||
|
|
||||||
static int mlxsw_sp1_resources_register(struct mlxsw_core *mlxsw_core)
|
static int mlxsw_sp1_resources_register(struct mlxsw_core *mlxsw_core)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
@ -3604,8 +3623,13 @@ static int mlxsw_sp1_resources_register(struct mlxsw_core *mlxsw_core)
|
|||||||
if (err)
|
if (err)
|
||||||
goto err_resources_rif_mac_profile_register;
|
goto err_resources_rif_mac_profile_register;
|
||||||
|
|
||||||
|
err = mlxsw_sp_resources_rifs_register(mlxsw_core);
|
||||||
|
if (err)
|
||||||
|
goto err_resources_rifs_register;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
err_resources_rifs_register:
|
||||||
err_resources_rif_mac_profile_register:
|
err_resources_rif_mac_profile_register:
|
||||||
err_policer_resources_register:
|
err_policer_resources_register:
|
||||||
err_resources_counter_register:
|
err_resources_counter_register:
|
||||||
@ -3638,8 +3662,13 @@ static int mlxsw_sp2_resources_register(struct mlxsw_core *mlxsw_core)
|
|||||||
if (err)
|
if (err)
|
||||||
goto err_resources_rif_mac_profile_register;
|
goto err_resources_rif_mac_profile_register;
|
||||||
|
|
||||||
|
err = mlxsw_sp_resources_rifs_register(mlxsw_core);
|
||||||
|
if (err)
|
||||||
|
goto err_resources_rifs_register;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
err_resources_rifs_register:
|
||||||
err_resources_rif_mac_profile_register:
|
err_resources_rif_mac_profile_register:
|
||||||
err_policer_resources_register:
|
err_policer_resources_register:
|
||||||
err_resources_counter_register:
|
err_resources_counter_register:
|
||||||
|
@ -68,6 +68,7 @@ enum mlxsw_sp_resource_id {
|
|||||||
MLXSW_SP_RESOURCE_GLOBAL_POLICERS,
|
MLXSW_SP_RESOURCE_GLOBAL_POLICERS,
|
||||||
MLXSW_SP_RESOURCE_SINGLE_RATE_POLICERS,
|
MLXSW_SP_RESOURCE_SINGLE_RATE_POLICERS,
|
||||||
MLXSW_SP_RESOURCE_RIF_MAC_PROFILES,
|
MLXSW_SP_RESOURCE_RIF_MAC_PROFILES,
|
||||||
|
MLXSW_SP_RESOURCE_RIFS,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mlxsw_sp_port;
|
struct mlxsw_sp_port;
|
||||||
|
@ -8323,6 +8323,13 @@ static u64 mlxsw_sp_rif_mac_profiles_occ_get(void *priv)
|
|||||||
return atomic_read(&mlxsw_sp->router->rif_mac_profiles_count);
|
return atomic_read(&mlxsw_sp->router->rif_mac_profiles_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static u64 mlxsw_sp_rifs_occ_get(void *priv)
|
||||||
|
{
|
||||||
|
const struct mlxsw_sp *mlxsw_sp = priv;
|
||||||
|
|
||||||
|
return atomic_read(&mlxsw_sp->router->rifs_count);
|
||||||
|
}
|
||||||
|
|
||||||
static struct mlxsw_sp_rif_mac_profile *
|
static struct mlxsw_sp_rif_mac_profile *
|
||||||
mlxsw_sp_rif_mac_profile_create(struct mlxsw_sp *mlxsw_sp, const char *mac,
|
mlxsw_sp_rif_mac_profile_create(struct mlxsw_sp *mlxsw_sp, const char *mac,
|
||||||
struct netlink_ext_ack *extack)
|
struct netlink_ext_ack *extack)
|
||||||
@ -9828,6 +9835,10 @@ static int mlxsw_sp_rifs_init(struct mlxsw_sp *mlxsw_sp)
|
|||||||
MLXSW_SP_RESOURCE_RIF_MAC_PROFILES,
|
MLXSW_SP_RESOURCE_RIF_MAC_PROFILES,
|
||||||
mlxsw_sp_rif_mac_profiles_occ_get,
|
mlxsw_sp_rif_mac_profiles_occ_get,
|
||||||
mlxsw_sp);
|
mlxsw_sp);
|
||||||
|
devlink_resource_occ_get_register(devlink,
|
||||||
|
MLXSW_SP_RESOURCE_RIFS,
|
||||||
|
mlxsw_sp_rifs_occ_get,
|
||||||
|
mlxsw_sp);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -9841,6 +9852,7 @@ static void mlxsw_sp_rifs_fini(struct mlxsw_sp *mlxsw_sp)
|
|||||||
for (i = 0; i < MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_RIFS); i++)
|
for (i = 0; i < MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_RIFS); i++)
|
||||||
WARN_ON_ONCE(mlxsw_sp->router->rifs[i]);
|
WARN_ON_ONCE(mlxsw_sp->router->rifs[i]);
|
||||||
|
|
||||||
|
devlink_resource_occ_get_unregister(devlink, MLXSW_SP_RESOURCE_RIFS);
|
||||||
devlink_resource_occ_get_unregister(devlink,
|
devlink_resource_occ_get_unregister(devlink,
|
||||||
MLXSW_SP_RESOURCE_RIF_MAC_PROFILES);
|
MLXSW_SP_RESOURCE_RIF_MAC_PROFILES);
|
||||||
WARN_ON(!idr_is_empty(&mlxsw_sp->router->rif_mac_profiles_idr));
|
WARN_ON(!idr_is_empty(&mlxsw_sp->router->rif_mac_profiles_idr));
|
||||||
|
Loading…
Reference in New Issue
Block a user