1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(C) 2019 Marvell International Ltd. 3 */ 4 5 #ifndef __L3FWD_EVENTDEV_H__ 6 #define __L3FWD_EVENTDEV_H__ 7 8 #include <rte_common.h> 9 #include <rte_service.h> 10 #include <rte_spinlock.h> 11 12 #ifdef RTE_LIB_EVENTDEV 13 #include <rte_eventdev.h> 14 #include <rte_event_eth_rx_adapter.h> 15 #include <rte_event_eth_tx_adapter.h> 16 17 #include "l3fwd.h" 18 19 #define L3FWD_EVENT_SINGLE 0x1 20 #define L3FWD_EVENT_BURST 0x2 21 #define L3FWD_EVENT_TX_DIRECT 0x4 22 #define L3FWD_EVENT_TX_ENQ 0x8 23 24 typedef uint32_t (*event_device_setup_cb)(void); 25 typedef void (*event_queue_setup_cb)(uint32_t event_queue_cfg); 26 typedef void (*event_port_setup_cb)(void); 27 typedef void (*adapter_setup_cb)(void); 28 typedef int (*event_loop_cb)(void *); 29 30 struct l3fwd_event_queues { 31 uint8_t *event_q_id; 32 uint8_t nb_queues; 33 }; 34 35 struct l3fwd_event_ports { 36 uint8_t *event_p_id; 37 uint8_t nb_ports; 38 rte_spinlock_t lock; 39 }; 40 41 struct l3fwd_event_rx_adptr { 42 uint32_t service_id; 43 uint8_t nb_rx_adptr; 44 uint8_t *rx_adptr; 45 }; 46 47 struct l3fwd_event_tx_adptr { 48 uint32_t service_id; 49 uint8_t nb_tx_adptr; 50 uint8_t *tx_adptr; 51 }; 52 53 struct l3fwd_event_setup_ops { 54 event_device_setup_cb event_device_setup; 55 event_queue_setup_cb event_queue_setup; 56 event_port_setup_cb event_port_setup; 57 adapter_setup_cb adapter_setup; 58 event_loop_cb lpm_event_loop; 59 event_loop_cb em_event_loop; 60 event_loop_cb fib_event_loop; 61 }; 62 63 struct l3fwd_event_resources { 64 struct rte_event_port_conf def_p_conf; 65 struct l3fwd_event_rx_adptr rx_adptr; 66 struct l3fwd_event_tx_adptr tx_adptr; 67 uint8_t disable_implicit_release; 68 struct l3fwd_event_setup_ops ops; 69 struct rte_mempool * (*pkt_pool)[NB_SOCKETS]; 70 struct rte_mempool **vec_pool; 71 struct l3fwd_event_queues evq; 72 struct l3fwd_event_ports evp; 73 uint32_t port_mask; 74 uint8_t per_port_pool; 75 uint8_t event_d_id; 76 uint8_t sched_type; 77 uint8_t tx_mode_q; 78 uint8_t deq_depth; 79 uint8_t has_burst; 80 uint8_t enabled; 81 uint8_t vector_enabled; 82 uint16_t eth_rx_queues; 83 uint16_t vector_size; 84 uint64_t vector_tmo_ns; 85 }; 86 87 #if defined(RTE_ARCH_X86) 88 #include "l3fwd_sse.h" 89 #elif defined __ARM_NEON 90 #include "l3fwd_neon.h" 91 #elif defined(RTE_ARCH_PPC_64) 92 #include "l3fwd_altivec.h" 93 #else 94 static inline uint16_t 95 process_dst_port(uint16_t *dst_ports, uint16_t nb_elem) 96 { 97 int i; 98 99 for (i = 0; i < nb_elem; i++) { 100 if (dst_ports[i] != dst_ports[0]) 101 return BAD_PORT; 102 } 103 104 return dst_ports[0]; 105 } 106 #endif 107 108 static inline uint16_t 109 filter_bad_packets(struct rte_mbuf **mbufs, uint16_t *dst_port, 110 uint16_t nb_pkts) 111 { 112 uint16_t *des_pos, free = 0; 113 struct rte_mbuf **pos; 114 int i; 115 116 /* Filter out and free bad packets */ 117 for (i = 0; i < nb_pkts; i++) { 118 if (dst_port[i] == BAD_PORT) { 119 rte_pktmbuf_free(mbufs[i]); 120 if (!free) { 121 pos = &mbufs[i]; 122 des_pos = &dst_port[i]; 123 } 124 free++; 125 continue; 126 } 127 128 if (free) { 129 *pos = mbufs[i]; 130 pos++; 131 *des_pos = dst_port[i]; 132 des_pos++; 133 } 134 } 135 136 return nb_pkts - free; 137 } 138 139 static inline void 140 process_event_vector(struct rte_event_vector *vec, uint16_t *dst_port) 141 { 142 uint16_t port, i; 143 144 vec->nb_elem = filter_bad_packets(vec->mbufs, dst_port, vec->nb_elem); 145 /* Verify destination array */ 146 port = process_dst_port(dst_port, vec->nb_elem); 147 if (port == BAD_PORT) { 148 vec->attr_valid = 0; 149 for (i = 0; i < vec->nb_elem; i++) { 150 vec->mbufs[i]->port = dst_port[i]; 151 rte_event_eth_tx_adapter_txq_set(vec->mbufs[i], 0); 152 } 153 } else { 154 vec->attr_valid = 1; 155 vec->port = port; 156 vec->queue = 0; 157 } 158 } 159 160 struct l3fwd_event_resources *l3fwd_get_eventdev_rsrc(void); 161 void l3fwd_event_resource_setup(struct rte_eth_conf *port_conf); 162 int l3fwd_get_free_event_port(struct l3fwd_event_resources *eventdev_rsrc); 163 void l3fwd_event_set_generic_ops(struct l3fwd_event_setup_ops *ops); 164 void l3fwd_event_set_internal_port_ops(struct l3fwd_event_setup_ops *ops); 165 void l3fwd_event_worker_cleanup(uint8_t event_d_id, uint8_t event_p_id, 166 struct rte_event events[], uint16_t nb_enq, 167 uint16_t nb_deq, uint8_t is_vector); 168 169 #endif /* RTE_LIB_EVENTDEV */ 170 #endif /* __L3FWD_EVENTDEV_H__ */ 171