xref: /linux/drivers/dma/ti/k3-udma.c (revision 0e685c3e7158d35626d6d76b9f859eae806d87fa)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  *  Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com
4  *  Author: Peter Ujfalusi <peter.ujfalusi@ti.com>
5  */
6 
7 #include <linux/kernel.h>
8 #include <linux/module.h>
9 #include <linux/delay.h>
10 #include <linux/dmaengine.h>
11 #include <linux/dma-mapping.h>
12 #include <linux/dmapool.h>
13 #include <linux/err.h>
14 #include <linux/init.h>
15 #include <linux/interrupt.h>
16 #include <linux/list.h>
17 #include <linux/platform_device.h>
18 #include <linux/slab.h>
19 #include <linux/spinlock.h>
20 #include <linux/sys_soc.h>
21 #include <linux/of.h>
22 #include <linux/of_dma.h>
23 #include <linux/of_device.h>
24 #include <linux/of_irq.h>
25 #include <linux/workqueue.h>
26 #include <linux/completion.h>
27 #include <linux/soc/ti/k3-ringacc.h>
28 #include <linux/soc/ti/ti_sci_protocol.h>
29 #include <linux/soc/ti/ti_sci_inta_msi.h>
30 #include <linux/dma/k3-event-router.h>
31 #include <linux/dma/ti-cppi5.h>
32 
33 #include "../virt-dma.h"
34 #include "k3-udma.h"
35 #include "k3-psil-priv.h"
36 
37 struct udma_static_tr {
38 	u8 elsize; /* RPSTR0 */
39 	u16 elcnt; /* RPSTR0 */
40 	u16 bstcnt; /* RPSTR1 */
41 };
42 
43 #define K3_UDMA_MAX_RFLOWS		1024
44 #define K3_UDMA_DEFAULT_RING_SIZE	16
45 
46 /* How SRC/DST tag should be updated by UDMA in the descriptor's Word 3 */
47 #define UDMA_RFLOW_SRCTAG_NONE		0
48 #define UDMA_RFLOW_SRCTAG_CFG_TAG	1
49 #define UDMA_RFLOW_SRCTAG_FLOW_ID	2
50 #define UDMA_RFLOW_SRCTAG_SRC_TAG	4
51 
52 #define UDMA_RFLOW_DSTTAG_NONE		0
53 #define UDMA_RFLOW_DSTTAG_CFG_TAG	1
54 #define UDMA_RFLOW_DSTTAG_FLOW_ID	2
55 #define UDMA_RFLOW_DSTTAG_DST_TAG_LO	4
56 #define UDMA_RFLOW_DSTTAG_DST_TAG_HI	5
57 
58 struct udma_chan;
59 
60 enum k3_dma_type {
61 	DMA_TYPE_UDMA = 0,
62 	DMA_TYPE_BCDMA,
63 	DMA_TYPE_PKTDMA,
64 };
65 
66 enum udma_mmr {
67 	MMR_GCFG = 0,
68 	MMR_BCHANRT,
69 	MMR_RCHANRT,
70 	MMR_TCHANRT,
71 	MMR_LAST,
72 };
73 
74 static const char * const mmr_names[] = {
75 	[MMR_GCFG] = "gcfg",
76 	[MMR_BCHANRT] = "bchanrt",
77 	[MMR_RCHANRT] = "rchanrt",
78 	[MMR_TCHANRT] = "tchanrt",
79 };
80 
81 struct udma_tchan {
82 	void __iomem *reg_rt;
83 
84 	int id;
85 	struct k3_ring *t_ring; /* Transmit ring */
86 	struct k3_ring *tc_ring; /* Transmit Completion ring */
87 	int tflow_id; /* applicable only for PKTDMA */
88 
89 };
90 
91 #define udma_bchan udma_tchan
92 
93 struct udma_rflow {
94 	int id;
95 	struct k3_ring *fd_ring; /* Free Descriptor ring */
96 	struct k3_ring *r_ring; /* Receive ring */
97 };
98 
99 struct udma_rchan {
100 	void __iomem *reg_rt;
101 
102 	int id;
103 };
104 
105 struct udma_oes_offsets {
106 	/* K3 UDMA Output Event Offset */
107 	u32 udma_rchan;
108 
109 	/* BCDMA Output Event Offsets */
110 	u32 bcdma_bchan_data;
111 	u32 bcdma_bchan_ring;
112 	u32 bcdma_tchan_data;
113 	u32 bcdma_tchan_ring;
114 	u32 bcdma_rchan_data;
115 	u32 bcdma_rchan_ring;
116 
117 	/* PKTDMA Output Event Offsets */
118 	u32 pktdma_tchan_flow;
119 	u32 pktdma_rchan_flow;
120 };
121 
122 #define UDMA_FLAG_PDMA_ACC32		BIT(0)
123 #define UDMA_FLAG_PDMA_BURST		BIT(1)
124 #define UDMA_FLAG_TDTYPE		BIT(2)
125 #define UDMA_FLAG_BURST_SIZE		BIT(3)
126 #define UDMA_FLAGS_J7_CLASS		(UDMA_FLAG_PDMA_ACC32 | \
127 					 UDMA_FLAG_PDMA_BURST | \
128 					 UDMA_FLAG_TDTYPE | \
129 					 UDMA_FLAG_BURST_SIZE)
130 
131 struct udma_match_data {
132 	enum k3_dma_type type;
133 	u32 psil_base;
134 	bool enable_memcpy_support;
135 	u32 flags;
136 	u32 statictr_z_mask;
137 	u8 burst_size[3];
138 	struct udma_soc_data *soc_data;
139 };
140 
141 struct udma_soc_data {
142 	struct udma_oes_offsets oes;
143 	u32 bcdma_trigger_event_offset;
144 };
145 
146 struct udma_hwdesc {
147 	size_t cppi5_desc_size;
148 	void *cppi5_desc_vaddr;
149 	dma_addr_t cppi5_desc_paddr;
150 
151 	/* TR descriptor internal pointers */
152 	void *tr_req_base;
153 	struct cppi5_tr_resp_t *tr_resp_base;
154 };
155 
156 struct udma_rx_flush {
157 	struct udma_hwdesc hwdescs[2];
158 
159 	size_t buffer_size;
160 	void *buffer_vaddr;
161 	dma_addr_t buffer_paddr;
162 };
163 
164 struct udma_tpl {
165 	u8 levels;
166 	u32 start_idx[3];
167 };
168 
169 struct udma_dev {
170 	struct dma_device ddev;
171 	struct device *dev;
172 	void __iomem *mmrs[MMR_LAST];
173 	const struct udma_match_data *match_data;
174 	const struct udma_soc_data *soc_data;
175 
176 	struct udma_tpl bchan_tpl;
177 	struct udma_tpl tchan_tpl;
178 	struct udma_tpl rchan_tpl;
179 
180 	size_t desc_align; /* alignment to use for descriptors */
181 
182 	struct udma_tisci_rm tisci_rm;
183 
184 	struct k3_ringacc *ringacc;
185 
186 	struct work_struct purge_work;
187 	struct list_head desc_to_purge;
188 	spinlock_t lock;
189 
190 	struct udma_rx_flush rx_flush;
191 
192 	int bchan_cnt;
193 	int tchan_cnt;
194 	int echan_cnt;
195 	int rchan_cnt;
196 	int rflow_cnt;
197 	int tflow_cnt;
198 	unsigned long *bchan_map;
199 	unsigned long *tchan_map;
200 	unsigned long *rchan_map;
201 	unsigned long *rflow_gp_map;
202 	unsigned long *rflow_gp_map_allocated;
203 	unsigned long *rflow_in_use;
204 	unsigned long *tflow_map;
205 
206 	struct udma_bchan *bchans;
207 	struct udma_tchan *tchans;
208 	struct udma_rchan *rchans;
209 	struct udma_rflow *rflows;
210 
211 	struct udma_chan *channels;
212 	u32 psil_base;
213 	u32 atype;
214 	u32 asel;
215 };
216 
217 struct udma_desc {
218 	struct virt_dma_desc vd;
219 
220 	bool terminated;
221 
222 	enum dma_transfer_direction dir;
223 
224 	struct udma_static_tr static_tr;
225 	u32 residue;
226 
227 	unsigned int sglen;
228 	unsigned int desc_idx; /* Only used for cyclic in packet mode */
229 	unsigned int tr_idx;
230 
231 	u32 metadata_size;
232 	void *metadata; /* pointer to provided metadata buffer (EPIP, PSdata) */
233 
234 	unsigned int hwdesc_count;
235 	struct udma_hwdesc hwdesc[];
236 };
237 
238 enum udma_chan_state {
239 	UDMA_CHAN_IS_IDLE = 0, /* not active, no teardown is in progress */
240 	UDMA_CHAN_IS_ACTIVE, /* Normal operation */
241 	UDMA_CHAN_IS_TERMINATING, /* channel is being terminated */
242 };
243 
244 struct udma_tx_drain {
245 	struct delayed_work work;
246 	ktime_t tstamp;
247 	u32 residue;
248 };
249 
250 struct udma_chan_config {
251 	bool pkt_mode; /* TR or packet */
252 	bool needs_epib; /* EPIB is needed for the communication or not */
253 	u32 psd_size; /* size of Protocol Specific Data */
254 	u32 metadata_size; /* (needs_epib ? 16:0) + psd_size */
255 	u32 hdesc_size; /* Size of a packet descriptor in packet mode */
256 	bool notdpkt; /* Suppress sending TDC packet */
257 	int remote_thread_id;
258 	u32 atype;
259 	u32 asel;
260 	u32 src_thread;
261 	u32 dst_thread;
262 	enum psil_endpoint_type ep_type;
263 	bool enable_acc32;
264 	bool enable_burst;
265 	enum udma_tp_level channel_tpl; /* Channel Throughput Level */
266 
267 	u32 tr_trigger_type;
268 	unsigned long tx_flags;
269 
270 	/* PKDMA mapped channel */
271 	int mapped_channel_id;
272 	/* PKTDMA default tflow or rflow for mapped channel */
273 	int default_flow_id;
274 
275 	enum dma_transfer_direction dir;
276 };
277 
278 struct udma_chan {
279 	struct virt_dma_chan vc;
280 	struct dma_slave_config	cfg;
281 	struct udma_dev *ud;
282 	struct device *dma_dev;
283 	struct udma_desc *desc;
284 	struct udma_desc *terminated_desc;
285 	struct udma_static_tr static_tr;
286 	char *name;
287 
288 	struct udma_bchan *bchan;
289 	struct udma_tchan *tchan;
290 	struct udma_rchan *rchan;
291 	struct udma_rflow *rflow;
292 
293 	bool psil_paired;
294 
295 	int irq_num_ring;
296 	int irq_num_udma;
297 
298 	bool cyclic;
299 	bool paused;
300 
301 	enum udma_chan_state state;
302 	struct completion teardown_completed;
303 
304 	struct udma_tx_drain tx_drain;
305 
306 	/* Channel configuration parameters */
307 	struct udma_chan_config config;
308 
309 	/* dmapool for packet mode descriptors */
310 	bool use_dma_pool;
311 	struct dma_pool *hdesc_pool;
312 
313 	u32 id;
314 };
315 
316 static inline struct udma_dev *to_udma_dev(struct dma_device *d)
317 {
318 	return container_of(d, struct udma_dev, ddev);
319 }
320 
321 static inline struct udma_chan *to_udma_chan(struct dma_chan *c)
322 {
323 	return container_of(c, struct udma_chan, vc.chan);
324 }
325 
326 static inline struct udma_desc *to_udma_desc(struct dma_async_tx_descriptor *t)
327 {
328 	return container_of(t, struct udma_desc, vd.tx);
329 }
330 
331 /* Generic register access functions */
332 static inline u32 udma_read(void __iomem *base, int reg)
333 {
334 	return readl(base + reg);
335 }
336 
337 static inline void udma_write(void __iomem *base, int reg, u32 val)
338 {
339 	writel(val, base + reg);
340 }
341 
342 static inline void udma_update_bits(void __iomem *base, int reg,
343 				    u32 mask, u32 val)
344 {
345 	u32 tmp, orig;
346 
347 	orig = readl(base + reg);
348 	tmp = orig & ~mask;
349 	tmp |= (val & mask);
350 
351 	if (tmp != orig)
352 		writel(tmp, base + reg);
353 }
354 
355 /* TCHANRT */
356 static inline u32 udma_tchanrt_read(struct udma_chan *uc, int reg)
357 {
358 	if (!uc->tchan)
359 		return 0;
360 	return udma_read(uc->tchan->reg_rt, reg);
361 }
362 
363 static inline void udma_tchanrt_write(struct udma_chan *uc, int reg, u32 val)
364 {
365 	if (!uc->tchan)
366 		return;
367 	udma_write(uc->tchan->reg_rt, reg, val);
368 }
369 
370 static inline void udma_tchanrt_update_bits(struct udma_chan *uc, int reg,
371 					    u32 mask, u32 val)
372 {
373 	if (!uc->tchan)
374 		return;
375 	udma_update_bits(uc->tchan->reg_rt, reg, mask, val);
376 }
377 
378 /* RCHANRT */
379 static inline u32 udma_rchanrt_read(struct udma_chan *uc, int reg)
380 {
381 	if (!uc->rchan)
382 		return 0;
383 	return udma_read(uc->rchan->reg_rt, reg);
384 }
385 
386 static inline void udma_rchanrt_write(struct udma_chan *uc, int reg, u32 val)
387 {
388 	if (!uc->rchan)
389 		return;
390 	udma_write(uc->rchan->reg_rt, reg, val);
391 }
392 
393 static inline void udma_rchanrt_update_bits(struct udma_chan *uc, int reg,
394 					    u32 mask, u32 val)
395 {
396 	if (!uc->rchan)
397 		return;
398 	udma_update_bits(uc->rchan->reg_rt, reg, mask, val);
399 }
400 
401 static int navss_psil_pair(struct udma_dev *ud, u32 src_thread, u32 dst_thread)
402 {
403 	struct udma_tisci_rm *tisci_rm = &ud->tisci_rm;
404 
405 	dst_thread |= K3_PSIL_DST_THREAD_ID_OFFSET;
406 	return tisci_rm->tisci_psil_ops->pair(tisci_rm->tisci,
407 					      tisci_rm->tisci_navss_dev_id,
408 					      src_thread, dst_thread);
409 }
410 
411 static int navss_psil_unpair(struct udma_dev *ud, u32 src_thread,
412 			     u32 dst_thread)
413 {
414 	struct udma_tisci_rm *tisci_rm = &ud->tisci_rm;
415 
416 	dst_thread |= K3_PSIL_DST_THREAD_ID_OFFSET;
417 	return tisci_rm->tisci_psil_ops->unpair(tisci_rm->tisci,
418 						tisci_rm->tisci_navss_dev_id,
419 						src_thread, dst_thread);
420 }
421 
422 static void k3_configure_chan_coherency(struct dma_chan *chan, u32 asel)
423 {
424 	struct device *chan_dev = &chan->dev->device;
425 
426 	if (asel == 0) {
427 		/* No special handling for the channel */
428 		chan->dev->chan_dma_dev = false;
429 
430 		chan_dev->dma_coherent = false;
431 		chan_dev->dma_parms = NULL;
432 	} else if (asel == 14 || asel == 15) {
433 		chan->dev->chan_dma_dev = true;
434 
435 		chan_dev->dma_coherent = true;
436 		dma_coerce_mask_and_coherent(chan_dev, DMA_BIT_MASK(48));
437 		chan_dev->dma_parms = chan_dev->parent->dma_parms;
438 	} else {
439 		dev_warn(chan->device->dev, "Invalid ASEL value: %u\n", asel);
440 
441 		chan_dev->dma_coherent = false;
442 		chan_dev->dma_parms = NULL;
443 	}
444 }
445 
446 static u8 udma_get_chan_tpl_index(struct udma_tpl *tpl_map, int chan_id)
447 {
448 	int i;
449 
450 	for (i = 0; i < tpl_map->levels; i++) {
451 		if (chan_id >= tpl_map->start_idx[i])
452 			return i;
453 	}
454 
455 	return 0;
456 }
457 
458 static void udma_reset_uchan(struct udma_chan *uc)
459 {
460 	memset(&uc->config, 0, sizeof(uc->config));
461 	uc->config.remote_thread_id = -1;
462 	uc->config.mapped_channel_id = -1;
463 	uc->config.default_flow_id = -1;
464 	uc->state = UDMA_CHAN_IS_IDLE;
465 }
466 
467 static void udma_dump_chan_stdata(struct udma_chan *uc)
468 {
469 	struct device *dev = uc->ud->dev;
470 	u32 offset;
471 	int i;
472 
473 	if (uc->config.dir == DMA_MEM_TO_DEV || uc->config.dir == DMA_MEM_TO_MEM) {
474 		dev_dbg(dev, "TCHAN State data:\n");
475 		for (i = 0; i < 32; i++) {
476 			offset = UDMA_CHAN_RT_STDATA_REG + i * 4;
477 			dev_dbg(dev, "TRT_STDATA[%02d]: 0x%08x\n", i,
478 				udma_tchanrt_read(uc, offset));
479 		}
480 	}
481 
482 	if (uc->config.dir == DMA_DEV_TO_MEM || uc->config.dir == DMA_MEM_TO_MEM) {
483 		dev_dbg(dev, "RCHAN State data:\n");
484 		for (i = 0; i < 32; i++) {
485 			offset = UDMA_CHAN_RT_STDATA_REG + i * 4;
486 			dev_dbg(dev, "RRT_STDATA[%02d]: 0x%08x\n", i,
487 				udma_rchanrt_read(uc, offset));
488 		}
489 	}
490 }
491 
492 static inline dma_addr_t udma_curr_cppi5_desc_paddr(struct udma_desc *d,
493 						    int idx)
494 {
495 	return d->hwdesc[idx].cppi5_desc_paddr;
496 }
497 
498 static inline void *udma_curr_cppi5_desc_vaddr(struct udma_desc *d, int idx)
499 {
500 	return d->hwdesc[idx].cppi5_desc_vaddr;
501 }
502 
503 static struct udma_desc *udma_udma_desc_from_paddr(struct udma_chan *uc,
504 						   dma_addr_t paddr)
505 {
506 	struct udma_desc *d = uc->terminated_desc;
507 
508 	if (d) {
509 		dma_addr_t desc_paddr = udma_curr_cppi5_desc_paddr(d,
510 								   d->desc_idx);
511 
512 		if (desc_paddr != paddr)
513 			d = NULL;
514 	}
515 
516 	if (!d) {
517 		d = uc->desc;
518 		if (d) {
519 			dma_addr_t desc_paddr = udma_curr_cppi5_desc_paddr(d,
520 								d->desc_idx);
521 
522 			if (desc_paddr != paddr)
523 				d = NULL;
524 		}
525 	}
526 
527 	return d;
528 }
529 
530 static void udma_free_hwdesc(struct udma_chan *uc, struct udma_desc *d)
531 {
532 	if (uc->use_dma_pool) {
533 		int i;
534 
535 		for (i = 0; i < d->hwdesc_count; i++) {
536 			if (!d->hwdesc[i].cppi5_desc_vaddr)
537 				continue;
538 
539 			dma_pool_free(uc->hdesc_pool,
540 				      d->hwdesc[i].cppi5_desc_vaddr,
541 				      d->hwdesc[i].cppi5_desc_paddr);
542 
543 			d->hwdesc[i].cppi5_desc_vaddr = NULL;
544 		}
545 	} else if (d->hwdesc[0].cppi5_desc_vaddr) {
546 		dma_free_coherent(uc->dma_dev, d->hwdesc[0].cppi5_desc_size,
547 				  d->hwdesc[0].cppi5_desc_vaddr,
548 				  d->hwdesc[0].cppi5_desc_paddr);
549 
550 		d->hwdesc[0].cppi5_desc_vaddr = NULL;
551 	}
552 }
553 
554 static void udma_purge_desc_work(struct work_struct *work)
555 {
556 	struct udma_dev *ud = container_of(work, typeof(*ud), purge_work);
557 	struct virt_dma_desc *vd, *_vd;
558 	unsigned long flags;
559 	LIST_HEAD(head);
560 
561 	spin_lock_irqsave(&ud->lock, flags);
562 	list_splice_tail_init(&ud->desc_to_purge, &head);
563 	spin_unlock_irqrestore(&ud->lock, flags);
564 
565 	list_for_each_entry_safe(vd, _vd, &head, node) {
566 		struct udma_chan *uc = to_udma_chan(vd->tx.chan);
567 		struct udma_desc *d = to_udma_desc(&vd->tx);
568 
569 		udma_free_hwdesc(uc, d);
570 		list_del(&vd->node);
571 		kfree(d);
572 	}
573 
574 	/* If more to purge, schedule the work again */
575 	if (!list_empty(&ud->desc_to_purge))
576 		schedule_work(&ud->purge_work);
577 }
578 
579 static void udma_desc_free(struct virt_dma_desc *vd)
580 {
581 	struct udma_dev *ud = to_udma_dev(vd->tx.chan->device);
582 	struct udma_chan *uc = to_udma_chan(vd->tx.chan);
583 	struct udma_desc *d = to_udma_desc(&vd->tx);
584 	unsigned long flags;
585 
586 	if (uc->terminated_desc == d)
587 		uc->terminated_desc = NULL;
588 
589 	if (uc->use_dma_pool) {
590 		udma_free_hwdesc(uc, d);
591 		kfree(d);
592 		return;
593 	}
594 
595 	spin_lock_irqsave(&ud->lock, flags);
596 	list_add_tail(&vd->node, &ud->desc_to_purge);
597 	spin_unlock_irqrestore(&ud->lock, flags);
598 
599 	schedule_work(&ud->purge_work);
600 }
601 
602 static bool udma_is_chan_running(struct udma_chan *uc)
603 {
604 	u32 trt_ctl = 0;
605 	u32 rrt_ctl = 0;
606 
607 	if (uc->tchan)
608 		trt_ctl = udma_tchanrt_read(uc, UDMA_CHAN_RT_CTL_REG);
609 	if (uc->rchan)
610 		rrt_ctl = udma_rchanrt_read(uc, UDMA_CHAN_RT_CTL_REG);
611 
612 	if (trt_ctl & UDMA_CHAN_RT_CTL_EN || rrt_ctl & UDMA_CHAN_RT_CTL_EN)
613 		return true;
614 
615 	return false;
616 }
617 
618 static bool udma_is_chan_paused(struct udma_chan *uc)
619 {
620 	u32 val, pause_mask;
621 
622 	switch (uc->config.dir) {
623 	case DMA_DEV_TO_MEM:
624 		val = udma_rchanrt_read(uc, UDMA_CHAN_RT_PEER_RT_EN_REG);
625 		pause_mask = UDMA_PEER_RT_EN_PAUSE;
626 		break;
627 	case DMA_MEM_TO_DEV:
628 		val = udma_tchanrt_read(uc, UDMA_CHAN_RT_PEER_RT_EN_REG);
629 		pause_mask = UDMA_PEER_RT_EN_PAUSE;
630 		break;
631 	case DMA_MEM_TO_MEM:
632 		val = udma_tchanrt_read(uc, UDMA_CHAN_RT_CTL_REG);
633 		pause_mask = UDMA_CHAN_RT_CTL_PAUSE;
634 		break;
635 	default:
636 		return false;
637 	}
638 
639 	if (val & pause_mask)
640 		return true;
641 
642 	return false;
643 }
644 
645 static inline dma_addr_t udma_get_rx_flush_hwdesc_paddr(struct udma_chan *uc)
646 {
647 	return uc->ud->rx_flush.hwdescs[uc->config.pkt_mode].cppi5_desc_paddr;
648 }
649 
650 static int udma_push_to_ring(struct udma_chan *uc, int idx)
651 {
652 	struct udma_desc *d = uc->desc;
653 	struct k3_ring *ring = NULL;
654 	dma_addr_t paddr;
655 
656 	switch (uc->config.dir) {
657 	case DMA_DEV_TO_MEM:
658 		ring = uc->rflow->fd_ring;
659 		break;
660 	case DMA_MEM_TO_DEV:
661 	case DMA_MEM_TO_MEM:
662 		ring = uc->tchan->t_ring;
663 		break;
664 	default:
665 		return -EINVAL;
666 	}
667 
668 	/* RX flush packet: idx == -1 is only passed in case of DEV_TO_MEM */
669 	if (idx == -1) {
670 		paddr = udma_get_rx_flush_hwdesc_paddr(uc);
671 	} else {
672 		paddr = udma_curr_cppi5_desc_paddr(d, idx);
673 
674 		wmb(); /* Ensure that writes are not moved over this point */
675 	}
676 
677 	return k3_ringacc_ring_push(ring, &paddr);
678 }
679 
680 static bool udma_desc_is_rx_flush(struct udma_chan *uc, dma_addr_t addr)
681 {
682 	if (uc->config.dir != DMA_DEV_TO_MEM)
683 		return false;
684 
685 	if (addr == udma_get_rx_flush_hwdesc_paddr(uc))
686 		return true;
687 
688 	return false;
689 }
690 
691 static int udma_pop_from_ring(struct udma_chan *uc, dma_addr_t *addr)
692 {
693 	struct k3_ring *ring = NULL;
694 	int ret;
695 
696 	switch (uc->config.dir) {
697 	case DMA_DEV_TO_MEM:
698 		ring = uc->rflow->r_ring;
699 		break;
700 	case DMA_MEM_TO_DEV:
701 	case DMA_MEM_TO_MEM:
702 		ring = uc->tchan->tc_ring;
703 		break;
704 	default:
705 		return -ENOENT;
706 	}
707 
708 	ret = k3_ringacc_ring_pop(ring, addr);
709 	if (ret)
710 		return ret;
711 
712 	rmb(); /* Ensure that reads are not moved before this point */
713 
714 	/* Teardown completion */
715 	if (cppi5_desc_is_tdcm(*addr))
716 		return 0;
717 
718 	/* Check for flush descriptor */
719 	if (udma_desc_is_rx_flush(uc, *addr))
720 		return -ENOENT;
721 
722 	return 0;
723 }
724 
725 static void udma_reset_rings(struct udma_chan *uc)
726 {
727 	struct k3_ring *ring1 = NULL;
728 	struct k3_ring *ring2 = NULL;
729 
730 	switch (uc->config.dir) {
731 	case DMA_DEV_TO_MEM:
732 		if (uc->rchan) {
733 			ring1 = uc->rflow->fd_ring;
734 			ring2 = uc->rflow->r_ring;
735 		}
736 		break;
737 	case DMA_MEM_TO_DEV:
738 	case DMA_MEM_TO_MEM:
739 		if (uc->tchan) {
740 			ring1 = uc->tchan->t_ring;
741 			ring2 = uc->tchan->tc_ring;
742 		}
743 		break;
744 	default:
745 		break;
746 	}
747 
748 	if (ring1)
749 		k3_ringacc_ring_reset_dma(ring1,
750 					  k3_ringacc_ring_get_occ(ring1));
751 	if (ring2)
752 		k3_ringacc_ring_reset(ring2);
753 
754 	/* make sure we are not leaking memory by stalled descriptor */
755 	if (uc->terminated_desc) {
756 		udma_desc_free(&uc->terminated_desc->vd);
757 		uc->terminated_desc = NULL;
758 	}
759 }
760 
761 static void udma_decrement_byte_counters(struct udma_chan *uc, u32 val)
762 {
763 	if (uc->desc->dir == DMA_DEV_TO_MEM) {
764 		udma_rchanrt_write(uc, UDMA_CHAN_RT_BCNT_REG, val);
765 		udma_rchanrt_write(uc, UDMA_CHAN_RT_SBCNT_REG, val);
766 		if (uc->config.ep_type != PSIL_EP_NATIVE)
767 			udma_rchanrt_write(uc, UDMA_CHAN_RT_PEER_BCNT_REG, val);
768 	} else {
769 		udma_tchanrt_write(uc, UDMA_CHAN_RT_BCNT_REG, val);
770 		udma_tchanrt_write(uc, UDMA_CHAN_RT_SBCNT_REG, val);
771 		if (!uc->bchan && uc->config.ep_type != PSIL_EP_NATIVE)
772 			udma_tchanrt_write(uc, UDMA_CHAN_RT_PEER_BCNT_REG, val);
773 	}
774 }
775 
776 static void udma_reset_counters(struct udma_chan *uc)
777 {
778 	u32 val;
779 
780 	if (uc->tchan) {
781 		val = udma_tchanrt_read(uc, UDMA_CHAN_RT_BCNT_REG);
782 		udma_tchanrt_write(uc, UDMA_CHAN_RT_BCNT_REG, val);
783 
784 		val = udma_tchanrt_read(uc, UDMA_CHAN_RT_SBCNT_REG);
785 		udma_tchanrt_write(uc, UDMA_CHAN_RT_SBCNT_REG, val);
786 
787 		val = udma_tchanrt_read(uc, UDMA_CHAN_RT_PCNT_REG);
788 		udma_tchanrt_write(uc, UDMA_CHAN_RT_PCNT_REG, val);
789 
790 		if (!uc->bchan) {
791 			val = udma_tchanrt_read(uc, UDMA_CHAN_RT_PEER_BCNT_REG);
792 			udma_tchanrt_write(uc, UDMA_CHAN_RT_PEER_BCNT_REG, val);
793 		}
794 	}
795 
796 	if (uc->rchan) {
797 		val = udma_rchanrt_read(uc, UDMA_CHAN_RT_BCNT_REG);
798 		udma_rchanrt_write(uc, UDMA_CHAN_RT_BCNT_REG, val);
799 
800 		val = udma_rchanrt_read(uc, UDMA_CHAN_RT_SBCNT_REG);
801 		udma_rchanrt_write(uc, UDMA_CHAN_RT_SBCNT_REG, val);
802 
803 		val = udma_rchanrt_read(uc, UDMA_CHAN_RT_PCNT_REG);
804 		udma_rchanrt_write(uc, UDMA_CHAN_RT_PCNT_REG, val);
805 
806 		val = udma_rchanrt_read(uc, UDMA_CHAN_RT_PEER_BCNT_REG);
807 		udma_rchanrt_write(uc, UDMA_CHAN_RT_PEER_BCNT_REG, val);
808 	}
809 }
810 
811 static int udma_reset_chan(struct udma_chan *uc, bool hard)
812 {
813 	switch (uc->config.dir) {
814 	case DMA_DEV_TO_MEM:
815 		udma_rchanrt_write(uc, UDMA_CHAN_RT_PEER_RT_EN_REG, 0);
816 		udma_rchanrt_write(uc, UDMA_CHAN_RT_CTL_REG, 0);
817 		break;
818 	case DMA_MEM_TO_DEV:
819 		udma_tchanrt_write(uc, UDMA_CHAN_RT_CTL_REG, 0);
820 		udma_tchanrt_write(uc, UDMA_CHAN_RT_PEER_RT_EN_REG, 0);
821 		break;
822 	case DMA_MEM_TO_MEM:
823 		udma_rchanrt_write(uc, UDMA_CHAN_RT_CTL_REG, 0);
824 		udma_tchanrt_write(uc, UDMA_CHAN_RT_CTL_REG, 0);
825 		break;
826 	default:
827 		return -EINVAL;
828 	}
829 
830 	/* Reset all counters */
831 	udma_reset_counters(uc);
832 
833 	/* Hard reset: re-initialize the channel to reset */
834 	if (hard) {
835 		struct udma_chan_config ucc_backup;
836 		int ret;
837 
838 		memcpy(&ucc_backup, &uc->config, sizeof(uc->config));
839 		uc->ud->ddev.device_free_chan_resources(&uc->vc.chan);
840 
841 		/* restore the channel configuration */
842 		memcpy(&uc->config, &ucc_backup, sizeof(uc->config));
843 		ret = uc->ud->ddev.device_alloc_chan_resources(&uc->vc.chan);
844 		if (ret)
845 			return ret;
846 
847 		/*
848 		 * Setting forced teardown after forced reset helps recovering
849 		 * the rchan.
850 		 */
851 		if (uc->config.dir == DMA_DEV_TO_MEM)
852 			udma_rchanrt_write(uc, UDMA_CHAN_RT_CTL_REG,
853 					   UDMA_CHAN_RT_CTL_EN |
854 					   UDMA_CHAN_RT_CTL_TDOWN |
855 					   UDMA_CHAN_RT_CTL_FTDOWN);
856 	}
857 	uc->state = UDMA_CHAN_IS_IDLE;
858 
859 	return 0;
860 }
861 
862 static void udma_start_desc(struct udma_chan *uc)
863 {
864 	struct udma_chan_config *ucc = &uc->config;
865 
866 	if (uc->ud->match_data->type == DMA_TYPE_UDMA && ucc->pkt_mode &&
867 	    (uc->cyclic || ucc->dir == DMA_DEV_TO_MEM)) {
868 		int i;
869 
870 		/*
871 		 * UDMA only: Push all descriptors to ring for packet mode
872 		 * cyclic or RX
873 		 * PKTDMA supports pre-linked descriptor and cyclic is not
874 		 * supported
875 		 */
876 		for (i = 0; i < uc->desc->sglen; i++)
877 			udma_push_to_ring(uc, i);
878 	} else {
879 		udma_push_to_ring(uc, 0);
880 	}
881 }
882 
883 static bool udma_chan_needs_reconfiguration(struct udma_chan *uc)
884 {
885 	/* Only PDMAs have staticTR */
886 	if (uc->config.ep_type == PSIL_EP_NATIVE)
887 		return false;
888 
889 	/* Check if the staticTR configuration has changed for TX */
890 	if (memcmp(&uc->static_tr, &uc->desc->static_tr, sizeof(uc->static_tr)))
891 		return true;
892 
893 	return false;
894 }
895 
896 static int udma_start(struct udma_chan *uc)
897 {
898 	struct virt_dma_desc *vd = vchan_next_desc(&uc->vc);
899 
900 	if (!vd) {
901 		uc->desc = NULL;
902 		return -ENOENT;
903 	}
904 
905 	list_del(&vd->node);
906 
907 	uc->desc = to_udma_desc(&vd->tx);
908 
909 	/* Channel is already running and does not need reconfiguration */
910 	if (udma_is_chan_running(uc) && !udma_chan_needs_reconfiguration(uc)) {
911 		udma_start_desc(uc);
912 		goto out;
913 	}
914 
915 	/* Make sure that we clear the teardown bit, if it is set */
916 	udma_reset_chan(uc, false);
917 
918 	/* Push descriptors before we start the channel */
919 	udma_start_desc(uc);
920 
921 	switch (uc->desc->dir) {
922 	case DMA_DEV_TO_MEM:
923 		/* Config remote TR */
924 		if (uc->config.ep_type == PSIL_EP_PDMA_XY) {
925 			u32 val = PDMA_STATIC_TR_Y(uc->desc->static_tr.elcnt) |
926 				  PDMA_STATIC_TR_X(uc->desc->static_tr.elsize);
927 			const struct udma_match_data *match_data =
928 							uc->ud->match_data;
929 
930 			if (uc->config.enable_acc32)
931 				val |= PDMA_STATIC_TR_XY_ACC32;
932 			if (uc->config.enable_burst)
933 				val |= PDMA_STATIC_TR_XY_BURST;
934 
935 			udma_rchanrt_write(uc,
936 					   UDMA_CHAN_RT_PEER_STATIC_TR_XY_REG,
937 					   val);
938 
939 			udma_rchanrt_write(uc,
940 				UDMA_CHAN_RT_PEER_STATIC_TR_Z_REG,
941 				PDMA_STATIC_TR_Z(uc->desc->static_tr.bstcnt,
942 						 match_data->statictr_z_mask));
943 
944 			/* save the current staticTR configuration */
945 			memcpy(&uc->static_tr, &uc->desc->static_tr,
946 			       sizeof(uc->static_tr));
947 		}
948 
949 		udma_rchanrt_write(uc, UDMA_CHAN_RT_CTL_REG,
950 				   UDMA_CHAN_RT_CTL_EN);
951 
952 		/* Enable remote */
953 		udma_rchanrt_write(uc, UDMA_CHAN_RT_PEER_RT_EN_REG,
954 				   UDMA_PEER_RT_EN_ENABLE);
955 
956 		break;
957 	case DMA_MEM_TO_DEV:
958 		/* Config remote TR */
959 		if (uc->config.ep_type == PSIL_EP_PDMA_XY) {
960 			u32 val = PDMA_STATIC_TR_Y(uc->desc->static_tr.elcnt) |
961 				  PDMA_STATIC_TR_X(uc->desc->static_tr.elsize);
962 
963 			if (uc->config.enable_acc32)
964 				val |= PDMA_STATIC_TR_XY_ACC32;
965 			if (uc->config.enable_burst)
966 				val |= PDMA_STATIC_TR_XY_BURST;
967 
968 			udma_tchanrt_write(uc,
969 					   UDMA_CHAN_RT_PEER_STATIC_TR_XY_REG,
970 					   val);
971 
972 			/* save the current staticTR configuration */
973 			memcpy(&uc->static_tr, &uc->desc->static_tr,
974 			       sizeof(uc->static_tr));
975 		}
976 
977 		/* Enable remote */
978 		udma_tchanrt_write(uc, UDMA_CHAN_RT_PEER_RT_EN_REG,
979 				   UDMA_PEER_RT_EN_ENABLE);
980 
981 		udma_tchanrt_write(uc, UDMA_CHAN_RT_CTL_REG,
982 				   UDMA_CHAN_RT_CTL_EN);
983 
984 		break;
985 	case DMA_MEM_TO_MEM:
986 		udma_rchanrt_write(uc, UDMA_CHAN_RT_CTL_REG,
987 				   UDMA_CHAN_RT_CTL_EN);
988 		udma_tchanrt_write(uc, UDMA_CHAN_RT_CTL_REG,
989 				   UDMA_CHAN_RT_CTL_EN);
990 
991 		break;
992 	default:
993 		return -EINVAL;
994 	}
995 
996 	uc->state = UDMA_CHAN_IS_ACTIVE;
997 out:
998 
999 	return 0;
1000 }
1001 
1002 static int udma_stop(struct udma_chan *uc)
1003 {
1004 	enum udma_chan_state old_state = uc->state;
1005 
1006 	uc->state = UDMA_CHAN_IS_TERMINATING;
1007 	reinit_completion(&uc->teardown_completed);
1008 
1009 	switch (uc->config.dir) {
1010 	case DMA_DEV_TO_MEM:
1011 		if (!uc->cyclic && !uc->desc)
1012 			udma_push_to_ring(uc, -1);
1013 
1014 		udma_rchanrt_write(uc, UDMA_CHAN_RT_PEER_RT_EN_REG,
1015 				   UDMA_PEER_RT_EN_ENABLE |
1016 				   UDMA_PEER_RT_EN_TEARDOWN);
1017 		break;
1018 	case DMA_MEM_TO_DEV:
1019 		udma_tchanrt_write(uc, UDMA_CHAN_RT_PEER_RT_EN_REG,
1020 				   UDMA_PEER_RT_EN_ENABLE |
1021 				   UDMA_PEER_RT_EN_FLUSH);
1022 		udma_tchanrt_write(uc, UDMA_CHAN_RT_CTL_REG,
1023 				   UDMA_CHAN_RT_CTL_EN |
1024 				   UDMA_CHAN_RT_CTL_TDOWN);
1025 		break;
1026 	case DMA_MEM_TO_MEM:
1027 		udma_tchanrt_write(uc, UDMA_CHAN_RT_CTL_REG,
1028 				   UDMA_CHAN_RT_CTL_EN |
1029 				   UDMA_CHAN_RT_CTL_TDOWN);
1030 		break;
1031 	default:
1032 		uc->state = old_state;
1033 		complete_all(&uc->teardown_completed);
1034 		return -EINVAL;
1035 	}
1036 
1037 	return 0;
1038 }
1039 
1040 static void udma_cyclic_packet_elapsed(struct udma_chan *uc)
1041 {
1042 	struct udma_desc *d = uc->desc;
1043 	struct cppi5_host_desc_t *h_desc;
1044 
1045 	h_desc = d->hwdesc[d->desc_idx].cppi5_desc_vaddr;
1046 	cppi5_hdesc_reset_to_original(h_desc);
1047 	udma_push_to_ring(uc, d->desc_idx);
1048 	d->desc_idx = (d->desc_idx + 1) % d->sglen;
1049 }
1050 
1051 static inline void udma_fetch_epib(struct udma_chan *uc, struct udma_desc *d)
1052 {
1053 	struct cppi5_host_desc_t *h_desc = d->hwdesc[0].cppi5_desc_vaddr;
1054 
1055 	memcpy(d->metadata, h_desc->epib, d->metadata_size);
1056 }
1057 
1058 static bool udma_is_desc_really_done(struct udma_chan *uc, struct udma_desc *d)
1059 {
1060 	u32 peer_bcnt, bcnt;
1061 
1062 	/*
1063 	 * Only TX towards PDMA is affected.
1064 	 * If DMA_PREP_INTERRUPT is not set by consumer then skip the transfer
1065 	 * completion calculation, consumer must ensure that there is no stale
1066 	 * data in DMA fabric in this case.
1067 	 */
1068 	if (uc->config.ep_type == PSIL_EP_NATIVE ||
1069 	    uc->config.dir != DMA_MEM_TO_DEV || !(uc->config.tx_flags & DMA_PREP_INTERRUPT))
1070 		return true;
1071 
1072 	peer_bcnt = udma_tchanrt_read(uc, UDMA_CHAN_RT_PEER_BCNT_REG);
1073 	bcnt = udma_tchanrt_read(uc, UDMA_CHAN_RT_BCNT_REG);
1074 
1075 	/* Transfer is incomplete, store current residue and time stamp */
1076 	if (peer_bcnt < bcnt) {
1077 		uc->tx_drain.residue = bcnt - peer_bcnt;
1078 		uc->tx_drain.tstamp = ktime_get();
1079 		return false;
1080 	}
1081 
1082 	return true;
1083 }
1084 
1085 static void udma_check_tx_completion(struct work_struct *work)
1086 {
1087 	struct udma_chan *uc = container_of(work, typeof(*uc),
1088 					    tx_drain.work.work);
1089 	bool desc_done = true;
1090 	u32 residue_diff;
1091 	ktime_t time_diff;
1092 	unsigned long delay;
1093 
1094 	while (1) {
1095 		if (uc->desc) {
1096 			/* Get previous residue and time stamp */
1097 			residue_diff = uc->tx_drain.residue;
1098 			time_diff = uc->tx_drain.tstamp;
1099 			/*
1100 			 * Get current residue and time stamp or see if
1101 			 * transfer is complete
1102 			 */
1103 			desc_done = udma_is_desc_really_done(uc, uc->desc);
1104 		}
1105 
1106 		if (!desc_done) {
1107 			/*
1108 			 * Find the time delta and residue delta w.r.t
1109 			 * previous poll
1110 			 */
1111 			time_diff = ktime_sub(uc->tx_drain.tstamp,
1112 					      time_diff) + 1;
1113 			residue_diff -= uc->tx_drain.residue;
1114 			if (residue_diff) {
1115 				/*
1116 				 * Try to guess when we should check
1117 				 * next time by calculating rate at
1118 				 * which data is being drained at the
1119 				 * peer device
1120 				 */
1121 				delay = (time_diff / residue_diff) *
1122 					uc->tx_drain.residue;
1123 			} else {
1124 				/* No progress, check again in 1 second  */
1125 				schedule_delayed_work(&uc->tx_drain.work, HZ);
1126 				break;
1127 			}
1128 
1129 			usleep_range(ktime_to_us(delay),
1130 				     ktime_to_us(delay) + 10);
1131 			continue;
1132 		}
1133 
1134 		if (uc->desc) {
1135 			struct udma_desc *d = uc->desc;
1136 
1137 			udma_decrement_byte_counters(uc, d->residue);
1138 			udma_start(uc);
1139 			vchan_cookie_complete(&d->vd);
1140 			break;
1141 		}
1142 
1143 		break;
1144 	}
1145 }
1146 
1147 static irqreturn_t udma_ring_irq_handler(int irq, void *data)
1148 {
1149 	struct udma_chan *uc = data;
1150 	struct udma_desc *d;
1151 	dma_addr_t paddr = 0;
1152 
1153 	if (udma_pop_from_ring(uc, &paddr) || !paddr)
1154 		return IRQ_HANDLED;
1155 
1156 	spin_lock(&uc->vc.lock);
1157 
1158 	/* Teardown completion message */
1159 	if (cppi5_desc_is_tdcm(paddr)) {
1160 		complete_all(&uc->teardown_completed);
1161 
1162 		if (uc->terminated_desc) {
1163 			udma_desc_free(&uc->terminated_desc->vd);
1164 			uc->terminated_desc = NULL;
1165 		}
1166 
1167 		if (!uc->desc)
1168 			udma_start(uc);
1169 
1170 		goto out;
1171 	}
1172 
1173 	d = udma_udma_desc_from_paddr(uc, paddr);
1174 
1175 	if (d) {
1176 		dma_addr_t desc_paddr = udma_curr_cppi5_desc_paddr(d,
1177 								   d->desc_idx);
1178 		if (desc_paddr != paddr) {
1179 			dev_err(uc->ud->dev, "not matching descriptors!\n");
1180 			goto out;
1181 		}
1182 
1183 		if (d == uc->desc) {
1184 			/* active descriptor */
1185 			if (uc->cyclic) {
1186 				udma_cyclic_packet_elapsed(uc);
1187 				vchan_cyclic_callback(&d->vd);
1188 			} else {
1189 				if (udma_is_desc_really_done(uc, d)) {
1190 					udma_decrement_byte_counters(uc, d->residue);
1191 					udma_start(uc);
1192 					vchan_cookie_complete(&d->vd);
1193 				} else {
1194 					schedule_delayed_work(&uc->tx_drain.work,
1195 							      0);
1196 				}
1197 			}
1198 		} else {
1199 			/*
1200 			 * terminated descriptor, mark the descriptor as
1201 			 * completed to update the channel's cookie marker
1202 			 */
1203 			dma_cookie_complete(&d->vd.tx);
1204 		}
1205 	}
1206 out:
1207 	spin_unlock(&uc->vc.lock);
1208 
1209 	return IRQ_HANDLED;
1210 }
1211 
1212 static irqreturn_t udma_udma_irq_handler(int irq, void *data)
1213 {
1214 	struct udma_chan *uc = data;
1215 	struct udma_desc *d;
1216 
1217 	spin_lock(&uc->vc.lock);
1218 	d = uc->desc;
1219 	if (d) {
1220 		d->tr_idx = (d->tr_idx + 1) % d->sglen;
1221 
1222 		if (uc->cyclic) {
1223 			vchan_cyclic_callback(&d->vd);
1224 		} else {
1225 			/* TODO: figure out the real amount of data */
1226 			udma_decrement_byte_counters(uc, d->residue);
1227 			udma_start(uc);
1228 			vchan_cookie_complete(&d->vd);
1229 		}
1230 	}
1231 
1232 	spin_unlock(&uc->vc.lock);
1233 
1234 	return IRQ_HANDLED;
1235 }
1236 
1237 /**
1238  * __udma_alloc_gp_rflow_range - alloc range of GP RX flows
1239  * @ud: UDMA device
1240  * @from: Start the search from this flow id number
1241  * @cnt: Number of consecutive flow ids to allocate
1242  *
1243  * Allocate range of RX flow ids for future use, those flows can be requested
1244  * only using explicit flow id number. if @from is set to -1 it will try to find
1245  * first free range. if @from is positive value it will force allocation only
1246  * of the specified range of flows.
1247  *
1248  * Returns -ENOMEM if can't find free range.
1249  * -EEXIST if requested range is busy.
1250  * -EINVAL if wrong input values passed.
1251  * Returns flow id on success.
1252  */
1253 static int __udma_alloc_gp_rflow_range(struct udma_dev *ud, int from, int cnt)
1254 {
1255 	int start, tmp_from;
1256 	DECLARE_BITMAP(tmp, K3_UDMA_MAX_RFLOWS);
1257 
1258 	tmp_from = from;
1259 	if (tmp_from < 0)
1260 		tmp_from = ud->rchan_cnt;
1261 	/* default flows can't be allocated and accessible only by id */
1262 	if (tmp_from < ud->rchan_cnt)
1263 		return -EINVAL;
1264 
1265 	if (tmp_from + cnt > ud->rflow_cnt)
1266 		return -EINVAL;
1267 
1268 	bitmap_or(tmp, ud->rflow_gp_map, ud->rflow_gp_map_allocated,
1269 		  ud->rflow_cnt);
1270 
1271 	start = bitmap_find_next_zero_area(tmp,
1272 					   ud->rflow_cnt,
1273 					   tmp_from, cnt, 0);
1274 	if (start >= ud->rflow_cnt)
1275 		return -ENOMEM;
1276 
1277 	if (from >= 0 && start != from)
1278 		return -EEXIST;
1279 
1280 	bitmap_set(ud->rflow_gp_map_allocated, start, cnt);
1281 	return start;
1282 }
1283 
1284 static int __udma_free_gp_rflow_range(struct udma_dev *ud, int from, int cnt)
1285 {
1286 	if (from < ud->rchan_cnt)
1287 		return -EINVAL;
1288 	if (from + cnt > ud->rflow_cnt)
1289 		return -EINVAL;
1290 
1291 	bitmap_clear(ud->rflow_gp_map_allocated, from, cnt);
1292 	return 0;
1293 }
1294 
1295 static struct udma_rflow *__udma_get_rflow(struct udma_dev *ud, int id)
1296 {
1297 	/*
1298 	 * Attempt to request rflow by ID can be made for any rflow
1299 	 * if not in use with assumption that caller knows what's doing.
1300 	 * TI-SCI FW will perform additional permission check ant way, it's
1301 	 * safe
1302 	 */
1303 
1304 	if (id < 0 || id >= ud->rflow_cnt)
1305 		return ERR_PTR(-ENOENT);
1306 
1307 	if (test_bit(id, ud->rflow_in_use))
1308 		return ERR_PTR(-ENOENT);
1309 
1310 	if (ud->rflow_gp_map) {
1311 		/* GP rflow has to be allocated first */
1312 		if (!test_bit(id, ud->rflow_gp_map) &&
1313 		    !test_bit(id, ud->rflow_gp_map_allocated))
1314 			return ERR_PTR(-EINVAL);
1315 	}
1316 
1317 	dev_dbg(ud->dev, "get rflow%d\n", id);
1318 	set_bit(id, ud->rflow_in_use);
1319 	return &ud->rflows[id];
1320 }
1321 
1322 static void __udma_put_rflow(struct udma_dev *ud, struct udma_rflow *rflow)
1323 {
1324 	if (!test_bit(rflow->id, ud->rflow_in_use)) {
1325 		dev_err(ud->dev, "attempt to put unused rflow%d\n", rflow->id);
1326 		return;
1327 	}
1328 
1329 	dev_dbg(ud->dev, "put rflow%d\n", rflow->id);
1330 	clear_bit(rflow->id, ud->rflow_in_use);
1331 }
1332 
1333 #define UDMA_RESERVE_RESOURCE(res)					\
1334 static struct udma_##res *__udma_reserve_##res(struct udma_dev *ud,	\
1335 					       enum udma_tp_level tpl,	\
1336 					       int id)			\
1337 {									\
1338 	if (id >= 0) {							\
1339 		if (test_bit(id, ud->res##_map)) {			\
1340 			dev_err(ud->dev, "res##%d is in use\n", id);	\
1341 			return ERR_PTR(-ENOENT);			\
1342 		}							\
1343 	} else {							\
1344 		int start;						\
1345 									\
1346 		if (tpl >= ud->res##_tpl.levels)			\
1347 			tpl = ud->res##_tpl.levels - 1;			\
1348 									\
1349 		start = ud->res##_tpl.start_idx[tpl];			\
1350 									\
1351 		id = find_next_zero_bit(ud->res##_map, ud->res##_cnt,	\
1352 					start);				\
1353 		if (id == ud->res##_cnt) {				\
1354 			return ERR_PTR(-ENOENT);			\
1355 		}							\
1356 	}								\
1357 									\
1358 	set_bit(id, ud->res##_map);					\
1359 	return &ud->res##s[id];						\
1360 }
1361 
1362 UDMA_RESERVE_RESOURCE(bchan);
1363 UDMA_RESERVE_RESOURCE(tchan);
1364 UDMA_RESERVE_RESOURCE(rchan);
1365 
1366 static int bcdma_get_bchan(struct udma_chan *uc)
1367 {
1368 	struct udma_dev *ud = uc->ud;
1369 	enum udma_tp_level tpl;
1370 	int ret;
1371 
1372 	if (uc->bchan) {
1373 		dev_dbg(ud->dev, "chan%d: already have bchan%d allocated\n",
1374 			uc->id, uc->bchan->id);
1375 		return 0;
1376 	}
1377 
1378 	/*
1379 	 * Use normal channels for peripherals, and highest TPL channel for
1380 	 * mem2mem
1381 	 */
1382 	if (uc->config.tr_trigger_type)
1383 		tpl = 0;
1384 	else
1385 		tpl = ud->bchan_tpl.levels - 1;
1386 
1387 	uc->bchan = __udma_reserve_bchan(ud, tpl, -1);
1388 	if (IS_ERR(uc->bchan)) {
1389 		ret = PTR_ERR(uc->bchan);
1390 		uc->bchan = NULL;
1391 		return ret;
1392 	}
1393 
1394 	uc->tchan = uc->bchan;
1395 
1396 	return 0;
1397 }
1398 
1399 static int udma_get_tchan(struct udma_chan *uc)
1400 {
1401 	struct udma_dev *ud = uc->ud;
1402 	int ret;
1403 
1404 	if (uc->tchan) {
1405 		dev_dbg(ud->dev, "chan%d: already have tchan%d allocated\n",
1406 			uc->id, uc->tchan->id);
1407 		return 0;
1408 	}
1409 
1410 	/*
1411 	 * mapped_channel_id is -1 for UDMA, BCDMA and PKTDMA unmapped channels.
1412 	 * For PKTDMA mapped channels it is configured to a channel which must
1413 	 * be used to service the peripheral.
1414 	 */
1415 	uc->tchan = __udma_reserve_tchan(ud, uc->config.channel_tpl,
1416 					 uc->config.mapped_channel_id);
1417 	if (IS_ERR(uc->tchan)) {
1418 		ret = PTR_ERR(uc->tchan);
1419 		uc->tchan = NULL;
1420 		return ret;
1421 	}
1422 
1423 	if (ud->tflow_cnt) {
1424 		int tflow_id;
1425 
1426 		/* Only PKTDMA have support for tx flows */
1427 		if (uc->config.default_flow_id >= 0)
1428 			tflow_id = uc->config.default_flow_id;
1429 		else
1430 			tflow_id = uc->tchan->id;
1431 
1432 		if (test_bit(tflow_id, ud->tflow_map)) {
1433 			dev_err(ud->dev, "tflow%d is in use\n", tflow_id);
1434 			clear_bit(uc->tchan->id, ud->tchan_map);
1435 			uc->tchan = NULL;
1436 			return -ENOENT;
1437 		}
1438 
1439 		uc->tchan->tflow_id = tflow_id;
1440 		set_bit(tflow_id, ud->tflow_map);
1441 	} else {
1442 		uc->tchan->tflow_id = -1;
1443 	}
1444 
1445 	return 0;
1446 }
1447 
1448 static int udma_get_rchan(struct udma_chan *uc)
1449 {
1450 	struct udma_dev *ud = uc->ud;
1451 	int ret;
1452 
1453 	if (uc->rchan) {
1454 		dev_dbg(ud->dev, "chan%d: already have rchan%d allocated\n",
1455 			uc->id, uc->rchan->id);
1456 		return 0;
1457 	}
1458 
1459 	/*
1460 	 * mapped_channel_id is -1 for UDMA, BCDMA and PKTDMA unmapped channels.
1461 	 * For PKTDMA mapped channels it is configured to a channel which must
1462 	 * be used to service the peripheral.
1463 	 */
1464 	uc->rchan = __udma_reserve_rchan(ud, uc->config.channel_tpl,
1465 					 uc->config.mapped_channel_id);
1466 	if (IS_ERR(uc->rchan)) {
1467 		ret = PTR_ERR(uc->rchan);
1468 		uc->rchan = NULL;
1469 		return ret;
1470 	}
1471 
1472 	return 0;
1473 }
1474 
1475 static int udma_get_chan_pair(struct udma_chan *uc)
1476 {
1477 	struct udma_dev *ud = uc->ud;
1478 	int chan_id, end;
1479 
1480 	if ((uc->tchan && uc->rchan) && uc->tchan->id == uc->rchan->id) {
1481 		dev_info(ud->dev, "chan%d: already have %d pair allocated\n",
1482 			 uc->id, uc->tchan->id);
1483 		return 0;
1484 	}
1485 
1486 	if (uc->tchan) {
1487 		dev_err(ud->dev, "chan%d: already have tchan%d allocated\n",
1488 			uc->id, uc->tchan->id);
1489 		return -EBUSY;
1490 	} else if (uc->rchan) {
1491 		dev_err(ud->dev, "chan%d: already have rchan%d allocated\n",
1492 			uc->id, uc->rchan->id);
1493 		return -EBUSY;
1494 	}
1495 
1496 	/* Can be optimized, but let's have it like this for now */
1497 	end = min(ud->tchan_cnt, ud->rchan_cnt);
1498 	/*
1499 	 * Try to use the highest TPL channel pair for MEM_TO_MEM channels
1500 	 * Note: in UDMAP the channel TPL is symmetric between tchan and rchan
1501 	 */
1502 	chan_id = ud->tchan_tpl.start_idx[ud->tchan_tpl.levels - 1];
1503 	for (; chan_id < end; chan_id++) {
1504 		if (!test_bit(chan_id, ud->tchan_map) &&
1505 		    !test_bit(chan_id, ud->rchan_map))
1506 			break;
1507 	}
1508 
1509 	if (chan_id == end)
1510 		return -ENOENT;
1511 
1512 	set_bit(chan_id, ud->tchan_map);
1513 	set_bit(chan_id, ud->rchan_map);
1514 	uc->tchan = &ud->tchans[chan_id];
1515 	uc->rchan = &ud->rchans[chan_id];
1516 
1517 	/* UDMA does not use tx flows */
1518 	uc->tchan->tflow_id = -1;
1519 
1520 	return 0;
1521 }
1522 
1523 static int udma_get_rflow(struct udma_chan *uc, int flow_id)
1524 {
1525 	struct udma_dev *ud = uc->ud;
1526 	int ret;
1527 
1528 	if (!uc->rchan) {
1529 		dev_err(ud->dev, "chan%d: does not have rchan??\n", uc->id);
1530 		return -EINVAL;
1531 	}
1532 
1533 	if (uc->rflow) {
1534 		dev_dbg(ud->dev, "chan%d: already have rflow%d allocated\n",
1535 			uc->id, uc->rflow->id);
1536 		return 0;
1537 	}
1538 
1539 	uc->rflow = __udma_get_rflow(ud, flow_id);
1540 	if (IS_ERR(uc->rflow)) {
1541 		ret = PTR_ERR(uc->rflow);
1542 		uc->rflow = NULL;
1543 		return ret;
1544 	}
1545 
1546 	return 0;
1547 }
1548 
1549 static void bcdma_put_bchan(struct udma_chan *uc)
1550 {
1551 	struct udma_dev *ud = uc->ud;
1552 
1553 	if (uc->bchan) {
1554 		dev_dbg(ud->dev, "chan%d: put bchan%d\n", uc->id,
1555 			uc->bchan->id);
1556 		clear_bit(uc->bchan->id, ud->bchan_map);
1557 		uc->bchan = NULL;
1558 		uc->tchan = NULL;
1559 	}
1560 }
1561 
1562 static void udma_put_rchan(struct udma_chan *uc)
1563 {
1564 	struct udma_dev *ud = uc->ud;
1565 
1566 	if (uc->rchan) {
1567 		dev_dbg(ud->dev, "chan%d: put rchan%d\n", uc->id,
1568 			uc->rchan->id);
1569 		clear_bit(uc->rchan->id, ud->rchan_map);
1570 		uc->rchan = NULL;
1571 	}
1572 }
1573 
1574 static void udma_put_tchan(struct udma_chan *uc)
1575 {
1576 	struct udma_dev *ud = uc->ud;
1577 
1578 	if (uc->tchan) {
1579 		dev_dbg(ud->dev, "chan%d: put tchan%d\n", uc->id,
1580 			uc->tchan->id);
1581 		clear_bit(uc->tchan->id, ud->tchan_map);
1582 
1583 		if (uc->tchan->tflow_id >= 0)
1584 			clear_bit(uc->tchan->tflow_id, ud->tflow_map);
1585 
1586 		uc->tchan = NULL;
1587 	}
1588 }
1589 
1590 static void udma_put_rflow(struct udma_chan *uc)
1591 {
1592 	struct udma_dev *ud = uc->ud;
1593 
1594 	if (uc->rflow) {
1595 		dev_dbg(ud->dev, "chan%d: put rflow%d\n", uc->id,
1596 			uc->rflow->id);
1597 		__udma_put_rflow(ud, uc->rflow);
1598 		uc->rflow = NULL;
1599 	}
1600 }
1601 
1602 static void bcdma_free_bchan_resources(struct udma_chan *uc)
1603 {
1604 	if (!uc->bchan)
1605 		return;
1606 
1607 	k3_ringacc_ring_free(uc->bchan->tc_ring);
1608 	k3_ringacc_ring_free(uc->bchan->t_ring);
1609 	uc->bchan->tc_ring = NULL;
1610 	uc->bchan->t_ring = NULL;
1611 	k3_configure_chan_coherency(&uc->vc.chan, 0);
1612 
1613 	bcdma_put_bchan(uc);
1614 }
1615 
1616 static int bcdma_alloc_bchan_resources(struct udma_chan *uc)
1617 {
1618 	struct k3_ring_cfg ring_cfg;
1619 	struct udma_dev *ud = uc->ud;
1620 	int ret;
1621 
1622 	ret = bcdma_get_bchan(uc);
1623 	if (ret)
1624 		return ret;
1625 
1626 	ret = k3_ringacc_request_rings_pair(ud->ringacc, uc->bchan->id, -1,
1627 					    &uc->bchan->t_ring,
1628 					    &uc->bchan->tc_ring);
1629 	if (ret) {
1630 		ret = -EBUSY;
1631 		goto err_ring;
1632 	}
1633 
1634 	memset(&ring_cfg, 0, sizeof(ring_cfg));
1635 	ring_cfg.size = K3_UDMA_DEFAULT_RING_SIZE;
1636 	ring_cfg.elm_size = K3_RINGACC_RING_ELSIZE_8;
1637 	ring_cfg.mode = K3_RINGACC_RING_MODE_RING;
1638 
1639 	k3_configure_chan_coherency(&uc->vc.chan, ud->asel);
1640 	ring_cfg.asel = ud->asel;
1641 	ring_cfg.dma_dev = dmaengine_get_dma_device(&uc->vc.chan);
1642 
1643 	ret = k3_ringacc_ring_cfg(uc->bchan->t_ring, &ring_cfg);
1644 	if (ret)
1645 		goto err_ringcfg;
1646 
1647 	return 0;
1648 
1649 err_ringcfg:
1650 	k3_ringacc_ring_free(uc->bchan->tc_ring);
1651 	uc->bchan->tc_ring = NULL;
1652 	k3_ringacc_ring_free(uc->bchan->t_ring);
1653 	uc->bchan->t_ring = NULL;
1654 	k3_configure_chan_coherency(&uc->vc.chan, 0);
1655 err_ring:
1656 	bcdma_put_bchan(uc);
1657 
1658 	return ret;
1659 }
1660 
1661 static void udma_free_tx_resources(struct udma_chan *uc)
1662 {
1663 	if (!uc->tchan)
1664 		return;
1665 
1666 	k3_ringacc_ring_free(uc->tchan->t_ring);
1667 	k3_ringacc_ring_free(uc->tchan->tc_ring);
1668 	uc->tchan->t_ring = NULL;
1669 	uc->tchan->tc_ring = NULL;
1670 
1671 	udma_put_tchan(uc);
1672 }
1673 
1674 static int udma_alloc_tx_resources(struct udma_chan *uc)
1675 {
1676 	struct k3_ring_cfg ring_cfg;
1677 	struct udma_dev *ud = uc->ud;
1678 	struct udma_tchan *tchan;
1679 	int ring_idx, ret;
1680 
1681 	ret = udma_get_tchan(uc);
1682 	if (ret)
1683 		return ret;
1684 
1685 	tchan = uc->tchan;
1686 	if (tchan->tflow_id >= 0)
1687 		ring_idx = tchan->tflow_id;
1688 	else
1689 		ring_idx = ud->bchan_cnt + tchan->id;
1690 
1691 	ret = k3_ringacc_request_rings_pair(ud->ringacc, ring_idx, -1,
1692 					    &tchan->t_ring,
1693 					    &tchan->tc_ring);
1694 	if (ret) {
1695 		ret = -EBUSY;
1696 		goto err_ring;
1697 	}
1698 
1699 	memset(&ring_cfg, 0, sizeof(ring_cfg));
1700 	ring_cfg.size = K3_UDMA_DEFAULT_RING_SIZE;
1701 	ring_cfg.elm_size = K3_RINGACC_RING_ELSIZE_8;
1702 	if (ud->match_data->type == DMA_TYPE_UDMA) {
1703 		ring_cfg.mode = K3_RINGACC_RING_MODE_MESSAGE;
1704 	} else {
1705 		ring_cfg.mode = K3_RINGACC_RING_MODE_RING;
1706 
1707 		k3_configure_chan_coherency(&uc->vc.chan, uc->config.asel);
1708 		ring_cfg.asel = uc->config.asel;
1709 		ring_cfg.dma_dev = dmaengine_get_dma_device(&uc->vc.chan);
1710 	}
1711 
1712 	ret = k3_ringacc_ring_cfg(tchan->t_ring, &ring_cfg);
1713 	ret |= k3_ringacc_ring_cfg(tchan->tc_ring, &ring_cfg);
1714 
1715 	if (ret)
1716 		goto err_ringcfg;
1717 
1718 	return 0;
1719 
1720 err_ringcfg:
1721 	k3_ringacc_ring_free(uc->tchan->tc_ring);
1722 	uc->tchan->tc_ring = NULL;
1723 	k3_ringacc_ring_free(uc->tchan->t_ring);
1724 	uc->tchan->t_ring = NULL;
1725 err_ring:
1726 	udma_put_tchan(uc);
1727 
1728 	return ret;
1729 }
1730 
1731 static void udma_free_rx_resources(struct udma_chan *uc)
1732 {
1733 	if (!uc->rchan)
1734 		return;
1735 
1736 	if (uc->rflow) {
1737 		struct udma_rflow *rflow = uc->rflow;
1738 
1739 		k3_ringacc_ring_free(rflow->fd_ring);
1740 		k3_ringacc_ring_free(rflow->r_ring);
1741 		rflow->fd_ring = NULL;
1742 		rflow->r_ring = NULL;
1743 
1744 		udma_put_rflow(uc);
1745 	}
1746 
1747 	udma_put_rchan(uc);
1748 }
1749 
1750 static int udma_alloc_rx_resources(struct udma_chan *uc)
1751 {
1752 	struct udma_dev *ud = uc->ud;
1753 	struct k3_ring_cfg ring_cfg;
1754 	struct udma_rflow *rflow;
1755 	int fd_ring_id;
1756 	int ret;
1757 
1758 	ret = udma_get_rchan(uc);
1759 	if (ret)
1760 		return ret;
1761 
1762 	/* For MEM_TO_MEM we don't need rflow or rings */
1763 	if (uc->config.dir == DMA_MEM_TO_MEM)
1764 		return 0;
1765 
1766 	if (uc->config.default_flow_id >= 0)
1767 		ret = udma_get_rflow(uc, uc->config.default_flow_id);
1768 	else
1769 		ret = udma_get_rflow(uc, uc->rchan->id);
1770 
1771 	if (ret) {
1772 		ret = -EBUSY;
1773 		goto err_rflow;
1774 	}
1775 
1776 	rflow = uc->rflow;
1777 	if (ud->tflow_cnt)
1778 		fd_ring_id = ud->tflow_cnt + rflow->id;
1779 	else
1780 		fd_ring_id = ud->bchan_cnt + ud->tchan_cnt + ud->echan_cnt +
1781 			     uc->rchan->id;
1782 
1783 	ret = k3_ringacc_request_rings_pair(ud->ringacc, fd_ring_id, -1,
1784 					    &rflow->fd_ring, &rflow->r_ring);
1785 	if (ret) {
1786 		ret = -EBUSY;
1787 		goto err_ring;
1788 	}
1789 
1790 	memset(&ring_cfg, 0, sizeof(ring_cfg));
1791 
1792 	ring_cfg.elm_size = K3_RINGACC_RING_ELSIZE_8;
1793 	if (ud->match_data->type == DMA_TYPE_UDMA) {
1794 		if (uc->config.pkt_mode)
1795 			ring_cfg.size = SG_MAX_SEGMENTS;
1796 		else
1797 			ring_cfg.size = K3_UDMA_DEFAULT_RING_SIZE;
1798 
1799 		ring_cfg.mode = K3_RINGACC_RING_MODE_MESSAGE;
1800 	} else {
1801 		ring_cfg.size = K3_UDMA_DEFAULT_RING_SIZE;
1802 		ring_cfg.mode = K3_RINGACC_RING_MODE_RING;
1803 
1804 		k3_configure_chan_coherency(&uc->vc.chan, uc->config.asel);
1805 		ring_cfg.asel = uc->config.asel;
1806 		ring_cfg.dma_dev = dmaengine_get_dma_device(&uc->vc.chan);
1807 	}
1808 
1809 	ret = k3_ringacc_ring_cfg(rflow->fd_ring, &ring_cfg);
1810 
1811 	ring_cfg.size = K3_UDMA_DEFAULT_RING_SIZE;
1812 	ret |= k3_ringacc_ring_cfg(rflow->r_ring, &ring_cfg);
1813 
1814 	if (ret)
1815 		goto err_ringcfg;
1816 
1817 	return 0;
1818 
1819 err_ringcfg:
1820 	k3_ringacc_ring_free(rflow->r_ring);
1821 	rflow->r_ring = NULL;
1822 	k3_ringacc_ring_free(rflow->fd_ring);
1823 	rflow->fd_ring = NULL;
1824 err_ring:
1825 	udma_put_rflow(uc);
1826 err_rflow:
1827 	udma_put_rchan(uc);
1828 
1829 	return ret;
1830 }
1831 
1832 #define TISCI_BCDMA_BCHAN_VALID_PARAMS (			\
1833 	TI_SCI_MSG_VALUE_RM_UDMAP_CH_PAUSE_ON_ERR_VALID |	\
1834 	TI_SCI_MSG_VALUE_RM_UDMAP_CH_EXTENDED_CH_TYPE_VALID)
1835 
1836 #define TISCI_BCDMA_TCHAN_VALID_PARAMS (			\
1837 	TI_SCI_MSG_VALUE_RM_UDMAP_CH_PAUSE_ON_ERR_VALID |	\
1838 	TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_SUPR_TDPKT_VALID)
1839 
1840 #define TISCI_BCDMA_RCHAN_VALID_PARAMS (			\
1841 	TI_SCI_MSG_VALUE_RM_UDMAP_CH_PAUSE_ON_ERR_VALID)
1842 
1843 #define TISCI_UDMA_TCHAN_VALID_PARAMS (				\
1844 	TI_SCI_MSG_VALUE_RM_UDMAP_CH_PAUSE_ON_ERR_VALID |	\
1845 	TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_FILT_EINFO_VALID |	\
1846 	TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_FILT_PSWORDS_VALID |	\
1847 	TI_SCI_MSG_VALUE_RM_UDMAP_CH_CHAN_TYPE_VALID |		\
1848 	TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_SUPR_TDPKT_VALID |	\
1849 	TI_SCI_MSG_VALUE_RM_UDMAP_CH_FETCH_SIZE_VALID |		\
1850 	TI_SCI_MSG_VALUE_RM_UDMAP_CH_CQ_QNUM_VALID |		\
1851 	TI_SCI_MSG_VALUE_RM_UDMAP_CH_ATYPE_VALID)
1852 
1853 #define TISCI_UDMA_RCHAN_VALID_PARAMS (				\
1854 	TI_SCI_MSG_VALUE_RM_UDMAP_CH_PAUSE_ON_ERR_VALID |	\
1855 	TI_SCI_MSG_VALUE_RM_UDMAP_CH_FETCH_SIZE_VALID |		\
1856 	TI_SCI_MSG_VALUE_RM_UDMAP_CH_CQ_QNUM_VALID |		\
1857 	TI_SCI_MSG_VALUE_RM_UDMAP_CH_CHAN_TYPE_VALID |		\
1858 	TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_IGNORE_SHORT_VALID |	\
1859 	TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_IGNORE_LONG_VALID |	\
1860 	TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_FLOWID_START_VALID |	\
1861 	TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_FLOWID_CNT_VALID |	\
1862 	TI_SCI_MSG_VALUE_RM_UDMAP_CH_ATYPE_VALID)
1863 
1864 static int udma_tisci_m2m_channel_config(struct udma_chan *uc)
1865 {
1866 	struct udma_dev *ud = uc->ud;
1867 	struct udma_tisci_rm *tisci_rm = &ud->tisci_rm;
1868 	const struct ti_sci_rm_udmap_ops *tisci_ops = tisci_rm->tisci_udmap_ops;
1869 	struct udma_tchan *tchan = uc->tchan;
1870 	struct udma_rchan *rchan = uc->rchan;
1871 	u8 burst_size = 0;
1872 	int ret;
1873 	u8 tpl;
1874 
1875 	/* Non synchronized - mem to mem type of transfer */
1876 	int tc_ring = k3_ringacc_get_ring_id(tchan->tc_ring);
1877 	struct ti_sci_msg_rm_udmap_tx_ch_cfg req_tx = { 0 };
1878 	struct ti_sci_msg_rm_udmap_rx_ch_cfg req_rx = { 0 };
1879 
1880 	if (ud->match_data->flags & UDMA_FLAG_BURST_SIZE) {
1881 		tpl = udma_get_chan_tpl_index(&ud->tchan_tpl, tchan->id);
1882 
1883 		burst_size = ud->match_data->burst_size[tpl];
1884 	}
1885 
1886 	req_tx.valid_params = TISCI_UDMA_TCHAN_VALID_PARAMS;
1887 	req_tx.nav_id = tisci_rm->tisci_dev_id;
1888 	req_tx.index = tchan->id;
1889 	req_tx.tx_chan_type = TI_SCI_RM_UDMAP_CHAN_TYPE_3RDP_BCOPY_PBRR;
1890 	req_tx.tx_fetch_size = sizeof(struct cppi5_desc_hdr_t) >> 2;
1891 	req_tx.txcq_qnum = tc_ring;
1892 	req_tx.tx_atype = ud->atype;
1893 	if (burst_size) {
1894 		req_tx.valid_params |= TI_SCI_MSG_VALUE_RM_UDMAP_CH_BURST_SIZE_VALID;
1895 		req_tx.tx_burst_size = burst_size;
1896 	}
1897 
1898 	ret = tisci_ops->tx_ch_cfg(tisci_rm->tisci, &req_tx);
1899 	if (ret) {
1900 		dev_err(ud->dev, "tchan%d cfg failed %d\n", tchan->id, ret);
1901 		return ret;
1902 	}
1903 
1904 	req_rx.valid_params = TISCI_UDMA_RCHAN_VALID_PARAMS;
1905 	req_rx.nav_id = tisci_rm->tisci_dev_id;
1906 	req_rx.index = rchan->id;
1907 	req_rx.rx_fetch_size = sizeof(struct cppi5_desc_hdr_t) >> 2;
1908 	req_rx.rxcq_qnum = tc_ring;
1909 	req_rx.rx_chan_type = TI_SCI_RM_UDMAP_CHAN_TYPE_3RDP_BCOPY_PBRR;
1910 	req_rx.rx_atype = ud->atype;
1911 	if (burst_size) {
1912 		req_rx.valid_params |= TI_SCI_MSG_VALUE_RM_UDMAP_CH_BURST_SIZE_VALID;
1913 		req_rx.rx_burst_size = burst_size;
1914 	}
1915 
1916 	ret = tisci_ops->rx_ch_cfg(tisci_rm->tisci, &req_rx);
1917 	if (ret)
1918 		dev_err(ud->dev, "rchan%d alloc failed %d\n", rchan->id, ret);
1919 
1920 	return ret;
1921 }
1922 
1923 static int bcdma_tisci_m2m_channel_config(struct udma_chan *uc)
1924 {
1925 	struct udma_dev *ud = uc->ud;
1926 	struct udma_tisci_rm *tisci_rm = &ud->tisci_rm;
1927 	const struct ti_sci_rm_udmap_ops *tisci_ops = tisci_rm->tisci_udmap_ops;
1928 	struct ti_sci_msg_rm_udmap_tx_ch_cfg req_tx = { 0 };
1929 	struct udma_bchan *bchan = uc->bchan;
1930 	u8 burst_size = 0;
1931 	int ret;
1932 	u8 tpl;
1933 
1934 	if (ud->match_data->flags & UDMA_FLAG_BURST_SIZE) {
1935 		tpl = udma_get_chan_tpl_index(&ud->bchan_tpl, bchan->id);
1936 
1937 		burst_size = ud->match_data->burst_size[tpl];
1938 	}
1939 
1940 	req_tx.valid_params = TISCI_BCDMA_BCHAN_VALID_PARAMS;
1941 	req_tx.nav_id = tisci_rm->tisci_dev_id;
1942 	req_tx.extended_ch_type = TI_SCI_RM_BCDMA_EXTENDED_CH_TYPE_BCHAN;
1943 	req_tx.index = bchan->id;
1944 	if (burst_size) {
1945 		req_tx.valid_params |= TI_SCI_MSG_VALUE_RM_UDMAP_CH_BURST_SIZE_VALID;
1946 		req_tx.tx_burst_size = burst_size;
1947 	}
1948 
1949 	ret = tisci_ops->tx_ch_cfg(tisci_rm->tisci, &req_tx);
1950 	if (ret)
1951 		dev_err(ud->dev, "bchan%d cfg failed %d\n", bchan->id, ret);
1952 
1953 	return ret;
1954 }
1955 
1956 static int udma_tisci_tx_channel_config(struct udma_chan *uc)
1957 {
1958 	struct udma_dev *ud = uc->ud;
1959 	struct udma_tisci_rm *tisci_rm = &ud->tisci_rm;
1960 	const struct ti_sci_rm_udmap_ops *tisci_ops = tisci_rm->tisci_udmap_ops;
1961 	struct udma_tchan *tchan = uc->tchan;
1962 	int tc_ring = k3_ringacc_get_ring_id(tchan->tc_ring);
1963 	struct ti_sci_msg_rm_udmap_tx_ch_cfg req_tx = { 0 };
1964 	u32 mode, fetch_size;
1965 	int ret;
1966 
1967 	if (uc->config.pkt_mode) {
1968 		mode = TI_SCI_RM_UDMAP_CHAN_TYPE_PKT_PBRR;
1969 		fetch_size = cppi5_hdesc_calc_size(uc->config.needs_epib,
1970 						   uc->config.psd_size, 0);
1971 	} else {
1972 		mode = TI_SCI_RM_UDMAP_CHAN_TYPE_3RDP_PBRR;
1973 		fetch_size = sizeof(struct cppi5_desc_hdr_t);
1974 	}
1975 
1976 	req_tx.valid_params = TISCI_UDMA_TCHAN_VALID_PARAMS;
1977 	req_tx.nav_id = tisci_rm->tisci_dev_id;
1978 	req_tx.index = tchan->id;
1979 	req_tx.tx_chan_type = mode;
1980 	req_tx.tx_supr_tdpkt = uc->config.notdpkt;
1981 	req_tx.tx_fetch_size = fetch_size >> 2;
1982 	req_tx.txcq_qnum = tc_ring;
1983 	req_tx.tx_atype = uc->config.atype;
1984 	if (uc->config.ep_type == PSIL_EP_PDMA_XY &&
1985 	    ud->match_data->flags & UDMA_FLAG_TDTYPE) {
1986 		/* wait for peer to complete the teardown for PDMAs */
1987 		req_tx.valid_params |=
1988 				TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_TDTYPE_VALID;
1989 		req_tx.tx_tdtype = 1;
1990 	}
1991 
1992 	ret = tisci_ops->tx_ch_cfg(tisci_rm->tisci, &req_tx);
1993 	if (ret)
1994 		dev_err(ud->dev, "tchan%d cfg failed %d\n", tchan->id, ret);
1995 
1996 	return ret;
1997 }
1998 
1999 static int bcdma_tisci_tx_channel_config(struct udma_chan *uc)
2000 {
2001 	struct udma_dev *ud = uc->ud;
2002 	struct udma_tisci_rm *tisci_rm = &ud->tisci_rm;
2003 	const struct ti_sci_rm_udmap_ops *tisci_ops = tisci_rm->tisci_udmap_ops;
2004 	struct udma_tchan *tchan = uc->tchan;
2005 	struct ti_sci_msg_rm_udmap_tx_ch_cfg req_tx = { 0 };
2006 	int ret;
2007 
2008 	req_tx.valid_params = TISCI_BCDMA_TCHAN_VALID_PARAMS;
2009 	req_tx.nav_id = tisci_rm->tisci_dev_id;
2010 	req_tx.index = tchan->id;
2011 	req_tx.tx_supr_tdpkt = uc->config.notdpkt;
2012 	if (ud->match_data->flags & UDMA_FLAG_TDTYPE) {
2013 		/* wait for peer to complete the teardown for PDMAs */
2014 		req_tx.valid_params |=
2015 				TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_TDTYPE_VALID;
2016 		req_tx.tx_tdtype = 1;
2017 	}
2018 
2019 	ret = tisci_ops->tx_ch_cfg(tisci_rm->tisci, &req_tx);
2020 	if (ret)
2021 		dev_err(ud->dev, "tchan%d cfg failed %d\n", tchan->id, ret);
2022 
2023 	return ret;
2024 }
2025 
2026 #define pktdma_tisci_tx_channel_config bcdma_tisci_tx_channel_config
2027 
2028 static int udma_tisci_rx_channel_config(struct udma_chan *uc)
2029 {
2030 	struct udma_dev *ud = uc->ud;
2031 	struct udma_tisci_rm *tisci_rm = &ud->tisci_rm;
2032 	const struct ti_sci_rm_udmap_ops *tisci_ops = tisci_rm->tisci_udmap_ops;
2033 	struct udma_rchan *rchan = uc->rchan;
2034 	int fd_ring = k3_ringacc_get_ring_id(uc->rflow->fd_ring);
2035 	int rx_ring = k3_ringacc_get_ring_id(uc->rflow->r_ring);
2036 	struct ti_sci_msg_rm_udmap_rx_ch_cfg req_rx = { 0 };
2037 	struct ti_sci_msg_rm_udmap_flow_cfg flow_req = { 0 };
2038 	u32 mode, fetch_size;
2039 	int ret;
2040 
2041 	if (uc->config.pkt_mode) {
2042 		mode = TI_SCI_RM_UDMAP_CHAN_TYPE_PKT_PBRR;
2043 		fetch_size = cppi5_hdesc_calc_size(uc->config.needs_epib,
2044 						   uc->config.psd_size, 0);
2045 	} else {
2046 		mode = TI_SCI_RM_UDMAP_CHAN_TYPE_3RDP_PBRR;
2047 		fetch_size = sizeof(struct cppi5_desc_hdr_t);
2048 	}
2049 
2050 	req_rx.valid_params = TISCI_UDMA_RCHAN_VALID_PARAMS;
2051 	req_rx.nav_id = tisci_rm->tisci_dev_id;
2052 	req_rx.index = rchan->id;
2053 	req_rx.rx_fetch_size =  fetch_size >> 2;
2054 	req_rx.rxcq_qnum = rx_ring;
2055 	req_rx.rx_chan_type = mode;
2056 	req_rx.rx_atype = uc->config.atype;
2057 
2058 	ret = tisci_ops->rx_ch_cfg(tisci_rm->tisci, &req_rx);
2059 	if (ret) {
2060 		dev_err(ud->dev, "rchan%d cfg failed %d\n", rchan->id, ret);
2061 		return ret;
2062 	}
2063 
2064 	flow_req.valid_params =
2065 		TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_EINFO_PRESENT_VALID |
2066 		TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_PSINFO_PRESENT_VALID |
2067 		TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_ERROR_HANDLING_VALID |
2068 		TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DESC_TYPE_VALID |
2069 		TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DEST_QNUM_VALID |
2070 		TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_SRC_TAG_HI_SEL_VALID |
2071 		TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_SRC_TAG_LO_SEL_VALID |
2072 		TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DEST_TAG_HI_SEL_VALID |
2073 		TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DEST_TAG_LO_SEL_VALID |
2074 		TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_FDQ0_SZ0_QNUM_VALID |
2075 		TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_FDQ1_QNUM_VALID |
2076 		TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_FDQ2_QNUM_VALID |
2077 		TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_FDQ3_QNUM_VALID;
2078 
2079 	flow_req.nav_id = tisci_rm->tisci_dev_id;
2080 	flow_req.flow_index = rchan->id;
2081 
2082 	if (uc->config.needs_epib)
2083 		flow_req.rx_einfo_present = 1;
2084 	else
2085 		flow_req.rx_einfo_present = 0;
2086 	if (uc->config.psd_size)
2087 		flow_req.rx_psinfo_present = 1;
2088 	else
2089 		flow_req.rx_psinfo_present = 0;
2090 	flow_req.rx_error_handling = 1;
2091 	flow_req.rx_dest_qnum = rx_ring;
2092 	flow_req.rx_src_tag_hi_sel = UDMA_RFLOW_SRCTAG_NONE;
2093 	flow_req.rx_src_tag_lo_sel = UDMA_RFLOW_SRCTAG_SRC_TAG;
2094 	flow_req.rx_dest_tag_hi_sel = UDMA_RFLOW_DSTTAG_DST_TAG_HI;
2095 	flow_req.rx_dest_tag_lo_sel = UDMA_RFLOW_DSTTAG_DST_TAG_LO;
2096 	flow_req.rx_fdq0_sz0_qnum = fd_ring;
2097 	flow_req.rx_fdq1_qnum = fd_ring;
2098 	flow_req.rx_fdq2_qnum = fd_ring;
2099 	flow_req.rx_fdq3_qnum = fd_ring;
2100 
2101 	ret = tisci_ops->rx_flow_cfg(tisci_rm->tisci, &flow_req);
2102 
2103 	if (ret)
2104 		dev_err(ud->dev, "flow%d config failed: %d\n", rchan->id, ret);
2105 
2106 	return 0;
2107 }
2108 
2109 static int bcdma_tisci_rx_channel_config(struct udma_chan *uc)
2110 {
2111 	struct udma_dev *ud = uc->ud;
2112 	struct udma_tisci_rm *tisci_rm = &ud->tisci_rm;
2113 	const struct ti_sci_rm_udmap_ops *tisci_ops = tisci_rm->tisci_udmap_ops;
2114 	struct udma_rchan *rchan = uc->rchan;
2115 	struct ti_sci_msg_rm_udmap_rx_ch_cfg req_rx = { 0 };
2116 	int ret;
2117 
2118 	req_rx.valid_params = TISCI_BCDMA_RCHAN_VALID_PARAMS;
2119 	req_rx.nav_id = tisci_rm->tisci_dev_id;
2120 	req_rx.index = rchan->id;
2121 
2122 	ret = tisci_ops->rx_ch_cfg(tisci_rm->tisci, &req_rx);
2123 	if (ret)
2124 		dev_err(ud->dev, "rchan%d cfg failed %d\n", rchan->id, ret);
2125 
2126 	return ret;
2127 }
2128 
2129 static int pktdma_tisci_rx_channel_config(struct udma_chan *uc)
2130 {
2131 	struct udma_dev *ud = uc->ud;
2132 	struct udma_tisci_rm *tisci_rm = &ud->tisci_rm;
2133 	const struct ti_sci_rm_udmap_ops *tisci_ops = tisci_rm->tisci_udmap_ops;
2134 	struct ti_sci_msg_rm_udmap_rx_ch_cfg req_rx = { 0 };
2135 	struct ti_sci_msg_rm_udmap_flow_cfg flow_req = { 0 };
2136 	int ret;
2137 
2138 	req_rx.valid_params = TISCI_BCDMA_RCHAN_VALID_PARAMS;
2139 	req_rx.nav_id = tisci_rm->tisci_dev_id;
2140 	req_rx.index = uc->rchan->id;
2141 
2142 	ret = tisci_ops->rx_ch_cfg(tisci_rm->tisci, &req_rx);
2143 	if (ret) {
2144 		dev_err(ud->dev, "rchan%d cfg failed %d\n", uc->rchan->id, ret);
2145 		return ret;
2146 	}
2147 
2148 	flow_req.valid_params =
2149 		TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_EINFO_PRESENT_VALID |
2150 		TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_PSINFO_PRESENT_VALID |
2151 		TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_ERROR_HANDLING_VALID;
2152 
2153 	flow_req.nav_id = tisci_rm->tisci_dev_id;
2154 	flow_req.flow_index = uc->rflow->id;
2155 
2156 	if (uc->config.needs_epib)
2157 		flow_req.rx_einfo_present = 1;
2158 	else
2159 		flow_req.rx_einfo_present = 0;
2160 	if (uc->config.psd_size)
2161 		flow_req.rx_psinfo_present = 1;
2162 	else
2163 		flow_req.rx_psinfo_present = 0;
2164 	flow_req.rx_error_handling = 1;
2165 
2166 	ret = tisci_ops->rx_flow_cfg(tisci_rm->tisci, &flow_req);
2167 
2168 	if (ret)
2169 		dev_err(ud->dev, "flow%d config failed: %d\n", uc->rflow->id,
2170 			ret);
2171 
2172 	return ret;
2173 }
2174 
2175 static int udma_alloc_chan_resources(struct dma_chan *chan)
2176 {
2177 	struct udma_chan *uc = to_udma_chan(chan);
2178 	struct udma_dev *ud = to_udma_dev(chan->device);
2179 	const struct udma_soc_data *soc_data = ud->soc_data;
2180 	struct k3_ring *irq_ring;
2181 	u32 irq_udma_idx;
2182 	int ret;
2183 
2184 	uc->dma_dev = ud->dev;
2185 
2186 	if (uc->config.pkt_mode || uc->config.dir == DMA_MEM_TO_MEM) {
2187 		uc->use_dma_pool = true;
2188 		/* in case of MEM_TO_MEM we have maximum of two TRs */
2189 		if (uc->config.dir == DMA_MEM_TO_MEM) {
2190 			uc->config.hdesc_size = cppi5_trdesc_calc_size(
2191 					sizeof(struct cppi5_tr_type15_t), 2);
2192 			uc->config.pkt_mode = false;
2193 		}
2194 	}
2195 
2196 	if (uc->use_dma_pool) {
2197 		uc->hdesc_pool = dma_pool_create(uc->name, ud->ddev.dev,
2198 						 uc->config.hdesc_size,
2199 						 ud->desc_align,
2200 						 0);
2201 		if (!uc->hdesc_pool) {
2202 			dev_err(ud->ddev.dev,
2203 				"Descriptor pool allocation failed\n");
2204 			uc->use_dma_pool = false;
2205 			ret = -ENOMEM;
2206 			goto err_cleanup;
2207 		}
2208 	}
2209 
2210 	/*
2211 	 * Make sure that the completion is in a known state:
2212 	 * No teardown, the channel is idle
2213 	 */
2214 	reinit_completion(&uc->teardown_completed);
2215 	complete_all(&uc->teardown_completed);
2216 	uc->state = UDMA_CHAN_IS_IDLE;
2217 
2218 	switch (uc->config.dir) {
2219 	case DMA_MEM_TO_MEM:
2220 		/* Non synchronized - mem to mem type of transfer */
2221 		dev_dbg(uc->ud->dev, "%s: chan%d as MEM-to-MEM\n", __func__,
2222 			uc->id);
2223 
2224 		ret = udma_get_chan_pair(uc);
2225 		if (ret)
2226 			goto err_cleanup;
2227 
2228 		ret = udma_alloc_tx_resources(uc);
2229 		if (ret) {
2230 			udma_put_rchan(uc);
2231 			goto err_cleanup;
2232 		}
2233 
2234 		ret = udma_alloc_rx_resources(uc);
2235 		if (ret) {
2236 			udma_free_tx_resources(uc);
2237 			goto err_cleanup;
2238 		}
2239 
2240 		uc->config.src_thread = ud->psil_base + uc->tchan->id;
2241 		uc->config.dst_thread = (ud->psil_base + uc->rchan->id) |
2242 					K3_PSIL_DST_THREAD_ID_OFFSET;
2243 
2244 		irq_ring = uc->tchan->tc_ring;
2245 		irq_udma_idx = uc->tchan->id;
2246 
2247 		ret = udma_tisci_m2m_channel_config(uc);
2248 		break;
2249 	case DMA_MEM_TO_DEV:
2250 		/* Slave transfer synchronized - mem to dev (TX) trasnfer */
2251 		dev_dbg(uc->ud->dev, "%s: chan%d as MEM-to-DEV\n", __func__,
2252 			uc->id);
2253 
2254 		ret = udma_alloc_tx_resources(uc);
2255 		if (ret)
2256 			goto err_cleanup;
2257 
2258 		uc->config.src_thread = ud->psil_base + uc->tchan->id;
2259 		uc->config.dst_thread = uc->config.remote_thread_id;
2260 		uc->config.dst_thread |= K3_PSIL_DST_THREAD_ID_OFFSET;
2261 
2262 		irq_ring = uc->tchan->tc_ring;
2263 		irq_udma_idx = uc->tchan->id;
2264 
2265 		ret = udma_tisci_tx_channel_config(uc);
2266 		break;
2267 	case DMA_DEV_TO_MEM:
2268 		/* Slave transfer synchronized - dev to mem (RX) trasnfer */
2269 		dev_dbg(uc->ud->dev, "%s: chan%d as DEV-to-MEM\n", __func__,
2270 			uc->id);
2271 
2272 		ret = udma_alloc_rx_resources(uc);
2273 		if (ret)
2274 			goto err_cleanup;
2275 
2276 		uc->config.src_thread = uc->config.remote_thread_id;
2277 		uc->config.dst_thread = (ud->psil_base + uc->rchan->id) |
2278 					K3_PSIL_DST_THREAD_ID_OFFSET;
2279 
2280 		irq_ring = uc->rflow->r_ring;
2281 		irq_udma_idx = soc_data->oes.udma_rchan + uc->rchan->id;
2282 
2283 		ret = udma_tisci_rx_channel_config(uc);
2284 		break;
2285 	default:
2286 		/* Can not happen */
2287 		dev_err(uc->ud->dev, "%s: chan%d invalid direction (%u)\n",
2288 			__func__, uc->id, uc->config.dir);
2289 		ret = -EINVAL;
2290 		goto err_cleanup;
2291 
2292 	}
2293 
2294 	/* check if the channel configuration was successful */
2295 	if (ret)
2296 		goto err_res_free;
2297 
2298 	if (udma_is_chan_running(uc)) {
2299 		dev_warn(ud->dev, "chan%d: is running!\n", uc->id);
2300 		udma_reset_chan(uc, false);
2301 		if (udma_is_chan_running(uc)) {
2302 			dev_err(ud->dev, "chan%d: won't stop!\n", uc->id);
2303 			ret = -EBUSY;
2304 			goto err_res_free;
2305 		}
2306 	}
2307 
2308 	/* PSI-L pairing */
2309 	ret = navss_psil_pair(ud, uc->config.src_thread, uc->config.dst_thread);
2310 	if (ret) {
2311 		dev_err(ud->dev, "PSI-L pairing failed: 0x%04x -> 0x%04x\n",
2312 			uc->config.src_thread, uc->config.dst_thread);
2313 		goto err_res_free;
2314 	}
2315 
2316 	uc->psil_paired = true;
2317 
2318 	uc->irq_num_ring = k3_ringacc_get_ring_irq_num(irq_ring);
2319 	if (uc->irq_num_ring <= 0) {
2320 		dev_err(ud->dev, "Failed to get ring irq (index: %u)\n",
2321 			k3_ringacc_get_ring_id(irq_ring));
2322 		ret = -EINVAL;
2323 		goto err_psi_free;
2324 	}
2325 
2326 	ret = request_irq(uc->irq_num_ring, udma_ring_irq_handler,
2327 			  IRQF_TRIGGER_HIGH, uc->name, uc);
2328 	if (ret) {
2329 		dev_err(ud->dev, "chan%d: ring irq request failed\n", uc->id);
2330 		goto err_irq_free;
2331 	}
2332 
2333 	/* Event from UDMA (TR events) only needed for slave TR mode channels */
2334 	if (is_slave_direction(uc->config.dir) && !uc->config.pkt_mode) {
2335 		uc->irq_num_udma = msi_get_virq(ud->dev, irq_udma_idx);
2336 		if (uc->irq_num_udma <= 0) {
2337 			dev_err(ud->dev, "Failed to get udma irq (index: %u)\n",
2338 				irq_udma_idx);
2339 			free_irq(uc->irq_num_ring, uc);
2340 			ret = -EINVAL;
2341 			goto err_irq_free;
2342 		}
2343 
2344 		ret = request_irq(uc->irq_num_udma, udma_udma_irq_handler, 0,
2345 				  uc->name, uc);
2346 		if (ret) {
2347 			dev_err(ud->dev, "chan%d: UDMA irq request failed\n",
2348 				uc->id);
2349 			free_irq(uc->irq_num_ring, uc);
2350 			goto err_irq_free;
2351 		}
2352 	} else {
2353 		uc->irq_num_udma = 0;
2354 	}
2355 
2356 	udma_reset_rings(uc);
2357 
2358 	return 0;
2359 
2360 err_irq_free:
2361 	uc->irq_num_ring = 0;
2362 	uc->irq_num_udma = 0;
2363 err_psi_free:
2364 	navss_psil_unpair(ud, uc->config.src_thread, uc->config.dst_thread);
2365 	uc->psil_paired = false;
2366 err_res_free:
2367 	udma_free_tx_resources(uc);
2368 	udma_free_rx_resources(uc);
2369 err_cleanup:
2370 	udma_reset_uchan(uc);
2371 
2372 	if (uc->use_dma_pool) {
2373 		dma_pool_destroy(uc->hdesc_pool);
2374 		uc->use_dma_pool = false;
2375 	}
2376 
2377 	return ret;
2378 }
2379 
2380 static int bcdma_alloc_chan_resources(struct dma_chan *chan)
2381 {
2382 	struct udma_chan *uc = to_udma_chan(chan);
2383 	struct udma_dev *ud = to_udma_dev(chan->device);
2384 	const struct udma_oes_offsets *oes = &ud->soc_data->oes;
2385 	u32 irq_udma_idx, irq_ring_idx;
2386 	int ret;
2387 
2388 	/* Only TR mode is supported */
2389 	uc->config.pkt_mode = false;
2390 
2391 	/*
2392 	 * Make sure that the completion is in a known state:
2393 	 * No teardown, the channel is idle
2394 	 */
2395 	reinit_completion(&uc->teardown_completed);
2396 	complete_all(&uc->teardown_completed);
2397 	uc->state = UDMA_CHAN_IS_IDLE;
2398 
2399 	switch (uc->config.dir) {
2400 	case DMA_MEM_TO_MEM:
2401 		/* Non synchronized - mem to mem type of transfer */
2402 		dev_dbg(uc->ud->dev, "%s: chan%d as MEM-to-MEM\n", __func__,
2403 			uc->id);
2404 
2405 		ret = bcdma_alloc_bchan_resources(uc);
2406 		if (ret)
2407 			return ret;
2408 
2409 		irq_ring_idx = uc->bchan->id + oes->bcdma_bchan_ring;
2410 		irq_udma_idx = uc->bchan->id + oes->bcdma_bchan_data;
2411 
2412 		ret = bcdma_tisci_m2m_channel_config(uc);
2413 		break;
2414 	case DMA_MEM_TO_DEV:
2415 		/* Slave transfer synchronized - mem to dev (TX) trasnfer */
2416 		dev_dbg(uc->ud->dev, "%s: chan%d as MEM-to-DEV\n", __func__,
2417 			uc->id);
2418 
2419 		ret = udma_alloc_tx_resources(uc);
2420 		if (ret) {
2421 			uc->config.remote_thread_id = -1;
2422 			return ret;
2423 		}
2424 
2425 		uc->config.src_thread = ud->psil_base + uc->tchan->id;
2426 		uc->config.dst_thread = uc->config.remote_thread_id;
2427 		uc->config.dst_thread |= K3_PSIL_DST_THREAD_ID_OFFSET;
2428 
2429 		irq_ring_idx = uc->tchan->id + oes->bcdma_tchan_ring;
2430 		irq_udma_idx = uc->tchan->id + oes->bcdma_tchan_data;
2431 
2432 		ret = bcdma_tisci_tx_channel_config(uc);
2433 		break;
2434 	case DMA_DEV_TO_MEM:
2435 		/* Slave transfer synchronized - dev to mem (RX) trasnfer */
2436 		dev_dbg(uc->ud->dev, "%s: chan%d as DEV-to-MEM\n", __func__,
2437 			uc->id);
2438 
2439 		ret = udma_alloc_rx_resources(uc);
2440 		if (ret) {
2441 			uc->config.remote_thread_id = -1;
2442 			return ret;
2443 		}
2444 
2445 		uc->config.src_thread = uc->config.remote_thread_id;
2446 		uc->config.dst_thread = (ud->psil_base + uc->rchan->id) |
2447 					K3_PSIL_DST_THREAD_ID_OFFSET;
2448 
2449 		irq_ring_idx = uc->rchan->id + oes->bcdma_rchan_ring;
2450 		irq_udma_idx = uc->rchan->id + oes->bcdma_rchan_data;
2451 
2452 		ret = bcdma_tisci_rx_channel_config(uc);
2453 		break;
2454 	default:
2455 		/* Can not happen */
2456 		dev_err(uc->ud->dev, "%s: chan%d invalid direction (%u)\n",
2457 			__func__, uc->id, uc->config.dir);
2458 		return -EINVAL;
2459 	}
2460 
2461 	/* check if the channel configuration was successful */
2462 	if (ret)
2463 		goto err_res_free;
2464 
2465 	if (udma_is_chan_running(uc)) {
2466 		dev_warn(ud->dev, "chan%d: is running!\n", uc->id);
2467 		udma_reset_chan(uc, false);
2468 		if (udma_is_chan_running(uc)) {
2469 			dev_err(ud->dev, "chan%d: won't stop!\n", uc->id);
2470 			ret = -EBUSY;
2471 			goto err_res_free;
2472 		}
2473 	}
2474 
2475 	uc->dma_dev = dmaengine_get_dma_device(chan);
2476 	if (uc->config.dir == DMA_MEM_TO_MEM  && !uc->config.tr_trigger_type) {
2477 		uc->config.hdesc_size = cppi5_trdesc_calc_size(
2478 					sizeof(struct cppi5_tr_type15_t), 2);
2479 
2480 		uc->hdesc_pool = dma_pool_create(uc->name, ud->ddev.dev,
2481 						 uc->config.hdesc_size,
2482 						 ud->desc_align,
2483 						 0);
2484 		if (!uc->hdesc_pool) {
2485 			dev_err(ud->ddev.dev,
2486 				"Descriptor pool allocation failed\n");
2487 			uc->use_dma_pool = false;
2488 			ret = -ENOMEM;
2489 			goto err_res_free;
2490 		}
2491 
2492 		uc->use_dma_pool = true;
2493 	} else if (uc->config.dir != DMA_MEM_TO_MEM) {
2494 		/* PSI-L pairing */
2495 		ret = navss_psil_pair(ud, uc->config.src_thread,
2496 				      uc->config.dst_thread);
2497 		if (ret) {
2498 			dev_err(ud->dev,
2499 				"PSI-L pairing failed: 0x%04x -> 0x%04x\n",
2500 				uc->config.src_thread, uc->config.dst_thread);
2501 			goto err_res_free;
2502 		}
2503 
2504 		uc->psil_paired = true;
2505 	}
2506 
2507 	uc->irq_num_ring = msi_get_virq(ud->dev, irq_ring_idx);
2508 	if (uc->irq_num_ring <= 0) {
2509 		dev_err(ud->dev, "Failed to get ring irq (index: %u)\n",
2510 			irq_ring_idx);
2511 		ret = -EINVAL;
2512 		goto err_psi_free;
2513 	}
2514 
2515 	ret = request_irq(uc->irq_num_ring, udma_ring_irq_handler,
2516 			  IRQF_TRIGGER_HIGH, uc->name, uc);
2517 	if (ret) {
2518 		dev_err(ud->dev, "chan%d: ring irq request failed\n", uc->id);
2519 		goto err_irq_free;
2520 	}
2521 
2522 	/* Event from BCDMA (TR events) only needed for slave channels */
2523 	if (is_slave_direction(uc->config.dir)) {
2524 		uc->irq_num_udma = msi_get_virq(ud->dev, irq_udma_idx);
2525 		if (uc->irq_num_udma <= 0) {
2526 			dev_err(ud->dev, "Failed to get bcdma irq (index: %u)\n",
2527 				irq_udma_idx);
2528 			free_irq(uc->irq_num_ring, uc);
2529 			ret = -EINVAL;
2530 			goto err_irq_free;
2531 		}
2532 
2533 		ret = request_irq(uc->irq_num_udma, udma_udma_irq_handler, 0,
2534 				  uc->name, uc);
2535 		if (ret) {
2536 			dev_err(ud->dev, "chan%d: BCDMA irq request failed\n",
2537 				uc->id);
2538 			free_irq(uc->irq_num_ring, uc);
2539 			goto err_irq_free;
2540 		}
2541 	} else {
2542 		uc->irq_num_udma = 0;
2543 	}
2544 
2545 	udma_reset_rings(uc);
2546 
2547 	INIT_DELAYED_WORK_ONSTACK(&uc->tx_drain.work,
2548 				  udma_check_tx_completion);
2549 	return 0;
2550 
2551 err_irq_free:
2552 	uc->irq_num_ring = 0;
2553 	uc->irq_num_udma = 0;
2554 err_psi_free:
2555 	if (uc->psil_paired)
2556 		navss_psil_unpair(ud, uc->config.src_thread,
2557 				  uc->config.dst_thread);
2558 	uc->psil_paired = false;
2559 err_res_free:
2560 	bcdma_free_bchan_resources(uc);
2561 	udma_free_tx_resources(uc);
2562 	udma_free_rx_resources(uc);
2563 
2564 	udma_reset_uchan(uc);
2565 
2566 	if (uc->use_dma_pool) {
2567 		dma_pool_destroy(uc->hdesc_pool);
2568 		uc->use_dma_pool = false;
2569 	}
2570 
2571 	return ret;
2572 }
2573 
2574 static int bcdma_router_config(struct dma_chan *chan)
2575 {
2576 	struct k3_event_route_data *router_data = chan->route_data;
2577 	struct udma_chan *uc = to_udma_chan(chan);
2578 	u32 trigger_event;
2579 
2580 	if (!uc->bchan)
2581 		return -EINVAL;
2582 
2583 	if (uc->config.tr_trigger_type != 1 && uc->config.tr_trigger_type != 2)
2584 		return -EINVAL;
2585 
2586 	trigger_event = uc->ud->soc_data->bcdma_trigger_event_offset;
2587 	trigger_event += (uc->bchan->id * 2) + uc->config.tr_trigger_type - 1;
2588 
2589 	return router_data->set_event(router_data->priv, trigger_event);
2590 }
2591 
2592 static int pktdma_alloc_chan_resources(struct dma_chan *chan)
2593 {
2594 	struct udma_chan *uc = to_udma_chan(chan);
2595 	struct udma_dev *ud = to_udma_dev(chan->device);
2596 	const struct udma_oes_offsets *oes = &ud->soc_data->oes;
2597 	u32 irq_ring_idx;
2598 	int ret;
2599 
2600 	/*
2601 	 * Make sure that the completion is in a known state:
2602 	 * No teardown, the channel is idle
2603 	 */
2604 	reinit_completion(&uc->teardown_completed);
2605 	complete_all(&uc->teardown_completed);
2606 	uc->state = UDMA_CHAN_IS_IDLE;
2607 
2608 	switch (uc->config.dir) {
2609 	case DMA_MEM_TO_DEV:
2610 		/* Slave transfer synchronized - mem to dev (TX) trasnfer */
2611 		dev_dbg(uc->ud->dev, "%s: chan%d as MEM-to-DEV\n", __func__,
2612 			uc->id);
2613 
2614 		ret = udma_alloc_tx_resources(uc);
2615 		if (ret) {
2616 			uc->config.remote_thread_id = -1;
2617 			return ret;
2618 		}
2619 
2620 		uc->config.src_thread = ud->psil_base + uc->tchan->id;
2621 		uc->config.dst_thread = uc->config.remote_thread_id;
2622 		uc->config.dst_thread |= K3_PSIL_DST_THREAD_ID_OFFSET;
2623 
2624 		irq_ring_idx = uc->tchan->tflow_id + oes->pktdma_tchan_flow;
2625 
2626 		ret = pktdma_tisci_tx_channel_config(uc);
2627 		break;
2628 	case DMA_DEV_TO_MEM:
2629 		/* Slave transfer synchronized - dev to mem (RX) trasnfer */
2630 		dev_dbg(uc->ud->dev, "%s: chan%d as DEV-to-MEM\n", __func__,
2631 			uc->id);
2632 
2633 		ret = udma_alloc_rx_resources(uc);
2634 		if (ret) {
2635 			uc->config.remote_thread_id = -1;
2636 			return ret;
2637 		}
2638 
2639 		uc->config.src_thread = uc->config.remote_thread_id;
2640 		uc->config.dst_thread = (ud->psil_base + uc->rchan->id) |
2641 					K3_PSIL_DST_THREAD_ID_OFFSET;
2642 
2643 		irq_ring_idx = uc->rflow->id + oes->pktdma_rchan_flow;
2644 
2645 		ret = pktdma_tisci_rx_channel_config(uc);
2646 		break;
2647 	default:
2648 		/* Can not happen */
2649 		dev_err(uc->ud->dev, "%s: chan%d invalid direction (%u)\n",
2650 			__func__, uc->id, uc->config.dir);
2651 		return -EINVAL;
2652 	}
2653 
2654 	/* check if the channel configuration was successful */
2655 	if (ret)
2656 		goto err_res_free;
2657 
2658 	if (udma_is_chan_running(uc)) {
2659 		dev_warn(ud->dev, "chan%d: is running!\n", uc->id);
2660 		udma_reset_chan(uc, false);
2661 		if (udma_is_chan_running(uc)) {
2662 			dev_err(ud->dev, "chan%d: won't stop!\n", uc->id);
2663 			ret = -EBUSY;
2664 			goto err_res_free;
2665 		}
2666 	}
2667 
2668 	uc->dma_dev = dmaengine_get_dma_device(chan);
2669 	uc->hdesc_pool = dma_pool_create(uc->name, uc->dma_dev,
2670 					 uc->config.hdesc_size, ud->desc_align,
2671 					 0);
2672 	if (!uc->hdesc_pool) {
2673 		dev_err(ud->ddev.dev,
2674 			"Descriptor pool allocation failed\n");
2675 		uc->use_dma_pool = false;
2676 		ret = -ENOMEM;
2677 		goto err_res_free;
2678 	}
2679 
2680 	uc->use_dma_pool = true;
2681 
2682 	/* PSI-L pairing */
2683 	ret = navss_psil_pair(ud, uc->config.src_thread, uc->config.dst_thread);
2684 	if (ret) {
2685 		dev_err(ud->dev, "PSI-L pairing failed: 0x%04x -> 0x%04x\n",
2686 			uc->config.src_thread, uc->config.dst_thread);
2687 		goto err_res_free;
2688 	}
2689 
2690 	uc->psil_paired = true;
2691 
2692 	uc->irq_num_ring = msi_get_virq(ud->dev, irq_ring_idx);
2693 	if (uc->irq_num_ring <= 0) {
2694 		dev_err(ud->dev, "Failed to get ring irq (index: %u)\n",
2695 			irq_ring_idx);
2696 		ret = -EINVAL;
2697 		goto err_psi_free;
2698 	}
2699 
2700 	ret = request_irq(uc->irq_num_ring, udma_ring_irq_handler,
2701 			  IRQF_TRIGGER_HIGH, uc->name, uc);
2702 	if (ret) {
2703 		dev_err(ud->dev, "chan%d: ring irq request failed\n", uc->id);
2704 		goto err_irq_free;
2705 	}
2706 
2707 	uc->irq_num_udma = 0;
2708 
2709 	udma_reset_rings(uc);
2710 
2711 	INIT_DELAYED_WORK_ONSTACK(&uc->tx_drain.work,
2712 				  udma_check_tx_completion);
2713 
2714 	if (uc->tchan)
2715 		dev_dbg(ud->dev,
2716 			"chan%d: tchan%d, tflow%d, Remote thread: 0x%04x\n",
2717 			uc->id, uc->tchan->id, uc->tchan->tflow_id,
2718 			uc->config.remote_thread_id);
2719 	else if (uc->rchan)
2720 		dev_dbg(ud->dev,
2721 			"chan%d: rchan%d, rflow%d, Remote thread: 0x%04x\n",
2722 			uc->id, uc->rchan->id, uc->rflow->id,
2723 			uc->config.remote_thread_id);
2724 	return 0;
2725 
2726 err_irq_free:
2727 	uc->irq_num_ring = 0;
2728 err_psi_free:
2729 	navss_psil_unpair(ud, uc->config.src_thread, uc->config.dst_thread);
2730 	uc->psil_paired = false;
2731 err_res_free:
2732 	udma_free_tx_resources(uc);
2733 	udma_free_rx_resources(uc);
2734 
2735 	udma_reset_uchan(uc);
2736 
2737 	dma_pool_destroy(uc->hdesc_pool);
2738 	uc->use_dma_pool = false;
2739 
2740 	return ret;
2741 }
2742 
2743 static int udma_slave_config(struct dma_chan *chan,
2744 			     struct dma_slave_config *cfg)
2745 {
2746 	struct udma_chan *uc = to_udma_chan(chan);
2747 
2748 	memcpy(&uc->cfg, cfg, sizeof(uc->cfg));
2749 
2750 	return 0;
2751 }
2752 
2753 static struct udma_desc *udma_alloc_tr_desc(struct udma_chan *uc,
2754 					    size_t tr_size, int tr_count,
2755 					    enum dma_transfer_direction dir)
2756 {
2757 	struct udma_hwdesc *hwdesc;
2758 	struct cppi5_desc_hdr_t *tr_desc;
2759 	struct udma_desc *d;
2760 	u32 reload_count = 0;
2761 	u32 ring_id;
2762 
2763 	switch (tr_size) {
2764 	case 16:
2765 	case 32:
2766 	case 64:
2767 	case 128:
2768 		break;
2769 	default:
2770 		dev_err(uc->ud->dev, "Unsupported TR size of %zu\n", tr_size);
2771 		return NULL;
2772 	}
2773 
2774 	/* We have only one descriptor containing multiple TRs */
2775 	d = kzalloc(sizeof(*d) + sizeof(d->hwdesc[0]), GFP_NOWAIT);
2776 	if (!d)
2777 		return NULL;
2778 
2779 	d->sglen = tr_count;
2780 
2781 	d->hwdesc_count = 1;
2782 	hwdesc = &d->hwdesc[0];
2783 
2784 	/* Allocate memory for DMA ring descriptor */
2785 	if (uc->use_dma_pool) {
2786 		hwdesc->cppi5_desc_size = uc->config.hdesc_size;
2787 		hwdesc->cppi5_desc_vaddr = dma_pool_zalloc(uc->hdesc_pool,
2788 						GFP_NOWAIT,
2789 						&hwdesc->cppi5_desc_paddr);
2790 	} else {
2791 		hwdesc->cppi5_desc_size = cppi5_trdesc_calc_size(tr_size,
2792 								 tr_count);
2793 		hwdesc->cppi5_desc_size = ALIGN(hwdesc->cppi5_desc_size,
2794 						uc->ud->desc_align);
2795 		hwdesc->cppi5_desc_vaddr = dma_alloc_coherent(uc->ud->dev,
2796 						hwdesc->cppi5_desc_size,
2797 						&hwdesc->cppi5_desc_paddr,
2798 						GFP_NOWAIT);
2799 	}
2800 
2801 	if (!hwdesc->cppi5_desc_vaddr) {
2802 		kfree(d);
2803 		return NULL;
2804 	}
2805 
2806 	/* Start of the TR req records */
2807 	hwdesc->tr_req_base = hwdesc->cppi5_desc_vaddr + tr_size;
2808 	/* Start address of the TR response array */
2809 	hwdesc->tr_resp_base = hwdesc->tr_req_base + tr_size * tr_count;
2810 
2811 	tr_desc = hwdesc->cppi5_desc_vaddr;
2812 
2813 	if (uc->cyclic)
2814 		reload_count = CPPI5_INFO0_TRDESC_RLDCNT_INFINITE;
2815 
2816 	if (dir == DMA_DEV_TO_MEM)
2817 		ring_id = k3_ringacc_get_ring_id(uc->rflow->r_ring);
2818 	else
2819 		ring_id = k3_ringacc_get_ring_id(uc->tchan->tc_ring);
2820 
2821 	cppi5_trdesc_init(tr_desc, tr_count, tr_size, 0, reload_count);
2822 	cppi5_desc_set_pktids(tr_desc, uc->id,
2823 			      CPPI5_INFO1_DESC_FLOWID_DEFAULT);
2824 	cppi5_desc_set_retpolicy(tr_desc, 0, ring_id);
2825 
2826 	return d;
2827 }
2828 
2829 /**
2830  * udma_get_tr_counters - calculate TR counters for a given length
2831  * @len: Length of the trasnfer
2832  * @align_to: Preferred alignment
2833  * @tr0_cnt0: First TR icnt0
2834  * @tr0_cnt1: First TR icnt1
2835  * @tr1_cnt0: Second (if used) TR icnt0
2836  *
2837  * For len < SZ_64K only one TR is enough, tr1_cnt0 is not updated
2838  * For len >= SZ_64K two TRs are used in a simple way:
2839  * First TR: SZ_64K-alignment blocks (tr0_cnt0, tr0_cnt1)
2840  * Second TR: the remaining length (tr1_cnt0)
2841  *
2842  * Returns the number of TRs the length needs (1 or 2)
2843  * -EINVAL if the length can not be supported
2844  */
2845 static int udma_get_tr_counters(size_t len, unsigned long align_to,
2846 				u16 *tr0_cnt0, u16 *tr0_cnt1, u16 *tr1_cnt0)
2847 {
2848 	if (len < SZ_64K) {
2849 		*tr0_cnt0 = len;
2850 		*tr0_cnt1 = 1;
2851 
2852 		return 1;
2853 	}
2854 
2855 	if (align_to > 3)
2856 		align_to = 3;
2857 
2858 realign:
2859 	*tr0_cnt0 = SZ_64K - BIT(align_to);
2860 	if (len / *tr0_cnt0 >= SZ_64K) {
2861 		if (align_to) {
2862 			align_to--;
2863 			goto realign;
2864 		}
2865 		return -EINVAL;
2866 	}
2867 
2868 	*tr0_cnt1 = len / *tr0_cnt0;
2869 	*tr1_cnt0 = len % *tr0_cnt0;
2870 
2871 	return 2;
2872 }
2873 
2874 static struct udma_desc *
2875 udma_prep_slave_sg_tr(struct udma_chan *uc, struct scatterlist *sgl,
2876 		      unsigned int sglen, enum dma_transfer_direction dir,
2877 		      unsigned long tx_flags, void *context)
2878 {
2879 	struct scatterlist *sgent;
2880 	struct udma_desc *d;
2881 	struct cppi5_tr_type1_t *tr_req = NULL;
2882 	u16 tr0_cnt0, tr0_cnt1, tr1_cnt0;
2883 	unsigned int i;
2884 	size_t tr_size;
2885 	int num_tr = 0;
2886 	int tr_idx = 0;
2887 	u64 asel;
2888 
2889 	/* estimate the number of TRs we will need */
2890 	for_each_sg(sgl, sgent, sglen, i) {
2891 		if (sg_dma_len(sgent) < SZ_64K)
2892 			num_tr++;
2893 		else
2894 			num_tr += 2;
2895 	}
2896 
2897 	/* Now allocate and setup the descriptor. */
2898 	tr_size = sizeof(struct cppi5_tr_type1_t);
2899 	d = udma_alloc_tr_desc(uc, tr_size, num_tr, dir);
2900 	if (!d)
2901 		return NULL;
2902 
2903 	d->sglen = sglen;
2904 
2905 	if (uc->ud->match_data->type == DMA_TYPE_UDMA)
2906 		asel = 0;
2907 	else
2908 		asel = (u64)uc->config.asel << K3_ADDRESS_ASEL_SHIFT;
2909 
2910 	tr_req = d->hwdesc[0].tr_req_base;
2911 	for_each_sg(sgl, sgent, sglen, i) {
2912 		dma_addr_t sg_addr = sg_dma_address(sgent);
2913 
2914 		num_tr = udma_get_tr_counters(sg_dma_len(sgent), __ffs(sg_addr),
2915 					      &tr0_cnt0, &tr0_cnt1, &tr1_cnt0);
2916 		if (num_tr < 0) {
2917 			dev_err(uc->ud->dev, "size %u is not supported\n",
2918 				sg_dma_len(sgent));
2919 			udma_free_hwdesc(uc, d);
2920 			kfree(d);
2921 			return NULL;
2922 		}
2923 
2924 		cppi5_tr_init(&tr_req[tr_idx].flags, CPPI5_TR_TYPE1, false,
2925 			      false, CPPI5_TR_EVENT_SIZE_COMPLETION, 0);
2926 		cppi5_tr_csf_set(&tr_req[tr_idx].flags, CPPI5_TR_CSF_SUPR_EVT);
2927 
2928 		sg_addr |= asel;
2929 		tr_req[tr_idx].addr = sg_addr;
2930 		tr_req[tr_idx].icnt0 = tr0_cnt0;
2931 		tr_req[tr_idx].icnt1 = tr0_cnt1;
2932 		tr_req[tr_idx].dim1 = tr0_cnt0;
2933 		tr_idx++;
2934 
2935 		if (num_tr == 2) {
2936 			cppi5_tr_init(&tr_req[tr_idx].flags, CPPI5_TR_TYPE1,
2937 				      false, false,
2938 				      CPPI5_TR_EVENT_SIZE_COMPLETION, 0);
2939 			cppi5_tr_csf_set(&tr_req[tr_idx].flags,
2940 					 CPPI5_TR_CSF_SUPR_EVT);
2941 
2942 			tr_req[tr_idx].addr = sg_addr + tr0_cnt1 * tr0_cnt0;
2943 			tr_req[tr_idx].icnt0 = tr1_cnt0;
2944 			tr_req[tr_idx].icnt1 = 1;
2945 			tr_req[tr_idx].dim1 = tr1_cnt0;
2946 			tr_idx++;
2947 		}
2948 
2949 		d->residue += sg_dma_len(sgent);
2950 	}
2951 
2952 	cppi5_tr_csf_set(&tr_req[tr_idx - 1].flags,
2953 			 CPPI5_TR_CSF_SUPR_EVT | CPPI5_TR_CSF_EOP);
2954 
2955 	return d;
2956 }
2957 
2958 static struct udma_desc *
2959 udma_prep_slave_sg_triggered_tr(struct udma_chan *uc, struct scatterlist *sgl,
2960 				unsigned int sglen,
2961 				enum dma_transfer_direction dir,
2962 				unsigned long tx_flags, void *context)
2963 {
2964 	struct scatterlist *sgent;
2965 	struct cppi5_tr_type15_t *tr_req = NULL;
2966 	enum dma_slave_buswidth dev_width;
2967 	u16 tr_cnt0, tr_cnt1;
2968 	dma_addr_t dev_addr;
2969 	struct udma_desc *d;
2970 	unsigned int i;
2971 	size_t tr_size, sg_len;
2972 	int num_tr = 0;
2973 	int tr_idx = 0;
2974 	u32 burst, trigger_size, port_window;
2975 	u64 asel;
2976 
2977 	if (dir == DMA_DEV_TO_MEM) {
2978 		dev_addr = uc->cfg.src_addr;
2979 		dev_width = uc->cfg.src_addr_width;
2980 		burst = uc->cfg.src_maxburst;
2981 		port_window = uc->cfg.src_port_window_size;
2982 	} else if (dir == DMA_MEM_TO_DEV) {
2983 		dev_addr = uc->cfg.dst_addr;
2984 		dev_width = uc->cfg.dst_addr_width;
2985 		burst = uc->cfg.dst_maxburst;
2986 		port_window = uc->cfg.dst_port_window_size;
2987 	} else {
2988 		dev_err(uc->ud->dev, "%s: bad direction?\n", __func__);
2989 		return NULL;
2990 	}
2991 
2992 	if (!burst)
2993 		burst = 1;
2994 
2995 	if (port_window) {
2996 		if (port_window != burst) {
2997 			dev_err(uc->ud->dev,
2998 				"The burst must be equal to port_window\n");
2999 			return NULL;
3000 		}
3001 
3002 		tr_cnt0 = dev_width * port_window;
3003 		tr_cnt1 = 1;
3004 	} else {
3005 		tr_cnt0 = dev_width;
3006 		tr_cnt1 = burst;
3007 	}
3008 	trigger_size = tr_cnt0 * tr_cnt1;
3009 
3010 	/* estimate the number of TRs we will need */
3011 	for_each_sg(sgl, sgent, sglen, i) {
3012 		sg_len = sg_dma_len(sgent);
3013 
3014 		if (sg_len % trigger_size) {
3015 			dev_err(uc->ud->dev,
3016 				"Not aligned SG entry (%zu for %u)\n", sg_len,
3017 				trigger_size);
3018 			return NULL;
3019 		}
3020 
3021 		if (sg_len / trigger_size < SZ_64K)
3022 			num_tr++;
3023 		else
3024 			num_tr += 2;
3025 	}
3026 
3027 	/* Now allocate and setup the descriptor. */
3028 	tr_size = sizeof(struct cppi5_tr_type15_t);
3029 	d = udma_alloc_tr_desc(uc, tr_size, num_tr, dir);
3030 	if (!d)
3031 		return NULL;
3032 
3033 	d->sglen = sglen;
3034 
3035 	if (uc->ud->match_data->type == DMA_TYPE_UDMA) {
3036 		asel = 0;
3037 	} else {
3038 		asel = (u64)uc->config.asel << K3_ADDRESS_ASEL_SHIFT;
3039 		dev_addr |= asel;
3040 	}
3041 
3042 	tr_req = d->hwdesc[0].tr_req_base;
3043 	for_each_sg(sgl, sgent, sglen, i) {
3044 		u16 tr0_cnt2, tr0_cnt3, tr1_cnt2;
3045 		dma_addr_t sg_addr = sg_dma_address(sgent);
3046 
3047 		sg_len = sg_dma_len(sgent);
3048 		num_tr = udma_get_tr_counters(sg_len / trigger_size, 0,
3049 					      &tr0_cnt2, &tr0_cnt3, &tr1_cnt2);
3050 		if (num_tr < 0) {
3051 			dev_err(uc->ud->dev, "size %zu is not supported\n",
3052 				sg_len);
3053 			udma_free_hwdesc(uc, d);
3054 			kfree(d);
3055 			return NULL;
3056 		}
3057 
3058 		cppi5_tr_init(&tr_req[tr_idx].flags, CPPI5_TR_TYPE15, false,
3059 			      true, CPPI5_TR_EVENT_SIZE_COMPLETION, 0);
3060 		cppi5_tr_csf_set(&tr_req[tr_idx].flags, CPPI5_TR_CSF_SUPR_EVT);
3061 		cppi5_tr_set_trigger(&tr_req[tr_idx].flags,
3062 				     uc->config.tr_trigger_type,
3063 				     CPPI5_TR_TRIGGER_TYPE_ICNT2_DEC, 0, 0);
3064 
3065 		sg_addr |= asel;
3066 		if (dir == DMA_DEV_TO_MEM) {
3067 			tr_req[tr_idx].addr = dev_addr;
3068 			tr_req[tr_idx].icnt0 = tr_cnt0;
3069 			tr_req[tr_idx].icnt1 = tr_cnt1;
3070 			tr_req[tr_idx].icnt2 = tr0_cnt2;
3071 			tr_req[tr_idx].icnt3 = tr0_cnt3;
3072 			tr_req[tr_idx].dim1 = (-1) * tr_cnt0;
3073 
3074 			tr_req[tr_idx].daddr = sg_addr;
3075 			tr_req[tr_idx].dicnt0 = tr_cnt0;
3076 			tr_req[tr_idx].dicnt1 = tr_cnt1;
3077 			tr_req[tr_idx].dicnt2 = tr0_cnt2;
3078 			tr_req[tr_idx].dicnt3 = tr0_cnt3;
3079 			tr_req[tr_idx].ddim1 = tr_cnt0;
3080 			tr_req[tr_idx].ddim2 = trigger_size;
3081 			tr_req[tr_idx].ddim3 = trigger_size * tr0_cnt2;
3082 		} else {
3083 			tr_req[tr_idx].addr = sg_addr;
3084 			tr_req[tr_idx].icnt0 = tr_cnt0;
3085 			tr_req[tr_idx].icnt1 = tr_cnt1;
3086 			tr_req[tr_idx].icnt2 = tr0_cnt2;
3087 			tr_req[tr_idx].icnt3 = tr0_cnt3;
3088 			tr_req[tr_idx].dim1 = tr_cnt0;
3089 			tr_req[tr_idx].dim2 = trigger_size;
3090 			tr_req[tr_idx].dim3 = trigger_size * tr0_cnt2;
3091 
3092 			tr_req[tr_idx].daddr = dev_addr;
3093 			tr_req[tr_idx].dicnt0 = tr_cnt0;
3094 			tr_req[tr_idx].dicnt1 = tr_cnt1;
3095 			tr_req[tr_idx].dicnt2 = tr0_cnt2;
3096 			tr_req[tr_idx].dicnt3 = tr0_cnt3;
3097 			tr_req[tr_idx].ddim1 = (-1) * tr_cnt0;
3098 		}
3099 
3100 		tr_idx++;
3101 
3102 		if (num_tr == 2) {
3103 			cppi5_tr_init(&tr_req[tr_idx].flags, CPPI5_TR_TYPE15,
3104 				      false, true,
3105 				      CPPI5_TR_EVENT_SIZE_COMPLETION, 0);
3106 			cppi5_tr_csf_set(&tr_req[tr_idx].flags,
3107 					 CPPI5_TR_CSF_SUPR_EVT);
3108 			cppi5_tr_set_trigger(&tr_req[tr_idx].flags,
3109 					     uc->config.tr_trigger_type,
3110 					     CPPI5_TR_TRIGGER_TYPE_ICNT2_DEC,
3111 					     0, 0);
3112 
3113 			sg_addr += trigger_size * tr0_cnt2 * tr0_cnt3;
3114 			if (dir == DMA_DEV_TO_MEM) {
3115 				tr_req[tr_idx].addr = dev_addr;
3116 				tr_req[tr_idx].icnt0 = tr_cnt0;
3117 				tr_req[tr_idx].icnt1 = tr_cnt1;
3118 				tr_req[tr_idx].icnt2 = tr1_cnt2;
3119 				tr_req[tr_idx].icnt3 = 1;
3120 				tr_req[tr_idx].dim1 = (-1) * tr_cnt0;
3121 
3122 				tr_req[tr_idx].daddr = sg_addr;
3123 				tr_req[tr_idx].dicnt0 = tr_cnt0;
3124 				tr_req[tr_idx].dicnt1 = tr_cnt1;
3125 				tr_req[tr_idx].dicnt2 = tr1_cnt2;
3126 				tr_req[tr_idx].dicnt3 = 1;
3127 				tr_req[tr_idx].ddim1 = tr_cnt0;
3128 				tr_req[tr_idx].ddim2 = trigger_size;
3129 			} else {
3130 				tr_req[tr_idx].addr = sg_addr;
3131 				tr_req[tr_idx].icnt0 = tr_cnt0;
3132 				tr_req[tr_idx].icnt1 = tr_cnt1;
3133 				tr_req[tr_idx].icnt2 = tr1_cnt2;
3134 				tr_req[tr_idx].icnt3 = 1;
3135 				tr_req[tr_idx].dim1 = tr_cnt0;
3136 				tr_req[tr_idx].dim2 = trigger_size;
3137 
3138 				tr_req[tr_idx].daddr = dev_addr;
3139 				tr_req[tr_idx].dicnt0 = tr_cnt0;
3140 				tr_req[tr_idx].dicnt1 = tr_cnt1;
3141 				tr_req[tr_idx].dicnt2 = tr1_cnt2;
3142 				tr_req[tr_idx].dicnt3 = 1;
3143 				tr_req[tr_idx].ddim1 = (-1) * tr_cnt0;
3144 			}
3145 			tr_idx++;
3146 		}
3147 
3148 		d->residue += sg_len;
3149 	}
3150 
3151 	cppi5_tr_csf_set(&tr_req[tr_idx - 1].flags,
3152 			 CPPI5_TR_CSF_SUPR_EVT | CPPI5_TR_CSF_EOP);
3153 
3154 	return d;
3155 }
3156 
3157 static int udma_configure_statictr(struct udma_chan *uc, struct udma_desc *d,
3158 				   enum dma_slave_buswidth dev_width,
3159 				   u16 elcnt)
3160 {
3161 	if (uc->config.ep_type != PSIL_EP_PDMA_XY)
3162 		return 0;
3163 
3164 	/* Bus width translates to the element size (ES) */
3165 	switch (dev_width) {
3166 	case DMA_SLAVE_BUSWIDTH_1_BYTE:
3167 		d->static_tr.elsize = 0;
3168 		break;
3169 	case DMA_SLAVE_BUSWIDTH_2_BYTES:
3170 		d->static_tr.elsize = 1;
3171 		break;
3172 	case DMA_SLAVE_BUSWIDTH_3_BYTES:
3173 		d->static_tr.elsize = 2;
3174 		break;
3175 	case DMA_SLAVE_BUSWIDTH_4_BYTES:
3176 		d->static_tr.elsize = 3;
3177 		break;
3178 	case DMA_SLAVE_BUSWIDTH_8_BYTES:
3179 		d->static_tr.elsize = 4;
3180 		break;
3181 	default: /* not reached */
3182 		return -EINVAL;
3183 	}
3184 
3185 	d->static_tr.elcnt = elcnt;
3186 
3187 	/*
3188 	 * PDMA must to close the packet when the channel is in packet mode.
3189 	 * For TR mode when the channel is not cyclic we also need PDMA to close
3190 	 * the packet otherwise the transfer will stall because PDMA holds on
3191 	 * the data it has received from the peripheral.
3192 	 */
3193 	if (uc->config.pkt_mode || !uc->cyclic) {
3194 		unsigned int div = dev_width * elcnt;
3195 
3196 		if (uc->cyclic)
3197 			d->static_tr.bstcnt = d->residue / d->sglen / div;
3198 		else
3199 			d->static_tr.bstcnt = d->residue / div;
3200 
3201 		if (uc->config.dir == DMA_DEV_TO_MEM &&
3202 		    d->static_tr.bstcnt > uc->ud->match_data->statictr_z_mask)
3203 			return -EINVAL;
3204 	} else {
3205 		d->static_tr.bstcnt = 0;
3206 	}
3207 
3208 	return 0;
3209 }
3210 
3211 static struct udma_desc *
3212 udma_prep_slave_sg_pkt(struct udma_chan *uc, struct scatterlist *sgl,
3213 		       unsigned int sglen, enum dma_transfer_direction dir,
3214 		       unsigned long tx_flags, void *context)
3215 {
3216 	struct scatterlist *sgent;
3217 	struct cppi5_host_desc_t *h_desc = NULL;
3218 	struct udma_desc *d;
3219 	u32 ring_id;
3220 	unsigned int i;
3221 	u64 asel;
3222 
3223 	d = kzalloc(struct_size(d, hwdesc, sglen), GFP_NOWAIT);
3224 	if (!d)
3225 		return NULL;
3226 
3227 	d->sglen = sglen;
3228 	d->hwdesc_count = sglen;
3229 
3230 	if (dir == DMA_DEV_TO_MEM)
3231 		ring_id = k3_ringacc_get_ring_id(uc->rflow->r_ring);
3232 	else
3233 		ring_id = k3_ringacc_get_ring_id(uc->tchan->tc_ring);
3234 
3235 	if (uc->ud->match_data->type == DMA_TYPE_UDMA)
3236 		asel = 0;
3237 	else
3238 		asel = (u64)uc->config.asel << K3_ADDRESS_ASEL_SHIFT;
3239 
3240 	for_each_sg(sgl, sgent, sglen, i) {
3241 		struct udma_hwdesc *hwdesc = &d->hwdesc[i];
3242 		dma_addr_t sg_addr = sg_dma_address(sgent);
3243 		struct cppi5_host_desc_t *desc;
3244 		size_t sg_len = sg_dma_len(sgent);
3245 
3246 		hwdesc->cppi5_desc_vaddr = dma_pool_zalloc(uc->hdesc_pool,
3247 						GFP_NOWAIT,
3248 						&hwdesc->cppi5_desc_paddr);
3249 		if (!hwdesc->cppi5_desc_vaddr) {
3250 			dev_err(uc->ud->dev,
3251 				"descriptor%d allocation failed\n", i);
3252 
3253 			udma_free_hwdesc(uc, d);
3254 			kfree(d);
3255 			return NULL;
3256 		}
3257 
3258 		d->residue += sg_len;
3259 		hwdesc->cppi5_desc_size = uc->config.hdesc_size;
3260 		desc = hwdesc->cppi5_desc_vaddr;
3261 
3262 		if (i == 0) {
3263 			cppi5_hdesc_init(desc, 0, 0);
3264 			/* Flow and Packed ID */
3265 			cppi5_desc_set_pktids(&desc->hdr, uc->id,
3266 					      CPPI5_INFO1_DESC_FLOWID_DEFAULT);
3267 			cppi5_desc_set_retpolicy(&desc->hdr, 0, ring_id);
3268 		} else {
3269 			cppi5_hdesc_reset_hbdesc(desc);
3270 			cppi5_desc_set_retpolicy(&desc->hdr, 0, 0xffff);
3271 		}
3272 
3273 		/* attach the sg buffer to the descriptor */
3274 		sg_addr |= asel;
3275 		cppi5_hdesc_attach_buf(desc, sg_addr, sg_len, sg_addr, sg_len);
3276 
3277 		/* Attach link as host buffer descriptor */
3278 		if (h_desc)
3279 			cppi5_hdesc_link_hbdesc(h_desc,
3280 						hwdesc->cppi5_desc_paddr | asel);
3281 
3282 		if (uc->ud->match_data->type == DMA_TYPE_PKTDMA ||
3283 		    dir == DMA_MEM_TO_DEV)
3284 			h_desc = desc;
3285 	}
3286 
3287 	if (d->residue >= SZ_4M) {
3288 		dev_err(uc->ud->dev,
3289 			"%s: Transfer size %u is over the supported 4M range\n",
3290 			__func__, d->residue);
3291 		udma_free_hwdesc(uc, d);
3292 		kfree(d);
3293 		return NULL;
3294 	}
3295 
3296 	h_desc = d->hwdesc[0].cppi5_desc_vaddr;
3297 	cppi5_hdesc_set_pktlen(h_desc, d->residue);
3298 
3299 	return d;
3300 }
3301 
3302 static int udma_attach_metadata(struct dma_async_tx_descriptor *desc,
3303 				void *data, size_t len)
3304 {
3305 	struct udma_desc *d = to_udma_desc(desc);
3306 	struct udma_chan *uc = to_udma_chan(desc->chan);
3307 	struct cppi5_host_desc_t *h_desc;
3308 	u32 psd_size = len;
3309 	u32 flags = 0;
3310 
3311 	if (!uc->config.pkt_mode || !uc->config.metadata_size)
3312 		return -ENOTSUPP;
3313 
3314 	if (!data || len > uc->config.metadata_size)
3315 		return -EINVAL;
3316 
3317 	if (uc->config.needs_epib && len < CPPI5_INFO0_HDESC_EPIB_SIZE)
3318 		return -EINVAL;
3319 
3320 	h_desc = d->hwdesc[0].cppi5_desc_vaddr;
3321 	if (d->dir == DMA_MEM_TO_DEV)
3322 		memcpy(h_desc->epib, data, len);
3323 
3324 	if (uc->config.needs_epib)
3325 		psd_size -= CPPI5_INFO0_HDESC_EPIB_SIZE;
3326 
3327 	d->metadata = data;
3328 	d->metadata_size = len;
3329 	if (uc->config.needs_epib)
3330 		flags |= CPPI5_INFO0_HDESC_EPIB_PRESENT;
3331 
3332 	cppi5_hdesc_update_flags(h_desc, flags);
3333 	cppi5_hdesc_update_psdata_size(h_desc, psd_size);
3334 
3335 	return 0;
3336 }
3337 
3338 static void *udma_get_metadata_ptr(struct dma_async_tx_descriptor *desc,
3339 				   size_t *payload_len, size_t *max_len)
3340 {
3341 	struct udma_desc *d = to_udma_desc(desc);
3342 	struct udma_chan *uc = to_udma_chan(desc->chan);
3343 	struct cppi5_host_desc_t *h_desc;
3344 
3345 	if (!uc->config.pkt_mode || !uc->config.metadata_size)
3346 		return ERR_PTR(-ENOTSUPP);
3347 
3348 	h_desc = d->hwdesc[0].cppi5_desc_vaddr;
3349 
3350 	*max_len = uc->config.metadata_size;
3351 
3352 	*payload_len = cppi5_hdesc_epib_present(&h_desc->hdr) ?
3353 		       CPPI5_INFO0_HDESC_EPIB_SIZE : 0;
3354 	*payload_len += cppi5_hdesc_get_psdata_size(h_desc);
3355 
3356 	return h_desc->epib;
3357 }
3358 
3359 static int udma_set_metadata_len(struct dma_async_tx_descriptor *desc,
3360 				 size_t payload_len)
3361 {
3362 	struct udma_desc *d = to_udma_desc(desc);
3363 	struct udma_chan *uc = to_udma_chan(desc->chan);
3364 	struct cppi5_host_desc_t *h_desc;
3365 	u32 psd_size = payload_len;
3366 	u32 flags = 0;
3367 
3368 	if (!uc->config.pkt_mode || !uc->config.metadata_size)
3369 		return -ENOTSUPP;
3370 
3371 	if (payload_len > uc->config.metadata_size)
3372 		return -EINVAL;
3373 
3374 	if (uc->config.needs_epib && payload_len < CPPI5_INFO0_HDESC_EPIB_SIZE)
3375 		return -EINVAL;
3376 
3377 	h_desc = d->hwdesc[0].cppi5_desc_vaddr;
3378 
3379 	if (uc->config.needs_epib) {
3380 		psd_size -= CPPI5_INFO0_HDESC_EPIB_SIZE;
3381 		flags |= CPPI5_INFO0_HDESC_EPIB_PRESENT;
3382 	}
3383 
3384 	cppi5_hdesc_update_flags(h_desc, flags);
3385 	cppi5_hdesc_update_psdata_size(h_desc, psd_size);
3386 
3387 	return 0;
3388 }
3389 
3390 static struct dma_descriptor_metadata_ops metadata_ops = {
3391 	.attach = udma_attach_metadata,
3392 	.get_ptr = udma_get_metadata_ptr,
3393 	.set_len = udma_set_metadata_len,
3394 };
3395 
3396 static struct dma_async_tx_descriptor *
3397 udma_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
3398 		   unsigned int sglen, enum dma_transfer_direction dir,
3399 		   unsigned long tx_flags, void *context)
3400 {
3401 	struct udma_chan *uc = to_udma_chan(chan);
3402 	enum dma_slave_buswidth dev_width;
3403 	struct udma_desc *d;
3404 	u32 burst;
3405 
3406 	if (dir != uc->config.dir &&
3407 	    (uc->config.dir == DMA_MEM_TO_MEM && !uc->config.tr_trigger_type)) {
3408 		dev_err(chan->device->dev,
3409 			"%s: chan%d is for %s, not supporting %s\n",
3410 			__func__, uc->id,
3411 			dmaengine_get_direction_text(uc->config.dir),
3412 			dmaengine_get_direction_text(dir));
3413 		return NULL;
3414 	}
3415 
3416 	if (dir == DMA_DEV_TO_MEM) {
3417 		dev_width = uc->cfg.src_addr_width;
3418 		burst = uc->cfg.src_maxburst;
3419 	} else if (dir == DMA_MEM_TO_DEV) {
3420 		dev_width = uc->cfg.dst_addr_width;
3421 		burst = uc->cfg.dst_maxburst;
3422 	} else {
3423 		dev_err(chan->device->dev, "%s: bad direction?\n", __func__);
3424 		return NULL;
3425 	}
3426 
3427 	if (!burst)
3428 		burst = 1;
3429 
3430 	uc->config.tx_flags = tx_flags;
3431 
3432 	if (uc->config.pkt_mode)
3433 		d = udma_prep_slave_sg_pkt(uc, sgl, sglen, dir, tx_flags,
3434 					   context);
3435 	else if (is_slave_direction(uc->config.dir))
3436 		d = udma_prep_slave_sg_tr(uc, sgl, sglen, dir, tx_flags,
3437 					  context);
3438 	else
3439 		d = udma_prep_slave_sg_triggered_tr(uc, sgl, sglen, dir,
3440 						    tx_flags, context);
3441 
3442 	if (!d)
3443 		return NULL;
3444 
3445 	d->dir = dir;
3446 	d->desc_idx = 0;
3447 	d->tr_idx = 0;
3448 
3449 	/* static TR for remote PDMA */
3450 	if (udma_configure_statictr(uc, d, dev_width, burst)) {
3451 		dev_err(uc->ud->dev,
3452 			"%s: StaticTR Z is limited to maximum 4095 (%u)\n",
3453 			__func__, d->static_tr.bstcnt);
3454 
3455 		udma_free_hwdesc(uc, d);
3456 		kfree(d);
3457 		return NULL;
3458 	}
3459 
3460 	if (uc->config.metadata_size)
3461 		d->vd.tx.metadata_ops = &metadata_ops;
3462 
3463 	return vchan_tx_prep(&uc->vc, &d->vd, tx_flags);
3464 }
3465 
3466 static struct udma_desc *
3467 udma_prep_dma_cyclic_tr(struct udma_chan *uc, dma_addr_t buf_addr,
3468 			size_t buf_len, size_t period_len,
3469 			enum dma_transfer_direction dir, unsigned long flags)
3470 {
3471 	struct udma_desc *d;
3472 	size_t tr_size, period_addr;
3473 	struct cppi5_tr_type1_t *tr_req;
3474 	unsigned int periods = buf_len / period_len;
3475 	u16 tr0_cnt0, tr0_cnt1, tr1_cnt0;
3476 	unsigned int i;
3477 	int num_tr;
3478 
3479 	num_tr = udma_get_tr_counters(period_len, __ffs(buf_addr), &tr0_cnt0,
3480 				      &tr0_cnt1, &tr1_cnt0);
3481 	if (num_tr < 0) {
3482 		dev_err(uc->ud->dev, "size %zu is not supported\n",
3483 			period_len);
3484 		return NULL;
3485 	}
3486 
3487 	/* Now allocate and setup the descriptor. */
3488 	tr_size = sizeof(struct cppi5_tr_type1_t);
3489 	d = udma_alloc_tr_desc(uc, tr_size, periods * num_tr, dir);
3490 	if (!d)
3491 		return NULL;
3492 
3493 	tr_req = d->hwdesc[0].tr_req_base;
3494 	if (uc->ud->match_data->type == DMA_TYPE_UDMA)
3495 		period_addr = buf_addr;
3496 	else
3497 		period_addr = buf_addr |
3498 			((u64)uc->config.asel << K3_ADDRESS_ASEL_SHIFT);
3499 
3500 	for (i = 0; i < periods; i++) {
3501 		int tr_idx = i * num_tr;
3502 
3503 		cppi5_tr_init(&tr_req[tr_idx].flags, CPPI5_TR_TYPE1, false,
3504 			      false, CPPI5_TR_EVENT_SIZE_COMPLETION, 0);
3505 
3506 		tr_req[tr_idx].addr = period_addr;
3507 		tr_req[tr_idx].icnt0 = tr0_cnt0;
3508 		tr_req[tr_idx].icnt1 = tr0_cnt1;
3509 		tr_req[tr_idx].dim1 = tr0_cnt0;
3510 
3511 		if (num_tr == 2) {
3512 			cppi5_tr_csf_set(&tr_req[tr_idx].flags,
3513 					 CPPI5_TR_CSF_SUPR_EVT);
3514 			tr_idx++;
3515 
3516 			cppi5_tr_init(&tr_req[tr_idx].flags, CPPI5_TR_TYPE1,
3517 				      false, false,
3518 				      CPPI5_TR_EVENT_SIZE_COMPLETION, 0);
3519 
3520 			tr_req[tr_idx].addr = period_addr + tr0_cnt1 * tr0_cnt0;
3521 			tr_req[tr_idx].icnt0 = tr1_cnt0;
3522 			tr_req[tr_idx].icnt1 = 1;
3523 			tr_req[tr_idx].dim1 = tr1_cnt0;
3524 		}
3525 
3526 		if (!(flags & DMA_PREP_INTERRUPT))
3527 			cppi5_tr_csf_set(&tr_req[tr_idx].flags,
3528 					 CPPI5_TR_CSF_SUPR_EVT);
3529 
3530 		period_addr += period_len;
3531 	}
3532 
3533 	return d;
3534 }
3535 
3536 static struct udma_desc *
3537 udma_prep_dma_cyclic_pkt(struct udma_chan *uc, dma_addr_t buf_addr,
3538 			 size_t buf_len, size_t period_len,
3539 			 enum dma_transfer_direction dir, unsigned long flags)
3540 {
3541 	struct udma_desc *d;
3542 	u32 ring_id;
3543 	int i;
3544 	int periods = buf_len / period_len;
3545 
3546 	if (periods > (K3_UDMA_DEFAULT_RING_SIZE - 1))
3547 		return NULL;
3548 
3549 	if (period_len >= SZ_4M)
3550 		return NULL;
3551 
3552 	d = kzalloc(struct_size(d, hwdesc, periods), GFP_NOWAIT);
3553 	if (!d)
3554 		return NULL;
3555 
3556 	d->hwdesc_count = periods;
3557 
3558 	/* TODO: re-check this... */
3559 	if (dir == DMA_DEV_TO_MEM)
3560 		ring_id = k3_ringacc_get_ring_id(uc->rflow->r_ring);
3561 	else
3562 		ring_id = k3_ringacc_get_ring_id(uc->tchan->tc_ring);
3563 
3564 	if (uc->ud->match_data->type != DMA_TYPE_UDMA)
3565 		buf_addr |= (u64)uc->config.asel << K3_ADDRESS_ASEL_SHIFT;
3566 
3567 	for (i = 0; i < periods; i++) {
3568 		struct udma_hwdesc *hwdesc = &d->hwdesc[i];
3569 		dma_addr_t period_addr = buf_addr + (period_len * i);
3570 		struct cppi5_host_desc_t *h_desc;
3571 
3572 		hwdesc->cppi5_desc_vaddr = dma_pool_zalloc(uc->hdesc_pool,
3573 						GFP_NOWAIT,
3574 						&hwdesc->cppi5_desc_paddr);
3575 		if (!hwdesc->cppi5_desc_vaddr) {
3576 			dev_err(uc->ud->dev,
3577 				"descriptor%d allocation failed\n", i);
3578 
3579 			udma_free_hwdesc(uc, d);
3580 			kfree(d);
3581 			return NULL;
3582 		}
3583 
3584 		hwdesc->cppi5_desc_size = uc->config.hdesc_size;
3585 		h_desc = hwdesc->cppi5_desc_vaddr;
3586 
3587 		cppi5_hdesc_init(h_desc, 0, 0);
3588 		cppi5_hdesc_set_pktlen(h_desc, period_len);
3589 
3590 		/* Flow and Packed ID */
3591 		cppi5_desc_set_pktids(&h_desc->hdr, uc->id,
3592 				      CPPI5_INFO1_DESC_FLOWID_DEFAULT);
3593 		cppi5_desc_set_retpolicy(&h_desc->hdr, 0, ring_id);
3594 
3595 		/* attach each period to a new descriptor */
3596 		cppi5_hdesc_attach_buf(h_desc,
3597 				       period_addr, period_len,
3598 				       period_addr, period_len);
3599 	}
3600 
3601 	return d;
3602 }
3603 
3604 static struct dma_async_tx_descriptor *
3605 udma_prep_dma_cyclic(struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len,
3606 		     size_t period_len, enum dma_transfer_direction dir,
3607 		     unsigned long flags)
3608 {
3609 	struct udma_chan *uc = to_udma_chan(chan);
3610 	enum dma_slave_buswidth dev_width;
3611 	struct udma_desc *d;
3612 	u32 burst;
3613 
3614 	if (dir != uc->config.dir) {
3615 		dev_err(chan->device->dev,
3616 			"%s: chan%d is for %s, not supporting %s\n",
3617 			__func__, uc->id,
3618 			dmaengine_get_direction_text(uc->config.dir),
3619 			dmaengine_get_direction_text(dir));
3620 		return NULL;
3621 	}
3622 
3623 	uc->cyclic = true;
3624 
3625 	if (dir == DMA_DEV_TO_MEM) {
3626 		dev_width = uc->cfg.src_addr_width;
3627 		burst = uc->cfg.src_maxburst;
3628 	} else if (dir == DMA_MEM_TO_DEV) {
3629 		dev_width = uc->cfg.dst_addr_width;
3630 		burst = uc->cfg.dst_maxburst;
3631 	} else {
3632 		dev_err(uc->ud->dev, "%s: bad direction?\n", __func__);
3633 		return NULL;
3634 	}
3635 
3636 	if (!burst)
3637 		burst = 1;
3638 
3639 	if (uc->config.pkt_mode)
3640 		d = udma_prep_dma_cyclic_pkt(uc, buf_addr, buf_len, period_len,
3641 					     dir, flags);
3642 	else
3643 		d = udma_prep_dma_cyclic_tr(uc, buf_addr, buf_len, period_len,
3644 					    dir, flags);
3645 
3646 	if (!d)
3647 		return NULL;
3648 
3649 	d->sglen = buf_len / period_len;
3650 
3651 	d->dir = dir;
3652 	d->residue = buf_len;
3653 
3654 	/* static TR for remote PDMA */
3655 	if (udma_configure_statictr(uc, d, dev_width, burst)) {
3656 		dev_err(uc->ud->dev,
3657 			"%s: StaticTR Z is limited to maximum 4095 (%u)\n",
3658 			__func__, d->static_tr.bstcnt);
3659 
3660 		udma_free_hwdesc(uc, d);
3661 		kfree(d);
3662 		return NULL;
3663 	}
3664 
3665 	if (uc->config.metadata_size)
3666 		d->vd.tx.metadata_ops = &metadata_ops;
3667 
3668 	return vchan_tx_prep(&uc->vc, &d->vd, flags);
3669 }
3670 
3671 static struct dma_async_tx_descriptor *
3672 udma_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src,
3673 		     size_t len, unsigned long tx_flags)
3674 {
3675 	struct udma_chan *uc = to_udma_chan(chan);
3676 	struct udma_desc *d;
3677 	struct cppi5_tr_type15_t *tr_req;
3678 	int num_tr;
3679 	size_t tr_size = sizeof(struct cppi5_tr_type15_t);
3680 	u16 tr0_cnt0, tr0_cnt1, tr1_cnt0;
3681 
3682 	if (uc->config.dir != DMA_MEM_TO_MEM) {
3683 		dev_err(chan->device->dev,
3684 			"%s: chan%d is for %s, not supporting %s\n",
3685 			__func__, uc->id,
3686 			dmaengine_get_direction_text(uc->config.dir),
3687 			dmaengine_get_direction_text(DMA_MEM_TO_MEM));
3688 		return NULL;
3689 	}
3690 
3691 	num_tr = udma_get_tr_counters(len, __ffs(src | dest), &tr0_cnt0,
3692 				      &tr0_cnt1, &tr1_cnt0);
3693 	if (num_tr < 0) {
3694 		dev_err(uc->ud->dev, "size %zu is not supported\n",
3695 			len);
3696 		return NULL;
3697 	}
3698 
3699 	d = udma_alloc_tr_desc(uc, tr_size, num_tr, DMA_MEM_TO_MEM);
3700 	if (!d)
3701 		return NULL;
3702 
3703 	d->dir = DMA_MEM_TO_MEM;
3704 	d->desc_idx = 0;
3705 	d->tr_idx = 0;
3706 	d->residue = len;
3707 
3708 	if (uc->ud->match_data->type != DMA_TYPE_UDMA) {
3709 		src |= (u64)uc->ud->asel << K3_ADDRESS_ASEL_SHIFT;
3710 		dest |= (u64)uc->ud->asel << K3_ADDRESS_ASEL_SHIFT;
3711 	}
3712 
3713 	tr_req = d->hwdesc[0].tr_req_base;
3714 
3715 	cppi5_tr_init(&tr_req[0].flags, CPPI5_TR_TYPE15, false, true,
3716 		      CPPI5_TR_EVENT_SIZE_COMPLETION, 0);
3717 	cppi5_tr_csf_set(&tr_req[0].flags, CPPI5_TR_CSF_SUPR_EVT);
3718 
3719 	tr_req[0].addr = src;
3720 	tr_req[0].icnt0 = tr0_cnt0;
3721 	tr_req[0].icnt1 = tr0_cnt1;
3722 	tr_req[0].icnt2 = 1;
3723 	tr_req[0].icnt3 = 1;
3724 	tr_req[0].dim1 = tr0_cnt0;
3725 
3726 	tr_req[0].daddr = dest;
3727 	tr_req[0].dicnt0 = tr0_cnt0;
3728 	tr_req[0].dicnt1 = tr0_cnt1;
3729 	tr_req[0].dicnt2 = 1;
3730 	tr_req[0].dicnt3 = 1;
3731 	tr_req[0].ddim1 = tr0_cnt0;
3732 
3733 	if (num_tr == 2) {
3734 		cppi5_tr_init(&tr_req[1].flags, CPPI5_TR_TYPE15, false, true,
3735 			      CPPI5_TR_EVENT_SIZE_COMPLETION, 0);
3736 		cppi5_tr_csf_set(&tr_req[1].flags, CPPI5_TR_CSF_SUPR_EVT);
3737 
3738 		tr_req[1].addr = src + tr0_cnt1 * tr0_cnt0;
3739 		tr_req[1].icnt0 = tr1_cnt0;
3740 		tr_req[1].icnt1 = 1;
3741 		tr_req[1].icnt2 = 1;
3742 		tr_req[1].icnt3 = 1;
3743 
3744 		tr_req[1].daddr = dest + tr0_cnt1 * tr0_cnt0;
3745 		tr_req[1].dicnt0 = tr1_cnt0;
3746 		tr_req[1].dicnt1 = 1;
3747 		tr_req[1].dicnt2 = 1;
3748 		tr_req[1].dicnt3 = 1;
3749 	}
3750 
3751 	cppi5_tr_csf_set(&tr_req[num_tr - 1].flags,
3752 			 CPPI5_TR_CSF_SUPR_EVT | CPPI5_TR_CSF_EOP);
3753 
3754 	if (uc->config.metadata_size)
3755 		d->vd.tx.metadata_ops = &metadata_ops;
3756 
3757 	return vchan_tx_prep(&uc->vc, &d->vd, tx_flags);
3758 }
3759 
3760 static void udma_issue_pending(struct dma_chan *chan)
3761 {
3762 	struct udma_chan *uc = to_udma_chan(chan);
3763 	unsigned long flags;
3764 
3765 	spin_lock_irqsave(&uc->vc.lock, flags);
3766 
3767 	/* If we have something pending and no active descriptor, then */
3768 	if (vchan_issue_pending(&uc->vc) && !uc->desc) {
3769 		/*
3770 		 * start a descriptor if the channel is NOT [marked as
3771 		 * terminating _and_ it is still running (teardown has not
3772 		 * completed yet)].
3773 		 */
3774 		if (!(uc->state == UDMA_CHAN_IS_TERMINATING &&
3775 		      udma_is_chan_running(uc)))
3776 			udma_start(uc);
3777 	}
3778 
3779 	spin_unlock_irqrestore(&uc->vc.lock, flags);
3780 }
3781 
3782 static enum dma_status udma_tx_status(struct dma_chan *chan,
3783 				      dma_cookie_t cookie,
3784 				      struct dma_tx_state *txstate)
3785 {
3786 	struct udma_chan *uc = to_udma_chan(chan);
3787 	enum dma_status ret;
3788 	unsigned long flags;
3789 
3790 	spin_lock_irqsave(&uc->vc.lock, flags);
3791 
3792 	ret = dma_cookie_status(chan, cookie, txstate);
3793 
3794 	if (!udma_is_chan_running(uc))
3795 		ret = DMA_COMPLETE;
3796 
3797 	if (ret == DMA_IN_PROGRESS && udma_is_chan_paused(uc))
3798 		ret = DMA_PAUSED;
3799 
3800 	if (ret == DMA_COMPLETE || !txstate)
3801 		goto out;
3802 
3803 	if (uc->desc && uc->desc->vd.tx.cookie == cookie) {
3804 		u32 peer_bcnt = 0;
3805 		u32 bcnt = 0;
3806 		u32 residue = uc->desc->residue;
3807 		u32 delay = 0;
3808 
3809 		if (uc->desc->dir == DMA_MEM_TO_DEV) {
3810 			bcnt = udma_tchanrt_read(uc, UDMA_CHAN_RT_SBCNT_REG);
3811 
3812 			if (uc->config.ep_type != PSIL_EP_NATIVE) {
3813 				peer_bcnt = udma_tchanrt_read(uc,
3814 						UDMA_CHAN_RT_PEER_BCNT_REG);
3815 
3816 				if (bcnt > peer_bcnt)
3817 					delay = bcnt - peer_bcnt;
3818 			}
3819 		} else if (uc->desc->dir == DMA_DEV_TO_MEM) {
3820 			bcnt = udma_rchanrt_read(uc, UDMA_CHAN_RT_BCNT_REG);
3821 
3822 			if (uc->config.ep_type != PSIL_EP_NATIVE) {
3823 				peer_bcnt = udma_rchanrt_read(uc,
3824 						UDMA_CHAN_RT_PEER_BCNT_REG);
3825 
3826 				if (peer_bcnt > bcnt)
3827 					delay = peer_bcnt - bcnt;
3828 			}
3829 		} else {
3830 			bcnt = udma_tchanrt_read(uc, UDMA_CHAN_RT_BCNT_REG);
3831 		}
3832 
3833 		if (bcnt && !(bcnt % uc->desc->residue))
3834 			residue = 0;
3835 		else
3836 			residue -= bcnt % uc->desc->residue;
3837 
3838 		if (!residue && (uc->config.dir == DMA_DEV_TO_MEM || !delay)) {
3839 			ret = DMA_COMPLETE;
3840 			delay = 0;
3841 		}
3842 
3843 		dma_set_residue(txstate, residue);
3844 		dma_set_in_flight_bytes(txstate, delay);
3845 
3846 	} else {
3847 		ret = DMA_COMPLETE;
3848 	}
3849 
3850 out:
3851 	spin_unlock_irqrestore(&uc->vc.lock, flags);
3852 	return ret;
3853 }
3854 
3855 static int udma_pause(struct dma_chan *chan)
3856 {
3857 	struct udma_chan *uc = to_udma_chan(chan);
3858 
3859 	/* pause the channel */
3860 	switch (uc->config.dir) {
3861 	case DMA_DEV_TO_MEM:
3862 		udma_rchanrt_update_bits(uc, UDMA_CHAN_RT_PEER_RT_EN_REG,
3863 					 UDMA_PEER_RT_EN_PAUSE,
3864 					 UDMA_PEER_RT_EN_PAUSE);
3865 		break;
3866 	case DMA_MEM_TO_DEV:
3867 		udma_tchanrt_update_bits(uc, UDMA_CHAN_RT_PEER_RT_EN_REG,
3868 					 UDMA_PEER_RT_EN_PAUSE,
3869 					 UDMA_PEER_RT_EN_PAUSE);
3870 		break;
3871 	case DMA_MEM_TO_MEM:
3872 		udma_tchanrt_update_bits(uc, UDMA_CHAN_RT_CTL_REG,
3873 					 UDMA_CHAN_RT_CTL_PAUSE,
3874 					 UDMA_CHAN_RT_CTL_PAUSE);
3875 		break;
3876 	default:
3877 		return -EINVAL;
3878 	}
3879 
3880 	return 0;
3881 }
3882 
3883 static int udma_resume(struct dma_chan *chan)
3884 {
3885 	struct udma_chan *uc = to_udma_chan(chan);
3886 
3887 	/* resume the channel */
3888 	switch (uc->config.dir) {
3889 	case DMA_DEV_TO_MEM:
3890 		udma_rchanrt_update_bits(uc, UDMA_CHAN_RT_PEER_RT_EN_REG,
3891 					 UDMA_PEER_RT_EN_PAUSE, 0);
3892 
3893 		break;
3894 	case DMA_MEM_TO_DEV:
3895 		udma_tchanrt_update_bits(uc, UDMA_CHAN_RT_PEER_RT_EN_REG,
3896 					 UDMA_PEER_RT_EN_PAUSE, 0);
3897 		break;
3898 	case DMA_MEM_TO_MEM:
3899 		udma_tchanrt_update_bits(uc, UDMA_CHAN_RT_CTL_REG,
3900 					 UDMA_CHAN_RT_CTL_PAUSE, 0);
3901 		break;
3902 	default:
3903 		return -EINVAL;
3904 	}
3905 
3906 	return 0;
3907 }
3908 
3909 static int udma_terminate_all(struct dma_chan *chan)
3910 {
3911 	struct udma_chan *uc = to_udma_chan(chan);
3912 	unsigned long flags;
3913 	LIST_HEAD(head);
3914 
3915 	spin_lock_irqsave(&uc->vc.lock, flags);
3916 
3917 	if (udma_is_chan_running(uc))
3918 		udma_stop(uc);
3919 
3920 	if (uc->desc) {
3921 		uc->terminated_desc = uc->desc;
3922 		uc->desc = NULL;
3923 		uc->terminated_desc->terminated = true;
3924 		cancel_delayed_work(&uc->tx_drain.work);
3925 	}
3926 
3927 	uc->paused = false;
3928 
3929 	vchan_get_all_descriptors(&uc->vc, &head);
3930 	spin_unlock_irqrestore(&uc->vc.lock, flags);
3931 	vchan_dma_desc_free_list(&uc->vc, &head);
3932 
3933 	return 0;
3934 }
3935 
3936 static void udma_synchronize(struct dma_chan *chan)
3937 {
3938 	struct udma_chan *uc = to_udma_chan(chan);
3939 	unsigned long timeout = msecs_to_jiffies(1000);
3940 
3941 	vchan_synchronize(&uc->vc);
3942 
3943 	if (uc->state == UDMA_CHAN_IS_TERMINATING) {
3944 		timeout = wait_for_completion_timeout(&uc->teardown_completed,
3945 						      timeout);
3946 		if (!timeout) {
3947 			dev_warn(uc->ud->dev, "chan%d teardown timeout!\n",
3948 				 uc->id);
3949 			udma_dump_chan_stdata(uc);
3950 			udma_reset_chan(uc, true);
3951 		}
3952 	}
3953 
3954 	udma_reset_chan(uc, false);
3955 	if (udma_is_chan_running(uc))
3956 		dev_warn(uc->ud->dev, "chan%d refused to stop!\n", uc->id);
3957 
3958 	cancel_delayed_work_sync(&uc->tx_drain.work);
3959 	udma_reset_rings(uc);
3960 }
3961 
3962 static void udma_desc_pre_callback(struct virt_dma_chan *vc,
3963 				   struct virt_dma_desc *vd,
3964 				   struct dmaengine_result *result)
3965 {
3966 	struct udma_chan *uc = to_udma_chan(&vc->chan);
3967 	struct udma_desc *d;
3968 
3969 	if (!vd)
3970 		return;
3971 
3972 	d = to_udma_desc(&vd->tx);
3973 
3974 	if (d->metadata_size)
3975 		udma_fetch_epib(uc, d);
3976 
3977 	/* Provide residue information for the client */
3978 	if (result) {
3979 		void *desc_vaddr = udma_curr_cppi5_desc_vaddr(d, d->desc_idx);
3980 
3981 		if (cppi5_desc_get_type(desc_vaddr) ==
3982 		    CPPI5_INFO0_DESC_TYPE_VAL_HOST) {
3983 			result->residue = d->residue -
3984 					  cppi5_hdesc_get_pktlen(desc_vaddr);
3985 			if (result->residue)
3986 				result->result = DMA_TRANS_ABORTED;
3987 			else
3988 				result->result = DMA_TRANS_NOERROR;
3989 		} else {
3990 			result->residue = 0;
3991 			result->result = DMA_TRANS_NOERROR;
3992 		}
3993 	}
3994 }
3995 
3996 /*
3997  * This tasklet handles the completion of a DMA descriptor by
3998  * calling its callback and freeing it.
3999  */
4000 static void udma_vchan_complete(struct tasklet_struct *t)
4001 {
4002 	struct virt_dma_chan *vc = from_tasklet(vc, t, task);
4003 	struct virt_dma_desc *vd, *_vd;
4004 	struct dmaengine_desc_callback cb;
4005 	LIST_HEAD(head);
4006 
4007 	spin_lock_irq(&vc->lock);
4008 	list_splice_tail_init(&vc->desc_completed, &head);
4009 	vd = vc->cyclic;
4010 	if (vd) {
4011 		vc->cyclic = NULL;
4012 		dmaengine_desc_get_callback(&vd->tx, &cb);
4013 	} else {
4014 		memset(&cb, 0, sizeof(cb));
4015 	}
4016 	spin_unlock_irq(&vc->lock);
4017 
4018 	udma_desc_pre_callback(vc, vd, NULL);
4019 	dmaengine_desc_callback_invoke(&cb, NULL);
4020 
4021 	list_for_each_entry_safe(vd, _vd, &head, node) {
4022 		struct dmaengine_result result;
4023 
4024 		dmaengine_desc_get_callback(&vd->tx, &cb);
4025 
4026 		list_del(&vd->node);
4027 
4028 		udma_desc_pre_callback(vc, vd, &result);
4029 		dmaengine_desc_callback_invoke(&cb, &result);
4030 
4031 		vchan_vdesc_fini(vd);
4032 	}
4033 }
4034 
4035 static void udma_free_chan_resources(struct dma_chan *chan)
4036 {
4037 	struct udma_chan *uc = to_udma_chan(chan);
4038 	struct udma_dev *ud = to_udma_dev(chan->device);
4039 
4040 	udma_terminate_all(chan);
4041 	if (uc->terminated_desc) {
4042 		udma_reset_chan(uc, false);
4043 		udma_reset_rings(uc);
4044 	}
4045 
4046 	cancel_delayed_work_sync(&uc->tx_drain.work);
4047 
4048 	if (uc->irq_num_ring > 0) {
4049 		free_irq(uc->irq_num_ring, uc);
4050 
4051 		uc->irq_num_ring = 0;
4052 	}
4053 	if (uc->irq_num_udma > 0) {
4054 		free_irq(uc->irq_num_udma, uc);
4055 
4056 		uc->irq_num_udma = 0;
4057 	}
4058 
4059 	/* Release PSI-L pairing */
4060 	if (uc->psil_paired) {
4061 		navss_psil_unpair(ud, uc->config.src_thread,
4062 				  uc->config.dst_thread);
4063 		uc->psil_paired = false;
4064 	}
4065 
4066 	vchan_free_chan_resources(&uc->vc);
4067 	tasklet_kill(&uc->vc.task);
4068 
4069 	bcdma_free_bchan_resources(uc);
4070 	udma_free_tx_resources(uc);
4071 	udma_free_rx_resources(uc);
4072 	udma_reset_uchan(uc);
4073 
4074 	if (uc->use_dma_pool) {
4075 		dma_pool_destroy(uc->hdesc_pool);
4076 		uc->use_dma_pool = false;
4077 	}
4078 }
4079 
4080 static struct platform_driver udma_driver;
4081 static struct platform_driver bcdma_driver;
4082 static struct platform_driver pktdma_driver;
4083 
4084 struct udma_filter_param {
4085 	int remote_thread_id;
4086 	u32 atype;
4087 	u32 asel;
4088 	u32 tr_trigger_type;
4089 };
4090 
4091 static bool udma_dma_filter_fn(struct dma_chan *chan, void *param)
4092 {
4093 	struct udma_chan_config *ucc;
4094 	struct psil_endpoint_config *ep_config;
4095 	struct udma_filter_param *filter_param;
4096 	struct udma_chan *uc;
4097 	struct udma_dev *ud;
4098 
4099 	if (chan->device->dev->driver != &udma_driver.driver &&
4100 	    chan->device->dev->driver != &bcdma_driver.driver &&
4101 	    chan->device->dev->driver != &pktdma_driver.driver)
4102 		return false;
4103 
4104 	uc = to_udma_chan(chan);
4105 	ucc = &uc->config;
4106 	ud = uc->ud;
4107 	filter_param = param;
4108 
4109 	if (filter_param->atype > 2) {
4110 		dev_err(ud->dev, "Invalid channel atype: %u\n",
4111 			filter_param->atype);
4112 		return false;
4113 	}
4114 
4115 	if (filter_param->asel > 15) {
4116 		dev_err(ud->dev, "Invalid channel asel: %u\n",
4117 			filter_param->asel);
4118 		return false;
4119 	}
4120 
4121 	ucc->remote_thread_id = filter_param->remote_thread_id;
4122 	ucc->atype = filter_param->atype;
4123 	ucc->asel = filter_param->asel;
4124 	ucc->tr_trigger_type = filter_param->tr_trigger_type;
4125 
4126 	if (ucc->tr_trigger_type) {
4127 		ucc->dir = DMA_MEM_TO_MEM;
4128 		goto triggered_bchan;
4129 	} else if (ucc->remote_thread_id & K3_PSIL_DST_THREAD_ID_OFFSET) {
4130 		ucc->dir = DMA_MEM_TO_DEV;
4131 	} else {
4132 		ucc->dir = DMA_DEV_TO_MEM;
4133 	}
4134 
4135 	ep_config = psil_get_ep_config(ucc->remote_thread_id);
4136 	if (IS_ERR(ep_config)) {
4137 		dev_err(ud->dev, "No configuration for psi-l thread 0x%04x\n",
4138 			ucc->remote_thread_id);
4139 		ucc->dir = DMA_MEM_TO_MEM;
4140 		ucc->remote_thread_id = -1;
4141 		ucc->atype = 0;
4142 		ucc->asel = 0;
4143 		return false;
4144 	}
4145 
4146 	if (ud->match_data->type == DMA_TYPE_BCDMA &&
4147 	    ep_config->pkt_mode) {
4148 		dev_err(ud->dev,
4149 			"Only TR mode is supported (psi-l thread 0x%04x)\n",
4150 			ucc->remote_thread_id);
4151 		ucc->dir = DMA_MEM_TO_MEM;
4152 		ucc->remote_thread_id = -1;
4153 		ucc->atype = 0;
4154 		ucc->asel = 0;
4155 		return false;
4156 	}
4157 
4158 	ucc->pkt_mode = ep_config->pkt_mode;
4159 	ucc->channel_tpl = ep_config->channel_tpl;
4160 	ucc->notdpkt = ep_config->notdpkt;
4161 	ucc->ep_type = ep_config->ep_type;
4162 
4163 	if (ud->match_data->type == DMA_TYPE_PKTDMA &&
4164 	    ep_config->mapped_channel_id >= 0) {
4165 		ucc->mapped_channel_id = ep_config->mapped_channel_id;
4166 		ucc->default_flow_id = ep_config->default_flow_id;
4167 	} else {
4168 		ucc->mapped_channel_id = -1;
4169 		ucc->default_flow_id = -1;
4170 	}
4171 
4172 	if (ucc->ep_type != PSIL_EP_NATIVE) {
4173 		const struct udma_match_data *match_data = ud->match_data;
4174 
4175 		if (match_data->flags & UDMA_FLAG_PDMA_ACC32)
4176 			ucc->enable_acc32 = ep_config->pdma_acc32;
4177 		if (match_data->flags & UDMA_FLAG_PDMA_BURST)
4178 			ucc->enable_burst = ep_config->pdma_burst;
4179 	}
4180 
4181 	ucc->needs_epib = ep_config->needs_epib;
4182 	ucc->psd_size = ep_config->psd_size;
4183 	ucc->metadata_size =
4184 			(ucc->needs_epib ? CPPI5_INFO0_HDESC_EPIB_SIZE : 0) +
4185 			ucc->psd_size;
4186 
4187 	if (ucc->pkt_mode)
4188 		ucc->hdesc_size = ALIGN(sizeof(struct cppi5_host_desc_t) +
4189 				 ucc->metadata_size, ud->desc_align);
4190 
4191 	dev_dbg(ud->dev, "chan%d: Remote thread: 0x%04x (%s)\n", uc->id,
4192 		ucc->remote_thread_id, dmaengine_get_direction_text(ucc->dir));
4193 
4194 	return true;
4195 
4196 triggered_bchan:
4197 	dev_dbg(ud->dev, "chan%d: triggered channel (type: %u)\n", uc->id,
4198 		ucc->tr_trigger_type);
4199 
4200 	return true;
4201 
4202 }
4203 
4204 static struct dma_chan *udma_of_xlate(struct of_phandle_args *dma_spec,
4205 				      struct of_dma *ofdma)
4206 {
4207 	struct udma_dev *ud = ofdma->of_dma_data;
4208 	dma_cap_mask_t mask = ud->ddev.cap_mask;
4209 	struct udma_filter_param filter_param;
4210 	struct dma_chan *chan;
4211 
4212 	if (ud->match_data->type == DMA_TYPE_BCDMA) {
4213 		if (dma_spec->args_count != 3)
4214 			return NULL;
4215 
4216 		filter_param.tr_trigger_type = dma_spec->args[0];
4217 		filter_param.remote_thread_id = dma_spec->args[1];
4218 		filter_param.asel = dma_spec->args[2];
4219 		filter_param.atype = 0;
4220 	} else {
4221 		if (dma_spec->args_count != 1 && dma_spec->args_count != 2)
4222 			return NULL;
4223 
4224 		filter_param.remote_thread_id = dma_spec->args[0];
4225 		filter_param.tr_trigger_type = 0;
4226 		if (dma_spec->args_count == 2) {
4227 			if (ud->match_data->type == DMA_TYPE_UDMA) {
4228 				filter_param.atype = dma_spec->args[1];
4229 				filter_param.asel = 0;
4230 			} else {
4231 				filter_param.atype = 0;
4232 				filter_param.asel = dma_spec->args[1];
4233 			}
4234 		} else {
4235 			filter_param.atype = 0;
4236 			filter_param.asel = 0;
4237 		}
4238 	}
4239 
4240 	chan = __dma_request_channel(&mask, udma_dma_filter_fn, &filter_param,
4241 				     ofdma->of_node);
4242 	if (!chan) {
4243 		dev_err(ud->dev, "get channel fail in %s.\n", __func__);
4244 		return ERR_PTR(-EINVAL);
4245 	}
4246 
4247 	return chan;
4248 }
4249 
4250 static struct udma_match_data am654_main_data = {
4251 	.type = DMA_TYPE_UDMA,
4252 	.psil_base = 0x1000,
4253 	.enable_memcpy_support = true,
4254 	.statictr_z_mask = GENMASK(11, 0),
4255 	.burst_size = {
4256 		TI_SCI_RM_UDMAP_CHAN_BURST_SIZE_64_BYTES, /* Normal Channels */
4257 		TI_SCI_RM_UDMAP_CHAN_BURST_SIZE_64_BYTES, /* H Channels */
4258 		0, /* No UH Channels */
4259 	},
4260 };
4261 
4262 static struct udma_match_data am654_mcu_data = {
4263 	.type = DMA_TYPE_UDMA,
4264 	.psil_base = 0x6000,
4265 	.enable_memcpy_support = false,
4266 	.statictr_z_mask = GENMASK(11, 0),
4267 	.burst_size = {
4268 		TI_SCI_RM_UDMAP_CHAN_BURST_SIZE_64_BYTES, /* Normal Channels */
4269 		TI_SCI_RM_UDMAP_CHAN_BURST_SIZE_64_BYTES, /* H Channels */
4270 		0, /* No UH Channels */
4271 	},
4272 };
4273 
4274 static struct udma_match_data j721e_main_data = {
4275 	.type = DMA_TYPE_UDMA,
4276 	.psil_base = 0x1000,
4277 	.enable_memcpy_support = true,
4278 	.flags = UDMA_FLAGS_J7_CLASS,
4279 	.statictr_z_mask = GENMASK(23, 0),
4280 	.burst_size = {
4281 		TI_SCI_RM_UDMAP_CHAN_BURST_SIZE_64_BYTES, /* Normal Channels */
4282 		TI_SCI_RM_UDMAP_CHAN_BURST_SIZE_256_BYTES, /* H Channels */
4283 		TI_SCI_RM_UDMAP_CHAN_BURST_SIZE_256_BYTES, /* UH Channels */
4284 	},
4285 };
4286 
4287 static struct udma_match_data j721e_mcu_data = {
4288 	.type = DMA_TYPE_UDMA,
4289 	.psil_base = 0x6000,
4290 	.enable_memcpy_support = false, /* MEM_TO_MEM is slow via MCU UDMA */
4291 	.flags = UDMA_FLAGS_J7_CLASS,
4292 	.statictr_z_mask = GENMASK(23, 0),
4293 	.burst_size = {
4294 		TI_SCI_RM_UDMAP_CHAN_BURST_SIZE_64_BYTES, /* Normal Channels */
4295 		TI_SCI_RM_UDMAP_CHAN_BURST_SIZE_128_BYTES, /* H Channels */
4296 		0, /* No UH Channels */
4297 	},
4298 };
4299 
4300 static struct udma_soc_data am62a_dmss_csi_soc_data = {
4301 	.oes = {
4302 		.bcdma_rchan_data = 0xe00,
4303 		.bcdma_rchan_ring = 0x1000,
4304 	},
4305 };
4306 
4307 static struct udma_match_data am62a_bcdma_csirx_data = {
4308 	.type = DMA_TYPE_BCDMA,
4309 	.psil_base = 0x3100,
4310 	.enable_memcpy_support = false,
4311 	.burst_size = {
4312 		TI_SCI_RM_UDMAP_CHAN_BURST_SIZE_64_BYTES, /* Normal Channels */
4313 		0, /* No H Channels */
4314 		0, /* No UH Channels */
4315 	},
4316 	.soc_data = &am62a_dmss_csi_soc_data,
4317 };
4318 
4319 static struct udma_match_data am64_bcdma_data = {
4320 	.type = DMA_TYPE_BCDMA,
4321 	.psil_base = 0x2000, /* for tchan and rchan, not applicable to bchan */
4322 	.enable_memcpy_support = true, /* Supported via bchan */
4323 	.flags = UDMA_FLAGS_J7_CLASS,
4324 	.statictr_z_mask = GENMASK(23, 0),
4325 	.burst_size = {
4326 		TI_SCI_RM_UDMAP_CHAN_BURST_SIZE_64_BYTES, /* Normal Channels */
4327 		0, /* No H Channels */
4328 		0, /* No UH Channels */
4329 	},
4330 };
4331 
4332 static struct udma_match_data am64_pktdma_data = {
4333 	.type = DMA_TYPE_PKTDMA,
4334 	.psil_base = 0x1000,
4335 	.enable_memcpy_support = false, /* PKTDMA does not support MEM_TO_MEM */
4336 	.flags = UDMA_FLAGS_J7_CLASS,
4337 	.statictr_z_mask = GENMASK(23, 0),
4338 	.burst_size = {
4339 		TI_SCI_RM_UDMAP_CHAN_BURST_SIZE_64_BYTES, /* Normal Channels */
4340 		0, /* No H Channels */
4341 		0, /* No UH Channels */
4342 	},
4343 };
4344 
4345 static const struct of_device_id udma_of_match[] = {
4346 	{
4347 		.compatible = "ti,am654-navss-main-udmap",
4348 		.data = &am654_main_data,
4349 	},
4350 	{
4351 		.compatible = "ti,am654-navss-mcu-udmap",
4352 		.data = &am654_mcu_data,
4353 	}, {
4354 		.compatible = "ti,j721e-navss-main-udmap",
4355 		.data = &j721e_main_data,
4356 	}, {
4357 		.compatible = "ti,j721e-navss-mcu-udmap",
4358 		.data = &j721e_mcu_data,
4359 	},
4360 	{
4361 		.compatible = "ti,am64-dmss-bcdma",
4362 		.data = &am64_bcdma_data,
4363 	},
4364 	{
4365 		.compatible = "ti,am64-dmss-pktdma",
4366 		.data = &am64_pktdma_data,
4367 	},
4368 	{
4369 		.compatible = "ti,am62a-dmss-bcdma-csirx",
4370 		.data = &am62a_bcdma_csirx_data,
4371 	},
4372 	{ /* Sentinel */ },
4373 };
4374 
4375 static struct udma_soc_data am654_soc_data = {
4376 	.oes = {
4377 		.udma_rchan = 0x200,
4378 	},
4379 };
4380 
4381 static struct udma_soc_data j721e_soc_data = {
4382 	.oes = {
4383 		.udma_rchan = 0x400,
4384 	},
4385 };
4386 
4387 static struct udma_soc_data j7200_soc_data = {
4388 	.oes = {
4389 		.udma_rchan = 0x80,
4390 	},
4391 };
4392 
4393 static struct udma_soc_data am64_soc_data = {
4394 	.oes = {
4395 		.bcdma_bchan_data = 0x2200,
4396 		.bcdma_bchan_ring = 0x2400,
4397 		.bcdma_tchan_data = 0x2800,
4398 		.bcdma_tchan_ring = 0x2a00,
4399 		.bcdma_rchan_data = 0x2e00,
4400 		.bcdma_rchan_ring = 0x3000,
4401 		.pktdma_tchan_flow = 0x1200,
4402 		.pktdma_rchan_flow = 0x1600,
4403 	},
4404 	.bcdma_trigger_event_offset = 0xc400,
4405 };
4406 
4407 static const struct soc_device_attribute k3_soc_devices[] = {
4408 	{ .family = "AM65X", .data = &am654_soc_data },
4409 	{ .family = "J721E", .data = &j721e_soc_data },
4410 	{ .family = "J7200", .data = &j7200_soc_data },
4411 	{ .family = "AM64X", .data = &am64_soc_data },
4412 	{ .family = "J721S2", .data = &j721e_soc_data},
4413 	{ .family = "AM62X", .data = &am64_soc_data },
4414 	{ .family = "AM62AX", .data = &am64_soc_data },
4415 	{ /* sentinel */ }
4416 };
4417 
4418 static int udma_get_mmrs(struct platform_device *pdev, struct udma_dev *ud)
4419 {
4420 	u32 cap2, cap3, cap4;
4421 	int i;
4422 
4423 	ud->mmrs[MMR_GCFG] = devm_platform_ioremap_resource_byname(pdev, mmr_names[MMR_GCFG]);
4424 	if (IS_ERR(ud->mmrs[MMR_GCFG]))
4425 		return PTR_ERR(ud->mmrs[MMR_GCFG]);
4426 
4427 	cap2 = udma_read(ud->mmrs[MMR_GCFG], 0x28);
4428 	cap3 = udma_read(ud->mmrs[MMR_GCFG], 0x2c);
4429 
4430 	switch (ud->match_data->type) {
4431 	case DMA_TYPE_UDMA:
4432 		ud->rflow_cnt = UDMA_CAP3_RFLOW_CNT(cap3);
4433 		ud->tchan_cnt = UDMA_CAP2_TCHAN_CNT(cap2);
4434 		ud->echan_cnt = UDMA_CAP2_ECHAN_CNT(cap2);
4435 		ud->rchan_cnt = UDMA_CAP2_RCHAN_CNT(cap2);
4436 		break;
4437 	case DMA_TYPE_BCDMA:
4438 		ud->bchan_cnt = BCDMA_CAP2_BCHAN_CNT(cap2);
4439 		ud->tchan_cnt = BCDMA_CAP2_TCHAN_CNT(cap2);
4440 		ud->rchan_cnt = BCDMA_CAP2_RCHAN_CNT(cap2);
4441 		ud->rflow_cnt = ud->rchan_cnt;
4442 		break;
4443 	case DMA_TYPE_PKTDMA:
4444 		cap4 = udma_read(ud->mmrs[MMR_GCFG], 0x30);
4445 		ud->tchan_cnt = UDMA_CAP2_TCHAN_CNT(cap2);
4446 		ud->rchan_cnt = UDMA_CAP2_RCHAN_CNT(cap2);
4447 		ud->rflow_cnt = UDMA_CAP3_RFLOW_CNT(cap3);
4448 		ud->tflow_cnt = PKTDMA_CAP4_TFLOW_CNT(cap4);
4449 		break;
4450 	default:
4451 		return -EINVAL;
4452 	}
4453 
4454 	for (i = 1; i < MMR_LAST; i++) {
4455 		if (i == MMR_BCHANRT && ud->bchan_cnt == 0)
4456 			continue;
4457 		if (i == MMR_TCHANRT && ud->tchan_cnt == 0)
4458 			continue;
4459 		if (i == MMR_RCHANRT && ud->rchan_cnt == 0)
4460 			continue;
4461 
4462 		ud->mmrs[i] = devm_platform_ioremap_resource_byname(pdev, mmr_names[i]);
4463 		if (IS_ERR(ud->mmrs[i]))
4464 			return PTR_ERR(ud->mmrs[i]);
4465 	}
4466 
4467 	return 0;
4468 }
4469 
4470 static void udma_mark_resource_ranges(struct udma_dev *ud, unsigned long *map,
4471 				      struct ti_sci_resource_desc *rm_desc,
4472 				      char *name)
4473 {
4474 	bitmap_clear(map, rm_desc->start, rm_desc->num);
4475 	bitmap_clear(map, rm_desc->start_sec, rm_desc->num_sec);
4476 	dev_dbg(ud->dev, "ti_sci resource range for %s: %d:%d | %d:%d\n", name,
4477 		rm_desc->start, rm_desc->num, rm_desc->start_sec,
4478 		rm_desc->num_sec);
4479 }
4480 
4481 static const char * const range_names[] = {
4482 	[RM_RANGE_BCHAN] = "ti,sci-rm-range-bchan",
4483 	[RM_RANGE_TCHAN] = "ti,sci-rm-range-tchan",
4484 	[RM_RANGE_RCHAN] = "ti,sci-rm-range-rchan",
4485 	[RM_RANGE_RFLOW] = "ti,sci-rm-range-rflow",
4486 	[RM_RANGE_TFLOW] = "ti,sci-rm-range-tflow",
4487 };
4488 
4489 static int udma_setup_resources(struct udma_dev *ud)
4490 {
4491 	int ret, i, j;
4492 	struct device *dev = ud->dev;
4493 	struct ti_sci_resource *rm_res, irq_res;
4494 	struct udma_tisci_rm *tisci_rm = &ud->tisci_rm;
4495 	u32 cap3;
4496 
4497 	/* Set up the throughput level start indexes */
4498 	cap3 = udma_read(ud->mmrs[MMR_GCFG], 0x2c);
4499 	if (of_device_is_compatible(dev->of_node,
4500 				    "ti,am654-navss-main-udmap")) {
4501 		ud->tchan_tpl.levels = 2;
4502 		ud->tchan_tpl.start_idx[0] = 8;
4503 	} else if (of_device_is_compatible(dev->of_node,
4504 					   "ti,am654-navss-mcu-udmap")) {
4505 		ud->tchan_tpl.levels = 2;
4506 		ud->tchan_tpl.start_idx[0] = 2;
4507 	} else if (UDMA_CAP3_UCHAN_CNT(cap3)) {
4508 		ud->tchan_tpl.levels = 3;
4509 		ud->tchan_tpl.start_idx[1] = UDMA_CAP3_UCHAN_CNT(cap3);
4510 		ud->tchan_tpl.start_idx[0] = UDMA_CAP3_HCHAN_CNT(cap3);
4511 	} else if (UDMA_CAP3_HCHAN_CNT(cap3)) {
4512 		ud->tchan_tpl.levels = 2;
4513 		ud->tchan_tpl.start_idx[0] = UDMA_CAP3_HCHAN_CNT(cap3);
4514 	} else {
4515 		ud->tchan_tpl.levels = 1;
4516 	}
4517 
4518 	ud->rchan_tpl.levels = ud->tchan_tpl.levels;
4519 	ud->rchan_tpl.start_idx[0] = ud->tchan_tpl.start_idx[0];
4520 	ud->rchan_tpl.start_idx[1] = ud->tchan_tpl.start_idx[1];
4521 
4522 	ud->tchan_map = devm_kmalloc_array(dev, BITS_TO_LONGS(ud->tchan_cnt),
4523 					   sizeof(unsigned long), GFP_KERNEL);
4524 	ud->tchans = devm_kcalloc(dev, ud->tchan_cnt, sizeof(*ud->tchans),
4525 				  GFP_KERNEL);
4526 	ud->rchan_map = devm_kmalloc_array(dev, BITS_TO_LONGS(ud->rchan_cnt),
4527 					   sizeof(unsigned long), GFP_KERNEL);
4528 	ud->rchans = devm_kcalloc(dev, ud->rchan_cnt, sizeof(*ud->rchans),
4529 				  GFP_KERNEL);
4530 	ud->rflow_gp_map = devm_kmalloc_array(dev, BITS_TO_LONGS(ud->rflow_cnt),
4531 					      sizeof(unsigned long),
4532 					      GFP_KERNEL);
4533 	ud->rflow_gp_map_allocated = devm_kcalloc(dev,
4534 						  BITS_TO_LONGS(ud->rflow_cnt),
4535 						  sizeof(unsigned long),
4536 						  GFP_KERNEL);
4537 	ud->rflow_in_use = devm_kcalloc(dev, BITS_TO_LONGS(ud->rflow_cnt),
4538 					sizeof(unsigned long),
4539 					GFP_KERNEL);
4540 	ud->rflows = devm_kcalloc(dev, ud->rflow_cnt, sizeof(*ud->rflows),
4541 				  GFP_KERNEL);
4542 
4543 	if (!ud->tchan_map || !ud->rchan_map || !ud->rflow_gp_map ||
4544 	    !ud->rflow_gp_map_allocated || !ud->tchans || !ud->rchans ||
4545 	    !ud->rflows || !ud->rflow_in_use)
4546 		return -ENOMEM;
4547 
4548 	/*
4549 	 * RX flows with the same Ids as RX channels are reserved to be used
4550 	 * as default flows if remote HW can't generate flow_ids. Those
4551 	 * RX flows can be requested only explicitly by id.
4552 	 */
4553 	bitmap_set(ud->rflow_gp_map_allocated, 0, ud->rchan_cnt);
4554 
4555 	/* by default no GP rflows are assigned to Linux */
4556 	bitmap_set(ud->rflow_gp_map, 0, ud->rflow_cnt);
4557 
4558 	/* Get resource ranges from tisci */
4559 	for (i = 0; i < RM_RANGE_LAST; i++) {
4560 		if (i == RM_RANGE_BCHAN || i == RM_RANGE_TFLOW)
4561 			continue;
4562 
4563 		tisci_rm->rm_ranges[i] =
4564 			devm_ti_sci_get_of_resource(tisci_rm->tisci, dev,
4565 						    tisci_rm->tisci_dev_id,
4566 						    (char *)range_names[i]);
4567 	}
4568 
4569 	/* tchan ranges */
4570 	rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN];
4571 	if (IS_ERR(rm_res)) {
4572 		bitmap_zero(ud->tchan_map, ud->tchan_cnt);
4573 		irq_res.sets = 1;
4574 	} else {
4575 		bitmap_fill(ud->tchan_map, ud->tchan_cnt);
4576 		for (i = 0; i < rm_res->sets; i++)
4577 			udma_mark_resource_ranges(ud, ud->tchan_map,
4578 						  &rm_res->desc[i], "tchan");
4579 		irq_res.sets = rm_res->sets;
4580 	}
4581 
4582 	/* rchan and matching default flow ranges */
4583 	rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN];
4584 	if (IS_ERR(rm_res)) {
4585 		bitmap_zero(ud->rchan_map, ud->rchan_cnt);
4586 		irq_res.sets++;
4587 	} else {
4588 		bitmap_fill(ud->rchan_map, ud->rchan_cnt);
4589 		for (i = 0; i < rm_res->sets; i++)
4590 			udma_mark_resource_ranges(ud, ud->rchan_map,
4591 						  &rm_res->desc[i], "rchan");
4592 		irq_res.sets += rm_res->sets;
4593 	}
4594 
4595 	irq_res.desc = kcalloc(irq_res.sets, sizeof(*irq_res.desc), GFP_KERNEL);
4596 	if (!irq_res.desc)
4597 		return -ENOMEM;
4598 	rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN];
4599 	if (IS_ERR(rm_res)) {
4600 		irq_res.desc[0].start = 0;
4601 		irq_res.desc[0].num = ud->tchan_cnt;
4602 		i = 1;
4603 	} else {
4604 		for (i = 0; i < rm_res->sets; i++) {
4605 			irq_res.desc[i].start = rm_res->desc[i].start;
4606 			irq_res.desc[i].num = rm_res->desc[i].num;
4607 			irq_res.desc[i].start_sec = rm_res->desc[i].start_sec;
4608 			irq_res.desc[i].num_sec = rm_res->desc[i].num_sec;
4609 		}
4610 	}
4611 	rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN];
4612 	if (IS_ERR(rm_res)) {
4613 		irq_res.desc[i].start = 0;
4614 		irq_res.desc[i].num = ud->rchan_cnt;
4615 	} else {
4616 		for (j = 0; j < rm_res->sets; j++, i++) {
4617 			if (rm_res->desc[j].num) {
4618 				irq_res.desc[i].start = rm_res->desc[j].start +
4619 						ud->soc_data->oes.udma_rchan;
4620 				irq_res.desc[i].num = rm_res->desc[j].num;
4621 			}
4622 			if (rm_res->desc[j].num_sec) {
4623 				irq_res.desc[i].start_sec = rm_res->desc[j].start_sec +
4624 						ud->soc_data->oes.udma_rchan;
4625 				irq_res.desc[i].num_sec = rm_res->desc[j].num_sec;
4626 			}
4627 		}
4628 	}
4629 	ret = ti_sci_inta_msi_domain_alloc_irqs(ud->dev, &irq_res);
4630 	kfree(irq_res.desc);
4631 	if (ret) {
4632 		dev_err(ud->dev, "Failed to allocate MSI interrupts\n");
4633 		return ret;
4634 	}
4635 
4636 	/* GP rflow ranges */
4637 	rm_res = tisci_rm->rm_ranges[RM_RANGE_RFLOW];
4638 	if (IS_ERR(rm_res)) {
4639 		/* all gp flows are assigned exclusively to Linux */
4640 		bitmap_clear(ud->rflow_gp_map, ud->rchan_cnt,
4641 			     ud->rflow_cnt - ud->rchan_cnt);
4642 	} else {
4643 		for (i = 0; i < rm_res->sets; i++)
4644 			udma_mark_resource_ranges(ud, ud->rflow_gp_map,
4645 						  &rm_res->desc[i], "gp-rflow");
4646 	}
4647 
4648 	return 0;
4649 }
4650 
4651 static int bcdma_setup_resources(struct udma_dev *ud)
4652 {
4653 	int ret, i, j;
4654 	struct device *dev = ud->dev;
4655 	struct ti_sci_resource *rm_res, irq_res;
4656 	struct udma_tisci_rm *tisci_rm = &ud->tisci_rm;
4657 	const struct udma_oes_offsets *oes = &ud->soc_data->oes;
4658 	u32 cap;
4659 
4660 	/* Set up the throughput level start indexes */
4661 	cap = udma_read(ud->mmrs[MMR_GCFG], 0x2c);
4662 	if (BCDMA_CAP3_UBCHAN_CNT(cap)) {
4663 		ud->bchan_tpl.levels = 3;
4664 		ud->bchan_tpl.start_idx[1] = BCDMA_CAP3_UBCHAN_CNT(cap);
4665 		ud->bchan_tpl.start_idx[0] = BCDMA_CAP3_HBCHAN_CNT(cap);
4666 	} else if (BCDMA_CAP3_HBCHAN_CNT(cap)) {
4667 		ud->bchan_tpl.levels = 2;
4668 		ud->bchan_tpl.start_idx[0] = BCDMA_CAP3_HBCHAN_CNT(cap);
4669 	} else {
4670 		ud->bchan_tpl.levels = 1;
4671 	}
4672 
4673 	cap = udma_read(ud->mmrs[MMR_GCFG], 0x30);
4674 	if (BCDMA_CAP4_URCHAN_CNT(cap)) {
4675 		ud->rchan_tpl.levels = 3;
4676 		ud->rchan_tpl.start_idx[1] = BCDMA_CAP4_URCHAN_CNT(cap);
4677 		ud->rchan_tpl.start_idx[0] = BCDMA_CAP4_HRCHAN_CNT(cap);
4678 	} else if (BCDMA_CAP4_HRCHAN_CNT(cap)) {
4679 		ud->rchan_tpl.levels = 2;
4680 		ud->rchan_tpl.start_idx[0] = BCDMA_CAP4_HRCHAN_CNT(cap);
4681 	} else {
4682 		ud->rchan_tpl.levels = 1;
4683 	}
4684 
4685 	if (BCDMA_CAP4_UTCHAN_CNT(cap)) {
4686 		ud->tchan_tpl.levels = 3;
4687 		ud->tchan_tpl.start_idx[1] = BCDMA_CAP4_UTCHAN_CNT(cap);
4688 		ud->tchan_tpl.start_idx[0] = BCDMA_CAP4_HTCHAN_CNT(cap);
4689 	} else if (BCDMA_CAP4_HTCHAN_CNT(cap)) {
4690 		ud->tchan_tpl.levels = 2;
4691 		ud->tchan_tpl.start_idx[0] = BCDMA_CAP4_HTCHAN_CNT(cap);
4692 	} else {
4693 		ud->tchan_tpl.levels = 1;
4694 	}
4695 
4696 	ud->bchan_map = devm_kmalloc_array(dev, BITS_TO_LONGS(ud->bchan_cnt),
4697 					   sizeof(unsigned long), GFP_KERNEL);
4698 	ud->bchans = devm_kcalloc(dev, ud->bchan_cnt, sizeof(*ud->bchans),
4699 				  GFP_KERNEL);
4700 	ud->tchan_map = devm_kmalloc_array(dev, BITS_TO_LONGS(ud->tchan_cnt),
4701 					   sizeof(unsigned long), GFP_KERNEL);
4702 	ud->tchans = devm_kcalloc(dev, ud->tchan_cnt, sizeof(*ud->tchans),
4703 				  GFP_KERNEL);
4704 	ud->rchan_map = devm_kmalloc_array(dev, BITS_TO_LONGS(ud->rchan_cnt),
4705 					   sizeof(unsigned long), GFP_KERNEL);
4706 	ud->rchans = devm_kcalloc(dev, ud->rchan_cnt, sizeof(*ud->rchans),
4707 				  GFP_KERNEL);
4708 	/* BCDMA do not really have flows, but the driver expect it */
4709 	ud->rflow_in_use = devm_kcalloc(dev, BITS_TO_LONGS(ud->rchan_cnt),
4710 					sizeof(unsigned long),
4711 					GFP_KERNEL);
4712 	ud->rflows = devm_kcalloc(dev, ud->rchan_cnt, sizeof(*ud->rflows),
4713 				  GFP_KERNEL);
4714 
4715 	if (!ud->bchan_map || !ud->tchan_map || !ud->rchan_map ||
4716 	    !ud->rflow_in_use || !ud->bchans || !ud->tchans || !ud->rchans ||
4717 	    !ud->rflows)
4718 		return -ENOMEM;
4719 
4720 	/* Get resource ranges from tisci */
4721 	for (i = 0; i < RM_RANGE_LAST; i++) {
4722 		if (i == RM_RANGE_RFLOW || i == RM_RANGE_TFLOW)
4723 			continue;
4724 		if (i == RM_RANGE_BCHAN && ud->bchan_cnt == 0)
4725 			continue;
4726 		if (i == RM_RANGE_TCHAN && ud->tchan_cnt == 0)
4727 			continue;
4728 		if (i == RM_RANGE_RCHAN && ud->rchan_cnt == 0)
4729 			continue;
4730 
4731 		tisci_rm->rm_ranges[i] =
4732 			devm_ti_sci_get_of_resource(tisci_rm->tisci, dev,
4733 						    tisci_rm->tisci_dev_id,
4734 						    (char *)range_names[i]);
4735 	}
4736 
4737 	irq_res.sets = 0;
4738 
4739 	/* bchan ranges */
4740 	if (ud->bchan_cnt) {
4741 		rm_res = tisci_rm->rm_ranges[RM_RANGE_BCHAN];
4742 		if (IS_ERR(rm_res)) {
4743 			bitmap_zero(ud->bchan_map, ud->bchan_cnt);
4744 			irq_res.sets++;
4745 		} else {
4746 			bitmap_fill(ud->bchan_map, ud->bchan_cnt);
4747 			for (i = 0; i < rm_res->sets; i++)
4748 				udma_mark_resource_ranges(ud, ud->bchan_map,
4749 							  &rm_res->desc[i],
4750 							  "bchan");
4751 			irq_res.sets += rm_res->sets;
4752 		}
4753 	}
4754 
4755 	/* tchan ranges */
4756 	if (ud->tchan_cnt) {
4757 		rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN];
4758 		if (IS_ERR(rm_res)) {
4759 			bitmap_zero(ud->tchan_map, ud->tchan_cnt);
4760 			irq_res.sets += 2;
4761 		} else {
4762 			bitmap_fill(ud->tchan_map, ud->tchan_cnt);
4763 			for (i = 0; i < rm_res->sets; i++)
4764 				udma_mark_resource_ranges(ud, ud->tchan_map,
4765 							  &rm_res->desc[i],
4766 							  "tchan");
4767 			irq_res.sets += rm_res->sets * 2;
4768 		}
4769 	}
4770 
4771 	/* rchan ranges */
4772 	if (ud->rchan_cnt) {
4773 		rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN];
4774 		if (IS_ERR(rm_res)) {
4775 			bitmap_zero(ud->rchan_map, ud->rchan_cnt);
4776 			irq_res.sets += 2;
4777 		} else {
4778 			bitmap_fill(ud->rchan_map, ud->rchan_cnt);
4779 			for (i = 0; i < rm_res->sets; i++)
4780 				udma_mark_resource_ranges(ud, ud->rchan_map,
4781 							  &rm_res->desc[i],
4782 							  "rchan");
4783 			irq_res.sets += rm_res->sets * 2;
4784 		}
4785 	}
4786 
4787 	irq_res.desc = kcalloc(irq_res.sets, sizeof(*irq_res.desc), GFP_KERNEL);
4788 	if (!irq_res.desc)
4789 		return -ENOMEM;
4790 	if (ud->bchan_cnt) {
4791 		rm_res = tisci_rm->rm_ranges[RM_RANGE_BCHAN];
4792 		if (IS_ERR(rm_res)) {
4793 			irq_res.desc[0].start = oes->bcdma_bchan_ring;
4794 			irq_res.desc[0].num = ud->bchan_cnt;
4795 			i = 1;
4796 		} else {
4797 			for (i = 0; i < rm_res->sets; i++) {
4798 				irq_res.desc[i].start = rm_res->desc[i].start +
4799 							oes->bcdma_bchan_ring;
4800 				irq_res.desc[i].num = rm_res->desc[i].num;
4801 			}
4802 		}
4803 	} else {
4804 		i = 0;
4805 	}
4806 
4807 	if (ud->tchan_cnt) {
4808 		rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN];
4809 		if (IS_ERR(rm_res)) {
4810 			irq_res.desc[i].start = oes->bcdma_tchan_data;
4811 			irq_res.desc[i].num = ud->tchan_cnt;
4812 			irq_res.desc[i + 1].start = oes->bcdma_tchan_ring;
4813 			irq_res.desc[i + 1].num = ud->tchan_cnt;
4814 			i += 2;
4815 		} else {
4816 			for (j = 0; j < rm_res->sets; j++, i += 2) {
4817 				irq_res.desc[i].start = rm_res->desc[j].start +
4818 							oes->bcdma_tchan_data;
4819 				irq_res.desc[i].num = rm_res->desc[j].num;
4820 
4821 				irq_res.desc[i + 1].start = rm_res->desc[j].start +
4822 							oes->bcdma_tchan_ring;
4823 				irq_res.desc[i + 1].num = rm_res->desc[j].num;
4824 			}
4825 		}
4826 	}
4827 	if (ud->rchan_cnt) {
4828 		rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN];
4829 		if (IS_ERR(rm_res)) {
4830 			irq_res.desc[i].start = oes->bcdma_rchan_data;
4831 			irq_res.desc[i].num = ud->rchan_cnt;
4832 			irq_res.desc[i + 1].start = oes->bcdma_rchan_ring;
4833 			irq_res.desc[i + 1].num = ud->rchan_cnt;
4834 			i += 2;
4835 		} else {
4836 			for (j = 0; j < rm_res->sets; j++, i += 2) {
4837 				irq_res.desc[i].start = rm_res->desc[j].start +
4838 							oes->bcdma_rchan_data;
4839 				irq_res.desc[i].num = rm_res->desc[j].num;
4840 
4841 				irq_res.desc[i + 1].start = rm_res->desc[j].start +
4842 							oes->bcdma_rchan_ring;
4843 				irq_res.desc[i + 1].num = rm_res->desc[j].num;
4844 			}
4845 		}
4846 	}
4847 
4848 	ret = ti_sci_inta_msi_domain_alloc_irqs(ud->dev, &irq_res);
4849 	kfree(irq_res.desc);
4850 	if (ret) {
4851 		dev_err(ud->dev, "Failed to allocate MSI interrupts\n");
4852 		return ret;
4853 	}
4854 
4855 	return 0;
4856 }
4857 
4858 static int pktdma_setup_resources(struct udma_dev *ud)
4859 {
4860 	int ret, i, j;
4861 	struct device *dev = ud->dev;
4862 	struct ti_sci_resource *rm_res, irq_res;
4863 	struct udma_tisci_rm *tisci_rm = &ud->tisci_rm;
4864 	const struct udma_oes_offsets *oes = &ud->soc_data->oes;
4865 	u32 cap3;
4866 
4867 	/* Set up the throughput level start indexes */
4868 	cap3 = udma_read(ud->mmrs[MMR_GCFG], 0x2c);
4869 	if (UDMA_CAP3_UCHAN_CNT(cap3)) {
4870 		ud->tchan_tpl.levels = 3;
4871 		ud->tchan_tpl.start_idx[1] = UDMA_CAP3_UCHAN_CNT(cap3);
4872 		ud->tchan_tpl.start_idx[0] = UDMA_CAP3_HCHAN_CNT(cap3);
4873 	} else if (UDMA_CAP3_HCHAN_CNT(cap3)) {
4874 		ud->tchan_tpl.levels = 2;
4875 		ud->tchan_tpl.start_idx[0] = UDMA_CAP3_HCHAN_CNT(cap3);
4876 	} else {
4877 		ud->tchan_tpl.levels = 1;
4878 	}
4879 
4880 	ud->rchan_tpl.levels = ud->tchan_tpl.levels;
4881 	ud->rchan_tpl.start_idx[0] = ud->tchan_tpl.start_idx[0];
4882 	ud->rchan_tpl.start_idx[1] = ud->tchan_tpl.start_idx[1];
4883 
4884 	ud->tchan_map = devm_kmalloc_array(dev, BITS_TO_LONGS(ud->tchan_cnt),
4885 					   sizeof(unsigned long), GFP_KERNEL);
4886 	ud->tchans = devm_kcalloc(dev, ud->tchan_cnt, sizeof(*ud->tchans),
4887 				  GFP_KERNEL);
4888 	ud->rchan_map = devm_kmalloc_array(dev, BITS_TO_LONGS(ud->rchan_cnt),
4889 					   sizeof(unsigned long), GFP_KERNEL);
4890 	ud->rchans = devm_kcalloc(dev, ud->rchan_cnt, sizeof(*ud->rchans),
4891 				  GFP_KERNEL);
4892 	ud->rflow_in_use = devm_kcalloc(dev, BITS_TO_LONGS(ud->rflow_cnt),
4893 					sizeof(unsigned long),
4894 					GFP_KERNEL);
4895 	ud->rflows = devm_kcalloc(dev, ud->rflow_cnt, sizeof(*ud->rflows),
4896 				  GFP_KERNEL);
4897 	ud->tflow_map = devm_kmalloc_array(dev, BITS_TO_LONGS(ud->tflow_cnt),
4898 					   sizeof(unsigned long), GFP_KERNEL);
4899 
4900 	if (!ud->tchan_map || !ud->rchan_map || !ud->tflow_map || !ud->tchans ||
4901 	    !ud->rchans || !ud->rflows || !ud->rflow_in_use)
4902 		return -ENOMEM;
4903 
4904 	/* Get resource ranges from tisci */
4905 	for (i = 0; i < RM_RANGE_LAST; i++) {
4906 		if (i == RM_RANGE_BCHAN)
4907 			continue;
4908 
4909 		tisci_rm->rm_ranges[i] =
4910 			devm_ti_sci_get_of_resource(tisci_rm->tisci, dev,
4911 						    tisci_rm->tisci_dev_id,
4912 						    (char *)range_names[i]);
4913 	}
4914 
4915 	/* tchan ranges */
4916 	rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN];
4917 	if (IS_ERR(rm_res)) {
4918 		bitmap_zero(ud->tchan_map, ud->tchan_cnt);
4919 	} else {
4920 		bitmap_fill(ud->tchan_map, ud->tchan_cnt);
4921 		for (i = 0; i < rm_res->sets; i++)
4922 			udma_mark_resource_ranges(ud, ud->tchan_map,
4923 						  &rm_res->desc[i], "tchan");
4924 	}
4925 
4926 	/* rchan ranges */
4927 	rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN];
4928 	if (IS_ERR(rm_res)) {
4929 		bitmap_zero(ud->rchan_map, ud->rchan_cnt);
4930 	} else {
4931 		bitmap_fill(ud->rchan_map, ud->rchan_cnt);
4932 		for (i = 0; i < rm_res->sets; i++)
4933 			udma_mark_resource_ranges(ud, ud->rchan_map,
4934 						  &rm_res->desc[i], "rchan");
4935 	}
4936 
4937 	/* rflow ranges */
4938 	rm_res = tisci_rm->rm_ranges[RM_RANGE_RFLOW];
4939 	if (IS_ERR(rm_res)) {
4940 		/* all rflows are assigned exclusively to Linux */
4941 		bitmap_zero(ud->rflow_in_use, ud->rflow_cnt);
4942 		irq_res.sets = 1;
4943 	} else {
4944 		bitmap_fill(ud->rflow_in_use, ud->rflow_cnt);
4945 		for (i = 0; i < rm_res->sets; i++)
4946 			udma_mark_resource_ranges(ud, ud->rflow_in_use,
4947 						  &rm_res->desc[i], "rflow");
4948 		irq_res.sets = rm_res->sets;
4949 	}
4950 
4951 	/* tflow ranges */
4952 	rm_res = tisci_rm->rm_ranges[RM_RANGE_TFLOW];
4953 	if (IS_ERR(rm_res)) {
4954 		/* all tflows are assigned exclusively to Linux */
4955 		bitmap_zero(ud->tflow_map, ud->tflow_cnt);
4956 		irq_res.sets++;
4957 	} else {
4958 		bitmap_fill(ud->tflow_map, ud->tflow_cnt);
4959 		for (i = 0; i < rm_res->sets; i++)
4960 			udma_mark_resource_ranges(ud, ud->tflow_map,
4961 						  &rm_res->desc[i], "tflow");
4962 		irq_res.sets += rm_res->sets;
4963 	}
4964 
4965 	irq_res.desc = kcalloc(irq_res.sets, sizeof(*irq_res.desc), GFP_KERNEL);
4966 	if (!irq_res.desc)
4967 		return -ENOMEM;
4968 	rm_res = tisci_rm->rm_ranges[RM_RANGE_TFLOW];
4969 	if (IS_ERR(rm_res)) {
4970 		irq_res.desc[0].start = oes->pktdma_tchan_flow;
4971 		irq_res.desc[0].num = ud->tflow_cnt;
4972 		i = 1;
4973 	} else {
4974 		for (i = 0; i < rm_res->sets; i++) {
4975 			irq_res.desc[i].start = rm_res->desc[i].start +
4976 						oes->pktdma_tchan_flow;
4977 			irq_res.desc[i].num = rm_res->desc[i].num;
4978 		}
4979 	}
4980 	rm_res = tisci_rm->rm_ranges[RM_RANGE_RFLOW];
4981 	if (IS_ERR(rm_res)) {
4982 		irq_res.desc[i].start = oes->pktdma_rchan_flow;
4983 		irq_res.desc[i].num = ud->rflow_cnt;
4984 	} else {
4985 		for (j = 0; j < rm_res->sets; j++, i++) {
4986 			irq_res.desc[i].start = rm_res->desc[j].start +
4987 						oes->pktdma_rchan_flow;
4988 			irq_res.desc[i].num = rm_res->desc[j].num;
4989 		}
4990 	}
4991 	ret = ti_sci_inta_msi_domain_alloc_irqs(ud->dev, &irq_res);
4992 	kfree(irq_res.desc);
4993 	if (ret) {
4994 		dev_err(ud->dev, "Failed to allocate MSI interrupts\n");
4995 		return ret;
4996 	}
4997 
4998 	return 0;
4999 }
5000 
5001 static int setup_resources(struct udma_dev *ud)
5002 {
5003 	struct device *dev = ud->dev;
5004 	int ch_count, ret;
5005 
5006 	switch (ud->match_data->type) {
5007 	case DMA_TYPE_UDMA:
5008 		ret = udma_setup_resources(ud);
5009 		break;
5010 	case DMA_TYPE_BCDMA:
5011 		ret = bcdma_setup_resources(ud);
5012 		break;
5013 	case DMA_TYPE_PKTDMA:
5014 		ret = pktdma_setup_resources(ud);
5015 		break;
5016 	default:
5017 		return -EINVAL;
5018 	}
5019 
5020 	if (ret)
5021 		return ret;
5022 
5023 	ch_count  = ud->bchan_cnt + ud->tchan_cnt + ud->rchan_cnt;
5024 	if (ud->bchan_cnt)
5025 		ch_count -= bitmap_weight(ud->bchan_map, ud->bchan_cnt);
5026 	ch_count -= bitmap_weight(ud->tchan_map, ud->tchan_cnt);
5027 	ch_count -= bitmap_weight(ud->rchan_map, ud->rchan_cnt);
5028 	if (!ch_count)
5029 		return -ENODEV;
5030 
5031 	ud->channels = devm_kcalloc(dev, ch_count, sizeof(*ud->channels),
5032 				    GFP_KERNEL);
5033 	if (!ud->channels)
5034 		return -ENOMEM;
5035 
5036 	switch (ud->match_data->type) {
5037 	case DMA_TYPE_UDMA:
5038 		dev_info(dev,
5039 			 "Channels: %d (tchan: %u, rchan: %u, gp-rflow: %u)\n",
5040 			 ch_count,
5041 			 ud->tchan_cnt - bitmap_weight(ud->tchan_map,
5042 						       ud->tchan_cnt),
5043 			 ud->rchan_cnt - bitmap_weight(ud->rchan_map,
5044 						       ud->rchan_cnt),
5045 			 ud->rflow_cnt - bitmap_weight(ud->rflow_gp_map,
5046 						       ud->rflow_cnt));
5047 		break;
5048 	case DMA_TYPE_BCDMA:
5049 		dev_info(dev,
5050 			 "Channels: %d (bchan: %u, tchan: %u, rchan: %u)\n",
5051 			 ch_count,
5052 			 ud->bchan_cnt - bitmap_weight(ud->bchan_map,
5053 						       ud->bchan_cnt),
5054 			 ud->tchan_cnt - bitmap_weight(ud->tchan_map,
5055 						       ud->tchan_cnt),
5056 			 ud->rchan_cnt - bitmap_weight(ud->rchan_map,
5057 						       ud->rchan_cnt));
5058 		break;
5059 	case DMA_TYPE_PKTDMA:
5060 		dev_info(dev,
5061 			 "Channels: %d (tchan: %u, rchan: %u)\n",
5062 			 ch_count,
5063 			 ud->tchan_cnt - bitmap_weight(ud->tchan_map,
5064 						       ud->tchan_cnt),
5065 			 ud->rchan_cnt - bitmap_weight(ud->rchan_map,
5066 						       ud->rchan_cnt));
5067 		break;
5068 	default:
5069 		break;
5070 	}
5071 
5072 	return ch_count;
5073 }
5074 
5075 static int udma_setup_rx_flush(struct udma_dev *ud)
5076 {
5077 	struct udma_rx_flush *rx_flush = &ud->rx_flush;
5078 	struct cppi5_desc_hdr_t *tr_desc;
5079 	struct cppi5_tr_type1_t *tr_req;
5080 	struct cppi5_host_desc_t *desc;
5081 	struct device *dev = ud->dev;
5082 	struct udma_hwdesc *hwdesc;
5083 	size_t tr_size;
5084 
5085 	/* Allocate 1K buffer for discarded data on RX channel teardown */
5086 	rx_flush->buffer_size = SZ_1K;
5087 	rx_flush->buffer_vaddr = devm_kzalloc(dev, rx_flush->buffer_size,
5088 					      GFP_KERNEL);
5089 	if (!rx_flush->buffer_vaddr)
5090 		return -ENOMEM;
5091 
5092 	rx_flush->buffer_paddr = dma_map_single(dev, rx_flush->buffer_vaddr,
5093 						rx_flush->buffer_size,
5094 						DMA_TO_DEVICE);
5095 	if (dma_mapping_error(dev, rx_flush->buffer_paddr))
5096 		return -ENOMEM;
5097 
5098 	/* Set up descriptor to be used for TR mode */
5099 	hwdesc = &rx_flush->hwdescs[0];
5100 	tr_size = sizeof(struct cppi5_tr_type1_t);
5101 	hwdesc->cppi5_desc_size = cppi5_trdesc_calc_size(tr_size, 1);
5102 	hwdesc->cppi5_desc_size = ALIGN(hwdesc->cppi5_desc_size,
5103 					ud->desc_align);
5104 
5105 	hwdesc->cppi5_desc_vaddr = devm_kzalloc(dev, hwdesc->cppi5_desc_size,
5106 						GFP_KERNEL);
5107 	if (!hwdesc->cppi5_desc_vaddr)
5108 		return -ENOMEM;
5109 
5110 	hwdesc->cppi5_desc_paddr = dma_map_single(dev, hwdesc->cppi5_desc_vaddr,
5111 						  hwdesc->cppi5_desc_size,
5112 						  DMA_TO_DEVICE);
5113 	if (dma_mapping_error(dev, hwdesc->cppi5_desc_paddr))
5114 		return -ENOMEM;
5115 
5116 	/* Start of the TR req records */
5117 	hwdesc->tr_req_base = hwdesc->cppi5_desc_vaddr + tr_size;
5118 	/* Start address of the TR response array */
5119 	hwdesc->tr_resp_base = hwdesc->tr_req_base + tr_size;
5120 
5121 	tr_desc = hwdesc->cppi5_desc_vaddr;
5122 	cppi5_trdesc_init(tr_desc, 1, tr_size, 0, 0);
5123 	cppi5_desc_set_pktids(tr_desc, 0, CPPI5_INFO1_DESC_FLOWID_DEFAULT);
5124 	cppi5_desc_set_retpolicy(tr_desc, 0, 0);
5125 
5126 	tr_req = hwdesc->tr_req_base;
5127 	cppi5_tr_init(&tr_req->flags, CPPI5_TR_TYPE1, false, false,
5128 		      CPPI5_TR_EVENT_SIZE_COMPLETION, 0);
5129 	cppi5_tr_csf_set(&tr_req->flags, CPPI5_TR_CSF_SUPR_EVT);
5130 
5131 	tr_req->addr = rx_flush->buffer_paddr;
5132 	tr_req->icnt0 = rx_flush->buffer_size;
5133 	tr_req->icnt1 = 1;
5134 
5135 	dma_sync_single_for_device(dev, hwdesc->cppi5_desc_paddr,
5136 				   hwdesc->cppi5_desc_size, DMA_TO_DEVICE);
5137 
5138 	/* Set up descriptor to be used for packet mode */
5139 	hwdesc = &rx_flush->hwdescs[1];
5140 	hwdesc->cppi5_desc_size = ALIGN(sizeof(struct cppi5_host_desc_t) +
5141 					CPPI5_INFO0_HDESC_EPIB_SIZE +
5142 					CPPI5_INFO0_HDESC_PSDATA_MAX_SIZE,
5143 					ud->desc_align);
5144 
5145 	hwdesc->cppi5_desc_vaddr = devm_kzalloc(dev, hwdesc->cppi5_desc_size,
5146 						GFP_KERNEL);
5147 	if (!hwdesc->cppi5_desc_vaddr)
5148 		return -ENOMEM;
5149 
5150 	hwdesc->cppi5_desc_paddr = dma_map_single(dev, hwdesc->cppi5_desc_vaddr,
5151 						  hwdesc->cppi5_desc_size,
5152 						  DMA_TO_DEVICE);
5153 	if (dma_mapping_error(dev, hwdesc->cppi5_desc_paddr))
5154 		return -ENOMEM;
5155 
5156 	desc = hwdesc->cppi5_desc_vaddr;
5157 	cppi5_hdesc_init(desc, 0, 0);
5158 	cppi5_desc_set_pktids(&desc->hdr, 0, CPPI5_INFO1_DESC_FLOWID_DEFAULT);
5159 	cppi5_desc_set_retpolicy(&desc->hdr, 0, 0);
5160 
5161 	cppi5_hdesc_attach_buf(desc,
5162 			       rx_flush->buffer_paddr, rx_flush->buffer_size,
5163 			       rx_flush->buffer_paddr, rx_flush->buffer_size);
5164 
5165 	dma_sync_single_for_device(dev, hwdesc->cppi5_desc_paddr,
5166 				   hwdesc->cppi5_desc_size, DMA_TO_DEVICE);
5167 	return 0;
5168 }
5169 
5170 #ifdef CONFIG_DEBUG_FS
5171 static void udma_dbg_summary_show_chan(struct seq_file *s,
5172 				       struct dma_chan *chan)
5173 {
5174 	struct udma_chan *uc = to_udma_chan(chan);
5175 	struct udma_chan_config *ucc = &uc->config;
5176 
5177 	seq_printf(s, " %-13s| %s", dma_chan_name(chan),
5178 		   chan->dbg_client_name ?: "in-use");
5179 	if (ucc->tr_trigger_type)
5180 		seq_puts(s, " (triggered, ");
5181 	else
5182 		seq_printf(s, " (%s, ",
5183 			   dmaengine_get_direction_text(uc->config.dir));
5184 
5185 	switch (uc->config.dir) {
5186 	case DMA_MEM_TO_MEM:
5187 		if (uc->ud->match_data->type == DMA_TYPE_BCDMA) {
5188 			seq_printf(s, "bchan%d)\n", uc->bchan->id);
5189 			return;
5190 		}
5191 
5192 		seq_printf(s, "chan%d pair [0x%04x -> 0x%04x], ", uc->tchan->id,
5193 			   ucc->src_thread, ucc->dst_thread);
5194 		break;
5195 	case DMA_DEV_TO_MEM:
5196 		seq_printf(s, "rchan%d [0x%04x -> 0x%04x], ", uc->rchan->id,
5197 			   ucc->src_thread, ucc->dst_thread);
5198 		if (uc->ud->match_data->type == DMA_TYPE_PKTDMA)
5199 			seq_printf(s, "rflow%d, ", uc->rflow->id);
5200 		break;
5201 	case DMA_MEM_TO_DEV:
5202 		seq_printf(s, "tchan%d [0x%04x -> 0x%04x], ", uc->tchan->id,
5203 			   ucc->src_thread, ucc->dst_thread);
5204 		if (uc->ud->match_data->type == DMA_TYPE_PKTDMA)
5205 			seq_printf(s, "tflow%d, ", uc->tchan->tflow_id);
5206 		break;
5207 	default:
5208 		seq_printf(s, ")\n");
5209 		return;
5210 	}
5211 
5212 	if (ucc->ep_type == PSIL_EP_NATIVE) {
5213 		seq_printf(s, "PSI-L Native");
5214 		if (ucc->metadata_size) {
5215 			seq_printf(s, "[%s", ucc->needs_epib ? " EPIB" : "");
5216 			if (ucc->psd_size)
5217 				seq_printf(s, " PSDsize:%u", ucc->psd_size);
5218 			seq_printf(s, " ]");
5219 		}
5220 	} else {
5221 		seq_printf(s, "PDMA");
5222 		if (ucc->enable_acc32 || ucc->enable_burst)
5223 			seq_printf(s, "[%s%s ]",
5224 				   ucc->enable_acc32 ? " ACC32" : "",
5225 				   ucc->enable_burst ? " BURST" : "");
5226 	}
5227 
5228 	seq_printf(s, ", %s)\n", ucc->pkt_mode ? "Packet mode" : "TR mode");
5229 }
5230 
5231 static void udma_dbg_summary_show(struct seq_file *s,
5232 				  struct dma_device *dma_dev)
5233 {
5234 	struct dma_chan *chan;
5235 
5236 	list_for_each_entry(chan, &dma_dev->channels, device_node) {
5237 		if (chan->client_count)
5238 			udma_dbg_summary_show_chan(s, chan);
5239 	}
5240 }
5241 #endif /* CONFIG_DEBUG_FS */
5242 
5243 static enum dmaengine_alignment udma_get_copy_align(struct udma_dev *ud)
5244 {
5245 	const struct udma_match_data *match_data = ud->match_data;
5246 	u8 tpl;
5247 
5248 	if (!match_data->enable_memcpy_support)
5249 		return DMAENGINE_ALIGN_8_BYTES;
5250 
5251 	/* Get the highest TPL level the device supports for memcpy */
5252 	if (ud->bchan_cnt)
5253 		tpl = udma_get_chan_tpl_index(&ud->bchan_tpl, 0);
5254 	else if (ud->tchan_cnt)
5255 		tpl = udma_get_chan_tpl_index(&ud->tchan_tpl, 0);
5256 	else
5257 		return DMAENGINE_ALIGN_8_BYTES;
5258 
5259 	switch (match_data->burst_size[tpl]) {
5260 	case TI_SCI_RM_UDMAP_CHAN_BURST_SIZE_256_BYTES:
5261 		return DMAENGINE_ALIGN_256_BYTES;
5262 	case TI_SCI_RM_UDMAP_CHAN_BURST_SIZE_128_BYTES:
5263 		return DMAENGINE_ALIGN_128_BYTES;
5264 	case TI_SCI_RM_UDMAP_CHAN_BURST_SIZE_64_BYTES:
5265 	fallthrough;
5266 	default:
5267 		return DMAENGINE_ALIGN_64_BYTES;
5268 	}
5269 }
5270 
5271 #define TI_UDMAC_BUSWIDTHS	(BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | \
5272 				 BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | \
5273 				 BIT(DMA_SLAVE_BUSWIDTH_3_BYTES) | \
5274 				 BIT(DMA_SLAVE_BUSWIDTH_4_BYTES) | \
5275 				 BIT(DMA_SLAVE_BUSWIDTH_8_BYTES))
5276 
5277 static int udma_probe(struct platform_device *pdev)
5278 {
5279 	struct device_node *navss_node = pdev->dev.parent->of_node;
5280 	const struct soc_device_attribute *soc;
5281 	struct device *dev = &pdev->dev;
5282 	struct udma_dev *ud;
5283 	const struct of_device_id *match;
5284 	int i, ret;
5285 	int ch_count;
5286 
5287 	ret = dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(48));
5288 	if (ret)
5289 		dev_err(dev, "failed to set dma mask stuff\n");
5290 
5291 	ud = devm_kzalloc(dev, sizeof(*ud), GFP_KERNEL);
5292 	if (!ud)
5293 		return -ENOMEM;
5294 
5295 	match = of_match_node(udma_of_match, dev->of_node);
5296 	if (!match) {
5297 		dev_err(dev, "No compatible match found\n");
5298 		return -ENODEV;
5299 	}
5300 	ud->match_data = match->data;
5301 
5302 	ud->soc_data = ud->match_data->soc_data;
5303 	if (!ud->soc_data) {
5304 		soc = soc_device_match(k3_soc_devices);
5305 		if (!soc) {
5306 			dev_err(dev, "No compatible SoC found\n");
5307 			return -ENODEV;
5308 		}
5309 		ud->soc_data = soc->data;
5310 	}
5311 
5312 	ret = udma_get_mmrs(pdev, ud);
5313 	if (ret)
5314 		return ret;
5315 
5316 	ud->tisci_rm.tisci = ti_sci_get_by_phandle(dev->of_node, "ti,sci");
5317 	if (IS_ERR(ud->tisci_rm.tisci))
5318 		return PTR_ERR(ud->tisci_rm.tisci);
5319 
5320 	ret = of_property_read_u32(dev->of_node, "ti,sci-dev-id",
5321 				   &ud->tisci_rm.tisci_dev_id);
5322 	if (ret) {
5323 		dev_err(dev, "ti,sci-dev-id read failure %d\n", ret);
5324 		return ret;
5325 	}
5326 	pdev->id = ud->tisci_rm.tisci_dev_id;
5327 
5328 	ret = of_property_read_u32(navss_node, "ti,sci-dev-id",
5329 				   &ud->tisci_rm.tisci_navss_dev_id);
5330 	if (ret) {
5331 		dev_err(dev, "NAVSS ti,sci-dev-id read failure %d\n", ret);
5332 		return ret;
5333 	}
5334 
5335 	if (ud->match_data->type == DMA_TYPE_UDMA) {
5336 		ret = of_property_read_u32(dev->of_node, "ti,udma-atype",
5337 					   &ud->atype);
5338 		if (!ret && ud->atype > 2) {
5339 			dev_err(dev, "Invalid atype: %u\n", ud->atype);
5340 			return -EINVAL;
5341 		}
5342 	} else {
5343 		ret = of_property_read_u32(dev->of_node, "ti,asel",
5344 					   &ud->asel);
5345 		if (!ret && ud->asel > 15) {
5346 			dev_err(dev, "Invalid asel: %u\n", ud->asel);
5347 			return -EINVAL;
5348 		}
5349 	}
5350 
5351 	ud->tisci_rm.tisci_udmap_ops = &ud->tisci_rm.tisci->ops.rm_udmap_ops;
5352 	ud->tisci_rm.tisci_psil_ops = &ud->tisci_rm.tisci->ops.rm_psil_ops;
5353 
5354 	if (ud->match_data->type == DMA_TYPE_UDMA) {
5355 		ud->ringacc = of_k3_ringacc_get_by_phandle(dev->of_node, "ti,ringacc");
5356 	} else {
5357 		struct k3_ringacc_init_data ring_init_data;
5358 
5359 		ring_init_data.tisci = ud->tisci_rm.tisci;
5360 		ring_init_data.tisci_dev_id = ud->tisci_rm.tisci_dev_id;
5361 		if (ud->match_data->type == DMA_TYPE_BCDMA) {
5362 			ring_init_data.num_rings = ud->bchan_cnt +
5363 						   ud->tchan_cnt +
5364 						   ud->rchan_cnt;
5365 		} else {
5366 			ring_init_data.num_rings = ud->rflow_cnt +
5367 						   ud->tflow_cnt;
5368 		}
5369 
5370 		ud->ringacc = k3_ringacc_dmarings_init(pdev, &ring_init_data);
5371 	}
5372 
5373 	if (IS_ERR(ud->ringacc))
5374 		return PTR_ERR(ud->ringacc);
5375 
5376 	dev->msi.domain = of_msi_get_domain(dev, dev->of_node,
5377 					    DOMAIN_BUS_TI_SCI_INTA_MSI);
5378 	if (!dev->msi.domain) {
5379 		return -EPROBE_DEFER;
5380 	}
5381 
5382 	dma_cap_set(DMA_SLAVE, ud->ddev.cap_mask);
5383 	/* cyclic operation is not supported via PKTDMA */
5384 	if (ud->match_data->type != DMA_TYPE_PKTDMA) {
5385 		dma_cap_set(DMA_CYCLIC, ud->ddev.cap_mask);
5386 		ud->ddev.device_prep_dma_cyclic = udma_prep_dma_cyclic;
5387 	}
5388 
5389 	ud->ddev.device_config = udma_slave_config;
5390 	ud->ddev.device_prep_slave_sg = udma_prep_slave_sg;
5391 	ud->ddev.device_issue_pending = udma_issue_pending;
5392 	ud->ddev.device_tx_status = udma_tx_status;
5393 	ud->ddev.device_pause = udma_pause;
5394 	ud->ddev.device_resume = udma_resume;
5395 	ud->ddev.device_terminate_all = udma_terminate_all;
5396 	ud->ddev.device_synchronize = udma_synchronize;
5397 #ifdef CONFIG_DEBUG_FS
5398 	ud->ddev.dbg_summary_show = udma_dbg_summary_show;
5399 #endif
5400 
5401 	switch (ud->match_data->type) {
5402 	case DMA_TYPE_UDMA:
5403 		ud->ddev.device_alloc_chan_resources =
5404 					udma_alloc_chan_resources;
5405 		break;
5406 	case DMA_TYPE_BCDMA:
5407 		ud->ddev.device_alloc_chan_resources =
5408 					bcdma_alloc_chan_resources;
5409 		ud->ddev.device_router_config = bcdma_router_config;
5410 		break;
5411 	case DMA_TYPE_PKTDMA:
5412 		ud->ddev.device_alloc_chan_resources =
5413 					pktdma_alloc_chan_resources;
5414 		break;
5415 	default:
5416 		return -EINVAL;
5417 	}
5418 	ud->ddev.device_free_chan_resources = udma_free_chan_resources;
5419 
5420 	ud->ddev.src_addr_widths = TI_UDMAC_BUSWIDTHS;
5421 	ud->ddev.dst_addr_widths = TI_UDMAC_BUSWIDTHS;
5422 	ud->ddev.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV);
5423 	ud->ddev.residue_granularity = DMA_RESIDUE_GRANULARITY_BURST;
5424 	ud->ddev.desc_metadata_modes = DESC_METADATA_CLIENT |
5425 				       DESC_METADATA_ENGINE;
5426 	if (ud->match_data->enable_memcpy_support &&
5427 	    !(ud->match_data->type == DMA_TYPE_BCDMA && ud->bchan_cnt == 0)) {
5428 		dma_cap_set(DMA_MEMCPY, ud->ddev.cap_mask);
5429 		ud->ddev.device_prep_dma_memcpy = udma_prep_dma_memcpy;
5430 		ud->ddev.directions |= BIT(DMA_MEM_TO_MEM);
5431 	}
5432 
5433 	ud->ddev.dev = dev;
5434 	ud->dev = dev;
5435 	ud->psil_base = ud->match_data->psil_base;
5436 
5437 	INIT_LIST_HEAD(&ud->ddev.channels);
5438 	INIT_LIST_HEAD(&ud->desc_to_purge);
5439 
5440 	ch_count = setup_resources(ud);
5441 	if (ch_count <= 0)
5442 		return ch_count;
5443 
5444 	spin_lock_init(&ud->lock);
5445 	INIT_WORK(&ud->purge_work, udma_purge_desc_work);
5446 
5447 	ud->desc_align = 64;
5448 	if (ud->desc_align < dma_get_cache_alignment())
5449 		ud->desc_align = dma_get_cache_alignment();
5450 
5451 	ret = udma_setup_rx_flush(ud);
5452 	if (ret)
5453 		return ret;
5454 
5455 	for (i = 0; i < ud->bchan_cnt; i++) {
5456 		struct udma_bchan *bchan = &ud->bchans[i];
5457 
5458 		bchan->id = i;
5459 		bchan->reg_rt = ud->mmrs[MMR_BCHANRT] + i * 0x1000;
5460 	}
5461 
5462 	for (i = 0; i < ud->tchan_cnt; i++) {
5463 		struct udma_tchan *tchan = &ud->tchans[i];
5464 
5465 		tchan->id = i;
5466 		tchan->reg_rt = ud->mmrs[MMR_TCHANRT] + i * 0x1000;
5467 	}
5468 
5469 	for (i = 0; i < ud->rchan_cnt; i++) {
5470 		struct udma_rchan *rchan = &ud->rchans[i];
5471 
5472 		rchan->id = i;
5473 		rchan->reg_rt = ud->mmrs[MMR_RCHANRT] + i * 0x1000;
5474 	}
5475 
5476 	for (i = 0; i < ud->rflow_cnt; i++) {
5477 		struct udma_rflow *rflow = &ud->rflows[i];
5478 
5479 		rflow->id = i;
5480 	}
5481 
5482 	for (i = 0; i < ch_count; i++) {
5483 		struct udma_chan *uc = &ud->channels[i];
5484 
5485 		uc->ud = ud;
5486 		uc->vc.desc_free = udma_desc_free;
5487 		uc->id = i;
5488 		uc->bchan = NULL;
5489 		uc->tchan = NULL;
5490 		uc->rchan = NULL;
5491 		uc->config.remote_thread_id = -1;
5492 		uc->config.mapped_channel_id = -1;
5493 		uc->config.default_flow_id = -1;
5494 		uc->config.dir = DMA_MEM_TO_MEM;
5495 		uc->name = devm_kasprintf(dev, GFP_KERNEL, "%s chan%d",
5496 					  dev_name(dev), i);
5497 
5498 		vchan_init(&uc->vc, &ud->ddev);
5499 		/* Use custom vchan completion handling */
5500 		tasklet_setup(&uc->vc.task, udma_vchan_complete);
5501 		init_completion(&uc->teardown_completed);
5502 		INIT_DELAYED_WORK(&uc->tx_drain.work, udma_check_tx_completion);
5503 	}
5504 
5505 	/* Configure the copy_align to the maximum burst size the device supports */
5506 	ud->ddev.copy_align = udma_get_copy_align(ud);
5507 
5508 	ret = dma_async_device_register(&ud->ddev);
5509 	if (ret) {
5510 		dev_err(dev, "failed to register slave DMA engine: %d\n", ret);
5511 		return ret;
5512 	}
5513 
5514 	platform_set_drvdata(pdev, ud);
5515 
5516 	ret = of_dma_controller_register(dev->of_node, udma_of_xlate, ud);
5517 	if (ret) {
5518 		dev_err(dev, "failed to register of_dma controller\n");
5519 		dma_async_device_unregister(&ud->ddev);
5520 	}
5521 
5522 	return ret;
5523 }
5524 
5525 static struct platform_driver udma_driver = {
5526 	.driver = {
5527 		.name	= "ti-udma",
5528 		.of_match_table = udma_of_match,
5529 		.suppress_bind_attrs = true,
5530 	},
5531 	.probe		= udma_probe,
5532 };
5533 
5534 module_platform_driver(udma_driver);
5535 MODULE_LICENSE("GPL v2");
5536 
5537 /* Private interfaces to UDMA */
5538 #include "k3-udma-private.c"
5539