xref: /dpdk/drivers/dma/dpaa/dpaa_qdma.h (revision e77506397fc8005c5129e22e9e2d15d5876790fd)
1cc166b51SGagandeep Singh /* SPDX-License-Identifier: BSD-3-Clause
2f1d30e27SJun Yang  * Copyright 2021-2024 NXP
3cc166b51SGagandeep Singh  */
4cc166b51SGagandeep Singh 
5cc166b51SGagandeep Singh #ifndef _DPAA_QDMA_H_
6cc166b51SGagandeep Singh #define _DPAA_QDMA_H_
7cc166b51SGagandeep Singh 
8cc166b51SGagandeep Singh #include <rte_io.h>
9cc166b51SGagandeep Singh 
107da29a64SGagandeep Singh #ifndef BIT
117da29a64SGagandeep Singh #define BIT(nr)		(1UL << (nr))
127da29a64SGagandeep Singh #endif
137da29a64SGagandeep Singh 
14cc166b51SGagandeep Singh #define RETRIES	5
15cc166b51SGagandeep Singh 
16453d8273SGagandeep Singh #ifndef GENMASK
17453d8273SGagandeep Singh #define BITS_PER_LONG	(__SIZEOF_LONG__ * 8)
18453d8273SGagandeep Singh #define GENMASK(h, l) \
19453d8273SGagandeep Singh 		(((~0UL) << (l)) & (~0UL >> (BITS_PER_LONG - 1 - (h))))
20453d8273SGagandeep Singh #endif
21453d8273SGagandeep Singh 
22f1d30e27SJun Yang #define QDMA_CTRL_REGION_OFFSET 0
23f1d30e27SJun Yang #define QDMA_CTRL_REGION_SIZE 0x10000
24f1d30e27SJun Yang #define QDMA_STATUS_REGION_OFFSET \
25f1d30e27SJun Yang 	(QDMA_CTRL_REGION_OFFSET + QDMA_CTRL_REGION_SIZE)
26f1d30e27SJun Yang #define QDMA_STATUS_REGION_SIZE 0x10000
27a77261f6SJun Yang 
28f1d30e27SJun Yang #define DPAA_QDMA_FLAGS_INDEX RTE_BIT64(63)
29a77261f6SJun Yang #define DPAA_QDMA_COPY_IDX_OFFSET 8
30a77261f6SJun Yang #define DPAA_QDMA_SG_IDX_ADDR_ALIGN \
31a77261f6SJun Yang 	RTE_BIT64(DPAA_QDMA_COPY_IDX_OFFSET)
32a77261f6SJun Yang #define DPAA_QDMA_SG_IDX_ADDR_MASK \
33a77261f6SJun Yang 	(DPAA_QDMA_SG_IDX_ADDR_ALIGN - 1)
34f1d30e27SJun Yang 
35cc166b51SGagandeep Singh #define FSL_QDMA_DMR			0x0
36cc166b51SGagandeep Singh #define FSL_QDMA_DSR			0x4
377da29a64SGagandeep Singh #define FSL_QDMA_DEDR			0xe04
387da29a64SGagandeep Singh #define FSL_QDMA_DECFDW0R		0xe10
397da29a64SGagandeep Singh #define FSL_QDMA_DECFDW1R		0xe14
407da29a64SGagandeep Singh #define FSL_QDMA_DECFDW2R		0xe18
417da29a64SGagandeep Singh #define FSL_QDMA_DECFDW3R		0xe1c
427da29a64SGagandeep Singh #define FSL_QDMA_DECFQIDR		0xe30
437da29a64SGagandeep Singh #define FSL_QDMA_DECBR			0xe34
44cc166b51SGagandeep Singh 
45cc166b51SGagandeep Singh #define FSL_QDMA_BCQMR(x)		(0xc0 + 0x100 * (x))
467da29a64SGagandeep Singh #define FSL_QDMA_BCQSR(x)		(0xc4 + 0x100 * (x))
47cc166b51SGagandeep Singh #define FSL_QDMA_BCQEDPA_SADDR(x)	(0xc8 + 0x100 * (x))
48cc166b51SGagandeep Singh #define FSL_QDMA_BCQDPA_SADDR(x)	(0xcc + 0x100 * (x))
49cc166b51SGagandeep Singh #define FSL_QDMA_BCQEEPA_SADDR(x)	(0xd0 + 0x100 * (x))
50cc166b51SGagandeep Singh #define FSL_QDMA_BCQEPA_SADDR(x)	(0xd4 + 0x100 * (x))
51cc166b51SGagandeep Singh #define FSL_QDMA_BCQIER(x)		(0xe0 + 0x100 * (x))
52cc166b51SGagandeep Singh #define FSL_QDMA_BCQIDR(x)		(0xe4 + 0x100 * (x))
53cc166b51SGagandeep Singh 
54cc166b51SGagandeep Singh #define FSL_QDMA_SQEDPAR		0x808
55cc166b51SGagandeep Singh #define FSL_QDMA_SQDPAR			0x80c
56cc166b51SGagandeep Singh #define FSL_QDMA_SQEEPAR		0x810
57cc166b51SGagandeep Singh #define FSL_QDMA_SQEPAR			0x814
58cc166b51SGagandeep Singh #define FSL_QDMA_BSQMR			0x800
597da29a64SGagandeep Singh #define FSL_QDMA_BSQSR			0x804
60cc166b51SGagandeep Singh #define FSL_QDMA_BSQICR			0x828
61cc166b51SGagandeep Singh #define FSL_QDMA_CQIER			0xa10
62cc166b51SGagandeep Singh #define FSL_QDMA_SQCCMR			0xa20
63cc166b51SGagandeep Singh 
64cc166b51SGagandeep Singh #define FSL_QDMA_SQCCMR_ENTER_WM	0x200000
65cc166b51SGagandeep Singh 
66cc166b51SGagandeep Singh #define FSL_QDMA_QUEUE_MAX		8
67cc166b51SGagandeep Singh 
68cc166b51SGagandeep Singh #define FSL_QDMA_BCQMR_EN		0x80000000
69f1d30e27SJun Yang #define FSL_QDMA_BCQMR_EI		0x40000000
70f1d30e27SJun Yang 
71cc166b51SGagandeep Singh #define FSL_QDMA_BCQMR_CD_THLD(x)	((x) << 20)
72cc166b51SGagandeep Singh #define FSL_QDMA_BCQMR_CQ_SIZE(x)	((x) << 16)
73cc166b51SGagandeep Singh 
747da29a64SGagandeep Singh #define FSL_QDMA_BCQSR_QF_XOFF_BE	0x1000100
757da29a64SGagandeep Singh 
76cc166b51SGagandeep Singh #define FSL_QDMA_BSQMR_EN		0x80000000
77cc166b51SGagandeep Singh #define FSL_QDMA_BSQMR_CQ_SIZE(x)	((x) << 16)
78f1d30e27SJun Yang #define FSL_QDMA_BSQMR_DI		0xc0
79cc166b51SGagandeep Singh 
807da29a64SGagandeep Singh #define FSL_QDMA_BSQSR_QE_BE		0x200
817da29a64SGagandeep Singh 
82cc166b51SGagandeep Singh #define FSL_QDMA_DMR_DQD		0x40000000
83cc166b51SGagandeep Singh #define FSL_QDMA_DSR_DB			0x80000000
84cc166b51SGagandeep Singh 
85cc166b51SGagandeep Singh #define FSL_QDMA_CIRCULAR_DESC_SIZE_MIN	64
86cc166b51SGagandeep Singh #define FSL_QDMA_CIRCULAR_DESC_SIZE_MAX	16384
87cc166b51SGagandeep Singh #define FSL_QDMA_QUEUE_NUM_MAX		8
88cc166b51SGagandeep Singh 
89f1d30e27SJun Yang #define FSL_QDMA_COMP_SG_FORMAT		0x1
90f1d30e27SJun Yang 
91453d8273SGagandeep Singh #define FSL_QDMA_CMD_RWTTYPE		0x4
92453d8273SGagandeep Singh #define FSL_QDMA_CMD_LWC		0x2
93453d8273SGagandeep Singh 
94bdcb782aSJun Yang #define FSL_QDMA_CMD_SS_ERR050757_LEN 128
95453d8273SGagandeep Singh 
96cc166b51SGagandeep Singh /* qdma engine attribute */
97bdcb782aSJun Yang #define QDMA_QUEUE_SIZE FSL_QDMA_CIRCULAR_DESC_SIZE_MIN
98bdcb782aSJun Yang #define QDMA_STATUS_SIZE QDMA_QUEUE_SIZE
99cc166b51SGagandeep Singh #define QDMA_CCSR_BASE 0x8380000
100cc166b51SGagandeep Singh #define QDMA_BLOCK_OFFSET 0x10000
101cc166b51SGagandeep Singh #define QDMA_BLOCKS 4
102cc166b51SGagandeep Singh #define QDMA_QUEUES 8
103f1d30e27SJun Yang #define QDMA_QUEUE_CR_WM 32
104cc166b51SGagandeep Singh 
105cc166b51SGagandeep Singh #define QDMA_BIG_ENDIAN			1
106cc166b51SGagandeep Singh #ifdef QDMA_BIG_ENDIAN
107cc166b51SGagandeep Singh #define QDMA_IN(addr)		be32_to_cpu(rte_read32(addr))
108cc166b51SGagandeep Singh #define QDMA_OUT(addr, val)	rte_write32(be32_to_cpu(val), addr)
1097da29a64SGagandeep Singh #define QDMA_IN_BE(addr)	rte_read32(addr)
1107da29a64SGagandeep Singh #define QDMA_OUT_BE(addr, val)	rte_write32(val, addr)
111cc166b51SGagandeep Singh #else
112cc166b51SGagandeep Singh #define QDMA_IN(addr)		rte_read32(addr)
113cc166b51SGagandeep Singh #define QDMA_OUT(addr, val)	rte_write32(val, addr)
1147da29a64SGagandeep Singh #define QDMA_IN_BE(addr)	be32_to_cpu(rte_write32(addr))
1157da29a64SGagandeep Singh #define QDMA_OUT_BE(addr, val)	rte_write32(be32_to_cpu(val), addr)
116cc166b51SGagandeep Singh #endif
117cc166b51SGagandeep Singh 
118cc166b51SGagandeep Singh #define FSL_QDMA_BLOCK_BASE_OFFSET(fsl_qdma_engine, x)			\
119cc166b51SGagandeep Singh 	(((fsl_qdma_engine)->block_offset) * (x))
120cc166b51SGagandeep Singh 
121cc166b51SGagandeep Singh /* qDMA Command Descriptor Formats */
122*e7750639SAndre Muezerie struct __rte_packed_begin fsl_qdma_comp_cmd_desc {
123f1d30e27SJun Yang 	uint8_t status;
124f1d30e27SJun Yang 	uint32_t rsv0:22;
125f1d30e27SJun Yang 	uint32_t ser:1;
126f1d30e27SJun Yang 	uint32_t rsv1:21;
127f1d30e27SJun Yang 	uint32_t offset:9;
128f1d30e27SJun Yang 	uint32_t format:3;
129f1d30e27SJun Yang 	uint32_t addr_lo;
130f1d30e27SJun Yang 	uint8_t addr_hi;
131f1d30e27SJun Yang 	uint16_t rsv3;
132f1d30e27SJun Yang 	uint8_t queue:3;
133f1d30e27SJun Yang 	uint8_t rsv4:3;
134f1d30e27SJun Yang 	uint8_t dd:2;
135*e7750639SAndre Muezerie } __rte_packed_end;
136cc166b51SGagandeep Singh 
137*e7750639SAndre Muezerie struct __rte_packed_begin fsl_qdma_comp_sg_desc {
138f1d30e27SJun Yang 	uint32_t offset:13;
139f1d30e27SJun Yang 	uint32_t rsv0:19;
140f1d30e27SJun Yang 	uint32_t length:30;
141f1d30e27SJun Yang 	uint32_t final:1;
142f1d30e27SJun Yang 	uint32_t extion:1;
143f1d30e27SJun Yang 	uint32_t addr_lo;
144f1d30e27SJun Yang 	uint8_t addr_hi;
145f1d30e27SJun Yang 	uint32_t rsv1:24;
146*e7750639SAndre Muezerie } __rte_packed_end;
147f1d30e27SJun Yang 
148*e7750639SAndre Muezerie struct __rte_packed_begin fsl_qdma_sdf {
149f1d30e27SJun Yang 	uint32_t rsv0;
150f1d30e27SJun Yang 	uint32_t ssd:12;
151f1d30e27SJun Yang 	uint32_t sss:12;
152f1d30e27SJun Yang 	uint32_t rsv1:8;
153f1d30e27SJun Yang 	uint32_t rsv2;
154453d8273SGagandeep Singh 
155f1d30e27SJun Yang 	uint32_t rsv3:17;
156f1d30e27SJun Yang 	uint32_t prefetch:1;
157f1d30e27SJun Yang 	uint32_t rsv4:1;
158f1d30e27SJun Yang 	uint32_t ssen:1;
159f1d30e27SJun Yang 	uint32_t rthrotl:4;
160f1d30e27SJun Yang 	uint32_t sqos:3;
161f1d30e27SJun Yang 	uint32_t ns:1;
162f1d30e27SJun Yang 	uint32_t srttype:4;
163*e7750639SAndre Muezerie } __rte_packed_end;
164f1d30e27SJun Yang 
165*e7750639SAndre Muezerie struct __rte_packed_begin fsl_qdma_ddf {
166f1d30e27SJun Yang 	uint32_t rsv0;
167f1d30e27SJun Yang 	uint32_t dsd:12;
168f1d30e27SJun Yang 	uint32_t dss:12;
169f1d30e27SJun Yang 	uint32_t rsv1:8;
170f1d30e27SJun Yang 	uint32_t rsv2;
171f1d30e27SJun Yang 
172f1d30e27SJun Yang 	uint16_t rsv3;
173f1d30e27SJun Yang 	uint32_t lwc:2;
174f1d30e27SJun Yang 	uint32_t rsv4:1;
175f1d30e27SJun Yang 	uint32_t dsen:1;
176f1d30e27SJun Yang 	uint32_t wthrotl:4;
177f1d30e27SJun Yang 	uint32_t dqos:3;
178f1d30e27SJun Yang 	uint32_t ns:1;
179f1d30e27SJun Yang 	uint32_t dwttype:4;
180*e7750639SAndre Muezerie } __rte_packed_end;
181f1d30e27SJun Yang 
182f1d30e27SJun Yang struct fsl_qdma_df {
183f1d30e27SJun Yang 	struct fsl_qdma_sdf sdf;
184f1d30e27SJun Yang 	struct fsl_qdma_ddf ddf;
185453d8273SGagandeep Singh };
186453d8273SGagandeep Singh 
187f1d30e27SJun Yang #define FSL_QDMA_SG_MAX_ENTRY 64
188f1d30e27SJun Yang #define FSL_QDMA_MAX_DESC_NUM (FSL_QDMA_SG_MAX_ENTRY * QDMA_QUEUE_SIZE)
189*e7750639SAndre Muezerie struct __rte_packed_begin fsl_qdma_cmpd_ft {
190f1d30e27SJun Yang 	struct fsl_qdma_comp_sg_desc desc_buf;
191f1d30e27SJun Yang 	struct fsl_qdma_comp_sg_desc desc_sbuf;
192f1d30e27SJun Yang 	struct fsl_qdma_comp_sg_desc desc_dbuf;
193f1d30e27SJun Yang 	uint64_t cache_align[2];
194f1d30e27SJun Yang 	struct fsl_qdma_comp_sg_desc desc_ssge[FSL_QDMA_SG_MAX_ENTRY];
195f1d30e27SJun Yang 	struct fsl_qdma_comp_sg_desc desc_dsge[FSL_QDMA_SG_MAX_ENTRY];
196f1d30e27SJun Yang 	struct fsl_qdma_df df;
197f1d30e27SJun Yang 	uint64_t phy_ssge;
198f1d30e27SJun Yang 	uint64_t phy_dsge;
199f1d30e27SJun Yang 	uint64_t phy_df;
200*e7750639SAndre Muezerie } __rte_packed_end;
201f1d30e27SJun Yang 
202a63c6426SJun Yang #define FSL_QDMA_ERR_REG_STATUS_OFFSET 0xe00
203a63c6426SJun Yang 
204a63c6426SJun Yang struct fsl_qdma_dedr_reg {
205a63c6426SJun Yang 	uint32_t me:1;
206a63c6426SJun Yang 	uint32_t rsv0:1;
207a63c6426SJun Yang 	uint32_t rte:1;
208a63c6426SJun Yang 	uint32_t wte:1;
209a63c6426SJun Yang 	uint32_t cde:1;
210a63c6426SJun Yang 	uint32_t sde:1;
211a63c6426SJun Yang 	uint32_t dde:1;
212a63c6426SJun Yang 	uint32_t ere:1;
213a63c6426SJun Yang 	uint32_t rsv1:24;
214a63c6426SJun Yang };
215a63c6426SJun Yang 
216a63c6426SJun Yang struct fsl_qdma_deccqidr_reg {
217a63c6426SJun Yang 	uint32_t rsv:27;
218a63c6426SJun Yang 	uint32_t block:2;
219a63c6426SJun Yang 	uint32_t queue:3;
220a63c6426SJun Yang };
221a63c6426SJun Yang 
222a63c6426SJun Yang #define FSL_QDMA_DECCD_ERR_NUM \
223a63c6426SJun Yang 	(sizeof(struct fsl_qdma_comp_cmd_desc) / sizeof(uint32_t))
224a63c6426SJun Yang 
225a63c6426SJun Yang struct fsl_qdma_err_reg {
226a63c6426SJun Yang 	uint32_t deier;
227a63c6426SJun Yang 	union {
228a63c6426SJun Yang 		rte_be32_t dedr_be;
229a63c6426SJun Yang 		struct fsl_qdma_dedr_reg dedr;
230a63c6426SJun Yang 	};
231a63c6426SJun Yang 	uint32_t rsv0[2];
232a63c6426SJun Yang 	union {
233a63c6426SJun Yang 		rte_le32_t deccd_le[FSL_QDMA_DECCD_ERR_NUM];
234a63c6426SJun Yang 		struct fsl_qdma_comp_cmd_desc err_cmd;
235a63c6426SJun Yang 	};
236a63c6426SJun Yang 	uint32_t rsv1[4];
237a63c6426SJun Yang 	union {
238a63c6426SJun Yang 		rte_be32_t deccqidr_be;
239a63c6426SJun Yang 		struct fsl_qdma_deccqidr_reg deccqidr;
240a63c6426SJun Yang 	};
241a63c6426SJun Yang 	rte_be32_t decbr;
242a63c6426SJun Yang };
243a63c6426SJun Yang 
244a77261f6SJun Yang #define DPAA_QDMA_IDXADDR_FROM_SG_FLAG(flag) \
245a77261f6SJun Yang 	((void *)(uintptr_t)((flag) - ((flag) & DPAA_QDMA_SG_IDX_ADDR_MASK)))
246a77261f6SJun Yang 
247f1d30e27SJun Yang #define DPAA_QDMA_IDX_FROM_FLAG(flag) \
248f1d30e27SJun Yang 	((flag) >> DPAA_QDMA_COPY_IDX_OFFSET)
249f1d30e27SJun Yang 
250f1d30e27SJun Yang struct fsl_qdma_desc {
251f1d30e27SJun Yang 	rte_iova_t src;
252f1d30e27SJun Yang 	rte_iova_t dst;
253f1d30e27SJun Yang 	uint64_t flag;
254f1d30e27SJun Yang 	uint64_t len;
255cc166b51SGagandeep Singh };
256cc166b51SGagandeep Singh 
257cc166b51SGagandeep Singh struct fsl_qdma_queue {
258f1d30e27SJun Yang 	int used;
259f1d30e27SJun Yang 	struct fsl_qdma_cmpd_ft **ft;
260f1d30e27SJun Yang 	uint16_t ci;
261f1d30e27SJun Yang 	struct rte_ring *complete_burst;
262f1d30e27SJun Yang 	struct rte_ring *complete_desc;
263f1d30e27SJun Yang 	struct rte_ring *complete_pool;
264f1d30e27SJun Yang 	uint16_t n_cq;
265f1d30e27SJun Yang 	uint8_t block_id;
266f1d30e27SJun Yang 	uint8_t queue_id;
267f1d30e27SJun Yang 	uint8_t channel_id;
268f1d30e27SJun Yang 	void *block_vir;
269f1d30e27SJun Yang 	uint32_t le_cqmr;
270f1d30e27SJun Yang 	struct fsl_qdma_comp_cmd_desc *cq;
271f1d30e27SJun Yang 	uint16_t desc_in_hw[QDMA_QUEUE_SIZE];
27233441726SGagandeep Singh 	struct rte_dma_stats stats;
273f1d30e27SJun Yang 	struct fsl_qdma_desc *pending_desc;
274f1d30e27SJun Yang 	uint16_t pending_max;
275f1d30e27SJun Yang 	uint16_t pending_start;
276f1d30e27SJun Yang 	uint16_t pending_num;
277f1d30e27SJun Yang 	uint16_t complete_start;
278f1d30e27SJun Yang 	dma_addr_t bus_addr;
279f1d30e27SJun Yang 	void *engine;
280cc166b51SGagandeep Singh };
281cc166b51SGagandeep Singh 
282f1d30e27SJun Yang struct fsl_qdma_status_queue {
283f1d30e27SJun Yang 	uint16_t n_cq;
284f1d30e27SJun Yang 	uint16_t complete;
285f1d30e27SJun Yang 	uint8_t block_id;
286f1d30e27SJun Yang 	void *block_vir;
287f1d30e27SJun Yang 	struct fsl_qdma_comp_cmd_desc *cq;
288f1d30e27SJun Yang 	struct rte_dma_stats stats;
289cc166b51SGagandeep Singh 	dma_addr_t bus_addr;
290f1d30e27SJun Yang 	void *engine;
291cc166b51SGagandeep Singh };
292cc166b51SGagandeep Singh 
293cc166b51SGagandeep Singh struct fsl_qdma_engine {
294f1d30e27SJun Yang 	void *reg_base;
295cc166b51SGagandeep Singh 	void *ctrl_base;
296cc166b51SGagandeep Singh 	void *status_base;
297cc166b51SGagandeep Singh 	void *block_base;
298f1d30e27SJun Yang 	uint32_t n_queues;
299f1d30e27SJun Yang 	uint8_t block_queues[QDMA_BLOCKS];
300f1d30e27SJun Yang 	struct fsl_qdma_queue cmd_queues[QDMA_BLOCKS][QDMA_QUEUES];
301f1d30e27SJun Yang 	struct fsl_qdma_status_queue stat_queues[QDMA_BLOCKS];
302f1d30e27SJun Yang 	struct fsl_qdma_queue *chan[QDMA_BLOCKS * QDMA_QUEUES];
303f1d30e27SJun Yang 	uint32_t num_blocks;
304cc166b51SGagandeep Singh 	int block_offset;
3057a7bb89eSJun Yang 	int is_silent;
306cc166b51SGagandeep Singh };
307cc166b51SGagandeep Singh 
308cc166b51SGagandeep Singh #endif /* _DPAA_QDMA_H_ */
309