From a9e595770f4ab4f8142fd88f157758dbaf085daa Mon Sep 17 00:00:00 2001 From: Tinghan Shen Date: Tue, 11 Oct 2022 13:42:44 +0800 Subject: [PATCH] soc/mediatek/mt8186: Inititalize ADSP To use SOF correctly, we need to initialize ADSP in coreboot stage. TEST=SOF driver is functional. BUG=b:204229221 Change-Id: I45db587252ccdcdf75e0be2029743034a79925c5 Signed-off-by: Tinghan Shen Reviewed-on: https://review.coreboot.org/c/coreboot/+/68289 Reviewed-by: Yidi Lin Reviewed-by: Yu-Ping Wu Tested-by: build bot (Jenkins) --- src/soc/mediatek/mt8186/Makefile.inc | 1 + src/soc/mediatek/mt8186/adsp.c | 11 +++++++++++ .../mediatek/mt8186/include/soc/addressmap.h | 1 + src/soc/mediatek/mt8186/include/soc/adsp.h | 18 ++++++++++++++++++ src/soc/mediatek/mt8186/soc.c | 8 ++++++++ 5 files changed, 39 insertions(+) create mode 100644 src/soc/mediatek/mt8186/adsp.c create mode 100644 src/soc/mediatek/mt8186/include/soc/adsp.h diff --git a/src/soc/mediatek/mt8186/Makefile.inc b/src/soc/mediatek/mt8186/Makefile.inc index 724f80fb11..cd207773ac 100644 --- a/src/soc/mediatek/mt8186/Makefile.inc +++ b/src/soc/mediatek/mt8186/Makefile.inc @@ -27,6 +27,7 @@ romstage-y += ../common/mmu_operations.c ../common/mmu_cmops.c romstage-y += ../common/pmic_wrap.c pmic_wrap.c pmif.c mt6366.c romstage-y += ../common/rtc.c ../common/rtc_osc_init.c rtc.c +ramstage-y += adsp.c ramstage-y += ../common/auxadc.c ramstage-$(CONFIG_ARM64_USE_ARM_TRUSTED_FIRMWARE) += ../common/bl31.c ramstage-y += ../common/ddp.c ddp.c diff --git a/src/soc/mediatek/mt8186/adsp.c b/src/soc/mediatek/mt8186/adsp.c new file mode 100644 index 0000000000..11df47009e --- /dev/null +++ b/src/soc/mediatek/mt8186/adsp.c @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include +#include + +void mtk_adsp_init(void) +{ + /* [0] CORE_CLK_EN, [1] COREDBG_EN, [3] TIMER_EN, [4] DMA_EN, [5] UART_EN */ + setbits32(&mt8186_audiodsp->audiodsp_adsp_ck_en, 0x0000003B); +} diff --git a/src/soc/mediatek/mt8186/include/soc/addressmap.h b/src/soc/mediatek/mt8186/include/soc/addressmap.h index 0aaeb9b666..d19a8db17e 100644 --- a/src/soc/mediatek/mt8186/include/soc/addressmap.h +++ b/src/soc/mediatek/mt8186/include/soc/addressmap.h @@ -50,6 +50,7 @@ enum { DRAMC_CHA_AO_BASE = IO_PHYS + 0x00220000, SSPM_SRAM_BASE = IO_PHYS + 0x00400000, SSPM_CFG_BASE = IO_PHYS + 0x00440000, + AUDIODSP_BASE = IO_PHYS + 0x00680000, SFLASH_REG_BASE = IO_PHYS + 0x01000000, AUXADC_BASE = IO_PHYS + 0x01001000, UART0_BASE = IO_PHYS + 0x01002000, diff --git a/src/soc/mediatek/mt8186/include/soc/adsp.h b/src/soc/mediatek/mt8186/include/soc/adsp.h new file mode 100644 index 0000000000..03916964b9 --- /dev/null +++ b/src/soc/mediatek/mt8186/include/soc/adsp.h @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#ifndef SOC_MEDIATEK_MT8186_ADSP_H +#define SOC_MEDIATEK_MT8186_ADSP_H + +#include + +struct mt8186_audiodsp_regs { + u32 reserved1[1024]; + u32 audiodsp_adsp_ck_en; +}; +check_member(mt8186_audiodsp_regs, audiodsp_adsp_ck_en, 0x1000); + +static struct mt8186_audiodsp_regs *const mt8186_audiodsp = (void *)AUDIODSP_BASE; + +void mtk_adsp_init(void); + +#endif diff --git a/src/soc/mediatek/mt8186/soc.c b/src/soc/mediatek/mt8186/soc.c index d2e7a1e03e..a55e2ee2cb 100644 --- a/src/soc/mediatek/mt8186/soc.c +++ b/src/soc/mediatek/mt8186/soc.c @@ -2,10 +2,12 @@ #include #include +#include #include #include #include #include +#include #include #include @@ -24,6 +26,12 @@ static void soc_init(struct device *dev) { mtk_mmu_disable_l2c_sram(); sspm_init(); + + /* ADSP is required for all MT8186 projects, so it's initialized in soc.c */ + mtcmos_adsp_power_on(); + mtcmos_protect_adsp_bus(); + mtk_adsp_init(); + dapc_init(); if (CONFIG(MTK_DFD))