xref: /dpdk/examples/l3fwd/l3fwd_event.h (revision b23c5bd71aa5b428a404aa036b97fa7bb1a3c98a)
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