162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef __PERF_CONFIG_H
362306a36Sopenharmony_ci#define __PERF_CONFIG_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <stdbool.h>
662306a36Sopenharmony_ci#include <linux/list.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_cistruct perf_config_item {
962306a36Sopenharmony_ci	char *name;
1062306a36Sopenharmony_ci	char *value;
1162306a36Sopenharmony_ci	bool from_system_config;
1262306a36Sopenharmony_ci	struct list_head node;
1362306a36Sopenharmony_ci};
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistruct perf_config_section {
1662306a36Sopenharmony_ci	char *name;
1762306a36Sopenharmony_ci	struct list_head items;
1862306a36Sopenharmony_ci	bool from_system_config;
1962306a36Sopenharmony_ci	struct list_head node;
2062306a36Sopenharmony_ci};
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistruct perf_config_set {
2362306a36Sopenharmony_ci	struct list_head sections;
2462306a36Sopenharmony_ci};
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ciextern const char *config_exclusive_filename;
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_citypedef int (*config_fn_t)(const char *, const char *, void *);
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ciint perf_default_config(const char *, const char *, void *);
3162306a36Sopenharmony_ciint perf_config(config_fn_t fn, void *);
3262306a36Sopenharmony_ciint perf_config_scan(const char *name, const char *fmt, ...) __scanf(2, 3);
3362306a36Sopenharmony_ciint perf_config_set(struct perf_config_set *set,
3462306a36Sopenharmony_ci		    config_fn_t fn, void *data);
3562306a36Sopenharmony_ciint perf_config_int(int *dest, const char *, const char *);
3662306a36Sopenharmony_ciint perf_config_u8(u8 *dest, const char *name, const char *value);
3762306a36Sopenharmony_ciint perf_config_u64(u64 *dest, const char *, const char *);
3862306a36Sopenharmony_ciint perf_config_bool(const char *, const char *);
3962306a36Sopenharmony_ciint config_error_nonbool(const char *);
4062306a36Sopenharmony_ciconst char *perf_etc_perfconfig(void);
4162306a36Sopenharmony_ciconst char *perf_home_perfconfig(void);
4262306a36Sopenharmony_ciint perf_config_system(void);
4362306a36Sopenharmony_ciint perf_config_global(void);
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cistruct perf_config_set *perf_config_set__new(void);
4662306a36Sopenharmony_cistruct perf_config_set *perf_config_set__load_file(const char *file);
4762306a36Sopenharmony_civoid perf_config_set__delete(struct perf_config_set *set);
4862306a36Sopenharmony_ciint perf_config_set__collect(struct perf_config_set *set, const char *file_name,
4962306a36Sopenharmony_ci			     const char *var, const char *value);
5062306a36Sopenharmony_civoid perf_config__exit(void);
5162306a36Sopenharmony_civoid perf_config__refresh(void);
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci/**
5462306a36Sopenharmony_ci * perf_config_sections__for_each - iterate thru all the sections
5562306a36Sopenharmony_ci * @list: list_head instance to iterate
5662306a36Sopenharmony_ci * @section: struct perf_config_section iterator
5762306a36Sopenharmony_ci */
5862306a36Sopenharmony_ci#define perf_config_sections__for_each_entry(list, section)	\
5962306a36Sopenharmony_ci        list_for_each_entry(section, list, node)
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci/**
6262306a36Sopenharmony_ci * perf_config_items__for_each - iterate thru all the items
6362306a36Sopenharmony_ci * @list: list_head instance to iterate
6462306a36Sopenharmony_ci * @item: struct perf_config_item iterator
6562306a36Sopenharmony_ci */
6662306a36Sopenharmony_ci#define perf_config_items__for_each_entry(list, item)	\
6762306a36Sopenharmony_ci        list_for_each_entry(item, list, node)
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci/**
7062306a36Sopenharmony_ci * perf_config_set__for_each - iterate thru all the config section-item pairs
7162306a36Sopenharmony_ci * @set: evlist instance to iterate
7262306a36Sopenharmony_ci * @section: struct perf_config_section iterator
7362306a36Sopenharmony_ci * @item: struct perf_config_item iterator
7462306a36Sopenharmony_ci */
7562306a36Sopenharmony_ci#define perf_config_set__for_each_entry(set, section, item)			\
7662306a36Sopenharmony_ci	perf_config_sections__for_each_entry(&set->sections, section)		\
7762306a36Sopenharmony_ci	perf_config_items__for_each_entry(&section->items, item)
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci#endif /* __PERF_CONFIG_H */
80