1e0b0e55cSAnoob Joseph /* SPDX-License-Identifier: BSD-3-Clause 2e0b0e55cSAnoob Joseph * Copyright (C) 2020 Marvell International Ltd. 3e0b0e55cSAnoob Joseph */ 4e0b0e55cSAnoob Joseph #ifndef _EVENT_HELPER_H_ 5e0b0e55cSAnoob Joseph #define _EVENT_HELPER_H_ 6e0b0e55cSAnoob Joseph 7e0b0e55cSAnoob Joseph #include <rte_log.h> 8e0b0e55cSAnoob Joseph 9e0b0e55cSAnoob Joseph #define RTE_LOGTYPE_EH RTE_LOGTYPE_USER4 10e0b0e55cSAnoob Joseph 11e0b0e55cSAnoob Joseph #define EH_LOG_ERR(...) \ 12e0b0e55cSAnoob Joseph RTE_LOG(ERR, EH, \ 13e0b0e55cSAnoob Joseph RTE_FMT("%s() line %u: " RTE_FMT_HEAD(__VA_ARGS__ ,) "\n", \ 14e0b0e55cSAnoob Joseph __func__, __LINE__, RTE_FMT_TAIL(__VA_ARGS__ ,))) 15e0b0e55cSAnoob Joseph 164ce38479SAnoob Joseph #define EH_LOG_INFO(...) \ 174ce38479SAnoob Joseph RTE_LOG(INFO, EH, \ 184ce38479SAnoob Joseph RTE_FMT("%s() line %u: " RTE_FMT_HEAD(__VA_ARGS__ ,) "\n", \ 194ce38479SAnoob Joseph __func__, __LINE__, RTE_FMT_TAIL(__VA_ARGS__ ,))) 204ce38479SAnoob Joseph 21e0b0e55cSAnoob Joseph /* Max event devices supported */ 22e0b0e55cSAnoob Joseph #define EVENT_MODE_MAX_EVENT_DEVS RTE_EVENT_MAX_DEVS 23e0b0e55cSAnoob Joseph 2402afed59SAnoob Joseph /* Max Rx adapters supported */ 2502afed59SAnoob Joseph #define EVENT_MODE_MAX_RX_ADAPTERS RTE_EVENT_MAX_DEVS 2602afed59SAnoob Joseph 271d89ccf3SAnoob Joseph /* Max Tx adapters supported */ 281d89ccf3SAnoob Joseph #define EVENT_MODE_MAX_TX_ADAPTERS RTE_EVENT_MAX_DEVS 291d89ccf3SAnoob Joseph 3002afed59SAnoob Joseph /* Max Rx adapter connections */ 3102afed59SAnoob Joseph #define EVENT_MODE_MAX_CONNECTIONS_PER_ADAPTER 16 3202afed59SAnoob Joseph 331d89ccf3SAnoob Joseph /* Max Tx adapter connections */ 341d89ccf3SAnoob Joseph #define EVENT_MODE_MAX_CONNECTIONS_PER_TX_ADAPTER 16 351d89ccf3SAnoob Joseph 36d7bcfb97SAnoob Joseph /* Max event queues supported per event device */ 37d7bcfb97SAnoob Joseph #define EVENT_MODE_MAX_EVENT_QUEUES_PER_DEV RTE_EVENT_MAX_QUEUES_PER_DEV 38d7bcfb97SAnoob Joseph 39d7bcfb97SAnoob Joseph /* Max event-lcore links */ 40d7bcfb97SAnoob Joseph #define EVENT_MODE_MAX_LCORE_LINKS \ 41d7bcfb97SAnoob Joseph (EVENT_MODE_MAX_EVENT_DEVS * EVENT_MODE_MAX_EVENT_QUEUES_PER_DEV) 42d7bcfb97SAnoob Joseph 431bf6baacSLukasz Bartosik /* Max adapters that one Rx core can handle */ 441bf6baacSLukasz Bartosik #define EVENT_MODE_MAX_ADAPTERS_PER_RX_CORE EVENT_MODE_MAX_RX_ADAPTERS 451bf6baacSLukasz Bartosik 461d89ccf3SAnoob Joseph /* Max adapters that one Tx core can handle */ 471d89ccf3SAnoob Joseph #define EVENT_MODE_MAX_ADAPTERS_PER_TX_CORE EVENT_MODE_MAX_TX_ADAPTERS 481d89ccf3SAnoob Joseph 49bc33e9c7SLukasz Bartosik /* Used to indicate that queue schedule type is not set */ 50bc33e9c7SLukasz Bartosik #define SCHED_TYPE_NOT_SET 3 51bc33e9c7SLukasz Bartosik 52e0b0e55cSAnoob Joseph /** 53e0b0e55cSAnoob Joseph * Packet transfer mode of the application 54e0b0e55cSAnoob Joseph */ 55e0b0e55cSAnoob Joseph enum eh_pkt_transfer_mode { 56e0b0e55cSAnoob Joseph EH_PKT_TRANSFER_MODE_POLL = 0, 57e0b0e55cSAnoob Joseph EH_PKT_TRANSFER_MODE_EVENT, 58e0b0e55cSAnoob Joseph }; 59e0b0e55cSAnoob Joseph 601bf6baacSLukasz Bartosik /** 611bf6baacSLukasz Bartosik * Event mode packet rx types 621bf6baacSLukasz Bartosik */ 631bf6baacSLukasz Bartosik enum eh_rx_types { 641bf6baacSLukasz Bartosik EH_RX_TYPE_NON_BURST = 0, 651bf6baacSLukasz Bartosik EH_RX_TYPE_BURST 661bf6baacSLukasz Bartosik }; 671bf6baacSLukasz Bartosik 68ec3cc53fSLukasz Bartosik /** 69ec3cc53fSLukasz Bartosik * Event mode packet tx types 70ec3cc53fSLukasz Bartosik */ 71ec3cc53fSLukasz Bartosik enum eh_tx_types { 72ec3cc53fSLukasz Bartosik EH_TX_TYPE_INTERNAL_PORT = 0, 73ec3cc53fSLukasz Bartosik EH_TX_TYPE_NO_INTERNAL_PORT 74ec3cc53fSLukasz Bartosik }; 75ec3cc53fSLukasz Bartosik 7665e3a202SLukasz Bartosik /** 7765e3a202SLukasz Bartosik * Event mode ipsec mode types 7865e3a202SLukasz Bartosik */ 7965e3a202SLukasz Bartosik enum eh_ipsec_mode_types { 8065e3a202SLukasz Bartosik EH_IPSEC_MODE_TYPE_APP = 0, 8165e3a202SLukasz Bartosik EH_IPSEC_MODE_TYPE_DRIVER 8265e3a202SLukasz Bartosik }; 8365e3a202SLukasz Bartosik 84e0b0e55cSAnoob Joseph /* Event dev params */ 85e0b0e55cSAnoob Joseph struct eventdev_params { 86e0b0e55cSAnoob Joseph uint8_t eventdev_id; 87e0b0e55cSAnoob Joseph uint8_t nb_eventqueue; 88e0b0e55cSAnoob Joseph uint8_t nb_eventport; 89e0b0e55cSAnoob Joseph uint8_t ev_queue_mode; 90ec3cc53fSLukasz Bartosik uint8_t all_internal_ports; 91c12871e4SVolodymyr Fialko int tx_queue_id; 92c12871e4SVolodymyr Fialko int ev_cpt_queue_id; 93e0b0e55cSAnoob Joseph }; 94e0b0e55cSAnoob Joseph 95d7bcfb97SAnoob Joseph /** 96d7bcfb97SAnoob Joseph * Event-lcore link configuration 97d7bcfb97SAnoob Joseph */ 98d7bcfb97SAnoob Joseph struct eh_event_link_info { 99d7bcfb97SAnoob Joseph uint8_t eventdev_id; 100d7bcfb97SAnoob Joseph /**< Event device ID */ 101d7bcfb97SAnoob Joseph uint8_t event_port_id; 102d7bcfb97SAnoob Joseph /**< Event port ID */ 103d7bcfb97SAnoob Joseph uint8_t eventq_id; 104d7bcfb97SAnoob Joseph /**< Event queue to be linked to the port */ 105*4b978938SSivaprasad Tummala uint32_t lcore_id; 106d7bcfb97SAnoob Joseph /**< Lcore to be polling on this port */ 107d7bcfb97SAnoob Joseph }; 108d7bcfb97SAnoob Joseph 10902afed59SAnoob Joseph /* Rx adapter connection info */ 11002afed59SAnoob Joseph struct rx_adapter_connection_info { 11102afed59SAnoob Joseph uint8_t ethdev_id; 11202afed59SAnoob Joseph uint8_t eventq_id; 11302afed59SAnoob Joseph int32_t ethdev_rx_qid; 11402afed59SAnoob Joseph }; 11502afed59SAnoob Joseph 11602afed59SAnoob Joseph /* Rx adapter conf */ 11702afed59SAnoob Joseph struct rx_adapter_conf { 11802afed59SAnoob Joseph int32_t eventdev_id; 11902afed59SAnoob Joseph int32_t adapter_id; 12002afed59SAnoob Joseph uint32_t rx_core_id; 12102afed59SAnoob Joseph uint8_t nb_connections; 12202afed59SAnoob Joseph struct rx_adapter_connection_info 12302afed59SAnoob Joseph conn[EVENT_MODE_MAX_CONNECTIONS_PER_ADAPTER]; 12402afed59SAnoob Joseph }; 12502afed59SAnoob Joseph 1261d89ccf3SAnoob Joseph /* Tx adapter connection info */ 1271d89ccf3SAnoob Joseph struct tx_adapter_connection_info { 1281d89ccf3SAnoob Joseph uint8_t ethdev_id; 1291d89ccf3SAnoob Joseph int32_t ethdev_tx_qid; 1301d89ccf3SAnoob Joseph }; 1311d89ccf3SAnoob Joseph 1321d89ccf3SAnoob Joseph /* Tx adapter conf */ 1331d89ccf3SAnoob Joseph struct tx_adapter_conf { 1341d89ccf3SAnoob Joseph int32_t eventdev_id; 1351d89ccf3SAnoob Joseph int32_t adapter_id; 1361d89ccf3SAnoob Joseph uint32_t tx_core_id; 1371d89ccf3SAnoob Joseph uint8_t nb_connections; 1381d89ccf3SAnoob Joseph struct tx_adapter_connection_info 1391d89ccf3SAnoob Joseph conn[EVENT_MODE_MAX_CONNECTIONS_PER_TX_ADAPTER]; 1401d89ccf3SAnoob Joseph uint8_t tx_ev_queue; 1411d89ccf3SAnoob Joseph }; 1421d89ccf3SAnoob Joseph 143e0b0e55cSAnoob Joseph /* Eventmode conf data */ 144e0b0e55cSAnoob Joseph struct eventmode_conf { 145e0b0e55cSAnoob Joseph int nb_eventdev; 146e0b0e55cSAnoob Joseph /**< No of event devs */ 147e0b0e55cSAnoob Joseph struct eventdev_params eventdev_config[EVENT_MODE_MAX_EVENT_DEVS]; 148e0b0e55cSAnoob Joseph /**< Per event dev conf */ 14902afed59SAnoob Joseph uint8_t nb_rx_adapter; 15002afed59SAnoob Joseph /**< No of Rx adapters */ 15102afed59SAnoob Joseph struct rx_adapter_conf rx_adapter[EVENT_MODE_MAX_RX_ADAPTERS]; 15202afed59SAnoob Joseph /**< Rx adapter conf */ 1531d89ccf3SAnoob Joseph uint8_t nb_tx_adapter; 1541d89ccf3SAnoob Joseph /**< No of Tx adapters */ 1551d89ccf3SAnoob Joseph struct tx_adapter_conf tx_adapter[EVENT_MODE_MAX_TX_ADAPTERS]; 1561d89ccf3SAnoob Joseph /** Tx adapter conf */ 157d7bcfb97SAnoob Joseph uint8_t nb_link; 158d7bcfb97SAnoob Joseph /**< No of links */ 159d7bcfb97SAnoob Joseph struct eh_event_link_info 160d7bcfb97SAnoob Joseph link[EVENT_MODE_MAX_LCORE_LINKS]; 161d7bcfb97SAnoob Joseph /**< Per link conf */ 162d7bcfb97SAnoob Joseph struct rte_bitmap *eth_core_mask; 163d7bcfb97SAnoob Joseph /**< Core mask of cores to be used for software Rx and Tx */ 16402afed59SAnoob Joseph uint32_t eth_portmask; 16502afed59SAnoob Joseph /**< Mask of the eth ports to be used */ 166e0b0e55cSAnoob Joseph union { 167e0b0e55cSAnoob Joseph struct { 168e0b0e55cSAnoob Joseph uint64_t sched_type : 2; 169e0b0e55cSAnoob Joseph /**< Schedule type */ 170d7bcfb97SAnoob Joseph uint64_t all_ev_queue_to_ev_port : 1; 171d7bcfb97SAnoob Joseph /**< 172d7bcfb97SAnoob Joseph * When enabled, all event queues need to be mapped to 173d7bcfb97SAnoob Joseph * each event port 174d7bcfb97SAnoob Joseph */ 17586738ebeSSrujana Challa uint64_t event_vector : 1; 17686738ebeSSrujana Challa /**< 17786738ebeSSrujana Challa * Enable event vector, when enabled application can 17886738ebeSSrujana Challa * receive vector of events. 17986738ebeSSrujana Challa */ 18086738ebeSSrujana Challa uint64_t vector_size : 16; 181e0b0e55cSAnoob Joseph }; 182e0b0e55cSAnoob Joseph uint64_t u64; 183e0b0e55cSAnoob Joseph } ext_params; 184e0b0e55cSAnoob Joseph /**< 64 bit field to specify extended params */ 18586738ebeSSrujana Challa uint64_t vector_tmo_ns; 18686738ebeSSrujana Challa /**< Max vector timeout in nanoseconds */ 18748a39871SNithin Dabilpuram uint64_t vector_pool_sz; 18848a39871SNithin Dabilpuram /**< Vector pool size */ 1890dbe550aSVolodymyr Fialko bool enable_event_crypto_adapter; 1900dbe550aSVolodymyr Fialko /**< Enables event crypto adapter related configuration */ 191e0b0e55cSAnoob Joseph }; 192e0b0e55cSAnoob Joseph 193e0b0e55cSAnoob Joseph /** 194e0b0e55cSAnoob Joseph * Event helper configuration 195e0b0e55cSAnoob Joseph */ 196e0b0e55cSAnoob Joseph struct eh_conf { 197e0b0e55cSAnoob Joseph enum eh_pkt_transfer_mode mode; 198e0b0e55cSAnoob Joseph /**< Packet transfer mode of the application */ 199e0b0e55cSAnoob Joseph uint32_t eth_portmask; 200e0b0e55cSAnoob Joseph /**< 201e0b0e55cSAnoob Joseph * Mask of the eth ports to be used. This portmask would be 202e0b0e55cSAnoob Joseph * checked while initializing devices using helper routines. 203e0b0e55cSAnoob Joseph */ 204e0b0e55cSAnoob Joseph void *mode_params; 205e0b0e55cSAnoob Joseph /**< Mode specific parameters */ 20665e3a202SLukasz Bartosik 20765e3a202SLukasz Bartosik /** Application specific params */ 20865e3a202SLukasz Bartosik enum eh_ipsec_mode_types ipsec_mode; 20965e3a202SLukasz Bartosik /**< Mode of ipsec run */ 210e0b0e55cSAnoob Joseph }; 211e0b0e55cSAnoob Joseph 2121bf6baacSLukasz Bartosik /* Workers registered by the application */ 2131bf6baacSLukasz Bartosik struct eh_app_worker_params { 2141bf6baacSLukasz Bartosik union { 2151bf6baacSLukasz Bartosik struct { 2161bf6baacSLukasz Bartosik uint64_t burst : 1; 2171bf6baacSLukasz Bartosik /**< Specify status of rx type burst */ 218ec3cc53fSLukasz Bartosik uint64_t tx_internal_port : 1; 219ec3cc53fSLukasz Bartosik /**< Specify whether tx internal port is available */ 22065e3a202SLukasz Bartosik uint64_t ipsec_mode : 1; 22165e3a202SLukasz Bartosik /**< Specify ipsec processing level */ 2221bf6baacSLukasz Bartosik }; 2231bf6baacSLukasz Bartosik uint64_t u64; 2241bf6baacSLukasz Bartosik } cap; 2251bf6baacSLukasz Bartosik /**< Capabilities of this worker */ 2261bf6baacSLukasz Bartosik void (*worker_thread)(struct eh_event_link_info *links, 2271bf6baacSLukasz Bartosik uint8_t nb_links); 2281bf6baacSLukasz Bartosik /**< Worker thread */ 2291bf6baacSLukasz Bartosik }; 2301bf6baacSLukasz Bartosik 231e0b0e55cSAnoob Joseph /** 232bc33e9c7SLukasz Bartosik * Allocate memory for event helper configuration and initialize 233bc33e9c7SLukasz Bartosik * it with default values. 234bc33e9c7SLukasz Bartosik * 235bc33e9c7SLukasz Bartosik * @return 236bc33e9c7SLukasz Bartosik * - pointer to event helper configuration structure on success. 237bc33e9c7SLukasz Bartosik * - NULL on failure. 238bc33e9c7SLukasz Bartosik */ 239bc33e9c7SLukasz Bartosik struct eh_conf * 240bc33e9c7SLukasz Bartosik eh_conf_init(void); 241bc33e9c7SLukasz Bartosik 242bc33e9c7SLukasz Bartosik /** 243bc33e9c7SLukasz Bartosik * Uninitialize event helper configuration and release its memory 244bc33e9c7SLukasz Bartosik . * 245bc33e9c7SLukasz Bartosik * @param conf 246bc33e9c7SLukasz Bartosik * Event helper configuration 247bc33e9c7SLukasz Bartosik */ 248bc33e9c7SLukasz Bartosik void 249bc33e9c7SLukasz Bartosik eh_conf_uninit(struct eh_conf *conf); 250bc33e9c7SLukasz Bartosik 251bc33e9c7SLukasz Bartosik /** 252e0b0e55cSAnoob Joseph * Initialize event mode devices 253e0b0e55cSAnoob Joseph * 254e0b0e55cSAnoob Joseph * Application can call this function to get the event devices, eth devices 255e0b0e55cSAnoob Joseph * and eth rx & tx adapters initialized according to the default config or 256e0b0e55cSAnoob Joseph * config populated using the command line args. 257e0b0e55cSAnoob Joseph * 258e0b0e55cSAnoob Joseph * Application is expected to initialize the eth devices and then the event 259e0b0e55cSAnoob Joseph * mode helper subsystem will stop & start eth devices according to its 260e0b0e55cSAnoob Joseph * requirement. Call to this function should be done after the eth devices 261e0b0e55cSAnoob Joseph * are successfully initialized. 262e0b0e55cSAnoob Joseph * 263e0b0e55cSAnoob Joseph * @param conf 264e0b0e55cSAnoob Joseph * Event helper configuration 265e0b0e55cSAnoob Joseph * @return 266e0b0e55cSAnoob Joseph * - 0 on success. 267e0b0e55cSAnoob Joseph * - (<0) on failure. 268e0b0e55cSAnoob Joseph */ 269e0b0e55cSAnoob Joseph int32_t 270e0b0e55cSAnoob Joseph eh_devs_init(struct eh_conf *conf); 271e0b0e55cSAnoob Joseph 272e0b0e55cSAnoob Joseph /** 273e0b0e55cSAnoob Joseph * Release event mode devices 274e0b0e55cSAnoob Joseph * 275e0b0e55cSAnoob Joseph * Application can call this function to release event devices, 276e0b0e55cSAnoob Joseph * eth rx & tx adapters according to the config. 277e0b0e55cSAnoob Joseph * 278e0b0e55cSAnoob Joseph * Call to this function should be done before application stops 279e0b0e55cSAnoob Joseph * and closes eth devices. This function will not close and stop 280e0b0e55cSAnoob Joseph * eth devices. 281e0b0e55cSAnoob Joseph * 282e0b0e55cSAnoob Joseph * @param conf 283e0b0e55cSAnoob Joseph * Event helper configuration 284e0b0e55cSAnoob Joseph * @return 285e0b0e55cSAnoob Joseph * - 0 on success. 286e0b0e55cSAnoob Joseph * - (<0) on failure. 287e0b0e55cSAnoob Joseph */ 288e0b0e55cSAnoob Joseph int32_t 289e0b0e55cSAnoob Joseph eh_devs_uninit(struct eh_conf *conf); 290e0b0e55cSAnoob Joseph 2911d89ccf3SAnoob Joseph /** 2921d89ccf3SAnoob Joseph * Get eventdev tx queue 2931d89ccf3SAnoob Joseph * 2941d89ccf3SAnoob Joseph * If the application uses event device which does not support internal port 2951d89ccf3SAnoob Joseph * then it needs to submit the events to a Tx queue before final transmission. 2961d89ccf3SAnoob Joseph * This Tx queue will be created internally by the eventmode helper subsystem, 2971d89ccf3SAnoob Joseph * and application will need its queue ID when it runs the execution loop. 2981d89ccf3SAnoob Joseph * 2991d89ccf3SAnoob Joseph * @param mode_conf 3001d89ccf3SAnoob Joseph * Event helper configuration 3011d89ccf3SAnoob Joseph * @param eventdev_id 3021d89ccf3SAnoob Joseph * Event device ID 3031d89ccf3SAnoob Joseph * @return 3041d89ccf3SAnoob Joseph * Tx queue ID 3051d89ccf3SAnoob Joseph */ 3061d89ccf3SAnoob Joseph uint8_t 3071d89ccf3SAnoob Joseph eh_get_tx_queue(struct eh_conf *conf, uint8_t eventdev_id); 3081d89ccf3SAnoob Joseph 3094ce38479SAnoob Joseph /** 3104ce38479SAnoob Joseph * Display event mode configuration 3114ce38479SAnoob Joseph * 3124ce38479SAnoob Joseph * @param conf 3134ce38479SAnoob Joseph * Event helper configuration 3144ce38479SAnoob Joseph */ 3154ce38479SAnoob Joseph void 3164ce38479SAnoob Joseph eh_display_conf(struct eh_conf *conf); 3174ce38479SAnoob Joseph 3181bf6baacSLukasz Bartosik 3191bf6baacSLukasz Bartosik /** 3201bf6baacSLukasz Bartosik * Launch eventmode worker 3211bf6baacSLukasz Bartosik * 3221bf6baacSLukasz Bartosik * The application can request the eventmode helper subsystem to launch the 3231bf6baacSLukasz Bartosik * worker based on the capabilities of event device and the options selected 3241bf6baacSLukasz Bartosik * while initializing the eventmode. 3251bf6baacSLukasz Bartosik * 3261bf6baacSLukasz Bartosik * @param conf 3271bf6baacSLukasz Bartosik * Event helper configuration 3281bf6baacSLukasz Bartosik * @param app_wrkr 3291bf6baacSLukasz Bartosik * List of all the workers registered by application, along with its 3301bf6baacSLukasz Bartosik * capabilities 3311bf6baacSLukasz Bartosik * @param nb_wrkr_param 3321bf6baacSLukasz Bartosik * Number of workers passed by the application 3331bf6baacSLukasz Bartosik * 3341bf6baacSLukasz Bartosik */ 3351bf6baacSLukasz Bartosik void 3361bf6baacSLukasz Bartosik eh_launch_worker(struct eh_conf *conf, struct eh_app_worker_params *app_wrkr, 3371bf6baacSLukasz Bartosik uint8_t nb_wrkr_param); 3381bf6baacSLukasz Bartosik 339e0b0e55cSAnoob Joseph #endif /* _EVENT_HELPER_H_ */ 340