replace hot attributes
[dpdk.git] / drivers / net / octeontx / octeontx_rxtx.h
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__ */