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