FILE
pool.h
File preview with syntax highlighting.
linux-6.19.14/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/pool.h
1/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ 2/* Copyright (c) 2024 NVIDIA Corporation & Affiliates */ 3 4#ifndef MLX5HWS_POOL_H_ 5#define MLX5HWS_POOL_H_ 6 7#define MLX5HWS_POOL_STC_LOG_SZ 15 8 9enum mlx5hws_pool_type { 10 MLX5HWS_POOL_TYPE_STE, 11 MLX5HWS_POOL_TYPE_STC, 12}; 13 14struct mlx5hws_pool_chunk { 15 int offset; 16 int order; 17}; 18 19struct mlx5hws_pool_resource { 20 struct mlx5hws_pool *pool; 21 u32 base_id; 22 u32 range; 23}; 24 25enum mlx5hws_pool_flags { 26 /* Managed by a buddy allocator. If this is not set only allocations of 27 * order 0 are supported. 28 */ 29 MLX5HWS_POOL_FLAG_BUDDY = BIT(0), 30}; 31 32enum mlx5hws_pool_optimize { 33 MLX5HWS_POOL_OPTIMIZE_NONE = 0x0, 34 MLX5HWS_POOL_OPTIMIZE_ORIG = 0x1, 35 MLX5HWS_POOL_OPTIMIZE_MIRROR = 0x2, 36 MLX5HWS_POOL_OPTIMIZE_MAX = 0x3, 37}; 38 39struct mlx5hws_pool_attr { 40 enum mlx5hws_pool_type pool_type; 41 enum mlx5hws_table_type table_type; 42 enum mlx5hws_pool_flags flags; 43 enum mlx5hws_pool_optimize opt_type; 44 /* Allocation size once memory is depleted */ 45 size_t alloc_log_sz; 46}; 47 48enum mlx5hws_db_type { 49 /* Uses a bitmap, supports only allocations of order 0. */ 50 MLX5HWS_POOL_DB_TYPE_BITMAP, 51 /* Entries are managed using a buddy mechanism. */ 52 MLX5HWS_POOL_DB_TYPE_BUDDY, 53}; 54 55struct mlx5hws_pool_db { 56 enum mlx5hws_db_type type; 57 union { 58 unsigned long *bitmap; 59 struct mlx5hws_buddy_mem *buddy; 60 }; 61}; 62 63typedef int (*mlx5hws_pool_db_get_chunk)(struct mlx5hws_pool *pool, 64 struct mlx5hws_pool_chunk *chunk); 65typedef void (*mlx5hws_pool_db_put_chunk)(struct mlx5hws_pool *pool, 66 struct mlx5hws_pool_chunk *chunk); 67typedef void (*mlx5hws_pool_unint_db)(struct mlx5hws_pool *pool); 68 69struct mlx5hws_pool { 70 struct mlx5hws_context *ctx; 71 enum mlx5hws_pool_type type; 72 enum mlx5hws_pool_flags flags; 73 struct mutex lock; /* protect the pool */ 74 size_t alloc_log_sz; 75 size_t available_elems; 76 enum mlx5hws_table_type tbl_type; 77 enum mlx5hws_pool_optimize opt_type; 78 struct mlx5hws_pool_resource *resource; 79 struct mlx5hws_pool_resource *mirror_resource; 80 struct mlx5hws_pool_db db; 81 /* Functions */ 82 mlx5hws_pool_unint_db p_db_uninit; 83 mlx5hws_pool_db_get_chunk p_get_chunk; 84 mlx5hws_pool_db_put_chunk p_put_chunk; 85}; 86 87struct mlx5hws_pool * 88mlx5hws_pool_create(struct mlx5hws_context *ctx, 89 struct mlx5hws_pool_attr *pool_attr); 90 91void mlx5hws_pool_destroy(struct mlx5hws_pool *pool); 92 93int mlx5hws_pool_chunk_alloc(struct mlx5hws_pool *pool, 94 struct mlx5hws_pool_chunk *chunk); 95 96void mlx5hws_pool_chunk_free(struct mlx5hws_pool *pool, 97 struct mlx5hws_pool_chunk *chunk); 98 99static inline u32 mlx5hws_pool_get_base_id(struct mlx5hws_pool *pool) 100{ 101 return pool->resource->base_id; 102} 103 104static inline u32 mlx5hws_pool_get_base_mirror_id(struct mlx5hws_pool *pool) 105{ 106 return pool->mirror_resource->base_id; 107} 108 109static inline bool 110mlx5hws_pool_empty(struct mlx5hws_pool *pool) 111{ 112 bool ret; 113 114 mutex_lock(&pool->lock); 115 ret = pool->available_elems == 0; 116 mutex_unlock(&pool->lock); 117 118 return ret; 119} 120 121static inline bool 122mlx5hws_pool_full(struct mlx5hws_pool *pool) 123{ 124 bool ret; 125 126 mutex_lock(&pool->lock); 127 ret = pool->available_elems == (1 << pool->alloc_log_sz); 128 mutex_unlock(&pool->lock); 129 130 return ret; 131} 132#endif /* MLX5HWS_POOL_H_ */
~/
Read-only file preview.