xref: /dpdk/drivers/net/cnxk/cn10k_rxtx.h (revision e77506397fc8005c5129e22e9e2d15d5876790fd)
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