xref: /dpdk/drivers/net/octeontx/octeontx_rxtx.h (revision 85221a0c7c28e10e6b31504448c37134e8facd55)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2017 Cavium, Inc
3  */
4 
5 #ifndef	__OCTEONTX_RXTX_H__
6 #define	__OCTEONTX_RXTX_H__
7 
8 #include <rte_ethdev_driver.h>
9 
10 #define OFFLOAD_FLAGS					\
11 	uint16_t rx_offload_flags;			\
12 	uint16_t tx_offload_flags
13 
14 #define BIT(nr) (1UL << (nr))
15 
16 #define OCCTX_RX_OFFLOAD_NONE		(0)
17 #define OCCTX_RX_OFFLOAD_RSS_F          BIT(0)
18 #define OCCTX_RX_MULTI_SEG_F		BIT(15)
19 
20 #define OCCTX_TX_OFFLOAD_NONE		(0)
21 
22 #define OCCTX_TX_MULTI_SEG_F		BIT(15)
23 /* Packet type table */
24 #define PTYPE_SIZE	OCCTX_PKI_LTYPE_LAST
25 
26 static const uint32_t __rte_cache_aligned
27 ptype_table[PTYPE_SIZE][PTYPE_SIZE][PTYPE_SIZE] = {
28 	[LC_NONE][LE_NONE][LF_NONE] = RTE_PTYPE_UNKNOWN,
29 	[LC_NONE][LE_NONE][LF_IPSEC_ESP] = RTE_PTYPE_UNKNOWN,
30 	[LC_NONE][LE_NONE][LF_IPFRAG] = RTE_PTYPE_L4_FRAG,
31 	[LC_NONE][LE_NONE][LF_IPCOMP] = RTE_PTYPE_UNKNOWN,
32 	[LC_NONE][LE_NONE][LF_TCP] = RTE_PTYPE_L4_TCP,
33 	[LC_NONE][LE_NONE][LF_UDP] = RTE_PTYPE_L4_UDP,
34 	[LC_NONE][LE_NONE][LF_GRE] = RTE_PTYPE_TUNNEL_GRE,
35 	[LC_NONE][LE_NONE][LF_UDP_GENEVE] = RTE_PTYPE_TUNNEL_GENEVE,
36 	[LC_NONE][LE_NONE][LF_UDP_VXLAN] = RTE_PTYPE_TUNNEL_VXLAN,
37 	[LC_NONE][LE_NONE][LF_NVGRE] = RTE_PTYPE_TUNNEL_NVGRE,
38 
39 	[LC_IPV4][LE_NONE][LF_NONE] = RTE_PTYPE_L3_IPV4 | RTE_PTYPE_UNKNOWN,
40 	[LC_IPV4][LE_NONE][LF_IPSEC_ESP] =
41 				RTE_PTYPE_L3_IPV4 | RTE_PTYPE_L3_IPV4,
42 	[LC_IPV4][LE_NONE][LF_IPFRAG] = RTE_PTYPE_L3_IPV4 | RTE_PTYPE_L4_FRAG,
43 	[LC_IPV4][LE_NONE][LF_IPCOMP] = RTE_PTYPE_L3_IPV4 | RTE_PTYPE_UNKNOWN,
44 	[LC_IPV4][LE_NONE][LF_TCP] = RTE_PTYPE_L3_IPV4 | RTE_PTYPE_L4_TCP,
45 	[LC_IPV4][LE_NONE][LF_UDP] = RTE_PTYPE_L3_IPV4 | RTE_PTYPE_L4_UDP,
46 	[LC_IPV4][LE_NONE][LF_GRE] = RTE_PTYPE_L3_IPV4 | RTE_PTYPE_TUNNEL_GRE,
47 	[LC_IPV4][LE_NONE][LF_UDP_GENEVE] =
48 				RTE_PTYPE_L3_IPV4 | RTE_PTYPE_TUNNEL_GENEVE,
49 	[LC_IPV4][LE_NONE][LF_UDP_VXLAN] =
50 				RTE_PTYPE_L3_IPV4 | RTE_PTYPE_TUNNEL_VXLAN,
51 	[LC_IPV4][LE_NONE][LF_NVGRE] =
52 				RTE_PTYPE_L3_IPV4 | RTE_PTYPE_TUNNEL_NVGRE,
53 
54 	[LC_IPV4_OPT][LE_NONE][LF_NONE] =
55 				RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_UNKNOWN,
56 	[LC_IPV4_OPT][LE_NONE][LF_IPSEC_ESP] =
57 				RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_L3_IPV4,
58 	[LC_IPV4_OPT][LE_NONE][LF_IPFRAG] =
59 				RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_L4_FRAG,
60 	[LC_IPV4_OPT][LE_NONE][LF_IPCOMP] =
61 				RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_UNKNOWN,
62 	[LC_IPV4_OPT][LE_NONE][LF_TCP] =
63 				RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_L4_TCP,
64 	[LC_IPV4_OPT][LE_NONE][LF_UDP] =
65 				RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_L4_UDP,
66 	[LC_IPV4_OPT][LE_NONE][LF_GRE] =
67 				RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_TUNNEL_GRE,
68 	[LC_IPV4_OPT][LE_NONE][LF_UDP_GENEVE] =
69 				RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_TUNNEL_GENEVE,
70 	[LC_IPV4_OPT][LE_NONE][LF_UDP_VXLAN] =
71 				RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_TUNNEL_VXLAN,
72 	[LC_IPV4_OPT][LE_NONE][LF_NVGRE] =
73 				RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_TUNNEL_NVGRE,
74 
75 	[LC_IPV6][LE_NONE][LF_NONE] = RTE_PTYPE_L3_IPV6 | RTE_PTYPE_UNKNOWN,
76 	[LC_IPV6][LE_NONE][LF_IPSEC_ESP] =
77 				RTE_PTYPE_L3_IPV6 | RTE_PTYPE_L3_IPV4,
78 	[LC_IPV6][LE_NONE][LF_IPFRAG] = RTE_PTYPE_L3_IPV6 | RTE_PTYPE_L4_FRAG,
79 	[LC_IPV6][LE_NONE][LF_IPCOMP] = RTE_PTYPE_L3_IPV6 | RTE_PTYPE_UNKNOWN,
80 	[LC_IPV6][LE_NONE][LF_TCP] = RTE_PTYPE_L3_IPV6 | RTE_PTYPE_L4_TCP,
81 	[LC_IPV6][LE_NONE][LF_UDP] = RTE_PTYPE_L3_IPV6 | RTE_PTYPE_L4_UDP,
82 	[LC_IPV6][LE_NONE][LF_GRE] = RTE_PTYPE_L3_IPV6 | RTE_PTYPE_TUNNEL_GRE,
83 	[LC_IPV6][LE_NONE][LF_UDP_GENEVE] =
84 				RTE_PTYPE_L3_IPV6 | RTE_PTYPE_TUNNEL_GENEVE,
85 	[LC_IPV6][LE_NONE][LF_UDP_VXLAN] =
86 				RTE_PTYPE_L3_IPV6 | RTE_PTYPE_TUNNEL_VXLAN,
87 	[LC_IPV6][LE_NONE][LF_NVGRE] =
88 				RTE_PTYPE_L3_IPV4 | RTE_PTYPE_TUNNEL_NVGRE,
89 	[LC_IPV6_OPT][LE_NONE][LF_NONE] =
90 				RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_UNKNOWN,
91 	[LC_IPV6_OPT][LE_NONE][LF_IPSEC_ESP] =
92 				RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_L3_IPV4,
93 	[LC_IPV6_OPT][LE_NONE][LF_IPFRAG] =
94 				RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_L4_FRAG,
95 	[LC_IPV6_OPT][LE_NONE][LF_IPCOMP] =
96 				RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_UNKNOWN,
97 	[LC_IPV6_OPT][LE_NONE][LF_TCP] =
98 				RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_L4_TCP,
99 	[LC_IPV6_OPT][LE_NONE][LF_UDP] =
100 				RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_L4_UDP,
101 	[LC_IPV6_OPT][LE_NONE][LF_GRE] =
102 				RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_TUNNEL_GRE,
103 	[LC_IPV6_OPT][LE_NONE][LF_UDP_GENEVE] =
104 				RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_TUNNEL_GENEVE,
105 	[LC_IPV6_OPT][LE_NONE][LF_UDP_VXLAN] =
106 				RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_TUNNEL_VXLAN,
107 	[LC_IPV6_OPT][LE_NONE][LF_NVGRE] =
108 				RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_TUNNEL_NVGRE,
109 
110 };
111 
112 static __rte_always_inline int
113 __octeontx_xmit_pkts(void *lmtline_va, void *ioreg_va, int64_t *fc_status_va,
114 			struct rte_mbuf *tx_pkt, const uint16_t flag)
115 {
116 	uint8_t sz = (4 + (!!(flag & OCCTX_TX_MULTI_SEG_F) * 10));
117 	/* Max size of PKO SEND desc is 112 bytes*/
118 	uint64_t cmd_buf[sz] __rte_cache_aligned;
119 	uint8_t nb_segs, nb_desc = 0;
120 	uint16_t gaura_id, len = 0;
121 	struct rte_mbuf *m_next = NULL;
122 
123 	if (unlikely(*((volatile int64_t *)fc_status_va) < 0))
124 		return -ENOSPC;
125 
126 
127 	if (flag & OCCTX_TX_MULTI_SEG_F) {
128 		nb_segs = tx_pkt->nb_segs;
129 		/* Setup PKO_SEND_HDR_S */
130 		cmd_buf[nb_desc++] = tx_pkt->pkt_len & 0xffff;
131 		cmd_buf[nb_desc++] = 0x0;
132 
133 		do {
134 			m_next = tx_pkt->next;
135 			/* To handle case where mbufs belong to diff pools, like
136 			 * fragmentation
137 			 */
138 			gaura_id = octeontx_fpa_bufpool_gpool((uintptr_t)
139 							tx_pkt->pool->pool_id);
140 
141 			/* Setup PKO_SEND_GATHER_S */
142 			cmd_buf[nb_desc] = PKO_SEND_GATHER_SUBDC           |
143 					     PKO_SEND_GATHER_LDTYPE(0x1ull)  |
144 					     PKO_SEND_GATHER_GAUAR((long)
145 								   gaura_id) |
146 					     tx_pkt->data_len;
147 			/* Mark mempool object as "put" since it is freed by
148 			 * PKO.
149 			 */
150 			if (!(cmd_buf[nb_desc] & (1ULL << 57))) {
151 				tx_pkt->next = NULL;
152 				__mempool_check_cookies(tx_pkt->pool,
153 							(void **)&tx_pkt, 1, 0);
154 			}
155 			nb_desc++;
156 
157 			cmd_buf[nb_desc++] = rte_mbuf_data_iova(tx_pkt);
158 
159 			nb_segs--;
160 			len += tx_pkt->data_len;
161 			tx_pkt = m_next;
162 		} while (nb_segs);
163 	} else {
164 		/* Setup PKO_SEND_HDR_S */
165 		cmd_buf[nb_desc++] = tx_pkt->data_len & 0xffff;
166 		cmd_buf[nb_desc++] = 0x0;
167 
168 		/* Mark mempool object as "put" since it is freed by PKO */
169 		if (!(cmd_buf[0] & (1ULL << 58)))
170 			__mempool_check_cookies(tx_pkt->pool, (void **)&tx_pkt,
171 						1, 0);
172 		/* Get the gaura Id */
173 		gaura_id = octeontx_fpa_bufpool_gpool((uintptr_t)
174 						      tx_pkt->pool->pool_id);
175 
176 		/* Setup PKO_SEND_BUFLINK_S */
177 		cmd_buf[nb_desc++] = PKO_SEND_BUFLINK_SUBDC |
178 				     PKO_SEND_BUFLINK_LDTYPE(0x1ull) |
179 				     PKO_SEND_BUFLINK_GAUAR((long)gaura_id) |
180 				     tx_pkt->data_len;
181 		cmd_buf[nb_desc++] = rte_mbuf_data_iova(tx_pkt);
182 	}
183 	octeontx_reg_lmtst(lmtline_va, ioreg_va, cmd_buf, nb_desc);
184 
185 	return 0;
186 }
187 
188 uint16_t
189 octeontx_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts);
190 
191 uint16_t
192 octeontx_xmit_pkts_mseg(void *tx_queue, struct rte_mbuf **tx_pkts,
193 			uint16_t nb_pkts);
194 
195 uint16_t
196 octeontx_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts);
197 
198 #endif /* __OCTEONTX_RXTX_H__ */
199