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>
10 /* Packet type table */
11 #define PTYPE_SIZE OCCTX_PKI_LTYPE_LAST
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,
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,
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,
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,
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)
103 uint64_t cmd_buf[4] __rte_cache_aligned;
106 if (unlikely(*((volatile int64_t *)fc_status_va) < 0))
109 /* Get the gaura Id */
110 gaura_id = octeontx_fpa_bufpool_gpool((uintptr_t)tx_pkt->pool->pool_id);
112 /* Setup PKO_SEND_HDR_S */
113 cmd_buf[0] = tx_pkt->data_len & 0xffff;
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 */
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) |
127 octeontx_reg_lmtst(lmtline_va, ioreg_va, cmd_buf, PKO_CMD_SZ);
133 octeontx_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts);
136 octeontx_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts);
138 #endif /* __OCTEONTX_RXTX_H__ */