1e0b0e55cSAnoob Joseph /* SPDX-License-Identifier: BSD-3-Clause 2e0b0e55cSAnoob Joseph * Copyright (C) 2020 Marvell International Ltd. 3e0b0e55cSAnoob Joseph */ 472b452c5SDmitry Kozlyuk #include <stdlib.h> 572b452c5SDmitry Kozlyuk 6d7bcfb97SAnoob Joseph #include <rte_bitmap.h> 70dbe550aSVolodymyr Fialko #include <rte_cryptodev.h> 8e0b0e55cSAnoob Joseph #include <rte_ethdev.h> 9e0b0e55cSAnoob Joseph #include <rte_eventdev.h> 100dbe550aSVolodymyr Fialko #include <rte_event_crypto_adapter.h> 1102afed59SAnoob Joseph #include <rte_event_eth_rx_adapter.h> 121d89ccf3SAnoob Joseph #include <rte_event_eth_tx_adapter.h> 13d7bcfb97SAnoob Joseph #include <rte_malloc.h> 1402afed59SAnoob Joseph #include <stdbool.h> 15e0b0e55cSAnoob Joseph 16e0b0e55cSAnoob Joseph #include "event_helper.h" 1786738ebeSSrujana Challa #include "ipsec-secgw.h" 1886738ebeSSrujana Challa 1986738ebeSSrujana Challa #define DEFAULT_VECTOR_SIZE 16 2086738ebeSSrujana Challa #define DEFAULT_VECTOR_TMO 102400 21e0b0e55cSAnoob Joseph 22c12871e4SVolodymyr Fialko #define INVALID_EV_QUEUE_ID -1 23c12871e4SVolodymyr Fialko 241bf6baacSLukasz Bartosik static volatile bool eth_core_running; 251bf6baacSLukasz Bartosik 2602afed59SAnoob Joseph static int 2702afed59SAnoob Joseph eh_get_enabled_cores(struct rte_bitmap *eth_core_mask) 2802afed59SAnoob Joseph { 2902afed59SAnoob Joseph int i, count = 0; 3002afed59SAnoob Joseph 3102afed59SAnoob Joseph RTE_LCORE_FOREACH(i) { 3202afed59SAnoob Joseph /* Check if this core is enabled in core mask*/ 3302afed59SAnoob Joseph if (rte_bitmap_get(eth_core_mask, i)) { 3402afed59SAnoob Joseph /* Found enabled core */ 3502afed59SAnoob Joseph count++; 3602afed59SAnoob Joseph } 3702afed59SAnoob Joseph } 3802afed59SAnoob Joseph return count; 3902afed59SAnoob Joseph } 4002afed59SAnoob Joseph 4102afed59SAnoob Joseph static inline unsigned int 4202afed59SAnoob Joseph eh_get_next_eth_core(struct eventmode_conf *em_conf) 4302afed59SAnoob Joseph { 4402afed59SAnoob Joseph static unsigned int prev_core = -1; 4502afed59SAnoob Joseph unsigned int next_core; 4602afed59SAnoob Joseph 4702afed59SAnoob Joseph /* 4802afed59SAnoob Joseph * Make sure we have at least one eth core running, else the following 4902afed59SAnoob Joseph * logic would lead to an infinite loop. 5002afed59SAnoob Joseph */ 5102afed59SAnoob Joseph if (eh_get_enabled_cores(em_conf->eth_core_mask) == 0) { 5202afed59SAnoob Joseph EH_LOG_ERR("No enabled eth core found"); 5302afed59SAnoob Joseph return RTE_MAX_LCORE; 5402afed59SAnoob Joseph } 5502afed59SAnoob Joseph 5602afed59SAnoob Joseph /* Only some cores are marked as eth cores, skip others */ 5702afed59SAnoob Joseph do { 5802afed59SAnoob Joseph /* Get the next core */ 5902afed59SAnoob Joseph next_core = rte_get_next_lcore(prev_core, 0, 1); 6002afed59SAnoob Joseph 6102afed59SAnoob Joseph /* Check if we have reached max lcores */ 6202afed59SAnoob Joseph if (next_core == RTE_MAX_LCORE) 6302afed59SAnoob Joseph return next_core; 6402afed59SAnoob Joseph 6502afed59SAnoob Joseph /* Update prev_core */ 6602afed59SAnoob Joseph prev_core = next_core; 6702afed59SAnoob Joseph } while (!(rte_bitmap_get(em_conf->eth_core_mask, next_core))); 6802afed59SAnoob Joseph 6902afed59SAnoob Joseph return next_core; 7002afed59SAnoob Joseph } 7102afed59SAnoob Joseph 72d7bcfb97SAnoob Joseph static inline unsigned int 73d7bcfb97SAnoob Joseph eh_get_next_active_core(struct eventmode_conf *em_conf, unsigned int prev_core) 74d7bcfb97SAnoob Joseph { 75d7bcfb97SAnoob Joseph unsigned int next_core; 76d7bcfb97SAnoob Joseph 77d7bcfb97SAnoob Joseph /* Get next active core skipping cores reserved as eth cores */ 78d7bcfb97SAnoob Joseph do { 79d7bcfb97SAnoob Joseph /* Get the next core */ 80d7bcfb97SAnoob Joseph next_core = rte_get_next_lcore(prev_core, 0, 0); 81d7bcfb97SAnoob Joseph 82d7bcfb97SAnoob Joseph /* Check if we have reached max lcores */ 83d7bcfb97SAnoob Joseph if (next_core == RTE_MAX_LCORE) 84d7bcfb97SAnoob Joseph return next_core; 85d7bcfb97SAnoob Joseph 86d7bcfb97SAnoob Joseph prev_core = next_core; 87d7bcfb97SAnoob Joseph } while (rte_bitmap_get(em_conf->eth_core_mask, next_core)); 88d7bcfb97SAnoob Joseph 89d7bcfb97SAnoob Joseph return next_core; 90d7bcfb97SAnoob Joseph } 91d7bcfb97SAnoob Joseph 921d89ccf3SAnoob Joseph static struct eventdev_params * 931d89ccf3SAnoob Joseph eh_get_eventdev_params(struct eventmode_conf *em_conf, uint8_t eventdev_id) 941d89ccf3SAnoob Joseph { 951d89ccf3SAnoob Joseph int i; 961d89ccf3SAnoob Joseph 971d89ccf3SAnoob Joseph for (i = 0; i < em_conf->nb_eventdev; i++) { 981d89ccf3SAnoob Joseph if (em_conf->eventdev_config[i].eventdev_id == eventdev_id) 991d89ccf3SAnoob Joseph break; 1001d89ccf3SAnoob Joseph } 1011d89ccf3SAnoob Joseph 1021d89ccf3SAnoob Joseph /* No match */ 1031d89ccf3SAnoob Joseph if (i == em_conf->nb_eventdev) 1041d89ccf3SAnoob Joseph return NULL; 1051d89ccf3SAnoob Joseph 1061d89ccf3SAnoob Joseph return &(em_conf->eventdev_config[i]); 1071d89ccf3SAnoob Joseph } 108ec3cc53fSLukasz Bartosik 109ec3cc53fSLukasz Bartosik static inline bool 110ec3cc53fSLukasz Bartosik eh_dev_has_rx_internal_port(uint8_t eventdev_id) 111ec3cc53fSLukasz Bartosik { 112ec3cc53fSLukasz Bartosik bool flag = true; 113f5ad5016SAnkur Dwivedi int j, ret; 114ec3cc53fSLukasz Bartosik 115ec3cc53fSLukasz Bartosik RTE_ETH_FOREACH_DEV(j) { 116ec3cc53fSLukasz Bartosik uint32_t caps = 0; 117ec3cc53fSLukasz Bartosik 118f5ad5016SAnkur Dwivedi ret = rte_event_eth_rx_adapter_caps_get(eventdev_id, j, &caps); 119f5ad5016SAnkur Dwivedi if (ret < 0) 120f5ad5016SAnkur Dwivedi return false; 121f5ad5016SAnkur Dwivedi 122ec3cc53fSLukasz Bartosik if (!(caps & RTE_EVENT_ETH_RX_ADAPTER_CAP_INTERNAL_PORT)) 123ec3cc53fSLukasz Bartosik flag = false; 124ec3cc53fSLukasz Bartosik } 125ec3cc53fSLukasz Bartosik return flag; 126ec3cc53fSLukasz Bartosik } 127ec3cc53fSLukasz Bartosik 128ec3cc53fSLukasz Bartosik static inline bool 129ec3cc53fSLukasz Bartosik eh_dev_has_tx_internal_port(uint8_t eventdev_id) 130ec3cc53fSLukasz Bartosik { 131ec3cc53fSLukasz Bartosik bool flag = true; 132f5ad5016SAnkur Dwivedi int j, ret; 133ec3cc53fSLukasz Bartosik 134ec3cc53fSLukasz Bartosik RTE_ETH_FOREACH_DEV(j) { 135ec3cc53fSLukasz Bartosik uint32_t caps = 0; 136ec3cc53fSLukasz Bartosik 137f5ad5016SAnkur Dwivedi ret = rte_event_eth_tx_adapter_caps_get(eventdev_id, j, &caps); 138f5ad5016SAnkur Dwivedi if (ret < 0) 139f5ad5016SAnkur Dwivedi return false; 140f5ad5016SAnkur Dwivedi 141ec3cc53fSLukasz Bartosik if (!(caps & RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT)) 142ec3cc53fSLukasz Bartosik flag = false; 143ec3cc53fSLukasz Bartosik } 144ec3cc53fSLukasz Bartosik return flag; 145ec3cc53fSLukasz Bartosik } 146ec3cc53fSLukasz Bartosik 1471bf6baacSLukasz Bartosik static inline bool 1481bf6baacSLukasz Bartosik eh_dev_has_burst_mode(uint8_t dev_id) 1491bf6baacSLukasz Bartosik { 1501bf6baacSLukasz Bartosik struct rte_event_dev_info dev_info; 1511bf6baacSLukasz Bartosik 1521bf6baacSLukasz Bartosik rte_event_dev_info_get(dev_id, &dev_info); 1531bf6baacSLukasz Bartosik return (dev_info.event_dev_cap & RTE_EVENT_DEV_CAP_BURST_MODE) ? 1541bf6baacSLukasz Bartosik true : false; 1551bf6baacSLukasz Bartosik } 1561bf6baacSLukasz Bartosik 157e0b0e55cSAnoob Joseph static int 158c12871e4SVolodymyr Fialko eh_set_nb_eventdev(struct eventmode_conf *em_conf) 159e0b0e55cSAnoob Joseph { 160e0b0e55cSAnoob Joseph struct eventdev_params *eventdev_config; 161c12871e4SVolodymyr Fialko int nb_eventdev; 162e0b0e55cSAnoob Joseph 163e0b0e55cSAnoob Joseph /* Get the number of event devices */ 164e0b0e55cSAnoob Joseph nb_eventdev = rte_event_dev_count(); 165e0b0e55cSAnoob Joseph if (nb_eventdev == 0) { 166e0b0e55cSAnoob Joseph EH_LOG_ERR("No event devices detected"); 167e0b0e55cSAnoob Joseph return -EINVAL; 168e0b0e55cSAnoob Joseph } 169e0b0e55cSAnoob Joseph 170e0b0e55cSAnoob Joseph if (nb_eventdev != 1) { 171e0b0e55cSAnoob Joseph EH_LOG_ERR("Event mode does not support multiple event devices. " 172e0b0e55cSAnoob Joseph "Please provide only one event device."); 173e0b0e55cSAnoob Joseph return -EINVAL; 174e0b0e55cSAnoob Joseph } 175e0b0e55cSAnoob Joseph 176c12871e4SVolodymyr Fialko /* Set event dev id*/ 177c12871e4SVolodymyr Fialko eventdev_config = &(em_conf->eventdev_config[0]); 178c12871e4SVolodymyr Fialko eventdev_config->eventdev_id = 0; 179c12871e4SVolodymyr Fialko 180c12871e4SVolodymyr Fialko /* Update the number of event devices */ 181c12871e4SVolodymyr Fialko em_conf->nb_eventdev = 1; 182c12871e4SVolodymyr Fialko 183c12871e4SVolodymyr Fialko return 0; 184c12871e4SVolodymyr Fialko } 185c12871e4SVolodymyr Fialko 186c12871e4SVolodymyr Fialko static int 187c12871e4SVolodymyr Fialko eh_set_default_conf_eventdev(struct eventmode_conf *em_conf) 188c12871e4SVolodymyr Fialko { 189c12871e4SVolodymyr Fialko int lcore_count, nb_eth_dev, ret; 190c12871e4SVolodymyr Fialko struct eventdev_params *eventdev_config; 191c12871e4SVolodymyr Fialko struct rte_event_dev_info dev_info; 192c12871e4SVolodymyr Fialko 193e0b0e55cSAnoob Joseph /* Get the number of eth devs */ 194e0b0e55cSAnoob Joseph nb_eth_dev = rte_eth_dev_count_avail(); 195e0b0e55cSAnoob Joseph if (nb_eth_dev == 0) { 196e0b0e55cSAnoob Joseph EH_LOG_ERR("No eth devices detected"); 197e0b0e55cSAnoob Joseph return -EINVAL; 198e0b0e55cSAnoob Joseph } 199e0b0e55cSAnoob Joseph 200e0b0e55cSAnoob Joseph /* Get the number of lcores */ 201e0b0e55cSAnoob Joseph lcore_count = rte_lcore_count(); 202e0b0e55cSAnoob Joseph 203e0b0e55cSAnoob Joseph /* Read event device info */ 204e0b0e55cSAnoob Joseph ret = rte_event_dev_info_get(0, &dev_info); 205e0b0e55cSAnoob Joseph if (ret < 0) { 206e0b0e55cSAnoob Joseph EH_LOG_ERR("Failed to read event device info %d", ret); 207e0b0e55cSAnoob Joseph return ret; 208e0b0e55cSAnoob Joseph } 209e0b0e55cSAnoob Joseph 210e0b0e55cSAnoob Joseph /* Check if enough ports are available */ 211e0b0e55cSAnoob Joseph if (dev_info.max_event_ports < 2) { 212e0b0e55cSAnoob Joseph EH_LOG_ERR("Not enough event ports available"); 213e0b0e55cSAnoob Joseph return -EINVAL; 214e0b0e55cSAnoob Joseph } 215e0b0e55cSAnoob Joseph 216e0b0e55cSAnoob Joseph /* Get the first event dev conf */ 217e0b0e55cSAnoob Joseph eventdev_config = &(em_conf->eventdev_config[0]); 218e0b0e55cSAnoob Joseph 219e0b0e55cSAnoob Joseph /* Save number of queues & ports available */ 220c12871e4SVolodymyr Fialko eventdev_config->nb_eventqueue = nb_eth_dev; 221e0b0e55cSAnoob Joseph eventdev_config->nb_eventport = dev_info.max_event_ports; 222e0b0e55cSAnoob Joseph eventdev_config->ev_queue_mode = RTE_EVENT_QUEUE_CFG_ALL_TYPES; 223e0b0e55cSAnoob Joseph 224e0b0e55cSAnoob Joseph /* One queue is reserved for Tx */ 225c12871e4SVolodymyr Fialko eventdev_config->tx_queue_id = INVALID_EV_QUEUE_ID; 226c12871e4SVolodymyr Fialko if (eventdev_config->all_internal_ports) { 227c12871e4SVolodymyr Fialko if (eventdev_config->nb_eventqueue >= dev_info.max_event_queues) { 228c12871e4SVolodymyr Fialko EH_LOG_ERR("Not enough event queues available"); 229c12871e4SVolodymyr Fialko return -EINVAL; 230c12871e4SVolodymyr Fialko } 231c12871e4SVolodymyr Fialko eventdev_config->tx_queue_id = 232c12871e4SVolodymyr Fialko eventdev_config->nb_eventqueue++; 233c12871e4SVolodymyr Fialko } 234c12871e4SVolodymyr Fialko 235c12871e4SVolodymyr Fialko /* One queue is reserved for event crypto adapter */ 236c12871e4SVolodymyr Fialko eventdev_config->ev_cpt_queue_id = INVALID_EV_QUEUE_ID; 237c12871e4SVolodymyr Fialko if (em_conf->enable_event_crypto_adapter) { 238c12871e4SVolodymyr Fialko if (eventdev_config->nb_eventqueue >= dev_info.max_event_queues) { 239c12871e4SVolodymyr Fialko EH_LOG_ERR("Not enough event queues available"); 240c12871e4SVolodymyr Fialko return -EINVAL; 241c12871e4SVolodymyr Fialko } 242c12871e4SVolodymyr Fialko eventdev_config->ev_cpt_queue_id = 243c12871e4SVolodymyr Fialko eventdev_config->nb_eventqueue++; 244e0b0e55cSAnoob Joseph } 245e0b0e55cSAnoob Joseph 246e0b0e55cSAnoob Joseph /* Check if there are more ports than required */ 247e0b0e55cSAnoob Joseph if (eventdev_config->nb_eventport > lcore_count) { 248e0b0e55cSAnoob Joseph /* One port per lcore is enough */ 249e0b0e55cSAnoob Joseph eventdev_config->nb_eventport = lcore_count; 250e0b0e55cSAnoob Joseph } 251e0b0e55cSAnoob Joseph 252e0b0e55cSAnoob Joseph return 0; 253e0b0e55cSAnoob Joseph } 254e0b0e55cSAnoob Joseph 255ec3cc53fSLukasz Bartosik static void 256ec3cc53fSLukasz Bartosik eh_do_capability_check(struct eventmode_conf *em_conf) 257ec3cc53fSLukasz Bartosik { 258ec3cc53fSLukasz Bartosik struct eventdev_params *eventdev_config; 259ec3cc53fSLukasz Bartosik int all_internal_ports = 1; 260ec3cc53fSLukasz Bartosik uint32_t eventdev_id; 261ec3cc53fSLukasz Bartosik int i; 262ec3cc53fSLukasz Bartosik 263ec3cc53fSLukasz Bartosik for (i = 0; i < em_conf->nb_eventdev; i++) { 264ec3cc53fSLukasz Bartosik 265ec3cc53fSLukasz Bartosik /* Get the event dev conf */ 266ec3cc53fSLukasz Bartosik eventdev_config = &(em_conf->eventdev_config[i]); 267ec3cc53fSLukasz Bartosik eventdev_id = eventdev_config->eventdev_id; 268ec3cc53fSLukasz Bartosik 269ec3cc53fSLukasz Bartosik /* Check if event device has internal port for Rx & Tx */ 270ec3cc53fSLukasz Bartosik if (eh_dev_has_rx_internal_port(eventdev_id) && 271ec3cc53fSLukasz Bartosik eh_dev_has_tx_internal_port(eventdev_id)) { 272ec3cc53fSLukasz Bartosik eventdev_config->all_internal_ports = 1; 273ec3cc53fSLukasz Bartosik } else { 274ec3cc53fSLukasz Bartosik all_internal_ports = 0; 275ec3cc53fSLukasz Bartosik } 276ec3cc53fSLukasz Bartosik } 277ec3cc53fSLukasz Bartosik 278ec3cc53fSLukasz Bartosik /* 279ec3cc53fSLukasz Bartosik * If Rx & Tx internal ports are supported by all event devices then 280c12871e4SVolodymyr Fialko * eth cores won't be required. Override the eth core mask requested. 281ec3cc53fSLukasz Bartosik */ 282c12871e4SVolodymyr Fialko if (all_internal_ports) 283ec3cc53fSLukasz Bartosik rte_bitmap_reset(em_conf->eth_core_mask); 284ec3cc53fSLukasz Bartosik } 285ec3cc53fSLukasz Bartosik 286e0b0e55cSAnoob Joseph static int 287d7bcfb97SAnoob Joseph eh_set_default_conf_link(struct eventmode_conf *em_conf) 288d7bcfb97SAnoob Joseph { 289d7bcfb97SAnoob Joseph struct eventdev_params *eventdev_config; 290d7bcfb97SAnoob Joseph struct eh_event_link_info *link; 291d7bcfb97SAnoob Joseph unsigned int lcore_id = -1; 292d7bcfb97SAnoob Joseph int i, link_index; 293d7bcfb97SAnoob Joseph 294d7bcfb97SAnoob Joseph /* 295d7bcfb97SAnoob Joseph * Create a 1:1 mapping from event ports to cores. If the number 296d7bcfb97SAnoob Joseph * of event ports is lesser than the cores, some cores won't 297d7bcfb97SAnoob Joseph * execute worker. If there are more event ports, then some ports 298d7bcfb97SAnoob Joseph * won't be used. 299d7bcfb97SAnoob Joseph * 300d7bcfb97SAnoob Joseph */ 301d7bcfb97SAnoob Joseph 302d7bcfb97SAnoob Joseph /* 303d7bcfb97SAnoob Joseph * The event queue-port mapping is done according to the link. Since 304d7bcfb97SAnoob Joseph * we are falling back to the default link config, enabling 305d7bcfb97SAnoob Joseph * "all_ev_queue_to_ev_port" mode flag. This will map all queues 306d7bcfb97SAnoob Joseph * to the port. 307d7bcfb97SAnoob Joseph */ 308d7bcfb97SAnoob Joseph em_conf->ext_params.all_ev_queue_to_ev_port = 1; 309d7bcfb97SAnoob Joseph 310d7bcfb97SAnoob Joseph /* Get first event dev conf */ 311d7bcfb97SAnoob Joseph eventdev_config = &(em_conf->eventdev_config[0]); 312d7bcfb97SAnoob Joseph 313d7bcfb97SAnoob Joseph /* Loop through the ports */ 314d7bcfb97SAnoob Joseph for (i = 0; i < eventdev_config->nb_eventport; i++) { 315d7bcfb97SAnoob Joseph 316d7bcfb97SAnoob Joseph /* Get next active core id */ 317d7bcfb97SAnoob Joseph lcore_id = eh_get_next_active_core(em_conf, 318d7bcfb97SAnoob Joseph lcore_id); 319d7bcfb97SAnoob Joseph 320d7bcfb97SAnoob Joseph if (lcore_id == RTE_MAX_LCORE) { 321d7bcfb97SAnoob Joseph /* Reached max cores */ 322d7bcfb97SAnoob Joseph return 0; 323d7bcfb97SAnoob Joseph } 324d7bcfb97SAnoob Joseph 325d7bcfb97SAnoob Joseph /* Save the current combination as one link */ 326d7bcfb97SAnoob Joseph 327d7bcfb97SAnoob Joseph /* Get the index */ 328d7bcfb97SAnoob Joseph link_index = em_conf->nb_link; 329d7bcfb97SAnoob Joseph 330d7bcfb97SAnoob Joseph /* Get the corresponding link */ 331d7bcfb97SAnoob Joseph link = &(em_conf->link[link_index]); 332d7bcfb97SAnoob Joseph 333d7bcfb97SAnoob Joseph /* Save link */ 334d7bcfb97SAnoob Joseph link->eventdev_id = eventdev_config->eventdev_id; 335d7bcfb97SAnoob Joseph link->event_port_id = i; 336d7bcfb97SAnoob Joseph link->lcore_id = lcore_id; 337d7bcfb97SAnoob Joseph 338d7bcfb97SAnoob Joseph /* 339d7bcfb97SAnoob Joseph * Don't set eventq_id as by default all queues 340d7bcfb97SAnoob Joseph * need to be mapped to the port, which is controlled 341d7bcfb97SAnoob Joseph * by the operating mode. 342d7bcfb97SAnoob Joseph */ 343d7bcfb97SAnoob Joseph 344d7bcfb97SAnoob Joseph /* Update number of links */ 345d7bcfb97SAnoob Joseph em_conf->nb_link++; 346d7bcfb97SAnoob Joseph } 347d7bcfb97SAnoob Joseph 348d7bcfb97SAnoob Joseph return 0; 349d7bcfb97SAnoob Joseph } 350d7bcfb97SAnoob Joseph 351d7bcfb97SAnoob Joseph static int 35202afed59SAnoob Joseph eh_set_default_conf_rx_adapter(struct eventmode_conf *em_conf) 35302afed59SAnoob Joseph { 35402afed59SAnoob Joseph struct rx_adapter_connection_info *conn; 35502afed59SAnoob Joseph struct eventdev_params *eventdev_config; 35602afed59SAnoob Joseph struct rx_adapter_conf *adapter; 357ec3cc53fSLukasz Bartosik bool rx_internal_port = true; 35802afed59SAnoob Joseph bool single_ev_queue = false; 359ec3cc53fSLukasz Bartosik int nb_eventqueue; 360ec3cc53fSLukasz Bartosik uint32_t caps = 0; 36102afed59SAnoob Joseph int eventdev_id; 36202afed59SAnoob Joseph int nb_eth_dev; 36302afed59SAnoob Joseph int adapter_id; 36402afed59SAnoob Joseph int conn_id; 365f5ad5016SAnkur Dwivedi int ret; 36602afed59SAnoob Joseph int i; 36702afed59SAnoob Joseph 36802afed59SAnoob Joseph /* Create one adapter with eth queues mapped to event queue(s) */ 36902afed59SAnoob Joseph 37002afed59SAnoob Joseph if (em_conf->nb_eventdev == 0) { 37102afed59SAnoob Joseph EH_LOG_ERR("No event devs registered"); 37202afed59SAnoob Joseph return -EINVAL; 37302afed59SAnoob Joseph } 37402afed59SAnoob Joseph 37502afed59SAnoob Joseph /* Get the number of eth devs */ 37602afed59SAnoob Joseph nb_eth_dev = rte_eth_dev_count_avail(); 37702afed59SAnoob Joseph 37802afed59SAnoob Joseph /* Use the first event dev */ 37902afed59SAnoob Joseph eventdev_config = &(em_conf->eventdev_config[0]); 38002afed59SAnoob Joseph 38102afed59SAnoob Joseph /* Get eventdev ID */ 38202afed59SAnoob Joseph eventdev_id = eventdev_config->eventdev_id; 38302afed59SAnoob Joseph adapter_id = 0; 38402afed59SAnoob Joseph 38502afed59SAnoob Joseph /* Get adapter conf */ 38602afed59SAnoob Joseph adapter = &(em_conf->rx_adapter[adapter_id]); 38702afed59SAnoob Joseph 38802afed59SAnoob Joseph /* Set adapter conf */ 38902afed59SAnoob Joseph adapter->eventdev_id = eventdev_id; 39002afed59SAnoob Joseph adapter->adapter_id = adapter_id; 391ec3cc53fSLukasz Bartosik 392ec3cc53fSLukasz Bartosik /* 393ec3cc53fSLukasz Bartosik * If event device does not have internal ports for passing 394ec3cc53fSLukasz Bartosik * packets then reserved one queue for Tx path 395ec3cc53fSLukasz Bartosik */ 396ec3cc53fSLukasz Bartosik nb_eventqueue = eventdev_config->all_internal_ports ? 397ec3cc53fSLukasz Bartosik eventdev_config->nb_eventqueue : 398ec3cc53fSLukasz Bartosik eventdev_config->nb_eventqueue - 1; 39902afed59SAnoob Joseph 400c12871e4SVolodymyr Fialko /* Reserve one queue for event crypto adapter */ 401c12871e4SVolodymyr Fialko if (em_conf->enable_event_crypto_adapter) 402c12871e4SVolodymyr Fialko nb_eventqueue--; 403c12871e4SVolodymyr Fialko 40402afed59SAnoob Joseph /* 40502afed59SAnoob Joseph * Map all queues of eth device (port) to an event queue. If there 40602afed59SAnoob Joseph * are more event queues than eth ports then create 1:1 mapping. 40702afed59SAnoob Joseph * Otherwise map all eth ports to a single event queue. 40802afed59SAnoob Joseph */ 409ec3cc53fSLukasz Bartosik if (nb_eth_dev > nb_eventqueue) 41002afed59SAnoob Joseph single_ev_queue = true; 41102afed59SAnoob Joseph 41202afed59SAnoob Joseph for (i = 0; i < nb_eth_dev; i++) { 41302afed59SAnoob Joseph 41402afed59SAnoob Joseph /* Use only the ports enabled */ 41502afed59SAnoob Joseph if ((em_conf->eth_portmask & (1 << i)) == 0) 41602afed59SAnoob Joseph continue; 41702afed59SAnoob Joseph 41802afed59SAnoob Joseph /* Get the connection id */ 41902afed59SAnoob Joseph conn_id = adapter->nb_connections; 42002afed59SAnoob Joseph 42102afed59SAnoob Joseph /* Get the connection */ 42202afed59SAnoob Joseph conn = &(adapter->conn[conn_id]); 42302afed59SAnoob Joseph 42402afed59SAnoob Joseph /* Set mapping between eth ports & event queues*/ 42502afed59SAnoob Joseph conn->ethdev_id = i; 42602afed59SAnoob Joseph conn->eventq_id = single_ev_queue ? 0 : i; 42702afed59SAnoob Joseph 42802afed59SAnoob Joseph /* Add all eth queues eth port to event queue */ 42902afed59SAnoob Joseph conn->ethdev_rx_qid = -1; 43002afed59SAnoob Joseph 431ec3cc53fSLukasz Bartosik /* Get Rx adapter capabilities */ 432f5ad5016SAnkur Dwivedi ret = rte_event_eth_rx_adapter_caps_get(eventdev_id, i, &caps); 433f5ad5016SAnkur Dwivedi if (ret < 0) { 434f5ad5016SAnkur Dwivedi EH_LOG_ERR("Failed to get event device %d eth rx adapter" 435f5ad5016SAnkur Dwivedi " capabilities for port %d", eventdev_id, i); 436f5ad5016SAnkur Dwivedi return ret; 437f5ad5016SAnkur Dwivedi } 438ec3cc53fSLukasz Bartosik if (!(caps & RTE_EVENT_ETH_RX_ADAPTER_CAP_INTERNAL_PORT)) 439ec3cc53fSLukasz Bartosik rx_internal_port = false; 440ec3cc53fSLukasz Bartosik 44102afed59SAnoob Joseph /* Update no of connections */ 44202afed59SAnoob Joseph adapter->nb_connections++; 44302afed59SAnoob Joseph 44402afed59SAnoob Joseph } 44502afed59SAnoob Joseph 446ec3cc53fSLukasz Bartosik if (rx_internal_port) { 447ec3cc53fSLukasz Bartosik /* Rx core is not required */ 448ec3cc53fSLukasz Bartosik adapter->rx_core_id = -1; 449ec3cc53fSLukasz Bartosik } else { 450ec3cc53fSLukasz Bartosik /* Rx core is required */ 451ec3cc53fSLukasz Bartosik adapter->rx_core_id = eh_get_next_eth_core(em_conf); 452ec3cc53fSLukasz Bartosik } 453ec3cc53fSLukasz Bartosik 45402afed59SAnoob Joseph /* We have setup one adapter */ 45502afed59SAnoob Joseph em_conf->nb_rx_adapter = 1; 45602afed59SAnoob Joseph 45702afed59SAnoob Joseph return 0; 45802afed59SAnoob Joseph } 45902afed59SAnoob Joseph 46002afed59SAnoob Joseph static int 4611d89ccf3SAnoob Joseph eh_set_default_conf_tx_adapter(struct eventmode_conf *em_conf) 4621d89ccf3SAnoob Joseph { 4631d89ccf3SAnoob Joseph struct tx_adapter_connection_info *conn; 4641d89ccf3SAnoob Joseph struct eventdev_params *eventdev_config; 4651d89ccf3SAnoob Joseph struct tx_adapter_conf *tx_adapter; 466ec3cc53fSLukasz Bartosik bool tx_internal_port = true; 467ec3cc53fSLukasz Bartosik uint32_t caps = 0; 4681d89ccf3SAnoob Joseph int eventdev_id; 4691d89ccf3SAnoob Joseph int adapter_id; 4701d89ccf3SAnoob Joseph int nb_eth_dev; 4711d89ccf3SAnoob Joseph int conn_id; 472f5ad5016SAnkur Dwivedi int ret; 4731d89ccf3SAnoob Joseph int i; 4741d89ccf3SAnoob Joseph 4751d89ccf3SAnoob Joseph /* 4761d89ccf3SAnoob Joseph * Create one Tx adapter with all eth queues mapped to event queues 4771d89ccf3SAnoob Joseph * 1:1. 4781d89ccf3SAnoob Joseph */ 4791d89ccf3SAnoob Joseph 4801d89ccf3SAnoob Joseph if (em_conf->nb_eventdev == 0) { 4811d89ccf3SAnoob Joseph EH_LOG_ERR("No event devs registered"); 4821d89ccf3SAnoob Joseph return -EINVAL; 4831d89ccf3SAnoob Joseph } 4841d89ccf3SAnoob Joseph 4851d89ccf3SAnoob Joseph /* Get the number of eth devs */ 4861d89ccf3SAnoob Joseph nb_eth_dev = rte_eth_dev_count_avail(); 4871d89ccf3SAnoob Joseph 4881d89ccf3SAnoob Joseph /* Use the first event dev */ 4891d89ccf3SAnoob Joseph eventdev_config = &(em_conf->eventdev_config[0]); 4901d89ccf3SAnoob Joseph 4911d89ccf3SAnoob Joseph /* Get eventdev ID */ 4921d89ccf3SAnoob Joseph eventdev_id = eventdev_config->eventdev_id; 4931d89ccf3SAnoob Joseph adapter_id = 0; 4941d89ccf3SAnoob Joseph 4951d89ccf3SAnoob Joseph /* Get adapter conf */ 4961d89ccf3SAnoob Joseph tx_adapter = &(em_conf->tx_adapter[adapter_id]); 4971d89ccf3SAnoob Joseph 4981d89ccf3SAnoob Joseph /* Set adapter conf */ 4991d89ccf3SAnoob Joseph tx_adapter->eventdev_id = eventdev_id; 5001d89ccf3SAnoob Joseph tx_adapter->adapter_id = adapter_id; 5011d89ccf3SAnoob Joseph 5021d89ccf3SAnoob Joseph /* 5031d89ccf3SAnoob Joseph * Map all Tx queues of the eth device (port) to the event device. 5041d89ccf3SAnoob Joseph */ 5051d89ccf3SAnoob Joseph 5061d89ccf3SAnoob Joseph /* Set defaults for connections */ 5071d89ccf3SAnoob Joseph 5081d89ccf3SAnoob Joseph /* 5091d89ccf3SAnoob Joseph * One eth device (port) is one connection. Map all Tx queues 5101d89ccf3SAnoob Joseph * of the device to the Tx adapter. 5111d89ccf3SAnoob Joseph */ 5121d89ccf3SAnoob Joseph 5131d89ccf3SAnoob Joseph for (i = 0; i < nb_eth_dev; i++) { 5141d89ccf3SAnoob Joseph 5151d89ccf3SAnoob Joseph /* Use only the ports enabled */ 5161d89ccf3SAnoob Joseph if ((em_conf->eth_portmask & (1 << i)) == 0) 5171d89ccf3SAnoob Joseph continue; 5181d89ccf3SAnoob Joseph 5191d89ccf3SAnoob Joseph /* Get the connection id */ 5201d89ccf3SAnoob Joseph conn_id = tx_adapter->nb_connections; 5211d89ccf3SAnoob Joseph 5221d89ccf3SAnoob Joseph /* Get the connection */ 5231d89ccf3SAnoob Joseph conn = &(tx_adapter->conn[conn_id]); 5241d89ccf3SAnoob Joseph 5251d89ccf3SAnoob Joseph /* Add ethdev to connections */ 5261d89ccf3SAnoob Joseph conn->ethdev_id = i; 5271d89ccf3SAnoob Joseph 5281d89ccf3SAnoob Joseph /* Add all eth tx queues to adapter */ 5291d89ccf3SAnoob Joseph conn->ethdev_tx_qid = -1; 5301d89ccf3SAnoob Joseph 531ec3cc53fSLukasz Bartosik /* Get Tx adapter capabilities */ 532f5ad5016SAnkur Dwivedi ret = rte_event_eth_tx_adapter_caps_get(eventdev_id, i, &caps); 533f5ad5016SAnkur Dwivedi if (ret < 0) { 534f5ad5016SAnkur Dwivedi EH_LOG_ERR("Failed to get event device %d eth tx adapter" 535f5ad5016SAnkur Dwivedi " capabilities for port %d", eventdev_id, i); 536f5ad5016SAnkur Dwivedi return ret; 537f5ad5016SAnkur Dwivedi } 538ec3cc53fSLukasz Bartosik if (!(caps & RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT)) 539ec3cc53fSLukasz Bartosik tx_internal_port = false; 540ec3cc53fSLukasz Bartosik 5411d89ccf3SAnoob Joseph /* Update no of connections */ 5421d89ccf3SAnoob Joseph tx_adapter->nb_connections++; 5431d89ccf3SAnoob Joseph } 5441d89ccf3SAnoob Joseph 545ec3cc53fSLukasz Bartosik if (tx_internal_port) { 546ec3cc53fSLukasz Bartosik /* Tx core is not required */ 547ec3cc53fSLukasz Bartosik tx_adapter->tx_core_id = -1; 548ec3cc53fSLukasz Bartosik } else { 549ec3cc53fSLukasz Bartosik /* Tx core is required */ 550ec3cc53fSLukasz Bartosik tx_adapter->tx_core_id = eh_get_next_eth_core(em_conf); 551ec3cc53fSLukasz Bartosik 552ec3cc53fSLukasz Bartosik /* 553ec3cc53fSLukasz Bartosik * Use one event queue per adapter for submitting packets 554ec3cc53fSLukasz Bartosik * for Tx. Reserving the last queue available 555ec3cc53fSLukasz Bartosik */ 556ec3cc53fSLukasz Bartosik /* Queue numbers start at 0 */ 557ec3cc53fSLukasz Bartosik tx_adapter->tx_ev_queue = eventdev_config->nb_eventqueue - 1; 558ec3cc53fSLukasz Bartosik } 559ec3cc53fSLukasz Bartosik 5601d89ccf3SAnoob Joseph /* We have setup one adapter */ 5611d89ccf3SAnoob Joseph em_conf->nb_tx_adapter = 1; 5621d89ccf3SAnoob Joseph return 0; 5631d89ccf3SAnoob Joseph } 5641d89ccf3SAnoob Joseph 5651d89ccf3SAnoob Joseph static int 566e0b0e55cSAnoob Joseph eh_validate_conf(struct eventmode_conf *em_conf) 567e0b0e55cSAnoob Joseph { 568e0b0e55cSAnoob Joseph int ret; 569e0b0e55cSAnoob Joseph 570e0b0e55cSAnoob Joseph /* 571e0b0e55cSAnoob Joseph * Check if event devs are specified. Else probe the event devices 572e0b0e55cSAnoob Joseph * and initialize the config with all ports & queues available 573e0b0e55cSAnoob Joseph */ 574e0b0e55cSAnoob Joseph if (em_conf->nb_eventdev == 0) { 575c12871e4SVolodymyr Fialko ret = eh_set_nb_eventdev(em_conf); 576c12871e4SVolodymyr Fialko if (ret != 0) 577c12871e4SVolodymyr Fialko return ret; 578c12871e4SVolodymyr Fialko eh_do_capability_check(em_conf); 579e0b0e55cSAnoob Joseph ret = eh_set_default_conf_eventdev(em_conf); 580e0b0e55cSAnoob Joseph if (ret != 0) 581e0b0e55cSAnoob Joseph return ret; 582c12871e4SVolodymyr Fialko } else { 583ec3cc53fSLukasz Bartosik /* Perform capability check for the selected event devices */ 584ec3cc53fSLukasz Bartosik eh_do_capability_check(em_conf); 585c12871e4SVolodymyr Fialko } 586ec3cc53fSLukasz Bartosik 587d7bcfb97SAnoob Joseph /* 588d7bcfb97SAnoob Joseph * Check if links are specified. Else generate a default config for 589d7bcfb97SAnoob Joseph * the event ports used. 590d7bcfb97SAnoob Joseph */ 591d7bcfb97SAnoob Joseph if (em_conf->nb_link == 0) { 592d7bcfb97SAnoob Joseph ret = eh_set_default_conf_link(em_conf); 593d7bcfb97SAnoob Joseph if (ret != 0) 594d7bcfb97SAnoob Joseph return ret; 595d7bcfb97SAnoob Joseph } 596d7bcfb97SAnoob Joseph 59702afed59SAnoob Joseph /* 59802afed59SAnoob Joseph * Check if rx adapters are specified. Else generate a default config 59902afed59SAnoob Joseph * with one rx adapter and all eth queues - event queue mapped. 60002afed59SAnoob Joseph */ 60102afed59SAnoob Joseph if (em_conf->nb_rx_adapter == 0) { 60202afed59SAnoob Joseph ret = eh_set_default_conf_rx_adapter(em_conf); 60302afed59SAnoob Joseph if (ret != 0) 60402afed59SAnoob Joseph return ret; 60502afed59SAnoob Joseph } 60602afed59SAnoob Joseph 6071d89ccf3SAnoob Joseph /* 6081d89ccf3SAnoob Joseph * Check if tx adapters are specified. Else generate a default config 6091d89ccf3SAnoob Joseph * with one tx adapter. 6101d89ccf3SAnoob Joseph */ 6111d89ccf3SAnoob Joseph if (em_conf->nb_tx_adapter == 0) { 6121d89ccf3SAnoob Joseph ret = eh_set_default_conf_tx_adapter(em_conf); 6131d89ccf3SAnoob Joseph if (ret != 0) 6141d89ccf3SAnoob Joseph return ret; 6151d89ccf3SAnoob Joseph } 6161d89ccf3SAnoob Joseph 617e0b0e55cSAnoob Joseph return 0; 618e0b0e55cSAnoob Joseph } 619e0b0e55cSAnoob Joseph 620e0b0e55cSAnoob Joseph static int 621e0b0e55cSAnoob Joseph eh_initialize_eventdev(struct eventmode_conf *em_conf) 622e0b0e55cSAnoob Joseph { 623e0b0e55cSAnoob Joseph struct rte_event_queue_conf eventq_conf = {0}; 624e0b0e55cSAnoob Joseph struct rte_event_dev_info evdev_default_conf; 625e0b0e55cSAnoob Joseph struct rte_event_dev_config eventdev_conf; 626e0b0e55cSAnoob Joseph struct eventdev_params *eventdev_config; 627e0b0e55cSAnoob Joseph int nb_eventdev = em_conf->nb_eventdev; 628d7bcfb97SAnoob Joseph struct eh_event_link_info *link; 629d7bcfb97SAnoob Joseph uint8_t *queue = NULL; 630e0b0e55cSAnoob Joseph uint8_t eventdev_id; 631e0b0e55cSAnoob Joseph int nb_eventqueue; 632c12871e4SVolodymyr Fialko int ret, j; 633c12871e4SVolodymyr Fialko uint8_t i; 634e0b0e55cSAnoob Joseph 635e0b0e55cSAnoob Joseph for (i = 0; i < nb_eventdev; i++) { 636e0b0e55cSAnoob Joseph 637e0b0e55cSAnoob Joseph /* Get eventdev config */ 638e0b0e55cSAnoob Joseph eventdev_config = &(em_conf->eventdev_config[i]); 639e0b0e55cSAnoob Joseph 640e0b0e55cSAnoob Joseph /* Get event dev ID */ 641e0b0e55cSAnoob Joseph eventdev_id = eventdev_config->eventdev_id; 642e0b0e55cSAnoob Joseph 643e0b0e55cSAnoob Joseph /* Get the number of queues */ 644e0b0e55cSAnoob Joseph nb_eventqueue = eventdev_config->nb_eventqueue; 645e0b0e55cSAnoob Joseph 646e0b0e55cSAnoob Joseph /* Reset the default conf */ 647e0b0e55cSAnoob Joseph memset(&evdev_default_conf, 0, 648e0b0e55cSAnoob Joseph sizeof(struct rte_event_dev_info)); 649e0b0e55cSAnoob Joseph 650e0b0e55cSAnoob Joseph /* Get default conf of eventdev */ 651e0b0e55cSAnoob Joseph ret = rte_event_dev_info_get(eventdev_id, &evdev_default_conf); 652e0b0e55cSAnoob Joseph if (ret < 0) { 653e0b0e55cSAnoob Joseph EH_LOG_ERR( 654e0b0e55cSAnoob Joseph "Error in getting event device info[devID:%d]", 655e0b0e55cSAnoob Joseph eventdev_id); 656e0b0e55cSAnoob Joseph return ret; 657e0b0e55cSAnoob Joseph } 658e0b0e55cSAnoob Joseph 659e0b0e55cSAnoob Joseph memset(&eventdev_conf, 0, sizeof(struct rte_event_dev_config)); 660e0b0e55cSAnoob Joseph eventdev_conf.nb_events_limit = 661e0b0e55cSAnoob Joseph evdev_default_conf.max_num_events; 662e0b0e55cSAnoob Joseph eventdev_conf.nb_event_queues = nb_eventqueue; 663e0b0e55cSAnoob Joseph eventdev_conf.nb_event_ports = 664e0b0e55cSAnoob Joseph eventdev_config->nb_eventport; 665e0b0e55cSAnoob Joseph eventdev_conf.nb_event_queue_flows = 666e0b0e55cSAnoob Joseph evdev_default_conf.max_event_queue_flows; 667e0b0e55cSAnoob Joseph eventdev_conf.nb_event_port_dequeue_depth = 668e0b0e55cSAnoob Joseph evdev_default_conf.max_event_port_dequeue_depth; 669e0b0e55cSAnoob Joseph eventdev_conf.nb_event_port_enqueue_depth = 670e0b0e55cSAnoob Joseph evdev_default_conf.max_event_port_enqueue_depth; 671e0b0e55cSAnoob Joseph 672*6cf329f9SPavan Nikhilesh if (evdev_default_conf.event_dev_cap & RTE_EVENT_DEV_CAP_EVENT_PRESCHEDULE) 673*6cf329f9SPavan Nikhilesh eventdev_conf.preschedule_type = RTE_EVENT_PRESCHEDULE; 674*6cf329f9SPavan Nikhilesh 675*6cf329f9SPavan Nikhilesh if (evdev_default_conf.event_dev_cap & RTE_EVENT_DEV_CAP_EVENT_PRESCHEDULE_ADAPTIVE) 676*6cf329f9SPavan Nikhilesh eventdev_conf.preschedule_type = RTE_EVENT_PRESCHEDULE_ADAPTIVE; 677*6cf329f9SPavan Nikhilesh 678e0b0e55cSAnoob Joseph /* Configure event device */ 679e0b0e55cSAnoob Joseph ret = rte_event_dev_configure(eventdev_id, &eventdev_conf); 680e0b0e55cSAnoob Joseph if (ret < 0) { 681e0b0e55cSAnoob Joseph EH_LOG_ERR("Error in configuring event device"); 682e0b0e55cSAnoob Joseph return ret; 683e0b0e55cSAnoob Joseph } 684e0b0e55cSAnoob Joseph 685e0b0e55cSAnoob Joseph /* Configure event queues */ 686e0b0e55cSAnoob Joseph for (j = 0; j < nb_eventqueue; j++) { 687e0b0e55cSAnoob Joseph 688e0b0e55cSAnoob Joseph memset(&eventq_conf, 0, 689e0b0e55cSAnoob Joseph sizeof(struct rte_event_queue_conf)); 690e0b0e55cSAnoob Joseph 691e0b0e55cSAnoob Joseph /* Per event dev queues can be ATQ or SINGLE LINK */ 692e0b0e55cSAnoob Joseph eventq_conf.event_queue_cfg = 693e0b0e55cSAnoob Joseph eventdev_config->ev_queue_mode; 694e0b0e55cSAnoob Joseph /* 695e0b0e55cSAnoob Joseph * All queues need to be set with sched_type as 696ec3cc53fSLukasz Bartosik * schedule type for the application stage. One 697ec3cc53fSLukasz Bartosik * queue would be reserved for the final eth tx 698ec3cc53fSLukasz Bartosik * stage if event device does not have internal 699ec3cc53fSLukasz Bartosik * ports. This will be an atomic queue. 700e0b0e55cSAnoob Joseph */ 701c12871e4SVolodymyr Fialko if (j == eventdev_config->tx_queue_id) { 702e0b0e55cSAnoob Joseph eventq_conf.schedule_type = 703e0b0e55cSAnoob Joseph RTE_SCHED_TYPE_ATOMIC; 704e0b0e55cSAnoob Joseph } else { 705e0b0e55cSAnoob Joseph eventq_conf.schedule_type = 706e0b0e55cSAnoob Joseph em_conf->ext_params.sched_type; 707e0b0e55cSAnoob Joseph } 708c12871e4SVolodymyr Fialko /* 709c12871e4SVolodymyr Fialko * Give event crypto device's queue higher priority then Rx queues. This 710c12871e4SVolodymyr Fialko * will allow crypto events to be processed with highest priority. 711c12871e4SVolodymyr Fialko */ 712c12871e4SVolodymyr Fialko if (j == eventdev_config->ev_cpt_queue_id) { 713c12871e4SVolodymyr Fialko eventq_conf.priority = 714c12871e4SVolodymyr Fialko RTE_EVENT_DEV_PRIORITY_HIGHEST; 715c12871e4SVolodymyr Fialko } else { 716c12871e4SVolodymyr Fialko eventq_conf.priority = 717c12871e4SVolodymyr Fialko RTE_EVENT_DEV_PRIORITY_NORMAL; 718c12871e4SVolodymyr Fialko } 719e0b0e55cSAnoob Joseph 720e0b0e55cSAnoob Joseph /* Set max atomic flows to 1024 */ 721e0b0e55cSAnoob Joseph eventq_conf.nb_atomic_flows = 1024; 722e0b0e55cSAnoob Joseph eventq_conf.nb_atomic_order_sequences = 1024; 723e0b0e55cSAnoob Joseph 724e0b0e55cSAnoob Joseph /* Setup the queue */ 725e0b0e55cSAnoob Joseph ret = rte_event_queue_setup(eventdev_id, j, 726e0b0e55cSAnoob Joseph &eventq_conf); 727e0b0e55cSAnoob Joseph if (ret < 0) { 728e0b0e55cSAnoob Joseph EH_LOG_ERR("Failed to setup event queue %d", 729e0b0e55cSAnoob Joseph ret); 730e0b0e55cSAnoob Joseph return ret; 731e0b0e55cSAnoob Joseph } 732e0b0e55cSAnoob Joseph } 733e0b0e55cSAnoob Joseph 734e0b0e55cSAnoob Joseph /* Configure event ports */ 735e0b0e55cSAnoob Joseph for (j = 0; j < eventdev_config->nb_eventport; j++) { 736e0b0e55cSAnoob Joseph ret = rte_event_port_setup(eventdev_id, j, NULL); 737e0b0e55cSAnoob Joseph if (ret < 0) { 738e0b0e55cSAnoob Joseph EH_LOG_ERR("Failed to setup event port %d", 739e0b0e55cSAnoob Joseph ret); 740e0b0e55cSAnoob Joseph return ret; 741e0b0e55cSAnoob Joseph } 742e0b0e55cSAnoob Joseph } 743e0b0e55cSAnoob Joseph } 744e0b0e55cSAnoob Joseph 745d7bcfb97SAnoob Joseph /* Make event queue - event port link */ 746d7bcfb97SAnoob Joseph for (j = 0; j < em_conf->nb_link; j++) { 747d7bcfb97SAnoob Joseph 748d7bcfb97SAnoob Joseph /* Get link info */ 749d7bcfb97SAnoob Joseph link = &(em_conf->link[j]); 750d7bcfb97SAnoob Joseph 751d7bcfb97SAnoob Joseph /* Get event dev ID */ 752d7bcfb97SAnoob Joseph eventdev_id = link->eventdev_id; 753d7bcfb97SAnoob Joseph 754d7bcfb97SAnoob Joseph /* 755d7bcfb97SAnoob Joseph * If "all_ev_queue_to_ev_port" params flag is selected, all 756d7bcfb97SAnoob Joseph * queues need to be mapped to the port. 757d7bcfb97SAnoob Joseph */ 758d7bcfb97SAnoob Joseph if (em_conf->ext_params.all_ev_queue_to_ev_port) 759d7bcfb97SAnoob Joseph queue = NULL; 760d7bcfb97SAnoob Joseph else 761d7bcfb97SAnoob Joseph queue = &(link->eventq_id); 762d7bcfb97SAnoob Joseph 763d7bcfb97SAnoob Joseph /* Link queue to port */ 764d7bcfb97SAnoob Joseph ret = rte_event_port_link(eventdev_id, link->event_port_id, 765d7bcfb97SAnoob Joseph queue, NULL, 1); 766d7bcfb97SAnoob Joseph if (ret < 0) { 767d7bcfb97SAnoob Joseph EH_LOG_ERR("Failed to link event port %d", ret); 768d7bcfb97SAnoob Joseph return ret; 769d7bcfb97SAnoob Joseph } 770d7bcfb97SAnoob Joseph } 771d7bcfb97SAnoob Joseph 772986c2c9eSNithin Dabilpuram return 0; 773986c2c9eSNithin Dabilpuram } 774986c2c9eSNithin Dabilpuram 775986c2c9eSNithin Dabilpuram static int 776986c2c9eSNithin Dabilpuram eh_start_eventdev(struct eventmode_conf *em_conf) 777986c2c9eSNithin Dabilpuram { 778986c2c9eSNithin Dabilpuram struct eventdev_params *eventdev_config; 779986c2c9eSNithin Dabilpuram int nb_eventdev = em_conf->nb_eventdev; 780986c2c9eSNithin Dabilpuram int i, ret; 781986c2c9eSNithin Dabilpuram 782e0b0e55cSAnoob Joseph /* Start event devices */ 783e0b0e55cSAnoob Joseph for (i = 0; i < nb_eventdev; i++) { 784e0b0e55cSAnoob Joseph 785e0b0e55cSAnoob Joseph /* Get eventdev config */ 786e0b0e55cSAnoob Joseph eventdev_config = &(em_conf->eventdev_config[i]); 787e0b0e55cSAnoob Joseph 788e0b0e55cSAnoob Joseph ret = rte_event_dev_start(eventdev_config->eventdev_id); 789e0b0e55cSAnoob Joseph if (ret < 0) { 790e0b0e55cSAnoob Joseph EH_LOG_ERR("Failed to start event device %d, %d", 791e0b0e55cSAnoob Joseph i, ret); 792e0b0e55cSAnoob Joseph return ret; 793e0b0e55cSAnoob Joseph } 794e0b0e55cSAnoob Joseph } 795e0b0e55cSAnoob Joseph return 0; 796e0b0e55cSAnoob Joseph } 797e0b0e55cSAnoob Joseph 79802afed59SAnoob Joseph static int 7990dbe550aSVolodymyr Fialko eh_initialize_crypto_adapter(struct eventmode_conf *em_conf) 8000dbe550aSVolodymyr Fialko { 8011d5078c6SVolodymyr Fialko struct rte_event_crypto_adapter_queue_conf queue_conf; 8020dbe550aSVolodymyr Fialko struct rte_event_dev_info evdev_default_conf = {0}; 8030dbe550aSVolodymyr Fialko struct rte_event_port_conf port_conf = {0}; 8040dbe550aSVolodymyr Fialko struct eventdev_params *eventdev_config; 8051d5078c6SVolodymyr Fialko char mp_name[RTE_MEMPOOL_NAMESIZE]; 8061d5078c6SVolodymyr Fialko const uint8_t nb_qp_per_cdev = 1; 8070dbe550aSVolodymyr Fialko uint8_t eventdev_id, cdev_id, n; 8081d5078c6SVolodymyr Fialko uint32_t cap, nb_elem; 8091d5078c6SVolodymyr Fialko int ret, socket_id; 8100dbe550aSVolodymyr Fialko 8110dbe550aSVolodymyr Fialko if (!em_conf->enable_event_crypto_adapter) 8120dbe550aSVolodymyr Fialko return 0; 8130dbe550aSVolodymyr Fialko 8140dbe550aSVolodymyr Fialko /* 8150dbe550aSVolodymyr Fialko * More then one eventdev is not supported, 8160dbe550aSVolodymyr Fialko * all event crypto adapters will be assigned to one eventdev 8170dbe550aSVolodymyr Fialko */ 8180dbe550aSVolodymyr Fialko RTE_ASSERT(em_conf->nb_eventdev == 1); 8190dbe550aSVolodymyr Fialko 8200dbe550aSVolodymyr Fialko /* Get event device configuration */ 8210dbe550aSVolodymyr Fialko eventdev_config = &(em_conf->eventdev_config[0]); 8220dbe550aSVolodymyr Fialko eventdev_id = eventdev_config->eventdev_id; 8230dbe550aSVolodymyr Fialko 8240dbe550aSVolodymyr Fialko n = rte_cryptodev_count(); 8250dbe550aSVolodymyr Fialko 8260dbe550aSVolodymyr Fialko for (cdev_id = 0; cdev_id != n; cdev_id++) { 8270dbe550aSVolodymyr Fialko /* Check event's crypto capabilities */ 8280dbe550aSVolodymyr Fialko ret = rte_event_crypto_adapter_caps_get(eventdev_id, cdev_id, &cap); 8290dbe550aSVolodymyr Fialko if (ret < 0) { 8300dbe550aSVolodymyr Fialko EH_LOG_ERR("Failed to get event device's crypto capabilities %d", ret); 8310dbe550aSVolodymyr Fialko return ret; 8320dbe550aSVolodymyr Fialko } 8330dbe550aSVolodymyr Fialko 8340dbe550aSVolodymyr Fialko if (!(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD)) { 8350dbe550aSVolodymyr Fialko EH_LOG_ERR("Event crypto adapter does not support forward mode!"); 8360dbe550aSVolodymyr Fialko return -EINVAL; 8370dbe550aSVolodymyr Fialko } 8380dbe550aSVolodymyr Fialko 8390dbe550aSVolodymyr Fialko /* Create event crypto adapter */ 8400dbe550aSVolodymyr Fialko 8410dbe550aSVolodymyr Fialko /* Get default configuration of event dev */ 8420dbe550aSVolodymyr Fialko ret = rte_event_dev_info_get(eventdev_id, &evdev_default_conf); 8430dbe550aSVolodymyr Fialko if (ret < 0) { 8440dbe550aSVolodymyr Fialko EH_LOG_ERR("Failed to get event dev info %d", ret); 8450dbe550aSVolodymyr Fialko return ret; 8460dbe550aSVolodymyr Fialko } 8470dbe550aSVolodymyr Fialko 8480dbe550aSVolodymyr Fialko /* Setup port conf */ 8490dbe550aSVolodymyr Fialko port_conf.new_event_threshold = 8500dbe550aSVolodymyr Fialko evdev_default_conf.max_num_events; 8510dbe550aSVolodymyr Fialko port_conf.dequeue_depth = 8520dbe550aSVolodymyr Fialko evdev_default_conf.max_event_port_dequeue_depth; 8530dbe550aSVolodymyr Fialko port_conf.enqueue_depth = 8540dbe550aSVolodymyr Fialko evdev_default_conf.max_event_port_enqueue_depth; 8550dbe550aSVolodymyr Fialko 8560dbe550aSVolodymyr Fialko /* Create adapter */ 8570dbe550aSVolodymyr Fialko ret = rte_event_crypto_adapter_create(cdev_id, eventdev_id, 8580dbe550aSVolodymyr Fialko &port_conf, RTE_EVENT_CRYPTO_ADAPTER_OP_FORWARD); 8590dbe550aSVolodymyr Fialko if (ret < 0) { 8600dbe550aSVolodymyr Fialko EH_LOG_ERR("Failed to create event crypto adapter %d", ret); 8610dbe550aSVolodymyr Fialko return ret; 8620dbe550aSVolodymyr Fialko } 8630dbe550aSVolodymyr Fialko 8641d5078c6SVolodymyr Fialko memset(&queue_conf, 0, sizeof(queue_conf)); 8651d5078c6SVolodymyr Fialko if ((cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_EVENT_VECTOR) && 8661d5078c6SVolodymyr Fialko (em_conf->ext_params.event_vector)) { 8671d5078c6SVolodymyr Fialko queue_conf.flags |= RTE_EVENT_CRYPTO_ADAPTER_EVENT_VECTOR; 8681d5078c6SVolodymyr Fialko queue_conf.vector_sz = em_conf->ext_params.vector_size; 8691d5078c6SVolodymyr Fialko /* 8701d5078c6SVolodymyr Fialko * Currently all sessions configured with same response 8711d5078c6SVolodymyr Fialko * info fields, so packets will be aggregated to the 8721d5078c6SVolodymyr Fialko * same vector. This allows us to configure number of 8731d5078c6SVolodymyr Fialko * vectors only to hold all queue pair descriptors. 8741d5078c6SVolodymyr Fialko */ 8751d5078c6SVolodymyr Fialko nb_elem = (qp_desc_nb / queue_conf.vector_sz) + 1; 8761d5078c6SVolodymyr Fialko nb_elem *= nb_qp_per_cdev; 8771d5078c6SVolodymyr Fialko socket_id = rte_cryptodev_socket_id(cdev_id); 8781d5078c6SVolodymyr Fialko snprintf(mp_name, RTE_MEMPOOL_NAMESIZE, 8791d5078c6SVolodymyr Fialko "QP_VEC_%u_%u", socket_id, cdev_id); 8801d5078c6SVolodymyr Fialko queue_conf.vector_mp = rte_event_vector_pool_create( 8811d5078c6SVolodymyr Fialko mp_name, nb_elem, 0, 8821d5078c6SVolodymyr Fialko queue_conf.vector_sz, socket_id); 8831d5078c6SVolodymyr Fialko if (queue_conf.vector_mp == NULL) { 8841d5078c6SVolodymyr Fialko EH_LOG_ERR("failed to create event vector pool"); 8851d5078c6SVolodymyr Fialko return -ENOMEM; 8861d5078c6SVolodymyr Fialko } 8871d5078c6SVolodymyr Fialko } 8881d5078c6SVolodymyr Fialko 8890dbe550aSVolodymyr Fialko /* Add crypto queue pairs to event crypto adapter */ 8900dbe550aSVolodymyr Fialko ret = rte_event_crypto_adapter_queue_pair_add(cdev_id, eventdev_id, 8910dbe550aSVolodymyr Fialko -1, /* adds all the pre configured queue pairs to the instance */ 8921d5078c6SVolodymyr Fialko &queue_conf); 8930dbe550aSVolodymyr Fialko if (ret < 0) { 8940dbe550aSVolodymyr Fialko EH_LOG_ERR("Failed to add queue pairs to event crypto adapter %d", ret); 8950dbe550aSVolodymyr Fialko return ret; 8960dbe550aSVolodymyr Fialko } 8970dbe550aSVolodymyr Fialko } 8980dbe550aSVolodymyr Fialko 8990dbe550aSVolodymyr Fialko return 0; 9000dbe550aSVolodymyr Fialko } 9010dbe550aSVolodymyr Fialko 9020dbe550aSVolodymyr Fialko static int 9030dbe550aSVolodymyr Fialko eh_start_crypto_adapter(struct eventmode_conf *em_conf) 9040dbe550aSVolodymyr Fialko { 9050dbe550aSVolodymyr Fialko uint8_t cdev_id, n; 9060dbe550aSVolodymyr Fialko int ret; 9070dbe550aSVolodymyr Fialko 9080dbe550aSVolodymyr Fialko if (!em_conf->enable_event_crypto_adapter) 9090dbe550aSVolodymyr Fialko return 0; 9100dbe550aSVolodymyr Fialko 9110dbe550aSVolodymyr Fialko n = rte_cryptodev_count(); 9120dbe550aSVolodymyr Fialko for (cdev_id = 0; cdev_id != n; cdev_id++) { 9130dbe550aSVolodymyr Fialko ret = rte_event_crypto_adapter_start(cdev_id); 9140dbe550aSVolodymyr Fialko if (ret < 0) { 9150dbe550aSVolodymyr Fialko EH_LOG_ERR("Failed to start event crypto device %d (%d)", 9160dbe550aSVolodymyr Fialko cdev_id, ret); 9170dbe550aSVolodymyr Fialko return ret; 9180dbe550aSVolodymyr Fialko } 9190dbe550aSVolodymyr Fialko } 9200dbe550aSVolodymyr Fialko 9210dbe550aSVolodymyr Fialko return 0; 9220dbe550aSVolodymyr Fialko } 9230dbe550aSVolodymyr Fialko 9240dbe550aSVolodymyr Fialko static int 9250dbe550aSVolodymyr Fialko eh_stop_crypto_adapter(struct eventmode_conf *em_conf) 9260dbe550aSVolodymyr Fialko { 9270dbe550aSVolodymyr Fialko uint8_t cdev_id, n; 9280dbe550aSVolodymyr Fialko int ret; 9290dbe550aSVolodymyr Fialko 9300dbe550aSVolodymyr Fialko if (!em_conf->enable_event_crypto_adapter) 9310dbe550aSVolodymyr Fialko return 0; 9320dbe550aSVolodymyr Fialko 9330dbe550aSVolodymyr Fialko n = rte_cryptodev_count(); 9340dbe550aSVolodymyr Fialko for (cdev_id = 0; cdev_id != n; cdev_id++) { 9350dbe550aSVolodymyr Fialko ret = rte_event_crypto_adapter_stop(cdev_id); 9360dbe550aSVolodymyr Fialko if (ret < 0) { 9370dbe550aSVolodymyr Fialko EH_LOG_ERR("Failed to stop event crypto device %d (%d)", 9380dbe550aSVolodymyr Fialko cdev_id, ret); 9390dbe550aSVolodymyr Fialko return ret; 9400dbe550aSVolodymyr Fialko } 9410dbe550aSVolodymyr Fialko } 9420dbe550aSVolodymyr Fialko 9430dbe550aSVolodymyr Fialko return 0; 9440dbe550aSVolodymyr Fialko } 9450dbe550aSVolodymyr Fialko 9460dbe550aSVolodymyr Fialko static int 94786738ebeSSrujana Challa eh_event_vector_limits_validate(struct eventmode_conf *em_conf, 94886738ebeSSrujana Challa uint8_t ev_dev_id, uint8_t ethdev_id) 94986738ebeSSrujana Challa { 95086738ebeSSrujana Challa struct rte_event_eth_rx_adapter_vector_limits limits = {0}; 95186738ebeSSrujana Challa uint16_t vector_size = em_conf->ext_params.vector_size; 95286738ebeSSrujana Challa int ret; 95386738ebeSSrujana Challa 95486738ebeSSrujana Challa ret = rte_event_eth_rx_adapter_vector_limits_get(ev_dev_id, ethdev_id, 95586738ebeSSrujana Challa &limits); 95686738ebeSSrujana Challa if (ret) { 95786738ebeSSrujana Challa EH_LOG_ERR("failed to get vector limits"); 95886738ebeSSrujana Challa return ret; 95986738ebeSSrujana Challa } 96086738ebeSSrujana Challa 96186738ebeSSrujana Challa if (vector_size < limits.min_sz || vector_size > limits.max_sz) { 96286738ebeSSrujana Challa EH_LOG_ERR("Vector size [%d] not within limits min[%d] max[%d]", 96386738ebeSSrujana Challa vector_size, limits.min_sz, limits.max_sz); 96486738ebeSSrujana Challa return -EINVAL; 96586738ebeSSrujana Challa } 96686738ebeSSrujana Challa 96786738ebeSSrujana Challa if (limits.log2_sz && !rte_is_power_of_2(vector_size)) { 96886738ebeSSrujana Challa EH_LOG_ERR("Vector size [%d] not power of 2", vector_size); 96986738ebeSSrujana Challa return -EINVAL; 97086738ebeSSrujana Challa } 97186738ebeSSrujana Challa 97286738ebeSSrujana Challa if (em_conf->vector_tmo_ns > limits.max_timeout_ns || 97386738ebeSSrujana Challa em_conf->vector_tmo_ns < limits.min_timeout_ns) { 97486738ebeSSrujana Challa EH_LOG_ERR("Vector timeout [%" PRIu64 97586738ebeSSrujana Challa "] not within limits max[%" PRIu64 97686738ebeSSrujana Challa "] min[%" PRIu64 "]", 97786738ebeSSrujana Challa em_conf->vector_tmo_ns, 97886738ebeSSrujana Challa limits.max_timeout_ns, 97986738ebeSSrujana Challa limits.min_timeout_ns); 98086738ebeSSrujana Challa return -EINVAL; 98186738ebeSSrujana Challa } 98286738ebeSSrujana Challa return 0; 98386738ebeSSrujana Challa } 98486738ebeSSrujana Challa 98586738ebeSSrujana Challa static int 98602afed59SAnoob Joseph eh_rx_adapter_configure(struct eventmode_conf *em_conf, 98702afed59SAnoob Joseph struct rx_adapter_conf *adapter) 98802afed59SAnoob Joseph { 98902afed59SAnoob Joseph struct rte_event_eth_rx_adapter_queue_conf queue_conf = {0}; 99002afed59SAnoob Joseph struct rte_event_dev_info evdev_default_conf = {0}; 99102afed59SAnoob Joseph struct rte_event_port_conf port_conf = {0}; 99202afed59SAnoob Joseph struct rx_adapter_connection_info *conn; 99386738ebeSSrujana Challa uint32_t service_id, socket_id, nb_elem; 99486738ebeSSrujana Challa struct rte_mempool *vector_pool = NULL; 99586738ebeSSrujana Challa uint32_t lcore_id = rte_lcore_id(); 99648a39871SNithin Dabilpuram int ret, portid, nb_ports = 0; 99702afed59SAnoob Joseph uint8_t eventdev_id; 99802afed59SAnoob Joseph int j; 99902afed59SAnoob Joseph 100002afed59SAnoob Joseph /* Get event dev ID */ 100102afed59SAnoob Joseph eventdev_id = adapter->eventdev_id; 100202afed59SAnoob Joseph 100302afed59SAnoob Joseph /* Get default configuration of event dev */ 100402afed59SAnoob Joseph ret = rte_event_dev_info_get(eventdev_id, &evdev_default_conf); 100502afed59SAnoob Joseph if (ret < 0) { 100602afed59SAnoob Joseph EH_LOG_ERR("Failed to get event dev info %d", ret); 100702afed59SAnoob Joseph return ret; 100802afed59SAnoob Joseph } 100902afed59SAnoob Joseph 101048a39871SNithin Dabilpuram RTE_ETH_FOREACH_DEV(portid) 101148a39871SNithin Dabilpuram if ((em_conf->eth_portmask & (1 << portid))) 101248a39871SNithin Dabilpuram nb_ports++; 101348a39871SNithin Dabilpuram 101486738ebeSSrujana Challa if (em_conf->ext_params.event_vector) { 101586738ebeSSrujana Challa socket_id = rte_lcore_to_socket_id(lcore_id); 101648a39871SNithin Dabilpuram 101748a39871SNithin Dabilpuram if (em_conf->vector_pool_sz) { 101848a39871SNithin Dabilpuram nb_elem = em_conf->vector_pool_sz; 101948a39871SNithin Dabilpuram } else { 102048a39871SNithin Dabilpuram nb_elem = (nb_bufs_in_pool / 102148a39871SNithin Dabilpuram em_conf->ext_params.vector_size) + 1; 102248a39871SNithin Dabilpuram if (per_port_pool) 102348a39871SNithin Dabilpuram nb_elem = nb_ports * nb_elem; 102431edfc4aSPavan Nikhilesh nb_elem = RTE_MAX(512U, nb_elem); 102548a39871SNithin Dabilpuram } 102631edfc4aSPavan Nikhilesh nb_elem += rte_lcore_count() * 32; 102786738ebeSSrujana Challa vector_pool = rte_event_vector_pool_create( 102831edfc4aSPavan Nikhilesh "vector_pool", nb_elem, 32, 102931edfc4aSPavan Nikhilesh em_conf->ext_params.vector_size, socket_id); 103086738ebeSSrujana Challa if (vector_pool == NULL) { 103186738ebeSSrujana Challa EH_LOG_ERR("failed to create event vector pool"); 103286738ebeSSrujana Challa return -ENOMEM; 103386738ebeSSrujana Challa } 103486738ebeSSrujana Challa } 103502afed59SAnoob Joseph /* Setup port conf */ 103602afed59SAnoob Joseph port_conf.new_event_threshold = 1200; 103702afed59SAnoob Joseph port_conf.dequeue_depth = 103802afed59SAnoob Joseph evdev_default_conf.max_event_port_dequeue_depth; 103902afed59SAnoob Joseph port_conf.enqueue_depth = 104002afed59SAnoob Joseph evdev_default_conf.max_event_port_enqueue_depth; 104102afed59SAnoob Joseph 104202afed59SAnoob Joseph /* Create Rx adapter */ 104302afed59SAnoob Joseph ret = rte_event_eth_rx_adapter_create(adapter->adapter_id, 104402afed59SAnoob Joseph adapter->eventdev_id, &port_conf); 104502afed59SAnoob Joseph if (ret < 0) { 104602afed59SAnoob Joseph EH_LOG_ERR("Failed to create rx adapter %d", ret); 104702afed59SAnoob Joseph return ret; 104802afed59SAnoob Joseph } 104902afed59SAnoob Joseph 105002afed59SAnoob Joseph /* Setup various connections in the adapter */ 105102afed59SAnoob Joseph for (j = 0; j < adapter->nb_connections; j++) { 105202afed59SAnoob Joseph /* Get connection */ 105302afed59SAnoob Joseph conn = &(adapter->conn[j]); 105402afed59SAnoob Joseph 105502afed59SAnoob Joseph /* Setup queue conf */ 105602afed59SAnoob Joseph queue_conf.ev.queue_id = conn->eventq_id; 105702afed59SAnoob Joseph queue_conf.ev.sched_type = em_conf->ext_params.sched_type; 105802afed59SAnoob Joseph queue_conf.ev.event_type = RTE_EVENT_TYPE_ETHDEV; 105902afed59SAnoob Joseph 106086738ebeSSrujana Challa if (em_conf->ext_params.event_vector) { 106186738ebeSSrujana Challa ret = eh_event_vector_limits_validate(em_conf, 106286738ebeSSrujana Challa eventdev_id, 106386738ebeSSrujana Challa conn->ethdev_id); 106486738ebeSSrujana Challa if (ret) 106586738ebeSSrujana Challa return ret; 106686738ebeSSrujana Challa 106786738ebeSSrujana Challa queue_conf.vector_sz = em_conf->ext_params.vector_size; 106886738ebeSSrujana Challa queue_conf.vector_timeout_ns = em_conf->vector_tmo_ns; 106986738ebeSSrujana Challa queue_conf.vector_mp = vector_pool; 107086738ebeSSrujana Challa queue_conf.rx_queue_flags = 107186738ebeSSrujana Challa RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR; 107286738ebeSSrujana Challa } 107386738ebeSSrujana Challa 107402afed59SAnoob Joseph /* Add queue to the adapter */ 107502afed59SAnoob Joseph ret = rte_event_eth_rx_adapter_queue_add(adapter->adapter_id, 107602afed59SAnoob Joseph conn->ethdev_id, conn->ethdev_rx_qid, 107702afed59SAnoob Joseph &queue_conf); 107802afed59SAnoob Joseph if (ret < 0) { 107902afed59SAnoob Joseph EH_LOG_ERR("Failed to add eth queue to rx adapter %d", 108002afed59SAnoob Joseph ret); 108102afed59SAnoob Joseph return ret; 108202afed59SAnoob Joseph } 108302afed59SAnoob Joseph } 108402afed59SAnoob Joseph 108502afed59SAnoob Joseph /* Get the service ID used by rx adapter */ 108602afed59SAnoob Joseph ret = rte_event_eth_rx_adapter_service_id_get(adapter->adapter_id, 108702afed59SAnoob Joseph &service_id); 108802afed59SAnoob Joseph if (ret != -ESRCH && ret < 0) { 108902afed59SAnoob Joseph EH_LOG_ERR("Failed to get service id used by rx adapter %d", 109002afed59SAnoob Joseph ret); 109102afed59SAnoob Joseph return ret; 109202afed59SAnoob Joseph } 109302afed59SAnoob Joseph 109402afed59SAnoob Joseph rte_service_set_runstate_mapped_check(service_id, 0); 109502afed59SAnoob Joseph 109602afed59SAnoob Joseph /* Start adapter */ 109702afed59SAnoob Joseph ret = rte_event_eth_rx_adapter_start(adapter->adapter_id); 109802afed59SAnoob Joseph if (ret < 0) { 109902afed59SAnoob Joseph EH_LOG_ERR("Failed to start rx adapter %d", ret); 110002afed59SAnoob Joseph return ret; 110102afed59SAnoob Joseph } 110202afed59SAnoob Joseph 110302afed59SAnoob Joseph return 0; 110402afed59SAnoob Joseph } 110502afed59SAnoob Joseph 110602afed59SAnoob Joseph static int 110702afed59SAnoob Joseph eh_initialize_rx_adapter(struct eventmode_conf *em_conf) 110802afed59SAnoob Joseph { 110902afed59SAnoob Joseph struct rx_adapter_conf *adapter; 111002afed59SAnoob Joseph int i, ret; 111102afed59SAnoob Joseph 111202afed59SAnoob Joseph /* Configure rx adapters */ 111302afed59SAnoob Joseph for (i = 0; i < em_conf->nb_rx_adapter; i++) { 111402afed59SAnoob Joseph adapter = &(em_conf->rx_adapter[i]); 111502afed59SAnoob Joseph ret = eh_rx_adapter_configure(em_conf, adapter); 111602afed59SAnoob Joseph if (ret < 0) { 111702afed59SAnoob Joseph EH_LOG_ERR("Failed to configure rx adapter %d", ret); 111802afed59SAnoob Joseph return ret; 111902afed59SAnoob Joseph } 112002afed59SAnoob Joseph } 112102afed59SAnoob Joseph return 0; 112202afed59SAnoob Joseph } 112302afed59SAnoob Joseph 11241bf6baacSLukasz Bartosik static int32_t 11251bf6baacSLukasz Bartosik eh_start_worker_eth_core(struct eventmode_conf *conf, uint32_t lcore_id) 11261bf6baacSLukasz Bartosik { 11271bf6baacSLukasz Bartosik uint32_t service_id[EVENT_MODE_MAX_ADAPTERS_PER_RX_CORE]; 11281bf6baacSLukasz Bartosik struct rx_adapter_conf *rx_adapter; 11291bf6baacSLukasz Bartosik struct tx_adapter_conf *tx_adapter; 11301bf6baacSLukasz Bartosik int service_count = 0; 11311bf6baacSLukasz Bartosik int adapter_id; 11321bf6baacSLukasz Bartosik int32_t ret; 11331bf6baacSLukasz Bartosik int i; 11341bf6baacSLukasz Bartosik 11351bf6baacSLukasz Bartosik EH_LOG_INFO("Entering eth_core processing on lcore %u", lcore_id); 11361bf6baacSLukasz Bartosik 11371bf6baacSLukasz Bartosik /* 11381bf6baacSLukasz Bartosik * Parse adapter config to check which of all Rx adapters need 11391bf6baacSLukasz Bartosik * to be handled by this core. 11401bf6baacSLukasz Bartosik */ 11411bf6baacSLukasz Bartosik for (i = 0; i < conf->nb_rx_adapter; i++) { 11421bf6baacSLukasz Bartosik /* Check if we have exceeded the max allowed */ 11431bf6baacSLukasz Bartosik if (service_count > EVENT_MODE_MAX_ADAPTERS_PER_RX_CORE) { 11441bf6baacSLukasz Bartosik EH_LOG_ERR( 11451bf6baacSLukasz Bartosik "Exceeded the max allowed adapters per rx core"); 11461bf6baacSLukasz Bartosik break; 11471bf6baacSLukasz Bartosik } 11481bf6baacSLukasz Bartosik 11491bf6baacSLukasz Bartosik rx_adapter = &(conf->rx_adapter[i]); 11501bf6baacSLukasz Bartosik if (rx_adapter->rx_core_id != lcore_id) 11511bf6baacSLukasz Bartosik continue; 11521bf6baacSLukasz Bartosik 11531bf6baacSLukasz Bartosik /* Adapter is handled by this core */ 11541bf6baacSLukasz Bartosik adapter_id = rx_adapter->adapter_id; 11551bf6baacSLukasz Bartosik 11561bf6baacSLukasz Bartosik /* Get the service ID for the adapters */ 11571bf6baacSLukasz Bartosik ret = rte_event_eth_rx_adapter_service_id_get(adapter_id, 11581bf6baacSLukasz Bartosik &(service_id[service_count])); 11591bf6baacSLukasz Bartosik 11601bf6baacSLukasz Bartosik if (ret != -ESRCH && ret < 0) { 11611bf6baacSLukasz Bartosik EH_LOG_ERR( 11621bf6baacSLukasz Bartosik "Failed to get service id used by rx adapter"); 11631bf6baacSLukasz Bartosik return ret; 11641bf6baacSLukasz Bartosik } 11651bf6baacSLukasz Bartosik 11661bf6baacSLukasz Bartosik /* Update service count */ 11671bf6baacSLukasz Bartosik service_count++; 11681bf6baacSLukasz Bartosik } 11691bf6baacSLukasz Bartosik 11701bf6baacSLukasz Bartosik /* 11711bf6baacSLukasz Bartosik * Parse adapter config to see which of all Tx adapters need 11721bf6baacSLukasz Bartosik * to be handled by this core. 11731bf6baacSLukasz Bartosik */ 11741bf6baacSLukasz Bartosik for (i = 0; i < conf->nb_tx_adapter; i++) { 11751bf6baacSLukasz Bartosik /* Check if we have exceeded the max allowed */ 11761bf6baacSLukasz Bartosik if (service_count > EVENT_MODE_MAX_ADAPTERS_PER_TX_CORE) { 11771bf6baacSLukasz Bartosik EH_LOG_ERR( 11781bf6baacSLukasz Bartosik "Exceeded the max allowed adapters per tx core"); 11791bf6baacSLukasz Bartosik break; 11801bf6baacSLukasz Bartosik } 11811bf6baacSLukasz Bartosik 11821bf6baacSLukasz Bartosik tx_adapter = &conf->tx_adapter[i]; 11831bf6baacSLukasz Bartosik if (tx_adapter->tx_core_id != lcore_id) 11841bf6baacSLukasz Bartosik continue; 11851bf6baacSLukasz Bartosik 11861bf6baacSLukasz Bartosik /* Adapter is handled by this core */ 11871bf6baacSLukasz Bartosik adapter_id = tx_adapter->adapter_id; 11881bf6baacSLukasz Bartosik 11891bf6baacSLukasz Bartosik /* Get the service ID for the adapters */ 11901bf6baacSLukasz Bartosik ret = rte_event_eth_tx_adapter_service_id_get(adapter_id, 11911bf6baacSLukasz Bartosik &(service_id[service_count])); 11921bf6baacSLukasz Bartosik 11931bf6baacSLukasz Bartosik if (ret != -ESRCH && ret < 0) { 11941bf6baacSLukasz Bartosik EH_LOG_ERR( 11951bf6baacSLukasz Bartosik "Failed to get service id used by tx adapter"); 11961bf6baacSLukasz Bartosik return ret; 11971bf6baacSLukasz Bartosik } 11981bf6baacSLukasz Bartosik 11991bf6baacSLukasz Bartosik /* Update service count */ 12001bf6baacSLukasz Bartosik service_count++; 12011bf6baacSLukasz Bartosik } 12021bf6baacSLukasz Bartosik 12031bf6baacSLukasz Bartosik eth_core_running = true; 12041bf6baacSLukasz Bartosik 12051bf6baacSLukasz Bartosik while (eth_core_running) { 12061bf6baacSLukasz Bartosik for (i = 0; i < service_count; i++) { 12071bf6baacSLukasz Bartosik /* Initiate adapter service */ 12081bf6baacSLukasz Bartosik rte_service_run_iter_on_app_lcore(service_id[i], 0); 12091bf6baacSLukasz Bartosik } 12101bf6baacSLukasz Bartosik } 12111bf6baacSLukasz Bartosik 12121bf6baacSLukasz Bartosik return 0; 12131bf6baacSLukasz Bartosik } 12141bf6baacSLukasz Bartosik 12151bf6baacSLukasz Bartosik static int32_t 12161bf6baacSLukasz Bartosik eh_stop_worker_eth_core(void) 12171bf6baacSLukasz Bartosik { 12181bf6baacSLukasz Bartosik if (eth_core_running) { 12191bf6baacSLukasz Bartosik EH_LOG_INFO("Stopping eth cores"); 12201bf6baacSLukasz Bartosik eth_core_running = false; 12211bf6baacSLukasz Bartosik } 12221bf6baacSLukasz Bartosik return 0; 12231bf6baacSLukasz Bartosik } 12241bf6baacSLukasz Bartosik 12251bf6baacSLukasz Bartosik static struct eh_app_worker_params * 12261bf6baacSLukasz Bartosik eh_find_worker(uint32_t lcore_id, struct eh_conf *conf, 12271bf6baacSLukasz Bartosik struct eh_app_worker_params *app_wrkrs, uint8_t nb_wrkr_param) 12281bf6baacSLukasz Bartosik { 12291bf6baacSLukasz Bartosik struct eh_app_worker_params curr_conf = { {{0} }, NULL}; 12301bf6baacSLukasz Bartosik struct eh_event_link_info *link = NULL; 12311bf6baacSLukasz Bartosik struct eh_app_worker_params *tmp_wrkr; 12321bf6baacSLukasz Bartosik struct eventmode_conf *em_conf; 12331bf6baacSLukasz Bartosik uint8_t eventdev_id; 12341bf6baacSLukasz Bartosik int i; 12351bf6baacSLukasz Bartosik 12361bf6baacSLukasz Bartosik /* Get eventmode config */ 12371bf6baacSLukasz Bartosik em_conf = conf->mode_params; 12381bf6baacSLukasz Bartosik 12391bf6baacSLukasz Bartosik /* 12401bf6baacSLukasz Bartosik * Use event device from the first lcore-event link. 12411bf6baacSLukasz Bartosik * 12421bf6baacSLukasz Bartosik * Assumption: All lcore-event links tied to a core are using the 12431bf6baacSLukasz Bartosik * same event device. In other words, one core would be polling on 12441bf6baacSLukasz Bartosik * queues of a single event device only. 12451bf6baacSLukasz Bartosik */ 12461bf6baacSLukasz Bartosik 12471bf6baacSLukasz Bartosik /* Get a link for this lcore */ 12481bf6baacSLukasz Bartosik for (i = 0; i < em_conf->nb_link; i++) { 12491bf6baacSLukasz Bartosik link = &(em_conf->link[i]); 12501bf6baacSLukasz Bartosik if (link->lcore_id == lcore_id) 12511bf6baacSLukasz Bartosik break; 12521bf6baacSLukasz Bartosik } 12531bf6baacSLukasz Bartosik 12541bf6baacSLukasz Bartosik if (link == NULL) { 12551bf6baacSLukasz Bartosik EH_LOG_ERR("No valid link found for lcore %d", lcore_id); 12561bf6baacSLukasz Bartosik return NULL; 12571bf6baacSLukasz Bartosik } 12581bf6baacSLukasz Bartosik 12591bf6baacSLukasz Bartosik /* Get event dev ID */ 12601bf6baacSLukasz Bartosik eventdev_id = link->eventdev_id; 12611bf6baacSLukasz Bartosik 12621bf6baacSLukasz Bartosik /* Populate the curr_conf with the capabilities */ 12631bf6baacSLukasz Bartosik 1264ec3cc53fSLukasz Bartosik /* Check for Tx internal port */ 1265ec3cc53fSLukasz Bartosik if (eh_dev_has_tx_internal_port(eventdev_id)) 1266ec3cc53fSLukasz Bartosik curr_conf.cap.tx_internal_port = EH_TX_TYPE_INTERNAL_PORT; 1267ec3cc53fSLukasz Bartosik else 1268ec3cc53fSLukasz Bartosik curr_conf.cap.tx_internal_port = EH_TX_TYPE_NO_INTERNAL_PORT; 1269ec3cc53fSLukasz Bartosik 12701bf6baacSLukasz Bartosik /* Check for burst mode */ 12711bf6baacSLukasz Bartosik if (eh_dev_has_burst_mode(eventdev_id)) 12721bf6baacSLukasz Bartosik curr_conf.cap.burst = EH_RX_TYPE_BURST; 12731bf6baacSLukasz Bartosik else 12741bf6baacSLukasz Bartosik curr_conf.cap.burst = EH_RX_TYPE_NON_BURST; 12751bf6baacSLukasz Bartosik 127665e3a202SLukasz Bartosik curr_conf.cap.ipsec_mode = conf->ipsec_mode; 127765e3a202SLukasz Bartosik 12781bf6baacSLukasz Bartosik /* Parse the passed list and see if we have matching capabilities */ 12791bf6baacSLukasz Bartosik 12801bf6baacSLukasz Bartosik /* Initialize the pointer used to traverse the list */ 12811bf6baacSLukasz Bartosik tmp_wrkr = app_wrkrs; 12821bf6baacSLukasz Bartosik 12831bf6baacSLukasz Bartosik for (i = 0; i < nb_wrkr_param; i++, tmp_wrkr++) { 12841bf6baacSLukasz Bartosik 12851bf6baacSLukasz Bartosik /* Skip this if capabilities are not matching */ 12861bf6baacSLukasz Bartosik if (tmp_wrkr->cap.u64 != curr_conf.cap.u64) 12871bf6baacSLukasz Bartosik continue; 12881bf6baacSLukasz Bartosik 12891bf6baacSLukasz Bartosik /* If the checks pass, we have a match */ 12901bf6baacSLukasz Bartosik return tmp_wrkr; 12911bf6baacSLukasz Bartosik } 12921bf6baacSLukasz Bartosik 12931bf6baacSLukasz Bartosik return NULL; 12941bf6baacSLukasz Bartosik } 12951bf6baacSLukasz Bartosik 12961bf6baacSLukasz Bartosik static int 12971bf6baacSLukasz Bartosik eh_verify_match_worker(struct eh_app_worker_params *match_wrkr) 12981bf6baacSLukasz Bartosik { 12991bf6baacSLukasz Bartosik /* Verify registered worker */ 13001bf6baacSLukasz Bartosik if (match_wrkr->worker_thread == NULL) { 13011bf6baacSLukasz Bartosik EH_LOG_ERR("No worker registered"); 13021bf6baacSLukasz Bartosik return 0; 13031bf6baacSLukasz Bartosik } 13041bf6baacSLukasz Bartosik 13051bf6baacSLukasz Bartosik /* Success */ 13061bf6baacSLukasz Bartosik return 1; 13071bf6baacSLukasz Bartosik } 13081bf6baacSLukasz Bartosik 13091bf6baacSLukasz Bartosik static uint8_t 13101bf6baacSLukasz Bartosik eh_get_event_lcore_links(uint32_t lcore_id, struct eh_conf *conf, 13111bf6baacSLukasz Bartosik struct eh_event_link_info **links) 13121bf6baacSLukasz Bartosik { 13131bf6baacSLukasz Bartosik struct eh_event_link_info *link_cache; 13141bf6baacSLukasz Bartosik struct eventmode_conf *em_conf = NULL; 13151bf6baacSLukasz Bartosik struct eh_event_link_info *link; 13161bf6baacSLukasz Bartosik uint8_t lcore_nb_link = 0; 13171bf6baacSLukasz Bartosik size_t single_link_size; 13181bf6baacSLukasz Bartosik size_t cache_size; 13191bf6baacSLukasz Bartosik int index = 0; 13201bf6baacSLukasz Bartosik int i; 13211bf6baacSLukasz Bartosik 13221bf6baacSLukasz Bartosik if (conf == NULL || links == NULL) { 13231bf6baacSLukasz Bartosik EH_LOG_ERR("Invalid args"); 13241bf6baacSLukasz Bartosik return -EINVAL; 13251bf6baacSLukasz Bartosik } 13261bf6baacSLukasz Bartosik 13271bf6baacSLukasz Bartosik /* Get eventmode conf */ 13281bf6baacSLukasz Bartosik em_conf = conf->mode_params; 13291bf6baacSLukasz Bartosik 13301bf6baacSLukasz Bartosik if (em_conf == NULL) { 13311bf6baacSLukasz Bartosik EH_LOG_ERR("Invalid event mode parameters"); 13321bf6baacSLukasz Bartosik return -EINVAL; 13331bf6baacSLukasz Bartosik } 13341bf6baacSLukasz Bartosik 13351bf6baacSLukasz Bartosik /* Get the number of links registered */ 13361bf6baacSLukasz Bartosik for (i = 0; i < em_conf->nb_link; i++) { 13371bf6baacSLukasz Bartosik 13381bf6baacSLukasz Bartosik /* Get link */ 13391bf6baacSLukasz Bartosik link = &(em_conf->link[i]); 13401bf6baacSLukasz Bartosik 13411bf6baacSLukasz Bartosik /* Check if we have link intended for this lcore */ 13421bf6baacSLukasz Bartosik if (link->lcore_id == lcore_id) { 13431bf6baacSLukasz Bartosik 13441bf6baacSLukasz Bartosik /* Update the number of links for this core */ 13451bf6baacSLukasz Bartosik lcore_nb_link++; 13461bf6baacSLukasz Bartosik 13471bf6baacSLukasz Bartosik } 13481bf6baacSLukasz Bartosik } 13491bf6baacSLukasz Bartosik 13501bf6baacSLukasz Bartosik /* Compute size of one entry to be copied */ 13511bf6baacSLukasz Bartosik single_link_size = sizeof(struct eh_event_link_info); 13521bf6baacSLukasz Bartosik 13531bf6baacSLukasz Bartosik /* Compute size of the buffer required */ 13541bf6baacSLukasz Bartosik cache_size = lcore_nb_link * sizeof(struct eh_event_link_info); 13551bf6baacSLukasz Bartosik 13561bf6baacSLukasz Bartosik /* Compute size of the buffer required */ 13571bf6baacSLukasz Bartosik link_cache = calloc(1, cache_size); 13581bf6baacSLukasz Bartosik 13591bf6baacSLukasz Bartosik /* Get the number of links registered */ 13601bf6baacSLukasz Bartosik for (i = 0; i < em_conf->nb_link; i++) { 13611bf6baacSLukasz Bartosik 13621bf6baacSLukasz Bartosik /* Get link */ 13631bf6baacSLukasz Bartosik link = &(em_conf->link[i]); 13641bf6baacSLukasz Bartosik 13651bf6baacSLukasz Bartosik /* Check if we have link intended for this lcore */ 13661bf6baacSLukasz Bartosik if (link->lcore_id == lcore_id) { 13671bf6baacSLukasz Bartosik 13681bf6baacSLukasz Bartosik /* Cache the link */ 13691bf6baacSLukasz Bartosik memcpy(&link_cache[index], link, single_link_size); 13701bf6baacSLukasz Bartosik 13711bf6baacSLukasz Bartosik /* Update index */ 13721bf6baacSLukasz Bartosik index++; 13731bf6baacSLukasz Bartosik } 13741bf6baacSLukasz Bartosik } 13751bf6baacSLukasz Bartosik 13761bf6baacSLukasz Bartosik /* Update the links for application to use the cached links */ 13771bf6baacSLukasz Bartosik *links = link_cache; 13781bf6baacSLukasz Bartosik 13791bf6baacSLukasz Bartosik /* Return the number of cached links */ 13801bf6baacSLukasz Bartosik return lcore_nb_link; 13811bf6baacSLukasz Bartosik } 13821bf6baacSLukasz Bartosik 13831d89ccf3SAnoob Joseph static int 13841d89ccf3SAnoob Joseph eh_tx_adapter_configure(struct eventmode_conf *em_conf, 13851d89ccf3SAnoob Joseph struct tx_adapter_conf *adapter) 13861d89ccf3SAnoob Joseph { 13871d89ccf3SAnoob Joseph struct rte_event_dev_info evdev_default_conf = {0}; 13881d89ccf3SAnoob Joseph struct rte_event_port_conf port_conf = {0}; 13891d89ccf3SAnoob Joseph struct tx_adapter_connection_info *conn; 13901d89ccf3SAnoob Joseph struct eventdev_params *eventdev_config; 13911d89ccf3SAnoob Joseph uint8_t tx_port_id = 0; 13921d89ccf3SAnoob Joseph uint8_t eventdev_id; 13931d89ccf3SAnoob Joseph uint32_t service_id; 13941d89ccf3SAnoob Joseph int ret, j; 13951d89ccf3SAnoob Joseph 13961d89ccf3SAnoob Joseph /* Get event dev ID */ 13971d89ccf3SAnoob Joseph eventdev_id = adapter->eventdev_id; 13981d89ccf3SAnoob Joseph 13991d89ccf3SAnoob Joseph /* Get event device conf */ 14001d89ccf3SAnoob Joseph eventdev_config = eh_get_eventdev_params(em_conf, eventdev_id); 14011d89ccf3SAnoob Joseph 14021d89ccf3SAnoob Joseph /* Create Tx adapter */ 14031d89ccf3SAnoob Joseph 14041d89ccf3SAnoob Joseph /* Get default configuration of event dev */ 14051d89ccf3SAnoob Joseph ret = rte_event_dev_info_get(eventdev_id, &evdev_default_conf); 14061d89ccf3SAnoob Joseph if (ret < 0) { 14071d89ccf3SAnoob Joseph EH_LOG_ERR("Failed to get event dev info %d", ret); 14081d89ccf3SAnoob Joseph return ret; 14091d89ccf3SAnoob Joseph } 14101d89ccf3SAnoob Joseph 14111d89ccf3SAnoob Joseph /* Setup port conf */ 14121d89ccf3SAnoob Joseph port_conf.new_event_threshold = 14131d89ccf3SAnoob Joseph evdev_default_conf.max_num_events; 14141d89ccf3SAnoob Joseph port_conf.dequeue_depth = 14151d89ccf3SAnoob Joseph evdev_default_conf.max_event_port_dequeue_depth; 14161d89ccf3SAnoob Joseph port_conf.enqueue_depth = 14171d89ccf3SAnoob Joseph evdev_default_conf.max_event_port_enqueue_depth; 14181d89ccf3SAnoob Joseph 14191d89ccf3SAnoob Joseph /* Create adapter */ 14201d89ccf3SAnoob Joseph ret = rte_event_eth_tx_adapter_create(adapter->adapter_id, 14211d89ccf3SAnoob Joseph adapter->eventdev_id, &port_conf); 14221d89ccf3SAnoob Joseph if (ret < 0) { 14231d89ccf3SAnoob Joseph EH_LOG_ERR("Failed to create tx adapter %d", ret); 14241d89ccf3SAnoob Joseph return ret; 14251d89ccf3SAnoob Joseph } 14261d89ccf3SAnoob Joseph 14271d89ccf3SAnoob Joseph /* Setup various connections in the adapter */ 14281d89ccf3SAnoob Joseph for (j = 0; j < adapter->nb_connections; j++) { 14291d89ccf3SAnoob Joseph 14301d89ccf3SAnoob Joseph /* Get connection */ 14311d89ccf3SAnoob Joseph conn = &(adapter->conn[j]); 14321d89ccf3SAnoob Joseph 14331d89ccf3SAnoob Joseph /* Add queue to the adapter */ 14341d89ccf3SAnoob Joseph ret = rte_event_eth_tx_adapter_queue_add(adapter->adapter_id, 14351d89ccf3SAnoob Joseph conn->ethdev_id, conn->ethdev_tx_qid); 14361d89ccf3SAnoob Joseph if (ret < 0) { 14371d89ccf3SAnoob Joseph EH_LOG_ERR("Failed to add eth queue to tx adapter %d", 14381d89ccf3SAnoob Joseph ret); 14391d89ccf3SAnoob Joseph return ret; 14401d89ccf3SAnoob Joseph } 14411d89ccf3SAnoob Joseph } 14421d89ccf3SAnoob Joseph 1443ec3cc53fSLukasz Bartosik /* 1444ec3cc53fSLukasz Bartosik * Check if Tx core is assigned. If Tx core is not assigned then 1445ec3cc53fSLukasz Bartosik * the adapter has internal port for submitting Tx packets and 1446ec3cc53fSLukasz Bartosik * Tx event queue & port setup is not required 1447ec3cc53fSLukasz Bartosik */ 1448ec3cc53fSLukasz Bartosik if (adapter->tx_core_id == (uint32_t) (-1)) { 1449ec3cc53fSLukasz Bartosik /* Internal port is present */ 1450ec3cc53fSLukasz Bartosik goto skip_tx_queue_port_setup; 1451ec3cc53fSLukasz Bartosik } 1452ec3cc53fSLukasz Bartosik 14531d89ccf3SAnoob Joseph /* Setup Tx queue & port */ 14541d89ccf3SAnoob Joseph 14551d89ccf3SAnoob Joseph /* Get event port used by the adapter */ 14561d89ccf3SAnoob Joseph ret = rte_event_eth_tx_adapter_event_port_get( 14571d89ccf3SAnoob Joseph adapter->adapter_id, &tx_port_id); 14581d89ccf3SAnoob Joseph if (ret) { 14591d89ccf3SAnoob Joseph EH_LOG_ERR("Failed to get tx adapter port id %d", ret); 14601d89ccf3SAnoob Joseph return ret; 14611d89ccf3SAnoob Joseph } 14621d89ccf3SAnoob Joseph 14631d89ccf3SAnoob Joseph /* 14641d89ccf3SAnoob Joseph * Tx event queue is reserved for Tx adapter. Unlink this queue 14651d89ccf3SAnoob Joseph * from all other ports 14661d89ccf3SAnoob Joseph * 14671d89ccf3SAnoob Joseph */ 14681d89ccf3SAnoob Joseph for (j = 0; j < eventdev_config->nb_eventport; j++) { 14691d89ccf3SAnoob Joseph rte_event_port_unlink(eventdev_id, j, 14701d89ccf3SAnoob Joseph &(adapter->tx_ev_queue), 1); 14711d89ccf3SAnoob Joseph } 14721d89ccf3SAnoob Joseph 14731d89ccf3SAnoob Joseph /* Link Tx event queue to Tx port */ 14741d89ccf3SAnoob Joseph ret = rte_event_port_link(eventdev_id, tx_port_id, 14751d89ccf3SAnoob Joseph &(adapter->tx_ev_queue), NULL, 1); 14761d89ccf3SAnoob Joseph if (ret != 1) { 14771d89ccf3SAnoob Joseph EH_LOG_ERR("Failed to link event queue to port"); 14781d89ccf3SAnoob Joseph return ret; 14791d89ccf3SAnoob Joseph } 14801d89ccf3SAnoob Joseph 14811d89ccf3SAnoob Joseph /* Get the service ID used by Tx adapter */ 14821d89ccf3SAnoob Joseph ret = rte_event_eth_tx_adapter_service_id_get(adapter->adapter_id, 14831d89ccf3SAnoob Joseph &service_id); 14841d89ccf3SAnoob Joseph if (ret != -ESRCH && ret < 0) { 14851d89ccf3SAnoob Joseph EH_LOG_ERR("Failed to get service id used by tx adapter %d", 14861d89ccf3SAnoob Joseph ret); 14871d89ccf3SAnoob Joseph return ret; 14881d89ccf3SAnoob Joseph } 14891d89ccf3SAnoob Joseph 14901d89ccf3SAnoob Joseph rte_service_set_runstate_mapped_check(service_id, 0); 14911d89ccf3SAnoob Joseph 1492ec3cc53fSLukasz Bartosik skip_tx_queue_port_setup: 14931d89ccf3SAnoob Joseph /* Start adapter */ 14941d89ccf3SAnoob Joseph ret = rte_event_eth_tx_adapter_start(adapter->adapter_id); 14951d89ccf3SAnoob Joseph if (ret < 0) { 14961d89ccf3SAnoob Joseph EH_LOG_ERR("Failed to start tx adapter %d", ret); 14971d89ccf3SAnoob Joseph return ret; 14981d89ccf3SAnoob Joseph } 14991d89ccf3SAnoob Joseph 15001d89ccf3SAnoob Joseph return 0; 15011d89ccf3SAnoob Joseph } 15021d89ccf3SAnoob Joseph 15031d89ccf3SAnoob Joseph static int 15041d89ccf3SAnoob Joseph eh_initialize_tx_adapter(struct eventmode_conf *em_conf) 15051d89ccf3SAnoob Joseph { 15061d89ccf3SAnoob Joseph struct tx_adapter_conf *adapter; 15071d89ccf3SAnoob Joseph int i, ret; 15081d89ccf3SAnoob Joseph 15091d89ccf3SAnoob Joseph /* Configure Tx adapters */ 15101d89ccf3SAnoob Joseph for (i = 0; i < em_conf->nb_tx_adapter; i++) { 15111d89ccf3SAnoob Joseph adapter = &(em_conf->tx_adapter[i]); 15121d89ccf3SAnoob Joseph ret = eh_tx_adapter_configure(em_conf, adapter); 15131d89ccf3SAnoob Joseph if (ret < 0) { 15141d89ccf3SAnoob Joseph EH_LOG_ERR("Failed to configure tx adapter %d", ret); 15151d89ccf3SAnoob Joseph return ret; 15161d89ccf3SAnoob Joseph } 15171d89ccf3SAnoob Joseph } 15181d89ccf3SAnoob Joseph return 0; 15191d89ccf3SAnoob Joseph } 15201d89ccf3SAnoob Joseph 15214ce38479SAnoob Joseph static void 15224ce38479SAnoob Joseph eh_display_operating_mode(struct eventmode_conf *em_conf) 15234ce38479SAnoob Joseph { 15244ce38479SAnoob Joseph char sched_types[][32] = { 15254ce38479SAnoob Joseph "RTE_SCHED_TYPE_ORDERED", 15264ce38479SAnoob Joseph "RTE_SCHED_TYPE_ATOMIC", 15274ce38479SAnoob Joseph "RTE_SCHED_TYPE_PARALLEL", 15284ce38479SAnoob Joseph }; 15294ce38479SAnoob Joseph EH_LOG_INFO("Operating mode:"); 15304ce38479SAnoob Joseph 15314ce38479SAnoob Joseph EH_LOG_INFO("\tScheduling type: \t%s", 15324ce38479SAnoob Joseph sched_types[em_conf->ext_params.sched_type]); 15334ce38479SAnoob Joseph 15344ce38479SAnoob Joseph EH_LOG_INFO(""); 15354ce38479SAnoob Joseph } 15364ce38479SAnoob Joseph 15374ce38479SAnoob Joseph static void 15384ce38479SAnoob Joseph eh_display_event_dev_conf(struct eventmode_conf *em_conf) 15394ce38479SAnoob Joseph { 15404ce38479SAnoob Joseph char queue_mode[][32] = { 15414ce38479SAnoob Joseph "", 15424ce38479SAnoob Joseph "ATQ (ALL TYPE QUEUE)", 15434ce38479SAnoob Joseph "SINGLE LINK", 15444ce38479SAnoob Joseph }; 15454ce38479SAnoob Joseph char print_buf[256] = { 0 }; 15464ce38479SAnoob Joseph int i; 15474ce38479SAnoob Joseph 15484ce38479SAnoob Joseph EH_LOG_INFO("Event Device Configuration:"); 15494ce38479SAnoob Joseph 15504ce38479SAnoob Joseph for (i = 0; i < em_conf->nb_eventdev; i++) { 15514ce38479SAnoob Joseph sprintf(print_buf, 15524ce38479SAnoob Joseph "\tDev ID: %-2d \tQueues: %-2d \tPorts: %-2d", 15534ce38479SAnoob Joseph em_conf->eventdev_config[i].eventdev_id, 15544ce38479SAnoob Joseph em_conf->eventdev_config[i].nb_eventqueue, 15554ce38479SAnoob Joseph em_conf->eventdev_config[i].nb_eventport); 15564ce38479SAnoob Joseph sprintf(print_buf + strlen(print_buf), 15574ce38479SAnoob Joseph "\tQueue mode: %s", 15584ce38479SAnoob Joseph queue_mode[em_conf->eventdev_config[i].ev_queue_mode]); 15594ce38479SAnoob Joseph EH_LOG_INFO("%s", print_buf); 15604ce38479SAnoob Joseph } 15614ce38479SAnoob Joseph EH_LOG_INFO(""); 15624ce38479SAnoob Joseph } 15634ce38479SAnoob Joseph 15644ce38479SAnoob Joseph static void 15654ce38479SAnoob Joseph eh_display_rx_adapter_conf(struct eventmode_conf *em_conf) 15664ce38479SAnoob Joseph { 15674ce38479SAnoob Joseph int nb_rx_adapter = em_conf->nb_rx_adapter; 15684ce38479SAnoob Joseph struct rx_adapter_connection_info *conn; 15694ce38479SAnoob Joseph struct rx_adapter_conf *adapter; 15704ce38479SAnoob Joseph char print_buf[256] = { 0 }; 15714ce38479SAnoob Joseph int i, j; 15724ce38479SAnoob Joseph 15734ce38479SAnoob Joseph EH_LOG_INFO("Rx adapters configured: %d", nb_rx_adapter); 15744ce38479SAnoob Joseph 15754ce38479SAnoob Joseph for (i = 0; i < nb_rx_adapter; i++) { 15764ce38479SAnoob Joseph adapter = &(em_conf->rx_adapter[i]); 1577ec3cc53fSLukasz Bartosik sprintf(print_buf, 15787be78d02SJosh Soref "\tRx adapter ID: %-2d\tConnections: %-2d\tEvent dev ID: %-2d", 15794ce38479SAnoob Joseph adapter->adapter_id, 15804ce38479SAnoob Joseph adapter->nb_connections, 1581ec3cc53fSLukasz Bartosik adapter->eventdev_id); 1582ec3cc53fSLukasz Bartosik if (adapter->rx_core_id == (uint32_t)-1) 1583ec3cc53fSLukasz Bartosik sprintf(print_buf + strlen(print_buf), 1584ec3cc53fSLukasz Bartosik "\tRx core: %-2s", "[INTERNAL PORT]"); 1585ec3cc53fSLukasz Bartosik else if (adapter->rx_core_id == RTE_MAX_LCORE) 1586ec3cc53fSLukasz Bartosik sprintf(print_buf + strlen(print_buf), 1587ec3cc53fSLukasz Bartosik "\tRx core: %-2s", "[NONE]"); 1588ec3cc53fSLukasz Bartosik else 1589ec3cc53fSLukasz Bartosik sprintf(print_buf + strlen(print_buf), 1590ec3cc53fSLukasz Bartosik "\tRx core: %-2d", adapter->rx_core_id); 1591ec3cc53fSLukasz Bartosik 1592ec3cc53fSLukasz Bartosik EH_LOG_INFO("%s", print_buf); 15934ce38479SAnoob Joseph 15944ce38479SAnoob Joseph for (j = 0; j < adapter->nb_connections; j++) { 15954ce38479SAnoob Joseph conn = &(adapter->conn[j]); 15964ce38479SAnoob Joseph 15974ce38479SAnoob Joseph sprintf(print_buf, 15984ce38479SAnoob Joseph "\t\tEthdev ID: %-2d", conn->ethdev_id); 15994ce38479SAnoob Joseph 16004ce38479SAnoob Joseph if (conn->ethdev_rx_qid == -1) 16014ce38479SAnoob Joseph sprintf(print_buf + strlen(print_buf), 16024ce38479SAnoob Joseph "\tEth rx queue: %-2s", "ALL"); 16034ce38479SAnoob Joseph else 16044ce38479SAnoob Joseph sprintf(print_buf + strlen(print_buf), 16054ce38479SAnoob Joseph "\tEth rx queue: %-2d", 16064ce38479SAnoob Joseph conn->ethdev_rx_qid); 16074ce38479SAnoob Joseph 16084ce38479SAnoob Joseph sprintf(print_buf + strlen(print_buf), 16094ce38479SAnoob Joseph "\tEvent queue: %-2d", conn->eventq_id); 16104ce38479SAnoob Joseph EH_LOG_INFO("%s", print_buf); 16114ce38479SAnoob Joseph } 16124ce38479SAnoob Joseph } 16134ce38479SAnoob Joseph EH_LOG_INFO(""); 16144ce38479SAnoob Joseph } 16154ce38479SAnoob Joseph 16164ce38479SAnoob Joseph static void 16174ce38479SAnoob Joseph eh_display_tx_adapter_conf(struct eventmode_conf *em_conf) 16184ce38479SAnoob Joseph { 16194ce38479SAnoob Joseph int nb_tx_adapter = em_conf->nb_tx_adapter; 16204ce38479SAnoob Joseph struct tx_adapter_connection_info *conn; 16214ce38479SAnoob Joseph struct tx_adapter_conf *adapter; 16224ce38479SAnoob Joseph char print_buf[256] = { 0 }; 16234ce38479SAnoob Joseph int i, j; 16244ce38479SAnoob Joseph 16254ce38479SAnoob Joseph EH_LOG_INFO("Tx adapters configured: %d", nb_tx_adapter); 16264ce38479SAnoob Joseph 16274ce38479SAnoob Joseph for (i = 0; i < nb_tx_adapter; i++) { 16284ce38479SAnoob Joseph adapter = &(em_conf->tx_adapter[i]); 16294ce38479SAnoob Joseph sprintf(print_buf, 16304ce38479SAnoob Joseph "\tTx adapter ID: %-2d\tConnections: %-2d\tEvent dev ID: %-2d", 16314ce38479SAnoob Joseph adapter->adapter_id, 16324ce38479SAnoob Joseph adapter->nb_connections, 16334ce38479SAnoob Joseph adapter->eventdev_id); 16344ce38479SAnoob Joseph if (adapter->tx_core_id == (uint32_t)-1) 16354ce38479SAnoob Joseph sprintf(print_buf + strlen(print_buf), 16364ce38479SAnoob Joseph "\tTx core: %-2s", "[INTERNAL PORT]"); 16374ce38479SAnoob Joseph else if (adapter->tx_core_id == RTE_MAX_LCORE) 16384ce38479SAnoob Joseph sprintf(print_buf + strlen(print_buf), 16394ce38479SAnoob Joseph "\tTx core: %-2s", "[NONE]"); 16404ce38479SAnoob Joseph else 16414ce38479SAnoob Joseph sprintf(print_buf + strlen(print_buf), 16424ce38479SAnoob Joseph "\tTx core: %-2d,\tInput event queue: %-2d", 16434ce38479SAnoob Joseph adapter->tx_core_id, adapter->tx_ev_queue); 16444ce38479SAnoob Joseph 16454ce38479SAnoob Joseph EH_LOG_INFO("%s", print_buf); 16464ce38479SAnoob Joseph 16474ce38479SAnoob Joseph for (j = 0; j < adapter->nb_connections; j++) { 16484ce38479SAnoob Joseph conn = &(adapter->conn[j]); 16494ce38479SAnoob Joseph 16504ce38479SAnoob Joseph sprintf(print_buf, 16514ce38479SAnoob Joseph "\t\tEthdev ID: %-2d", conn->ethdev_id); 16524ce38479SAnoob Joseph 16534ce38479SAnoob Joseph if (conn->ethdev_tx_qid == -1) 16544ce38479SAnoob Joseph sprintf(print_buf + strlen(print_buf), 16554ce38479SAnoob Joseph "\tEth tx queue: %-2s", "ALL"); 16564ce38479SAnoob Joseph else 16574ce38479SAnoob Joseph sprintf(print_buf + strlen(print_buf), 16584ce38479SAnoob Joseph "\tEth tx queue: %-2d", 16594ce38479SAnoob Joseph conn->ethdev_tx_qid); 16604ce38479SAnoob Joseph EH_LOG_INFO("%s", print_buf); 16614ce38479SAnoob Joseph } 16624ce38479SAnoob Joseph } 16634ce38479SAnoob Joseph EH_LOG_INFO(""); 16644ce38479SAnoob Joseph } 16654ce38479SAnoob Joseph 16664ce38479SAnoob Joseph static void 16674ce38479SAnoob Joseph eh_display_link_conf(struct eventmode_conf *em_conf) 16684ce38479SAnoob Joseph { 16694ce38479SAnoob Joseph struct eh_event_link_info *link; 16704ce38479SAnoob Joseph char print_buf[256] = { 0 }; 16714ce38479SAnoob Joseph int i; 16724ce38479SAnoob Joseph 16734ce38479SAnoob Joseph EH_LOG_INFO("Links configured: %d", em_conf->nb_link); 16744ce38479SAnoob Joseph 16754ce38479SAnoob Joseph for (i = 0; i < em_conf->nb_link; i++) { 16764ce38479SAnoob Joseph link = &(em_conf->link[i]); 16774ce38479SAnoob Joseph 16784ce38479SAnoob Joseph sprintf(print_buf, 16794ce38479SAnoob Joseph "\tEvent dev ID: %-2d\tEvent port: %-2d", 16804ce38479SAnoob Joseph link->eventdev_id, 16814ce38479SAnoob Joseph link->event_port_id); 16824ce38479SAnoob Joseph 16834ce38479SAnoob Joseph if (em_conf->ext_params.all_ev_queue_to_ev_port) 16844ce38479SAnoob Joseph sprintf(print_buf + strlen(print_buf), 16854ce38479SAnoob Joseph "Event queue: %-2s\t", "ALL"); 16864ce38479SAnoob Joseph else 16874ce38479SAnoob Joseph sprintf(print_buf + strlen(print_buf), 16884ce38479SAnoob Joseph "Event queue: %-2d\t", link->eventq_id); 16894ce38479SAnoob Joseph 16904ce38479SAnoob Joseph sprintf(print_buf + strlen(print_buf), 16914ce38479SAnoob Joseph "Lcore: %-2d", link->lcore_id); 16924ce38479SAnoob Joseph EH_LOG_INFO("%s", print_buf); 16934ce38479SAnoob Joseph } 16944ce38479SAnoob Joseph EH_LOG_INFO(""); 16954ce38479SAnoob Joseph } 16964ce38479SAnoob Joseph 1697bc33e9c7SLukasz Bartosik struct eh_conf * 1698bc33e9c7SLukasz Bartosik eh_conf_init(void) 1699bc33e9c7SLukasz Bartosik { 1700bc33e9c7SLukasz Bartosik struct eventmode_conf *em_conf = NULL; 1701bc33e9c7SLukasz Bartosik struct eh_conf *conf = NULL; 1702bc33e9c7SLukasz Bartosik unsigned int eth_core_id; 1703bc33e9c7SLukasz Bartosik void *bitmap = NULL; 1704bc33e9c7SLukasz Bartosik uint32_t nb_bytes; 1705bc33e9c7SLukasz Bartosik 1706bc33e9c7SLukasz Bartosik /* Allocate memory for config */ 1707bc33e9c7SLukasz Bartosik conf = calloc(1, sizeof(struct eh_conf)); 1708bc33e9c7SLukasz Bartosik if (conf == NULL) { 1709bc33e9c7SLukasz Bartosik EH_LOG_ERR("Failed to allocate memory for eventmode helper " 1710bc33e9c7SLukasz Bartosik "config"); 1711bc33e9c7SLukasz Bartosik return NULL; 1712bc33e9c7SLukasz Bartosik } 1713bc33e9c7SLukasz Bartosik 1714bc33e9c7SLukasz Bartosik /* Set default conf */ 1715bc33e9c7SLukasz Bartosik 1716bc33e9c7SLukasz Bartosik /* Packet transfer mode: poll */ 1717bc33e9c7SLukasz Bartosik conf->mode = EH_PKT_TRANSFER_MODE_POLL; 171865e3a202SLukasz Bartosik conf->ipsec_mode = EH_IPSEC_MODE_TYPE_APP; 1719bc33e9c7SLukasz Bartosik 1720bc33e9c7SLukasz Bartosik /* Keep all ethernet ports enabled by default */ 1721bc33e9c7SLukasz Bartosik conf->eth_portmask = -1; 1722bc33e9c7SLukasz Bartosik 1723bc33e9c7SLukasz Bartosik /* Allocate memory for event mode params */ 1724bc33e9c7SLukasz Bartosik conf->mode_params = calloc(1, sizeof(struct eventmode_conf)); 1725bc33e9c7SLukasz Bartosik if (conf->mode_params == NULL) { 1726bc33e9c7SLukasz Bartosik EH_LOG_ERR("Failed to allocate memory for event mode params"); 1727bc33e9c7SLukasz Bartosik goto free_conf; 1728bc33e9c7SLukasz Bartosik } 1729bc33e9c7SLukasz Bartosik 1730bc33e9c7SLukasz Bartosik /* Get eventmode conf */ 1731bc33e9c7SLukasz Bartosik em_conf = conf->mode_params; 1732bc33e9c7SLukasz Bartosik 1733bc33e9c7SLukasz Bartosik /* Allocate and initialize bitmap for eth cores */ 1734bc33e9c7SLukasz Bartosik nb_bytes = rte_bitmap_get_memory_footprint(RTE_MAX_LCORE); 1735bc33e9c7SLukasz Bartosik if (!nb_bytes) { 1736bc33e9c7SLukasz Bartosik EH_LOG_ERR("Failed to get bitmap footprint"); 1737bc33e9c7SLukasz Bartosik goto free_em_conf; 1738bc33e9c7SLukasz Bartosik } 1739bc33e9c7SLukasz Bartosik 1740bc33e9c7SLukasz Bartosik bitmap = rte_zmalloc("event-helper-ethcore-bitmap", nb_bytes, 1741bc33e9c7SLukasz Bartosik RTE_CACHE_LINE_SIZE); 1742bc33e9c7SLukasz Bartosik if (!bitmap) { 1743bc33e9c7SLukasz Bartosik EH_LOG_ERR("Failed to allocate memory for eth cores bitmap\n"); 1744bc33e9c7SLukasz Bartosik goto free_em_conf; 1745bc33e9c7SLukasz Bartosik } 1746bc33e9c7SLukasz Bartosik 1747bc33e9c7SLukasz Bartosik em_conf->eth_core_mask = rte_bitmap_init(RTE_MAX_LCORE, bitmap, 1748bc33e9c7SLukasz Bartosik nb_bytes); 1749bc33e9c7SLukasz Bartosik if (!em_conf->eth_core_mask) { 1750bc33e9c7SLukasz Bartosik EH_LOG_ERR("Failed to initialize bitmap"); 1751bc33e9c7SLukasz Bartosik goto free_bitmap; 1752bc33e9c7SLukasz Bartosik } 1753bc33e9c7SLukasz Bartosik 1754bc33e9c7SLukasz Bartosik /* Set schedule type as not set */ 1755bc33e9c7SLukasz Bartosik em_conf->ext_params.sched_type = SCHED_TYPE_NOT_SET; 1756bc33e9c7SLukasz Bartosik 1757bc33e9c7SLukasz Bartosik /* Set two cores as eth cores for Rx & Tx */ 1758bc33e9c7SLukasz Bartosik 1759cb056611SStephen Hemminger /* Use first core other than main core as Rx core */ 1760bc33e9c7SLukasz Bartosik eth_core_id = rte_get_next_lcore(0, /* curr core */ 1761cb056611SStephen Hemminger 1, /* skip main core */ 1762bc33e9c7SLukasz Bartosik 0 /* wrap */); 1763bc33e9c7SLukasz Bartosik 1764bc33e9c7SLukasz Bartosik rte_bitmap_set(em_conf->eth_core_mask, eth_core_id); 1765bc33e9c7SLukasz Bartosik 1766bc33e9c7SLukasz Bartosik /* Use next core as Tx core */ 1767bc33e9c7SLukasz Bartosik eth_core_id = rte_get_next_lcore(eth_core_id, /* curr core */ 1768cb056611SStephen Hemminger 1, /* skip main core */ 1769bc33e9c7SLukasz Bartosik 0 /* wrap */); 1770bc33e9c7SLukasz Bartosik 1771bc33e9c7SLukasz Bartosik rte_bitmap_set(em_conf->eth_core_mask, eth_core_id); 1772bc33e9c7SLukasz Bartosik 177386738ebeSSrujana Challa em_conf->ext_params.vector_size = DEFAULT_VECTOR_SIZE; 177486738ebeSSrujana Challa em_conf->vector_tmo_ns = DEFAULT_VECTOR_TMO; 177586738ebeSSrujana Challa 1776bc33e9c7SLukasz Bartosik return conf; 1777bc33e9c7SLukasz Bartosik 1778bc33e9c7SLukasz Bartosik free_bitmap: 1779bc33e9c7SLukasz Bartosik rte_free(bitmap); 1780bc33e9c7SLukasz Bartosik free_em_conf: 1781bc33e9c7SLukasz Bartosik free(em_conf); 1782bc33e9c7SLukasz Bartosik free_conf: 1783bc33e9c7SLukasz Bartosik free(conf); 1784bc33e9c7SLukasz Bartosik return NULL; 1785bc33e9c7SLukasz Bartosik } 1786bc33e9c7SLukasz Bartosik 1787bc33e9c7SLukasz Bartosik void 1788bc33e9c7SLukasz Bartosik eh_conf_uninit(struct eh_conf *conf) 1789bc33e9c7SLukasz Bartosik { 1790bc33e9c7SLukasz Bartosik struct eventmode_conf *em_conf = NULL; 1791bc33e9c7SLukasz Bartosik 1792bc33e9c7SLukasz Bartosik if (!conf || !conf->mode_params) 1793bc33e9c7SLukasz Bartosik return; 1794bc33e9c7SLukasz Bartosik 1795bc33e9c7SLukasz Bartosik /* Get eventmode conf */ 1796bc33e9c7SLukasz Bartosik em_conf = conf->mode_params; 1797bc33e9c7SLukasz Bartosik 1798bc33e9c7SLukasz Bartosik /* Free evenmode configuration memory */ 1799bc33e9c7SLukasz Bartosik rte_free(em_conf->eth_core_mask); 1800bc33e9c7SLukasz Bartosik free(em_conf); 1801bc33e9c7SLukasz Bartosik free(conf); 1802bc33e9c7SLukasz Bartosik } 1803bc33e9c7SLukasz Bartosik 18044ce38479SAnoob Joseph void 18054ce38479SAnoob Joseph eh_display_conf(struct eh_conf *conf) 18064ce38479SAnoob Joseph { 18074ce38479SAnoob Joseph struct eventmode_conf *em_conf; 18084ce38479SAnoob Joseph 18094ce38479SAnoob Joseph if (conf == NULL) { 18104ce38479SAnoob Joseph EH_LOG_ERR("Invalid event helper configuration"); 18114ce38479SAnoob Joseph return; 18124ce38479SAnoob Joseph } 18134ce38479SAnoob Joseph 18144ce38479SAnoob Joseph if (conf->mode != EH_PKT_TRANSFER_MODE_EVENT) 18154ce38479SAnoob Joseph return; 18164ce38479SAnoob Joseph 18174ce38479SAnoob Joseph if (conf->mode_params == NULL) { 18184ce38479SAnoob Joseph EH_LOG_ERR("Invalid event mode parameters"); 18194ce38479SAnoob Joseph return; 18204ce38479SAnoob Joseph } 18214ce38479SAnoob Joseph 18224ce38479SAnoob Joseph /* Get eventmode conf */ 18234ce38479SAnoob Joseph em_conf = (struct eventmode_conf *)(conf->mode_params); 18244ce38479SAnoob Joseph 18254ce38479SAnoob Joseph /* Display user exposed operating modes */ 18264ce38479SAnoob Joseph eh_display_operating_mode(em_conf); 18274ce38479SAnoob Joseph 18284ce38479SAnoob Joseph /* Display event device conf */ 18294ce38479SAnoob Joseph eh_display_event_dev_conf(em_conf); 18304ce38479SAnoob Joseph 18314ce38479SAnoob Joseph /* Display Rx adapter conf */ 18324ce38479SAnoob Joseph eh_display_rx_adapter_conf(em_conf); 18334ce38479SAnoob Joseph 18344ce38479SAnoob Joseph /* Display Tx adapter conf */ 18354ce38479SAnoob Joseph eh_display_tx_adapter_conf(em_conf); 18364ce38479SAnoob Joseph 18374ce38479SAnoob Joseph /* Display event-lcore link */ 18384ce38479SAnoob Joseph eh_display_link_conf(em_conf); 18394ce38479SAnoob Joseph } 18404ce38479SAnoob Joseph 1841e0b0e55cSAnoob Joseph int32_t 1842e0b0e55cSAnoob Joseph eh_devs_init(struct eh_conf *conf) 1843e0b0e55cSAnoob Joseph { 1844e0b0e55cSAnoob Joseph struct eventmode_conf *em_conf; 1845e0b0e55cSAnoob Joseph uint16_t port_id; 1846e0b0e55cSAnoob Joseph int ret; 1847e0b0e55cSAnoob Joseph 1848e0b0e55cSAnoob Joseph if (conf == NULL) { 1849e0b0e55cSAnoob Joseph EH_LOG_ERR("Invalid event helper configuration"); 1850e0b0e55cSAnoob Joseph return -EINVAL; 1851e0b0e55cSAnoob Joseph } 1852e0b0e55cSAnoob Joseph 1853e0b0e55cSAnoob Joseph if (conf->mode != EH_PKT_TRANSFER_MODE_EVENT) 1854e0b0e55cSAnoob Joseph return 0; 1855e0b0e55cSAnoob Joseph 1856e0b0e55cSAnoob Joseph if (conf->mode_params == NULL) { 1857e0b0e55cSAnoob Joseph EH_LOG_ERR("Invalid event mode parameters"); 1858e0b0e55cSAnoob Joseph return -EINVAL; 1859e0b0e55cSAnoob Joseph } 1860e0b0e55cSAnoob Joseph 1861e0b0e55cSAnoob Joseph /* Get eventmode conf */ 1862e0b0e55cSAnoob Joseph em_conf = conf->mode_params; 1863e0b0e55cSAnoob Joseph 186402afed59SAnoob Joseph /* Eventmode conf would need eth portmask */ 186502afed59SAnoob Joseph em_conf->eth_portmask = conf->eth_portmask; 186602afed59SAnoob Joseph 1867e0b0e55cSAnoob Joseph /* Validate the requested config */ 1868e0b0e55cSAnoob Joseph ret = eh_validate_conf(em_conf); 1869e0b0e55cSAnoob Joseph if (ret < 0) { 1870e0b0e55cSAnoob Joseph EH_LOG_ERR("Failed to validate the requested config %d", ret); 1871e0b0e55cSAnoob Joseph return ret; 1872e0b0e55cSAnoob Joseph } 1873e0b0e55cSAnoob Joseph 18744ce38479SAnoob Joseph /* Display the current configuration */ 18754ce38479SAnoob Joseph eh_display_conf(conf); 18764ce38479SAnoob Joseph 1877e0b0e55cSAnoob Joseph /* Stop eth devices before setting up adapter */ 1878e0b0e55cSAnoob Joseph RTE_ETH_FOREACH_DEV(port_id) { 1879e0b0e55cSAnoob Joseph 1880e0b0e55cSAnoob Joseph /* Use only the ports enabled */ 1881e0b0e55cSAnoob Joseph if ((conf->eth_portmask & (1 << port_id)) == 0) 1882e0b0e55cSAnoob Joseph continue; 1883e0b0e55cSAnoob Joseph 1884b55efbabSIvan Ilchenko ret = rte_eth_dev_stop(port_id); 1885b55efbabSIvan Ilchenko if (ret != 0) { 1886b55efbabSIvan Ilchenko EH_LOG_ERR("Failed to stop port %u, err: %d", 1887b55efbabSIvan Ilchenko port_id, ret); 1888b55efbabSIvan Ilchenko return ret; 1889b55efbabSIvan Ilchenko } 1890e0b0e55cSAnoob Joseph } 1891e0b0e55cSAnoob Joseph 1892e0b0e55cSAnoob Joseph /* Setup eventdev */ 1893e0b0e55cSAnoob Joseph ret = eh_initialize_eventdev(em_conf); 1894e0b0e55cSAnoob Joseph if (ret < 0) { 1895e0b0e55cSAnoob Joseph EH_LOG_ERR("Failed to initialize event dev %d", ret); 1896e0b0e55cSAnoob Joseph return ret; 1897e0b0e55cSAnoob Joseph } 1898e0b0e55cSAnoob Joseph 18990dbe550aSVolodymyr Fialko /* Setup event crypto adapter */ 19000dbe550aSVolodymyr Fialko ret = eh_initialize_crypto_adapter(em_conf); 19010dbe550aSVolodymyr Fialko if (ret < 0) { 19020dbe550aSVolodymyr Fialko EH_LOG_ERR("Failed to start event dev %d", ret); 19030dbe550aSVolodymyr Fialko return ret; 19040dbe550aSVolodymyr Fialko } 19050dbe550aSVolodymyr Fialko 190602afed59SAnoob Joseph /* Setup Rx adapter */ 190702afed59SAnoob Joseph ret = eh_initialize_rx_adapter(em_conf); 190802afed59SAnoob Joseph if (ret < 0) { 190902afed59SAnoob Joseph EH_LOG_ERR("Failed to initialize rx adapter %d", ret); 191002afed59SAnoob Joseph return ret; 191102afed59SAnoob Joseph } 191202afed59SAnoob Joseph 19131d89ccf3SAnoob Joseph /* Setup Tx adapter */ 19141d89ccf3SAnoob Joseph ret = eh_initialize_tx_adapter(em_conf); 19151d89ccf3SAnoob Joseph if (ret < 0) { 19161d89ccf3SAnoob Joseph EH_LOG_ERR("Failed to initialize tx adapter %d", ret); 19171d89ccf3SAnoob Joseph return ret; 19181d89ccf3SAnoob Joseph } 19191d89ccf3SAnoob Joseph 1920986c2c9eSNithin Dabilpuram /* Start eventdev */ 1921986c2c9eSNithin Dabilpuram ret = eh_start_eventdev(em_conf); 1922986c2c9eSNithin Dabilpuram if (ret < 0) { 1923986c2c9eSNithin Dabilpuram EH_LOG_ERR("Failed to start event dev %d", ret); 1924986c2c9eSNithin Dabilpuram return ret; 1925986c2c9eSNithin Dabilpuram } 1926986c2c9eSNithin Dabilpuram 19270dbe550aSVolodymyr Fialko /* Start event crypto adapter */ 19280dbe550aSVolodymyr Fialko ret = eh_start_crypto_adapter(em_conf); 19290dbe550aSVolodymyr Fialko if (ret < 0) { 19300dbe550aSVolodymyr Fialko EH_LOG_ERR("Failed to start event crypto dev %d", ret); 19310dbe550aSVolodymyr Fialko return ret; 19320dbe550aSVolodymyr Fialko } 19330dbe550aSVolodymyr Fialko 19340dbe550aSVolodymyr Fialko 1935e0b0e55cSAnoob Joseph /* Start eth devices after setting up adapter */ 1936e0b0e55cSAnoob Joseph RTE_ETH_FOREACH_DEV(port_id) { 1937e0b0e55cSAnoob Joseph 1938e0b0e55cSAnoob Joseph /* Use only the ports enabled */ 1939e0b0e55cSAnoob Joseph if ((conf->eth_portmask & (1 << port_id)) == 0) 1940e0b0e55cSAnoob Joseph continue; 1941e0b0e55cSAnoob Joseph 1942e0b0e55cSAnoob Joseph ret = rte_eth_dev_start(port_id); 1943e0b0e55cSAnoob Joseph if (ret < 0) { 1944e0b0e55cSAnoob Joseph EH_LOG_ERR("Failed to start eth dev %d, %d", 1945e0b0e55cSAnoob Joseph port_id, ret); 1946e0b0e55cSAnoob Joseph return ret; 1947e0b0e55cSAnoob Joseph } 1948e0b0e55cSAnoob Joseph } 1949e0b0e55cSAnoob Joseph 1950e0b0e55cSAnoob Joseph return 0; 1951e0b0e55cSAnoob Joseph } 1952e0b0e55cSAnoob Joseph 1953e0b0e55cSAnoob Joseph int32_t 1954e0b0e55cSAnoob Joseph eh_devs_uninit(struct eh_conf *conf) 1955e0b0e55cSAnoob Joseph { 1956e0b0e55cSAnoob Joseph struct eventmode_conf *em_conf; 195702afed59SAnoob Joseph int ret, i, j; 1958e0b0e55cSAnoob Joseph uint16_t id; 1959e0b0e55cSAnoob Joseph 1960e0b0e55cSAnoob Joseph if (conf == NULL) { 1961e0b0e55cSAnoob Joseph EH_LOG_ERR("Invalid event helper configuration"); 1962e0b0e55cSAnoob Joseph return -EINVAL; 1963e0b0e55cSAnoob Joseph } 1964e0b0e55cSAnoob Joseph 1965e0b0e55cSAnoob Joseph if (conf->mode != EH_PKT_TRANSFER_MODE_EVENT) 1966e0b0e55cSAnoob Joseph return 0; 1967e0b0e55cSAnoob Joseph 1968e0b0e55cSAnoob Joseph if (conf->mode_params == NULL) { 1969e0b0e55cSAnoob Joseph EH_LOG_ERR("Invalid event mode parameters"); 1970e0b0e55cSAnoob Joseph return -EINVAL; 1971e0b0e55cSAnoob Joseph } 1972e0b0e55cSAnoob Joseph 1973e0b0e55cSAnoob Joseph /* Get eventmode conf */ 1974e0b0e55cSAnoob Joseph em_conf = conf->mode_params; 1975e0b0e55cSAnoob Joseph 197602afed59SAnoob Joseph /* Stop and release rx adapters */ 197702afed59SAnoob Joseph for (i = 0; i < em_conf->nb_rx_adapter; i++) { 197802afed59SAnoob Joseph 197902afed59SAnoob Joseph id = em_conf->rx_adapter[i].adapter_id; 198002afed59SAnoob Joseph ret = rte_event_eth_rx_adapter_stop(id); 198102afed59SAnoob Joseph if (ret < 0) { 198202afed59SAnoob Joseph EH_LOG_ERR("Failed to stop rx adapter %d", ret); 198302afed59SAnoob Joseph return ret; 198402afed59SAnoob Joseph } 198502afed59SAnoob Joseph 198602afed59SAnoob Joseph for (j = 0; j < em_conf->rx_adapter[i].nb_connections; j++) { 198702afed59SAnoob Joseph 198802afed59SAnoob Joseph ret = rte_event_eth_rx_adapter_queue_del(id, 198902afed59SAnoob Joseph em_conf->rx_adapter[i].conn[j].ethdev_id, -1); 199002afed59SAnoob Joseph if (ret < 0) { 199102afed59SAnoob Joseph EH_LOG_ERR( 199202afed59SAnoob Joseph "Failed to remove rx adapter queues %d", 199302afed59SAnoob Joseph ret); 199402afed59SAnoob Joseph return ret; 199502afed59SAnoob Joseph } 199602afed59SAnoob Joseph } 199702afed59SAnoob Joseph 199802afed59SAnoob Joseph ret = rte_event_eth_rx_adapter_free(id); 199902afed59SAnoob Joseph if (ret < 0) { 200002afed59SAnoob Joseph EH_LOG_ERR("Failed to free rx adapter %d", ret); 200102afed59SAnoob Joseph return ret; 200202afed59SAnoob Joseph } 200302afed59SAnoob Joseph } 200402afed59SAnoob Joseph 20050dbe550aSVolodymyr Fialko /* Stop event crypto adapter */ 20060dbe550aSVolodymyr Fialko ret = eh_stop_crypto_adapter(em_conf); 20070dbe550aSVolodymyr Fialko if (ret < 0) { 20080dbe550aSVolodymyr Fialko EH_LOG_ERR("Failed to start event crypto dev %d", ret); 20090dbe550aSVolodymyr Fialko return ret; 20100dbe550aSVolodymyr Fialko } 20110dbe550aSVolodymyr Fialko 2012e0b0e55cSAnoob Joseph /* Stop and release event devices */ 2013e0b0e55cSAnoob Joseph for (i = 0; i < em_conf->nb_eventdev; i++) { 2014e0b0e55cSAnoob Joseph 2015e0b0e55cSAnoob Joseph id = em_conf->eventdev_config[i].eventdev_id; 2016e0b0e55cSAnoob Joseph rte_event_dev_stop(id); 2017e0b0e55cSAnoob Joseph 2018e0b0e55cSAnoob Joseph ret = rte_event_dev_close(id); 2019e0b0e55cSAnoob Joseph if (ret < 0) { 2020e0b0e55cSAnoob Joseph EH_LOG_ERR("Failed to close event dev %d, %d", id, ret); 2021e0b0e55cSAnoob Joseph return ret; 2022e0b0e55cSAnoob Joseph } 2023e0b0e55cSAnoob Joseph } 2024e0b0e55cSAnoob Joseph 20251d89ccf3SAnoob Joseph /* Stop and release tx adapters */ 20261d89ccf3SAnoob Joseph for (i = 0; i < em_conf->nb_tx_adapter; i++) { 20271d89ccf3SAnoob Joseph 20281d89ccf3SAnoob Joseph id = em_conf->tx_adapter[i].adapter_id; 20291d89ccf3SAnoob Joseph ret = rte_event_eth_tx_adapter_stop(id); 20301d89ccf3SAnoob Joseph if (ret < 0) { 20311d89ccf3SAnoob Joseph EH_LOG_ERR("Failed to stop tx adapter %d", ret); 20321d89ccf3SAnoob Joseph return ret; 20331d89ccf3SAnoob Joseph } 20341d89ccf3SAnoob Joseph 20351d89ccf3SAnoob Joseph for (j = 0; j < em_conf->tx_adapter[i].nb_connections; j++) { 20361d89ccf3SAnoob Joseph 20371d89ccf3SAnoob Joseph ret = rte_event_eth_tx_adapter_queue_del(id, 20381d89ccf3SAnoob Joseph em_conf->tx_adapter[i].conn[j].ethdev_id, -1); 20391d89ccf3SAnoob Joseph if (ret < 0) { 20401d89ccf3SAnoob Joseph EH_LOG_ERR( 20411d89ccf3SAnoob Joseph "Failed to remove tx adapter queues %d", 20421d89ccf3SAnoob Joseph ret); 20431d89ccf3SAnoob Joseph return ret; 20441d89ccf3SAnoob Joseph } 20451d89ccf3SAnoob Joseph } 20461d89ccf3SAnoob Joseph 20471d89ccf3SAnoob Joseph ret = rte_event_eth_tx_adapter_free(id); 20481d89ccf3SAnoob Joseph if (ret < 0) { 20491d89ccf3SAnoob Joseph EH_LOG_ERR("Failed to free tx adapter %d", ret); 20501d89ccf3SAnoob Joseph return ret; 20511d89ccf3SAnoob Joseph } 20521d89ccf3SAnoob Joseph } 20531d89ccf3SAnoob Joseph 2054e0b0e55cSAnoob Joseph return 0; 2055e0b0e55cSAnoob Joseph } 20561d89ccf3SAnoob Joseph 20571bf6baacSLukasz Bartosik void 20581bf6baacSLukasz Bartosik eh_launch_worker(struct eh_conf *conf, struct eh_app_worker_params *app_wrkr, 20591bf6baacSLukasz Bartosik uint8_t nb_wrkr_param) 20601bf6baacSLukasz Bartosik { 20611bf6baacSLukasz Bartosik struct eh_app_worker_params *match_wrkr; 20621bf6baacSLukasz Bartosik struct eh_event_link_info *links = NULL; 20631bf6baacSLukasz Bartosik struct eventmode_conf *em_conf; 20641bf6baacSLukasz Bartosik uint32_t lcore_id; 20651bf6baacSLukasz Bartosik uint8_t nb_links; 20661bf6baacSLukasz Bartosik 20671bf6baacSLukasz Bartosik if (conf == NULL) { 20681bf6baacSLukasz Bartosik EH_LOG_ERR("Invalid event helper configuration"); 20691bf6baacSLukasz Bartosik return; 20701bf6baacSLukasz Bartosik } 20711bf6baacSLukasz Bartosik 20721bf6baacSLukasz Bartosik if (conf->mode_params == NULL) { 20731bf6baacSLukasz Bartosik EH_LOG_ERR("Invalid event mode parameters"); 20741bf6baacSLukasz Bartosik return; 20751bf6baacSLukasz Bartosik } 20761bf6baacSLukasz Bartosik 20771bf6baacSLukasz Bartosik /* Get eventmode conf */ 20781bf6baacSLukasz Bartosik em_conf = conf->mode_params; 20791bf6baacSLukasz Bartosik 20801bf6baacSLukasz Bartosik /* Get core ID */ 20811bf6baacSLukasz Bartosik lcore_id = rte_lcore_id(); 20821bf6baacSLukasz Bartosik 20831bf6baacSLukasz Bartosik /* Check if this is eth core */ 20841bf6baacSLukasz Bartosik if (rte_bitmap_get(em_conf->eth_core_mask, lcore_id)) { 20851bf6baacSLukasz Bartosik eh_start_worker_eth_core(em_conf, lcore_id); 20861bf6baacSLukasz Bartosik return; 20871bf6baacSLukasz Bartosik } 20881bf6baacSLukasz Bartosik 20891bf6baacSLukasz Bartosik if (app_wrkr == NULL || nb_wrkr_param == 0) { 20901bf6baacSLukasz Bartosik EH_LOG_ERR("Invalid args"); 20911bf6baacSLukasz Bartosik return; 20921bf6baacSLukasz Bartosik } 20931bf6baacSLukasz Bartosik 20941bf6baacSLukasz Bartosik /* 20951bf6baacSLukasz Bartosik * This is a regular worker thread. The application registers 20961bf6baacSLukasz Bartosik * multiple workers with various capabilities. Run worker 20971bf6baacSLukasz Bartosik * based on the selected capabilities of the event 20981bf6baacSLukasz Bartosik * device configured. 20991bf6baacSLukasz Bartosik */ 21001bf6baacSLukasz Bartosik 21011bf6baacSLukasz Bartosik /* Get the first matching worker for the event device */ 21021bf6baacSLukasz Bartosik match_wrkr = eh_find_worker(lcore_id, conf, app_wrkr, nb_wrkr_param); 21031bf6baacSLukasz Bartosik if (match_wrkr == NULL) { 21041bf6baacSLukasz Bartosik EH_LOG_ERR("Failed to match worker registered for lcore %d", 21051bf6baacSLukasz Bartosik lcore_id); 21061bf6baacSLukasz Bartosik goto clean_and_exit; 21071bf6baacSLukasz Bartosik } 21081bf6baacSLukasz Bartosik 21091bf6baacSLukasz Bartosik /* Verify sanity of the matched worker */ 21101bf6baacSLukasz Bartosik if (eh_verify_match_worker(match_wrkr) != 1) { 21111bf6baacSLukasz Bartosik EH_LOG_ERR("Failed to validate the matched worker"); 21121bf6baacSLukasz Bartosik goto clean_and_exit; 21131bf6baacSLukasz Bartosik } 21141bf6baacSLukasz Bartosik 21151bf6baacSLukasz Bartosik /* Get worker links */ 21161bf6baacSLukasz Bartosik nb_links = eh_get_event_lcore_links(lcore_id, conf, &links); 21171bf6baacSLukasz Bartosik 21181bf6baacSLukasz Bartosik /* Launch the worker thread */ 21191bf6baacSLukasz Bartosik match_wrkr->worker_thread(links, nb_links); 21201bf6baacSLukasz Bartosik 21211bf6baacSLukasz Bartosik /* Free links info memory */ 21221bf6baacSLukasz Bartosik free(links); 21231bf6baacSLukasz Bartosik 21241bf6baacSLukasz Bartosik clean_and_exit: 21251bf6baacSLukasz Bartosik 21261bf6baacSLukasz Bartosik /* Flag eth_cores to stop, if started */ 21271bf6baacSLukasz Bartosik eh_stop_worker_eth_core(); 21281bf6baacSLukasz Bartosik } 21291bf6baacSLukasz Bartosik 21301d89ccf3SAnoob Joseph uint8_t 21311d89ccf3SAnoob Joseph eh_get_tx_queue(struct eh_conf *conf, uint8_t eventdev_id) 21321d89ccf3SAnoob Joseph { 21331d89ccf3SAnoob Joseph struct eventdev_params *eventdev_config; 21341d89ccf3SAnoob Joseph struct eventmode_conf *em_conf; 21351d89ccf3SAnoob Joseph 21361d89ccf3SAnoob Joseph if (conf == NULL) { 21371d89ccf3SAnoob Joseph EH_LOG_ERR("Invalid event helper configuration"); 21381d89ccf3SAnoob Joseph return -EINVAL; 21391d89ccf3SAnoob Joseph } 21401d89ccf3SAnoob Joseph 21411d89ccf3SAnoob Joseph if (conf->mode_params == NULL) { 21421d89ccf3SAnoob Joseph EH_LOG_ERR("Invalid event mode parameters"); 21431d89ccf3SAnoob Joseph return -EINVAL; 21441d89ccf3SAnoob Joseph } 21451d89ccf3SAnoob Joseph 21461d89ccf3SAnoob Joseph /* Get eventmode conf */ 21471d89ccf3SAnoob Joseph em_conf = conf->mode_params; 21481d89ccf3SAnoob Joseph 21491d89ccf3SAnoob Joseph /* Get event device conf */ 21501d89ccf3SAnoob Joseph eventdev_config = eh_get_eventdev_params(em_conf, eventdev_id); 21511d89ccf3SAnoob Joseph 21521d89ccf3SAnoob Joseph if (eventdev_config == NULL) { 21531d89ccf3SAnoob Joseph EH_LOG_ERR("Failed to read eventdev config"); 21541d89ccf3SAnoob Joseph return -EINVAL; 21551d89ccf3SAnoob Joseph } 21561d89ccf3SAnoob Joseph 21571d89ccf3SAnoob Joseph /* 21581d89ccf3SAnoob Joseph * The last queue is reserved to be used as atomic queue for the 21591d89ccf3SAnoob Joseph * last stage (eth packet tx stage) 21601d89ccf3SAnoob Joseph */ 21611d89ccf3SAnoob Joseph return eventdev_config->nb_eventqueue - 1; 21621d89ccf3SAnoob Joseph } 2163