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