This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new def76c90d56 imx95: eDMA5 Allow sharing with Linux
def76c90d56 is described below
commit def76c90d5648f64b2ef51175fb3327e2d8d9352
Author: Peter van der Perk <[email protected]>
AuthorDate: Tue Jul 15 16:52:16 2025 +0200
imx95: eDMA5 Allow sharing with Linux
Allows to offset channels and thus sharing the controller with A-core
---
arch/arm/src/imx9/Kconfig | 20 ++++++++++++++++++++
arch/arm/src/imx9/hardware/imx95/imx95_edma.h | 14 ++++++++++++--
arch/arm/src/imx9/imx9_edma.c | 3 ++-
3 files changed, 34 insertions(+), 3 deletions(-)
diff --git a/arch/arm/src/imx9/Kconfig b/arch/arm/src/imx9/Kconfig
index 5cc1555f754..97c15e8445d 100644
--- a/arch/arm/src/imx9/Kconfig
+++ b/arch/arm/src/imx9/Kconfig
@@ -652,6 +652,26 @@ config IMX9_EDMA_NTCD
which case only the TCD channel registers will be used and
scatter-
will not be supported.
+config IMX9_EDMA5_CHAN_OFFSET
+ int "Offset of 1st EDMA5 channel"
+ default 30
+ depends on ARCH_CHIP_IMX95_M7
+ ---help---
+ The EDMA5 controller on the i.MX95 can be accessed by multiple
cores.
+ However, TCD (Transfer Control Descriptor) mappings are not
shareable
+ between instances. Instead, each instance must specify its
usable TCD
+ channels using an offset and count to define a dedicated range.
+
+config IMX9_EDMA5_CHAN_COUNT
+ int "Number of EDMA5 channels"
+ default 34
+ depends on ARCH_CHIP_IMX95_M7
+ ---help---
+ The EDMA5 controller on the i.MX95 can be accessed by multiple
cores.
+ However, TCD (Transfer Control Descriptor) mappings are not
shareable
+ between instances. Instead, each instance must specify its
usable TCD
+ channels using an offset and count to define a dedicated range.
+
config IMX9_EDMA_ELINK
bool "Channeling Linking"
default n
diff --git a/arch/arm/src/imx9/hardware/imx95/imx95_edma.h
b/arch/arm/src/imx9/hardware/imx95/imx95_edma.h
index 19370ac28a0..01b77c9c0b6 100644
--- a/arch/arm/src/imx9/hardware/imx95/imx95_edma.h
+++ b/arch/arm/src/imx9/hardware/imx95/imx95_edma.h
@@ -345,8 +345,18 @@
/* Amount of channels */
#define DMA3_CHANNEL_COUNT (31)
-#define DMA4_CHANNEL_COUNT (64)
-#define IMX9_EDMA_NCHANNELS (DMA3_CHANNEL_COUNT +
DMA4_CHANNEL_COUNT)
+#ifdef IMX9_DMA4_BASE
+# define DMA4_CHANNEL_COUNT (64)
+#else
+# define DMA4_CHANNEL_COUNT (0)
+#endif
+#ifdef IMX9_EDMA5_2_BASE
+#define DMA5_CHANNEL_COUNT (64 - CONFIG_IMX9_EDMA5_CHAN_COUNT)
+#else
+# define DMA5_CHANNEL_COUNT (0)
+#endif
+
+#define IMX9_EDMA_NCHANNELS (DMA3_CHANNEL_COUNT +
DMA4_CHANNEL_COUNT + DMA5_CHANNEL_COUNT)
/* Amount of interrupt sources */
#ifdef CONFIG_ARCH_CHIP_IMX95_M7
diff --git a/arch/arm/src/imx9/imx9_edma.c b/arch/arm/src/imx9/imx9_edma.c
index dc3f619557e..dc6c98a4b65 100644
--- a/arch/arm/src/imx9/imx9_edma.c
+++ b/arch/arm/src/imx9/imx9_edma.c
@@ -909,7 +909,8 @@ void weak_function arm_dma_initialize(void)
/* Initialize the channel */
- for (i = 0; i < DMA4_CHANNEL_COUNT; i++, dmach++)
+ for (i = CONFIG_IMX9_EDMA5_CHAN_OFFSET;
+ i < CONFIG_IMX9_EDMA5_CHAN_COUNT; i++, dmach++)
{
dmach->base = IMX9_EDMA5_2_BASE;
dmach->chan = i;