1e2de1f7bSSunil Kumar Kori /* SPDX-License-Identifier: BSD-3-Clause 2e2de1f7bSSunil Kumar Kori * Copyright(C) 2019 Marvell International Ltd. 3e2de1f7bSSunil Kumar Kori */ 4e2de1f7bSSunil Kumar Kori 5e2de1f7bSSunil Kumar Kori #ifndef __L3FWD_EVENTDEV_H__ 6e2de1f7bSSunil Kumar Kori #define __L3FWD_EVENTDEV_H__ 7e2de1f7bSSunil Kumar Kori 8e2de1f7bSSunil Kumar Kori #include <rte_common.h> 9ef827078SBruce Richardson #include <rte_service.h> 10ef827078SBruce Richardson #include <rte_spinlock.h> 11ef827078SBruce Richardson 12ef827078SBruce Richardson #ifdef RTE_LIB_EVENTDEV 13e2de1f7bSSunil Kumar Kori #include <rte_eventdev.h> 144eaf90ccSPavan Nikhilesh #include <rte_event_eth_rx_adapter.h> 159176e1fcSSunil Kumar Kori #include <rte_event_eth_tx_adapter.h> 16e2de1f7bSSunil Kumar Kori 17e2de1f7bSSunil Kumar Kori #include "l3fwd.h" 18e2de1f7bSSunil Kumar Kori 1999fc91d1SPavan Nikhilesh #define L3FWD_EVENT_SINGLE 0x1 2099fc91d1SPavan Nikhilesh #define L3FWD_EVENT_BURST 0x2 2199fc91d1SPavan Nikhilesh #define L3FWD_EVENT_TX_DIRECT 0x4 2299fc91d1SPavan Nikhilesh #define L3FWD_EVENT_TX_ENQ 0x8 2399fc91d1SPavan Nikhilesh 249176e1fcSSunil Kumar Kori typedef uint32_t (*event_device_setup_cb)(void); 259176e1fcSSunil Kumar Kori typedef void (*event_queue_setup_cb)(uint32_t event_queue_cfg); 269176e1fcSSunil Kumar Kori typedef void (*event_port_setup_cb)(void); 279176e1fcSSunil Kumar Kori typedef void (*adapter_setup_cb)(void); 289176e1fcSSunil Kumar Kori typedef int (*event_loop_cb)(void *); 299176e1fcSSunil Kumar Kori 30ebc88e4eSPavan Nikhilesh struct l3fwd_event_queues { 31ebc88e4eSPavan Nikhilesh uint8_t *event_q_id; 32ebc88e4eSPavan Nikhilesh uint8_t nb_queues; 33ebc88e4eSPavan Nikhilesh }; 34ebc88e4eSPavan Nikhilesh 35ebc88e4eSPavan Nikhilesh struct l3fwd_event_ports { 36ebc88e4eSPavan Nikhilesh uint8_t *event_p_id; 37ebc88e4eSPavan Nikhilesh uint8_t nb_ports; 38ebc88e4eSPavan Nikhilesh rte_spinlock_t lock; 39ebc88e4eSPavan Nikhilesh }; 40ebc88e4eSPavan Nikhilesh 41ebc88e4eSPavan Nikhilesh struct l3fwd_event_rx_adptr { 42ebc88e4eSPavan Nikhilesh uint32_t service_id; 43ebc88e4eSPavan Nikhilesh uint8_t nb_rx_adptr; 44ebc88e4eSPavan Nikhilesh uint8_t *rx_adptr; 45ebc88e4eSPavan Nikhilesh }; 46ebc88e4eSPavan Nikhilesh 47ebc88e4eSPavan Nikhilesh struct l3fwd_event_tx_adptr { 48ebc88e4eSPavan Nikhilesh uint32_t service_id; 49ebc88e4eSPavan Nikhilesh uint8_t nb_tx_adptr; 50ebc88e4eSPavan Nikhilesh uint8_t *tx_adptr; 51ebc88e4eSPavan Nikhilesh }; 52ebc88e4eSPavan Nikhilesh 539176e1fcSSunil Kumar Kori struct l3fwd_event_setup_ops { 549176e1fcSSunil Kumar Kori event_device_setup_cb event_device_setup; 559176e1fcSSunil Kumar Kori event_queue_setup_cb event_queue_setup; 569176e1fcSSunil Kumar Kori event_port_setup_cb event_port_setup; 579176e1fcSSunil Kumar Kori adapter_setup_cb adapter_setup; 589176e1fcSSunil Kumar Kori event_loop_cb lpm_event_loop; 599176e1fcSSunil Kumar Kori event_loop_cb em_event_loop; 609510dd1fSConor Walsh event_loop_cb fib_event_loop; 619176e1fcSSunil Kumar Kori }; 629176e1fcSSunil Kumar Kori 63e2de1f7bSSunil Kumar Kori struct l3fwd_event_resources { 64ebc88e4eSPavan Nikhilesh struct rte_event_port_conf def_p_conf; 65ebc88e4eSPavan Nikhilesh struct l3fwd_event_rx_adptr rx_adptr; 66ebc88e4eSPavan Nikhilesh struct l3fwd_event_tx_adptr tx_adptr; 67ebc88e4eSPavan Nikhilesh uint8_t disable_implicit_release; 689176e1fcSSunil Kumar Kori struct l3fwd_event_setup_ops ops; 69ebc88e4eSPavan Nikhilesh struct rte_mempool * (*pkt_pool)[NB_SOCKETS]; 70e8adca19SShijith Thotton struct rte_mempool **vec_pool; 71ebc88e4eSPavan Nikhilesh struct l3fwd_event_queues evq; 72ebc88e4eSPavan Nikhilesh struct l3fwd_event_ports evp; 73ebc88e4eSPavan Nikhilesh uint32_t port_mask; 74ebc88e4eSPavan Nikhilesh uint8_t per_port_pool; 75ebc88e4eSPavan Nikhilesh uint8_t event_d_id; 76e2de1f7bSSunil Kumar Kori uint8_t sched_type; 779176e1fcSSunil Kumar Kori uint8_t tx_mode_q; 78ebc88e4eSPavan Nikhilesh uint8_t deq_depth; 79ebc88e4eSPavan Nikhilesh uint8_t has_burst; 80e2de1f7bSSunil Kumar Kori uint8_t enabled; 81e8adca19SShijith Thotton uint8_t vector_enabled; 82*b23c5bd7SSivaprasad Tummala uint16_t eth_rx_queues; 83e8adca19SShijith Thotton uint16_t vector_size; 84e8adca19SShijith Thotton uint64_t vector_tmo_ns; 85e2de1f7bSSunil Kumar Kori }; 86e2de1f7bSSunil Kumar Kori 87b140e970SPavan Nikhilesh #if defined(RTE_ARCH_X86) 88b140e970SPavan Nikhilesh #include "l3fwd_sse.h" 89b140e970SPavan Nikhilesh #elif defined __ARM_NEON 90b140e970SPavan Nikhilesh #include "l3fwd_neon.h" 91b140e970SPavan Nikhilesh #elif defined(RTE_ARCH_PPC_64) 92b140e970SPavan Nikhilesh #include "l3fwd_altivec.h" 93b140e970SPavan Nikhilesh #else 94b140e970SPavan Nikhilesh static inline uint16_t 95b140e970SPavan Nikhilesh process_dst_port(uint16_t *dst_ports, uint16_t nb_elem) 96b140e970SPavan Nikhilesh { 97b140e970SPavan Nikhilesh int i; 98b140e970SPavan Nikhilesh 99b140e970SPavan Nikhilesh for (i = 0; i < nb_elem; i++) { 100b140e970SPavan Nikhilesh if (dst_ports[i] != dst_ports[0]) 101b140e970SPavan Nikhilesh return BAD_PORT; 102b140e970SPavan Nikhilesh } 103b140e970SPavan Nikhilesh 104b140e970SPavan Nikhilesh return dst_ports[0]; 105b140e970SPavan Nikhilesh } 106b140e970SPavan Nikhilesh #endif 107b140e970SPavan Nikhilesh 108b140e970SPavan Nikhilesh static inline uint16_t 109b140e970SPavan Nikhilesh filter_bad_packets(struct rte_mbuf **mbufs, uint16_t *dst_port, 110b140e970SPavan Nikhilesh uint16_t nb_pkts) 111b140e970SPavan Nikhilesh { 112b140e970SPavan Nikhilesh uint16_t *des_pos, free = 0; 113b140e970SPavan Nikhilesh struct rte_mbuf **pos; 114b140e970SPavan Nikhilesh int i; 11555b22fb3SPavan Nikhilesh 116b140e970SPavan Nikhilesh /* Filter out and free bad packets */ 117b140e970SPavan Nikhilesh for (i = 0; i < nb_pkts; i++) { 118b140e970SPavan Nikhilesh if (dst_port[i] == BAD_PORT) { 119b140e970SPavan Nikhilesh rte_pktmbuf_free(mbufs[i]); 120b140e970SPavan Nikhilesh if (!free) { 121b140e970SPavan Nikhilesh pos = &mbufs[i]; 122b140e970SPavan Nikhilesh des_pos = &dst_port[i]; 123b140e970SPavan Nikhilesh } 124b140e970SPavan Nikhilesh free++; 125b140e970SPavan Nikhilesh continue; 126b140e970SPavan Nikhilesh } 127b140e970SPavan Nikhilesh 128b140e970SPavan Nikhilesh if (free) { 129b140e970SPavan Nikhilesh *pos = mbufs[i]; 130b140e970SPavan Nikhilesh pos++; 131b140e970SPavan Nikhilesh *des_pos = dst_port[i]; 132b140e970SPavan Nikhilesh des_pos++; 133b140e970SPavan Nikhilesh } 134b140e970SPavan Nikhilesh } 135b140e970SPavan Nikhilesh 136b140e970SPavan Nikhilesh return nb_pkts - free; 137b140e970SPavan Nikhilesh } 138b140e970SPavan Nikhilesh 139b140e970SPavan Nikhilesh static inline void 140b140e970SPavan Nikhilesh process_event_vector(struct rte_event_vector *vec, uint16_t *dst_port) 141b140e970SPavan Nikhilesh { 142b140e970SPavan Nikhilesh uint16_t port, i; 143b140e970SPavan Nikhilesh 144b140e970SPavan Nikhilesh vec->nb_elem = filter_bad_packets(vec->mbufs, dst_port, vec->nb_elem); 145b140e970SPavan Nikhilesh /* Verify destination array */ 146b140e970SPavan Nikhilesh port = process_dst_port(dst_port, vec->nb_elem); 147b140e970SPavan Nikhilesh if (port == BAD_PORT) { 148b140e970SPavan Nikhilesh vec->attr_valid = 0; 149b140e970SPavan Nikhilesh for (i = 0; i < vec->nb_elem; i++) { 150b140e970SPavan Nikhilesh vec->mbufs[i]->port = dst_port[i]; 151b140e970SPavan Nikhilesh rte_event_eth_tx_adapter_txq_set(vec->mbufs[i], 0); 152b140e970SPavan Nikhilesh } 153b140e970SPavan Nikhilesh } else { 154b140e970SPavan Nikhilesh vec->attr_valid = 1; 155b140e970SPavan Nikhilesh vec->port = port; 156b140e970SPavan Nikhilesh vec->queue = 0; 157b140e970SPavan Nikhilesh } 158b140e970SPavan Nikhilesh } 15955b22fb3SPavan Nikhilesh 160e2de1f7bSSunil Kumar Kori struct l3fwd_event_resources *l3fwd_get_eventdev_rsrc(void); 161a65bf3d7SSunil Kumar Kori void l3fwd_event_resource_setup(struct rte_eth_conf *port_conf); 162aaf58cb8SSunil Kumar Kori int l3fwd_get_free_event_port(struct l3fwd_event_resources *eventdev_rsrc); 1639176e1fcSSunil Kumar Kori void l3fwd_event_set_generic_ops(struct l3fwd_event_setup_ops *ops); 1649176e1fcSSunil Kumar Kori void l3fwd_event_set_internal_port_ops(struct l3fwd_event_setup_ops *ops); 16555b22fb3SPavan Nikhilesh void l3fwd_event_worker_cleanup(uint8_t event_d_id, uint8_t event_p_id, 16655b22fb3SPavan Nikhilesh struct rte_event events[], uint16_t nb_enq, 16755b22fb3SPavan Nikhilesh uint16_t nb_deq, uint8_t is_vector); 168e2de1f7bSSunil Kumar Kori 169ef827078SBruce Richardson #endif /* RTE_LIB_EVENTDEV */ 170e2de1f7bSSunil Kumar Kori #endif /* __L3FWD_EVENTDEV_H__ */ 171