1 /*
2  * Copyright 2023 NXP
3  * All rights reserved.
4  *
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 
9 #include "fsl_edma_soc.h"
10 
11 /*******************************************************************************
12  * Definitions
13  ******************************************************************************/
14 
15 /* Component ID definition, used by tools. */
16 #ifndef FSL_COMPONENT_ID
17 #define FSL_COMPONENT_ID "platform.drivers.edma_soc"
18 #endif
19 
20 #if defined(MIMXRT798S_hifi4_SERIES) || defined(MIMXRT798S_cm33_core0_SERIES) || \
21     defined(MIMXRT758S_cm33_core0_SERIES) || defined(MIMXRT735S_cm33_core0_SERIES)
22 #define SYSCON_BASE SYSCON0
23 #else
24 #define SYSCON_BASE SYSCON1
25 #endif
26 
27 #define DMAC_EN_REG_OFFSET 0x420U
28 #define DMAC_EN_REG(instance, idx) \
29     ((volatile uint32_t *)((uint32_t)(SYSCON_BASE) + (DMAC_EN_REG_OFFSET) + 0x10U * (instance) + 4U * (idx)))
30 /*******************************************************************************
31  * Prototypes
32  ******************************************************************************/
33 extern void EDMA_DriverIRQHandler(uint32_t instance, uint32_t channel);
34 static DMA_Type *const s_edmaBases[] = EDMA_BASE_PTRS;
35 /*******************************************************************************
36  * Code
37  ******************************************************************************/
EDMA_GetInstance(DMA_Type * base)38 static uint32_t EDMA_GetInstance(DMA_Type *base)
39 {
40     uint32_t instance;
41 
42     /* Find the instance index from base address mappings. */
43     for (instance = 0U; instance < ARRAY_SIZE(s_edmaBases); instance++)
44     {
45         if (s_edmaBases[instance] == base)
46         {
47             break;
48         }
49     }
50 
51     assert(instance < ARRAY_SIZE(s_edmaBases));
52 
53     return instance;
54 }
55 
EDMA_EnableRequest(DMA_Type * base,dma_request_source_t requestSource)56 void EDMA_EnableRequest(DMA_Type *base, dma_request_source_t requestSource)
57 {
58     volatile uint32_t *reg;
59     uint32_t regIdx = (uint32_t)requestSource / 32U;
60 
61     reg = DMAC_EN_REG(EDMA_GetInstance(base), regIdx);
62     *reg |= 0x1UL << ((uint32_t)requestSource % 32U);
63 }
64 
EDMA_DisableRequest(DMA_Type * base,dma_request_source_t requestSource)65 void EDMA_DisableRequest(DMA_Type *base, dma_request_source_t requestSource)
66 {
67     volatile uint32_t *reg;
68     uint32_t regIdx = (uint32_t)requestSource / 32U;
69 
70     reg = DMAC_EN_REG(EDMA_GetInstance(base), regIdx);
71     *reg &= ~(0x1UL << ((uint32_t)requestSource % 32U));
72 }
73 
74 #if defined(DMA0)
75 /*!
76  * brief DMA instance 0, channel 0 IRQ handler.
77  *
78  */
79 extern void EDMA0_CH0_DriverIRQHandler(void);
EDMA0_CH0_DriverIRQHandler(void)80 void EDMA0_CH0_DriverIRQHandler(void)
81 {
82     /* Instance 0 channel 0 */
83     EDMA_DriverIRQHandler(0U, 0U);
84 }
85 
86 /*!
87  * brief DMA instance 0, channel 1 IRQ handler.
88  *
89  */
90 extern void EDMA0_CH1_DriverIRQHandler(void);
EDMA0_CH1_DriverIRQHandler(void)91 void EDMA0_CH1_DriverIRQHandler(void)
92 {
93     /* Instance 0 channel 1 */
94     EDMA_DriverIRQHandler(0U, 1U);
95 }
96 
97 /*!
98  * brief DMA instance 0, channel 2 IRQ handler.
99  *
100  */
101 extern void EDMA0_CH2_DriverIRQHandler(void);
EDMA0_CH2_DriverIRQHandler(void)102 void EDMA0_CH2_DriverIRQHandler(void)
103 {
104     /* Instance 0 channel 2 */
105     EDMA_DriverIRQHandler(0U, 2U);
106 }
107 
108 /*!
109  * brief DMA instance 0, channel 3 IRQ handler.
110  *
111  */
112 extern void EDMA0_CH3_DriverIRQHandler(void);
EDMA0_CH3_DriverIRQHandler(void)113 void EDMA0_CH3_DriverIRQHandler(void)
114 {
115     /* Instance 0 channel 3 */
116     EDMA_DriverIRQHandler(0U, 3U);
117 }
118 
119 /*!
120  * brief DMA instance 0, channel 4 IRQ handler.
121  *
122  */
123 extern void EDMA0_CH4_DriverIRQHandler(void);
EDMA0_CH4_DriverIRQHandler(void)124 void EDMA0_CH4_DriverIRQHandler(void)
125 {
126     /* Instance 0 channel 4 */
127     EDMA_DriverIRQHandler(0U, 4U);
128 }
129 
130 /*!
131  * brief DMA instance 0, channel 5 IRQ handler.
132  *
133  */
134 extern void EDMA0_CH5_DriverIRQHandler(void);
EDMA0_CH5_DriverIRQHandler(void)135 void EDMA0_CH5_DriverIRQHandler(void)
136 {
137     /* Instance 0 channel 5 */
138     EDMA_DriverIRQHandler(0U, 5U);
139 }
140 
141 /*!
142  * brief DMA instance 0, channel 6 IRQ handler.
143  *
144  */
145 extern void EDMA0_CH6_DriverIRQHandler(void);
EDMA0_CH6_DriverIRQHandler(void)146 void EDMA0_CH6_DriverIRQHandler(void)
147 {
148     /* Instance 0 channel 6 */
149     EDMA_DriverIRQHandler(0U, 6U);
150 }
151 
152 /*!
153  * brief DMA instance 0, channel 7 IRQ handler.
154  *
155  */
156 extern void EDMA0_CH7_DriverIRQHandler(void);
EDMA0_CH7_DriverIRQHandler(void)157 void EDMA0_CH7_DriverIRQHandler(void)
158 {
159     /* Instance 0 channel 7 */
160     EDMA_DriverIRQHandler(0U, 7U);
161 }
162 
163 /*!
164  * brief DMA instance 0, channel 8 IRQ handler.
165  *
166  */
167 extern void EDMA0_CH8_DriverIRQHandler(void);
EDMA0_CH8_DriverIRQHandler(void)168 void EDMA0_CH8_DriverIRQHandler(void)
169 {
170     /* Instance 0 channel 8 */
171     EDMA_DriverIRQHandler(0U, 8U);
172 }
173 
174 /*!
175  * brief DMA instance 0, channel 9 IRQ handler.
176  *
177  */
178 extern void EDMA0_CH9_DriverIRQHandler(void);
EDMA0_CH9_DriverIRQHandler(void)179 void EDMA0_CH9_DriverIRQHandler(void)
180 {
181     /* Instance 0 channel 9 */
182     EDMA_DriverIRQHandler(0U, 9U);
183 }
184 
185 /*!
186  * brief DMA instance 0, channel 10 IRQ handler.
187  *
188  */
189 extern void EDMA0_CH10_DriverIRQHandler(void);
EDMA0_CH10_DriverIRQHandler(void)190 void EDMA0_CH10_DriverIRQHandler(void)
191 {
192     /* Instance 0 channel 10 */
193     EDMA_DriverIRQHandler(0U, 10U);
194 }
195 
196 /*!
197  * brief DMA instance 0, channel 11 IRQ handler.
198  *
199  */
200 extern void EDMA0_CH11_DriverIRQHandler(void);
EDMA0_CH11_DriverIRQHandler(void)201 void EDMA0_CH11_DriverIRQHandler(void)
202 {
203     /* Instance 0 channel 11 */
204     EDMA_DriverIRQHandler(0U, 11U);
205 }
206 
207 /*!
208  * brief DMA instance 0, channel 12 IRQ handler.
209  *
210  */
211 extern void EDMA0_CH12_DriverIRQHandler(void);
EDMA0_CH12_DriverIRQHandler(void)212 void EDMA0_CH12_DriverIRQHandler(void)
213 {
214     /* Instance 0 channel 12 */
215     EDMA_DriverIRQHandler(0U, 12U);
216 }
217 
218 /*!
219  * brief DMA instance 0, channel 13 IRQ handler.
220  *
221  */
222 extern void EDMA0_CH13_DriverIRQHandler(void);
EDMA0_CH13_DriverIRQHandler(void)223 void EDMA0_CH13_DriverIRQHandler(void)
224 {
225     /* Instance 0 channel 13 */
226     EDMA_DriverIRQHandler(0U, 13U);
227 }
228 
229 /*!
230  * brief DMA instance 0, channel 14 IRQ handler.
231  *
232  */
233 extern void EDMA0_CH14_DriverIRQHandler(void);
EDMA0_CH14_DriverIRQHandler(void)234 void EDMA0_CH14_DriverIRQHandler(void)
235 {
236     /* Instance 0 channel 14 */
237     EDMA_DriverIRQHandler(0U, 14U);
238 }
239 
240 /*!
241  * brief DMA instance 0, channel 15 IRQ handler.
242  *
243  */
244 extern void EDMA0_CH15_DriverIRQHandler(void);
EDMA0_CH15_DriverIRQHandler(void)245 void EDMA0_CH15_DriverIRQHandler(void)
246 {
247     /* Instance 0 channel 15 */
248     EDMA_DriverIRQHandler(0U, 15U);
249 }
250 #endif
251 #if defined(DMA1)
252 /*!
253  * brief DMA instance 1, channel 0 IRQ handler.
254  *
255  */
256 extern void EDMA1_CH0_DriverIRQHandler(void);
EDMA1_CH0_DriverIRQHandler(void)257 void EDMA1_CH0_DriverIRQHandler(void)
258 {
259     /* Instance 1 channel 0 */
260     EDMA_DriverIRQHandler(1U, 0U);
261 }
262 
263 /*!
264  * brief DMA instance 1, channel 1 IRQ handler.
265  *
266  */
267 extern void EDMA1_CH1_DriverIRQHandler(void);
EDMA1_CH1_DriverIRQHandler(void)268 void EDMA1_CH1_DriverIRQHandler(void)
269 {
270     /* Instance 1 channel 1 */
271     EDMA_DriverIRQHandler(1U, 1U);
272 }
273 
274 /*!
275  * brief DMA instance 1, channel 2 IRQ handler.
276  *
277  */
278 extern void EDMA1_CH2_DriverIRQHandler(void);
EDMA1_CH2_DriverIRQHandler(void)279 void EDMA1_CH2_DriverIRQHandler(void)
280 {
281     /* Instance 1 channel 2 */
282     EDMA_DriverIRQHandler(1U, 2U);
283 }
284 
285 /*!
286  * brief DMA instance 1, channel 3 IRQ handler.
287  *
288  */
289 extern void EDMA1_CH3_DriverIRQHandler(void);
EDMA1_CH3_DriverIRQHandler(void)290 void EDMA1_CH3_DriverIRQHandler(void)
291 {
292     /* Instance 1 channel 3 */
293     EDMA_DriverIRQHandler(1U, 3U);
294 }
295 
296 /*!
297  * brief DMA instance 1, channel 4 IRQ handler.
298  *
299  */
300 extern void EDMA1_CH4_DriverIRQHandler(void);
EDMA1_CH4_DriverIRQHandler(void)301 void EDMA1_CH4_DriverIRQHandler(void)
302 {
303     /* Instance 1 channel 4 */
304     EDMA_DriverIRQHandler(1U, 4U);
305 }
306 
307 /*!
308  * brief DMA instance 1, channel 5 IRQ handler.
309  *
310  */
311 extern void EDMA1_CH5_DriverIRQHandler(void);
EDMA1_CH5_DriverIRQHandler(void)312 void EDMA1_CH5_DriverIRQHandler(void)
313 {
314     /* Instance 1 channel 5 */
315     EDMA_DriverIRQHandler(1U, 5U);
316 }
317 
318 /*!
319  * brief DMA instance 1, channel 6 IRQ handler.
320  *
321  */
322 extern void EDMA1_CH6_DriverIRQHandler(void);
EDMA1_CH6_DriverIRQHandler(void)323 void EDMA1_CH6_DriverIRQHandler(void)
324 {
325     /* Instance 1 channel 6 */
326     EDMA_DriverIRQHandler(1U, 6U);
327 }
328 
329 /*!
330  * brief DMA instance 1, channel 7 IRQ handler.
331  *
332  */
333 extern void EDMA1_CH7_DriverIRQHandler(void);
EDMA1_CH7_DriverIRQHandler(void)334 void EDMA1_CH7_DriverIRQHandler(void)
335 {
336     /* Instance 1 channel 7 */
337     EDMA_DriverIRQHandler(1U, 7U);
338 }
339 
340 /*!
341  * brief DMA instance 1, channel 8 IRQ handler.
342  *
343  */
344 extern void EDMA1_CH8_DriverIRQHandler(void);
EDMA1_CH8_DriverIRQHandler(void)345 void EDMA1_CH8_DriverIRQHandler(void)
346 {
347     /* Instance 1 channel 8 */
348     EDMA_DriverIRQHandler(1U, 8U);
349 }
350 
351 /*!
352  * brief DMA instance 1, channel 9 IRQ handler.
353  *
354  */
355 extern void EDMA1_CH9_DriverIRQHandler(void);
EDMA1_CH9_DriverIRQHandler(void)356 void EDMA1_CH9_DriverIRQHandler(void)
357 {
358     /* Instance 1 channel 9 */
359     EDMA_DriverIRQHandler(1U, 9U);
360 }
361 
362 /*!
363  * brief DMA instance 1, channel 10 IRQ handler.
364  *
365  */
366 extern void EDMA1_CH10_DriverIRQHandler(void);
EDMA1_CH10_DriverIRQHandler(void)367 void EDMA1_CH10_DriverIRQHandler(void)
368 {
369     /* Instance 1 channel 10 */
370     EDMA_DriverIRQHandler(1U, 10U);
371 }
372 
373 /*!
374  * brief DMA instance 1, channel 11 IRQ handler.
375  *
376  */
377 extern void EDMA1_CH11_DriverIRQHandler(void);
EDMA1_CH11_DriverIRQHandler(void)378 void EDMA1_CH11_DriverIRQHandler(void)
379 {
380     /* Instance 1 channel 11 */
381     EDMA_DriverIRQHandler(1U, 11U);
382 }
383 
384 /*!
385  * brief DMA instance 1, channel 12 IRQ handler.
386  *
387  */
388 extern void EDMA1_CH12_DriverIRQHandler(void);
EDMA1_CH12_DriverIRQHandler(void)389 void EDMA1_CH12_DriverIRQHandler(void)
390 {
391     /* Instance 1 channel 12 */
392     EDMA_DriverIRQHandler(1U, 12U);
393 }
394 
395 /*!
396  * brief DMA instance 1, channel 13 IRQ handler.
397  *
398  */
399 extern void EDMA1_CH13_DriverIRQHandler(void);
EDMA1_CH13_DriverIRQHandler(void)400 void EDMA1_CH13_DriverIRQHandler(void)
401 {
402     /* Instance 1 channel 13 */
403     EDMA_DriverIRQHandler(1U, 13U);
404 }
405 
406 /*!
407  * brief DMA instance 1, channel 14 IRQ handler.
408  *
409  */
410 extern void EDMA1_CH14_DriverIRQHandler(void);
EDMA1_CH14_DriverIRQHandler(void)411 void EDMA1_CH14_DriverIRQHandler(void)
412 {
413     /* Instance 1 channel 14 */
414     EDMA_DriverIRQHandler(1U, 14U);
415 }
416 
417 /*!
418  * brief DMA instance 1, channel 15 IRQ handler.
419  *
420  */
421 extern void EDMA1_CH15_DriverIRQHandler(void);
EDMA1_CH15_DriverIRQHandler(void)422 void EDMA1_CH15_DriverIRQHandler(void)
423 {
424     /* Instance 1 channel 15 */
425     EDMA_DriverIRQHandler(1U, 15U);
426 }
427 #endif
428 #if defined(DMA2)
429 /*!
430  * brief DMA instance 0, channel 0 IRQ handler.
431  *
432  */
433 extern void EDMA2_CH0_DriverIRQHandler(void);
EDMA2_CH0_DriverIRQHandler(void)434 void EDMA2_CH0_DriverIRQHandler(void)
435 {
436     /* Instance 0 channel 0 */
437     EDMA_DriverIRQHandler(0U, 0U);
438 }
439 
440 /*!
441  * brief DMA instance 0, channel 1 IRQ handler.
442  *
443  */
444 extern void EDMA2_CH1_DriverIRQHandler(void);
EDMA2_CH1_DriverIRQHandler(void)445 void EDMA2_CH1_DriverIRQHandler(void)
446 {
447     /* Instance 0 channel 1 */
448     EDMA_DriverIRQHandler(0U, 1U);
449 }
450 
451 /*!
452  * brief DMA instance 0, channel 2 IRQ handler.
453  *
454  */
455 extern void EDMA2_CH2_DriverIRQHandler(void);
EDMA2_CH2_DriverIRQHandler(void)456 void EDMA2_CH2_DriverIRQHandler(void)
457 {
458     /* Instance 0 channel 2 */
459     EDMA_DriverIRQHandler(0U, 2U);
460 }
461 
462 /*!
463  * brief DMA instance 0, channel 3 IRQ handler.
464  *
465  */
466 extern void EDMA2_CH3_DriverIRQHandler(void);
EDMA2_CH3_DriverIRQHandler(void)467 void EDMA2_CH3_DriverIRQHandler(void)
468 {
469     /* Instance 0 channel 3 */
470     EDMA_DriverIRQHandler(0U, 3U);
471 }
472 
473 /*!
474  * brief DMA instance 0, channel 4 IRQ handler.
475  *
476  */
477 extern void EDMA2_CH4_DriverIRQHandler(void);
EDMA2_CH4_DriverIRQHandler(void)478 void EDMA2_CH4_DriverIRQHandler(void)
479 {
480     /* Instance 0 channel 4 */
481     EDMA_DriverIRQHandler(0U, 4U);
482 }
483 
484 /*!
485  * brief DMA instance 0, channel 5 IRQ handler.
486  *
487  */
488 extern void EDMA2_CH5_DriverIRQHandler(void);
EDMA2_CH5_DriverIRQHandler(void)489 void EDMA2_CH5_DriverIRQHandler(void)
490 {
491     /* Instance 0 channel 5 */
492     EDMA_DriverIRQHandler(0U, 5U);
493 }
494 
495 /*!
496  * brief DMA instance 0, channel 6 IRQ handler.
497  *
498  */
499 extern void EDMA2_CH6_DriverIRQHandler(void);
EDMA2_CH6_DriverIRQHandler(void)500 void EDMA2_CH6_DriverIRQHandler(void)
501 {
502     /* Instance 0 channel 6 */
503     EDMA_DriverIRQHandler(0U, 6U);
504 }
505 
506 /*!
507  * brief DMA instance 0, channel 7 IRQ handler.
508  *
509  */
510 extern void EDMA2_CH7_DriverIRQHandler(void);
EDMA2_CH7_DriverIRQHandler(void)511 void EDMA2_CH7_DriverIRQHandler(void)
512 {
513     /* Instance 0 channel 7 */
514     EDMA_DriverIRQHandler(0U, 7U);
515 }
516 #endif
517 #if defined(DMA3)
518 /*!
519  * brief DMA instance 1, channel 0 IRQ handler.
520  *
521  */
522 extern void EDMA3_CH0_DriverIRQHandler(void);
EDMA3_CH0_DriverIRQHandler(void)523 void EDMA3_CH0_DriverIRQHandler(void)
524 {
525     /* Instance 1 channel 0 */
526     EDMA_DriverIRQHandler(1U, 0U);
527 }
528 
529 /*!
530  * brief DMA instance 1, channel 1 IRQ handler.
531  *
532  */
533 extern void EDMA3_CH1_DriverIRQHandler(void);
EDMA3_CH1_DriverIRQHandler(void)534 void EDMA3_CH1_DriverIRQHandler(void)
535 {
536     /* Instance 1 channel 1 */
537     EDMA_DriverIRQHandler(1U, 1U);
538 }
539 
540 /*!
541  * brief DMA instance 1, channel 2 IRQ handler.
542  *
543  */
544 extern void EDMA3_CH2_DriverIRQHandler(void);
EDMA3_CH2_DriverIRQHandler(void)545 void EDMA3_CH2_DriverIRQHandler(void)
546 {
547     /* Instance 1 channel 2 */
548     EDMA_DriverIRQHandler(1U, 2U);
549 }
550 
551 /*!
552  * brief DMA instance 1, channel 3 IRQ handler.
553  *
554  */
555 extern void EDMA3_CH3_DriverIRQHandler(void);
EDMA3_CH3_DriverIRQHandler(void)556 void EDMA3_CH3_DriverIRQHandler(void)
557 {
558     /* Instance 1 channel 3 */
559     EDMA_DriverIRQHandler(1U, 3U);
560 }
561 
562 /*!
563  * brief DMA instance 1, channel 4 IRQ handler.
564  *
565  */
566 extern void EDMA3_CH4_DriverIRQHandler(void);
EDMA3_CH4_DriverIRQHandler(void)567 void EDMA3_CH4_DriverIRQHandler(void)
568 {
569     /* Instance 1 channel 4 */
570     EDMA_DriverIRQHandler(1U, 4U);
571 }
572 
573 /*!
574  * brief DMA instance 1, channel 5 IRQ handler.
575  *
576  */
577 extern void EDMA3_CH5_DriverIRQHandler(void);
EDMA3_CH5_DriverIRQHandler(void)578 void EDMA3_CH5_DriverIRQHandler(void)
579 {
580     /* Instance 1 channel 5 */
581     EDMA_DriverIRQHandler(1U, 5U);
582 }
583 
584 /*!
585  * brief DMA instance 1, channel 6 IRQ handler.
586  *
587  */
588 extern void EDMA3_CH6_DriverIRQHandler(void);
EDMA3_CH6_DriverIRQHandler(void)589 void EDMA3_CH6_DriverIRQHandler(void)
590 {
591     /* Instance 1 channel 6 */
592     EDMA_DriverIRQHandler(1U, 6U);
593 }
594 
595 /*!
596  * brief DMA instance 1, channel 7 IRQ handler.
597  *
598  */
599 extern void EDMA3_CH7_DriverIRQHandler(void);
EDMA3_CH7_DriverIRQHandler(void)600 void EDMA3_CH7_DriverIRQHandler(void)
601 {
602     /* Instance 1 channel 7 */
603     EDMA_DriverIRQHandler(1U, 7U);
604 }
605 #endif
606