xref: /dpdk/drivers/net/octeontx/octeontx_rxtx.h (revision 3d26a70ae33853ac4116b135e55f3d475f148939)
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 /* Packet type table */
11 #define PTYPE_SIZE	OCCTX_PKI_LTYPE_LAST
12 
13 static const uint32_t __rte_cache_aligned
14 ptype_table[PTYPE_SIZE][PTYPE_SIZE][PTYPE_SIZE] = {
15 	[LC_NONE][LE_NONE][LF_NONE] = RTE_PTYPE_UNKNOWN,
16 	[LC_NONE][LE_NONE][LF_IPSEC_ESP] = RTE_PTYPE_UNKNOWN,
17 	[LC_NONE][LE_NONE][LF_IPFRAG] = RTE_PTYPE_L4_FRAG,
18 	[LC_NONE][LE_NONE][LF_IPCOMP] = RTE_PTYPE_UNKNOWN,
19 	[LC_NONE][LE_NONE][LF_TCP] = RTE_PTYPE_L4_TCP,
20 	[LC_NONE][LE_NONE][LF_UDP] = RTE_PTYPE_L4_UDP,
21 	[LC_NONE][LE_NONE][LF_GRE] = RTE_PTYPE_TUNNEL_GRE,
22 	[LC_NONE][LE_NONE][LF_UDP_GENEVE] = RTE_PTYPE_TUNNEL_GENEVE,
23 	[LC_NONE][LE_NONE][LF_UDP_VXLAN] = RTE_PTYPE_TUNNEL_VXLAN,
24 	[LC_NONE][LE_NONE][LF_NVGRE] = RTE_PTYPE_TUNNEL_NVGRE,
25 
26 	[LC_IPV4][LE_NONE][LF_NONE] = RTE_PTYPE_L3_IPV4 | RTE_PTYPE_UNKNOWN,
27 	[LC_IPV4][LE_NONE][LF_IPSEC_ESP] =
28 				RTE_PTYPE_L3_IPV4 | RTE_PTYPE_L3_IPV4,
29 	[LC_IPV4][LE_NONE][LF_IPFRAG] = RTE_PTYPE_L3_IPV4 | RTE_PTYPE_L4_FRAG,
30 	[LC_IPV4][LE_NONE][LF_IPCOMP] = RTE_PTYPE_L3_IPV4 | RTE_PTYPE_UNKNOWN,
31 	[LC_IPV4][LE_NONE][LF_TCP] = RTE_PTYPE_L3_IPV4 | RTE_PTYPE_L4_TCP,
32 	[LC_IPV4][LE_NONE][LF_UDP] = RTE_PTYPE_L3_IPV4 | RTE_PTYPE_L4_UDP,
33 	[LC_IPV4][LE_NONE][LF_GRE] = RTE_PTYPE_L3_IPV4 | RTE_PTYPE_TUNNEL_GRE,
34 	[LC_IPV4][LE_NONE][LF_UDP_GENEVE] =
35 				RTE_PTYPE_L3_IPV4 | RTE_PTYPE_TUNNEL_GENEVE,
36 	[LC_IPV4][LE_NONE][LF_UDP_VXLAN] =
37 				RTE_PTYPE_L3_IPV4 | RTE_PTYPE_TUNNEL_VXLAN,
38 	[LC_IPV4][LE_NONE][LF_NVGRE] =
39 				RTE_PTYPE_L3_IPV4 | RTE_PTYPE_TUNNEL_NVGRE,
40 
41 	[LC_IPV4_OPT][LE_NONE][LF_NONE] =
42 				RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_UNKNOWN,
43 	[LC_IPV4_OPT][LE_NONE][LF_IPSEC_ESP] =
44 				RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_L3_IPV4,
45 	[LC_IPV4_OPT][LE_NONE][LF_IPFRAG] =
46 				RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_L4_FRAG,
47 	[LC_IPV4_OPT][LE_NONE][LF_IPCOMP] =
48 				RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_UNKNOWN,
49 	[LC_IPV4_OPT][LE_NONE][LF_TCP] =
50 				RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_L4_TCP,
51 	[LC_IPV4_OPT][LE_NONE][LF_UDP] =
52 				RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_L4_UDP,
53 	[LC_IPV4_OPT][LE_NONE][LF_GRE] =
54 				RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_TUNNEL_GRE,
55 	[LC_IPV4_OPT][LE_NONE][LF_UDP_GENEVE] =
56 				RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_TUNNEL_GENEVE,
57 	[LC_IPV4_OPT][LE_NONE][LF_UDP_VXLAN] =
58 				RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_TUNNEL_VXLAN,
59 	[LC_IPV4_OPT][LE_NONE][LF_NVGRE] =
60 				RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_TUNNEL_NVGRE,
61 
62 	[LC_IPV6][LE_NONE][LF_NONE] = RTE_PTYPE_L3_IPV6 | RTE_PTYPE_UNKNOWN,
63 	[LC_IPV6][LE_NONE][LF_IPSEC_ESP] =
64 				RTE_PTYPE_L3_IPV6 | RTE_PTYPE_L3_IPV4,
65 	[LC_IPV6][LE_NONE][LF_IPFRAG] = RTE_PTYPE_L3_IPV6 | RTE_PTYPE_L4_FRAG,
66 	[LC_IPV6][LE_NONE][LF_IPCOMP] = RTE_PTYPE_L3_IPV6 | RTE_PTYPE_UNKNOWN,
67 	[LC_IPV6][LE_NONE][LF_TCP] = RTE_PTYPE_L3_IPV6 | RTE_PTYPE_L4_TCP,
68 	[LC_IPV6][LE_NONE][LF_UDP] = RTE_PTYPE_L3_IPV6 | RTE_PTYPE_L4_UDP,
69 	[LC_IPV6][LE_NONE][LF_GRE] = RTE_PTYPE_L3_IPV6 | RTE_PTYPE_TUNNEL_GRE,
70 	[LC_IPV6][LE_NONE][LF_UDP_GENEVE] =
71 				RTE_PTYPE_L3_IPV6 | RTE_PTYPE_TUNNEL_GENEVE,
72 	[LC_IPV6][LE_NONE][LF_UDP_VXLAN] =
73 				RTE_PTYPE_L3_IPV6 | RTE_PTYPE_TUNNEL_VXLAN,
74 	[LC_IPV6][LE_NONE][LF_NVGRE] =
75 				RTE_PTYPE_L3_IPV4 | RTE_PTYPE_TUNNEL_NVGRE,
76 	[LC_IPV6_OPT][LE_NONE][LF_NONE] =
77 				RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_UNKNOWN,
78 	[LC_IPV6_OPT][LE_NONE][LF_IPSEC_ESP] =
79 				RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_L3_IPV4,
80 	[LC_IPV6_OPT][LE_NONE][LF_IPFRAG] =
81 				RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_L4_FRAG,
82 	[LC_IPV6_OPT][LE_NONE][LF_IPCOMP] =
83 				RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_UNKNOWN,
84 	[LC_IPV6_OPT][LE_NONE][LF_TCP] =
85 				RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_L4_TCP,
86 	[LC_IPV6_OPT][LE_NONE][LF_UDP] =
87 				RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_L4_UDP,
88 	[LC_IPV6_OPT][LE_NONE][LF_GRE] =
89 				RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_TUNNEL_GRE,
90 	[LC_IPV6_OPT][LE_NONE][LF_UDP_GENEVE] =
91 				RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_TUNNEL_GENEVE,
92 	[LC_IPV6_OPT][LE_NONE][LF_UDP_VXLAN] =
93 				RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_TUNNEL_VXLAN,
94 	[LC_IPV6_OPT][LE_NONE][LF_NVGRE] =
95 				RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_TUNNEL_NVGRE,
96 
97 };
98 
99 static __rte_always_inline int
100 __octeontx_xmit_pkts(void *lmtline_va, void *ioreg_va, int64_t *fc_status_va,
101 			struct rte_mbuf *tx_pkt)
102 {
103 	uint64_t cmd_buf[4] __rte_cache_aligned;
104 	uint16_t gaura_id;
105 
106 	if (unlikely(*((volatile int64_t *)fc_status_va) < 0))
107 		return -ENOSPC;
108 
109 	/* Get the gaura Id */
110 	gaura_id = octeontx_fpa_bufpool_gpool((uintptr_t)tx_pkt->pool->pool_id);
111 
112 	/* Setup PKO_SEND_HDR_S */
113 	cmd_buf[0] = tx_pkt->data_len & 0xffff;
114 	cmd_buf[1] = 0x0;
115 
116 	/* Set don't free bit if reference count > 1 */
117 	if (rte_mbuf_refcnt_read(tx_pkt) > 1)
118 		cmd_buf[0] |= (1ULL << 58); /* SET DF */
119 
120 	/* Setup PKO_SEND_GATHER_S */
121 	cmd_buf[(1 << 1) | 1] = rte_mbuf_data_iova(tx_pkt);
122 	cmd_buf[(1 << 1) | 0] = PKO_SEND_GATHER_SUBDC |
123 				PKO_SEND_GATHER_LDTYPE(0x1ull) |
124 				PKO_SEND_GATHER_GAUAR((long)gaura_id) |
125 				tx_pkt->data_len;
126 
127 	octeontx_reg_lmtst(lmtline_va, ioreg_va, cmd_buf, PKO_CMD_SZ);
128 
129 	return 0;
130 }
131 
132 uint16_t
133 octeontx_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts);
134 
135 uint16_t
136 octeontx_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts);
137 
138 #endif /* __OCTEONTX_RXTX_H__ */
139