xref: /dpdk/lib/eal/include/rte_class.h (revision 719834a6849e1daf4a70ff7742bbcc3ae7e25607)
199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
299a2dd95SBruce Richardson  * Copyright 2018 Gaëtan Rivet
399a2dd95SBruce Richardson  */
499a2dd95SBruce Richardson 
599a2dd95SBruce Richardson #ifndef _RTE_CLASS_H_
699a2dd95SBruce Richardson #define _RTE_CLASS_H_
799a2dd95SBruce Richardson 
899a2dd95SBruce Richardson /**
999a2dd95SBruce Richardson  * @file
1099a2dd95SBruce Richardson  *
1199a2dd95SBruce Richardson  * DPDK device class interface.
1299a2dd95SBruce Richardson  *
1399a2dd95SBruce Richardson  * This file describes the interface of the device class
1499a2dd95SBruce Richardson  * abstraction layer.
1599a2dd95SBruce Richardson  *
1699a2dd95SBruce Richardson  * A device class defines the type of function a device
1799a2dd95SBruce Richardson  * will be used for e.g.: Ethernet adapter (eth),
1899a2dd95SBruce Richardson  * cryptographic co-processor (crypto), etc.
1999a2dd95SBruce Richardson  */
2099a2dd95SBruce Richardson 
21*719834a6SMattias Rönnblom #include <rte_dev.h>
22*719834a6SMattias Rönnblom 
2399a2dd95SBruce Richardson #ifdef __cplusplus
2499a2dd95SBruce Richardson extern "C" {
2599a2dd95SBruce Richardson #endif
2699a2dd95SBruce Richardson 
2799a2dd95SBruce Richardson /** Double linked list of classes */
28f1f6ebc0SWilliam Tu RTE_TAILQ_HEAD(rte_class_list, rte_class);
2999a2dd95SBruce Richardson 
3099a2dd95SBruce Richardson /**
3199a2dd95SBruce Richardson  * A structure describing a generic device class.
3299a2dd95SBruce Richardson  */
3399a2dd95SBruce Richardson struct rte_class {
34f1f6ebc0SWilliam Tu 	RTE_TAILQ_ENTRY(rte_class) next; /**< Next device class in linked list */
3599a2dd95SBruce Richardson 	const char *name; /**< Name of the class */
3699a2dd95SBruce Richardson 	rte_dev_iterate_t dev_iterate; /**< Device iterator. */
3799a2dd95SBruce Richardson };
3899a2dd95SBruce Richardson 
3999a2dd95SBruce Richardson /**
4099a2dd95SBruce Richardson  * Class comparison function.
4199a2dd95SBruce Richardson  *
4299a2dd95SBruce Richardson  * @param cls
4399a2dd95SBruce Richardson  *	Class under test.
4499a2dd95SBruce Richardson  *
4599a2dd95SBruce Richardson  * @param data
4699a2dd95SBruce Richardson  *	Data to compare against.
4799a2dd95SBruce Richardson  *
4899a2dd95SBruce Richardson  * @return
4999a2dd95SBruce Richardson  *	0 if the class matches the data.
5099a2dd95SBruce Richardson  *	!0 if the class does not match.
5199a2dd95SBruce Richardson  *	<0 if ordering is possible and the class is lower than the data.
5299a2dd95SBruce Richardson  *	>0 if ordering is possible and the class is greater than the data.
5399a2dd95SBruce Richardson  */
5499a2dd95SBruce Richardson typedef int (*rte_class_cmp_t)(const struct rte_class *cls, const void *data);
5599a2dd95SBruce Richardson 
5699a2dd95SBruce Richardson /**
5799a2dd95SBruce Richardson  * Class iterator to find a particular class.
5899a2dd95SBruce Richardson  *
5999a2dd95SBruce Richardson  * This function compares each registered class to find one that matches
6099a2dd95SBruce Richardson  * the data passed as parameter.
6199a2dd95SBruce Richardson  *
6299a2dd95SBruce Richardson  * If the comparison function returns zero this function will stop iterating
6399a2dd95SBruce Richardson  * over any more classes. To continue a search the class of a previous search
6499a2dd95SBruce Richardson  * can be passed via the start parameter.
6599a2dd95SBruce Richardson  *
6699a2dd95SBruce Richardson  * @param start
6799a2dd95SBruce Richardson  *	Starting point for the iteration.
6899a2dd95SBruce Richardson  *
6999a2dd95SBruce Richardson  * @param cmp
7099a2dd95SBruce Richardson  *	Comparison function.
7199a2dd95SBruce Richardson  *
7299a2dd95SBruce Richardson  * @param data
7399a2dd95SBruce Richardson  *	 Data to pass to comparison function.
7499a2dd95SBruce Richardson  *
7599a2dd95SBruce Richardson  * @return
7699a2dd95SBruce Richardson  *	 A pointer to a rte_class structure or NULL in case no class matches
7799a2dd95SBruce Richardson  */
7899a2dd95SBruce Richardson struct rte_class *
7999a2dd95SBruce Richardson rte_class_find(const struct rte_class *start, rte_class_cmp_t cmp,
8099a2dd95SBruce Richardson 	       const void *data);
8199a2dd95SBruce Richardson 
8299a2dd95SBruce Richardson /**
8399a2dd95SBruce Richardson  * Find the registered class for a given name.
8499a2dd95SBruce Richardson  */
8599a2dd95SBruce Richardson struct rte_class *
8699a2dd95SBruce Richardson rte_class_find_by_name(const char *name);
8799a2dd95SBruce Richardson 
8899a2dd95SBruce Richardson /**
8999a2dd95SBruce Richardson  * Register a Class handle.
9099a2dd95SBruce Richardson  *
9199a2dd95SBruce Richardson  * @param cls
9299a2dd95SBruce Richardson  *   A pointer to a rte_class structure describing the class
9399a2dd95SBruce Richardson  *   to be registered.
9499a2dd95SBruce Richardson  */
9599a2dd95SBruce Richardson void rte_class_register(struct rte_class *cls);
9699a2dd95SBruce Richardson 
9799a2dd95SBruce Richardson /**
9899a2dd95SBruce Richardson  * Unregister a Class handle.
9999a2dd95SBruce Richardson  *
10099a2dd95SBruce Richardson  * @param cls
10199a2dd95SBruce Richardson  *   A pointer to a rte_class structure describing the class
10299a2dd95SBruce Richardson  *   to be unregistered.
10399a2dd95SBruce Richardson  */
10499a2dd95SBruce Richardson void rte_class_unregister(struct rte_class *cls);
10599a2dd95SBruce Richardson 
10699a2dd95SBruce Richardson /**
10799a2dd95SBruce Richardson  * Helper for Class registration.
10899a2dd95SBruce Richardson  * The constructor has lower priority than Bus constructors.
10999a2dd95SBruce Richardson  * The constructor has higher priority than PMD constructors.
11099a2dd95SBruce Richardson  */
11199a2dd95SBruce Richardson #define RTE_REGISTER_CLASS(nm, cls) \
11299a2dd95SBruce Richardson RTE_INIT_PRIO(classinitfn_ ##nm, CLASS) \
11399a2dd95SBruce Richardson {\
11499a2dd95SBruce Richardson 	(cls).name = RTE_STR(nm); \
11599a2dd95SBruce Richardson 	rte_class_register(&cls); \
11699a2dd95SBruce Richardson }
11799a2dd95SBruce Richardson 
11899a2dd95SBruce Richardson #define RTE_UNREGISTER_CLASS(nm, cls) \
11999a2dd95SBruce Richardson RTE_FINI_PRIO(classfinifn_ ##nm, CLASS) \
12099a2dd95SBruce Richardson { \
12199a2dd95SBruce Richardson 	rte_class_unregister(&cls); \
12299a2dd95SBruce Richardson }
12399a2dd95SBruce Richardson 
12499a2dd95SBruce Richardson #ifdef __cplusplus
12599a2dd95SBruce Richardson }
12699a2dd95SBruce Richardson #endif
12799a2dd95SBruce Richardson 
12899a2dd95SBruce Richardson #endif /* _RTE_CLASS_H_ */
129