1357afd6dSRahul Bhansali /* SPDX-License-Identifier: BSD-3-Clause 2357afd6dSRahul Bhansali * Copyright(C) 2022 Marvell. 3357afd6dSRahul Bhansali */ 4357afd6dSRahul Bhansali 5357afd6dSRahul Bhansali #ifndef __CN10K_RXTX_H__ 6357afd6dSRahul Bhansali #define __CN10K_RXTX_H__ 7357afd6dSRahul Bhansali 8357afd6dSRahul Bhansali #include <rte_security.h> 9357afd6dSRahul Bhansali 10357afd6dSRahul Bhansali /* ROC Constants */ 11357afd6dSRahul Bhansali #include "roc_constants.h" 12357afd6dSRahul Bhansali 13357afd6dSRahul Bhansali /* Platform definition */ 14357afd6dSRahul Bhansali #include "roc_platform.h" 15357afd6dSRahul Bhansali 16357afd6dSRahul Bhansali /* IO */ 17357afd6dSRahul Bhansali #if defined(__aarch64__) 18357afd6dSRahul Bhansali #include "roc_io.h" 19357afd6dSRahul Bhansali #else 20357afd6dSRahul Bhansali #include "roc_io_generic.h" 21357afd6dSRahul Bhansali #endif 22357afd6dSRahul Bhansali 23357afd6dSRahul Bhansali /* HW structure definition */ 24357afd6dSRahul Bhansali #include "hw/cpt.h" 25357afd6dSRahul Bhansali #include "hw/nix.h" 26357afd6dSRahul Bhansali #include "hw/npa.h" 27357afd6dSRahul Bhansali #include "hw/npc.h" 28357afd6dSRahul Bhansali #include "hw/ssow.h" 29357afd6dSRahul Bhansali 30357afd6dSRahul Bhansali #include "roc_ie_ot.h" 31357afd6dSRahul Bhansali 32357afd6dSRahul Bhansali /* NPA */ 33357afd6dSRahul Bhansali #include "roc_npa_dp.h" 34357afd6dSRahul Bhansali 35357afd6dSRahul Bhansali /* SSO */ 36357afd6dSRahul Bhansali #include "roc_sso_dp.h" 37357afd6dSRahul Bhansali 38357afd6dSRahul Bhansali /* CPT */ 39357afd6dSRahul Bhansali #include "roc_cpt.h" 40357afd6dSRahul Bhansali 41357afd6dSRahul Bhansali /* NIX Inline dev */ 42357afd6dSRahul Bhansali #include "roc_nix_inl_dp.h" 43357afd6dSRahul Bhansali 44357afd6dSRahul Bhansali #include "cnxk_ethdev_dp.h" 45357afd6dSRahul Bhansali 46357afd6dSRahul Bhansali struct cn10k_eth_txq { 47357afd6dSRahul Bhansali uint64_t send_hdr_w0; 48357afd6dSRahul Bhansali int64_t fc_cache_pkts; 49357afd6dSRahul Bhansali uint64_t *fc_mem; 50357afd6dSRahul Bhansali uintptr_t lmt_base; 51357afd6dSRahul Bhansali rte_iova_t io_addr; 52357afd6dSRahul Bhansali uint16_t sqes_per_sqb_log2; 53357afd6dSRahul Bhansali int16_t nb_sqb_bufs_adj; 54e5d2f9e6SRahul Bhansali uint8_t flag; 55357afd6dSRahul Bhansali rte_iova_t cpt_io_addr; 56357afd6dSRahul Bhansali uint64_t sa_base; 57357afd6dSRahul Bhansali uint64_t *cpt_fc; 58357afd6dSRahul Bhansali uint16_t cpt_desc; 59357afd6dSRahul Bhansali int32_t *cpt_fc_sw; 60357afd6dSRahul Bhansali uint64_t lso_tun_fmt; 61357afd6dSRahul Bhansali uint64_t ts_mem; 62357afd6dSRahul Bhansali uint64_t mark_flag : 8; 63357afd6dSRahul Bhansali uint64_t mark_fmt : 48; 64357afd6dSRahul Bhansali struct cnxk_eth_txq_comp tx_compl; 65eabbac98SPavan Nikhilesh uint16_t tx_offload_flags; 66357afd6dSRahul Bhansali } __plt_cache_aligned; 67357afd6dSRahul Bhansali 68357afd6dSRahul Bhansali struct cn10k_eth_rxq { 69357afd6dSRahul Bhansali uint64_t mbuf_initializer; 70357afd6dSRahul Bhansali uintptr_t desc; 71357afd6dSRahul Bhansali void *lookup_mem; 72357afd6dSRahul Bhansali uintptr_t cq_door; 73357afd6dSRahul Bhansali uint64_t wdata; 74357afd6dSRahul Bhansali int64_t *cq_status; 75357afd6dSRahul Bhansali uint32_t head; 76357afd6dSRahul Bhansali uint32_t qmask; 77357afd6dSRahul Bhansali uint32_t available; 78357afd6dSRahul Bhansali uint16_t data_off; 79357afd6dSRahul Bhansali uint64_t sa_base; 80357afd6dSRahul Bhansali uint64_t lmt_base; 81357afd6dSRahul Bhansali uint64_t meta_aura; 825e9e008dSNithin Dabilpuram uintptr_t meta_pool; 83357afd6dSRahul Bhansali uint16_t rq; 84357afd6dSRahul Bhansali struct cnxk_timesync_info *tstamp; 85357afd6dSRahul Bhansali } __plt_cache_aligned; 86357afd6dSRahul Bhansali 87357afd6dSRahul Bhansali /* Private data in sw rsvd area of struct roc_ot_ipsec_inb_sa */ 88357afd6dSRahul Bhansali struct cn10k_inb_priv_data { 89357afd6dSRahul Bhansali void *userdata; 90357afd6dSRahul Bhansali int reass_dynfield_off; 91357afd6dSRahul Bhansali int reass_dynflag_bit; 92357afd6dSRahul Bhansali struct cnxk_eth_sec_sess *eth_sec; 93357afd6dSRahul Bhansali }; 94357afd6dSRahul Bhansali 95*e7750639SAndre Muezerie struct __rte_packed_begin cn10k_sec_sess_priv { 96357afd6dSRahul Bhansali union { 97357afd6dSRahul Bhansali struct { 98357afd6dSRahul Bhansali uint32_t sa_idx; 99357afd6dSRahul Bhansali uint8_t inb_sa : 1; 100357afd6dSRahul Bhansali uint8_t outer_ip_ver : 1; 101357afd6dSRahul Bhansali uint8_t mode : 1; 102357afd6dSRahul Bhansali uint8_t roundup_byte : 5; 103357afd6dSRahul Bhansali uint8_t roundup_len; 104357afd6dSRahul Bhansali uint16_t partial_len : 10; 105357afd6dSRahul Bhansali uint16_t chksum : 2; 106357afd6dSRahul Bhansali uint16_t dec_ttl : 1; 107357afd6dSRahul Bhansali uint16_t nixtx_off : 1; 108357afd6dSRahul Bhansali uint16_t rsvd : 2; 109357afd6dSRahul Bhansali }; 110357afd6dSRahul Bhansali 111357afd6dSRahul Bhansali uint64_t u64; 112357afd6dSRahul Bhansali }; 113*e7750639SAndre Muezerie } __rte_packed_end; 114357afd6dSRahul Bhansali 115357afd6dSRahul Bhansali #define LMT_OFF(lmt_addr, lmt_num, offset) \ 116357afd6dSRahul Bhansali (void *)((uintptr_t)(lmt_addr) + \ 117357afd6dSRahul Bhansali ((uint64_t)(lmt_num) << ROC_LMT_LINE_SIZE_LOG2) + (offset)) 118357afd6dSRahul Bhansali 1195a965b9bSRakesh Kudurumalla static inline uint16_t 1205a965b9bSRakesh Kudurumalla nix_tx_compl_nb_pkts(struct cn10k_eth_txq *txq, const uint64_t wdata, 1215a965b9bSRakesh Kudurumalla const uint32_t qmask) 1225a965b9bSRakesh Kudurumalla { 1235a965b9bSRakesh Kudurumalla uint16_t available = txq->tx_compl.available; 1245a965b9bSRakesh Kudurumalla 1255a965b9bSRakesh Kudurumalla /* Update the available count if cached value is not enough */ 1265a965b9bSRakesh Kudurumalla if (!unlikely(available)) { 1275a965b9bSRakesh Kudurumalla uint64_t reg, head, tail; 1285a965b9bSRakesh Kudurumalla 1295a965b9bSRakesh Kudurumalla /* Use LDADDA version to avoid reorder */ 1305a965b9bSRakesh Kudurumalla reg = roc_atomic64_add_sync(wdata, txq->tx_compl.cq_status); 1315a965b9bSRakesh Kudurumalla /* CQ_OP_STATUS operation error */ 1325a965b9bSRakesh Kudurumalla if (reg & BIT_ULL(NIX_CQ_OP_STAT_OP_ERR) || 1335a965b9bSRakesh Kudurumalla reg & BIT_ULL(NIX_CQ_OP_STAT_CQ_ERR)) 1345a965b9bSRakesh Kudurumalla return 0; 1355a965b9bSRakesh Kudurumalla 1365a965b9bSRakesh Kudurumalla tail = reg & 0xFFFFF; 1375a965b9bSRakesh Kudurumalla head = (reg >> 20) & 0xFFFFF; 1385a965b9bSRakesh Kudurumalla if (tail < head) 1395a965b9bSRakesh Kudurumalla available = tail - head + qmask + 1; 1405a965b9bSRakesh Kudurumalla else 1415a965b9bSRakesh Kudurumalla available = tail - head; 1425a965b9bSRakesh Kudurumalla 1435a965b9bSRakesh Kudurumalla txq->tx_compl.available = available; 1445a965b9bSRakesh Kudurumalla } 1455a965b9bSRakesh Kudurumalla return available; 1465a965b9bSRakesh Kudurumalla } 1475a965b9bSRakesh Kudurumalla 1485a965b9bSRakesh Kudurumalla static inline void 1495a965b9bSRakesh Kudurumalla handle_tx_completion_pkts(struct cn10k_eth_txq *txq, uint8_t mt_safe) 1505a965b9bSRakesh Kudurumalla { 1515a965b9bSRakesh Kudurumalla #define CNXK_NIX_CQ_ENTRY_SZ 128 1525a965b9bSRakesh Kudurumalla #define CQE_SZ(x) ((x) * CNXK_NIX_CQ_ENTRY_SZ) 1535a965b9bSRakesh Kudurumalla 1545a965b9bSRakesh Kudurumalla uint16_t tx_pkts = 0, nb_pkts; 1555a965b9bSRakesh Kudurumalla const uintptr_t desc = txq->tx_compl.desc_base; 1565a965b9bSRakesh Kudurumalla const uint64_t wdata = txq->tx_compl.wdata; 1575a965b9bSRakesh Kudurumalla const uint32_t qmask = txq->tx_compl.qmask; 1585a965b9bSRakesh Kudurumalla uint32_t head = txq->tx_compl.head; 1595a965b9bSRakesh Kudurumalla struct nix_cqe_hdr_s *tx_compl_cq; 1605a965b9bSRakesh Kudurumalla struct nix_send_comp_s *tx_compl_s0; 1615a965b9bSRakesh Kudurumalla struct rte_mbuf *m_next, *m; 1625a965b9bSRakesh Kudurumalla 1635a965b9bSRakesh Kudurumalla if (mt_safe) 1645a965b9bSRakesh Kudurumalla rte_spinlock_lock(&txq->tx_compl.ext_buf_lock); 1655a965b9bSRakesh Kudurumalla 1665a965b9bSRakesh Kudurumalla nb_pkts = nix_tx_compl_nb_pkts(txq, wdata, qmask); 1675a965b9bSRakesh Kudurumalla while (tx_pkts < nb_pkts) { 1685a965b9bSRakesh Kudurumalla rte_prefetch_non_temporal((void *)(desc + 1695a965b9bSRakesh Kudurumalla (CQE_SZ((head + 2) & qmask)))); 1705a965b9bSRakesh Kudurumalla tx_compl_cq = (struct nix_cqe_hdr_s *) 1715a965b9bSRakesh Kudurumalla (desc + CQE_SZ(head)); 1725a965b9bSRakesh Kudurumalla tx_compl_s0 = (struct nix_send_comp_s *) 1735a965b9bSRakesh Kudurumalla ((uint64_t *)tx_compl_cq + 1); 1745a965b9bSRakesh Kudurumalla m = txq->tx_compl.ptr[tx_compl_s0->sqe_id]; 1755a965b9bSRakesh Kudurumalla while (m->next != NULL) { 1765a965b9bSRakesh Kudurumalla m_next = m->next; 1775a965b9bSRakesh Kudurumalla rte_pktmbuf_free_seg(m); 1785a965b9bSRakesh Kudurumalla m = m_next; 1795a965b9bSRakesh Kudurumalla } 1805a965b9bSRakesh Kudurumalla rte_pktmbuf_free_seg(m); 1813232c95dSNithin Dabilpuram txq->tx_compl.ptr[tx_compl_s0->sqe_id] = NULL; 1825a965b9bSRakesh Kudurumalla 1835a965b9bSRakesh Kudurumalla head++; 1845a965b9bSRakesh Kudurumalla head &= qmask; 1855a965b9bSRakesh Kudurumalla tx_pkts++; 1865a965b9bSRakesh Kudurumalla } 1875a965b9bSRakesh Kudurumalla txq->tx_compl.head = head; 1885a965b9bSRakesh Kudurumalla txq->tx_compl.available -= nb_pkts; 1895a965b9bSRakesh Kudurumalla 1905a965b9bSRakesh Kudurumalla plt_write64((wdata | nb_pkts), txq->tx_compl.cq_door); 1915a965b9bSRakesh Kudurumalla 1925a965b9bSRakesh Kudurumalla if (mt_safe) 1935a965b9bSRakesh Kudurumalla rte_spinlock_unlock(&txq->tx_compl.ext_buf_lock); 1945a965b9bSRakesh Kudurumalla } 1955a965b9bSRakesh Kudurumalla 19647cca253SRahul Bhansali static __rte_always_inline uint64_t 19747cca253SRahul Bhansali cn10k_cpt_tx_steor_data(void) 19847cca253SRahul Bhansali { 19947cca253SRahul Bhansali /* We have two CPT instructions per LMTLine */ 20047cca253SRahul Bhansali const uint64_t dw_m1 = ROC_CN10K_TWO_CPT_INST_DW_M1; 20147cca253SRahul Bhansali uint64_t data; 20247cca253SRahul Bhansali 20347cca253SRahul Bhansali /* This will be moved to addr area */ 20447cca253SRahul Bhansali data = dw_m1 << 16; 20547cca253SRahul Bhansali data |= dw_m1 << 19; 20647cca253SRahul Bhansali data |= dw_m1 << 22; 20747cca253SRahul Bhansali data |= dw_m1 << 25; 20847cca253SRahul Bhansali data |= dw_m1 << 28; 20947cca253SRahul Bhansali data |= dw_m1 << 31; 21047cca253SRahul Bhansali data |= dw_m1 << 34; 21147cca253SRahul Bhansali data |= dw_m1 << 37; 21247cca253SRahul Bhansali data |= dw_m1 << 40; 21347cca253SRahul Bhansali data |= dw_m1 << 43; 21447cca253SRahul Bhansali data |= dw_m1 << 46; 21547cca253SRahul Bhansali data |= dw_m1 << 49; 21647cca253SRahul Bhansali data |= dw_m1 << 52; 21747cca253SRahul Bhansali data |= dw_m1 << 55; 21847cca253SRahul Bhansali data |= dw_m1 << 58; 21947cca253SRahul Bhansali data |= dw_m1 << 61; 22047cca253SRahul Bhansali 22147cca253SRahul Bhansali return data; 22247cca253SRahul Bhansali } 22347cca253SRahul Bhansali 22447cca253SRahul Bhansali static __rte_always_inline void 22547cca253SRahul Bhansali cn10k_nix_sec_steorl(uintptr_t io_addr, uint32_t lmt_id, uint8_t lnum, 22647cca253SRahul Bhansali uint8_t loff, uint8_t shft) 22747cca253SRahul Bhansali { 22847cca253SRahul Bhansali uint64_t data; 22947cca253SRahul Bhansali uintptr_t pa; 23047cca253SRahul Bhansali 23147cca253SRahul Bhansali /* Check if there is any CPT instruction to submit */ 23247cca253SRahul Bhansali if (!lnum && !loff) 23347cca253SRahul Bhansali return; 23447cca253SRahul Bhansali 23547cca253SRahul Bhansali data = cn10k_cpt_tx_steor_data(); 23647cca253SRahul Bhansali /* Update lmtline use for partial end line */ 23747cca253SRahul Bhansali if (loff) { 23847cca253SRahul Bhansali data &= ~(0x7ULL << shft); 23947cca253SRahul Bhansali /* Update it to half full i.e 64B */ 24047cca253SRahul Bhansali data |= (0x3UL << shft); 24147cca253SRahul Bhansali } 24247cca253SRahul Bhansali 24347cca253SRahul Bhansali pa = io_addr | ((data >> 16) & 0x7) << 4; 24447cca253SRahul Bhansali data &= ~(0x7ULL << 16); 24547cca253SRahul Bhansali /* Update lines - 1 that contain valid data */ 24647cca253SRahul Bhansali data |= ((uint64_t)(lnum + loff - 1)) << 12; 24747cca253SRahul Bhansali data |= (uint64_t)lmt_id; 24847cca253SRahul Bhansali 24947cca253SRahul Bhansali /* STEOR */ 25047cca253SRahul Bhansali roc_lmt_submit_steorl(data, pa); 25147cca253SRahul Bhansali } 25247cca253SRahul Bhansali 253357afd6dSRahul Bhansali #endif /* __CN10K_RXTX_H__ */ 254