diff --git a/src/soc/mediatek/common/include/soc/mtk_fsp_common.h b/src/soc/mediatek/common/include/soc/mtk_fsp_common.h index 29e7ed9fb5..bc0d92c771 100644 --- a/src/soc/mediatek/common/include/soc/mtk_fsp_common.h +++ b/src/soc/mediatek/common/include/soc/mtk_fsp_common.h @@ -16,6 +16,7 @@ enum fsp_status { FSP_STATUS_PARAM_NOT_FOUND, FSP_STATUS_PARAM_INVALID_SIZE, FSP_STATUS_INVALID_STORAGE, + FSP_STATUS_INVALID_PI_IMG, }; enum fsp_phase { @@ -38,6 +39,8 @@ enum fsp_param_type { /* 0x40000000+ reserved for input type params */ FSP_PARAM_TYPE_IN = FSP_PARAM_IO_ENCODE(FSP_PARAM_IO_IN), FSP_PARAM_TYPE_STORAGE, + FSP_PARAM_TYPE_PI_IMG, + FSP_PARAM_TYPE_PI_IMG_CSRAM, /* 0x80000000+ reserved for output type params */ FSP_PARAM_TYPE_OUT = FSP_PARAM_IO_ENCODE(FSP_PARAM_IO_OUT), diff --git a/src/soc/mediatek/mt8196/Kconfig b/src/soc/mediatek/mt8196/Kconfig index fe89288b88..9d27a5f77f 100644 --- a/src/soc/mediatek/mt8196/Kconfig +++ b/src/soc/mediatek/mt8196/Kconfig @@ -39,6 +39,13 @@ config DPM_PM_FIRMWARE help The file name of the MediaTek DPM PM firmware. +config PI_IMG_FIRMWARE + string + default "pi_img.img" + help + The file name of the MediaTek PI_IMG firmware. The main purpose of the pi_img is to + pass various frequency and voltage scaling parameters and settings to MCUPM. + config SSPM_FIRMWARE string default "sspm.bin" diff --git a/src/soc/mediatek/mt8196/Makefile.mk b/src/soc/mediatek/mt8196/Makefile.mk index 4cf1660931..d780ebdc4b 100644 --- a/src/soc/mediatek/mt8196/Makefile.mk +++ b/src/soc/mediatek/mt8196/Makefile.mk @@ -75,6 +75,7 @@ ramstage-y += ../common/mt6685.c mt6685.c ramstage-y += mt6685_rtc.c ramstage-y += mtcmos.c ramstage-y += ../common/mtk_fsp.c +ramstage-y += pi_image.c ramstage-y += soc.c ramstage-y += ../common/spm.c spm.c ramstage-y += ../common/sspm.c sspm_sram.c @@ -97,6 +98,7 @@ mcu-firmware-files := \ $(CONFIG_DPM_PM_FIRMWARE) \ $(CONFIG_GPUEB_FIRMWARE) \ $(CONFIG_MCUPM_FIRMWARE) \ + $(CONFIG_PI_IMG_FIRMWARE) \ $(CONFIG_SSPM_FIRMWARE) \ $(CONFIG_SPM_FIRMWARE) diff --git a/src/soc/mediatek/mt8196/include/soc/pi_image.h b/src/soc/mediatek/mt8196/include/soc/pi_image.h new file mode 100644 index 0000000000..74f8ebe893 --- /dev/null +++ b/src/soc/mediatek/mt8196/include/soc/pi_image.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0-only OR MIT */ + +#ifndef __SOC_MEDIATEK_MT8196_PI_IMAGE_H__ +#define __SOC_MEDIATEK_MT8196_PI_IMAGE_H__ + +#include +#include + +#define PI_IMAGE_CSRAM 0x00120000 +#define PI_IMAGE_CSRAM_SIZE (16 * KiB) + +size_t pi_image_load(void **buffer); + +#endif /* __SOC_MEDIATEK_MT8196_PI_IMAGE_H__ */ diff --git a/src/soc/mediatek/mt8196/pi_image.c b/src/soc/mediatek/mt8196/pi_image.c new file mode 100644 index 0000000000..d1e60e084f --- /dev/null +++ b/src/soc/mediatek/mt8196/pi_image.c @@ -0,0 +1,26 @@ +/* SPDX-License-Identifier: GPL-2.0-only OR MIT */ + +#include +#include +#include +#include +#include +#include +#include + +static struct mtk_mcu pi_image = { + .firmware_name = CONFIG_PI_IMG_FIRMWARE +}; + +size_t pi_image_load(void **buffer) +{ + *buffer = NULL; + pi_image.load_buffer = _dram_dma; + pi_image.buffer_size = REGION_SIZE(dram_dma); + + if (mtk_init_mcu(&pi_image)) + die("%s() failed\n", __func__); + + *buffer = pi_image.load_buffer; + return pi_image.run_size; +} diff --git a/src/soc/mediatek/mt8196/soc.c b/src/soc/mediatek/mt8196/soc.c index 8aca9586d3..2d32bc3d45 100644 --- a/src/soc/mediatek/mt8196/soc.c +++ b/src/soc/mediatek/mt8196/soc.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -34,11 +35,26 @@ static void soc_read_resources(struct device *dev) ram_range(dev, 0, (uintptr_t)_dram, sdram_size()); } +static void add_pi_image_params(void) +{ + void *pi_image; + size_t pi_image_size; + pi_image_size = pi_image_load(&pi_image); + + void *csram = (void *)PI_IMAGE_CSRAM; + size_t csram_size = PI_IMAGE_CSRAM_SIZE; + + mtk_fsp_add_param(FSP_PARAM_TYPE_PI_IMG, pi_image_size, pi_image); + mtk_fsp_add_param(FSP_PARAM_TYPE_PI_IMG_CSRAM, csram_size, csram); +} + static void soc_init(struct device *dev) { - mtk_fsp_init(RAMSTAGE_SOC_INIT); uint32_t storage_type = mainboard_get_storage_type(); + + mtk_fsp_init(RAMSTAGE_SOC_INIT); mtk_fsp_add_param(FSP_PARAM_TYPE_STORAGE, sizeof(storage_type), &storage_type); + add_pi_image_params(); mtk_fsp_load_and_run(); mtk_mmu_disable_l2c_sram();