xref: /dpdk/drivers/dma/dpaa2/dpaa2_qdma.h (revision e77506397fc8005c5129e22e9e2d15d5876790fd)
18caf8427SNipun Gupta /* SPDX-License-Identifier: BSD-3-Clause
2388e888dSJun Yang  * Copyright 2018-2024 NXP
38caf8427SNipun Gupta  */
48caf8427SNipun Gupta 
58caf8427SNipun Gupta #ifndef _DPAA2_QDMA_H_
68caf8427SNipun Gupta #define _DPAA2_QDMA_H_
78caf8427SNipun Gupta 
807d679bcSJun Yang #include "portal/dpaa2_hw_pvt.h"
907d679bcSJun Yang #include "portal/dpaa2_hw_dpio.h"
1007d679bcSJun Yang 
118caf8427SNipun Gupta #define DPAA2_QDMA_MAX_VHANS		64
128caf8427SNipun Gupta 
1307d679bcSJun Yang #define DPAA2_DPDMAI_MAX_QUEUES	16
148caf8427SNipun Gupta 
158caf8427SNipun Gupta /** Notification by FQD_CTX[fqid] */
168caf8427SNipun Gupta #define QDMA_SER_CTX (1 << 8)
178caf8427SNipun Gupta #define DPAA2_RBP_MEM_RW            0x0
188caf8427SNipun Gupta /**
198caf8427SNipun Gupta  * Source descriptor command read transaction type for RBP=0:
208caf8427SNipun Gupta  * coherent copy of cacheable memory
218caf8427SNipun Gupta  */
228caf8427SNipun Gupta #define DPAA2_COHERENT_NO_ALLOCATE_CACHE	0xb
238caf8427SNipun Gupta #define DPAA2_LX2_COHERENT_NO_ALLOCATE_CACHE	0x7
248caf8427SNipun Gupta /**
258caf8427SNipun Gupta  * Destination descriptor command write transaction type for RBP=0:
268caf8427SNipun Gupta  * coherent copy of cacheable memory
278caf8427SNipun Gupta  */
288caf8427SNipun Gupta #define DPAA2_COHERENT_ALLOCATE_CACHE		0x6
298caf8427SNipun Gupta #define DPAA2_LX2_COHERENT_ALLOCATE_CACHE	0xb
308caf8427SNipun Gupta 
318caf8427SNipun Gupta /** Maximum possible H/W Queues on each core */
328caf8427SNipun Gupta #define MAX_HW_QUEUE_PER_CORE 64
338caf8427SNipun Gupta 
34388e888dSJun Yang #define DPAA2_QDMA_FD_FLUSH_FORMAT 0x0
35388e888dSJun Yang #define DPAA2_QDMA_FD_LONG_FORMAT 0x1
36388e888dSJun Yang #define DPAA2_QDMA_FD_SHORT_FORMAT 0x3
37388e888dSJun Yang 
38388e888dSJun Yang #define DPAA2_QDMA_BMT_ENABLE 0x1
39388e888dSJun Yang #define DPAA2_QDMA_BMT_DISABLE 0x0
408caf8427SNipun Gupta 
418caf8427SNipun Gupta /** Source/Destination Descriptor */
42*e7750639SAndre Muezerie struct __rte_packed_begin qdma_sdd {
438caf8427SNipun Gupta 	uint32_t rsv;
448caf8427SNipun Gupta 	/** Stride configuration */
458caf8427SNipun Gupta 	uint32_t stride;
468caf8427SNipun Gupta 	/** Route-by-port command */
478caf8427SNipun Gupta 	union {
488caf8427SNipun Gupta 		uint32_t rbpcmd;
498caf8427SNipun Gupta 		struct rbpcmd_st {
508caf8427SNipun Gupta 			uint32_t vfid:6;
518caf8427SNipun Gupta 			uint32_t rsv4:2;
528caf8427SNipun Gupta 			uint32_t pfid:1;
538caf8427SNipun Gupta 			uint32_t rsv3:7;
548caf8427SNipun Gupta 			uint32_t attr:3;
558caf8427SNipun Gupta 			uint32_t rsv2:1;
568caf8427SNipun Gupta 			uint32_t at:2;
578caf8427SNipun Gupta 			uint32_t vfa:1;
588caf8427SNipun Gupta 			uint32_t ca:1;
598caf8427SNipun Gupta 			uint32_t tc:3;
608caf8427SNipun Gupta 			uint32_t rsv1:5;
618caf8427SNipun Gupta 		} rbpcmd_simple;
628caf8427SNipun Gupta 	};
638caf8427SNipun Gupta 	union {
648caf8427SNipun Gupta 		uint32_t cmd;
658caf8427SNipun Gupta 		struct rcmd_simple {
668caf8427SNipun Gupta 			uint32_t portid:4;
678caf8427SNipun Gupta 			uint32_t rsv1:14;
688caf8427SNipun Gupta 			uint32_t rbp:1;
698caf8427SNipun Gupta 			uint32_t ssen:1;
708caf8427SNipun Gupta 			uint32_t rthrotl:4;
718caf8427SNipun Gupta 			uint32_t sqos:3;
728caf8427SNipun Gupta 			uint32_t ns:1;
738caf8427SNipun Gupta 			uint32_t rdtype:4;
748caf8427SNipun Gupta 		} read_cmd;
758caf8427SNipun Gupta 		struct wcmd_simple {
768caf8427SNipun Gupta 			uint32_t portid:4;
778caf8427SNipun Gupta 			uint32_t rsv3:10;
788caf8427SNipun Gupta 			uint32_t rsv2:2;
798caf8427SNipun Gupta 			uint32_t lwc:2;
808caf8427SNipun Gupta 			uint32_t rbp:1;
818caf8427SNipun Gupta 			uint32_t dsen:1;
828caf8427SNipun Gupta 			uint32_t rsv1:4;
838caf8427SNipun Gupta 			uint32_t dqos:3;
848caf8427SNipun Gupta 			uint32_t ns:1;
858caf8427SNipun Gupta 			uint32_t wrttype:4;
868caf8427SNipun Gupta 		} write_cmd;
878caf8427SNipun Gupta 	};
88*e7750639SAndre Muezerie } __rte_packed_end;
898caf8427SNipun Gupta 
908caf8427SNipun Gupta #define QDMA_SG_FMT_SDB	0x0 /* single data buffer */
918caf8427SNipun Gupta #define QDMA_SG_FMT_FDS	0x1 /* frame data section */
928caf8427SNipun Gupta #define QDMA_SG_FMT_SGTE	0x2 /* SGT extension */
938caf8427SNipun Gupta #define QDMA_SG_SL_SHORT	0x1 /* short length */
948caf8427SNipun Gupta #define QDMA_SG_SL_LONG	0x0 /* long length */
958caf8427SNipun Gupta #define QDMA_SG_F	0x1 /* last sg entry */
96388e888dSJun Yang #define QDMA_SG_BMT_ENABLE DPAA2_QDMA_BMT_ENABLE
97388e888dSJun Yang #define QDMA_SG_BMT_DISABLE DPAA2_QDMA_BMT_DISABLE
988caf8427SNipun Gupta 
99*e7750639SAndre Muezerie struct __rte_packed_begin qdma_sg_entry {
1008caf8427SNipun Gupta 	uint32_t addr_lo;		/* address 0:31 */
1018caf8427SNipun Gupta 	uint32_t addr_hi:17;	/* address 32:48 */
1028caf8427SNipun Gupta 	uint32_t rsv:15;
1038caf8427SNipun Gupta 	union {
1048caf8427SNipun Gupta 		uint32_t data_len_sl0;	/* SL=0, the long format */
1058caf8427SNipun Gupta 		struct {
1068caf8427SNipun Gupta 			uint32_t len:17;	/* SL=1, the short format */
1078caf8427SNipun Gupta 			uint32_t reserve:3;
1088caf8427SNipun Gupta 			uint32_t sf:1;
1098caf8427SNipun Gupta 			uint32_t sr:1;
1108caf8427SNipun Gupta 			uint32_t size:10;	/* buff size */
1118caf8427SNipun Gupta 		} data_len_sl1;
1128caf8427SNipun Gupta 	} data_len;					/* AVAIL_LENGTH */
1138caf8427SNipun Gupta 	union {
1148caf8427SNipun Gupta 		uint32_t ctrl_fields;
1158caf8427SNipun Gupta 		struct {
1168caf8427SNipun Gupta 			uint32_t bpid:14;
1178caf8427SNipun Gupta 			uint32_t ivp:1;
1188caf8427SNipun Gupta 			uint32_t bmt:1;
1198caf8427SNipun Gupta 			uint32_t offset:12;
1208caf8427SNipun Gupta 			uint32_t fmt:2;
1218caf8427SNipun Gupta 			uint32_t sl:1;
1228caf8427SNipun Gupta 			uint32_t f:1;
1238caf8427SNipun Gupta 		} ctrl;
1248caf8427SNipun Gupta 	};
125*e7750639SAndre Muezerie } __rte_packed_end;
1268caf8427SNipun Gupta 
1273d990faaSJun Yang struct dpaa2_qdma_rbp {
1283d990faaSJun Yang 	uint32_t use_ultrashort:1;
1293d990faaSJun Yang 	uint32_t enable:1;
1303d990faaSJun Yang 	/**
1313d990faaSJun Yang 	 * dportid:
1323d990faaSJun Yang 	 * 0000 PCI-Express 1
1333d990faaSJun Yang 	 * 0001 PCI-Express 2
1343d990faaSJun Yang 	 * 0010 PCI-Express 3
1353d990faaSJun Yang 	 * 0011 PCI-Express 4
1363d990faaSJun Yang 	 * 0100 PCI-Express 5
1373d990faaSJun Yang 	 * 0101 PCI-Express 6
1383d990faaSJun Yang 	 */
1393d990faaSJun Yang 	uint32_t dportid:4;
1403d990faaSJun Yang 	uint32_t dpfid:2;
1413d990faaSJun Yang 	uint32_t dvfid:6;
1423d990faaSJun Yang 	uint32_t dvfa:1;
1433d990faaSJun Yang 	/*using route by port for destination */
1443d990faaSJun Yang 	uint32_t drbp:1;
1453d990faaSJun Yang 	/**
1463d990faaSJun Yang 	 * sportid:
1473d990faaSJun Yang 	 * 0000 PCI-Express 1
1483d990faaSJun Yang 	 * 0001 PCI-Express 2
1493d990faaSJun Yang 	 * 0010 PCI-Express 3
1503d990faaSJun Yang 	 * 0011 PCI-Express 4
1513d990faaSJun Yang 	 * 0100 PCI-Express 5
1523d990faaSJun Yang 	 * 0101 PCI-Express 6
1533d990faaSJun Yang 	 */
1543d990faaSJun Yang 	uint32_t sportid:4;
1553d990faaSJun Yang 	uint32_t spfid:2;
1563d990faaSJun Yang 	uint32_t svfid:6;
1573d990faaSJun Yang 	uint32_t svfa:1;
1583d990faaSJun Yang 	/* using route by port for source */
1593d990faaSJun Yang 	uint32_t srbp:1;
1603d990faaSJun Yang 	uint32_t rsv:2;
1613d990faaSJun Yang };
1623d990faaSJun Yang 
163388e888dSJun Yang enum dpaa2_qdma_fd_type {
164388e888dSJun Yang 	DPAA2_QDMA_FD_SHORT = 1,
165388e888dSJun Yang 	DPAA2_QDMA_FD_LONG = 2,
166388e888dSJun Yang 	DPAA2_QDMA_FD_SG = 3
167388e888dSJun Yang };
168388e888dSJun Yang 
169388e888dSJun Yang #define DPAA2_QDMA_FD_ATT_TYPE_OFFSET 13
170b52af62fSJun Yang #define DPAA2_QDMA_FD_ATT_MAX_IDX \
171b52af62fSJun Yang 	((1 << DPAA2_QDMA_FD_ATT_TYPE_OFFSET) - 1)
172388e888dSJun Yang #define DPAA2_QDMA_FD_ATT_TYPE(att) \
173388e888dSJun Yang 	(att >> DPAA2_QDMA_FD_ATT_TYPE_OFFSET)
174388e888dSJun Yang #define DPAA2_QDMA_FD_ATT_CNTX(att) \
175b52af62fSJun Yang 	(att & DPAA2_QDMA_FD_ATT_MAX_IDX)
176b52af62fSJun Yang 
177b52af62fSJun Yang #define DPAA2_QDMA_MAX_DESC ((DPAA2_QDMA_FD_ATT_MAX_IDX + 1) / 2)
178b52af62fSJun Yang #define DPAA2_QDMA_MIN_DESC 1
179388e888dSJun Yang 
180388e888dSJun Yang static inline void
181388e888dSJun Yang dpaa2_qdma_fd_set_addr(struct qbman_fd *fd,
182388e888dSJun Yang 	uint64_t addr)
183388e888dSJun Yang {
184388e888dSJun Yang 	fd->simple_ddr.saddr_lo = lower_32_bits(addr);
185388e888dSJun Yang 	fd->simple_ddr.saddr_hi = upper_32_bits(addr);
186388e888dSJun Yang }
187388e888dSJun Yang 
188388e888dSJun Yang static inline void
189388e888dSJun Yang dpaa2_qdma_fd_save_att(struct qbman_fd *fd,
190388e888dSJun Yang 	uint16_t job_idx, enum dpaa2_qdma_fd_type type)
191388e888dSJun Yang {
192b52af62fSJun Yang 	RTE_ASSERT(job_idx <= DPAA2_QDMA_FD_ATT_MAX_IDX);
193388e888dSJun Yang 	fd->simple_ddr.rsv1_att = job_idx |
194388e888dSJun Yang 		(type << DPAA2_QDMA_FD_ATT_TYPE_OFFSET);
195388e888dSJun Yang }
196388e888dSJun Yang 
197388e888dSJun Yang static inline uint16_t
198388e888dSJun Yang dpaa2_qdma_fd_get_att(const struct qbman_fd *fd)
199388e888dSJun Yang {
200388e888dSJun Yang 	return fd->simple_ddr.rsv1_att;
201388e888dSJun Yang }
202388e888dSJun Yang 
20307d679bcSJun Yang enum {
20407d679bcSJun Yang 	DPAA2_QDMA_SDD_FLE,
20507d679bcSJun Yang 	DPAA2_QDMA_SRC_FLE,
20607d679bcSJun Yang 	DPAA2_QDMA_DST_FLE,
20707d679bcSJun Yang 	DPAA2_QDMA_MAX_FLE
20807d679bcSJun Yang };
20907d679bcSJun Yang 
21007d679bcSJun Yang enum {
21107d679bcSJun Yang 	DPAA2_QDMA_SRC_SDD,
21207d679bcSJun Yang 	DPAA2_QDMA_DST_SDD,
21307d679bcSJun Yang 	DPAA2_QDMA_MAX_SDD
21407d679bcSJun Yang };
21507d679bcSJun Yang 
216*e7750639SAndre Muezerie struct __rte_packed_begin qdma_cntx_fle_sdd {
21707d679bcSJun Yang 	struct qbman_fle fle[DPAA2_QDMA_MAX_FLE];
21807d679bcSJun Yang 	struct qdma_sdd sdd[DPAA2_QDMA_MAX_SDD];
219*e7750639SAndre Muezerie } __rte_packed_end;
22007d679bcSJun Yang 
221*e7750639SAndre Muezerie struct __rte_packed_begin qdma_cntx_sg {
22207d679bcSJun Yang 	struct qdma_cntx_fle_sdd fle_sdd;
2237cfcce8eSJun Yang 	struct qdma_sg_entry sg_src_entry[RTE_DPAAX_QDMA_JOB_SUBMIT_MAX];
2247cfcce8eSJun Yang 	struct qdma_sg_entry sg_dst_entry[RTE_DPAAX_QDMA_JOB_SUBMIT_MAX];
2257cfcce8eSJun Yang 	uint16_t cntx_idx[RTE_DPAAX_QDMA_JOB_SUBMIT_MAX];
22607d679bcSJun Yang 	uint16_t job_nb;
22707d679bcSJun Yang 	uint16_t rsv[3];
228*e7750639SAndre Muezerie } __rte_packed_end;
22907d679bcSJun Yang 
23007d679bcSJun Yang #define DPAA2_QDMA_IDXADDR_FROM_SG_FLAG(flag) \
2317cfcce8eSJun Yang 	((void *)(uintptr_t)((flag) - ((flag) & RTE_DPAAX_QDMA_SG_IDX_ADDR_MASK)))
23207d679bcSJun Yang 
23307d679bcSJun Yang #define DPAA2_QDMA_IDX_FROM_FLAG(flag) \
2347cfcce8eSJun Yang 	((flag) >> RTE_DPAAX_QDMA_COPY_IDX_OFFSET)
23507d679bcSJun Yang 
2368caf8427SNipun Gupta /** Represents a DPDMAI device */
2378caf8427SNipun Gupta struct dpaa2_dpdmai_dev {
2388caf8427SNipun Gupta 	/** Pointer to Next device instance */
2398caf8427SNipun Gupta 	TAILQ_ENTRY(dpaa2_qdma_device) next;
2408caf8427SNipun Gupta 	/** HW ID for DPDMAI object */
2418caf8427SNipun Gupta 	uint32_t dpdmai_id;
2428caf8427SNipun Gupta 	/** Tocken of this device */
2438caf8427SNipun Gupta 	uint16_t token;
2448caf8427SNipun Gupta 	/** Number of queue in this DPDMAI device */
2458caf8427SNipun Gupta 	uint8_t num_queues;
2468caf8427SNipun Gupta 	/** RX queues */
2478caf8427SNipun Gupta 	struct dpaa2_queue rx_queue[DPAA2_DPDMAI_MAX_QUEUES];
2488caf8427SNipun Gupta 	/** TX queues */
2498caf8427SNipun Gupta 	struct dpaa2_queue tx_queue[DPAA2_DPDMAI_MAX_QUEUES];
2508caf8427SNipun Gupta 	struct qdma_device *qdma_dev;
2518caf8427SNipun Gupta };
2528caf8427SNipun Gupta 
25307d679bcSJun Yang #define QDMA_CNTX_IDX_RING_EXTRA_SPACE 64
25407d679bcSJun Yang #define QDMA_CNTX_IDX_RING_MAX_FREE \
25507d679bcSJun Yang 	(DPAA2_QDMA_MAX_DESC - QDMA_CNTX_IDX_RING_EXTRA_SPACE)
25607d679bcSJun Yang struct qdma_cntx_idx_ring {
25707d679bcSJun Yang 	uint16_t cntx_idx_ring[DPAA2_QDMA_MAX_DESC];
25807d679bcSJun Yang 	uint16_t start;
25907d679bcSJun Yang 	uint16_t tail;
26007d679bcSJun Yang 	uint16_t free_space;
26107d679bcSJun Yang 	uint16_t nb_in_ring;
26207d679bcSJun Yang };
2638caf8427SNipun Gupta 
26407d679bcSJun Yang #define DPAA2_QDMA_DESC_DEBUG_FLAG (1 << 0)
2658caf8427SNipun Gupta 
2668caf8427SNipun Gupta /** Represents a QDMA virtual queue */
2678caf8427SNipun Gupta struct qdma_virt_queue {
2688caf8427SNipun Gupta 	/** Associated hw queue */
2698caf8427SNipun Gupta 	struct dpaa2_dpdmai_dev *dpdmai_dev;
2708caf8427SNipun Gupta 	/** FLE pool for the queue */
2718caf8427SNipun Gupta 	struct rte_mempool *fle_pool;
272388e888dSJun Yang 	uint64_t fle_iova2va_offset;
27307d679bcSJun Yang 	void **fle_elem;
2748caf8427SNipun Gupta 	/** Route by port */
2753d990faaSJun Yang 	struct dpaa2_qdma_rbp rbp;
2768caf8427SNipun Gupta 	/** States if this vq is in use or not */
27707d679bcSJun Yang 	uint8_t fle_pre_populate;
2788caf8427SNipun Gupta 	/** Number of descriptor for the virtual DMA channel */
2798caf8427SNipun Gupta 	uint16_t nb_desc;
2808caf8427SNipun Gupta 	/* Total number of enqueues on this VQ */
2818caf8427SNipun Gupta 	uint64_t num_enqueues;
2828caf8427SNipun Gupta 	/* Total number of dequeues from this VQ */
2838caf8427SNipun Gupta 	uint64_t num_dequeues;
284388e888dSJun Yang 	uint64_t copy_num;
2858caf8427SNipun Gupta 
2868caf8427SNipun Gupta 	uint16_t vq_id;
2878caf8427SNipun Gupta 	uint32_t flags;
28807d679bcSJun Yang 	struct qbman_fd fd[DPAA2_QDMA_MAX_DESC];
28907d679bcSJun Yang 	uint16_t fd_idx;
29007d679bcSJun Yang 	struct qdma_cntx_idx_ring *ring_cntx_idx;
2918caf8427SNipun Gupta 
29207d679bcSJun Yang 	/**Used for silent enabled*/
29307d679bcSJun Yang 	struct qdma_cntx_sg *cntx_sg[DPAA2_QDMA_MAX_DESC];
294388e888dSJun Yang 	struct qdma_cntx_fle_sdd *cntx_fle_sdd[DPAA2_QDMA_MAX_DESC];
29507d679bcSJun Yang 	uint16_t silent_idx;
29607d679bcSJun Yang 
2978caf8427SNipun Gupta 	int num_valid_jobs;
298388e888dSJun Yang 	int using_short_fd;
2998caf8427SNipun Gupta 
3008caf8427SNipun Gupta 	struct rte_dma_stats stats;
3018caf8427SNipun Gupta };
3028caf8427SNipun Gupta 
3038caf8427SNipun Gupta /** Represents a QDMA device. */
3048caf8427SNipun Gupta struct qdma_device {
3058caf8427SNipun Gupta 	/** VQ's of this device */
3068caf8427SNipun Gupta 	struct qdma_virt_queue *vqs;
3078caf8427SNipun Gupta 	/** Total number of VQ's */
3088caf8427SNipun Gupta 	uint16_t num_vqs;
30907d679bcSJun Yang 	uint8_t is_silent;
3108caf8427SNipun Gupta };
3118caf8427SNipun Gupta 
3128caf8427SNipun Gupta #endif /* _DPAA2_QDMA_H_ */
313