From de8fc8b2f9bde19ef9ca9b1ed932a8226ec70d92 Mon Sep 17 00:00:00 2001 From: Daniel Golle Date: Sun, 5 Oct 2025 01:04:54 +0100 Subject: [PATCH] arm-trusted-firmware-mediatek: add builds for MT7987 Build TF-A for the MediaTek MT7987 SoC family. Add necessary downstream patches in preparation for the BananaPi R4 Lite, which connects both flash chips to SPI2 and got broken MMC bus. Signed-off-by: Daniel Golle --- .../arm-trusted-firmware-mediatek/Makefile | 64 +++++++++ ...987-make-SPI-controller-configurable.patch | 128 ++++++++++++++++++ ...987-mmc-use-4-bit-bus-width-for-eMMC.patch | 24 ++++ ...7987-bl2-move-FIP-offset-to-0x100000.patch | 27 ++++ 4 files changed, 243 insertions(+) create mode 100644 package/boot/arm-trusted-firmware-mediatek/patches/0005-mt7987-make-SPI-controller-configurable.patch create mode 100644 package/boot/arm-trusted-firmware-mediatek/patches/0006-hack-mt7987-mmc-use-4-bit-bus-width-for-eMMC.patch create mode 100644 package/boot/arm-trusted-firmware-mediatek/patches/0007-hack-mt7987-bl2-move-FIP-offset-to-0x100000.patch diff --git a/package/boot/arm-trusted-firmware-mediatek/Makefile b/package/boot/arm-trusted-firmware-mediatek/Makefile index c014eee732..7045133739 100644 --- a/package/boot/arm-trusted-firmware-mediatek/Makefile +++ b/package/boot/arm-trusted-firmware-mediatek/Makefile @@ -38,6 +38,7 @@ define Trusted-Firmware-A/Default USE_UBI:= FIP_OFFSET:= FIP_SIZE:= + SPIM_CTRL:= endef define Trusted-Firmware-A/mt7622-nor-1ddr @@ -393,6 +394,61 @@ define Trusted-Firmware-A/mt7986-spim-nand-ubi-ddr3 USE_UBI:=1 endef +define Trusted-Firmware-A/mt7987-emmc-comb + NAME:=MediaTek MT7987 (eMMC) + BOOT_DEVICE:=emmc + BUILD_SUBTARGET:=filogic + PLAT:=mt7987 + DRAM_USE_COMB:=1 +endef + +define Trusted-Firmware-A/mt7987-nor-comb + NAME:=MediaTek MT7987 (NOR) + BOOT_DEVICE:=nor + BUILD_SUBTARGET:=filogic + PLAT:=mt7987 + DRAM_USE_COMB:=1 +endef + +define Trusted-Firmware-A/mt7987-sdmmc-comb + NAME:=MediaTek MT7987 (SD card) + BOOT_DEVICE:=sdmmc + BUILD_SUBTARGET:=filogic + PLAT:=mt7987 + DRAM_USE_COMB:=1 +endef + +define Trusted-Firmware-A/mt7987-spim-nand0-ubi-comb + NAME:=MediaTek MT7987 (SPI-NAND via SPIM, UBI) + BOOT_DEVICE:=spim-nand + BUILD_SUBTARGET:=filogic + PLAT:=mt7987 + DRAM_USE_COMB:=1 + USE_UBI:=1 + SPIM_CTRL:=0 +endef + +define Trusted-Firmware-A/mt7987-spim-nand2-ubi-comb + NAME:=MediaTek MT7987 (SPI-NAND via SPIM, UBI) + BOOT_DEVICE:=spim-nand + BUILD_SUBTARGET:=filogic + PLAT:=mt7987 + DRAM_USE_COMB:=1 + USE_UBI:=1 + SPIM_CTRL:=2 +endef + +define Trusted-Firmware-A/mt7987-ram-comb + NAME:=MediaTek MT7987 (RAM) + BOOT_DEVICE:=ram + BUILD_SUBTARGET:=filogic + PLAT:=mt7987 + DRAM_USE_COMB:=1 + RAM_BOOT_UART_DL:=1 + HIDDEN:= + DEFAULT:=TARGET_mediatek_filogic +endef + define Trusted-Firmware-A/mt7988-nor-ddr3 NAME:=MediaTek MT7988 (SPI-NOR, DDR3) BOOT_DEVICE:=nor @@ -604,6 +660,12 @@ TFA_TARGETS:= \ mt7986-spim-nand-ddr4 \ mt7986-spim-nand-ubi-ddr4 \ mt7986-spim-nand-4k-ddr4 \ + mt7987-emmc-comb \ + mt7987-nor-comb \ + mt7987-sdmmc-comb \ + mt7987-spim-nand0-ubi-comb \ + mt7987-spim-nand2-ubi-comb \ + mt7987-ram-comb \ mt7988-emmc-ddr3 \ mt7988-nor-ddr3 \ mt7988-sdmmc-ddr3 \ @@ -641,6 +703,7 @@ TFA_MAKE_FLAGS += \ $(if $(USE_UBI),UBI=1 $(if $(findstring mt7986,$(PLAT)),OVERRIDE_UBI_START_ADDR=0x200000)) \ $(if $(FIP_OFFSET),OVERRIDE_FIP_BASE=$(FIP_OFFSET)) \ $(if $(FIP_SIZE),OVERRIDE_FIP_SIZE=$(FIP_SIZE)) \ + $(if $(SPIM_CTRL),SPIM_CTRL=$(SPIM_CTRL)) \ $(if $(RAM_BOOT_UART_DL),bl2,all) define Package/trusted-firmware-a-ram/install @@ -653,6 +716,7 @@ Package/trusted-firmware-a-mt7981-ram-ddr3/install = $(Package/trusted-firmware- Package/trusted-firmware-a-mt7981-ram-ddr4/install = $(Package/trusted-firmware-a-ram/install) Package/trusted-firmware-a-mt7986-ram-ddr3/install = $(Package/trusted-firmware-a-ram/install) Package/trusted-firmware-a-mt7986-ram-ddr4/install = $(Package/trusted-firmware-a-ram/install) +Package/trusted-firmware-a-mt7987-ram-comb/install = $(Package/trusted-firmware-a-ram/install) Package/trusted-firmware-a-mt7988-ram-comb/install = $(Package/trusted-firmware-a-ram/install) Package/trusted-firmware-a-mt7988-ram-ddr4/install = $(Package/trusted-firmware-a-ram/install) diff --git a/package/boot/arm-trusted-firmware-mediatek/patches/0005-mt7987-make-SPI-controller-configurable.patch b/package/boot/arm-trusted-firmware-mediatek/patches/0005-mt7987-make-SPI-controller-configurable.patch new file mode 100644 index 0000000000..41017844bb --- /dev/null +++ b/package/boot/arm-trusted-firmware-mediatek/patches/0005-mt7987-make-SPI-controller-configurable.patch @@ -0,0 +1,128 @@ +From e2e43103c00b5f7ccedbdbdece0f622cb420b4a5 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Fri, 3 Oct 2025 12:53:10 +0100 +Subject: [PATCH] mt7987: make SPI controller configurable + +Allow selecting the SPI controller used for SPIM-NAND or SPI-NOR boot +devices (either SPI0 or SPI2). + +Signed-off-by: Daniel Golle +--- + plat/mediatek/apsoc_common/Config.in | 1 + + plat/mediatek/mt7987/Config.in | 29 +++++++++++++++++++++ + plat/mediatek/mt7987/bl2/bl2.mk | 12 +++++++++ + plat/mediatek/mt7987/bl2/bl2_dev_spi_nand.c | 10 ++++++- + plat/mediatek/mt7987/platform.mk | 4 +-- + 5 files changed, 53 insertions(+), 3 deletions(-) + create mode 100644 plat/mediatek/mt7987/Config.in + +--- a/plat/mediatek/apsoc_common/Config.in ++++ b/plat/mediatek/apsoc_common/Config.in +@@ -783,6 +783,7 @@ config ENABLE_BL31_RUNTIME_LOG + default 1 + depends on _ENABLE_BL31_RUNTIME_LOG + ++source "plat/mediatek/mt7987/Config.in" + source "plat/mediatek/mt7988/Config.in" + + endmenu # Platform configurations +--- /dev/null ++++ b/plat/mediatek/mt7987/Config.in +@@ -0,0 +1,29 @@ ++# SPDX-License-Identifier: BSD-3-Clause ++# ++# Copyright (c) 2025 Daniel Golle ++# ++# MT7987 platform-specific configurations ++# ++ ++if _PLAT_MT7987 ++ ++choice ++ prompt "SPI controller" ++ depends on (_BOOT_DEVICE_SPIM_NAND || _BOOT_DEVICE_SPI_NOR) ++ default _SPIM_CTRL_0 if _BOOT_DEVICE_SPIM_NAND ++ default _SPIM_CTRL_2 if _BOOT_DEVICE_SPI_NOR ++ ++ config _SPIM_CTRL_0 ++ bool "0" ++ ++ config _SPIM_CTRL_2 ++ bool "2" ++ ++endchoice ++ ++config SPIM_CTRL ++ int ++ default 0 if _SPIM_CTRL_0 ++ default 2 if _SPIM_CTRL_2 ++ ++endif # _PLAT_MT7987 +--- a/plat/mediatek/mt7987/bl2/bl2.mk ++++ b/plat/mediatek/mt7987/bl2/bl2.mk +@@ -91,7 +91,11 @@ endif # END OF BOOT_DEVICE = ram + ifeq ($(BOOT_DEVICE),nor) + $(eval $(call BL2_BOOT_NOR)) + BL2_SOURCES += $(MTK_PLAT_SOC)/bl2/bl2_dev_spi_nor.c ++ifeq ($(SPIM_CTRL),0) ++DTS_NAME := mt7987-spi0 ++else + DTS_NAME := mt7987-spi2 ++endif + endif # END OF BOOTDEVICE = nor + + ifeq ($(BOOT_DEVICE),emmc) +@@ -112,10 +116,18 @@ ifeq ($(BOOT_DEVICE),spim-nand) + $(eval $(call BL2_BOOT_SPI_NAND,0,0)) + BL2_SOURCES += $(MTK_PLAT_SOC)/bl2/bl2_dev_spi_nand.c + NAND_TYPE ?= spim:2k+64 ++ifeq ($(SPIM_CTRL),2) ++DTS_NAME := mt7987-spi2 ++else + DTS_NAME := mt7987-spi0 ++endif + $(eval $(call BL2_BOOT_NAND_TYPE_CHECK,$(NAND_TYPE),spim:2k+64 spim:2k+128 spim:4k+256)) + endif # END OF BOOTDEVICE = spim-nand + ++ifneq ($(SPIM_CTRL),) ++BL2_CPPFLAGS += -DSPIM_CTRL=$(SPIM_CTRL) ++endif ++ + ifeq ($(BROM_HEADER_TYPE),) + $(error BOOT_DEVICE has invalid value. Please re-check.) + endif +--- a/plat/mediatek/mt7987/bl2/bl2_dev_spi_nand.c ++++ b/plat/mediatek/mt7987/bl2/bl2_dev_spi_nand.c +@@ -12,10 +12,18 @@ + + #define MTK_QSPI_SRC_CLK CB_MPLL_D2 + ++#if SPIM_CTRL == 0 ++#define SELECTED_SPIM SPIM0 ++#elif SPIM_CTRL == 2 ++#define SELECTED_SPIM SPIM2 ++#else ++#error "Invalid SPI controller selection" ++#endif ++ + uint32_t mtk_plat_get_qspi_src_clk(void) + { + /* config GPIO pinmux to spi mode */ +- mtk_spi_gpio_init(SPIM0); ++ mtk_spi_gpio_init(SELECTED_SPIM); + + /* select 208M clk */ + mtk_spi_source_clock_select(MTK_QSPI_SRC_CLK); +--- a/plat/mediatek/mt7987/platform.mk ++++ b/plat/mediatek/mt7987/platform.mk +@@ -56,8 +56,8 @@ include make_helpers/dep.mk + + $(call GEN_DEP_RULES,bl2,emicfg bl2_boot_ram bl2_boot_nand_nmbm bl2_dev_mmc bl2_plat_init bl2_plat_setup mt7987_gpio dtb) + $(call MAKE_DEP,bl2,emicfg,DDR4_4BG_MODE DRAM_DEBUG_LOG DDR3_FREQ_2133 DDR3_FREQ_1866 DDR4_FREQ_3200 DDR4_FREQ_2666) +-$(call MAKE_DEP,bl2,bl2_plat_init,BL2_COMPRESS) +-$(call MAKE_DEP,bl2,bl2_plat_setup,BOOT_DEVICE TRUSTED_BOARD_BOOT BL32_TZRAM_BASE BL32_TZRAM_SIZE BL32_LOAD_OFFSET) ++$(call MAKE_DEP,bl2,bl2_plat_init,BL2_COMPRESS SPIM_CTRL) ++$(call MAKE_DEP,bl2,bl2_plat_setup,BOOT_DEVICE TRUSTED_BOARD_BOOT BL32_TZRAM_BASE BL32_TZRAM_SIZE BL32_LOAD_OFFSET SPIM_CTRL) + $(call MAKE_DEP,bl2,bl2_dev_mmc,BOOT_DEVICE) + $(call MAKE_DEP,bl2,bl2_boot_ram,RAM_BOOT_DEBUGGER_HOOK RAM_BOOT_UART_DL) + $(call MAKE_DEP,bl2,bl2_boot_nand_nmbm,NMBM_MAX_RATIO NMBM_MAX_RESERVED_BLOCKS NMBM_DEFAULT_LOG_LEVEL) diff --git a/package/boot/arm-trusted-firmware-mediatek/patches/0006-hack-mt7987-mmc-use-4-bit-bus-width-for-eMMC.patch b/package/boot/arm-trusted-firmware-mediatek/patches/0006-hack-mt7987-mmc-use-4-bit-bus-width-for-eMMC.patch new file mode 100644 index 0000000000..0f64a7e142 --- /dev/null +++ b/package/boot/arm-trusted-firmware-mediatek/patches/0006-hack-mt7987-mmc-use-4-bit-bus-width-for-eMMC.patch @@ -0,0 +1,24 @@ +From 0a09912eb336bee788443b919ea5b99b195f5a91 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Sat, 4 Oct 2025 22:13:49 +0100 +Subject: [PATCH] hack: mt7987: mmc: use 4-bit bus-width for eMMC + +The BananaPi R4 Lite has broken DAT5 signal of the MMC bus, which +results in 8-bit buswidth not working well for the eMMC. +Reduce to 4-bit buswidth fixes it (and makes all other boards with +eMMC a tiny bit slower to boot, but it's in the milliseconds). +--- + plat/mediatek/mt7987/bl2/bl2_dev_mmc.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/plat/mediatek/mt7987/bl2/bl2_dev_mmc.c ++++ b/plat/mediatek/mt7987/bl2/bl2_dev_mmc.c +@@ -74,7 +74,7 @@ static const struct mt7987_msdc_conf { + { + .base = MSDC0_BASE, + .top_base = MSDC0_TOP_BASE, +- .bus_width = MMC_BUS_WIDTH_8, ++ .bus_width = MMC_BUS_WIDTH_4, + .type = MMC_IS_EMMC, + .src_clk = 200000000, + .dev_comp = &mt7987_msdc_compat, diff --git a/package/boot/arm-trusted-firmware-mediatek/patches/0007-hack-mt7987-bl2-move-FIP-offset-to-0x100000.patch b/package/boot/arm-trusted-firmware-mediatek/patches/0007-hack-mt7987-bl2-move-FIP-offset-to-0x100000.patch new file mode 100644 index 0000000000..fcb60b41a1 --- /dev/null +++ b/package/boot/arm-trusted-firmware-mediatek/patches/0007-hack-mt7987-bl2-move-FIP-offset-to-0x100000.patch @@ -0,0 +1,27 @@ +From 6725bb3c2aa9330f37a591e1e539badf67021b47 Mon Sep 17 00:00:00 2001 +From: Daniel Golle +Date: Sat, 4 Oct 2025 23:59:54 +0100 +Subject: [PATCH] hack: mt7987: bl2: move FIP offset to 0x100000 + +There is no use in allocating more than 2MB to the factory partition. +After all, even for WiFi 7 tri-band devices the calibration data is +still in the kilobytes range. +Move FIP offset to 0x100000 to not waste so much space on small NOR +flash. + +Signed-off-by: Daniel Golle +--- + plat/mediatek/mt7987/bl2/bl2_dev_spi_nor.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/plat/mediatek/mt7987/bl2/bl2_dev_spi_nor.c ++++ b/plat/mediatek/mt7987/bl2/bl2_dev_spi_nor.c +@@ -7,7 +7,7 @@ + #include + #include + +-#define FIP_BASE 0x250000 ++#define FIP_BASE 0x100000 + #define FIP_SIZE 0x80000 + + #define MTK_QSPI_SRC_CLK CB_MPLL_D2 -- 2.30.2