diff --git a/src/drivers/imx/CMakeLists.txt b/src/drivers/imx/CMakeLists.txt index 88d7416cf687..874e8c012190 100644 --- a/src/drivers/imx/CMakeLists.txt +++ b/src/drivers/imx/CMakeLists.txt @@ -16,6 +16,10 @@ endif() if(CONFIG_IMX_SDMA) add_local_sources(sof sdma.c) + + if (CONFIG_HAVE_SDMA_FIRMWARE) + target_include_directories(sof PRIVATE ${CONFIG_SDMA_SCRIPT_CODE}) + endif() endif() if(CONFIG_IMX_INTERRUPT_IRQSTEER) diff --git a/src/drivers/imx/Kconfig b/src/drivers/imx/Kconfig index 09551f4a4466..a74cc8e552e4 100644 --- a/src/drivers/imx/Kconfig +++ b/src/drivers/imx/Kconfig @@ -34,3 +34,18 @@ config IMX_INTERRUPT_GENERIC help This has to be selected for i.MX NXP platform that do not have irqsteer. It enables NXP platforms-specific features. + +config HAVE_SDMA_FIRMWARE + bool + default n + help + Select this to load SDMA firmware to enable additional functionality + for SDMA controller. + +if HAVE_SDMA_FIRMWARE + config SDMA_SCRIPT_CODE + string "SDMA script code path" + help + This option is a string and provides the path where to find the sdma script + code header. +endif diff --git a/src/drivers/imx/sdma.c b/src/drivers/imx/sdma.c index c66cbc5b8660..70d801f97f20 100644 --- a/src/drivers/imx/sdma.c +++ b/src/drivers/imx/sdma.c @@ -265,6 +265,14 @@ static int sdma_upload_context(struct dma_chan_data *chan) sizeof(*pdata->ctx) / 4); } +#if CONFIG_HAVE_SDMA_FIRMWARE +static int sdma_load_firmware(struct dma *dma, void *buf, int addr, int size) +{ + return sdma_run_c0(dma->chan->dma, SDMA_CMD_C0_SET_PM, + (uint32_t)buf, addr, size / 2); +} +#endif + /* Below SOF related functions will be placed */ static int sdma_probe(struct dma *dma) @@ -336,6 +344,16 @@ static int sdma_probe(struct dma *dma) goto err; } +#if CONFIG_HAVE_SDMA_FIRMWARE + ret = sdma_load_firmware(dma, (void *)sdma_code, + RAM_CODE_START_ADDR, + RAM_CODE_SIZE * sizeof(short)); + if (ret < 0) { + tr_err(&sdma_tr, "SDMA: Failed to load firmware"); + goto err; + } +#endif + goto out; err: if (pdata->chan_pdata) diff --git a/src/include/sof/drivers/sdma.h b/src/include/sof/drivers/sdma.h index bf639c1c4201..d3c9668157a8 100644 --- a/src/include/sof/drivers/sdma.h +++ b/src/include/sof/drivers/sdma.h @@ -151,4 +151,8 @@ #define SDMA_SCRIPT_SHP2MCU_OFF 893 #define SDMA_SCRIPT_MCU2SHP_OFF 962 +#ifdef CONFIG_SDMA_SCRIPT_CODE +#include "sdma_script_code_imx7d_4_5.h" +#endif + #endif /* __SOF_DRIVERS_SDMA_H__ */