soc/mediatek/mt8192: Load MCUPM firmware and boot up MCUPM

MCUPM is the MediaTek proprietary firmware for MCU power management.

TEST=1. emerge-asurada coreboot chromeos-bootimage;
     2. See following log during booting.
        load_blob_file: Load mcupm.bin in 35 msecs, size 115668 bytes
     3. Test suspend/resume by:
        a. suspend (on DUT): powerd_dbus_suspend
        b. resume (on host): dut-control power_state:on

Change-Id: I50bea1942507b4a40df9730b4e1bf98980d74277
Signed-off-by: Yidi Lin <yidi.lin@mediatek.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/46392
Reviewed-by: Hung-Te Lin <hungte@chromium.org>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Yidi Lin
2020-07-29 19:18:38 +08:00
committed by Hung-Te Lin
parent a5f472bf57
commit f4bf8f5fab
6 changed files with 59 additions and 0 deletions

View File

@ -45,6 +45,12 @@ config MEMORY_TEST
This option enables memory basic compare test to verify the DRAM read This option enables memory basic compare test to verify the DRAM read
or write is as expected. or write is as expected.
config MCUPM_FIRMWARE
string
default "mcupm.bin"
help
The file name of the MediaTek MCUPM firmware.
config SPM_FIRMWARE config SPM_FIRMWARE
string string
default "spm_firmware.bin" default "spm_firmware.bin"

View File

@ -40,6 +40,7 @@ ramstage-y += ../common/gpio.c gpio.c
ramstage-y += emi.c ramstage-y += emi.c
ramstage-$(CONFIG_SPI_FLASH) += ../common/spi.c spi.c ramstage-$(CONFIG_SPI_FLASH) += ../common/spi.c spi.c
ramstage-y += ../common/mcu.c ramstage-y += ../common/mcu.c
ramstage-y += mcupm.c
ramstage-y += ../common/mmu_operations.c mmu_operations.c ramstage-y += ../common/mmu_operations.c mmu_operations.c
ramstage-y += ../common/mtcmos.c mtcmos.c ramstage-y += ../common/mtcmos.c mtcmos.c
ramstage-y += soc.c ramstage-y += soc.c
@ -51,6 +52,7 @@ ramstage-y += ../common/usb.c usb.c
MT8192_BLOB_DIR := 3rdparty/blobs/soc/mediatek/mt8192 MT8192_BLOB_DIR := 3rdparty/blobs/soc/mediatek/mt8192
mcu-firmware-files := \ mcu-firmware-files := \
$(CONFIG_MCUPM_FIRMWARE) \
$(CONFIG_SPM_FIRMWARE) $(CONFIG_SPM_FIRMWARE)
$(foreach fw, $(call strip_quotes,$(mcu-firmware-files)), \ $(foreach fw, $(call strip_quotes,$(mcu-firmware-files)), \

View File

@ -5,6 +5,8 @@
enum { enum {
MCUSYS_BASE = 0x0C530000, MCUSYS_BASE = 0x0C530000,
MCUPM_SRAM_BASE = 0x0C540000,
MCUPM_CFG_BASE = 0x0C560000,
IO_PHYS = 0x10000000, IO_PHYS = 0x10000000,
}; };

View File

@ -0,0 +1,14 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef SOC_MEDIATEK_MT8192_MCUPM_H
#define SOC_MEDIATEK_MT8192_MCUPM_H
#include <soc/addressmap.h>
#include <types.h>
struct mt8192_mcupm_regs {
u32 sw_rstn;
};
static struct mt8192_mcupm_regs *const mt8192_mcupm = (void *)MCUPM_CFG_BASE;
void mcupm_init(void);
#endif /* SOC_MEDIATEK_MT8192_MCUPM_H */

View File

@ -0,0 +1,33 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#include <console/console.h>
#include <device/mmio.h>
#include <soc/mcu_common.h>
#include <soc/mcupm.h>
#include <soc/symbols.h>
#define ABNORMALBOOT_REG 0x0C55FAA0
static void reset_mcupm(struct mtk_mcu *mcu)
{
/* Clear abnormal boot register */
write32((void *)ABNORMALBOOT_REG, 0x0);
write32(&mt8192_mcupm->sw_rstn, 0x1);
}
static struct mtk_mcu mcupm = {
.firmware_name = CONFIG_MCUPM_FIRMWARE,
.run_address = (void *)MCUPM_SRAM_BASE,
.reset = reset_mcupm,
};
void mcupm_init(void)
{
mcupm.load_buffer = _dram_dma;
mcupm.buffer_size = REGION_SIZE(dram_dma);
write32(&mt8192_mcupm->sw_rstn, 0x0);
if (mtk_init_mcu(&mcupm))
die("%s() failed\n", __func__);
}

View File

@ -2,6 +2,7 @@
#include <device/device.h> #include <device/device.h>
#include <soc/emi.h> #include <soc/emi.h>
#include <soc/mcupm.h>
#include <soc/mmu_operations.h> #include <soc/mmu_operations.h>
#include <symbols.h> #include <symbols.h>
@ -13,6 +14,7 @@ static void soc_read_resources(struct device *dev)
static void soc_init(struct device *dev) static void soc_init(struct device *dev)
{ {
mtk_mmu_disable_l2c_sram(); mtk_mmu_disable_l2c_sram();
mcupm_init();
} }
static struct device_operations soc_ops = { static struct device_operations soc_ops = {