1*2d9fd380Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause 2*2d9fd380Sjfb8856606 * Copyright 2020 Mellanox Technologies, Ltd 3*2d9fd380Sjfb8856606 */ 4*2d9fd380Sjfb8856606 5*2d9fd380Sjfb8856606 #ifndef _RTE_REGEX_CORE_H_ 6*2d9fd380Sjfb8856606 #define _RTE_REGEX_CORE_H_ 7*2d9fd380Sjfb8856606 8*2d9fd380Sjfb8856606 /** 9*2d9fd380Sjfb8856606 * @file 10*2d9fd380Sjfb8856606 * 11*2d9fd380Sjfb8856606 * RTE RegEx Device internal header. 12*2d9fd380Sjfb8856606 * 13*2d9fd380Sjfb8856606 * This header contains internal data types, that are used by the RegEx devices 14*2d9fd380Sjfb8856606 * in order to expose their ops to the class. 15*2d9fd380Sjfb8856606 * 16*2d9fd380Sjfb8856606 * Applications should not use these API directly. 17*2d9fd380Sjfb8856606 * 18*2d9fd380Sjfb8856606 */ 19*2d9fd380Sjfb8856606 20*2d9fd380Sjfb8856606 struct rte_regexdev; 21*2d9fd380Sjfb8856606 22*2d9fd380Sjfb8856606 typedef int (*regexdev_info_get_t)(struct rte_regexdev *dev, 23*2d9fd380Sjfb8856606 struct rte_regexdev_info *info); 24*2d9fd380Sjfb8856606 /**< @internal Get the RegEx device info. */ 25*2d9fd380Sjfb8856606 26*2d9fd380Sjfb8856606 typedef int (*regexdev_configure_t)(struct rte_regexdev *dev, 27*2d9fd380Sjfb8856606 const struct rte_regexdev_config *cfg); 28*2d9fd380Sjfb8856606 /**< @internal Configure the RegEx device. */ 29*2d9fd380Sjfb8856606 30*2d9fd380Sjfb8856606 typedef int (*regexdev_qp_setup_t)(struct rte_regexdev *dev, uint16_t id, 31*2d9fd380Sjfb8856606 const struct rte_regexdev_qp_conf *qp_conf); 32*2d9fd380Sjfb8856606 /**< @internal Setup a queue pair.*/ 33*2d9fd380Sjfb8856606 34*2d9fd380Sjfb8856606 typedef int (*regexdev_start_t)(struct rte_regexdev *dev); 35*2d9fd380Sjfb8856606 /**< @internal Start the RegEx device. */ 36*2d9fd380Sjfb8856606 37*2d9fd380Sjfb8856606 typedef int (*regexdev_stop_t)(struct rte_regexdev *dev); 38*2d9fd380Sjfb8856606 /**< @internal Stop the RegEx device. */ 39*2d9fd380Sjfb8856606 40*2d9fd380Sjfb8856606 typedef int (*regexdev_close_t)(struct rte_regexdev *dev); 41*2d9fd380Sjfb8856606 /**< @internal Close the RegEx device. */ 42*2d9fd380Sjfb8856606 43*2d9fd380Sjfb8856606 typedef int (*regexdev_attr_get_t)(struct rte_regexdev *dev, 44*2d9fd380Sjfb8856606 enum rte_regexdev_attr_id id, 45*2d9fd380Sjfb8856606 void *value); 46*2d9fd380Sjfb8856606 /**< @internal Get selected attribute from RegEx device. */ 47*2d9fd380Sjfb8856606 48*2d9fd380Sjfb8856606 typedef int (*regexdev_attr_set_t)(struct rte_regexdev *dev, 49*2d9fd380Sjfb8856606 enum rte_regexdev_attr_id id, 50*2d9fd380Sjfb8856606 const void *value); 51*2d9fd380Sjfb8856606 /**< @internal Set selected attribute to RegEx device. */ 52*2d9fd380Sjfb8856606 53*2d9fd380Sjfb8856606 typedef int (*regexdev_rule_db_update_t)(struct rte_regexdev *dev, 54*2d9fd380Sjfb8856606 const struct rte_regexdev_rule *rules, 55*2d9fd380Sjfb8856606 uint16_t nb_rules); 56*2d9fd380Sjfb8856606 /**< @internal Update the rule database for the RegEx device. */ 57*2d9fd380Sjfb8856606 58*2d9fd380Sjfb8856606 typedef int (*regexdev_rule_db_compile_activate_t)(struct rte_regexdev *dev); 59*2d9fd380Sjfb8856606 /**< @internal Compile the rule database and activate it. */ 60*2d9fd380Sjfb8856606 61*2d9fd380Sjfb8856606 typedef int (*regexdev_rule_db_import_t)(struct rte_regexdev *dev, 62*2d9fd380Sjfb8856606 const char *rule_db, 63*2d9fd380Sjfb8856606 uint32_t rule_db_len); 64*2d9fd380Sjfb8856606 /**< @internal Upload a pre created rule database to the RegEx device. */ 65*2d9fd380Sjfb8856606 66*2d9fd380Sjfb8856606 typedef int (*regexdev_rule_db_export_t)(struct rte_regexdev *dev, 67*2d9fd380Sjfb8856606 char *rule_db); 68*2d9fd380Sjfb8856606 /**< @internal Export the current rule database from the RegEx device. */ 69*2d9fd380Sjfb8856606 70*2d9fd380Sjfb8856606 typedef int (*regexdev_xstats_names_get_t)(struct rte_regexdev *dev, 71*2d9fd380Sjfb8856606 struct rte_regexdev_xstats_map 72*2d9fd380Sjfb8856606 *xstats_map); 73*2d9fd380Sjfb8856606 /**< @internal Get xstats name map for the RegEx device. */ 74*2d9fd380Sjfb8856606 75*2d9fd380Sjfb8856606 typedef int (*regexdev_xstats_get_t)(struct rte_regexdev *dev, 76*2d9fd380Sjfb8856606 const uint16_t *ids, uint64_t *values, 77*2d9fd380Sjfb8856606 uint16_t nb_values); 78*2d9fd380Sjfb8856606 /**< @internal Get xstats values for the RegEx device. */ 79*2d9fd380Sjfb8856606 80*2d9fd380Sjfb8856606 typedef int (*regexdev_xstats_by_name_get_t)(struct rte_regexdev *dev, 81*2d9fd380Sjfb8856606 const char *name, uint16_t *id, 82*2d9fd380Sjfb8856606 uint64_t *value); 83*2d9fd380Sjfb8856606 /**< @internal Get xstat value for the RegEx device based on the xstats name. */ 84*2d9fd380Sjfb8856606 85*2d9fd380Sjfb8856606 typedef int (*regexdev_xstats_reset_t)(struct rte_regexdev *dev, 86*2d9fd380Sjfb8856606 const uint16_t *ids, 87*2d9fd380Sjfb8856606 uint16_t nb_ids); 88*2d9fd380Sjfb8856606 /**< @internal Reset xstats values for the RegEx device. */ 89*2d9fd380Sjfb8856606 90*2d9fd380Sjfb8856606 typedef int (*regexdev_selftest_t)(struct rte_regexdev *dev); 91*2d9fd380Sjfb8856606 /**< @internal Trigger RegEx self test. */ 92*2d9fd380Sjfb8856606 93*2d9fd380Sjfb8856606 typedef int (*regexdev_dump_t)(struct rte_regexdev *dev, FILE *f); 94*2d9fd380Sjfb8856606 /**< @internal Dump internal information about the RegEx device. */ 95*2d9fd380Sjfb8856606 96*2d9fd380Sjfb8856606 typedef uint16_t (*regexdev_enqueue_t)(struct rte_regexdev *dev, uint16_t qp_id, 97*2d9fd380Sjfb8856606 struct rte_regex_ops **ops, 98*2d9fd380Sjfb8856606 uint16_t nb_ops); 99*2d9fd380Sjfb8856606 /**< @internal Enqueue a burst of scan requests to a queue on RegEx device. */ 100*2d9fd380Sjfb8856606 101*2d9fd380Sjfb8856606 typedef uint16_t (*regexdev_dequeue_t)(struct rte_regexdev *dev, uint16_t qp_id, 102*2d9fd380Sjfb8856606 struct rte_regex_ops **ops, 103*2d9fd380Sjfb8856606 uint16_t nb_ops); 104*2d9fd380Sjfb8856606 /**< @internal Dequeue a burst of scan response from a queue on RegEx device. */ 105*2d9fd380Sjfb8856606 106*2d9fd380Sjfb8856606 /** 107*2d9fd380Sjfb8856606 * RegEx device operations 108*2d9fd380Sjfb8856606 */ 109*2d9fd380Sjfb8856606 struct rte_regexdev_ops { 110*2d9fd380Sjfb8856606 regexdev_info_get_t dev_info_get; 111*2d9fd380Sjfb8856606 regexdev_configure_t dev_configure; 112*2d9fd380Sjfb8856606 regexdev_qp_setup_t dev_qp_setup; 113*2d9fd380Sjfb8856606 regexdev_start_t dev_start; 114*2d9fd380Sjfb8856606 regexdev_stop_t dev_stop; 115*2d9fd380Sjfb8856606 regexdev_close_t dev_close; 116*2d9fd380Sjfb8856606 regexdev_attr_get_t dev_attr_get; 117*2d9fd380Sjfb8856606 regexdev_attr_set_t dev_attr_set; 118*2d9fd380Sjfb8856606 regexdev_rule_db_update_t dev_rule_db_update; 119*2d9fd380Sjfb8856606 regexdev_rule_db_compile_activate_t dev_rule_db_compile_activate; 120*2d9fd380Sjfb8856606 regexdev_rule_db_import_t dev_db_import; 121*2d9fd380Sjfb8856606 regexdev_rule_db_export_t dev_db_export; 122*2d9fd380Sjfb8856606 regexdev_xstats_names_get_t dev_xstats_names_get; 123*2d9fd380Sjfb8856606 regexdev_xstats_get_t dev_xstats_get; 124*2d9fd380Sjfb8856606 regexdev_xstats_by_name_get_t dev_xstats_by_name_get; 125*2d9fd380Sjfb8856606 regexdev_xstats_reset_t dev_xstats_reset; 126*2d9fd380Sjfb8856606 regexdev_selftest_t dev_selftest; 127*2d9fd380Sjfb8856606 regexdev_dump_t dev_dump; 128*2d9fd380Sjfb8856606 }; 129*2d9fd380Sjfb8856606 130*2d9fd380Sjfb8856606 /** 131*2d9fd380Sjfb8856606 * Possible states of a RegEx device. 132*2d9fd380Sjfb8856606 */ 133*2d9fd380Sjfb8856606 enum rte_regexdev_state { 134*2d9fd380Sjfb8856606 RTE_REGEXDEV_UNUSED = 0, /**< Device is unused. */ 135*2d9fd380Sjfb8856606 RTE_REGEXDEV_REGISTERED, 136*2d9fd380Sjfb8856606 /**< Device is registered, but not ready to be used. */ 137*2d9fd380Sjfb8856606 RTE_REGEXDEV_READY, 138*2d9fd380Sjfb8856606 /**< Device is ready for use. This is set by the PMD. */ 139*2d9fd380Sjfb8856606 }; 140*2d9fd380Sjfb8856606 141*2d9fd380Sjfb8856606 /** 142*2d9fd380Sjfb8856606 * @internal 143*2d9fd380Sjfb8856606 * The data part, with no function pointers, associated with each RegEx device. 144*2d9fd380Sjfb8856606 * 145*2d9fd380Sjfb8856606 * This structure is safe to place in shared memory to be common among different 146*2d9fd380Sjfb8856606 * processes in a multi-process configuration. 147*2d9fd380Sjfb8856606 */ 148*2d9fd380Sjfb8856606 struct rte_regexdev_data { 149*2d9fd380Sjfb8856606 void *dev_private; /**< PMD-specific private data. */ 150*2d9fd380Sjfb8856606 char dev_name[RTE_REGEXDEV_NAME_MAX_LEN]; /**< Unique identifier name */ 151*2d9fd380Sjfb8856606 uint16_t dev_id; /**< Device [external] identifier. */ 152*2d9fd380Sjfb8856606 struct rte_regexdev_config dev_conf; /**< RegEx configuration. */ 153*2d9fd380Sjfb8856606 uint8_t dev_started : 1; /**< Device started to work. */ 154*2d9fd380Sjfb8856606 } __rte_cache_aligned; 155*2d9fd380Sjfb8856606 156*2d9fd380Sjfb8856606 /** 157*2d9fd380Sjfb8856606 * @internal 158*2d9fd380Sjfb8856606 * The generic data structure associated with each RegEx device. 159*2d9fd380Sjfb8856606 * 160*2d9fd380Sjfb8856606 * Pointers to burst-oriented packet receive and transmit functions are 161*2d9fd380Sjfb8856606 * located at the beginning of the structure, along with the pointer to 162*2d9fd380Sjfb8856606 * where all the data elements for the particular device are stored in shared 163*2d9fd380Sjfb8856606 * memory. This split allows the function pointer and driver data to be per- 164*2d9fd380Sjfb8856606 * process, while the actual configuration data for the device is shared. 165*2d9fd380Sjfb8856606 */ 166*2d9fd380Sjfb8856606 struct rte_regexdev { 167*2d9fd380Sjfb8856606 regexdev_enqueue_t enqueue; 168*2d9fd380Sjfb8856606 regexdev_dequeue_t dequeue; 169*2d9fd380Sjfb8856606 const struct rte_regexdev_ops *dev_ops; 170*2d9fd380Sjfb8856606 /**< Functions exported by PMD */ 171*2d9fd380Sjfb8856606 struct rte_device *device; /**< Backing device */ 172*2d9fd380Sjfb8856606 enum rte_regexdev_state state; /**< The device state. */ 173*2d9fd380Sjfb8856606 struct rte_regexdev_data *data; /**< Pointer to device data. */ 174*2d9fd380Sjfb8856606 } __rte_cache_aligned; 175*2d9fd380Sjfb8856606 176*2d9fd380Sjfb8856606 /** 177*2d9fd380Sjfb8856606 * @internal 178*2d9fd380Sjfb8856606 * The pool of *rte_regexdev* structures. The size of the pool 179*2d9fd380Sjfb8856606 * is configured at compile-time in the <rte_regexdev.c> file. 180*2d9fd380Sjfb8856606 */ 181*2d9fd380Sjfb8856606 extern struct rte_regexdev rte_regex_devices[]; 182*2d9fd380Sjfb8856606 183*2d9fd380Sjfb8856606 #endif /* _RTE_REGEX_CORE_H_ */ 184