New upstream version 18.11-rc1
[deb_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 #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__ */