xref: /dpdk/drivers/net/octeon_ep/otx_ep_common.h (revision 2b843cac232eb3f2fa79e4254e21766817e2019f)
1423c8a29SSathesh Edara /* SPDX-License-Identifier: BSD-3-Clause
2423c8a29SSathesh Edara  * Copyright(C) 2021 Marvell.
3423c8a29SSathesh Edara  */
4423c8a29SSathesh Edara #ifndef _OTX_EP_COMMON_H_
5423c8a29SSathesh Edara #define _OTX_EP_COMMON_H_
6423c8a29SSathesh Edara 
735dee56cSVamsi Attunuru #include <rte_bitops.h>
8c836a7baSSathesh Edara #include <rte_spinlock.h>
935dee56cSVamsi Attunuru #include <unistd.h>
1035dee56cSVamsi Attunuru #include <assert.h>
1135dee56cSVamsi Attunuru #include <rte_eal.h>
12831cf744SVamsi Attunuru #include <rte_kvargs.h>
1335dee56cSVamsi Attunuru #include <rte_mempool.h>
1435dee56cSVamsi Attunuru #include <rte_mbuf.h>
1535dee56cSVamsi Attunuru #include <rte_io.h>
1635dee56cSVamsi Attunuru #include <rte_net.h>
1735dee56cSVamsi Attunuru #include <ethdev_pci.h>
1835dee56cSVamsi Attunuru 
1935dee56cSVamsi Attunuru #define OTX_EP_CN8XX  RTE_BIT32(0)
2035dee56cSVamsi Attunuru #define OTX_EP_CN9XX  RTE_BIT32(1)
2135dee56cSVamsi Attunuru #define OTX_EP_CN10XX RTE_BIT32(2)
22423c8a29SSathesh Edara 
23423c8a29SSathesh Edara #define OTX_EP_NW_PKT_OP               0x1220
24423c8a29SSathesh Edara #define OTX_EP_NW_CMD_OP               0x1221
25423c8a29SSathesh Edara 
26423c8a29SSathesh Edara #define OTX_EP_MAX_RINGS_PER_VF        (8)
27423c8a29SSathesh Edara #define OTX_EP_CFG_IO_QUEUES        OTX_EP_MAX_RINGS_PER_VF
28e9405625SShijith Thotton #define OTX_EP_32BYTE_INSTR         (32)
29423c8a29SSathesh Edara #define OTX_EP_64BYTE_INSTR         (64)
3063bc642eSSathesh Edara /*
3163bc642eSSathesh Edara  * Backpressure for SDP is configured on Octeon, and the minimum queue sizes
3263bc642eSSathesh Edara  * must be much larger than the backpressure watermark configured in the Octeon
3363bc642eSSathesh Edara  * SDP driver.  IQ and OQ backpressure configurations are separate.
3463bc642eSSathesh Edara  */
3563bc642eSSathesh Edara #define OTX_EP_MIN_IQ_DESCRIPTORS   (2048)
3663bc642eSSathesh Edara #define OTX_EP_MIN_OQ_DESCRIPTORS   (2048)
37423c8a29SSathesh Edara #define OTX_EP_MAX_IQ_DESCRIPTORS   (8192)
38423c8a29SSathesh Edara #define OTX_EP_MAX_OQ_DESCRIPTORS   (8192)
39423c8a29SSathesh Edara #define OTX_EP_OQ_BUF_SIZE          (2048)
40423c8a29SSathesh Edara #define OTX_EP_MIN_RX_BUF_SIZE      (64)
414a3a2a1dSSathesh Edara #define OTX_EP_OQ_WMARK_MIN         (256)
42423c8a29SSathesh Edara 
43423c8a29SSathesh Edara #define OTX_EP_OQ_INFOPTR_MODE      (0)
44423c8a29SSathesh Edara #define OTX_EP_OQ_REFIL_THRESHOLD   (16)
45423c8a29SSathesh Edara 
46423c8a29SSathesh Edara /* IQ instruction req types */
47423c8a29SSathesh Edara #define OTX_EP_REQTYPE_NONE             (0)
48423c8a29SSathesh Edara #define OTX_EP_REQTYPE_NORESP_INSTR     (1)
49423c8a29SSathesh Edara #define OTX_EP_REQTYPE_NORESP_NET_DIRECT       (2)
50423c8a29SSathesh Edara #define OTX_EP_REQTYPE_NORESP_NET       OTX_EP_REQTYPE_NORESP_NET_DIRECT
51423c8a29SSathesh Edara #define OTX_EP_REQTYPE_NORESP_GATHER    (3)
52423c8a29SSathesh Edara #define OTX_EP_NORESP_OHSM_SEND     (4)
53423c8a29SSathesh Edara #define OTX_EP_NORESP_LAST          (4)
54423c8a29SSathesh Edara #define OTX_EP_PCI_RING_ALIGN   65536
5535dee56cSVamsi Attunuru #define OTX_EP_MAX_SG_LISTS 6
563db81df3SVamsi Attunuru #define OTX_EP_NUM_SG_PTRS 4
57423c8a29SSathesh Edara #define SDP_PKIND 40
58423c8a29SSathesh Edara #define SDP_OTX2_PKIND 57
594e356755SSathesh Edara #define SDP_OTX2_PKIND_FS0 0
60423c8a29SSathesh Edara 
61423c8a29SSathesh Edara #define      ORDERED_TAG 0
62423c8a29SSathesh Edara #define      ATOMIC_TAG  1
63423c8a29SSathesh Edara #define      NULL_TAG  2
64423c8a29SSathesh Edara #define      NULL_NULL_TAG  3
65423c8a29SSathesh Edara 
66423c8a29SSathesh Edara #define OTX_EP_BUSY_LOOP_COUNT      (10000)
67423c8a29SSathesh Edara #define OTX_EP_MAX_IOQS_PER_VF 8
68423c8a29SSathesh Edara #define OTX_CUST_DATA_LEN 0
69423c8a29SSathesh Edara 
70*2b843cacSDavid Marchand #define otx_ep_info(...) \
71*2b843cacSDavid Marchand 	RTE_LOG_LINE_PREFIX(INFO, OTX_NET_EP, "%s():%u ", \
72*2b843cacSDavid Marchand 		__func__ RTE_LOG_COMMA __LINE__, __VA_ARGS__)
73423c8a29SSathesh Edara 
74*2b843cacSDavid Marchand #define otx_ep_err(...) \
75*2b843cacSDavid Marchand 	RTE_LOG_LINE_PREFIX(ERR, OTX_NET_EP, "%s():%u ", \
76*2b843cacSDavid Marchand 		__func__ RTE_LOG_COMMA __LINE__, __VA_ARGS__)
77423c8a29SSathesh Edara 
78*2b843cacSDavid Marchand #define otx_ep_dbg(...) \
79*2b843cacSDavid Marchand 	RTE_LOG_LINE_PREFIX(DEBUG, OTX_NET_EP, "%s():%u ", \
80*2b843cacSDavid Marchand 		__func__ RTE_LOG_COMMA __LINE__, __VA_ARGS__)
81423c8a29SSathesh Edara 
82d826133aSSathesh Edara /* IO Access */
83d826133aSSathesh Edara #define oct_ep_read64(addr) rte_read64_relaxed((void *)(addr))
84d826133aSSathesh Edara #define oct_ep_write64(val, addr) rte_write64_relaxed((val), (void *)(addr))
85d826133aSSathesh Edara 
86c836a7baSSathesh Edara /* Mailbox maximum data size */
87c836a7baSSathesh Edara #define MBOX_MAX_DATA_BUF_SIZE 320
88c836a7baSSathesh Edara 
89423c8a29SSathesh Edara /* Input Request Header format */
90423c8a29SSathesh Edara union otx_ep_instr_irh {
91423c8a29SSathesh Edara 	uint64_t u64;
92423c8a29SSathesh Edara 	struct {
93423c8a29SSathesh Edara 		/* Request ID  */
94423c8a29SSathesh Edara 		uint64_t rid:16;
95423c8a29SSathesh Edara 
96423c8a29SSathesh Edara 		/* PCIe port to use for response */
97423c8a29SSathesh Edara 		uint64_t pcie_port:3;
98423c8a29SSathesh Edara 
99423c8a29SSathesh Edara 		/* Scatter indicator  1=scatter */
100423c8a29SSathesh Edara 		uint64_t scatter:1;
101423c8a29SSathesh Edara 
102423c8a29SSathesh Edara 		/* Size of Expected result OR no. of entries in scatter list */
103423c8a29SSathesh Edara 		uint64_t rlenssz:14;
104423c8a29SSathesh Edara 
105423c8a29SSathesh Edara 		/* Desired destination port for result */
106423c8a29SSathesh Edara 		uint64_t dport:6;
107423c8a29SSathesh Edara 
108423c8a29SSathesh Edara 		/* Opcode Specific parameters */
109423c8a29SSathesh Edara 		uint64_t param:8;
110423c8a29SSathesh Edara 
111423c8a29SSathesh Edara 		/* Opcode for the return packet  */
112423c8a29SSathesh Edara 		uint64_t opcode:16;
113423c8a29SSathesh Edara 	} s;
114423c8a29SSathesh Edara };
115423c8a29SSathesh Edara 
116423c8a29SSathesh Edara #define otx_ep_write64(value, base_addr, reg_off) \
117423c8a29SSathesh Edara 	{\
118423c8a29SSathesh Edara 	typeof(value) val = (value); \
119423c8a29SSathesh Edara 	typeof(reg_off) off = (reg_off); \
120f665790aSDavid Marchand 	otx_ep_dbg("octeon_write_csr64: reg: 0x%08lx val: 0x%016llx", \
121423c8a29SSathesh Edara 		   (unsigned long)off, (unsigned long long)val); \
122423c8a29SSathesh Edara 	rte_write64(val, ((base_addr) + off)); \
123423c8a29SSathesh Edara 	}
124423c8a29SSathesh Edara 
125423c8a29SSathesh Edara /* Instruction Header - for OCTEON-TX models */
126423c8a29SSathesh Edara typedef union otx_ep_instr_ih {
127423c8a29SSathesh Edara 	uint64_t u64;
128423c8a29SSathesh Edara 	struct {
129423c8a29SSathesh Edara 	  /** Data Len */
130423c8a29SSathesh Edara 		uint64_t tlen:16;
131423c8a29SSathesh Edara 
132423c8a29SSathesh Edara 	  /** Reserved */
133423c8a29SSathesh Edara 		uint64_t rsvd:20;
134423c8a29SSathesh Edara 
135423c8a29SSathesh Edara 	  /** PKIND for OTX_EP */
136423c8a29SSathesh Edara 		uint64_t pkind:6;
137423c8a29SSathesh Edara 
138423c8a29SSathesh Edara 	  /** Front Data size */
139423c8a29SSathesh Edara 		uint64_t fsz:6;
140423c8a29SSathesh Edara 
141423c8a29SSathesh Edara 	  /** No. of entries in gather list */
142423c8a29SSathesh Edara 		uint64_t gsz:14;
143423c8a29SSathesh Edara 
144423c8a29SSathesh Edara 	  /** Gather indicator 1=gather*/
145423c8a29SSathesh Edara 		uint64_t gather:1;
146423c8a29SSathesh Edara 
147423c8a29SSathesh Edara 	  /** Reserved3 */
148423c8a29SSathesh Edara 		uint64_t reserved3:1;
149423c8a29SSathesh Edara 	} s;
150423c8a29SSathesh Edara } otx_ep_instr_ih_t;
151423c8a29SSathesh Edara 
1523db81df3SVamsi Attunuru struct otx_ep_sg_entry {
1533db81df3SVamsi Attunuru 	/** The first 64 bit gives the size of data in each dptr. */
1543db81df3SVamsi Attunuru 	union {
1553db81df3SVamsi Attunuru 		uint16_t size[OTX_EP_NUM_SG_PTRS];
1563db81df3SVamsi Attunuru 		uint64_t size64;
1573db81df3SVamsi Attunuru 	} u;
1583db81df3SVamsi Attunuru 
1593db81df3SVamsi Attunuru 	/** The 4 dptr pointers for this entry. */
1603db81df3SVamsi Attunuru 	uint64_t ptr[OTX_EP_NUM_SG_PTRS];
1613db81df3SVamsi Attunuru };
1623db81df3SVamsi Attunuru 
1633db81df3SVamsi Attunuru #define OTX_EP_SG_ENTRY_SIZE	(sizeof(struct otx_ep_sg_entry))
1643db81df3SVamsi Attunuru 
1653db81df3SVamsi Attunuru /** Structure of a node in list of gather components maintained by
1663db81df3SVamsi Attunuru  *  driver for each network device.
1673db81df3SVamsi Attunuru  */
1683db81df3SVamsi Attunuru struct otx_ep_gather {
1693db81df3SVamsi Attunuru 	/** number of gather entries. */
1703db81df3SVamsi Attunuru 	int num_sg;
1713db81df3SVamsi Attunuru 
1723db81df3SVamsi Attunuru 	/** Gather component that can accommodate max sized fragment list
1733db81df3SVamsi Attunuru 	 *  received from the IP layer.
1743db81df3SVamsi Attunuru 	 */
1753db81df3SVamsi Attunuru 	struct otx_ep_sg_entry *sg;
1763db81df3SVamsi Attunuru };
1773db81df3SVamsi Attunuru 
1783db81df3SVamsi Attunuru struct otx_ep_buf_free_info {
1793db81df3SVamsi Attunuru 	struct rte_mbuf *mbuf;
1803db81df3SVamsi Attunuru 	struct otx_ep_gather g;
1813db81df3SVamsi Attunuru };
1823db81df3SVamsi Attunuru 
183423c8a29SSathesh Edara /* OTX_EP IQ request list */
184423c8a29SSathesh Edara struct otx_ep_instr_list {
1853db81df3SVamsi Attunuru 	struct otx_ep_buf_free_info finfo;
186423c8a29SSathesh Edara 	uint32_t reqtype;
187423c8a29SSathesh Edara };
188423c8a29SSathesh Edara #define OTX_EP_IQREQ_LIST_SIZE	(sizeof(struct otx_ep_instr_list))
189423c8a29SSathesh Edara 
190423c8a29SSathesh Edara /* Input Queue statistics. Each input queue has four stats fields. */
191423c8a29SSathesh Edara struct otx_ep_iq_stats {
192423c8a29SSathesh Edara 	uint64_t instr_posted; /* Instructions posted to this queue. */
193423c8a29SSathesh Edara 	uint64_t instr_processed; /* Instructions processed in this queue. */
194423c8a29SSathesh Edara 	uint64_t instr_dropped; /* Instructions that could not be processed */
195423c8a29SSathesh Edara 	uint64_t tx_pkts;
196423c8a29SSathesh Edara 	uint64_t tx_bytes;
197423c8a29SSathesh Edara };
198423c8a29SSathesh Edara 
199423c8a29SSathesh Edara /* Structure to define the configuration attributes for each Input queue. */
200423c8a29SSathesh Edara struct otx_ep_iq_config {
201423c8a29SSathesh Edara 	/* Max number of IQs available */
202423c8a29SSathesh Edara 	uint16_t max_iqs;
203423c8a29SSathesh Edara 
204423c8a29SSathesh Edara 	/* Command size - 32 or 64 bytes */
205423c8a29SSathesh Edara 	uint16_t instr_type;
206423c8a29SSathesh Edara 
207423c8a29SSathesh Edara 	/* Pending list size, usually set to the sum of the size of all IQs */
208423c8a29SSathesh Edara 	uint32_t pending_list_size;
209423c8a29SSathesh Edara };
210423c8a29SSathesh Edara 
211423c8a29SSathesh Edara /** The instruction (input) queue.
212423c8a29SSathesh Edara  *  The input queue is used to post raw (instruction) mode data or packet data
213423c8a29SSathesh Edara  *  to OCTEON 9 device from the host. Each IQ of a OTX_EP EP VF device has one
214423c8a29SSathesh Edara  *  such structure to represent it.
215423c8a29SSathesh Edara  */
216423c8a29SSathesh Edara struct otx_ep_instr_queue {
21735dee56cSVamsi Attunuru 	/* Location in memory updated by SDP ISM */
218e12a0166STyler Retzlaff 	RTE_ATOMIC(uint32_t) *inst_cnt_ism;
21935dee56cSVamsi Attunuru 	struct rte_mbuf **mbuf_list;
22035dee56cSVamsi Attunuru 	/* Pointer to the Virtual Base addr of the input ring. */
22135dee56cSVamsi Attunuru 	uint8_t *base_addr;
22235dee56cSVamsi Attunuru 
22335dee56cSVamsi Attunuru 	/* track inst count locally to consolidate HW counter updates */
224831cf744SVamsi Attunuru 	uint32_t inst_cnt_prev;
22535dee56cSVamsi Attunuru 
22635dee56cSVamsi Attunuru 	/* Input ring index, where the driver should write the next packet */
22735dee56cSVamsi Attunuru 	uint32_t host_write_index;
22835dee56cSVamsi Attunuru 
22935dee56cSVamsi Attunuru 	/* Input ring index, where the OCTEON 9 should read the next packet */
23035dee56cSVamsi Attunuru 	uint32_t otx_read_index;
23135dee56cSVamsi Attunuru 	/** This index aids in finding the window in the queue where OCTEON 9
23235dee56cSVamsi Attunuru 	 *  has read the commands.
23335dee56cSVamsi Attunuru 	 */
23435dee56cSVamsi Attunuru 	uint32_t flush_index;
23535dee56cSVamsi Attunuru 	/* This keeps track of the instructions pending in this queue. */
23635dee56cSVamsi Attunuru 	uint64_t instr_pending;
23735dee56cSVamsi Attunuru 
23835dee56cSVamsi Attunuru 	/* Memory zone */
23935dee56cSVamsi Attunuru 	const struct rte_memzone *iq_mz;
24035dee56cSVamsi Attunuru 	/* OTX_EP doorbell register for the ring. */
24135dee56cSVamsi Attunuru 	void *doorbell_reg;
24235dee56cSVamsi Attunuru 
24335dee56cSVamsi Attunuru 	/* OTX_EP instruction count register for this ring. */
24435dee56cSVamsi Attunuru 	void *inst_cnt_reg;
24535dee56cSVamsi Attunuru 
24635dee56cSVamsi Attunuru 	/* Number of instructions pending to be posted to OCTEON 9. */
24735dee56cSVamsi Attunuru 	uint32_t fill_cnt;
24835dee56cSVamsi Attunuru 
249423c8a29SSathesh Edara 	struct otx_ep_device *otx_ep_dev;
250423c8a29SSathesh Edara 
251423c8a29SSathesh Edara 	uint32_t q_no;
252423c8a29SSathesh Edara 	uint32_t pkt_in_done;
253423c8a29SSathesh Edara 
254423c8a29SSathesh Edara 	/* Flag for 64 byte commands. */
255423c8a29SSathesh Edara 	uint32_t iqcmd_64B:1;
256423c8a29SSathesh Edara 	uint32_t rsvd:17;
257423c8a29SSathesh Edara 	uint32_t status:8;
258423c8a29SSathesh Edara 
259423c8a29SSathesh Edara 	/* Number of  descriptors in this ring. */
260423c8a29SSathesh Edara 	uint32_t nb_desc;
261423c8a29SSathesh Edara 
262831cf744SVamsi Attunuru 	/* Use ISM memory */
263831cf744SVamsi Attunuru 	uint8_t ism_ena;
264831cf744SVamsi Attunuru 
265e9405625SShijith Thotton 	/* Size of the descriptor. */
266e9405625SShijith Thotton 	uint8_t desc_size;
267e9405625SShijith Thotton 
268423c8a29SSathesh Edara 	uint32_t reset_instr_cnt;
269423c8a29SSathesh Edara 
270d360d7bfSSathesh Edara 	/* Free-running/wrapping instruction counter for IQ. */
271d360d7bfSSathesh Edara 	uint32_t inst_cnt;
272d360d7bfSSathesh Edara 
27335dee56cSVamsi Attunuru 	uint64_t partial_ih;
274423c8a29SSathesh Edara 
275423c8a29SSathesh Edara 	/* This IQ request list */
276423c8a29SSathesh Edara 	struct otx_ep_instr_list *req_list;
277423c8a29SSathesh Edara 
278423c8a29SSathesh Edara 	/* Statistics for this input queue. */
279423c8a29SSathesh Edara 	struct otx_ep_iq_stats stats;
280423c8a29SSathesh Edara 
281423c8a29SSathesh Edara 	/* DMA mapped base address of the input descriptor ring. */
282423c8a29SSathesh Edara 	uint64_t base_addr_dma;
283423c8a29SSathesh Edara };
284423c8a29SSathesh Edara 
285423c8a29SSathesh Edara /** Descriptor format.
286423c8a29SSathesh Edara  *  The descriptor ring is made of descriptors which have 2 64-bit values:
287423c8a29SSathesh Edara  *  -# Physical (bus) address of the data buffer.
288423c8a29SSathesh Edara  *  -# Physical (bus) address of a otx_ep_droq_info structure.
289423c8a29SSathesh Edara  *  The device DMA's incoming packets and its information at the address
290423c8a29SSathesh Edara  *  given by these descriptor fields.
291423c8a29SSathesh Edara  */
292423c8a29SSathesh Edara struct otx_ep_droq_desc {
293423c8a29SSathesh Edara 	/* The buffer pointer */
294423c8a29SSathesh Edara 	uint64_t buffer_ptr;
295423c8a29SSathesh Edara 
296423c8a29SSathesh Edara 	/* The Info pointer */
297423c8a29SSathesh Edara 	uint64_t info_ptr;
298423c8a29SSathesh Edara };
299423c8a29SSathesh Edara #define OTX_EP_DROQ_DESC_SIZE	(sizeof(struct otx_ep_droq_desc))
300423c8a29SSathesh Edara 
301423c8a29SSathesh Edara /* Receive Header */
302423c8a29SSathesh Edara union otx_ep_rh {
303423c8a29SSathesh Edara 	uint64_t rh64;
304423c8a29SSathesh Edara };
305423c8a29SSathesh Edara #define OTX_EP_RH_SIZE (sizeof(union otx_ep_rh))
306423c8a29SSathesh Edara 
307423c8a29SSathesh Edara /** Information about packet DMA'ed by OCTEON 9.
308423c8a29SSathesh Edara  *  The format of the information available at Info Pointer after OCTEON 9
309423c8a29SSathesh Edara  *  has posted a packet. Not all descriptors have valid information. Only
310423c8a29SSathesh Edara  *  the Info field of the first descriptor for a packet has information
311423c8a29SSathesh Edara  *  about the packet.
312423c8a29SSathesh Edara  */
313423c8a29SSathesh Edara struct otx_ep_droq_info {
314423c8a29SSathesh Edara 	/* The Length of the packet. */
315423c8a29SSathesh Edara 	uint64_t length;
316423c8a29SSathesh Edara 
317423c8a29SSathesh Edara 	/* The Output Receive Header. */
318423c8a29SSathesh Edara 	union otx_ep_rh rh;
319423c8a29SSathesh Edara };
320423c8a29SSathesh Edara #define OTX_EP_DROQ_INFO_SIZE	(sizeof(struct otx_ep_droq_info))
321423c8a29SSathesh Edara 
322423c8a29SSathesh Edara /* DROQ statistics. Each output queue has four stats fields. */
323423c8a29SSathesh Edara struct otx_ep_droq_stats {
324423c8a29SSathesh Edara 	/* Number of packets received in this queue. */
325423c8a29SSathesh Edara 	uint64_t pkts_received;
326423c8a29SSathesh Edara 
327423c8a29SSathesh Edara 	/* Bytes received by this queue. */
328423c8a29SSathesh Edara 	uint64_t bytes_received;
329423c8a29SSathesh Edara 
330423c8a29SSathesh Edara 	/* Num of failures of rte_pktmbuf_alloc() */
331423c8a29SSathesh Edara 	uint64_t rx_alloc_failure;
332423c8a29SSathesh Edara 
333423c8a29SSathesh Edara 	/* Rx error */
334423c8a29SSathesh Edara 	uint64_t rx_err;
335423c8a29SSathesh Edara 
336423c8a29SSathesh Edara 	/* packets with data got ready after interrupt arrived */
337423c8a29SSathesh Edara 	uint64_t pkts_delayed_data;
338423c8a29SSathesh Edara 
339423c8a29SSathesh Edara 	/* packets dropped due to zero length */
340423c8a29SSathesh Edara 	uint64_t dropped_zlp;
341423c8a29SSathesh Edara };
342423c8a29SSathesh Edara 
343423c8a29SSathesh Edara /* Structure to define the configuration attributes for each Output queue. */
344423c8a29SSathesh Edara struct otx_ep_oq_config {
345423c8a29SSathesh Edara 	/* Max number of OQs available */
346423c8a29SSathesh Edara 	uint16_t max_oqs;
347423c8a29SSathesh Edara 
348423c8a29SSathesh Edara 	/* If set, the Output queue uses info-pointer mode. (Default: 1 ) */
349423c8a29SSathesh Edara 	uint16_t info_ptr;
350423c8a29SSathesh Edara 
351423c8a29SSathesh Edara 	/** The number of buffers that were consumed during packet processing by
352423c8a29SSathesh Edara 	 *  the driver on this Output queue before the driver attempts to
353423c8a29SSathesh Edara 	 *  replenish the descriptor ring with new buffers.
354423c8a29SSathesh Edara 	 */
355423c8a29SSathesh Edara 	uint32_t refill_threshold;
356423c8a29SSathesh Edara };
357423c8a29SSathesh Edara 
358423c8a29SSathesh Edara /* The Descriptor Ring Output Queue(DROQ) structure. */
359423c8a29SSathesh Edara struct otx_ep_droq {
360423c8a29SSathesh Edara 	/* The 8B aligned descriptor ring starts at this address. */
361423c8a29SSathesh Edara 	struct otx_ep_droq_desc *desc_ring;
362423c8a29SSathesh Edara 
36335dee56cSVamsi Attunuru 	/* The 8B aligned info ptrs begin from this address. */
36435dee56cSVamsi Attunuru 	struct otx_ep_droq_info *info_list;
365423c8a29SSathesh Edara 
36635dee56cSVamsi Attunuru 	/* receive buffer list contains mbuf ptr list */
36735dee56cSVamsi Attunuru 	struct rte_mbuf **recv_buf_list;
36835dee56cSVamsi Attunuru 
369c30d99d2SPavan Nikhilesh 	/* Packet re-arm data. */
370c30d99d2SPavan Nikhilesh 	uint64_t rearm_data;
371c30d99d2SPavan Nikhilesh 
37235dee56cSVamsi Attunuru 	/* Packets pending to be processed */
37335dee56cSVamsi Attunuru 	uint64_t pkts_pending;
374423c8a29SSathesh Edara 
375423c8a29SSathesh Edara 	/* Driver should read the next packet at this index */
376423c8a29SSathesh Edara 	uint32_t read_idx;
377423c8a29SSathesh Edara 
378423c8a29SSathesh Edara 	/* OCTEON 9 will write the next packet at this index */
379423c8a29SSathesh Edara 	uint32_t write_idx;
380423c8a29SSathesh Edara 
381423c8a29SSathesh Edara 	/* At this index, the driver will refill the descriptor's buffer */
382423c8a29SSathesh Edara 	uint32_t refill_idx;
383423c8a29SSathesh Edara 
38435dee56cSVamsi Attunuru 	/* The number of descriptors pending to refill. */
38535dee56cSVamsi Attunuru 	uint32_t refill_count;
386423c8a29SSathesh Edara 
387423c8a29SSathesh Edara 	/* Number of descriptors in this ring. */
388423c8a29SSathesh Edara 	uint32_t nb_desc;
389423c8a29SSathesh Edara 
390423c8a29SSathesh Edara 	uint32_t refill_threshold;
391423c8a29SSathesh Edara 
39235dee56cSVamsi Attunuru 	uint64_t last_pkt_count;
393423c8a29SSathesh Edara 
39435dee56cSVamsi Attunuru 	struct rte_mempool *mpool;
395423c8a29SSathesh Edara 
396423c8a29SSathesh Edara 	/* The size of each buffer pointed by the buffer pointer. */
397423c8a29SSathesh Edara 	uint32_t buffer_size;
398423c8a29SSathesh Edara 
399423c8a29SSathesh Edara 	/** Pointer to the mapped packet credit register.
400423c8a29SSathesh Edara 	 *  Host writes number of info/buffer ptrs available to this register
401423c8a29SSathesh Edara 	 */
402423c8a29SSathesh Edara 	void *pkts_credit_reg;
403423c8a29SSathesh Edara 
404423c8a29SSathesh Edara 	/** Pointer to the mapped packet sent register. OCTEON 9 writes the
405423c8a29SSathesh Edara 	 *  number of packets DMA'ed to host memory in this register.
406423c8a29SSathesh Edara 	 */
407423c8a29SSathesh Edara 	void *pkts_sent_reg;
408423c8a29SSathesh Edara 
409831cf744SVamsi Attunuru 	/* Use ISM memory */
410831cf744SVamsi Attunuru 	uint8_t ism_ena;
411831cf744SVamsi Attunuru 
41235dee56cSVamsi Attunuru 	/* Pointer to host memory copy of output packet count, set by ISM */
413e12a0166STyler Retzlaff 	RTE_ATOMIC(uint32_t) *pkts_sent_ism;
414831cf744SVamsi Attunuru 	uint32_t pkts_sent_prev;
41535dee56cSVamsi Attunuru 
41635dee56cSVamsi Attunuru 	/* Statistics for this DROQ. */
41735dee56cSVamsi Attunuru 	struct otx_ep_droq_stats stats;
41835dee56cSVamsi Attunuru 
419742a8c3cSSathesh Edara 	/** Handle DMA incompletion during pkt reads.
420742a8c3cSSathesh Edara 	 * This variable is used to initiate a sent_reg_read
421742a8c3cSSathesh Edara 	 * that completes pending dma
422742a8c3cSSathesh Edara 	 * this variable is used as lvalue so compiler cannot optimize
423742a8c3cSSathesh Edara 	 * the reads.
424742a8c3cSSathesh Edara 	 */
425742a8c3cSSathesh Edara 	uint32_t sent_reg_val;
426742a8c3cSSathesh Edara 
42735dee56cSVamsi Attunuru 	uint32_t q_no;
42835dee56cSVamsi Attunuru 
42935dee56cSVamsi Attunuru 	struct otx_ep_device *otx_ep_dev;
430423c8a29SSathesh Edara 
431423c8a29SSathesh Edara 	/* DMA mapped address of the DROQ descriptor ring. */
432423c8a29SSathesh Edara 	size_t desc_ring_dma;
433423c8a29SSathesh Edara 
434423c8a29SSathesh Edara 	/* Info_ptr list is allocated at this virtual address. */
435423c8a29SSathesh Edara 	size_t info_base_addr;
436423c8a29SSathesh Edara 
437423c8a29SSathesh Edara 	/* DMA mapped address of the info list */
438423c8a29SSathesh Edara 	size_t info_list_dma;
439423c8a29SSathesh Edara 
440423c8a29SSathesh Edara 	/* Allocated size of info list. */
441423c8a29SSathesh Edara 	uint32_t info_alloc_size;
442423c8a29SSathesh Edara 
443423c8a29SSathesh Edara 	/* Memory zone **/
444423c8a29SSathesh Edara 	const struct rte_memzone *desc_ring_mz;
445423c8a29SSathesh Edara 
446423c8a29SSathesh Edara 	const struct rte_memzone *info_mz;
447423c8a29SSathesh Edara };
448423c8a29SSathesh Edara #define OTX_EP_DROQ_SIZE		(sizeof(struct otx_ep_droq))
449423c8a29SSathesh Edara 
450423c8a29SSathesh Edara /* IQ/OQ mask */
451423c8a29SSathesh Edara struct otx_ep_io_enable {
452423c8a29SSathesh Edara 	uint64_t iq;
453423c8a29SSathesh Edara 	uint64_t oq;
454423c8a29SSathesh Edara 	uint64_t iq64B;
455423c8a29SSathesh Edara };
456423c8a29SSathesh Edara 
457423c8a29SSathesh Edara /* Structure to define the configuration. */
458423c8a29SSathesh Edara struct otx_ep_config {
459423c8a29SSathesh Edara 	/* Input Queue attributes. */
460423c8a29SSathesh Edara 	struct otx_ep_iq_config iq;
461423c8a29SSathesh Edara 
462423c8a29SSathesh Edara 	/* Output Queue attributes. */
463423c8a29SSathesh Edara 	struct otx_ep_oq_config oq;
464423c8a29SSathesh Edara 
465423c8a29SSathesh Edara 	/* Num of desc for IQ rings */
466423c8a29SSathesh Edara 	uint32_t num_iqdef_descs;
467423c8a29SSathesh Edara 
468423c8a29SSathesh Edara 	/* Num of desc for OQ rings */
469423c8a29SSathesh Edara 	uint32_t num_oqdef_descs;
470423c8a29SSathesh Edara 
471423c8a29SSathesh Edara 	/* OQ buffer size */
472423c8a29SSathesh Edara 	uint32_t oqdef_buf_size;
473423c8a29SSathesh Edara };
474423c8a29SSathesh Edara 
475423c8a29SSathesh Edara /* SRIOV information */
476423c8a29SSathesh Edara struct otx_ep_sriov_info {
477423c8a29SSathesh Edara 	/* Number of rings assigned to VF */
478423c8a29SSathesh Edara 	uint32_t rings_per_vf;
479423c8a29SSathesh Edara 
480423c8a29SSathesh Edara 	/* Number of VF devices enabled */
481423c8a29SSathesh Edara 	uint32_t num_vfs;
482423c8a29SSathesh Edara };
483423c8a29SSathesh Edara 
484423c8a29SSathesh Edara /* Required functions for each VF device */
485423c8a29SSathesh Edara struct otx_ep_fn_list {
486dfa2f825SSathesh Edara 	int (*setup_iq_regs)(struct otx_ep_device *otx_ep, uint32_t q_no);
487423c8a29SSathesh Edara 
488dfa2f825SSathesh Edara 	int (*setup_oq_regs)(struct otx_ep_device *otx_ep, uint32_t q_no);
489423c8a29SSathesh Edara 
490dfa2f825SSathesh Edara 	int (*setup_device_regs)(struct otx_ep_device *otx_ep);
491423c8a29SSathesh Edara 
492423c8a29SSathesh Edara 	int (*enable_io_queues)(struct otx_ep_device *otx_ep);
493423c8a29SSathesh Edara 	void (*disable_io_queues)(struct otx_ep_device *otx_ep);
494423c8a29SSathesh Edara 
495423c8a29SSathesh Edara 	int (*enable_iq)(struct otx_ep_device *otx_ep, uint32_t q_no);
496423c8a29SSathesh Edara 	void (*disable_iq)(struct otx_ep_device *otx_ep, uint32_t q_no);
497423c8a29SSathesh Edara 
498423c8a29SSathesh Edara 	int (*enable_oq)(struct otx_ep_device *otx_ep, uint32_t q_no);
499423c8a29SSathesh Edara 	void (*disable_oq)(struct otx_ep_device *otx_ep, uint32_t q_no);
5005efa816eSSathesh Edara 
5015efa816eSSathesh Edara 	int (*enable_rxq_intr)(struct otx_ep_device *otx_epvf, uint16_t q_no);
5025efa816eSSathesh Edara 	int (*disable_rxq_intr)(struct otx_ep_device *otx_epvf, uint16_t q_no);
503423c8a29SSathesh Edara };
504423c8a29SSathesh Edara 
505423c8a29SSathesh Edara /* OTX_EP EP VF device data structure */
506423c8a29SSathesh Edara struct otx_ep_device {
507423c8a29SSathesh Edara 	/* PCI device pointer */
508423c8a29SSathesh Edara 	struct rte_pci_device *pdev;
509423c8a29SSathesh Edara 
510423c8a29SSathesh Edara 	uint16_t chip_id;
511423c8a29SSathesh Edara 
512423c8a29SSathesh Edara 	uint32_t pkind;
513423c8a29SSathesh Edara 
514423c8a29SSathesh Edara 	struct rte_eth_dev *eth_dev;
515423c8a29SSathesh Edara 
516423c8a29SSathesh Edara 	int port_id;
517423c8a29SSathesh Edara 
518423c8a29SSathesh Edara 	/* Memory mapped h/w address */
519423c8a29SSathesh Edara 	uint8_t *hw_addr;
520423c8a29SSathesh Edara 
521423c8a29SSathesh Edara 	struct otx_ep_fn_list fn_list;
522423c8a29SSathesh Edara 
523423c8a29SSathesh Edara 	uint32_t max_tx_queues;
524423c8a29SSathesh Edara 
525423c8a29SSathesh Edara 	uint32_t max_rx_queues;
526423c8a29SSathesh Edara 
527423c8a29SSathesh Edara 	/* Num IQs */
528423c8a29SSathesh Edara 	uint32_t nb_tx_queues;
529423c8a29SSathesh Edara 
530423c8a29SSathesh Edara 	/* The input instruction queues */
531423c8a29SSathesh Edara 	struct otx_ep_instr_queue *instr_queue[OTX_EP_MAX_IOQS_PER_VF];
532423c8a29SSathesh Edara 
533423c8a29SSathesh Edara 	/* Num OQs */
534423c8a29SSathesh Edara 	uint32_t nb_rx_queues;
535423c8a29SSathesh Edara 
536423c8a29SSathesh Edara 	/* The DROQ output queues  */
537423c8a29SSathesh Edara 	struct otx_ep_droq *droq[OTX_EP_MAX_IOQS_PER_VF];
538423c8a29SSathesh Edara 
539423c8a29SSathesh Edara 	/* IOQ mask */
540423c8a29SSathesh Edara 	struct otx_ep_io_enable io_qmask;
541423c8a29SSathesh Edara 
542423c8a29SSathesh Edara 	/* SR-IOV info */
543423c8a29SSathesh Edara 	struct otx_ep_sriov_info sriov_info;
544423c8a29SSathesh Edara 
545423c8a29SSathesh Edara 	/* Device configuration */
546423c8a29SSathesh Edara 	const struct otx_ep_config *conf;
547423c8a29SSathesh Edara 
548423c8a29SSathesh Edara 	uint64_t rx_offloads;
549423c8a29SSathesh Edara 
550423c8a29SSathesh Edara 	uint64_t tx_offloads;
551d360d7bfSSathesh Edara 
552d360d7bfSSathesh Edara 	/* DMA buffer for SDP ISM messages */
553d360d7bfSSathesh Edara 	const struct rte_memzone *ism_buffer_mz;
554c836a7baSSathesh Edara 
555c836a7baSSathesh Edara 	/* Mailbox lock */
556c836a7baSSathesh Edara 	rte_spinlock_t mbox_lock;
557c836a7baSSathesh Edara 
558c836a7baSSathesh Edara 	/* Mailbox data */
559c836a7baSSathesh Edara 	uint8_t mbox_data_buf[MBOX_MAX_DATA_BUF_SIZE];
560c836a7baSSathesh Edara 
561c836a7baSSathesh Edara 	/* Mailbox data index */
562c836a7baSSathesh Edara 	int32_t mbox_data_index;
563c836a7baSSathesh Edara 
564c836a7baSSathesh Edara 	/* Mailbox receive message length */
565c836a7baSSathesh Edara 	int32_t mbox_rcv_message_len;
566cab13b70SSathesh Edara 
567cab13b70SSathesh Edara 	/* Negotiated Mbox version */
568cab13b70SSathesh Edara 	uint32_t mbox_neg_ver;
56935dee56cSVamsi Attunuru 
57035dee56cSVamsi Attunuru 	/* Generation */
57135dee56cSVamsi Attunuru 	uint32_t chip_gen;
572831cf744SVamsi Attunuru 
573831cf744SVamsi Attunuru 	/* Use ISM memory */
574831cf744SVamsi Attunuru 	uint8_t ism_ena;
575423c8a29SSathesh Edara };
576423c8a29SSathesh Edara 
577423c8a29SSathesh Edara int otx_ep_setup_iqs(struct otx_ep_device *otx_ep, uint32_t iq_no,
578423c8a29SSathesh Edara 		     int num_descs, unsigned int socket_id);
579423c8a29SSathesh Edara int otx_ep_delete_iqs(struct otx_ep_device *otx_ep, uint32_t iq_no);
580423c8a29SSathesh Edara 
581423c8a29SSathesh Edara int otx_ep_setup_oqs(struct otx_ep_device *otx_ep, int oq_no, int num_descs,
582423c8a29SSathesh Edara 		     int desc_size, struct rte_mempool *mpool,
583423c8a29SSathesh Edara 		     unsigned int socket_id);
584423c8a29SSathesh Edara int otx_ep_delete_oqs(struct otx_ep_device *otx_ep, uint32_t oq_no);
585423c8a29SSathesh Edara 
5865efa816eSSathesh Edara #define OTX_EP_MAX_PKT_SZ 65498U
587423c8a29SSathesh Edara #define OTX_EP_MAX_MAC_ADDRS 1
588423c8a29SSathesh Edara #define OTX_EP_SG_ALIGN 8
589423c8a29SSathesh Edara #define OTX_EP_CLEAR_ISIZE_BSIZE 0x7FFFFFULL
590423c8a29SSathesh Edara #define OTX_EP_CLEAR_OUT_INT_LVLS 0x3FFFFFFFFFFFFFULL
591423c8a29SSathesh Edara #define OTX_EP_CLEAR_IN_INT_LVLS 0xFFFFFFFF
592423c8a29SSathesh Edara #define OTX_EP_CLEAR_SDP_IN_INT_LVLS 0x3FFFFFFFFFFFFFUL
593423c8a29SSathesh Edara #define OTX_EP_DROQ_BUFSZ_MASK 0xFFFF
594423c8a29SSathesh Edara #define OTX_EP_CLEAR_SLIST_DBELL 0xFFFFFFFF
595423c8a29SSathesh Edara #define OTX_EP_CLEAR_SDP_OUT_PKT_CNT 0xFFFFFFFFF
596423c8a29SSathesh Edara 
597c836a7baSSathesh Edara /* Max overhead includes
598c836a7baSSathesh Edara  * - Ethernet hdr
599c836a7baSSathesh Edara  * - CRC
600c836a7baSSathesh Edara  * - nested VLANs
601c836a7baSSathesh Edara  * - octeon rx info
602c836a7baSSathesh Edara  */
603c836a7baSSathesh Edara #define OTX_EP_ETH_OVERHEAD \
604c836a7baSSathesh Edara 	(RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN + \
605c836a7baSSathesh Edara 	 (2 * RTE_VLAN_HLEN) + OTX_EP_DROQ_INFO_SIZE)
606c836a7baSSathesh Edara 
607423c8a29SSathesh Edara /* PCI IDs */
608423c8a29SSathesh Edara #define PCI_VENDOR_ID_CAVIUM			0x177D
609423c8a29SSathesh Edara 
610423c8a29SSathesh Edara extern int otx_net_ep_logtype;
6113178e37cSDavid Marchand #define RTE_LOGTYPE_OTX_NET_EP otx_net_ep_logtype
6123178e37cSDavid Marchand 
613423c8a29SSathesh Edara #endif  /* _OTX_EP_COMMON_H_ */
614