10a020d41SJiri Pirko /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */ 20a020d41SJiri Pirko /* Copyright (c) 2018 Mellanox Technologies. All rights reserved */ 30a020d41SJiri Pirko 40a020d41SJiri Pirko #ifndef _OBJAGG_H 50a020d41SJiri Pirko #define _OBJAGG_H 60a020d41SJiri Pirko 70a020d41SJiri Pirko struct objagg_ops { 80a020d41SJiri Pirko size_t obj_size; 99069a381SJiri Pirko bool (*delta_check)(void *priv, const void *parent_obj, 109069a381SJiri Pirko const void *obj); 110a020d41SJiri Pirko void * (*delta_create)(void *priv, void *parent_obj, void *obj); 120a020d41SJiri Pirko void (*delta_destroy)(void *priv, void *delta_priv); 139069a381SJiri Pirko void * (*root_create)(void *priv, void *obj, unsigned int root_id); 149069a381SJiri Pirko #define OBJAGG_OBJ_ROOT_ID_INVALID UINT_MAX 150a020d41SJiri Pirko void (*root_destroy)(void *priv, void *root_priv); 160a020d41SJiri Pirko }; 170a020d41SJiri Pirko 180a020d41SJiri Pirko struct objagg; 190a020d41SJiri Pirko struct objagg_obj; 209069a381SJiri Pirko struct objagg_hints; 210a020d41SJiri Pirko 220a020d41SJiri Pirko const void *objagg_obj_root_priv(const struct objagg_obj *objagg_obj); 230a020d41SJiri Pirko const void *objagg_obj_delta_priv(const struct objagg_obj *objagg_obj); 240a020d41SJiri Pirko const void *objagg_obj_raw(const struct objagg_obj *objagg_obj); 250a020d41SJiri Pirko 260a020d41SJiri Pirko struct objagg_obj *objagg_obj_get(struct objagg *objagg, void *obj); 270a020d41SJiri Pirko void objagg_obj_put(struct objagg *objagg, struct objagg_obj *objagg_obj); 289069a381SJiri Pirko struct objagg *objagg_create(const struct objagg_ops *ops, 299069a381SJiri Pirko struct objagg_hints *hints, void *priv); 300a020d41SJiri Pirko void objagg_destroy(struct objagg *objagg); 310a020d41SJiri Pirko 320a020d41SJiri Pirko struct objagg_obj_stats { 330a020d41SJiri Pirko unsigned int user_count; 340a020d41SJiri Pirko unsigned int delta_user_count; /* includes delta object users */ 350a020d41SJiri Pirko }; 360a020d41SJiri Pirko 370a020d41SJiri Pirko struct objagg_obj_stats_info { 380a020d41SJiri Pirko struct objagg_obj_stats stats; 390a020d41SJiri Pirko struct objagg_obj *objagg_obj; /* associated object */ 400a020d41SJiri Pirko bool is_root; 410a020d41SJiri Pirko }; 420a020d41SJiri Pirko 430a020d41SJiri Pirko struct objagg_stats { 44*204f6a8cSJiri Pirko unsigned int root_count; 450a020d41SJiri Pirko unsigned int stats_info_count; 460a020d41SJiri Pirko struct objagg_obj_stats_info stats_info[]; 470a020d41SJiri Pirko }; 480a020d41SJiri Pirko 490a020d41SJiri Pirko const struct objagg_stats *objagg_stats_get(struct objagg *objagg); 500a020d41SJiri Pirko void objagg_stats_put(const struct objagg_stats *objagg_stats); 510a020d41SJiri Pirko 529069a381SJiri Pirko enum objagg_opt_algo_type { 539069a381SJiri Pirko OBJAGG_OPT_ALGO_SIMPLE_GREEDY, 549069a381SJiri Pirko }; 559069a381SJiri Pirko 569069a381SJiri Pirko struct objagg_hints *objagg_hints_get(struct objagg *objagg, 579069a381SJiri Pirko enum objagg_opt_algo_type opt_algo_type); 589069a381SJiri Pirko void objagg_hints_put(struct objagg_hints *objagg_hints); 599069a381SJiri Pirko const struct objagg_stats * 609069a381SJiri Pirko objagg_hints_stats_get(struct objagg_hints *objagg_hints); 619069a381SJiri Pirko 620a020d41SJiri Pirko #endif 63