1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2017 Cavium, Inc
5 #ifndef __OCTEONTX_RXTX_H__
6 #define __OCTEONTX_RXTX_H__
8 #include <rte_ethdev_driver.h>
11 #define __hot __attribute__((hot))
14 /* Packet type table */
15 #define PTYPE_SIZE OCCTX_PKI_LTYPE_LAST
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,
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,
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,
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,
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)
107 uint64_t cmd_buf[4] __rte_cache_aligned;
110 if (unlikely(*((volatile int64_t *)fc_status_va) < 0))
113 /* Get the gaura Id */
114 gaura_id = octeontx_fpa_bufpool_gpool((uintptr_t)tx_pkt->pool->pool_id);
116 /* Setup PKO_SEND_HDR_S */
117 cmd_buf[0] = tx_pkt->data_len & 0xffff;
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 */
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) |
131 octeontx_reg_lmtst(lmtline_va, ioreg_va, cmd_buf, PKO_CMD_SZ);
137 octeontx_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts);
140 octeontx_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts);
142 #endif /* __OCTEONTX_RXTX_H__ */