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__ */ 139