f-stack/dpdk/drivers/net/mlx5/hws/mlx5dr_pool.h

153 lines
4.2 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright (c) 2022 NVIDIA Corporation & Affiliates
*/
#ifndef MLX5DR_POOL_H_
#define MLX5DR_POOL_H_
enum mlx5dr_pool_type {
MLX5DR_POOL_TYPE_STE,
MLX5DR_POOL_TYPE_STC,
};
#define MLX5DR_POOL_STC_LOG_SZ 14
#define MLX5DR_POOL_RESOURCE_ARR_SZ 100
struct mlx5dr_pool_chunk {
uint32_t resource_idx;
/* Internal offset, relative to base index */
int offset;
int order;
};
struct mlx5dr_pool_resource {
struct mlx5dr_pool *pool;
struct mlx5dr_devx_obj *devx_obj;
uint32_t base_id;
uint32_t range;
};
enum mlx5dr_pool_flags {
/* Only a one resource in that pool */
MLX5DR_POOL_FLAGS_ONE_RESOURCE = 1 << 0,
MLX5DR_POOL_FLAGS_RELEASE_FREE_RESOURCE = 1 << 1,
/* No sharing resources between chunks */
MLX5DR_POOL_FLAGS_RESOURCE_PER_CHUNK = 1 << 2,
/* All objects are in the same size */
MLX5DR_POOL_FLAGS_FIXED_SIZE_OBJECTS = 1 << 3,
/* Manged by buddy allocator */
MLX5DR_POOL_FLAGS_BUDDY_MANAGED = 1 << 4,
/* Allocate pool_type memory on pool creation */
MLX5DR_POOL_FLAGS_ALLOC_MEM_ON_CREATE = 1 << 5,
/* These values should be used by the caller */
MLX5DR_POOL_FLAGS_FOR_STC_POOL =
MLX5DR_POOL_FLAGS_ONE_RESOURCE |
MLX5DR_POOL_FLAGS_FIXED_SIZE_OBJECTS,
MLX5DR_POOL_FLAGS_FOR_MATCHER_STE_POOL =
MLX5DR_POOL_FLAGS_RELEASE_FREE_RESOURCE |
MLX5DR_POOL_FLAGS_RESOURCE_PER_CHUNK,
MLX5DR_POOL_FLAGS_FOR_STE_ACTION_POOL =
MLX5DR_POOL_FLAGS_ONE_RESOURCE |
MLX5DR_POOL_FLAGS_BUDDY_MANAGED |
MLX5DR_POOL_FLAGS_ALLOC_MEM_ON_CREATE,
};
enum mlx5dr_pool_optimize {
MLX5DR_POOL_OPTIMIZE_NONE = 0x0,
MLX5DR_POOL_OPTIMIZE_ORIG = 0x1,
MLX5DR_POOL_OPTIMIZE_MIRROR = 0x2,
};
struct mlx5dr_pool_attr {
enum mlx5dr_pool_type pool_type;
enum mlx5dr_table_type table_type;
enum mlx5dr_pool_flags flags;
enum mlx5dr_pool_optimize opt_type;
/* Allocation size once memory is depleted */
size_t alloc_log_sz;
};
enum mlx5dr_db_type {
/* Uses for allocating chunk of big memory, each element has its own resource in the FW*/
MLX5DR_POOL_DB_TYPE_GENERAL_SIZE,
/* One resource only, all the elements are with same one size */
MLX5DR_POOL_DB_TYPE_ONE_SIZE_RESOURCE,
/* Many resources, the memory allocated with buddy mechanism */
MLX5DR_POOL_DB_TYPE_BUDDY,
};
struct mlx5dr_buddy_manager {
struct mlx5dr_buddy_mem *buddies[MLX5DR_POOL_RESOURCE_ARR_SZ];
};
struct mlx5dr_pool_elements {
uint32_t num_of_elements;
struct rte_bitmap *bitmap;
bool is_full;
};
struct mlx5dr_element_manager {
struct mlx5dr_pool_elements *elements[MLX5DR_POOL_RESOURCE_ARR_SZ];
};
struct mlx5dr_pool_db {
enum mlx5dr_db_type type;
union {
struct mlx5dr_element_manager *element_manager;
struct mlx5dr_buddy_manager *buddy_manager;
};
};
typedef int (*mlx5dr_pool_db_get_chunk)(struct mlx5dr_pool *pool,
struct mlx5dr_pool_chunk *chunk);
typedef void (*mlx5dr_pool_db_put_chunk)(struct mlx5dr_pool *pool,
struct mlx5dr_pool_chunk *chunk);
typedef void (*mlx5dr_pool_unint_db)(struct mlx5dr_pool *pool);
struct mlx5dr_pool {
struct mlx5dr_context *ctx;
enum mlx5dr_pool_type type;
enum mlx5dr_pool_flags flags;
pthread_spinlock_t lock;
size_t alloc_log_sz;
enum mlx5dr_table_type tbl_type;
enum mlx5dr_pool_optimize opt_type;
struct mlx5dr_pool_resource *resource[MLX5DR_POOL_RESOURCE_ARR_SZ];
struct mlx5dr_pool_resource *mirror_resource[MLX5DR_POOL_RESOURCE_ARR_SZ];
/* DB */
struct mlx5dr_pool_db db;
/* Functions */
mlx5dr_pool_unint_db p_db_uninit;
mlx5dr_pool_db_get_chunk p_get_chunk;
mlx5dr_pool_db_put_chunk p_put_chunk;
};
struct mlx5dr_pool *
mlx5dr_pool_create(struct mlx5dr_context *ctx,
struct mlx5dr_pool_attr *pool_attr);
int mlx5dr_pool_destroy(struct mlx5dr_pool *pool);
int mlx5dr_pool_chunk_alloc(struct mlx5dr_pool *pool,
struct mlx5dr_pool_chunk *chunk);
void mlx5dr_pool_chunk_free(struct mlx5dr_pool *pool,
struct mlx5dr_pool_chunk *chunk);
static inline struct mlx5dr_devx_obj *
mlx5dr_pool_chunk_get_base_devx_obj(struct mlx5dr_pool *pool,
struct mlx5dr_pool_chunk *chunk)
{
return pool->resource[chunk->resource_idx]->devx_obj;
}
static inline struct mlx5dr_devx_obj *
mlx5dr_pool_chunk_get_base_devx_obj_mirror(struct mlx5dr_pool *pool,
struct mlx5dr_pool_chunk *chunk)
{
return pool->mirror_resource[chunk->resource_idx]->devx_obj;
}
#endif /* MLX5DR_POOL_H_ */