aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArkadi Sharshevsky <arkadis@mellanox.com>2018-01-15 02:59:09 -0500
committerDavid S. Miller <davem@davemloft.net>2018-01-16 14:15:35 -0500
commitafadc26b3aa3e94d1cedf9472889b4c32aecc6ac (patch)
tree2025914441f1ff589aa94f92379b52441cdad5aa
parentc0253a45fde85fa4457867c9021f0750b20117bf (diff)
mlxsw: spectrum: Add support for getting kvdl occupancy
Add support for getting the kvdl occupancy through the resource interface. Signed-off-by: Arkadi Sharshevsky <arkadis@mellanox.com> Signed-off-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum.c9
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum.h1
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c26
3 files changed, 36 insertions, 0 deletions
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
index 53b16ddc6acc..87f8a74118d9 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
@@ -4055,12 +4055,21 @@ mlxsw_sp_resource_kvd_hash_double_size_validate(struct devlink *devlink, u64 siz
4055 return 0; 4055 return 0;
4056} 4056}
4057 4057
4058static u64 mlxsw_sp_resource_kvd_linear_occ_get(struct devlink *devlink)
4059{
4060 struct mlxsw_core *mlxsw_core = devlink_priv(devlink);
4061 struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
4062
4063 return mlxsw_sp_kvdl_occ_get(mlxsw_sp);
4064}
4065
4058static struct devlink_resource_ops mlxsw_sp_resource_kvd_ops = { 4066static struct devlink_resource_ops mlxsw_sp_resource_kvd_ops = {
4059 .size_validate = mlxsw_sp_resource_kvd_size_validate, 4067 .size_validate = mlxsw_sp_resource_kvd_size_validate,
4060}; 4068};
4061 4069
4062static struct devlink_resource_ops mlxsw_sp_resource_kvd_linear_ops = { 4070static struct devlink_resource_ops mlxsw_sp_resource_kvd_linear_ops = {
4063 .size_validate = mlxsw_sp_resource_kvd_linear_size_validate, 4071 .size_validate = mlxsw_sp_resource_kvd_linear_size_validate,
4072 .occ_get = mlxsw_sp_resource_kvd_linear_occ_get,
4064}; 4073};
4065 4074
4066static struct devlink_resource_ops mlxsw_sp_resource_kvd_hash_single_ops = { 4075static struct devlink_resource_ops mlxsw_sp_resource_kvd_hash_single_ops = {
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
index 435e0f2225f6..237cad373dbe 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
@@ -448,6 +448,7 @@ void mlxsw_sp_kvdl_free(struct mlxsw_sp *mlxsw_sp, int entry_index);
448int mlxsw_sp_kvdl_alloc_size_query(struct mlxsw_sp *mlxsw_sp, 448int mlxsw_sp_kvdl_alloc_size_query(struct mlxsw_sp *mlxsw_sp,
449 unsigned int entry_count, 449 unsigned int entry_count,
450 unsigned int *p_alloc_size); 450 unsigned int *p_alloc_size);
451u64 mlxsw_sp_kvdl_occ_get(const struct mlxsw_sp *mlxsw_sp);
451 452
452struct mlxsw_sp_acl_rule_info { 453struct mlxsw_sp_acl_rule_info {
453 unsigned int priority; 454 unsigned int priority;
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c
index 310c38247b5c..cfacc176a1bd 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_kvdl.c
@@ -286,6 +286,32 @@ static void mlxsw_sp_kvdl_parts_fini(struct mlxsw_sp *mlxsw_sp)
286 mlxsw_sp_kvdl_part_fini(mlxsw_sp, i); 286 mlxsw_sp_kvdl_part_fini(mlxsw_sp, i);
287} 287}
288 288
289u64 mlxsw_sp_kvdl_part_occ(struct mlxsw_sp_kvdl_part *part)
290{
291 unsigned int nr_entries;
292 int bit = -1;
293 u64 occ = 0;
294
295 nr_entries = (part->info->end_index -
296 part->info->start_index + 1) /
297 part->info->alloc_size;
298 while ((bit = find_next_bit(part->usage, nr_entries, bit + 1))
299 < nr_entries)
300 occ += part->info->alloc_size;
301 return occ;
302}
303
304u64 mlxsw_sp_kvdl_occ_get(const struct mlxsw_sp *mlxsw_sp)
305{
306 struct mlxsw_sp_kvdl_part *part;
307 u64 occ = 0;
308
309 list_for_each_entry(part, &mlxsw_sp->kvdl->parts_list, list)
310 occ += mlxsw_sp_kvdl_part_occ(part);
311
312 return occ;
313}
314
289int mlxsw_sp_kvdl_init(struct mlxsw_sp *mlxsw_sp) 315int mlxsw_sp_kvdl_init(struct mlxsw_sp *mlxsw_sp)
290{ 316{
291 struct mlxsw_sp_kvdl *kvdl; 317 struct mlxsw_sp_kvdl *kvdl;