DEPENDS:=+trusted-firmware-a-mt7988-spim-nand-ubi-comb
endef
+define U-Boot/mt7987_rfb-emmc
+ NAME:=MT7987 Reference Board
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=mediatek_mt7987a-rfb
+ UBOOT_CONFIG:=mt7987_emmc_rfb
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=sdmmc
+ BL2_SOC:=mt7987
+ BL2_DDRTYPE:=comb
+ DEPENDS:=+trusted-firmware-a-mt7987-emmc-comb
+endef
+
+define U-Boot/mt7987_rfb-spim-nand
+ NAME:=MT7987 Reference Board
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=mediatek_mt7987a-rfb
+ UBOOT_CONFIG:=mt7987_rfb
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=spim-nand0-ubi
+ BL2_SOC:=mt7987
+ BL2_DDRTYPE:=comb
+ DEPENDS:=+trusted-firmware-a-mt7987-spim-nand0-ubi-comb
+endef
+
+define U-Boot/mt7987_rfb-sd
+ NAME:=MT7987 Reference Board
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=mediatek_mt7987a-rfb
+ UBOOT_CONFIG:=mt7987_sd_rfb
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=sdmmc
+ BL2_SOC:=mt7987
+ BL2_DDRTYPE:=comb
+ DEPENDS:=+trusted-firmware-a-mt7987-sdmmc-comb
+endef
+
define U-Boot/mt7988_rfb-spim-nand
NAME:=MT7988 Reference Board
BUILD_SUBTARGET:=filogic
mt7986_xiaomi_redmi-router-ax6000 \
mt7986_zyxel_ex5601-t0 \
mt7986_rfb \
+ mt7987_rfb-emmc \
+ mt7987_rfb-sd \
+ mt7987_rfb-spim-nand \
mt7988_arcadyan_mozart \
mt7988_asus_zenwifi-bt8 \
mt7988_bananapi_bpi-r4-emmc \
--- /dev/null
+From a4d4096d6b80a2b6f5bc800426380cdc60d9b037 Mon Sep 17 00:00:00 2001
+From: Daniel Golle <daniel@makrotopia.org>
+Date: Thu, 2 Oct 2025 14:57:16 +0100
+Subject: [PATCH] ARM: dts: build DT for MT7987 RFB
+
+Compile the added device tree sources into blobs, which was forgotten
+when adding the source files.
+
+Fixes: 2d6962e0618 (arm: mediatek: add support for MediaTek MT7987 SoC)
+Signed-off-by: Daniel Golle <daniel@makrotopia.org>
+---
+ arch/arm/dts/Makefile | 3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/arch/arm/dts/Makefile
++++ b/arch/arm/dts/Makefile
+@@ -1131,6 +1131,9 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += \
+ mt7986b-sd-rfb.dtb \
+ mt7986a-emmc-rfb.dtb \
+ mt7986b-emmc-rfb.dtb \
++ mt7987a-emmc-rfb.dtb \
++ mt7987a-rfb.dtb \
++ mt7987a-sd-rfb.dtb \
+ mt7988-rfb.dtb \
+ mt7988-sd-rfb.dtb \
+ mt8183-pumpkin.dtb \
--- /dev/null
+--- a/board/mediatek/mt7987/mt7987_rfb.c
++++ b/board/mediatek/mt7987/mt7987_rfb.c
+@@ -4,3 +4,37 @@
+ * Author: Sam Shih <sam.shih@mediatek.com>
+ */
+
++#include <config.h>
++#include <dm.h>
++#include <button.h>
++#include <env.h>
++#include <init.h>
++#include <asm/global_data.h>
++#include <linux/delay.h>
++
++#ifndef CONFIG_RESET_BUTTON_LABEL
++#define CONFIG_RESET_BUTTON_LABEL "reset"
++#endif
++
++int board_late_init(void)
++{
++ gd->env_valid = 1; //to load environment variable from persistent store
++ struct udevice *dev;
++
++ gd->env_valid = ENV_VALID;
++ if (!button_get_by_label(CONFIG_RESET_BUTTON_LABEL, &dev)) {
++ puts("reset button found\n");
++#ifdef CONFIG_RESET_BUTTON_SETTLE_DELAY
++ if (CONFIG_RESET_BUTTON_SETTLE_DELAY > 0) {
++ button_get_state(dev);
++ mdelay(CONFIG_RESET_BUTTON_SETTLE_DELAY);
++ }
++#endif
++ if (button_get_state(dev) == BUTTON_ON) {
++ puts("button pushed, resetting environment\n");
++ gd->env_valid = ENV_INVALID;
++ }
++ }
++ env_relocate();
++ return 0;
++}
--- /dev/null
+--- a/board/mediatek/mt7987/mt7987_rfb.c
++++ b/board/mediatek/mt7987/mt7987_rfb.c
+@@ -10,7 +10,9 @@
+ #include <env.h>
+ #include <init.h>
+ #include <asm/global_data.h>
++#include <asm/io.h>
+ #include <linux/delay.h>
++#include <linux/libfdt.h>
+
+ #ifndef CONFIG_RESET_BUTTON_LABEL
+ #define CONFIG_RESET_BUTTON_LABEL "reset"
+@@ -38,3 +40,54 @@ int board_late_init(void)
+ env_relocate();
+ return 0;
+ }
++
++#define MT7987_BOOT_SD 0
++#define MT7987_BOOT_NOR 1
++#define MT7987_BOOT_SPIM_NAND 2
++#define MT7987_BOOT_EMMC 3
++
++int mtk_ft_system_setup(void *blob, struct bd_info *bd)
++{
++ const u32 *media_handle_p;
++ int chosen, len, ret;
++ const char *media;
++ u32 media_handle;
++
++ switch ((readl(0x1001f6f0) & 0xc0) >> 6) {
++ case MT7987_BOOT_SD:
++ media = "rootdisk-sd";
++ break
++ ;;
++ case MT7987_BOOT_NOR:
++ media = "rootdisk-nor";
++ break
++ ;;
++ case MT7987_BOOT_SPIM_NAND:
++ media = "rootdisk-spim-nand";
++ break
++ ;;
++ case MT7987_BOOT_EMMC:
++ media = "rootdisk-emmc";
++ break
++ ;;
++ }
++
++ chosen = fdt_path_offset(blob, "/chosen");
++ if (chosen <= 0)
++ return 0;
++
++ media_handle_p = fdt_getprop(blob, chosen, media, &len);
++ if (media_handle_p <= 0 || len != 4)
++ return 0;
++
++ media_handle = *media_handle_p;
++ ret = fdt_setprop(blob, chosen, "rootdisk", &media_handle, sizeof(media_handle));
++ if (ret) {
++ printf("cannot set media phandle %s as rootdisk /chosen node\n", media);
++ return ret;
++ }
++
++ printf("set /chosen/rootdisk to bootrom media: %s (phandle 0x%08x)\n", media, fdt32_to_cpu(media_handle));
++
++ return 0;
++}
--- /dev/null
+--- a/configs/mt7987_rfb_defconfig
++++ b/configs/mt7987_rfb_defconfig
+@@ -70,6 +70,7 @@ CONFIG_SPI_FLASH_XTX=y
+ CONFIG_SPI_FLASH_ZBIT=y
+ CONFIG_SPI_FLASH_MTD=y
+ CONFIG_MTD_UBI=y
++CONFIG_OF_LIBFDT_OVERLAY=y
+ CONFIG_PHY_ETHERNET_ID=y
+ CONFIG_MEDIATEK_ETH=y
+ CONFIG_PINCTRL=y
+--- a/configs/mt7987_emmc_rfb_defconfig
++++ b/configs/mt7987_emmc_rfb_defconfig
+@@ -75,6 +75,7 @@ CONFIG_SPI_FLASH_XTX=y
+ CONFIG_SPI_FLASH_ZBIT=y
+ CONFIG_SPI_FLASH_MTD=y
+ CONFIG_MTD_UBI=y
++CONFIG_OF_LIBFDT_OVERLAY=y
+ CONFIG_PHY_ETHERNET_ID=y
+ CONFIG_MEDIATEK_ETH=y
+ CONFIG_PINCTRL=y
+--- a/configs/mt7987_sd_rfb_defconfig
++++ b/configs/mt7987_sd_rfb_defconfig
+@@ -75,6 +75,7 @@ CONFIG_SPI_FLASH_XTX=y
+ CONFIG_SPI_FLASH_ZBIT=y
+ CONFIG_SPI_FLASH_MTD=y
+ CONFIG_MTD_UBI=y
++CONFIG_OF_LIBFDT_OVERLAY=y
+ CONFIG_PHY_ETHERNET_ID=y
+ CONFIG_MEDIATEK_ETH=y
+ CONFIG_PINCTRL=y