Skip to content

Commit

Permalink
nxp: imx8/imx8x: switch to native Zephyr drivers and timer domain
Browse files Browse the repository at this point in the history
This commit includes all necessary changes for switching
to timer domain and Zephyr native drivers on imx8 and imx8x.
This consists of:
	1) Switching all imx8 topologies to timer domain.
	2) Disabling Zephyr DMA domain
	3) Various interrupt-related fixes via Kconfig-related
	ifdef logic.

This commit includes all necessary changes for switching
to native Zephyr drivers on imx8/imx8x.

Signed-off-by: Laurentiu Mihalcea <laurentiu.mihalcea@nxp.com>
  • Loading branch information
LaurentiuM1234 committed Apr 10, 2024
1 parent 7260615 commit f0eb12b
Show file tree
Hide file tree
Showing 24 changed files with 43 additions and 60 deletions.
1 change: 1 addition & 0 deletions app/boards/imx8qm_mek_mimx8qm6_adsp.conf
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ CONFIG_TRACE=n
CONFIG_DMA=y
CONFIG_DMA_NXP_EDMA_ENABLE_HALFMAJOR_IRQ=y
CONFIG_SHARED_INTERRUPTS=y
CONFIG_ZEPHYR_NATIVE_DRIVERS=y
1 change: 1 addition & 0 deletions app/boards/imx8qxp_mek_mimx8qx6_adsp.conf
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ CONFIG_TRACE=n
CONFIG_DMA=y
CONFIG_DMA_NXP_EDMA_ENABLE_HALFMAJOR_IRQ=y
CONFIG_SHARED_INTERRUPTS=y
CONFIG_ZEPHYR_NATIVE_DRIVERS=y
2 changes: 1 addition & 1 deletion src/drivers/imx/ipc.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@

LOG_MODULE_REGISTER(ipc_task, CONFIG_SOF_LOG_LEVEL);

#ifdef CONFIG_ARM64
#if defined(CONFIG_ARM64) || defined(CONFIG_IMX8) || defined(CONFIG_IMX8X)
/* thanks to the fact that ARM's GIC is supported
* by Zephyr there's no need to clear interrupts
* explicitly. This should already be done by Zephyr
Expand Down
2 changes: 0 additions & 2 deletions src/platform/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@ config IMX8
select IMX
select IMX_EDMA
select IMX_ESAI
select SCHEDULE_DMA_MULTI_CHANNEL
select IMX_INTERRUPT_IRQSTEER
help
Select if your target platform is imx8-compatible
Expand All @@ -84,7 +83,6 @@ config IMX8X
select IMX
select IMX_EDMA
select IMX_ESAI
select SCHEDULE_DMA_MULTI_CHANNEL
select IMX_INTERRUPT_IRQSTEER
help
Select if your target platform is imx8x-compatible
Expand Down
2 changes: 1 addition & 1 deletion src/platform/imx8/include/platform/platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ struct timer;
#define LPSRAM_SIZE 16384

/* IPC Interrupt */
#define PLATFORM_IPC_INTERRUPT IRQ_NUM_MU
#define PLATFORM_IPC_INTERRUPT 7
#define PLATFORM_IPC_INTERRUPT_NAME NULL

/* Host page size */
Expand Down
14 changes: 0 additions & 14 deletions src/platform/imx8/platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -160,11 +160,6 @@ int platform_init(struct sof *sof)
sof->cpu_timers = sof->platform_timer;
#endif

#ifdef __ZEPHYR__
/* initialize cascade interrupts before any usage */
interrupt_init(sof);
#endif

platform_interrupt_init();
platform_clock_init(sof);
scheduler_init_edf();
Expand All @@ -187,15 +182,6 @@ int platform_init(struct sof *sof)
if (ret < 0)
return -ENODEV;

/* Init EDMA platform domain */
sof->platform_dma_domain = dma_multi_chan_domain_init
(&sof->dma_info->dma_array[0], 1,
PLATFORM_DEFAULT_CLOCK, false);

/* i.MX platform DMA domain will be full synchronous, no time dependent */
sof->platform_dma_domain->full_sync = true;
scheduler_init_ll(sof->platform_dma_domain);

/* initialize the host IPC mechanims */
ipc_init(sof);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ dnl period, priority, core, time_domain)
DAI_ADD(sof/pipe-dai-capture.m4,
1, SAI, 1, sai1-wm8960-hifi,
PIPELINE_SINK_1, 2, s32le,
1000, 0, 0, SCHEDULE_TIME_DOMAIN_DMA)
1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)

# PCM Low Latency, id 0

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ dnl period, priority, core, time_domain)
DAI_ADD(sof/pipe-dai-playback.m4,
1, SAI, 1, sai1-wm8960-hifi,
PIPELINE_SOURCE_1, 2, s32le,
1000, 0, 0, SCHEDULE_TIME_DOMAIN_DMA)
1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)

# PCM Low Latency, id 0

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ dnl period, priority, core, time_domain)
DAI_ADD(sof/pipe-dai-playback.m4,
1, SAI, 1, DAI_BE_NAME,
PIPELINE_SOURCE_1, 2, s32le,
1000, 0, 0, SCHEDULE_TIME_DOMAIN_DMA)
1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)


# PCM Low Latency, id 0
Expand Down
4 changes: 2 additions & 2 deletions tools/topology/topology1/development/sof-imx8-src-cs42888.m4
Original file line number Diff line number Diff line change
Expand Up @@ -59,14 +59,14 @@ dnl period, priority, core, time_domain)
DAI_ADD(sof/pipe-dai-playback.m4,
1, ESAI, 0, esai0-cs42888,
PIPELINE_SOURCE_1, 2, s24le,
1000, 0, 0, SCHEDULE_TIME_DOMAIN_DMA)
1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)

# capture DAI is ESAI0 using 2 periods
# Buffers use s24le format, with 48 frame per 1000us on core 0 with priority 0
DAI_ADD(sof/pipe-dai-capture.m4,
2, ESAI, 0, esai0-cs42888,
PIPELINE_SINK_2, 2, s24le,
1000, 0, 0)
1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)

# PCM Low Latency, id 0

Expand Down
4 changes: 2 additions & 2 deletions tools/topology/topology1/development/sof-imx8-src-wm8960.m4
Original file line number Diff line number Diff line change
Expand Up @@ -69,14 +69,14 @@ dnl period, priority, core, time_domain)
DAI_ADD(sof/pipe-dai-playback.m4,
1, SAI, SAI_INDEX, DAI_BE_NAME,
PIPELINE_SOURCE_1, 2, s32le,
1000, 0, 0, SCHEDULE_TIME_DOMAIN_DMA)
1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)

# capture DAI is SAI_SAI_INDEX using 2 periods
# Buffers use s32le format, with 48 frame per 1000us on core 0 with priority 0
DAI_ADD(sof/pipe-dai-capture.m4,
2, SAI, SAI_INDEX, DAI_BE_NAME,
PIPELINE_SINK_2, 2, s32le,
1000, 0, 0)
1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)


# PCM Low Latency, id 0
Expand Down
8 changes: 4 additions & 4 deletions tools/topology/topology1/sof-imx8-compr-wm8960-mixer.m4
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ define(`DAI_BE_NAME', concat(concat(`sai', SAI_INDEX), STREAM_NAME))
DAI_ADD(sof/pipe-mixer-volume-dai-playback.m4,
1, SAI, SAI_INDEX, DAI_BE_NAME,
NOT_USED_IGNORED, 2, s32le,
1000, 1, 0, SCHEDULE_TIME_DOMAIN_DMA,
1000, 1, 0, SCHEDULE_TIME_DOMAIN_TIMER,
2, 48000)

# PCM Playback pipeline 3 on PCM 0 using max 2 channels of s32le.
Expand All @@ -88,7 +88,7 @@ PIPELINE_PCM_ADD(sof/pipe-host-volume-playback.m4,
3, 0, 2, s32le,
1000, 0, 0,
48000, 48000, 48000,
SCHEDULE_TIME_DOMAIN_DMA,
SCHEDULE_TIME_DOMAIN_TIMER,
PIPELINE_PLAYBACK_SCHED_COMP_1)

# Compress Playback pipeline 4 on Compr 1 using max 2 channels of s32le.
Expand All @@ -98,7 +98,7 @@ PIPELINE_PCM_ADD(sof/pipe-host-codec-adapter-playback.m4,
4, 1, 2, s32le,
5000, 0, 0,
48000, 48000, 48000,
SCHEDULE_TIME_DOMAIN_DMA,
SCHEDULE_TIME_DOMAIN_TIMER,
PIPELINE_PLAYBACK_SCHED_COMP_1)

# Connect pipelines together
Expand All @@ -120,7 +120,7 @@ SectionGraph."PIPE_NAME" {
DAI_ADD(sof/pipe-dai-capture.m4,
2, SAI, SAI_INDEX, DAI_BE_NAME,
PIPELINE_SINK_2, 2, s32le,
1000, 0, 0, SCHEDULE_TIME_DOMAIN_DMA)
1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)


# PCM definitions
Expand Down
8 changes: 4 additions & 4 deletions tools/topology/topology1/sof-imx8-cs42888-mixer.m4
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ PIPELINE_PCM_ADD(sof/pipe-low-latency-capture.m4,
DAI_ADD(sof/pipe-mixer-volume-dai-playback.m4,
1, ESAI, 0, esai0-cs42888,
NOT_USED_IGNORED, 2, s24le,
1000, 1, 0, SCHEDULE_TIME_DOMAIN_DMA,
1000, 1, 0, SCHEDULE_TIME_DOMAIN_TIMER,
2, 48000)

# PCM Playback pipeline 3 on PCM 0 using max 2 channels of s24le.
Expand All @@ -56,7 +56,7 @@ PIPELINE_PCM_ADD(sof/pipe-host-volume-playback.m4,
3, 0, 2, s24le,
1000, 0, 0,
48000, 48000, 48000,
SCHEDULE_TIME_DOMAIN_DMA,
SCHEDULE_TIME_DOMAIN_TIMER,
PIPELINE_PLAYBACK_SCHED_COMP_1)

# PCM Playback pipeline 4 on PCM 1 using max 2 channels of s24le.
Expand All @@ -66,7 +66,7 @@ PIPELINE_PCM_ADD(sof/pipe-host-volume-playback.m4,
4, 1, 2, s24le,
5000, 0, 0,
48000, 48000, 48000,
SCHEDULE_TIME_DOMAIN_DMA,
SCHEDULE_TIME_DOMAIN_TIMER,
PIPELINE_PLAYBACK_SCHED_COMP_1)

# Connect pipelines together
Expand All @@ -88,7 +88,7 @@ SectionGraph."PIPE_NAME" {
DAI_ADD(sof/pipe-dai-capture.m4,
2, ESAI, 0, esai0-cs42888,
PIPELINE_SINK_2, 2, s24le,
1000, 0, 0, SCHEDULE_TIME_DOMAIN_DMA)
1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)


# PCM definitions
Expand Down
4 changes: 2 additions & 2 deletions tools/topology/topology1/sof-imx8-cs42888.m4
Original file line number Diff line number Diff line change
Expand Up @@ -59,14 +59,14 @@ dnl period, priority, core, time_domain)
DAI_ADD(sof/pipe-dai-playback.m4,
1, ESAI, 0, esai0-cs42888,
PIPELINE_SOURCE_1, 2, s24le,
1000, 0, 0, SCHEDULE_TIME_DOMAIN_DMA)
1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)

# capture DAI is ESAI0 using 2 periods
# Buffers use s24le format, with 48 frame per 1000us on core 0 with priority 0
DAI_ADD(sof/pipe-dai-capture.m4,
2, ESAI, 0, esai0-cs42888,
PIPELINE_SINK_2, 2, s24le,
1000, 0, 0)
1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)

# PCM Low Latency, id 0

Expand Down
2 changes: 1 addition & 1 deletion tools/topology/topology1/sof-imx8-nocodec-sai.m4
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ dnl deadline, priority, core)
DAI_ADD(sof/pipe-dai-playback.m4,
1, SAI, 1, NoCodec-0,
PIPELINE_SOURCE_1, 2, s24le,
1000, 0, 0, SCHEDULE_TIME_DOMAIN_DMA)
1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)

dnl PCM_PLAYBACK_ADD(name, pcm_id, playback)

Expand Down
2 changes: 1 addition & 1 deletion tools/topology/topology1/sof-imx8-nocodec.m4
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ dnl deadline, priority, core)
DAI_ADD(sof/pipe-dai-playback.m4,
1, ESAI, 0, NoCodec-0,
PIPELINE_SOURCE_1, 2, s24le,
1000, 0, 0, SCHEDULE_TIME_DOMAIN_DMA)
1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)

dnl PCM_PLAYBACK_ADD(name, pcm_id, playback)

Expand Down
8 changes: 4 additions & 4 deletions tools/topology/topology1/sof-imx8-wm8960-cs42888.m4
Original file line number Diff line number Diff line change
Expand Up @@ -73,28 +73,28 @@ dnl period, priority, core, time_domain)
DAI_ADD(sof/pipe-dai-playback.m4,
1, ESAI, 0, esai0-cs42888,
PIPELINE_SOURCE_1, 2, s24le,
1000, 0, 0, SCHEDULE_TIME_DOMAIN_DMA)
1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)

# capture DAI is ESAI0 using 2 periods
# Buffers use s24le format, with 48 frame per 1000us on core 0 with priority 0
DAI_ADD(sof/pipe-dai-capture.m4,
2, ESAI, 0, esai0-cs42888,
PIPELINE_SINK_2, 2, s24le,
1000, 0, 0)
1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)

# playback DAI is SAI1 using 2 periods
# Buffers use s32le format, with 48 frame per 1000us on core 0 with priority 0
DAI_ADD(sof/pipe-dai-playback.m4,
3, SAI, 1, sai1-wm8960-hifi,
PIPELINE_SOURCE_3, 2, s32le,
1000, 0, 0, SCHEDULE_TIME_DOMAIN_DMA)
1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)

# capture DAI is SAI1 using 2 periods
# Buffers use s32le format, with 48 frame per 1000us on core 0 with priority 0
DAI_ADD(sof/pipe-dai-capture.m4,
4, SAI, 1, sai1-wm8960-hifi,
PIPELINE_SINK_4, 2, s32le,
1000, 0, 0)
1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)


dnl PCM_DUPLEX_ADD(name, pcm_id, playback, capture)
Expand Down
2 changes: 1 addition & 1 deletion tools/topology/topology1/sof-imx8-wm8960-kwd.m4
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ DAI_ADD(sof/pipe-dai-capture.m4,
1, SAI, 1, sai1-wm8960-hifi,
PIPELINE_SINK_1, 2, s32le,
KWD_PIPE_SCH_DEADLINE_US,
0, 0, SCHEDULE_TIME_DOMAIN_DMA)
0, 0, SCHEDULE_TIME_DOMAIN_TIMER)

# keyword detector pipe
dnl PIPELINE_PCM_ADD(pipeline,
Expand Down
8 changes: 4 additions & 4 deletions tools/topology/topology1/sof-imx8-wm8960-mixer.m4
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ define(`DAI_BE_NAME', concat(concat(`sai', SAI_INDEX), STREAM_NAME))
DAI_ADD(sof/pipe-mixer-volume-dai-playback.m4,
1, SAI, SAI_INDEX, DAI_BE_NAME,
NOT_USED_IGNORED, 2, s32le,
1000, 1, 0, SCHEDULE_TIME_DOMAIN_DMA,
1000, 1, 0, SCHEDULE_TIME_DOMAIN_TIMER,
2, `RATE')

# PCM Playback pipeline 3 on PCM 0 using max 2 channels of s32le.
Expand All @@ -67,7 +67,7 @@ PIPELINE_PCM_ADD(sof/pipe-host-volume-playback.m4,
3, 0, 2, s32le,
1000, 0, 0,
`RATE', `RATE', `RATE',
SCHEDULE_TIME_DOMAIN_DMA,
SCHEDULE_TIME_DOMAIN_TIMER,
PIPELINE_PLAYBACK_SCHED_COMP_1)

# PCM Playback pipeline 4 on PCM 1 using max 2 channels of s32le.
Expand All @@ -77,7 +77,7 @@ PIPELINE_PCM_ADD(sof/pipe-host-volume-playback.m4,
4, 1, 2, s32le,
5000, 0, 0,
`RATE', `RATE', `RATE',
SCHEDULE_TIME_DOMAIN_DMA,
SCHEDULE_TIME_DOMAIN_TIMER,
PIPELINE_PLAYBACK_SCHED_COMP_1)

# Connect pipelines together
Expand All @@ -99,7 +99,7 @@ SectionGraph."PIPE_NAME" {
DAI_ADD(sof/pipe-dai-capture.m4,
2, SAI, SAI_INDEX, DAI_BE_NAME,
PIPELINE_SINK_2, 2, s32le,
1000, 0, 0, SCHEDULE_TIME_DOMAIN_DMA)
1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)


# PCM definitions
Expand Down
4 changes: 2 additions & 2 deletions tools/topology/topology1/sof-imx8-wm8960.m4
Original file line number Diff line number Diff line change
Expand Up @@ -70,14 +70,14 @@ dnl period, priority, core, time_domain)
DAI_ADD(sof/pipe-dai-playback.m4,
1, SAI, SAI_INDEX, DAI_BE_NAME,
PIPELINE_SOURCE_1, 2, s32le,
1000, 0, 0, SCHEDULE_TIME_DOMAIN_DMA)
1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)

# capture DAI is SAI_SAI_INDEX using 2 periods
# Buffers use s32le format, with 48 frame per 1000us on core 0 with priority 0
DAI_ADD(sof/pipe-dai-capture.m4,
2, SAI, SAI_INDEX, DAI_BE_NAME,
PIPELINE_SINK_2, 2, s32le,
1000, 0, 0)
1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)


# PCM Low Latency, id 0
Expand Down
9 changes: 1 addition & 8 deletions zephyr/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -234,26 +234,19 @@ endif()
# NXP IMX8 platforms
if (CONFIG_SOC_MIMX8QM6_ADSP OR CONFIG_SOC_MIMX8QX6_ADSP)
zephyr_library_sources(
${SOF_DRIVERS_PATH}/generic/dummy-dma.c
${SOF_DRIVERS_PATH}/imx/edma.c
${SOF_DRIVERS_PATH}/imx/sai.c
${SOF_DRIVERS_PATH}/imx/ipc.c
${SOF_DRIVERS_PATH}/imx/esai.c
${SOF_DRIVERS_PATH}/imx/interrupt-irqsteer.c
)

# Platform sources
zephyr_library_sources(
${SOF_PLATFORM_PATH}/imx8/platform.c
${SOF_PLATFORM_PATH}/imx8/lib/clk.c
${SOF_PLATFORM_PATH}/imx8/lib/dai.c
${SOF_PLATFORM_PATH}/imx8/lib/dma.c
${SOF_PLATFORM_PATH}/imx8/lib/memory.c
)

# SOF core infrastructure - runs on top of Zephyr
zephyr_library_sources(
${SOF_SRC_PATH}/drivers/interrupt.c
lib/dma.c
)

zephyr_library_sources(${SOF_SRC_PATH}/schedule/zephyr_ll.c)
Expand Down
2 changes: 1 addition & 1 deletion zephyr/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ config SOF_ZEPHYR_STRICT_HEADERS

config DMA_DOMAIN
bool "Enable the usage of DMA domain."
default y if IMX
default y if IMX8M || IMX8ULP
help
This enables the usage of the DMA domain in scheduling.

Expand Down
8 changes: 6 additions & 2 deletions zephyr/include/rtos/interrupt.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@
#ifndef __ZEPHYR_RTOS_INTERRUPT_H__
#define __ZEPHYR_RTOS_INTERRUPT_H__

#if defined(CONFIG_IMX)
/* TODO: to be removed completely when the following platforms are switched
* to native drivers.
*/
#if defined(CONFIG_IMX8M) || defined(CONFIG_IMX8ULP)
/* imx currently has no IRQ driver in Zephyr so we force to xtos IRQ */
#include "../../../xtos/include/rtos/interrupt.h"
#else
Expand Down Expand Up @@ -55,7 +58,8 @@ static inline void interrupt_unregister(uint32_t irq, const void *arg)
static inline int interrupt_get_irq(unsigned int irq, const char *cascade)
{
#if defined(CONFIG_LIBRARY) || defined(CONFIG_ACE) || \
defined(CONFIG_ZEPHYR_POSIX) || defined(CONFIG_ARM64)
defined(CONFIG_ZEPHYR_POSIX) || defined(CONFIG_ARM64) ||\
defined(CONFIG_IMX8) || defined(CONFIG_IMX8X)
return irq;
#else
if (cascade == irq_name_level2)
Expand Down
Loading

0 comments on commit f0eb12b

Please sign in to comment.