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