@@ -30,8 +30,14 @@ LOG_MODULE_REGISTER(dma_mcux_edma, CONFIG_DMA_LOG_LEVEL);
30
30
#define HAS_CHANNEL_GAP (n ) DT_INST_NODE_HAS_PROP(n, channel_gap) ||
31
31
#define DMA_MCUX_HAS_CHANNEL_GAP (DT_INST_FOREACH_STATUS_OKAY(HAS_CHANNEL_GAP) 0)
32
32
33
+ #if defined(CONFIG_DMA_MCUX_EDMA_V5 )
34
+ typedef DMA5_Type DMAx_Type ;
35
+ #else
36
+ typedef DMA_Type DMAx_Type ;
37
+ #endif
38
+
33
39
struct dma_mcux_edma_config {
34
- DMA_Type * base ;
40
+ DMAx_Type * base ;
35
41
#if defined(FSL_FEATURE_SOC_DMAMUX_COUNT ) && FSL_FEATURE_SOC_DMAMUX_COUNT
36
42
DMAMUX_Type * * dmamux_base ;
37
43
#endif
@@ -116,7 +122,7 @@ struct dma_mcux_edma_data {
116
122
#define DEV_CFG (dev ) \
117
123
((const struct dma_mcux_edma_config *const)dev->config)
118
124
#define DEV_DATA (dev ) ((struct dma_mcux_edma_data *)dev->data)
119
- #define DEV_BASE (dev ) ((DMA_Type *)DEV_CFG(dev)->base)
125
+ #define DEV_BASE (dev ) ((DMAx_Type *)DEV_CFG(dev)->base)
120
126
121
127
#define DEV_CHANNEL_DATA (dev , ch ) \
122
128
((struct call_back *)(&(DEV_DATA(dev)->data_cb[ch])))
@@ -146,13 +152,13 @@ struct dma_mcux_edma_data {
146
152
#else
147
153
#define EDMA_HW_TCD_CH_ACTIVE_MASK (DMA_CSR_ACTIVE_MASK)
148
154
#endif /* CONFIG_DMA_MCUX_EDMA_V3 */
149
- #elif defined(CONFIG_DMA_MCUX_EDMA_V4 )
155
+ #elif defined(CONFIG_DMA_MCUX_EDMA_V4 ) || defined( CONFIG_DMA_MCUX_EDMA_V5 )
150
156
/* Above macros have been defined in fsl_edma_core.h */
151
157
#define EDMA_HW_TCD_CH_ACTIVE_MASK (DMA_CH_CSR_ACTIVE_MASK)
152
158
#endif
153
159
154
160
/* Definations for HW TCD fields */
155
- #ifdef CONFIG_DMA_MCUX_EDMA
161
+ #if defined( CONFIG_DMA_MCUX_EDMA ) || defined( CONFIG_DMA_MCUX_EDMA_V5 )
156
162
#define EDMA_HW_TCD_SADDR (dev , ch ) (DEV_BASE(dev)->TCD[ch].SADDR)
157
163
#define EDMA_HW_TCD_DADDR (dev , ch ) (DEV_BASE(dev)->TCD[ch].DADDR)
158
164
#define EDMA_HW_TCD_BITER (dev , ch ) (DEV_BASE(dev)->TCD[ch].BITER_ELINKNO)
@@ -203,7 +209,8 @@ static bool data_size_valid(const size_t data_size)
203
209
return (data_size == 4U || data_size == 2U ||
204
210
data_size == 1U || data_size == 8U ||
205
211
data_size == 16U || data_size == 32U
206
- #if defined(CONFIG_DMA_MCUX_EDMA_V3 ) || defined (CONFIG_DMA_MCUX_EDMA_V4 )
212
+ #if defined(CONFIG_DMA_MCUX_EDMA_V3 ) || defined (CONFIG_DMA_MCUX_EDMA_V4 ) \
213
+ || defined (CONFIG_DMA_MCUX_EDMA_V5 )
207
214
|| data_size == 64U
208
215
#endif
209
216
);
@@ -440,32 +447,57 @@ static int dma_mcux_edma_configure(const struct device *dev, uint32_t channel,
440
447
441
448
/* Init all TCDs with the para in transfer config and link them. */
442
449
for (int i = 0 ; i < CONFIG_DMA_TCD_QUEUE_SIZE ; i ++ ) {
443
- EDMA_TcdSetTransferConfig (
450
+ #if defined(CONFIG_DMA_MCUX_EDMA_V5 )
451
+ EDMA_TcdSetTransferConfigExt (DEV_BASE (dev ),
444
452
& DEV_CFG (dev )-> tcdpool [channel ][i ], & data -> transferConfig ,
445
453
& DEV_CFG (dev )-> tcdpool [channel ][(i + 1 ) %
446
- CONFIG_DMA_TCD_QUEUE_SIZE ]);
447
-
454
+ CONFIG_DMA_TCD_QUEUE_SIZE ]);
448
455
/* Enable Major loop interrupt.*/
456
+ EDMA_TcdEnableInterruptsExt (DEV_BASE (dev ),
457
+ & DEV_CFG (dev )-> tcdpool [channel ][i ],
458
+ kEDMA_MajorInterruptEnable );
459
+ #else
460
+ EDMA_TcdSetTransferConfig (& DEV_CFG (dev )-> tcdpool [channel ][i ],
461
+ & data -> transferConfig ,
462
+ & DEV_CFG (dev )-> tcdpool [channel ][(i + 1 ) %
463
+ CONFIG_DMA_TCD_QUEUE_SIZE ]);
449
464
EDMA_TcdEnableInterrupts (& DEV_CFG (dev )-> tcdpool [channel ][i ],
450
- kEDMA_MajorInterruptEnable );
465
+ kEDMA_MajorInterruptEnable );
466
+ #endif
451
467
}
452
468
453
469
/* Load valid transfer parameters */
454
470
while (block_config != NULL && data -> transfer_settings .empty_tcds > 0 ) {
455
471
tcd = & (DEV_CFG (dev )-> tcdpool [channel ]
456
472
[data -> transfer_settings .write_idx ]);
457
473
458
- EDMA_TCD_SADDR (tcd , kEDMA_EDMA4Flag ) = block_config -> source_address ;
459
- EDMA_TCD_DADDR (tcd , kEDMA_EDMA4Flag ) = block_config -> dest_address ;
460
- EDMA_TCD_BITER (tcd , kEDMA_EDMA4Flag ) =
474
+ #if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET ) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET
475
+ EDMA_TCD_SADDR (tcd , EDMA_TCD_TYPE ((void * )DEV_BASE (dev ))) =
476
+ MEMORY_ConvertMemoryMapAddress (
477
+ (uint32_t )(block_config -> source_address ),
478
+ kMEMORY_Local2DMA );
479
+ EDMA_TCD_DADDR (tcd , EDMA_TCD_TYPE ((void * )DEV_BASE (dev ))) =
480
+ MEMORY_ConvertMemoryMapAddress (
481
+ (uint32_t )(block_config -> dest_address ),
482
+ kMEMORY_Local2DMA );
483
+ #else
484
+
485
+ EDMA_TCD_SADDR (tcd , EDMA_TCD_TYPE ((void * )DEV_BASE (dev ))) =
486
+ block_config -> source_address ;
487
+ EDMA_TCD_DADDR (tcd , EDMA_TCD_TYPE ((void * )DEV_BASE (dev ))) =
488
+ block_config -> dest_address ;
489
+ #endif
490
+ EDMA_TCD_BITER (tcd , EDMA_TCD_TYPE ((void * )DEV_BASE (dev ))) =
461
491
block_config -> block_size / config -> source_data_size ;
462
- EDMA_TCD_CITER (tcd , kEDMA_EDMA4Flag ) =
492
+ EDMA_TCD_CITER (tcd , EDMA_TCD_TYPE (( void * ) DEV_BASE ( dev )) ) =
463
493
block_config -> block_size / config -> source_data_size ;
464
494
/*Enable auto stop for last transfer.*/
465
495
if (block_config -> next_block == NULL ) {
466
- EDMA_TCD_CSR (tcd , kEDMA_EDMA4Flag ) |= DMA_CSR_DREQ (1U );
496
+ EDMA_TCD_CSR (tcd , EDMA_TCD_TYPE ((void * )DEV_BASE (dev ))) |=
497
+ DMA_CSR_DREQ (1U );
467
498
} else {
468
- EDMA_TCD_CSR (tcd , kEDMA_EDMA4Flag ) &= ~DMA_CSR_DREQ (1U );
499
+ EDMA_TCD_CSR (tcd , EDMA_TCD_TYPE ((void * )DEV_BASE (dev ))) &=
500
+ ~DMA_CSR_DREQ (1U );
469
501
}
470
502
471
503
data -> transfer_settings .write_idx =
@@ -566,7 +598,8 @@ static int dma_mcux_edma_start(const struct device *dev, uint32_t channel)
566
598
LOG_DBG ("DMAMUX CHCFG 0x%x" , DEV_DMAMUX_BASE (dev , dmamux_idx )-> CHCFG [dmamux_channel ]);
567
599
#endif
568
600
569
- #if !defined(CONFIG_DMA_MCUX_EDMA_V3 ) && !defined(CONFIG_DMA_MCUX_EDMA_V4 )
601
+ #if !defined(CONFIG_DMA_MCUX_EDMA_V3 ) && !defined(CONFIG_DMA_MCUX_EDMA_V4 ) \
602
+ && !defined(CONFIG_DMA_MCUX_EDMA_V5 )
570
603
LOG_DBG ("DMA CR 0x%x" , DEV_BASE (dev )-> CR );
571
604
#endif
572
605
data -> busy = true;
@@ -667,13 +700,20 @@ static int dma_mcux_edma_reload(const struct device *dev, uint32_t channel,
667
700
tcd = & (DEV_CFG (dev )-> tcdpool [channel ][data -> transfer_settings .write_idx ]);
668
701
pre_tcd = & (DEV_CFG (dev )-> tcdpool [channel ][pre_idx ]);
669
702
670
- EDMA_TCD_SADDR (tcd , kEDMA_EDMA4Flag ) = src ;
671
- EDMA_TCD_DADDR (tcd , kEDMA_EDMA4Flag ) = dst ;
672
- EDMA_TCD_BITER (tcd , kEDMA_EDMA4Flag ) = size ;
673
- EDMA_TCD_CITER (tcd , kEDMA_EDMA4Flag ) = size ;
703
+ #if defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET ) && FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET
704
+ EDMA_TCD_SADDR (tcd , EDMA_TCD_TYPE ((void * )DEV_BASE (dev ))) =
705
+ MEMORY_ConvertMemoryMapAddress (src , kMEMORY_Local2DMA );
706
+ EDMA_TCD_DADDR (tcd , EDMA_TCD_TYPE ((void * )DEV_BASE (dev ))) =
707
+ MEMORY_ConvertMemoryMapAddress (dst , kMEMORY_Local2DMA );
708
+ #else
709
+ EDMA_TCD_SADDR (tcd , EDMA_TCD_TYPE ((void * )DEV_BASE (dev ))) = src ;
710
+ EDMA_TCD_DADDR (tcd , EDMA_TCD_TYPE ((void * )DEV_BASE (dev ))) = dst ;
711
+ #endif
712
+ EDMA_TCD_BITER (tcd , EDMA_TCD_TYPE ((void * )DEV_BASE (dev ))) = size ;
713
+ EDMA_TCD_CITER (tcd , EDMA_TCD_TYPE ((void * )DEV_BASE (dev ))) = size ;
674
714
/* Enable automatically stop */
675
- EDMA_TCD_CSR (tcd , kEDMA_EDMA4Flag ) |= DMA_CSR_DREQ (1U );
676
- sw_id = EDMA_TCD_DLAST_SGA (tcd , kEDMA_EDMA4Flag );
715
+ EDMA_TCD_CSR (tcd , EDMA_TCD_TYPE (( void * ) DEV_BASE ( dev )) ) |= DMA_CSR_DREQ (1U );
716
+ sw_id = EDMA_TCD_DLAST_SGA (tcd , EDMA_TCD_TYPE (( void * ) DEV_BASE ( dev )) );
677
717
678
718
/* Block the peripheral's hardware request trigger to prevent
679
719
* starting the DMA before updating the TCDs. Make sure the
@@ -704,7 +744,8 @@ static int dma_mcux_edma_reload(const struct device *dev, uint32_t channel,
704
744
/* Previous TCD can automatically start this TCD.
705
745
* Enable the peripheral DMA request in the previous TCD
706
746
*/
707
- EDMA_TCD_CSR (pre_tcd , kEDMA_EDMA4Flag ) &= ~DMA_CSR_DREQ (1U );
747
+ EDMA_TCD_CSR (pre_tcd , EDMA_TCD_TYPE ((void * )DEV_BASE (dev ))) &=
748
+ ~DMA_CSR_DREQ (1U );
708
749
709
750
if (data -> transfer_settings .empty_tcds == CONFIG_DMA_TCD_QUEUE_SIZE - 1 ||
710
751
hw_id == (uint32_t )tcd ) {
@@ -723,7 +764,7 @@ static int dma_mcux_edma_reload(const struct device *dev, uint32_t channel,
723
764
*/
724
765
EDMA_ClearChannelStatusFlags (DEV_BASE (dev ), channel , kEDMA_DoneFlag );
725
766
EDMA_HW_TCD_CSR (dev , channel ) |= DMA_CSR_ESG_MASK ;
726
- #elif (CONFIG_DMA_MCUX_EDMA_V3 || CONFIG_DMA_MCUX_EDMA_V4 )
767
+ #elif (CONFIG_DMA_MCUX_EDMA_V3 || CONFIG_DMA_MCUX_EDMA_V4 || CONFIG_DMA_MCUX_EDMA_V5 )
727
768
/*We have not verified if this issue exist on V3/V4 HW, jut place a holder here. */
728
769
#endif
729
770
/* TCDs are configured. Resume DMA */
@@ -802,6 +843,14 @@ static int dma_mcux_edma_get_status(const struct device *dev, uint32_t channel,
802
843
LOG_DBG ("DMA CHx_ES 0x%x" , DEV_BASE (dev )-> CH [hw_channel ].CH_ES );
803
844
LOG_DBG ("DMA CHx_INT 0x%x" , DEV_BASE (dev )-> CH [hw_channel ].CH_INT );
804
845
LOG_DBG ("DMA TCD_CSR 0x%x" , DEV_BASE (dev )-> CH [hw_channel ].TCD_CSR );
846
+ #elif defined(CONFIG_DMA_MCUX_EDMA_V5 )
847
+ LOG_DBG ("DMA MP_CSR 0x%x" , DEV_BASE (dev )-> MP_CSR );
848
+ LOG_DBG ("DMA MP_ES 0x%x" , DEV_BASE (dev )-> MP_ES );
849
+ LOG_DBG ("DMA CHx_ES 0x%x" , DEV_BASE (dev )-> TCD [hw_channel ].CH_ES );
850
+ LOG_DBG ("DMA CHx_CSR 0x%x" , DEV_BASE (dev )-> TCD [hw_channel ].CH_CSR );
851
+ LOG_DBG ("DMA CHx_ES 0x%x" , DEV_BASE (dev )-> TCD [hw_channel ].CH_ES );
852
+ LOG_DBG ("DMA CHx_INT 0x%x" , DEV_BASE (dev )-> TCD [hw_channel ].CH_INT );
853
+ LOG_DBG ("DMA TCD_CSR 0x%x" , DEV_BASE (dev )-> TCD [hw_channel ].CSR );
805
854
#else
806
855
LOG_DBG ("DMA CR 0x%x" , DEV_BASE (dev )-> CR );
807
856
LOG_DBG ("DMA INT 0x%x" , DEV_BASE (dev )-> INT );
@@ -957,16 +1006,22 @@ static int dma_mcux_edma_init(const struct device *dev)
957
1006
#define CHANNELS_PER_MUX (n )
958
1007
#endif
959
1008
1009
+ #if defined(CONFIG_DMA_MCUX_EDMA_V5 )
1010
+ #define DMA_TCD_ALIGN_SIZE 64
1011
+ #else
1012
+ #define DMA_TCD_ALIGN_SIZE 32
1013
+ #endif
1014
+
960
1015
/*
961
1016
* define the dma
962
1017
*/
963
1018
#define DMA_INIT (n ) \
964
1019
DMAMUX_BASE_INIT_DEFINE(n) \
965
1020
static void dma_imx_config_func_##n(const struct device *dev); \
966
- static __aligned(32 ) EDMA_TCDPOOL_CACHE_ATTR edma_tcd_t \
1021
+ static __aligned(DMA_TCD_ALIGN_SIZE ) EDMA_TCDPOOL_CACHE_ATTR edma_tcd_t \
967
1022
dma_tcdpool##n[DT_INST_PROP(n, dma_channels)][CONFIG_DMA_TCD_QUEUE_SIZE];\
968
1023
static const struct dma_mcux_edma_config dma_config_##n = { \
969
- .base = (DMA_Type *)DT_INST_REG_ADDR(n), \
1024
+ .base = (DMAx_Type *)DT_INST_REG_ADDR(n), \
970
1025
DMAMUX_BASE_INIT(n) \
971
1026
.dma_requests = DT_INST_PROP(n, dma_requests), \
972
1027
.dma_channels = DT_INST_PROP(n, dma_channels), \
0 commit comments