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