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