1aaf4363eSJerin Jacob /* SPDX-License-Identifier: BSD-3-Clause 2aaf4363eSJerin Jacob * Copyright(c) 2017 Cavium, Inc 39e747589SJerin Jacob */ 49e747589SJerin Jacob 59e747589SJerin Jacob #ifndef __OCTEONTX_RXTX_H__ 69e747589SJerin Jacob #define __OCTEONTX_RXTX_H__ 79e747589SJerin Jacob 8ffc905f3SFerruh Yigit #include <rte_ethdev_driver.h> 99e747589SJerin Jacob 1085221a0cSHarman Kalra #define OFFLOAD_FLAGS \ 1185221a0cSHarman Kalra uint16_t rx_offload_flags; \ 1285221a0cSHarman Kalra uint16_t tx_offload_flags 1385221a0cSHarman Kalra 1485221a0cSHarman Kalra #define BIT(nr) (1UL << (nr)) 1585221a0cSHarman Kalra 1685221a0cSHarman Kalra #define OCCTX_RX_OFFLOAD_NONE (0) 1785221a0cSHarman Kalra #define OCCTX_RX_OFFLOAD_RSS_F BIT(0) 1885221a0cSHarman Kalra #define OCCTX_RX_MULTI_SEG_F BIT(15) 1985221a0cSHarman Kalra 2085221a0cSHarman Kalra #define OCCTX_TX_OFFLOAD_NONE (0) 21*5cbe1848SHarman Kalra #define OCCTX_TX_OFFLOAD_MBUF_NOFF_F BIT(3) 2285221a0cSHarman Kalra 2385221a0cSHarman Kalra #define OCCTX_TX_MULTI_SEG_F BIT(15) 24d0d65498SPavan Nikhilesh /* Packet type table */ 25d0d65498SPavan Nikhilesh #define PTYPE_SIZE OCCTX_PKI_LTYPE_LAST 26d0d65498SPavan Nikhilesh 27d0d65498SPavan Nikhilesh static const uint32_t __rte_cache_aligned 28d0d65498SPavan Nikhilesh ptype_table[PTYPE_SIZE][PTYPE_SIZE][PTYPE_SIZE] = { 29d0d65498SPavan Nikhilesh [LC_NONE][LE_NONE][LF_NONE] = RTE_PTYPE_UNKNOWN, 30d0d65498SPavan Nikhilesh [LC_NONE][LE_NONE][LF_IPSEC_ESP] = RTE_PTYPE_UNKNOWN, 31d0d65498SPavan Nikhilesh [LC_NONE][LE_NONE][LF_IPFRAG] = RTE_PTYPE_L4_FRAG, 32d0d65498SPavan Nikhilesh [LC_NONE][LE_NONE][LF_IPCOMP] = RTE_PTYPE_UNKNOWN, 33d0d65498SPavan Nikhilesh [LC_NONE][LE_NONE][LF_TCP] = RTE_PTYPE_L4_TCP, 34d0d65498SPavan Nikhilesh [LC_NONE][LE_NONE][LF_UDP] = RTE_PTYPE_L4_UDP, 35d0d65498SPavan Nikhilesh [LC_NONE][LE_NONE][LF_GRE] = RTE_PTYPE_TUNNEL_GRE, 36d0d65498SPavan Nikhilesh [LC_NONE][LE_NONE][LF_UDP_GENEVE] = RTE_PTYPE_TUNNEL_GENEVE, 37d0d65498SPavan Nikhilesh [LC_NONE][LE_NONE][LF_UDP_VXLAN] = RTE_PTYPE_TUNNEL_VXLAN, 38d0d65498SPavan Nikhilesh [LC_NONE][LE_NONE][LF_NVGRE] = RTE_PTYPE_TUNNEL_NVGRE, 39d0d65498SPavan Nikhilesh 40d0d65498SPavan Nikhilesh [LC_IPV4][LE_NONE][LF_NONE] = RTE_PTYPE_L3_IPV4 | RTE_PTYPE_UNKNOWN, 41d0d65498SPavan Nikhilesh [LC_IPV4][LE_NONE][LF_IPSEC_ESP] = 42d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV4 | RTE_PTYPE_L3_IPV4, 43d0d65498SPavan Nikhilesh [LC_IPV4][LE_NONE][LF_IPFRAG] = RTE_PTYPE_L3_IPV4 | RTE_PTYPE_L4_FRAG, 44d0d65498SPavan Nikhilesh [LC_IPV4][LE_NONE][LF_IPCOMP] = RTE_PTYPE_L3_IPV4 | RTE_PTYPE_UNKNOWN, 45d0d65498SPavan Nikhilesh [LC_IPV4][LE_NONE][LF_TCP] = RTE_PTYPE_L3_IPV4 | RTE_PTYPE_L4_TCP, 46d0d65498SPavan Nikhilesh [LC_IPV4][LE_NONE][LF_UDP] = RTE_PTYPE_L3_IPV4 | RTE_PTYPE_L4_UDP, 47d0d65498SPavan Nikhilesh [LC_IPV4][LE_NONE][LF_GRE] = RTE_PTYPE_L3_IPV4 | RTE_PTYPE_TUNNEL_GRE, 48d0d65498SPavan Nikhilesh [LC_IPV4][LE_NONE][LF_UDP_GENEVE] = 49d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV4 | RTE_PTYPE_TUNNEL_GENEVE, 50d0d65498SPavan Nikhilesh [LC_IPV4][LE_NONE][LF_UDP_VXLAN] = 51d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV4 | RTE_PTYPE_TUNNEL_VXLAN, 52d0d65498SPavan Nikhilesh [LC_IPV4][LE_NONE][LF_NVGRE] = 53d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV4 | RTE_PTYPE_TUNNEL_NVGRE, 54d0d65498SPavan Nikhilesh 55d0d65498SPavan Nikhilesh [LC_IPV4_OPT][LE_NONE][LF_NONE] = 56d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_UNKNOWN, 57d0d65498SPavan Nikhilesh [LC_IPV4_OPT][LE_NONE][LF_IPSEC_ESP] = 58d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_L3_IPV4, 59d0d65498SPavan Nikhilesh [LC_IPV4_OPT][LE_NONE][LF_IPFRAG] = 60d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_L4_FRAG, 61d0d65498SPavan Nikhilesh [LC_IPV4_OPT][LE_NONE][LF_IPCOMP] = 62d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_UNKNOWN, 63d0d65498SPavan Nikhilesh [LC_IPV4_OPT][LE_NONE][LF_TCP] = 64d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_L4_TCP, 65d0d65498SPavan Nikhilesh [LC_IPV4_OPT][LE_NONE][LF_UDP] = 66d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_L4_UDP, 67d0d65498SPavan Nikhilesh [LC_IPV4_OPT][LE_NONE][LF_GRE] = 68d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_TUNNEL_GRE, 69d0d65498SPavan Nikhilesh [LC_IPV4_OPT][LE_NONE][LF_UDP_GENEVE] = 70d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_TUNNEL_GENEVE, 71d0d65498SPavan Nikhilesh [LC_IPV4_OPT][LE_NONE][LF_UDP_VXLAN] = 72d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_TUNNEL_VXLAN, 73d0d65498SPavan Nikhilesh [LC_IPV4_OPT][LE_NONE][LF_NVGRE] = 74d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV4_EXT | RTE_PTYPE_TUNNEL_NVGRE, 75d0d65498SPavan Nikhilesh 76d0d65498SPavan Nikhilesh [LC_IPV6][LE_NONE][LF_NONE] = RTE_PTYPE_L3_IPV6 | RTE_PTYPE_UNKNOWN, 77d0d65498SPavan Nikhilesh [LC_IPV6][LE_NONE][LF_IPSEC_ESP] = 78d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV6 | RTE_PTYPE_L3_IPV4, 79d0d65498SPavan Nikhilesh [LC_IPV6][LE_NONE][LF_IPFRAG] = RTE_PTYPE_L3_IPV6 | RTE_PTYPE_L4_FRAG, 80d0d65498SPavan Nikhilesh [LC_IPV6][LE_NONE][LF_IPCOMP] = RTE_PTYPE_L3_IPV6 | RTE_PTYPE_UNKNOWN, 81d0d65498SPavan Nikhilesh [LC_IPV6][LE_NONE][LF_TCP] = RTE_PTYPE_L3_IPV6 | RTE_PTYPE_L4_TCP, 82d0d65498SPavan Nikhilesh [LC_IPV6][LE_NONE][LF_UDP] = RTE_PTYPE_L3_IPV6 | RTE_PTYPE_L4_UDP, 83d0d65498SPavan Nikhilesh [LC_IPV6][LE_NONE][LF_GRE] = RTE_PTYPE_L3_IPV6 | RTE_PTYPE_TUNNEL_GRE, 84d0d65498SPavan Nikhilesh [LC_IPV6][LE_NONE][LF_UDP_GENEVE] = 85d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV6 | RTE_PTYPE_TUNNEL_GENEVE, 86d0d65498SPavan Nikhilesh [LC_IPV6][LE_NONE][LF_UDP_VXLAN] = 87d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV6 | RTE_PTYPE_TUNNEL_VXLAN, 88d0d65498SPavan Nikhilesh [LC_IPV6][LE_NONE][LF_NVGRE] = 89d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV4 | RTE_PTYPE_TUNNEL_NVGRE, 90d0d65498SPavan Nikhilesh [LC_IPV6_OPT][LE_NONE][LF_NONE] = 91d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_UNKNOWN, 92d0d65498SPavan Nikhilesh [LC_IPV6_OPT][LE_NONE][LF_IPSEC_ESP] = 93d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_L3_IPV4, 94d0d65498SPavan Nikhilesh [LC_IPV6_OPT][LE_NONE][LF_IPFRAG] = 95d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_L4_FRAG, 96d0d65498SPavan Nikhilesh [LC_IPV6_OPT][LE_NONE][LF_IPCOMP] = 97d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_UNKNOWN, 98d0d65498SPavan Nikhilesh [LC_IPV6_OPT][LE_NONE][LF_TCP] = 99d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_L4_TCP, 100d0d65498SPavan Nikhilesh [LC_IPV6_OPT][LE_NONE][LF_UDP] = 101d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_L4_UDP, 102d0d65498SPavan Nikhilesh [LC_IPV6_OPT][LE_NONE][LF_GRE] = 103d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_TUNNEL_GRE, 104d0d65498SPavan Nikhilesh [LC_IPV6_OPT][LE_NONE][LF_UDP_GENEVE] = 105d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_TUNNEL_GENEVE, 106d0d65498SPavan Nikhilesh [LC_IPV6_OPT][LE_NONE][LF_UDP_VXLAN] = 107d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_TUNNEL_VXLAN, 108d0d65498SPavan Nikhilesh [LC_IPV6_OPT][LE_NONE][LF_NVGRE] = 109d0d65498SPavan Nikhilesh RTE_PTYPE_L3_IPV6_EXT | RTE_PTYPE_TUNNEL_NVGRE, 110d0d65498SPavan Nikhilesh 111d0d65498SPavan Nikhilesh }; 112d0d65498SPavan Nikhilesh 1137f4116bdSHarman Kalra 114*5cbe1848SHarman Kalra static __rte_always_inline uint64_t 115*5cbe1848SHarman Kalra octeontx_pktmbuf_detach(struct rte_mbuf *m) 116*5cbe1848SHarman Kalra { 117*5cbe1848SHarman Kalra struct rte_mempool *mp = m->pool; 118*5cbe1848SHarman Kalra uint32_t mbuf_size, buf_len; 119*5cbe1848SHarman Kalra struct rte_mbuf *md; 120*5cbe1848SHarman Kalra uint16_t priv_size; 121*5cbe1848SHarman Kalra uint16_t refcount; 122*5cbe1848SHarman Kalra 123*5cbe1848SHarman Kalra /* Update refcount of direct mbuf */ 124*5cbe1848SHarman Kalra md = rte_mbuf_from_indirect(m); 125*5cbe1848SHarman Kalra refcount = rte_mbuf_refcnt_update(md, -1); 126*5cbe1848SHarman Kalra 127*5cbe1848SHarman Kalra priv_size = rte_pktmbuf_priv_size(mp); 128*5cbe1848SHarman Kalra mbuf_size = (uint32_t)(sizeof(struct rte_mbuf) + priv_size); 129*5cbe1848SHarman Kalra buf_len = rte_pktmbuf_data_room_size(mp); 130*5cbe1848SHarman Kalra 131*5cbe1848SHarman Kalra m->priv_size = priv_size; 132*5cbe1848SHarman Kalra m->buf_addr = (char *)m + mbuf_size; 133*5cbe1848SHarman Kalra m->buf_iova = rte_mempool_virt2iova(m) + mbuf_size; 134*5cbe1848SHarman Kalra m->buf_len = (uint16_t)buf_len; 135*5cbe1848SHarman Kalra rte_pktmbuf_reset_headroom(m); 136*5cbe1848SHarman Kalra m->data_len = 0; 137*5cbe1848SHarman Kalra m->ol_flags = 0; 138*5cbe1848SHarman Kalra m->next = NULL; 139*5cbe1848SHarman Kalra m->nb_segs = 1; 140*5cbe1848SHarman Kalra 141*5cbe1848SHarman Kalra /* Now indirect mbuf is safe to free */ 142*5cbe1848SHarman Kalra rte_pktmbuf_free(m); 143*5cbe1848SHarman Kalra 144*5cbe1848SHarman Kalra if (refcount == 0) { 145*5cbe1848SHarman Kalra rte_mbuf_refcnt_set(md, 1); 146*5cbe1848SHarman Kalra md->data_len = 0; 147*5cbe1848SHarman Kalra md->ol_flags = 0; 148*5cbe1848SHarman Kalra md->next = NULL; 149*5cbe1848SHarman Kalra md->nb_segs = 1; 150*5cbe1848SHarman Kalra return 0; 151*5cbe1848SHarman Kalra } else { 152*5cbe1848SHarman Kalra return 1; 153*5cbe1848SHarman Kalra } 154*5cbe1848SHarman Kalra } 155*5cbe1848SHarman Kalra 156*5cbe1848SHarman Kalra static __rte_always_inline uint64_t 157*5cbe1848SHarman Kalra octeontx_prefree_seg(struct rte_mbuf *m) 158*5cbe1848SHarman Kalra { 159*5cbe1848SHarman Kalra if (likely(rte_mbuf_refcnt_read(m) == 1)) { 160*5cbe1848SHarman Kalra if (!RTE_MBUF_DIRECT(m)) 161*5cbe1848SHarman Kalra return octeontx_pktmbuf_detach(m); 162*5cbe1848SHarman Kalra 163*5cbe1848SHarman Kalra m->next = NULL; 164*5cbe1848SHarman Kalra m->nb_segs = 1; 165*5cbe1848SHarman Kalra return 0; 166*5cbe1848SHarman Kalra } else if (rte_mbuf_refcnt_update(m, -1) == 0) { 167*5cbe1848SHarman Kalra if (!RTE_MBUF_DIRECT(m)) 168*5cbe1848SHarman Kalra return octeontx_pktmbuf_detach(m); 169*5cbe1848SHarman Kalra 170*5cbe1848SHarman Kalra rte_mbuf_refcnt_set(m, 1); 171*5cbe1848SHarman Kalra m->next = NULL; 172*5cbe1848SHarman Kalra m->nb_segs = 1; 173*5cbe1848SHarman Kalra return 0; 174*5cbe1848SHarman Kalra } 175*5cbe1848SHarman Kalra 176*5cbe1848SHarman Kalra /* Mbuf is having refcount more than 1 so need not to be freed */ 177*5cbe1848SHarman Kalra return 1; 178*5cbe1848SHarman Kalra } 179*5cbe1848SHarman Kalra 1807f4116bdSHarman Kalra static __rte_always_inline uint16_t 1817f4116bdSHarman Kalra __octeontx_xmit_prepare(struct rte_mbuf *tx_pkt, uint64_t *cmd_buf, 182*5cbe1848SHarman Kalra const uint16_t flag) 1831dedffebSPavan Nikhilesh { 1847f4116bdSHarman Kalra uint16_t gaura_id, nb_desc = 0; 1851dedffebSPavan Nikhilesh 18685221a0cSHarman Kalra /* Setup PKO_SEND_HDR_S */ 18785221a0cSHarman Kalra cmd_buf[nb_desc++] = tx_pkt->data_len & 0xffff; 18885221a0cSHarman Kalra cmd_buf[nb_desc++] = 0x0; 18985221a0cSHarman Kalra 190*5cbe1848SHarman Kalra /* SEND_HDR[DF] bit controls if buffer is to be freed or 191*5cbe1848SHarman Kalra * not, as SG_DESC[I] and SEND_HDR[II] are clear. 192*5cbe1848SHarman Kalra */ 193*5cbe1848SHarman Kalra if (flag & OCCTX_TX_OFFLOAD_MBUF_NOFF_F) 194*5cbe1848SHarman Kalra cmd_buf[0] |= (octeontx_prefree_seg(tx_pkt) << 195*5cbe1848SHarman Kalra 58); 196*5cbe1848SHarman Kalra 19785221a0cSHarman Kalra /* Mark mempool object as "put" since it is freed by PKO */ 19885221a0cSHarman Kalra if (!(cmd_buf[0] & (1ULL << 58))) 19985221a0cSHarman Kalra __mempool_check_cookies(tx_pkt->pool, (void **)&tx_pkt, 20085221a0cSHarman Kalra 1, 0); 20185221a0cSHarman Kalra /* Get the gaura Id */ 20285221a0cSHarman Kalra gaura_id = octeontx_fpa_bufpool_gpool((uintptr_t) 20385221a0cSHarman Kalra tx_pkt->pool->pool_id); 20485221a0cSHarman Kalra 20585221a0cSHarman Kalra /* Setup PKO_SEND_BUFLINK_S */ 20685221a0cSHarman Kalra cmd_buf[nb_desc++] = PKO_SEND_BUFLINK_SUBDC | 20785221a0cSHarman Kalra PKO_SEND_BUFLINK_LDTYPE(0x1ull) | 20885221a0cSHarman Kalra PKO_SEND_BUFLINK_GAUAR((long)gaura_id) | 20985221a0cSHarman Kalra tx_pkt->data_len; 21085221a0cSHarman Kalra cmd_buf[nb_desc++] = rte_mbuf_data_iova(tx_pkt); 2111dedffebSPavan Nikhilesh 2127f4116bdSHarman Kalra return nb_desc; 2131dedffebSPavan Nikhilesh } 2141dedffebSPavan Nikhilesh 2157f4116bdSHarman Kalra static __rte_always_inline uint16_t 2167f4116bdSHarman Kalra __octeontx_xmit_mseg_prepare(struct rte_mbuf *tx_pkt, uint64_t *cmd_buf, 217*5cbe1848SHarman Kalra const uint16_t flag) 2187f4116bdSHarman Kalra { 2197f4116bdSHarman Kalra uint16_t nb_segs, nb_desc = 0; 2207f4116bdSHarman Kalra uint16_t gaura_id, len = 0; 2217f4116bdSHarman Kalra struct rte_mbuf *m_next = NULL; 2229e747589SJerin Jacob 2237f4116bdSHarman Kalra nb_segs = tx_pkt->nb_segs; 2247f4116bdSHarman Kalra /* Setup PKO_SEND_HDR_S */ 2257f4116bdSHarman Kalra cmd_buf[nb_desc++] = tx_pkt->pkt_len & 0xffff; 2267f4116bdSHarman Kalra cmd_buf[nb_desc++] = 0x0; 2277f4116bdSHarman Kalra 2287f4116bdSHarman Kalra do { 2297f4116bdSHarman Kalra m_next = tx_pkt->next; 2307f4116bdSHarman Kalra /* To handle case where mbufs belong to diff pools, like 2317f4116bdSHarman Kalra * fragmentation 2327f4116bdSHarman Kalra */ 2337f4116bdSHarman Kalra gaura_id = octeontx_fpa_bufpool_gpool((uintptr_t) 2347f4116bdSHarman Kalra tx_pkt->pool->pool_id); 2357f4116bdSHarman Kalra 2367f4116bdSHarman Kalra /* Setup PKO_SEND_GATHER_S */ 2377f4116bdSHarman Kalra cmd_buf[nb_desc] = PKO_SEND_GATHER_SUBDC | 2387f4116bdSHarman Kalra PKO_SEND_GATHER_LDTYPE(0x1ull) | 2397f4116bdSHarman Kalra PKO_SEND_GATHER_GAUAR((long)gaura_id) | 2407f4116bdSHarman Kalra tx_pkt->data_len; 2417f4116bdSHarman Kalra 242*5cbe1848SHarman Kalra /* SG_DESC[I] bit controls if buffer is to be freed or 243*5cbe1848SHarman Kalra * not, as SEND_HDR[DF] and SEND_HDR[II] are clear. 244*5cbe1848SHarman Kalra */ 245*5cbe1848SHarman Kalra if (flag & OCCTX_TX_OFFLOAD_MBUF_NOFF_F) { 246*5cbe1848SHarman Kalra cmd_buf[nb_desc] |= 247*5cbe1848SHarman Kalra (octeontx_prefree_seg(tx_pkt) << 57); 248*5cbe1848SHarman Kalra } 249*5cbe1848SHarman Kalra 2507f4116bdSHarman Kalra /* Mark mempool object as "put" since it is freed by 2517f4116bdSHarman Kalra * PKO. 2527f4116bdSHarman Kalra */ 2537f4116bdSHarman Kalra if (!(cmd_buf[nb_desc] & (1ULL << 57))) { 2547f4116bdSHarman Kalra tx_pkt->next = NULL; 2557f4116bdSHarman Kalra __mempool_check_cookies(tx_pkt->pool, 2567f4116bdSHarman Kalra (void **)&tx_pkt, 1, 0); 2577f4116bdSHarman Kalra } 2587f4116bdSHarman Kalra nb_desc++; 2597f4116bdSHarman Kalra 2607f4116bdSHarman Kalra cmd_buf[nb_desc++] = rte_mbuf_data_iova(tx_pkt); 2617f4116bdSHarman Kalra 2627f4116bdSHarman Kalra nb_segs--; 2637f4116bdSHarman Kalra len += tx_pkt->data_len; 2647f4116bdSHarman Kalra tx_pkt = m_next; 2657f4116bdSHarman Kalra } while (nb_segs); 2667f4116bdSHarman Kalra 2677f4116bdSHarman Kalra return nb_desc; 2687f4116bdSHarman Kalra } 2697f4116bdSHarman Kalra 2707f4116bdSHarman Kalra static __rte_always_inline uint16_t 2717f4116bdSHarman Kalra __octeontx_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, 2727f4116bdSHarman Kalra uint16_t nb_pkts, uint64_t *cmd_buf, 2737f4116bdSHarman Kalra const uint16_t flags) 2747f4116bdSHarman Kalra { 2757f4116bdSHarman Kalra struct octeontx_txq *txq = tx_queue; 2767f4116bdSHarman Kalra octeontx_dq_t *dq = &txq->dq; 2777f4116bdSHarman Kalra uint16_t count = 0, nb_desc; 2787f4116bdSHarman Kalra rte_cio_wmb(); 2797f4116bdSHarman Kalra 2807f4116bdSHarman Kalra while (count < nb_pkts) { 2817f4116bdSHarman Kalra if (unlikely(*((volatile int64_t *)dq->fc_status_va) < 0)) 2827f4116bdSHarman Kalra break; 2837f4116bdSHarman Kalra 2847f4116bdSHarman Kalra if (flags & OCCTX_TX_MULTI_SEG_F) { 2857f4116bdSHarman Kalra nb_desc = __octeontx_xmit_mseg_prepare(tx_pkts[count], 2867f4116bdSHarman Kalra cmd_buf, flags); 2877f4116bdSHarman Kalra } else { 2887f4116bdSHarman Kalra nb_desc = __octeontx_xmit_prepare(tx_pkts[count], 2897f4116bdSHarman Kalra cmd_buf, flags); 2907f4116bdSHarman Kalra } 2917f4116bdSHarman Kalra 2927f4116bdSHarman Kalra octeontx_reg_lmtst(dq->lmtline_va, dq->ioreg_va, cmd_buf, 2937f4116bdSHarman Kalra nb_desc); 2947f4116bdSHarman Kalra 2957f4116bdSHarman Kalra count++; 2967f4116bdSHarman Kalra } 2977f4116bdSHarman Kalra return count; 2987f4116bdSHarman Kalra } 29985221a0cSHarman Kalra 30085221a0cSHarman Kalra uint16_t 3012d2c7918SJerin Jacob octeontx_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts); 3029e747589SJerin Jacob 303*5cbe1848SHarman Kalra #define NOFF_F OCCTX_TX_OFFLOAD_MBUF_NOFF_F 3047f4116bdSHarman Kalra #define MULT_F OCCTX_TX_MULTI_SEG_F 3057f4116bdSHarman Kalra /* [NOFF] [MULTI_SEG] */ 3067f4116bdSHarman Kalra #define OCCTX_TX_FASTPATH_MODES \ 307*5cbe1848SHarman Kalra T(no_offload, 0, 0, 4, OCCTX_TX_OFFLOAD_NONE) \ 308*5cbe1848SHarman Kalra T(mseg, 0, 1, 14, MULT_F) \ 309*5cbe1848SHarman Kalra T(noff, 1, 0, 4, NOFF_F) \ 310*5cbe1848SHarman Kalra T(noff_mseg, 1, 1, 14, NOFF_F | MULT_F) 3117f4116bdSHarman Kalra 3129e747589SJerin Jacob #endif /* __OCTEONTX_RXTX_H__ */ 313