aboutsummaryrefslogtreecommitdiffstats
path: root/package/boot
diff options
context:
space:
mode:
Diffstat (limited to 'package/boot')
-rw-r--r--package/boot/apex/Makefile61
-rw-r--r--package/boot/arm-trusted-firmware-bcm63xx/Makefile43
-rw-r--r--package/boot/arm-trusted-firmware-mediatek/Makefile404
-rw-r--r--package/boot/arm-trusted-firmware-mediatek/patches/100-increase-nor-bl3-size.patch11
-rw-r--r--package/boot/arm-trusted-firmware-mvebu/Makefile129
-rw-r--r--package/boot/arm-trusted-firmware-mvebu/patches-a3700-utils/001-version.patch11
-rw-r--r--package/boot/arm-trusted-firmware-mvebu/patches-a3700-utils/002-version_mv_ddr_fix.patch12
-rw-r--r--package/boot/arm-trusted-firmware-mvebu/patches-mox-boot-builder/001-version.patch12
-rw-r--r--package/boot/arm-trusted-firmware-mvebu/patches/001-no-git.patch21
-rw-r--r--package/boot/arm-trusted-firmware-mvebu/patches/002-cryptopp_ldflags.patch13
-rw-r--r--package/boot/arm-trusted-firmware-mvebu/patches/200-hostssl.patch20
-rw-r--r--package/boot/arm-trusted-firmware-rockchip/Makefile71
-rw-r--r--package/boot/arm-trusted-firmware-sunxi/Makefile55
-rw-r--r--package/boot/arm-trusted-firmware-tools/Makefile14
-rw-r--r--package/boot/arm-trusted-firmware-tools/patches/002-darwin_compile.patch21
-rw-r--r--package/boot/at91bootstrap/Makefile82
-rw-r--r--package/boot/at91bootstrap/at91bootstrap.mk2
-rw-r--r--package/boot/grub2/Makefile57
-rw-r--r--package/boot/grub2/files/grub-early-gpt.cfg2
-rw-r--r--package/boot/kexec-tools/Makefile45
-rw-r--r--package/boot/kexec-tools/patches/001-arm-do-not-copy-magic-4-bytes-of-appended-DTB-in-zIm.patch52
-rw-r--r--package/boot/kobs-ng/Makefile2
-rw-r--r--package/boot/opensbi/Makefile63
-rw-r--r--package/boot/rkbin/Makefile47
-rw-r--r--package/boot/tfa-layerscape/Makefile159
-rw-r--r--package/boot/tfa-layerscape/patches/001-fiptool-hostbuild-fixes.patch89
-rw-r--r--package/boot/tfa-layerscape/patches/003-plat-nxp-tools-fix-create_pbl-and-byte_swap-host-bui.patch37
-rw-r--r--package/boot/tfa-layerscape/patches/004-plat-nxp-restore-ls1012afrdm-support.patch232
-rw-r--r--package/boot/uboot-armsr/Makefile36
-rw-r--r--package/boot/uboot-armsr/patches/001-v2023.07-bootstd-Use-blk-uclass-device-numbers-to-set-efi-bootdev.patch62
-rw-r--r--package/boot/uboot-at91/Makefile62
-rw-r--r--package/boot/uboot-at91/patches/001-fix-Wformat-security.patch46
-rw-r--r--package/boot/uboot-bcm4908/Makefile56
-rw-r--r--package/boot/uboot-bcm4908/patches/100-check-config-allow-to-complete-build-even-with-ad-ho.patch40
-rw-r--r--package/boot/uboot-bcm4908/patches/200-configs-bcm94908-unset-CONFIG_SPL.patch50
-rw-r--r--package/boot/uboot-bcm4908/patches/201-Assume-TPL-support-for-ATF-when-compiling-U-Boot-wit.patch67
-rw-r--r--package/boot/uboot-bcm53xx/Makefile37
-rw-r--r--package/boot/uboot-envtools/Makefile23
-rw-r--r--package/boot/uboot-envtools/files/apm821xx4
-rw-r--r--package/boot/uboot-envtools/files/ath7983
-rw-r--r--package/boot/uboot-envtools/files/imx_cortexa719
-rw-r--r--package/boot/uboot-envtools/files/imx_cortexa9 (renamed from package/boot/uboot-envtools/files/imx6)2
-rw-r--r--package/boot/uboot-envtools/files/ipq40xx10
-rw-r--r--package/boot/uboot-envtools/files/ipq806x9
-rw-r--r--package/boot/uboot-envtools/files/kirkwood1
-rw-r--r--package/boot/uboot-envtools/files/layerscape5
-rw-r--r--package/boot/uboot-envtools/files/mediatek_filogic127
-rw-r--r--package/boot/uboot-envtools/files/mediatek_mt762250
-rw-r--r--package/boot/uboot-envtools/files/mediatek_mt76234
-rw-r--r--package/boot/uboot-envtools/files/mediatek_mt762924
-rw-r--r--package/boot/uboot-envtools/files/mpc85xx14
-rw-r--r--package/boot/uboot-envtools/files/mvebu21
-rw-r--r--package/boot/uboot-envtools/files/octeon23
-rw-r--r--package/boot/uboot-envtools/files/oxnas2
-rw-r--r--package/boot/uboot-envtools/files/qoriq19
-rw-r--r--package/boot/uboot-envtools/files/qualcommax_ipq807x63
-rw-r--r--package/boot/uboot-envtools/files/ramips90
-rw-r--r--package/boot/uboot-envtools/files/realtek34
-rw-r--r--package/boot/uboot-envtools/patches/002-Revert-tools-env-use-run-to-store-lockfile.patch41
-rw-r--r--package/boot/uboot-envtools/patches/010-fw_env-fix-reading-NVMEM-device-s-compatible-value.patch70
-rw-r--r--package/boot/uboot-envtools/patches/011-fw_env-keep-calling-read-until-whole-flash-block-is-.patch75
-rw-r--r--package/boot/uboot-envtools/patches/012-fw_env-autodetect-NAND-erase-size-and-env-sectors.patch49
-rw-r--r--package/boot/uboot-fritz4040/Makefile15
-rw-r--r--package/boot/uboot-imx/Makefile (renamed from package/boot/uboot-imx6/Makefile)26
-rw-r--r--package/boot/uboot-imx/patches/0001-apalis_imx6_defconfig-enable-some-useful-commands.patch (renamed from package/boot/uboot-imx6/patches/0001-apalis_imx6_defconfig-enable-some-useful-commands.patch)21
-rw-r--r--package/boot/uboot-imx6/patches/110-mx6cuboxi-mmc-fallback.patch15
-rw-r--r--package/boot/uboot-imx6/patches/111-mx6cuboxi_defconfig-force-mmc-boot.patch23
-rw-r--r--package/boot/uboot-kirkwood/Makefile3
-rw-r--r--package/boot/uboot-lantiq/Makefile2
-rw-r--r--package/boot/uboot-lantiq/patches/0030-lzma-force-8bit-reads.patch57
-rw-r--r--package/boot/uboot-lantiq/patches/0031-dma-lantiq-fix-out-of-bounds-cache-invalidate.patch62
-rw-r--r--package/boot/uboot-lantiq/patches/0032-MIPS-lantiq-danube-fix-SPL-boot.patch34
-rw-r--r--package/boot/uboot-lantiq/patches/0033-MIPS-lantiq-reduce-stack-size.patch56
-rw-r--r--package/boot/uboot-lantiq/patches/101-fix-crypt-header-clash.patch172
-rw-r--r--package/boot/uboot-layerscape/Makefile22
-rw-r--r--package/boot/uboot-layerscape/files/fsl_ls1012a-frdm-uEnv.txt3
-rw-r--r--package/boot/uboot-layerscape/files/fsl_ls1012a-frwy-sdboot-uEnv.txt3
-rw-r--r--package/boot/uboot-layerscape/files/fsl_ls1012a-rdb-uEnv.txt3
-rw-r--r--package/boot/uboot-layerscape/files/fsl_ls1021a-iot-sdboot-uEnv.txt5
-rw-r--r--package/boot/uboot-layerscape/files/fsl_ls1021a-twr-sdboot-uEnv.txt3
-rw-r--r--package/boot/uboot-layerscape/files/fsl_ls1021a-twr-uEnv.txt3
-rw-r--r--package/boot/uboot-layerscape/files/fsl_ls1028a-rdb-sdboot-uEnv.txt10
-rw-r--r--package/boot/uboot-layerscape/files/fsl_ls1028a-rdb-uEnv.txt9
-rw-r--r--package/boot/uboot-layerscape/files/fsl_ls1043a-rdb-sdboot-uEnv.txt3
-rw-r--r--package/boot/uboot-layerscape/files/fsl_ls1043a-rdb-uEnv.txt3
-rw-r--r--package/boot/uboot-layerscape/files/fsl_ls1046a-frwy-sdboot-uEnv.txt3
-rw-r--r--package/boot/uboot-layerscape/files/fsl_ls1046a-frwy-uEnv.txt3
-rw-r--r--package/boot/uboot-layerscape/files/fsl_ls1046a-rdb-sdboot-uEnv.txt3
-rw-r--r--package/boot/uboot-layerscape/files/fsl_ls1046a-rdb-uEnv.txt3
-rw-r--r--package/boot/uboot-layerscape/files/fsl_ls1088a-rdb-sdboot-uEnv.txt3
-rw-r--r--package/boot/uboot-layerscape/files/fsl_ls1088a-rdb-uEnv.txt3
-rw-r--r--package/boot/uboot-layerscape/files/fsl_ls2088a-rdb-uEnv.txt3
-rw-r--r--package/boot/uboot-layerscape/files/fsl_lx2160a-rdb-sdboot-uEnv.txt3
-rw-r--r--package/boot/uboot-layerscape/files/fsl_lx2160a-rdb-uEnv.txt3
-rw-r--r--package/boot/uboot-layerscape/patches/0001-board-ls1046ardb-force-PCI-device-enumeration.patch33
-rw-r--r--package/boot/uboot-layerscape/patches/0002-board-ls1043ardb-force-PCI-device-enumeration.patch34
-rw-r--r--package/boot/uboot-layerscape/patches/0900-layerscape-adjust-LS1021A-IOT-config-for-OpenWrt.patch45
-rw-r--r--package/boot/uboot-mediatek/Makefile624
-rw-r--r--package/boot/uboot-mediatek/patches/000-mtk-01-Revert-clk-Add-debugging-for-return-values.patch69
-rw-r--r--package/boot/uboot-mediatek/patches/000-mtk-03-pinctrl-mediatek-fix-wrong-assignment-in-mtk_get_pin.patch25
-rw-r--r--package/boot/uboot-mediatek/patches/000-mtk-04-pinctrl-mediatek-add-get_pin_muxing-ops-for-mediatek.patch43
-rw-r--r--package/boot/uboot-mediatek/patches/000-mtk-05-pinctrl-mediatek-do-not-probe-gpio-driver-if-not-ena.patch58
-rw-r--r--package/boot/uboot-mediatek/patches/000-mtk-06-pinctrl-mt7629-add-jtag-function-and-pin-group.patch50
-rw-r--r--package/boot/uboot-mediatek/patches/000-mtk-07-configs-mt7622-use-ARMv8-Generic-Timer-instead-of-mt.patch25
-rw-r--r--package/boot/uboot-mediatek/patches/000-mtk-08-dts-mt7629-enable-JTAG-pins-by-default.patch50
-rw-r--r--package/boot/uboot-mediatek/patches/000-mtk-09-board-mediatek-add-more-network-configurations.patch44
-rw-r--r--package/boot/uboot-mediatek/patches/000-mtk-10-mmc-mtk-sd-increase-the-minimum-bus-frequency.patch38
-rw-r--r--package/boot/uboot-mediatek/patches/000-mtk-11-serial-serial-mtk-rewrite-the-setbrg-function.patch141
-rw-r--r--package/boot/uboot-mediatek/patches/000-mtk-12-board-mt7629-enable-compression-of-u-boot-to-reduce-.patch94
-rw-r--r--package/boot/uboot-mediatek/patches/000-mtk-13-configs-mt7622-enable-debug-uart-for-mt7622_rfb_defc.patch26
-rw-r--r--package/boot/uboot-mediatek/patches/000-mtk-19-configs-mt7629-remove-unused-options-and-add-dm-comm.patch31
-rw-r--r--package/boot/uboot-mediatek/patches/000-mtk-20-configs-mt7622-enable-environment-for-mt7622_rfb.patch14
-rw-r--r--package/boot/uboot-mediatek/patches/001-disk-part_dos.c-Fix-a-variable-typo-in-write_mbr_par.patch26
-rw-r--r--package/boot/uboot-mediatek/patches/050-mt7622-enable-pstore.patch2
-rw-r--r--package/boot/uboot-mediatek/patches/051-mt7986-enable-pstore.patch38
-rw-r--r--package/boot/uboot-mediatek/patches/052-mt7981-enable-pstore.patch38
-rw-r--r--package/boot/uboot-mediatek/patches/100-02-drivers-mtd-add-support-for-MediaTek-SPI-NAND-flash-.patch (renamed from package/boot/uboot-mediatek/patches/000-mtk-14-drivers-mtd-add-support-for-MediaTek-SPI-NAND-flash-.patch)468
-rw-r--r--package/boot/uboot-mediatek/patches/100-03-mtd-mtk-snand-add-support-for-SPL.patch (renamed from package/boot/uboot-mediatek/patches/000-mtk-15-mtd-mtk-snand-add-support-for-SPL.patch)13
-rw-r--r--package/boot/uboot-mediatek/patches/100-04-env-add-support-for-generic-MTD-device.patch (renamed from package/boot/uboot-mediatek/patches/000-mtk-16-env-add-support-for-generic-MTD-device.patch)51
-rw-r--r--package/boot/uboot-mediatek/patches/100-05-mtd-add-a-new-mtd-device-type-for-NMBM.patch44
-rw-r--r--package/boot/uboot-mediatek/patches/100-06-mtd-add-core-facility-code-of-NMBM.patch3422
-rw-r--r--package/boot/uboot-mediatek/patches/100-07-mtd-nmbm-add-support-for-mtd.patch958
-rw-r--r--package/boot/uboot-mediatek/patches/100-08-common-board_r-add-support-to-initialize-NMBM-after-.patch46
-rw-r--r--package/boot/uboot-mediatek/patches/100-09-cmd-add-nmbm-command.patch370
-rw-r--r--package/boot/uboot-mediatek/patches/100-10-cmd-mtd-add-markbad-subcommand-for-NMBM-testing.patch80
-rw-r--r--package/boot/uboot-mediatek/patches/100-11-env-add-support-for-NMBM-upper-MTD-layer.patch260
-rw-r--r--package/boot/uboot-mediatek/patches/100-12-mtd-mtk-snand-add-NMBM-support-for-SPL.patch173
-rw-r--r--package/boot/uboot-mediatek/patches/100-13-cmd-add-a-new-command-for-NAND-flash-debugging.patch1118
-rw-r--r--package/boot/uboot-mediatek/patches/100-14-mtd-spi-nor-add-support-to-read-flash-unique-ID.patch142
-rw-r--r--package/boot/uboot-mediatek/patches/100-15-cmd-sf-add-support-to-read-flash-unique-ID.patch46
-rw-r--r--package/boot/uboot-mediatek/patches/100-16-cmd-bootmenu-add-ability-to-select-item-by-shortkey.patch323
-rw-r--r--package/boot/uboot-mediatek/patches/100-17-common-spl-spl_nand-enable-CONFIG_SYS_NAND_U_BOOT_OF.patch28
-rw-r--r--package/boot/uboot-mediatek/patches/100-18-board-mt7629-add-support-for-booting-from-SPI-NAND.patch (renamed from package/boot/uboot-mediatek/patches/000-mtk-17-board-mt7629-add-support-for-booting-from-SPI-NAND.patch)112
-rw-r--r--package/boot/uboot-mediatek/patches/100-19-board-mt7622-use-new-spi-nand-driver.patch (renamed from package/boot/uboot-mediatek/patches/000-mtk-18-board-mt7622-use-new-spi-nand-driver.patch)20
-rw-r--r--package/boot/uboot-mediatek/patches/100-20-board-mt7981-add-reference-board-using-new-spi-nand-.patch223
-rw-r--r--package/boot/uboot-mediatek/patches/100-21-mtd-spi-nor-add-more-flash-ids.patch76
-rw-r--r--package/boot/uboot-mediatek/patches/100-22-mtd-spi-nand-backport-from-upstream-kernel.patch549
-rw-r--r--package/boot/uboot-mediatek/patches/100-23-mmc-mtk-sd-add-support-to-display-verbose-error-log.patch78
-rw-r--r--package/boot/uboot-mediatek/patches/100-24-cmd-ubi-make-volume-find-create-remove-APIs-public.patch58
-rw-r--r--package/boot/uboot-mediatek/patches/100-25-cmd-ubi-allow-creating-volume-with-all-free-spaces.patch27
-rw-r--r--package/boot/uboot-mediatek/patches/100-26-env-ubi-add-support-to-create-environment-volume-if-.patch72
-rw-r--r--package/boot/uboot-mediatek/patches/100-27-mtd-ubi-add-support-for-UBI-end-of-filesystem-marker.patch66
-rw-r--r--package/boot/uboot-mediatek/patches/100-29-board-mediatek-wire-up-NMBM-support.patch238
-rw-r--r--package/boot/uboot-mediatek/patches/100-scripts-remove-dependency-on-swig.patch24
-rw-r--r--package/boot/uboot-mediatek/patches/103-mt7988-enable-pstore.patch33
-rw-r--r--package/boot/uboot-mediatek/patches/105-configs-add-usefull-stuff-to-mt7988-rfb.patch314
-rw-r--r--package/boot/uboot-mediatek/patches/106-configs-sync-mt7981-rfb-storage.patch129
-rw-r--r--package/boot/uboot-mediatek/patches/107-configs-add-useful-options-to-mt7981-rfb.patch474
-rw-r--r--package/boot/uboot-mediatek/patches/108-dts-arm64-mt7981-rfb-add-mtd-partitions.patch140
-rw-r--r--package/boot/uboot-mediatek/patches/110-no-kwbimage.patch10
-rw-r--r--package/boot/uboot-mediatek/patches/120-use-xz-instead-of-lzma.patch2
-rw-r--r--package/boot/uboot-mediatek/patches/130-fix-mkimage-host-build.patch24
-rw-r--r--package/boot/uboot-mediatek/patches/160-net-phy-add-support-for-Airoha-ethernet-PHY-driver.patch1929
-rw-r--r--package/boot/uboot-mediatek/patches/200-cmd-add-imsz-and-imszb.patch32
-rw-r--r--package/boot/uboot-mediatek/patches/210-cmd-bootmenu-add-ability-to-select-item-by-shortkey.patch192
-rw-r--r--package/boot/uboot-mediatek/patches/211-cmd-bootmenu-custom-title.patch31
-rw-r--r--package/boot/uboot-mediatek/patches/220-cmd-env-readmem.patch10
-rw-r--r--package/boot/uboot-mediatek/patches/230-cmd-add-pstore-check.patch6
-rw-r--r--package/boot/uboot-mediatek/patches/250-fix-mmc-erase-timeout.patch11
-rw-r--r--package/boot/uboot-mediatek/patches/260-add-missing-type-u64.patch10
-rw-r--r--package/boot/uboot-mediatek/patches/280-image-fdt-save-name-of-FIT-configuration-in-chosen-node.patch31
-rw-r--r--package/boot/uboot-mediatek/patches/301-mt7622-generic-reset-button-ignore-env.patch (renamed from package/boot/uboot-mediatek/patches/300-mt7622-generic-reset-button-ignore-env.patch)25
-rw-r--r--package/boot/uboot-mediatek/patches/302-mt7623-generic-reset-button-ignore-env.patch46
-rw-r--r--package/boot/uboot-mediatek/patches/303-mt7986-generic-reset-button-ignore-env.patch43
-rw-r--r--package/boot/uboot-mediatek/patches/304-mt7981-generic-reset-button-ignore-env.patch43
-rw-r--r--package/boot/uboot-mediatek/patches/305-mt7988-generic-reset-button-ignore-env.patch46
-rw-r--r--package/boot/uboot-mediatek/patches/310-mt7988-select-rootdisk.patch67
-rw-r--r--package/boot/uboot-mediatek/patches/311-mt7986-select-roodisk.patch67
-rw-r--r--package/boot/uboot-mediatek/patches/312-mt7622-select-rootdisk.patch141
-rw-r--r--package/boot/uboot-mediatek/patches/350-add-support-for-Winbond-W25Q512JV.patch11
-rw-r--r--package/boot/uboot-mediatek/patches/400-update-bpir2-defconfig.patch155
-rw-r--r--package/boot/uboot-mediatek/patches/401-update-u7623-defconfig.patch245
-rw-r--r--package/boot/uboot-mediatek/patches/402-update-bananapi-bpi-r64-device-tree.patch26
-rw-r--r--package/boot/uboot-mediatek/patches/403-add-bananapi_bpi-r64-snand.patch28
-rw-r--r--package/boot/uboot-mediatek/patches/404-add-bananapi_bpi-r64_defconfigs.patch105
-rw-r--r--package/boot/uboot-mediatek/patches/405-dts-mt7623n-bpi-r2-fix-leds.patch25
-rw-r--r--package/boot/uboot-mediatek/patches/406-dts-mt7623n-bpi-r2-uart0-force-highspeed.patch10
-rw-r--r--package/boot/uboot-mediatek/patches/410-add-linksys-e8450.patch70
-rw-r--r--package/boot/uboot-mediatek/patches/412-add-ubnt-unifi-6-lr.patch671
-rw-r--r--package/boot/uboot-mediatek/patches/420-add-support-for-RAVPower-RP-WD009.patch (renamed from package/boot/uboot-ramips/patches/0001-add-support-for-RAVPower-RP-WD009.patch)150
-rw-r--r--package/boot/uboot-mediatek/patches/421-zbtlink_zbt-wg3526-16m.patch314
-rw-r--r--package/boot/uboot-mediatek/patches/430-add-bpi-r3.patch1113
-rw-r--r--package/boot/uboot-mediatek/patches/431-add-xiaomi_redmi-ax6000.patch404
-rw-r--r--package/boot/uboot-mediatek/patches/432-add-tplink-xdr608x.patch934
-rw-r--r--package/boot/uboot-mediatek/patches/433-add-qihoo_360t7.patch425
-rw-r--r--package/boot/uboot-mediatek/patches/434-add-xiaomi_mi-router-wr30u.patch461
-rw-r--r--package/boot/uboot-mediatek/patches/435-add-h3c_magic-nx30-pro.patch445
-rw-r--r--package/boot/uboot-mediatek/patches/436-add-glinet-mt6000.patch274
-rw-r--r--package/boot/uboot-mediatek/patches/437-add-cmcc_rax3000m.patch697
-rw-r--r--package/boot/uboot-mediatek/patches/438-add-jcg_q30-pro.patch420
-rw-r--r--package/boot/uboot-mediatek/patches/439-add-zyxel_ex5601-t0.patch431
-rw-r--r--package/boot/uboot-mediatek/patches/440-add-jdcloud_re-cp-03.patch324
-rw-r--r--package/boot/uboot-mediatek/patches/440-add-xiaomi_mi-router-ax3000t.patch414
-rw-r--r--package/boot/uboot-mediatek/patches/442-add-bpi-r3-mini.patch779
-rw-r--r--package/boot/uboot-mediatek/patches/450-add-bpi-r4.patch998
-rw-r--r--package/boot/uboot-mediatek/patches/500-board-mt7623-fix-mmc-detect.patch21
-rw-r--r--package/boot/uboot-mvebu/Makefile34
-rw-r--r--package/boot/uboot-mvebu/patches/0001-arm-mvebu-Espressobin-move-FDT-fixup-into-a-separate.patch54
-rw-r--r--package/boot/uboot-mvebu/patches/0002-arm-mvebu-Espressobin-move-network-setup-into-a-sepa.patch53
-rw-r--r--package/boot/uboot-mvebu/patches/0003-arm-mvebu-eDPU-support-new-board-revision.patch297
-rw-r--r--package/boot/uboot-mvebu/patches/0004-arm-mvebu-clearfog-read-number-of-ddr-channels-from-.patch85
-rw-r--r--package/boot/uboot-mvebu/patches/0005-arm-mvebu-clearfog-support-512MB-memory-size-from-tl.patch31
-rw-r--r--package/boot/uboot-mvebu/patches/210-link-libcrypto-static.patch14
-rw-r--r--package/boot/uboot-mxs/Makefile15
-rw-r--r--package/boot/uboot-mxs/patches/210-link-libcrypto-static.patch14
-rw-r--r--package/boot/uboot-omap/Makefile13
-rw-r--r--package/boot/uboot-oxnas/Makefile2
-rw-r--r--package/boot/uboot-ramips/Makefile34
-rw-r--r--package/boot/uboot-rockchip/Makefile150
-rw-r--r--package/boot/uboot-rockchip/patches/001-scripts-remove-dependency-on-swig.patch24
-rw-r--r--package/boot/uboot-rockchip/patches/002-spl-remove-dtoc-of-pdata-generation.patch30
-rw-r--r--package/boot/uboot-rockchip/patches/101-rock64pro-disable-CONFIG_USE_PREBOOT.patch27
-rw-r--r--package/boot/uboot-rockchip/patches/102-arm64-rk3399-Add-support-NanoPi-R4s.patch290
-rw-r--r--package/boot/uboot-rockchip/patches/105-nanopc-t4-fix-memory-unstability.patch22
-rw-r--r--package/boot/uboot-rockchip/src/of-platdata/nanopi-r2s-rk3328/dt-plat.c127
-rw-r--r--package/boot/uboot-rockchip/src/of-platdata/nanopi-r2s-rk3328/dt-structs-gen.h51
-rw-r--r--package/boot/uboot-sifiveu/Makefile65
-rw-r--r--package/boot/uboot-sifiveu/patches/0002-board-sifive-spl-Initialized-the-PWM-setting-in-the-.patch104
-rw-r--r--package/boot/uboot-sifiveu/patches/0003-board-sifive-Set-LED-s-color-to-purple-in-the-U-boot.patch68
-rw-r--r--package/boot/uboot-sifiveu/patches/0004-board-sifive-Set-LED-s-color-to-blue-before-jumping-.patch30
-rw-r--r--package/boot/uboot-sifiveu/patches/0005-board-sifive-spl-Set-remote-thermal-of-TMP451-to-85-.patch111
-rw-r--r--package/boot/uboot-sifiveu/patches/0008-riscv-dts-Add-few-PMU-events.patch36
-rw-r--r--package/boot/uboot-sifiveu/patches/0009-riscv-Fix-build-against-binutils.patch50
-rw-r--r--package/boot/uboot-sifiveu/patches/100-mkimage-check-environment-for-dtc-binary-location.patch35
-rw-r--r--package/boot/uboot-sifiveu/patches/110-no-kwbimage.patch10
-rw-r--r--package/boot/uboot-sifiveu/patches/130-fix-mkimage-host-build.patch24
-rw-r--r--package/boot/uboot-sifiveu/uEnv-default.txt5
-rw-r--r--package/boot/uboot-sunxi/Makefile67
-rw-r--r--package/boot/uboot-sunxi/patches/003-add-theobroma-a31-pangolin.patch375
-rw-r--r--package/boot/uboot-sunxi/patches/062-A20-improve-gmac-upload.patch2
-rw-r--r--package/boot/uboot-sunxi/patches/063-fix-lime2-revK-add-micrel-PHY.patch44
-rw-r--r--package/boot/uboot-sunxi/patches/091-sun6i-sync-PLL1-multdiv-with-Boot1.patch2
-rw-r--r--package/boot/uboot-sunxi/patches/093-sun6i-fix-PLL-LDO-voltselect.patch6
-rw-r--r--package/boot/uboot-sunxi/patches/100-sun6i-alternate-on-UART2.patch16
-rw-r--r--package/boot/uboot-sunxi/patches/101-sun6i-support-console-on-UART2.patch30
-rw-r--r--package/boot/uboot-sunxi/patches/102-sunxi-make_CONS_INDEX-configurable.patch23
-rw-r--r--package/boot/uboot-sunxi/patches/200-mkimage-check-environment-for-dtc-binary-location.patch2
-rw-r--r--package/boot/uboot-sunxi/patches/210-sunxi-deactivate-binman.patch37
-rw-r--r--package/boot/uboot-sunxi/patches/230-disable-axp209-on-a13-olinuxino.diff19
-rw-r--r--package/boot/uboot-sunxi/patches/250-sun8i-h3-zeropi-add-device-tree.patch81
-rw-r--r--package/boot/uboot-sunxi/patches/251-sun8i-h3-zeropi-add-defconfig.patch24
-rw-r--r--package/boot/uboot-sunxi/patches/252-sunxi-h3-add-support-for-nanopi-r1.patch162
-rw-r--r--package/boot/uboot-sunxi/patches/254-sunxi-h2-add-bpi-p2-zero.patch307
-rw-r--r--package/boot/uboot-sunxi/patches/260-add-missing-type-u64.patch10
-rw-r--r--package/boot/uboot-sunxi/uEnv-default.txt8
-rw-r--r--package/boot/uboot-sunxi/uEnv-h616.txt7
-rw-r--r--package/boot/uboot-tegra/Makefile3
-rw-r--r--package/boot/uboot-zynq/Makefile3
-rw-r--r--package/boot/uboot-zynq/patches/210-link-libcrypto-static.patch14
249 files changed, 27643 insertions, 3608 deletions
diff --git a/package/boot/apex/Makefile b/package/boot/apex/Makefile
new file mode 100644
index 00000000000..66a1b7667eb
--- /dev/null
+++ b/package/boot/apex/Makefile
@@ -0,0 +1,61 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# Copyright (C) 2006-2023 OpenWrt.org
+
+include $(TOPDIR)/rules.mk
+include $(INCLUDE_DIR)/kernel.mk
+
+PKG_NAME:=apex
+# This version was created from the stalled and unreleased v1.6.10
+# with some patches on top.
+PKG_VERSION:=1.6.10-openwrt
+PKG_RELEASE:=1
+
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_URL:=https://github.com/linusw/apex.git
+PKG_SOURCE_VERSION:=483e18aa133d5e25866570c29b124530b2d1e0d3
+PKG_MIRROR_HASH:=42230bb436f5590447ca55e8befb8927e6ea74c1e6953c043bbbef986c411704
+
+PKG_TARGETS:=bin
+PKG_FLAGS:=nonshared
+PKG_LICENSE:=GPL-2.0
+PKG_LICENSE_FILES:=COPYING
+
+include $(INCLUDE_DIR)/package.mk
+
+export GCC_HONOUR_COPTS=s
+
+define Package/apex
+ SECTION:=boot
+ CATEGORY:=Boot Loaders
+ DEPENDS:=@TARGET_ixp4xx @!IN_SDK
+ DEFAULT:=y
+ TITLE:=Boot loader for NSLU2, FSG3, NAS100D and others
+endef
+
+define build_apex
+ $(MAKE) -C $(PKG_BUILD_DIR) \
+ ARCH=arm \
+ $(1)_config
+ $(MAKE) -C $(PKG_BUILD_DIR) \
+ $(TARGET_CONFIGURE_OPTS) \
+ KBUILD_HAVE_NLS=no \
+ ARCH=arm \
+ clean all
+ $(INSTALL_BIN) $(PKG_BUILD_DIR)/apex.bin $(PKG_BUILD_DIR)/out/apex-$(2).bin
+endef
+
+define Build/Compile
+ $(INSTALL_DIR) $(PKG_BUILD_DIR)/out
+ $(call build_apex,openwrt-nslu2-armeb,nslu2-armeb)
+ $(call build_apex,openwrt-nslu2-16mb-armeb,nslu2-16mb-armeb)
+ $(call build_apex,openwrt-fsg3-armeb,fsg3-armeb)
+ $(call build_apex,openwrt-nas100d-armeb,nas100d-armeb)
+endef
+
+define Build/InstallDev
+ $(INSTALL_DIR) $(STAGING_DIR_IMAGE)/apex
+ $(CP) $(PKG_BUILD_DIR)/out/*.bin $(STAGING_DIR_IMAGE)/apex
+endef
+
+$(eval $(call BuildPackage,apex))
diff --git a/package/boot/arm-trusted-firmware-bcm63xx/Makefile b/package/boot/arm-trusted-firmware-bcm63xx/Makefile
new file mode 100644
index 00000000000..69289af2d9e
--- /dev/null
+++ b/package/boot/arm-trusted-firmware-bcm63xx/Makefile
@@ -0,0 +1,43 @@
+# SPDX-License-Identifier: GPL-2.0
+
+include $(TOPDIR)/rules.mk
+
+PKG_VERSION:=2.2
+PKG_RELEASE:=2
+
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_URL=$(PROJECT_GIT)/project/bcm63xx/atf.git
+PKG_SOURCE_DATE:=2021-12-24
+PKG_SOURCE_VERSION:=e6d46baf3fae79f693f90bf34f7284c3dfc64aef
+PKG_MIRROR_HASH:=9d5d04f572b1b6ddc6eb3064b9cb09f5fe982e82d350790041d35316349af124
+
+PKG_MAINTAINER:=Rafał Miłecki <rafal@milecki.pl>
+
+include $(INCLUDE_DIR)/kernel.mk
+include $(INCLUDE_DIR)/trusted-firmware-a.mk
+include $(INCLUDE_DIR)/package.mk
+
+define Trusted-Firmware-A/Default
+ PLAT:=bcm
+ DEFAULT:=y
+endef
+
+define Trusted-Firmware-A/bcm4908
+ BUILD_TARGET:=bcm4908
+ NAME:=BCM4908
+ BRCM_CHIP=4908
+ TFA_IMAGE:=bl31.bin
+endef
+
+TFA_TARGETS:= \
+ bcm4908
+
+TFA_MAKE_FLAGS += \
+ BRCM_CHIP=$(BRCM_CHIP)
+
+define Package/trusted-firmware-a/install
+ $(INSTALL_DIR) $(STAGING_DIR_IMAGE)
+ $(INSTALL_DATA) $(PKG_BUILD_DIR)/build/$(PLAT)/release/$(TFA_IMAGE) $(STAGING_DIR_IMAGE)/
+endef
+
+$(eval $(call BuildPackage/Trusted-Firmware-A))
diff --git a/package/boot/arm-trusted-firmware-mediatek/Makefile b/package/boot/arm-trusted-firmware-mediatek/Makefile
index 4cf9bec7e92..abdd6e7e4a3 100644
--- a/package/boot/arm-trusted-firmware-mediatek/Makefile
+++ b/package/boot/arm-trusted-firmware-mediatek/Makefile
@@ -1,6 +1,6 @@
#
# Copyright (C) 2017 Hauke Mehrtens
-# Copyright (C) 2021 Daniel Golle
+# Copyright (C) 2021-2023 Daniel Golle
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
@@ -9,96 +9,468 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=arm-trusted-firmware-mediatek
-PKG_RELEASE:=$(AUTORELEASE)
+PKG_RELEASE:=1
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL=https://github.com/mtk-openwrt/arm-trusted-firmware.git
-PKG_SOURCE_DATE:=2021-05-08
-PKG_SOURCE_VERSION:=d2c75b2139be003887af9cc5a94da5e9bdc59de7
-PKG_MIRROR_HASH:=4af9ce8e11511afee7f588cc982946c06339edbfa47afef6a7f3e2231ac9f34d
+PKG_SOURCE_DATE:=2023-10-13
+PKG_SOURCE_VERSION:=0ea67d76ae8be127c91caa3fcdf449b1fe533175
+PKG_MIRROR_HASH:=b102f6ffaa7cd2202161c44cab4d27f426d9d74c311ea9eb4d2f371ea2af4a2e
PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
+include $(INCLUDE_DIR)/kernel.mk
include $(INCLUDE_DIR)/trusted-firmware-a.mk
include $(INCLUDE_DIR)/package.mk
define Trusted-Firmware-A/Default
BUILD_TARGET:=mediatek
- BUILD_SUBTARGET:=mt7622
- PLAT:=mt7622
TFA_IMAGE:=bl2.img bl31.bin
+ HIDDEN:=y
BOOT_DEVICE:=
DDR3_FLYBY:=
+ DDR_TYPE:=
+ NAND_TYPE:=
+ BOARD_QFN:=
+ DRAM_USE_COMB:=
+ USE_UBI:=
endef
define Trusted-Firmware-A/mt7622-nor-1ddr
NAME:=MediaTek MT7622 (SPI-NOR, 1x DDR3)
+ BUILD_SUBTARGET:=mt7622
+ PLAT:=mt7622
BOOT_DEVICE:=nor
endef
define Trusted-Firmware-A/mt7622-nor-2ddr
NAME:=MediaTek MT7622 (SPI-NOR, 2x DDR3)
+ BUILD_SUBTARGET:=mt7622
+ PLAT:=mt7622
BOOT_DEVICE:=nor
DDR3_FLYBY:=1
endef
define Trusted-Firmware-A/mt7622-snand-1ddr
NAME:=MediaTek MT7622 (SPI-NAND, 1x DDR3)
+ BUILD_SUBTARGET:=mt7622
+ PLAT:=mt7622
BOOT_DEVICE:=snand
endef
+define Trusted-Firmware-A/mt7622-snand-ubi-1ddr
+ NAME:=MediaTek MT7622 (SPI-NAND using UBI, 1x DDR3)
+ BUILD_SUBTARGET:=mt7622
+ PLAT:=mt7622
+ BOOT_DEVICE:=snand
+ USE_UBI:=1
+endef
+
define Trusted-Firmware-A/mt7622-snand-2ddr
NAME:=MediaTek MT7622 (SPI-NAND, 2x DDR3)
+ BUILD_SUBTARGET:=mt7622
+ PLAT:=mt7622
BOOT_DEVICE:=snand
DDR3_FLYBY:=1
endef
+define Trusted-Firmware-A/mt7622-snand-ubi-2ddr
+ NAME:=MediaTek MT7622 (SPI-NAND using UBI, 2x DDR3)
+ BUILD_SUBTARGET:=mt7622
+ PLAT:=mt7622
+ BOOT_DEVICE:=snand
+ DDR3_FLYBY:=1
+ USE_UBI:=1
+endef
+
define Trusted-Firmware-A/mt7622-emmc-1ddr
NAME:=MediaTek MT7622 (eMMC, 1x DDR3)
+ BUILD_SUBTARGET:=mt7622
+ PLAT:=mt7622
BOOT_DEVICE:=emmc
endef
define Trusted-Firmware-A/mt7622-emmc-2ddr
NAME:=MediaTek MT7622 (eMMC, 2x DDR3)
+ BUILD_SUBTARGET:=mt7622
+ PLAT:=mt7622
BOOT_DEVICE:=emmc
DDR3_FLYBY:=1
endef
define Trusted-Firmware-A/mt7622-sdmmc-1ddr
- NAME:=MediaTek MT7622 (SDcard, 1x DDR3)
+ NAME:=MediaTek MT7622 (SD card, 1x DDR3)
+ BUILD_SUBTARGET:=mt7622
+ PLAT:=mt7622
BOOT_DEVICE:=sdmmc
endef
define Trusted-Firmware-A/mt7622-sdmmc-2ddr
- NAME:=MediaTek MT7622 (SDcard, 2x DDR3)
+ NAME:=MediaTek MT7622 (SD card, 2x DDR3)
+ BUILD_SUBTARGET:=mt7622
+ PLAT:=mt7622
BOOT_DEVICE:=sdmmc
DDR3_FLYBY:=1
endef
+define Trusted-Firmware-A/mt7981-emmc-ddr4
+ NAME:=MediaTek MT7981 (eMMC, DDR4)
+ BOOT_DEVICE:=emmc
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7981
+ DDR_TYPE:=ddr4
+endef
+
+define Trusted-Firmware-A/mt7981-spim-nand-ddr4
+ NAME:=MediaTek MT7981 (SPI-NAND via SPIM, DDR4)
+ BOOT_DEVICE:=spim-nand
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7981
+ DDR_TYPE:=ddr4
+endef
+
+define Trusted-Firmware-A/mt7981-nor-ddr3
+ NAME:=MediaTek MT7981 (SPI-NOR, DDR3)
+ BOOT_DEVICE:=nor
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7981
+ DDR_TYPE:=ddr3
+endef
+
+define Trusted-Firmware-A/mt7981-emmc-ddr3
+ NAME:=MediaTek MT7981 (eMMC, DDR3)
+ BOOT_DEVICE:=emmc
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7981
+ DDR_TYPE:=ddr3
+endef
+
+define Trusted-Firmware-A/mt7981-sdmmc-ddr3
+ NAME:=MediaTek MT7981 (SD card, DDR3)
+ BOOT_DEVICE:=sdmmc
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7981
+ DDR_TYPE:=ddr3
+endef
+
+define Trusted-Firmware-A/mt7981-snand-ddr3
+ NAME:=MediaTek MT7981 (SPI-NAND via SNFI, DDR3)
+ BOOT_DEVICE:=snand
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7981
+ DDR_TYPE:=ddr3
+endef
+
+define Trusted-Firmware-A/mt7981-spim-nand-ddr3
+ NAME:=MediaTek MT7981 (SPI-NAND via SPIM, DDR3)
+ BOOT_DEVICE:=spim-nand
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7981
+ DDR_TYPE:=ddr3
+endef
+
+define Trusted-Firmware-A/mt7986-nor-ddr4
+ NAME:=MediaTek MT7986 (SPI-NOR, DDR4)
+ BOOT_DEVICE:=nor
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7986
+ DDR_TYPE:=ddr4
+endef
+
+define Trusted-Firmware-A/mt7986-emmc-ddr4
+ NAME:=MediaTek MT7986 (eMMC, DDR4)
+ BOOT_DEVICE:=emmc
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7986
+ DDR_TYPE:=ddr4
+endef
+
+define Trusted-Firmware-A/mt7986-sdmmc-ddr4
+ NAME:=MediaTek MT7986 (SD card, DDR4)
+ BOOT_DEVICE:=sdmmc
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7986
+ DDR_TYPE:=ddr4
+endef
+
+define Trusted-Firmware-A/mt7986-snand-ddr4
+ NAME:=MediaTek MT7986 (SPI-NAND via SNFI, DDR4)
+ BOOT_DEVICE:=snand
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7986
+ DDR_TYPE:=ddr4
+endef
+
+define Trusted-Firmware-A/mt7986-spim-nand-ddr4
+ NAME:=MediaTek MT7986 (SPI-NAND via SPIM, DDR4)
+ BOOT_DEVICE:=spim-nand
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7986
+ DDR_TYPE:=ddr4
+ NAND_TYPE:=spim:2k+64
+endef
+
+define Trusted-Firmware-A/mt7986-spim-nand-ubi-ddr4
+ NAME:=MediaTek MT7986 (SPI-NAND via SPIM using UBI, DDR4)
+ BOOT_DEVICE:=spim-nand
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7986
+ DDR_TYPE:=ddr4
+ NAND_TYPE:=spim:2k+64
+ USE_UBI:=1
+endef
+
+define Trusted-Firmware-A/mt7986-spim-nand-4k-ddr4
+ NAME:=MediaTek MT7986 (SPI-NAND via SPIM, DDR4)
+ BOOT_DEVICE:=spim-nand
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7986
+ DDR_TYPE:=ddr4
+ NAND_TYPE:=spim:4k+256
+endef
+
+define Trusted-Firmware-A/mt7986-nor-ddr3
+ NAME:=MediaTek MT7986 (SPI-NOR, DDR3)
+ BOOT_DEVICE:=nor
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7986
+ DDR_TYPE:=ddr3
+endef
+
+define Trusted-Firmware-A/mt7986-emmc-ddr3
+ NAME:=MediaTek MT7986 (eMMC, DDR3)
+ BOOT_DEVICE:=emmc
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7986
+ DDR_TYPE:=ddr3
+endef
+
+define Trusted-Firmware-A/mt7986-sdmmc-ddr3
+ NAME:=MediaTek MT7986 (SD card, DDR3)
+ BOOT_DEVICE:=sdmmc
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7986
+ DDR_TYPE:=ddr3
+endef
+
+define Trusted-Firmware-A/mt7986-snand-ddr3
+ NAME:=MediaTek MT7986 (SPI-NAND via SNFI, DDR3)
+ BOOT_DEVICE:=snand
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7986
+ DDR_TYPE:=ddr3
+endef
+
+define Trusted-Firmware-A/mt7986-spim-nand-ddr3
+ NAME:=MediaTek MT7986 (SPI-NAND via SPIM, DDR3)
+ BOOT_DEVICE:=spim-nand
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7986
+ DDR_TYPE:=ddr3
+endef
+
+define Trusted-Firmware-A/mt7988-nor-ddr3
+ NAME:=MediaTek MT7988 (SPI-NOR, DDR3)
+ BOOT_DEVICE:=nor
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7988
+ DDR_TYPE:=ddr3
+endef
+
+define Trusted-Firmware-A/mt7988-emmc-ddr3
+ NAME:=MediaTek MT7988 (eMMC, DDR3)
+ BOOT_DEVICE:=emmc
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7988
+ DDR_TYPE:=ddr3
+endef
+
+define Trusted-Firmware-A/mt7988-sdmmc-ddr3
+ NAME:=MediaTek MT7988 (SD card, DDR3)
+ BOOT_DEVICE:=sdmmc
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7988
+ DDR_TYPE:=ddr3
+endef
+
+define Trusted-Firmware-A/mt7988-snand-ddr3
+ NAME:=MediaTek MT7988 (SPI-NAND via SNFI, DDR3)
+ BOOT_DEVICE:=snand
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7988
+ DDR_TYPE:=ddr3
+endef
+
+define Trusted-Firmware-A/mt7988-spim-nand-ddr3
+ NAME:=MediaTek MT7988 (SPI-NAND via SPIM, DDR3)
+ BOOT_DEVICE:=spim-nand
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7988
+ DDR_TYPE:=ddr3
+endef
+
+define Trusted-Firmware-A/mt7988-nor-ddr4
+ NAME:=MediaTek MT7988 (SPI-NOR, DDR4)
+ BOOT_DEVICE:=nor
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7988
+ DDR_TYPE:=ddr4
+endef
+
+define Trusted-Firmware-A/mt7988-emmc-ddr4
+ NAME:=MediaTek MT7988 (eMMC, DDR4)
+ BOOT_DEVICE:=emmc
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7988
+ DDR_TYPE:=ddr4
+endef
+
+define Trusted-Firmware-A/mt7988-sdmmc-ddr4
+ NAME:=MediaTek MT7988 (SD card, DDR4)
+ BOOT_DEVICE:=sdmmc
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7988
+ DDR_TYPE:=ddr4
+endef
+
+define Trusted-Firmware-A/mt7988-snand-ddr4
+ NAME:=MediaTek MT7988 (SPI-NAND via SNFI, DDR4)
+ BOOT_DEVICE:=snand
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7988
+ DDR_TYPE:=ddr4
+endef
+
+define Trusted-Firmware-A/mt7988-spim-nand-ddr4
+ NAME:=MediaTek MT7988 (SPI-NAND via SPIM, DDR4)
+ BOOT_DEVICE:=spim-nand
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7988
+ DDR_TYPE:=ddr4
+endef
+
+define Trusted-Firmware-A/mt7988-nor-comb
+ NAME:=MediaTek MT7988 (SPI-NOR)
+ BOOT_DEVICE:=nor
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7988
+ DRAM_USE_COMB:=1
+endef
+
+define Trusted-Firmware-A/mt7988-emmc-comb
+ NAME:=MediaTek MT7988 (eMMC)
+ BOOT_DEVICE:=emmc
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7988
+ DRAM_USE_COMB:=1
+endef
+
+define Trusted-Firmware-A/mt7988-sdmmc-comb
+ NAME:=MediaTek MT7988 (SD card)
+ BOOT_DEVICE:=sdmmc
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7988
+ DRAM_USE_COMB:=1
+endef
+
+define Trusted-Firmware-A/mt7988-snand-comb
+ NAME:=MediaTek MT7988 (SPI-NAND via SNFI)
+ BOOT_DEVICE:=snand
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7988
+ DRAM_USE_COMB:=1
+endef
+
+define Trusted-Firmware-A/mt7988-snand-ubi-comb
+ NAME:=MediaTek MT7988 (SPI-NAND via SNFI, UBI)
+ BOOT_DEVICE:=snand
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7988
+ DRAM_USE_COMB:=1
+ USE_UBI:=1
+endef
+
+define Trusted-Firmware-A/mt7988-spim-nand-comb
+ NAME:=MediaTek MT7988 (SPI-NAND via SPIM)
+ BOOT_DEVICE:=spim-nand
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7988
+ DRAM_USE_COMB:=1
+endef
+
+define Trusted-Firmware-A/mt7988-spim-nand-ubi-comb
+ NAME:=MediaTek MT7988 (SPI-NAND via SPIM, UBI)
+ BOOT_DEVICE:=spim-nand
+ BUILD_SUBTARGET:=filogic
+ PLAT:=mt7988
+ DRAM_USE_COMB:=1
+ USE_UBI:=1
+endef
+
TFA_TARGETS:= \
mt7622-nor-1ddr \
mt7622-nor-2ddr \
mt7622-snand-1ddr \
+ mt7622-snand-ubi-1ddr \
mt7622-snand-2ddr \
+ mt7622-snand-ubi-2ddr \
mt7622-emmc-1ddr \
mt7622-emmc-2ddr \
mt7622-sdmmc-1ddr \
- mt7622-sdmmc-2ddr
+ mt7622-sdmmc-2ddr \
+ mt7981-emmc-ddr3 \
+ mt7981-nor-ddr3 \
+ mt7981-sdmmc-ddr3 \
+ mt7981-snand-ddr3 \
+ mt7981-spim-nand-ddr3 \
+ mt7981-emmc-ddr4 \
+ mt7981-spim-nand-ddr4 \
+ mt7986-emmc-ddr3 \
+ mt7986-nor-ddr3 \
+ mt7986-sdmmc-ddr3 \
+ mt7986-snand-ddr3 \
+ mt7986-spim-nand-ddr3 \
+ mt7986-emmc-ddr4 \
+ mt7986-nor-ddr4 \
+ mt7986-sdmmc-ddr4 \
+ mt7986-snand-ddr4 \
+ mt7986-spim-nand-ddr4 \
+ mt7986-spim-nand-ubi-ddr4 \
+ mt7986-spim-nand-4k-ddr4 \
+ mt7988-emmc-ddr3 \
+ mt7988-nor-ddr3 \
+ mt7988-sdmmc-ddr3 \
+ mt7988-snand-ddr3 \
+ mt7988-spim-nand-ddr3 \
+ mt7988-emmc-ddr4 \
+ mt7988-nor-ddr4 \
+ mt7988-sdmmc-ddr4 \
+ mt7988-snand-ddr4 \
+ mt7988-spim-nand-ddr4 \
+ mt7988-emmc-comb \
+ mt7988-nor-comb \
+ mt7988-sdmmc-comb \
+ mt7988-snand-comb \
+ mt7988-snand-ubi-comb \
+ mt7988-spim-nand-comb \
+ mt7988-spim-nand-ubi-comb
TFA_MAKE_FLAGS += \
BOOT_DEVICE=$(BOOT_DEVICE) \
USE_MKIMAGE=1 MKIMAGE=$(STAGING_DIR_HOST)/bin/mkimage \
+ $(if $(findstring ddr4,$(DDR_TYPE)),DRAM_USE_DDR4=1) \
+ $(if $(BOARD_QFN),BOARD_QFN=1,BOARD_BGA=1) \
+ $(if $(NAND_TYPE),NAND_TYPE=$(NAND_TYPE)) \
+ HAVE_DRAM_OBJ_FILE=yes \
$(if $(DDR3_FLYBY),DDR3_FLYBY=1) \
+ $(if $(DRAM_USE_COMB),DRAM_USE_COMB=1) \
+ $(if $(USE_UBI),UBI=1 $(if $(findstring mt7622,$(PLAT)),OVERRIDE_UBI_START_ADDR=0x80000)) \
all
-define Build/Configure
- $(call Build/Configure/Default)
-endef
-
define Package/trusted-firmware-a/install
$(INSTALL_DIR) $(STAGING_DIR_IMAGE)
- $(INSTALL_DATA) $(PKG_BUILD_DIR)/build/mt7622/release/bl2.img $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-bl2.img
- $(INSTALL_DATA) $(PKG_BUILD_DIR)/build/mt7622/release/bl31.bin $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-bl31.bin
+ $(INSTALL_DATA) $(PKG_BUILD_DIR)/build/$(PLAT)/release/bl2.img $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-bl2.img
+ $(INSTALL_DATA) $(PKG_BUILD_DIR)/build/$(PLAT)/release/bl31.bin $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-bl31.bin
endef
$(eval $(call BuildPackage/Trusted-Firmware-A))
diff --git a/package/boot/arm-trusted-firmware-mediatek/patches/100-increase-nor-bl3-size.patch b/package/boot/arm-trusted-firmware-mediatek/patches/100-increase-nor-bl3-size.patch
deleted file mode 100644
index 8de3cd77f6a..00000000000
--- a/package/boot/arm-trusted-firmware-mediatek/patches/100-increase-nor-bl3-size.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/plat/mediatek/mt7622/bl2_boot_nor.c
-+++ b/plat/mediatek/mt7622/bl2_boot_nor.c
-@@ -12,7 +12,7 @@
- #define MT7622_NOR_MAP_BASE 0x30000000
-
- #define FIP_BASE 0x20000
--#define FIP_SIZE 0x80000
-+#define FIP_SIZE 0xa0000
-
- const io_block_spec_t mtk_boot_dev_fip_spec = {
- .offset = MT7622_NOR_MAP_BASE + FIP_BASE,
diff --git a/package/boot/arm-trusted-firmware-mvebu/Makefile b/package/boot/arm-trusted-firmware-mvebu/Makefile
index c4669edb52b..05e276aaaf7 100644
--- a/package/boot/arm-trusted-firmware-mvebu/Makefile
+++ b/package/boot/arm-trusted-firmware-mvebu/Makefile
@@ -7,12 +7,13 @@
include $(TOPDIR)/rules.mk
-PKG_VERSION:=2.4
+PKG_VERSION:=2.9
PKG_RELEASE:=1
-PKG_HASH:=bf3eb3617a74cddd7fb0e0eacbfe38c3258ee07d4c8ed730deef7a175cc3d55b
+PKG_HASH:=76a66a1de0c01aeb83dfc7b72b51173fe62c6e51d6fca17cc562393117bed08b
PKG_MAINTAINER:=Vladimir Vid <vladimir.vid@sartura.hr>
+include $(INCLUDE_DIR)/kernel.mk
include $(INCLUDE_DIR)/trusted-firmware-a.mk
include $(INCLUDE_DIR)/package.mk
@@ -96,6 +97,16 @@ define Trusted-Firmware-A/udpu
PLAT:=a3700
endef
+define Trusted-Firmware-A/edpu
+ NAME:=Methode eDPU
+ DEPENDS:=+u-boot-eDPU
+ BUILD_DEVICES:=methode_edpu
+ UBOOT:=eDPU
+ DDR_TOPOLOGY:=0
+ CLOCKSPRESET:=CPU_1000_DDR_800
+ PLAT:=a3700
+endef
+
TFA_TARGETS:= \
espressobin-512mb \
@@ -104,71 +115,133 @@ TFA_TARGETS:= \
espressobin-v3-v5-2gb \
espressobin-v7-1gb \
espressobin-v7-2gb \
- udpu
+ udpu \
+ edpu
TFA_MAKE_FLAGS += \
- CROSS_CM3=$(STAGING_DIR_IMAGE)/$(LINARO_NAME)-$(LINARO_RELEASE).$(LINARO_VERSION)/bin/arm-linux-gnueabi- \
+ CROSS_CM3=$(BUILD_DIR)/$(CM3_GCC_NAME)-$(CM3_GCC_RELEASE)-$(CM3_GCC_VERSION)/bin/arm-none-eabi- \
BL33=$(STAGING_DIR_IMAGE)/$(UBOOT)-u-boot.bin \
- MV_DDR_PATH=$(STAGING_DIR_IMAGE)/$(MV_DDR_NAME) \
- WTP=$(STAGING_DIR_IMAGE)/$(A3700_UTILS_NAME) \
+ MV_DDR_PATH=$(BUILD_DIR)/$(MV_DDR_NAME) \
+ WTP=$(BUILD_DIR)/$(A3700_UTILS_NAME) \
+ WTMI_IMG=$(BUILD_DIR)/$(MOX_BB_NAME)/wtmi_app.bin \
+ CRYPTOPP_PATH=$(BUILD_DIR)/$(CRYPTOPP_NAME) \
+ HOST_LDFLAGS="$(HOST_LDFLAGS)" \
+ HOST_CPPFLAGS="$(HOST_CPPFLAGS)" \
+ USE_COHERENT_MEM=0 \
+ FIP_ALIGN=0x100 \
DDR_TOPOLOGY=$(DDR_TOPOLOGY) \
CLOCKSPRESET=$(CLOCKSPRESET) \
A3700_UTILS_COMMIT_ID=$(A3700_UTILS_RELEASE) \
MV_DDR_COMMIT_ID=$(MV_DDR_RELEASE) \
all \
- mrvl_flash
+ mrvl_flash \
+ mrvl_uart
A3700_UTILS_NAME:=a3700-utils
-A3700_UTILS_RELEASE:=5598e150
+A3700_UTILS_RELEASE:=a3e1c67
A3700_UTILS_SOURCE=$(A3700_UTILS_NAME)-$(A3700_UTILS_RELEASE).tar.bz2
define Download/a3700-utils
FILE:=$(A3700_UTILS_SOURCE)
PROTO:=git
URL:=https://github.com/MarvellEmbeddedProcessors/A3700-utils-marvell.git
- VERSION:=5598e150fa3a1568256c30223fd2b214d729f26a
- MIRROR_HASH:=4c3a3bed97833d08af4e42995c0c5af6c107f990fd492cd90aa3e79134d2751e
+ VERSION:=a3e1c67bb378e1d8a938e1b826cb602af83628d2
+ MIRROR_HASH:=0e6b8ef6423dcb52a5e282669a8aeebc6eea2d45a7c3a2c9a2fc7a749b3275a7
SUBDIR:=$(A3700_UTILS_NAME)
endef
+CRYPTOPP_NAME:=cryptopp
+CRYPTOPP_RELEASE:=4d0cad5
+CRYPTOPP_SOURCE=$(CRYPTOPP_NAME)-$(CRYPTOPP_RELEASE).tar.bz2
+
+define Download/cryptopp
+ FILE:=$(CRYPTOPP_SOURCE)
+ PROTO:=git
+ URL:=https://github.com/weidai11/cryptopp.git
+ VERSION:=4d0cad5401d1a2c998b314bc89288c9620d3021d
+ MIRROR_HASH:=74ec9e48ee04b9f2d9a1d8c4f2392ed0ab52780d7af0f70405d7bbb23d1504fa
+ SUBDIR:=$(CRYPTOPP_NAME)
+endef
+
MV_DDR_NAME:=mv-ddr-marvell
-MV_DDR_RELEASE:=6fb99002
+MV_DDR_RELEASE:=541616b
MV_DDR_SOURCE:=$(MV_DDR_NAME)-$(MV_DDR_RELEASE).tar.bz2
define Download/mv-ddr-marvell
FILE:=$(MV_DDR_SOURCE)
PROTO:=git
URL:=https://github.com/MarvellEmbeddedProcessors/mv-ddr-marvell.git
- VERSION:=6fb99002be5dec9c7f5375b074f53148dbc0739c
- MIRROR_HASH:=6836e5ea47618a7ee2f96a1a6bd8218f003789b877e521fdfcb008f2f6475dd6
+ VERSION:=541616bc5d25a0167c9901546255c55973e2c0f0
+ MIRROR_HASH:=9e86a986c7400ed1a72165a88150b6c494ebd87303b16314b43e5785e3f13068
SUBDIR:=$(MV_DDR_NAME)
endef
-LINARO_NAME:=gcc-linaro
-LINARO_RELEASE:=6
-LINARO_VERSION:=5.0-2018.12-$(HOST_ARCH)_arm-linux-gnueabi
-LINARO_SOURCE=$(LINARO_NAME)-$(LINARO_RELEASE).$(LINARO_VERSION).tar.xz
+MOX_BB_NAME:=mox-boot-builder
+MOX_BB_RELEASE:=604f8f51
+MOX_BB_SOURCE:=$(MOX_BB_NAME)-$(MOX_BB_RELEASE).tar.bz2
+
+define Download/mox-boot-builder
+ FILE:=$(MOX_BB_SOURCE)
+ PROTO:=git
+ SUBMODULES:=skip
+ URL:=https://gitlab.nic.cz/turris/mox-boot-builder.git
+ VERSION:=604f8f51d97b4e59fa6d1e579101daa194d6ed2d
+ MIRROR_HASH:=b09337a7dde140f57e40133b6e7b7e1eb338e7cea9b15a3af6874824462f15f7
+ SUBDIR:=$(MOX_BB_NAME)
+endef
+
+CM3_GCC_NAME:=arm-gnu-toolchain
+CM3_GCC_RELEASE:=12.3.rel1
+CM3_GCC_VERSION:=$(HOST_ARCH)-arm-none-eabi
+CM3_GCC_SOURCE=$(CM3_GCC_NAME)-$(CM3_GCC_RELEASE)-$(CM3_GCC_VERSION).tar.xz
+
+define Download/cm3-gcc
+ FILE:=$(CM3_GCC_SOURCE)
+ URL:=https://developer.arm.com/-/media/Files/downloads/gnu/$(CM3_GCC_RELEASE)/binrel
+ifeq ($(HOST_ARCH),aarch64)
+ HASH:=14c0487d5753f6071d24e568881f7c7e67f80dd83165dec5164b3731394af431
+else
+ HASH:=12a2815644318ebcceaf84beabb665d0924b6e79e21048452c5331a56332b309
+endif
+endef
-define Download/gcc-linaro
- FILE:=$(LINARO_SOURCE)
- URL:=https://releases.linaro.org/components/toolchain/binaries/latest-$(LINARO_RELEASE)/arm-linux-gnueabi/
- HASH:=2d4a92d6c8b384ae404b2e02c1c412e3ec18f9b714135acf046b2b1b510e9ace
+define Build/Clean
+ rm -rf \
+ $(BUILD_DIR)/$(CRYPTOPP_NAME) \
+ $(BUILD_DIR)/$(A3700_UTILS_NAME) \
+ $(BUILD_DIR)/$(MV_DDR_NAME) \
+ $(BUILD_DIR)/$(MOX_BB_NAME) \
+ $(BUILD_DIR)/$(CM3_GCC_NAME)-$(CM3_GCC_RELEASE)-$(CM3_GCC_VERSION)
endef
define Build/Prepare
# Download sources
$(eval $(call Download,a3700-utils))
$(eval $(call Download,mv-ddr-marvell))
- $(eval $(call Download,gcc-linaro))
+ $(eval $(call Download,mox-boot-builder))
+ $(eval $(call Download,cryptopp))
+ $(eval $(call Download,cm3-gcc))
$(call Build/Prepare/Default,)
- mkdir -p $(STAGING_DIR_IMAGE)
- $(TAR) -C $(STAGING_DIR_IMAGE) -xf $(DL_DIR)/$(A3700_UTILS_SOURCE)
- $(call PatchDir/Default,$(STAGING_DIR_IMAGE)/$(A3700_UTILS_NAME),./patches-a3700-utils)
- $(TAR) -C $(STAGING_DIR_IMAGE) -xf $(DL_DIR)/$(MV_DDR_SOURCE)
- $(call PatchDir/Default,$(STAGING_DIR_IMAGE)/$(MV_DDR_NAME),./patches-mv-ddr-marvell)
- $(TAR) -C $(STAGING_DIR_IMAGE) -xf $(DL_DIR)/$(LINARO_SOURCE)
+ $(TAR) -C $(BUILD_DIR) -xf $(DL_DIR)/$(CRYPTOPP_SOURCE)
+ $(TAR) -C $(BUILD_DIR) -xf $(DL_DIR)/$(A3700_UTILS_SOURCE)
+ $(call PatchDir/Default,$(BUILD_DIR)/$(A3700_UTILS_NAME),./patches-a3700-utils)
+ $(TAR) -C $(BUILD_DIR) -xf $(DL_DIR)/$(MV_DDR_SOURCE)
+ $(call PatchDir/Default,$(BUILD_DIR)/$(MV_DDR_NAME),./patches-mv-ddr-marvell)
+ $(TAR) -C $(BUILD_DIR) -xf $(DL_DIR)/$(MOX_BB_SOURCE)
+ $(call PatchDir/Default,$(BUILD_DIR)/$(MOX_BB_NAME),./patches-mox-boot-builder)
+ $(TAR) -C $(BUILD_DIR) -xf $(DL_DIR)/$(CM3_GCC_SOURCE)
+endef
+
+define Build/Compile
+ +$(MAKE) \
+ CROSS_CM3=$(BUILD_DIR)/$(CM3_GCC_NAME)-$(CM3_GCC_RELEASE)-$(CM3_GCC_VERSION)/bin/arm-none-eabi- \
+ WTMI_VERSION=$(MOX_BB_RELEASE) \
+ CRYPTOPP_PATH=$PWD/cryptopp/ \
+ -C $(BUILD_DIR)/$(MOX_BB_NAME) \
+ wtmi_app.bin
+ $(call Build/Compile/Default)
endef
$(eval $(call BuildPackage/Trusted-Firmware-A))
diff --git a/package/boot/arm-trusted-firmware-mvebu/patches-a3700-utils/001-version.patch b/package/boot/arm-trusted-firmware-mvebu/patches-a3700-utils/001-version.patch
index 745e6150745..0519598a281 100644
--- a/package/boot/arm-trusted-firmware-mvebu/patches-a3700-utils/001-version.patch
+++ b/package/boot/arm-trusted-firmware-mvebu/patches-a3700-utils/001-version.patch
@@ -1,13 +1,14 @@
diff --git a/wtmi/sys_init/Makefile b/wtmi/sys_init/Makefile
--- a/wtmi/sys_init/Makefile
+++ b/wtmi/sys_init/Makefile
-@@ -51,7 +51,8 @@ ECHO = @echo
+@@ -51,8 +51,8 @@ ECHO = @echo
SED = @sed
LOCAL_VERSION_STRING ?= -armada
--BUILD_STRING := $(shell git log -n 1 --pretty=format:"%h")
-+A3700_UTILS_COMMIT_ID ?= $(shell git log -n 1 --pretty=format:"%h")
-+BUILD_STRING := $(A3700_UTILS_COMMIT_ID)
- VERSION_STRING := $(LOCAL_VERSION_STRING)-$(BUILD_STRING)
+-BUILD_STRING := $(shell git log -n 1 --pretty=format:"%h" && (git diff-index --quiet HEAD || echo -dirty))
+-VERSION_STRING := $(LOCAL_VERSION_STRING)-$(BUILD_STRING)
++A3700_UTILS_COMMIT_ID ?= $(shell git log -n 1 --pretty=format:"%h" && (git diff-index --quiet HEAD || echo -dirty))
++VERSION_STRING := $(LOCAL_VERSION_STRING)-$(A3700_UTILS_COMMIT_ID)
CPUOPTS = -mthumb -mcpu=cortex-m3 -mlittle-endian
+ BINPATH = build
diff --git a/package/boot/arm-trusted-firmware-mvebu/patches-a3700-utils/002-version_mv_ddr_fix.patch b/package/boot/arm-trusted-firmware-mvebu/patches-a3700-utils/002-version_mv_ddr_fix.patch
new file mode 100644
index 00000000000..6c3956c121a
--- /dev/null
+++ b/package/boot/arm-trusted-firmware-mvebu/patches-a3700-utils/002-version_mv_ddr_fix.patch
@@ -0,0 +1,12 @@
+--- a/Makefile
++++ b/Makefile
+@@ -28,7 +28,7 @@
+ @cp -f ${MV_DDR_PATH}/a3700_tool $(TIM_DDR_PATH)/ddr_tool
+
+ $(TIM_DDR_PATH)/ddr_tool.verstr: $(MV_DDR_PATH)/a3700_tool
+- @echo mv_ddr-$(shell sed 's/^mv_ddr-//' $(MV_DDR_PATH)/localversion 2>/dev/null || echo 'unknown')$(if $(shell git -C $(MV_DDR_PATH) rev-parse --git-dir 2>/dev/null),-g$(shell git -C $(MV_DDR_PATH) rev-parse --verify --quiet --short HEAD 2>/dev/null)$(shell git -C $(MV_DDR_PATH) diff-index --quiet HEAD || echo -d)) > $@
++ @echo mv_ddr-$(shell sed 's/^mv_ddr-//' $(MV_DDR_PATH)/localversion 2>/dev/null || echo 'unknown')-g$(MV_DDR_COMMIT_ID) > $@
+
+ mv_ddr: $(TIM_DDR_PATH)/ddr_tool $(TIM_DDR_PATH)/ddr_tool.verstr
+
+
diff --git a/package/boot/arm-trusted-firmware-mvebu/patches-mox-boot-builder/001-version.patch b/package/boot/arm-trusted-firmware-mvebu/patches-mox-boot-builder/001-version.patch
new file mode 100644
index 00000000000..eb6941d2aec
--- /dev/null
+++ b/package/boot/arm-trusted-firmware-mvebu/patches-mox-boot-builder/001-version.patch
@@ -0,0 +1,12 @@
+diff --git a/wtmi/Makefile b/wtmi/Makefile
+index 75754dc..3602ec3 100644
+--- a/wtmi/Makefile
++++ b/wtmi/Makefile
+@@ -41,7 +41,6 @@ else
+ LTO_FLAGS =
+ endif
+
+-override WTMI_VERSION = $(shell git describe --always --dirty --tags)
+ ifndef WTMI_VERSION
+ $(error Repository is without git tags, please do a full git clone again)
+ endif
diff --git a/package/boot/arm-trusted-firmware-mvebu/patches/001-no-git.patch b/package/boot/arm-trusted-firmware-mvebu/patches/001-no-git.patch
new file mode 100644
index 00000000000..71cd0f8ef9c
--- /dev/null
+++ b/package/boot/arm-trusted-firmware-mvebu/patches/001-no-git.patch
@@ -0,0 +1,21 @@
+We're not building with full fledged git checkouts here, get rid of the
+overzealous checks.
+
+--- a/plat/marvell/armada/a3k/common/a3700_common.mk
++++ b/plat/marvell/armada/a3k/common/a3700_common.mk
+@@ -78,7 +78,6 @@ ifdef WTP
+
+ # Do not remove! Following checks are required to ensure correct TF-A builds, removing these checks leads to broken TF-A builds
+ $(if $(wildcard $(value WTP)/*),,$(error "'WTP=$(value WTP)' was specified, but '$(value WTP)' directory does not exist"))
+-$(if $(shell git -C $(value WTP) rev-parse --show-cdup 2>&1),$(error "'WTP=$(value WTP)' was specified, but '$(value WTP)' does not contain valid A3700-utils-marvell git repository"))
+
+ TBB := $(WTP)/wtptp/src/TBB_Linux/release/TBB_linux
+
+@@ -164,7 +163,6 @@ $(TIMDDRTOOL): FORCE
+ # Do not remove! Following checks are required to ensure correct TF-A builds, removing these checks leads to broken TF-A builds
+ $(if $(value MV_DDR_PATH),,$(error "Platform '${PLAT}' for ddr tool requires MV_DDR_PATH. Please set MV_DDR_PATH to point to the right directory"))
+ $(if $(wildcard $(value MV_DDR_PATH)/*),,$(error "'MV_DDR_PATH=$(value MV_DDR_PATH)' was specified, but '$(value MV_DDR_PATH)' directory does not exist"))
+- $(if $(shell git -C $(value MV_DDR_PATH) rev-parse --show-cdup 2>&1),$(error "'MV_DDR_PATH=$(value MV_DDR_PATH)' was specified, but '$(value MV_DDR_PATH)' does not contain valid mv-ddr-marvell git repository"))
+ $(Q)$(MAKE) --no-print-directory -C $(WTP) MV_DDR_PATH=$(MV_DDR_PATH) DDR_TOPOLOGY=$(DDR_TOPOLOGY) mv_ddr
+
+ $(BUILD_PLAT)/$(UART_IMAGE): $(BUILD_PLAT)/$(BOOT_IMAGE) $(BUILD_PLAT)/wtmi.bin $(TBB) $(TIMBUILD) $(TIMDDRTOOL)
diff --git a/package/boot/arm-trusted-firmware-mvebu/patches/002-cryptopp_ldflags.patch b/package/boot/arm-trusted-firmware-mvebu/patches/002-cryptopp_ldflags.patch
new file mode 100644
index 00000000000..c4de8fe7df1
--- /dev/null
+++ b/package/boot/arm-trusted-firmware-mvebu/patches/002-cryptopp_ldflags.patch
@@ -0,0 +1,13 @@
+Forward the host compiler flags to the compilation of the cryptopp library.
+
+--- a/plat/marvell/armada/a3k/common/a3700_common.mk
++++ b/plat/marvell/armada/a3k/common/a3700_common.mk
+@@ -149,7 +149,7 @@ $(TBB): FORCE
+ $(if $(wildcard $(CRYPTOPP_LIBDIR)/*),,$(error "Either 'CRYPTOPP_PATH' or 'CRYPTOPP_LIB' was set to '$(CRYPTOPP_LIBDIR)', but '$(CRYPTOPP_LIBDIR)' does not exist"))
+ $(if $(wildcard $(CRYPTOPP_INCDIR)/*),,$(error "Either 'CRYPTOPP_PATH' or 'CRYPTOPP_INCDIR' was set to '$(CRYPTOPP_INCDIR)', but '$(CRYPTOPP_INCDIR)' does not exist"))
+ ifdef CRYPTOPP_PATH
+- $(Q)$(MAKE) --no-print-directory -C $(CRYPTOPP_PATH) -f GNUmakefile
++ $(Q)$(MAKE) --no-print-directory -C $(CRYPTOPP_PATH) -f GNUmakefile LDFLAGS="$(HOST_LDFLAGS)" CPPFLAGS="$(HOST_CPPFLAGS)"
+ endif
+ $(Q)$(MAKE) --no-print-directory -C $(WTP)/wtptp/src/TBB_Linux -f TBB_linux.mak LIBDIR=$(CRYPTOPP_LIBDIR) INCDIR=$(CRYPTOPP_INCDIR)
+
diff --git a/package/boot/arm-trusted-firmware-mvebu/patches/200-hostssl.patch b/package/boot/arm-trusted-firmware-mvebu/patches/200-hostssl.patch
deleted file mode 100644
index ad4e1e9f717..00000000000
--- a/package/boot/arm-trusted-firmware-mvebu/patches/200-hostssl.patch
+++ /dev/null
@@ -1,20 +0,0 @@
---- a/tools/fiptool/Makefile
-+++ b/tools/fiptool/Makefile
-@@ -20,7 +20,7 @@ ifeq (${DEBUG},1)
- else
- HOSTCCFLAGS += -O2
- endif
--LDLIBS := -lcrypto
-+LDLIBS := -L${OPENSSL_DIR}/lib -lcrypto
-
- ifeq (${V},0)
- Q := @
-@@ -28,7 +28,7 @@ else
- Q :=
- endif
-
--INCLUDE_PATHS := -I../../include/tools_share
-+INCLUDE_PATHS := -I../../include/tools_share -I${OPENSSL_DIR}/include
-
- HOSTCC ?= gcc
-
diff --git a/package/boot/arm-trusted-firmware-rockchip/Makefile b/package/boot/arm-trusted-firmware-rockchip/Makefile
index b712a3530a0..6fbcbef0a8b 100644
--- a/package/boot/arm-trusted-firmware-rockchip/Makefile
+++ b/package/boot/arm-trusted-firmware-rockchip/Makefile
@@ -7,43 +7,66 @@
include $(TOPDIR)/rules.mk
-PKG_NAME:=arm-trusted-firmware-rockchip
-PKG_VERSION:=2.3
+PKG_VERSION:=2.10
PKG_RELEASE:=1
-PKG_SOURCE:=atf-v$(PKG_VERSION).tar.gz
-PKG_SOURCE_URL:=https://github.com/atf-builds/atf/releases/download/v$(PKG_VERSION)/atf-v$(PKG_VERSION).tar.gz?
-PKG_HASH:=bf352298743aed594cf2958dd588e06ab6713fc514bb6f809bf55a85a87134c1
-
-PKG_LICENSE:=BSD-3-Clause
-PKG_LICENSE_FILES:=license.md
+PKG_HASH:=88215a62291b9ba87da8e50b077741103cdc08fb6c9e1ebd34dfaace746d3201
PKG_MAINTAINER:=Tobias Maedel <openwrt@tbspace.de>
-MAKE_PATH:=$(PKG_NAME)
-
+include $(INCLUDE_DIR)/kernel.mk
+include $(INCLUDE_DIR)/trusted-firmware-a.mk
include $(INCLUDE_DIR)/package.mk
-define Package/arm-trusted-firmware-rockchip
- SECTION:=boot
- CATEGORY:=Boot Loaders
- TITLE:=ARM Trusted Firmware for Rockchip
- DEPENDS:=@TARGET_rockchip_armv8
+define Trusted-Firmware-A/Default
+ NAME:=Rockchip $(1) SoCs
+ BUILD_TARGET:=rockchip
endef
-define Build/Prepare
- $(TAR) -C $(PKG_BUILD_DIR) -xf $(DL_DIR)/$(PKG_SOURCE)
+define Trusted-Firmware-A/rk3328
+ BUILD_SUBTARGET:=armv8
+ PLAT=rk3328
endef
-define Build/Compile
+define Trusted-Firmware-A/rk3399
+ BUILD_SUBTARGET:=armv8
+ PLAT:=rk3399
endef
-define Build/InstallDev
- $(INSTALL_DIR) -p $(STAGING_DIR_IMAGE)
- $(CP) $(PKG_BUILD_DIR)/rk*.elf $(STAGING_DIR_IMAGE)/
-endef
+TFA_TARGETS:= \
+ rk3328 \
+ rk3399
+
+ifeq ($(BUILD_VARIANT),rk3399)
+ M0_GCC_NAME:=gcc-arm
+ M0_GCC_RELEASE:=11.2-2022.02
+ M0_GCC_VERSION:=$(HOST_ARCH)-arm-none-eabi
+ M0_GCC_SOURCE:=$(M0_GCC_NAME)-$(M0_GCC_RELEASE)-$(M0_GCC_VERSION).tar.xz
+
+ define Download/m0-gcc
+ FILE:=$(M0_GCC_SOURCE)
+ URL:=https://developer.arm.com/-/media/Files/downloads/gnu/$(M0_GCC_RELEASE)/binrel
+ ifeq ($(HOST_ARCH),aarch64)
+ HASH:=ef1d82e5894e3908cb7ed49c5485b5b95deefa32872f79c2b5f6f5447cabf55f
+ else
+ HASH:=8c5acd5ae567c0100245b0556941c237369f210bceb196edfe5a2e7532c60326
+ endif
+ endef
+
+ define Build/Prepare
+ $(eval $(call Download,m0-gcc))
+ $(call Build/Prepare/Default)
+
+ xzcat $(DL_DIR)/$(M0_GCC_SOURCE) | $(HOST_TAR) -C $(PKG_BUILD_DIR)/ $(TAR_OPTIONS)
+ endef
+
+ TFA_MAKE_FLAGS+= \
+ M0_CROSS_COMPILE=$(PKG_BUILD_DIR)/$(M0_GCC_NAME)-$(M0_GCC_RELEASE)-$(M0_GCC_VERSION)/bin/arm-none-eabi-
+endif
-define Package/arm-trusted-firmware-rockchip/install
+define Package/trusted-firmware-a/install
+ $(INSTALL_DIR) $(STAGING_DIR_IMAGE)
+ $(INSTALL_DATA) $(PKG_BUILD_DIR)/build/$(PLAT)/release/bl31/bl31.elf $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)_bl31.elf
endef
-$(eval $(call BuildPackage,arm-trusted-firmware-rockchip))
+$(eval $(call BuildPackage/Trusted-Firmware-A))
diff --git a/package/boot/arm-trusted-firmware-sunxi/Makefile b/package/boot/arm-trusted-firmware-sunxi/Makefile
index 0abfbae7501..4b007f8b039 100644
--- a/package/boot/arm-trusted-firmware-sunxi/Makefile
+++ b/package/boot/arm-trusted-firmware-sunxi/Makefile
@@ -7,57 +7,48 @@
include $(TOPDIR)/rules.mk
-PKG_NAME:=arm-trusted-firmware-sunxi
+PKG_VERSION:=2.10
PKG_RELEASE:=1
-PKG_SOURCE_PROTO:=git
-PKG_SOURCE_URL=https://github.com/ARM-software/arm-trusted-firmware
-PKG_SOURCE_DATE:=2020-11-17
-PKG_SOURCE_VERSION:=e2c509a39c6cc4dda8734e6509cdbe6e3603cdfc
-PKG_MIRROR_HASH:=b212d369a5286ebbf6a5616486efa05fa54d4294fd6e9ba2e54fdfae9eda918d
+PKG_HASH:=88215a62291b9ba87da8e50b077741103cdc08fb6c9e1ebd34dfaace746d3201
PKG_LICENSE:=BSD-3-Clause
PKG_LICENSE_FILES:=license.md
PKG_MAINTAINER:=Hauke Mehrtens <hauke@hauke-m.de>
+include $(INCLUDE_DIR)/kernel.mk
include $(INCLUDE_DIR)/trusted-firmware-a.mk
include $(INCLUDE_DIR)/package.mk
-
-define Package/arm-trusted-firmware-sunxi/Default
- SECTION:=boot
- CATEGORY:=Boot Loaders
- TITLE:=ARM Trusted Firmware for Allwinner
- DEPENDS:=@TARGET_sunxi_cortexa53
+define Trusted-Firmware-A/Default
+ BUILD_TARGET:=sunxi
+ BUILD_SUBTARGET:=cortexa53
endef
-define Package/arm-trusted-firmware-sunxi-a64
- $(call Package/arm-trusted-firmware-sunxi/Default)
- VARIANT:=sun50i_a64
+define Trusted-Firmware-A/sunxi-a64
+ NAME:=Allwinner A64
+ PLAT:=sun50i_a64
endef
-define Package/arm-trusted-firmware-sunxi-h6
- $(call Package/arm-trusted-firmware-sunxi/Default)
- VARIANT:=sun50i_h6
+define Trusted-Firmware-A/sunxi-h6
+ NAME:=Allwinner H6
+ PLAT:=sun50i_h6
endef
-export GCC_HONOUR_COPTS=s
-
-MAKE_VARS = \
- CROSS_COMPILE="$(TARGET_CROSS)"
+define Trusted-Firmware-A/sunxi-h616
+ NAME:=Allwinner H616
+ PLAT:=sun50i_h616
+endef
-MAKE_FLAGS += \
- PLAT=$(BUILD_VARIANT) \
- bl31
+TFA_TARGETS:= \
+ sunxi-a64 \
+ sunxi-h6 \
+ sunxi-h616
-define Build/InstallDev
+define Package/trusted-firmware-a/install
$(INSTALL_DIR) $(STAGING_DIR_IMAGE)
- $(CP) $(PKG_BUILD_DIR)/build/$(BUILD_VARIANT)/release/bl31.bin $(STAGING_DIR_IMAGE)/bl31_$(BUILD_VARIANT).bin
-endef
-
-define Package/arm-trusted-firmware-sunxi/install
+ $(INSTALL_DATA) $(PKG_BUILD_DIR)/build/$(PLAT)/release/bl31.bin $(STAGING_DIR_IMAGE)/bl31_$(BUILD_VARIANT).bin
endef
-$(eval $(call BuildPackage,arm-trusted-firmware-sunxi-a64))
-$(eval $(call BuildPackage,arm-trusted-firmware-sunxi-h6))
+$(eval $(call BuildPackage/Trusted-Firmware-A))
diff --git a/package/boot/arm-trusted-firmware-tools/Makefile b/package/boot/arm-trusted-firmware-tools/Makefile
index a7112724c0f..209e945a0b0 100644
--- a/package/boot/arm-trusted-firmware-tools/Makefile
+++ b/package/boot/arm-trusted-firmware-tools/Makefile
@@ -8,9 +8,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=arm-trusted-firmware-tools
-PKG_VERSION:=2.4
+PKG_VERSION:=2.9
PKG_RELEASE:=1
-PKG_HASH:=bf3eb3617a74cddd7fb0e0eacbfe38c3258ee07d4c8ed730deef7a175cc3d55b
+PKG_HASH:=76a66a1de0c01aeb83dfc7b72b51173fe62c6e51d6fca17cc562393117bed08b
PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
PKG_HOST_ONLY:=1
@@ -34,23 +34,17 @@ define Host/Compile
$(HOST_BUILD_DIR)/tools/fiptool \
CPPFLAGS="$(HOST_CFLAGS)" \
LDFLAGS="$(HOST_LDFLAGS)"
- $(MAKE) -C \
- $(HOST_BUILD_DIR)/tools/sptool \
- CPPFLAGS="$(HOST_CFLAGS)" \
- LDFLAGS="$(HOST_LDFLAGS)"
endef
define Host/Install
$(INSTALL_DIR) $(STAGING_DIR_HOST)/bin/
$(INSTALL_BIN) $(HOST_BUILD_DIR)/tools/fiptool/fiptool $(STAGING_DIR_HOST)/bin/
- $(INSTALL_BIN) $(HOST_BUILD_DIR)/tools/sptool/sptool $(STAGING_DIR_HOST)/bin/
- $(INSTALL_BIN) $(HOST_BUILD_DIR)/tools/sptool/sp_mk_generator.py $(STAGING_DIR_HOST)/bin/
+ $(INSTALL_BIN) $(HOST_BUILD_DIR)/tools/sptool/sptool.py $(STAGING_DIR_HOST)/bin/
endef
define Host/Clean
rm -f $(STAGING_DIR_HOST)/bin/fiptool
- rm -f $(STAGING_DIR_HOST)/bin/sptool
- rm -f $(STAGING_DIR_HOST)/bin/sp_mk_generator.py
+ rm -f $(STAGING_DIR_HOST)/bin/sptool.py $(STAGING_DIR_HOST)/bin/sptool
endef
$(eval $(call BuildPackage,arm-trusted-firmware-tools))
diff --git a/package/boot/arm-trusted-firmware-tools/patches/002-darwin_compile.patch b/package/boot/arm-trusted-firmware-tools/patches/002-darwin_compile.patch
new file mode 100644
index 00000000000..6bc8192f442
--- /dev/null
+++ b/package/boot/arm-trusted-firmware-tools/patches/002-darwin_compile.patch
@@ -0,0 +1,21 @@
+--- a/tools/fiptool/fiptool.c
++++ b/tools/fiptool/fiptool.c
+@@ -3,7 +3,7 @@
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+-
++#define _DARWIN_C_SOURCE
+ #ifndef _MSC_VER
+ #include <sys/mount.h>
+ #endif
+@@ -18,6 +18,9 @@
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
++#include <unistd.h>
++
++#define uuid_t fiptool_uuid_t
+
+ #include "fiptool.h"
+ #include "tbbr_config.h"
diff --git a/package/boot/at91bootstrap/Makefile b/package/boot/at91bootstrap/Makefile
index f66472fa9c2..f27a3f01dc2 100644
--- a/package/boot/at91bootstrap/Makefile
+++ b/package/boot/at91bootstrap/Makefile
@@ -9,13 +9,32 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=at91bootstrap
-PKG_VERSION:=v3.9.3
+PKG_VERSION:=v4.0.3
+PKG_MIRROR_HASH:=1ecdc31a13350fcdcaa3f77ed8ad73906f79fc668dbb2f337e1d5dd877bf9882
+PKG_SOURCE_VERSION:=1d9e673698d9db4a4f2301559f481274de2e75ae
+BINARIES_DIR:=build/binaries
+PKG_CPE_ID:=cpe:/a:linux4sam:at91bootstrap
+
+AT91BOOTSTRAP_V4=y
+ifdef CONFIG_PACKAGE_at91bootstrap-sama5d4_xplaineddf_uboot_secure
+ AT91BOOTSTRAP_V4=n
+else ifdef CONFIG_TARGET_at91_sam9x
+ ifndef CONFIG_TARGET_at91_sam9x_DEVICE_microchip_sam9x60ek
+ AT91BOOTSTRAP_V4=n
+ endif
+endif
+
+ifeq ($(AT91BOOTSTRAP_V4),n)
+ PKG_VERSION=v3.10.4
+ PKG_MIRROR_HASH=6fe61fe90838e785917383bb9e887fa05e1bd061a6725954242f504e38b5c426
+ PKG_SOURCE_VERSION=404846dd283894367a015ca59189bcf927d92e11
+ BINARIES_DIR=binaries
+endif
+
PKG_RELEASE:=2
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/linux4sam/at91bootstrap.git
-PKG_MIRROR_HASH:=06753d673756edc9753932db00f4e5b8c1f9fa7708337c4d6ce280573efb86b4
-PKG_SOURCE_VERSION:=d96833a4b6680b237708eb4dc9f10708b9e709d8
PKG_BUILD_DIR = \
$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
@@ -40,6 +59,30 @@ define AT91Bootstrap/at91sam9x5eksd_uboot
BUILD_DEVICES:=atmel_at91sam9x25ek atmel_at91sam9x35ek
endef
+define AT91Bootstrap/sam9x60eknf_uboot
+ NAME:=AT91Bootstrap for SAM9X60-EK board (NandFlash)
+ BUILD_SUBTARGET:=sam9x
+ BUILD_DEVICES:=microchip_sam9x60ek
+endef
+
+define AT91Bootstrap/sam9x60eksd_uboot
+ NAME:=AT91Bootstrap for SAM9X60-EK board (SDcard)
+ BUILD_SUBTARGET:=sam9x
+ BUILD_DEVICES:=microchip_sam9x60ek
+endef
+
+define AT91Bootstrap/sama5d2_icpdf_qspi_uboot
+ TITLE:=AT91Bootstrap for SAMA5D2 ICP board (QSPI Flash)
+ BUILD_SUBTARGET:=sama5
+ BUILD_DEVICES:=microchip_sama5d2-icp
+endef
+
+define AT91Bootstrap/sama5d2_icpsd_uboot
+ TITLE:=AT91Bootstrap for SAMA5D2 ICP board (SDcard)
+ BUILD_SUBTARGET:=sama5
+ BUILD_DEVICES:=microchip_sama5d2-icp
+endef
+
define AT91Bootstrap/sama5d2_xplaineddf_uboot
TITLE:=AT91Bootstrap for SAMA5D2 Xplained board (SPI Flash)
BUILD_SUBTARGET:=sama5
@@ -94,16 +137,22 @@ define AT91Bootstrap/sama5d27_som1_eksd_uboot
BUILD_DEVICES:=microchip_sama5d27-som1-ek
endef
-define AT91Bootstrap/sama5d27_som1_eksd1_uboot
- TITLE:=AT91Bootstrap for SAMA5D27 SOM1 Ek (SDcard1)
+define AT91Bootstrap/sama5d27_som1_ekqspi_uboot
+ TITLE:=AT91Bootstrap for SAMA5D27 SOM1 Ek (QSPI Flash)
BUILD_SUBTARGET:=sama5
BUILD_DEVICES:=microchip_sama5d27-som1-ek
endef
-define AT91Bootstrap/sama5d27_som1_ekqspi_uboot
- TITLE:=AT91Bootstrap for SAMA5D27 SOM1 Ek (QSPI Flash)
+define AT91Bootstrap/sama5d27_wlsom1_eksd_uboot
+ TITLE:=AT91Bootstrap for SAMA5D27 WLSOM1 Ek (SDcard0)
BUILD_SUBTARGET:=sama5
- BUILD_DEVICES:=microchip_sama5d27-som1-ek
+ BUILD_DEVICES:=microchip_sama5d27-wlsom1-ek
+endef
+
+define AT91Bootstrap/sama5d27_wlsom1_ekdf_qspi_uboot
+ TITLE:=AT91Bootstrap for SAMA5D27 WLSOM1 Ek (QSPI Flash)
+ BUILD_SUBTARGET:=sama5
+ BUILD_DEVICES:=microchip_sama5d27-wlsom1-ek
endef
define AT91Bootstrap/sama5d2_ptc_eknf_uboot
@@ -118,9 +167,19 @@ define AT91Bootstrap/sama5d2_ptc_eksd_uboot
BUILD_DEVICES:=microchip_sama5d2-ptc-ek
endef
+define AT91Bootstrap/sama7g5eksd_uboot
+ TITLE:=AT91Bootstrap for SAMA7G5-EK (SDCard)
+ BUILD_SUBTARGET:=sama7
+ BUILD_DEVICES:=microchip_sama7g5-ek
+endef
+
AT91BOOTSTRAP_TARGETS := \
at91sam9x5eknf_uboot \
at91sam9x5eksd_uboot \
+ sam9x60eknf_uboot \
+ sam9x60eksd_uboot \
+ sama5d2_icpdf_qspi_uboot \
+ sama5d2_icpsd_uboot \
sama5d2_xplaineddf_uboot \
sama5d2_xplaineddf_qspi_uboot \
sama5d2_xplainedsd_uboot \
@@ -129,10 +188,13 @@ AT91BOOTSTRAP_TARGETS := \
sama5d4_xplainednf_uboot_secure \
sama5d4_xplaineddf_uboot_secure \
sama5d4_xplainedsd_uboot_secure \
- sama5d27_som1_eksd1_uboot \
+ sama5d27_som1_eksd_uboot \
sama5d27_som1_ekqspi_uboot \
+ sama5d27_wlsom1_eksd_uboot \
+ sama5d27_wlsom1_ekdf_qspi_uboot \
sama5d2_ptc_eknf_uboot \
- sama5d2_ptc_eksd_uboot
+ sama5d2_ptc_eksd_uboot \
+ sama7g5eksd_uboot
define Build/Compile
+$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) \
diff --git a/package/boot/at91bootstrap/at91bootstrap.mk b/package/boot/at91bootstrap/at91bootstrap.mk
index fe6577f5892..d4e807d9a21 100644
--- a/package/boot/at91bootstrap/at91bootstrap.mk
+++ b/package/boot/at91bootstrap/at91bootstrap.mk
@@ -5,7 +5,7 @@ PKG_FLAGS:=nonshared
export GCC_HONOUR_COPTS=s
define Package/at91bootstrap/install/default
- $(CP) -avL $(PKG_BUILD_DIR)/binaries/at91bootstrap.bin $(1)/
+ $(CP) -avL $(PKG_BUILD_DIR)/$(BINARIES_DIR)/at91bootstrap.bin $(1)/
endef
Package/at91bootstrap/install = $(Package/at91bootstrap/install/default)
diff --git a/package/boot/grub2/Makefile b/package/boot/grub2/Makefile
index 9c67ff589b1..f274ce2289b 100644
--- a/package/boot/grub2/Makefile
+++ b/package/boot/grub2/Makefile
@@ -6,14 +6,16 @@ include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=grub
-PKG_CPE_ID:=cpe:/a:gnu:grub2
PKG_VERSION:=2.06
-PKG_RELEASE:=$(AUTORELEASE)
+PKG_RELEASE:=6
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
PKG_SOURCE_URL:=@GNU/grub
PKG_HASH:=b79ea44af91b93d17cd3fe80bdae6ed43770678a9a5ae192ccea803ebb657ee1
+PKG_LICENSE:=GPL-3.0-or-later
+PKG_CPE_ID:=cpe:/a:gnu:grub2
+
HOST_BUILD_PARALLEL:=1
PKG_BUILD_DEPENDS:=grub2/host
@@ -23,6 +25,7 @@ ifneq ($(BUILD_VARIANT),none)
endif
PKG_FLAGS:=nonshared
+PKG_BUILD_FLAGS:=no-gc-sections no-lto no-mold
include $(INCLUDE_DIR)/host-build.mk
include $(INCLUDE_DIR)/package.mk
@@ -30,14 +33,15 @@ include $(INCLUDE_DIR)/package.mk
define Package/grub2/Default
CATEGORY:=Boot Loaders
SECTION:=boot
- TITLE:=GRand Unified Bootloader ($(1))
+ TITLE:=GRand Unified Bootloader ($(2))
URL:=http://www.gnu.org/software/grub/
- DEPENDS:=@TARGET_x86
- VARIANT:=$(1)
+ DEPENDS:=@TARGET_$(1)
+ VARIANT:=$(2)
endef
-Package/grub2=$(call Package/grub2/Default,pc)
-Package/grub2-efi=$(call Package/grub2/Default,efi)
+Package/grub2=$(call Package/grub2/Default,x86,pc)
+Package/grub2-efi=$(call Package/grub2/Default,x86,efi)
+Package/grub2-efi-arm=$(call Package/grub2/Default,armsr,efi)
define Package/grub2-editenv
CATEGORY:=Utilities
@@ -104,6 +108,10 @@ ifneq ($(BUILD_VARIANT),none)
MAKE_PATH := grub-core
endif
+ifeq ($(CONFIG_arm),y)
+ TARGET_CFLAGS := $(filter-out -mfloat-abi=hard,$(TARGET_CFLAGS))
+endif
+
define Host/Configure
$(SED) 's,(RANLIB),(TARGET_RANLIB),' $(HOST_BUILD_DIR)/grub-core/Makefile.in
$(Host/Configure/Default)
@@ -120,28 +128,28 @@ define Package/grub2/install
-O i386-pc \
-c $(PKG_BUILD_DIR)/grub-early.cfg \
-o $(STAGING_DIR_IMAGE)/grub2/gpt-core.img \
- at_keyboard biosdisk boot chain configfile fat linux ls part_gpt reboot serial vga
+ at_keyboard biosdisk boot chain configfile fat linux ls part_gpt reboot search serial test vga
$(STAGING_DIR_HOST)/bin/grub-mkimage \
-d $(PKG_BUILD_DIR)/grub-core \
-p /boot/grub \
-O i386-pc \
-c ./files/grub-early.cfg \
-o $(STAGING_DIR_IMAGE)/grub2/generic-core.img \
- at_keyboard biosdisk boot chain configfile ext2 linux ls part_msdos reboot serial vga
+ at_keyboard biosdisk boot chain configfile ext2 linux ls part_msdos reboot search serial test vga
$(STAGING_DIR_HOST)/bin/grub-mkimage \
-d $(PKG_BUILD_DIR)/grub-core \
-p /boot/grub \
-O i386-pc \
-c ./files/grub-early.cfg \
-o $(STAGING_DIR_IMAGE)/grub2/eltorito.img \
- at_keyboard biosdisk boot chain configfile iso9660 linux ls part_msdos reboot serial test vga
+ at_keyboard biosdisk boot chain configfile iso9660 linux ls part_msdos reboot search serial test vga
$(STAGING_DIR_HOST)/bin/grub-mkimage \
-d $(PKG_BUILD_DIR)/grub-core \
-p /boot/grub \
-O i386-pc \
-c ./files/grub-early.cfg \
-o $(STAGING_DIR_IMAGE)/grub2/legacy-core.img \
- biosdisk boot chain configfile ext2 linux ls part_msdos reboot serial vga
+ biosdisk boot chain configfile ext2 linux ls part_msdos reboot search serial vga
endef
define Package/grub2-efi/install
@@ -152,16 +160,38 @@ define Package/grub2-efi/install
-O $(CONFIG_ARCH)-efi \
-c $(PKG_BUILD_DIR)/grub-early.cfg \
-o $(STAGING_DIR_IMAGE)/grub2/boot$(if $(CONFIG_x86_64),x64,ia32).efi \
- at_keyboard boot chain configfile fat linux ls part_gpt reboot serial efi_gop efi_uga
+ at_keyboard boot chain configfile fat linux ls part_gpt reboot serial test efi_gop efi_uga
$(STAGING_DIR_HOST)/bin/grub-mkimage \
-d $(PKG_BUILD_DIR)/grub-core \
-p /boot/grub \
-O $(CONFIG_ARCH)-efi \
-c ./files/grub-early.cfg \
-o $(STAGING_DIR_IMAGE)/grub2/iso-boot$(if $(CONFIG_x86_64),x64,ia32).efi \
- at_keyboard boot chain configfile fat iso9660 linux ls part_msdos part_gpt reboot serial test efi_gop efi_uga
+ boot chain configfile fat iso9660 linux ls part_msdos part_gpt reboot serial test efi_gop efi_uga
+endef
+
+define Package/grub2-efi-arm/install
+ $(INSTALL_DIR) $(STAGING_DIR_IMAGE)/grub2
+ cp ./files/grub-early-gpt.cfg $(PKG_BUILD_DIR)/grub-early.cfg
+ $(STAGING_DIR_HOST)/bin/grub-mkimage \
+ -d $(PKG_BUILD_DIR)/grub-core \
+ -p /boot/grub \
+ -O arm$(if $(CONFIG_aarch64),64,)-efi \
+ -c $(PKG_BUILD_DIR)/grub-early.cfg \
+ -o $(STAGING_DIR_IMAGE)/grub2/boot$(if $(CONFIG_aarch64),aa64,arm).efi \
+ boot chain configfile fat linux ls part_gpt part_msdos reboot search \
+ search_fs_uuid search_label serial efi_gop lsefi minicmd ext2
+ $(STAGING_DIR_HOST)/bin/grub-mkimage \
+ -d $(PKG_BUILD_DIR)/grub-core \
+ -p /boot/grub \
+ -O arm$(if $(CONFIG_aarch64),64,)-efi \
+ -c ./files/grub-early.cfg \
+ -o $(STAGING_DIR_IMAGE)/grub2/iso-bootaa$(if $(CONFIG_aarch64),aa64,arm).efi \
+ boot chain configfile fat iso9660 linux ls lsefi minicmd part_msdos part_gpt \
+ reboot serial test efi_gop
endef
+
define Package/grub2-editenv/install
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/grub-editenv $(1)/usr/sbin/
@@ -175,5 +205,6 @@ endef
$(eval $(call HostBuild))
$(eval $(call BuildPackage,grub2))
$(eval $(call BuildPackage,grub2-efi))
+$(eval $(call BuildPackage,grub2-efi-arm))
$(eval $(call BuildPackage,grub2-editenv))
$(eval $(call BuildPackage,grub2-bios-setup))
diff --git a/package/boot/grub2/files/grub-early-gpt.cfg b/package/boot/grub2/files/grub-early-gpt.cfg
new file mode 100644
index 00000000000..c295d1f7d77
--- /dev/null
+++ b/package/boot/grub2/files/grub-early-gpt.cfg
@@ -0,0 +1,2 @@
+search --set=root --label kernel
+configfile ($root)/efi/openwrt/grub.cfg
diff --git a/package/boot/kexec-tools/Makefile b/package/boot/kexec-tools/Makefile
index 0fbbefdc3b9..702ae009030 100644
--- a/package/boot/kexec-tools/Makefile
+++ b/package/boot/kexec-tools/Makefile
@@ -8,15 +8,17 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=kexec-tools
-PKG_VERSION:=2.0.21
-PKG_RELEASE:=2
+PKG_VERSION:=2.0.28
+PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
PKG_SOURCE_URL:=@KERNEL/linux/utils/kernel/kexec
-PKG_HASH:=e113142dee891638ad96e0f72cf9277b244477619470b30c41999d312e8e8702
+PKG_HASH:=d2f0ef872f39e2fe4b1b01feb62b0001383207239b9f8041f98a95564161d053
PKG_CONFIG_DEPENDS := CONFIG_KEXEC_ZLIB CONFIG_KEXEC_LZMA
+PKG_BUILD_FLAGS:=gc-sections
+
include $(INCLUDE_DIR)/package.mk
define Package/kexec-tools/Default
@@ -49,6 +51,17 @@ define Package/kexec/description
The kexec utility allows to load and boot another kernel.
endef
+define Package/kdump
+ $(call Package/kexec-tools/Default)
+ TITLE:=Kernel crash analysis
+ DEPENDS:=+kexec @(i386||x86_64||arm) @KERNEL_CRASH_DUMP
+endef
+
+define Package/kdump/description
+ The kdump package allows to automatically boot into a
+ special kernel for analyzing kernel crashes using kdump.
+endef
+
define Package/kexec/config
source "$(SOURCE)/Config.in"
endef
@@ -71,9 +84,6 @@ CONFIGURE_ARGS = \
$(if $(CONFIG_KEXEC_LZMA),--with,--without)-lzma \
TARGET_LD="$(TARGET_CROSS)ld"
-TARGET_CFLAGS += -ffunction-sections -fdata-sections
-TARGET_LDFLAGS += -Wl,--gc-sections
-
CONFIGURE_VARS += \
BUILD_CC="$(HOSTCC)" \
TARGET_CC="$(TARGET_CC)"
@@ -95,5 +105,28 @@ define Package/kexec/install
$(LN) ../usr/sbin/kexec $(1)/sbin/kexec
endef
+define Package/kdump/install
+ $(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/init.d $(1)/etc/config $(1)/etc/uci-defaults
+ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/vmcore-dmesg $(1)/usr/sbin
+ $(INSTALL_BIN) ./files/kdump.init $(1)/etc/init.d/kdump
+ $(INSTALL_BIN) ./files/kdump.defaults $(1)/etc/uci-defaults/kdump
+ $(INSTALL_CONF) ./files/kdump.config $(1)/etc/config/kdump
+endef
+
+define Package/kdump/prerm
+#!/bin/sh
+
+case $$(uname -m) in
+ i?86|x86_64)
+ if grep -q " crashkernel=" /boot/grub/grub.cfg; then
+ mount /boot -o remount,rw
+ sed -i 's/ crashkernel=[^ ]*//' /boot/grub/grub.cfg
+ mount /boot -o remount,ro
+ fi
+ ;;
+esac
+endef
+
$(eval $(call BuildPackage,kexec-tools))
$(eval $(call BuildPackage,kexec))
+$(eval $(call BuildPackage,kdump))
diff --git a/package/boot/kexec-tools/patches/001-arm-do-not-copy-magic-4-bytes-of-appended-DTB-in-zIm.patch b/package/boot/kexec-tools/patches/001-arm-do-not-copy-magic-4-bytes-of-appended-DTB-in-zIm.patch
deleted file mode 100644
index 82bdd4e7ed6..00000000000
--- a/package/boot/kexec-tools/patches/001-arm-do-not-copy-magic-4-bytes-of-appended-DTB-in-zIm.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-From 9817ec81968a5eec7863902833fb77680544eae4 Mon Sep 17 00:00:00 2001
-From: Alexander Egorenkov <egorenar-dev@posteo.net>
-Date: Mon, 12 Apr 2021 13:18:05 +0200
-Subject: [PATCH 1/1] arm: do not copy magic 4 bytes of appended DTB in zImage
-
-If the passed zImage happens to have a DTB appended, then the magic 4 bytes
-of the DTB are copied together with the kernel image. This leads to
-failed kexec boots because the decompressor finds the aforementioned
-DTB magic and falsely tries to replace the DTB passed in the register r2
-with the non-existent appended one.
-
-Signed-off-by: Alexander Egorenkov <egorenar-dev@posteo.net>
-Signed-off-by: Simon Horman <horms@verge.net.au>
----
- kexec/arch/arm/kexec-zImage-arm.c | 12 +++++++++++-
- 1 file changed, 11 insertions(+), 1 deletion(-)
-
---- a/kexec/arch/arm/kexec-zImage-arm.c
-+++ b/kexec/arch/arm/kexec-zImage-arm.c
-@@ -382,6 +382,7 @@ int zImage_arm_load(int argc, char **arg
- unsigned int atag_offset = 0x1000; /* 4k offset from memory start */
- unsigned int extra_size = 0x8000; /* TEXT_OFFSET */
- const struct zimage_tag *tag;
-+ size_t kernel_buf_size;
- size_t kernel_mem_size;
- const char *command_line;
- char *modified_cmdline = NULL;
-@@ -538,6 +539,15 @@ int zImage_arm_load(int argc, char **arg
- }
-
- /*
-+ * Save the length of the compressed kernel image w/o the appended DTB.
-+ * This will be required later on when the kernel image contained
-+ * in the zImage will be loaded into a kernel memory segment.
-+ * And we want to load ONLY the compressed kernel image from the zImage
-+ * and discard the appended DTB.
-+ */
-+ kernel_buf_size = len;
-+
-+ /*
- * Always extend the zImage by four bytes to ensure that an appended
- * DTB image always sees an initialised value after _edata.
- */
-@@ -759,7 +769,7 @@ int zImage_arm_load(int argc, char **arg
- add_segment(info, dtb_buf, dtb_length, dtb_offset, dtb_length);
- }
-
-- add_segment(info, buf, len, kernel_base, kernel_mem_size);
-+ add_segment(info, buf, kernel_buf_size, kernel_base, kernel_mem_size);
-
- info->entry = (void*)kernel_base;
-
diff --git a/package/boot/kobs-ng/Makefile b/package/boot/kobs-ng/Makefile
index 3fa8302b8ce..68e6ff170cd 100644
--- a/package/boot/kobs-ng/Makefile
+++ b/package/boot/kobs-ng/Makefile
@@ -25,7 +25,7 @@ define Package/kobs-ng
SECTION:=utils
CATEGORY:=Utilities
TITLE:=Application for writing bootstreams to NAND flash
- DEPENDS:=@TARGET_imx6
+ DEPENDS:=@TARGET_imx
endef
define Package/kobs-ng/description
diff --git a/package/boot/opensbi/Makefile b/package/boot/opensbi/Makefile
new file mode 100644
index 00000000000..01348e50aad
--- /dev/null
+++ b/package/boot/opensbi/Makefile
@@ -0,0 +1,63 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# Copyright (C) 2022 OpenWrt.org
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=opensbi
+PKG_RELEASE:=1.2
+
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_URL=https://github.com/riscv/opensbi
+PKG_SOURCE_DATE:=2022-12-24
+PKG_SOURCE_VERSION:=6b5188ca14e59ce7bf71afe4e7d3d557c3d31bf8
+PKG_MIRROR_HASH:=edcdd99da6c62975171981c0aa2b73a27091067da11ccd49816b5ad27d000858
+
+PKG_BUILD_DIR=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
+
+PKG_TARGETS:=bin
+PKG_FLAGS:=nonshared
+PKG_LICENSE:=BSD-2-Clause
+PKG_LICENSE_FILES:=COPYING.BSD
+PKG_BUILD_PARALLEL:=1
+
+PKG_MAINTAINER:=Zoltan HERPAI <wigyori@uid0.hu>
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/opensbi
+ SECTION:=boot
+ CATEGORY:=Boot Loaders
+ DEPENDS:=@TARGET_sifiveu
+ URL:=https://github.com/riscv/opensbi/blob/master/README.md
+ VARIANT:=$(subst _,/,$(subst opensbi_,,$(1)))
+ TITLE:=OpenSBI generic
+ OPENSBI_IMAGE:=
+ PLAT:=
+endef
+
+define Package/opensbi_generic
+ $(Package/opensbi)
+ TITLE:=OpenSBI generic
+ OPENSBI_IMAGE:=fw_dynamic.bin
+ PLAT:=generic
+endef
+
+export GCC_HONOUR_COPTS=s
+
+MAKE_VARS = \
+ CROSS_COMPILE="$(TARGET_CROSS)"
+
+define Build/Compile
+ $(eval $(Package/opensbi_$(BUILD_VARIANT))) \
+ +$(MAKE_VARS) $(MAKE) -C $(PKG_BUILD_DIR) \
+ PLATFORM=$(PLAT)
+endef
+
+define Build/InstallDev
+ $(INSTALL_DIR) $(STAGING_DIR_IMAGE)
+ $(CP) $(PKG_BUILD_DIR)/build/platform/$(PLAT)/firmware/fw_dynamic.bin $(STAGING_DIR_IMAGE)/fw_dynamic-${BUILD_VARIANT}.bin
+endef
+
+$(eval $(call BuildPackage,opensbi_generic))
diff --git a/package/boot/rkbin/Makefile b/package/boot/rkbin/Makefile
new file mode 100644
index 00000000000..affdd7b4e19
--- /dev/null
+++ b/package/boot/rkbin/Makefile
@@ -0,0 +1,47 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# Copyright (C) 2021-2023 ImmortalWrt.org
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=rkbin
+PKG_RELEASE:=1
+
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_URL=https://github.com/rockchip-linux/rkbin.git
+PKG_SOURCE_DATE:=2023-07-26
+PKG_SOURCE_VERSION:=b4558da0860ca48bf1a571dd33ccba580b9abe23
+PKG_MIRROR_HASH:=5842fbcb7e217c336235573e431e427f2f745390d989f6765a6c258a5bdf1b6e
+
+PKG_LICENSE_FILES:=LICENSE
+PKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>
+
+include $(INCLUDE_DIR)/kernel.mk
+include $(INCLUDE_DIR)/trusted-firmware-a.mk
+include $(INCLUDE_DIR)/package.mk
+
+define Trusted-Firmware-A/Default
+ NAME:=Rockchip $(1) SoCs
+ BUILD_TARGET:=rockchip
+endef
+
+define Trusted-Firmware-A/rk3568
+ BUILD_SUBTARGET:=armv8
+ ATF:=rk35/rk3568_bl31_v1.43.elf
+ TPL:=rk35/rk3568_ddr_1560MHz_v1.18.bin
+endef
+
+TFA_TARGETS:= \
+ rk3568
+
+define Build/Compile
+endef
+
+define Package/trusted-firmware-a/install
+ $(INSTALL_DIR) $(STAGING_DIR_IMAGE)
+
+ $(CP) $(PKG_BUILD_DIR)/bin/$(ATF) $(STAGING_DIR_IMAGE)/
+ $(CP) $(PKG_BUILD_DIR)/bin/$(TPL) $(STAGING_DIR_IMAGE)/
+endef
+
+$(eval $(call BuildPackage/Trusted-Firmware-A))
diff --git a/package/boot/tfa-layerscape/Makefile b/package/boot/tfa-layerscape/Makefile
index 6285da6a156..3509658869b 100644
--- a/package/boot/tfa-layerscape/Makefile
+++ b/package/boot/tfa-layerscape/Makefile
@@ -8,163 +8,146 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=tfa-layerscape
-PKG_VERSION:=LSDK-20.04-update-290520
-PKG_RELEASE:=$(AUTORELEASE)
+PKG_VERSION:=lf-6.1.1-1.0.0
+PKG_RELEASE:=1
PKG_SOURCE_PROTO:=git
-PKG_SOURCE_URL:=https://source.codeaurora.org/external/qoriq/qoriq-components/atf
-PKG_SOURCE_VERSION:=7d748e6f0ec652ba7c43733dc67a3d0b0217390a
-PKG_MIRROR_HASH:=d209c9ad18aac9f18375450b98b8dab00f0382ccb485df14623bf9b72ea1dd9b
+PKG_SOURCE_URL:=https://github.com/nxp-qoriq/atf
+PKG_SOURCE_VERSION:=lf-6.1.1-1.0.0
+PKG_MIRROR_HASH:=c0e3c7d0cc9ee5f9ae68cd705ce7f07f714c4fe3fd4a5a79de5699e7865b759f
PKG_BUILD_DEPENDS:=tfa-layerscape/host
include $(INCLUDE_DIR)/host-build.mk
+include $(INCLUDE_DIR)/trusted-firmware-a.mk
include $(INCLUDE_DIR)/package.mk
HOST_CFLAGS += -Wall -Werror -pedantic -std=c99
define Host/Compile
$(MAKE) -C \
$(HOST_BUILD_DIR)/tools/fiptool \
+ PLAT_FIPTOOL_HELPER_MK="$(HOST_BUILD_DIR)/tools/nxp/plat_fiptool/plat_fiptool.mk" \
CFLAGS="$(HOST_CFLAGS)" \
- LDFLAGS="$(HOST_LDFLAGS)"
+ LDFLAGS="$(HOST_LDFLAGS)" \
+ HOSTCCFLAGS="$(HOST_CFLAGS)"
$(MAKE) -C \
- $(HOST_BUILD_DIR)/plat/nxp/tools \
+ $(HOST_BUILD_DIR)/tools/nxp/create_pbl \
CFLAGS="$(HOST_CFLAGS)"
endef
define Host/Install
$(INSTALL_BIN) $(HOST_BUILD_DIR)/tools/fiptool/fiptool $(STAGING_DIR_HOST)/bin/fiptool-layerscape
- $(INSTALL_BIN) $(HOST_BUILD_DIR)/plat/nxp/tools/create_pbl $(STAGING_DIR_HOST)/bin/tfa-create-pbl
- $(INSTALL_BIN) $(HOST_BUILD_DIR)/plat/nxp/tools/byte_swap $(STAGING_DIR_HOST)/bin/tfa-byte-swap
+ $(INSTALL_BIN) $(HOST_BUILD_DIR)/tools/nxp/create_pbl/create_pbl $(STAGING_DIR_HOST)/bin/tfa-create-pbl
+ $(INSTALL_BIN) $(HOST_BUILD_DIR)/tools/nxp/create_pbl/byte_swap $(STAGING_DIR_HOST)/bin/tfa-byte-swap
endef
-define Package/tfa-generic
- SECTION:=boot
- CATEGORY:=Boot Loaders
- DEPENDS:=@TARGET_layerscape_armv8_64b +layerscape-rcw +u-boot-fsl_$(subst tfa-,,$(1))
- VARIANT:=$(subst tfa-,,$(1))
+define Trusted-Firmware-A/Default
+ BUILD_TARGET:=layerscape
+ BUILD_SUBTARGET:=armv8_64b
+ DEPENDS:=+layerscape-rcw +u-boot-fsl_$(1)
endef
-define Package/tfa-ls1012a-frdm
- $(Package/tfa-generic)
- TITLE:=NXP LS1012AFRDM Trusted Firmware
+define Trusted-Firmware-A/ls1012a-frdm
+ NAME:=NXP LS1012AFRDM
PLAT:=ls1012afrdm
BOOT_MODE:=qspi
endef
-define Package/tfa-ls1012a-rdb
- $(Package/tfa-generic)
- TITLE:=NXP LS1012ARDB Trusted Firmware
+define Trusted-Firmware-A/ls1012a-rdb
+ NAME:=NXP LS1012ARDB
PLAT:=ls1012ardb
BOOT_MODE:=qspi
endef
-define Package/tfa-ls1012a-frwy-sdboot
- $(Package/tfa-generic)
- TITLE:=NXP LS1012AFRWY Trusted Firmware
+define Trusted-Firmware-A/ls1012a-frwy-sdboot
+ NAME:=NXP LS1012AFRWY
PLAT:=ls1012afrwy
BOOT_MODE:=qspi
endef
-define Package/tfa-ls1043a-rdb
- $(Package/tfa-generic)
- TITLE:=NXP LS1043ARDB Trusted Firmware
+define Trusted-Firmware-A/ls1028a-rdb
+ TITLE:=NXP LS1028ARDB
+ PLAT:=ls1028ardb
+ BOOT_MODE:=flexspi_nor
+endef
+
+define Trusted-Firmware-A/ls1028a-rdb-sdboot
+ TITLE:=NXP LS1028ARDB SD Boot
+ PLAT:=ls1028ardb
+ BOOT_MODE:=sd
+endef
+
+define Trusted-Firmware-A/ls1043a-rdb
+ NAME:=NXP LS1043ARDB
PLAT:=ls1043ardb
BOOT_MODE:=nor
endef
-define Package/tfa-ls1043a-rdb-sdboot
- $(Package/tfa-generic)
- TITLE:=NXP LS1043ARDB SD Boot Trusted Firmware
+define Trusted-Firmware-A/ls1043a-rdb-sdboot
+ NAME:=NXP LS1043ARDB SD Boot
PLAT:=ls1043ardb
BOOT_MODE:=sd
endef
-define Package/tfa-ls1046a-frwy
- $(Package/tfa-generic)
- TITLE:=NXP LS1046AFRWY Trusted Firmware
+define Trusted-Firmware-A/ls1046a-frwy
+ NAME:=NXP LS1046AFRWY
PLAT:=ls1046afrwy
BOOT_MODE:=qspi
endef
-define Package/tfa-ls1046a-frwy-sdboot
- $(Package/tfa-generic)
- TITLE:=NXP LS1046AFRWY SD Boot Trusted Firmware
+define Trusted-Firmware-A/ls1046a-frwy-sdboot
+ NAME:=NXP LS1046AFRWY SD Boot
PLAT:=ls1046afrwy
BOOT_MODE:=sd
endef
-define Package/tfa-ls1046a-rdb
- $(Package/tfa-generic)
- TITLE:=NXP LS1046ARDB Trusted Firmware
+define Trusted-Firmware-A/ls1046a-rdb
+ NAME:=NXP LS1046ARDB
PLAT:=ls1046ardb
BOOT_MODE:=qspi
endef
-define Package/tfa-ls1046a-rdb-sdboot
- $(Package/tfa-generic)
- TITLE:=NXP LS1046ARDB SD Boot Trusted Firmware
+define Trusted-Firmware-A/ls1046a-rdb-sdboot
+ NAME:=NXP LS1046ARDB SD Boot
PLAT:=ls1046ardb
BOOT_MODE:=sd
endef
-define Package/tfa-ls1088a-rdb
- $(Package/tfa-generic)
- TITLE:=NXP LS1088ARDB Trusted Firmware
+define Trusted-Firmware-A/ls1088a-rdb
+ NAME:=NXP LS1088ARDB
PLAT:=ls1088ardb
BOOT_MODE:=qspi
endef
-define Package/tfa-ls1088a-rdb-sdboot
- $(Package/tfa-generic)
- TITLE:=NXP LS1088ARDB SD Boot Trusted Firmware
+define Trusted-Firmware-A/ls1088a-rdb-sdboot
+ NAME:=NXP LS1088ARDB SD Boot
PLAT:=ls1088ardb
BOOT_MODE:=sd
endef
-define Package/tfa-ls2088a-rdb
- $(Package/tfa-generic)
- TITLE:=NXP LS2088ARDB Trusted Firmware
+define Trusted-Firmware-A/ls2088a-rdb
+ NAME:=NXP LS2088ARDB
PLAT:=ls2088ardb
BOOT_MODE:=nor
endef
-define Package/tfa-lx2160a-rdb
- $(Package/tfa-generic)
- TITLE:=NXP LX2160ARDB Trusted Firmware
+define Trusted-Firmware-A/lx2160a-rdb
+ NAME:=NXP LX2160ARDB
PLAT:=lx2160ardb
BOOT_MODE:=flexspi_nor
endef
-define Package/tfa-lx2160a-rdb-sdboot
- $(Package/tfa-generic)
- TITLE:=NXP LX2160ARDB SD Boot Trusted Firmware
+define Trusted-Firmware-A/lx2160a-rdb-sdboot
+ NAME:=NXP LX2160ARDB SD Boot
PLAT:=lx2160ardb
BOOT_MODE:=sd
endef
-define Build/InstallDev
- $(INSTALL_DIR) $(STAGING_DIR_IMAGE)
- $(CP) $(PKG_BUILD_DIR)/build/$(PLAT)/release/bl2_$(BOOT_MODE).pbl \
- $(STAGING_DIR_IMAGE)/fsl_$(BUILD_VARIANT)-bl2.pbl
- $(CP) $(PKG_BUILD_DIR)/build/$(PLAT)/release/fip.bin \
- $(STAGING_DIR_IMAGE)/fsl_$(BUILD_VARIANT)-fip.bin
-endef
-
-define Build/Compile
- $(eval $(Package/tfa-$(BUILD_VARIANT))) \
- $(MAKE) -C $(PKG_BUILD_DIR) CROSS_COMPILE=$(TARGET_CROSS) \
- fip pbl PLAT=$(PLAT) BOOT_MODE=$(BOOT_MODE) \
- RCW=$(STAGING_DIR_IMAGE)/fsl_$(BUILD_VARIANT)-rcw.bin \
- BL33=$(STAGING_DIR_IMAGE)/fsl_$(BUILD_VARIANT)-uboot.bin \
- FIPTOOL=$(STAGING_DIR_HOST)/bin/fiptool-layerscape \
- CREATE_PBL=$(STAGING_DIR_HOST)/bin/tfa-create-pbl \
- BYTE_SWAP=$(STAGING_DIR_HOST)/bin/tfa-byte-swap
-endef
-
-TFAS := \
+TFA_TARGETS := \
ls1012a-frdm \
ls1012a-rdb \
ls1012a-frwy-sdboot \
+ ls1028a-rdb \
+ ls1028a-rdb-sdboot \
ls1043a-rdb \
ls1043a-rdb-sdboot \
ls1046a-frwy \
@@ -177,7 +160,25 @@ TFAS := \
lx2160a-rdb \
lx2160a-rdb-sdboot
+TFA_MAKE_FLAGS += \
+ fip pbl \
+ BOOT_MODE=$(BOOT_MODE) \
+ RCW=$(STAGING_DIR_IMAGE)/fsl_$(BUILD_VARIANT)-rcw.bin \
+ BL33=$(STAGING_DIR_IMAGE)/fsl_$(BUILD_VARIANT)-uboot.bin \
+ FIPTOOL=$(STAGING_DIR_HOST)/bin/fiptool-layerscape \
+ CREATE_PBL=$(STAGING_DIR_HOST)/bin/tfa-create-pbl \
+ BYTE_SWAP=$(STAGING_DIR_HOST)/bin/tfa-byte-swap
+
+define Build/InstallDev
+ $(INSTALL_DIR) $(STAGING_DIR_IMAGE)
+ $(CP) $(PKG_BUILD_DIR)/build/$(PLAT)/release/bl2_$(BOOT_MODE).pbl \
+ $(STAGING_DIR_IMAGE)/fsl_$(BUILD_VARIANT)-bl2.pbl
+ $(CP) $(PKG_BUILD_DIR)/build/$(PLAT)/release/fip.bin \
+ $(STAGING_DIR_IMAGE)/fsl_$(BUILD_VARIANT)-fip.bin
+endef
+
+define Package/trusted-firmware-a/install/default
+endef
+
$(eval $(call HostBuild))
-$(foreach tfa,$(TFAS), \
- $(eval $(call BuildPackage,tfa-$(tfa))) \
-)
+$(eval $(call BuildPackage/Trusted-Firmware-A))
diff --git a/package/boot/tfa-layerscape/patches/001-fiptool-hostbuild-fixes.patch b/package/boot/tfa-layerscape/patches/001-fiptool-hostbuild-fixes.patch
index 0567e5869be..50ce6528d77 100644
--- a/package/boot/tfa-layerscape/patches/001-fiptool-hostbuild-fixes.patch
+++ b/package/boot/tfa-layerscape/patches/001-fiptool-hostbuild-fixes.patch
@@ -1,49 +1,63 @@
--- a/Makefile
+++ b/Makefile
-@@ -448,10 +448,6 @@ endif
- CRTTOOLPATH ?= tools/cert_create
- CRTTOOL ?= ${CRTTOOLPATH}/cert_create${BIN_EXT}
+@@ -914,10 +914,6 @@ CRTTOOL ?= ${CRTTOOLPATH}/cert_create$
+ ENCTOOLPATH ?= tools/encrypt_fw
+ ENCTOOL ?= ${ENCTOOLPATH}/encrypt_fw${BIN_EXT}
-# Variables for use with Firmware Image Package
-FIPTOOLPATH ?= tools/fiptool
-FIPTOOL ?= ${FIPTOOLPATH}/fiptool${BIN_EXT}
-
- ################################################################################
- # Include BL specific makefiles
- ################################################################################
-@@ -661,14 +657,12 @@ endif
+ # Variables for use with sptool
+ SPTOOLPATH ?= tools/sptool
+ SPTOOL ?= ${SPTOOLPATH}/sptool${BIN_EXT}
+@@ -1322,13 +1318,6 @@ endif
clean:
@echo " CLEAN"
$(call SHELL_REMOVE_DIR,${BUILD_PLAT})
+-ifdef UNIX_MK
- ${Q}${MAKE} --no-print-directory -C ${FIPTOOLPATH} clean
+-else
+-# Clear the MAKEFLAGS as we do not want
+-# to pass the gnumake flags to nmake.
+- ${Q}set MAKEFLAGS= && ${MSVC_NMAKE} /nologo /f ${FIPTOOLPATH}/Makefile.msvc FIPTOOLPATH=$(subst /,\,$(FIPTOOLPATH)) FIPTOOL=$(subst /,\,$(FIPTOOL)) clean
+-endif
${Q}${MAKE} PLAT=${PLAT} --no-print-directory -C ${CRTTOOLPATH} clean
-
- realclean distclean:
+ ${Q}${MAKE} PLAT=${PLAT} --no-print-directory -C ${ENCTOOLPATH} clean
+ ${Q}${MAKE} --no-print-directory -C ${ROMLIBPATH} clean
+@@ -1337,13 +1326,6 @@ realclean distclean:
@echo " REALCLEAN"
$(call SHELL_REMOVE_DIR,${BUILD_BASE})
$(call SHELL_DELETE_ALL, ${CURDIR}/cscope.*)
+-ifdef UNIX_MK
- ${Q}${MAKE} --no-print-directory -C ${FIPTOOLPATH} clean
+-else
+-# Clear the MAKEFLAGS as we do not want
+-# to pass the gnumake flags to nmake.
+- ${Q}set MAKEFLAGS= && ${MSVC_NMAKE} /nologo /f ${FIPTOOLPATH}/Makefile.msvc FIPTOOLPATH=$(subst /,\,$(FIPTOOLPATH)) FIPTOOL=$(subst /,\,$(FIPTOOL)) realclean
+-endif
+ ${Q}${MAKE} --no-print-directory -C ${SPTOOLPATH} clean
${Q}${MAKE} PLAT=${PLAT} --no-print-directory -C ${CRTTOOLPATH} clean
-
- checkcodebase: locate-checkpatch
-@@ -717,7 +711,7 @@ certificates: ${CRT_DEPS} ${CRTTOOL}
+ ${Q}${MAKE} PLAT=${PLAT} --no-print-directory -C ${ENCTOOLPATH} realclean
+@@ -1400,7 +1382,7 @@ certificates: ${CRT_DEPS} ${CRTTOOL}
@${ECHO_BLANK_LINE}
endif
-${BUILD_PLAT}/${FIP_NAME}: ${FIP_DEPS} ${FIPTOOL}
+${BUILD_PLAT}/${FIP_NAME}: ${FIP_DEPS}
- ${Q}${FIPTOOL} create ${FIP_ARGS} $@
- ${Q}${FIPTOOL} info $@
- @${ECHO_BLANK_LINE}
-@@ -733,21 +727,16 @@ fwu_certificates: ${FWU_CRT_DEPS} ${CRTT
+ $(eval ${CHECK_FIP_CMD})
+ ${Q}${FIPTOOL} create ${FIP_ARGS} $@
+ ${Q}${FIPTOOL} info $@
+@@ -1417,7 +1399,7 @@ fwu_certificates: ${FWU_CRT_DEPS} ${CRTT
@${ECHO_BLANK_LINE}
endif
-${BUILD_PLAT}/${FWU_FIP_NAME}: ${FWU_FIP_DEPS} ${FIPTOOL}
+${BUILD_PLAT}/${FWU_FIP_NAME}: ${FWU_FIP_DEPS}
- ${Q}${FIPTOOL} create ${FWU_FIP_ARGS} $@
- ${Q}${FIPTOOL} info $@
- @${ECHO_BLANK_LINE}
+ $(eval ${CHECK_FWU_FIP_CMD})
+ ${Q}${FIPTOOL} create ${FWU_FIP_ARGS} $@
+ ${Q}${FIPTOOL} info $@
+@@ -1425,19 +1407,9 @@ ${BUILD_PLAT}/${FWU_FIP_NAME}: ${FWU_FIP
@echo "Built $@ successfully"
@${ECHO_BLANK_LINE}
@@ -51,21 +65,42 @@
fip: ${BUILD_PLAT}/${FIP_NAME}
fwu_fip: ${BUILD_PLAT}/${FWU_FIP_NAME}
--.PHONY: ${FIPTOOL}
--${FIPTOOL}:
-- ${Q}${MAKE} CPPFLAGS="-DVERSION='\"${VERSION_STRING}\"'" --no-print-directory -C ${FIPTOOLPATH}
+-${FIPTOOL}: FORCE
+-ifdef UNIX_MK
+- ${Q}${MAKE} CPPFLAGS="-DVERSION='\"${VERSION_STRING}\"'" FIPTOOL=${FIPTOOL} --no-print-directory -C ${FIPTOOLPATH}
+-else
+-# Clear the MAKEFLAGS as we do not want
+-# to pass the gnumake flags to nmake.
+- ${Q}set MAKEFLAGS= && ${MSVC_NMAKE} /nologo /f ${FIPTOOLPATH}/Makefile.msvc FIPTOOLPATH=$(subst /,\,$(FIPTOOLPATH)) FIPTOOL=$(subst /,\,$(FIPTOOL))
+-endif
-
- cscope:
- @echo " CSCOPE"
- ${Q}find ${CURDIR} -name "*.[chsS]" > cscope.files
+ sptool: ${SPTOOL}
+ ${SPTOOL}: FORCE
+ ${Q}${MAKE} CPPFLAGS="-DVERSION='\"${VERSION_STRING}\"'" SPTOOL=${SPTOOL} --no-print-directory -C ${SPTOOLPATH}
--- a/tools/fiptool/Makefile
+++ b/tools/fiptool/Makefile
-@@ -37,7 +37,7 @@ all: ${PROJECT} fip_create
+@@ -48,7 +48,7 @@ all: ${PROJECT}
${PROJECT}: ${OBJECTS} Makefile
- @echo " LD $@"
+ @echo " HOSTLD $@"
- ${Q}${HOSTCC} ${OBJECTS} -o $@ ${LDLIBS}
+ ${Q}${HOSTCC} ${OBJECTS} -o $@ ${LDLIBS} $(LDFLAGS)
@${ECHO_BLANK_LINE}
@echo "Built $@ successfully"
@${ECHO_BLANK_LINE}
+--- a/tools/nxp/plat_fiptool/plat_fiptool.mk 2023-05-20 22:28:28.079945619 +0200
++++ b/tools/nxp/plat_fiptool/plat_fiptool.mk 2023-05-20 22:26:59.443307771 +0200
+@@ -22,11 +22,11 @@ INCLUDE_PATHS += -I${PLAT_DEF_UUID_OID_C
+ $(shell rm ${PLAT_DEF_UUID_CONFIG_FILE_PATH}/${PLAT_DEF_UUID_CONFIG_FILE_NAME}.o)
+
+ ifeq (${PLAT_DEF_OID},yes)
+-HOSTCCFLAGS += -DPLAT_DEF_OID
++override HOSTCCFLAGS += -DPLAT_DEF_OID
+ endif
+
+ ifeq (${PLAT_DEF_UUID},yes)
+-HOSTCCFLAGS += -DPLAT_DEF_FIP_UUID
++override HOSTCCFLAGS += -DPLAT_DEF_FIP_UUID
+ PLAT_OBJECTS += ${PLAT_DEF_UUID_CONFIG_FILE_PATH}/${PLAT_DEF_UUID_CONFIG_FILE_NAME}.o
+ endif
+
diff --git a/package/boot/tfa-layerscape/patches/003-plat-nxp-tools-fix-create_pbl-and-byte_swap-host-bui.patch b/package/boot/tfa-layerscape/patches/003-plat-nxp-tools-fix-create_pbl-and-byte_swap-host-bui.patch
index ce4d9c48bf3..73c5c66cae1 100644
--- a/package/boot/tfa-layerscape/patches/003-plat-nxp-tools-fix-create_pbl-and-byte_swap-host-bui.patch
+++ b/package/boot/tfa-layerscape/patches/003-plat-nxp-tools-fix-create_pbl-and-byte_swap-host-bui.patch
@@ -1,60 +1,53 @@
From 8a458876013991fe2f288bbe4694264b16c3b9e9 Mon Sep 17 00:00:00 2001
From: Biwen Li <biwen.li@nxp.com>
Date: Fri, 26 Jul 2019 15:44:10 +0800
-Subject: [PATCH 3/3] plat/nxp/tools: fix create_pbl and byte_swap host build
+Subject: [PATCH 3/3] tools/nxp: fix create_pbl and byte_swap host build
Not compile create_pbl and byte_swap in the process of cross compilation
Signed-off-by: Biwen Li <biwen.li@nxp.com>
---
- plat/nxp/tools/pbl_ch2.mk | 3 ---
- plat/nxp/tools/pbl_ch3.mk | 5 -----
+ tools/nxp/pbl_ch2.mk | 3 ---
+ tools/nxp/pbl_ch3.mk | 5 -----
2 files changed, 8 deletions(-)
-diff --git a/plat/nxp/tools/pbl_ch2.mk b/plat/nxp/tools/pbl_ch2.mk
-index afa43520..ff624dd9 100644
---- a/plat/nxp/tools/pbl_ch2.mk
-+++ b/plat/nxp/tools/pbl_ch2.mk
-@@ -20,8 +20,6 @@ ifeq ($(RCW),"")
+--- a/tools/nxp/create_pbl/pbl_ch2.mk
++++ b/tools/nxp/create_pbl/pbl_ch2.mk
+@@ -19,8 +19,6 @@ ifeq ($(RCW),"")
else
# Generate header for bl2.bin
$(Q)$(CST_DIR)/create_hdr_isbc --in ${BUILD_PLAT}/bl2.bin --out ${BUILD_PLAT}/hdr_bl2 ${BL2_INPUT_FILE}
- # Compile create_pbl tool
-- ${Q}${MAKE} CPPFLAGS="-DVERSION='\"${VERSION_STRING}\"'" --no-print-directory -C ${PLAT_TOOL_PATH};\
+- ${Q}${MAKE} CPPFLAGS="-DVERSION='\"${VERSION_STRING}\"'" --no-print-directory -C ${CREATE_PBL_TOOL_PATH};\
# Add bl2.bin to RCW
${CREATE_PBL} -r ${RCW} -i ${BUILD_PLAT}/bl2.bin -b ${BOOT_MODE} -c ${SOC_NUM} -d ${BL2_BASE} -e ${BL2_BASE}\
-o ${BUILD_PLAT}/bl2_${BOOT_MODE}.pbl ;\
-@@ -43,7 +41,6 @@ ifeq ($(RCW),"")
+@@ -42,7 +40,6 @@ ifeq ($(RCW),"")
${Q}echo "Platform ${PLAT} requires rcw file. Please set RCW to point to the right RCW file for boot mode ${BOOT_MODE}"
else
# -a option appends the image for Chassis 3 devices in case of non secure boot
-- ${Q}${MAKE} CPPFLAGS="-DVERSION='\"${VERSION_STRING}\"'" --no-print-directory -C ${PLAT_TOOL_PATH};
+- ${Q}${MAKE} CPPFLAGS="-DVERSION='\"${VERSION_STRING}\"'" --no-print-directory -C ${CREATE_PBL_TOOL_PATH};
${CREATE_PBL} -r ${RCW} -i ${BUILD_PLAT}/bl2.bin -b ${BOOT_MODE} -c ${SOC_NUM} -d ${BL2_BASE} -e ${BL2_BASE} \
-o ${BUILD_PLAT}/bl2_${BOOT_MODE}.pbl ;
# Swapping of RCW is required for QSPi Chassis 2 devices
-diff --git a/plat/nxp/tools/pbl_ch3.mk b/plat/nxp/tools/pbl_ch3.mk
-index 944ae3bb..9aa8f635 100644
---- a/plat/nxp/tools/pbl_ch3.mk
-+++ b/plat/nxp/tools/pbl_ch3.mk
-@@ -27,9 +27,6 @@ else
+--- a/tools/nxp/create_pbl/pbl_ch3.mk
++++ b/tools/nxp/create_pbl/pbl_ch3.mk
+@@ -26,9 +26,6 @@ else
# Generate header for bl2.bin
$(Q)$(CST_DIR)/create_hdr_isbc --in ${BUILD_PLAT}/bl2.bin --out ${BUILD_PLAT}/hdr_bl2 ${BL2_INPUT_FILE}
- # Compile create_pbl tool
-- ${Q}${MAKE} CPPFLAGS="-DVERSION='\"${VERSION_STRING}\"'" --no-print-directory -C ${PLAT_TOOL_PATH};\
+- ${Q}${MAKE} CPPFLAGS="-DVERSION='\"${VERSION_STRING}\"'" --no-print-directory -C ${CREATE_PBL_TOOL_PATH};\
-
# Add Block Copy command for bl2.bin to RCW
${CREATE_PBL} -r ${RCW} -i ${BUILD_PLAT}/bl2.bin -b ${BOOT_MODE} -c ${SOC_NUM} -d ${BL2_BASE} -e ${BL2_BASE}\
-o ${BUILD_PLAT}/bl2_${BOOT_MODE}.pbl -f ${BL2_SRC_OFFSET};\
-@@ -57,8 +54,6 @@ else #SECURE_BOOT
+@@ -56,8 +53,6 @@ else #SECURE_BOOT
ifeq ($(RCW),"")
${Q}echo "Platform ${PLAT} requires rcw file. Please set RCW to point to the right RCW file for boot mode ${BOOT_MODE}"
else
-- ${Q}${MAKE} CPPFLAGS="-DVERSION='\"${VERSION_STRING}\"'" --no-print-directory -C ${PLAT_TOOL_PATH};
+- ${Q}${MAKE} CPPFLAGS="-DVERSION='\"${VERSION_STRING}\"'" --no-print-directory -C ${CREATE_PBL_TOOL_PATH};
-
# Add Block Copy command and populate boot loc ptrfor bl2.bin to RCW
${CREATE_PBL} -r ${RCW} -i ${BUILD_PLAT}/bl2.bin -b ${BOOT_MODE} -c ${SOC_NUM} -d ${BL2_BASE} -e ${BL2_BASE} \
-o ${BUILD_PLAT}/bl2_${BOOT_MODE}.pbl -f ${BL2_SRC_OFFSET};
---
-2.17.1
-
diff --git a/package/boot/tfa-layerscape/patches/004-plat-nxp-restore-ls1012afrdm-support.patch b/package/boot/tfa-layerscape/patches/004-plat-nxp-restore-ls1012afrdm-support.patch
new file mode 100644
index 00000000000..fc9504f82fd
--- /dev/null
+++ b/package/boot/tfa-layerscape/patches/004-plat-nxp-restore-ls1012afrdm-support.patch
@@ -0,0 +1,232 @@
+From 8c6a66feb721f18c930c7df03d1fbb7304107af6 Mon Sep 17 00:00:00 2001
+From: Wojciech Dubowik <Wojciech.Dubowik@protonmail.ch>
+Date: Thu, 20 Apr 2023 16:21:25 +0200
+Subject: [PATCH] tfa-layerscape: Restore ls1012afrdm support
+
+Signed-off-by: Wojciech Dubowik <Wojciech.Dubowik@protonmail.ch>
+---
+ plat/nxp/soc-ls1012a/ls1012afrdm/ddr_init.c | 34 +++++++
+ plat/nxp/soc-ls1012a/ls1012afrdm/plat_def.h | 92 +++++++++++++++++++
+ plat/nxp/soc-ls1012a/ls1012afrdm/platform.mk | 25 +++++
+ .../soc-ls1012a/ls1012afrdm/platform_def.h | 13 +++
+ plat/nxp/soc-ls1012a/ls1012afrdm/policy.h | 16 ++++
+ 5 files changed, 180 insertions(+)
+ create mode 100644 plat/nxp/soc-ls1012a/ls1012afrdm/ddr_init.c
+ create mode 100644 plat/nxp/soc-ls1012a/ls1012afrdm/plat_def.h
+ create mode 100644 plat/nxp/soc-ls1012a/ls1012afrdm/platform.mk
+ create mode 100644 plat/nxp/soc-ls1012a/ls1012afrdm/platform_def.h
+ create mode 100644 plat/nxp/soc-ls1012a/ls1012afrdm/policy.h
+
+diff --git a/plat/nxp/soc-ls1012a/ls1012afrdm/ddr_init.c b/plat/nxp/soc-ls1012a/ls1012afrdm/ddr_init.c
+new file mode 100644
+index 000000000..8cb518540
+--- /dev/null
++++ b/plat/nxp/soc-ls1012a/ls1012afrdm/ddr_init.c
+@@ -0,0 +1,34 @@
++/*
++ * Copyright 2018-2022 NXP
++ *
++ * SPDX-License-Identifier: BSD-3-Clause
++ */
++
++#include <common/debug.h>
++#include <fsl_mmdc.h>
++
++#include <platform_def.h>
++
++long long init_ddr(void)
++{
++ static const struct fsl_mmdc_info mparam = {
++ .mdctl = U(0x04180000),
++ .mdpdc = U(0x00030035),
++ .mdotc = U(0x12554000),
++ .mdcfg0 = U(0xbabf7954),
++ .mdcfg1 = U(0xdb328f64),
++ .mdcfg2 = U(0x01ff00db),
++ .mdmisc = U(0x00001680),
++ .mdref = U(0x0f3c8000),
++ .mdrwd = U(0x00002000),
++ .mdor = U(0x00bf1023),
++ .mdasp = U(0x0000003f),
++ .mpodtctrl = U(0x0000022a),
++ .mpzqhwctrl = U(0xa1390003),
++ };
++
++ mmdc_init(&mparam, NXP_DDR_ADDR);
++ NOTICE("DDR Init Done\n");
++
++ return NXP_DRAM0_SIZE;
++}
+diff --git a/plat/nxp/soc-ls1012a/ls1012afrdm/plat_def.h b/plat/nxp/soc-ls1012a/ls1012afrdm/plat_def.h
+new file mode 100644
+index 000000000..eb745a0a3
+--- /dev/null
++++ b/plat/nxp/soc-ls1012a/ls1012afrdm/plat_def.h
+@@ -0,0 +1,92 @@
++/*
++ * Copyright 2022 NXP
++ *
++ * SPDX-License-Identifier: BSD-3-Clause
++ */
++
++#ifndef PLAT_DEF_H
++#define PLAT_DEF_H
++
++#include <arch.h>
++/*
++ * Required without TBBR.
++ * To include the defines for DDR PHY
++ * Images.
++ */
++#include <tbbr_img_def.h>
++
++#include <policy.h>
++#include <soc.h>
++
++/* DDR Related definition */
++#define PLAT_DEF_DRAM0_SIZE 0x20000000 /* 512 MB */
++
++#define NXP_SYSCLK_FREQ 125000000
++#define NXP_DDRCLK_FREQ 100000000
++
++/* UART related definition */
++#define NXP_CONSOLE_ADDR NXP_UART_ADDR
++#define NXP_CONSOLE_BAUDRATE 115200
++
++#define NXP_SPD_EEPROM0 0x51
++
++/* Size of cacheable stacks */
++#if defined(IMAGE_BL2)
++#if defined(TRUSTED_BOARD_BOOT)
++#define PLATFORM_STACK_SIZE 0x2000
++#else
++#define PLATFORM_STACK_SIZE 0x1000
++#endif
++#elif defined(IMAGE_BL31)
++#define PLATFORM_STACK_SIZE 0x1000
++#endif
++
++/* SD block buffer */
++#define NXP_SD_BLOCK_BUF_SIZE (0x00100000)
++#define NXP_SD_BLOCK_BUF_ADDR ULL(0x80000000)
++
++#define BL2_LIMIT (NXP_OCRAM_ADDR + NXP_OCRAM_SIZE)
++
++/* IO defines as needed by IO driver framework */
++#define MAX_IO_DEVICES 3
++#define MAX_IO_BLOCK_DEVICES 1
++#define MAX_IO_HANDLES 4
++
++/*
++ * FIP image defines - Offset at which FIP Image would be present
++ * Image would include Bl31 , Bl33 and Bl32 (optional)
++ */
++#ifdef POLICY_FUSE_PROVISION
++#define MAX_FIP_DEVICES 2
++#endif
++
++#ifndef MAX_FIP_DEVICES
++#define MAX_FIP_DEVICES 1
++#endif
++
++#ifdef PLAT_FIP_OFFSET
++#undef PLAT_FIP_OFFSET
++#endif
++#ifdef PLAT_FIP_MAX_SIZE
++#undef PLAT_FIP_MAX_SIZE
++#endif
++#define PLAT_FIP_OFFSET 0x60000
++#define PLAT_FIP_MAX_SIZE 0x170000
++
++/*
++ * ID of the secure physical generic timer interrupt used by the BL32.
++ */
++#define BL32_IRQ_SEC_PHY_TIMER 29
++
++/*
++ * Define properties of Group 1 Secure and Group 0 interrupts as per GICv3
++ * terminology. On a GICv2 system or mode, the lists will be merged and treated
++ * as Group 0 interrupts.
++ */
++#define PLAT_LS_G1S_IRQ_PROPS(grp) \
++ INTR_PROP_DESC(BL32_IRQ_SEC_PHY_TIMER, GIC_HIGHEST_SEC_PRIORITY, grp, \
++ GIC_INTR_CFG_LEVEL)
++
++#define PLAT_LS_G0_IRQ_PROPS(grp)
++
++#endif
+diff --git a/plat/nxp/soc-ls1012a/ls1012afrdm/platform.mk b/plat/nxp/soc-ls1012a/ls1012afrdm/platform.mk
+new file mode 100644
+index 000000000..270e92420
+--- /dev/null
++++ b/plat/nxp/soc-ls1012a/ls1012afrdm/platform.mk
+@@ -0,0 +1,25 @@
++#
++# Copyright 2018-2022 NXP
++#
++# SPDX-License-Identifier: BSD-3-Clause
++#
++
++# board-specific build parameters
++BOOT_MODE := qspi
++BOARD := ls1012afrdm
++
++# DDR Compilation Configs
++DDRC_NUM_CS := 1
++
++# On-Board Flash Details
++QSPI_FLASH_SZ := 0x4000000
++
++BL2_SOURCES += ${BOARD_PATH}/ddr_init.c
++
++SUPPORTED_BOOT_MODE := qspi
++
++# Adding platform board build info
++include plat/nxp/common/plat_make_helper/plat_common_def.mk
++
++# Adding SoC build info
++include plat/nxp/soc-ls1012a/soc.mk
+diff --git a/plat/nxp/soc-ls1012a/ls1012afrdm/platform_def.h b/plat/nxp/soc-ls1012a/ls1012afrdm/platform_def.h
+new file mode 100644
+index 000000000..7daf1c02c
+--- /dev/null
++++ b/plat/nxp/soc-ls1012a/ls1012afrdm/platform_def.h
+@@ -0,0 +1,13 @@
++/*
++ * Copyright 2022 NXP
++ *
++ * SPDX-License-Identifier: BSD-3-Clause
++ */
++
++#ifndef PLATFORM_DEF_H
++#define PLATFORM_DEF_H
++
++#include <plat_def.h>
++#include <plat_default_def.h>
++
++#endif /* PLATFORM_DEF_H */
+diff --git a/plat/nxp/soc-ls1012a/ls1012afrdm/policy.h b/plat/nxp/soc-ls1012a/ls1012afrdm/policy.h
+new file mode 100644
+index 000000000..a782d01c7
+--- /dev/null
++++ b/plat/nxp/soc-ls1012a/ls1012afrdm/policy.h
+@@ -0,0 +1,16 @@
++/*
++ * Copyright 2018-2022 NXP
++ *
++ * SPDX-License-Identifier: BSD-3-Clause
++ */
++
++#ifndef POLICY_H
++#define POLICY_H
++
++/*
++ * Set this to 0x0 to leave the default SMMU page size in sACR
++ * Set this to 0x1 to change the SMMU page size to 64K
++ */
++#define POLICY_SMMU_PAGESZ_64K 0x0
++
++#endif /* POLICY_H */
+--
+2.34.1
+
diff --git a/package/boot/uboot-armsr/Makefile b/package/boot/uboot-armsr/Makefile
new file mode 100644
index 00000000000..ce53d19b796
--- /dev/null
+++ b/package/boot/uboot-armsr/Makefile
@@ -0,0 +1,36 @@
+include $(TOPDIR)/rules.mk
+
+PKG_VERSION:=2023.04
+PKG_RELEASE:=1
+
+PKG_HASH:=e31cac91545ff41b71cec5d8c22afd695645cd6e2a442ccdacacd60534069341
+
+include $(INCLUDE_DIR)/u-boot.mk
+include $(INCLUDE_DIR)/package.mk
+
+define U-Boot/Default
+ BUILD_TARGET:=armsr
+endef
+
+define U-Boot/qemu_armv7
+ NAME:=QEMU ARM Virtual Machine 32-bit
+ BUILD_SUBTARGET:=armv7
+ BUILD_DEVICES:=generic
+ UBOOT_CONFIG:=qemu_arm
+endef
+
+define U-Boot/qemu_armv8
+ NAME:=QEMU ARM Virtual Machine 64-bit
+ BUILD_SUBTARGET:=armv8
+ BUILD_DEVICES:=generic
+ UBOOT_CONFIG:=qemu_arm64
+endef
+
+UBOOT_TARGETS := \
+ qemu_armv7 \
+ qemu_armv8
+
+UBOOT_CUSTOMIZE_CONFIG := \
+ --enable CMD_EFIDEBUG
+
+$(eval $(call BuildPackage/U-Boot))
diff --git a/package/boot/uboot-armsr/patches/001-v2023.07-bootstd-Use-blk-uclass-device-numbers-to-set-efi-bootdev.patch b/package/boot/uboot-armsr/patches/001-v2023.07-bootstd-Use-blk-uclass-device-numbers-to-set-efi-bootdev.patch
new file mode 100644
index 00000000000..f4c81189521
--- /dev/null
+++ b/package/boot/uboot-armsr/patches/001-v2023.07-bootstd-Use-blk-uclass-device-numbers-to-set-efi-bootdev.patch
@@ -0,0 +1,62 @@
+From: Simon Glass <sjg@chromium.org>
+To: U-Boot Mailing List <u-boot@lists.denx.de>
+Subject: [PATCH v10 7/9] bootstd: Use blk uclass device numbers to set efi
+ bootdev
+Date: Mon, 24 Apr 2023 13:49:50 +1200
+Message-ID:
+ <20230424134946.v10.7.Ia5f5e39c882ac22b5f71c4d576941b34e868eeba@changeid>
+
+From: Mathew McBride <matt@traverse.com.au>
+
+When loading a file from a block device, efiload_read_file
+was using the seq_num of the device (e.g "35" of virtio_blk#35)
+instead of the block device id (e.g what you get from running
+the corresponding device scan command, like "virtio 0")
+
+This cause EFI booting from these devices to fail as an
+invalid device number is passed to blk_get_device_part_str:
+
+ Scanning bootdev 'virtio-blk#35.bootdev':
+ distro_efi_read_bootflow_file start (efi,fname=<NULL>)
+ distro_efi_read_bootflow_file start (efi,fname=<NULL>)
+ setting bootdev virtio, 35, efi/boot/bootaa64.efi, 00000000beef9a40, 170800
+ efi_dp_from_name calling blk_get_device_part_str
+ dev=virtio devnr=35 path=efi/boot/bootaa64.efi
+ blk_get_device_part_str (virtio,35)
+ blk_get_device_by_str (virtio, 35)
+ ** Bad device specification virtio 35 **
+ Using default device tree: dtb/qemu-arm.dtb
+ No device tree available
+ 0 efi ready virtio 1 virtio-blk#35.bootdev.par efi/boot/bootaa64.efi
+ ** Booting bootflow 'virtio-blk#35.bootdev.part_1' with efi
+ blk_get_device_part_str (virtio,0:1)
+ blk_get_device_by_str (virtio, 0)
+ No UEFI binary known at beef9a40 (image buf=00000000beef9a40,addr=0000000000000000)
+ Boot failed (err=-22)
+
+Signed-off-by: Mathew McBride <matt@traverse.com.au>
+Signed-off-by: Simon Glass <sjg@chromium.org>
+Signed-off-by: Petr Å tetiar <ynezz@true.cz> [backport to 2023.04]
+---
+
+(no changes since v8)
+
+Changes in v8:
+- Add new patch to use blk uclass device numbers to set efi bootdev
+
+ boot/bootmeth_efi.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/boot/bootmeth_efi.c
++++ b/boot/bootmeth_efi.c
+@@ -117,7 +117,9 @@ static int efiload_read_file(struct blk_
+ * this can go away.
+ */
+ media_dev = dev_get_parent(bflow->dev);
+- snprintf(devnum_str, sizeof(devnum_str), "%x", dev_seq(media_dev));
++ snprintf(devnum_str, sizeof(devnum_str), "%x:%x",
++ desc ? desc->devnum : dev_seq(media_dev),
++ bflow->part);
+
+ strlcpy(dirname, bflow->fname, sizeof(dirname));
+ last_slash = strrchr(dirname, '/');
diff --git a/package/boot/uboot-at91/Makefile b/package/boot/uboot-at91/Makefile
index a8a71239a39..afab24e8415 100644
--- a/package/boot/uboot-at91/Makefile
+++ b/package/boot/uboot-at91/Makefile
@@ -7,13 +7,13 @@
include $(TOPDIR)/rules.mk
-PKG_VERSION:=linux4sam-2020.04
-PKG_RELEASE:=2
+PKG_VERSION:=linux4sam-2022.04
+PKG_RELEASE:=3
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/linux4sam/u-boot-at91.git
-PKG_MIRROR_HASH:=4f106d215c01c4d024c4612bbd3ef189188d19abc1ab2cc316b257d308534feb
-PKG_SOURCE_VERSION:=0e1d1b6efb7f8e27c372279a906fcd2524df09da
+PKG_MIRROR_HASH:=56bbac45f71aaf39b365661db2a76c6c8415e27f7147b27bb58312b12756c8f3
+PKG_SOURCE_VERSION:=7b59654a486d39dc8e0343e2554699b8a79c7a54
include $(INCLUDE_DIR)/u-boot.mk
include $(INCLUDE_DIR)/package.mk
@@ -47,6 +47,18 @@ define U-Boot/at91sam9x5ek_mmc
atmel_at91sam9x35ek
endef
+define U-Boot/sam9x60ek_nandflash
+ NAME:=SAM9X60-EK board (NandFlash)
+ BUILD_SUBTARGET:=sam9x
+ BUILD_DEVICES:=microchip_sam9x60ek
+endef
+
+define U-Boot/sam9x60ek_mmc
+ NAME:=SAM9X60-EK board (SDcard)
+ BUILD_SUBTARGET:=sam9x
+ BUILD_DEVICES:=microchip_sam9x60ek
+endef
+
define U-Boot/sama5d3_xplained_nandflash
NAME:=SAMA5D3 Xplained board (NandFlash)
BUILD_SUBTARGET:=sama5
@@ -59,6 +71,12 @@ define U-Boot/sama5d3_xplained_mmc
BUILD_DEVICES:=microchip_sama5d3-xplained
endef
+define U-Boot/sama5d2_icp_mmc
+ NAME:=SAMA5D2 ICP board (SDCard)
+ BUILD_SUBTARGET:=sama5
+ BUILD_DEVICES:=microchip_sama5d2-icp
+endef
+
define U-Boot/sama5d2_xplained_spiflash
NAME:=SAMA5D2 Xplained board (SPI Flash)
BUILD_SUBTARGET:=sama5
@@ -89,8 +107,8 @@ define U-Boot/sama5d4_xplained_nandflash
BUILD_DEVICES:=microchip_sama5d3-xplained
endef
-define U-Boot/sama5d27_som1_ek_mmc1
- NAME:=SAMA5D27 SOM1 Ek (SDCard1)
+define U-Boot/sama5d27_som1_ek_mmc
+ NAME:=SAMA5D27 SOM1 Ek (SDCard0)
BUILD_SUBTARGET:=sama5
BUILD_DEVICES:=microchip_sama5d27-som1-ek
endef
@@ -101,6 +119,18 @@ define U-Boot/sama5d27_som1_ek_qspiflash
BUILD_DEVICES:=microchip_sama5d27-som1-ek
endef
+define U-Boot/sama5d27_wlsom1_ek_mmc
+ NAME:=SAMA5D27 WLSOM1 Ek (SDCard)
+ BUILD_SUBTARGET:=sama5
+ BUILD_DEVICES:=microchip_sama5d27-wlsom1-ek
+endef
+
+define U-Boot/sama5d27_wlsom1_ek_qspiflash
+ NAME:=SAMA5D27 WLSOM1 Ek (QSPI Flash)
+ BUILD_SUBTARGET:=sama5
+ BUILD_DEVICES:=microchip_sama5d27-wlsom1-ek
+endef
+
define U-Boot/sama5d2_ptc_ek_nandflash
NAME:=SAMA5D2 PTC Ek (Nand Flash)
BUILD_SUBTARGET:=sama5
@@ -113,28 +143,40 @@ define U-Boot/sama5d2_ptc_ek_mmc
BUILD_DEVICES:=microchip_sama5d2-ptc-ek
endef
+define U-Boot/sama7g5ek_mmc1
+ NAME:=SAMA7G5-EK (SDCard)
+ BUILD_SUBTARGET:=sama7
+ BUILD_DEVICES:=microchip_sama7g5-ek
+endef
+
UBOOT_TARGETS := \
at91sam9m10g45ek_nandflash \
at91sam9x5ek_nandflash \
at91sam9x5ek_mmc \
+ sam9x60ek_nandflash \
+ sam9x60ek_mmc \
sama5d3_xplained_nandflash \
sama5d3_xplained_mmc \
+ sama5d2_icp_mmc \
sama5d2_xplained_mmc \
sama5d2_xplained_spiflash \
sama5d4_xplained_mmc \
sama5d4_xplained_spiflash \
sama5d4_xplained_nandflash\
- sama5d27_som1_ek_mmc1 \
+ sama5d27_som1_ek_mmc \
sama5d27_som1_ek_qspiflash \
+ sama5d27_wlsom1_ek_mmc \
+ sama5d27_wlsom1_ek_qspiflash \
sama5d2_ptc_ek_nandflash \
- sama5d2_ptc_ek_mmc
+ sama5d2_ptc_ek_mmc \
+ sama7g5ek_mmc1
define Build/Compile
+$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) \
CROSS_COMPILE=$(TARGET_CROSS) \
- DTC=$(PKG_BUILD_DIR)/scripts/dtc/dtc \
KCFLAGS="$(filter-out -fstack-protector \
- -mfloat-abi=hard, $(TARGET_CFLAGS)) -mfloat-abi=soft"
+ -mfloat-abi=hard, $(TARGET_CFLAGS)) -mfloat-abi=soft" \
+ $(UBOOT_MAKE_FLAGS)
endef
$(eval $(call BuildPackage/U-Boot))
diff --git a/package/boot/uboot-at91/patches/001-fix-Wformat-security.patch b/package/boot/uboot-at91/patches/001-fix-Wformat-security.patch
index 23cb5828b34..de92dd41670 100644
--- a/package/boot/uboot-at91/patches/001-fix-Wformat-security.patch
+++ b/package/boot/uboot-at91/patches/001-fix-Wformat-security.patch
@@ -1,21 +1,40 @@
-diff --git a/cmd/version.c b/cmd/version.c
-index b2fffe99..bcbbeb18 100644
+From 3b05406c02070df3e7f19399d81ebd35ed6deae5 Mon Sep 17 00:00:00 2001
+From: Claudiu Beznea <claudiu.beznea@microchip.com>
+Date: Tue, 12 Oct 2021 17:43:28 +0300
+Subject: [PATCH] fix -Wformat-security
+
+Signed-off-by: Claudiu Beznea <claudiu.beznea@microchip.com>
+---
+ cmd/panic.c | 2 +-
+ cmd/version.c | 2 +-
+ drivers/pinctrl/pinctrl-uclass.c | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+--- a/cmd/panic.c
++++ b/cmd/panic.c
+@@ -11,7 +11,7 @@ static int do_panic(struct cmd_tbl *cmdt
+ {
+ char *text = (argc < 2) ? "" : argv[1];
+
+- panic(text);
++ panic("%s\n", text);
+
+ return CMD_RET_SUCCESS;
+ }
--- a/cmd/version.c
+++ b/cmd/version.c
-@@ -18,7 +18,7 @@ static int do_version(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+@@ -24,7 +24,7 @@ static int do_version(struct cmd_tbl *cm
{
char buf[DISPLAY_OPTIONS_BANNER_LENGTH];
- printf(display_options_get_banner(false, buf, sizeof(buf)));
-+ printf("%s",display_options_get_banner(false, buf, sizeof(buf)));
++ printf("%s", display_options_get_banner(false, buf, sizeof(buf)));
#ifdef CC_VERSION_STRING
puts(CC_VERSION_STRING "\n");
#endif
-diff --git a/drivers/pinctrl/pinctrl-uclass.c b/drivers/pinctrl/pinctrl-uclass.c
-index 3425ed11..8c2e1d5c 100644
--- a/drivers/pinctrl/pinctrl-uclass.c
+++ b/drivers/pinctrl/pinctrl-uclass.c
-@@ -368,7 +368,7 @@ int pinctrl_get_pin_name(struct udevice *dev, int selector, char *buf,
+@@ -375,7 +375,7 @@ int pinctrl_get_pin_name(struct udevice
if (!ops->get_pin_name)
return -ENOSYS;
@@ -24,16 +43,3 @@ index 3425ed11..8c2e1d5c 100644
return 0;
}
-diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c
-index c316bdfe..5fe8129c 100644
---- a/lib/efi_loader/efi_variable.c
-+++ b/lib/efi_loader/efi_variable.c
-@@ -522,7 +522,7 @@ efi_status_t EFIAPI efi_set_variable(u16 *variable_name,
-
- if (old_size)
- /* APPEND_WRITE */
-- s += sprintf(s, old_val);
-+ s += sprintf(s, "%s", old_val);
- else
- s += sprintf(s, "(blob)");
-
diff --git a/package/boot/uboot-bcm4908/Makefile b/package/boot/uboot-bcm4908/Makefile
new file mode 100644
index 00000000000..f3051aaf81e
--- /dev/null
+++ b/package/boot/uboot-bcm4908/Makefile
@@ -0,0 +1,56 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+include $(TOPDIR)/rules.mk
+include $(INCLUDE_DIR)/kernel.mk
+
+PKG_RELEASE:=1
+
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_URL:=https://git.openwrt.org/project/bcm63xx/u-boot.git
+PKG_SOURCE_DATE:=2022-12-08
+PKG_SOURCE_VERSION:=4435700d18a791dca0d8d767e5414dfac9df4451
+PKG_MIRROR_HASH:=6062ce611d7222eb3b9768bb4944ff1c7bcf26b997280adf5ea8d7afe83f28a8
+
+include $(INCLUDE_DIR)/u-boot.mk
+include $(INCLUDE_DIR)/package.mk
+
+define U-Boot/Default
+ BUILD_TARGET:=bcm4908
+ UBOOT_IMAGE:=u-boot-nodtb.bin
+ DEFAULT:=y
+endef
+
+define U-Boot/bcm4908
+ NAME:=Broadcom's BCM4908
+ UBOOT_CONFIG:=bcm94908
+ SOC:=bcm4908
+endef
+
+define U-Boot/bcm4912
+ NAME:=Broadcom's BCM4912
+ UBOOT_CONFIG:=bcm94912
+ SOC:=bcm4912
+endef
+
+UBOOT_TARGETS := \
+ bcm4908 \
+ bcm4912
+
+define Build/Prepare
+ $(call Build/Prepare/Default)
+ mkdir -p $(PKG_BUILD_DIR)/include/generated/
+ ( cd $(PKG_BUILD_DIR)/board/broadcom/bcmbca/httpd/html/ && \
+ $(STAGING_DIR_HOST)/bin/xxd -i index.html > ../../../../../include/generated/index.h && \
+ $(STAGING_DIR_HOST)/bin/xxd -i flashing.html > ../../../../../include/generated/flashing.h && \
+ $(STAGING_DIR_HOST)/bin/xxd -i fail.html > ../../../../../include/generated/fail.h && \
+ $(STAGING_DIR_HOST)/bin/xxd -i 404.html > ../../../../../include/generated/404.h )
+endef
+
+define Build/InstallDev
+ $(INSTALL_DIR) $(STAGING_DIR_IMAGE)/u-boot
+ $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(UBOOT_IMAGE) $(STAGING_DIR_IMAGE)/u-boot/u-boot-$(SOC).bin
+ $(INSTALL_BIN) $(PKG_BUILD_DIR)/u-boot.dtb $(STAGING_DIR_IMAGE)/u-boot/u-boot-$(SOC).dtb
+ $(INSTALL_BIN) $(PKG_BUILD_DIR)/arch/arm/dts/*.dtb $(STAGING_DIR_IMAGE)/u-boot/
+endef
+
+$(eval $(call BuildPackage/U-Boot))
diff --git a/package/boot/uboot-bcm4908/patches/100-check-config-allow-to-complete-build-even-with-ad-ho.patch b/package/boot/uboot-bcm4908/patches/100-check-config-allow-to-complete-build-even-with-ad-ho.patch
new file mode 100644
index 00000000000..44aa4c17e65
--- /dev/null
+++ b/package/boot/uboot-bcm4908/patches/100-check-config-allow-to-complete-build-even-with-ad-ho.patch
@@ -0,0 +1,40 @@
+From: Masahiro Yamada <yamada.masahiro@socionext.com>
+Date: Mon, 26 Sep 2016 13:05:02 +0900
+Subject: [PATCH] check-config: allow to complete build even with ad-hoc CONFIG
+ options
+
+Currently, the check-config.sh terminates the build when unknown
+ad-hoc options are detected. I think it is too much because we may
+want to patch config headers locally in a build/deployment project.
+
+So, let's relax check-config.sh to just warn even if it detects
+options that are not in the whitelist. Instead, this check can be
+done at the end of build, along with other checks. It will catch
+more attention.
+
+Even with this change, the Buildman tool catches new warnings,
+so Tom can give NACK to new ad-hoc options.
+
+Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
+---
+ scripts/check-config.sh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+--- a/scripts/check-config.sh
++++ b/scripts/check-config.sh
+@@ -50,14 +50,13 @@ cat `find ${srctree} -name "Kconfig*"` |sed -n \
+ |sort |uniq > ${ok}
+ comm -23 ${suspects} ${ok} >${new_adhoc}
+ if [ -s ${new_adhoc} ]; then
+- echo >&2 "Error: You must add new CONFIG options using Kconfig"
++ echo >&2 "Warning: You must add new CONFIG options using Kconfig"
+ echo >&2 "The following new ad-hoc CONFIG options were detected:"
+ cat >&2 ${new_adhoc}
+ echo >&2
+ echo >&2 "Please add these via Kconfig instead. Find a suitable Kconfig"
+ echo >&2 "file and add a 'config' or 'menuconfig' option."
+ # Don't delete the temporary files in case they are useful
+- exit 1
+ else
+ rm ${suspects} ${ok} ${new_adhoc}
+ fi
diff --git a/package/boot/uboot-bcm4908/patches/200-configs-bcm94908-unset-CONFIG_SPL.patch b/package/boot/uboot-bcm4908/patches/200-configs-bcm94908-unset-CONFIG_SPL.patch
new file mode 100644
index 00000000000..0b434f356ae
--- /dev/null
+++ b/package/boot/uboot-bcm4908/patches/200-configs-bcm94908-unset-CONFIG_SPL.patch
@@ -0,0 +1,50 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
+Date: Fri, 4 Mar 2022 09:21:32 +0100
+Subject: [PATCH] configs: bcm94908: unset CONFIG_SPL
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Compiling SPL is always tricky as it needs to fit limited resources.
+Fortunately in most cases there is no need to replace SPL or TPL while
+flashing a new firmware.
+
+Compiling SPL for BCM4908 seems to fail with non-Broadcom toolchain:
+aarch64-openwrt-linux-musl-ld.bfd: u-boot-spl section `.u_boot_list' will not fit in region `.sram'
+aarch64-openwrt-linux-musl-ld.bfd: section .bss VMA [00000000822b9000,00000000822b93ef] overlaps section .u_boot_list VMA [00000000822b8f60,00000000822b9a87]
+aarch64-openwrt-linux-musl-ld.bfd: region `.sram' overflowed by 2696 bytes
+
+It also requires hashtable.h which has to be generated using some
+Broadcom's custom perl script that isn't integrated as this point.
+
+For now just disable SPL and use only last-stage U-Boot that must be
+shipped with every firmware.
+
+Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
+---
+ configs/bcm94908_defconfig | 2 +-
+ configs/bcm94912_defconfig | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+--- a/configs/bcm94908_defconfig
++++ b/configs/bcm94908_defconfig
+@@ -21,7 +21,7 @@ CONFIG_SPL_SERIAL_SUPPORT=y
+ CONFIG_TPL_LIBCOMMON_SUPPORT=y
+ CONFIG_TPL_LIBGENERIC_SUPPORT=y
+ CONFIG_NR_DRAM_BANKS=1
+-CONFIG_SPL=y
++# CONFIG_SPL is not set
+ CONFIG_SPL_LIBDISK_SUPPORT=y
+ CONFIG_ENV_VARS_UBOOT_CONFIG=y
+ CONFIG_TPL_SYS_MALLOC_F_LEN=0x11000
+--- a/configs/bcm94912_defconfig
++++ b/configs/bcm94912_defconfig
+@@ -22,7 +22,7 @@ CONFIG_TPL_LIBCOMMON_SUPPORT=y
+ CONFIG_TPL_LIBGENERIC_SUPPORT=y
+ CONFIG_SPL_SYS_MALLOC_F_LEN=0x2000
+ CONFIG_NR_DRAM_BANKS=2
+-CONFIG_SPL=y
++# CONFIG_SPL is not set
+ CONFIG_SPL_LIBDISK_SUPPORT=y
+ CONFIG_ENV_VARS_UBOOT_CONFIG=y
+ CONFIG_TPL_SYS_MALLOC_F_LEN=0x10000
diff --git a/package/boot/uboot-bcm4908/patches/201-Assume-TPL-support-for-ATF-when-compiling-U-Boot-wit.patch b/package/boot/uboot-bcm4908/patches/201-Assume-TPL-support-for-ATF-when-compiling-U-Boot-wit.patch
new file mode 100644
index 00000000000..187ee96b184
--- /dev/null
+++ b/package/boot/uboot-bcm4908/patches/201-Assume-TPL-support-for-ATF-when-compiling-U-Boot-wit.patch
@@ -0,0 +1,67 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
+Date: Fri, 4 Mar 2022 09:23:34 +0100
+Subject: [PATCH] Assume TPL support for ATF when compiling U-Boot without TPL
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Broadcom's U-Boot behaviour depends on compilation time check whether
+TPL was compiled with or without ATF support. There is no proper runtime
+check.
+
+When compiling just U-Boot (without SPL & TPL) there is no way to tell
+if it's going to work with TPL with or without ATF support.
+
+Modify code to blindly assume ATF support in TPL in such cases. It seems
+to be always true for Broadcom and we need some assumption as we don't
+deal with compiling SPL or TPL.
+
+Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
+---
+ arch/arm/mach-bcmbca/bcm4908/cpu.c | 2 +-
+ arch/arm/mach-bcmbca/bcm4912/cpu.c | 2 +-
+ board/broadcom/bcmbca/board.c | 4 ++--
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+--- a/arch/arm/mach-bcmbca/bcm4908/cpu.c
++++ b/arch/arm/mach-bcmbca/bcm4908/cpu.c
+@@ -138,7 +138,7 @@ int get_nr_cpus()
+ return nr_cpus;
+ }
+
+-#if !defined(CONFIG_TPL_ATF)
++#if defined(CONFIG_TPL) && !defined(CONFIG_TPL_ATF)
+ void boot_secondary_cpu(unsigned long vector)
+ {
+ uint32_t cpu, nr_cpus = QUAD_CPUS;
+--- a/arch/arm/mach-bcmbca/bcm4912/cpu.c
++++ b/arch/arm/mach-bcmbca/bcm4912/cpu.c
+@@ -174,7 +174,7 @@ int bcmbca_get_boot_device(void)
+ return BOOT_DEVICE_NONE;
+ }
+
+-#if !defined(CONFIG_TPL_ATF)
++#if defined(CONFIG_TPL) && !defined(CONFIG_TPL_ATF)
+ void boot_secondary_cpu(unsigned long vector)
+ {
+ uint32_t cpu, nr_cpus = 4;
+--- a/board/broadcom/bcmbca/board.c
++++ b/board/broadcom/bcmbca/board.c
+@@ -103,7 +103,7 @@ void board_spinor_init(void)
+
+ int board_init(void)
+ {
+-#if !defined(CONFIG_TPL_ATF)
++#if defined(CONFIG_TPL) && !defined(CONFIG_TPL_ATF)
+ unsigned long vector;
+ #endif
+ board_sdk_init_e();
+@@ -121,7 +121,7 @@ int board_init(void)
+ printf("$Uboot: "BUILD_TAG" $\n");
+ #endif
+
+-#if !defined(CONFIG_TPL_ATF)
++#if defined(CONFIG_TPL) && !defined(CONFIG_TPL_ATF)
+ #if defined(CONFIG_ARM64)
+ vector = (unsigned long)&_start;
+ #else
diff --git a/package/boot/uboot-bcm53xx/Makefile b/package/boot/uboot-bcm53xx/Makefile
new file mode 100644
index 00000000000..f1c026e25b3
--- /dev/null
+++ b/package/boot/uboot-bcm53xx/Makefile
@@ -0,0 +1,37 @@
+include $(TOPDIR)/rules.mk
+
+PKG_VERSION:=2024.01
+PKG_HASH:=b99611f1ed237bf3541bdc8434b68c96a6e05967061f992443cb30aabebef5b3
+PKG_RELEASE:=$(AUTORELEASE)
+
+include $(INCLUDE_DIR)/u-boot.mk
+include $(INCLUDE_DIR)/package.mk
+
+define U-Boot/Default
+ BUILD_TARGET:=bcm53xx
+ BUILD_SUBTARGET:=generic
+ UBOOT_CONFIG:=bcmns
+ UBOOT_BOARD:=$(1)
+endef
+
+define U-Boot/dir-885l
+ NAME:=D-Link DIR-885L
+ BUILD_DEVICES:=dlink_dir-885l
+endef
+
+define U-Boot/dir-890l
+ NAME:=D-Link DIR-890L
+ BUILD_DEVICES:=dlink_dir-890l
+endef
+
+UBOOT_TARGETS := dir-885l dir-890l
+
+define Build/InstallDev
+ $(INSTALL_DIR) $(STAGING_DIR_IMAGE)
+ $(CP) $(PKG_BUILD_DIR)/$(UBOOT_IMAGE) $(STAGING_DIR_IMAGE)/$(BUILD_DEVICES)-u-boot.bin
+endef
+
+define Package/u-boot/install/default
+endef
+
+$(eval $(call BuildPackage/U-Boot))
diff --git a/package/boot/uboot-envtools/Makefile b/package/boot/uboot-envtools/Makefile
index 1ace390c40a..00aa4241625 100644
--- a/package/boot/uboot-envtools/Makefile
+++ b/package/boot/uboot-envtools/Makefile
@@ -9,15 +9,15 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=uboot-envtools
PKG_DISTNAME:=u-boot
-PKG_VERSION:=2021.01
-PKG_RELEASE:=$(AUTORELEASE)
+PKG_VERSION:=2024.01
+PKG_RELEASE:=2
PKG_SOURCE:=$(PKG_DISTNAME)-$(PKG_VERSION).tar.bz2
PKG_SOURCE_URL:= \
https://ftp.denx.de/pub/u-boot \
https://mirror.cyberbits.eu/u-boot \
ftp://ftp.denx.de/pub/u-boot
-PKG_HASH:=b407e1510a74e863b8b5cb42a24625344f0e0c2fc7582d8c866bd899367d0454
+PKG_HASH:=b99611f1ed237bf3541bdc8434b68c96a6e05967061f992443cb30aabebef5b3
PKG_SOURCE_SUBDIR:=$(PKG_DISTNAME)-$(PKG_VERSION)
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_DISTNAME)-$(PKG_VERSION)
@@ -45,18 +45,19 @@ define Package/uboot-envtools/description
endef
define Build/Configure
- touch $(PKG_BUILD_DIR)/include/config.h
- mkdir -p $(PKG_BUILD_DIR)/include/config
- touch $(PKG_BUILD_DIR)/include/config/auto.conf
- mkdir -p $(PKG_BUILD_DIR)/include/generated
- touch $(PKG_BUILD_DIR)/include/generated/autoconf.h
+ $(call Build/Compile/Default,tools-only_defconfig)
endef
+define Build/Compile
+ $(call Build/Compile/Default,envtools)
+endef
+
+# We need to override the ARCH passed by buildsystem as otherwise the defconfig
+# for tools-only wont match and the includes for sandbox will be dropped
MAKE_FLAGS += \
+ ARCH="sandbox" \
TARGET_CFLAGS="$(TARGET_CFLAGS)" \
- TARGET_LDFLAGS="$(TARGET_LDFLAGS)" \
- no-dot-config-targets=envtools \
- envtools
+ TARGET_LDFLAGS="$(TARGET_LDFLAGS)"
define Package/uboot-envtools/conffiles
/etc/config/ubootenv
diff --git a/package/boot/uboot-envtools/files/apm821xx b/package/boot/uboot-envtools/files/apm821xx
index 690fbba3321..e73aaab7a0d 100644
--- a/package/boot/uboot-envtools/files/apm821xx
+++ b/package/boot/uboot-envtools/files/apm821xx
@@ -19,6 +19,10 @@ netgear,wndap620|\
netgear,wndap660)
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x4000" "0x4000" "4"
;;
+wd,mybooklive)
+ ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x1000" "0x1000" "1"
+ ubootenv_add_uci_config "/dev/mtd1" "0x1000" "0x1000" "0x1000" "1"
+ ;;
esac
config_load ubootenv
diff --git a/package/boot/uboot-envtools/files/ath79 b/package/boot/uboot-envtools/files/ath79
index 91ba587bf8f..7c0cdf9013f 100644
--- a/package/boot/uboot-envtools/files/ath79
+++ b/package/boot/uboot-envtools/files/ath79
@@ -12,17 +12,31 @@ touch /etc/config/ubootenv
board=$(board_name)
case "$board" in
+alcatel,hh40v|\
alfa-network,ap121f|\
alfa-network,ap121fe|\
alfa-network,n2q|\
alfa-network,n5q|\
alfa-network,pi-wifi4|\
alfa-network,r36a|\
+alfa-network,tube-2hq|\
allnet,all-wap02860ac|\
+araknis,an-300-ap-i-n|\
+araknis,an-500-ap-i-ac|\
+araknis,an-700-ap-i-ac|\
arduino,yun|\
+asus,rt-ac59u|\
+asus,rt-ac59u-v2|\
+asus,zenwifi-cd6n|\
+asus,zenwifi-cd6r|\
buffalo,bhr-4grv2|\
devolo,magic-2-wifi|\
+dlink,dap-1720-a1|\
+dlink,dir-859-a1|\
+dlink,dir-859-a3|\
+dlink,dir-869-a1|\
engenius,eap1200h|\
+engenius,eap1750h|\
engenius,eap300-v2|\
engenius,eap350-v1|\
engenius,eap600|\
@@ -33,12 +47,14 @@ engenius,ecb600|\
engenius,enh202-v1|\
engenius,ens202ext-v1|\
engenius,enstationac-v1|\
+engenius,ews660ap|\
etactica,eg200|\
glinet,gl-ar750s-nor|\
glinet,gl-ar750s-nor-nand|\
librerouter,librerouter-v1|\
-netgear,ex6400|\
+moxa,awk-1137c|\
netgear,ex7300|\
+netgear,ex7300-v2|\
netgear,wndr4300-v2|\
netgear,wndr4500-v3|\
netgear,wnr1000-v2|\
@@ -57,21 +73,52 @@ openmesh,mr900-v2|\
openmesh,mr1750-v1|\
openmesh,mr1750-v2|\
openmesh,om5p|\
+openmesh,om5p-an|\
+openmesh,om5p-ac-v1|\
openmesh,om5p-ac-v2|\
samsung,wam250|\
+ubnt,airrouter|\
+ubnt,bullet-m-ar7240|\
+ubnt,bullet-m-ar7241|\
+ubnt,nanobridge-m|\
+ubnt,nanostation-loco-m|\
ubnt,nanostation-m|\
+ubnt,picostation-m|\
+ubnt,powerbridge-m|\
+ubnt,rocket-m|\
+watchguard,ap100|\
+watchguard,ap200|\
+watchguard,ap300|\
yuncore,a770|\
yuncore,a782|\
+yuncore,a930|\
+yuncore,xd3200|\
yuncore,xd4200|\
ziking,cpe46b|\
zyxel,nbg6616)
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x10000" "0x10000"
;;
+aruba,ap-105|\
+aruba,ap-115|\
+aruba,ap-175|\
+dongwon,dw02-412h-64m|\
+dongwon,dw02-412h-128m|\
+glinet,gl-ar300m-lite|\
+glinet,gl-ar300m-nand|\
+glinet,gl-ar300m-nor|\
+glinet,gl-ar300m16|\
+glinet,gl-s200-nor|\
+glinet,gl-s200-nor-nand)
+ idx="$(find_mtd_index u-boot-env)"
+ [ -n "$idx" ] && \
+ ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x10000" "0x10000"
+ ;;
buffalo,wzr-hp-ag300h)
ubootenv_add_uci_config "/dev/mtd3" "0x0" "0x10000" "0x10000"
;;
buffalo,wzr-hp-g300nh-rb|\
-buffalo,wzr-hp-g300nh-s)
+buffalo,wzr-hp-g300nh-s|\
+linksys,ea4500-v3)
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x20000" "0x20000"
;;
domywifi,dw33d)
@@ -80,25 +127,19 @@ domywifi,dw33d)
glinet,gl-ar150)
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x8000" "0x10000"
;;
-glinet,gl-ar300m-lite|\
-glinet,gl-ar300m-nand|\
-glinet,gl-ar300m-nor|\
-glinet,gl-ar300m16)
- idx="$(find_mtd_index u-boot-env)"
- [ -n "$idx" ] && \
- ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x10000" "0x10000"
- ;;
netgear,wndr3700|\
netgear,wndr3700-v2|\
netgear,wndrmac-v1)
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x20000" "0x10000"
;;
+netgear,pgzng1|\
netgear,wndr3700-v4|\
netgear,wndr4300|\
netgear,wndr4300tn|\
netgear,wndr4300sw)
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x40000" "0x20000"
;;
+openmesh,om2p-v1|\
openmesh,om2p-v2|\
openmesh,om2p-v4|\
openmesh,om2p-hs-v1|\
@@ -113,9 +154,31 @@ plasmacloud,pa300e)
qihoo,c301)
ubootenv_add_uci_config "/dev/mtd9" "0x0" "0x10000" "0x10000"
;;
+ruckus,zf7025|\
+ruckus,zf7341|\
+ruckus,zf7351|\
+ruckus,zf7363)
+ ubootenv_add_uci_config "/dev/mtd5" "0x0" "0x40000" "0x40000"
+ ;;
+ruckus,zf7321|\
+ruckus,zf7372)
+ ubootenv_add_uci_config "/dev/mtd2" "0x0" "0x40000" "0x10000"
+ ;;
+sophos,ap15|\
+sophos,ap55|\
+sophos,ap55c|\
+sophos,ap100|\
+sophos,ap100c)
+ ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x1000" "0x10000"
+ ;;
wallys,dr531)
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0xf800" "0x10000"
;;
+zte,mf286|\
+zte,mf286a|\
+zte,mf286r)
+ ubootenv_add_uci_config "/dev/mtd7" "0x0" "0x20000" "0x10000"
+ ;;
esac
config_load ubootenv
diff --git a/package/boot/uboot-envtools/files/imx_cortexa7 b/package/boot/uboot-envtools/files/imx_cortexa7
new file mode 100644
index 00000000000..df6a4362607
--- /dev/null
+++ b/package/boot/uboot-envtools/files/imx_cortexa7
@@ -0,0 +1,19 @@
+[ -e /etc/config/ubootenv ] && exit 0
+
+touch /etc/config/ubootenv
+
+. /lib/uboot-envtools.sh
+. /lib/functions.sh
+
+board=$(board_name)
+
+case "$board" in
+technexion,imx7d-pico-pi)
+ ubootenv_add_uci_config "/dev/mmcblk2" "0xc0000" "0x2000" "0x2000"
+ ;;
+esac
+
+config_load ubootenv
+config_foreach ubootenv_add_app_config ubootenv
+
+exit 0
diff --git a/package/boot/uboot-envtools/files/imx6 b/package/boot/uboot-envtools/files/imx_cortexa9
index dac3c3792ef..c6d6d94d164 100644
--- a/package/boot/uboot-envtools/files/imx6
+++ b/package/boot/uboot-envtools/files/imx_cortexa9
@@ -6,7 +6,7 @@
touch /etc/config/ubootenv
-. /lib/imx6.sh
+. /lib/imx.sh
. /lib/uboot-envtools.sh
. /lib/functions.sh
diff --git a/package/boot/uboot-envtools/files/ipq40xx b/package/boot/uboot-envtools/files/ipq40xx
index 1462aa991d7..8d993fae366 100644
--- a/package/boot/uboot-envtools/files/ipq40xx
+++ b/package/boot/uboot-envtools/files/ipq40xx
@@ -26,6 +26,7 @@ ubootenv_mtdinfo () {
fi
sectors=$(( $ubootenv_size / $mtd_erase ))
+ sectors=$(printf "0x%x" $sectors )
echo /dev/$mtd_dev 0x0 $ubootenv_size $mtd_erase $sectors
}
@@ -33,12 +34,15 @@ case "$board" in
alfa-network,ap120c-ac|\
devolo,magic-2-wifi-next|\
edgecore,ecw5211|\
+glinet,gl-a1300 |\
glinet,gl-ap1300|\
glinet,gl-b1300|\
+glinet,gl-b2200|\
luma,wrtq-329acn|\
netgear,wac510|\
openmesh,a42|\
openmesh,a62|\
+pakedge,wr-1|\
plasmacloud,pa1200|\
plasmacloud,pa2200)
ubootenv_add_uci_config "/dev/mtd5" "0x0" "0x10000" "0x10000"
@@ -59,6 +63,12 @@ linksys,ea8300|\
linksys,mr8300)
ubootenv_add_uci_config "/dev/mtd7" "0x0" "0x40000" "0x20000"
;;
+linksys,whw01)
+ ubootenv_add_uci_config "/dev/mtd6" "0x0" "0x40000" "0x10000"
+ ;;
+linksys,whw03v2)
+ ubootenv_add_uci_config "/dev/mtd6" "0x0" "0x80000" "0x20000"
+ ;;
zyxel,nbg6617)
ubootenv_add_uci_config "/dev/mtd6" "0x0" "0x10000" "0x10000"
;;
diff --git a/package/boot/uboot-envtools/files/ipq806x b/package/boot/uboot-envtools/files/ipq806x
index 7e1d71a7e9b..443a0e13d40 100644
--- a/package/boot/uboot-envtools/files/ipq806x
+++ b/package/boot/uboot-envtools/files/ipq806x
@@ -26,16 +26,22 @@ ubootenv_mtdinfo () {
fi
sectors=$(( $ubootenv_size / $mtd_erase ))
+ sectors=$(printf "0x%x" $sectors )
echo /dev/$mtd_dev 0x0 $ubootenv_size $mtd_erase $sectors
}
case "$board" in
+arris,tr4400-v2|\
askey,rt4230w-rev6)
ubootenv_add_uci_config "/dev/mtd9" "0x0" "0x40000" "0x20000"
;;
edgecore,ecw5410)
ubootenv_add_uci_config "/dev/mtd11" "0x0" "0x10000" "0x10000"
;;
+extreme,ap3935)
+ ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x10000" "0x10000"
+ ubootenv_add_uci_config "/dev/mtd3" "0x0" "0x10000" "0x10000"
+ ;;
linksys,ea7500-v1|\
linksys,ea8500)
ubootenv_add_uci_config "/dev/mtd10" "0x0" "0x20000" "0x20000"
@@ -43,6 +49,9 @@ linksys,ea8500)
netgear,r7800)
ubootenv_add_uci_config "/dev/mtd2" "0x0" "0x040000" "0x20000"
;;
+nokia,ac400i)
+ ubootenv_add_uci_config "/dev/mtd20" "0x0" "0x040000" "0x20000"
+ ;;
qcom,ipq8064-ap148|\
qcom,ipq8064-db149)
ubootenv_add_uci_config $(ubootenv_mtdinfo)
diff --git a/package/boot/uboot-envtools/files/kirkwood b/package/boot/uboot-envtools/files/kirkwood
index 6a3dfcaba81..240371f48d8 100644
--- a/package/boot/uboot-envtools/files/kirkwood
+++ b/package/boot/uboot-envtools/files/kirkwood
@@ -19,6 +19,7 @@ globalscale,sheevaplug|\
iom,ix2-200|\
linksys,e4200-v2|\
linksys,ea4500|\
+netgear,readynas-duo-v2|\
raidsonic,ib-nas62x0|\
seagate,dockstar|\
zyxel,nsa310b|\
diff --git a/package/boot/uboot-envtools/files/layerscape b/package/boot/uboot-envtools/files/layerscape
index b11587d8765..acc5a073ad9 100644
--- a/package/boot/uboot-envtools/files/layerscape
+++ b/package/boot/uboot-envtools/files/layerscape
@@ -12,9 +12,8 @@ touch /etc/config/ubootenv
board=$(board_name)
case "$board" in
- traverse,ls1043v|\
- traverse,ls1043s)
- ubootenv_add_uci_config "/dev/mtd1" "0x40000" "0x2000" "0x20000"
+ traverse,ten64)
+ ubootenv_add_uci_config "/dev/mtd3" "0x0000" "0x80000" "0x80000"
;;
esac
diff --git a/package/boot/uboot-envtools/files/mediatek_filogic b/package/boot/uboot-envtools/files/mediatek_filogic
new file mode 100644
index 00000000000..fcab697d904
--- /dev/null
+++ b/package/boot/uboot-envtools/files/mediatek_filogic
@@ -0,0 +1,127 @@
+#
+# Copyright (C) 2021 OpenWrt.org
+#
+
+[ -e /etc/config/ubootenv ] && exit 0
+
+touch /etc/config/ubootenv
+
+. /lib/uboot-envtools.sh
+. /lib/functions.sh
+
+board=$(board_name)
+
+ubootenv_add_mmc_default() {
+ local envdev="$(find_mmc_part "ubootenv" "${1:-mmcblk0}")"
+ ubootenv_add_uci_config "$envdev" "0x0" "0x40000" "0x40000" "1"
+ ubootenv_add_uci_config "$envdev" "0x40000" "0x40000" "0x40000" "1"
+}
+
+ubootenv_add_nor_default() {
+ local envdev="/dev/mtd$(find_mtd_index "u-boot-env")"
+ ubootenv_add_uci_config "$envdev" "0x0" "0x20000" "0x20000" "1"
+ ubootenv_add_uci_config "$envdev" "0x20000" "0x20000" "0x20000" "1"
+}
+
+ubootenv_add_ubi_default() {
+ . /lib/upgrade/nand.sh
+ local envubi=$(nand_find_ubi ubi)
+ local envdev=/dev/$(nand_find_volume $envubi ubootenv)
+ local envdev2=/dev/$(nand_find_volume $envubi ubootenv2)
+ ubootenv_add_uci_config "$envdev" "0x0" "0x1f000" "0x1f000" "1"
+ ubootenv_add_uci_config "$envdev2" "0x0" "0x1f000" "0x1f000" "1"
+}
+
+case "$board" in
+asus,rt-ax59u)
+ ubootenv_add_uci_config "/dev/mtd0" "0x100000" "0x20000" "0x20000"
+ ;;
+bananapi,bpi-r3|\
+bananapi,bpi-r3-mini|\
+bananapi,bpi-r4)
+ . /lib/upgrade/platform.sh
+
+ bootdev="$(platform_get_bootdev)"
+ case "$bootdev" in
+ ubi*)
+ ubootenv_add_ubi_default
+ ;;
+ mmc*)
+ ubootenv_add_mmc_default "${bootdev%%p[0-9]*}"
+ ;;
+ mtd*)
+ ubootenv_add_nor_default
+ ;;
+ esac
+ ;;
+cmcc,rax3000m)
+ case "$(cmdline_get_var root)" in
+ /dev/mmc*)
+ ubootenv_add_mmc_default
+ ;;
+ *)
+ ubootenv_add_ubi_default
+ ;;
+ esac
+ ;;
+comfast,cf-e393ax)
+ ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x20000" "0x80000"
+ ;;
+cetron,ct3003|\
+netgear,wax220|\
+zbtlink,zbt-z8102ax|\
+zbtlink,zbt-z8103ax)
+ ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x20000" "0x20000"
+ ;;
+h3c,magic-nx30-pro|\
+jcg,q30-pro|\
+qihoo,360t7|\
+tplink,tl-xdr4288|\
+tplink,tl-xdr6086|\
+tplink,tl-xdr6088|\
+xiaomi,mi-router-ax3000t-ubootmod|\
+xiaomi,mi-router-wr30u-ubootmod|\
+xiaomi,redmi-router-ax6000-ubootmod|\
+zyxel,ex5601-t0-ubootmod)
+ ubootenv_add_ubi_default
+ ;;
+glinet,gl-mt2500|\
+glinet,gl-mt6000)
+ local envdev=$(find_mmc_part "u-boot-env")
+ ubootenv_add_uci_config "$envdev" "0x0" "0x80000"
+ ;;
+glinet,gl-mt3000)
+ ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x80000" "0x20000"
+ ;;
+jdcloud,re-cp-03)
+ local envdev=$(find_mmc_part "ubootenv" "mmcblk0")
+ ubootenv_add_uci_config "$envdev" "0x0" "0x40000" "0x40000" "1"
+ ubootenv_add_uci_config "$envdev" "0x40000" "0x40000" "0x40000" "1"
+ ;;
+mercusys,mr90x-v1|\
+routerich,ax3000)
+ local envdev=/dev/mtd$(find_mtd_index "u-boot-env")
+ ubootenv_add_uci_config "$envdev" "0x0" "0x20000" "0x20000" "1"
+ ;;
+ubnt,unifi-6-plus)
+ ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x80000" "0x10000"
+ ;;
+xiaomi,mi-router-ax3000t|\
+xiaomi,mi-router-wr30u-stock|\
+xiaomi,redmi-router-ax6000-stock)
+ ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x10000" "0x20000"
+ ubootenv_add_uci_sys_config "/dev/mtd2" "0x0" "0x10000" "0x20000"
+ ;;
+zyxel,ex5601-t0)
+ local envdev=/dev/mtd$(find_mtd_index "u-boot-env")
+ ubootenv_add_uci_config "$envdev" "0x0" "0x20000" "0x40000" "2"
+ ;;
+zyxel,ex5700-telenor)
+ ubootenv_add_uci_config "/dev/ubootenv" "0x0" "0x4000" "0x4000" "1"
+ ;;
+esac
+
+config_load ubootenv
+config_foreach ubootenv_add_app_config
+
+exit 0
diff --git a/package/boot/uboot-envtools/files/mediatek_mt7622 b/package/boot/uboot-envtools/files/mediatek_mt7622
index 495a837274f..b4b1698d3fd 100644
--- a/package/boot/uboot-envtools/files/mediatek_mt7622
+++ b/package/boot/uboot-envtools/files/mediatek_mt7622
@@ -9,34 +9,56 @@ touch /etc/config/ubootenv
. /lib/uboot-envtools.sh
. /lib/functions.sh
+ubootenv_add_mmc_default() {
+ local envdev="$(find_mmc_part "ubootenv" "${1:-mmcblk0}")"
+ ubootenv_add_uci_config "$envdev" "0x0" "0x80000" "0x80000" "1"
+ ubootenv_add_uci_config "$envdev" "0x80000" "0x80000" "0x80000" "1"
+}
+
+ubootenv_add_ubi_default() {
+ . /lib/upgrade/nand.sh
+ local envubi=$(nand_find_ubi ubi)
+ local envdev=/dev/$(nand_find_volume $envubi ubootenv)
+ local envdev2=/dev/$(nand_find_volume $envubi ubootenv2)
+ ubootenv_add_uci_config "$envdev" "0x0" "0x1f000" "0x1f000" "1"
+ ubootenv_add_uci_config "$envdev2" "0x0" "0x1f000" "0x1f000" "1"
+}
+
board=$(board_name)
case "$board" in
+dlink,eagle-pro-ai-m32-a1|\
+dlink,eagle-pro-ai-r32-a1)
+ ubootenv_add_uci_config "/dev/mtd3" "0x0" "0x2000" "0x2000"
+ ;;
linksys,e8450-ubi)
- ubootenv_add_uci_config "/dev/ubi0_0" "0x0" "0x1f000" "0x1f000" "1"
- ubootenv_add_uci_config "/dev/ubi0_1" "0x0" "0x1f000" "0x1f000" "1"
+ ubootenv_add_ubi_default
;;
bananapi,bpi-r64)
- . /lib/upgrade/common.sh
- export_bootdevice
- export_partdevice rootdev 0
- case "$rootdev" in
+ . /lib/upgrade/platform.sh
+ bootdev="$(platform_get_bootdev)"
+ case "$bootdev" in
mmc*)
- local envdev=/dev/$(get_partition_by_name $rootdev ubootenv)
- ubootenv_add_uci_config "$envdev" "0x0" "0x80000" "0x80000" "1"
- ubootenv_add_uci_config "$envdev" "0x80000" "0x80000" "0x80000" "1"
+ ubootenv_add_mmc_default "${bootdev%p[0-9]*}"
;;
- *)
- ubootenv_add_uci_config "/dev/ubi0_0" "0x0" "0x1f000" "0x1f000" "1"
- ubootenv_add_uci_config "/dev/ubi0_1" "0x0" "0x1f000" "0x1f000" "1"
+ ubi*)
+ ubootenv_add_ubi_default
;;
esac
;;
buffalo,wsr-2533dhp2)
ubootenv_add_uci_config "/dev/mtd3" "0x0" "0x1000" "0x20000"
;;
-ubnt,unifi-6-lr-ubootmod)
- ubootenv_add_uci_config "/dev/mtd2" "0x0" "0x4000" "0x10000"
+ruijie,rg-ew3200gx-pro)
+ ubootenv_add_uci_config "/dev/mtd3" "0x0" "0x20000" "0x20000"
+ ;;
+ubnt,unifi-6-lr-v1-ubootmod|\
+ubnt,unifi-6-lr-v2-ubootmod|\
+ubnt,unifi-6-lr-v3-ubootmod)
+ ubootenv_add_uci_config "/dev/mtd$(find_mtd_index "u-boot-env")" "0x0" "0x4000" "0x1000"
+ ;;
+xiaomi,redmi-router-ax6s)
+ ubootenv_add_uci_config "/dev/mtd3" "0x0" "0x10000" "0x40000"
;;
esac
diff --git a/package/boot/uboot-envtools/files/mediatek_mt7623 b/package/boot/uboot-envtools/files/mediatek_mt7623
index 863c8bc2110..fd2a01006a8 100644
--- a/package/boot/uboot-envtools/files/mediatek_mt7623
+++ b/package/boot/uboot-envtools/files/mediatek_mt7623
@@ -17,6 +17,10 @@ bananapi,bpi-r2)
export_bootdevice
export_partdevice ubootpart 1
ubootenv_add_uci_config "/dev/$ubootpart" "0xb0000" "0x10000" "0x10000" "1"
+ ;;
+unielec,u7623-02)
+ ubootenv_add_uci_config "/dev/mmcblk0p1" "0xc0000" "0x10000" "0x10000" "1"
+ ;;
esac
config_load ubootenv
diff --git a/package/boot/uboot-envtools/files/mediatek_mt7629 b/package/boot/uboot-envtools/files/mediatek_mt7629
new file mode 100644
index 00000000000..313fb6a4480
--- /dev/null
+++ b/package/boot/uboot-envtools/files/mediatek_mt7629
@@ -0,0 +1,24 @@
+#
+# Copyright (C) 2021 OpenWrt.org
+#
+
+[ -e /etc/config/ubootenv ] && exit 0
+
+touch /etc/config/ubootenv
+
+. /lib/uboot-envtools.sh
+. /lib/functions.sh
+
+board=$(board_name)
+
+case "$board" in
+iptime,a6004mx|\
+netgear,ex6250-v2)
+ ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x1000"
+ ;;
+esac
+
+config_load ubootenv
+config_foreach ubootenv_add_app_config ubootenv
+
+exit 0
diff --git a/package/boot/uboot-envtools/files/mpc85xx b/package/boot/uboot-envtools/files/mpc85xx
index 004ec241316..a74466ab3a6 100644
--- a/package/boot/uboot-envtools/files/mpc85xx
+++ b/package/boot/uboot-envtools/files/mpc85xx
@@ -8,10 +8,24 @@ touch /etc/config/ubootenv
board=$(board_name)
case "$board" in
+enterasys,ws-ap3715i)
+ ubootenv_add_uci_config "$(find_mtd_part 'cfg1')" "0x0" "0x10000" "0x10000"
+ ubootenv_add_uci_config "$(find_mtd_part 'cfg2')" "0x0" "0x10000" "0x10000"
+ ;;
+extreme-networks,ws-ap3825i)
+ ubootenv_add_uci_config "$(find_mtd_part 'cfg1')" "0x0" "0x10000" "0x20000"
+ ubootenv_add_uci_config "$(find_mtd_part 'cfg2')" "0x0" "0x10000" "0x20000"
+ ;;
ocedo,panda)
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x20000" "0x20000"
ubootenv_add_uci_config "/dev/mtd2" "0x0" "0x20000" "0x20000"
;;
+watchguard,firebox-t10)
+ ubootenv_add_uci_config "$(find_mtd_part 'u-boot-env')" "0x0" "0x2000" "0x10000"
+ ;;
+aerohive,hiveap-330)
+ ubootenv_add_uci_config "$(find_mtd_part 'u-boot-env')" "0x0" "0x20000" "0x10000"
+ ;;
esac
config_load ubootenv
diff --git a/package/boot/uboot-envtools/files/mvebu b/package/boot/uboot-envtools/files/mvebu
index 25f29599a3a..c4ce76cf240 100644
--- a/package/boot/uboot-envtools/files/mvebu
+++ b/package/boot/uboot-envtools/files/mvebu
@@ -13,11 +13,15 @@ touch /etc/config/ubootenv
board=$(board_name)
case "$board" in
+buffalo,ls220de|\
buffalo,ls421de)
ubootenv_add_uci_config "/dev/mtd3" "0x0" "0x10000"
;;
cznic,turris-omnia)
- if grep -q 'U-Boot 2015.10-rc2' /dev/mtd0; then
+ idx="$(find_mtd_index u-boot-env)"
+ if [ -n "$idx" ]; then
+ ubootenv_add_uci_config "/dev/mtd${idx}" "0x0" "0x10000" "0x10000"
+ elif grep -q 'U-Boot 2015.10-rc2' /dev/mtd0; then
ubootenv_add_uci_config "/dev/mtd0" "0xc0000" "0x10000" "0x40000"
else
ubootenv_add_uci_config "/dev/mtd0" "0xf0000" "0x10000" "0x10000"
@@ -30,7 +34,8 @@ globalscale,espressobin|\
globalscale,espressobin-emmc|\
globalscale,espressobin-ultra|\
globalscale,espressobin-v7|\
-globalscale,espressobin-v7-emmc)
+globalscale,espressobin-v7-emmc|\
+globalscale,mochabin)
idx="$(find_mtd_index u-boot-env)"
if [ -n "$idx" ]; then
ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x10000" "0x10000" "1"
@@ -54,8 +59,18 @@ linksys,wrt3200acm|\
linksys,wrt32x)
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x20000" "0x20000"
;;
-methode,udpu)
+methode,udpu|\
+methode,edpu)
+ idx="$(find_mtd_index u-boot-env)"
+ if [ -n "$idx" ]; then
+ ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x10000" "0x10000" "1"
+ else
ubootenv_add_uci_config "/dev/mtd0" "0x180000" "0x10000" "0x10000"
+ fi
+ ;;
+synology,ds213j)
+ idx="$(find_mtd_index u-boot-env)"
+ [ -n "$idx" ] && ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x10000" "0x10000"
;;
esac
diff --git a/package/boot/uboot-envtools/files/octeon b/package/boot/uboot-envtools/files/octeon
new file mode 100644
index 00000000000..a6faed6eb3a
--- /dev/null
+++ b/package/boot/uboot-envtools/files/octeon
@@ -0,0 +1,23 @@
+#
+# Copyright (C) 2023 OpenWrt.org
+#
+
+[ -e /etc/config/ubootenv ] && exit 0
+
+touch /etc/config/ubootenv
+
+. /lib/uboot-envtools.sh
+. /lib/functions.sh
+
+board=$(board_name)
+
+case "$board" in
+cisco,vedge1000)
+ ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x20000"
+ ;;
+esac
+
+config_load ubootenv
+config_foreach ubootenv_add_app_config ubootenv
+
+exit 0
diff --git a/package/boot/uboot-envtools/files/oxnas b/package/boot/uboot-envtools/files/oxnas
index bf872b697df..bd407c67d53 100644
--- a/package/boot/uboot-envtools/files/oxnas
+++ b/package/boot/uboot-envtools/files/oxnas
@@ -14,7 +14,7 @@ board=$(board_name)
case "$board" in
"cloudengines,pogoplug"*|\
"shuttle,kd20")
- ubootenv_add_uci_config "/dev/mtd2" "0x0" "0x2000" "0x2000" "1"
+ ubootenv_add_uci_config "/dev/mtd2" "0x0" "0x2000" "0x20000" "1"
;;
"mitrastar,stg-212")
ubootenv_add_uci_config "/dev/mtd2" "0x0" "0x20000" "0x20000" "1"
diff --git a/package/boot/uboot-envtools/files/qoriq b/package/boot/uboot-envtools/files/qoriq
new file mode 100644
index 00000000000..d024a7f0086
--- /dev/null
+++ b/package/boot/uboot-envtools/files/qoriq
@@ -0,0 +1,19 @@
+[ -e /etc/config/ubootenv ] && exit 0
+
+touch /etc/config/ubootenv
+
+. /lib/uboot-envtools.sh
+. /lib/functions.sh
+
+board=$(board_name)
+
+case "$board" in
+watchguard,firebox-m300)
+ ubootenv_add_uci_config "/dev/mtd9" "0x0" "0x2000" "0x10000"
+ ;;
+esac
+
+config_load ubootenv
+config_foreach ubootenv_add_app_config ubootenv
+
+exit 0
diff --git a/package/boot/uboot-envtools/files/qualcommax_ipq807x b/package/boot/uboot-envtools/files/qualcommax_ipq807x
new file mode 100644
index 00000000000..bcedfd9adc9
--- /dev/null
+++ b/package/boot/uboot-envtools/files/qualcommax_ipq807x
@@ -0,0 +1,63 @@
+[ -e /etc/config/ubootenv ] && exit 0
+
+touch /etc/config/ubootenv
+
+. /lib/uboot-envtools.sh
+. /lib/functions.sh
+
+board=$(board_name)
+
+case "$board" in
+dynalink,dl-wrx36|\
+netgear,rax120v2|\
+netgear,wax218|\
+netgear,wax620|\
+netgear,wax630)
+ idx="$(find_mtd_index 0:appsblenv)"
+ [ -n "$idx" ] && \
+ ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x40000" "0x20000" "2"
+ ;;
+compex,wpq873|\
+edgecore,eap102|\
+zyxel,nbg7815)
+ idx="$(find_mtd_index 0:appsblenv)"
+ [ -n "$idx" ] && \
+ ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x10000" "0x10000" "1"
+ ;;
+edimax,cax1800)
+ idx="$(find_mtd_index 0:appsblenv)"
+ [ -n "$idx" ] && \
+ ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x10000" "0x20000"
+ ;;
+linksys,mx4200v1|\
+linksys,mx4200v2)
+ idx="$(find_mtd_index u_env)"
+ [ -n "$idx" ] && \
+ ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x40000" "0x20000" "2"
+ ;;
+redmi,ax6|\
+xiaomi,ax3600|\
+xiaomi,ax9000)
+ idx="$(find_mtd_index 0:appsblenv)"
+ [ -n "$idx" ] && \
+ ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x10000" "0x20000"
+ idx2="$(find_mtd_index bdata)"
+ [ -n "$idx2" ] && \
+ ubootenv_add_uci_sys_config "/dev/mtd$idx2" "0x0" "0x10000" "0x20000"
+ ;;
+prpl,haze)
+ mmcpart="$(find_mmc_part 0:APPSBLENV)"
+ [ -n "$mmcpart" ] && \
+ ubootenv_add_uci_config "$mmcpart" "0x0" "0x40000" "0x400" "0x100"
+ ;;
+qnap,301w)
+ idx="$(find_mtd_index 0:appsblenv)"
+ [ -n "$idx" ] && \
+ ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x20000" "0x20000" "1"
+ ;;
+esac
+
+config_load ubootenv
+config_foreach ubootenv_add_app_config
+
+exit 0
diff --git a/package/boot/uboot-envtools/files/ramips b/package/boot/uboot-envtools/files/ramips
index 7941c106e42..30bf635b6df 100644
--- a/package/boot/uboot-envtools/files/ramips
+++ b/package/boot/uboot-envtools/files/ramips
@@ -17,59 +17,133 @@ alfa-network,awusfree1|\
alfa-network,quad-e4g|\
alfa-network,r36m-e4g|\
alfa-network,tube-e4g|\
-engenius,esr600h)
+engenius,epg600|\
+engenius,esr600h|\
+linksys,re7000|\
+meig,slt866|\
+sitecom,wlr-4100-v1-002|\
+zyxel,keenetic-lite-iii-a)
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x1000" "0x1000"
;;
+alfa-network,ax1800rm|\
allnet,all0256n-4m|\
allnet,all0256n-8m|\
-allnet,all5002)
+allnet,all5002|\
+yuncore,ax820)
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x10000" "0x10000"
;;
+arcadyan,we420223-99|\
+dlink,dir-806a-b1)
+ ubootenv_add_uci_config "/dev/mtd2" "0x0" "0x1000" "0x1000"
+ ;;
ampedwireless,ally-00x19k|\
ampedwireless,ally-r1900k)
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x1000" "0x20000" "4"
;;
+beeline,smartbox-giga|\
+beeline,smartbox-turbo|\
+beeline,smartbox-turbo-plus|\
+etisalat,s3|\
+rostelecom,rt-fe-1a|\
+rostelecom,rt-sf-1)
+ ubootenv_add_uci_config "/dev/mtd0" "0x80000" "0x1000" "0x20000"
+ ;;
+beeline,smartbox-pro|\
+tplink,ec330-g5u-v1|\
+wifire,s1500-nbn)
+ idx="$(find_mtd_index u-boot-env)"
+ [ -n "$idx" ] && \
+ ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x1000" "0x20000"
+ ;;
buffalo,wsr-1166dhp|\
buffalo,wsr-600dhp|\
+kroks,kndrt31r16|\
+kroks,kndrt31r19|\
mediatek,linkit-smart-7688|\
samknows,whitebox-v8|\
-xiaomi,mi-router-3g-v2|\
-xiaomi,mi-router-4a-gigabit|\
xiaomi,mi-router-4c|\
xiaomi,miwifi-nano|\
zbtlink,zbt-wg2626|\
zte,mf283plus)
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x1000" "0x10000"
;;
+asus,rt-ax53u|\
+asus,rt-ax54|\
+belkin,rt1800|\
+h3c,tx1800-plus|\
+h3c,tx1801-plus|\
+h3c,tx1806|\
+jcg,q20|\
+linksys,e7350|\
+netgear,eax12|\
+netgear,wax202|\
+zyxel,wsm20)
+ ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x20000" "0x20000"
+ ;;
+haier,har-20s2u1|\
+sim,simax1800t)
+ ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x20000" "0x20000"
+ ubootenv_add_uci_sys_config "/dev/mtd1" "0x40000" "0x40000" "0x20000"
+ ;;
hootoo,ht-tm05|\
ravpower,rp-wd03)
idx="$(find_mtd_index u-boot-env)"
[ -n "$idx" ] && \
ubootenv_add_uci_config "/dev/mtd$idx" "0x4000" "0x1000" "0x1000"
;;
-jcg,q20)
- ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x20000" "0x20000"
- ;;
+beeline,smartbox-flash|\
+linksys,ea6350-v4|\
linksys,ea7300-v1|\
linksys,ea7300-v2|\
linksys,ea7500-v2|\
linksys,ea8100-v1|\
linksys,ea8100-v2|\
+mts,wg430223)
+ ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x1000" "0x20000"
+ ;;
+snr,snr-cpe-me1|\
+snr,snr-cpe-me2-sfp|\
+snr,cpe-w4n-mt)
+ idx="$(find_mtd_index uboot-env)"
+ [ -n "$idx" ] && \
+ ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x1000" "0x1000"
+ ;;
+xiaomi,miwifi-mini)
+ ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x1000" "0x10000"
+ ubootenv_add_uci_sys_config "/dev/mtd9" "0x0" "0x4000" "0x10000"
+ ;;
+xiaomi,mi-router-3g-v2|\
+xiaomi,mi-router-4a-gigabit|\
+xiaomi,miwifi-3c)
+ ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x1000" "0x10000"
+ ubootenv_add_uci_sys_config "/dev/mtd2" "0x0" "0x4000" "0x10000"
+ ;;
xiaomi,mi-router-3g|\
xiaomi,mi-router-3-pro|\
xiaomi,mi-router-4|\
xiaomi,mi-router-ac2100|\
xiaomi,redmi-router-ac2100)
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x1000" "0x20000"
+ ubootenv_add_uci_sys_config "/dev/mtd2" "0x0" "0x4000" "0x20000"
+ ;;
+zyxel,lte3301-plus)
+ ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x1000" "0x80000"
;;
+zyxel,lte5398-m904|\
zyxel,nr7101)
idx="$(find_mtd_index Config)"
[ -n "$idx" ] && \
ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x1000" "0x80000"
;;
+bolt,arion|\
+xiaomi,mi-router-cr6606|\
+xiaomi,mi-router-cr6608|\
+xiaomi,mi-router-cr6609)
+ ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x10000" "0x20000"
+ ;;
esac
config_load ubootenv
-config_foreach ubootenv_add_app_config ubootenv
+config_foreach ubootenv_add_app_config
exit 0
diff --git a/package/boot/uboot-envtools/files/realtek b/package/boot/uboot-envtools/files/realtek
index 75a399208e6..cd2446432d7 100644
--- a/package/boot/uboot-envtools/files/realtek
+++ b/package/boot/uboot-envtools/files/realtek
@@ -8,13 +8,28 @@ touch /etc/config/ubootenv
board=$(board_name)
case "$board" in
+apresia,aplgs120gtss)
+ idx="$(find_mtd_index u-boot-env)"
+ [ -n "$idx" ] && \
+ ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x40000" "0x10000"
+ idx2="$(find_mtd_index u-boot-env2)"
+ [ -n "$idx2" ] && \
+ ubootenv_add_uci_sys_config "/dev/mtd$idx2" "0x0" "0x40000" "0x10000"
+ ;;
+d-link,dgs-1210-10mp|\
+d-link,dgs-1210-10p|\
d-link,dgs-1210-16|\
+d-link,dgs-1210-20|\
d-link,dgs-1210-28|\
-d-link,dgs-1210-10p|\
zyxel,gs1900-8|\
zyxel,gs1900-8hp-v1|\
zyxel,gs1900-8hp-v2|\
-zyxel,gs1900-10hp)
+zyxel,gs1900-10hp|\
+zyxel,gs1900-16|\
+zyxel,gs1900-24-v1|\
+zyxel,gs1900-24e|\
+zyxel,gs1900-24hp-v1|\
+zyxel,gs1900-24hp-v2)
idx="$(find_mtd_index u-boot-env)"
[ -n "$idx" ] && \
ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x400" "0x10000"
@@ -22,6 +37,21 @@ zyxel,gs1900-10hp)
[ -n "$idx2" ] && \
ubootenv_add_uci_sys_config "/dev/mtd$idx2" "0x0" "0x1000" "0x10000"
;;
+tplink,sg2008p-v1|\
+tplink,sg2210p-v3|\
+tplink,sg2452p-v4)
+ idx="$(find_mtd_index u-boot-env)"
+ [ -n "$idx" ] && \
+ ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x20000" "0x10000"
+ ;;
+iodata,bsh-g24mb)
+ idx="$(find_mtd_index u-boot-env)"
+ [ -n "$idx" ] && \
+ ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x10000" "0x10000"
+ idx2="$(find_mtd_index u-boot-env2)"
+ [ -n "$idx2" ] && \
+ ubootenv_add_uci_sys_config "/dev/mtd$idx2" "0x0" "0x3800" "0x10000"
+ ;;
*)
idx="$(find_mtd_index u-boot-env)"
[ -n "$idx" ] && \
diff --git a/package/boot/uboot-envtools/patches/002-Revert-tools-env-use-run-to-store-lockfile.patch b/package/boot/uboot-envtools/patches/002-Revert-tools-env-use-run-to-store-lockfile.patch
new file mode 100644
index 00000000000..e843e4252bb
--- /dev/null
+++ b/package/boot/uboot-envtools/patches/002-Revert-tools-env-use-run-to-store-lockfile.patch
@@ -0,0 +1,41 @@
+Revert "tools: env: use /run to store lockfile"
+
+In OpenWRT we still use /var/lock as default location for lock files and
+/run might not even exist. Revert the upstream change and restore the
+previous default path.
+
+This reverts upstream commit
+ https://source.denx.de/u-boot/u-boot/-/commit/aeb40f1166e072856f865d26d42a4bea1ec3a514
+---
+ tools/env/fw_env_main.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+--- a/tools/env/fw_env_main.c
++++ b/tools/env/fw_env_main.c
+@@ -73,7 +73,7 @@ void usage_printenv(void)
+ " -c, --config configuration file, default:" CONFIG_FILE "\n"
+ #endif
+ " -n, --noheader do not repeat variable name in output\n"
+- " -l, --lock lock node, default:/run\n"
++ " -l, --lock lock node, default:/var/lock\n"
+ "\n");
+ }
+
+@@ -88,7 +88,7 @@ void usage_env_set(void)
+ #ifdef CONFIG_FILE
+ " -c, --config configuration file, default:" CONFIG_FILE "\n"
+ #endif
+- " -l, --lock lock node, default:/run\n"
++ " -l, --lock lock node, default:/var/lock\n"
+ " -s, --script batch mode to minimize writes\n"
+ "\n"
+ "Examples:\n"
+@@ -206,7 +206,7 @@ int parse_setenv_args(int argc, char *ar
+
+ int main(int argc, char *argv[])
+ {
+- char *lockname = "/run/" CMD_PRINTENV ".lock";
++ char *lockname = "/var/lock/" CMD_PRINTENV ".lock";
+ int lockfd = -1;
+ int retval = EXIT_SUCCESS;
+ char *_cmdname;
diff --git a/package/boot/uboot-envtools/patches/010-fw_env-fix-reading-NVMEM-device-s-compatible-value.patch b/package/boot/uboot-envtools/patches/010-fw_env-fix-reading-NVMEM-device-s-compatible-value.patch
new file mode 100644
index 00000000000..5af8a1aa0e6
--- /dev/null
+++ b/package/boot/uboot-envtools/patches/010-fw_env-fix-reading-NVMEM-device-s-compatible-value.patch
@@ -0,0 +1,70 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
+Date: Tue, 12 Dec 2023 18:23:45 +0100
+Subject: [PATCH] fw_env: fix reading NVMEM device's "compatible" value
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Call to fread() was changed to check for return value. The problem is it
+can't be checked for returning 1 (as it is) to determine success.
+
+We call fread() with buffer size as "size" argument. Reading any
+"compatible" value shorter than buffer size will result in returning 0
+even on success.
+
+Modify code to use fstat() to determine expected read length.
+
+This fixes regression that broke using fw_env with NVMEM devices.
+
+Fixes: c059a22b7776 ("tools: env: fw_env: Fix unused-result warning")
+Cc: Jaehoon Chung <jh80.chung@samsung.com>
+Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
+---
+ tools/env/fw_env.c | 18 ++++++++++++++----
+ 1 file changed, 14 insertions(+), 4 deletions(-)
+
+--- a/tools/env/fw_env.c
++++ b/tools/env/fw_env.c
+@@ -1732,6 +1732,7 @@ static int find_nvmem_device(void)
+ }
+
+ while (!nvmem && (dent = readdir(dir))) {
++ struct stat s;
+ FILE *fp;
+ size_t size;
+
+@@ -1749,14 +1750,22 @@ static int find_nvmem_device(void)
+ continue;
+ }
+
+- size = fread(buf, sizeof(buf), 1, fp);
++ if (fstat(fileno(fp), &s)) {
++ fprintf(stderr, "Failed to fstat %s\n", comp);
++ goto next;
++ }
++
++ if (s.st_size >= sizeof(buf)) {
++ goto next;
++ }
++
++ size = fread(buf, s.st_size, 1, fp);
+ if (size != 1) {
+ fprintf(stderr,
+ "read failed about %s\n", comp);
+- fclose(fp);
+- return -EIO;
++ goto next;
+ }
+-
++ buf[s.st_size] = '\0';
+
+ if (!strcmp(buf, "u-boot,env")) {
+ bytes = asprintf(&nvmem, "%s/%s/nvmem", path, dent->d_name);
+@@ -1765,6 +1774,7 @@ static int find_nvmem_device(void)
+ }
+ }
+
++next:
+ fclose(fp);
+ }
+
diff --git a/package/boot/uboot-envtools/patches/011-fw_env-keep-calling-read-until-whole-flash-block-is-.patch b/package/boot/uboot-envtools/patches/011-fw_env-keep-calling-read-until-whole-flash-block-is-.patch
new file mode 100644
index 00000000000..af1c32fe91c
--- /dev/null
+++ b/package/boot/uboot-envtools/patches/011-fw_env-keep-calling-read-until-whole-flash-block-is-.patch
@@ -0,0 +1,75 @@
+From 9e3003f79d168eac7ee65cd457e3904e2fb4eea8 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
+Date: Wed, 13 Dec 2023 13:13:54 +0100
+Subject: [PATCH] fw_env: keep calling read() until whole flash block is read
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+It's totally valid for read() to provide less bytes than requested
+maximum. It may happen if there is no more data available yet or source
+pushes data in small chunks.
+
+This actually happens when trying to read env data from NVMEM device.
+Kernel may provide NVMEM content in page size parts (like 4096 B).
+
+This fixes warnings like:
+Warning on /sys/bus/nvmem/devices/u-boot-env0/nvmem: Attempted to read 16384 bytes but got 4096
+Warning on /sys/bus/nvmem/devices/u-boot-env0/nvmem: Attempted to read 12288 bytes but got 4096
+Warning on /sys/bus/nvmem/devices/u-boot-env0/nvmem: Attempted to read 8192 bytes but got 4096
+
+Since the main loop in flash_read_buf() is used to read blocks this
+patch adds a new nested one.
+
+Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
+---
+ tools/env/fw_env.c | 34 +++++++++++++++-------------------
+ 1 file changed, 15 insertions(+), 19 deletions(-)
+
+--- a/tools/env/fw_env.c
++++ b/tools/env/fw_env.c
+@@ -948,29 +948,25 @@ static int flash_read_buf(int dev, int f
+ */
+ lseek(fd, blockstart + block_seek, SEEK_SET);
+
+- rc = read(fd, buf + processed, readlen);
+- if (rc == -1) {
+- fprintf(stderr, "Read error on %s: %s\n",
+- DEVNAME(dev), strerror(errno));
+- return -1;
+- }
++ while (readlen) {
++ rc = read(fd, buf + processed, readlen);
++ if (rc == -1) {
++ fprintf(stderr, "Read error on %s: %s\n",
++ DEVNAME(dev), strerror(errno));
++ return -1;
++ }
+ #ifdef DEBUG
+- fprintf(stderr, "Read 0x%x bytes at 0x%llx on %s\n",
+- rc, (unsigned long long)blockstart + block_seek,
+- DEVNAME(dev));
++ fprintf(stderr, "Read 0x%x bytes at 0x%llx on %s\n",
++ rc, (unsigned long long)blockstart + block_seek,
++ DEVNAME(dev));
+ #endif
+- processed += rc;
+- if (rc != readlen) {
+- fprintf(stderr,
+- "Warning on %s: Attempted to read %zd bytes but got %d\n",
+- DEVNAME(dev), readlen, rc);
++ processed += rc;
+ readlen -= rc;
+- block_seek += rc;
+- } else {
+- blockstart += blocklen;
+- readlen = min(blocklen, count - processed);
+- block_seek = 0;
+ }
++
++ blockstart += blocklen;
++ readlen = min(blocklen, count - processed);
++ block_seek = 0;
+ }
+
+ return processed;
diff --git a/package/boot/uboot-envtools/patches/012-fw_env-autodetect-NAND-erase-size-and-env-sectors.patch b/package/boot/uboot-envtools/patches/012-fw_env-autodetect-NAND-erase-size-and-env-sectors.patch
new file mode 100644
index 00000000000..78f555fb1f3
--- /dev/null
+++ b/package/boot/uboot-envtools/patches/012-fw_env-autodetect-NAND-erase-size-and-env-sectors.patch
@@ -0,0 +1,49 @@
+From d73a6641868029b5cae53ed00c5766921c9d8b1f Mon Sep 17 00:00:00 2001
+From: Anthony Loiseau <anthony.loiseau@allcircuits.com>
+Date: Thu, 21 Dec 2023 23:44:38 +0100
+Subject: [PATCH] fw_env: autodetect NAND erase size and env sectors
+
+As already done for NOR chips, if device ESIZE and ENVSECTORS static
+configurations are both zero, then autodetect them at runtime.
+
+Cc: Joe Hershberger <joe.hershberger@ni.com>
+cc: Stefan Agner <stefan@agner.ch>
+cc: Rasmus Villemoes <rasmus.villemoes@prevas.dk>
+Signed-off-by: Anthony Loiseau <anthony.loiseau@allcircuits.com>
+---
+ tools/env/README | 3 +++
+ tools/env/fw_env.c | 11 +++++++++--
+ 2 files changed, 12 insertions(+), 2 deletions(-)
+
+--- a/tools/env/README
++++ b/tools/env/README
+@@ -58,6 +58,9 @@ DEVICEx_ENVSECTORS defines the number of
+ this environment instance. On NAND this is used to limit the range
+ within which bad blocks are skipped, on NOR it is not used.
+
++If DEVICEx_ESIZE and DEVICEx_ENVSECTORS are both zero, then a runtime
++detection is attempted for NOR and NAND mtd types.
++
+ To prevent losing changes to the environment and to prevent confusing the MTD
+ drivers, a lock file at /run/fw_printenv.lock is used to serialize access
+ to the environment.
+--- a/tools/env/fw_env.c
++++ b/tools/env/fw_env.c
+@@ -1655,8 +1655,15 @@ static int check_device_config(int dev)
+ }
+ DEVTYPE(dev) = mtdinfo.type;
+ if (DEVESIZE(dev) == 0 && ENVSECTORS(dev) == 0 &&
+- mtdinfo.type == MTD_NORFLASH)
+- DEVESIZE(dev) = mtdinfo.erasesize;
++ mtdinfo.erasesize > 0) {
++ if (mtdinfo.type == MTD_NORFLASH)
++ DEVESIZE(dev) = mtdinfo.erasesize;
++ else if (mtdinfo.type == MTD_NANDFLASH) {
++ DEVESIZE(dev) = mtdinfo.erasesize;
++ ENVSECTORS(dev) =
++ mtdinfo.size / mtdinfo.erasesize;
++ }
++ }
+ if (DEVESIZE(dev) == 0)
+ /* Assume the erase size is the same as the env-size */
+ DEVESIZE(dev) = ENVSIZE(dev);
diff --git a/package/boot/uboot-fritz4040/Makefile b/package/boot/uboot-fritz4040/Makefile
index 21305817656..d19db162d75 100644
--- a/package/boot/uboot-fritz4040/Makefile
+++ b/package/boot/uboot-fritz4040/Makefile
@@ -10,11 +10,11 @@ include $(INCLUDE_DIR)/kernel.mk
PKG_SOURCE_URL:=https://github.com/chunkeey/FritzBox-4040-UBOOT
PKG_SOURCE_PROTO:=git
-PKG_SOURCE_VERSION:=f92be9d783b1210c020d5d6129e210a94bb7e290
-PKG_SOURCE_DATE:=2019-10-19
-PKG_MIRROR_HASH:=e40a7f624b1758b276f81c765ef1da568c595b8bd54568b9cceca7d170ebc612
+PKG_SOURCE_VERSION:=9d89013f9cc963eca25856c61fa066091d35f8de
+PKG_SOURCE_DATE:=2022-05-01
+PKG_MIRROR_HASH:=4f2a3782ba359e6d901b536d1d685026913c14426f8e58ba9673281f20675050
-PKG_RELEASE:=1
+PKG_RELEASE:=5
include $(INCLUDE_DIR)/u-boot.mk
include $(INCLUDE_DIR)/package.mk
@@ -41,6 +41,11 @@ define U-Boot/fritz4040
BUILD_DEVICES:=avm_fritzbox-4040
endef
+define U-Boot/fritz7520
+ NAME:=FritzBox 7520
+ BUILD_DEVICES:=avm_fritzbox-7530
+endef
+
define U-Boot/fritz7530
NAME:=FritzBox 7530
BUILD_DEVICES:=avm_fritzbox-7530
@@ -72,6 +77,6 @@ define Package/u-boot/install
$(INSTALL_BIN) $(PKG_BUILD_DIR)/upload-to-f4040.sh $(1)/
endef
-UBOOT_TARGETS := fritz1200 fritz3000 fritz4040 fritz7530
+UBOOT_TARGETS := fritz1200 fritz3000 fritz4040 fritz7520 fritz7530
$(eval $(call BuildPackage/U-Boot))
diff --git a/package/boot/uboot-imx6/Makefile b/package/boot/uboot-imx/Makefile
index ed6074053aa..90fc949cfd2 100644
--- a/package/boot/uboot-imx6/Makefile
+++ b/package/boot/uboot-imx/Makefile
@@ -7,41 +7,53 @@
include $(TOPDIR)/rules.mk
-PKG_VERSION:=2020.04
-PKG_RELEASE:=1
+PKG_VERSION:=2022.01
+PKG_RELEASE:=5
-PKG_HASH:=fe732aaf037d9cc3c0909bad8362af366ae964bbdac6913a34081ff4ad565372
+PKG_HASH:=81b4543227db228c03f8a1bf5ddbc813b0bb8f6555ce46064ef721a6fc680413
include $(INCLUDE_DIR)/u-boot.mk
include $(INCLUDE_DIR)/package.mk
define U-Boot/Default
- BUILD_TARGET:=imx6
+ BUILD_TARGET:=imx
UBOOT_IMAGE:=u-boot.imx
endef
define U-Boot/apalis_imx6
NAME:=Toradex Apalis
UBOOT_IMAGE:=SPL u-boot.img u-boot-with-spl.imx
- UBOOT_MAKE_FLAGS:=SPL u-boot.img u-boot-with-spl.imx
+ UBOOT_MAKE_FLAGS+=SPL u-boot.img u-boot-with-spl.imx
+ BUILD_SUBTARGET:=cortexa9
BUILD_DEVICES:=toradex_apalis
endef
define U-Boot/mx6cuboxi
NAME:=SolidRun Cubox-i boards
- UBOOT_IMAGE:=SPL u-boot.img
- UBOOT_MAKE_FLAGS:=SPL u-boot.img
+ UBOOT_IMAGE:=SPL u-boot-dtb.img
+ UBOOT_MAKE_FLAGS+=SPL u-boot-dtb.img
+ BUILD_SUBTARGET:=cortexa9
BUILD_DEVICES:=solidrun_cubox-i
endef
+define U-Boot/pico-pi-imx7d
+ NAME:=TechNexion PICO-PI-IMX7D
+ UBOOT_IMAGE:=SPL u-boot-dtb.img
+ UBOOT_MAKE_FLAGS+=SPL u-boot-dtb.img
+ BUILD_SUBTARGET:=cortexa7
+ BUILD_DEVICES:=technexion_imx7d-pico-pi
+endef
+
define U-Boot/wandboard
NAME:=Wandboard Dual Lite/Quad/Solo
+ BUILD_SUBTARGET:=cortexa9
BUILD_DEVICES:=wandboard_dual
endef
UBOOT_TARGETS := \
apalis_imx6 \
mx6cuboxi \
+ pico-pi-imx7d \
wandboard
UBOOT_MAKE_FLAGS += u-boot.imx
diff --git a/package/boot/uboot-imx6/patches/0001-apalis_imx6_defconfig-enable-some-useful-commands.patch b/package/boot/uboot-imx/patches/0001-apalis_imx6_defconfig-enable-some-useful-commands.patch
index 10ed918e773..ee50b071e08 100644
--- a/package/boot/uboot-imx6/patches/0001-apalis_imx6_defconfig-enable-some-useful-commands.patch
+++ b/package/boot/uboot-imx/patches/0001-apalis_imx6_defconfig-enable-some-useful-commands.patch
@@ -16,22 +16,11 @@ Signed-off-by: Petr Å tetiar <ynezz@true.cz>
--- a/configs/apalis_imx6_defconfig
+++ b/configs/apalis_imx6_defconfig
-@@ -44,6 +44,7 @@ CONFIG_CMD_GPIO=y
- CONFIG_CMD_GPT=y
- CONFIG_CMD_I2C=y
- CONFIG_CMD_MMC=y
-+CONFIG_CMD_PART=y
- CONFIG_CMD_USB=y
- CONFIG_CMD_USB_SDP=y
- CONFIG_CMD_USB_MASS_STORAGE=y
-@@ -53,6 +54,10 @@ CONFIG_CMD_PMIC=y
+@@ -60,6 +60,7 @@ CONFIG_CMD_CACHE=y
+ CONFIG_CMD_TIME=y
+ CONFIG_CMD_PMIC=y
CONFIG_CMD_REGULATOR=y
- CONFIG_OF_CONTROL=y
- CONFIG_DEFAULT_DEVICE_TREE="imx6-apalis"
-+CONFIG_CMD_EXT4=y
+CONFIG_CMD_EXT4_WRITE=y
-+CONFIG_CMD_FAT=y
-+CONFIG_CMD_FS_GENERIC=y
+ CONFIG_OF_CONTROL=y
+ CONFIG_ENV_OVERWRITE=y
CONFIG_ENV_IS_IN_MMC=y
- CONFIG_SYS_RELOC_GD_ENV_ADDR=y
- CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
diff --git a/package/boot/uboot-imx6/patches/110-mx6cuboxi-mmc-fallback.patch b/package/boot/uboot-imx6/patches/110-mx6cuboxi-mmc-fallback.patch
deleted file mode 100644
index 9d490ddf7ea..00000000000
--- a/package/boot/uboot-imx6/patches/110-mx6cuboxi-mmc-fallback.patch
+++ /dev/null
@@ -1,15 +0,0 @@
---- a/board/solidrun/mx6cuboxi/mx6cuboxi.c
-+++ b/board/solidrun/mx6cuboxi/mx6cuboxi.c
-@@ -286,6 +286,12 @@ static void setup_iomux_enet(void)
- gpio_free_list_nodev(&desc, 1);
- }
-
-+void board_boot_order(u32 *spl_boot_list)
-+{
-+ spl_boot_list[0] = spl_boot_device();
-+ spl_boot_list[1] = BOOT_DEVICE_MMC1;
-+}
-+
- int board_phy_config(struct phy_device *phydev)
- {
- if (phydev->drv->config)
diff --git a/package/boot/uboot-imx6/patches/111-mx6cuboxi_defconfig-force-mmc-boot.patch b/package/boot/uboot-imx6/patches/111-mx6cuboxi_defconfig-force-mmc-boot.patch
deleted file mode 100644
index 4c3dc4ce20e..00000000000
--- a/package/boot/uboot-imx6/patches/111-mx6cuboxi_defconfig-force-mmc-boot.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-From 00ad8b42dfe801107db25ead8249cb10afcd0f94 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Petr=20=C5=A0tetiar?= <ynezz@true.cz>
-Date: Sun, 1 Mar 2020 22:10:23 +0100
-Subject: [PATCH] mx6cuboxi_defconfig: force mmc boot
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Signed-off-by: Petr Å tetiar <ynezz@true.cz>
----
- configs/mx6cuboxi_defconfig | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/configs/mx6cuboxi_defconfig
-+++ b/configs/mx6cuboxi_defconfig
-@@ -9,6 +9,7 @@ CONFIG_ENV_SIZE=0x2000
- CONFIG_ENV_OFFSET=0xFE000
- CONFIG_DM_GPIO=y
- CONFIG_SPL_MMC_SUPPORT=y
-+CONFIG_SPL_FORCE_MMC_BOOT=y
- CONFIG_SPL_SERIAL_SUPPORT=y
- CONFIG_NR_DRAM_BANKS=1
- CONFIG_SPL=y
diff --git a/package/boot/uboot-kirkwood/Makefile b/package/boot/uboot-kirkwood/Makefile
index d9cb10ce13a..7f9ae4e1517 100644
--- a/package/boot/uboot-kirkwood/Makefile
+++ b/package/boot/uboot-kirkwood/Makefile
@@ -8,7 +8,7 @@
include $(TOPDIR)/rules.mk
PKG_VERSION:=2020.04
-PKG_RELEASE:=$(AUTORELEASE)
+PKG_RELEASE:=9
PKG_HASH:=fe732aaf037d9cc3c0909bad8362af366ae964bbdac6913a34081ff4ad565372
@@ -17,6 +17,7 @@ include $(INCLUDE_DIR)/package.mk
define U-Boot/Default
BUILD_TARGET:=kirkwood
+ BUILD_SUBTARGET:=generic
endef
define U-Boot/dockstar
diff --git a/package/boot/uboot-lantiq/Makefile b/package/boot/uboot-lantiq/Makefile
index 55038fdf657..927fbcb9c0a 100644
--- a/package/boot/uboot-lantiq/Makefile
+++ b/package/boot/uboot-lantiq/Makefile
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=u-boot
PKG_VERSION:=2013.10
-PKG_RELEASE:=1
+PKG_RELEASE:=66
PKG_HASH:=0d71e62beb952b41ebafb20a7ee4df2f960db64c31b054721ceb79ff14014c55
diff --git a/package/boot/uboot-lantiq/patches/0030-lzma-force-8bit-reads.patch b/package/boot/uboot-lantiq/patches/0030-lzma-force-8bit-reads.patch
new file mode 100644
index 00000000000..a934dab5cd6
--- /dev/null
+++ b/package/boot/uboot-lantiq/patches/0030-lzma-force-8bit-reads.patch
@@ -0,0 +1,57 @@
+From a40a6e16ed76e5e26a0f60226b64c311d4a62c9f Mon Sep 17 00:00:00 2001
+From: Mathias Kresin <dev@kresin.me>
+Date: Sun, 31 Oct 2021 23:04:54 +0100
+Subject: [PATCH] lzma: force 8bit reads
+
+At least since gcc 7.3.0 (OpenWrt 18.06) lwr/lwl are used in the
+assembly of LzmaProps_Decode. While the decission made by the compiler
+looks perfect fine, it triggers some obscure hang on lantiq danube-s
+v1.5 with MX29LV640EB NOR flash chips.
+
+Only if the offset 1 is used, the hang can be observed. Using any other
+offset works fine:
+
+ lwl s0,0(a1) - s0 == 0x6d000080
+ lwl s0,1(a1) - hangs
+ lwl s0,2(a1) - s0 == 0x0080xxxx
+ lwl s0,3(a1) - s0 == 0x80xxxxxx
+
+It isn't clear whether it is a limitation of the flash chip, the EBU or
+something else.
+
+Force 8bit reads to prevent gcc optimizing the read with lwr/lwl
+instructions.
+
+Signed-off-by: Mathias Kresin <dev@kresin.me>
+---
+ lib/lzma/LzmaDec.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/lib/lzma/LzmaDec.c
++++ b/lib/lzma/LzmaDec.c
+@@ -7,6 +7,7 @@
+ #include "LzmaDec.h"
+
+ #include <linux/string.h>
++#include <asm/io.h>
+
+ #define kNumTopBits 24
+ #define kTopValue ((UInt32)1 << kNumTopBits)
+@@ -703,7 +704,7 @@ static ELzmaDummy LzmaDec_TryDummy(const
+
+ static void LzmaDec_InitRc(CLzmaDec *p, const Byte *data)
+ {
+- p->code = ((UInt32)data[1] << 24) | ((UInt32)data[2] << 16) | ((UInt32)data[3] << 8) | ((UInt32)data[4]);
++ p->code = ((UInt32)readb(&data[1]) << 24) | ((UInt32)readb(&data[2]) << 16) | ((UInt32)readb(&data[3]) << 8) | ((UInt32)readb(&data[4]));
+ p->range = 0xFFFFFFFF;
+ p->needFlush = 0;
+ }
+@@ -929,7 +930,7 @@ SRes LzmaProps_Decode(CLzmaProps *p, con
+ if (size < LZMA_PROPS_SIZE)
+ return SZ_ERROR_UNSUPPORTED;
+ else
+- dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24);
++ dicSize = readb(&data[1]) | ((UInt32)readb(&data[2]) << 8) | ((UInt32)readb(&data[3]) << 16) | ((UInt32)readb(&data[4]) << 24);
+
+ if (dicSize < LZMA_DIC_MIN)
+ dicSize = LZMA_DIC_MIN;
diff --git a/package/boot/uboot-lantiq/patches/0031-dma-lantiq-fix-out-of-bounds-cache-invalidate.patch b/package/boot/uboot-lantiq/patches/0031-dma-lantiq-fix-out-of-bounds-cache-invalidate.patch
new file mode 100644
index 00000000000..b99b07292ce
--- /dev/null
+++ b/package/boot/uboot-lantiq/patches/0031-dma-lantiq-fix-out-of-bounds-cache-invalidate.patch
@@ -0,0 +1,62 @@
+From d9527989b2d63749d6c6678fa3a1b658eb26c225 Mon Sep 17 00:00:00 2001
+From: Mathias Kresin <dev@kresin.me>
+Date: Tue, 2 Nov 2021 21:24:29 +0100
+Subject: [PATCH] dma: lantiq: fix out of bounds cache invalidate
+
+With gcc10 the variables are placed more tightly to each other, which
+uncovers a long existing bug in the lantiq DMA code. It can be observed
+when using tftpboot with the filename parameter, which gets reset during
+the tftpboot execution.
+
+NetRxPackets[] points to cache line size aligned addresses. In
+ltq_eth_rx_packet_align() the address NetRxPackets[] points to is
+increased by LTQ_ETH_IP_ALIGN and the resulting not cache aligned
+address is used further on. While doing so, the length/size is never
+updated.
+
+The "not cache aligned address" + len/size for a cache aligned address
+is passed to invalidate_dcache_range(). Hence, invalidate_dcache_range()
+invalidates the next 32 bit as well, which flashes the BootFile variable
+as well.
+
+ variable BootFile is at address: 0x83ffe12c
+ NetRxPackets[] points to 0x83ffdb20 (len is 0x600)
+ data points to: 0x83ffdb22 (len is 0x600)
+
+ ltq_dma_dcache_inv: 0x83ffdb22 (for len 0x600)
+ invalidate_dcache_range: 0x83ffdb20 to 0x83ffe120 (size: 32)
+ invalidate_dcache_range: 0x83ffdb20 to 0x83ffdb40 (Bootfile: a.bin)
+ ...
+ invalidate_dcache_range: 0x83ffe100 to 0x83ffe120 (Bootfile: a.bin)
+ invalidate_dcache_range: 0x83ffe120 to 0x83ffe140 (Bootfile: )
+
+In ltq_dma_tx_map() and ltq_dma_rx_map() the start address passed to
+ltq_dma_dcache_wb_inv() is incorrect. By considering the offset, the
+start address passed to flush_dcache_range() is always aligned to 32, 64
+or 128 bytes dependent on configured DMA burst size.
+
+Signed-off-by: Mathias Kresin <dev@kresin.me>
+---
+ drivers/dma/lantiq_dma.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/dma/lantiq_dma.c
++++ b/drivers/dma/lantiq_dma.c
+@@ -280,7 +280,7 @@ int ltq_dma_rx_map(struct ltq_dma_device
+
+ offset = dma_addr % ltq_dma_burst_align(dev->rx_burst_len);
+
+- ltq_dma_dcache_inv(data, len);
++ ltq_dma_dcache_inv(data - offset, len);
+
+ #if 0
+ printf("%s: index %d, data %p, dma_addr %08x, offset %u, len %d\n",
+@@ -355,7 +355,7 @@ int ltq_dma_tx_map(struct ltq_dma_device
+ __func__, index, desc, data, dma_addr, offset, len);
+ #endif
+
+- ltq_dma_dcache_wb_inv(data, len);
++ ltq_dma_dcache_wb_inv(data - offset, len);
+
+ desc->addr = dma_addr - offset;
+ desc->ctl = DMA_DESC_OWN | DMA_DESC_SOP | DMA_DESC_EOP |
diff --git a/package/boot/uboot-lantiq/patches/0032-MIPS-lantiq-danube-fix-SPL-boot.patch b/package/boot/uboot-lantiq/patches/0032-MIPS-lantiq-danube-fix-SPL-boot.patch
new file mode 100644
index 00000000000..6cb309b8f2d
--- /dev/null
+++ b/package/boot/uboot-lantiq/patches/0032-MIPS-lantiq-danube-fix-SPL-boot.patch
@@ -0,0 +1,34 @@
+From 65f1f160139c2bac83650c9c7c4aee4e5fd74c7c Mon Sep 17 00:00:00 2001
+From: Mathias Kresin <dev@kresin.me>
+Date: Sun, 2 May 2021 02:03:05 +0200
+Subject: [PATCH] MIPS: lantiq: danube: fix SPL boot
+
+On danube we only have 0x6800 bytes of usable SRAM. Everything behind
+can't be written to and a SPL u-boot locks up during boot.
+
+Signed-off-by: Mathias Kresin <dev@kresin.me>
+Reviewed-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
+---
+ arch/mips/include/asm/arch-danube/config.h | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/arch/mips/include/asm/arch-danube/config.h
++++ b/arch/mips/include/asm/arch-danube/config.h
+@@ -61,7 +61,7 @@
+
+ /* SRAM */
+ #define CONFIG_SYS_SRAM_BASE 0xBE1A0000
+-#define CONFIG_SYS_SRAM_SIZE 0x10000
++#define CONFIG_SYS_SRAM_SIZE 0x6800
+
+ /* ASC/UART driver and console */
+ #define CONFIG_LANTIQ_SERIAL
+@@ -117,7 +117,7 @@
+ #define CONFIG_CMD_NET
+ #endif
+
+-#define CONFIG_SPL_MAX_SIZE (32 * 1024)
++#define CONFIG_SPL_MAX_SIZE (18 * 1024)
+ #define CONFIG_SPL_BSS_MAX_SIZE (8 * 1024)
+ #define CONFIG_SPL_STACK_MAX_SIZE (8 * 1024)
+ #define CONFIG_SPL_MALLOC_MAX_SIZE (32 * 1024)
diff --git a/package/boot/uboot-lantiq/patches/0033-MIPS-lantiq-reduce-stack-size.patch b/package/boot/uboot-lantiq/patches/0033-MIPS-lantiq-reduce-stack-size.patch
new file mode 100644
index 00000000000..4f63ffc423a
--- /dev/null
+++ b/package/boot/uboot-lantiq/patches/0033-MIPS-lantiq-reduce-stack-size.patch
@@ -0,0 +1,56 @@
+From ad739ffebf689abdbcddbe4e1b0bf847d7931a92 Mon Sep 17 00:00:00 2001
+From: Mathias Kresin <dev@kresin.me>
+Date: Fri, 20 Jan 2017 13:59:53 +0100
+Subject: [PATCH] MIPS: lantiq: reduce stack size
+
+On lantiq a lot of stuff expects to be loaded to and executed at
+0x80002000, including our own second stage bootloader.
+
+For all build u-boots, the initial stack pointer is at 0x80008000. After
+loading data to 0x80002000, every further stack operation corrupts the
+loaded code.
+
+Set the initial stack pointer to 0x80002000, to not overwrite code
+loaded in memory. A stack of 0x2000 bytes has been proven as enough in
+all done tests.
+
+Signed-off-by: Mathias Kresin <dev@kresin.me>
+---
+ arch/mips/include/asm/arch-arx100/config.h | 2 +-
+ arch/mips/include/asm/arch-danube/config.h | 2 +-
+ arch/mips/include/asm/arch-vrx200/config.h | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+--- a/arch/mips/include/asm/arch-arx100/config.h
++++ b/arch/mips/include/asm/arch-arx100/config.h
+@@ -66,7 +66,7 @@
+ #define CONFIG_SYS_MEMTEST_END 0x82000000
+ #define CONFIG_SYS_LOAD_ADDR 0x81000000
+ #define CONFIG_SYS_LOAD_SIZE (2 * 1024 * 1024)
+-#define CONFIG_SYS_INIT_SP_OFFSET (32 * 1024)
++#define CONFIG_SYS_INIT_SP_OFFSET 0x2000
+
+ /* SRAM */
+ #define CONFIG_SYS_SRAM_BASE 0xBE1A0000
+--- a/arch/mips/include/asm/arch-danube/config.h
++++ b/arch/mips/include/asm/arch-danube/config.h
+@@ -57,7 +57,7 @@
+ #define CONFIG_SYS_MEMTEST_END 0x82000000
+ #define CONFIG_SYS_LOAD_ADDR 0x81000000
+ #define CONFIG_SYS_LOAD_SIZE (2 * 1024 * 1024)
+-#define CONFIG_SYS_INIT_SP_OFFSET 0x4000
++#define CONFIG_SYS_INIT_SP_OFFSET 0x2000
+
+ /* SRAM */
+ #define CONFIG_SYS_SRAM_BASE 0xBE1A0000
+--- a/arch/mips/include/asm/arch-vrx200/config.h
++++ b/arch/mips/include/asm/arch-vrx200/config.h
+@@ -69,7 +69,7 @@
+ #define CONFIG_SYS_MEMTEST_END 0x82000000
+ #define CONFIG_SYS_LOAD_ADDR 0x81000000
+ #define CONFIG_SYS_LOAD_SIZE (2 * 1024 * 1024)
+-#define CONFIG_SYS_INIT_SP_OFFSET (32 * 1024)
++#define CONFIG_SYS_INIT_SP_OFFSET 0x2000
+
+ /* SRAM */
+ #define CONFIG_SYS_SRAM_BASE 0xBE220000
diff --git a/package/boot/uboot-lantiq/patches/101-fix-crypt-header-clash.patch b/package/boot/uboot-lantiq/patches/101-fix-crypt-header-clash.patch
new file mode 100644
index 00000000000..fcb1a3d95b0
--- /dev/null
+++ b/package/boot/uboot-lantiq/patches/101-fix-crypt-header-clash.patch
@@ -0,0 +1,172 @@
+Fix header clash with system /usr/include/sha1.h and sha256.h when libmd
+is installed.
+
+Backport of u-boot commit "includes: move openssl headers to include/u-boot"
+https://github.com/u-boot/u-boot/commit/2b9912e6a7df7b1f60beb7942bd0e6fa5f9d0167
+
+--- a/board/gdsys/p1022/controlcenterd-id.c
++++ b/board/gdsys/p1022/controlcenterd-id.c
+@@ -30,7 +30,7 @@
+ #include <i2c.h>
+ #include <mmc.h>
+ #include <tpm.h>
+-#include <sha1.h>
++#include <u-boot/sha1.h>
+ #include <asm/byteorder.h>
+ #include <asm/unaligned.h>
+ #include <pca9698.h>
+--- a/board/pcs440ep/pcs440ep.c
++++ b/board/pcs440ep/pcs440ep.c
+@@ -13,7 +13,7 @@
+ #include <asm/processor.h>
+ #include <spd_sdram.h>
+ #include <status_led.h>
+-#include <sha1.h>
++#include <u-boot/sha1.h>
+ #include <asm/io.h>
+ #include <net.h>
+ #include <ata.h>
+--- a/common/cmd_sha1sum.c
++++ b/common/cmd_sha1sum.c
+@@ -11,7 +11,7 @@
+ #include <common.h>
+ #include <command.h>
+ #include <hash.h>
+-#include <sha1.h>
++#include <u-boot/sha1.h>
+
+ int do_sha1sum(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+ {
+--- a/common/hash.c
++++ b/common/hash.c
+@@ -14,8 +14,8 @@
+ #include <command.h>
+ #include <hw_sha.h>
+ #include <hash.h>
+-#include <sha1.h>
+-#include <sha256.h>
++#include <u-boot/sha1.h>
++#include <u-boot/sha256.h>
+ #include <asm/io.h>
+ #include <asm/errno.h>
+
+--- a/common/image-fit.c
++++ b/common/image-fit.c
+@@ -21,7 +21,7 @@ DECLARE_GLOBAL_DATA_PTR;
+ #endif /* !USE_HOSTCC*/
+
+ #include <bootstage.h>
+-#include <sha1.h>
++#include <u-boot/sha1.h>
+ #include <u-boot/crc.h>
+ #include <u-boot/md5.h>
+
+--- a/common/image.c
++++ b/common/image.c
+@@ -34,7 +34,7 @@
+ #endif
+
+ #include <u-boot/md5.h>
+-#include <sha1.h>
++#include <u-boot/sha1.h>
+ #include <asm/errno.h>
+ #include <asm/io.h>
+
+--- a/drivers/crypto/ace_sha.c
++++ b/drivers/crypto/ace_sha.c
+@@ -5,8 +5,8 @@
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+ #include <common.h>
+-#include <sha256.h>
+-#include <sha1.h>
++#include <u-boot/sha256.h>
++#include <u-boot/sha1.h>
+ #include <asm/errno.h>
+ #include "ace_sha.h"
+
+--- /dev/null
++++ b/include/u-boot/sha1.h
+@@ -0,0 +1 @@
++#include "../sha1.h"
+--- /dev/null
++++ b/include/u-boot/sha256.h
+@@ -0,0 +1 @@
++#include "../sha256.h"
+--- a/lib/rsa/rsa-verify.c
++++ b/lib/rsa/rsa-verify.c
+@@ -7,7 +7,7 @@
+ #include <common.h>
+ #include <fdtdec.h>
+ #include <rsa.h>
+-#include <sha1.h>
++#include <u-boot/sha1.h>
+ #include <asm/byteorder.h>
+ #include <asm/errno.h>
+ #include <asm/unaligned.h>
+--- a/lib/sha1.c
++++ b/lib/sha1.c
+@@ -36,7 +36,7 @@
+ #include <string.h>
+ #endif /* USE_HOSTCC */
+ #include <watchdog.h>
+-#include "sha1.h"
++#include <u-boot/sha1.h>
+
+ /*
+ * 32-bit integer manipulation macros (big endian)
+--- a/lib/sha256.c
++++ b/lib/sha256.c
+@@ -11,7 +11,7 @@
+ #endif /* USE_HOSTCC */
+ #include <watchdog.h>
+ #include <linux/string.h>
+-#include <sha256.h>
++#include <u-boot/sha256.h>
+
+ /*
+ * 32-bit integer manipulation macros (big endian)
+--- a/lib/tpm.c
++++ b/lib/tpm.c
+@@ -7,7 +7,7 @@
+
+ #include <common.h>
+ #include <stdarg.h>
+-#include <sha1.h>
++#include <u-boot/sha1.h>
+ #include <tpm.h>
+ #include <asm/unaligned.h>
+
+--- a/tools/imls/imls.c
++++ b/tools/imls/imls.c
+@@ -24,7 +24,7 @@
+ #include <mtd/mtd-user.h>
+ #endif
+
+-#include <sha1.h>
++#include <u-boot/sha1.h>
+ #include <libfdt.h>
+ #include <fdt_support.h>
+ #include <image.h>
+--- a/tools/mkimage.h
++++ b/tools/mkimage.h
+@@ -18,7 +18,7 @@
+ #include <sys/stat.h>
+ #include <time.h>
+ #include <unistd.h>
+-#include <sha1.h>
++#include <u-boot/sha1.h>
+ #include "fdt_host.h"
+
+ #undef MKIMAGE_DEBUG
+--- a/tools/ubsha1.c
++++ b/tools/ubsha1.c
+@@ -13,7 +13,7 @@
+ #include <errno.h>
+ #include <string.h>
+ #include <sys/stat.h>
+-#include "sha1.h"
++#include <u-boot/sha1.h>
+
+ int main (int argc, char **argv)
+ {
diff --git a/package/boot/uboot-layerscape/Makefile b/package/boot/uboot-layerscape/Makefile
index f02356791de..e255debfeb8 100644
--- a/package/boot/uboot-layerscape/Makefile
+++ b/package/boot/uboot-layerscape/Makefile
@@ -8,13 +8,13 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=uboot-layerscape
-PKG_VERSION:=LSDK-20.04-update-290520
-PKG_RELEASE:=$(AUTORELEASE)
+PKG_VERSION:=lf-6.1.1-1.0.0
+PKG_RELEASE:=1
PKG_SOURCE_PROTO:=git
-PKG_SOURCE_URL:=https://source.codeaurora.org/external/qoriq/qoriq-components/u-boot
-PKG_SOURCE_VERSION:=1e55b2f9e7f56b76569089b9e950f49c1579580e
-PKG_MIRROR_HASH:=46aace27e1367f40b424a64215d524a99c3bd62f49057550039e72d5a1ab7edb
+PKG_SOURCE_URL:=https://github.com/nxp-qoriq/u-boot
+PKG_SOURCE_VERSION:=lf-6.1.1-1.0.0
+PKG_MIRROR_HASH:=f4a3a262fd8923af72dede0348a512c05b756e3925279553eaf1c6667b186fb4
include $(INCLUDE_DIR)/u-boot.mk
include $(INCLUDE_DIR)/package.mk
@@ -45,6 +45,16 @@ define U-Boot/fsl_ls1012a-frwy-sdboot
ENV_SIZE:=0x10000
endef
+define U-Boot/fsl_ls1028a-rdb
+ NAME:=NXP LS1028ARDB
+ UBOOT_CONFIG:=ls1028ardb_tfa
+endef
+
+define U-Boot/fsl_ls1028a-rdb-sdboot
+ NAME:=NXP LS1028ARDB SD Card Boot
+ UBOOT_CONFIG:=ls1028ardb_tfa
+endef
+
define U-Boot/fsl_ls1043a-rdb
NAME:=NXP LS1043ARDB
UBOOT_CONFIG:=ls1043ardb_tfa
@@ -127,6 +137,8 @@ UBOOT_TARGETS := \
fsl_ls1012a-frdm \
fsl_ls1012a-rdb \
fsl_ls1012a-frwy-sdboot \
+ fsl_ls1028a-rdb \
+ fsl_ls1028a-rdb-sdboot \
fsl_ls1043a-rdb \
fsl_ls1043a-rdb-sdboot \
fsl_ls1046a-frwy \
diff --git a/package/boot/uboot-layerscape/files/fsl_ls1012a-frdm-uEnv.txt b/package/boot/uboot-layerscape/files/fsl_ls1012a-frdm-uEnv.txt
index b0923b59224..b9fefb4e0dd 100644
--- a/package/boot/uboot-layerscape/files/fsl_ls1012a-frdm-uEnv.txt
+++ b/package/boot/uboot-layerscape/files/fsl_ls1012a-frdm-uEnv.txt
@@ -1,8 +1,9 @@
fdtaddr=0x8f000000
-loadaddr=0x81000000
+loadaddr=0x88000000
fdt_high=0x8fffffff
initrd_high=0xffffffffffffffff
qspi_boot=sf probe 0:0;sf read $loadaddr 1000000 2800000;bootm $loadaddr
bootargs=rootfstype=squashfs,jffs2 noinitrd earlycon=uart8250,mmio,0x21c0500 console=ttyS0,115200 mtdparts=1550000.spi:1m(bl2),4m(fip),1m(u-boot-env),4m(reserved-1),3m(pfe),2m(reserved-2),1m(dtb),-(firmware)
bootcmd=echo starting OpenWrt ...;pfe stop;run qspi_boot
bootdelay=3
+fsl_bootcmd_mcinitcmd_set=y
diff --git a/package/boot/uboot-layerscape/files/fsl_ls1012a-frwy-sdboot-uEnv.txt b/package/boot/uboot-layerscape/files/fsl_ls1012a-frwy-sdboot-uEnv.txt
index 1fcd769dc96..18efdc1bc34 100644
--- a/package/boot/uboot-layerscape/files/fsl_ls1012a-frwy-sdboot-uEnv.txt
+++ b/package/boot/uboot-layerscape/files/fsl_ls1012a-frwy-sdboot-uEnv.txt
@@ -1,8 +1,9 @@
fdtaddr=0x8f000000
-loadaddr=0x81000000
+loadaddr=0x88000000
fdt_high=0x8fffffff
initrd_high=0xffffffffffffffff
sd_boot=ext4load mmc 0:1 $loadaddr fitImage;bootm $loadaddr
bootargs=root=/dev/mmcblk0p2 rw rootwait rootfstype=squashfs,f2fs noinitrd earlycon=uart8250,mmio,0x21c0500 console=ttyS0,115200
bootcmd=echo starting openwrt ...;pfe stop;run sd_boot
bootdelay=3
+fsl_bootcmd_mcinitcmd_set=y
diff --git a/package/boot/uboot-layerscape/files/fsl_ls1012a-rdb-uEnv.txt b/package/boot/uboot-layerscape/files/fsl_ls1012a-rdb-uEnv.txt
index 1d108a1b03f..0898354e774 100644
--- a/package/boot/uboot-layerscape/files/fsl_ls1012a-rdb-uEnv.txt
+++ b/package/boot/uboot-layerscape/files/fsl_ls1012a-rdb-uEnv.txt
@@ -1,7 +1,8 @@
fdtaddr=0x8f000000
-loadaddr=0x81000000
+loadaddr=0x88000000
bootm_size=0x10000000
qspi_boot=sf probe 0:0;sf read $fdtaddr f00000 100000;sf read $loadaddr 1000000 1000000;bootm $loadaddr - $fdtaddr
bootargs=root=/dev/mtdblock8 rootfstype=squashfs,jffs2 noinitrd earlycon=uart8250,mmio,0x21c0500 console=ttyS0,115200 mtdparts=1550000.spi:1m(bl2),4m(fip),1m(u-boot-env),4m(reserved-1),3m(pfe),2m(reserved-2),1m(dtb),16m(kernel),32m(rootfs),49m@0xf00000(firmware)
bootcmd=echo starting openwrt ...;pfe stop;run qspi_boot
bootdelay=3
+fsl_bootcmd_mcinitcmd_set=y
diff --git a/package/boot/uboot-layerscape/files/fsl_ls1021a-iot-sdboot-uEnv.txt b/package/boot/uboot-layerscape/files/fsl_ls1021a-iot-sdboot-uEnv.txt
index ed8661bc6ef..f8ec2c10fe8 100644
--- a/package/boot/uboot-layerscape/files/fsl_ls1021a-iot-sdboot-uEnv.txt
+++ b/package/boot/uboot-layerscape/files/fsl_ls1021a-iot-sdboot-uEnv.txt
@@ -1,8 +1,9 @@
fdtaddr=0x8f000000
-loadaddr=0x81000000
+loadaddr=0x88000000
fdt_high=0x8fffffff
initrd_high=0xffffffff
-sd_boot=ext4load mmc 0:1 $loadaddr fitImage;bootm $loadaddr
+sd_boot=ext4load mmc 0:1 ${loadaddr} fitImage;bootm ${loadaddr}
bootargs=root=/dev/mmcblk0p2 rw rootwait rootfstype=squashfs,f2fs noinitrd earlycon=uart8250,mmio,0x21c0500 console=ttyS0,115200
bootcmd=echo starting openwrt ...;run sd_boot
bootdelay=3
+fsl_bootcmd_mcinitcmd_set=y
diff --git a/package/boot/uboot-layerscape/files/fsl_ls1021a-twr-sdboot-uEnv.txt b/package/boot/uboot-layerscape/files/fsl_ls1021a-twr-sdboot-uEnv.txt
index ed8661bc6ef..d7f67e78ec8 100644
--- a/package/boot/uboot-layerscape/files/fsl_ls1021a-twr-sdboot-uEnv.txt
+++ b/package/boot/uboot-layerscape/files/fsl_ls1021a-twr-sdboot-uEnv.txt
@@ -1,8 +1,9 @@
fdtaddr=0x8f000000
-loadaddr=0x81000000
+loadaddr=0x88000000
fdt_high=0x8fffffff
initrd_high=0xffffffff
sd_boot=ext4load mmc 0:1 $loadaddr fitImage;bootm $loadaddr
bootargs=root=/dev/mmcblk0p2 rw rootwait rootfstype=squashfs,f2fs noinitrd earlycon=uart8250,mmio,0x21c0500 console=ttyS0,115200
bootcmd=echo starting openwrt ...;run sd_boot
bootdelay=3
+fsl_bootcmd_mcinitcmd_set=y
diff --git a/package/boot/uboot-layerscape/files/fsl_ls1021a-twr-uEnv.txt b/package/boot/uboot-layerscape/files/fsl_ls1021a-twr-uEnv.txt
index 6e39e055253..26fb3e9207b 100644
--- a/package/boot/uboot-layerscape/files/fsl_ls1021a-twr-uEnv.txt
+++ b/package/boot/uboot-layerscape/files/fsl_ls1021a-twr-uEnv.txt
@@ -1,7 +1,8 @@
fdtaddr=0x8f000000
-loadaddr=0x81000000
+loadaddr=0x88000000
bootm_size=0x10000000
nor_boot=cp.b 60f00000 $fdtaddr 100000;cp.b 61000000 $loadaddr 1000000;bootm $loadaddr - $fdtaddr
bootargs=root=/dev/mtdblock6 rootfstype=squashfs,jffs2 noinitrd earlycon=uart8250,mmio,0x21c0500 console=ttyS0,115200 mtdparts=60000000.nor:1m(rcw),2m(u-boot),1m(u-boot-env),11m(reserved-1),1m(dtb),16m(kernel),32m(rootfs),49m@0xf00000(firmware) cma=64M@0x0-0xb0000000
bootcmd=echo starting openwrt ...;run nor_boot
bootdelay=3
+fsl_bootcmd_mcinitcmd_set=y
diff --git a/package/boot/uboot-layerscape/files/fsl_ls1028a-rdb-sdboot-uEnv.txt b/package/boot/uboot-layerscape/files/fsl_ls1028a-rdb-sdboot-uEnv.txt
new file mode 100644
index 00000000000..3c39c2263de
--- /dev/null
+++ b/package/boot/uboot-layerscape/files/fsl_ls1028a-rdb-sdboot-uEnv.txt
@@ -0,0 +1,10 @@
+fdtaddr=0x8f000000
+loadaddr=0x81000000
+fdt_high=0x8fffffff
+initrd_high=0xffffffffffffffff
+hwconfig=fsl_ddr:bank_intlv=auto
+sd_boot=ext4load mmc 0:1 $loadaddr fitImage;bootm $loadaddr
+bootargs=root=/dev/mmcblk0p2 rw rootwait rootfstype=squashfs,f2fs noinitrd earlycon=uart8250,mmio,0x21c0500 console=ttyS0,115200
+bootcmd=echo starting openwrt ...;run sd_boot
+bootdelay=3
+fsl_bootcmd_mcinitcmd_set=y
diff --git a/package/boot/uboot-layerscape/files/fsl_ls1028a-rdb-uEnv.txt b/package/boot/uboot-layerscape/files/fsl_ls1028a-rdb-uEnv.txt
new file mode 100644
index 00000000000..21d41d15b53
--- /dev/null
+++ b/package/boot/uboot-layerscape/files/fsl_ls1028a-rdb-uEnv.txt
@@ -0,0 +1,9 @@
+fdtaddr=0x8f000000
+loadaddr=0x81000000
+bootm_size=0x10000000
+hwconfig=fsl_ddr:bank_intlv=auto
+qspi_boot=sf probe 0:0;sf read $loadaddr 1000000 1000000;bootm $loadaddr
+bootargs=rootfstype=squashfs,jffs2 noinitrd earlycon=uart8250,mmio,0x21c0500 console=ttyS0,115200 mtdparts=20c0000.spi:1m(bl2),4m(fip),1m(u-boot-env),128k(secure-boot-headers),48m@0x1000000(firmware)
+bootcmd=echo starting openwrt ...;run qspi_boot
+bootdelay=3
+fsl_bootcmd_mcinitcmd_set=y
diff --git a/package/boot/uboot-layerscape/files/fsl_ls1043a-rdb-sdboot-uEnv.txt b/package/boot/uboot-layerscape/files/fsl_ls1043a-rdb-sdboot-uEnv.txt
index 60340338763..591210eea73 100644
--- a/package/boot/uboot-layerscape/files/fsl_ls1043a-rdb-sdboot-uEnv.txt
+++ b/package/boot/uboot-layerscape/files/fsl_ls1043a-rdb-sdboot-uEnv.txt
@@ -1,5 +1,5 @@
fdtaddr=0x8f000000
-loadaddr=0x81000000
+loadaddr=0x88000000
fdt_high=0x8fffffff
initrd_high=0xffffffffffffffff
hwconfig=fsl_ddr:bank_intlv=auto
@@ -7,3 +7,4 @@ sd_boot=ext4load mmc 0:1 $loadaddr fitImage;bootm $loadaddr
bootargs=root=/dev/mmcblk0p2 rw rootwait rootfstype=squashfs,f2fs noinitrd earlycon=uart8250,mmio,0x21c0500 console=ttyS0,115200
bootcmd=echo starting openwrt ...;run sd_boot
bootdelay=3
+fsl_bootcmd_mcinitcmd_set=y
diff --git a/package/boot/uboot-layerscape/files/fsl_ls1043a-rdb-uEnv.txt b/package/boot/uboot-layerscape/files/fsl_ls1043a-rdb-uEnv.txt
index b381bde18fc..c601cab92f8 100644
--- a/package/boot/uboot-layerscape/files/fsl_ls1043a-rdb-uEnv.txt
+++ b/package/boot/uboot-layerscape/files/fsl_ls1043a-rdb-uEnv.txt
@@ -1,8 +1,9 @@
fdtaddr=0x8f000000
-loadaddr=0x81000000
+loadaddr=0x88000000
bootm_size=0x10000000
hwconfig=fsl_ddr:bank_intlv=auto
nor_boot=cp.b 60f00000 $fdtaddr 100000;cp.b 61000000 $loadaddr 1000000;bootm $loadaddr - $fdtaddr
bootargs=root=/dev/mtdblock8 rootfstype=squashfs,jffs2 noinitrd earlycon=uart8250,mmio,0x21c0500 console=ttyS0,115200 mtdparts=60000000.nor:1m(bl2),4m(fip),1m(u-boot-env),3m(reserved-1),256k(fman),5888k(reserved-2),1m(dtb),16m(kernel),32m(rootfs),49m@0xf00000(firmware)
bootcmd=echo starting openwrt ...;run nor_boot
bootdelay=3
+fsl_bootcmd_mcinitcmd_set=y
diff --git a/package/boot/uboot-layerscape/files/fsl_ls1046a-frwy-sdboot-uEnv.txt b/package/boot/uboot-layerscape/files/fsl_ls1046a-frwy-sdboot-uEnv.txt
index ed16dde9843..e69332efacb 100644
--- a/package/boot/uboot-layerscape/files/fsl_ls1046a-frwy-sdboot-uEnv.txt
+++ b/package/boot/uboot-layerscape/files/fsl_ls1046a-frwy-sdboot-uEnv.txt
@@ -1,8 +1,9 @@
fdtaddr=0x8f000000
-loadaddr=0x81000000
+loadaddr=0x88000000
bootm_size=0x10000000
hwconfig=fsl_ddr:bank_intlv=auto
sd_boot=ext4load mmc 0:1 ${loadaddr} fitImage;bootm ${loadaddr}
bootargs=root=/dev/mmcblk0p2 rw rootwait rootfstype=squashfs,f2fs noinitrd earlycon=uart8250,mmio,0x21c0500 console=ttyS0,115200
bootcmd=echo starting openwrt ...;run sd_boot
bootdelay=3
+fsl_bootcmd_mcinitcmd_set=y
diff --git a/package/boot/uboot-layerscape/files/fsl_ls1046a-frwy-uEnv.txt b/package/boot/uboot-layerscape/files/fsl_ls1046a-frwy-uEnv.txt
index 9daba4aedb2..ad5cc77841d 100644
--- a/package/boot/uboot-layerscape/files/fsl_ls1046a-frwy-uEnv.txt
+++ b/package/boot/uboot-layerscape/files/fsl_ls1046a-frwy-uEnv.txt
@@ -1,8 +1,9 @@
fdtaddr=0x8f000000
-loadaddr=0x81000000
+loadaddr=0x88000000
bootm_size=0x10000000
hwconfig=fsl_ddr:bank_intlv=auto
qspi_boot=sf probe 0:0;sf read $fdtaddr f00000 100000;sf read $loadaddr 1000000 1000000;bootm $loadaddr - $fdtaddr
bootargs=root=/dev/mtdblock9 rootfstype=squashfs,jffs2 noinitrd earlycon=uart8250,mmio,0x21c0500 console=ttyS0,115200 mtdparts=1550000.spi:1m(bl2),4m(fip),1m(u-boot-env),3m(reserved-1),256k(fman),5888k(reserved-2),1m(dtb),16m(kernel),32m(rootfs),49m@0xf00000(firmware)
bootcmd=echo starting openwrt ...;run qspi_boot
bootdelay=3
+fsl_bootcmd_mcinitcmd_set=y
diff --git a/package/boot/uboot-layerscape/files/fsl_ls1046a-rdb-sdboot-uEnv.txt b/package/boot/uboot-layerscape/files/fsl_ls1046a-rdb-sdboot-uEnv.txt
index 60340338763..591210eea73 100644
--- a/package/boot/uboot-layerscape/files/fsl_ls1046a-rdb-sdboot-uEnv.txt
+++ b/package/boot/uboot-layerscape/files/fsl_ls1046a-rdb-sdboot-uEnv.txt
@@ -1,5 +1,5 @@
fdtaddr=0x8f000000
-loadaddr=0x81000000
+loadaddr=0x88000000
fdt_high=0x8fffffff
initrd_high=0xffffffffffffffff
hwconfig=fsl_ddr:bank_intlv=auto
@@ -7,3 +7,4 @@ sd_boot=ext4load mmc 0:1 $loadaddr fitImage;bootm $loadaddr
bootargs=root=/dev/mmcblk0p2 rw rootwait rootfstype=squashfs,f2fs noinitrd earlycon=uart8250,mmio,0x21c0500 console=ttyS0,115200
bootcmd=echo starting openwrt ...;run sd_boot
bootdelay=3
+fsl_bootcmd_mcinitcmd_set=y
diff --git a/package/boot/uboot-layerscape/files/fsl_ls1046a-rdb-uEnv.txt b/package/boot/uboot-layerscape/files/fsl_ls1046a-rdb-uEnv.txt
index d24f9ec2017..dab8faaf132 100644
--- a/package/boot/uboot-layerscape/files/fsl_ls1046a-rdb-uEnv.txt
+++ b/package/boot/uboot-layerscape/files/fsl_ls1046a-rdb-uEnv.txt
@@ -1,8 +1,9 @@
fdtaddr=0x8f000000
-loadaddr=0x81000000
+loadaddr=0x88000000
bootm_size=0x10000000
hwconfig=fsl_ddr:bank_intlv=auto
qspi_boot=sf probe 0:0;sf read $fdtaddr f00000 100000;sf read $loadaddr 1000000 1000000;bootm $loadaddr - $fdtaddr
bootargs=root=/dev/mtdblock9 rootfstype=squashfs,jffs2 noinitrd earlycon=uart8250,mmio,0x21c0500 console=ttyS0,115200 mtdparts=1550000.spi-0:1m(bl2),4m(fip),1m(u-boot-env),3m(reserved-1),256k(fman),5888k(reserved-2),1m(dtb),16m(kernel),32m(rootfs),49m@0xf00000(firmware)
bootcmd=echo starting openwrt ...;run qspi_boot
bootdelay=3
+fsl_bootcmd_mcinitcmd_set=y
diff --git a/package/boot/uboot-layerscape/files/fsl_ls1088a-rdb-sdboot-uEnv.txt b/package/boot/uboot-layerscape/files/fsl_ls1088a-rdb-sdboot-uEnv.txt
index b25e9c8ee70..5b235378448 100644
--- a/package/boot/uboot-layerscape/files/fsl_ls1088a-rdb-sdboot-uEnv.txt
+++ b/package/boot/uboot-layerscape/files/fsl_ls1088a-rdb-sdboot-uEnv.txt
@@ -1,5 +1,5 @@
fdtaddr=0x8f000000
-loadaddr=0x81000000
+loadaddr=0x88000000
fdt_high=0xa0000000
initrd_high=0xffffffffffffffff
hwconfig=fsl_ddr:bank_intlv=auto
@@ -8,3 +8,4 @@ sd_boot=ext4load mmc 0:1 $loadaddr fitImage;bootm $loadaddr
bootargs=root=/dev/mmcblk0p2 rw rootwait rootfstype=squashfs,f2fs noinitrd earlycon=uart8250,mmio,0x21c0500 console=ttyS0,115200
bootcmd=echo starting openwrt ...;run mc_init;run sd_boot
bootdelay=3
+fsl_bootcmd_mcinitcmd_set=y
diff --git a/package/boot/uboot-layerscape/files/fsl_ls1088a-rdb-uEnv.txt b/package/boot/uboot-layerscape/files/fsl_ls1088a-rdb-uEnv.txt
index 6ac6216d647..a15717bcb80 100644
--- a/package/boot/uboot-layerscape/files/fsl_ls1088a-rdb-uEnv.txt
+++ b/package/boot/uboot-layerscape/files/fsl_ls1088a-rdb-uEnv.txt
@@ -1,5 +1,5 @@
fdtaddr=0x8f000000
-loadaddr=0x81000000
+loadaddr=0x88000000
fdt_high=0xa0000000
initrd_high=0xffffffffffffffff
hwconfig=fsl_ddr:bank_intlv=auto
@@ -8,3 +8,4 @@ qspi_boot=sf probe 0:0;sf read $fdtaddr f00000 100000;sf read $loadaddr 1000000
bootargs=root=/dev/mtdblock10 rootfstype=squashfs,jffs2 noinitrd earlycon=uart8250,mmio,0x21c0500 console=ttyS0,115200 mtdparts=20c0000.spi-0:1m(bl2),4m(fip),1m(u-boot-env),4m(reserved-1),3m(mc),1m(dpl),1m(dpc),1m(dtb),16m(kernel),32m(rootfs),49m@0xf00000(firmware)
bootcmd=echo starting openwrt ...;run mc_init;run qspi_boot
bootdelay=3
+fsl_bootcmd_mcinitcmd_set=y
diff --git a/package/boot/uboot-layerscape/files/fsl_ls2088a-rdb-uEnv.txt b/package/boot/uboot-layerscape/files/fsl_ls2088a-rdb-uEnv.txt
index eb10a88d77b..646aed44278 100644
--- a/package/boot/uboot-layerscape/files/fsl_ls2088a-rdb-uEnv.txt
+++ b/package/boot/uboot-layerscape/files/fsl_ls2088a-rdb-uEnv.txt
@@ -1,5 +1,5 @@
fdtaddr=0x8f000000
-loadaddr=0x81000000
+loadaddr=0x88000000
fdt_high=0xa0000000
initrd_high=0xffffffffffffffff
hwconfig=fsl_ddr:bank_intlv=auto
@@ -8,3 +8,4 @@ nor_boot=cp.b 580f00000 $fdtaddr 100000;cp.b 581000000 $loadaddr 1000000;bootm $
bootargs=root=/dev/mtdblock9 rootfstype=squashfs,jffs2 noinitrd earlycon=uart8250,mmio,0x21c0500 console=ttyS1,115200 mtdparts=580000000.nor:1m(bl2),4m(fip),1m(u-boot-env),4m(reserved-1),3m(mc),1m(dpl),1m(dpc),1m(dtb),16m(kernel),32m(rootfs),49m@0xf00000(firmware)
bootcmd=echo starting openwrt ...;run mc_init;run nor_boot
bootdelay=3
+fsl_bootcmd_mcinitcmd_set=y
diff --git a/package/boot/uboot-layerscape/files/fsl_lx2160a-rdb-sdboot-uEnv.txt b/package/boot/uboot-layerscape/files/fsl_lx2160a-rdb-sdboot-uEnv.txt
index 6b4e920c9ef..2d8043d7b1b 100644
--- a/package/boot/uboot-layerscape/files/fsl_lx2160a-rdb-sdboot-uEnv.txt
+++ b/package/boot/uboot-layerscape/files/fsl_lx2160a-rdb-sdboot-uEnv.txt
@@ -1,5 +1,5 @@
fdtaddr=0x8f000000
-loadaddr=0x81000000
+loadaddr=0x88000000
bootm_size=0x10000000
hwconfig=fsl_ddr:bank_intlv=auto
mc_init=mmc read 80000000 5000 1800;mmc read 80300000 7000 800;fsl_mc start mc 80000000 80300000;mmc read 80400000 6800 800;fsl_mc apply dpl 80400000
@@ -7,3 +7,4 @@ sd_boot=ext4load mmc 0:1 ${loadaddr} fitImage;bootm ${loadaddr}
bootargs=root=/dev/mmcblk0p2 rw rootwait rootfstype=squashfs,f2fs noinitrd earlycon=pl011,mmio32,0x21c0000 console=ttyAMA0,115200
bootcmd=echo starting openwrt ...;run mc_init;run sd_boot
bootdelay=3
+fsl_bootcmd_mcinitcmd_set=y
diff --git a/package/boot/uboot-layerscape/files/fsl_lx2160a-rdb-uEnv.txt b/package/boot/uboot-layerscape/files/fsl_lx2160a-rdb-uEnv.txt
index 08757b44606..16f905afc68 100644
--- a/package/boot/uboot-layerscape/files/fsl_lx2160a-rdb-uEnv.txt
+++ b/package/boot/uboot-layerscape/files/fsl_lx2160a-rdb-uEnv.txt
@@ -1,5 +1,5 @@
fdtaddr=0x8f000000
-loadaddr=0x81000000
+loadaddr=0x88000000
bootm_size=0x10000000
hwconfig=fsl_ddr:bank_intlv=auto
mc_init=sf probe 0:0;sf read 80000000 a00000 300000;sf read 80300000 e00000 100000;fsl_mc start mc 80000000 80300000;sf read 80400000 d00000 100000;fsl_mc apply dpl 80400000
@@ -7,3 +7,4 @@ xspi_boot=sf probe 0:0;sf read $fdtaddr f00000 100000;sf read $loadaddr 1000000
bootargs=root=/dev/mtdblock9 rootfstype=squashfs,jffs2 noinitrd earlycon=pl011,mmio32,0x21c0000 console=ttyAMA0,115200 mtdparts=20c0000.spi-0:1m(bl2),4m(fip),1m(u-boot-env),4m(reserved-1),3m(mc),1m(dpl),1m(dpc),1m(dtb),16m(kernel),32m(rootfs),49m@0xf00000(firmware)
bootcmd=echo starting openwrt ...;run mc_init;run xspi_boot
bootdelay=3
+fsl_bootcmd_mcinitcmd_set=y
diff --git a/package/boot/uboot-layerscape/patches/0001-board-ls1046ardb-force-PCI-device-enumeration.patch b/package/boot/uboot-layerscape/patches/0001-board-ls1046ardb-force-PCI-device-enumeration.patch
new file mode 100644
index 00000000000..25a6b16363c
--- /dev/null
+++ b/package/boot/uboot-layerscape/patches/0001-board-ls1046ardb-force-PCI-device-enumeration.patch
@@ -0,0 +1,33 @@
+From 089b90b11008ec95a56da12e31d11e3f31a9bb26 Mon Sep 17 00:00:00 2001
+From: Martin Schiller <ms@dev.tdt.de>
+Date: Wed, 17 Nov 2021 07:29:55 +0100
+Subject: [PATCH] board: ls1046ardb: force PCI device enumeration
+
+Commit 045ecf899252 ("configs: enable DM_ETH support for LS1046ARDB")
+resulted in the PCI bus no longer being implicitly enumerated.
+
+However, this is necessary for the fdt pcie fixups to work.
+
+Therefore, similar to commit 8b6558bd4187 ("board: ls1088ardb:
+transition to DM_ETH"), pci_init() is now called in the board_init()
+routine when CONFIG_DM_ETH is active.
+
+Signed-off-by: Martin Schiller <ms@dev.tdt.de>
+CC: Priyanka Jain <priyanka.jain@nxp.com>
+---
+ board/freescale/ls1046ardb/ls1046ardb.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- a/board/freescale/ls1046ardb/ls1046ardb.c
++++ b/board/freescale/ls1046ardb/ls1046ardb.c
+@@ -88,6 +88,10 @@ int board_init(void)
+ ppa_init();
+ #endif
+
++#if !defined(CONFIG_SYS_EARLY_PCI_INIT) && defined(CONFIG_DM_ETH)
++ pci_init();
++#endif
++
+ /* invert AQR105 IRQ pins polarity */
+ out_be32(&scfg->intpcr, AQR105_IRQ_MASK);
+
diff --git a/package/boot/uboot-layerscape/patches/0002-board-ls1043ardb-force-PCI-device-enumeration.patch b/package/boot/uboot-layerscape/patches/0002-board-ls1043ardb-force-PCI-device-enumeration.patch
new file mode 100644
index 00000000000..d38102a13cc
--- /dev/null
+++ b/package/boot/uboot-layerscape/patches/0002-board-ls1043ardb-force-PCI-device-enumeration.patch
@@ -0,0 +1,34 @@
+From 64d2dffa8b51c1beb7e472690dcac965ac0f7ac4 Mon Sep 17 00:00:00 2001
+From: Martin Schiller <ms@dev.tdt.de>
+Date: Tue, 23 Nov 2021 07:24:19 +0100
+Subject: [PATCH] board: ls1043ardb: force PCI device enumeration
+
+Commit eb1986804d1d ("configs: enable DM_ETH support for LS1043ARDB")
+resulted in the PCI bus no longer being implicitly enumerated.
+
+However, this is necessary for the fdt pcie fixups to work.
+
+Therefore, similar to commit 8b6558bd4187 ("board: ls1088ardb:
+transition to DM_ETH"), pci_init() is now called in the board_init()
+routine when CONFIG_DM_ETH is active.
+
+Signed-off-by: Martin Schiller <ms@dev.tdt.de>
+CC: Priyanka Jain <priyanka.jain@nxp.com>
+CC: Camelia Groza <camelia.groza@nxp.com>
+---
+ board/freescale/ls1043ardb/ls1043ardb.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- a/board/freescale/ls1043ardb/ls1043ardb.c
++++ b/board/freescale/ls1043ardb/ls1043ardb.c
+@@ -214,6 +214,10 @@ int board_init(void)
+ ppa_init();
+ #endif
+
++#if !defined(CONFIG_SYS_EARLY_PCI_INIT) && defined(CONFIG_DM_ETH)
++ pci_init();
++#endif
++
+ #ifdef CONFIG_U_QE
+ u_qe_init();
+ #endif
diff --git a/package/boot/uboot-layerscape/patches/0900-layerscape-adjust-LS1021A-IOT-config-for-OpenWrt.patch b/package/boot/uboot-layerscape/patches/0900-layerscape-adjust-LS1021A-IOT-config-for-OpenWrt.patch
new file mode 100644
index 00000000000..414f2541acf
--- /dev/null
+++ b/package/boot/uboot-layerscape/patches/0900-layerscape-adjust-LS1021A-IOT-config-for-OpenWrt.patch
@@ -0,0 +1,45 @@
+From b382eeafe01df21da3518b2f1dd7d22ee114efb0 Mon Sep 17 00:00:00 2001
+From: Pawel Dembicki <paweldembicki@gmail.com>
+Date: Mon, 24 Oct 2022 14:19:38 +0200
+Subject: [PATCH] layerscape: adjust LS1021A-IOT config for OpenWrt
+
+Two configs are required:
+ - FIT
+ - Ext4load
+
+Let's enable it. U-boot is now bigger than 512K. Let's enlarge it to
+768K. Envs start at 1M, so it will fit.
+
+Signed-off-by: Pawel Dembicki <paweldembicki@gmail.com>
+---
+ configs/ls1021aiot_sdcard_defconfig | 3 +++
+ include/configs/ls1021aiot.h | 4 ++--
+ 2 files changed, 5 insertions(+), 2 deletions(-)
+
+--- a/configs/ls1021aiot_sdcard_defconfig
++++ b/configs/ls1021aiot_sdcard_defconfig
+@@ -27,8 +27,11 @@ CONFIG_CMD_MII=y
+ # CONFIG_CMD_MDIO is not set
+ CONFIG_CMD_PING=y
+ CONFIG_CMD_EXT2=y
++CONFIG_CMD_EXT4=y
+ CONFIG_CMD_FAT=y
+ # CONFIG_SPL_EFI_PARTITION is not set
++CONFIG_FIT=y
++CONFIG_FIT_VERBOSE=y
+ CONFIG_OF_CONTROL=y
+ CONFIG_ENV_OVERWRITE=y
+ CONFIG_ENV_IS_IN_MMC=y
+--- a/include/configs/ls1021aiot.h
++++ b/include/configs/ls1021aiot.h
+@@ -78,8 +78,8 @@
+ CONFIG_SYS_MONITOR_LEN)
+ #define CONFIG_SYS_SPL_MALLOC_SIZE 0x100000
+ #define CONFIG_SPL_BSS_START_ADDR 0x80100000
+-#define CONFIG_SPL_BSS_MAX_SIZE 0x80000
+-#define CONFIG_SYS_MONITOR_LEN 0x80000
++#define CONFIG_SPL_BSS_MAX_SIZE 0xc0000
++#define CONFIG_SYS_MONITOR_LEN 0xc0000
+ #endif
+
+ #define CONFIG_SYS_DDR_SDRAM_BASE 0x80000000UL
diff --git a/package/boot/uboot-mediatek/Makefile b/package/boot/uboot-mediatek/Makefile
index 37af42e6642..61aaf4de257 100644
--- a/package/boot/uboot-mediatek/Makefile
+++ b/package/boot/uboot-mediatek/Makefile
@@ -1,17 +1,87 @@
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
-PKG_VERSION:=2021.04
-PKG_HASH:=0d438b1bb5cceb57a18ea2de4a0d51f7be5b05b98717df05938636e0aadfe11a
-PKG_BUILD_DEPENDS:=arm-trusted-firmware-tools/host
+PKG_VERSION:=2024.01
+PKG_HASH:=b99611f1ed237bf3541bdc8434b68c96a6e05967061f992443cb30aabebef5b3
+PKG_BUILD_DEPENDS:=!(TARGET_ramips||TARGET_mediatek_mt7623):arm-trusted-firmware-tools/host
+
+UBOOT_USE_INTREE_DTC:=1
include $(INCLUDE_DIR)/u-boot.mk
include $(INCLUDE_DIR)/package.mk
include $(INCLUDE_DIR)/host-build.mk
+MT7621_LOWLEVEL_PRELOADER_URL:=https://raw.githubusercontent.com/mtk-openwrt/mt7621-lowlevel-preloader/a03b07c60bf1ba4add9b671d32caa102fe948180/
+
+define Download/mt7621-stage-sram
+ FILE:=mt7621_stage_sram.bin
+ URL:=$(MT7621_LOWLEVEL_PRELOADER_URL)
+ HASH:=1dda68aa089f0ff262e01539b990dea478952e9fb68bcc0a8cd6f76f0135c62e
+endef
+
+define Download/mt7621-stage-sram-noprint
+ FILE:=mt7621_stage_sram_noprint.bin
+ URL:=$(MT7621_LOWLEVEL_PRELOADER_URL)
+ HASH:=8ee419275144fc298e9444d413d98e965a55d283152a74ea6a1f8de79eb516b6
+endef
+
+ifdef CONFIG_TARGET_ramips_mt7621
+ifdef CONFIG_DEBUG
+$(eval $(call Download,mt7621-stage-sram))
+else
+$(eval $(call Download,mt7621-stage-sram-noprint))
+endif
+endif
+
define U-Boot/Default
BUILD_TARGET:=mediatek
UBOOT_IMAGE:=u-boot-mtk.bin
+ HIDDEN:=1
+endef
+
+define U-Boot/mt7620_rfb
+ NAME:=MT7620 Reference Board
+ UBOOT_CONFIG:=mt7620_rfb
+ BUILD_DEVICES:=ralink_mt7620a-evb
+ BUILD_TARGET:=ramips
+ BUILD_SUBTARGET:=mt7620
+ UBOOT_IMAGE:=u-boot-with-spl.bin
+endef
+
+define U-Boot/mt7620_mt7530_rfb
+ NAME:=MT7620+MT7530 Reference Board
+ UBOOT_CONFIG:=mt7620_mt7530_rfb
+ BUILD_DEVICES:=ralink_mt7620a-mt7530-evb
+ BUILD_TARGET:=ramips
+ BUILD_SUBTARGET:=mt7620
+ UBOOT_IMAGE:=u-boot-with-spl.bin
+endef
+
+define U-Boot/mt7621_rfb
+ NAME:=MT7621 Reference Board
+ UBOOT_CONFIG:=mt7621_rfb
+ BUILD_DEVICES:=mediatek_mt7621-eval-board
+ BUILD_TARGET:=ramips
+ BUILD_SUBTARGET:=mt7621
+ UBOOT_IMAGE:=u-boot-mt7621.bin
+endef
+
+define U-Boot/mt7621_nand_rfb
+ NAME:=MT7621 Reference Board (NAND)
+ UBOOT_CONFIG:=mt7621_nand_rfb
+ BUILD_DEVICES:=mediatek_mt7621-eval-board
+ BUILD_TARGET:=ramips
+ BUILD_SUBTARGET:=mt7621
+ UBOOT_IMAGE:=u-boot-mt7621.bin
+endef
+
+define U-Boot/mt7621_zbtlink_zbt-wg3526-16m
+ NAME:=Zbtlink ZBT-WG3526-16m
+ UBOOT_CONFIG:=mt7621_zbtlink_zbt-wg3526-16m
+ BUILD_DEVICES:=zbtlink_zbt-wg3526-16m
+ BUILD_TARGET:=ramips
+ BUILD_SUBTARGET:=mt7621
+ UBOOT_IMAGE:=u-boot-mt7621.bin
endef
define U-Boot/mt7622_rfb1
@@ -27,9 +97,9 @@ define U-Boot/mt7622_linksys_e8450
BUILD_DEVICES:=linksys_e8450-ubi
BUILD_SUBTARGET:=mt7622
UBOOT_IMAGE:=u-boot.fip
- BL2_BOOTDEV:=snand
+ BL2_BOOTDEV:=snand-ubi
BL2_DDRBLOB:=1
- DEPENDS:=+trusted-firmware-a-mt7622-snand-1ddr
+ DEPENDS:=+trusted-firmware-a-mt7622-snand-ubi-1ddr
endef
define U-Boot/mt7622_bananapi_bpi-r64-emmc
@@ -60,25 +130,50 @@ define U-Boot/mt7622_bananapi_bpi-r64-snand
BUILD_DEVICES:=bananapi_bpi-r64
BUILD_SUBTARGET:=mt7622
UBOOT_IMAGE:=u-boot.fip
- BL2_BOOTDEV:=snand
+ BL2_BOOTDEV:=snand-ubi
BL2_DDRBLOB:=2
- DEPENDS:=+trusted-firmware-a-mt7622-snand-2ddr
+ DEPENDS:=+trusted-firmware-a-mt7622-snand-ubi-2ddr
endef
-define U-Boot/mt7622_ubnt_unifi-6-lr
+define U-Boot/mt7622_ubnt_unifi-6-lr-v1
NAME:=Ubiquiti UniFi 6 LR
- UBOOT_CONFIG:=mt7622_ubnt_unifi-6-lr
- BUILD_DEVICES:=ubnt_unifi-6-lr-ubootmod
+ UBOOT_CONFIG:=mt7622_ubnt_unifi-6-lr-v1
+ BUILD_DEVICES:=ubnt_unifi-6-lr-v1-ubootmod
BUILD_SUBTARGET:=mt7622
UBOOT_IMAGE:=u-boot.fip
BL2_BOOTDEV:=nor
BL2_DDRBLOB:=2
DEPENDS:=+trusted-firmware-a-mt7622-nor-2ddr
+ FIP_COMPRESS:=1
+endef
+
+define U-Boot/mt7622_ubnt_unifi-6-lr-v2
+ NAME:=Ubiquiti UniFi 6 LR v2
+ UBOOT_CONFIG:=mt7622_ubnt_unifi-6-lr-v2
+ BUILD_DEVICES:=ubnt_unifi-6-lr-v2-ubootmod
+ BUILD_SUBTARGET:=mt7622
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=nor
+ BL2_DDRBLOB:=2
+ DEPENDS:=+trusted-firmware-a-mt7622-nor-2ddr
+ FIP_COMPRESS:=1
+endef
+
+define U-Boot/mt7622_ubnt_unifi-6-lr-v3
+ NAME:=Ubiquiti UniFi 6 LR v3
+ UBOOT_CONFIG:=mt7622_ubnt_unifi-6-lr-v3
+ BUILD_DEVICES:=ubnt_unifi-6-lr-v3-ubootmod
+ BUILD_SUBTARGET:=mt7622
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=nor
+ BL2_DDRBLOB:=2
+ DEPENDS:=+trusted-firmware-a-mt7622-nor-2ddr
+ FIP_COMPRESS:=1
endef
define U-Boot/mt7623a_unielec_u7623
NAME:=UniElec U7623 (mt7623)
- BUILD_DEVICES:=unielec_u7623-emmc unielec_u7623-02-emmc-512m-legacy
+ BUILD_DEVICES:=unielec_u7623-02
BUILD_SUBTARGET:=mt7623
UBOOT_CONFIG:=mt7623a_unielec_u7623_02
endef
@@ -91,6 +186,24 @@ define U-Boot/mt7623n_bpir2
UBOOT_CONFIG:=mt7623n_bpir2
endef
+define U-Boot/mt7628_rfb
+ NAME:=MT7628 Reference Board
+ BUILD_DEVICES:=mediatek_mt7628an-eval-board
+ BUILD_TARGET:=ramips
+ BUILD_SUBTARGET:=mt76x8
+ UBOOT_CONFIG:=mt7628_rfb
+ UBOOT_IMAGE:=u-boot-with-spl.bin
+endef
+
+define U-Boot/mt7628_ravpower_rp-wd009
+ NAME:=RAVPower RP-WD009
+ BUILD_TARGET:=ramips
+ BUILD_DEVICES:=ravpower_rp-wd009
+ BUILD_SUBTARGET:=mt76x8
+ UBOOT_CONFIG:=ravpower-rp-wd009-ram
+ UBOOT_IMAGE:=u-boot.bin
+endef
+
define U-Boot/mt7629_rfb
NAME:=MT7629 Reference Board
BUILD_SUBTARGET:=mt7629
@@ -98,38 +211,513 @@ define U-Boot/mt7629_rfb
UBOOT_CONFIG:=mt7629_rfb
endef
+define U-Boot/mt7981_cmcc_rax3000m-emmc
+ NAME:=CMCC RAX3000M
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=cmcc_rax3000m
+ UBOOT_CONFIG:=mt7981_cmcc_rax3000m-emmc
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=emmc
+ BL2_SOC:=mt7981
+ BL2_DDRTYPE:=ddr4
+ DEPENDS:=+trusted-firmware-a-mt7981-emmc-ddr4
+endef
+
+define U-Boot/mt7981_cmcc_rax3000m-nand
+ NAME:=CMCC RAX3000M
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=cmcc_rax3000m
+ UBOOT_CONFIG:=mt7981_cmcc_rax3000m-nand
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=spim-nand
+ BL2_SOC:=mt7981
+ BL2_DDRTYPE:=ddr4
+ DEPENDS:=+trusted-firmware-a-mt7981-spim-nand-ddr4
+endef
+
+define U-Boot/mt7981_h3c_magic-nx30-pro
+ NAME:=H3C Magic NX30 Pro
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=h3c_magic-nx30-pro
+ UBOOT_CONFIG:=mt7981_h3c_magic-nx30-pro
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=spim-nand
+ BL2_SOC:=mt7981
+ BL2_DDRTYPE:=ddr3
+ DEPENDS:=+trusted-firmware-a-mt7981-spim-nand-ddr3
+endef
+
+define U-Boot/mt7981_jcg_q30-pro
+ NAME:=JCG Q30 PRO
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=jcg_q30-pro
+ UBOOT_CONFIG:=mt7981_jcg_q30-pro
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=spim-nand
+ BL2_SOC:=mt7981
+ BL2_DDRTYPE:=ddr3
+ DEPENDS:=+trusted-firmware-a-mt7981-spim-nand-ddr3
+endef
+
+define U-Boot/mt7981_rfb-spim-nand
+ NAME:=MT7981 Reference Board
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=mediatek_mt7981-rfb
+ UBOOT_CONFIG:=mt7981_rfb
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=spim-nand
+ BL2_SOC:=mt7981
+ BL2_DDRTYPE:=ddr3
+ DEPENDS:=+trusted-firmware-a-mt7981-spim-nand-ddr3
+endef
+
+define U-Boot/mt7981_rfb-emmc
+ NAME:=MT7981 Reference Board
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=mediatek_mt7981-rfb
+ UBOOT_CONFIG:=mt7981_emmc_rfb
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=emmc
+ BL2_SOC:=mt7981
+ BL2_DDRTYPE:=ddr3
+ DEPENDS:=+trusted-firmware-a-mt7981-emmc-ddr3
+endef
+
+define U-Boot/mt7981_rfb-nor
+ NAME:=MT7981 Reference Board
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=mediatek_mt7981-rfb
+ UBOOT_CONFIG:=mt7981_nor_rfb
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=spim-nand
+ BL2_SOC:=mt7981
+ BL2_DDRTYPE:=ddr3
+ DEPENDS:=+trusted-firmware-a-mt7981-nor-ddr3
+endef
+
+define U-Boot/mt7981_rfb-sd
+ NAME:=MT7981 Reference Board
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=mediatek_mt7981-rfb
+ UBOOT_CONFIG:=mt7981_sd_rfb
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=sdmmc
+ BL2_SOC:=mt7981
+ BL2_DDRTYPE:=ddr3
+ DEPENDS:=+trusted-firmware-a-mt7981-sdmmc-ddr3
+endef
+
+define U-Boot/mt7981_rfb-snfi
+ NAME:=MT7981 Reference Board
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=mediatek_mt7981-rfb
+ UBOOT_CONFIG:=mt7981_snfi_nand_rfb
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=snand
+ BL2_SOC:=mt7981
+ BL2_DDRTYPE:=ddr3
+ DEPENDS:=+trusted-firmware-a-mt7981-snand-ddr3
+endef
+
+define U-Boot/mt7981_qihoo_360t7
+ NAME:=Qihoo 360T7
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=qihoo_360t7
+ UBOOT_CONFIG:=mt7981_qihoo-360t7
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=spim-nand
+ BL2_SOC:=mt7981
+ BL2_DDRTYPE:=ddr3
+ DEPENDS:=+trusted-firmware-a-mt7981-spim-nand-ddr3
+endef
+
+define U-Boot/mt7981_xiaomi_mi-router-ax3000t
+ NAME:=Xiaomi Router AX3000T
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=xiaomi_mi-router-ax3000t-ubootmod
+ UBOOT_CONFIG:=mt7981_xiaomi_mi-router-ax3000t
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=spim-nand
+ BL2_SOC:=mt7981
+ BL2_DDRTYPE:=ddr3
+ DEPENDS:=+trusted-firmware-a-mt7981-spim-nand-ddr3
+endef
+
+define U-Boot/mt7981_xiaomi_mi-router-wr30u
+ NAME:=Xiaomi Router WR30U
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=xiaomi_mi-router-wr30u-ubootmod
+ UBOOT_CONFIG:=mt7981_xiaomi_mi-router-wr30u
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=spim-nand
+ BL2_SOC:=mt7981
+ BL2_DDRTYPE:=ddr3
+ DEPENDS:=+trusted-firmware-a-mt7981-spim-nand-ddr3
+endef
+
+define U-Boot/mt7986_rfb
+ NAME:=MT7986 Reference Board
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=mediatek_mt7986-rfb
+ UBOOT_CONFIG:=mt7986_rfb
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=sdmmc
+ BL2_SOC:=mt7986
+ BL2_DDRTYPE:=ddr4
+ DEPENDS:=+trusted-firmware-a-mt7986-sdmmc-ddr4
+endef
+
+define U-Boot/mt7986_bananapi_bpi-r3-emmc
+ NAME:=BananaPi BPi-R3
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=bananapi_bpi-r3
+ UBOOT_CONFIG:=mt7986a_bpi-r3-emmc
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=emmc
+ BL2_SOC:=mt7986
+ BL2_DDRTYPE:=ddr4
+ DEPENDS:=+trusted-firmware-a-mt7986-emmc-ddr4
+endef
+
+define U-Boot/mt7986_bananapi_bpi-r3-sdmmc
+ NAME:=BananaPi BPi-R3
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=bananapi_bpi-r3
+ UBOOT_CONFIG:=mt7986a_bpi-r3-sd
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=sdmmc
+ BL2_SOC:=mt7986
+ BL2_DDRTYPE:=ddr4
+ DEPENDS:=+trusted-firmware-a-mt7986-sdmmc-ddr4
+endef
+
+define U-Boot/mt7986_bananapi_bpi-r3-snand
+ NAME:=BananaPi BPi-R3
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=bananapi_bpi-r3
+ UBOOT_CONFIG:=mt7986a_bpi-r3-snand
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=spim-nand-ubi
+ BL2_SOC:=mt7986
+ BL2_DDRTYPE:=ddr4
+ DEPENDS:=+trusted-firmware-a-mt7986-spim-nand-ubi-ddr4
+endef
+
+define U-Boot/mt7986_bananapi_bpi-r3-nor
+ NAME:=BananaPi BPi-R3
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=bananapi_bpi-r3
+ UBOOT_CONFIG:=mt7986a_bpi-r3-nor
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=nor
+ BL2_SOC:=mt7986
+ BL2_DDRTYPE:=ddr4
+ DEPENDS:=+trusted-firmware-a-mt7986-nor-ddr4
+ FIP_COMPRESS:=1
+endef
+
+define U-Boot/mt7986_bananapi_bpi-r3-mini-emmc
+ NAME:=BananaPi BPi-R3
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=bananapi_bpi-r3-mini
+ UBOOT_CONFIG:=mt7986a_bpi-r3-mini-emmc
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=emmc
+ BL2_SOC:=mt7986
+ BL2_DDRTYPE:=ddr4
+ DEPENDS:=+trusted-firmware-a-mt7986-emmc-ddr4
+endef
+
+define U-Boot/mt7986_bananapi_bpi-r3-mini-snand
+ NAME:=BananaPi BPi-R3
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=bananapi_bpi-r3-mini
+ UBOOT_CONFIG:=mt7986a_bpi-r3-mini-snand
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=spim-nand-ubi
+ BL2_SOC:=mt7986
+ BL2_DDRTYPE:=ddr4
+ DEPENDS:=+trusted-firmware-a-mt7986-spim-nand-ubi-ddr4
+endef
+
+define U-Boot/mt7986_glinet_gl-mt6000
+ NAME:=GL.iNet GL-MT6000
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=glinet_gl-mt6000
+ UBOOT_CONFIG:=mt7986a_glinet_gl-mt6000
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=emmc
+ BL2_SOC:=mt7986
+ BL2_DDRTYPE:=ddr4
+ DEPENDS:=+trusted-firmware-a-mt7986-emmc-ddr4
+endef
+
+define U-Boot/mt7986_jdcloud_re-cp-03
+ NAME:=JDCloud RE-CP-03
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=jdcloud_re-cp-03
+ UBOOT_CONFIG:=mt7986a_jdcloud_re-cp-03
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=emmc
+ BL2_SOC:=mt7986
+ BL2_DDRTYPE:=ddr4
+ DEPENDS:=+trusted-firmware-a-mt7986-emmc-ddr4
+endef
+
+define U-Boot/mt7986_tplink_tl-xdr4288
+ NAME:=TP-LINK TL-XDR4288
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=tplink_tl-xdr4288
+ UBOOT_CONFIG:=mt7986_tplink_tl-xdr4288
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=spim-nand
+ BL2_SOC:=mt7986
+ BL2_DDRTYPE:=ddr3
+ DEPENDS:=+trusted-firmware-a-mt7986-spim-nand-ddr3
+endef
+
+define U-Boot/mt7986_tplink_tl-xdr6086
+ NAME:=TP-LINK TL-XDR6086
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=tplink_tl-xdr6086
+ UBOOT_CONFIG:=mt7986_tplink_tl-xdr6086
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=spim-nand
+ BL2_SOC:=mt7986
+ BL2_DDRTYPE:=ddr3
+ DEPENDS:=+trusted-firmware-a-mt7986-spim-nand-ddr3
+endef
+
+define U-Boot/mt7986_tplink_tl-xdr6088
+ NAME:=TP-LINK TL-XDR6088
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=tplink_tl-xdr6088
+ UBOOT_CONFIG:=mt7986_tplink_tl-xdr6088
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=spim-nand
+ BL2_SOC:=mt7986
+ BL2_DDRTYPE:=ddr3
+ DEPENDS:=+trusted-firmware-a-mt7986-spim-nand-ddr3
+endef
+
+define U-Boot/mt7986_xiaomi_redmi-router-ax6000
+ NAME:=Xiaomi Redmi AX6000
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=xiaomi_redmi-router-ax6000-ubootmod
+ UBOOT_CONFIG:=mt7986_xiaomi_redmi-ax6000
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=spim-nand
+ BL2_SOC:=mt7986
+ BL2_DDRTYPE:=ddr4
+ DEPENDS:=+trusted-firmware-a-mt7986-spim-nand-ddr4
+endef
+
+define U-Boot/mt7986_zyxel_ex5601-t0
+ NAME:=Zyxel EX5601-T0
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=zyxel_ex5601-t0-ubootmod
+ UBOOT_CONFIG:=mt7986_zyxel_ex5601-t0
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=spim-nand-4k
+ BL2_SOC:=mt7986
+ BL2_DDRTYPE:=ddr4
+ DEPENDS:=+trusted-firmware-a-mt7986-spim-nand-4k-ddr4
+endef
+
+define U-Boot/mt7988_bananapi_bpi-r4-emmc
+ NAME:=BananaPi BPi-R4
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=bananapi_bpi-r4
+ UBOOT_CONFIG:=mt7988a_bananapi_bpi-r4-emmc
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=emmc
+ BL2_SOC:=mt7988
+ BL2_DDRTYPE:=comb
+ DEPENDS:=+trusted-firmware-a-mt7988-emmc-comb
+endef
+
+define U-Boot/mt7988_bananapi_bpi-r4-sdmmc
+ NAME:=BananaPi BPi-R4
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=bananapi_bpi-r4
+ UBOOT_CONFIG:=mt7988a_bananapi_bpi-r4-sdmmc
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=sdmmc
+ BL2_SOC:=mt7988
+ BL2_DDRTYPE:=comb
+ DEPENDS:=+trusted-firmware-a-mt7988-sdmmc-comb
+endef
+
+define U-Boot/mt7988_bananapi_bpi-r4-snand
+ NAME:=BananaPi BPi-R4
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=bananapi_bpi-r4
+ UBOOT_CONFIG:=mt7988a_bananapi_bpi-r4-snand
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=spim-nand-ubi
+ BL2_SOC:=mt7988
+ BL2_DDRTYPE:=comb
+ DEPENDS:=+trusted-firmware-a-mt7988-spim-nand-ubi-comb
+endef
+
+define U-Boot/mt7988_rfb-spim-nand
+ NAME:=MT7988 Reference Board
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=mediatek_mt7988a-rfb
+ UBOOT_CONFIG:=mt7988_rfb
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=spim-nand
+ BL2_SOC:=mt7988
+ BL2_DDRTYPE:=comb
+ DEPENDS:=+trusted-firmware-a-mt7988-spim-nand-comb
+endef
+
+define U-Boot/mt7988_rfb-snand
+ NAME:=MT7988 Reference Board
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=mediatek_mt7988a-rfb
+ UBOOT_CONFIG:=mt7988_rfb
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=snand
+ BL2_SOC:=mt7988
+ BL2_DDRTYPE:=comb
+ DEPENDS:=+trusted-firmware-a-mt7988-snand-comb
+endef
+
+define U-Boot/mt7988_rfb-nor
+ NAME:=MT7988 Reference Board
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=mediatek_mt7988a-rfb
+ UBOOT_CONFIG:=mt7988_rfb
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=nor
+ BL2_SOC:=mt7988
+ BL2_DDRTYPE:=comb
+ DEPENDS:=+trusted-firmware-a-mt7988-nor-comb
+ FIP_COMPRESS:=1
+endef
+
+define U-Boot/mt7988_rfb-emmc
+ NAME:=MT7988 Reference Board
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=mediatek_mt7988a-rfb
+ UBOOT_CONFIG:=mt7988_rfb
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=emmc
+ BL2_SOC:=mt7988
+ BL2_DDRTYPE:=comb
+ DEPENDS:=+trusted-firmware-a-mt7988-emmc-comb
+endef
+
+define U-Boot/mt7988_rfb-sd
+ NAME:=MT7988 Reference Board
+ BUILD_SUBTARGET:=filogic
+ BUILD_DEVICES:=mediatek_mt7988a-rfb
+ UBOOT_CONFIG:=mt7988_sd_rfb
+ UBOOT_IMAGE:=u-boot.fip
+ BL2_BOOTDEV:=sdmmc
+ BL2_SOC:=mt7988
+ BL2_DDRTYPE:=comb
+ DEPENDS:=+trusted-firmware-a-mt7988-sdmmc-comb
+endef
+
UBOOT_TARGETS := \
+ mt7620_mt7530_rfb \
+ mt7620_rfb \
+ mt7621_nand_rfb \
+ mt7621_rfb \
+ mt7621_zbtlink_zbt-wg3526-16m \
mt7622_bananapi_bpi-r64-emmc \
mt7622_bananapi_bpi-r64-sdmmc \
mt7622_bananapi_bpi-r64-snand \
mt7622_linksys_e8450 \
mt7622_rfb1 \
- mt7622_ubnt_unifi-6-lr \
+ mt7622_ubnt_unifi-6-lr-v1 \
+ mt7622_ubnt_unifi-6-lr-v2 \
+ mt7622_ubnt_unifi-6-lr-v3 \
mt7623n_bpir2 \
mt7623a_unielec_u7623 \
- mt7629_rfb
+ mt7628_rfb \
+ mt7628_ravpower_rp-wd009 \
+ mt7629_rfb \
+ mt7981_cmcc_rax3000m-emmc \
+ mt7981_cmcc_rax3000m-nand \
+ mt7981_h3c_magic-nx30-pro \
+ mt7981_jcg_q30-pro \
+ mt7981_rfb-spim-nand \
+ mt7981_rfb-emmc \
+ mt7981_rfb-nor \
+ mt7981_rfb-sd \
+ mt7981_rfb-snfi \
+ mt7981_qihoo_360t7 \
+ mt7981_xiaomi_mi-router-ax3000t \
+ mt7981_xiaomi_mi-router-wr30u \
+ mt7986_bananapi_bpi-r3-emmc \
+ mt7986_bananapi_bpi-r3-sdmmc \
+ mt7986_bananapi_bpi-r3-snand \
+ mt7986_bananapi_bpi-r3-nor \
+ mt7986_bananapi_bpi-r3-mini-emmc \
+ mt7986_bananapi_bpi-r3-mini-snand \
+ mt7986_glinet_gl-mt6000 \
+ mt7986_jdcloud_re-cp-03 \
+ mt7986_tplink_tl-xdr4288 \
+ mt7986_tplink_tl-xdr6086 \
+ mt7986_tplink_tl-xdr6088 \
+ mt7986_xiaomi_redmi-router-ax6000 \
+ mt7986_zyxel_ex5601-t0 \
+ mt7986_rfb \
+ mt7988_bananapi_bpi-r4-emmc \
+ mt7988_bananapi_bpi-r4-sdmmc \
+ mt7988_bananapi_bpi-r4-snand \
+ mt7988_rfb-spim-nand \
+ mt7988_rfb-snand \
+ mt7988_rfb-nor \
+ mt7988_rfb-emmc \
+ mt7988_rfb-sd
+ifdef CONFIG_TARGET_mediatek
UBOOT_MAKE_FLAGS += $(UBOOT_IMAGE:.fip=.bin)
-
-Build/Exports:=$(Host/Exports)
+endif
define Build/fip-image
+ $(if $(FIP_COMPRESS),\
+ xz -f -e -k -9 -C crc32 $(STAGING_DIR_IMAGE)/$(if $(BL2_SOC),$(BL2_SOC),$(BUILD_SUBTARGET))-$(BL2_BOOTDEV)-$(if $(BL2_DDRTYPE),$(BL2_DDRTYPE)-)$(if $(BL2_DDRBLOB),$(BL2_DDRBLOB)ddr-)bl31.bin ;\
+ xz -f -e -k -9 -C crc32 $(PKG_BUILD_DIR)/u-boot.bin \
+ )
$(STAGING_DIR_HOST)/bin/fiptool create \
- --soc-fw $(STAGING_DIR_IMAGE)/$(BUILD_SUBTARGET)-$(BL2_BOOTDEV)-$(BL2_DDRBLOB)ddr-bl31.bin \
- --nt-fw $(PKG_BUILD_DIR)/u-boot.bin \
+ --soc-fw $(STAGING_DIR_IMAGE)/$(if $(BL2_SOC),$(BL2_SOC),$(BUILD_SUBTARGET))-$(BL2_BOOTDEV)-$(if $(BL2_DDRTYPE),$(BL2_DDRTYPE)-)$(if $(BL2_DDRBLOB),$(BL2_DDRBLOB)ddr-)bl31.bin$(if $(FIP_COMPRESS),.xz) \
+ --nt-fw $(PKG_BUILD_DIR)/u-boot.bin$(if $(FIP_COMPRESS),.xz) \
$(PKG_BUILD_DIR)/u-boot.fip
endef
+ifdef CONFIG_TARGET_ramips_mt7621
+define Build/Prepare
+ $(call Build/Prepare/Default)
+ifdef CONFIG_DEBUG
+ $(CP) $(DL_DIR)/mt7621_stage_sram.bin $(PKG_BUILD_DIR)/
+else
+ $(CP) $(DL_DIR)/mt7621_stage_sram_noprint.bin $(PKG_BUILD_DIR)/mt7621_stage_sram.bin
+endif
+endef
+endif
+
+define Build/Configure
+ $(call Build/Configure/U-Boot)
+ sed -i 's/CONFIG_TOOLS_LIBCRYPTO=y/# CONFIG_TOOLS_LIBCRYPTO is not set/' $(PKG_BUILD_DIR)/.config
+endef
+
define Build/Compile
$(call Build/Compile/U-Boot)
-ifeq ($(UBOOT_IMAGE),u-boot.fip))
+ifeq ($(UBOOT_IMAGE),u-boot.fip)
$(call Build/fip-image)
endif
endef
# don't stage files to bindir, let target/linux/mediatek/image/*.mk do that
+ifdef CONFIG_TARGET_mediatek
define Package/u-boot/install
endef
+endif
define Build/InstallDev
$(INSTALL_DIR) $(STAGING_DIR_IMAGE)
diff --git a/package/boot/uboot-mediatek/patches/000-mtk-01-Revert-clk-Add-debugging-for-return-values.patch b/package/boot/uboot-mediatek/patches/000-mtk-01-Revert-clk-Add-debugging-for-return-values.patch
deleted file mode 100644
index c398ae4ab7c..00000000000
--- a/package/boot/uboot-mediatek/patches/000-mtk-01-Revert-clk-Add-debugging-for-return-values.patch
+++ /dev/null
@@ -1,69 +0,0 @@
-From 5efb7855a9d33ac897d6e2a7117e4e3d35d433a5 Mon Sep 17 00:00:00 2001
-From: Daniel Golle <daniel@makrotopia.org>
-Date: Thu, 11 Mar 2021 10:28:53 +0000
-Subject: [PATCH 01/21] Revert "clk: Add debugging for return values"
-
-This reverts commit 5c5992cb90cf9ca4d51e38d9a95a13c293904df5.
----
- drivers/clk/clk-uclass.c | 16 +++++-----------
- 1 file changed, 5 insertions(+), 11 deletions(-)
-
---- a/drivers/clk/clk-uclass.c
-+++ b/drivers/clk/clk-uclass.c
-@@ -84,7 +84,7 @@ static int clk_get_by_index_tail(int ret
- if (ret) {
- debug("%s: uclass_get_device_by_of_offset failed: err=%d\n",
- __func__, ret);
-- return log_msg_ret("get", ret);
-+ return ret;
- }
-
- clk->dev = dev_clk;
-@@ -97,15 +97,14 @@ static int clk_get_by_index_tail(int ret
- ret = clk_of_xlate_default(clk, args);
- if (ret) {
- debug("of_xlate() failed: %d\n", ret);
-- return log_msg_ret("xlate", ret);
-+ return ret;
- }
-
- return clk_request(dev_clk, clk);
- err:
- debug("%s: Node '%s', property '%s', failed to request CLK index %d: %d\n",
- __func__, ofnode_get_name(node), list_name, index, ret);
--
-- return log_msg_ret("prop", ret);
-+ return ret;
- }
-
- static int clk_get_by_indexed_prop(struct udevice *dev, const char *prop_name,
-@@ -124,7 +123,7 @@ static int clk_get_by_indexed_prop(struc
- if (ret) {
- debug("%s: fdtdec_parse_phandle_with_args failed: err=%d\n",
- __func__, ret);
-- return log_ret(ret);
-+ return ret;
- }
-
-
-@@ -472,7 +471,6 @@ int clk_free(struct clk *clk)
- ulong clk_get_rate(struct clk *clk)
- {
- const struct clk_ops *ops;
-- int ret;
-
- debug("%s(clk=%p)\n", __func__, clk);
- if (!clk_valid(clk))
-@@ -482,11 +480,7 @@ ulong clk_get_rate(struct clk *clk)
- if (!ops->get_rate)
- return -ENOSYS;
-
-- ret = ops->get_rate(clk);
-- if (ret)
-- return log_ret(ret);
--
-- return 0;
-+ return ops->get_rate(clk);
- }
-
- struct clk *clk_get_parent(struct clk *clk)
diff --git a/package/boot/uboot-mediatek/patches/000-mtk-03-pinctrl-mediatek-fix-wrong-assignment-in-mtk_get_pin.patch b/package/boot/uboot-mediatek/patches/000-mtk-03-pinctrl-mediatek-fix-wrong-assignment-in-mtk_get_pin.patch
deleted file mode 100644
index 3aa6b6105f2..00000000000
--- a/package/boot/uboot-mediatek/patches/000-mtk-03-pinctrl-mediatek-fix-wrong-assignment-in-mtk_get_pin.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From 6f18e581a7e98db3675b4c111701263647b20781 Mon Sep 17 00:00:00 2001
-From: Sam Shih <sam.shih@mediatek.com>
-Date: Thu, 17 Dec 2020 19:29:56 +0800
-Subject: [PATCH 03/21] pinctrl: mediatek: fix wrong assignment in
- mtk_get_pin_name
-
-This is a bug fix for mtk pinctrl common part. Appearently pins should be
-used instead of grps in mtk_get_pin_name().
-
-Signed-off-by: Sam Shih <sam.shih@mediatek.com>
----
- drivers/pinctrl/mediatek/pinctrl-mtk-common.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
-+++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
-@@ -219,7 +219,7 @@ static const char *mtk_get_pin_name(stru
- {
- struct mtk_pinctrl_priv *priv = dev_get_priv(dev);
-
-- if (!priv->soc->grps[selector].name)
-+ if (!priv->soc->pins[selector].name)
- return mtk_pinctrl_dummy_name;
-
- return priv->soc->pins[selector].name;
diff --git a/package/boot/uboot-mediatek/patches/000-mtk-04-pinctrl-mediatek-add-get_pin_muxing-ops-for-mediatek.patch b/package/boot/uboot-mediatek/patches/000-mtk-04-pinctrl-mediatek-add-get_pin_muxing-ops-for-mediatek.patch
deleted file mode 100644
index 89b51f7e819..00000000000
--- a/package/boot/uboot-mediatek/patches/000-mtk-04-pinctrl-mediatek-add-get_pin_muxing-ops-for-mediatek.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From ca73da39ff0c9f599f75d7ccac0196030aa946b9 Mon Sep 17 00:00:00 2001
-From: Sam Shih <sam.shih@mediatek.com>
-Date: Thu, 17 Dec 2020 19:32:48 +0800
-Subject: [PATCH 04/21] pinctrl: mediatek: add get_pin_muxing ops for mediatek
- pinctrl
-
-This patch add get_pin_muxing support for mediatek pinctrl drivers
-
-Signed-off-by: Sam Shih <sam.shih@mediatek.com>
----
- drivers/pinctrl/mediatek/pinctrl-mtk-common.c | 14 ++++++++++++++
- 1 file changed, 14 insertions(+)
-
---- a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
-+++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
-@@ -232,6 +232,19 @@ static int mtk_get_pins_count(struct ude
- return priv->soc->npins;
- }
-
-+static int mtk_get_pin_muxing(struct udevice *dev,
-+ unsigned int selector,
-+ char *buf, int size)
-+{
-+ int val, err;
-+ err = mtk_hw_get_value(dev, selector, PINCTRL_PIN_REG_MODE, &val);
-+ if (err)
-+ return err;
-+
-+ snprintf(buf, size, "Aux Func.%d", val);
-+ return 0;
-+}
-+
- static const char *mtk_get_group_name(struct udevice *dev,
- unsigned int selector)
- {
-@@ -512,6 +525,7 @@ static int mtk_pinconf_group_set(struct
- const struct pinctrl_ops mtk_pinctrl_ops = {
- .get_pins_count = mtk_get_pins_count,
- .get_pin_name = mtk_get_pin_name,
-+ .get_pin_muxing = mtk_get_pin_muxing,
- .get_groups_count = mtk_get_groups_count,
- .get_group_name = mtk_get_group_name,
- .get_functions_count = mtk_get_functions_count,
diff --git a/package/boot/uboot-mediatek/patches/000-mtk-05-pinctrl-mediatek-do-not-probe-gpio-driver-if-not-ena.patch b/package/boot/uboot-mediatek/patches/000-mtk-05-pinctrl-mediatek-do-not-probe-gpio-driver-if-not-ena.patch
deleted file mode 100644
index 7a98e888430..00000000000
--- a/package/boot/uboot-mediatek/patches/000-mtk-05-pinctrl-mediatek-do-not-probe-gpio-driver-if-not-ena.patch
+++ /dev/null
@@ -1,58 +0,0 @@
-From d3fbbef13853a695cdea75a980a3d6bd150a68c1 Mon Sep 17 00:00:00 2001
-From: Weijie Gao <weijie.gao@mediatek.com>
-Date: Mon, 11 Jan 2021 10:17:15 +0800
-Subject: [PATCH 05/21] pinctrl: mediatek: do not probe gpio driver if not
- enabled
-
-The mtk pinctrl driver is a combination driver with support for both
-pinctrl and gpio. When this driver is used in SPL, gpio support may not be
-enabled, and this will result in a compilation error.
-
-To fix this, macros are added to make sure gpio related code will only be
-compiled when gpio support is enabled.
-
-Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
----
- drivers/pinctrl/mediatek/pinctrl-mtk-common.c | 12 ++++++++----
- 1 file changed, 8 insertions(+), 4 deletions(-)
-
---- a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
-+++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
-@@ -540,6 +540,8 @@ const struct pinctrl_ops mtk_pinctrl_ops
- .set_state = pinctrl_generic_set_state,
- };
-
-+#if CONFIG_IS_ENABLED(DM_GPIO) || \
-+ (defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_GPIO_SUPPORT))
- static int mtk_gpio_get(struct udevice *dev, unsigned int off)
- {
- int val, err;
-@@ -647,12 +649,13 @@ static int mtk_gpiochip_register(struct
-
- return 0;
- }
-+#endif
-
- int mtk_pinctrl_common_probe(struct udevice *dev,
- struct mtk_pinctrl_soc *soc)
- {
- struct mtk_pinctrl_priv *priv = dev_get_priv(dev);
-- int ret;
-+ int ret = 0;
-
- priv->base = dev_read_addr_ptr(dev);
- if (!priv->base)
-@@ -660,9 +663,10 @@ int mtk_pinctrl_common_probe(struct udev
-
- priv->soc = soc;
-
-+#if CONFIG_IS_ENABLED(DM_GPIO) || \
-+ (defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_GPIO_SUPPORT))
- ret = mtk_gpiochip_register(dev);
-- if (ret)
-- return ret;
-+#endif
-
-- return 0;
-+ return ret;
- }
diff --git a/package/boot/uboot-mediatek/patches/000-mtk-06-pinctrl-mt7629-add-jtag-function-and-pin-group.patch b/package/boot/uboot-mediatek/patches/000-mtk-06-pinctrl-mt7629-add-jtag-function-and-pin-group.patch
deleted file mode 100644
index f4cc1eb69d3..00000000000
--- a/package/boot/uboot-mediatek/patches/000-mtk-06-pinctrl-mt7629-add-jtag-function-and-pin-group.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-From 1c6d07abf7fc79bf3950dc9ac56e3b566c334d3d Mon Sep 17 00:00:00 2001
-From: Weijie Gao <weijie.gao@mediatek.com>
-Date: Wed, 13 Jan 2021 16:29:23 +0800
-Subject: [PATCH 06/21] pinctrl: mt7629: add jtag function and pin group
-
-The EPHY LEDs of mt7629 can be used as JTAG. This patch adds the jtag pin
-group to the pinctrl driver.
-
-Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
----
- drivers/pinctrl/mediatek/pinctrl-mt7629.c | 7 +++++++
- 1 file changed, 7 insertions(+)
-
---- a/drivers/pinctrl/mediatek/pinctrl-mt7629.c
-+++ b/drivers/pinctrl/mediatek/pinctrl-mt7629.c
-@@ -201,6 +201,10 @@ static int mt7629_wf2g_led_funcs[] = { 1
- static int mt7629_wf5g_led_pins[] = { 18, };
- static int mt7629_wf5g_led_funcs[] = { 1, };
-
-+/* LED for EPHY used as JTAG */
-+static int mt7629_ephy_leds_jtag_pins[] = { 12, 13, 14, 15, 16, };
-+static int mt7629_ephy_leds_jtag_funcs[] = { 7, 7, 7, 7, 7, };
-+
- /* Watchdog */
- static int mt7629_watchdog_pins[] = { 11, };
- static int mt7629_watchdog_funcs[] = { 1, };
-@@ -297,6 +301,7 @@ static const struct mtk_group_desc mt762
- PINCTRL_PIN_GROUP("ephy_led2", mt7629_ephy_led2),
- PINCTRL_PIN_GROUP("ephy_led3", mt7629_ephy_led3),
- PINCTRL_PIN_GROUP("ephy_led4", mt7629_ephy_led4),
-+ PINCTRL_PIN_GROUP("ephy_leds_jtag", mt7629_ephy_leds_jtag),
- PINCTRL_PIN_GROUP("wf2g_led", mt7629_wf2g_led),
- PINCTRL_PIN_GROUP("wf5g_led", mt7629_wf5g_led),
- PINCTRL_PIN_GROUP("watchdog", mt7629_watchdog),
-@@ -364,6 +369,7 @@ static const char *const mt7629_uart_gro
- static const char *const mt7629_wdt_groups[] = { "watchdog", };
- static const char *const mt7629_wifi_groups[] = { "wf0_5g", "wf0_2g", };
- static const char *const mt7629_flash_groups[] = { "snfi", "spi_nor" };
-+static const char *const mt7629_jtag_groups[] = { "ephy_leds_jtag" };
-
- static const struct mtk_function_desc mt7629_functions[] = {
- {"eth", mt7629_ethernet_groups, ARRAY_SIZE(mt7629_ethernet_groups)},
-@@ -376,6 +382,7 @@ static const struct mtk_function_desc mt
- {"watchdog", mt7629_wdt_groups, ARRAY_SIZE(mt7629_wdt_groups)},
- {"wifi", mt7629_wifi_groups, ARRAY_SIZE(mt7629_wifi_groups)},
- {"flash", mt7629_flash_groups, ARRAY_SIZE(mt7629_flash_groups)},
-+ {"jtag", mt7629_jtag_groups, ARRAY_SIZE(mt7629_jtag_groups)},
- };
-
- static struct mtk_pinctrl_soc mt7629_data = {
diff --git a/package/boot/uboot-mediatek/patches/000-mtk-07-configs-mt7622-use-ARMv8-Generic-Timer-instead-of-mt.patch b/package/boot/uboot-mediatek/patches/000-mtk-07-configs-mt7622-use-ARMv8-Generic-Timer-instead-of-mt.patch
deleted file mode 100644
index 060c9aadbf7..00000000000
--- a/package/boot/uboot-mediatek/patches/000-mtk-07-configs-mt7622-use-ARMv8-Generic-Timer-instead-of-mt.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From c47a5b927787a463eff8f67339d91e60fe0381c4 Mon Sep 17 00:00:00 2001
-From: Weijie Gao <weijie.gao@mediatek.com>
-Date: Tue, 2 Mar 2021 15:02:50 +0800
-Subject: [PATCH 07/21] configs: mt7622: use ARMv8 Generic Timer instead of
- mtk_timer
-
-It's better to use the generic timer which is correctly initialized by
-the ATF. The generic timer has higher resolution than the mtk_timer.
-
-Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
----
- configs/mt7622_rfb_defconfig | 2 --
- 1 file changed, 2 deletions(-)
-
---- a/configs/mt7622_rfb_defconfig
-+++ b/configs/mt7622_rfb_defconfig
-@@ -51,8 +51,6 @@ CONFIG_SPI=y
- CONFIG_DM_SPI=y
- CONFIG_MTK_SNOR=y
- CONFIG_SYSRESET_WATCHDOG=y
--CONFIG_TIMER=y
--CONFIG_MTK_TIMER=y
- CONFIG_WDT_MTK=y
- CONFIG_LZO=y
- CONFIG_HEXDUMP=y
diff --git a/package/boot/uboot-mediatek/patches/000-mtk-08-dts-mt7629-enable-JTAG-pins-by-default.patch b/package/boot/uboot-mediatek/patches/000-mtk-08-dts-mt7629-enable-JTAG-pins-by-default.patch
deleted file mode 100644
index f9f783ef375..00000000000
--- a/package/boot/uboot-mediatek/patches/000-mtk-08-dts-mt7629-enable-JTAG-pins-by-default.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-From 4bee3f9e285007ccf77ca9916fff3d93fc4d8a80 Mon Sep 17 00:00:00 2001
-From: Weijie Gao <weijie.gao@mediatek.com>
-Date: Tue, 2 Mar 2021 15:43:27 +0800
-Subject: [PATCH 08/21] dts: mt7629: enable JTAG pins by default
-
-The EPHY LEDs belongs to the built-in FE switch of MT7629, which is barely
-used. These LED pins on reference boards are used as JTAG socket. So it's
-a good idea to change the default state to JTAG, and this will make it
-convenience for debugging.
-
-Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
----
- arch/arm/dts/mt7629-rfb.dts | 10 ++++++++++
- arch/arm/dts/mt7629.dtsi | 6 ++++++
- 2 files changed, 16 insertions(+)
-
---- a/arch/arm/dts/mt7629-rfb.dts
-+++ b/arch/arm/dts/mt7629-rfb.dts
-@@ -36,6 +36,16 @@
- };
-
- &pinctrl {
-+ state_default: pinmux_conf {
-+ u-boot,dm-pre-reloc;
-+
-+ mux {
-+ function = "jtag";
-+ groups = "ephy_leds_jtag";
-+ u-boot,dm-pre-reloc;
-+ };
-+ };
-+
- snfi_pins: snfi-pins {
- mux {
- function = "flash";
---- a/arch/arm/dts/mt7629.dtsi
-+++ b/arch/arm/dts/mt7629.dtsi
-@@ -152,6 +152,12 @@
- compatible = "mediatek,mt7629-pinctrl";
- reg = <0x10217000 0x8000>;
-
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&state_default>;
-+
-+ state_default: pinmux_conf {
-+ };
-+
- gpio: gpio-controller {
- gpio-controller;
- #gpio-cells = <2>;
diff --git a/package/boot/uboot-mediatek/patches/000-mtk-09-board-mediatek-add-more-network-configurations.patch b/package/boot/uboot-mediatek/patches/000-mtk-09-board-mediatek-add-more-network-configurations.patch
deleted file mode 100644
index 56a40ca0e12..00000000000
--- a/package/boot/uboot-mediatek/patches/000-mtk-09-board-mediatek-add-more-network-configurations.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From f3f320af7078a8c5647d870a31c1d3695dacd7cf Mon Sep 17 00:00:00 2001
-From: Weijie Gao <weijie.gao@mediatek.com>
-Date: Tue, 2 Mar 2021 15:47:45 +0800
-Subject: [PATCH 09/21] board: mediatek: add more network configurations
-
-Make the network configurations uniform for mediatek boards
-
-Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
----
- include/configs/mt7622.h | 3 ++-
- include/configs/mt7623.h | 1 +
- include/configs/mt7629.h | 1 +
- 3 files changed, 4 insertions(+), 1 deletion(-)
-
---- a/include/configs/mt7622.h
-+++ b/include/configs/mt7622.h
-@@ -36,6 +36,7 @@
-
- /* Ethernet */
- #define CONFIG_IPADDR 192.168.1.1
--#define CONFIG_SERVERIP 192.168.1.3
-+#define CONFIG_SERVERIP 192.168.1.2
-+#define CONFIG_NETMASK 255.255.255.0
-
- #endif
---- a/include/configs/mt7623.h
-+++ b/include/configs/mt7623.h
-@@ -54,6 +54,7 @@
- /* Ethernet */
- #define CONFIG_IPADDR 192.168.1.1
- #define CONFIG_SERVERIP 192.168.1.2
-+#define CONFIG_NETMASK 255.255.255.0
-
- #ifdef CONFIG_DISTRO_DEFAULTS
-
---- a/include/configs/mt7629.h
-+++ b/include/configs/mt7629.h
-@@ -52,5 +52,6 @@
- /* Ethernet */
- #define CONFIG_IPADDR 192.168.1.1
- #define CONFIG_SERVERIP 192.168.1.2
-+#define CONFIG_NETMASK 255.255.255.0
-
- #endif
diff --git a/package/boot/uboot-mediatek/patches/000-mtk-10-mmc-mtk-sd-increase-the-minimum-bus-frequency.patch b/package/boot/uboot-mediatek/patches/000-mtk-10-mmc-mtk-sd-increase-the-minimum-bus-frequency.patch
deleted file mode 100644
index c568ab99e1a..00000000000
--- a/package/boot/uboot-mediatek/patches/000-mtk-10-mmc-mtk-sd-increase-the-minimum-bus-frequency.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From ed880b7572e1135e3bd8382d4670a375f7d9c91b Mon Sep 17 00:00:00 2001
-From: Weijie Gao <weijie.gao@mediatek.com>
-Date: Tue, 2 Mar 2021 15:56:17 +0800
-Subject: [PATCH 10/21] mmc: mtk-sd: increase the minimum bus frequency
-
-With a 48MHz input clock, the lowest bus frequency can be as low as
-48000000 / (4 * 4095) = 2930Hz. Such an extremely low frequency will cause
-the mmc framework take seconds to finish the initialization.
-
-Limiting the minimum bus frequency to a slightly higher value can solve the
-issue without any side effects.
-
-Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
----
- drivers/mmc/mtk-sd.c | 5 +++++
- 1 file changed, 5 insertions(+)
-
---- a/drivers/mmc/mtk-sd.c
-+++ b/drivers/mmc/mtk-sd.c
-@@ -232,6 +232,8 @@
-
- #define SCLK_CYCLES_SHIFT 20
-
-+#define MIN_BUS_CLK 260000
-+
- #define CMD_INTS_MASK \
- (MSDC_INT_CMDRDY | MSDC_INT_RSPCRCERR | MSDC_INT_CMDTMO)
-
-@@ -1639,6 +1641,9 @@ static int msdc_drv_probe(struct udevice
- else
- cfg->f_min = host->src_clk_freq / (4 * 4095);
-
-+ if (cfg->f_min < MIN_BUS_CLK)
-+ cfg->f_min = MIN_BUS_CLK;
-+
- if (cfg->f_max < cfg->f_min || cfg->f_max > host->src_clk_freq)
- cfg->f_max = host->src_clk_freq;
-
diff --git a/package/boot/uboot-mediatek/patches/000-mtk-11-serial-serial-mtk-rewrite-the-setbrg-function.patch b/package/boot/uboot-mediatek/patches/000-mtk-11-serial-serial-mtk-rewrite-the-setbrg-function.patch
deleted file mode 100644
index 2ce77333141..00000000000
--- a/package/boot/uboot-mediatek/patches/000-mtk-11-serial-serial-mtk-rewrite-the-setbrg-function.patch
+++ /dev/null
@@ -1,141 +0,0 @@
-From d8bde59186dafdea5bbe8d29d3a6ae7cac98e9d0 Mon Sep 17 00:00:00 2001
-From: Weijie Gao <weijie.gao@mediatek.com>
-Date: Mon, 25 Jan 2021 11:19:08 +0800
-Subject: [PATCH 11/21] serial: serial-mtk: rewrite the setbrg function
-
-Currently the setbrg logic of serial-mtk is messy, and should be rewritten.
-Also an option is added to make it possible to use highspeed=3 mode for all
-bauds.
-
-The new logic is:
-1. If baud clock > 12MHz
- a) If baud <= 115200, highspeed=0 mode will be used (ns16550 compatible)
- b) If baud <= 576000, highspeed=2 mode will be used
- c) any baud > 576000, highspeed=3 mode will be used
-2. If baud clock <= 12MHz
- Always uses highspeed=3 mode
- a) If baud <= 115200, calculates the divisor using DIV_ROUND_CLOSEST
- b) any baud > 115200, the same as 1. c)
-
-Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
----
- drivers/serial/serial_mtk.c | 74 +++++++++++++++++--------------------
- 1 file changed, 33 insertions(+), 41 deletions(-)
-
---- a/drivers/serial/serial_mtk.c
-+++ b/drivers/serial/serial_mtk.c
-@@ -73,74 +73,64 @@ struct mtk_serial_regs {
- struct mtk_serial_priv {
- struct mtk_serial_regs __iomem *regs;
- u32 clock;
-+ bool force_highspeed;
- };
-
- static void _mtk_serial_setbrg(struct mtk_serial_priv *priv, int baud)
- {
-- bool support_clk12m_baud115200;
-- u32 quot, samplecount, realbaud;
-+ u32 quot, realbaud, samplecount = 1;
-
-- if ((baud <= 115200) && (priv->clock == 12000000))
-- support_clk12m_baud115200 = true;
-- else
-- support_clk12m_baud115200 = false;
-+ /* Special case for low baud clock */
-+ if ((baud <= 115200) && (priv->clock == 12000000)) {
-+ writel(3, &priv->regs->highspeed);
-+
-+ quot = DIV_ROUND_CLOSEST(priv->clock, 256 * baud);
-+ if (quot == 0)
-+ quot = 1;
-+
-+ samplecount = DIV_ROUND_CLOSEST(priv->clock, quot * baud);
-+
-+ realbaud = priv->clock / samplecount / quot;
-+ if ((realbaud > BAUD_ALLOW_MAX(baud)) ||
-+ (realbaud < BAUD_ALLOW_MIX(baud))) {
-+ pr_info("baud %d can't be handled\n", baud);
-+ }
-+
-+ goto set_baud;
-+ }
-+
-+ if (priv->force_highspeed)
-+ goto use_hs3;
-
- if (baud <= 115200) {
- writel(0, &priv->regs->highspeed);
- quot = DIV_ROUND_CLOSEST(priv->clock, 16 * baud);
--
-- if (support_clk12m_baud115200) {
-- writel(3, &priv->regs->highspeed);
-- quot = DIV_ROUND_CLOSEST(priv->clock, 256 * baud);
-- if (quot == 0)
-- quot = 1;
--
-- samplecount = DIV_ROUND_CLOSEST(priv->clock,
-- quot * baud);
-- if (samplecount != 0) {
-- realbaud = priv->clock / samplecount / quot;
-- if ((realbaud > BAUD_ALLOW_MAX(baud)) ||
-- (realbaud < BAUD_ALLOW_MIX(baud))) {
-- pr_info("baud %d can't be handled\n",
-- baud);
-- }
-- } else {
-- pr_info("samplecount is 0\n");
-- }
-- }
- } else if (baud <= 576000) {
- writel(2, &priv->regs->highspeed);
-
- /* Set to next lower baudrate supported */
- if ((baud == 500000) || (baud == 576000))
- baud = 460800;
-+
- quot = DIV_ROUND_UP(priv->clock, 4 * baud);
- } else {
-+use_hs3:
- writel(3, &priv->regs->highspeed);
-+
- quot = DIV_ROUND_UP(priv->clock, 256 * baud);
-+ samplecount = DIV_ROUND_CLOSEST(priv->clock, quot * baud);
- }
-
-+set_baud:
- /* set divisor */
- writel(UART_LCR_WLS_8 | UART_LCR_DLAB, &priv->regs->lcr);
- writel(quot & 0xff, &priv->regs->dll);
- writel((quot >> 8) & 0xff, &priv->regs->dlm);
- writel(UART_LCR_WLS_8, &priv->regs->lcr);
-
-- if (baud > 460800) {
-- u32 tmp;
--
-- tmp = DIV_ROUND_CLOSEST(priv->clock, quot * baud);
-- writel(tmp - 1, &priv->regs->sample_count);
-- writel((tmp - 2) >> 1, &priv->regs->sample_point);
-- } else {
-- writel(0, &priv->regs->sample_count);
-- writel(0xff, &priv->regs->sample_point);
-- }
--
-- if (support_clk12m_baud115200) {
-- writel(samplecount - 1, &priv->regs->sample_count);
-- writel((samplecount - 2) >> 1, &priv->regs->sample_point);
-- }
-+ /* set highspeed mode sample count & point */
-+ writel(samplecount - 1, &priv->regs->sample_count);
-+ writel((samplecount - 2) >> 1, &priv->regs->sample_point);
- }
-
- static int _mtk_serial_putc(struct mtk_serial_priv *priv, const char ch)
-@@ -248,6 +238,8 @@ static int mtk_serial_of_to_plat(struct
- return -EINVAL;
- }
-
-+ priv->force_highspeed = dev_read_bool(dev, "mediatek,force-highspeed");
-+
- return 0;
- }
-
diff --git a/package/boot/uboot-mediatek/patches/000-mtk-12-board-mt7629-enable-compression-of-u-boot-to-reduce-.patch b/package/boot/uboot-mediatek/patches/000-mtk-12-board-mt7629-enable-compression-of-u-boot-to-reduce-.patch
deleted file mode 100644
index c0dfad03c48..00000000000
--- a/package/boot/uboot-mediatek/patches/000-mtk-12-board-mt7629-enable-compression-of-u-boot-to-reduce-.patch
+++ /dev/null
@@ -1,94 +0,0 @@
-From a80ef99cb308904b82662deb66c5ed7a6ff59928 Mon Sep 17 00:00:00 2001
-From: Weijie Gao <weijie.gao@mediatek.com>
-Date: Wed, 3 Mar 2021 11:13:36 +0800
-Subject: [PATCH 12/21] board: mt7629: enable compression of u-boot to reduce
- the size of final image
-
-This patch makes use of the decompression mechanism implemented for mt7628
-previously to reduce the total image size. Binman will be also removed.
-
-Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
----
- Makefile | 3 +++
- arch/arm/dts/mt7629-rfb-u-boot.dtsi | 18 ------------------
- arch/arm/mach-mediatek/Kconfig | 1 -
- configs/mt7629_rfb_defconfig | 6 ++++++
- 4 files changed, 9 insertions(+), 19 deletions(-)
-
---- a/Makefile
-+++ b/Makefile
-@@ -1666,6 +1666,9 @@ u-boot-elf.lds: arch/u-boot-elf.lds prep
-
- ifeq ($(CONFIG_SPL),y)
- spl/u-boot-spl-mtk.bin: spl/u-boot-spl
-+
-+u-boot-mtk.bin: u-boot-with-spl.bin
-+ $(call if_changed,copy)
- else
- MKIMAGEFLAGS_u-boot-mtk.bin = -T mtk_image \
- -a $(CONFIG_SYS_TEXT_BASE) -e $(CONFIG_SYS_TEXT_BASE) \
---- a/arch/arm/dts/mt7629-rfb-u-boot.dtsi
-+++ b/arch/arm/dts/mt7629-rfb-u-boot.dtsi
-@@ -5,24 +5,6 @@
- * Author: Weijie Gao <weijie.gao@mediatek.com>
- */
-
--#include <config.h>
--/ {
-- binman {
-- filename = "u-boot-mtk.bin";
-- pad-byte = <0xff>;
--
--#ifdef CONFIG_SPL
-- blob {
-- filename = "spl/u-boot-spl-mtk.bin";
-- size = <CONFIG_SPL_PAD_TO>;
-- };
--
-- u-boot-img {
-- };
--#endif
-- };
--};
--
- &infracfg {
- u-boot,dm-pre-reloc;
- };
---- a/arch/arm/mach-mediatek/Kconfig
-+++ b/arch/arm/mach-mediatek/Kconfig
-@@ -36,7 +36,6 @@ config TARGET_MT7629
- bool "MediaTek MT7629 SoC"
- select CPU_V7A
- select SPL
-- select BINMAN
- help
- The MediaTek MT7629 is a ARM-based SoC with a dual-core Cortex-A7
- including DDR3, crypto engine, 3x3 11n/ac Wi-Fi, Gigabit Ethernet,
---- a/configs/mt7629_rfb_defconfig
-+++ b/configs/mt7629_rfb_defconfig
-@@ -10,7 +10,11 @@ CONFIG_SPL_TEXT_BASE=0x201000
- CONFIG_TARGET_MT7629=y
- CONFIG_SPL_SERIAL_SUPPORT=y
- CONFIG_SPL_DRIVERS_MISC_SUPPORT=y
-+CONFIG_SPL_STACK_R_ADDR=0x40800000
-+CONFIG_SPL_PAYLOAD="u-boot-lzma.img"
-+CONFIG_BUILD_TARGET="u-boot-mtk.bin"
- CONFIG_DEFAULT_DEVICE_TREE="mt7629-rfb"
-+CONFIG_SPL_IMAGE="spl/u-boot-spl-mtk.bin"
- CONFIG_FIT=y
- CONFIG_FIT_VERBOSE=y
- CONFIG_BOOTDELAY=3
-@@ -18,6 +22,7 @@ CONFIG_DEFAULT_FDT_FILE="mt7629-rfb"
- CONFIG_SYS_CONSOLE_IS_IN_ENV=y
- # CONFIG_DISPLAY_BOARDINFO is not set
- CONFIG_SPL_SYS_MALLOC_SIMPLE=y
-+CONFIG_SPL_STACK_R=y
- CONFIG_SPL_NOR_SUPPORT=y
- CONFIG_SPL_WATCHDOG_SUPPORT=y
- CONFIG_HUSH_PARSER=y
-@@ -87,4 +92,5 @@ CONFIG_USB_STORAGE=y
- CONFIG_USB_KEYBOARD=y
- CONFIG_WDT_MTK=y
- CONFIG_LZMA=y
-+CONFIG_SPL_LZMA=y
- # CONFIG_EFI_LOADER is not set
diff --git a/package/boot/uboot-mediatek/patches/000-mtk-13-configs-mt7622-enable-debug-uart-for-mt7622_rfb_defc.patch b/package/boot/uboot-mediatek/patches/000-mtk-13-configs-mt7622-enable-debug-uart-for-mt7622_rfb_defc.patch
deleted file mode 100644
index 6b832148b9d..00000000000
--- a/package/boot/uboot-mediatek/patches/000-mtk-13-configs-mt7622-enable-debug-uart-for-mt7622_rfb_defc.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From acd49b1549ff52286aace5e841420aa750325f8b Mon Sep 17 00:00:00 2001
-From: Weijie Gao <weijie.gao@mediatek.com>
-Date: Wed, 3 Mar 2021 10:53:14 +0800
-Subject: [PATCH 13/21] configs: mt7622: enable debug uart for
- mt7622_rfb_defconfig
-
-Enable debug uart for mt7622_rfb_defconfig
-
-Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
----
- configs/mt7622_rfb_defconfig | 3 +++
- 1 file changed, 3 insertions(+)
-
---- a/configs/mt7622_rfb_defconfig
-+++ b/configs/mt7622_rfb_defconfig
-@@ -4,7 +4,10 @@ CONFIG_ARCH_MEDIATEK=y
- CONFIG_SYS_TEXT_BASE=0x41e00000
- CONFIG_SYS_MALLOC_F_LEN=0x4000
- CONFIG_NR_DRAM_BANKS=1
-+CONFIG_DEBUG_UART_BASE=0x11002000
-+CONFIG_DEBUG_UART_CLOCK=25000000
- CONFIG_DEFAULT_DEVICE_TREE="mt7622-rfb"
-+CONFIG_DEBUG_UART=y
- CONFIG_FIT=y
- CONFIG_DEFAULT_FDT_FILE="mt7622-rfb"
- CONFIG_LOGLEVEL=7
diff --git a/package/boot/uboot-mediatek/patches/000-mtk-19-configs-mt7629-remove-unused-options-and-add-dm-comm.patch b/package/boot/uboot-mediatek/patches/000-mtk-19-configs-mt7629-remove-unused-options-and-add-dm-comm.patch
deleted file mode 100644
index fadb274bfdf..00000000000
--- a/package/boot/uboot-mediatek/patches/000-mtk-19-configs-mt7629-remove-unused-options-and-add-dm-comm.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From 2f7aaf3c2c127bd53d5e8bfe39e808fdd6eb99be Mon Sep 17 00:00:00 2001
-From: Weijie Gao <weijie.gao@mediatek.com>
-Date: Wed, 3 Mar 2021 12:12:39 +0800
-Subject: [PATCH 19/21] configs: mt7629: remove unused options and add dm
- command
-
-Remove unused bootm options
-Add dm command
-
-Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
----
- configs/mt7629_rfb_defconfig | 5 +++++
- 1 file changed, 5 insertions(+)
-
---- a/configs/mt7629_rfb_defconfig
-+++ b/configs/mt7629_rfb_defconfig
-@@ -28,9 +28,14 @@ CONFIG_SPL_WATCHDOG_SUPPORT=y
- CONFIG_HUSH_PARSER=y
- CONFIG_SYS_PROMPT="U-Boot> "
- CONFIG_CMD_BOOTMENU=y
-+# CONFIG_BOOTM_NETBSD is not set
-+# CONFIG_BOOTM_PLAN9 is not set
-+# CONFIG_BOOTM_RTEMS is not set
-+# CONFIG_BOOTM_VXWORKS is not set
- # CONFIG_CMD_ELF is not set
- # CONFIG_CMD_XIMG is not set
- CONFIG_CMD_BIND=y
-+CONFIG_CMD_DM=y
- # CONFIG_CMD_FLASH is not set
- CONFIG_CMD_GPIO=y
- CONFIG_CMD_SF_TEST=y
diff --git a/package/boot/uboot-mediatek/patches/000-mtk-20-configs-mt7622-enable-environment-for-mt7622_rfb.patch b/package/boot/uboot-mediatek/patches/000-mtk-20-configs-mt7622-enable-environment-for-mt7622_rfb.patch
index 228c3351ca0..dcbf8b953fa 100644
--- a/package/boot/uboot-mediatek/patches/000-mtk-20-configs-mt7622-enable-environment-for-mt7622_rfb.patch
+++ b/package/boot/uboot-mediatek/patches/000-mtk-20-configs-mt7622-enable-environment-for-mt7622_rfb.patch
@@ -1,7 +1,7 @@
-From e5a71a0eebadfb3d75d8619a8b317eec58b2bca2 Mon Sep 17 00:00:00 2001
+From 93d7086edb0db4b05149dfea21a2a82d8f160944 Mon Sep 17 00:00:00 2001
From: Weijie Gao <weijie.gao@mediatek.com>
Date: Sat, 6 Mar 2021 16:29:33 +0800
-Subject: [PATCH 20/21] configs: mt7622: enable environment for mt7622_rfb
+Subject: [PATCH 10/12] configs: mt7622: enable environment for mt7622_rfb
Enable environment vairables for mt7622_rfb
@@ -12,16 +12,16 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
--- a/configs/mt7622_rfb_defconfig
+++ b/configs/mt7622_rfb_defconfig
-@@ -4,6 +4,8 @@ CONFIG_ARCH_MEDIATEK=y
- CONFIG_SYS_TEXT_BASE=0x41e00000
+@@ -6,6 +6,8 @@ CONFIG_TEXT_BASE=0x41e00000
CONFIG_SYS_MALLOC_F_LEN=0x4000
CONFIG_NR_DRAM_BANKS=1
+ CONFIG_DEFAULT_DEVICE_TREE="mt7622-rfb"
+CONFIG_ENV_SIZE=0x20000
+CONFIG_ENV_OFFSET=0x280000
CONFIG_DEBUG_UART_BASE=0x11002000
CONFIG_DEBUG_UART_CLOCK=25000000
- CONFIG_DEFAULT_DEVICE_TREE="mt7622-rfb"
-@@ -21,6 +23,9 @@ CONFIG_CMD_SF_TEST=y
+ CONFIG_SYS_LOAD_ADDR=0x4007ff28
+@@ -25,6 +27,9 @@ CONFIG_CMD_SF_TEST=y
CONFIG_CMD_PING=y
CONFIG_CMD_SMC=y
CONFIG_ENV_OVERWRITE=y
@@ -30,4 +30,4 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+CONFIG_ENV_SIZE_REDUND=0x40000
CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
CONFIG_NET_RANDOM_ETHADDR=y
- CONFIG_REGMAP=y
+ CONFIG_USE_IPADDR=y
diff --git a/package/boot/uboot-mediatek/patches/001-disk-part_dos.c-Fix-a-variable-typo-in-write_mbr_par.patch b/package/boot/uboot-mediatek/patches/001-disk-part_dos.c-Fix-a-variable-typo-in-write_mbr_par.patch
deleted file mode 100644
index 8432053ea02..00000000000
--- a/package/boot/uboot-mediatek/patches/001-disk-part_dos.c-Fix-a-variable-typo-in-write_mbr_par.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From c7d1b1890880ee64786b92a1b95ba9ecb4694997 Mon Sep 17 00:00:00 2001
-From: Christian Melki <christian.melki@t2data.com>
-Date: Mon, 7 Jun 2021 11:21:15 +0200
-Subject: [PATCH] disk/part_dos.c: Fix a variable typo in
- write_mbr_partitions()
-
-This function is passed *dev not *dev_desc, so pass the right name to
-part_init().
-
-Fixes: f14c5ee5ab8b ("disk: part_dos: update partition table entries after write")
-Signed-off-by: Christian Melki <christian.melki@t2data.com>
----
- disk/part_dos.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/disk/part_dos.c
-+++ b/disk/part_dos.c
-@@ -424,7 +424,7 @@ int write_mbr_partitions(struct blk_desc
- }
-
- /* Update the partition table entries*/
-- part_init(dev_desc);
-+ part_init(dev);
-
- return 0;
- }
diff --git a/package/boot/uboot-mediatek/patches/050-mt7622-enable-pstore.patch b/package/boot/uboot-mediatek/patches/050-mt7622-enable-pstore.patch
index 42d60c3f66c..601e394f5e4 100644
--- a/package/boot/uboot-mediatek/patches/050-mt7622-enable-pstore.patch
+++ b/package/boot/uboot-mediatek/patches/050-mt7622-enable-pstore.patch
@@ -15,7 +15,7 @@
+ ranges;
+
+ /* 64 KiB reserved for ramoops/pstore */
-+ ramoops@0x42ff0000 {
++ ramoops@42ff0000 {
+ compatible = "ramoops";
+ reg = <0 0x42ff0000 0 0x10000>;
+ record-size = <0x1000>;
diff --git a/package/boot/uboot-mediatek/patches/051-mt7986-enable-pstore.patch b/package/boot/uboot-mediatek/patches/051-mt7986-enable-pstore.patch
new file mode 100644
index 00000000000..d6ae7f0f139
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/051-mt7986-enable-pstore.patch
@@ -0,0 +1,38 @@
+--- a/arch/arm/dts/mt7986.dtsi
++++ b/arch/arm/dts/mt7986.dtsi
+@@ -50,6 +50,35 @@
+ };
+ };
+
++ psci {
++ compatible = "arm,psci-0.2";
++ method = "smc";
++ };
++
++ reserved-memory {
++ #address-cells = <2>;
++ #size-cells = <2>;
++ ranges;
++
++ /* 64 KiB reserved for ramoops/pstore */
++ ramoops@42ff0000 {
++ compatible = "ramoops";
++ reg = <0 0x42ff0000 0 0x10000>;
++ record-size = <0x1000>;
++ };
++
++ /* 192 KiB reserved for ARM Trusted Firmware (BL31) */
++ secmon_reserved: secmon@43000000 {
++ reg = <0 0x43000000 0 0x30000>;
++ no-map;
++ };
++
++ wmcpu_emi: wmcpu-reserved@4fc00000 {
++ no-map;
++ reg = <0 0x4fc00000 0 0x00100000>;
++ };
++ };
++
+ dummy_clk: dummy12m {
+ compatible = "fixed-clock";
+ clock-frequency = <12000000>;
diff --git a/package/boot/uboot-mediatek/patches/052-mt7981-enable-pstore.patch b/package/boot/uboot-mediatek/patches/052-mt7981-enable-pstore.patch
new file mode 100644
index 00000000000..9bfea8f7379
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/052-mt7981-enable-pstore.patch
@@ -0,0 +1,38 @@
+--- a/arch/arm/dts/mt7981.dtsi
++++ b/arch/arm/dts/mt7981.dtsi
+@@ -32,6 +32,35 @@
+ };
+ };
+
++ psci {
++ compatible = "arm,psci-0.2";
++ method = "smc";
++ };
++
++ reserved-memory {
++ #address-cells = <2>;
++ #size-cells = <2>;
++ ranges;
++
++ /* 64 KiB reserved for ramoops/pstore */
++ ramoops@42ff0000 {
++ compatible = "ramoops";
++ reg = <0 0x42ff0000 0 0x10000>;
++ record-size = <0x1000>;
++ };
++
++ /* 192 KiB reserved for ARM Trusted Firmware (BL31) */
++ secmon_reserved: secmon@43000000 {
++ reg = <0 0x43000000 0 0x30000>;
++ no-map;
++ };
++
++ wmcpu_emi: wmcpu-reserved@4fc00000 {
++ no-map;
++ reg = <0 0x4fc00000 0 0x00100000>;
++ };
++ };
++
+ gpt_clk: gpt_dummy20m {
+ compatible = "fixed-clock";
+ clock-frequency = <13000000>;
diff --git a/package/boot/uboot-mediatek/patches/000-mtk-14-drivers-mtd-add-support-for-MediaTek-SPI-NAND-flash-.patch b/package/boot/uboot-mediatek/patches/100-02-drivers-mtd-add-support-for-MediaTek-SPI-NAND-flash-.patch
index a01d9e2b177..05138d984e5 100644
--- a/package/boot/uboot-mediatek/patches/000-mtk-14-drivers-mtd-add-support-for-MediaTek-SPI-NAND-flash-.patch
+++ b/package/boot/uboot-mediatek/patches/100-02-drivers-mtd-add-support-for-MediaTek-SPI-NAND-flash-.patch
@@ -1,7 +1,7 @@
-From f22a055a9f589f1ec614045eba3cb0c5fd887feb Mon Sep 17 00:00:00 2001
+From f7704275957852cd4c4632d6da126979ef24b83a Mon Sep 17 00:00:00 2001
From: Weijie Gao <weijie.gao@mediatek.com>
Date: Tue, 2 Mar 2021 16:58:01 +0800
-Subject: [PATCH 14/21] drivers: mtd: add support for MediaTek SPI-NAND flash
+Subject: [PATCH 36/71] drivers: mtd: add support for MediaTek SPI-NAND flash
controller
Add mtd driver for MediaTek SPI-NAND flash controller
@@ -16,15 +16,15 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
drivers/mtd/Makefile | 2 +
drivers/mtd/mtk-snand/Kconfig | 21 +
drivers/mtd/mtk-snand/Makefile | 11 +
- drivers/mtd/mtk-snand/mtk-snand-def.h | 266 ++++
- drivers/mtd/mtk-snand/mtk-snand-ecc.c | 264 ++++
- drivers/mtd/mtk-snand/mtk-snand-ids.c | 511 +++++++
- drivers/mtd/mtk-snand/mtk-snand-mtd.c | 526 ++++++++
+ drivers/mtd/mtk-snand/mtk-snand-def.h | 271 ++++
+ drivers/mtd/mtk-snand/mtk-snand-ecc.c | 411 ++++++
+ drivers/mtd/mtk-snand/mtk-snand-ids.c | 515 +++++++
+ drivers/mtd/mtk-snand/mtk-snand-mtd.c | 535 +++++++
drivers/mtd/mtk-snand/mtk-snand-os.c | 39 +
drivers/mtd/mtk-snand/mtk-snand-os.h | 120 ++
- drivers/mtd/mtk-snand/mtk-snand.c | 1776 +++++++++++++++++++++++++
- drivers/mtd/mtk-snand/mtk-snand.h | 77 ++
- 12 files changed, 3615 insertions(+)
+ drivers/mtd/mtk-snand/mtk-snand.c | 1933 +++++++++++++++++++++++++
+ drivers/mtd/mtk-snand/mtk-snand.h | 77 +
+ 12 files changed, 3937 insertions(+)
create mode 100644 drivers/mtd/mtk-snand/Kconfig
create mode 100644 drivers/mtd/mtk-snand/Makefile
create mode 100644 drivers/mtd/mtk-snand/mtk-snand-def.h
@@ -38,18 +38,18 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
-@@ -108,6 +108,8 @@ config HBMC_AM654
- This is the driver for HyperBus controller on TI's AM65x and
- other SoCs
+@@ -238,6 +238,8 @@ config SYS_MAX_FLASH_BANKS_DETECT
+ to reduce the effective number of flash bank, between 0 and
+ CONFIG_SYS_MAX_FLASH_BANKS
+source "drivers/mtd/mtk-snand/Kconfig"
+
source "drivers/mtd/nand/Kconfig"
- source "drivers/mtd/spi/Kconfig"
+ config SYS_NAND_MAX_OOBFREE
--- a/drivers/mtd/Makefile
+++ b/drivers/mtd/Makefile
-@@ -40,3 +40,5 @@ obj-$(CONFIG_$(SPL_TPL_)SPI_FLASH_SUPPOR
+@@ -39,3 +39,5 @@ obj-$(CONFIG_$(SPL_TPL_)SPI_FLASH_SUPPOR
obj-$(CONFIG_SPL_UBI) += ubispl/
endif
@@ -95,7 +95,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ccflags-y += -DPRIVATE_MTK_SNAND_HEADER
--- /dev/null
+++ b/drivers/mtd/mtk-snand/mtk-snand-def.h
-@@ -0,0 +1,266 @@
+@@ -0,0 +1,271 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/*
+ * Copyright (C) 2020 MediaTek Inc. All Rights Reserved.
@@ -213,6 +213,9 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+
+ const uint8_t *spare_sizes;
+ uint32_t num_spare_size;
++
++ uint16_t latch_lat;
++ uint16_t sample_delay;
+};
+
+enum mtk_ecc_regs {
@@ -272,6 +275,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+
+ uint8_t *page_cache; /* Used by read/write page */
+ uint8_t *buf_cache; /* Used by block bad/markbad & auto_oob */
++ int *sect_bf; /* Used by ECC correction */
+};
+
+enum mtk_snand_log_category {
@@ -290,7 +294,8 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+int mtk_snand_ecc_decoder_start(struct mtk_snand *snf);
+void mtk_snand_ecc_decoder_stop(struct mtk_snand *snf);
+int mtk_ecc_wait_decoder_done(struct mtk_snand *snf);
-+int mtk_ecc_check_decode_error(struct mtk_snand *snf, uint32_t page);
++int mtk_ecc_check_decode_error(struct mtk_snand *snf);
++int mtk_ecc_fixup_empty_sector(struct mtk_snand *snf, uint32_t sect);
+
+int mtk_snand_mac_io(struct mtk_snand *snf, const uint8_t *out, uint32_t outlen,
+ uint8_t *in, uint32_t inlen);
@@ -364,7 +369,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+#endif /* _MTK_SNAND_DEF_H_ */
--- /dev/null
+++ b/drivers/mtd/mtk-snand/mtk-snand-ecc.c
-@@ -0,0 +1,264 @@
+@@ -0,0 +1,411 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/*
+ * Copyright (C) 2020 MediaTek Inc. All Rights Reserved.
@@ -413,6 +418,10 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+
+static const uint8_t mt7622_ecc_caps[] = { 4, 6, 8, 10, 12 };
+
++static const uint8_t mt7981_ecc_caps[] = {
++ 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24
++};
++
+static const uint8_t mt7986_ecc_caps[] = {
+ 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24
+};
@@ -421,6 +430,10 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ [ECC_DECDONE] = 0x11c,
+};
+
++static const uint32_t mt7981_ecc_regs[] = {
++ [ECC_DECDONE] = 0x124,
++};
++
+static const uint32_t mt7986_ecc_regs[] = {
+ [ECC_DECDONE] = 0x124,
+};
@@ -442,6 +455,14 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ .errnum_bits = 5,
+ .errnum_shift = 5,
+ },
++ [SNAND_SOC_MT7981] = {
++ .ecc_caps = mt7981_ecc_caps,
++ .num_ecc_cap = ARRAY_SIZE(mt7981_ecc_caps),
++ .regs = mt7981_ecc_regs,
++ .mode_shift = 5,
++ .errnum_bits = 5,
++ .errnum_shift = 8,
++ },
+ [SNAND_SOC_MT7986] = {
+ .ecc_caps = mt7986_ecc_caps,
+ .num_ecc_cap = ARRAY_SIZE(mt7986_ecc_caps),
@@ -599,7 +620,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ return ret;
+}
+
-+int mtk_ecc_check_decode_error(struct mtk_snand *snf, uint32_t page)
++int mtk_ecc_check_decode_error(struct mtk_snand *snf)
+{
+ uint32_t i, regi, fi, errnum;
+ uint32_t errnum_shift = snf->ecc_soc->errnum_shift;
@@ -612,26 +633,157 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+
+ errnum = ecc_read32(snf, ECC_DECENUM(regi));
+ errnum = (errnum >> (fi * errnum_shift)) & errnum_mask;
-+ if (!errnum)
-+ continue;
+
+ if (errnum <= snf->ecc_strength) {
-+ if (ret >= 0)
-+ ret += errnum;
-+ continue;
++ snf->sect_bf[i] = errnum;
++ } else {
++ snf->sect_bf[i] = -1;
++ ret = -EBADMSG;
+ }
-+
-+ snand_log_ecc(snf->pdev,
-+ "Uncorrectable bitflips in page %u sect %u\n",
-+ page, i);
-+ ret = -EBADMSG;
+ }
+
+ return ret;
+}
++
++static int mtk_ecc_check_buf_bitflips(struct mtk_snand *snf, const void *buf,
++ size_t len, uint32_t bitflips)
++{
++ const uint8_t *buf8 = buf;
++ const uint32_t *buf32;
++ uint32_t d, weight;
++
++ while (len && ((uintptr_t)buf8) % sizeof(uint32_t)) {
++ weight = hweight8(*buf8);
++ bitflips += BITS_PER_BYTE - weight;
++ buf8++;
++ len--;
++
++ if (bitflips > snf->ecc_strength)
++ return -EBADMSG;
++ }
++
++ buf32 = (const uint32_t *)buf8;
++ while (len >= sizeof(uint32_t)) {
++ d = *buf32;
++
++ if (d != ~0) {
++ weight = hweight32(d);
++ bitflips += sizeof(uint32_t) * BITS_PER_BYTE - weight;
++ }
++
++ buf32++;
++ len -= sizeof(uint32_t);
++
++ if (bitflips > snf->ecc_strength)
++ return -EBADMSG;
++ }
++
++ buf8 = (const uint8_t *)buf32;
++ while (len) {
++ weight = hweight8(*buf8);
++ bitflips += BITS_PER_BYTE - weight;
++ buf8++;
++ len--;
++
++ if (bitflips > snf->ecc_strength)
++ return -EBADMSG;
++ }
++
++ return bitflips;
++}
++
++static int mtk_ecc_check_parity_bitflips(struct mtk_snand *snf, const void *buf,
++ uint32_t bits, uint32_t bitflips)
++{
++ uint32_t len, i;
++ uint8_t b;
++ int rc;
++
++ len = bits >> 3;
++ bits &= 7;
++
++ rc = mtk_ecc_check_buf_bitflips(snf, buf, len, bitflips);
++ if (!bits || rc < 0)
++ return rc;
++
++ bitflips = rc;
++
++ /* We want a precise count of bits */
++ b = ((const uint8_t *)buf)[len];
++ for (i = 0; i < bits; i++) {
++ if (!(b & BIT(i)))
++ bitflips++;
++ }
++
++ if (bitflips > snf->ecc_strength)
++ return -EBADMSG;
++
++ return bitflips;
++}
++
++static void mtk_ecc_reset_parity(void *buf, uint32_t bits)
++{
++ uint32_t len;
++
++ len = bits >> 3;
++ bits &= 7;
++
++ memset(buf, 0xff, len);
++
++ /* Only reset bits protected by ECC to 1 */
++ if (bits)
++ ((uint8_t *)buf)[len] |= GENMASK(bits - 1, 0);
++}
++
++int mtk_ecc_fixup_empty_sector(struct mtk_snand *snf, uint32_t sect)
++{
++ uint32_t ecc_bytes = snf->spare_per_sector - snf->nfi_soc->fdm_size;
++ uint8_t *oob = snf->page_cache + snf->writesize;
++ uint8_t *data_ptr, *fdm_ptr, *ecc_ptr;
++ int bitflips = 0, ecc_bits, parity_bits;
++
++ parity_bits = fls(snf->nfi_soc->sector_size * 8);
++ ecc_bits = snf->ecc_strength * parity_bits;
++
++ data_ptr = snf->page_cache + sect * snf->nfi_soc->sector_size;
++ fdm_ptr = oob + sect * snf->nfi_soc->fdm_size;
++ ecc_ptr = oob + snf->ecc_steps * snf->nfi_soc->fdm_size +
++ sect * ecc_bytes;
++
++ /*
++ * Check whether DATA + FDM + ECC of a sector contains correctable
++ * bitflips
++ */
++ bitflips = mtk_ecc_check_buf_bitflips(snf, data_ptr,
++ snf->nfi_soc->sector_size,
++ bitflips);
++ if (bitflips < 0)
++ return -EBADMSG;
++
++ bitflips = mtk_ecc_check_buf_bitflips(snf, fdm_ptr,
++ snf->nfi_soc->fdm_ecc_size,
++ bitflips);
++ if (bitflips < 0)
++ return -EBADMSG;
++
++ bitflips = mtk_ecc_check_parity_bitflips(snf, ecc_ptr, ecc_bits,
++ bitflips);
++ if (bitflips < 0)
++ return -EBADMSG;
++
++ if (!bitflips)
++ return 0;
++
++ /* Reset the data of this sector to 0xff */
++ memset(data_ptr, 0xff, snf->nfi_soc->sector_size);
++ memset(fdm_ptr, 0xff, snf->nfi_soc->fdm_ecc_size);
++ mtk_ecc_reset_parity(ecc_ptr, ecc_bits);
++
++ return bitflips;
++}
--- /dev/null
+++ b/drivers/mtd/mtk-snand/mtk-snand-ids.c
-@@ -0,0 +1,511 @@
+@@ -0,0 +1,515 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/*
+ * Copyright (C) 2020 MediaTek Inc. All Rights Reserved.
@@ -724,6 +876,10 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ &snand_cap_read_from_cache_quad,
+ &snand_cap_program_load_x4,
+ mtk_snand_winbond_select_die),
++ SNAND_INFO("W25N01KV", SNAND_ID(SNAND_ID_DYMMY, 0xef, 0xae, 0x21),
++ SNAND_MEMORG_1G_2K_64,
++ &snand_cap_read_from_cache_quad,
++ &snand_cap_program_load_x4),
+ SNAND_INFO("W25N02KV", SNAND_ID(SNAND_ID_DYMMY, 0xef, 0xaa, 0x22),
+ SNAND_MEMORG_2G_2K_128,
+ &snand_cap_read_from_cache_quad,
@@ -767,7 +923,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ &snand_cap_program_load_x4),
+ SNAND_INFO("GD5F2GQ5UExxG", SNAND_ID(SNAND_ID_DYMMY, 0xc8, 0x52),
+ SNAND_MEMORG_2G_2K_128,
-+ &snand_cap_read_from_cache_quad_q2d,
++ &snand_cap_read_from_cache_quad_a8d,
+ &snand_cap_program_load_x4),
+ SNAND_INFO("GD5F4GQ4UCxIG", SNAND_ID(SNAND_ID_DYMMY, 0xc8, 0xb4),
+ SNAND_MEMORG_4G_4K_256,
@@ -1145,7 +1301,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+}
--- /dev/null
+++ b/drivers/mtd/mtk-snand/mtk-snand-mtd.c
-@@ -0,0 +1,526 @@
+@@ -0,0 +1,535 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2020 MediaTek Inc. All Rights Reserved.
@@ -1201,7 +1357,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ instr->state = MTD_ERASING;
+
+ while (start_addr < end_addr) {
-+ WATCHDOG_RESET();
++ schedule();
+
+ if (mtk_snand_block_isbad(msm->snf, start_addr)) {
+ if (!instr->scrub) {
@@ -1220,15 +1376,12 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ start_addr += mtd->erasesize;
+ }
+
-+ if (ret)
-+ instr->state = MTD_ERASE_FAILED;
-+ else
++ if (!ret) {
+ instr->state = MTD_ERASE_DONE;
-+
-+ if (!ret)
-+ mtd_erase_callback(instr);
-+ else
++ } else {
++ instr->state = MTD_ERASE_FAILED;
+ ret = -EIO;
++ }
+
+ return ret;
+}
@@ -1240,8 +1393,8 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ size_t len, ooblen, maxooblen, chklen;
+ uint32_t col, ooboffs;
+ uint8_t *datcache, *oobcache;
-+ bool raw = ops->mode == MTD_OPS_RAW ? true : false;
-+ int ret;
++ bool ecc_failed = false, raw = ops->mode == MTD_OPS_RAW ? true : false;
++ int ret, max_bitflips = 0;
+
+ col = addr & mtd->writesize_mask;
+ addr &= ~mtd->writesize_mask;
@@ -1257,7 +1410,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ ops->retlen = 0;
+
+ while (len || ooblen) {
-+ WATCHDOG_RESET();
++ schedule();
+
+ if (ops->mode == MTD_OPS_AUTO_OOB)
+ ret = mtk_snand_read_page_auto_oob(msm->snf, addr,
@@ -1266,9 +1419,20 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ ret = mtk_snand_read_page(msm->snf, addr, datcache,
+ oobcache, raw);
+
-+ if (ret < 0)
++ if (ret < 0 && ret != -EBADMSG)
+ return ret;
+
++ if (ret == -EBADMSG) {
++ mtd->ecc_stats.failed++;
++ ecc_failed = true;
++ } else {
++ mtd->ecc_stats.corrected += ret;
++ max_bitflips = max_t(int, ret, max_bitflips);
++ }
++
++ mtd->ecc_stats.corrected += ret;
++ max_bitflips = max_t(int, ret, max_bitflips);
++
+ if (len) {
+ /* Move data */
+ chklen = mtd->writesize - col;
@@ -1298,7 +1462,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ addr += mtd->writesize;
+ }
+
-+ return 0;
++ return ecc_failed ? -EBADMSG : max_bitflips;
+}
+
+static int mtk_snand_mtd_read_oob(struct mtd_info *mtd, loff_t from,
@@ -1374,7 +1538,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ ops->retlen = 0;
+
+ while (len || ooblen) {
-+ WATCHDOG_RESET();
++ schedule();
+
+ if (len) {
+ /* Move data */
@@ -1622,7 +1786,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+
+ mtd->ooblayout = &mtk_snand_ooblayout;
+
-+ mtd->ecc_strength = msm->cinfo.ecc_strength * msm->cinfo.num_sectors;
++ mtd->ecc_strength = msm->cinfo.ecc_strength;
+ mtd->bitflip_threshold = (mtd->ecc_strength * 3) / 4;
+ mtd->ecc_step_size = msm->cinfo.sector_size;
+
@@ -1661,6 +1825,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+static const struct udevice_id mtk_snand_ids[] = {
+ { .compatible = "mediatek,mt7622-snand", .data = SNAND_SOC_MT7622 },
+ { .compatible = "mediatek,mt7629-snand", .data = SNAND_SOC_MT7629 },
++ { .compatible = "mediatek,mt7981-snand", .data = SNAND_SOC_MT7981 },
+ { .compatible = "mediatek,mt7986-snand", .data = SNAND_SOC_MT7986 },
+ { /* sentinel */ },
+};
@@ -1839,7 +2004,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+#endif /* _MTK_SNAND_OS_H_ */
--- /dev/null
+++ b/drivers/mtd/mtk-snand/mtk-snand.c
-@@ -0,0 +1,1776 @@
+@@ -0,0 +1,1933 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/*
+ * Copyright (C) 2020 MediaTek Inc. All Rights Reserved.
@@ -1899,8 +2064,16 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+#define FIFO_WR_REMAIN_S 8
+#define FIFO_RD_REMAIN_S 0
+
++#define NFI_ADDRCNTR 0x070
++#define SEC_CNTR GENMASK(16, 12)
++#define SEC_CNTR_S 12
++#define NFI_SEC_CNTR(val) (((val) & SEC_CNTR) >> SEC_CNTR_S)
++
+#define NFI_STRADDR 0x080
+
++#define NFI_BYTELEN 0x084
++#define BUS_SEC_CNTR(val) (((val) & SEC_CNTR) >> SEC_CNTR_S)
++
+#define NFI_FDM0L 0x0a0
+#define NFI_FDM0M 0x0a4
+#define NFI_FDML(n) (NFI_FDM0L + (n) * 8)
@@ -1917,6 +2090,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+#define NFI_MASTERSTA_MASK_7622 (MAS_ADDR | MAS_RD | MAS_WR | MAS_RDDLY)
+#define AHB_BUS_BUSY BIT(1)
+#define BUS_BUSY BIT(0)
++#define NFI_MASTERSTA_MASK_7981 (AHB_BUS_BUSY | BUS_BUSY)
+#define NFI_MASTERSTA_MASK_7986 (AHB_BUS_BUSY | BUS_BUSY)
+
+/* SNFI registers */
@@ -1952,6 +2126,8 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+#define DATA_READ_MODE_X4 2
+#define DATA_READ_MODE_DUAL 5
+#define DATA_READ_MODE_QUAD 6
++#define LATCH_LAT_S 8
++#define LATCH_LAT GENMASK(9, 8)
+#define PG_LOAD_CUSTOM_EN BIT(7)
+#define DATARD_CUSTOM_EN BIT(6)
+#define CS_DESELECT_CYC_S 0
@@ -1979,6 +2155,11 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+
+static const uint8_t mt7622_spare_sizes[] = { 16, 26, 27, 28 };
+
++static const uint8_t mt7981_spare_sizes[] = {
++ 16, 26, 27, 28, 32, 36, 40, 44, 48, 49, 50, 51, 52, 62, 61, 63, 64,
++ 67, 74
++};
++
+static const uint8_t mt7986_spare_sizes[] = {
+ 16, 26, 27, 28, 32, 36, 40, 44, 48, 49, 50, 51, 52, 62, 61, 63, 64,
+ 67, 74
@@ -1995,7 +2176,9 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ .empty_page_check = false,
+ .mastersta_mask = NFI_MASTERSTA_MASK_7622,
+ .spare_sizes = mt7622_spare_sizes,
-+ .num_spare_size = ARRAY_SIZE(mt7622_spare_sizes)
++ .num_spare_size = ARRAY_SIZE(mt7622_spare_sizes),
++ .latch_lat = 0,
++ .sample_delay = 40
+ },
+ [SNAND_SOC_MT7629] = {
+ .sector_size = 512,
@@ -2007,7 +2190,23 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ .empty_page_check = false,
+ .mastersta_mask = NFI_MASTERSTA_MASK_7622,
+ .spare_sizes = mt7622_spare_sizes,
-+ .num_spare_size = ARRAY_SIZE(mt7622_spare_sizes)
++ .num_spare_size = ARRAY_SIZE(mt7622_spare_sizes),
++ .latch_lat = 0,
++ .sample_delay = 40
++ },
++ [SNAND_SOC_MT7981] = {
++ .sector_size = 1024,
++ .max_sectors = 16,
++ .fdm_size = 8,
++ .fdm_ecc_size = 1,
++ .fifo_size = 64,
++ .bbm_swap = true,
++ .empty_page_check = true,
++ .mastersta_mask = NFI_MASTERSTA_MASK_7981,
++ .spare_sizes = mt7981_spare_sizes,
++ .num_spare_size = ARRAY_SIZE(mt7981_spare_sizes),
++ .latch_lat = 0,
++ .sample_delay = 40
+ },
+ [SNAND_SOC_MT7986] = {
+ .sector_size = 1024,
@@ -2019,7 +2218,9 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ .empty_page_check = true,
+ .mastersta_mask = NFI_MASTERSTA_MASK_7986,
+ .spare_sizes = mt7986_spare_sizes,
-+ .num_spare_size = ARRAY_SIZE(mt7986_spare_sizes)
++ .num_spare_size = ARRAY_SIZE(mt7986_spare_sizes),
++ .latch_lat = 0,
++ .sample_delay = 40
+ },
+};
+
@@ -2191,7 +2392,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ snand_log_snfi(snf->pdev, "Failed to reset SNFI MAC\n");
+
+ nfi_write32(snf, SNF_MISC_CTL, (2 << FIFO_RD_LTC_S) |
-+ (10 << CS_DESELECT_CYC_S));
++ (10 << CS_DESELECT_CYC_S) | (snf->nfi_soc->latch_lat << LATCH_LAT_S));
+
+ return ret;
+}
@@ -2487,9 +2688,77 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ }
+}
+
++static int mtk_snand_read_ecc_parity(struct mtk_snand *snf, uint32_t page,
++ uint32_t sect, uint8_t *oob)
++{
++ uint32_t ecc_bytes = snf->spare_per_sector - snf->nfi_soc->fdm_size;
++ uint32_t coladdr, raw_offs, offs;
++ uint8_t op[4];
++
++ if (sizeof(op) + ecc_bytes > SNF_GPRAM_SIZE) {
++ snand_log_snfi(snf->pdev,
++ "ECC parity size does not fit the GPRAM\n");
++ return -ENOTSUPP;
++ }
++
++ raw_offs = sect * snf->raw_sector_size + snf->nfi_soc->sector_size +
++ snf->nfi_soc->fdm_size;
++ offs = snf->ecc_steps * snf->nfi_soc->fdm_size + sect * ecc_bytes;
++
++ /* Column address with plane bit */
++ coladdr = raw_offs | mtk_snand_get_plane_address(snf, page);
++
++ op[0] = SNAND_CMD_READ_FROM_CACHE;
++ op[1] = (coladdr >> 8) & 0xff;
++ op[2] = coladdr & 0xff;
++ op[3] = 0;
++
++ return mtk_snand_mac_io(snf, op, sizeof(op), oob + offs, ecc_bytes);
++}
++
++static int mtk_snand_check_ecc_result(struct mtk_snand *snf, uint32_t page)
++{
++ uint8_t *oob = snf->page_cache + snf->writesize;
++ int i, rc, ret = 0, max_bitflips = 0;
++
++ for (i = 0; i < snf->ecc_steps; i++) {
++ if (snf->sect_bf[i] >= 0) {
++ if (snf->sect_bf[i] > max_bitflips)
++ max_bitflips = snf->sect_bf[i];
++ continue;
++ }
++
++ rc = mtk_snand_read_ecc_parity(snf, page, i, oob);
++ if (rc)
++ return rc;
++
++ rc = mtk_ecc_fixup_empty_sector(snf, i);
++ if (rc < 0) {
++ ret = -EBADMSG;
++
++ snand_log_ecc(snf->pdev,
++ "Uncorrectable bitflips in page %u sect %u\n",
++ page, i);
++ } else if (rc) {
++ snf->sect_bf[i] = rc;
++
++ if (snf->sect_bf[i] > max_bitflips)
++ max_bitflips = snf->sect_bf[i];
++
++ snand_log_ecc(snf->pdev,
++ "%u bitflip%s corrected in page %u sect %u\n",
++ rc, rc > 1 ? "s" : "", page, i);
++ } else {
++ snf->sect_bf[i] = 0;
++ }
++ }
++
++ return ret ? ret : max_bitflips;
++}
++
+static int mtk_snand_read_cache(struct mtk_snand *snf, uint32_t page, bool raw)
+{
-+ uint32_t coladdr, rwbytes, mode, len;
++ uint32_t coladdr, rwbytes, mode, len, val;
+ uintptr_t dma_addr;
+ int ret;
+
@@ -2509,7 +2778,8 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+
+ /* Set read mode */
+ mode = (uint32_t)snf->mode_rfc << DATA_READ_MODE_S;
-+ nfi_rmw32(snf, SNF_MISC_CTL, DATA_READ_MODE, mode | DATARD_CUSTOM_EN);
++ nfi_rmw32(snf, SNF_MISC_CTL, DATA_READ_MODE,
++ mode | DATARD_CUSTOM_EN | (snf->nfi_soc->latch_lat << LATCH_LAT_S));
+
+ /* Set bytes to read */
+ rwbytes = snf->ecc_steps * snf->raw_sector_size;
@@ -2557,6 +2827,26 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ goto cleanup;
+ }
+
++ /* Wait for BUS_SEC_CNTR returning expected value */
++ ret = read32_poll_timeout(snf->nfi_base + NFI_BYTELEN, val,
++ BUS_SEC_CNTR(val) >= snf->ecc_steps,
++ 0, SNFI_POLL_INTERVAL);
++ if (ret) {
++ snand_log_nfi(snf->pdev,
++ "Timed out waiting for BUS_SEC_CNTR\n");
++ goto cleanup;
++ }
++
++ /* Wait for bus becoming idle */
++ ret = read32_poll_timeout(snf->nfi_base + NFI_MASTERSTA, val,
++ !(val & snf->nfi_soc->mastersta_mask),
++ 0, SNFI_POLL_INTERVAL);
++ if (ret) {
++ snand_log_nfi(snf->pdev,
++ "Timed out waiting for bus becoming idle\n");
++ goto cleanup;
++ }
++
+ if (!raw) {
+ ret = mtk_ecc_wait_decoder_done(snf);
+ if (ret)
@@ -2564,17 +2854,10 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+
+ mtk_snand_read_fdm(snf, snf->page_cache + snf->writesize);
+
-+ /*
-+ * For new IPs, ecc error may occur on empty pages.
-+ * Use an specific indication bit to check empty page.
-+ */
-+ if (snf->nfi_soc->empty_page_check &&
-+ (nfi_read32(snf, NFI_STA) & READ_EMPTY))
-+ ret = 0;
-+ else
-+ ret = mtk_ecc_check_decode_error(snf, page);
-+
++ mtk_ecc_check_decode_error(snf);
+ mtk_snand_ecc_decoder_stop(snf);
++
++ ret = mtk_snand_check_ecc_result(snf, page);
+ }
+
+cleanup:
@@ -2583,6 +2866,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+
+ /* Stop read */
+ nfi_write32(snf, NFI_CON, 0);
++ nfi_write16(snf, NFI_CNFG, 0);
+
+ /* Clear SNF done flag */
+ nfi_rmw32(snf, SNF_STA_CTL1, 0, CUS_READ_DONE);
@@ -2592,7 +2876,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ nfi_read32(snf, NFI_INTR_STA);
+ nfi_write32(snf, NFI_INTR_EN, 0);
+
-+ nfi_rmw32(snf, SNF_MISC_CTL, DATARD_CUSTOM_EN, 0);
++ nfi_rmw32(snf, SNF_MISC_CTL, DATARD_CUSTOM_EN | LATCH_LAT, 0);
+
+ return ret;
+}
@@ -2628,12 +2912,14 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ void *buf, void *oob, bool raw, bool format)
+{
+ uint64_t die_addr;
-+ uint32_t page;
-+ int ret;
++ uint32_t page, dly_ctrl3;
++ int ret, retry_cnt = 0;
+
+ die_addr = mtk_snand_select_die_address(snf, addr);
+ page = die_addr >> snf->writesize_shift;
+
++ dly_ctrl3 = nfi_read32(snf, SNF_DLY_CTL3);
++
+ ret = mtk_snand_page_op(snf, page, SNAND_CMD_READ_TO_CACHE);
+ if (ret)
+ return ret;
@@ -2644,10 +2930,30 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ return ret;
+ }
+
++retry:
+ ret = mtk_snand_read_cache(snf, page, raw);
+ if (ret < 0 && ret != -EBADMSG)
+ return ret;
+
++ if (ret == -EBADMSG && retry_cnt < 16) {
++ nfi_write32(snf, SNF_DLY_CTL3, retry_cnt * 2);
++ retry_cnt++;
++ goto retry;
++ }
++
++ if (retry_cnt) {
++ if(ret == -EBADMSG) {
++ nfi_write32(snf, SNF_DLY_CTL3, dly_ctrl3);
++ snand_log_chip(snf->pdev,
++ "NFI calibration failed. Original sample delay: 0x%x\n",
++ dly_ctrl3);
++ } else {
++ snand_log_chip(snf->pdev,
++ "NFI calibration passed. New sample delay: 0x%x\n",
++ nfi_read32(snf, SNF_DLY_CTL3));
++ }
++ }
++
+ if (raw) {
+ if (format) {
+ mtk_snand_bm_swap_raw(snf);
@@ -2721,7 +3027,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+static int mtk_snand_program_load(struct mtk_snand *snf, uint32_t page,
+ bool raw)
+{
-+ uint32_t coladdr, rwbytes, mode, len;
++ uint32_t coladdr, rwbytes, mode, len, val;
+ uintptr_t dma_addr;
+ int ret;
+
@@ -2791,6 +3097,16 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ goto cleanup;
+ }
+
++ /* Wait for NFI_SEC_CNTR returning expected value */
++ ret = read32_poll_timeout(snf->nfi_base + NFI_ADDRCNTR, val,
++ NFI_SEC_CNTR(val) >= snf->ecc_steps,
++ 0, SNFI_POLL_INTERVAL);
++ if (ret) {
++ snand_log_nfi(snf->pdev,
++ "Timed out waiting for BUS_SEC_CNTR\n");
++ goto cleanup;
++ }
++
+ if (!raw)
+ mtk_snand_ecc_encoder_stop(snf);
+
@@ -2799,7 +3115,8 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ dma_mem_unmap(snf->pdev, dma_addr, len, true);
+
+ /* Stop write */
-+ nfi_write16(snf, NFI_CON, 0);
++ nfi_write32(snf, NFI_CON, 0);
++ nfi_write16(snf, NFI_CNFG, 0);
+
+ /* Clear SNF done flag */
+ nfi_rmw32(snf, SNF_STA_CTL1, 0, CUS_PG_DONE);
@@ -3456,7 +3773,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+
+ /* Tuning options */
+ nfi_write16(snf, NFI_DEBUG_CON1, WBUF_EN);
-+ nfi_write32(snf, SNF_DLY_CTL3, (40 << SFCK_SAM_DLY_S));
++ nfi_write32(snf, SNF_DLY_CTL3, (snf->nfi_soc->sample_delay << SFCK_SAM_DLY_S));
+
+ /* Interrupts */
+ nfi_read32(snf, NFI_INTR_STA);
@@ -3525,8 +3842,8 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ struct mtk_snand **psnf)
+{
+ const struct snand_flash_info *snand_info;
++ uint32_t rawpage_size, sect_bf_size;
+ struct mtk_snand tmpsnf, *snf;
-+ uint32_t rawpage_size;
+ int ret;
+
+ if (!pdata || !psnf)
@@ -3567,14 +3884,19 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ rawpage_size = snand_info->memorg.pagesize +
+ snand_info->memorg.sparesize;
+
++ sect_bf_size = mtk_snand_socs[pdata->soc].max_sectors *
++ sizeof(*snf->sect_bf);
++
+ /* Allocate memory for instance and cache */
-+ snf = generic_mem_alloc(dev, sizeof(*snf) + rawpage_size);
++ snf = generic_mem_alloc(dev,
++ sizeof(*snf) + rawpage_size + sect_bf_size);
+ if (!snf) {
+ snand_log_chip(dev, "Failed to allocate memory for instance\n");
+ return -ENOMEM;
+ }
+
-+ snf->buf_cache = (uint8_t *)((uintptr_t)snf + sizeof(*snf));
++ snf->sect_bf = (int *)((uintptr_t)snf + sizeof(*snf));
++ snf->buf_cache = (uint8_t *)((uintptr_t)snf->sect_bf + sect_bf_size);
+
+ /* Allocate memory for DMA buffer */
+ snf->page_cache = dma_mem_alloc(dev, rawpage_size);
@@ -3638,8 +3960,8 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+enum mtk_snand_soc {
+ SNAND_SOC_MT7622,
+ SNAND_SOC_MT7629,
++ SNAND_SOC_MT7981,
+ SNAND_SOC_MT7986,
-+
+ __SNAND_SOC_MAX
+};
+
diff --git a/package/boot/uboot-mediatek/patches/000-mtk-15-mtd-mtk-snand-add-support-for-SPL.patch b/package/boot/uboot-mediatek/patches/100-03-mtd-mtk-snand-add-support-for-SPL.patch
index 0ec20eb91c7..3d7c4a9bf60 100644
--- a/package/boot/uboot-mediatek/patches/000-mtk-15-mtd-mtk-snand-add-support-for-SPL.patch
+++ b/package/boot/uboot-mediatek/patches/100-03-mtd-mtk-snand-add-support-for-SPL.patch
@@ -1,7 +1,7 @@
-From 0c857d4c9cd9dc8e8ebba18cf9e9b10513ccb35d Mon Sep 17 00:00:00 2001
+From a347e374cb338213632c6dde88dd226d64bd8b27 Mon Sep 17 00:00:00 2001
From: Weijie Gao <weijie.gao@mediatek.com>
Date: Wed, 3 Mar 2021 08:57:29 +0800
-Subject: [PATCH 15/21] mtd: mtk-snand: add support for SPL
+Subject: [PATCH 37/71] mtd: mtk-snand: add support for SPL
Add support to initialize SPI-NAND in SPL.
Add implementation for SPL NAND loader.
@@ -10,8 +10,8 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
---
drivers/mtd/mtk-snand/Kconfig | 6 ++
drivers/mtd/mtk-snand/Makefile | 4 +
- drivers/mtd/mtk-snand/mtk-snand-spl.c | 132 ++++++++++++++++++++++++++
- 3 files changed, 142 insertions(+)
+ drivers/mtd/mtk-snand/mtk-snand-spl.c | 133 ++++++++++++++++++++++++++
+ 3 files changed, 143 insertions(+)
create mode 100644 drivers/mtd/mtk-snand/mtk-snand-spl.c
--- a/drivers/mtd/mtk-snand/Kconfig
@@ -39,7 +39,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
ccflags-y += -DPRIVATE_MTK_SNAND_HEADER
--- /dev/null
+++ b/drivers/mtd/mtk-snand/mtk-snand-spl.c
-@@ -0,0 +1,132 @@
+@@ -0,0 +1,133 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2020 MediaTek Inc. All Rights Reserved.
@@ -74,7 +74,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ return -ENODEV;
+
+ while (sizeremain) {
-+ WATCHDOG_RESET();
++ schedule();
+
+ leading = off & writesize_mask;
+ chunksize = cinfo.pagesize - leading;
@@ -162,6 +162,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+static const struct udevice_id mtk_snand_ids[] = {
+ { .compatible = "mediatek,mt7622-snand", .data = SNAND_SOC_MT7622 },
+ { .compatible = "mediatek,mt7629-snand", .data = SNAND_SOC_MT7629 },
++ { .compatible = "mediatek,mt7981-snand", .data = SNAND_SOC_MT7981 },
+ { .compatible = "mediatek,mt7986-snand", .data = SNAND_SOC_MT7986 },
+ { /* sentinel */ },
+};
diff --git a/package/boot/uboot-mediatek/patches/000-mtk-16-env-add-support-for-generic-MTD-device.patch b/package/boot/uboot-mediatek/patches/100-04-env-add-support-for-generic-MTD-device.patch
index 932c4b736a0..9b02b4dc630 100644
--- a/package/boot/uboot-mediatek/patches/000-mtk-16-env-add-support-for-generic-MTD-device.patch
+++ b/package/boot/uboot-mediatek/patches/100-04-env-add-support-for-generic-MTD-device.patch
@@ -1,7 +1,7 @@
-From eaa9bc597e0bf8bcd1486ea49c8c7c070a37a8aa Mon Sep 17 00:00:00 2001
+From efc3e6f5d29f87a433b42f15a0b87e04b7cd498d Mon Sep 17 00:00:00 2001
From: Weijie Gao <weijie.gao@mediatek.com>
Date: Wed, 3 Mar 2021 10:11:32 +0800
-Subject: [PATCH 16/21] env: add support for generic MTD device
+Subject: [PATCH 38/71] env: add support for generic MTD device
Add an env driver for generic MTD device.
@@ -17,39 +17,20 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
7 files changed, 299 insertions(+), 3 deletions(-)
create mode 100644 env/mtd.c
---- a/cmd/nvedit.c
-+++ b/cmd/nvedit.c
-@@ -50,6 +50,7 @@ DECLARE_GLOBAL_DATA_PTR;
- defined(CONFIG_ENV_IS_IN_MMC) || \
- defined(CONFIG_ENV_IS_IN_FAT) || \
- defined(CONFIG_ENV_IS_IN_EXT4) || \
-+ defined(CONFIG_ENV_IS_IN_MTD) || \
- defined(CONFIG_ENV_IS_IN_NAND) || \
- defined(CONFIG_ENV_IS_IN_NVRAM) || \
- defined(CONFIG_ENV_IS_IN_ONENAND) || \
-@@ -64,7 +65,7 @@ DECLARE_GLOBAL_DATA_PTR;
-
- #if !defined(ENV_IS_IN_DEVICE) && \
- !defined(CONFIG_ENV_IS_NOWHERE)
--# error Define one of CONFIG_ENV_IS_IN_{EEPROM|FLASH|MMC|FAT|EXT4|\
-+# error Define one of CONFIG_ENV_IS_IN_{EEPROM|FLASH|MMC|FAT|EXT4|MTD|\
- NAND|NVRAM|ONENAND|SATA|SPI_FLASH|REMOTE|UBI} or CONFIG_ENV_IS_NOWHERE
- #endif
-
--- a/env/Kconfig
+++ b/env/Kconfig
-@@ -19,7 +19,7 @@ config ENV_IS_NOWHERE
+@@ -61,7 +61,7 @@ config ENV_IS_DEFAULT
!ENV_IS_IN_MMC && !ENV_IS_IN_NAND && \
!ENV_IS_IN_NVRAM && !ENV_IS_IN_ONENAND && \
!ENV_IS_IN_REMOTE && !ENV_IS_IN_SPI_FLASH && \
- !ENV_IS_IN_UBI
+ !ENV_IS_IN_UBI && !ENV_IS_IN_MTD
- help
- Define this if you don't want to or can't have an environment stored
- on a storage medium. In this case the environment will still exist
-@@ -207,6 +207,27 @@ config ENV_IS_IN_MMC
- This value is also in units of bytes, but must also be aligned to
- an MMC sector boundary.
+ select ENV_IS_NOWHERE
+
+ config ENV_IS_NOWHERE
+@@ -254,6 +254,27 @@ config ENV_IS_IN_MMC
+ offset: "u-boot,mmc-env-offset", "u-boot,mmc-env-offset-redundant".
+ CONFIG_ENV_OFFSET and CONFIG_ENV_OFFSET_REDUND are not used.
+config ENV_IS_IN_MTD
+ bool "Environment in a MTD device"
@@ -75,7 +56,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
config ENV_IS_IN_NAND
bool "Environment in a NAND device"
depends on !CHAIN_OF_TRUST
-@@ -513,10 +534,16 @@ config ENV_ADDR_REDUND
+@@ -561,10 +582,16 @@ config ENV_ADDR_REDUND
Offset from the start of the device (or partition) of the redundant
environment location.
@@ -92,8 +73,8 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+ ENV_IS_IN_SPI_FLASH || ENV_IS_IN_MTD
default 0x3f8000 if ARCH_ROCKCHIP && ENV_IS_IN_MMC
default 0x140000 if ARCH_ROCKCHIP && ENV_IS_IN_SPI_FLASH
- default 0x88000 if ARCH_SUNXI
-@@ -560,6 +587,12 @@ config ENV_SECT_SIZE
+ default 0xF0000 if ARCH_SUNXI
+@@ -622,6 +649,12 @@ config ENV_SECT_SIZE
help
Size of the sector containing the environment.
@@ -108,7 +89,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
depends on ENV_IS_IN_UBI
--- a/env/Makefile
+++ b/env/Makefile
-@@ -26,6 +26,7 @@ obj-$(CONFIG_$(SPL_TPL_)ENV_IS_NOWHERE)
+@@ -24,6 +24,7 @@ obj-$(CONFIG_$(SPL_TPL_)ENV_IS_NOWHERE)
obj-$(CONFIG_$(SPL_TPL_)ENV_IS_IN_MMC) += mmc.o
obj-$(CONFIG_$(SPL_TPL_)ENV_IS_IN_FAT) += fat.o
obj-$(CONFIG_$(SPL_TPL_)ENV_IS_IN_EXT4) += ext4.o
@@ -118,7 +99,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
obj-$(CONFIG_$(SPL_TPL_)ENV_IS_IN_FLASH) += flash.o
--- a/env/env.c
+++ b/env/env.c
-@@ -69,6 +69,9 @@ static enum env_location env_locations[]
+@@ -46,6 +46,9 @@ static enum env_location env_locations[]
#ifdef CONFIG_ENV_IS_IN_MMC
ENVL_MMC,
#endif
@@ -389,7 +370,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+};
--- a/include/env_internal.h
+++ b/include/env_internal.h
-@@ -131,6 +131,7 @@ enum env_location {
+@@ -109,6 +109,7 @@ enum env_location {
ENVL_FAT,
ENVL_FLASH,
ENVL_MMC,
@@ -399,7 +380,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
ENVL_ONENAND,
--- a/tools/Makefile
+++ b/tools/Makefile
-@@ -22,6 +22,7 @@ ENVCRC-$(CONFIG_ENV_IS_EMBEDDED) = y
+@@ -37,6 +37,7 @@ subdir-$(HOST_TOOLS_ALL) += gdb
ENVCRC-$(CONFIG_ENV_IS_IN_EEPROM) = y
ENVCRC-$(CONFIG_ENV_IS_IN_FLASH) = y
ENVCRC-$(CONFIG_ENV_IS_IN_ONENAND) = y
diff --git a/package/boot/uboot-mediatek/patches/100-05-mtd-add-a-new-mtd-device-type-for-NMBM.patch b/package/boot/uboot-mediatek/patches/100-05-mtd-add-a-new-mtd-device-type-for-NMBM.patch
new file mode 100644
index 00000000000..d90ca647041
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/100-05-mtd-add-a-new-mtd-device-type-for-NMBM.patch
@@ -0,0 +1,44 @@
+From d26a789c451068caf4bbb4d1ac7bc1f592b5493e Mon Sep 17 00:00:00 2001
+From: Weijie Gao <weijie.gao@mediatek.com>
+Date: Mon, 25 Jul 2022 10:58:06 +0800
+Subject: [PATCH 39/71] mtd: add a new mtd device type for NMBM
+
+This patch adds a new mtd device type for NMBM so that mtdparts can be
+correctly probed. And this also gives us an opportunity to add NMBM support
+for filesystems in the future.
+
+Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+---
+ cmd/mtdparts.c | 3 +++
+ include/jffs2/load_kernel.h | 4 +++-
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+--- a/cmd/mtdparts.c
++++ b/cmd/mtdparts.c
+@@ -1057,6 +1057,9 @@ int mtd_id_parse(const char *id, const c
+ } else if (strncmp(p, "spi-nand", 8) == 0) {
+ *dev_type = MTD_DEV_TYPE_SPINAND;
+ p += 8;
++ } else if (strncmp(p, "nmbm", 4) == 0) {
++ *dev_type = MTD_DEV_TYPE_NMBM;
++ p += 4;
+ } else {
+ printf("incorrect device type in %s\n", id);
+ return 1;
+--- a/include/jffs2/load_kernel.h
++++ b/include/jffs2/load_kernel.h
+@@ -16,11 +16,13 @@
+ #define MTD_DEV_TYPE_NAND 0x0002
+ #define MTD_DEV_TYPE_ONENAND 0x0004
+ #define MTD_DEV_TYPE_SPINAND 0x0008
++#define MTD_DEV_TYPE_NMBM 0x0010
+
+ #define MTD_DEV_TYPE(type) (type == MTD_DEV_TYPE_NAND ? "nand" : \
+ (type == MTD_DEV_TYPE_NOR ? "nor" : \
+ (type == MTD_DEV_TYPE_ONENAND ? "onenand" : \
+- "spi-nand"))) \
++ (type == MTD_DEV_TYPE_SPINAND ? "spi-nand" : \
++ "nmbm")))) \
+
+ struct mtd_device {
+ struct list_head link;
diff --git a/package/boot/uboot-mediatek/patches/100-06-mtd-add-core-facility-code-of-NMBM.patch b/package/boot/uboot-mediatek/patches/100-06-mtd-add-core-facility-code-of-NMBM.patch
new file mode 100644
index 00000000000..23634e64253
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/100-06-mtd-add-core-facility-code-of-NMBM.patch
@@ -0,0 +1,3422 @@
+From 690479081fb6a0c0f77f10fb457ad69e71390f15 Mon Sep 17 00:00:00 2001
+From: Weijie Gao <weijie.gao@mediatek.com>
+Date: Mon, 25 Jul 2022 10:26:35 +0800
+Subject: [PATCH 40/71] mtd: add core facility code of NMBM
+
+This patch adds a NAND bad block management named NMBM (NAND mapping block
+management) which supports using a mapping table to deal with bad blocks
+before factory shipping and during use.
+
+Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+---
+ drivers/mtd/Kconfig | 2 +
+ drivers/mtd/Makefile | 1 +
+ drivers/mtd/nmbm/Kconfig | 29 +
+ drivers/mtd/nmbm/Makefile | 5 +
+ drivers/mtd/nmbm/nmbm-core.c | 2936 +++++++++++++++++++++++++++++++
+ drivers/mtd/nmbm/nmbm-debug.h | 37 +
+ drivers/mtd/nmbm/nmbm-debug.inl | 39 +
+ drivers/mtd/nmbm/nmbm-private.h | 137 ++
+ include/nmbm/nmbm-os.h | 66 +
+ include/nmbm/nmbm.h | 102 ++
+ 10 files changed, 3354 insertions(+)
+ create mode 100644 drivers/mtd/nmbm/Kconfig
+ create mode 100644 drivers/mtd/nmbm/Makefile
+ create mode 100644 drivers/mtd/nmbm/nmbm-core.c
+ create mode 100644 drivers/mtd/nmbm/nmbm-debug.h
+ create mode 100644 drivers/mtd/nmbm/nmbm-debug.inl
+ create mode 100644 drivers/mtd/nmbm/nmbm-private.h
+ create mode 100644 include/nmbm/nmbm-os.h
+ create mode 100644 include/nmbm/nmbm.h
+
+--- a/drivers/mtd/Kconfig
++++ b/drivers/mtd/Kconfig
+@@ -274,4 +274,6 @@ source "drivers/mtd/ubi/Kconfig"
+
+ source "drivers/mtd/nvmxip/Kconfig"
+
++source "drivers/mtd/nmbm/Kconfig"
++
+ endmenu
+--- a/drivers/mtd/Makefile
++++ b/drivers/mtd/Makefile
+@@ -41,3 +41,4 @@ obj-$(CONFIG_SPL_UBI) += ubispl/
+ endif
+
+ obj-$(CONFIG_MTK_SPI_NAND) += mtk-snand/
++obj-$(CONFIG_NMBM) += nmbm/
+--- /dev/null
++++ b/drivers/mtd/nmbm/Kconfig
+@@ -0,0 +1,29 @@
++
++config NMBM
++ bool "Enable NAND mapping block management"
++ default n
++
++choice
++ prompt "Default log level"
++ depends on NMBM
++ default NMBM_LOG_LEVEL_INFO
++
++config NMBM_LOG_LEVEL_DEBUG
++ bool "0 - Debug"
++
++config NMBM_LOG_LEVEL_INFO
++ bool "1 - Info"
++
++config NMBM_LOG_LEVEL_WARN
++ bool "2 - Warn"
++
++config NMBM_LOG_LEVEL_ERR
++ bool "3 - Error"
++
++config NMBM_LOG_LEVEL_EMERG
++ bool "4 - Emergency"
++
++config NMBM_LOG_LEVEL_NONE
++ bool "5 - None"
++
++endchoice
+--- /dev/null
++++ b/drivers/mtd/nmbm/Makefile
+@@ -0,0 +1,5 @@
++# SPDX-License-Identifier: GPL-2.0
++#
++# (C) Copyright 2020 MediaTek Inc. All rights reserved.
++
++obj-$(CONFIG_NMBM) += nmbm-core.o
+--- /dev/null
++++ b/drivers/mtd/nmbm/nmbm-core.c
+@@ -0,0 +1,2936 @@
++// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
++/*
++ * Copyright (C) 2020 MediaTek Inc. All Rights Reserved.
++ *
++ * Author: Weijie Gao <weijie.gao@mediatek.com>
++ */
++
++#include "nmbm-private.h"
++
++#include "nmbm-debug.h"
++
++#define NMBM_VER_MAJOR 1
++#define NMBM_VER_MINOR 0
++#define NMBM_VER NMBM_VERSION_MAKE(NMBM_VER_MAJOR, \
++ NMBM_VER_MINOR)
++
++#define NMBM_ALIGN(v, a) (((v) + (a) - 1) & ~((a) - 1))
++
++/*****************************************************************************/
++/* Logging related functions */
++/*****************************************************************************/
++
++/*
++ * nmbm_log_lower - Print log using OS specific routine
++ * @nld: NMBM lower device structure
++ * @level: log level
++ * @fmt: format string
++ */
++static void nmbm_log_lower(struct nmbm_lower_device *nld,
++ enum nmbm_log_category level, const char *fmt, ...)
++{
++ va_list ap;
++
++ if (!nld->logprint)
++ return;
++
++ va_start(ap, fmt);
++ nld->logprint(nld->arg, level, fmt, ap);
++ va_end(ap);
++}
++
++/*
++ * nmbm_log - Print log using OS specific routine
++ * @ni: NMBM instance structure
++ * @level: log level
++ * @fmt: format string
++ */
++static void nmbm_log(struct nmbm_instance *ni, enum nmbm_log_category level,
++ const char *fmt, ...)
++{
++ va_list ap;
++
++ if (!ni)
++ return;
++
++ if (!ni->lower.logprint || level < ni->log_display_level)
++ return;
++
++ va_start(ap, fmt);
++ ni->lower.logprint(ni->lower.arg, level, fmt, ap);
++ va_end(ap);
++}
++
++/*
++ * nmbm_set_log_level - Set log display level
++ * @ni: NMBM instance structure
++ * @level: log display level
++ */
++enum nmbm_log_category nmbm_set_log_level(struct nmbm_instance *ni,
++ enum nmbm_log_category level)
++{
++ enum nmbm_log_category old;
++
++ if (!ni)
++ return __NMBM_LOG_MAX;
++
++ old = ni->log_display_level;
++ ni->log_display_level = level;
++ return old;
++}
++
++/*
++ * nlog_table_creation - Print log of table creation event
++ * @ni: NMBM instance structure
++ * @main_table: whether the table is main info table
++ * @start_ba: start block address of the table
++ * @end_ba: block address after the end of the table
++ */
++static void nlog_table_creation(struct nmbm_instance *ni, bool main_table,
++ uint32_t start_ba, uint32_t end_ba)
++{
++ if (start_ba == end_ba - 1)
++ nlog_info(ni, "%s info table has been written to block %u\n",
++ main_table ? "Main" : "Backup", start_ba);
++ else
++ nlog_info(ni, "%s info table has been written to block %u-%u\n",
++ main_table ? "Main" : "Backup", start_ba, end_ba - 1);
++
++ nmbm_mark_block_color_info_table(ni, start_ba, end_ba - 1);
++}
++
++/*
++ * nlog_table_update - Print log of table update event
++ * @ni: NMBM instance structure
++ * @main_table: whether the table is main info table
++ * @start_ba: start block address of the table
++ * @end_ba: block address after the end of the table
++ */
++static void nlog_table_update(struct nmbm_instance *ni, bool main_table,
++ uint32_t start_ba, uint32_t end_ba)
++{
++ if (start_ba == end_ba - 1)
++ nlog_debug(ni, "%s info table has been updated in block %u\n",
++ main_table ? "Main" : "Backup", start_ba);
++ else
++ nlog_debug(ni, "%s info table has been updated in block %u-%u\n",
++ main_table ? "Main" : "Backup", start_ba, end_ba - 1);
++
++ nmbm_mark_block_color_info_table(ni, start_ba, end_ba - 1);
++}
++
++/*
++ * nlog_table_found - Print log of table found event
++ * @ni: NMBM instance structure
++ * @first_table: whether the table is first found info table
++ * @write_count: write count of the info table
++ * @start_ba: start block address of the table
++ * @end_ba: block address after the end of the table
++ */
++static void nlog_table_found(struct nmbm_instance *ni, bool first_table,
++ uint32_t write_count, uint32_t start_ba,
++ uint32_t end_ba)
++{
++ if (start_ba == end_ba - 1)
++ nlog_info(ni, "%s info table with writecount %u found in block %u\n",
++ first_table ? "First" : "Second", write_count,
++ start_ba);
++ else
++ nlog_info(ni, "%s info table with writecount %u found in block %u-%u\n",
++ first_table ? "First" : "Second", write_count,
++ start_ba, end_ba - 1);
++
++ nmbm_mark_block_color_info_table(ni, start_ba, end_ba - 1);
++}
++
++/*****************************************************************************/
++/* Address conversion functions */
++/*****************************************************************************/
++
++/*
++ * addr2ba - Convert a linear address to block address
++ * @ni: NMBM instance structure
++ * @addr: Linear address
++ */
++static uint32_t addr2ba(struct nmbm_instance *ni, uint64_t addr)
++{
++ return addr >> ni->erasesize_shift;
++}
++
++/*
++ * ba2addr - Convert a block address to linear address
++ * @ni: NMBM instance structure
++ * @ba: Block address
++ */
++static uint64_t ba2addr(struct nmbm_instance *ni, uint32_t ba)
++{
++ return (uint64_t)ba << ni->erasesize_shift;
++}
++/*
++ * size2blk - Get minimum required blocks for storing specific size of data
++ * @ni: NMBM instance structure
++ * @size: size for storing
++ */
++static uint32_t size2blk(struct nmbm_instance *ni, uint64_t size)
++{
++ return (size + ni->lower.erasesize - 1) >> ni->erasesize_shift;
++}
++
++/*****************************************************************************/
++/* High level NAND chip APIs */
++/*****************************************************************************/
++
++/*
++ * nmbm_reset_chip - Reset NAND device
++ * @nld: Lower NAND chip structure
++ */
++static void nmbm_reset_chip(struct nmbm_instance *ni)
++{
++ if (ni->lower.reset_chip)
++ ni->lower.reset_chip(ni->lower.arg);
++}
++
++/*
++ * nmbm_read_phys_page - Read page with retry
++ * @ni: NMBM instance structure
++ * @addr: linear address where the data will be read from
++ * @data: the main data to be read
++ * @oob: the oob data to be read
++ * @mode: mode for processing oob data
++ *
++ * Read a page for at most NMBM_TRY_COUNT times.
++ *
++ * Return 0 for success, positive value for corrected bitflip count,
++ * -EBADMSG for ecc error, other negative values for other errors
++ */
++static int nmbm_read_phys_page(struct nmbm_instance *ni, uint64_t addr,
++ void *data, void *oob, enum nmbm_oob_mode mode)
++{
++ int tries, ret;
++
++ for (tries = 0; tries < NMBM_TRY_COUNT; tries++) {
++ ret = ni->lower.read_page(ni->lower.arg, addr, data, oob, mode);
++ if (ret >= 0)
++ return ret;
++
++ nmbm_reset_chip(ni);
++ }
++
++ if (ret != -EBADMSG)
++ nlog_err(ni, "Page read failed at address 0x%08llx\n", addr);
++
++ return ret;
++}
++
++/*
++ * nmbm_write_phys_page - Write page with retry
++ * @ni: NMBM instance structure
++ * @addr: linear address where the data will be written to
++ * @data: the main data to be written
++ * @oob: the oob data to be written
++ * @mode: mode for processing oob data
++ *
++ * Write a page for at most NMBM_TRY_COUNT times.
++ */
++static bool nmbm_write_phys_page(struct nmbm_instance *ni, uint64_t addr,
++ const void *data, const void *oob,
++ enum nmbm_oob_mode mode)
++{
++ int tries, ret;
++
++ if (ni->lower.flags & NMBM_F_READ_ONLY) {
++ nlog_err(ni, "%s called with NMBM_F_READ_ONLY set\n", addr);
++ return false;
++ }
++
++ for (tries = 0; tries < NMBM_TRY_COUNT; tries++) {
++ ret = ni->lower.write_page(ni->lower.arg, addr, data, oob, mode);
++ if (!ret)
++ return true;
++
++ nmbm_reset_chip(ni);
++ }
++
++ nlog_err(ni, "Page write failed at address 0x%08llx\n", addr);
++
++ return false;
++}
++
++/*
++ * nmbm_erase_phys_block - Erase a block with retry
++ * @ni: NMBM instance structure
++ * @addr: Linear address
++ *
++ * Erase a block for at most NMBM_TRY_COUNT times.
++ */
++static bool nmbm_erase_phys_block(struct nmbm_instance *ni, uint64_t addr)
++{
++ int tries, ret;
++
++ if (ni->lower.flags & NMBM_F_READ_ONLY) {
++ nlog_err(ni, "%s called with NMBM_F_READ_ONLY set\n", addr);
++ return false;
++ }
++
++ for (tries = 0; tries < NMBM_TRY_COUNT; tries++) {
++ ret = ni->lower.erase_block(ni->lower.arg, addr);
++ if (!ret)
++ return true;
++
++ nmbm_reset_chip(ni);
++ }
++
++ nlog_err(ni, "Block erasure failed at address 0x%08llx\n", addr);
++
++ return false;
++}
++
++/*
++ * nmbm_check_bad_phys_block - Check whether a block is marked bad in OOB
++ * @ni: NMBM instance structure
++ * @ba: block address
++ */
++static bool nmbm_check_bad_phys_block(struct nmbm_instance *ni, uint32_t ba)
++{
++ uint64_t addr = ba2addr(ni, ba);
++ int ret;
++
++ if (ni->lower.is_bad_block)
++ return ni->lower.is_bad_block(ni->lower.arg, addr);
++
++ /* Treat ECC error as read success */
++ ret = nmbm_read_phys_page(ni, addr, NULL,
++ ni->page_cache + ni->lower.writesize,
++ NMBM_MODE_RAW);
++ if (ret < 0 && ret != -EBADMSG)
++ return true;
++
++ return ni->page_cache[ni->lower.writesize] != 0xff;
++}
++
++/*
++ * nmbm_mark_phys_bad_block - Mark a block bad
++ * @ni: NMBM instance structure
++ * @addr: Linear address
++ */
++static int nmbm_mark_phys_bad_block(struct nmbm_instance *ni, uint32_t ba)
++{
++ uint64_t addr = ba2addr(ni, ba);
++ enum nmbm_log_category level;
++ uint32_t off;
++
++ if (ni->lower.flags & NMBM_F_READ_ONLY) {
++ nlog_err(ni, "%s called with NMBM_F_READ_ONLY set\n", addr);
++ return false;
++ }
++
++ nlog_info(ni, "Block %u [0x%08llx] will be marked bad\n", ba, addr);
++
++ if (ni->lower.mark_bad_block)
++ return ni->lower.mark_bad_block(ni->lower.arg, addr);
++
++ /* Whole page set to 0x00 */
++ memset(ni->page_cache, 0, ni->rawpage_size);
++
++ /* Write to all pages within this block, disable all errors */
++ level = nmbm_set_log_level(ni, __NMBM_LOG_MAX);
++
++ for (off = 0; off < ni->lower.erasesize; off += ni->lower.writesize) {
++ nmbm_write_phys_page(ni, addr + off, ni->page_cache,
++ ni->page_cache + ni->lower.writesize,
++ NMBM_MODE_RAW);
++ }
++
++ nmbm_set_log_level(ni, level);
++
++ return 0;
++}
++
++/*****************************************************************************/
++/* NMBM related functions */
++/*****************************************************************************/
++
++/*
++ * nmbm_check_header - Check whether a NMBM structure is valid
++ * @data: pointer to a NMBM structure with a NMBM header at beginning
++ * @size: Size of the buffer pointed by @header
++ *
++ * The size of the NMBM structure may be larger than NMBM header,
++ * e.g. block mapping table and block state table.
++ */
++static bool nmbm_check_header(const void *data, uint32_t size)
++{
++ const struct nmbm_header *header = data;
++ struct nmbm_header nhdr;
++ uint32_t new_checksum;
++
++ /*
++ * Make sure expected structure size is equal or smaller than
++ * buffer size.
++ */
++ if (header->size > size)
++ return false;
++
++ memcpy(&nhdr, data, sizeof(nhdr));
++
++ nhdr.checksum = 0;
++ new_checksum = nmbm_crc32(0, &nhdr, sizeof(nhdr));
++ if (header->size > sizeof(nhdr))
++ new_checksum = nmbm_crc32(new_checksum,
++ (const uint8_t *)data + sizeof(nhdr),
++ header->size - sizeof(nhdr));
++
++ if (header->checksum != new_checksum)
++ return false;
++
++ return true;
++}
++
++/*
++ * nmbm_update_checksum - Update checksum of a NMBM structure
++ * @header: pointer to a NMBM structure with a NMBM header at beginning
++ *
++ * The size of the NMBM structure must be specified by @header->size
++ */
++static void nmbm_update_checksum(struct nmbm_header *header)
++{
++ header->checksum = 0;
++ header->checksum = nmbm_crc32(0, header, header->size);
++}
++
++/*
++ * nmbm_get_spare_block_count - Calculate number of blocks should be reserved
++ * @block_count: number of blocks of data
++ *
++ * Calculate number of blocks should be reserved for data
++ */
++static uint32_t nmbm_get_spare_block_count(uint32_t block_count)
++{
++ uint32_t val;
++
++ val = (block_count + NMBM_SPARE_BLOCK_DIV / 2) / NMBM_SPARE_BLOCK_DIV;
++ val *= NMBM_SPARE_BLOCK_MULTI;
++
++ if (val < NMBM_SPARE_BLOCK_MIN)
++ val = NMBM_SPARE_BLOCK_MIN;
++
++ return val;
++}
++
++/*
++ * nmbm_get_block_state_raw - Get state of a block from raw block state table
++ * @block_state: pointer to raw block state table (bitmap)
++ * @ba: block address
++ */
++static uint32_t nmbm_get_block_state_raw(nmbm_bitmap_t *block_state,
++ uint32_t ba)
++{
++ uint32_t unit, shift;
++
++ unit = ba / NMBM_BITMAP_BLOCKS_PER_UNIT;
++ shift = (ba % NMBM_BITMAP_BLOCKS_PER_UNIT) * NMBM_BITMAP_BITS_PER_BLOCK;
++
++ return (block_state[unit] >> shift) & BLOCK_ST_MASK;
++}
++
++/*
++ * nmbm_get_block_state - Get state of a block from block state table
++ * @ni: NMBM instance structure
++ * @ba: block address
++ */
++static uint32_t nmbm_get_block_state(struct nmbm_instance *ni, uint32_t ba)
++{
++ return nmbm_get_block_state_raw(ni->block_state, ba);
++}
++
++/*
++ * nmbm_set_block_state - Set state of a block to block state table
++ * @ni: NMBM instance structure
++ * @ba: block address
++ * @state: block state
++ *
++ * Set state of a block. If the block state changed, ni->block_state_changed
++ * will be increased.
++ */
++static bool nmbm_set_block_state(struct nmbm_instance *ni, uint32_t ba,
++ uint32_t state)
++{
++ uint32_t unit, shift, orig;
++ nmbm_bitmap_t uv;
++
++ unit = ba / NMBM_BITMAP_BLOCKS_PER_UNIT;
++ shift = (ba % NMBM_BITMAP_BLOCKS_PER_UNIT) * NMBM_BITMAP_BITS_PER_BLOCK;
++
++ orig = (ni->block_state[unit] >> shift) & BLOCK_ST_MASK;
++ state &= BLOCK_ST_MASK;
++
++ uv = ni->block_state[unit] & (~(BLOCK_ST_MASK << shift));
++ uv |= state << shift;
++ ni->block_state[unit] = uv;
++
++ if (state == BLOCK_ST_BAD)
++ nmbm_mark_block_color_bad(ni, ba);
++
++ if (orig != state) {
++ ni->block_state_changed++;
++ return true;
++ }
++
++ return false;
++}
++
++/*
++ * nmbm_block_walk_asc - Skip specified number of good blocks, ascending addr.
++ * @ni: NMBM instance structure
++ * @ba: start physical block address
++ * @nba: return physical block address after walk
++ * @count: number of good blocks to be skipped
++ * @limit: highest block address allowed for walking
++ *
++ * Start from @ba, skipping any bad blocks, counting @count good blocks, and
++ * return the next good block address.
++ *
++ * If no enough good blocks counted while @limit reached, false will be returned.
++ *
++ * If @count == 0, nearest good block address will be returned.
++ * @limit is not counted in walking.
++ */
++static bool nmbm_block_walk_asc(struct nmbm_instance *ni, uint32_t ba,
++ uint32_t *nba, uint32_t count,
++ uint32_t limit)
++{
++ int32_t nblock = count;
++
++ if (limit >= ni->block_count)
++ limit = ni->block_count - 1;
++
++ while (ba < limit) {
++ if (nmbm_get_block_state(ni, ba) == BLOCK_ST_GOOD)
++ nblock--;
++
++ if (nblock < 0) {
++ *nba = ba;
++ return true;
++ }
++
++ ba++;
++ }
++
++ return false;
++}
++
++/*
++ * nmbm_block_walk_desc - Skip specified number of good blocks, descending addr
++ * @ni: NMBM instance structure
++ * @ba: start physical block address
++ * @nba: return physical block address after walk
++ * @count: number of good blocks to be skipped
++ * @limit: lowest block address allowed for walking
++ *
++ * Start from @ba, skipping any bad blocks, counting @count good blocks, and
++ * return the next good block address.
++ *
++ * If no enough good blocks counted while @limit reached, false will be returned.
++ *
++ * If @count == 0, nearest good block address will be returned.
++ * @limit is not counted in walking.
++ */
++static bool nmbm_block_walk_desc(struct nmbm_instance *ni, uint32_t ba,
++ uint32_t *nba, uint32_t count, uint32_t limit)
++{
++ int32_t nblock = count;
++
++ if (limit >= ni->block_count)
++ limit = ni->block_count - 1;
++
++ while (ba > limit) {
++ if (nmbm_get_block_state(ni, ba) == BLOCK_ST_GOOD)
++ nblock--;
++
++ if (nblock < 0) {
++ *nba = ba;
++ return true;
++ }
++
++ ba--;
++ }
++
++ return false;
++}
++
++/*
++ * nmbm_block_walk - Skip specified number of good blocks from curr. block addr
++ * @ni: NMBM instance structure
++ * @ascending: whether to walk ascending
++ * @ba: start physical block address
++ * @nba: return physical block address after walk
++ * @count: number of good blocks to be skipped
++ * @limit: highest/lowest block address allowed for walking
++ *
++ * Start from @ba, skipping any bad blocks, counting @count good blocks, and
++ * return the next good block address.
++ *
++ * If no enough good blocks counted while @limit reached, false will be returned.
++ *
++ * If @count == 0, nearest good block address will be returned.
++ * @limit can be set to negative if no limit required.
++ * @limit is not counted in walking.
++ */
++static bool nmbm_block_walk(struct nmbm_instance *ni, bool ascending,
++ uint32_t ba, uint32_t *nba, int32_t count,
++ int32_t limit)
++{
++ if (ascending)
++ return nmbm_block_walk_asc(ni, ba, nba, count, limit);
++
++ return nmbm_block_walk_desc(ni, ba, nba, count, limit);
++}
++
++/*
++ * nmbm_scan_badblocks - Scan and record all bad blocks
++ * @ni: NMBM instance structure
++ *
++ * Scan the entire lower NAND chip and record all bad blocks in to block state
++ * table.
++ */
++static void nmbm_scan_badblocks(struct nmbm_instance *ni)
++{
++ uint32_t ba;
++
++ for (ba = 0; ba < ni->block_count; ba++) {
++ if (nmbm_check_bad_phys_block(ni, ba)) {
++ nmbm_set_block_state(ni, ba, BLOCK_ST_BAD);
++ nlog_info(ni, "Bad block %u [0x%08llx]\n", ba,
++ ba2addr(ni, ba));
++ }
++ }
++}
++
++/*
++ * nmbm_build_mapping_table - Build initial block mapping table
++ * @ni: NMBM instance structure
++ *
++ * The initial mapping table will be compatible with the stratage of
++ * factory production.
++ */
++static void nmbm_build_mapping_table(struct nmbm_instance *ni)
++{
++ uint32_t pb, lb;
++
++ for (pb = 0, lb = 0; pb < ni->mgmt_start_ba; pb++) {
++ if (nmbm_get_block_state(ni, pb) == BLOCK_ST_BAD)
++ continue;
++
++ /* Always map to the next good block */
++ ni->block_mapping[lb++] = pb;
++ }
++
++ ni->data_block_count = lb;
++
++ /* Unusable/Management blocks */
++ for (pb = lb; pb < ni->block_count; pb++)
++ ni->block_mapping[pb] = -1;
++}
++
++/*
++ * nmbm_erase_block_and_check - Erase a block and check its usability
++ * @ni: NMBM instance structure
++ * @ba: block address to be erased
++ *
++ * Erase a block anc check its usability
++ *
++ * Return true if the block is usable, false if erasure failure or the block
++ * has too many bitflips.
++ */
++static bool nmbm_erase_block_and_check(struct nmbm_instance *ni, uint32_t ba)
++{
++ uint64_t addr, off;
++ bool success;
++ int ret;
++
++ success = nmbm_erase_phys_block(ni, ba2addr(ni, ba));
++ if (!success)
++ return false;
++
++ if (!(ni->lower.flags & NMBM_F_EMPTY_PAGE_ECC_OK))
++ return true;
++
++ /* Check every page to make sure there aren't too many bitflips */
++
++ addr = ba2addr(ni, ba);
++
++ for (off = 0; off < ni->lower.erasesize; off += ni->lower.writesize) {
++ schedule();
++
++ ret = nmbm_read_phys_page(ni, addr + off, ni->page_cache, NULL,
++ NMBM_MODE_PLACE_OOB);
++ if (ret == -EBADMSG) {
++ /*
++ * NMBM_F_EMPTY_PAGE_ECC_OK means the empty page is
++ * still protected by ECC. So reading pages with ECC
++ * enabled and -EBADMSG means there are too many
++ * bitflips that can't be recovered, and the block
++ * containing the page should be marked bad.
++ */
++ nlog_err(ni,
++ "Too many bitflips in empty page at 0x%llx\n",
++ addr + off);
++ return false;
++ }
++ }
++
++ return true;
++}
++
++/*
++ * nmbm_erase_range - Erase a range of blocks
++ * @ni: NMBM instance structure
++ * @ba: block address where the erasure will start
++ * @limit: top block address allowed for erasure
++ *
++ * Erase blocks within the specific range. Newly-found bad blocks will be
++ * marked.
++ *
++ * @limit is not counted into the allowed erasure address.
++ */
++static void nmbm_erase_range(struct nmbm_instance *ni, uint32_t ba,
++ uint32_t limit)
++{
++ bool success;
++
++ while (ba < limit) {
++ schedule();
++
++ if (nmbm_get_block_state(ni, ba) != BLOCK_ST_GOOD)
++ goto next_block;
++
++ /* Insurance to detect unexpected bad block marked by user */
++ if (nmbm_check_bad_phys_block(ni, ba)) {
++ nmbm_set_block_state(ni, ba, BLOCK_ST_BAD);
++ goto next_block;
++ }
++
++ success = nmbm_erase_block_and_check(ni, ba);
++ if (success)
++ goto next_block;
++
++ nmbm_mark_phys_bad_block(ni, ba);
++ nmbm_set_block_state(ni, ba, BLOCK_ST_BAD);
++
++ next_block:
++ ba++;
++ }
++}
++
++/*
++ * nmbm_write_repeated_data - Write critical data to a block with retry
++ * @ni: NMBM instance structure
++ * @ba: block address where the data will be written to
++ * @data: the data to be written
++ * @size: size of the data
++ *
++ * Write data to every page of the block. Success only if all pages within
++ * this block have been successfully written.
++ *
++ * Make sure data size is not bigger than one page.
++ *
++ * This function will write and verify every page for at most
++ * NMBM_TRY_COUNT times.
++ */
++static bool nmbm_write_repeated_data(struct nmbm_instance *ni, uint32_t ba,
++ const void *data, uint32_t size)
++{
++ uint64_t addr, off;
++ bool success;
++ int ret;
++
++ if (size > ni->lower.writesize)
++ return false;
++
++ addr = ba2addr(ni, ba);
++
++ for (off = 0; off < ni->lower.erasesize; off += ni->lower.writesize) {
++ schedule();
++
++ /* Prepare page data. fill 0xff to unused region */
++ memcpy(ni->page_cache, data, size);
++ memset(ni->page_cache + size, 0xff, ni->rawpage_size - size);
++
++ success = nmbm_write_phys_page(ni, addr + off, ni->page_cache,
++ NULL, NMBM_MODE_PLACE_OOB);
++ if (!success)
++ return false;
++
++ /* Verify the data just written. ECC error indicates failure */
++ ret = nmbm_read_phys_page(ni, addr + off, ni->page_cache, NULL,
++ NMBM_MODE_PLACE_OOB);
++ if (ret < 0)
++ return false;
++
++ if (memcmp(ni->page_cache, data, size))
++ return false;
++ }
++
++ return true;
++}
++
++/*
++ * nmbm_write_signature - Write signature to NAND chip
++ * @ni: NMBM instance structure
++ * @limit: top block address allowed for writing
++ * @signature: the signature to be written
++ * @signature_ba: the actual block address where signature is written to
++ *
++ * Write signature within a specific range, from chip bottom to limit.
++ * At most one block will be written.
++ *
++ * @limit is not counted into the allowed write address.
++ */
++static bool nmbm_write_signature(struct nmbm_instance *ni, uint32_t limit,
++ const struct nmbm_signature *signature,
++ uint32_t *signature_ba)
++{
++ uint32_t ba = ni->block_count - 1;
++ bool success;
++
++ while (ba > limit) {
++ schedule();
++
++ if (nmbm_get_block_state(ni, ba) != BLOCK_ST_GOOD)
++ goto next_block;
++
++ /* Insurance to detect unexpected bad block marked by user */
++ if (nmbm_check_bad_phys_block(ni, ba)) {
++ nmbm_set_block_state(ni, ba, BLOCK_ST_BAD);
++ goto next_block;
++ }
++
++ success = nmbm_erase_block_and_check(ni, ba);
++ if (!success)
++ goto skip_bad_block;
++
++ success = nmbm_write_repeated_data(ni, ba, signature,
++ sizeof(*signature));
++ if (success) {
++ *signature_ba = ba;
++ return true;
++ }
++
++ skip_bad_block:
++ nmbm_mark_phys_bad_block(ni, ba);
++ nmbm_set_block_state(ni, ba, BLOCK_ST_BAD);
++
++ next_block:
++ ba--;
++ };
++
++ return false;
++}
++
++/*
++ * nmbn_read_data - Read data
++ * @ni: NMBM instance structure
++ * @addr: linear address where the data will be read from
++ * @data: the data to be read
++ * @size: the size of data
++ *
++ * Read data range.
++ * Every page will be tried for at most NMBM_TRY_COUNT times.
++ *
++ * Return 0 for success, positive value for corrected bitflip count,
++ * -EBADMSG for ecc error, other negative values for other errors
++ */
++static int nmbn_read_data(struct nmbm_instance *ni, uint64_t addr, void *data,
++ uint32_t size)
++{
++ uint64_t off = addr;
++ uint8_t *ptr = data;
++ uint32_t sizeremain = size, chunksize, leading;
++ int ret;
++
++ while (sizeremain) {
++ schedule();
++
++ leading = off & ni->writesize_mask;
++ chunksize = ni->lower.writesize - leading;
++ if (chunksize > sizeremain)
++ chunksize = sizeremain;
++
++ if (chunksize == ni->lower.writesize) {
++ ret = nmbm_read_phys_page(ni, off - leading, ptr, NULL,
++ NMBM_MODE_PLACE_OOB);
++ if (ret < 0)
++ return ret;
++ } else {
++ ret = nmbm_read_phys_page(ni, off - leading,
++ ni->page_cache, NULL,
++ NMBM_MODE_PLACE_OOB);
++ if (ret < 0)
++ return ret;
++
++ memcpy(ptr, ni->page_cache + leading, chunksize);
++ }
++
++ off += chunksize;
++ ptr += chunksize;
++ sizeremain -= chunksize;
++ }
++
++ return 0;
++}
++
++/*
++ * nmbn_write_verify_data - Write data with validation
++ * @ni: NMBM instance structure
++ * @addr: linear address where the data will be written to
++ * @data: the data to be written
++ * @size: the size of data
++ *
++ * Write data and verify.
++ * Every page will be tried for at most NMBM_TRY_COUNT times.
++ */
++static bool nmbn_write_verify_data(struct nmbm_instance *ni, uint64_t addr,
++ const void *data, uint32_t size)
++{
++ uint64_t off = addr;
++ const uint8_t *ptr = data;
++ uint32_t sizeremain = size, chunksize, leading;
++ bool success;
++ int ret;
++
++ while (sizeremain) {
++ schedule();
++
++ leading = off & ni->writesize_mask;
++ chunksize = ni->lower.writesize - leading;
++ if (chunksize > sizeremain)
++ chunksize = sizeremain;
++
++ /* Prepare page data. fill 0xff to unused region */
++ memset(ni->page_cache, 0xff, ni->rawpage_size);
++ memcpy(ni->page_cache + leading, ptr, chunksize);
++
++ success = nmbm_write_phys_page(ni, off - leading,
++ ni->page_cache, NULL,
++ NMBM_MODE_PLACE_OOB);
++ if (!success)
++ return false;
++
++ /* Verify the data just written. ECC error indicates failure */
++ ret = nmbm_read_phys_page(ni, off - leading, ni->page_cache,
++ NULL, NMBM_MODE_PLACE_OOB);
++ if (ret < 0)
++ return false;
++
++ if (memcmp(ni->page_cache + leading, ptr, chunksize))
++ return false;
++
++ off += chunksize;
++ ptr += chunksize;
++ sizeremain -= chunksize;
++ }
++
++ return true;
++}
++
++/*
++ * nmbm_write_mgmt_range - Write management data into NAND within a range
++ * @ni: NMBM instance structure
++ * @addr: preferred start block address for writing
++ * @limit: highest block address allowed for writing
++ * @data: the data to be written
++ * @size: the size of data
++ * @actual_start_ba: actual start block address of data
++ * @actual_end_ba: block address after the end of data
++ *
++ * @limit is not counted into the allowed write address.
++ */
++static bool nmbm_write_mgmt_range(struct nmbm_instance *ni, uint32_t ba,
++ uint32_t limit, const void *data,
++ uint32_t size, uint32_t *actual_start_ba,
++ uint32_t *actual_end_ba)
++{
++ const uint8_t *ptr = data;
++ uint32_t sizeremain = size, chunksize;
++ bool success;
++
++ while (sizeremain && ba < limit) {
++ schedule();
++
++ chunksize = sizeremain;
++ if (chunksize > ni->lower.erasesize)
++ chunksize = ni->lower.erasesize;
++
++ if (nmbm_get_block_state(ni, ba) != BLOCK_ST_GOOD)
++ goto next_block;
++
++ /* Insurance to detect unexpected bad block marked by user */
++ if (nmbm_check_bad_phys_block(ni, ba)) {
++ nmbm_set_block_state(ni, ba, BLOCK_ST_BAD);
++ goto next_block;
++ }
++
++ success = nmbm_erase_block_and_check(ni, ba);
++ if (!success)
++ goto skip_bad_block;
++
++ success = nmbn_write_verify_data(ni, ba2addr(ni, ba), ptr,
++ chunksize);
++ if (!success)
++ goto skip_bad_block;
++
++ if (sizeremain == size)
++ *actual_start_ba = ba;
++
++ ptr += chunksize;
++ sizeremain -= chunksize;
++
++ goto next_block;
++
++ skip_bad_block:
++ nmbm_mark_phys_bad_block(ni, ba);
++ nmbm_set_block_state(ni, ba, BLOCK_ST_BAD);
++
++ next_block:
++ ba++;
++ }
++
++ if (sizeremain)
++ return false;
++
++ *actual_end_ba = ba;
++
++ return true;
++}
++
++/*
++ * nmbm_generate_info_table_cache - Generate info table cache data
++ * @ni: NMBM instance structure
++ *
++ * Generate info table cache data to be written into flash.
++ */
++static bool nmbm_generate_info_table_cache(struct nmbm_instance *ni)
++{
++ bool changed = false;
++
++ memset(ni->info_table_cache, 0xff, ni->info_table_size);
++
++ memcpy(ni->info_table_cache + ni->info_table.state_table_off,
++ ni->block_state, ni->state_table_size);
++
++ memcpy(ni->info_table_cache + ni->info_table.mapping_table_off,
++ ni->block_mapping, ni->mapping_table_size);
++
++ ni->info_table.header.magic = NMBM_MAGIC_INFO_TABLE;
++ ni->info_table.header.version = NMBM_VER;
++ ni->info_table.header.size = ni->info_table_size;
++
++ if (ni->block_state_changed || ni->block_mapping_changed) {
++ ni->info_table.write_count++;
++ changed = true;
++ }
++
++ memcpy(ni->info_table_cache, &ni->info_table, sizeof(ni->info_table));
++
++ nmbm_update_checksum((struct nmbm_header *)ni->info_table_cache);
++
++ return changed;
++}
++
++/*
++ * nmbm_write_info_table - Write info table into NAND within a range
++ * @ni: NMBM instance structure
++ * @ba: preferred start block address for writing
++ * @limit: highest block address allowed for writing
++ * @actual_start_ba: actual start block address of info table
++ * @actual_end_ba: block address after the end of info table
++ *
++ * @limit is counted into the allowed write address.
++ */
++static bool nmbm_write_info_table(struct nmbm_instance *ni, uint32_t ba,
++ uint32_t limit, uint32_t *actual_start_ba,
++ uint32_t *actual_end_ba)
++{
++ return nmbm_write_mgmt_range(ni, ba, limit, ni->info_table_cache,
++ ni->info_table_size, actual_start_ba,
++ actual_end_ba);
++}
++
++/*
++ * nmbm_mark_tables_clean - Mark info table `clean'
++ * @ni: NMBM instance structure
++ */
++static void nmbm_mark_tables_clean(struct nmbm_instance *ni)
++{
++ ni->block_state_changed = 0;
++ ni->block_mapping_changed = 0;
++}
++
++/*
++ * nmbm_try_reserve_blocks - Reserve blocks with compromisation
++ * @ni: NMBM instance structure
++ * @ba: start physical block address
++ * @nba: return physical block address after reservation
++ * @count: number of good blocks to be skipped
++ * @min_count: minimum number of good blocks to be skipped
++ * @limit: highest/lowest block address allowed for walking
++ *
++ * Reserve specific blocks. If failed, try to reserve as many as possible.
++ */
++static bool nmbm_try_reserve_blocks(struct nmbm_instance *ni, uint32_t ba,
++ uint32_t *nba, uint32_t count,
++ int32_t min_count, int32_t limit)
++{
++ int32_t nblocks = count;
++ bool success;
++
++ while (nblocks >= min_count) {
++ success = nmbm_block_walk(ni, true, ba, nba, nblocks, limit);
++ if (success)
++ return true;
++
++ nblocks--;
++ }
++
++ return false;
++}
++
++/*
++ * nmbm_rebuild_info_table - Build main & backup info table from scratch
++ * @ni: NMBM instance structure
++ * @allow_no_gap: allow no spare blocks between two tables
++ */
++static bool nmbm_rebuild_info_table(struct nmbm_instance *ni)
++{
++ uint32_t table_start_ba, table_end_ba, next_start_ba;
++ uint32_t main_table_end_ba;
++ bool success;
++
++ /* Set initial value */
++ ni->main_table_ba = 0;
++ ni->backup_table_ba = 0;
++ ni->mapping_blocks_ba = ni->mapping_blocks_top_ba;
++
++ /* Write main table */
++ success = nmbm_write_info_table(ni, ni->mgmt_start_ba,
++ ni->mapping_blocks_top_ba,
++ &table_start_ba, &table_end_ba);
++ if (!success) {
++ /* Failed to write main table, data will be lost */
++ nlog_emerg(ni, "Unable to write at least one info table!\n");
++ nlog_emerg(ni, "Please save your data before power off!\n");
++ ni->protected = 1;
++ return false;
++ }
++
++ /* Main info table is successfully written, record its offset */
++ ni->main_table_ba = table_start_ba;
++ main_table_end_ba = table_end_ba;
++
++ /* Adjust mapping_blocks_ba */
++ ni->mapping_blocks_ba = table_end_ba;
++
++ nmbm_mark_tables_clean(ni);
++
++ nlog_table_creation(ni, true, table_start_ba, table_end_ba);
++
++ /* Reserve spare blocks for main info table. */
++ success = nmbm_try_reserve_blocks(ni, table_end_ba,
++ &next_start_ba,
++ ni->info_table_spare_blocks, 0,
++ ni->mapping_blocks_top_ba -
++ size2blk(ni, ni->info_table_size));
++ if (!success) {
++ /* There is no spare block. */
++ nlog_debug(ni, "No room for backup info table\n");
++ return true;
++ }
++
++ /* Write backup info table. */
++ success = nmbm_write_info_table(ni, next_start_ba,
++ ni->mapping_blocks_top_ba,
++ &table_start_ba, &table_end_ba);
++ if (!success) {
++ /* There is no enough blocks for backup table. */
++ nlog_debug(ni, "No room for backup info table\n");
++ return true;
++ }
++
++ /* Backup table is successfully written, record its offset */
++ ni->backup_table_ba = table_start_ba;
++
++ /* Adjust mapping_blocks_off */
++ ni->mapping_blocks_ba = table_end_ba;
++
++ /* Erase spare blocks of main table to clean possible interference data */
++ nmbm_erase_range(ni, main_table_end_ba, ni->backup_table_ba);
++
++ nlog_table_creation(ni, false, table_start_ba, table_end_ba);
++
++ return true;
++}
++
++/*
++ * nmbm_rescue_single_info_table - Rescue when there is only one info table
++ * @ni: NMBM instance structure
++ *
++ * This function is called when there is only one info table exists.
++ * This function may fail if we can't write new info table
++ */
++static bool nmbm_rescue_single_info_table(struct nmbm_instance *ni)
++{
++ uint32_t table_start_ba, table_end_ba, write_ba;
++ bool success;
++
++ /* Try to write new info table in front of existing table */
++ success = nmbm_write_info_table(ni, ni->mgmt_start_ba,
++ ni->main_table_ba,
++ &table_start_ba,
++ &table_end_ba);
++ if (success) {
++ /*
++ * New table becomes the main table, existing table becomes
++ * the backup table.
++ */
++ ni->backup_table_ba = ni->main_table_ba;
++ ni->main_table_ba = table_start_ba;
++
++ nmbm_mark_tables_clean(ni);
++
++ /* Erase spare blocks of main table to clean possible interference data */
++ nmbm_erase_range(ni, table_end_ba, ni->backup_table_ba);
++
++ nlog_table_creation(ni, true, table_start_ba, table_end_ba);
++
++ return true;
++ }
++
++ /* Try to reserve spare blocks for existing table */
++ success = nmbm_try_reserve_blocks(ni, ni->mapping_blocks_ba, &write_ba,
++ ni->info_table_spare_blocks, 0,
++ ni->mapping_blocks_top_ba -
++ size2blk(ni, ni->info_table_size));
++ if (!success) {
++ nlog_warn(ni, "Failed to rescue single info table\n");
++ return false;
++ }
++
++ /* Try to write new info table next to the existing table */
++ while (write_ba >= ni->mapping_blocks_ba) {
++ schedule();
++
++ success = nmbm_write_info_table(ni, write_ba,
++ ni->mapping_blocks_top_ba,
++ &table_start_ba,
++ &table_end_ba);
++ if (success)
++ break;
++
++ write_ba--;
++ }
++
++ if (success) {
++ /* Erase spare blocks of main table to clean possible interference data */
++ nmbm_erase_range(ni, ni->mapping_blocks_ba, table_start_ba);
++
++ /* New table becomes the backup table */
++ ni->backup_table_ba = table_start_ba;
++ ni->mapping_blocks_ba = table_end_ba;
++
++ nmbm_mark_tables_clean(ni);
++
++ nlog_table_creation(ni, false, table_start_ba, table_end_ba);
++
++ return true;
++ }
++
++ nlog_warn(ni, "Failed to rescue single info table\n");
++ return false;
++}
++
++/*
++ * nmbm_update_single_info_table - Update specific one info table
++ * @ni: NMBM instance structure
++ */
++static bool nmbm_update_single_info_table(struct nmbm_instance *ni,
++ bool update_main_table)
++{
++ uint32_t write_start_ba, write_limit, table_start_ba, table_end_ba;
++ bool success;
++
++ /* Determine the write range */
++ if (update_main_table) {
++ write_start_ba = ni->main_table_ba;
++ write_limit = ni->backup_table_ba;
++ } else {
++ write_start_ba = ni->backup_table_ba;
++ write_limit = ni->mapping_blocks_top_ba;
++ }
++
++ nmbm_mark_block_color_mgmt(ni, write_start_ba, write_limit - 1);
++
++ success = nmbm_write_info_table(ni, write_start_ba, write_limit,
++ &table_start_ba, &table_end_ba);
++ if (success) {
++ if (update_main_table) {
++ ni->main_table_ba = table_start_ba;
++ } else {
++ ni->backup_table_ba = table_start_ba;
++ ni->mapping_blocks_ba = table_end_ba;
++ }
++
++ nmbm_mark_tables_clean(ni);
++
++ nlog_table_update(ni, update_main_table, table_start_ba,
++ table_end_ba);
++
++ return true;
++ }
++
++ if (update_main_table) {
++ /*
++ * If failed to update main table, make backup table the new
++ * main table, and call nmbm_rescue_single_info_table()
++ */
++ nlog_warn(ni, "Unable to update %s info table\n",
++ update_main_table ? "Main" : "Backup");
++
++ ni->main_table_ba = ni->backup_table_ba;
++ ni->backup_table_ba = 0;
++ return nmbm_rescue_single_info_table(ni);
++ }
++
++ /* Only one table left */
++ ni->mapping_blocks_ba = ni->backup_table_ba;
++ ni->backup_table_ba = 0;
++
++ return false;
++}
++
++/*
++ * nmbm_rescue_main_info_table - Rescue when failed to write main info table
++ * @ni: NMBM instance structure
++ *
++ * This function is called when main info table failed to be written, and
++ * backup info table exists.
++ */
++static bool nmbm_rescue_main_info_table(struct nmbm_instance *ni)
++{
++ uint32_t tmp_table_start_ba, tmp_table_end_ba, main_table_start_ba;
++ uint32_t main_table_end_ba, write_ba;
++ uint32_t info_table_erasesize = size2blk(ni, ni->info_table_size);
++ bool success;
++
++ /* Try to reserve spare blocks for existing backup info table */
++ success = nmbm_try_reserve_blocks(ni, ni->mapping_blocks_ba, &write_ba,
++ ni->info_table_spare_blocks, 0,
++ ni->mapping_blocks_top_ba -
++ info_table_erasesize);
++ if (!success) {
++ /* There is no spare block. Backup info table becomes the main table. */
++ nlog_err(ni, "No room for temporary info table\n");
++ ni->main_table_ba = ni->backup_table_ba;
++ ni->backup_table_ba = 0;
++ return true;
++ }
++
++ /* Try to write temporary info table into spare unmapped blocks */
++ while (write_ba >= ni->mapping_blocks_ba) {
++ schedule();
++
++ success = nmbm_write_info_table(ni, write_ba,
++ ni->mapping_blocks_top_ba,
++ &tmp_table_start_ba,
++ &tmp_table_end_ba);
++ if (success)
++ break;
++
++ write_ba--;
++ }
++
++ if (!success) {
++ /* Backup info table becomes the main table */
++ nlog_err(ni, "Failed to update main info table\n");
++ ni->main_table_ba = ni->backup_table_ba;
++ ni->backup_table_ba = 0;
++ return true;
++ }
++
++ /* Adjust mapping_blocks_off */
++ ni->mapping_blocks_ba = tmp_table_end_ba;
++
++ nmbm_mark_block_color_mgmt(ni, ni->backup_table_ba,
++ tmp_table_end_ba - 1);
++
++ /*
++ * Now write main info table at the beginning of management area.
++ * This operation will generally destroy the original backup info
++ * table.
++ */
++ success = nmbm_write_info_table(ni, ni->mgmt_start_ba,
++ tmp_table_start_ba,
++ &main_table_start_ba,
++ &main_table_end_ba);
++ if (!success) {
++ /* Temporary info table becomes the main table */
++ ni->main_table_ba = tmp_table_start_ba;
++ ni->backup_table_ba = 0;
++
++ nmbm_mark_tables_clean(ni);
++
++ nlog_err(ni, "Failed to update main info table\n");
++ nmbm_mark_block_color_info_table(ni, tmp_table_start_ba,
++ tmp_table_end_ba - 1);
++
++ return true;
++ }
++
++ /* Main info table has been successfully written, record its offset */
++ ni->main_table_ba = main_table_start_ba;
++
++ nmbm_mark_tables_clean(ni);
++
++ nlog_table_creation(ni, true, main_table_start_ba, main_table_end_ba);
++
++ /*
++ * Temporary info table becomes the new backup info table if it's
++ * not overwritten.
++ */
++ if (main_table_end_ba <= tmp_table_start_ba) {
++ ni->backup_table_ba = tmp_table_start_ba;
++
++ nlog_table_creation(ni, false, tmp_table_start_ba,
++ tmp_table_end_ba);
++
++ return true;
++ }
++
++ /* Adjust mapping_blocks_off */
++ ni->mapping_blocks_ba = main_table_end_ba;
++
++ /* Try to reserve spare blocks for new main info table */
++ success = nmbm_try_reserve_blocks(ni, main_table_end_ba, &write_ba,
++ ni->info_table_spare_blocks, 0,
++ ni->mapping_blocks_top_ba -
++ info_table_erasesize);
++ if (!success) {
++ /* There is no spare block. Only main table exists. */
++ nlog_err(ni, "No room for backup info table\n");
++ ni->backup_table_ba = 0;
++ return true;
++ }
++
++ /* Write new backup info table. */
++ while (write_ba >= main_table_end_ba) {
++ schedule();
++
++ success = nmbm_write_info_table(ni, write_ba,
++ ni->mapping_blocks_top_ba,
++ &tmp_table_start_ba,
++ &tmp_table_end_ba);
++ if (success)
++ break;
++
++ write_ba--;
++ }
++
++ if (!success) {
++ nlog_err(ni, "No room for backup info table\n");
++ ni->backup_table_ba = 0;
++ return true;
++ }
++
++ /* Backup info table has been successfully written, record its offset */
++ ni->backup_table_ba = tmp_table_start_ba;
++
++ /* Adjust mapping_blocks_off */
++ ni->mapping_blocks_ba = tmp_table_end_ba;
++
++ /* Erase spare blocks of main table to clean possible interference data */
++ nmbm_erase_range(ni, main_table_end_ba, ni->backup_table_ba);
++
++ nlog_table_creation(ni, false, tmp_table_start_ba, tmp_table_end_ba);
++
++ return true;
++}
++
++/*
++ * nmbm_update_info_table_once - Update info table once
++ * @ni: NMBM instance structure
++ * @force: force update
++ *
++ * Update both main and backup info table. Return true if at least one info
++ * table has been successfully written.
++ * This function only try to update info table once regard less of the result.
++ */
++static bool nmbm_update_info_table_once(struct nmbm_instance *ni, bool force)
++{
++ uint32_t table_start_ba, table_end_ba;
++ uint32_t main_table_limit;
++ bool success;
++
++ /* Do nothing if there is no change */
++ if (!nmbm_generate_info_table_cache(ni) && !force)
++ return true;
++
++ /* Check whether both two tables exist */
++ if (!ni->backup_table_ba) {
++ main_table_limit = ni->mapping_blocks_top_ba;
++ goto write_main_table;
++ }
++
++ nmbm_mark_block_color_mgmt(ni, ni->backup_table_ba,
++ ni->mapping_blocks_ba - 1);
++
++ /*
++ * Write backup info table in its current range.
++ * Note that limit is set to mapping_blocks_top_off to provide as many
++ * spare blocks as possible for the backup table. If at last
++ * unmapped blocks are used by backup table, mapping_blocks_off will
++ * be adjusted.
++ */
++ success = nmbm_write_info_table(ni, ni->backup_table_ba,
++ ni->mapping_blocks_top_ba,
++ &table_start_ba, &table_end_ba);
++ if (!success) {
++ /*
++ * There is nothing to do if failed to write backup table.
++ * Write the main table now.
++ */
++ nlog_err(ni, "No room for backup table\n");
++ ni->mapping_blocks_ba = ni->backup_table_ba;
++ ni->backup_table_ba = 0;
++ main_table_limit = ni->mapping_blocks_top_ba;
++ goto write_main_table;
++ }
++
++ /* Backup table is successfully written, record its offset */
++ ni->backup_table_ba = table_start_ba;
++
++ /* Adjust mapping_blocks_off */
++ ni->mapping_blocks_ba = table_end_ba;
++
++ nmbm_mark_tables_clean(ni);
++
++ /* The normal limit of main table */
++ main_table_limit = ni->backup_table_ba;
++
++ nlog_table_update(ni, false, table_start_ba, table_end_ba);
++
++write_main_table:
++ if (!ni->main_table_ba)
++ goto rebuild_tables;
++
++ if (!ni->backup_table_ba)
++ nmbm_mark_block_color_mgmt(ni, ni->mgmt_start_ba,
++ ni->mapping_blocks_ba - 1);
++ else
++ nmbm_mark_block_color_mgmt(ni, ni->mgmt_start_ba,
++ ni->backup_table_ba - 1);
++
++ /* Write main info table in its current range */
++ success = nmbm_write_info_table(ni, ni->main_table_ba,
++ main_table_limit, &table_start_ba,
++ &table_end_ba);
++ if (!success) {
++ /* If failed to write main table, go rescue procedure */
++ if (!ni->backup_table_ba)
++ goto rebuild_tables;
++
++ return nmbm_rescue_main_info_table(ni);
++ }
++
++ /* Main info table is successfully written, record its offset */
++ ni->main_table_ba = table_start_ba;
++
++ /* Adjust mapping_blocks_off */
++ if (!ni->backup_table_ba)
++ ni->mapping_blocks_ba = table_end_ba;
++
++ nmbm_mark_tables_clean(ni);
++
++ nlog_table_update(ni, true, table_start_ba, table_end_ba);
++
++ return true;
++
++rebuild_tables:
++ return nmbm_rebuild_info_table(ni);
++}
++
++/*
++ * nmbm_update_info_table - Update info table
++ * @ni: NMBM instance structure
++ *
++ * Update both main and backup info table. Return true if at least one table
++ * has been successfully written.
++ * This function will try to update info table repeatedly until no new bad
++ * block found during updating.
++ */
++static bool nmbm_update_info_table(struct nmbm_instance *ni)
++{
++ bool success;
++
++ if (ni->protected)
++ return true;
++
++ while (ni->block_state_changed || ni->block_mapping_changed) {
++ success = nmbm_update_info_table_once(ni, false);
++ if (!success) {
++ nlog_err(ni, "Failed to update info table\n");
++ return false;
++ }
++ }
++
++ return true;
++}
++
++/*
++ * nmbm_map_block - Map a bad block to a unused spare block
++ * @ni: NMBM instance structure
++ * @lb: logic block addr to map
++ */
++static bool nmbm_map_block(struct nmbm_instance *ni, uint32_t lb)
++{
++ uint32_t pb;
++ bool success;
++
++ if (ni->mapping_blocks_ba == ni->mapping_blocks_top_ba) {
++ nlog_warn(ni, "No spare unmapped blocks.\n");
++ return false;
++ }
++
++ success = nmbm_block_walk(ni, false, ni->mapping_blocks_top_ba, &pb, 0,
++ ni->mapping_blocks_ba);
++ if (!success) {
++ nlog_warn(ni, "No spare unmapped blocks.\n");
++ nmbm_update_info_table(ni);
++ ni->mapping_blocks_top_ba = ni->mapping_blocks_ba;
++ return false;
++ }
++
++ ni->block_mapping[lb] = pb;
++ ni->mapping_blocks_top_ba--;
++ ni->block_mapping_changed++;
++
++ nlog_info(ni, "Logic block %u mapped to physical blcok %u\n", lb, pb);
++ nmbm_mark_block_color_mapped(ni, pb);
++
++ return true;
++}
++
++/*
++ * nmbm_create_info_table - Create info table(s)
++ * @ni: NMBM instance structure
++ *
++ * This function assumes that the chip has no existing info table(s)
++ */
++static bool nmbm_create_info_table(struct nmbm_instance *ni)
++{
++ uint32_t lb;
++ bool success;
++
++ /* Set initial mapping_blocks_top_off */
++ success = nmbm_block_walk(ni, false, ni->signature_ba,
++ &ni->mapping_blocks_top_ba, 1,
++ ni->mgmt_start_ba);
++ if (!success) {
++ nlog_err(ni, "No room for spare blocks\n");
++ return false;
++ }
++
++ /* Generate info table cache */
++ nmbm_generate_info_table_cache(ni);
++
++ /* Write info table */
++ success = nmbm_rebuild_info_table(ni);
++ if (!success) {
++ nlog_err(ni, "Failed to build info tables\n");
++ return false;
++ }
++
++ /* Remap bad block(s) at end of data area */
++ for (lb = ni->data_block_count; lb < ni->mgmt_start_ba; lb++) {
++ success = nmbm_map_block(ni, lb);
++ if (!success)
++ break;
++
++ ni->data_block_count++;
++ }
++
++ /* If state table and/or mapping table changed, update info table. */
++ success = nmbm_update_info_table(ni);
++ if (!success)
++ return false;
++
++ return true;
++}
++
++/*
++ * nmbm_create_new - Create NMBM on a new chip
++ * @ni: NMBM instance structure
++ */
++static bool nmbm_create_new(struct nmbm_instance *ni)
++{
++ bool success;
++
++ /* Determine the boundary of management blocks */
++ ni->mgmt_start_ba = ni->block_count * (NMBM_MGMT_DIV - ni->lower.max_ratio) / NMBM_MGMT_DIV;
++
++ if (ni->lower.max_reserved_blocks && ni->block_count - ni->mgmt_start_ba > ni->lower.max_reserved_blocks)
++ ni->mgmt_start_ba = ni->block_count - ni->lower.max_reserved_blocks;
++
++ nlog_info(ni, "NMBM management region starts at block %u [0x%08llx]\n",
++ ni->mgmt_start_ba, ba2addr(ni, ni->mgmt_start_ba));
++ nmbm_mark_block_color_mgmt(ni, ni->mgmt_start_ba, ni->block_count - 1);
++
++ /* Fill block state table & mapping table */
++ nmbm_scan_badblocks(ni);
++ nmbm_build_mapping_table(ni);
++
++ /* Write signature */
++ ni->signature.header.magic = NMBM_MAGIC_SIGNATURE;
++ ni->signature.header.version = NMBM_VER;
++ ni->signature.header.size = sizeof(ni->signature);
++ ni->signature.nand_size = ni->lower.size;
++ ni->signature.block_size = ni->lower.erasesize;
++ ni->signature.page_size = ni->lower.writesize;
++ ni->signature.spare_size = ni->lower.oobsize;
++ ni->signature.mgmt_start_pb = ni->mgmt_start_ba;
++ ni->signature.max_try_count = NMBM_TRY_COUNT;
++ nmbm_update_checksum(&ni->signature.header);
++
++ if (ni->lower.flags & NMBM_F_READ_ONLY) {
++ nlog_info(ni, "NMBM has been initialized in read-only mode\n");
++ return true;
++ }
++
++ success = nmbm_write_signature(ni, ni->mgmt_start_ba,
++ &ni->signature, &ni->signature_ba);
++ if (!success) {
++ nlog_err(ni, "Failed to write signature to a proper offset\n");
++ return false;
++ }
++
++ nlog_info(ni, "Signature has been written to block %u [0x%08llx]\n",
++ ni->signature_ba, ba2addr(ni, ni->signature_ba));
++ nmbm_mark_block_color_signature(ni, ni->signature_ba);
++
++ /* Write info table(s) */
++ success = nmbm_create_info_table(ni);
++ if (success) {
++ nlog_info(ni, "NMBM has been successfully created\n");
++ return true;
++ }
++
++ return false;
++}
++
++/*
++ * nmbm_check_info_table_header - Check if a info table header is valid
++ * @ni: NMBM instance structure
++ * @data: pointer to the info table header
++ */
++static bool nmbm_check_info_table_header(struct nmbm_instance *ni, void *data)
++{
++ struct nmbm_info_table_header *ifthdr = data;
++
++ if (ifthdr->header.magic != NMBM_MAGIC_INFO_TABLE)
++ return false;
++
++ if (ifthdr->header.size != ni->info_table_size)
++ return false;
++
++ if (ifthdr->mapping_table_off - ifthdr->state_table_off < ni->state_table_size)
++ return false;
++
++ if (ni->info_table_size - ifthdr->mapping_table_off < ni->mapping_table_size)
++ return false;
++
++ return true;
++}
++
++/*
++ * nmbm_check_info_table - Check if a whole info table is valid
++ * @ni: NMBM instance structure
++ * @start_ba: start block address of this table
++ * @end_ba: end block address of this table
++ * @data: pointer to the info table header
++ * @mapping_blocks_top_ba: return the block address of top remapped block
++ */
++static bool nmbm_check_info_table(struct nmbm_instance *ni, uint32_t start_ba,
++ uint32_t end_ba, void *data,
++ uint32_t *mapping_blocks_top_ba)
++{
++ struct nmbm_info_table_header *ifthdr = data;
++ int32_t *block_mapping = (int32_t *)((uintptr_t)data + ifthdr->mapping_table_off);
++ nmbm_bitmap_t *block_state = (nmbm_bitmap_t *)((uintptr_t)data + ifthdr->state_table_off);
++ uint32_t minimum_mapping_pb = ni->signature_ba;
++ uint32_t ba;
++
++ for (ba = 0; ba < ni->data_block_count; ba++) {
++ if ((block_mapping[ba] >= ni->data_block_count && block_mapping[ba] < end_ba) ||
++ block_mapping[ba] == ni->signature_ba)
++ return false;
++
++ if (block_mapping[ba] >= end_ba && block_mapping[ba] < minimum_mapping_pb)
++ minimum_mapping_pb = block_mapping[ba];
++ }
++
++ for (ba = start_ba; ba < end_ba; ba++) {
++ if (nmbm_get_block_state(ni, ba) != BLOCK_ST_GOOD)
++ continue;
++
++ if (nmbm_get_block_state_raw(block_state, ba) != BLOCK_ST_GOOD)
++ return false;
++ }
++
++ *mapping_blocks_top_ba = minimum_mapping_pb - 1;
++
++ return true;
++}
++
++/*
++ * nmbm_try_load_info_table - Try to load info table from a address
++ * @ni: NMBM instance structure
++ * @ba: start block address of the info table
++ * @eba: return the block address after end of the table
++ * @write_count: return the write count of this table
++ * @mapping_blocks_top_ba: return the block address of top remapped block
++ * @table_loaded: used to record whether ni->info_table has valid data
++ */
++static bool nmbm_try_load_info_table(struct nmbm_instance *ni, uint32_t ba,
++ uint32_t *eba, uint32_t *write_count,
++ uint32_t *mapping_blocks_top_ba,
++ bool table_loaded)
++{
++ struct nmbm_info_table_header *ifthdr = (void *)ni->info_table_cache;
++ uint8_t *off = ni->info_table_cache;
++ uint32_t limit = ba + size2blk(ni, ni->info_table_size);
++ uint32_t start_ba = 0, chunksize, sizeremain = ni->info_table_size;
++ bool success, checkhdr = true;
++ int ret;
++
++ while (sizeremain && ba < limit) {
++ schedule();
++
++ if (nmbm_get_block_state(ni, ba) != BLOCK_ST_GOOD)
++ goto next_block;
++
++ if (nmbm_check_bad_phys_block(ni, ba)) {
++ nmbm_set_block_state(ni, ba, BLOCK_ST_BAD);
++ goto next_block;
++ }
++
++ chunksize = sizeremain;
++ if (chunksize > ni->lower.erasesize)
++ chunksize = ni->lower.erasesize;
++
++ /* Assume block with ECC error has no info table data */
++ ret = nmbn_read_data(ni, ba2addr(ni, ba), off, chunksize);
++ if (ret < 0)
++ goto skip_bad_block;
++ else if (ret > 0)
++ return false;
++
++ if (checkhdr) {
++ success = nmbm_check_info_table_header(ni, off);
++ if (!success)
++ return false;
++
++ start_ba = ba;
++ checkhdr = false;
++ }
++
++ off += chunksize;
++ sizeremain -= chunksize;
++
++ goto next_block;
++
++ skip_bad_block:
++ /* Only mark bad in memory */
++ nmbm_set_block_state(ni, ba, BLOCK_ST_BAD);
++
++ next_block:
++ ba++;
++ }
++
++ if (sizeremain)
++ return false;
++
++ success = nmbm_check_header(ni->info_table_cache, ni->info_table_size);
++ if (!success)
++ return false;
++
++ *eba = ba;
++ *write_count = ifthdr->write_count;
++
++ success = nmbm_check_info_table(ni, start_ba, ba, ni->info_table_cache,
++ mapping_blocks_top_ba);
++ if (!success)
++ return false;
++
++ if (!table_loaded || ifthdr->write_count > ni->info_table.write_count) {
++ memcpy(&ni->info_table, ifthdr, sizeof(ni->info_table));
++ memcpy(ni->block_state,
++ (uint8_t *)ifthdr + ifthdr->state_table_off,
++ ni->state_table_size);
++ memcpy(ni->block_mapping,
++ (uint8_t *)ifthdr + ifthdr->mapping_table_off,
++ ni->mapping_table_size);
++ ni->info_table.write_count = ifthdr->write_count;
++ }
++
++ return true;
++}
++
++/*
++ * nmbm_search_info_table - Search info table from specific address
++ * @ni: NMBM instance structure
++ * @ba: start block address to search
++ * @limit: highest block address allowed for searching
++ * @table_start_ba: return the start block address of this table
++ * @table_end_ba: return the block address after end of this table
++ * @write_count: return the write count of this table
++ * @mapping_blocks_top_ba: return the block address of top remapped block
++ * @table_loaded: used to record whether ni->info_table has valid data
++ */
++static bool nmbm_search_info_table(struct nmbm_instance *ni, uint32_t ba,
++ uint32_t limit, uint32_t *table_start_ba,
++ uint32_t *table_end_ba,
++ uint32_t *write_count,
++ uint32_t *mapping_blocks_top_ba,
++ bool table_loaded)
++{
++ bool success;
++
++ while (ba < limit - size2blk(ni, ni->info_table_size)) {
++ schedule();
++
++ success = nmbm_try_load_info_table(ni, ba, table_end_ba,
++ write_count,
++ mapping_blocks_top_ba,
++ table_loaded);
++ if (success) {
++ *table_start_ba = ba;
++ return true;
++ }
++
++ ba++;
++ }
++
++ return false;
++}
++
++/*
++ * nmbm_load_info_table - Load info table(s) from a chip
++ * @ni: NMBM instance structure
++ * @ba: start block address to search info table
++ * @limit: highest block address allowed for searching
++ */
++static bool nmbm_load_info_table(struct nmbm_instance *ni, uint32_t ba,
++ uint32_t limit)
++{
++ uint32_t main_table_end_ba, backup_table_end_ba, table_end_ba;
++ uint32_t main_mapping_blocks_top_ba, backup_mapping_blocks_top_ba;
++ uint32_t main_table_write_count, backup_table_write_count;
++ uint32_t i;
++ bool success;
++
++ /* Set initial value */
++ ni->main_table_ba = 0;
++ ni->backup_table_ba = 0;
++ ni->info_table.write_count = 0;
++ ni->mapping_blocks_top_ba = ni->signature_ba - 1;
++ ni->data_block_count = ni->signature.mgmt_start_pb;
++
++ /* Find first info table */
++ success = nmbm_search_info_table(ni, ba, limit, &ni->main_table_ba,
++ &main_table_end_ba, &main_table_write_count,
++ &main_mapping_blocks_top_ba, false);
++ if (!success) {
++ nlog_warn(ni, "No valid info table found\n");
++ return false;
++ }
++
++ table_end_ba = main_table_end_ba;
++
++ nlog_table_found(ni, true, main_table_write_count, ni->main_table_ba,
++ main_table_end_ba);
++
++ /* Find second info table */
++ success = nmbm_search_info_table(ni, main_table_end_ba, limit,
++ &ni->backup_table_ba, &backup_table_end_ba,
++ &backup_table_write_count, &backup_mapping_blocks_top_ba, true);
++ if (!success) {
++ nlog_warn(ni, "Second info table not found\n");
++ } else {
++ table_end_ba = backup_table_end_ba;
++
++ nlog_table_found(ni, false, backup_table_write_count,
++ ni->backup_table_ba, backup_table_end_ba);
++ }
++
++ /* Pick mapping_blocks_top_ba */
++ if (!ni->backup_table_ba) {
++ ni->mapping_blocks_top_ba= main_mapping_blocks_top_ba;
++ } else {
++ if (main_table_write_count >= backup_table_write_count)
++ ni->mapping_blocks_top_ba = main_mapping_blocks_top_ba;
++ else
++ ni->mapping_blocks_top_ba = backup_mapping_blocks_top_ba;
++ }
++
++ /* Set final mapping_blocks_ba */
++ ni->mapping_blocks_ba = table_end_ba;
++
++ /* Set final data_block_count */
++ for (i = ni->signature.mgmt_start_pb; i > 0; i--) {
++ if (ni->block_mapping[i - 1] >= 0) {
++ ni->data_block_count = i;
++ break;
++ }
++ }
++
++ /* Debug purpose: mark mapped blocks and bad blocks */
++ for (i = 0; i < ni->data_block_count; i++) {
++ if (ni->block_mapping[i] > ni->mapping_blocks_top_ba)
++ nmbm_mark_block_color_mapped(ni, ni->block_mapping[i]);
++ }
++
++ for (i = 0; i < ni->block_count; i++) {
++ if (nmbm_get_block_state(ni, i) == BLOCK_ST_BAD)
++ nmbm_mark_block_color_bad(ni, i);
++ }
++
++ /* Regenerate the info table cache from the final selected info table */
++ nmbm_generate_info_table_cache(ni);
++
++ if (ni->lower.flags & NMBM_F_READ_ONLY)
++ return true;
++
++ /*
++ * If only one table exists, try to write another table.
++ * If two tables have different write count, try to update info table
++ */
++ if (!ni->backup_table_ba) {
++ success = nmbm_rescue_single_info_table(ni);
++ } else if (main_table_write_count != backup_table_write_count) {
++ /* Mark state & mapping tables changed */
++ ni->block_state_changed = 1;
++ ni->block_mapping_changed = 1;
++
++ success = nmbm_update_single_info_table(ni,
++ main_table_write_count < backup_table_write_count);
++ } else {
++ success = true;
++ }
++
++ /*
++ * If there is no spare unmapped blocks, or still only one table
++ * exists, set the chip to read-only
++ */
++ if (ni->mapping_blocks_ba == ni->mapping_blocks_top_ba) {
++ nlog_warn(ni, "No spare unmapped blocks. Device is now read-only\n");
++ ni->protected = 1;
++ } else if (!success) {
++ nlog_warn(ni, "Only one info table found. Device is now read-only\n");
++ ni->protected = 1;
++ }
++
++ return true;
++}
++
++/*
++ * nmbm_load_existing - Load NMBM from a new chip
++ * @ni: NMBM instance structure
++ */
++static bool nmbm_load_existing(struct nmbm_instance *ni)
++{
++ bool success;
++
++ /* Calculate the boundary of management blocks */
++ ni->mgmt_start_ba = ni->signature.mgmt_start_pb;
++
++ nlog_debug(ni, "NMBM management region starts at block %u [0x%08llx]\n",
++ ni->mgmt_start_ba, ba2addr(ni, ni->mgmt_start_ba));
++ nmbm_mark_block_color_mgmt(ni, ni->mgmt_start_ba,
++ ni->signature_ba - 1);
++
++ /* Look for info table(s) */
++ success = nmbm_load_info_table(ni, ni->mgmt_start_ba,
++ ni->signature_ba);
++ if (success) {
++ nlog_info(ni, "NMBM has been successfully attached %s\n",
++ (ni->lower.flags & NMBM_F_READ_ONLY) ? "in read-only mode" : "");
++ return true;
++ }
++
++ if (!(ni->lower.flags & NMBM_F_CREATE))
++ return false;
++
++ /* Fill block state table & mapping table */
++ nmbm_scan_badblocks(ni);
++ nmbm_build_mapping_table(ni);
++
++ if (ni->lower.flags & NMBM_F_READ_ONLY) {
++ nlog_info(ni, "NMBM has been initialized in read-only mode\n");
++ return true;
++ }
++
++ /* Write info table(s) */
++ success = nmbm_create_info_table(ni);
++ if (success) {
++ nlog_info(ni, "NMBM has been successfully created\n");
++ return true;
++ }
++
++ return false;
++}
++
++/*
++ * nmbm_find_signature - Find signature in the lower NAND chip
++ * @ni: NMBM instance structure
++ * @signature_ba: used for storing block address of the signature
++ * @signature_ba: return the actual block address of signature block
++ *
++ * Find a valid signature from a specific range in the lower NAND chip,
++ * from bottom (highest address) to top (lowest address)
++ *
++ * Return true if found.
++ */
++static bool nmbm_find_signature(struct nmbm_instance *ni,
++ struct nmbm_signature *signature,
++ uint32_t *signature_ba)
++{
++ struct nmbm_signature sig;
++ uint64_t off, addr;
++ uint32_t block_count, ba, limit;
++ bool success;
++ int ret;
++
++ /* Calculate top and bottom block address */
++ block_count = ni->lower.size >> ni->erasesize_shift;
++ ba = block_count;
++ limit = (block_count / NMBM_MGMT_DIV) * (NMBM_MGMT_DIV - ni->lower.max_ratio);
++ if (ni->lower.max_reserved_blocks && block_count - limit > ni->lower.max_reserved_blocks)
++ limit = block_count - ni->lower.max_reserved_blocks;
++
++ while (ba >= limit) {
++ schedule();
++
++ ba--;
++ addr = ba2addr(ni, ba);
++
++ if (nmbm_check_bad_phys_block(ni, ba))
++ continue;
++
++ /* Check every page.
++ * As long as at leaset one page contains valid signature,
++ * the block is treated as a valid signature block.
++ */
++ for (off = 0; off < ni->lower.erasesize;
++ off += ni->lower.writesize) {
++ schedule();
++
++ ret = nmbn_read_data(ni, addr + off, &sig,
++ sizeof(sig));
++ if (ret)
++ continue;
++
++ /* Check for header size and checksum */
++ success = nmbm_check_header(&sig, sizeof(sig));
++ if (!success)
++ continue;
++
++ /* Check for header magic */
++ if (sig.header.magic == NMBM_MAGIC_SIGNATURE) {
++ /* Found it */
++ memcpy(signature, &sig, sizeof(sig));
++ *signature_ba = ba;
++ return true;
++ }
++ }
++ };
++
++ return false;
++}
++
++/*
++ * is_power_of_2_u64 - Check whether a 64-bit integer is power of 2
++ * @n: number to check
++ */
++static bool is_power_of_2_u64(uint64_t n)
++{
++ return (n != 0 && ((n & (n - 1)) == 0));
++}
++
++/*
++ * nmbm_check_lower_members - Validate the members of lower NAND device
++ * @nld: Lower NAND chip structure
++ */
++static bool nmbm_check_lower_members(struct nmbm_lower_device *nld)
++{
++
++ if (!nld->size || !is_power_of_2_u64(nld->size)) {
++ nmbm_log_lower(nld, NMBM_LOG_ERR,
++ "Chip size %llu is not valid\n", nld->size);
++ return false;
++ }
++
++ if (!nld->erasesize || !is_power_of_2(nld->erasesize)) {
++ nmbm_log_lower(nld, NMBM_LOG_ERR,
++ "Block size %u is not valid\n", nld->erasesize);
++ return false;
++ }
++
++ if (!nld->writesize || !is_power_of_2(nld->writesize)) {
++ nmbm_log_lower(nld, NMBM_LOG_ERR,
++ "Page size %u is not valid\n", nld->writesize);
++ return false;
++ }
++
++ if (!nld->oobsize || !is_power_of_2(nld->oobsize)) {
++ nmbm_log_lower(nld, NMBM_LOG_ERR,
++ "Page spare size %u is not valid\n", nld->oobsize);
++ return false;
++ }
++
++ if (!nld->read_page) {
++ nmbm_log_lower(nld, NMBM_LOG_ERR, "read_page() is required\n");
++ return false;
++ }
++
++ if (!(nld->flags & NMBM_F_READ_ONLY) && (!nld->write_page || !nld->erase_block)) {
++ nmbm_log_lower(nld, NMBM_LOG_ERR,
++ "write_page() and erase_block() are required\n");
++ return false;
++ }
++
++ /* Data sanity check */
++ if (!nld->max_ratio)
++ nld->max_ratio = 1;
++
++ if (nld->max_ratio >= NMBM_MGMT_DIV - 1) {
++ nmbm_log_lower(nld, NMBM_LOG_ERR,
++ "max ratio %u is invalid\n", nld->max_ratio);
++ return false;
++ }
++
++ if (nld->max_reserved_blocks && nld->max_reserved_blocks < NMBM_MGMT_BLOCKS_MIN) {
++ nmbm_log_lower(nld, NMBM_LOG_ERR,
++ "max reserved blocks %u is too small\n", nld->max_reserved_blocks);
++ return false;
++ }
++
++ return true;
++}
++
++/*
++ * nmbm_calc_structure_size - Calculate the instance structure size
++ * @nld: NMBM lower device structure
++ */
++size_t nmbm_calc_structure_size(struct nmbm_lower_device *nld)
++{
++ uint32_t state_table_size, mapping_table_size, info_table_size;
++ uint32_t block_count;
++
++ block_count = nmbm_lldiv(nld->size, nld->erasesize);
++
++ /* Calculate info table size */
++ state_table_size = ((block_count + NMBM_BITMAP_BLOCKS_PER_UNIT - 1) /
++ NMBM_BITMAP_BLOCKS_PER_UNIT) * NMBM_BITMAP_UNIT_SIZE;
++ mapping_table_size = block_count * sizeof(int32_t);
++
++ info_table_size = NMBM_ALIGN(sizeof(struct nmbm_info_table_header),
++ nld->writesize);
++ info_table_size += NMBM_ALIGN(state_table_size, nld->writesize);
++ info_table_size += NMBM_ALIGN(mapping_table_size, nld->writesize);
++
++ return info_table_size + state_table_size + mapping_table_size +
++ nld->writesize + nld->oobsize + sizeof(struct nmbm_instance);
++}
++
++/*
++ * nmbm_init_structure - Initialize members of instance structure
++ * @ni: NMBM instance structure
++ */
++static void nmbm_init_structure(struct nmbm_instance *ni)
++{
++ uint32_t pages_per_block, blocks_per_chip;
++ uintptr_t ptr;
++
++ pages_per_block = ni->lower.erasesize / ni->lower.writesize;
++ blocks_per_chip = nmbm_lldiv(ni->lower.size, ni->lower.erasesize);
++
++ ni->rawpage_size = ni->lower.writesize + ni->lower.oobsize;
++ ni->rawblock_size = pages_per_block * ni->rawpage_size;
++ ni->rawchip_size = blocks_per_chip * ni->rawblock_size;
++
++ ni->writesize_mask = ni->lower.writesize - 1;
++ ni->erasesize_mask = ni->lower.erasesize - 1;
++
++ ni->writesize_shift = ffs(ni->lower.writesize) - 1;
++ ni->erasesize_shift = ffs(ni->lower.erasesize) - 1;
++
++ /* Calculate number of block this chip */
++ ni->block_count = ni->lower.size >> ni->erasesize_shift;
++
++ /* Calculate info table size */
++ ni->state_table_size = ((ni->block_count + NMBM_BITMAP_BLOCKS_PER_UNIT - 1) /
++ NMBM_BITMAP_BLOCKS_PER_UNIT) * NMBM_BITMAP_UNIT_SIZE;
++ ni->mapping_table_size = ni->block_count * sizeof(*ni->block_mapping);
++
++ ni->info_table_size = NMBM_ALIGN(sizeof(ni->info_table),
++ ni->lower.writesize);
++ ni->info_table.state_table_off = ni->info_table_size;
++
++ ni->info_table_size += NMBM_ALIGN(ni->state_table_size,
++ ni->lower.writesize);
++ ni->info_table.mapping_table_off = ni->info_table_size;
++
++ ni->info_table_size += NMBM_ALIGN(ni->mapping_table_size,
++ ni->lower.writesize);
++
++ ni->info_table_spare_blocks = nmbm_get_spare_block_count(
++ size2blk(ni, ni->info_table_size));
++
++ /* Assign memory to members */
++ ptr = (uintptr_t)ni + sizeof(*ni);
++
++ ni->info_table_cache = (void *)ptr;
++ ptr += ni->info_table_size;
++
++ ni->block_state = (void *)ptr;
++ ptr += ni->state_table_size;
++
++ ni->block_mapping = (void *)ptr;
++ ptr += ni->mapping_table_size;
++
++ ni->page_cache = (uint8_t *)ptr;
++
++ /* Initialize block state table */
++ ni->block_state_changed = 0;
++ memset(ni->block_state, 0xff, ni->state_table_size);
++
++ /* Initialize block mapping table */
++ ni->block_mapping_changed = 0;
++}
++
++/*
++ * nmbm_attach - Attach to a lower device
++ * @nld: NMBM lower device structure
++ * @ni: NMBM instance structure
++ */
++int nmbm_attach(struct nmbm_lower_device *nld, struct nmbm_instance *ni)
++{
++ bool success;
++
++ if (!nld || !ni)
++ return -EINVAL;
++
++ /* Set default log level */
++ ni->log_display_level = NMBM_DEFAULT_LOG_LEVEL;
++
++ /* Check lower members */
++ success = nmbm_check_lower_members(nld);
++ if (!success)
++ return -EINVAL;
++
++ /* Initialize NMBM instance */
++ memcpy(&ni->lower, nld, sizeof(struct nmbm_lower_device));
++ nmbm_init_structure(ni);
++
++ success = nmbm_find_signature(ni, &ni->signature, &ni->signature_ba);
++ if (!success) {
++ if (!(nld->flags & NMBM_F_CREATE)) {
++ nlog_err(ni, "Signature not found\n");
++ return -ENODEV;
++ }
++
++ success = nmbm_create_new(ni);
++ if (!success)
++ return -ENODEV;
++
++ return 0;
++ }
++
++ nlog_info(ni, "Signature found at block %u [0x%08llx]\n",
++ ni->signature_ba, ba2addr(ni, ni->signature_ba));
++ nmbm_mark_block_color_signature(ni, ni->signature_ba);
++
++ if (ni->signature.header.version != NMBM_VER) {
++ nlog_err(ni, "NMBM version %u.%u is not supported\n",
++ NMBM_VERSION_MAJOR_GET(ni->signature.header.version),
++ NMBM_VERSION_MINOR_GET(ni->signature.header.version));
++ return -EINVAL;
++ }
++
++ if (ni->signature.nand_size != nld->size ||
++ ni->signature.block_size != nld->erasesize ||
++ ni->signature.page_size != nld->writesize ||
++ ni->signature.spare_size != nld->oobsize) {
++ nlog_err(ni, "NMBM configuration mismatch\n");
++ return -EINVAL;
++ }
++
++ success = nmbm_load_existing(ni);
++ if (!success)
++ return -ENODEV;
++
++ return 0;
++}
++
++/*
++ * nmbm_detach - Detach from a lower device, and save all tables
++ * @ni: NMBM instance structure
++ */
++int nmbm_detach(struct nmbm_instance *ni)
++{
++ if (!ni)
++ return -EINVAL;
++
++ if (!(ni->lower.flags & NMBM_F_READ_ONLY))
++ nmbm_update_info_table(ni);
++
++ nmbm_mark_block_color_normal(ni, 0, ni->block_count - 1);
++
++ return 0;
++}
++
++/*
++ * nmbm_erase_logic_block - Erase a logic block
++ * @ni: NMBM instance structure
++ * @nmbm_erase_logic_block: logic block address
++ *
++ * Logic block will be mapped to physical block before erasing.
++ * Bad block found during erasinh will be remapped to a good block if there is
++ * still at least one good spare block available.
++ */
++static int nmbm_erase_logic_block(struct nmbm_instance *ni, uint32_t block_addr)
++{
++ uint32_t pb;
++ bool success;
++
++retry:
++ /* Map logic block to physical block */
++ pb = ni->block_mapping[block_addr];
++
++ /* Whether the logic block is good (has valid mapping) */
++ if ((int32_t)pb < 0) {
++ nlog_debug(ni, "Logic block %u is a bad block\n", block_addr);
++ return -EIO;
++ }
++
++ /* Remap logic block if current physical block is a bad block */
++ if (nmbm_get_block_state(ni, pb) == BLOCK_ST_BAD ||
++ nmbm_get_block_state(ni, pb) == BLOCK_ST_NEED_REMAP)
++ goto remap_logic_block;
++
++ /* Insurance to detect unexpected bad block marked by user */
++ if (nmbm_check_bad_phys_block(ni, pb)) {
++ nlog_warn(ni, "Found unexpected bad block possibly marked by user\n");
++ nmbm_set_block_state(ni, pb, BLOCK_ST_BAD);
++ goto remap_logic_block;
++ }
++
++ success = nmbm_erase_block_and_check(ni, pb);
++ if (success)
++ return 0;
++
++ /* Mark bad block */
++ nmbm_mark_phys_bad_block(ni, pb);
++ nmbm_set_block_state(ni, pb, BLOCK_ST_BAD);
++
++remap_logic_block:
++ /* Try to assign a new block */
++ success = nmbm_map_block(ni, block_addr);
++ if (!success) {
++ /* Mark logic block unusable, and update info table */
++ ni->block_mapping[block_addr] = -1;
++ if (nmbm_get_block_state(ni, pb) != BLOCK_ST_NEED_REMAP)
++ nmbm_set_block_state(ni, pb, BLOCK_ST_BAD);
++ nmbm_update_info_table(ni);
++ return -EIO;
++ }
++
++ /* Update info table before erasing */
++ if (nmbm_get_block_state(ni, pb) != BLOCK_ST_NEED_REMAP)
++ nmbm_set_block_state(ni, pb, BLOCK_ST_BAD);
++ nmbm_update_info_table(ni);
++
++ goto retry;
++}
++
++/*
++ * nmbm_erase_block_range - Erase logic blocks
++ * @ni: NMBM instance structure
++ * @addr: logic linear address
++ * @size: erase range
++ * @failed_addr: return failed block address if error occurs
++ */
++int nmbm_erase_block_range(struct nmbm_instance *ni, uint64_t addr,
++ uint64_t size, uint64_t *failed_addr)
++{
++ uint32_t start_ba, end_ba;
++ int ret;
++
++ if (!ni)
++ return -EINVAL;
++
++ /* Sanity check */
++ if (ni->protected || (ni->lower.flags & NMBM_F_READ_ONLY)) {
++ nlog_debug(ni, "Device is forced read-only\n");
++ return -EROFS;
++ }
++
++ if (addr >= ba2addr(ni, ni->data_block_count)) {
++ nlog_err(ni, "Address 0x%llx is invalid\n", addr);
++ return -EINVAL;
++ }
++
++ if (addr + size > ba2addr(ni, ni->data_block_count)) {
++ nlog_err(ni, "Erase range 0xllxu is too large\n", size);
++ return -EINVAL;
++ }
++
++ if (!size) {
++ nlog_warn(ni, "No blocks to be erased\n");
++ return 0;
++ }
++
++ start_ba = addr2ba(ni, addr);
++ end_ba = addr2ba(ni, addr + size - 1);
++
++ while (start_ba <= end_ba) {
++ schedule();
++
++ ret = nmbm_erase_logic_block(ni, start_ba);
++ if (ret) {
++ if (failed_addr)
++ *failed_addr = ba2addr(ni, start_ba);
++ return ret;
++ }
++
++ start_ba++;
++ }
++
++ return 0;
++}
++
++/*
++ * nmbm_read_logic_page - Read page based on logic address
++ * @ni: NMBM instance structure
++ * @addr: logic linear address
++ * @data: buffer to store main data. optional.
++ * @oob: buffer to store oob data. optional.
++ * @mode: read mode
++ *
++ * Return 0 for success, positive value for corrected bitflip count,
++ * -EBADMSG for ecc error, other negative values for other errors
++ */
++static int nmbm_read_logic_page(struct nmbm_instance *ni, uint64_t addr,
++ void *data, void *oob, enum nmbm_oob_mode mode)
++{
++ uint32_t lb, pb, offset;
++ uint64_t paddr;
++
++ /* Extract block address and in-block offset */
++ lb = addr2ba(ni, addr);
++ offset = addr & ni->erasesize_mask;
++
++ /* Map logic block to physical block */
++ pb = ni->block_mapping[lb];
++
++ /* Whether the logic block is good (has valid mapping) */
++ if ((int32_t)pb < 0) {
++ nlog_debug(ni, "Logic block %u is a bad block\n", lb);
++ return -EIO;
++ }
++
++ /* Fail if physical block is marked bad */
++ if (nmbm_get_block_state(ni, pb) == BLOCK_ST_BAD)
++ return -EIO;
++
++ /* Assemble new address */
++ paddr = ba2addr(ni, pb) + offset;
++
++ return nmbm_read_phys_page(ni, paddr, data, oob, mode);
++}
++
++/*
++ * nmbm_read_single_page - Read one page based on logic address
++ * @ni: NMBM instance structure
++ * @addr: logic linear address
++ * @data: buffer to store main data. optional.
++ * @oob: buffer to store oob data. optional.
++ * @mode: read mode
++ *
++ * Return 0 for success, positive value for corrected bitflip count,
++ * -EBADMSG for ecc error, other negative values for other errors
++ */
++int nmbm_read_single_page(struct nmbm_instance *ni, uint64_t addr, void *data,
++ void *oob, enum nmbm_oob_mode mode)
++{
++ if (!ni)
++ return -EINVAL;
++
++ /* Sanity check */
++ if (ni->protected) {
++ nlog_debug(ni, "Device is forced read-only\n");
++ return -EROFS;
++ }
++
++ if (addr >= ba2addr(ni, ni->data_block_count)) {
++ nlog_err(ni, "Address 0x%llx is invalid\n", addr);
++ return -EINVAL;
++ }
++
++ return nmbm_read_logic_page(ni, addr, data, oob, mode);
++}
++
++/*
++ * nmbm_read_range - Read data without oob
++ * @ni: NMBM instance structure
++ * @addr: logic linear address
++ * @size: data size to read
++ * @data: buffer to store main data to be read
++ * @mode: read mode
++ * @retlen: return actual data size read
++ *
++ * Return 0 for success, positive value for corrected bitflip count,
++ * -EBADMSG for ecc error, other negative values for other errors
++ */
++int nmbm_read_range(struct nmbm_instance *ni, uint64_t addr, size_t size,
++ void *data, enum nmbm_oob_mode mode, size_t *retlen)
++{
++ uint64_t off = addr;
++ uint8_t *ptr = data;
++ size_t sizeremain = size, chunksize, leading;
++ bool has_ecc_err = false;
++ int ret, max_bitflips = 0;
++
++ if (!ni)
++ return -EINVAL;
++
++ /* Sanity check */
++ if (ni->protected) {
++ nlog_debug(ni, "Device is forced read-only\n");
++ return -EROFS;
++ }
++
++ if (addr >= ba2addr(ni, ni->data_block_count)) {
++ nlog_err(ni, "Address 0x%llx is invalid\n", addr);
++ return -EINVAL;
++ }
++
++ if (addr + size > ba2addr(ni, ni->data_block_count)) {
++ nlog_err(ni, "Read range 0x%llx is too large\n", size);
++ return -EINVAL;
++ }
++
++ if (!size) {
++ nlog_warn(ni, "No data to be read\n");
++ return 0;
++ }
++
++ while (sizeremain) {
++ schedule();
++
++ leading = off & ni->writesize_mask;
++ chunksize = ni->lower.writesize - leading;
++ if (chunksize > sizeremain)
++ chunksize = sizeremain;
++
++ if (chunksize == ni->lower.writesize) {
++ ret = nmbm_read_logic_page(ni, off - leading, ptr,
++ NULL, mode);
++ if (ret < 0 && ret != -EBADMSG)
++ break;
++ } else {
++ ret = nmbm_read_logic_page(ni, off - leading,
++ ni->page_cache, NULL,
++ mode);
++ if (ret < 0 && ret != -EBADMSG)
++ break;
++
++ memcpy(ptr, ni->page_cache + leading, chunksize);
++ }
++
++ if (ret == -EBADMSG)
++ has_ecc_err = true;
++
++ if (ret > max_bitflips)
++ max_bitflips = ret;
++
++ off += chunksize;
++ ptr += chunksize;
++ sizeremain -= chunksize;
++ }
++
++ if (retlen)
++ *retlen = size - sizeremain;
++
++ if (ret < 0 && ret != -EBADMSG)
++ return ret;
++
++ if (has_ecc_err)
++ return -EBADMSG;
++
++ return max_bitflips;
++}
++
++/*
++ * nmbm_write_logic_page - Read page based on logic address
++ * @ni: NMBM instance structure
++ * @addr: logic linear address
++ * @data: buffer contains main data. optional.
++ * @oob: buffer contains oob data. optional.
++ * @mode: write mode
++ */
++static int nmbm_write_logic_page(struct nmbm_instance *ni, uint64_t addr,
++ const void *data, const void *oob,
++ enum nmbm_oob_mode mode)
++{
++ uint32_t lb, pb, offset;
++ uint64_t paddr;
++ bool success;
++
++ /* Extract block address and in-block offset */
++ lb = addr2ba(ni, addr);
++ offset = addr & ni->erasesize_mask;
++
++ /* Map logic block to physical block */
++ pb = ni->block_mapping[lb];
++
++ /* Whether the logic block is good (has valid mapping) */
++ if ((int32_t)pb < 0) {
++ nlog_debug(ni, "Logic block %u is a bad block\n", lb);
++ return -EIO;
++ }
++
++ /* Fail if physical block is marked bad */
++ if (nmbm_get_block_state(ni, pb) == BLOCK_ST_BAD)
++ return -EIO;
++
++ /* Assemble new address */
++ paddr = ba2addr(ni, pb) + offset;
++
++ success = nmbm_write_phys_page(ni, paddr, data, oob, mode);
++ if (success)
++ return 0;
++
++ /*
++ * Do not remap bad block here. Just mark this block in state table.
++ * Remap this block on erasing.
++ */
++ nmbm_set_block_state(ni, pb, BLOCK_ST_NEED_REMAP);
++ nmbm_update_info_table(ni);
++
++ return -EIO;
++}
++
++/*
++ * nmbm_write_single_page - Write one page based on logic address
++ * @ni: NMBM instance structure
++ * @addr: logic linear address
++ * @data: buffer contains main data. optional.
++ * @oob: buffer contains oob data. optional.
++ * @mode: write mode
++ */
++int nmbm_write_single_page(struct nmbm_instance *ni, uint64_t addr,
++ const void *data, const void *oob,
++ enum nmbm_oob_mode mode)
++{
++ if (!ni)
++ return -EINVAL;
++
++ /* Sanity check */
++ if (ni->protected || (ni->lower.flags & NMBM_F_READ_ONLY)) {
++ nlog_debug(ni, "Device is forced read-only\n");
++ return -EROFS;
++ }
++
++ if (addr >= ba2addr(ni, ni->data_block_count)) {
++ nlog_err(ni, "Address 0x%llx is invalid\n", addr);
++ return -EINVAL;
++ }
++
++ return nmbm_write_logic_page(ni, addr, data, oob, mode);
++}
++
++/*
++ * nmbm_write_range - Write data without oob
++ * @ni: NMBM instance structure
++ * @addr: logic linear address
++ * @size: data size to write
++ * @data: buffer contains data to be written
++ * @mode: write mode
++ * @retlen: return actual data size written
++ */
++int nmbm_write_range(struct nmbm_instance *ni, uint64_t addr, size_t size,
++ const void *data, enum nmbm_oob_mode mode,
++ size_t *retlen)
++{
++ uint64_t off = addr;
++ const uint8_t *ptr = data;
++ size_t sizeremain = size, chunksize, leading;
++ int ret;
++
++ if (!ni)
++ return -EINVAL;
++
++ /* Sanity check */
++ if (ni->protected || (ni->lower.flags & NMBM_F_READ_ONLY)) {
++ nlog_debug(ni, "Device is forced read-only\n");
++ return -EROFS;
++ }
++
++ if (addr >= ba2addr(ni, ni->data_block_count)) {
++ nlog_err(ni, "Address 0x%llx is invalid\n", addr);
++ return -EINVAL;
++ }
++
++ if (addr + size > ba2addr(ni, ni->data_block_count)) {
++ nlog_err(ni, "Write size 0x%zx is too large\n", size);
++ return -EINVAL;
++ }
++
++ if (!size) {
++ nlog_warn(ni, "No data to be written\n");
++ return 0;
++ }
++
++ while (sizeremain) {
++ schedule();
++
++ leading = off & ni->writesize_mask;
++ chunksize = ni->lower.writesize - leading;
++ if (chunksize > sizeremain)
++ chunksize = sizeremain;
++
++ if (chunksize == ni->lower.writesize) {
++ ret = nmbm_write_logic_page(ni, off - leading, ptr,
++ NULL, mode);
++ if (ret)
++ break;
++ } else {
++ memset(ni->page_cache, 0xff, leading);
++ memcpy(ni->page_cache + leading, ptr, chunksize);
++
++ ret = nmbm_write_logic_page(ni, off - leading,
++ ni->page_cache, NULL,
++ mode);
++ if (ret)
++ break;
++ }
++
++ off += chunksize;
++ ptr += chunksize;
++ sizeremain -= chunksize;
++ }
++
++ if (retlen)
++ *retlen = size - sizeremain;
++
++ return ret;
++}
++
++/*
++ * nmbm_check_bad_block - Check whether a logic block is usable
++ * @ni: NMBM instance structure
++ * @addr: logic linear address
++ */
++int nmbm_check_bad_block(struct nmbm_instance *ni, uint64_t addr)
++{
++ uint32_t lb, pb;
++
++ if (!ni)
++ return -EINVAL;
++
++ if (addr >= ba2addr(ni, ni->data_block_count)) {
++ nlog_err(ni, "Address 0x%llx is invalid\n", addr);
++ return -EINVAL;
++ }
++
++ lb = addr2ba(ni, addr);
++
++ /* Map logic block to physical block */
++ pb = ni->block_mapping[lb];
++
++ if ((int32_t)pb < 0)
++ return 1;
++
++ if (nmbm_get_block_state(ni, pb) == BLOCK_ST_BAD)
++ return 1;
++
++ return 0;
++}
++
++/*
++ * nmbm_mark_bad_block - Mark a logic block unusable
++ * @ni: NMBM instance structure
++ * @addr: logic linear address
++ */
++int nmbm_mark_bad_block(struct nmbm_instance *ni, uint64_t addr)
++{
++ uint32_t lb, pb;
++
++ if (!ni)
++ return -EINVAL;
++
++ /* Sanity check */
++ if (ni->protected || (ni->lower.flags & NMBM_F_READ_ONLY)) {
++ nlog_debug(ni, "Device is forced read-only\n");
++ return -EROFS;
++ }
++
++ if (addr >= ba2addr(ni, ni->data_block_count)) {
++ nlog_err(ni, "Address 0x%llx is invalid\n", addr);
++ return -EINVAL;
++ }
++
++ lb = addr2ba(ni, addr);
++
++ /* Map logic block to physical block */
++ pb = ni->block_mapping[lb];
++
++ if ((int32_t)pb < 0)
++ return 0;
++
++ ni->block_mapping[lb] = -1;
++ nmbm_mark_phys_bad_block(ni, pb);
++ nmbm_set_block_state(ni, pb, BLOCK_ST_BAD);
++ nmbm_update_info_table(ni);
++
++ return 0;
++}
++
++/*
++ * nmbm_get_avail_size - Get available user data size
++ * @ni: NMBM instance structure
++ */
++uint64_t nmbm_get_avail_size(struct nmbm_instance *ni)
++{
++ if (!ni)
++ return 0;
++
++ return (uint64_t)ni->data_block_count << ni->erasesize_shift;
++}
++
++/*
++ * nmbm_get_lower_device - Get lower device structure
++ * @ni: NMBM instance structure
++ * @nld: pointer to hold the data of lower device structure
++ */
++int nmbm_get_lower_device(struct nmbm_instance *ni, struct nmbm_lower_device *nld)
++{
++ if (!ni)
++ return -EINVAL;
++
++ if (nld)
++ memcpy(nld, &ni->lower, sizeof(*nld));
++
++ return 0;
++}
++
++#include "nmbm-debug.inl"
+--- /dev/null
++++ b/drivers/mtd/nmbm/nmbm-debug.h
+@@ -0,0 +1,37 @@
++/* SPDX-License-Identifier: GPL-2.0 */
++/*
++ * Copyright (C) 2020 MediaTek Inc. All Rights Reserved.
++ *
++ * Debug addons for NAND Mapped-block Management (NMBM)
++ *
++ * Author: Weijie Gao <weijie.gao@mediatek.com>
++ */
++
++#ifndef _NMBM_DEBUG_H_
++#define _NMBM_DEBUG_H_
++
++#include "nmbm-private.h"
++
++#define nmbm_mark_block_color_normal(ni, start_ba, end_ba)
++#define nmbm_mark_block_color_bad(ni, ba)
++#define nmbm_mark_block_color_mgmt(ni, start_ba, end_ba)
++#define nmbm_mark_block_color_signature(ni, ba)
++#define nmbm_mark_block_color_info_table(ni, start_ba, end_ba)
++#define nmbm_mark_block_color_mapped(ni, ba)
++
++uint32_t nmbm_debug_get_block_state(struct nmbm_instance *ni, uint32_t ba);
++char nmbm_debug_get_phys_block_type(struct nmbm_instance *ni, uint32_t ba);
++
++enum nmmb_block_type {
++ NMBM_BLOCK_GOOD_DATA,
++ NMBM_BLOCK_GOOD_MGMT,
++ NMBM_BLOCK_BAD,
++ NMBM_BLOCK_MAIN_INFO_TABLE,
++ NMBM_BLOCK_BACKUP_INFO_TABLE,
++ NMBM_BLOCK_REMAPPED,
++ NMBM_BLOCK_SIGNATURE,
++
++ __NMBM_BLOCK_TYPE_MAX
++};
++
++#endif /* _NMBM_DEBUG_H_ */
+--- /dev/null
++++ b/drivers/mtd/nmbm/nmbm-debug.inl
+@@ -0,0 +1,39 @@
++
++uint32_t nmbm_debug_get_block_state(struct nmbm_instance *ni, uint32_t ba)
++{
++ return nmbm_get_block_state(ni, ba);
++}
++
++char nmbm_debug_get_phys_block_type(struct nmbm_instance *ni, uint32_t ba)
++{
++ uint32_t eba, limit;
++ bool success;
++
++ if (nmbm_get_block_state(ni, ba) == BLOCK_ST_BAD)
++ return NMBM_BLOCK_BAD;
++
++ if (ba < ni->data_block_count)
++ return NMBM_BLOCK_GOOD_DATA;
++
++ if (ba == ni->signature_ba)
++ return NMBM_BLOCK_SIGNATURE;
++
++ if (ni->main_table_ba) {
++ limit = ni->backup_table_ba ? ni->backup_table_ba :
++ ni->mapping_blocks_ba;
++
++ success = nmbm_block_walk_asc(ni, ni->main_table_ba, &eba,
++ size2blk(ni, ni->info_table_size), limit);
++
++ if (success && ba >= ni->main_table_ba && ba < eba)
++ return NMBM_BLOCK_MAIN_INFO_TABLE;
++ }
++
++ if (ba >= ni->backup_table_ba && ba < ni->mapping_blocks_ba)
++ return NMBM_BLOCK_BACKUP_INFO_TABLE;
++
++ if (ba > ni->mapping_blocks_top_ba && ba < ni->signature_ba)
++ return NMBM_BLOCK_REMAPPED;
++
++ return NMBM_BLOCK_GOOD_MGMT;
++}
+--- /dev/null
++++ b/drivers/mtd/nmbm/nmbm-private.h
+@@ -0,0 +1,137 @@
++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
++/*
++ * Copyright (C) 2020 MediaTek Inc. All Rights Reserved.
++ *
++ * Definitions for NAND Mapped-block Management (NMBM)
++ *
++ * Author: Weijie Gao <weijie.gao@mediatek.com>
++ */
++
++#ifndef _NMBM_PRIVATE_H_
++#define _NMBM_PRIVATE_H_
++
++#include <nmbm/nmbm.h>
++
++#define NMBM_MAGIC_SIGNATURE 0x304d4d4e /* NMM0 */
++#define NMBM_MAGIC_INFO_TABLE 0x314d4d4e /* NMM1 */
++
++#define NMBM_VERSION_MAJOR_S 0
++#define NMBM_VERSION_MAJOR_M 0xffff
++#define NMBM_VERSION_MINOR_S 16
++#define NMBM_VERSION_MINOR_M 0xffff
++#define NMBM_VERSION_MAKE(major, minor) (((major) & NMBM_VERSION_MAJOR_M) | \
++ (((minor) & NMBM_VERSION_MINOR_M) << \
++ NMBM_VERSION_MINOR_S))
++#define NMBM_VERSION_MAJOR_GET(ver) (((ver) >> NMBM_VERSION_MAJOR_S) & \
++ NMBM_VERSION_MAJOR_M)
++#define NMBM_VERSION_MINOR_GET(ver) (((ver) >> NMBM_VERSION_MINOR_S) & \
++ NMBM_VERSION_MINOR_M)
++
++typedef uint32_t nmbm_bitmap_t;
++#define NMBM_BITMAP_UNIT_SIZE (sizeof(nmbm_bitmap_t))
++#define NMBM_BITMAP_BITS_PER_BLOCK 2
++#define NMBM_BITMAP_BITS_PER_UNIT (8 * sizeof(nmbm_bitmap_t))
++#define NMBM_BITMAP_BLOCKS_PER_UNIT (NMBM_BITMAP_BITS_PER_UNIT / \
++ NMBM_BITMAP_BITS_PER_BLOCK)
++
++#define NMBM_SPARE_BLOCK_MULTI 1
++#define NMBM_SPARE_BLOCK_DIV 2
++#define NMBM_SPARE_BLOCK_MIN 2
++
++#define NMBM_MGMT_DIV 16
++#define NMBM_MGMT_BLOCKS_MIN 32
++
++#define NMBM_TRY_COUNT 3
++
++#define BLOCK_ST_BAD 0
++#define BLOCK_ST_NEED_REMAP 2
++#define BLOCK_ST_GOOD 3
++#define BLOCK_ST_MASK 3
++
++struct nmbm_header {
++ uint32_t magic;
++ uint32_t version;
++ uint32_t size;
++ uint32_t checksum;
++};
++
++struct nmbm_signature {
++ struct nmbm_header header;
++ uint64_t nand_size;
++ uint32_t block_size;
++ uint32_t page_size;
++ uint32_t spare_size;
++ uint32_t mgmt_start_pb;
++ uint8_t max_try_count;
++ uint8_t padding[3];
++};
++
++struct nmbm_info_table_header {
++ struct nmbm_header header;
++ uint32_t write_count;
++ uint32_t state_table_off;
++ uint32_t mapping_table_off;
++ uint32_t padding;
++};
++
++struct nmbm_instance {
++ struct nmbm_lower_device lower;
++
++ uint32_t rawpage_size;
++ uint32_t rawblock_size;
++ uint32_t rawchip_size;
++
++ uint32_t writesize_mask;
++ uint32_t erasesize_mask;
++ uint16_t writesize_shift;
++ uint16_t erasesize_shift;
++
++ struct nmbm_signature signature;
++
++ uint8_t *info_table_cache;
++ uint32_t info_table_size;
++ uint32_t info_table_spare_blocks;
++ struct nmbm_info_table_header info_table;
++
++ nmbm_bitmap_t *block_state;
++ uint32_t block_state_changed;
++ uint32_t state_table_size;
++
++ int32_t *block_mapping;
++ uint32_t block_mapping_changed;
++ uint32_t mapping_table_size;
++
++ uint8_t *page_cache;
++
++ int protected;
++
++ uint32_t block_count;
++ uint32_t data_block_count;
++
++ uint32_t mgmt_start_ba;
++ uint32_t main_table_ba;
++ uint32_t backup_table_ba;
++ uint32_t mapping_blocks_ba;
++ uint32_t mapping_blocks_top_ba;
++ uint32_t signature_ba;
++
++ enum nmbm_log_category log_display_level;
++};
++
++/* Log utilities */
++#define nlog_debug(ni, fmt, ...) \
++ nmbm_log(ni, NMBM_LOG_DEBUG, fmt, ##__VA_ARGS__)
++
++#define nlog_info(ni, fmt, ...) \
++ nmbm_log(ni, NMBM_LOG_INFO, fmt, ##__VA_ARGS__)
++
++#define nlog_warn(ni, fmt, ...) \
++ nmbm_log(ni, NMBM_LOG_WARN, fmt, ##__VA_ARGS__)
++
++#define nlog_err(ni, fmt, ...) \
++ nmbm_log(ni, NMBM_LOG_ERR, fmt, ##__VA_ARGS__)
++
++#define nlog_emerg(ni, fmt, ...) \
++ nmbm_log(ni, NMBM_LOG_EMERG, fmt, ##__VA_ARGS__)
++
++#endif /* _NMBM_PRIVATE_H_ */
+--- /dev/null
++++ b/include/nmbm/nmbm-os.h
+@@ -0,0 +1,66 @@
++/* SPDX-License-Identifier: GPL-2.0 */
++/*
++ * Copyright (C) 2020 MediaTek Inc. All Rights Reserved.
++ *
++ * OS-dependent definitions for NAND Mapped-block Management (NMBM)
++ *
++ * Author: Weijie Gao <weijie.gao@mediatek.com>
++ */
++
++#ifndef _NMBM_OS_H_
++#define _NMBM_OS_H_
++
++#include <div64.h>
++#include <stdbool.h>
++#include <watchdog.h>
++#include <u-boot/crc.h>
++#include <linux/errno.h>
++#include <linux/log2.h>
++#include <linux/types.h>
++
++static inline uint32_t nmbm_crc32(uint32_t crcval, const void *buf, size_t size)
++{
++ uint chksz;
++ const unsigned char *p = buf;
++
++ while (size) {
++ if (size > UINT_MAX)
++ chksz = UINT_MAX;
++ else
++ chksz = (uint)size;
++
++ crcval = crc32_no_comp(crcval, p, chksz);
++ size -= chksz;
++ p += chksz;
++ }
++
++ return crcval;
++}
++
++static inline uint32_t nmbm_lldiv(uint64_t dividend, uint32_t divisor)
++{
++#if BITS_PER_LONG == 64
++ return dividend / divisor;
++#else
++ __div64_32(&dividend, divisor);
++ return dividend;
++#endif
++}
++
++#ifdef CONFIG_NMBM_LOG_LEVEL_DEBUG
++#define NMBM_DEFAULT_LOG_LEVEL 0
++#elif defined(NMBM_LOG_LEVEL_INFO)
++#define NMBM_DEFAULT_LOG_LEVEL 1
++#elif defined(NMBM_LOG_LEVEL_WARN)
++#define NMBM_DEFAULT_LOG_LEVEL 2
++#elif defined(NMBM_LOG_LEVEL_ERR)
++#define NMBM_DEFAULT_LOG_LEVEL 3
++#elif defined(NMBM_LOG_LEVEL_EMERG)
++#define NMBM_DEFAULT_LOG_LEVEL 4
++#elif defined(NMBM_LOG_LEVEL_NONE)
++#define NMBM_DEFAULT_LOG_LEVEL 5
++#else
++#define NMBM_DEFAULT_LOG_LEVEL 1
++#endif
++
++#endif /* _NMBM_OS_H_ */
+--- /dev/null
++++ b/include/nmbm/nmbm.h
+@@ -0,0 +1,102 @@
++/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
++/*
++ * Copyright (C) 2020 MediaTek Inc. All Rights Reserved.
++ *
++ * Definitions for NAND Mapped-block Management (NMBM)
++ *
++ * Author: Weijie Gao <weijie.gao@mediatek.com>
++ */
++
++#ifndef _NMBM_H_
++#define _NMBM_H_
++
++#include <nmbm/nmbm-os.h>
++
++enum nmbm_log_category {
++ NMBM_LOG_DEBUG,
++ NMBM_LOG_INFO,
++ NMBM_LOG_WARN,
++ NMBM_LOG_ERR,
++ NMBM_LOG_EMERG,
++
++ __NMBM_LOG_MAX
++};
++
++enum nmbm_oob_mode {
++ NMBM_MODE_PLACE_OOB,
++ NMBM_MODE_AUTO_OOB,
++ NMBM_MODE_RAW,
++
++ __NMBM_MODE_MAX
++};
++
++struct nmbm_lower_device {
++ uint32_t max_ratio;
++ uint32_t max_reserved_blocks;
++ int flags;
++
++ uint64_t size;
++ uint32_t erasesize;
++ uint32_t writesize;
++ uint32_t oobsize;
++ uint32_t oobavail;
++
++ void *arg;
++ int (*reset_chip)(void *arg);
++
++ /*
++ * read_page:
++ * return 0 if succeeds
++ * return positive number for ecc error
++ * return negative number for other errors
++ */
++ int (*read_page)(void *arg, uint64_t addr, void *buf, void *oob, enum nmbm_oob_mode mode);
++ int (*write_page)(void *arg, uint64_t addr, const void *buf, const void *oob, enum nmbm_oob_mode mode);
++ int (*erase_block)(void *arg, uint64_t addr);
++
++ int (*is_bad_block)(void *arg, uint64_t addr);
++ int (*mark_bad_block)(void *arg, uint64_t addr);
++
++ /* OS-dependent logging function */
++ void (*logprint)(void *arg, enum nmbm_log_category level, const char *fmt, va_list ap);
++};
++
++struct nmbm_instance;
++
++/* Create NMBM if management area not found, or not complete */
++#define NMBM_F_CREATE 0x01
++
++/* Empty page is also protected by ECC, and bitflip(s) can be corrected */
++#define NMBM_F_EMPTY_PAGE_ECC_OK 0x02
++
++/* Do not write anything back to flash */
++#define NMBM_F_READ_ONLY 0x04
++
++size_t nmbm_calc_structure_size(struct nmbm_lower_device *nld);
++int nmbm_attach(struct nmbm_lower_device *nld, struct nmbm_instance *ni);
++int nmbm_detach(struct nmbm_instance *ni);
++
++enum nmbm_log_category nmbm_set_log_level(struct nmbm_instance *ni,
++ enum nmbm_log_category level);
++
++int nmbm_erase_block_range(struct nmbm_instance *ni, uint64_t addr,
++ uint64_t size, uint64_t *failed_addr);
++int nmbm_read_single_page(struct nmbm_instance *ni, uint64_t addr, void *data,
++ void *oob, enum nmbm_oob_mode mode);
++int nmbm_read_range(struct nmbm_instance *ni, uint64_t addr, size_t size,
++ void *data, enum nmbm_oob_mode mode, size_t *retlen);
++int nmbm_write_single_page(struct nmbm_instance *ni, uint64_t addr,
++ const void *data, const void *oob,
++ enum nmbm_oob_mode mode);
++int nmbm_write_range(struct nmbm_instance *ni, uint64_t addr, size_t size,
++ const void *data, enum nmbm_oob_mode mode,
++ size_t *retlen);
++
++int nmbm_check_bad_block(struct nmbm_instance *ni, uint64_t addr);
++int nmbm_mark_bad_block(struct nmbm_instance *ni, uint64_t addr);
++
++uint64_t nmbm_get_avail_size(struct nmbm_instance *ni);
++
++int nmbm_get_lower_device(struct nmbm_instance *ni, struct nmbm_lower_device *nld);
++
++#endif /* _NMBM_H_ */
diff --git a/package/boot/uboot-mediatek/patches/100-07-mtd-nmbm-add-support-for-mtd.patch b/package/boot/uboot-mediatek/patches/100-07-mtd-nmbm-add-support-for-mtd.patch
new file mode 100644
index 00000000000..718f00e7641
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/100-07-mtd-nmbm-add-support-for-mtd.patch
@@ -0,0 +1,958 @@
+From 0524995f07fcd216a1a7e267fdb5cf2b0ede8489 Mon Sep 17 00:00:00 2001
+From: Weijie Gao <weijie.gao@mediatek.com>
+Date: Mon, 25 Jul 2022 10:42:12 +0800
+Subject: [PATCH 41/71] mtd: nmbm: add support for mtd
+
+Add support to create NMBM based on MTD devices
+
+Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+---
+ drivers/mtd/nmbm/Kconfig | 5 +
+ drivers/mtd/nmbm/Makefile | 1 +
+ drivers/mtd/nmbm/nmbm-mtd.c | 890 ++++++++++++++++++++++++++++++++++++
+ include/nmbm/nmbm-mtd.h | 27 ++
+ 4 files changed, 923 insertions(+)
+ create mode 100644 drivers/mtd/nmbm/nmbm-mtd.c
+ create mode 100644 include/nmbm/nmbm-mtd.h
+
+--- a/drivers/mtd/nmbm/Kconfig
++++ b/drivers/mtd/nmbm/Kconfig
+@@ -27,3 +27,8 @@ config NMBM_LOG_LEVEL_NONE
+ bool "5 - None"
+
+ endchoice
++
++config NMBM_MTD
++ bool "Enable MTD based NAND mapping block management"
++ default n
++ depends on NMBM
+--- a/drivers/mtd/nmbm/Makefile
++++ b/drivers/mtd/nmbm/Makefile
+@@ -3,3 +3,4 @@
+ # (C) Copyright 2020 MediaTek Inc. All rights reserved.
+
+ obj-$(CONFIG_NMBM) += nmbm-core.o
++obj-$(CONFIG_NMBM_MTD) += nmbm-mtd.o
+--- /dev/null
++++ b/drivers/mtd/nmbm/nmbm-mtd.c
+@@ -0,0 +1,890 @@
++// SPDX-License-Identifier: GPL-2.0
++/*
++ * Copyright (C) 2020 MediaTek Inc. All Rights Reserved.
++ *
++ * Author: Weijie Gao <weijie.gao@mediatek.com>
++ */
++
++#include <linux/list.h>
++#include <linux/bitops.h>
++#include <linux/kernel.h>
++#include <linux/types.h>
++#include <linux/mtd/mtd.h>
++#include <jffs2/load_kernel.h>
++#include <watchdog.h>
++
++#include "nmbm-debug.h"
++
++#define NMBM_UPPER_MTD_NAME "nmbm"
++
++static uint32_t nmbm_id_cnt;
++static LIST_HEAD(nmbm_devs);
++
++struct nmbm_mtd {
++ struct mtd_info upper;
++ char *name;
++ uint32_t id;
++
++ struct mtd_info *lower;
++
++ struct nmbm_instance *ni;
++ uint8_t *page_cache;
++
++ struct list_head node;
++};
++
++static int nmbm_lower_read_page(void *arg, uint64_t addr, void *buf, void *oob,
++ enum nmbm_oob_mode mode)
++{
++ struct nmbm_mtd *nm = arg;
++ struct mtd_oob_ops ops;
++ int ret;
++
++ memset(&ops, 0, sizeof(ops));
++
++ switch (mode) {
++ case NMBM_MODE_PLACE_OOB:
++ ops.mode = MTD_OPS_PLACE_OOB;
++ break;
++ case NMBM_MODE_AUTO_OOB:
++ ops.mode = MTD_OPS_AUTO_OOB;
++ break;
++ case NMBM_MODE_RAW:
++ ops.mode = MTD_OPS_RAW;
++ break;
++ default:
++ pr_debug("%s: unsupported NMBM mode: %u\n", __func__, mode);
++ return -ENOTSUPP;
++ }
++
++ if (buf) {
++ ops.datbuf = buf;
++ ops.len = nm->lower->writesize;
++ }
++
++ if (oob) {
++ ops.oobbuf = oob;
++ ops.ooblen = mtd_oobavail(nm->lower, &ops);
++ }
++
++ ret = mtd_read_oob(nm->lower, addr, &ops);
++ nm->upper.ecc_stats.corrected = nm->lower->ecc_stats.corrected;
++ nm->upper.ecc_stats.failed = nm->lower->ecc_stats.failed;
++
++ /* Report error on failure (including ecc error) */
++ if (ret < 0 && ret != -EUCLEAN)
++ return ret;
++
++ /*
++ * Since mtd_read_oob() won't report exact bitflips, what we can know
++ * is whether bitflips exceeds the threshold.
++ * We want the -EUCLEAN to be passed to the upper layer, but not the
++ * error value itself. To achieve this, report bitflips above the
++ * threshold.
++ */
++
++ if (ret == -EUCLEAN) {
++ return min_t(u32, nm->lower->bitflip_threshold + 1,
++ nm->lower->ecc_strength);
++ }
++
++ /* For bitflips less than the threshold, return 0 */
++
++ return 0;
++}
++
++static int nmbm_lower_write_page(void *arg, uint64_t addr, const void *buf,
++ const void *oob, enum nmbm_oob_mode mode)
++{
++ struct nmbm_mtd *nm = arg;
++ struct mtd_oob_ops ops;
++
++ memset(&ops, 0, sizeof(ops));
++
++ switch (mode) {
++ case NMBM_MODE_PLACE_OOB:
++ ops.mode = MTD_OPS_PLACE_OOB;
++ break;
++ case NMBM_MODE_AUTO_OOB:
++ ops.mode = MTD_OPS_AUTO_OOB;
++ break;
++ case NMBM_MODE_RAW:
++ ops.mode = MTD_OPS_RAW;
++ break;
++ default:
++ pr_debug("%s: unsupported NMBM mode: %u\n", __func__, mode);
++ return -ENOTSUPP;
++ }
++
++ if (buf) {
++ ops.datbuf = (uint8_t *)buf;
++ ops.len = nm->lower->writesize;
++ }
++
++ if (oob) {
++ ops.oobbuf = (uint8_t *)oob;
++ ops.ooblen = mtd_oobavail(nm->lower, &ops);
++ }
++
++ return mtd_write_oob(nm->lower, addr, &ops);
++}
++
++static int nmbm_lower_erase_block(void *arg, uint64_t addr)
++{
++ struct nmbm_mtd *nm = arg;
++ struct erase_info ei;
++
++ memset(&ei, 0, sizeof(ei));
++
++ ei.mtd = nm->lower;
++ ei.addr = addr;
++ ei.len = nm->lower->erasesize;
++
++ return mtd_erase(nm->lower, &ei);
++}
++
++static int nmbm_lower_is_bad_block(void *arg, uint64_t addr)
++{
++ struct nmbm_mtd *nm = arg;
++
++ return mtd_block_isbad(nm->lower, addr);
++}
++
++static int nmbm_lower_mark_bad_block(void *arg, uint64_t addr)
++{
++ struct nmbm_mtd *nm = arg;
++
++ return mtd_block_markbad(nm->lower, addr);
++}
++
++static void nmbm_lower_log(void *arg, enum nmbm_log_category level,
++ const char *fmt, va_list ap)
++{
++ vprintf(fmt, ap);
++}
++
++static int nmbm_mtd_read(struct mtd_info *mtd, loff_t from, size_t len,
++ size_t *retlen, u_char *buf)
++{
++ struct nmbm_mtd *nm = container_of(mtd, struct nmbm_mtd, upper);
++
++ /* Do not allow read past end of device */
++ if ((from + len) > mtd->size) {
++ pr_debug("%s: attempt to write beyond end of device\n",
++ __func__);
++ return -EINVAL;
++ }
++
++ return nmbm_read_range(nm->ni, from, len, buf, MTD_OPS_PLACE_OOB,
++ retlen);
++}
++
++static int nmbm_mtd_write(struct mtd_info *mtd, loff_t to, size_t len,
++ size_t *retlen, const u_char *buf)
++{
++ struct nmbm_mtd *nm = container_of(mtd, struct nmbm_mtd, upper);
++
++ /* Do not allow write past end of device */
++ if ((to + len) > mtd->size) {
++ pr_debug("%s: attempt to write beyond end of device\n",
++ __func__);
++ return -EINVAL;
++ }
++
++ return nmbm_write_range(nm->ni, to, len, buf, MTD_OPS_PLACE_OOB,
++ retlen);
++}
++
++static int nmbm_mtd_erase(struct mtd_info *mtd, struct erase_info *instr)
++{
++ struct nmbm_mtd *nm = container_of(mtd, struct nmbm_mtd, upper);
++ int ret;
++
++ instr->state = MTD_ERASING;
++
++ ret = nmbm_erase_block_range(nm->ni, instr->addr, instr->len,
++ &instr->fail_addr);
++ if (ret)
++ instr->state = MTD_ERASE_FAILED;
++ else
++ instr->state = MTD_ERASE_DONE;
++
++ if (!ret)
++ /* FIXME */
++ /* mtd_erase_callback(instr); */
++ return ret;
++ else
++ ret = -EIO;
++
++ return ret;
++}
++
++static int nmbm_mtd_read_data(struct nmbm_mtd *nm, uint64_t addr,
++ struct mtd_oob_ops *ops, enum nmbm_oob_mode mode)
++{
++ size_t len, ooblen, maxooblen, chklen;
++ uint32_t col, ooboffs;
++ uint8_t *datcache, *oobcache;
++ bool has_ecc_err = false;
++ int ret, max_bitflips = 0;
++
++ col = addr & nm->lower->writesize_mask;
++ addr &= ~nm->lower->writesize_mask;
++ maxooblen = mtd_oobavail(nm->lower, ops);
++ ooboffs = ops->ooboffs;
++ ooblen = ops->ooblen;
++ len = ops->len;
++
++ datcache = len ? nm->page_cache : NULL;
++ oobcache = ooblen ? nm->page_cache + nm->lower->writesize : NULL;
++
++ ops->oobretlen = 0;
++ ops->retlen = 0;
++
++ while (len || ooblen) {
++ schedule();
++
++ ret = nmbm_read_single_page(nm->ni, addr, datcache, oobcache,
++ mode);
++ if (ret < 0 && ret != -EBADMSG)
++ return ret;
++
++ /* Continue reading on ecc error */
++ if (ret == -EBADMSG)
++ has_ecc_err = true;
++
++ /* Record the maximum bitflips between pages */
++ if (ret > max_bitflips)
++ max_bitflips = ret;
++
++ if (len) {
++ /* Move data */
++ chklen = nm->lower->writesize - col;
++ if (chklen > len)
++ chklen = len;
++
++ memcpy(ops->datbuf + ops->retlen, datcache + col,
++ chklen);
++ len -= chklen;
++ col = 0; /* (col + chklen) % */
++ ops->retlen += chklen;
++ }
++
++ if (ooblen) {
++ /* Move oob */
++ chklen = maxooblen - ooboffs;
++ if (chklen > ooblen)
++ chklen = ooblen;
++
++ memcpy(ops->oobbuf + ops->oobretlen, oobcache + ooboffs,
++ chklen);
++ ooblen -= chklen;
++ ooboffs = 0; /* (ooboffs + chklen) % maxooblen; */
++ ops->oobretlen += chklen;
++ }
++
++ addr += nm->lower->writesize;
++ }
++
++ if (has_ecc_err)
++ return -EBADMSG;
++
++ return max_bitflips;
++}
++
++static int nmbm_mtd_read_oob(struct mtd_info *mtd, loff_t from,
++ struct mtd_oob_ops *ops)
++{
++ struct nmbm_mtd *nm = container_of(mtd, struct nmbm_mtd, upper);
++ uint32_t maxooblen;
++ enum nmbm_oob_mode mode;
++
++ if (!ops->oobbuf && !ops->datbuf) {
++ if (ops->ooblen || ops->len)
++ return -EINVAL;
++
++ return 0;
++ }
++
++ switch (ops->mode) {
++ case MTD_OPS_PLACE_OOB:
++ mode = NMBM_MODE_PLACE_OOB;
++ break;
++ case MTD_OPS_AUTO_OOB:
++ mode = NMBM_MODE_AUTO_OOB;
++ break;
++ case MTD_OPS_RAW:
++ mode = NMBM_MODE_RAW;
++ break;
++ default:
++ pr_debug("%s: unsupported oob mode: %u\n", __func__, ops->mode);
++ return -ENOTSUPP;
++ }
++
++ maxooblen = mtd_oobavail(mtd, ops);
++
++ /* Do not allow read past end of device */
++ if (ops->datbuf && (from + ops->len) > mtd->size) {
++ pr_debug("%s: attempt to read beyond end of device\n",
++ __func__);
++ return -EINVAL;
++ }
++
++ if (!ops->oobbuf) {
++ /* Optimized for reading data only */
++ return nmbm_read_range(nm->ni, from, ops->len, ops->datbuf,
++ mode, &ops->retlen);
++ }
++
++ if (unlikely(ops->ooboffs >= maxooblen)) {
++ pr_debug("%s: attempt to start read outside oob\n",
++ __func__);
++ return -EINVAL;
++ }
++
++ if (unlikely(from >= mtd->size ||
++ ops->ooboffs + ops->ooblen > ((mtd->size >> mtd->writesize_shift) -
++ (from >> mtd->writesize_shift)) * maxooblen)) {
++ pr_debug("%s: attempt to read beyond end of device\n",
++ __func__);
++ return -EINVAL;
++ }
++
++ return nmbm_mtd_read_data(nm, from, ops, mode);
++}
++
++static int nmbm_mtd_write_data(struct nmbm_mtd *nm, uint64_t addr,
++ struct mtd_oob_ops *ops, enum nmbm_oob_mode mode)
++{
++ size_t len, ooblen, maxooblen, chklen;
++ uint32_t col, ooboffs;
++ uint8_t *datcache, *oobcache;
++ int ret;
++
++ col = addr & nm->lower->writesize_mask;
++ addr &= ~nm->lower->writesize_mask;
++ maxooblen = mtd_oobavail(nm->lower, ops);
++ ooboffs = ops->ooboffs;
++ ooblen = ops->ooblen;
++ len = ops->len;
++
++ datcache = len ? nm->page_cache : NULL;
++ oobcache = ooblen ? nm->page_cache + nm->lower->writesize : NULL;
++
++ ops->oobretlen = 0;
++ ops->retlen = 0;
++
++ while (len || ooblen) {
++ schedule();
++
++ if (len) {
++ /* Move data */
++ chklen = nm->lower->writesize - col;
++ if (chklen > len)
++ chklen = len;
++
++ memset(datcache, 0xff, col);
++ memcpy(datcache + col, ops->datbuf + ops->retlen,
++ chklen);
++ memset(datcache + col + chklen, 0xff,
++ nm->lower->writesize - col - chklen);
++ len -= chklen;
++ col = 0; /* (col + chklen) % */
++ ops->retlen += chklen;
++ }
++
++ if (ooblen) {
++ /* Move oob */
++ chklen = maxooblen - ooboffs;
++ if (chklen > ooblen)
++ chklen = ooblen;
++
++ memset(oobcache, 0xff, ooboffs);
++ memcpy(oobcache + ooboffs,
++ ops->oobbuf + ops->oobretlen, chklen);
++ memset(oobcache + ooboffs + chklen, 0xff,
++ nm->lower->oobsize - ooboffs - chklen);
++ ooblen -= chklen;
++ ooboffs = 0; /* (ooboffs + chklen) % maxooblen; */
++ ops->oobretlen += chklen;
++ }
++
++ ret = nmbm_write_single_page(nm->ni, addr, datcache, oobcache,
++ mode);
++ if (ret)
++ return ret;
++
++ addr += nm->lower->writesize;
++ }
++
++ return 0;
++}
++
++static int nmbm_mtd_write_oob(struct mtd_info *mtd, loff_t to,
++ struct mtd_oob_ops *ops)
++{
++ struct nmbm_mtd *nm = container_of(mtd, struct nmbm_mtd, upper);
++ enum nmbm_oob_mode mode;
++ uint32_t maxooblen;
++
++ if (!ops->oobbuf && !ops->datbuf) {
++ if (ops->ooblen || ops->len)
++ return -EINVAL;
++
++ return 0;
++ }
++
++ switch (ops->mode) {
++ case MTD_OPS_PLACE_OOB:
++ mode = NMBM_MODE_PLACE_OOB;
++ break;
++ case MTD_OPS_AUTO_OOB:
++ mode = NMBM_MODE_AUTO_OOB;
++ break;
++ case MTD_OPS_RAW:
++ mode = NMBM_MODE_RAW;
++ break;
++ default:
++ pr_debug("%s: unsupported oob mode: %u\n", __func__,
++ ops->mode);
++ return -ENOTSUPP;
++ }
++
++ maxooblen = mtd_oobavail(mtd, ops);
++
++ /* Do not allow write past end of device */
++ if (ops->datbuf && (to + ops->len) > mtd->size) {
++ pr_debug("%s: attempt to write beyond end of device\n",
++ __func__);
++ return -EINVAL;
++ }
++
++ if (!ops->oobbuf) {
++ /* Optimized for writing data only */
++ return nmbm_write_range(nm->ni, to, ops->len, ops->datbuf,
++ mode, &ops->retlen);
++ }
++
++ if (unlikely(ops->ooboffs >= maxooblen)) {
++ pr_debug("%s: attempt to start write outside oob\n",
++ __func__);
++ return -EINVAL;
++ }
++
++ if (unlikely(to >= mtd->size ||
++ ops->ooboffs + ops->ooblen > ((mtd->size >> mtd->writesize_shift) -
++ (to >> mtd->writesize_shift)) * maxooblen)) {
++ pr_debug("%s: attempt to write beyond end of device\n",
++ __func__);
++ return -EINVAL;
++ }
++
++ return nmbm_mtd_write_data(nm, to, ops, mode);
++}
++
++static int nmbm_mtd_block_isbad(struct mtd_info *mtd, loff_t offs)
++{
++ struct nmbm_mtd *nm = container_of(mtd, struct nmbm_mtd, upper);
++
++ return nmbm_check_bad_block(nm->ni, offs);
++}
++
++static int nmbm_mtd_block_markbad(struct mtd_info *mtd, loff_t offs)
++{
++ struct nmbm_mtd *nm = container_of(mtd, struct nmbm_mtd, upper);
++
++ return nmbm_mark_bad_block(nm->ni, offs);
++}
++
++int nmbm_attach_mtd(struct mtd_info *lower, int flags, uint32_t max_ratio,
++ uint32_t max_reserved_blocks, struct mtd_info **upper)
++{
++ struct nmbm_lower_device nld;
++ struct nmbm_instance *ni;
++ struct mtd_info *mtd;
++ struct nmbm_mtd *nm;
++ size_t namelen, alloc_size;
++ int ret;
++
++ if (!lower)
++ return -EINVAL;
++
++ if (lower->type != MTD_NANDFLASH || lower->flags != MTD_CAP_NANDFLASH)
++ return -ENOTSUPP;
++
++ namelen = strlen(NMBM_UPPER_MTD_NAME) + 16;
++
++ nm = calloc(sizeof(*nm) + lower->writesize + lower->oobsize + namelen + 1, 1);
++ if (!nm)
++ return -ENOMEM;
++
++ nm->lower = lower;
++ nm->name = (char *)nm + sizeof(*nm);
++ nm->page_cache = (uint8_t *)nm->name + namelen + 1;
++
++ nm->id = nmbm_id_cnt++;
++ snprintf(nm->name, namelen + 1, "%s%u", NMBM_UPPER_MTD_NAME, nm->id);
++
++ memset(&nld, 0, sizeof(nld));
++
++ nld.flags = flags;
++ nld.max_ratio = max_ratio;
++ nld.max_reserved_blocks = max_reserved_blocks;
++
++ nld.size = lower->size;
++ nld.erasesize = lower->erasesize;
++ nld.writesize = lower->writesize;
++ nld.oobsize = lower->oobsize;
++ nld.oobavail = lower->oobavail;
++
++ nld.arg = nm;
++ nld.read_page = nmbm_lower_read_page;
++ nld.write_page = nmbm_lower_write_page;
++ nld.erase_block = nmbm_lower_erase_block;
++ nld.is_bad_block = nmbm_lower_is_bad_block;
++ nld.mark_bad_block = nmbm_lower_mark_bad_block;
++
++ nld.logprint = nmbm_lower_log;
++
++ alloc_size = nmbm_calc_structure_size(&nld);
++ ni = calloc(alloc_size, 1);
++ if (!ni) {
++ free(nm);
++ return -ENOMEM;
++ }
++
++ ret = nmbm_attach(&nld, ni);
++ if (ret) {
++ free(ni);
++ free(nm);
++ return ret;
++ }
++
++ nm->ni = ni;
++
++ /* Initialize upper mtd */
++ mtd = &nm->upper;
++
++ mtd->name = nm->name;
++ mtd->type = MTD_DEV_TYPE_NMBM;
++ mtd->flags = lower->flags;
++
++ mtd->size = (uint64_t)ni->data_block_count * ni->lower.erasesize;
++ mtd->erasesize = lower->erasesize;
++ mtd->writesize = lower->writesize;
++ mtd->writebufsize = lower->writesize;
++ mtd->oobsize = lower->oobsize;
++ mtd->oobavail = lower->oobavail;
++
++ mtd->erasesize_shift = lower->erasesize_shift;
++ mtd->writesize_shift = lower->writesize_shift;
++ mtd->erasesize_mask = lower->erasesize_mask;
++ mtd->writesize_mask = lower->writesize_mask;
++
++ mtd->bitflip_threshold = lower->bitflip_threshold;
++
++ /* XXX: should this be duplicated? */
++ mtd->ooblayout = lower->ooblayout;
++ mtd->ecclayout = lower->ecclayout;
++
++ mtd->ecc_step_size = lower->ecc_step_size;
++ mtd->ecc_strength = lower->ecc_strength;
++
++ mtd->numeraseregions = lower->numeraseregions;
++ mtd->eraseregions = lower->eraseregions;
++
++ mtd->_read = nmbm_mtd_read;
++ mtd->_write = nmbm_mtd_write;
++ mtd->_erase = nmbm_mtd_erase;
++ mtd->_read_oob = nmbm_mtd_read_oob;
++ mtd->_write_oob = nmbm_mtd_write_oob;
++ mtd->_block_isbad = nmbm_mtd_block_isbad;
++ mtd->_block_markbad = nmbm_mtd_block_markbad;
++
++ *upper = mtd;
++
++ list_add_tail(&nm->node, &nmbm_devs);
++
++ return 0;
++}
++
++int nmbm_free_mtd(struct mtd_info *upper)
++{
++ struct nmbm_mtd *pos;
++
++ if (!upper)
++ return -EINVAL;
++
++ list_for_each_entry(pos, &nmbm_devs, node) {
++ if (&pos->upper == upper) {
++ list_del(&pos->node);
++
++ nmbm_detach(pos->ni);
++ free(pos->ni);
++ free(pos);
++
++ return 0;
++ }
++ }
++
++ return -ENODEV;
++}
++
++struct mtd_info *nmbm_mtd_get_upper_by_index(uint32_t index)
++{
++ struct nmbm_mtd *nm;
++
++ list_for_each_entry(nm, &nmbm_devs, node) {
++ if (nm->id == index)
++ return &nm->upper;
++ }
++
++ return NULL;
++}
++
++struct mtd_info *nmbm_mtd_get_upper(struct mtd_info *lower)
++{
++ struct nmbm_mtd *nm;
++
++ list_for_each_entry(nm, &nmbm_devs, node) {
++ if (nm->lower == lower)
++ return &nm->upper;
++ }
++
++ return NULL;
++}
++
++void nmbm_mtd_list_devices(void)
++{
++ struct nmbm_mtd *nm;
++
++ printf("Index NMBM device Lower device\n");
++ printf("========================================\n");
++
++ list_for_each_entry(nm, &nmbm_devs, node) {
++ printf("%-8u%-20s%s\n", nm->id, nm->name, nm->lower->name);
++ }
++}
++
++int nmbm_mtd_print_info(const char *name)
++{
++ struct nmbm_mtd *nm;
++ bool found = false;
++
++ list_for_each_entry(nm, &nmbm_devs, node) {
++ if (!strcmp(nm->name, name)) {
++ found = true;
++ break;
++ }
++ }
++
++ if (!found) {
++ printf("Error: NMBM device '%s' not found\n", name);
++ return -ENODEV;
++ }
++
++ printf("%s:\n", name);
++ printf("Total blocks: %u\n", nm->ni->block_count);
++ printf("Data blocks: %u\n", nm->ni->data_block_count);
++ printf("Management start block: %u\n", nm->ni->mgmt_start_ba);
++ printf("Info table size: 0x%x\n", nm->ni->info_table_size);
++
++ if (nm->ni->main_table_ba)
++ printf("Main info table start block: %u\n", nm->ni->main_table_ba);
++ else
++ printf("Main info table start block: Not exist\n");
++
++ if (nm->ni->backup_table_ba)
++ printf("Backup info table start block: %u\n", nm->ni->backup_table_ba);
++ else
++ printf("Backup info table start block: Not exist\n");
++
++ printf("Signature block: %u\n", nm->ni->signature_ba);
++ printf("Mapping blocks top address: %u\n", nm->ni->mapping_blocks_top_ba);
++ printf("Mapping blocks limit address: %u\n", nm->ni->mapping_blocks_ba);
++
++ return 0;
++}
++
++static const char nmbm_block_legends[] = {
++ [NMBM_BLOCK_GOOD_DATA] = '-',
++ [NMBM_BLOCK_GOOD_MGMT] = '+',
++ [NMBM_BLOCK_BAD] = 'B',
++ [NMBM_BLOCK_MAIN_INFO_TABLE] = 'I',
++ [NMBM_BLOCK_BACKUP_INFO_TABLE] = 'i',
++ [NMBM_BLOCK_REMAPPED] = 'M',
++ [NMBM_BLOCK_SIGNATURE] = 'S',
++};
++
++int nmbm_mtd_print_states(const char *name)
++{
++ struct nmbm_mtd *nm;
++ enum nmmb_block_type bt;
++ bool found = false;
++ uint32_t i;
++
++ list_for_each_entry(nm, &nmbm_devs, node) {
++ if (!strcmp(nm->name, name)) {
++ found = true;
++ break;
++ }
++ }
++
++ if (!found) {
++ printf("Error: NMBM device '%s' not found\n", name);
++ return -ENODEV;
++ }
++
++ printf("Physical blocks:\n");
++ printf("\n");
++
++ printf("Legends:\n");
++ printf(" - Good data block\n");
++ printf(" + Good management block\n");
++ printf(" B Bad block\n");
++ printf(" I Main info table\n");
++ printf(" i Backup info table\n");
++ printf(" M Remapped spare block\n");
++ printf(" S Signature block\n");
++ printf("\n");
++
++ for (i = 0; i < nm->ni->block_count; i++) {
++ if (i % 64 == 0)
++ printf(" ");
++
++ bt = nmbm_debug_get_phys_block_type(nm->ni, i);
++ if (bt < __NMBM_BLOCK_TYPE_MAX)
++ putc(nmbm_block_legends[bt]);
++ else
++ putc('?');
++
++ if (i % 64 == 63)
++ printf("\n");
++ }
++
++ printf("\n");
++ printf("Logical blocks:\n");
++ printf("\n");
++
++ printf("Legends:\n");
++ printf(" - Good block\n");
++ printf(" + Initially remapped block\n");
++ printf(" M Remapped block\n");
++ printf(" B Bad/Unmapped block\n");
++ printf("\n");
++
++ for (i = 0; i < nm->ni->data_block_count; i++) {
++ if (i % 64 == 0)
++ printf(" ");
++
++ if (nm->ni->block_mapping[i] < 0)
++ putc('B');
++ else if (nm->ni->block_mapping[i] == i)
++ putc('-');
++ else if (nm->ni->block_mapping[i] < nm->ni->data_block_count)
++ putc('+');
++ else if (nm->ni->block_mapping[i] > nm->ni->mapping_blocks_top_ba &&
++ nm->ni->block_mapping[i] < nm->ni->signature_ba)
++ putc('M');
++ else
++ putc('?');
++
++ if (i % 64 == 63)
++ printf("\n");
++ }
++
++ return 0;
++}
++
++int nmbm_mtd_print_bad_blocks(const char *name)
++{
++ struct nmbm_mtd *nm;
++ bool found = false;
++ uint32_t i;
++
++ list_for_each_entry(nm, &nmbm_devs, node) {
++ if (!strcmp(nm->name, name)) {
++ found = true;
++ break;
++ }
++ }
++
++ if (!found) {
++ printf("Error: NMBM device '%s' not found\n", name);
++ return -ENODEV;
++ }
++
++ printf("Physical blocks:\n");
++
++ for (i = 0; i < nm->ni->block_count; i++) {
++ switch (nmbm_debug_get_block_state(nm->ni, i)) {
++ case BLOCK_ST_BAD:
++ printf("%-12u [0x%08llx] - Bad\n", i,
++ (uint64_t)i << nm->ni->erasesize_shift);
++ break;
++ case BLOCK_ST_NEED_REMAP:
++ printf("%-12u [0x%08llx] - Awaiting remapping\n", i,
++ (uint64_t)i << nm->ni->erasesize_shift);
++ break;
++ }
++ }
++
++ printf("\n");
++ printf("Logical blocks:\n");
++
++ for (i = 0; i < nm->ni->data_block_count; i++) {
++ if (nm->ni->block_mapping[i] < 0) {
++ printf("%-12u [0x%08llx] - Bad\n", i,
++ (uint64_t)i << nm->ni->erasesize_shift);
++ }
++ }
++
++ return 0;
++}
++
++int nmbm_mtd_print_mappings(const char *name, int printall)
++{
++ struct nmbm_mtd *nm;
++ bool found = false;
++ int32_t pb;
++ uint32_t i;
++
++ list_for_each_entry(nm, &nmbm_devs, node) {
++ if (!strcmp(nm->name, name)) {
++ found = true;
++ break;
++ }
++ }
++
++ if (!found) {
++ printf("Error: NMBM device '%s' not found\n", name);
++ return -ENODEV;
++ }
++
++ printf("Logical Block Physical Block\n");
++ printf("==================================\n");
++
++ if (!printall) {
++ for (i = 0; i < nm->ni->data_block_count; i++) {
++ pb = nm->ni->block_mapping[i];
++ if (pb < 0)
++ printf("%-20uUnmapped\n", i);
++ else if ((uint32_t)pb > nm->ni->mapping_blocks_top_ba &&
++ (uint32_t)pb < nm->ni->signature_ba)
++ printf("%-20u%u\n", i, pb);
++ }
++
++ return 0;
++ }
++
++ for (i = 0; i < nm->ni->data_block_count; i++) {
++ pb = nm->ni->block_mapping[i];
++
++ if (pb >= 0)
++ printf("%-20u%u\n", i, pb);
++ else
++ printf("%-20uUnmapped\n", i);
++ }
++
++ return 0;
++}
+--- /dev/null
++++ b/include/nmbm/nmbm-mtd.h
+@@ -0,0 +1,27 @@
++/* SPDX-License-Identifier: GPL-2.0 */
++/*
++ * Copyright (C) 2020 MediaTek Inc. All Rights Reserved.
++ *
++ * Author: Weijie Gao <weijie.gao@mediatek.com>
++ */
++
++#ifndef _NMBM_MTD_H_
++#define _NMBM_MTD_H_
++
++#include <linux/mtd/mtd.h>
++
++int nmbm_attach_mtd(struct mtd_info *lower, int flags, uint32_t max_ratio,
++ uint32_t max_reserved_blocks, struct mtd_info **upper);
++
++int nmbm_free_mtd(struct mtd_info *upper);
++
++struct mtd_info *nmbm_mtd_get_upper_by_index(uint32_t index);
++struct mtd_info *nmbm_mtd_get_upper(struct mtd_info *lower);
++
++void nmbm_mtd_list_devices(void);
++int nmbm_mtd_print_info(const char *name);
++int nmbm_mtd_print_states(const char *name);
++int nmbm_mtd_print_bad_blocks(const char *name);
++int nmbm_mtd_print_mappings(const char *name, int printall);
++
++#endif /* _NMBM_MTD_H_ */
diff --git a/package/boot/uboot-mediatek/patches/100-08-common-board_r-add-support-to-initialize-NMBM-after-.patch b/package/boot/uboot-mediatek/patches/100-08-common-board_r-add-support-to-initialize-NMBM-after-.patch
new file mode 100644
index 00000000000..da4dce917ba
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/100-08-common-board_r-add-support-to-initialize-NMBM-after-.patch
@@ -0,0 +1,46 @@
+From dcf24c8deeb43a4406ae18136c8700dc2f867415 Mon Sep 17 00:00:00 2001
+From: Weijie Gao <weijie.gao@mediatek.com>
+Date: Mon, 25 Jul 2022 11:18:03 +0800
+Subject: [PATCH 42/71] common: board_r: add support to initialize NMBM after
+ nand initialization
+
+This patch add support to initialize NMBM after nand initialized.
+
+Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+---
+ common/board_r.c | 17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+--- a/common/board_r.c
++++ b/common/board_r.c
+@@ -373,6 +373,20 @@ static int initr_nand(void)
+ }
+ #endif
+
++#ifdef CONFIG_NMBM_MTD
++
++__weak int board_nmbm_init(void)
++{
++ return 0;
++}
++
++/* go init the NMBM */
++static int initr_nmbm(void)
++{
++ return board_nmbm_init();
++}
++#endif
++
+ #if defined(CONFIG_CMD_ONENAND)
+ /* go init the NAND */
+ static int initr_onenand(void)
+@@ -675,6 +689,9 @@ static init_fnc_t init_sequence_r[] = {
+ #ifdef CONFIG_CMD_ONENAND
+ initr_onenand,
+ #endif
++#ifdef CONFIG_NMBM_MTD
++ initr_nmbm,
++#endif
+ #ifdef CONFIG_MMC
+ initr_mmc,
+ #endif
diff --git a/package/boot/uboot-mediatek/patches/100-09-cmd-add-nmbm-command.patch b/package/boot/uboot-mediatek/patches/100-09-cmd-add-nmbm-command.patch
new file mode 100644
index 00000000000..4eb2bc9ccfe
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/100-09-cmd-add-nmbm-command.patch
@@ -0,0 +1,370 @@
+From 0af8d0aac77f4df4bc7dadbcdea5d9a16f5f3e45 Mon Sep 17 00:00:00 2001
+From: Weijie Gao <weijie.gao@mediatek.com>
+Date: Mon, 25 Jul 2022 10:44:57 +0800
+Subject: [PATCH 43/71] cmd: add nmbm command
+
+Add nmbm command for debugging, data operations and image-booting support
+
+Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+---
+ cmd/Kconfig | 6 +
+ cmd/Makefile | 1 +
+ cmd/nmbm.c | 327 +++++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 334 insertions(+)
+ create mode 100644 cmd/nmbm.c
+
+--- a/cmd/Kconfig
++++ b/cmd/Kconfig
+@@ -1392,6 +1392,12 @@ config CMD_NAND_TORTURE
+
+ endif # CMD_NAND
+
++config CMD_NMBM
++ depends on NMBM_MTD
++ bool "nmbm"
++ help
++ NAND mapping block management (NMBM) utility
++
+ config CMD_NVME
+ bool "nvme"
+ depends on NVME
+--- a/cmd/Makefile
++++ b/cmd/Makefile
+@@ -127,6 +127,7 @@ obj-y += legacy-mtd-utils.o
+ endif
+ obj-$(CONFIG_CMD_MUX) += mux.o
+ obj-$(CONFIG_CMD_NAND) += nand.o
++obj-$(CONFIG_CMD_NMBM) += nmbm.o
+ obj-$(CONFIG_CMD_NET) += net.o
+ obj-$(CONFIG_CMD_NVEDIT_EFI) += nvedit_efi.o
+ obj-$(CONFIG_CMD_ONENAND) += onenand.o
+--- /dev/null
++++ b/cmd/nmbm.c
+@@ -0,0 +1,327 @@
++// SPDX-License-Identifier: GPL-2.0
++/*
++ * Copyright (C) 2020 MediaTek Inc. All Rights Reserved.
++ *
++ * Author: Weijie Gao <weijie.gao@mediatek.com>
++ */
++
++#include <command.h>
++#include <image.h>
++#include <stdbool.h>
++#include <linux/types.h>
++#include <linux/mtd/mtd.h>
++#include <jffs2/load_kernel.h>
++
++#include <nmbm/nmbm-mtd.h>
++
++static int nmbm_parse_offset_size(struct mtd_info *mtd, char *off_str,
++ char *size_str, uint64_t *off,
++ uint64_t *size)
++{
++ char *end;
++
++ *off = simple_strtoull(off_str, &end, 16);
++ if (end == off_str) {
++ printf("Error: offset '%s' is invalid\n", off_str);
++ return -EINVAL;
++ }
++
++ if (*off >= mtd->size) {
++ printf("Error: offset '0x%llx' is beyond the end of device\n",
++ *off);
++ return -EINVAL;
++ }
++
++ *size = simple_strtoull(size_str, &end, 16);
++ if (end == off_str) {
++ printf("Error: size '%s' is invalid\n", off_str);
++ return -EINVAL;
++ }
++
++ if (*off + *size > mtd->size) {
++ printf("Error: size '0x%llx' is too large\n", *size);
++ return -EINVAL;
++ }
++
++ return 0;
++}
++
++static int do_nmbm_erase(struct mtd_info *mtd, uint64_t offset, uint64_t size)
++{
++ struct erase_info ei;
++ int ret;
++
++ memset(&ei, 0, sizeof(ei));
++
++ ei.mtd = mtd;
++ ei.addr = offset;
++ ei.len = size;
++
++ printf("Erasing from 0x%llx, size 0x%llx ...\n", offset, size);
++
++ ret = mtd_erase(mtd, &ei);
++
++ if (!ret) {
++ printf("Succeeded\n");
++ return CMD_RET_SUCCESS;
++ }
++
++ printf("Failed at 0x%llx\n", ei.fail_addr);
++
++ return CMD_RET_FAILURE;
++}
++
++static int do_nmbm_rw(int read, struct mtd_info *mtd, uintptr_t addr,
++ uint64_t offset, size_t size)
++{
++ size_t retlen;
++ int ret;
++
++ printf("%s 0x%llx, size 0x%zx\n", read ? "Reading from" : "Writing to",
++ offset, size);
++
++ if (read)
++ ret = mtd_read(mtd, offset, size, &retlen, (void *)addr);
++ else
++ ret = mtd_write(mtd, offset, size, &retlen, (void *)addr);
++
++ if (!ret) {
++ printf("Succeeded\n");
++ return CMD_RET_SUCCESS;
++ }
++
++ printf("Failed at 0x%llx\n", offset + retlen);
++
++ return CMD_RET_FAILURE;
++}
++
++static int do_nmbm_mtd_boot(struct cmd_tbl *cmdtp, struct mtd_info *mtd,
++ int argc, char *const argv[])
++{
++ bool print_image_contents = true;
++ uintptr_t loadaddr = image_load_addr;
++ char *end, *image_name;
++ const char *ep;
++ size_t retlen;
++ uint32_t size;
++ uint64_t off;
++ int ret;
++
++#if defined(CONFIG_CMD_MTDPARTS)
++ struct mtd_device *partdev;
++ struct mtd_info *partmtd;
++ struct part_info *part;
++ u8 pnum;
++#endif
++
++ ep = env_get("autostart");
++
++ if (ep && !strcmp(ep, "yes"))
++ print_image_contents = false;
++
++ if (argc == 2) {
++ loadaddr = simple_strtoul(argv[0], &end, 0);
++ if (*end || end == argv[0]) {
++ printf("'%s' is not a valid address\n", argv[0]);
++ return CMD_RET_FAILURE;
++ }
++
++ argc--;
++ argv++;
++ }
++
++ off = simple_strtoull(argv[0], &end, 0);
++ if (*end || end == argv[0]) {
++#if defined(CONFIG_CMD_MTDPARTS)
++ ret = mtdparts_init();
++ if (ret)
++ return CMD_RET_FAILURE;
++
++ ret = find_dev_and_part(argv[0], &partdev, &pnum, &part);
++ if (ret)
++ return CMD_RET_FAILURE;
++
++ if (partdev->id->type != MTD_DEV_TYPE_NMBM) {
++ printf("'%s' is not a NMBM device partition\n",
++ argv[0]);
++ return CMD_RET_FAILURE;
++ }
++
++ partmtd = nmbm_mtd_get_upper_by_index(partdev->id->num);
++
++ if (partmtd != mtd) {
++ printf("'%s' does not belong to this device\n",
++ argv[0]);
++ return CMD_RET_FAILURE;
++ }
++
++ off = part->offset;
++#else
++ printf("'%s' is not a valid offset\n", argv[0]);
++ return CMD_RET_FAILURE;
++#endif
++ }
++
++ ret = mtd_read(mtd, off, sizeof(struct legacy_img_hdr), &retlen,
++ (void *)loadaddr);
++ if (ret || retlen != sizeof(struct legacy_img_hdr)) {
++ printf("Failed to read NMBM at offset 0x%08llx\n", off);
++ return CMD_RET_FAILURE;
++ }
++
++ switch (genimg_get_format((void *)loadaddr)) {
++#if defined(CONFIG_LEGACY_IMAGE_FORMAT)
++ case IMAGE_FORMAT_LEGACY:
++ size = image_get_image_size((struct legacy_img_hdr *)loadaddr);
++ image_name = "legacy";
++ break;
++#endif
++#if defined(CONFIG_FIT)
++ case IMAGE_FORMAT_FIT:
++ size = fit_get_size((const void *)loadaddr);
++ image_name = "FIT";
++ break;
++#endif
++ default:
++ printf("Error: no Image found at offset 0x%08llx\n", off);
++ return CMD_RET_FAILURE;
++ }
++
++ printf("Loading %s image at offset 0x%llx to memory 0x%08lx, size 0x%x ...\n",
++ image_name, off, loadaddr, size);
++
++ ret = mtd_read(mtd, off, size, &retlen, (void *)loadaddr);
++ if (ret || retlen != size) {
++ printf("Error: Failed to load image at offset 0x%08llx\n",
++ off + retlen);
++ return CMD_RET_FAILURE;
++ }
++
++ switch (genimg_get_format((void *)loadaddr)) {
++#if defined(CONFIG_LEGACY_IMAGE_FORMAT)
++ case IMAGE_FORMAT_LEGACY:
++ if (print_image_contents)
++ image_print_contents((void *)loadaddr);
++ break;
++#endif
++#if defined(CONFIG_FIT)
++ case IMAGE_FORMAT_FIT:
++ if (print_image_contents)
++ fit_print_contents((void *)loadaddr);
++ break;
++#endif
++ }
++
++ image_load_addr = loadaddr;
++
++ return bootm_maybe_autostart(cmdtp, "nmbm");
++}
++
++static int do_nmbm(struct cmd_tbl *cmdtp, int flag, int argc,
++ char *const argv[])
++{
++ struct mtd_info *mtd;
++ uint64_t offset, size;
++ char *end;
++ uintptr_t addr;
++ int ret, all = 0;
++
++ if (argc == 1)
++ return CMD_RET_USAGE;
++
++ if (!strcmp(argv[1], "list")) {
++ nmbm_mtd_list_devices();
++ return CMD_RET_SUCCESS;
++ }
++
++ if (argc < 3)
++ return CMD_RET_USAGE;
++
++ if (!strcmp(argv[2], "info"))
++ return !!nmbm_mtd_print_info(argv[1]);
++
++ if (!strcmp(argv[2], "state"))
++ return !!nmbm_mtd_print_states(argv[1]);
++
++ if (!strcmp(argv[2], "bad"))
++ return !!nmbm_mtd_print_bad_blocks(argv[1]);
++
++ if (!strcmp(argv[2], "mapping")) {
++ if (argc >= 4) {
++ if (!strcmp(argv[3], "all"))
++ all = 1;
++ }
++
++ return nmbm_mtd_print_mappings(argv[1], all);
++ }
++
++ if (argc < 4)
++ return CMD_RET_USAGE;
++
++ mtd = get_mtd_device_nm(argv[1]);
++ if (IS_ERR(mtd)) {
++ printf("Error: NMBM device '%s' not found\n", argv[1]);
++ return CMD_RET_FAILURE;
++ }
++
++ if (mtd->type != MTD_DEV_TYPE_NMBM) {
++ printf("Error: '%s' is not a NMBM device\n", argv[1]);
++ return CMD_RET_FAILURE;
++ }
++
++ if (!strcmp(argv[2], "boot"))
++ return do_nmbm_mtd_boot(cmdtp, mtd, argc - 3, argv + 3);
++
++ if (argc < 5)
++ return CMD_RET_USAGE;
++
++ if (!strcmp(argv[2], "erase")) {
++ ret = nmbm_parse_offset_size(mtd, argv[3], argv[4], &offset,
++ &size);
++ if (ret)
++ return CMD_RET_FAILURE;
++
++ return do_nmbm_erase(mtd, offset, size);
++ }
++
++ if (argc < 6)
++ return CMD_RET_USAGE;
++
++ ret = nmbm_parse_offset_size(mtd, argv[4], argv[5], &offset, &size);
++ if (ret)
++ return CMD_RET_FAILURE;
++
++ if (size > SIZE_MAX) {
++ printf("Error: size 0x%llx is too large\n", size);
++ return -EINVAL;
++ }
++
++ addr = simple_strtoul(argv[3], &end, 16);
++ if (end == argv[3]) {
++ printf("Error: addr '%s' is invalid\n", argv[3]);
++ return -EINVAL;
++ }
++
++ if (!strcmp(argv[2], "read"))
++ return do_nmbm_rw(1, mtd, addr, offset, (size_t)size);
++
++ if (!strcmp(argv[2], "write"))
++ return do_nmbm_rw(0, mtd, addr, offset, (size_t)size);
++
++ return CMD_RET_USAGE;
++}
++
++U_BOOT_CMD(
++ nmbm, CONFIG_SYS_MAXARGS, 0, do_nmbm,
++ "NMBM utility commands",
++ "\n"
++ "nmbm list - List NMBM devices\n"
++ "nmbm <name> info - Display NMBM information\n"
++ "nmbm <name> state - Display block states\n"
++ "nmbm <name> bad - Display bad blocks\n"
++ "nmbm <name> boot <part | [loadaddr] offset> - Boot from NMBM\n"
++ "nmbm <name> mapping [all] - Display block mapping\n"
++ "nmbm <name> erase <offset> <size> - Erase blocks\n"
++ "nmbm <name> read <addr> <offset> <size> - Read data\n"
++ "nmbm <name> write <addr> <offset> <size> - Write data\n"
++);
diff --git a/package/boot/uboot-mediatek/patches/100-10-cmd-mtd-add-markbad-subcommand-for-NMBM-testing.patch b/package/boot/uboot-mediatek/patches/100-10-cmd-mtd-add-markbad-subcommand-for-NMBM-testing.patch
new file mode 100644
index 00000000000..c6358f32877
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/100-10-cmd-mtd-add-markbad-subcommand-for-NMBM-testing.patch
@@ -0,0 +1,80 @@
+From 6dbbc8affb6ab22f940d13d0e928d5e881127ca4 Mon Sep 17 00:00:00 2001
+From: Weijie Gao <weijie.gao@mediatek.com>
+Date: Mon, 25 Jul 2022 11:22:57 +0800
+Subject: [PATCH 44/71] cmd: mtd: add markbad subcommand for NMBM testing
+
+This patch adds:
+* Mark bad block on lower mtd device and erase on upper mtd
+device, which will trigger remapping:
+$ mtd markbad spi-nand0 0x20000 (mark block1 as bad)
+$ mtd erase nmbm0 0x20000 0x20000 (let nmbm detect the bad block and remap it)
+
+* Clear bad block mark through:
+$ mtd erase.dontskipbad spi-nand0 0x20000 0x20000
+(After cleaning bad block mark, we need to rebuild nmbm manage table.)
+
+Signed-off-by: SkyLake.Huang <skylake.huang@mediatek.com>
+---
+ cmd/mtd.c | 39 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 39 insertions(+)
+
+--- a/cmd/mtd.c
++++ b/cmd/mtd.c
+@@ -504,6 +504,42 @@ out_put_mtd:
+ return CMD_RET_SUCCESS;
+ }
+
++static int do_mtd_markbad(struct cmd_tbl *cmdtp, int flag, int argc,
++ char * const argv[])
++{
++ struct mtd_info *mtd;
++ loff_t off;
++ int ret;
++
++ if (argc < 3)
++ return CMD_RET_USAGE;
++
++ mtd = get_mtd_by_name(argv[1]);
++ if (IS_ERR(mtd) || !mtd)
++ return CMD_RET_FAILURE;
++
++ if (!mtd_can_have_bb(mtd)) {
++ printf("Only NAND-based devices can have mark blocks\n");
++ goto out_put_mtd;
++ }
++
++ off = simple_strtoull(argv[2], NULL, 0);
++
++ ret = mtd_block_markbad(mtd, off);
++ if (!ret) {
++ printf("MTD device %s block at 0x%08llx marked bad\n",
++ mtd->name, off);
++ } else {
++ printf("MTD device %s block at 0x%08llx mark bad failed\n",
++ mtd->name, off);
++ }
++
++out_put_mtd:
++ put_mtd_device(mtd);
++
++ return CMD_RET_SUCCESS;
++}
++
+ #ifdef CONFIG_AUTO_COMPLETE
+ static int mtd_name_complete(int argc, char *const argv[], char last_char,
+ int maxv, char *cmdv[])
+@@ -551,6 +587,7 @@ U_BOOT_LONGHELP(mtd,
+ "\n"
+ "Specific functions:\n"
+ "mtd bad <name>\n"
++ "mtd markbad <name> <off>\n"
+ "\n"
+ "With:\n"
+ "\t<name>: NAND partition/chip name (or corresponding DM device name or OF path)\n"
+@@ -575,4 +612,6 @@ U_BOOT_CMD_WITH_SUBCMDS(mtd, "MTD utils"
+ U_BOOT_SUBCMD_MKENT_COMPLETE(erase, 4, 0, do_mtd_erase,
+ mtd_name_complete),
+ U_BOOT_SUBCMD_MKENT_COMPLETE(bad, 2, 1, do_mtd_bad,
++ mtd_name_complete),
++ U_BOOT_SUBCMD_MKENT_COMPLETE(markbad, 3, 1, do_mtd_markbad,
+ mtd_name_complete));
diff --git a/package/boot/uboot-mediatek/patches/100-11-env-add-support-for-NMBM-upper-MTD-layer.patch b/package/boot/uboot-mediatek/patches/100-11-env-add-support-for-NMBM-upper-MTD-layer.patch
new file mode 100644
index 00000000000..dbb1e2e59d2
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/100-11-env-add-support-for-NMBM-upper-MTD-layer.patch
@@ -0,0 +1,260 @@
+From 240d98e6ad0aed3c11236aa40a60bbd6fe01fae5 Mon Sep 17 00:00:00 2001
+From: Weijie Gao <weijie.gao@mediatek.com>
+Date: Mon, 25 Jul 2022 10:50:46 +0800
+Subject: [PATCH 45/71] env: add support for NMBM upper MTD layer
+
+Add an env driver for NMBM upper MTD layer
+
+Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+---
+ cmd/nvedit.c | 3 +-
+ env/Kconfig | 19 ++++-
+ env/Makefile | 1 +
+ env/env.c | 3 +
+ env/nmbm.c | 155 +++++++++++++++++++++++++++++++++++++++++
+ include/env_internal.h | 1 +
+ tools/Makefile | 1 +
+ 7 files changed, 180 insertions(+), 3 deletions(-)
+ create mode 100644 env/nmbm.c
+
+--- a/env/Kconfig
++++ b/env/Kconfig
+@@ -59,6 +59,7 @@ config ENV_IS_DEFAULT
+ def_bool y if !ENV_IS_IN_EEPROM && !ENV_IS_IN_EXT4 && \
+ !ENV_IS_IN_FAT && !ENV_IS_IN_FLASH && \
+ !ENV_IS_IN_MMC && !ENV_IS_IN_NAND && \
++ !ENV_IS_IN_NMBM && \
+ !ENV_IS_IN_NVRAM && !ENV_IS_IN_ONENAND && \
+ !ENV_IS_IN_REMOTE && !ENV_IS_IN_SPI_FLASH && \
+ !ENV_IS_IN_UBI && !ENV_IS_IN_MTD
+@@ -315,6 +316,21 @@ config ENV_RANGE
+ Specifying a range with more erase blocks than are needed to hold
+ CONFIG_ENV_SIZE allows bad blocks within the range to be avoided.
+
++config ENV_IS_IN_NMBM
++ bool "Environment in a NMBM upper MTD layer"
++ depends on !CHAIN_OF_TRUST
++ depends on NMBM_MTD
++ help
++ Define this if you have a NMBM upper MTD which you want to use for
++ the environment.
++
++ - CONFIG_ENV_OFFSET:
++ - CONFIG_ENV_SIZE:
++
++ These two #defines specify the offset and size of the environment
++ area within the first NAND device. CONFIG_ENV_OFFSET must be
++ aligned to an erase block boundary.
++
+ config ENV_IS_IN_NVRAM
+ bool "Environment in a non-volatile RAM"
+ depends on !CHAIN_OF_TRUST
+@@ -591,7 +607,7 @@ config ENV_MTD_NAME
+ config ENV_OFFSET
+ hex "Environment offset"
+ depends on ENV_IS_IN_EEPROM || ENV_IS_IN_MMC || ENV_IS_IN_NAND || \
+- ENV_IS_IN_SPI_FLASH || ENV_IS_IN_MTD
++ ENV_IS_IN_SPI_FLASH || ENV_IS_IN_NMBM || ENV_IS_IN_MTD
+ default 0x3f8000 if ARCH_ROCKCHIP && ENV_IS_IN_MMC
+ default 0x140000 if ARCH_ROCKCHIP && ENV_IS_IN_SPI_FLASH
+ default 0xF0000 if ARCH_SUNXI
+--- a/env/Makefile
++++ b/env/Makefile
+@@ -26,6 +26,7 @@ obj-$(CONFIG_$(SPL_TPL_)ENV_IS_IN_FAT) +
+ obj-$(CONFIG_$(SPL_TPL_)ENV_IS_IN_EXT4) += ext4.o
+ obj-$(CONFIG_$(SPL_TPL_)ENV_IS_IN_MTD) += mtd.o
+ obj-$(CONFIG_$(SPL_TPL_)ENV_IS_IN_NAND) += nand.o
++obj-$(CONFIG_$(SPL_TPL_)ENV_IS_IN_NMBM) += nmbm.o
+ obj-$(CONFIG_$(SPL_TPL_)ENV_IS_IN_SPI_FLASH) += sf.o
+ obj-$(CONFIG_$(SPL_TPL_)ENV_IS_IN_FLASH) += flash.o
+
+--- a/env/env.c
++++ b/env/env.c
+@@ -52,6 +52,9 @@ static enum env_location env_locations[]
+ #ifdef CONFIG_ENV_IS_IN_NAND
+ ENVL_NAND,
+ #endif
++#ifdef CONFIG_ENV_IS_IN_NMBM
++ ENVL_NMBM,
++#endif
+ #ifdef CONFIG_ENV_IS_IN_NVRAM
+ ENVL_NVRAM,
+ #endif
+--- /dev/null
++++ b/env/nmbm.c
+@@ -0,0 +1,155 @@
++/* SPDX-License-Identifier: GPL-2.0 */
++/*
++ * Copyright (C) 2020 MediaTek Inc. All Rights Reserved.
++ *
++ * Author: Weijie Gao <weijie.gao@mediatek.com>
++ */
++
++#include <command.h>
++#include <env.h>
++#include <env_internal.h>
++#include <errno.h>
++#include <linux/kernel.h>
++#include <linux/stddef.h>
++#include <linux/types.h>
++#include <malloc.h>
++#include <memalign.h>
++#include <search.h>
++
++#include <nmbm/nmbm-mtd.h>
++
++#if defined(CONFIG_CMD_SAVEENV) && defined(CONFIG_NMBM_MTD)
++#define CMD_SAVEENV
++#endif
++
++#if defined(ENV_IS_EMBEDDED)
++env_t *env_ptr = &environment;
++#else /* ! ENV_IS_EMBEDDED */
++env_t *env_ptr;
++#endif /* ENV_IS_EMBEDDED */
++
++DECLARE_GLOBAL_DATA_PTR;
++
++static int env_nmbm_init(void)
++{
++#if defined(ENV_IS_EMBEDDED)
++ int crc1_ok = 0, crc2_ok = 0;
++ env_t *tmp_env1;
++
++ tmp_env1 = env_ptr;
++ crc1_ok = crc32(0, tmp_env1->data, ENV_SIZE) == tmp_env1->crc;
++
++ if (!crc1_ok && !crc2_ok) {
++ gd->env_addr = 0;
++ gd->env_valid = ENV_INVALID;
++
++ return 0;
++ } else if (crc1_ok && !crc2_ok) {
++ gd->env_valid = ENV_VALID;
++ }
++
++ if (gd->env_valid == ENV_VALID)
++ env_ptr = tmp_env1;
++
++ gd->env_addr = (ulong)env_ptr->data;
++
++#else /* ENV_IS_EMBEDDED */
++ gd->env_addr = (ulong)&default_environment[0];
++ gd->env_valid = ENV_VALID;
++#endif /* ENV_IS_EMBEDDED */
++
++ return 0;
++}
++
++#ifdef CMD_SAVEENV
++static int env_nmbm_save(void)
++{
++ ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1);
++ struct mtd_info *mtd;
++ struct erase_info ei;
++ int ret = 0;
++
++ ret = env_export(env_new);
++ if (ret)
++ return ret;
++
++ mtd = nmbm_mtd_get_upper_by_index(0);
++ if (!mtd)
++ return 1;
++
++ printf("Erasing on NMBM...\n");
++ memset(&ei, 0, sizeof(ei));
++
++ ei.mtd = mtd;
++ ei.addr = CONFIG_ENV_OFFSET;
++ ei.len = CONFIG_ENV_SIZE;
++
++ if (mtd_erase(mtd, &ei))
++ return 1;
++
++ printf("Writing on NMBM... ");
++ ret = mtd_write(mtd, CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE, NULL,
++ (u_char *)env_new);
++ puts(ret ? "FAILED!\n" : "OK\n");
++
++ return !!ret;
++}
++#endif /* CMD_SAVEENV */
++
++static int readenv(size_t offset, u_char *buf)
++{
++ struct mtd_info *mtd;
++ struct mtd_oob_ops ops;
++ int ret;
++ size_t len = CONFIG_ENV_SIZE;
++
++ mtd = nmbm_mtd_get_upper_by_index(0);
++ if (!mtd)
++ return 1;
++
++ ops.mode = MTD_OPS_AUTO_OOB;
++ ops.ooblen = 0;
++ while(len > 0) {
++ ops.datbuf = buf;
++ ops.len = min(len, (size_t)mtd->writesize);
++ ops.oobbuf = NULL;
++
++ ret = mtd_read_oob(mtd, offset, &ops);
++ if (ret)
++ return 1;
++
++ buf += mtd->writesize;
++ len -= mtd->writesize;
++ offset += mtd->writesize;
++ }
++
++ return 0;
++}
++
++static int env_nmbm_load(void)
++{
++#if !defined(ENV_IS_EMBEDDED)
++ ALLOC_CACHE_ALIGN_BUFFER(char, buf, CONFIG_ENV_SIZE);
++ int ret;
++
++ ret = readenv(CONFIG_ENV_OFFSET, (u_char *)buf);
++ if (ret) {
++ env_set_default("readenv() failed", 0);
++ return -EIO;
++ }
++
++ return env_import(buf, 1, H_EXTERNAL);
++#endif /* ! ENV_IS_EMBEDDED */
++
++ return 0;
++}
++
++U_BOOT_ENV_LOCATION(nmbm) = {
++ .location = ENVL_NMBM,
++ ENV_NAME("NMBM")
++ .load = env_nmbm_load,
++#if defined(CMD_SAVEENV)
++ .save = env_save_ptr(env_nmbm_save),
++#endif
++ .init = env_nmbm_init,
++};
+--- a/include/env_internal.h
++++ b/include/env_internal.h
+@@ -111,6 +111,7 @@ enum env_location {
+ ENVL_MMC,
+ ENVL_MTD,
+ ENVL_NAND,
++ ENVL_NMBM,
+ ENVL_NVRAM,
+ ENVL_ONENAND,
+ ENVL_REMOTE,
+--- a/tools/Makefile
++++ b/tools/Makefile
+@@ -39,6 +39,7 @@ ENVCRC-$(CONFIG_ENV_IS_IN_FLASH) = y
+ ENVCRC-$(CONFIG_ENV_IS_IN_ONENAND) = y
+ ENVCRC-$(CONFIG_ENV_IS_IN_MTD) = y
+ ENVCRC-$(CONFIG_ENV_IS_IN_NAND) = y
++ENVCRC-$(CONFIG_ENV_IS_IN_NMBM) = y
+ ENVCRC-$(CONFIG_ENV_IS_IN_NVRAM) = y
+ ENVCRC-$(CONFIG_ENV_IS_IN_SPI_FLASH) = y
+ BUILD_ENVCRC ?= $(ENVCRC-y)
diff --git a/package/boot/uboot-mediatek/patches/100-12-mtd-mtk-snand-add-NMBM-support-for-SPL.patch b/package/boot/uboot-mediatek/patches/100-12-mtd-mtk-snand-add-NMBM-support-for-SPL.patch
new file mode 100644
index 00000000000..32b21be2551
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/100-12-mtd-mtk-snand-add-NMBM-support-for-SPL.patch
@@ -0,0 +1,173 @@
+From 9e8ac4fc7125795ac5e8834aaf454fd45b99c580 Mon Sep 17 00:00:00 2001
+From: Weijie Gao <weijie.gao@mediatek.com>
+Date: Mon, 25 Jul 2022 10:53:03 +0800
+Subject: [PATCH 46/71] mtd: mtk-snand: add NMBM support for SPL
+
+Add NMBM support for mtk-snand SPL loader
+
+Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+---
+ drivers/mtd/mtk-snand/mtk-snand-spl.c | 127 ++++++++++++++++++++++++++
+ 1 file changed, 127 insertions(+)
+
+--- a/drivers/mtd/mtk-snand/mtk-snand-spl.c
++++ b/drivers/mtd/mtk-snand/mtk-snand-spl.c
+@@ -13,12 +13,134 @@
+ #include <mtd.h>
+ #include <watchdog.h>
+
++#include <nmbm/nmbm.h>
++
+ #include "mtk-snand.h"
+
+ static struct mtk_snand *snf;
+ static struct mtk_snand_chip_info cinfo;
+ static u32 oobavail;
+
++#ifdef CONFIG_ENABLE_NAND_NMBM
++static struct nmbm_instance *ni;
++
++static int nmbm_lower_read_page(void *arg, uint64_t addr, void *buf, void *oob,
++ enum nmbm_oob_mode mode)
++{
++ int ret;
++ bool raw = mode == NMBM_MODE_RAW ? true : false;
++
++ if (mode == NMBM_MODE_AUTO_OOB) {
++ ret = mtk_snand_read_page_auto_oob(snf, addr, buf, oob,
++ oobavail, NULL, false);
++ } else {
++ ret = mtk_snand_read_page(snf, addr, buf, oob, raw);
++ }
++
++ if (ret == -EBADMSG)
++ return 1;
++ else if (ret >= 0)
++ return 0;
++
++ return ret;
++}
++
++static int nmbm_lower_write_page(void *arg, uint64_t addr, const void *buf,
++ const void *oob, enum nmbm_oob_mode mode)
++{
++ bool raw = mode == NMBM_MODE_RAW ? true : false;
++
++ if (mode == NMBM_MODE_AUTO_OOB) {
++ return mtk_snand_write_page_auto_oob(snf, addr, buf, oob,
++ oobavail, NULL, false);
++ }
++
++ return mtk_snand_write_page(snf, addr, buf, oob, raw);
++}
++
++static int nmbm_lower_erase_block(void *arg, uint64_t addr)
++{
++ return mtk_snand_erase_block(snf, addr);
++}
++
++static int nmbm_lower_is_bad_block(void *arg, uint64_t addr)
++{
++ return mtk_snand_block_isbad(snf, addr);
++}
++
++static int nmbm_lower_mark_bad_block(void *arg, uint64_t addr)
++{
++ return mtk_snand_block_markbad(snf, addr);
++}
++
++static void nmbm_lower_log(void *arg, enum nmbm_log_category level,
++ const char *fmt, va_list ap)
++{
++ vprintf(fmt, ap);
++}
++
++static int nmbm_init(void)
++{
++ struct nmbm_lower_device nld;
++ size_t ni_size;
++ int ret;
++
++ memset(&nld, 0, sizeof(nld));
++
++ nld.flags = NMBM_F_CREATE;
++ nld.max_ratio = CONFIG_NMBM_MAX_RATIO;
++ nld.max_reserved_blocks = CONFIG_NMBM_MAX_BLOCKS;
++
++ nld.size = cinfo.chipsize;
++ nld.erasesize = cinfo.blocksize;
++ nld.writesize = cinfo.pagesize;
++ nld.oobsize = cinfo.sparesize;
++ nld.oobavail = oobavail;
++
++ nld.read_page = nmbm_lower_read_page;
++ nld.write_page = nmbm_lower_write_page;
++ nld.erase_block = nmbm_lower_erase_block;
++ nld.is_bad_block = nmbm_lower_is_bad_block;
++ nld.mark_bad_block = nmbm_lower_mark_bad_block;
++
++ nld.logprint = nmbm_lower_log;
++
++ ni_size = nmbm_calc_structure_size(&nld);
++ ni = malloc(ni_size);
++ if (!ni) {
++ printf("Failed to allocate memory (0x%u) for NMBM instance\n",
++ ni_size);
++ return -ENOMEM;
++ }
++
++ memset(ni, 0, ni_size);
++
++ printf("Initializing NMBM ...\n");
++
++ ret = nmbm_attach(&nld, ni);
++ if (ret) {
++ ni = NULL;
++ return ret;
++ }
++
++ return 0;
++}
++
++int nand_spl_load_image(uint32_t offs, unsigned int size, void *dst)
++{
++ size_t retlen;
++
++ if (!ni)
++ return -ENODEV;
++
++ nmbm_read_range(ni, offs, size, dst, NMBM_MODE_PLACE_OOB, &retlen);
++ if (retlen != size)
++ return -EIO;
++
++ return 0;
++}
++
++#else
+ static u8 *page_cache;
+
+ int nand_spl_load_image(uint32_t offs, unsigned int size, void *dst)
+@@ -60,6 +182,7 @@ int nand_spl_load_image(uint32_t offs, u
+
+ return ret;
+ }
++#endif
+
+ void nand_init(void)
+ {
+@@ -105,11 +228,15 @@ void nand_init(void)
+ printf("SPI-NAND: %s (%uMB)\n", cinfo.model,
+ (u32)(cinfo.chipsize >> 20));
+
++#ifdef CONFIG_ENABLE_NAND_NMBM
++ nmbm_init();
++#else
+ page_cache = malloc(cinfo.pagesize + cinfo.sparesize);
+ if (!page_cache) {
+ mtk_snand_cleanup(snf);
+ printf("mtk-snand-spl: failed to allocate page cache\n");
+ }
++#endif
+ }
+
+ void nand_deselect(void)
diff --git a/package/boot/uboot-mediatek/patches/100-13-cmd-add-a-new-command-for-NAND-flash-debugging.patch b/package/boot/uboot-mediatek/patches/100-13-cmd-add-a-new-command-for-NAND-flash-debugging.patch
new file mode 100644
index 00000000000..e6e12ae24cd
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/100-13-cmd-add-a-new-command-for-NAND-flash-debugging.patch
@@ -0,0 +1,1118 @@
+From 88271cb3ae9c68dc200d627653df96fc557c2a64 Mon Sep 17 00:00:00 2001
+From: Weijie Gao <weijie.gao@mediatek.com>
+Date: Mon, 25 Jul 2022 10:55:35 +0800
+Subject: [PATCH 47/71] cmd: add a new command for NAND flash debugging
+
+Add a command 'nand-ext' for NAND flash debugging:
+- Dump a page with oob, with optional raw read support
+- Display all bad blocks
+- Mark a block as bad block
+- Set a bitflip on a page
+- Erase
+- Read / write data from/to any offset with any size
+- Read / write pages with oob
+- Erase, read and write support skip bad block or forced mode, support
+ raw mode, supporot auto-oob mode
+- Supports operating on a specific partition
+- No need to specify NAND device name
+
+Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+---
+ cmd/Kconfig | 8 +
+ cmd/Makefile | 1 +
+ cmd/nand-ext.c | 1062 ++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 1071 insertions(+)
+ create mode 100644 cmd/nand-ext.c
+
+--- a/cmd/Kconfig
++++ b/cmd/Kconfig
+@@ -1392,6 +1392,14 @@ config CMD_NAND_TORTURE
+
+ endif # CMD_NAND
+
++config CMD_NAND_EXT
++ bool "nand - extended nand utility for debugging"
++ depends on !CMD_NAND
++ default y if MTD_RAW_NAND || MTD_SPI_NAND || MTK_SPI_NAND
++ select MTD_PARTITIONS
++ help
++ NAND flash R/W and debugging support.
++
+ config CMD_NMBM
+ depends on NMBM_MTD
+ bool "nmbm"
+--- a/cmd/Makefile
++++ b/cmd/Makefile
+@@ -127,6 +127,7 @@ obj-y += legacy-mtd-utils.o
+ endif
+ obj-$(CONFIG_CMD_MUX) += mux.o
+ obj-$(CONFIG_CMD_NAND) += nand.o
++obj-$(CONFIG_CMD_NAND_EXT) += nand-ext.o
+ obj-$(CONFIG_CMD_NMBM) += nmbm.o
+ obj-$(CONFIG_CMD_NET) += net.o
+ obj-$(CONFIG_CMD_NVEDIT_EFI) += nvedit_efi.o
+--- /dev/null
++++ b/cmd/nand-ext.c
+@@ -0,0 +1,1062 @@
++// SPDX-License-Identifier: GPL-2.0
++/*
++ * Copyright (C) 2021 MediaTek Inc. All Rights Reserved.
++ *
++ * Author: Weijie Gao <weijie.gao@mediatek.com>
++ */
++
++#include <command.h>
++#include <stdbool.h>
++#include <malloc.h>
++#include <mtd.h>
++#include <dm/devres.h>
++#include <linux/types.h>
++#include <linux/mtd/mtd.h>
++
++static struct mtd_info *curr_dev;
++
++static void mtd_show_parts(struct mtd_info *mtd, int level)
++{
++ struct mtd_info *part;
++ int i;
++
++ list_for_each_entry(part, &mtd->partitions, node) {
++ for (i = 0; i < level; i++)
++ printf("\t");
++ printf(" - 0x%012llx-0x%012llx : \"%s\"\n",
++ part->offset, part->offset + part->size, part->name);
++
++ mtd_show_parts(part, level + 1);
++ }
++}
++
++static void mtd_show_device(struct mtd_info *mtd)
++{
++ /* Device */
++ printf("* %s\n", mtd->name);
++#if defined(CONFIG_DM)
++ if (mtd->dev) {
++ printf(" - device: %s\n", mtd->dev->name);
++ printf(" - parent: %s\n", mtd->dev->parent->name);
++ printf(" - driver: %s\n", mtd->dev->driver->name);
++ }
++#endif
++
++ /* MTD device information */
++ printf(" - type: ");
++ switch (mtd->type) {
++ case MTD_NANDFLASH:
++ printf("NAND flash\n");
++ break;
++ case MTD_MLCNANDFLASH:
++ printf("MLC NAND flash\n");
++ break;
++ case MTD_ABSENT:
++ default:
++ printf("Not supported\n");
++ break;
++ }
++
++ printf(" - block size: 0x%x bytes\n", mtd->erasesize);
++ printf(" - page size: 0x%x bytes\n", mtd->writesize);
++ printf(" - OOB size: %u bytes\n", mtd->oobsize);
++ printf(" - OOB available: %u bytes\n", mtd->oobavail);
++
++ if (mtd->ecc_strength) {
++ printf(" - ECC strength: %u bits\n", mtd->ecc_strength);
++ printf(" - ECC step size: %u bytes\n", mtd->ecc_step_size);
++ printf(" - bitflip threshold: %u bits\n",
++ mtd->bitflip_threshold);
++ }
++
++ printf(" - 0x%012llx-0x%012llx : \"%s\"\n",
++ mtd->offset, mtd->offset + mtd->size, mtd->name);
++
++ /* MTD partitions, if any */
++ mtd_show_parts(mtd, 1);
++}
++
++static int do_nand_list(struct cmd_tbl *cmdtp, int flag, int argc,
++ char *const argv[])
++{
++ struct mtd_info *mtd;
++ int dev_nb = 0;
++
++ /* Ensure all devices (and their partitions) are probed */
++ mtd_probe_devices();
++
++ printf("List of NAND devices:\n");
++ mtd_for_each_device(mtd) {
++ if (mtd->type != MTD_NANDFLASH && mtd->type != MTD_MLCNANDFLASH)
++ continue;
++
++ if (!mtd_is_partition(mtd))
++ mtd_show_device(mtd);
++
++ dev_nb++;
++ }
++
++ if (!dev_nb)
++ printf("No NAND MTD device found\n");
++
++ return CMD_RET_SUCCESS;
++}
++
++static struct mtd_info *nand_get_curr_dev(void)
++{
++ struct mtd_info *mtd, *first_dev = NULL;
++ int err, dev_nb = 0;
++
++ if (curr_dev) {
++ mtd = get_mtd_device(curr_dev, -1);
++ if (!IS_ERR_OR_NULL(mtd)) {
++ __put_mtd_device(mtd);
++ return mtd;
++ }
++
++ curr_dev = NULL;
++ }
++
++ /* Ensure all devices (and their partitions) are probed */
++ mtd_probe_devices();
++
++ mtd_for_each_device(mtd) {
++ if (mtd->type != MTD_NANDFLASH && mtd->type != MTD_MLCNANDFLASH)
++ continue;
++
++ if (!mtd_is_partition(mtd)) {
++ if (!first_dev)
++ first_dev = mtd;
++ dev_nb++;
++ }
++ }
++
++ if (!dev_nb) {
++ printf("No NAND MTD device found\n");
++ return NULL;
++ }
++
++ if (dev_nb > 1) {
++ printf("No active NAND MTD device specified\n");
++ return NULL;
++ }
++
++ err = __get_mtd_device(first_dev);
++ if (err) {
++ printf("Failed to get MTD device '%s': err %d\n",
++ first_dev->name, err);
++ return NULL;
++ }
++
++ curr_dev = first_dev;
++
++ printf("'%s' is now active device\n", first_dev->name);
++
++ return curr_dev;
++}
++
++static struct mtd_info *nand_get_part(struct mtd_info *master,
++ const char *name)
++{
++ struct mtd_info *slave;
++
++ list_for_each_entry(slave, &master->partitions, node) {
++ if (!strcmp(slave->name, name))
++ return slave;
++ }
++
++ return NULL;
++}
++
++static int do_nand_info(struct cmd_tbl *cmdtp, int flag, int argc,
++ char *const argv[])
++{
++ struct mtd_info *mtd = nand_get_curr_dev();
++
++ if (!mtd)
++ return CMD_RET_FAILURE;
++
++ mtd_show_device(mtd);
++
++ return 0;
++}
++
++static int do_nand_select(struct cmd_tbl *cmdtp, int flag, int argc,
++ char *const argv[])
++{
++ struct mtd_info *mtd, *old;
++
++ if (argc < 2) {
++ printf("MTD device name must be specified\n");
++ return CMD_RET_USAGE;
++ }
++
++ mtd = get_mtd_device_nm(argv[1]);
++ if (!mtd) {
++ printf("MTD device '%s' not found\n", argv[1]);
++ return CMD_RET_FAILURE;
++ }
++
++ if (mtd_is_partition(mtd)) {
++ printf("Error: '%s' is a MTD partition\n", argv[1]);
++ __put_mtd_device(mtd);
++ return CMD_RET_FAILURE;
++ }
++
++ if (mtd->type != MTD_NANDFLASH && mtd->type != MTD_MLCNANDFLASH) {
++ printf("Error: '%s' is not a NAND device\n", argv[1]);
++ __put_mtd_device(mtd);
++ return CMD_RET_FAILURE;
++ }
++
++ if (mtd == curr_dev) {
++ __put_mtd_device(mtd);
++ return CMD_RET_SUCCESS;
++ }
++
++ if (curr_dev) {
++ old = get_mtd_device(curr_dev, -1);
++ if (!IS_ERR_OR_NULL(old)) {
++ __put_mtd_device(old);
++ __put_mtd_device(curr_dev);
++ }
++
++ curr_dev = NULL;
++ }
++
++ curr_dev = mtd;
++
++ printf("'%s' is now active device\n", curr_dev->name);
++
++ return CMD_RET_SUCCESS;
++}
++
++static void dump_buf(const u8 *data, size_t size, u64 addr)
++{
++ const u8 *p = data;
++ u32 i, chklen;
++
++ while (size) {
++ chklen = 16;
++ if (chklen > size)
++ chklen = (u32)size;
++
++ printf("%08llx: ", addr);
++
++ for (i = 0; i < chklen; i++) {
++ if (i && (i % 4 == 0))
++ printf(" ");
++
++ printf("%02x ", p[i]);
++ }
++
++ for (i = chklen; i < 16; i++) {
++ if (i && (i % 4 == 0))
++ printf(" ");
++
++ printf(" ");
++ }
++ printf(" ");
++
++ for (i = 0; i < chklen; i++) {
++ if (p[i] < 32 || p[i] >= 0x7f)
++ printf(".");
++ else
++ printf("%c", p[i]);
++ }
++ printf("\n");
++
++ p += chklen;
++ size -= chklen;
++ addr += chklen;
++ }
++}
++
++static int do_nand_dump(struct cmd_tbl *cmdtp, int flag, int argc,
++ char *const argv[])
++{
++ struct mtd_info *mtd = nand_get_curr_dev();
++ struct mtd_oob_ops io_op = {};
++ bool raw = false;
++ int ret;
++ u64 off;
++ u8 *buf;
++
++ if (!mtd)
++ return CMD_RET_FAILURE;
++
++ if (strstr(argv[0], ".raw"))
++ raw = true;
++
++ if (argc < 2) {
++ printf("Dump offset must be specified\n");
++ return CMD_RET_USAGE;
++ }
++
++ off = simple_strtoull(argv[1], NULL, 0);
++ if (off >= mtd->size) {
++ printf("Offset 0x%llx is larger than flash size\n", off);
++ return CMD_RET_FAILURE;
++ }
++
++ off &= ~(u64)mtd->writesize_mask;
++
++ buf = malloc(mtd->writesize + mtd->oobsize);
++ if (!buf) {
++ printf("Failed to allocate buffer\n");
++ return CMD_RET_FAILURE;
++ }
++
++ io_op.mode = raw ? MTD_OPS_RAW : MTD_OPS_PLACE_OOB;
++ io_op.len = mtd->writesize;
++ io_op.datbuf = buf;
++ io_op.ooblen = mtd->oobsize;
++ io_op.oobbuf = buf + mtd->writesize;
++
++ ret = mtd_read_oob(mtd, off, &io_op);
++ if (ret < 0 && ret != -EUCLEAN && ret != -EBADMSG) {
++ printf("Failed to read page at 0x%llx, err %d\n", off, ret);
++ free(buf);
++ return CMD_RET_FAILURE;
++ }
++
++ printf("Dump of %spage at 0x%llx:\n", raw ? "raw " : "", off);
++ dump_buf(buf, mtd->writesize, off);
++
++ printf("\n");
++ printf("OOB:\n");
++ dump_buf(buf + mtd->writesize, mtd->oobsize, 0);
++
++ free(buf);
++
++ return CMD_RET_SUCCESS;
++}
++
++static int do_nand_bad(struct cmd_tbl *cmdtp, int flag, int argc,
++ char *const argv[])
++{
++ struct mtd_info *mtd = nand_get_curr_dev();
++ u64 off = 0;
++
++ if (!mtd)
++ return CMD_RET_FAILURE;
++
++ while (off < mtd->size) {
++ if (mtd_block_isbad(mtd, off))
++ printf("\t%08llx\n", off);
++
++ off += mtd->erasesize;
++ }
++
++ return 0;
++}
++
++static int do_nand_markbad(struct cmd_tbl *cmdtp, int flag, int argc,
++ char *const argv[])
++{
++ struct mtd_info *mtd = nand_get_curr_dev();
++ u64 off;
++ int ret;
++
++ if (!mtd)
++ return CMD_RET_FAILURE;
++
++ if (argc < 2) {
++ printf("Missing address within a block to be marked bad\n");
++ return CMD_RET_USAGE;
++ }
++
++ off = simple_strtoull(argv[1], NULL, 0);
++ if (off >= mtd->size) {
++ printf("Offset 0x%llx is larger than flash size\n", off);
++ return CMD_RET_FAILURE;
++ }
++
++ off &= ~(u64)mtd->erasesize_mask;
++
++ ret = mtd_block_markbad(mtd, off);
++
++ if (!ret)
++ printf("Block at 0x%08llx has been marked bad\n", off);
++ else
++ printf("Failed to mark bad block at 0x%08llx\n", off);
++
++ return ret ? CMD_RET_FAILURE : CMD_RET_SUCCESS;
++}
++
++static int do_nand_bitflip(struct cmd_tbl *cmdtp, int flag, int argc,
++ char *const argv[])
++{
++ struct mtd_info *mtd = nand_get_curr_dev();
++ struct mtd_oob_ops io_op = {};
++ u32 col, bit;
++ bool res;
++ u64 off;
++ u8 *buf;
++ int ret;
++
++ if (!mtd)
++ return CMD_RET_FAILURE;
++
++ if (argc < 2) {
++ printf("Missing address to generate bitflip\n");
++ return CMD_RET_USAGE;
++ }
++
++ off = simple_strtoull(argv[1], NULL, 0);
++ if (off >= mtd->size) {
++ printf("Offset 0x%llx is larger than flash size\n", off);
++ return CMD_RET_FAILURE;
++ }
++
++ if (argc < 3) {
++ printf("Missing column address\n");
++ return CMD_RET_USAGE;
++ }
++
++ col = simple_strtoul(argv[2], NULL, 0);
++ if (col >= mtd->writesize + mtd->oobsize) {
++ printf("Column address must be less than %u\n",
++ mtd->writesize + mtd->oobsize);
++ return CMD_RET_FAILURE;
++ }
++
++ if (argc < 4) {
++ printf("Missing bit position\n");
++ return CMD_RET_USAGE;
++ }
++
++ bit = simple_strtoul(argv[3], NULL, 0);
++ if (bit > 7) {
++ printf("Bit position must be less than 8\n");
++ return CMD_RET_FAILURE;
++ }
++
++ off &= ~(u64)mtd->writesize_mask;
++
++ buf = malloc(mtd->writesize + mtd->oobsize);
++ if (!buf) {
++ printf("Failed to allocate buffer\n");
++ return CMD_RET_FAILURE;
++ }
++
++ io_op.mode = MTD_OPS_RAW;
++ io_op.len = mtd->writesize;
++ io_op.datbuf = buf;
++ io_op.ooblen = mtd->oobsize;
++ io_op.oobbuf = buf + mtd->writesize;
++
++ ret = mtd_read_oob(mtd, off, &io_op);
++ if (ret < 0) {
++ printf("Failed to read page at 0x%llx, err %d\n", off, ret);
++ free(buf);
++ return CMD_RET_FAILURE;
++ }
++
++ if (!(buf[col] & (1 << bit))) {
++ printf("Bit %u at byte %u is already zero\n", bit, col);
++ free(buf);
++ return CMD_RET_FAILURE;
++ }
++
++ buf[col] &= ~(1 << bit);
++
++ memset(&io_op, 0, sizeof(io_op));
++ io_op.mode = MTD_OPS_RAW;
++ io_op.len = mtd->writesize;
++ io_op.datbuf = buf;
++ io_op.ooblen = mtd->oobsize;
++ io_op.oobbuf = buf + mtd->writesize;
++
++ ret = mtd_write_oob(mtd, off, &io_op);
++
++ if (ret < 0) {
++ printf("Failed to write page at 0x%llx, err %d\n", off, ret);
++ return CMD_RET_FAILURE;
++ }
++
++ memset(&io_op, 0, sizeof(io_op));
++ io_op.mode = MTD_OPS_RAW;
++ io_op.len = mtd->writesize;
++ io_op.datbuf = buf;
++ io_op.ooblen = mtd->oobsize;
++ io_op.oobbuf = buf + mtd->writesize;
++
++ ret = mtd_read_oob(mtd, off, &io_op);
++ if (ret < 0) {
++ printf("Failed to read page at 0x%llx, err %d\n", off, ret);
++ free(buf);
++ return CMD_RET_FAILURE;
++ }
++
++ res = (buf[col] & (1 << bit)) == 0;
++ free(buf);
++
++ if (res) {
++ printf("Bit %u at byte %u has been changed to 0\n", bit, col);
++ return CMD_RET_SUCCESS;
++ }
++
++ printf("Failed to change bit %u at byte %u to 0\n", bit, col);
++ return CMD_RET_FAILURE;
++}
++
++static int do_nand_erase(struct cmd_tbl *cmdtp, int flag, int argc,
++ char *const argv[])
++{
++ struct mtd_info *mtd = nand_get_curr_dev(), *part;
++ bool spread = false, force = false;
++ u64 off, size, end, limit;
++ struct erase_info ei;
++ char *ends;
++ int ret;
++
++ if (!mtd)
++ return CMD_RET_FAILURE;
++
++ if (strstr(argv[0], ".spread"))
++ spread = true;
++
++ if (strstr(argv[0], ".force"))
++ force = true;
++
++ if (spread && force) {
++ printf("spread and force must not be set at the same time\n");
++ return CMD_RET_FAILURE;
++ }
++
++ if (argc < 2) {
++ printf("Erase start offset/partition must be specified\n");
++ return CMD_RET_USAGE;
++ }
++
++ part = nand_get_part(mtd, argv[1]);
++ if (part) {
++ off = part->offset;
++
++ if (argc < 3)
++ size = part->size;
++ else
++ size = simple_strtoull(argv[2], NULL, 0);
++
++ if (size > part->size) {
++ printf("Erase end offset is larger than partition size\n");
++ printf("Erase size reduced to 0x%llx\n", part->size);
++
++ size = part->size;
++ }
++
++ limit = off + part->size;
++ } else {
++ off = simple_strtoull(argv[1], &ends, 0);
++
++ if (ends == argv[1] || *ends) {
++ printf("Partition '%s' not found\n", argv[1]);
++ return CMD_RET_FAILURE;
++ }
++
++ if (off >= mtd->size) {
++ printf("Offset 0x%llx is larger than flash size\n", off);
++ return CMD_RET_FAILURE;
++ }
++
++ if (argc < 3) {
++ printf("Erase size offset must be specified\n");
++ return CMD_RET_USAGE;
++ }
++
++ size = simple_strtoull(argv[2], NULL, 0);
++
++ if (off + size > mtd->size) {
++ printf("Erase end offset is larger than flash size\n");
++
++ size = mtd->size - off;
++ printf("Erase size reduced to 0x%llx\n", size);
++ }
++
++ limit = mtd->size;
++ }
++
++ end = off + size;
++ off &= ~(u64)mtd->erasesize_mask;
++ end = (end + mtd->erasesize_mask) & (~(u64)mtd->erasesize_mask);
++ size = end - off;
++
++ printf("Erasing from 0x%llx to 0x%llx, size 0x%llx ...\n",
++ off, end - 1, end - off);
++
++ while (size && off < limit) {
++ if (mtd_block_isbad(mtd, off)) {
++ printf("Bad block at 0x%llx", off);
++
++ if (spread) {
++ printf(" ... skipped\n");
++ off += mtd->erasesize;
++ continue;
++ }
++
++ if (!force) {
++ printf(" ... aborted\n");
++ return CMD_RET_FAILURE;
++ }
++
++ printf(" ... will be force erased\n");
++ }
++
++ memset(&ei, 0, sizeof(ei));
++
++ ei.mtd = mtd;
++ ei.addr = off;
++ ei.len = mtd->erasesize;
++ ei.scrub = force;
++
++ ret = mtd_erase(mtd, &ei);
++ if (ret) {
++ printf("Erase failed at 0x%llx\n", off);
++ return CMD_RET_FAILURE;
++ }
++
++ off += mtd->erasesize;
++ size -= mtd->erasesize;
++ }
++
++ printf("Succeeded\n");
++
++ return CMD_RET_SUCCESS;
++}
++
++static bool is_empty_page(const u8 *buf, size_t size)
++{
++ size_t i;
++
++ for (i = 0; i < size; i++) {
++ if (buf[i] != 0xff)
++ return false;
++ }
++
++ return true;
++}
++
++static int do_nand_io_normal(int argc, char *const argv[])
++{
++ struct mtd_info *mtd = nand_get_curr_dev(), *part;
++ bool spread = false, force = false, raw = false, writeff = false;
++ bool read = false, checkbad = true;
++ struct mtd_oob_ops io_op = {};
++ size_t size, padding, chksz;
++ uintptr_t addr;
++ u64 off, offp;
++ char *ends;
++ u8 *buf;
++ int ret;
++
++ if (!mtd)
++ return CMD_RET_FAILURE;
++
++ if (!strncmp(argv[0], "read", 4))
++ read = true;
++
++ if (strstr(argv[0], ".spread"))
++ spread = true;
++
++ if (strstr(argv[0], ".force"))
++ force = true;
++
++ if (strstr(argv[0], ".raw"))
++ raw = true;
++
++ if (strstr(argv[0], ".ff"))
++ writeff = true;
++
++ if (spread && force) {
++ printf("spread and force must not be set at the same time\n");
++ return CMD_RET_FAILURE;
++ }
++
++ if (argc < 2) {
++ printf("Data address must be specified\n");
++ return CMD_RET_USAGE;
++ }
++
++ addr = simple_strtoul(argv[1], NULL, 0);
++
++ if (argc < 3) {
++ printf("Flash address/partition must be specified\n");
++ return CMD_RET_USAGE;
++ }
++
++ part = nand_get_part(mtd, argv[2]);
++ if (part) {
++ if (argc < 4) {
++ off = 0;
++ } else {
++ off = simple_strtoull(argv[3], NULL, 0);
++ if (off + part->offset >= part->size) {
++ printf("Offset is larger than partition size\n");
++ return CMD_RET_FAILURE;
++ }
++ }
++
++ if (argc < 5) {
++ size = part->size - off;
++ } else {
++ size = simple_strtoul(argv[4], NULL, 0);
++ if (off + size > part->size) {
++ printf("Data size is too large\n");
++ return CMD_RET_FAILURE;
++ }
++ }
++
++ off += part->offset;
++ } else {
++ off = simple_strtoull(argv[2], &ends, 0);
++
++ if (ends == argv[1] || *ends) {
++ printf("Partition '%s' not found\n", argv[2]);
++ return CMD_RET_FAILURE;
++ }
++
++ if (off >= mtd->size) {
++ printf("Offset 0x%llx is larger than flash size\n", off);
++ return CMD_RET_FAILURE;
++ }
++
++ if (argc < 4) {
++ printf("Data size must be specified\n");
++ return CMD_RET_USAGE;
++ }
++
++ size = simple_strtoul(argv[3], NULL, 0);
++ if (off + size > mtd->size) {
++ printf("Data size is too large\n");
++ return CMD_RET_FAILURE;
++ }
++ }
++
++ buf = malloc(mtd->writesize);
++ if (!buf) {
++ printf("Failed to allocate buffer\n");
++ return CMD_RET_FAILURE;
++ }
++
++ printf("%s from 0x%llx to 0x%llx, size 0x%zx ...\n",
++ read ? "Reading" : "Writing", off, off + size - 1, size);
++
++ while (size && off < mtd->size) {
++ if (checkbad || !(off & mtd->erasesize_mask)) {
++ offp = off & ~(u64)mtd->erasesize_mask;
++
++ if (mtd_block_isbad(mtd, offp)) {
++ printf("Bad block at 0x%llx", offp);
++
++ if (spread) {
++ printf(" ... skipped\n");
++ off += mtd->erasesize;
++ checkbad = true;
++ continue;
++ }
++
++ if (!force) {
++ printf(" ... aborted\n");
++ goto err_out;
++ }
++
++ printf(" ... continue\n");
++ }
++
++ checkbad = false;
++ }
++
++ padding = off & mtd->writesize_mask;
++ chksz = mtd->writesize - padding;
++ chksz = min_t(size_t, chksz, size);
++
++ offp = off & ~(u64)mtd->writesize_mask;
++
++ memset(&io_op, 0, sizeof(io_op));
++ io_op.mode = raw ? MTD_OPS_RAW : MTD_OPS_PLACE_OOB;
++ io_op.len = mtd->writesize;
++
++ if (chksz < mtd->writesize)
++ io_op.datbuf = buf;
++ else
++ io_op.datbuf = (void *)addr;
++
++ if (read) {
++ ret = mtd_read_oob(mtd, offp, &io_op);
++ if (ret && ret != -EUCLEAN && ret != -EBADMSG)
++ goto io_err;
++
++ if (chksz < mtd->writesize)
++ memcpy((void *)addr, buf + padding, chksz);
++ } else {
++ if (chksz < mtd->writesize) {
++ memset(buf, 0xff, mtd->writesize);
++ memcpy(buf + padding, (void *)addr, chksz);
++ }
++
++ if (is_empty_page(io_op.datbuf, io_op.len) && !writeff)
++ ret = 0;
++ else
++ ret = mtd_write_oob(mtd, offp, &io_op);
++
++ if (ret)
++ goto io_err;
++ }
++
++ size -= chksz;
++ addr += chksz;
++ off += chksz;
++ }
++
++ if (!size) {
++ printf("Succeeded\n");
++ ret = CMD_RET_SUCCESS;
++ goto out;
++ }
++
++ printf("0x%zx byte%s remained for %s\n", size, size > 1 ? "s" : "",
++ read ? "read" : "write");
++ goto err_out;
++
++io_err:
++ printf("%s error %d at 0x%llx\n", read ? "Read" : "Write", ret, offp);
++
++err_out:
++ ret = CMD_RET_FAILURE;
++
++out:
++ free(buf);
++ return ret;
++}
++
++static int do_nand_io_page(int argc, char *const argv[])
++{
++ struct mtd_info *mtd = nand_get_curr_dev(), *part;
++ bool spread = false, force = false, raw = false, autooob = false;
++ bool read = false, checkbad = true, writeff = false;
++ struct mtd_oob_ops io_op = {};
++ uintptr_t addr;
++ u64 off, offp;
++ char *ends;
++ u32 count;
++ int ret;
++
++ if (!mtd)
++ return CMD_RET_FAILURE;
++
++ if (!strncmp(argv[0], "read", 4))
++ read = true;
++
++ if (strstr(argv[0], ".spread"))
++ spread = true;
++
++ if (strstr(argv[0], ".force"))
++ force = true;
++
++ if (strstr(argv[0], ".raw"))
++ raw = true;
++
++ if (strstr(argv[0], ".auto"))
++ autooob = true;
++
++ if (spread && force) {
++ printf("spread and force must not be set at the same time\n");
++ return CMD_RET_FAILURE;
++ }
++
++ if (raw && autooob) {
++ printf("raw and auto must not be set at the same time\n");
++ return CMD_RET_FAILURE;
++ }
++
++ if (argc < 2) {
++ printf("Data address must be specified\n");
++ return CMD_RET_USAGE;
++ }
++
++ addr = simple_strtoul(argv[1], NULL, 0);
++
++ if (argc < 3) {
++ printf("Flash address/partition must be specified\n");
++ return CMD_RET_USAGE;
++ }
++
++ part = nand_get_part(mtd, argv[2]);
++ if (part) {
++ if (argc < 4) {
++ printf("Partition offset / page count must be specified\n");
++ return CMD_RET_USAGE;
++ }
++
++ if (argc < 5) {
++ off = 0;
++
++ count = simple_strtoul(argv[3], NULL, 0);
++ if (part->offset + count * mtd->writesize > part->size) {
++ printf("Page count exceeds partition size\n");
++ return CMD_RET_FAILURE;
++ }
++ } else {
++ off = simple_strtoull(argv[3], NULL, 0);
++ if (off >= part->size) {
++ printf("Offset 0x%llx is larger than partition size\n", off);
++ return CMD_RET_FAILURE;
++ }
++
++ off &= ~(u64)mtd->writesize_mask;
++
++ count = simple_strtoul(argv[4], NULL, 0);
++ if (part->offset + off + count * mtd->writesize > part->size) {
++ printf("Page count exceeds partition size\n");
++ return CMD_RET_FAILURE;
++ }
++ }
++
++ off += part->offset;
++ } else {
++ off = simple_strtoull(argv[2], &ends, 0);
++
++ if (ends == argv[1] || *ends) {
++ printf("Partition '%s' not found\n", argv[2]);
++ return CMD_RET_FAILURE;
++ }
++
++ if (off >= mtd->size) {
++ printf("Offset 0x%llx is larger than flash size\n", off);
++ return CMD_RET_FAILURE;
++ }
++
++ off &= ~(u64)mtd->writesize_mask;
++
++ if (argc < 4) {
++ printf("Page count must be specified\n");
++ return CMD_RET_USAGE;
++ }
++
++ count = simple_strtoul(argv[3], NULL, 0);
++ if (off + count * mtd->writesize > mtd->size) {
++ printf("Page count exceeds flash size\n");
++ return CMD_RET_FAILURE;
++ }
++ }
++
++ printf("%s from 0x%llx to 0x%llx (+%u), count %u ...\n",
++ read ? "Reading" : "Writing", off,
++ off + count * mtd->writesize - 1, mtd->oobsize, count);
++
++ while (count && off < mtd->size) {
++ if (checkbad || !(off & mtd->erasesize_mask)) {
++ offp = off & ~(u64)mtd->erasesize_mask;
++
++ if (mtd_block_isbad(mtd, offp)) {
++ printf("Bad block at 0x%llx", offp);
++
++ if (spread) {
++ printf(" ... skipped\n");
++ off += mtd->erasesize;
++ checkbad = true;
++ continue;
++ }
++
++ if (!force) {
++ printf(" ... aborted\n");
++ return CMD_RET_FAILURE;
++ }
++
++ printf(" ... continue\n");
++ }
++
++ checkbad = false;
++ }
++
++ memset(&io_op, 0, sizeof(io_op));
++
++ if (raw)
++ io_op.mode = MTD_OPS_RAW;
++ else if (autooob)
++ io_op.mode = MTD_OPS_AUTO_OOB;
++ else
++ io_op.mode = MTD_OPS_PLACE_OOB;
++
++ io_op.len = mtd->writesize;
++ io_op.ooblen = mtd->oobsize;
++ io_op.datbuf = (void *)addr;
++ io_op.oobbuf = io_op.datbuf + mtd->writesize;
++
++ if (read) {
++ ret = mtd_read_oob(mtd, off, &io_op);
++ if (ret && ret != -EUCLEAN && ret != -EBADMSG)
++ goto io_err;
++ } else {
++ if (is_empty_page((void *)addr, mtd->writesize + mtd->oobsize) && !writeff)
++ ret = 0;
++ else
++ ret = mtd_write_oob(mtd, off, &io_op);
++
++ if (ret)
++ goto io_err;
++ }
++
++ count--;
++ addr += mtd->writesize + mtd->oobsize;
++ off += mtd->writesize;
++ }
++
++ if (!count) {
++ printf("Succeeded\n");
++ return CMD_RET_SUCCESS;
++ }
++
++ printf("%u page%s remained for %s\n", count, count > 1 ? "s" : "",
++ read ? "read" : "write");
++ return CMD_RET_FAILURE;
++
++io_err:
++ printf("%s error %d at 0x%llx\n", read ? "Read" : "Write", ret, off);
++ return CMD_RET_FAILURE;
++}
++
++static int do_nand_io(struct cmd_tbl *cmdtp, int flag, int argc,
++ char *const argv[])
++{
++ if (strstr(argv[0], ".oob"))
++ return do_nand_io_page(argc, argv);
++
++ return do_nand_io_normal(argc, argv);
++}
++
++#ifdef CONFIG_SYS_LONGHELP
++static char nand_help_text[] =
++ "- NAND flash R/W and debugging utility\n"
++ "nand list\n"
++ "nand info - Show active NAND devices\n"
++ "nand select <name> - Select active NAND devices\n"
++ "nand dump[.raw] <off>\n"
++ "nand bad\n"
++ "nand markbad <off>\n"
++ "nand bitflip <off> <col> <bit>\n"
++ "nand erase[.spread|.force] [<off> <size>|<part> [<size>]]\n"
++ "nand read[.spread|.force][.raw] <addr> <off> <size>\n"
++ " <addr> <part> [<off> [<size>]]\n"
++ "nand write[.spread|.force][.raw][.ff] <addr> <off> <size>\n"
++ " <addr> <part> [<off> [<size>]]\n"
++ "nand read.oob[.spread|.force][.raw|.auto] <addr> <off> <count>\n"
++ " <addr> <part> [<off>] <count>\n"
++ "nand write.oob[.spread|.force][.raw|.auto][.ff] <addr> <off> <count>\n"
++ " <addr> <part> [<off>] <count>\n";
++#endif
++
++U_BOOT_CMD_WITH_SUBCMDS(nand, "NAND utility",
++ nand_help_text,
++ U_BOOT_SUBCMD_MKENT(list, 1, 0, do_nand_list),
++ U_BOOT_SUBCMD_MKENT(info, 1, 0, do_nand_info),
++ U_BOOT_SUBCMD_MKENT(select, 2, 0, do_nand_select),
++ U_BOOT_SUBCMD_MKENT(dump, 2, 0, do_nand_dump),
++ U_BOOT_SUBCMD_MKENT(bad, 1, 0, do_nand_bad),
++ U_BOOT_SUBCMD_MKENT(markbad, 2, 0, do_nand_markbad),
++ U_BOOT_SUBCMD_MKENT(bitflip, 4, 0, do_nand_bitflip),
++ U_BOOT_SUBCMD_MKENT(erase, 3, 0, do_nand_erase),
++ U_BOOT_SUBCMD_MKENT(read, 5, 0, do_nand_io),
++ U_BOOT_SUBCMD_MKENT(write, 5, 0, do_nand_io)
++);
diff --git a/package/boot/uboot-mediatek/patches/100-14-mtd-spi-nor-add-support-to-read-flash-unique-ID.patch b/package/boot/uboot-mediatek/patches/100-14-mtd-spi-nor-add-support-to-read-flash-unique-ID.patch
new file mode 100644
index 00000000000..da09cd9c088
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/100-14-mtd-spi-nor-add-support-to-read-flash-unique-ID.patch
@@ -0,0 +1,142 @@
+From c4172a95df8a57a66c70a8b9948b9600a01c4cb7 Mon Sep 17 00:00:00 2001
+From: Weijie Gao <weijie.gao@mediatek.com>
+Date: Mon, 25 Jul 2022 11:32:08 +0800
+Subject: [PATCH 49/71] mtd: spi-nor: add support to read flash unique ID
+
+This patch adds support to read unique ID from spi-nor flashes.
+
+Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+---
+ drivers/mtd/spi/spi-nor-core.c | 95 ++++++++++++++++++++++++++++++++++
+ include/linux/mtd/spi-nor.h | 2 +
+ 2 files changed, 97 insertions(+)
+
+--- a/drivers/mtd/spi/spi-nor-core.c
++++ b/drivers/mtd/spi/spi-nor-core.c
+@@ -2854,6 +2854,100 @@ static int spi_nor_init_params(struct sp
+ return 0;
+ }
+
++static int spi_nor_read_uuid(struct spi_nor *nor)
++{
++ u8 read_opcode, addr_width, read_dummy;
++ loff_t addr;
++ u8 *uuid;
++ u8 uuid_len;
++ int shift = 0;
++ int ret;
++ int i;
++ struct spi_mem_op op;
++
++ read_opcode = nor->read_opcode;
++ addr_width = nor->addr_width;
++ read_dummy = nor->read_dummy;
++
++ switch (JEDEC_MFR(nor->info)) {
++ case SNOR_MFR_WINBOND:
++ uuid_len = 8;
++ nor->read_opcode = 0x4b;
++ nor->addr_width = 0;
++ addr = 0x0;
++ nor->read_dummy = 4;
++ break;
++ case SNOR_MFR_GIGADEVICE:
++ uuid_len = 16;
++ nor->read_opcode = 0x4b;
++ nor->addr_width = 3;
++ addr = 0x0;
++ nor->read_dummy = 1;
++ break;
++ case CFI_MFR_ST:
++ case SNOR_MFR_MICRON:
++ uuid_len = 17;
++ shift = 3;
++ nor->read_opcode = 0x9f;
++ nor->addr_width = 0;
++ addr = 0x0;
++ nor->read_dummy = 0;
++ break;
++ case SNOR_MFR_EON:
++ uuid_len = 12;
++ nor->read_opcode = 0x5a;
++ nor->addr_width = 3;
++ addr = 0x80;
++ nor->read_dummy = 1;
++ break;
++ /* Automotive only in SPANSION's NOR devices */
++ case SNOR_MFR_SPANSION:
++ uuid_len = 11;
++ shift = 386;
++ nor->read_opcode = 0x9f;
++ nor->addr_width = 0;
++ addr = 0x0;
++ nor->read_dummy = 0;
++ break;
++ default:
++ printf("UUID not supported on this device.\n");
++ return -ENOTSUPP;
++ }
++
++ uuid = kmalloc((uuid_len + shift) * sizeof(*uuid), GFP_KERNEL);
++ if (!uuid) {
++ ret = -ENOMEM;
++ goto read_err;
++ }
++ memset(uuid, 0x0, (uuid_len + shift) * sizeof(*uuid));
++
++ op = (struct spi_mem_op)SPI_MEM_OP(SPI_MEM_OP_CMD(nor->read_opcode, 0),
++ SPI_MEM_OP_ADDR(nor->addr_width, addr, 0),
++ SPI_MEM_OP_DUMMY(nor->read_dummy, 0),
++ SPI_MEM_OP_DATA_IN(uuid_len+shift, NULL, 0));
++
++ spi_nor_setup_op(nor, &op, nor->reg_proto);
++
++ ret = spi_nor_read_write_reg(nor, &op, uuid);
++ if (ret < 0) {
++ dev_dbg(nor->dev, "error %d reading %x\n", ret, nor->read_opcode);
++ goto read_err;
++ }
++
++ printf("UUID: 0x");
++ for(i = 0; i<uuid_len; i++)
++ printf("%02x", uuid[i+shift]);
++ puts("\n");
++
++read_err:
++ nor->read_opcode = read_opcode;
++ nor->addr_width = addr_width;
++ nor->read_dummy = read_dummy;
++ kfree(uuid);
++
++ return ret;
++}
++
+ static int spi_nor_hwcaps2cmd(u32 hwcaps, const int table[][2], size_t size)
+ {
+ size_t i;
+@@ -4051,6 +4145,7 @@ int spi_nor_scan(struct spi_nor *nor)
+ nor->write = spi_nor_write_data;
+ nor->read_reg = spi_nor_read_reg;
+ nor->write_reg = spi_nor_write_reg;
++ nor->read_uuid = spi_nor_read_uuid;
+
+ nor->setup = spi_nor_default_setup;
+
+--- a/include/linux/mtd/spi-nor.h
++++ b/include/linux/mtd/spi-nor.h
+@@ -29,6 +29,7 @@
+ #define SNOR_MFR_SPANSION CFI_MFR_AMD
+ #define SNOR_MFR_SST CFI_MFR_SST
+ #define SNOR_MFR_WINBOND 0xef /* Also used by some Spansion */
++#define SNOR_MFR_EON CFI_MFR_EON
+ #define SNOR_MFR_CYPRESS 0x34
+
+ /*
+@@ -571,6 +572,7 @@ struct spi_nor {
+ void (*unprepare)(struct spi_nor *nor, enum spi_nor_ops ops);
+ int (*read_reg)(struct spi_nor *nor, u8 opcode, u8 *buf, int len);
+ int (*write_reg)(struct spi_nor *nor, u8 opcode, u8 *buf, int len);
++ int (*read_uuid)(struct spi_nor *nor);
+
+ ssize_t (*read)(struct spi_nor *nor, loff_t from,
+ size_t len, u_char *read_buf);
diff --git a/package/boot/uboot-mediatek/patches/100-15-cmd-sf-add-support-to-read-flash-unique-ID.patch b/package/boot/uboot-mediatek/patches/100-15-cmd-sf-add-support-to-read-flash-unique-ID.patch
new file mode 100644
index 00000000000..f7cbd8d052c
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/100-15-cmd-sf-add-support-to-read-flash-unique-ID.patch
@@ -0,0 +1,46 @@
+From e60939acbebd07161f3978d1c6f13123fdd2ebf2 Mon Sep 17 00:00:00 2001
+From: Weijie Gao <weijie.gao@mediatek.com>
+Date: Mon, 25 Jul 2022 11:27:02 +0800
+Subject: [PATCH 50/71] cmd: sf: add support to read flash unique ID
+
+This patch adds support to display unique ID from spi-nor flashes
+
+Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+---
+ cmd/sf.c | 13 ++++++++++++-
+ 1 file changed, 12 insertions(+), 1 deletion(-)
+
+--- a/cmd/sf.c
++++ b/cmd/sf.c
+@@ -412,6 +412,14 @@ static int do_spi_protect(int argc, char
+ return ret == 0 ? 0 : 1;
+ }
+
++static int do_spi_flash_read_uuid(void)
++{
++ int ret = 0;
++ ret = flash->read_uuid(flash);
++
++ return ret == 0 ? 0 : 1;
++}
++
+ enum {
+ STAGE_ERASE,
+ STAGE_CHECK,
+@@ -606,6 +614,8 @@ static int do_spi_flash(struct cmd_tbl *
+ ret = do_spi_flash_erase(argc, argv);
+ else if (IS_ENABLED(CONFIG_SPI_FLASH_LOCK) && strcmp(cmd, "protect") == 0)
+ ret = do_spi_protect(argc, argv);
++ else if (strcmp(cmd, "uuid") == 0)
++ ret = do_spi_flash_read_uuid();
+ else if (IS_ENABLED(CONFIG_CMD_SF_TEST) && !strcmp(cmd, "test"))
+ ret = do_spi_flash_test(argc, argv);
+ else
+@@ -636,6 +646,7 @@ U_BOOT_LONGHELP(sf,
+ #ifdef CONFIG_CMD_SF_TEST
+ "\nsf test offset len - run a very basic destructive test"
+ #endif
++ "sf uuid - read uuid from flash"
+ );
+
+ U_BOOT_CMD(
diff --git a/package/boot/uboot-mediatek/patches/100-16-cmd-bootmenu-add-ability-to-select-item-by-shortkey.patch b/package/boot/uboot-mediatek/patches/100-16-cmd-bootmenu-add-ability-to-select-item-by-shortkey.patch
new file mode 100644
index 00000000000..0438895fdba
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/100-16-cmd-bootmenu-add-ability-to-select-item-by-shortkey.patch
@@ -0,0 +1,323 @@
+From 5a15437610e8e8c68dc347845a83d0cbad80ca08 Mon Sep 17 00:00:00 2001
+From: Weijie Gao <weijie.gao@mediatek.com>
+Date: Tue, 19 Jan 2021 10:58:48 +0800
+Subject: [PATCH 51/71] cmd: bootmenu: add ability to select item by shortkey
+
+Add ability to use shortkey to select item for bootmenu command
+
+Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+---
+ cmd/bootmenu.c | 34 ++++++++++++++++++++++++-----
+ common/menu.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++--
+ include/menu.h | 12 +++++++----
+ 3 files changed, 93 insertions(+), 11 deletions(-)
+
+--- a/cmd/bootmenu.c
++++ b/cmd/bootmenu.c
+@@ -89,6 +89,7 @@ static char *bootmenu_choice_entry(void
+ struct bootmenu_data *menu = data;
+ struct bootmenu_entry *iter;
+ enum bootmenu_key key = BKEY_NONE;
++ int choice = -1;
+ int i;
+
+ cli_ch_init(cch);
+@@ -96,10 +97,10 @@ static char *bootmenu_choice_entry(void
+ while (1) {
+ if (menu->delay >= 0) {
+ /* Autoboot was not stopped */
+- key = bootmenu_autoboot_loop(menu, cch);
++ key = bootmenu_autoboot_loop(menu, cch, &choice);
+ } else {
+ /* Some key was pressed, so autoboot was stopped */
+- key = bootmenu_loop(menu, cch);
++ key = bootmenu_loop(menu, cch, &choice);
+ }
+
+ switch (key) {
+@@ -113,6 +114,12 @@ static char *bootmenu_choice_entry(void
+ ++menu->active;
+ /* no menu key selected, regenerate menu */
+ return NULL;
++ case BKEY_CHOICE:
++ menu->active = choice;
++ if (!menu->last_choiced) {
++ menu->last_choiced = true;
++ return NULL;
++ }
+ case BKEY_SELECT:
+ iter = menu->first;
+ for (i = 0; i < menu->active; ++i)
+@@ -170,6 +177,9 @@ static int prepare_bootmenu_entry(struct
+ unsigned short int i = *index;
+ struct bootmenu_entry *entry = NULL;
+ struct bootmenu_entry *iter = *current;
++ char *choice_option;
++ char choice_char;
++ int len;
+
+ while ((option = bootmenu_getoption(i))) {
+
+@@ -184,11 +194,24 @@ static int prepare_bootmenu_entry(struct
+ if (!entry)
+ return -ENOMEM;
+
+- entry->title = strndup(option, sep - option);
++ /* Add KEY_CHOICE support: '%d. %s\0' : len --> len + 4 */
++ len = sep - option + 4;
++ choice_option = malloc(len);
++ if (!choice_option) {
++ free(entry->title);
++ free(entry);
++ return -ENOMEM;
++ }
++ if (!get_choice_char(i, &choice_char))
++ len = snprintf(choice_option, len, "%c. %s", choice_char, option);
++ else
++ len = snprintf(choice_option, len, " %s", option);
++ entry->title = strndup(choice_option, len);
+ if (!entry->title) {
+ free(entry);
+ return -ENOMEM;
+ }
++ free(choice_option);
+
+ entry->command = strdup(sep + 1);
+ if (!entry->command) {
+@@ -334,6 +357,7 @@ static struct bootmenu_data *bootmenu_cr
+ menu->delay = delay;
+ menu->active = 0;
+ menu->first = NULL;
++ menu->last_choiced = false;
+
+ default_str = env_get("bootmenu_default");
+ if (default_str)
+@@ -369,9 +393,9 @@ static struct bootmenu_data *bootmenu_cr
+
+ /* Add Quit entry if entering U-Boot console is disabled */
+ if (!IS_ENABLED(CONFIG_BOOTMENU_DISABLE_UBOOT_CONSOLE))
+- entry->title = strdup("U-Boot console");
++ entry->title = strdup("0. U-Boot console");
+ else
+- entry->title = strdup("Quit");
++ entry->title = strdup("0. Quit");
+
+ if (!entry->title) {
+ free(entry);
+--- a/common/menu.c
++++ b/common/menu.c
+@@ -49,6 +49,33 @@ struct menu {
+ int item_cnt;
+ };
+
++const char choice_chars[] = {
++ '1', '2', '3', '4', '5', '6', '7', '8', '9',
++ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
++ 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
++ 'u', 'v', 'w', 'x', 'y', 'z'
++};
++
++static int find_choice(char choice)
++{
++ int i;
++
++ for (i = 0; i < ARRAY_SIZE(choice_chars); i++)
++ if (tolower(choice) == choice_chars[i])
++ return i;
++
++ return -1;
++}
++
++int get_choice_char(int index, char *result)
++{
++ if (index < ARRAY_SIZE(choice_chars))
++ *result = choice_chars[index];
++ else
++ return -1;
++ return 0;
++}
++
+ /*
+ * An iterator function for menu items. callback will be called for each item
+ * in m, with m, a pointer to the item, and extra being passed to callback. If
+@@ -428,7 +455,7 @@ int menu_destroy(struct menu *m)
+ }
+
+ enum bootmenu_key bootmenu_autoboot_loop(struct bootmenu_data *menu,
+- struct cli_ch_state *cch)
++ struct cli_ch_state *cch, int *choice)
+ {
+ enum bootmenu_key key = BKEY_NONE;
+ int i, c;
+@@ -463,6 +490,19 @@ enum bootmenu_key bootmenu_autoboot_loop
+ break;
+ default:
+ key = BKEY_NONE;
++ if (cch->esc_len || !choice)
++ break;
++
++ *choice = find_choice(c);
++ if ((*choice >= 0 &&
++ *choice < menu->count - 1)) {
++ key = BKEY_CHOICE;
++ } else if (c == '0') {
++ *choice = menu->count - 1;
++ key = BKEY_CHOICE;
++ } else {
++ key = BKEY_NONE;
++ }
+ break;
+ }
+ break;
+@@ -483,7 +523,8 @@ enum bootmenu_key bootmenu_autoboot_loop
+ return key;
+ }
+
+-enum bootmenu_key bootmenu_conv_key(int ichar)
++enum bootmenu_key bootmenu_conv_key(struct bootmenu_data *menu, int ichar,
++ int *choice)
+ {
+ enum bootmenu_key key;
+
+@@ -515,6 +556,20 @@ enum bootmenu_key bootmenu_conv_key(int
+ case ' ':
+ key = BKEY_SPACE;
+ break;
++ case '0' ... '9':
++ case 'a' ... 'z':
++ if (choice && menu) {
++ *choice = find_choice(ichar);
++ if ((*choice >= 0 && *choice < menu->count - 1)) {
++ key = BKEY_CHOICE;
++ break;
++ } else if (ichar == '0') {
++ *choice = menu->count - 1;
++ key = BKEY_CHOICE;
++ break;
++ }
++ }
++ fallthrough;
+ default:
+ key = BKEY_NONE;
+ break;
+@@ -524,11 +579,16 @@ enum bootmenu_key bootmenu_conv_key(int
+ }
+
+ enum bootmenu_key bootmenu_loop(struct bootmenu_data *menu,
+- struct cli_ch_state *cch)
++ struct cli_ch_state *cch, int *choice)
+ {
+ enum bootmenu_key key;
+ int c;
+
++ if (menu->last_choiced) {
++ menu->last_choiced = false;
++ return BKEY_SELECT;
++ }
++
+ c = cli_ch_process(cch, 0);
+ if (!c) {
+ while (!c && !tstc()) {
+@@ -542,7 +602,7 @@ enum bootmenu_key bootmenu_loop(struct b
+ }
+ }
+
+- key = bootmenu_conv_key(c);
++ key = bootmenu_conv_key(menu, c, choice);
+
+ return key;
+ }
+--- a/include/menu.h
++++ b/include/menu.h
+@@ -6,6 +6,8 @@
+ #ifndef __MENU_H__
+ #define __MENU_H__
+
++#include <linux/ctype.h>
++
+ struct cli_ch_state;
+ struct menu;
+
+@@ -19,6 +21,8 @@ int menu_get_choice(struct menu *m, void
+ int menu_item_add(struct menu *m, char *item_key, void *item_data);
+ int menu_destroy(struct menu *m);
+ int menu_default_choice(struct menu *m, void **choice);
++/* Add KEY_CHOICE support */
++int get_choice_char(int index, char *result);
+
+ /**
+ * menu_show() Show a boot menu
+@@ -41,6 +45,7 @@ struct bootmenu_data {
+ int active; /* active menu entry */
+ int count; /* total count of menu entries */
+ struct bootmenu_entry *first; /* first menu entry */
++ bool last_choiced;
+ };
+
+ /** enum bootmenu_key - keys that can be returned by the bootmenu */
+@@ -51,6 +56,7 @@ enum bootmenu_key {
+ BKEY_SELECT,
+ BKEY_QUIT,
+ BKEY_SAVE,
++ BKEY_CHOICE,
+
+ /* 'extra' keys, which are used by menus but not cedit */
+ BKEY_PLUS,
+@@ -81,7 +87,7 @@ enum bootmenu_key {
+ * anything else: KEY_NONE
+ */
+ enum bootmenu_key bootmenu_autoboot_loop(struct bootmenu_data *menu,
+- struct cli_ch_state *cch);
++ struct cli_ch_state *cch, int *choice);
+
+ /**
+ * bootmenu_loop() - handle waiting for a keypress when autoboot is disabled
+@@ -107,7 +113,7 @@ enum bootmenu_key bootmenu_autoboot_loop
+ * Space: BKEY_SPACE
+ */
+ enum bootmenu_key bootmenu_loop(struct bootmenu_data *menu,
+- struct cli_ch_state *cch);
++ struct cli_ch_state *cch, int *choice);
+
+ /**
+ * bootmenu_conv_key() - Convert a U-Boot keypress into a menu key
+@@ -115,6 +121,7 @@ enum bootmenu_key bootmenu_loop(struct b
+ * @ichar: Keypress to convert (ASCII, including control characters)
+ * Returns: Menu key that corresponds to @ichar, or BKEY_NONE if none
+ */
+-enum bootmenu_key bootmenu_conv_key(int ichar);
++enum bootmenu_key bootmenu_conv_key(struct bootmenu_data *menu, int ichar,
++ int *choice);
+
+ #endif /* __MENU_H__ */
+--- a/cmd/eficonfig.c
++++ b/cmd/eficonfig.c
+@@ -239,7 +239,7 @@ char *eficonfig_choice_entry(void *data)
+ cli_ch_init(cch);
+
+ while (1) {
+- key = bootmenu_loop((struct bootmenu_data *)efi_menu, cch);
++ key = bootmenu_loop((struct bootmenu_data *)efi_menu, cch, NULL);
+
+ switch (key) {
+ case BKEY_UP:
+@@ -1838,7 +1838,7 @@ char *eficonfig_choice_change_boot_order
+
+ cli_ch_init(cch);
+ while (1) {
+- key = bootmenu_loop(NULL, cch);
++ key = bootmenu_loop(NULL, cch, NULL);
+
+ switch (key) {
+ case BKEY_PLUS:
+--- a/boot/bootflow_menu.c
++++ b/boot/bootflow_menu.c
+@@ -235,7 +235,7 @@ int bootflow_menu_run(struct bootstd_pri
+
+ key = 0;
+ if (ichar) {
+- key = bootmenu_conv_key(ichar);
++ key = bootmenu_conv_key(NULL, ichar, NULL);
+ if (key == BKEY_NONE)
+ key = ichar;
+ }
diff --git a/package/boot/uboot-mediatek/patches/100-17-common-spl-spl_nand-enable-CONFIG_SYS_NAND_U_BOOT_OF.patch b/package/boot/uboot-mediatek/patches/100-17-common-spl-spl_nand-enable-CONFIG_SYS_NAND_U_BOOT_OF.patch
new file mode 100644
index 00000000000..f017ce92ade
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/100-17-common-spl-spl_nand-enable-CONFIG_SYS_NAND_U_BOOT_OF.patch
@@ -0,0 +1,28 @@
+From 7ab891faaaf2b6126694352d4503dc40605a6aec Mon Sep 17 00:00:00 2001
+From: Weijie Gao <weijie.gao@mediatek.com>
+Date: Mon, 25 Jul 2022 15:10:02 +0800
+Subject: [PATCH 52/71] common: spl: spl_nand: enable
+ CONFIG_SYS_NAND_U_BOOT_OFFS undefined
+
+Enable using spl_nand with CONFIG_SYS_NAND_U_BOOT_OFFS undefined since
+mtk-snand does not require raw nand framework.
+
+Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+---
+ common/spl/spl_nand.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- a/common/spl/spl_nand.c
++++ b/common/spl/spl_nand.c
+@@ -17,7 +17,11 @@
+
+ uint32_t __weak spl_nand_get_uboot_raw_page(void)
+ {
++#ifdef CONFIG_SYS_NAND_U_BOOT_OFFS
+ return CONFIG_SYS_NAND_U_BOOT_OFFS;
++#else
++ return 0;
++#endif
+ }
+
+ #if defined(CONFIG_SPL_NAND_RAW_ONLY)
diff --git a/package/boot/uboot-mediatek/patches/000-mtk-17-board-mt7629-add-support-for-booting-from-SPI-NAND.patch b/package/boot/uboot-mediatek/patches/100-18-board-mt7629-add-support-for-booting-from-SPI-NAND.patch
index aa38b2745e3..ef20c2dfb6c 100644
--- a/package/boot/uboot-mediatek/patches/000-mtk-17-board-mt7629-add-support-for-booting-from-SPI-NAND.patch
+++ b/package/boot/uboot-mediatek/patches/100-18-board-mt7629-add-support-for-booting-from-SPI-NAND.patch
@@ -1,7 +1,7 @@
-From 47b386259625061b376f538055a4f3fbd0ab7fef Mon Sep 17 00:00:00 2001
+From 452dc98572f8353f77551bcce5a2ca8cd050f498 Mon Sep 17 00:00:00 2001
From: Weijie Gao <weijie.gao@mediatek.com>
Date: Wed, 3 Mar 2021 10:48:53 +0800
-Subject: [PATCH 17/21] board: mt7629: add support for booting from SPI-NAND
+Subject: [PATCH 53/71] board: mt7629: add support for booting from SPI-NAND
Add support for mt7629 to boot from SPI-NAND.
Add a new defconfig for mt7629+spi-nand configuration.
@@ -11,17 +11,19 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
arch/arm/dts/mt7629-rfb-u-boot.dtsi | 8 ++
arch/arm/dts/mt7629-rfb.dts | 10 +++
arch/arm/dts/mt7629.dtsi | 16 ++++
- board/mediatek/mt7629/Kconfig | 35 ++++++++-
- configs/mt7629_nand_rfb_defconfig | 111 ++++++++++++++++++++++++++++
- include/configs/mt7629.h | 7 ++
- 6 files changed, 186 insertions(+), 1 deletion(-)
+ arch/arm/mach-mediatek/Kconfig | 4 +-
+ board/mediatek/mt7629/Kconfig | 40 ++++++++++
+ board/mediatek/mt7629/mt7629_rfb.c | 5 ++
+ configs/mt7629_nand_rfb_defconfig | 113 ++++++++++++++++++++++++++++
+ 7 files changed, 195 insertions(+), 1 deletion(-)
+ create mode 100644 board/mediatek/mt7629/Kconfig
create mode 100644 configs/mt7629_nand_rfb_defconfig
--- a/arch/arm/dts/mt7629-rfb-u-boot.dtsi
+++ b/arch/arm/dts/mt7629-rfb-u-boot.dtsi
@@ -40,3 +40,11 @@
&snfi {
- u-boot,dm-pre-reloc;
+ bootph-all;
};
+
+&pinctrl {
@@ -85,13 +87,28 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
snor: snor@11014000 {
compatible = "mediatek,mtk-snor";
reg = <0x11014000 0x1000>;
---- a/board/mediatek/mt7629/Kconfig
-+++ b/board/mediatek/mt7629/Kconfig
-@@ -12,6 +12,39 @@ config MTK_SPL_PAD_SIZE
+--- a/arch/arm/mach-mediatek/Kconfig
++++ b/arch/arm/mach-mediatek/Kconfig
+@@ -144,9 +144,11 @@ config SYS_CONFIG_NAME
config MTK_BROM_HEADER_INFO
string
-- default "media=nor"
+- default "media=nor" if TARGET_MT8518 || TARGET_MT8512 || TARGET_MT7629 || TARGET_MT7622
++ default "media=nor" if TARGET_MT8518 || TARGET_MT8512 || TARGET_MT7622
+ default "media=emmc" if TARGET_MT8516 || TARGET_MT8365 || TARGET_MT8183
+ default "media=snand;nandinfo=2k+64" if TARGET_MT7981 || TARGET_MT7986 || TARGET_MT7988
+ default "lk=1" if TARGET_MT7623
+
++source "board/mediatek/mt7629/Kconfig"
++
+ endif
+--- /dev/null
++++ b/board/mediatek/mt7629/Kconfig
+@@ -0,0 +1,40 @@
++if TARGET_MT7629
++
++config MTK_BROM_HEADER_INFO
++ string
+ default "media=nor" if BOOT_FROM_SNOR
+ default "media=snand;nandinfo=2k+64" if BOOT_FROM_SNAND_2K_64
+ default "media=snand;nandinfo=2k+128" if BOOT_FROM_SNAND_2K_128
@@ -126,49 +143,66 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+config MT7629_BOOT_FROM_SNAND
+ bool
+ default n
++
++endif
+--- a/board/mediatek/mt7629/mt7629_rfb.c
++++ b/board/mediatek/mt7629/mt7629_rfb.c
+@@ -15,3 +15,8 @@ int board_init(void)
- endif
+ return 0;
+ }
++
++uint32_t spl_nand_get_uboot_raw_page(void)
++{
++ return CONFIG_SPL_PAD_TO;
++}
--- /dev/null
+++ b/configs/mt7629_nand_rfb_defconfig
-@@ -0,0 +1,111 @@
+@@ -0,0 +1,113 @@
+CONFIG_ARM=y
+CONFIG_SYS_ARCH_TIMER=y
+CONFIG_SYS_THUMB_BUILD=y
+CONFIG_ARCH_MEDIATEK=y
-+CONFIG_SYS_TEXT_BASE=0x41e00000
++CONFIG_TEXT_BASE=0x41e00000
+CONFIG_SYS_MALLOC_F_LEN=0x4000
+CONFIG_NR_DRAM_BANKS=1
+CONFIG_ENV_SIZE=0x20000
-+CONFIG_ENV_OFFSET=0x100000
++CONFIG_ENV_OFFSET=0x0
++CONFIG_DEFAULT_DEVICE_TREE="mt7629-rfb"
+CONFIG_SPL_TEXT_BASE=0x201000
+CONFIG_TARGET_MT7629=y
+CONFIG_BOOT_FROM_SNAND_2K_64=y
-+CONFIG_SPL_SERIAL_SUPPORT=y
-+CONFIG_SPL_DRIVERS_MISC_SUPPORT=y
++CONFIG_SPL_SERIAL=y
+CONFIG_SPL_STACK_R_ADDR=0x40800000
++CONFIG_SYS_LOAD_ADDR=0x42007f1c
+CONFIG_SPL_PAYLOAD="u-boot.img"
+CONFIG_BUILD_TARGET="u-boot-mtk.bin"
-+CONFIG_DEFAULT_DEVICE_TREE="mt7629-rfb"
++CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
++CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x41fffef0
+CONFIG_SPL_IMAGE="spl/u-boot-spl-mtk.bin"
+CONFIG_FIT=y
-+CONFIG_FIT_VERBOSE=y
-+CONFIG_BOOTDELAY=3
++# CONFIG_AUTOBOOT is not set
+CONFIG_DEFAULT_FDT_FILE="mt7629-rfb"
+CONFIG_SYS_CONSOLE_IS_IN_ENV=y
-+CONFIG_SYS_STDIO_DEREGISTER=y
+# CONFIG_DISPLAY_BOARDINFO is not set
++CONFIG_SPL_MAX_SIZE=0x20000
++CONFIG_SPL_FOOTPRINT_LIMIT=y
++CONFIG_SPL_MAX_FOOTPRINT=0x20000
+CONFIG_SPL_SYS_MALLOC_SIMPLE=y
++# CONFIG_SPL_SHARES_INIT_SP_ADDR is not set
++CONFIG_SPL_STACK=0x106000
+CONFIG_SPL_STACK_R=y
+CONFIG_SPL_MTD_SUPPORT=y
+CONFIG_SPL_NAND_SUPPORT=y
-+CONFIG_SPL_WATCHDOG_SUPPORT=y
++CONFIG_SPL_WATCHDOG=y
+CONFIG_HUSH_PARSER=y
+CONFIG_SYS_PROMPT="U-Boot> "
-+CONFIG_CMD_BOOTMENU=y
+# CONFIG_BOOTM_NETBSD is not set
+# CONFIG_BOOTM_PLAN9 is not set
+# CONFIG_BOOTM_RTEMS is not set
+# CONFIG_BOOTM_VXWORKS is not set
++CONFIG_SYS_BOOTM_LEN=0x4000000
++CONFIG_CMD_BOOTMENU=y
+# CONFIG_CMD_ELF is not set
+# CONFIG_CMD_XIMG is not set
+CONFIG_CMD_BIND=y
@@ -183,13 +217,10 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+CONFIG_CMD_FAT=y
+CONFIG_CMD_FS_GENERIC=y
+CONFIG_CMD_LOG=y
-+CONFIG_EFI_PARTITION=y
-+# CONFIG_SPL_PARTITION_UUIDS is not set
-+CONFIG_PARTITION_TYPE_GUID=y
+CONFIG_OF_SPL_REMOVE_PROPS="interrupt-parent assigned-clocks assigned-clock-parents"
+CONFIG_ENV_OVERWRITE=y
+CONFIG_ENV_IS_IN_MTD=y
-+CONFIG_ENV_MTD_NAME="spi-nand0"
++CONFIG_ENV_MTD_NAME="u-boot-env"
+CONFIG_ENV_SIZE_REDUND=0x40000
+CONFIG_SYS_RELOC_GD_ENV_ADDR=y
+CONFIG_NET_RANDOM_ETHADDR=y
@@ -198,7 +229,6 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+CONFIG_SPL_REGMAP=y
+CONFIG_SYSCON=y
+CONFIG_SPL_SYSCON=y
-+CONFIG_BLK=y
+CONFIG_CLK=y
+CONFIG_SPL_CLK=y
+# CONFIG_MMC is not set
@@ -232,35 +262,13 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+CONFIG_SPL_SYSRESET=y
+CONFIG_SYSRESET_WATCHDOG=y
+CONFIG_USB=y
-+CONFIG_DM_USB=y
+# CONFIG_SPL_DM_USB is not set
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_XHCI_MTK=y
+CONFIG_USB_STORAGE=y
+CONFIG_WDT_MTK=y
-+CONFIG_FAT_WRITE=y
++# CONFIG_SHA256 is not set
++# CONFIG_SPL_SHA1 is not set
+CONFIG_LZMA=y
+CONFIG_SPL_LZMA=y
+# CONFIG_EFI_LOADER is not set
---- a/include/configs/mt7629.h
-+++ b/include/configs/mt7629.h
-@@ -30,12 +30,19 @@
-
- /* Defines for SPL */
- #define CONFIG_SPL_STACK 0x106000
-+#ifdef CONFIG_MT7629_BOOT_FROM_SNAND
-+#define CONFIG_SPL_MAX_SIZE SZ_128K
-+#define CONFIG_SPL_MAX_FOOTPRINT SZ_128K
-+#define CONFIG_SPL_PAD_TO 0x20000
-+#define CONFIG_SYS_NAND_U_BOOT_OFFS CONFIG_SPL_PAD_TO
-+#else
- #define CONFIG_SPL_MAX_SIZE SZ_64K
- #define CONFIG_SPL_MAX_FOOTPRINT SZ_64K
- #define CONFIG_SPL_PAD_TO 0x10000
-
- #define CONFIG_SPI_ADDR 0x30000000
- #define CONFIG_SYS_UBOOT_BASE (CONFIG_SPI_ADDR + CONFIG_SPL_PAD_TO)
-+#endif
-
- /* SPL -> Uboot */
- #define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_TEXT_BASE + SZ_2M - \
diff --git a/package/boot/uboot-mediatek/patches/000-mtk-18-board-mt7622-use-new-spi-nand-driver.patch b/package/boot/uboot-mediatek/patches/100-19-board-mt7622-use-new-spi-nand-driver.patch
index 2202911950c..6202ddf3b01 100644
--- a/package/boot/uboot-mediatek/patches/000-mtk-18-board-mt7622-use-new-spi-nand-driver.patch
+++ b/package/boot/uboot-mediatek/patches/100-19-board-mt7622-use-new-spi-nand-driver.patch
@@ -1,7 +1,7 @@
-From ec0d1899b035700a657721761ff6370b940450ab Mon Sep 17 00:00:00 2001
+From 4c1803cc08b1618d935c1386f43f43a4e9c97697 Mon Sep 17 00:00:00 2001
From: Weijie Gao <weijie.gao@mediatek.com>
Date: Wed, 3 Mar 2021 10:51:43 +0800
-Subject: [PATCH 18/21] board: mt7622: use new spi-nand driver
+Subject: [PATCH 54/71] board: mt7622: use new spi-nand driver
Enable new spi-nand driver support for mt7622_rfb_defconfig
@@ -14,7 +14,7 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
--- a/arch/arm/dts/mt7622-rfb.dts
+++ b/arch/arm/dts/mt7622-rfb.dts
-@@ -188,6 +188,13 @@
+@@ -196,6 +196,13 @@
};
};
@@ -26,11 +26,11 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+};
+
&uart0 {
- pinctrl-names = "default";
- pinctrl-0 = <&uart0_pins>;
+ status = "okay";
+ };
--- a/arch/arm/dts/mt7622.dtsi
+++ b/arch/arm/dts/mt7622.dtsi
-@@ -53,6 +53,22 @@
+@@ -77,6 +77,22 @@
#size-cells = <0>;
};
@@ -55,16 +55,16 @@ Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
reg = <0x11014000 0x1000>;
--- a/configs/mt7622_rfb_defconfig
+++ b/configs/mt7622_rfb_defconfig
-@@ -15,6 +15,7 @@ CONFIG_LOG=y
- CONFIG_SYS_PROMPT="MT7622> "
+@@ -22,6 +22,7 @@ CONFIG_SYS_MAXARGS=8
+ CONFIG_SYS_PBSIZE=1049
CONFIG_CMD_BOOTMENU=y
CONFIG_CMD_MMC=y
+CONFIG_CMD_MTD=y
CONFIG_CMD_PCI=y
CONFIG_CMD_SF_TEST=y
CONFIG_CMD_PING=y
-@@ -28,6 +29,10 @@ CONFIG_CLK=y
- CONFIG_DM_MMC=y
+@@ -41,6 +42,10 @@ CONFIG_SYSCON=y
+ CONFIG_CLK=y
CONFIG_MMC_HS200_SUPPORT=y
CONFIG_MMC_MTK=y
+CONFIG_MTD=y
diff --git a/package/boot/uboot-mediatek/patches/100-20-board-mt7981-add-reference-board-using-new-spi-nand-.patch b/package/boot/uboot-mediatek/patches/100-20-board-mt7981-add-reference-board-using-new-spi-nand-.patch
new file mode 100644
index 00000000000..9dc1a577228
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/100-20-board-mt7981-add-reference-board-using-new-spi-nand-.patch
@@ -0,0 +1,223 @@
+From d5841f8707dcb7a1f73607de67ab45dba93a56a4 Mon Sep 17 00:00:00 2001
+From: Weijie Gao <weijie.gao@mediatek.com>
+Date: Fri, 29 Jul 2022 17:04:12 +0800
+Subject: [PATCH 55/71] board: mt7981: add reference board using new spi-nand
+ driver
+
+Add a new reference board using new spi-nand driver for SPI-NAND flash on
+SNFI interface
+
+Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+---
+ arch/arm/dts/Makefile | 1 +
+ arch/arm/dts/mt7981-snfi-nand-rfb.dts | 132 +++++++++++++++++++++++++
+ configs/mt7981_snfi_nand_rfb_defconfig | 57 +++++++++++
+ 3 files changed, 190 insertions(+)
+ create mode 100644 arch/arm/dts/mt7981-snfi-nand-rfb.dts
+ create mode 100644 configs/mt7981_snfi_nand_rfb_defconfig
+
+--- a/arch/arm/dts/Makefile
++++ b/arch/arm/dts/Makefile
+@@ -1425,6 +1425,7 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += \
+ mt7623n-bananapi-bpi-r2.dtb \
+ mt7629-rfb.dtb \
+ mt7981-rfb.dtb \
++ mt7981-snfi-nand-rfb.dtb \
+ mt7981-emmc-rfb.dtb \
+ mt7981-sd-rfb.dtb \
+ mt7986a-bpi-r3-sd.dtb \
+--- /dev/null
++++ b/arch/arm/dts/mt7981-snfi-nand-rfb.dts
+@@ -0,0 +1,132 @@
++// SPDX-License-Identifier: GPL-2.0
++/*
++ * Copyright (c) 2021 MediaTek Inc.
++ * Author: Sam Shih <sam.shih@mediatek.com>
++ */
++
++/dts-v1/;
++#include "mt7981.dtsi"
++#include <dt-bindings/gpio/gpio.h>
++
++/ {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ model = "mt7981-rfb";
++ compatible = "mediatek,mt7981", "mediatek,mt7981-rfb";
++ chosen {
++ stdout-path = &uart0;
++ tick-timer = &timer0;
++ };
++};
++
++&uart0 {
++ status = "okay";
++};
++
++&uart1 {
++ pinctrl-names = "default";
++ pinctrl-0 = <&uart1_pins>;
++ status = "disabled";
++};
++
++&eth {
++ status = "okay";
++ mediatek,gmac-id = <0>;
++ phy-mode = "sgmii";
++ mediatek,switch = "mt7531";
++ reset-gpios = <&gpio 39 GPIO_ACTIVE_HIGH>;
++
++ fixed-link {
++ speed = <1000>;
++ full-duplex;
++ };
++};
++
++&pinctrl {
++ snfi_pins: snfi-pins-func-1 {
++ mux {
++ function = "flash";
++ groups = "snfi";
++ };
++
++ clk {
++ pins = "SPI0_CLK";
++ drive-strength = <MTK_DRIVE_8mA>;
++ bias-pull-down = <MTK_PUPD_SET_R1R0_00>;
++ };
++
++ conf-pu {
++ pins = "SPI0_CS", "SPI0_HOLD", "SPI0_WP";
++ drive-strength = <MTK_DRIVE_6mA>;
++ bias-pull-up = <MTK_PUPD_SET_R1R0_00>;
++ };
++
++ conf-pd {
++ pins = "SPI0_MOSI", "SPI0_MISO";
++ drive-strength = <MTK_DRIVE_6mA>;
++ bias-pull-down = <MTK_PUPD_SET_R1R0_00>;
++ };
++ };
++
++ spic_pins: spi1-pins-func-1 {
++ mux {
++ function = "spi";
++ groups = "spi1_1";
++ };
++ };
++
++ uart1_pins: spi1-pins-func-3 {
++ mux {
++ function = "uart";
++ groups = "uart1_2";
++ };
++ };
++
++ /* pin15 as pwm0 */
++ one_pwm_pins: one-pwm-pins {
++ mux {
++ function = "pwm";
++ groups = "pwm0_1";
++ };
++ };
++
++ /* pin15 as pwm0 and pin14 as pwm1 */
++ two_pwm_pins: two-pwm-pins {
++ mux {
++ function = "pwm";
++ groups = "pwm0_1", "pwm1_0";
++ };
++ };
++
++ /* pin15 as pwm0, pin14 as pwm1, pin7 as pwm2 */
++ three_pwm_pins: three-pwm-pins {
++ mux {
++ function = "pwm";
++ groups = "pwm0_1", "pwm1_0", "pwm2";
++ };
++ };
++
++ mmc0_pins_default: mmc0default {
++ mux {
++ function = "flash";
++ groups = "emmc_45";
++ };
++ };
++};
++
++&snand {
++ pinctrl-names = "default";
++ pinctrl-0 = <&snfi_pins>;
++ status = "okay";
++ quad-spi;
++};
++
++&pwm {
++ pinctrl-names = "default";
++ pinctrl-0 = <&two_pwm_pins>;
++ status = "okay";
++};
++
++&watchdog {
++ status = "disabled";
++};
+--- /dev/null
++++ b/configs/mt7981_snfi_nand_rfb_defconfig
+@@ -0,0 +1,57 @@
++CONFIG_ARM=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_NR_DRAM_BANKS=1
++CONFIG_ENV_SIZE=0x20000
++CONFIG_DEFAULT_DEVICE_TREE="mt7981-snfi-nand-rfb"
++CONFIG_TARGET_MT7981=y
++CONFIG_DEBUG_UART_BASE=0x11002000
++CONFIG_DEBUG_UART_CLOCK=40000000
++CONFIG_SYS_LOAD_ADDR=0x46000000
++CONFIG_DEBUG_UART=y
++# CONFIG_AUTOBOOT is not set
++CONFIG_DEFAULT_FDT_FILE="mt7981-snfi-nand-rfb"
++CONFIG_LOGLEVEL=7
++CONFIG_LOG=y
++CONFIG_SYS_PROMPT="MT7981> "
++CONFIG_SYS_CBSIZE=512
++CONFIG_SYS_PBSIZE=1049
++# CONFIG_BOOTM_NETBSD is not set
++# CONFIG_BOOTM_PLAN9 is not set
++# CONFIG_BOOTM_RTEMS is not set
++# CONFIG_BOOTM_VXWORKS is not set
++# CONFIG_CMD_ELF is not set
++# CONFIG_CMD_UNLZ4 is not set
++# CONFIG_CMD_UNZIP is not set
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_MTD=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_SMC=y
++CONFIG_MTDIDS_DEFAULT="spi-nand0=spi-nand0"
++CONFIG_MTDPARTS_DEFAULT="spi-nand0:1024k(bl2),512k(u-boot-env),2048k(factory),2048k(fip),65536k(ubi)"
++CONFIG_CMD_UBI=y
++CONFIG_CMD_UBI_RENAME=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++# CONFIG_MMC is not set
++CONFIG_MTD=y
++CONFIG_DM_MTD=y
++CONFIG_MTK_SPI_NAND=y
++CONFIG_MTK_SPI_NAND_MTD=y
++CONFIG_PHY_FIXED=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7981=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_HEXDUMP=y
diff --git a/package/boot/uboot-mediatek/patches/100-21-mtd-spi-nor-add-more-flash-ids.patch b/package/boot/uboot-mediatek/patches/100-21-mtd-spi-nor-add-more-flash-ids.patch
new file mode 100644
index 00000000000..15e943b1c02
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/100-21-mtd-spi-nor-add-more-flash-ids.patch
@@ -0,0 +1,76 @@
+From a2df2df6fd1aec32572c7b30ccf5a184ec1763fd Mon Sep 17 00:00:00 2001
+From: Weijie Gao <weijie.gao@mediatek.com>
+Date: Wed, 27 Jul 2022 16:32:17 +0800
+Subject: [PATCH 56/71] mtd: spi-nor: add more flash ids
+
+Add more spi-nor flash ids
+
+Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+---
+ drivers/mtd/spi/spi-nor-core.c | 1 +
+ drivers/mtd/spi/spi-nor-ids.c | 23 ++++++++++++++++++++++-
+ 2 files changed, 23 insertions(+), 1 deletion(-)
+
+--- a/drivers/mtd/spi/spi-nor-core.c
++++ b/drivers/mtd/spi/spi-nor-core.c
+@@ -674,6 +674,7 @@ static int set_4byte(struct spi_nor *nor
+ case SNOR_MFR_ISSI:
+ case SNOR_MFR_MACRONIX:
+ case SNOR_MFR_WINBOND:
++ case SNOR_MFR_EON:
+ if (need_wren)
+ write_enable(nor);
+
+--- a/drivers/mtd/spi/spi-nor-ids.c
++++ b/drivers/mtd/spi/spi-nor-ids.c
+@@ -83,7 +83,8 @@ const struct flash_info spi_nor_ids[] =
+ { INFO("en25q32b", 0x1c3016, 0, 64 * 1024, 64, 0) },
+ { INFO("en25q64", 0x1c3017, 0, 64 * 1024, 128, SECT_4K) },
+ { INFO("en25q128b", 0x1c3018, 0, 64 * 1024, 256, 0) },
+- { INFO("en25qh128", 0x1c7018, 0, 64 * 1024, 256, 0) },
++ { INFO("en25qh128", 0x1c7018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
++ { INFO("en25qh256", 0x1c7019, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
+ { INFO("en25s64", 0x1c3817, 0, 64 * 1024, 128, SECT_4K) },
+ #endif
+ #ifdef CONFIG_SPI_FLASH_GIGADEVICE /* GIGADEVICE */
+@@ -149,6 +150,11 @@ const struct flash_info spi_nor_ids[] =
+ {INFO("gd55x02g", 0xc8481C, 0, 64 * 1024, 4096, SECT_4K |
+ SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES)},
+ {
++ INFO("gd25q256", 0xc84019, 0, 64 * 1024, 512,
++ SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
++ SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
++ },
++ {
+ INFO("gd25lq128", 0xc86018, 0, 64 * 1024, 256,
+ SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
+ SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
+@@ -474,6 +480,16 @@ const struct flash_info spi_nor_ids[] =
+ SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
+ },
+ {
++ INFO("w25q256jv", 0xef7019, 0, 64 * 1024, 512,
++ SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
++ SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
++ },
++ {
++ INFO("w25q512jv", 0xef7020, 0, 64 * 1024, 1024,
++ SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
++ SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
++ },
++ {
+ INFO("w25q128jw", 0xef8018, 0, 64 * 1024, 256,
+ SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
+ SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
+@@ -523,6 +539,11 @@ const struct flash_info spi_nor_ids[] =
+ SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
+ },
+ { INFO("w25q256", 0xef4019, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
++ {
++ INFO("w25q512", 0xef4020, 0, 64 * 1024, 1024,
++ SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
++ SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
++ },
+ { INFO("w25m512jw", 0xef6119, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
+ { INFO("w25m512jv", 0xef7119, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
+ { INFO("w25h02jv", 0xef9022, 0, 64 * 1024, 4096, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
diff --git a/package/boot/uboot-mediatek/patches/100-22-mtd-spi-nand-backport-from-upstream-kernel.patch b/package/boot/uboot-mediatek/patches/100-22-mtd-spi-nand-backport-from-upstream-kernel.patch
new file mode 100644
index 00000000000..20489d87266
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/100-22-mtd-spi-nand-backport-from-upstream-kernel.patch
@@ -0,0 +1,549 @@
+From 8d0665327819c41fce2c8d50f19c967b22eae564 Mon Sep 17 00:00:00 2001
+From: Weijie Gao <weijie.gao@mediatek.com>
+Date: Wed, 27 Jul 2022 16:36:13 +0800
+Subject: [PATCH 57/71] mtd: spi-nand: backport from upstream kernel
+
+Backport new features from upstream kernel
+
+Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+---
+ drivers/mtd/nand/spi/Kconfig | 1 +
+ drivers/mtd/nand/spi/Makefile | 2 +-
+ drivers/mtd/nand/spi/core.c | 102 ++++++----
+ drivers/mtd/nand/spi/etron.c | 181 +++++++++++++++++
+ drivers/mtd/nand/spi/gigadevice.c | 322 ++++++++++++++++++++++++++----
+ drivers/mtd/nand/spi/macronix.c | 173 +++++++++++++---
+ drivers/mtd/nand/spi/micron.c | 50 ++---
+ drivers/mtd/nand/spi/toshiba.c | 66 +++---
+ drivers/mtd/nand/spi/winbond.c | 164 ++++++++++++---
+ include/linux/mtd/spinand.h | 87 +++++---
+ 10 files changed, 923 insertions(+), 225 deletions(-)
+ create mode 100644 drivers/mtd/nand/spi/etron.c
+
+--- a/drivers/mtd/nand/spi/Makefile
++++ b/drivers/mtd/nand/spi/Makefile
+@@ -1,4 +1,4 @@
+ # SPDX-License-Identifier: GPL-2.0
+
+-spinand-objs := core.o gigadevice.o macronix.o micron.o paragon.o toshiba.o winbond.o
++spinand-objs := core.o etron.o gigadevice.o macronix.o micron.o paragon.o toshiba.o winbond.o
+ obj-$(CONFIG_MTD_SPI_NAND) += spinand.o
+--- a/drivers/mtd/nand/spi/core.c
++++ b/drivers/mtd/nand/spi/core.c
+@@ -822,6 +822,7 @@ static const struct nand_ops spinand_ops
+ };
+
+ static const struct spinand_manufacturer *spinand_manufacturers[] = {
++ &etron_spinand_manufacturer,
+ &gigadevice_spinand_manufacturer,
+ &macronix_spinand_manufacturer,
+ &micron_spinand_manufacturer,
+--- /dev/null
++++ b/drivers/mtd/nand/spi/etron.c
+@@ -0,0 +1,181 @@
++// SPDX-License-Identifier: GPL-2.0
++/*
++ * Copyright (c) 2020 Etron Technology, Inc.
++ *
++ */
++#ifndef __UBOOT__
++#include <malloc.h>
++#include <linux/device.h>
++#include <linux/kernel.h>
++#endif
++#include <linux/bug.h>
++#include <linux/mtd/spinand.h>
++
++#define SPINAND_MFR_ETRON 0xD5
++
++#define STATUS_ECC_LIMIT_BITFLIPS (3 << 4)
++
++static SPINAND_OP_VARIANTS(read_cache_variants,
++ SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 1, NULL, 0),
++ SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
++ SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 1, NULL, 0),
++ SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
++ SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
++ SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
++
++static SPINAND_OP_VARIANTS(write_cache_variants,
++ SPINAND_PROG_LOAD_X4(true, 0, NULL, 0),
++ SPINAND_PROG_LOAD(true, 0, NULL, 0));
++
++static SPINAND_OP_VARIANTS(update_cache_variants,
++ SPINAND_PROG_LOAD_X4(false, 0, NULL, 0),
++ SPINAND_PROG_LOAD(false, 0, NULL, 0));
++
++static int etron_ooblayout_ecc(struct mtd_info *mtd, int section,
++ struct mtd_oob_region *region)
++{
++ if (section > 3)
++ return -ERANGE;
++
++ region->offset = (14 * section) + 72;
++ region->length = 14;
++
++ return 0;
++}
++
++static int etron_ooblayout_free(struct mtd_info *mtd, int section,
++ struct mtd_oob_region *region)
++{
++ if (section > 3)
++ return -ERANGE;
++
++ if (section) {
++ region->offset = 18 * section;
++ region->length = 18;
++ } else {
++ /* section 0 has one byte reserved for bad block mark */
++ region->offset = 2;
++ region->length = 16;
++ }
++ return 0;
++}
++
++static const struct mtd_ooblayout_ops etron_ooblayout = {
++ .ecc = etron_ooblayout_ecc,
++ .rfree = etron_ooblayout_free,
++};
++
++static int etron_ecc_get_status(struct spinand_device *spinand,
++ u8 status)
++{
++ struct nand_device *nand = spinand_to_nand(spinand);
++
++ switch (status & STATUS_ECC_MASK) {
++ case STATUS_ECC_NO_BITFLIPS:
++ return 0;
++
++ case STATUS_ECC_UNCOR_ERROR:
++ return -EBADMSG;
++
++ case STATUS_ECC_HAS_BITFLIPS:
++ return nand->eccreq.strength >> 1;
++
++ case STATUS_ECC_LIMIT_BITFLIPS:
++ return nand->eccreq.strength;
++
++ default:
++ break;
++ }
++
++ return -EINVAL;
++}
++
++static const struct spinand_info etron_spinand_table[] = {
++ /* EM73C 1Gb 3.3V */
++ SPINAND_INFO("EM73C044VCF",
++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x25),
++ NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
++ NAND_ECCREQ(4, 512),
++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
++ &write_cache_variants,
++ &update_cache_variants),
++ SPINAND_HAS_QE_BIT,
++ SPINAND_ECCINFO(&etron_ooblayout, etron_ecc_get_status)),
++ /* EM7xD 2Gb */
++ SPINAND_INFO("EM73D044VCR",
++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x41),
++ NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1),
++ NAND_ECCREQ(4, 512),
++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
++ &write_cache_variants,
++ &update_cache_variants),
++ SPINAND_HAS_QE_BIT,
++ SPINAND_ECCINFO(&etron_ooblayout, etron_ecc_get_status)),
++ SPINAND_INFO("EM73D044VCO",
++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x3A),
++ NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
++ NAND_ECCREQ(8, 512),
++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
++ &write_cache_variants,
++ &update_cache_variants),
++ SPINAND_HAS_QE_BIT,
++ SPINAND_ECCINFO(&etron_ooblayout, etron_ecc_get_status)),
++ SPINAND_INFO("EM78D044VCM",
++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x8E),
++ NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
++ NAND_ECCREQ(8, 512),
++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
++ &write_cache_variants,
++ &update_cache_variants),
++ SPINAND_HAS_QE_BIT,
++ SPINAND_ECCINFO(&etron_ooblayout, etron_ecc_get_status)),
++ /* EM7xE 4Gb */
++ SPINAND_INFO("EM73E044VCE",
++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x3B),
++ NAND_MEMORG(1, 2048, 128, 64, 4096, 80, 1, 1, 1),
++ NAND_ECCREQ(8, 512),
++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
++ &write_cache_variants,
++ &update_cache_variants),
++ SPINAND_HAS_QE_BIT,
++ SPINAND_ECCINFO(&etron_ooblayout, etron_ecc_get_status)),
++ SPINAND_INFO("EM78E044VCD",
++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x8F),
++ NAND_MEMORG(1, 2048, 128, 64, 4096, 80, 1, 1, 1),
++ NAND_ECCREQ(8, 512),
++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
++ &write_cache_variants,
++ &update_cache_variants),
++ SPINAND_HAS_QE_BIT,
++ SPINAND_ECCINFO(&etron_ooblayout, etron_ecc_get_status)),
++ /* EM7xF044VCA 8Gb */
++ SPINAND_INFO("EM73F044VCA",
++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x15),
++ NAND_MEMORG(1, 4096, 256, 64, 4096, 80, 1, 1, 1),
++ NAND_ECCREQ(8, 512),
++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
++ &write_cache_variants,
++ &update_cache_variants),
++ SPINAND_HAS_QE_BIT,
++ SPINAND_ECCINFO(&etron_ooblayout, etron_ecc_get_status)),
++ SPINAND_INFO("EM78F044VCA",
++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x8D),
++ NAND_MEMORG(1, 4096, 256, 64, 4096, 80, 1, 1, 1),
++ NAND_ECCREQ(8, 512),
++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
++ &write_cache_variants,
++ &update_cache_variants),
++ SPINAND_HAS_QE_BIT,
++ SPINAND_ECCINFO(&etron_ooblayout, etron_ecc_get_status)),
++};
++
++static const struct spinand_manufacturer_ops etron_spinand_manuf_ops = {
++};
++
++const struct spinand_manufacturer etron_spinand_manufacturer = {
++ .id = SPINAND_MFR_ETRON,
++ .name = "Etron",
++ .chips = etron_spinand_table,
++ .nchips = ARRAY_SIZE(etron_spinand_table),
++ .ops = &etron_spinand_manuf_ops,
++};
+--- a/drivers/mtd/nand/spi/gigadevice.c
++++ b/drivers/mtd/nand/spi/gigadevice.c
+@@ -43,6 +43,24 @@ static SPINAND_OP_VARIANTS(read_cache_va
+ SPINAND_PAGE_READ_FROM_CACHE_OP_3A(true, 0, 1, NULL, 0),
+ SPINAND_PAGE_READ_FROM_CACHE_OP_3A(false, 0, 0, NULL, 0));
+
++/* Q5 1Gb */
++static SPINAND_OP_VARIANTS(dummy2_read_cache_variants,
++ SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0),
++ SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
++ SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 1, NULL, 0),
++ SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
++ SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
++ SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
++
++/* Q5 2Gb & 4Gb */
++static SPINAND_OP_VARIANTS(dummy4_read_cache_variants,
++ SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 4, NULL, 0),
++ SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
++ SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 2, NULL, 0),
++ SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
++ SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
++ SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
++
+ static SPINAND_OP_VARIANTS(write_cache_variants,
+ SPINAND_PROG_LOAD_X4(true, 0, NULL, 0),
+ SPINAND_PROG_LOAD(true, 0, NULL, 0));
+@@ -268,7 +286,45 @@ static int gd5fxgq4ufxxg_ecc_get_status(
+ return -EINVAL;
+ }
+
++static int esmt_1_ooblayout_ecc(struct mtd_info *mtd, int section,
++ struct mtd_oob_region *region)
++{
++ if (section > 3)
++ return -ERANGE;
++
++ region->offset = (16 * section) + 8;
++ region->length = 8;
++
++ return 0;
++}
++
++static int esmt_1_ooblayout_free(struct mtd_info *mtd, int section,
++ struct mtd_oob_region *region)
++{
++ if (section > 3)
++ return -ERANGE;
++
++ region->offset = (16 * section) + 2;
++ region->length = 6;
++
++ return 0;
++}
++
++static const struct mtd_ooblayout_ops esmt_1_ooblayout = {
++ .ecc = esmt_1_ooblayout_ecc,
++ .rfree = esmt_1_ooblayout_free,
++ };
++
+ static const struct spinand_info gigadevice_spinand_table[] = {
++ SPINAND_INFO("F50L1G41LB",
++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x01),
++ NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
++ NAND_ECCREQ(8, 512),
++ SPINAND_INFO_OP_VARIANTS(&dummy2_read_cache_variants,
++ &write_cache_variants,
++ &update_cache_variants),
++ 0,
++ SPINAND_ECCINFO(&esmt_1_ooblayout, NULL)),
+ SPINAND_INFO("GD5F1GQ4xA",
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xf1),
+ NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
+@@ -349,6 +405,87 @@ static const struct spinand_info gigadev
+ SPINAND_HAS_QE_BIT,
+ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
+ gd5fxgq5xexxg_ecc_get_status)),
++ SPINAND_INFO("GD5F2GQ5UExxG",
++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x52),
++ NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
++ NAND_ECCREQ(4, 512),
++ SPINAND_INFO_OP_VARIANTS(&dummy4_read_cache_variants,
++ &write_cache_variants,
++ &update_cache_variants),
++ SPINAND_HAS_QE_BIT,
++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
++ gd5fxgq5xexxg_ecc_get_status)),
++ SPINAND_INFO("GD5F4GQ6UExxG",
++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x55),
++ NAND_MEMORG(1, 2048, 128, 64, 4096, 80, 1, 1, 1),
++ NAND_ECCREQ(4, 512),
++ SPINAND_INFO_OP_VARIANTS(&dummy4_read_cache_variants,
++ &write_cache_variants,
++ &update_cache_variants),
++ SPINAND_HAS_QE_BIT,
++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
++ gd5fxgq5xexxg_ecc_get_status)),
++ SPINAND_INFO("GD5F1GM7UExxG",
++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x91),
++ NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
++ NAND_ECCREQ(8, 512),
++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
++ &write_cache_variants,
++ &update_cache_variants),
++ SPINAND_HAS_QE_BIT,
++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
++ gd5fxgq4uexxg_ecc_get_status)),
++ SPINAND_INFO("GD5F2GM7UExxG",
++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x92),
++ NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
++ NAND_ECCREQ(8, 512),
++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
++ &write_cache_variants,
++ &update_cache_variants),
++ SPINAND_HAS_QE_BIT,
++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
++ gd5fxgq4uexxg_ecc_get_status)),
++ SPINAND_INFO("GD5F4GM8UExxG",
++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x95),
++ NAND_MEMORG(1, 2048, 128, 64, 4096, 80, 1, 1, 1),
++ NAND_ECCREQ(8, 512),
++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
++ &write_cache_variants,
++ &update_cache_variants),
++ SPINAND_HAS_QE_BIT,
++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
++ gd5fxgq4uexxg_ecc_get_status)),
++ SPINAND_INFO("GD5F1GQ5UExxH",
++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x31),
++ NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
++ NAND_ECCREQ(4, 512),
++ SPINAND_INFO_OP_VARIANTS(&dummy2_read_cache_variants,
++ &write_cache_variants,
++ &update_cache_variants),
++ SPINAND_HAS_QE_BIT,
++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
++ gd5fxgq5xexxg_ecc_get_status)),
++ SPINAND_INFO("GD5F2GQ5UExxH",
++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x32),
++ NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1),
++ NAND_ECCREQ(4, 512),
++ SPINAND_INFO_OP_VARIANTS(&dummy4_read_cache_variants,
++ &write_cache_variants,
++ &update_cache_variants),
++ SPINAND_HAS_QE_BIT,
++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
++ gd5fxgq5xexxg_ecc_get_status)),
++ SPINAND_INFO("GD5F4GQ6UExxH",
++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x35),
++ NAND_MEMORG(1, 2048, 64, 64, 4096, 40, 1, 1, 1),
++ NAND_ECCREQ(4, 512),
++ SPINAND_INFO_OP_VARIANTS(&dummy4_read_cache_variants,
++ &write_cache_variants,
++ &update_cache_variants),
++ SPINAND_HAS_QE_BIT,
++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
++ gd5fxgq5xexxg_ecc_get_status)),
++
+ };
+
+ static const struct spinand_manufacturer_ops gigadevice_spinand_manuf_ops = {
+--- a/drivers/mtd/nand/spi/winbond.c
++++ b/drivers/mtd/nand/spi/winbond.c
+@@ -18,6 +18,23 @@
+
+ #define WINBOND_CFG_BUF_READ BIT(3)
+
++#define W25N02_N04KV_STATUS_ECC_MASK (3 << 4)
++#define W25N02_N04KV_STATUS_ECC_NO_BITFLIPS (0 << 4)
++#define W25N02_N04KV_STATUS_ECC_1_4_BITFLIPS (1 << 4)
++#define W25N02_N04KV_STATUS_ECC_5_8_BITFLIPS (3 << 4)
++#define W25N02_N04KV_STATUS_ECC_UNCOR_ERROR (2 << 4)
++
++#define W25N01_M02GV_STATUS_ECC_MASK (3 << 4)
++#define W25N01_M02GV_STATUS_ECC_NO_BITFLIPS (0 << 4)
++#define W25N01_M02GV_STATUS_ECC_1_BITFLIPS (1 << 4)
++#define W25N01_M02GV_STATUS_ECC_UNCOR_ERROR (2 << 4)
++
++#define W25N01KV_STATUS_ECC_MASK (3 << 4)
++#define W25N01KV_STATUS_ECC_NO_BITFLIPS (0 << 4)
++#define W25N01KV_STATUS_ECC_1_3_BITFLIPS (1 << 4)
++#define W25N01KV_STATUS_ECC_4_BITFLIPS (3 << 4)
++#define W25N01KV_STATUS_ECC_UNCOR_ERROR (2 << 4)
++
+ static SPINAND_OP_VARIANTS(read_cache_variants,
+ SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0),
+ SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
+@@ -34,6 +51,35 @@ static SPINAND_OP_VARIANTS(update_cache_
+ SPINAND_PROG_LOAD_X4(false, 0, NULL, 0),
+ SPINAND_PROG_LOAD(false, 0, NULL, 0));
+
++static int w25n02kv_n04kv_ooblayout_ecc(struct mtd_info *mtd, int section,
++ struct mtd_oob_region *region)
++{
++ if (section > 3)
++ return -ERANGE;
++
++ region->offset = (16 * section) + 64;
++ region->length = 16;
++
++ return 0;
++}
++
++static int w25n02kv_n04kv_ooblayout_free(struct mtd_info *mtd, int section,
++ struct mtd_oob_region *region)
++{
++ if (section > 3)
++ return -ERANGE;
++
++ region->offset = (16 * section) + 2;
++ region->length = 14;
++
++ return 0;
++}
++
++static const struct mtd_ooblayout_ops w25n02kv_n04kv_ooblayout = {
++ .ecc = w25n02kv_n04kv_ooblayout_ecc,
++ .rfree = w25n02kv_n04kv_ooblayout_free,
++};
++
+ static int w25m02gv_ooblayout_ecc(struct mtd_info *mtd, int section,
+ struct mtd_oob_region *region)
+ {
+@@ -106,6 +152,58 @@ static const struct mtd_ooblayout_ops w2
+ .rfree = w25n02kv_ooblayout_free,
+ };
+
++static int w25n01kv_ecc_get_status(struct spinand_device *spinand,
++ u8 status)
++{
++ switch (status & W25N01KV_STATUS_ECC_MASK) {
++ case W25N01KV_STATUS_ECC_NO_BITFLIPS:
++ return 0;
++
++ case W25N01KV_STATUS_ECC_1_3_BITFLIPS:
++ return 3;
++
++ case W25N01KV_STATUS_ECC_4_BITFLIPS:
++ return 4;
++
++ case W25N01KV_STATUS_ECC_UNCOR_ERROR:
++ return -EBADMSG;
++
++ default:
++ break;
++ }
++
++ return -EINVAL;
++}
++
++static int w25n02kv_n04kv_ecc_get_status(struct spinand_device *spinand,
++ u8 status)
++{
++ switch (status & W25N02_N04KV_STATUS_ECC_MASK) {
++ case W25N02_N04KV_STATUS_ECC_NO_BITFLIPS:
++ return 0;
++
++ case W25N02_N04KV_STATUS_ECC_1_4_BITFLIPS:
++ return 3;
++
++ case W25N02_N04KV_STATUS_ECC_5_8_BITFLIPS:
++ return 4;
++
++ /* W25N02_N04KV_use internal 8bit ECC algorithm.
++ * But the ECC strength is 4 bit requried.
++ * Return 3 if the bit bit flip count less than 5.
++ * Return 4 if the bit bit flip count more than 5 to 8.
++ */
++
++ case W25N02_N04KV_STATUS_ECC_UNCOR_ERROR:
++ return -EBADMSG;
++
++ default:
++ break;
++ }
++
++ return -EINVAL;
++}
++
+ static int w25n02kv_ecc_get_status(struct spinand_device *spinand,
+ u8 status)
+ {
+@@ -163,6 +261,15 @@ static const struct spinand_info winbond
+ &update_cache_variants),
+ 0,
+ SPINAND_ECCINFO(&w25m02gv_ooblayout, NULL)),
++ SPINAND_INFO("W25N01KV",
++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xae, 0x21),
++ NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
++ NAND_ECCREQ(4, 512),
++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
++ &write_cache_variants,
++ &update_cache_variants),
++ 0,
++ SPINAND_ECCINFO(&w25n02kv_n04kv_ooblayout, w25n01kv_ecc_get_status)),
+ SPINAND_INFO("W25N02KV",
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xaa, 0x22),
+ NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
+@@ -172,6 +279,16 @@ static const struct spinand_info winbond
+ &update_cache_variants),
+ 0,
+ SPINAND_ECCINFO(&w25n02kv_ooblayout, w25n02kv_ecc_get_status)),
++ SPINAND_INFO("W25N04KV",
++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xaa, 0x23),
++ NAND_MEMORG(1, 2048, 128, 64, 4096, 80, 2, 1, 1),
++ NAND_ECCREQ(4, 512),
++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
++ &write_cache_variants,
++ &update_cache_variants),
++ 0,
++ SPINAND_ECCINFO(&w25n02kv_n04kv_ooblayout,
++ w25n02kv_n04kv_ecc_get_status)),
+ };
+
+ static int winbond_spinand_init(struct spinand_device *spinand)
+--- a/include/linux/mtd/spinand.h
++++ b/include/linux/mtd/spinand.h
+@@ -245,6 +245,7 @@ struct spinand_manufacturer {
+ };
+
+ /* SPI NAND manufacturers */
++extern const struct spinand_manufacturer etron_spinand_manufacturer;
+ extern const struct spinand_manufacturer gigadevice_spinand_manufacturer;
+ extern const struct spinand_manufacturer macronix_spinand_manufacturer;
+ extern const struct spinand_manufacturer micron_spinand_manufacturer;
diff --git a/package/boot/uboot-mediatek/patches/100-23-mmc-mtk-sd-add-support-to-display-verbose-error-log.patch b/package/boot/uboot-mediatek/patches/100-23-mmc-mtk-sd-add-support-to-display-verbose-error-log.patch
new file mode 100644
index 00000000000..5c90e24ebf5
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/100-23-mmc-mtk-sd-add-support-to-display-verbose-error-log.patch
@@ -0,0 +1,78 @@
+From 793bed29e78cc54d989333d756fef51efaca4e56 Mon Sep 17 00:00:00 2001
+From: Weijie Gao <weijie.gao@mediatek.com>
+Date: Tue, 26 Jul 2022 09:29:18 +0800
+Subject: [PATCH 58/71] mmc: mtk-sd: add support to display verbose error log
+
+Add an option to enable debug log, and also display verbose error log for
+both command and data.
+
+Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+---
+ drivers/mmc/Kconfig | 8 ++++++++
+ drivers/mmc/Makefile | 4 ++++
+ drivers/mmc/mtk-sd.c | 24 +++++++++++++++---------
+ 3 files changed, 27 insertions(+), 9 deletions(-)
+
+--- a/drivers/mmc/Kconfig
++++ b/drivers/mmc/Kconfig
+@@ -815,6 +815,14 @@ config MMC_MTK
+ This is needed if support for any SD/SDIO/MMC devices is required.
+ If unsure, say N.
+
++config MMC_MTK_DEBUG
++ bool "Display verbose error log"
++ default n
++ depends on MMC_MTK
++ help
++ Enable this option to allow verbose error log being displayed for
++ debugging.
++
+ endif
+
+ config FSL_SDHC_V2_3
+--- a/drivers/mmc/Makefile
++++ b/drivers/mmc/Makefile
+@@ -82,3 +82,7 @@ obj-$(CONFIG_RENESAS_SDHI) += tmio-comm
+ obj-$(CONFIG_MMC_BCM2835) += bcm2835_sdhost.o
+ obj-$(CONFIG_MMC_MTK) += mtk-sd.o
+ obj-$(CONFIG_MMC_SDHCI_F_SDH30) += f_sdh30.o
++
++ifdef CONFIG_MMC_MTK_DEBUG
++CFLAGS_mtk-sd.o += -DDEBUG
++endif
+--- a/drivers/mmc/mtk-sd.c
++++ b/drivers/mmc/mtk-sd.c
+@@ -779,18 +779,24 @@ static int msdc_ops_send_cmd(struct udev
+ if (cmd_ret &&
+ !(cmd_ret == -EIO &&
+ (cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK ||
+- cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK_HS200)))
++ cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK_HS200))) {
++ dev_dbg(dev, "MSDC start command failure with %d, cmd=%d, arg=0x%x\n",
++ cmd_ret, cmd->cmdidx, cmd->cmdarg);
+ return cmd_ret;
+-
+- if (data) {
+- data_ret = msdc_start_data(host, data);
+- if (cmd_ret)
+- return cmd_ret;
+- else
+- return data_ret;
+ }
+
+- return 0;
++ if (!data)
++ return cmd_ret;
++
++ data_ret = msdc_start_data(host, data);
++ if (cmd_ret)
++ return cmd_ret;
++
++ if (data_ret)
++ dev_dbg(dev, "MSDC start data failure with %d, cmd=%d, arg=0x%x\n",
++ data_ret, cmd->cmdidx, cmd->cmdarg);
++
++ return data_ret;
+ }
+
+ static void msdc_set_timeout(struct msdc_host *host, u32 ns, u32 clks)
diff --git a/package/boot/uboot-mediatek/patches/100-24-cmd-ubi-make-volume-find-create-remove-APIs-public.patch b/package/boot/uboot-mediatek/patches/100-24-cmd-ubi-make-volume-find-create-remove-APIs-public.patch
new file mode 100644
index 00000000000..ed74eab1e4b
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/100-24-cmd-ubi-make-volume-find-create-remove-APIs-public.patch
@@ -0,0 +1,58 @@
+From dd66fc817f7ab7a4fcab9836a9251a8f64f329df Mon Sep 17 00:00:00 2001
+From: Weijie Gao <weijie.gao@mediatek.com>
+Date: Mon, 25 Jul 2022 16:58:36 +0800
+Subject: [PATCH 59/71] cmd: ubi: make volume find/create/remove APIs public
+
+Export ubi_create_vol/ubi_find_volume/ubi_remove_vol to public so that they
+can be used by other programs.
+
+Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+---
+ cmd/ubi.c | 8 ++++----
+ include/ubi_uboot.h | 4 ++++
+ 2 files changed, 8 insertions(+), 4 deletions(-)
+
+--- a/cmd/ubi.c
++++ b/cmd/ubi.c
+@@ -213,8 +213,8 @@ bad:
+ return err;
+ }
+
+-static int ubi_create_vol(char *volume, int64_t size, int dynamic, int vol_id,
+- bool skipcheck)
++int ubi_create_vol(char *volume, int64_t size, int dynamic, int vol_id,
++ bool skipcheck)
+ {
+ struct ubi_mkvol_req req;
+ int err;
+@@ -247,7 +247,7 @@ static int ubi_create_vol(char *volume,
+ return ubi_create_volume(ubi, &req);
+ }
+
+-static struct ubi_volume *ubi_find_volume(char *volume)
++struct ubi_volume *ubi_find_volume(char *volume)
+ {
+ struct ubi_volume *vol = NULL;
+ int i;
+@@ -262,7 +262,7 @@ static struct ubi_volume *ubi_find_volum
+ return NULL;
+ }
+
+-static int ubi_remove_vol(char *volume)
++int ubi_remove_vol(char *volume)
+ {
+ int err, reserved_pebs, i;
+ struct ubi_volume *vol;
+--- a/include/ubi_uboot.h
++++ b/include/ubi_uboot.h
+@@ -51,6 +51,10 @@ extern void ubi_exit(void);
+ extern int ubi_part(char *part_name, const char *vid_header_offset);
+ extern int ubi_volume_write(char *volume, void *buf, size_t size);
+ extern int ubi_volume_read(char *volume, char *buf, size_t size);
++extern int ubi_create_vol(char *volume, int64_t size, int dynamic, int vol_id,
++ bool skipcheck);
++extern struct ubi_volume *ubi_find_volume(char *volume);
++extern int ubi_remove_vol(char *volume);
+
+ extern struct ubi_device *ubi_devices[];
+ int cmd_ubifs_mount(char *vol_name);
diff --git a/package/boot/uboot-mediatek/patches/100-25-cmd-ubi-allow-creating-volume-with-all-free-spaces.patch b/package/boot/uboot-mediatek/patches/100-25-cmd-ubi-allow-creating-volume-with-all-free-spaces.patch
new file mode 100644
index 00000000000..d023b004f76
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/100-25-cmd-ubi-allow-creating-volume-with-all-free-spaces.patch
@@ -0,0 +1,27 @@
+From f6a4130959af1e6d13d616203e42ed3c894666ad Mon Sep 17 00:00:00 2001
+From: Weijie Gao <weijie.gao@mediatek.com>
+Date: Mon, 25 Jul 2022 17:00:00 +0800
+Subject: [PATCH 60/71] cmd: ubi: allow creating volume with all free spaces
+
+Allow creating volume with all free spaces by giving a negative size value.
+
+Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+---
+ cmd/ubi.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+--- a/cmd/ubi.c
++++ b/cmd/ubi.c
+@@ -226,7 +226,11 @@ int ubi_create_vol(char *volume, int64_t
+
+ req.vol_id = vol_id;
+ req.alignment = 1;
+- req.bytes = size;
++
++ if (size < 0)
++ req.bytes = ubi->avail_pebs * ubi->leb_size;
++ else
++ req.bytes = size;
+
+ strcpy(req.name, volume);
+ req.name_len = strlen(volume);
diff --git a/package/boot/uboot-mediatek/patches/100-26-env-ubi-add-support-to-create-environment-volume-if-.patch b/package/boot/uboot-mediatek/patches/100-26-env-ubi-add-support-to-create-environment-volume-if-.patch
new file mode 100644
index 00000000000..fb8d15ddf9b
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/100-26-env-ubi-add-support-to-create-environment-volume-if-.patch
@@ -0,0 +1,72 @@
+From fc0c70a7c6a088072d0c77e5a59d5e9b7754c6db Mon Sep 17 00:00:00 2001
+From: Weijie Gao <weijie.gao@mediatek.com>
+Date: Mon, 25 Jul 2022 17:01:20 +0800
+Subject: [PATCH 61/71] env: ubi: add support to create environment volume if
+ it does not exist
+
+Add an option to allow environment volume being auto created if not exist.
+
+Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+---
+ env/Kconfig | 6 ++++++
+ env/ubi.c | 20 ++++++++++++++++++++
+ 2 files changed, 26 insertions(+)
+
+--- a/env/Kconfig
++++ b/env/Kconfig
+@@ -689,6 +689,12 @@ config ENV_UBI_VOLUME_REDUND
+ help
+ Name of the redundant volume that you want to store the environment in.
+
++config ENV_UBI_VOLUME_CREATE
++ bool "Create UBI volume if not exist"
++ depends on ENV_IS_IN_UBI
++ help
++ Create the UBI volume if it does not exist.
++
+ config ENV_UBI_VID_OFFSET
+ int "ubi environment VID offset"
+ depends on ENV_IS_IN_UBI
+--- a/env/ubi.c
++++ b/env/ubi.c
+@@ -106,6 +106,18 @@ static int env_ubi_save(void)
+ #endif /* CONFIG_SYS_REDUNDAND_ENVIRONMENT */
+ #endif /* CONFIG_CMD_SAVEENV */
+
++int __weak env_ubi_volume_create(const char *volume)
++{
++ struct ubi_volume *vol;
++
++ vol = ubi_find_volume((char *)volume);
++ if (vol)
++ return 0;
++
++ return ubi_create_vol((char *)volume, CONFIG_ENV_SIZE, true,
++ UBI_VOL_NUM_AUTO, false);
++}
++
+ #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
+ static int env_ubi_load(void)
+ {
+@@ -135,6 +147,11 @@ static int env_ubi_load(void)
+ return -EIO;
+ }
+
++ if (IS_ENABLED(CONFIG_ENV_UBI_VOLUME_CREATE)) {
++ env_ubi_volume_create(CONFIG_ENV_UBI_VOLUME);
++ env_ubi_volume_create(CONFIG_ENV_UBI_VOLUME_REDUND);
++ }
++
+ read1_fail = ubi_volume_read(CONFIG_ENV_UBI_VOLUME, (void *)tmp_env1,
+ CONFIG_ENV_SIZE);
+ if (read1_fail)
+@@ -172,6 +189,9 @@ static int env_ubi_load(void)
+ return -EIO;
+ }
+
++ if (IS_ENABLED(CONFIG_ENV_UBI_VOLUME_CREATE))
++ env_ubi_volume_create(CONFIG_ENV_UBI_VOLUME);
++
+ if (ubi_volume_read(CONFIG_ENV_UBI_VOLUME, buf, CONFIG_ENV_SIZE)) {
+ printf("\n** Unable to read env from %s:%s **\n",
+ CONFIG_ENV_UBI_PART, CONFIG_ENV_UBI_VOLUME);
diff --git a/package/boot/uboot-mediatek/patches/100-27-mtd-ubi-add-support-for-UBI-end-of-filesystem-marker.patch b/package/boot/uboot-mediatek/patches/100-27-mtd-ubi-add-support-for-UBI-end-of-filesystem-marker.patch
new file mode 100644
index 00000000000..9c83e6cc25d
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/100-27-mtd-ubi-add-support-for-UBI-end-of-filesystem-marker.patch
@@ -0,0 +1,66 @@
+From 189a2fe96931ef3ea0e187c8e9bfa589c2a0ae10 Mon Sep 17 00:00:00 2001
+From: Weijie Gao <weijie.gao@mediatek.com>
+Date: Mon, 25 Jul 2022 17:24:56 +0800
+Subject: [PATCH 62/71] mtd: ubi: add support for UBI end-of-filesystem marker
+ used by OpenWrt
+
+Add support for UBI end-of-filesystem marker used by OpenWrt to allow
+attaching a new UBI mtd partition just upgraded.
+
+Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+---
+ drivers/mtd/ubi/attach.c | 25 ++++++++++++++++++++++---
+ drivers/mtd/ubi/ubi.h | 1 +
+ 2 files changed, 23 insertions(+), 3 deletions(-)
+
+--- a/drivers/mtd/ubi/attach.c
++++ b/drivers/mtd/ubi/attach.c
+@@ -803,6 +803,13 @@ out_unlock:
+ return err;
+ }
+
++static bool ec_hdr_has_eof(struct ubi_ec_hdr *ech)
++{
++ return ech->padding1[0] == 'E' &&
++ ech->padding1[1] == 'O' &&
++ ech->padding1[2] == 'F';
++}
++
+ /**
+ * scan_peb - scan and process UBI headers of a PEB.
+ * @ubi: UBI device description object
+@@ -833,9 +840,21 @@ static int scan_peb(struct ubi_device *u
+ return 0;
+ }
+
+- err = ubi_io_read_ec_hdr(ubi, pnum, ech, 0);
+- if (err < 0)
+- return err;
++ if (!ai->eof_found) {
++ err = ubi_io_read_ec_hdr(ubi, pnum, ech, 0);
++ if (err < 0)
++ return err;
++
++ if (ec_hdr_has_eof(ech)) {
++ pr_notice("UBI: EOF marker found, PEBs from %d will be erased\n",
++ pnum);
++ ai->eof_found = true;
++ }
++ }
++
++ if (ai->eof_found)
++ err = UBI_IO_FF_BITFLIPS;
++
+ switch (err) {
+ case 0:
+ break;
+--- a/drivers/mtd/ubi/ubi.h
++++ b/drivers/mtd/ubi/ubi.h
+@@ -746,6 +746,7 @@ struct ubi_attach_info {
+ int mean_ec;
+ uint64_t ec_sum;
+ int ec_count;
++ bool eof_found;
+ struct kmem_cache *aeb_slab_cache;
+ };
+
diff --git a/package/boot/uboot-mediatek/patches/100-29-board-mediatek-wire-up-NMBM-support.patch b/package/boot/uboot-mediatek/patches/100-29-board-mediatek-wire-up-NMBM-support.patch
new file mode 100644
index 00000000000..f22449ae76f
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/100-29-board-mediatek-wire-up-NMBM-support.patch
@@ -0,0 +1,238 @@
+From 6792b57b3ba61ca6d69ea4a13a58bed65fc5da87 Mon Sep 17 00:00:00 2001
+From: Daniel Golle <daniel@makrotopia.org>
+Date: Sun, 7 Aug 2022 04:04:46 +0200
+Subject: [PATCH] board: mediatek: wire-up NMBM support
+
+---
+ board/mediatek/mt7622/mt7622_rfb.c | 38 +++++++++++++++++++++
+ board/mediatek/mt7629/mt7629_rfb.c | 38 +++++++++++++++++++++
+ board/mediatek/mt7981/mt7981_rfb.c | 52 ++++++++++++++++++++++++++++
+ board/mediatek/mt7986/mt7986_rfb.c | 54 ++++++++++++++++++++++++++++++
+ 4 files changed, 182 insertions(+)
+
+--- a/board/mediatek/mt7622/mt7622_rfb.c
++++ b/board/mediatek/mt7622/mt7622_rfb.c
+@@ -10,6 +10,11 @@
+ #include <init.h>
+ #include <asm/global_data.h>
+
++#include <mtd.h>
++#include <linux/mtd/mtd.h>
++#include <nmbm/nmbm.h>
++#include <nmbm/nmbm-mtd.h>
++
+ DECLARE_GLOBAL_DATA_PTR;
+
+ int board_init(void)
+@@ -23,3 +28,36 @@ int board_late_init(void)
+ env_relocate();
+ return 0;
+ }
++
++int board_nmbm_init(void)
++{
++#ifdef CONFIG_ENABLE_NAND_NMBM
++ struct mtd_info *lower, *upper;
++ int ret;
++
++ printf("\n");
++ printf("Initializing NMBM ...\n");
++
++ mtd_probe_devices();
++
++ lower = get_mtd_device_nm("spi-nand0");
++ if (IS_ERR(lower) || !lower) {
++ printf("Lower MTD device 'spi-nand0' not found\n");
++ return 0;
++ }
++
++ ret = nmbm_attach_mtd(lower,
++ NMBM_F_CREATE | NMBM_F_EMPTY_PAGE_ECC_OK,
++ CONFIG_NMBM_MAX_RATIO,
++ CONFIG_NMBM_MAX_BLOCKS, &upper);
++
++ printf("\n");
++
++ if (ret)
++ return 0;
++
++ add_mtd_device(upper);
++#endif
++
++ return 0;
++}
+--- a/board/mediatek/mt7629/mt7629_rfb.c
++++ b/board/mediatek/mt7629/mt7629_rfb.c
+@@ -6,6 +6,11 @@
+ #include <common.h>
+ #include <asm/global_data.h>
+
++#include <mtd.h>
++#include <linux/mtd/mtd.h>
++#include <nmbm/nmbm.h>
++#include <nmbm/nmbm-mtd.h>
++
+ DECLARE_GLOBAL_DATA_PTR;
+
+ int board_init(void)
+@@ -20,3 +25,36 @@ uint32_t spl_nand_get_uboot_raw_page(voi
+ {
+ return CONFIG_SPL_PAD_TO;
+ }
++
++int board_nmbm_init(void)
++{
++#ifdef CONFIG_ENABLE_NAND_NMBM
++ struct mtd_info *lower, *upper;
++ int ret;
++
++ printf("\n");
++ printf("Initializing NMBM ...\n");
++
++ mtd_probe_devices();
++
++ lower = get_mtd_device_nm("spi-nand0");
++ if (IS_ERR(lower) || !lower) {
++ printf("Lower MTD device 'spi-nand0' not found\n");
++ return 0;
++ }
++
++ ret = nmbm_attach_mtd(lower,
++ NMBM_F_CREATE | NMBM_F_EMPTY_PAGE_ECC_OK,
++ CONFIG_NMBM_MAX_RATIO,
++ CONFIG_NMBM_MAX_BLOCKS, &upper);
++
++ printf("\n");
++
++ if (ret)
++ return 0;
++
++ add_mtd_device(upper);
++#endif
++
++ return 0;
++}
+--- a/board/mediatek/mt7981/mt7981_rfb.c
++++ b/board/mediatek/mt7981/mt7981_rfb.c
+@@ -4,7 +4,58 @@
+ * Author: Sam Shih <sam.shih@mediatek.com>
+ */
+
++#include <common.h>
++#include <config.h>
++#include <env.h>
++#include <init.h>
++#include <asm/global_data.h>
++
++#include <mtd.h>
++#include <linux/mtd/mtd.h>
++#include <nmbm/nmbm.h>
++#include <nmbm/nmbm-mtd.h>
++
++DECLARE_GLOBAL_DATA_PTR;
++
+ int board_init(void)
+ {
+ return 0;
+ }
++
++int board_late_init(void)
++{
++ gd->env_valid = 1; //to load environment variable from persistent store
++ env_relocate();
++ return 0;
++}
++
++int board_nmbm_init(void)
++{
++#ifdef CONFIG_ENABLE_NAND_NMBM
++ struct mtd_info *lower, *upper;
++ int ret;
++
++ printf("\n");
++ printf("Initializing NMBM ...\n");
++
++ mtd_probe_devices();
++
++ lower = get_mtd_device_nm("spi-nand0");
++ if (IS_ERR(lower) || !lower) {
++ printf("Lower MTD device 'spi-nand0' not found\n");
++ return 0;
++ }
++
++ ret = nmbm_attach_mtd(lower, NMBM_F_CREATE, CONFIG_NMBM_MAX_RATIO,
++ CONFIG_NMBM_MAX_BLOCKS, &upper);
++
++ printf("\n");
++
++ if (ret)
++ return 0;
++
++ add_mtd_device(upper);
++#endif
++
++ return 0;
++}
+--- a/board/mediatek/mt7986/mt7986_rfb.c
++++ b/board/mediatek/mt7986/mt7986_rfb.c
+@@ -4,7 +4,60 @@
+ * Author: Sam Shih <sam.shih@mediatek.com>
+ */
+
++#include <common.h>
++#include <config.h>
++#include <env.h>
++#include <init.h>
++#include <asm/global_data.h>
++
++#include <mtd.h>
++#include <linux/mtd/mtd.h>
++#include <nmbm/nmbm.h>
++#include <nmbm/nmbm-mtd.h>
++
++DECLARE_GLOBAL_DATA_PTR;
++
+ int board_init(void)
+ {
+ return 0;
+ }
++
++int board_late_init(void)
++{
++ gd->env_valid = 1; //to load environment variable from persistent store
++ env_relocate();
++ return 0;
++}
++
++int board_nmbm_init(void)
++{
++#ifdef CONFIG_ENABLE_NAND_NMBM
++ struct mtd_info *lower, *upper;
++ int ret;
++
++ printf("\n");
++ printf("Initializing NMBM ...\n");
++
++ mtd_probe_devices();
++
++ lower = get_mtd_device_nm("spi-nand0");
++ if (IS_ERR(lower) || !lower) {
++ printf("Lower MTD device 'spi-nand0' not found\n");
++ return 0;
++ }
++
++ ret = nmbm_attach_mtd(lower,
++ NMBM_F_CREATE | NMBM_F_EMPTY_PAGE_ECC_OK,
++ CONFIG_NMBM_MAX_RATIO,
++ CONFIG_NMBM_MAX_BLOCKS, &upper);
++
++ printf("\n");
++
++ if (ret)
++ return 0;
++
++ add_mtd_device(upper);
++#endif
++
++ return 0;
++}
diff --git a/package/boot/uboot-mediatek/patches/100-scripts-remove-dependency-on-swig.patch b/package/boot/uboot-mediatek/patches/100-scripts-remove-dependency-on-swig.patch
deleted file mode 100644
index 05055893854..00000000000
--- a/package/boot/uboot-mediatek/patches/100-scripts-remove-dependency-on-swig.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From b137ca16b54c67d76714ea5a0138741959b0dc29 Mon Sep 17 00:00:00 2001
-From: David Bauer <mail@david-bauer.net>
-Date: Mon, 13 Jul 2020 23:37:37 +0200
-Subject: [PATCH] scripts: remove dependency on swig
-
-Don't build the libfdt tool, as it has a dependency on swig (which
-OpenWrt does not ship).
-
-This requires more hacks, as of-platdata generation does not work
-without it.
-
-Signed-off-by: David Bauer <mail@david-bauer.net>
----
- scripts/dtc/Makefile | 2 --
- 1 file changed, 2 deletions(-)
-
---- a/scripts/dtc/Makefile
-+++ b/scripts/dtc/Makefile
-@@ -18,5 +18,3 @@ HOSTCFLAGS_dtc-parser.tab.o := -I$(src)
- # dependencies on generated files need to be listed explicitly
- $(obj)/dtc-lexer.lex.o: $(obj)/dtc-parser.tab.h
-
--# Added for U-Boot
--subdir-$(CONFIG_PYLIBFDT) += pylibfdt
diff --git a/package/boot/uboot-mediatek/patches/103-mt7988-enable-pstore.patch b/package/boot/uboot-mediatek/patches/103-mt7988-enable-pstore.patch
new file mode 100644
index 00000000000..747aa2e5dac
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/103-mt7988-enable-pstore.patch
@@ -0,0 +1,33 @@
+--- a/arch/arm/dts/mt7988.dtsi
++++ b/arch/arm/dts/mt7988.dtsi
+@@ -62,6 +62,30 @@
+ #clock-cells = <0>;
+ };
+
++ psci {
++ compatible = "arm,psci-0.2";
++ method = "smc";
++ };
++
++ reserved-memory {
++ #address-cells = <2>;
++ #size-cells = <2>;
++ ranges;
++
++ /* 64 KiB reserved for ramoops/pstore */
++ ramoops@42ff0000 {
++ compatible = "ramoops";
++ reg = <0 0x42ff0000 0 0x10000>;
++ record-size = <0x1000>;
++ };
++
++ /* 320 KiB reserved for ARM Trusted Firmware (BL31+BL32) */
++ secmon_reserved: secmon@43000000 {
++ reg = <0 0x43000000 0 0x50000>;
++ no-map;
++ };
++ };
++
+ hwver: hwver {
+ compatible = "mediatek,hwver", "syscon";
+ reg = <0 0x8000000 0 0x1000>;
diff --git a/package/boot/uboot-mediatek/patches/105-configs-add-usefull-stuff-to-mt7988-rfb.patch b/package/boot/uboot-mediatek/patches/105-configs-add-usefull-stuff-to-mt7988-rfb.patch
new file mode 100644
index 00000000000..da1d985688b
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/105-configs-add-usefull-stuff-to-mt7988-rfb.patch
@@ -0,0 +1,314 @@
+--- a/configs/mt7988_sd_rfb_defconfig
++++ b/configs/mt7988_sd_rfb_defconfig
+@@ -11,6 +11,24 @@ CONFIG_DEBUG_UART_BASE=0x11000000
+ CONFIG_DEBUG_UART_CLOCK=40000000
+ CONFIG_SYS_LOAD_ADDR=0x46000000
+ CONFIG_DEBUG_UART=y
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_SPI_BOOT=y
++CONFIG_SD_BOOT=y
++CONFIG_NAND_BOOT=y
++CONFIG_BOOTSTD_DEFAULTS=y
++CONFIG_BOOTSTD_FULL=y
+ # CONFIG_AUTOBOOT is not set
+ CONFIG_DEFAULT_FDT_FILE="mt7988-sd-rfb"
+ CONFIG_LOGLEVEL=7
+@@ -22,15 +40,118 @@ CONFIG_SYS_PBSIZE=1049
+ # CONFIG_BOOTM_PLAN9 is not set
+ # CONFIG_BOOTM_RTEMS is not set
+ # CONFIG_BOOTM_VXWORKS is not set
+-# CONFIG_CMD_ELF is not set
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_ELF=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_EXT4=y
++CONFIG_CMD_FAT=y
++CONFIG_CMD_FDT=y
++CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_FS_UUID=y
+ CONFIG_CMD_CLK=y
+ CONFIG_CMD_DM=y
+ CONFIG_CMD_GPIO=y
++CONFIG_CMD_GPT=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++CONFIG_CMD_MMC=y
++CONFIG_CMD_MTD=y
++CONFIG_CMD_NAND=y
++CONFIG_CMD_NAND_TRIMFFS=y
++CONFIG_CMD_PCI=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
+ CONFIG_CMD_PWM=y
+ CONFIG_CMD_MMC=y
+ CONFIG_CMD_MTD=y
+ CONFIG_CMD_PING=y
++CONFIG_CMD_SF=y
+ CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_UBI=y
++CONFIG_CMD_UBI_RENAME=y
++CONFIG_CMD_UBIFS=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_PART=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_USB=y
++CONFIG_CMD_UUID=y
++CONFIG_DISPLAY_CPUINFO=y
++CONFIG_DM_MMC=y
++CONFIG_DM_MTD=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++CONFIG_DM_USB=y
++CONFIG_DM_PWM=y
++CONFIG_PWM_MTK=y
++CONFIG_HUSH_PARSER=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_VERSION_VARIABLE=y
++CONFIG_PARTITION_UUIDS=y
++CONFIG_NETCONSOLE=y
++CONFIG_DM_GPIO=y
++CONFIG_DM_SCSI=y
++CONFIG_PHY=y
++CONFIG_PHY_MTK_TPHY=y
++CONFIG_PCI=y
++CONFIG_MTD=y
++CONFIG_MTD_UBI_FASTMAP=y
++# CONFIG_MTD_RAW_NAND is not set
++CONFIG_DM_PCI=y
++CONFIG_PCIE_MEDIATEK=y
++CONFIG_PINCTRL_MT7988=y
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_RAM=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_SPI=y
++CONFIG_DM_SPI=y
++CONFIG_MTK_SPI_NAND=y
++CONFIG_MTK_SPI_NAND_MTD=y
++CONFIG_SYSRESET_WATCHDOG=y
++CONFIG_WDT_MTK=y
++CONFIG_LZO=y
++CONFIG_ZSTD=y
++CONFIG_HEXDUMP=y
++CONFIG_RANDOM_UUID=y
++CONFIG_REGEX=y
++CONFIG_USB=y
++CONFIG_USB_HOST=y
++CONFIG_USB_XHCI_HCD=y
++CONFIG_USB_XHCI_MTK=y
++CONFIG_USB_STORAGE=y
++CONFIG_OF_EMBED=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_IS_IN_MMC=y
++CONFIG_ENV_OFFSET=0x400000
++CONFIG_ENV_OFFSET_REDUND=0x440000
++CONFIG_ENV_SIZE=0x40000
++CONFIG_ENV_SIZE_REDUND=0x40000
+ CONFIG_DOS_PARTITION=y
+ CONFIG_EFI_PARTITION=y
+ CONFIG_PARTITION_TYPE_GUID=y
+@@ -46,6 +167,9 @@ CONFIG_PROT_TCP=y
+ CONFIG_REGMAP=y
+ CONFIG_SYSCON=y
+ CONFIG_CLK=y
++CONFIG_MMC=y
++CONFIG_MMC_DEFAULT_DEV=1
++CONFIG_MMC_SUPPORTS_TUNING=y
+ CONFIG_MMC_HS200_SUPPORT=y
+ CONFIG_MMC_MTK=y
+ CONFIG_MTD=y
+--- a/configs/mt7988_rfb_defconfig
++++ b/configs/mt7988_rfb_defconfig
+@@ -11,6 +11,24 @@ CONFIG_DEBUG_UART_BASE=0x11000000
+ CONFIG_DEBUG_UART_CLOCK=40000000
+ CONFIG_SYS_LOAD_ADDR=0x46000000
+ CONFIG_DEBUG_UART=y
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_SPI_BOOT=y
++CONFIG_SD_BOOT=y
++CONFIG_NAND_BOOT=y
++CONFIG_BOOTSTD_DEFAULTS=y
++CONFIG_BOOTSTD_FULL=y
+ # CONFIG_AUTOBOOT is not set
+ CONFIG_DEFAULT_FDT_FILE="mt7988-rfb"
+ CONFIG_LOGLEVEL=7
+@@ -22,15 +40,118 @@ CONFIG_SYS_PBSIZE=1049
+ # CONFIG_BOOTM_PLAN9 is not set
+ # CONFIG_BOOTM_RTEMS is not set
+ # CONFIG_BOOTM_VXWORKS is not set
+-# CONFIG_CMD_ELF is not set
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_ELF=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_EXT4=y
++CONFIG_CMD_FAT=y
++CONFIG_CMD_FDT=y
++CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_FS_UUID=y
+ CONFIG_CMD_CLK=y
+ CONFIG_CMD_DM=y
+ CONFIG_CMD_GPIO=y
++CONFIG_CMD_GPT=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++CONFIG_CMD_MMC=y
++CONFIG_CMD_MTD=y
++CONFIG_CMD_NAND=y
++CONFIG_CMD_NAND_TRIMFFS=y
++CONFIG_CMD_PCI=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
+ CONFIG_CMD_PWM=y
+ CONFIG_CMD_MMC=y
+ CONFIG_CMD_MTD=y
+ CONFIG_CMD_PING=y
++CONFIG_CMD_SF=y
+ CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_UBI=y
++CONFIG_CMD_UBI_RENAME=y
++CONFIG_CMD_UBIFS=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_PART=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_USB=y
++CONFIG_CMD_UUID=y
++CONFIG_DISPLAY_CPUINFO=y
++CONFIG_DM_MMC=y
++CONFIG_DM_MTD=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++CONFIG_DM_USB=y
++CONFIG_DM_PWM=y
++CONFIG_PWM_MTK=y
++CONFIG_HUSH_PARSER=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_VERSION_VARIABLE=y
++CONFIG_PARTITION_UUIDS=y
++CONFIG_NETCONSOLE=y
++CONFIG_DM_GPIO=y
++CONFIG_DM_SCSI=y
++CONFIG_PHY=y
++CONFIG_PHY_MTK_TPHY=y
++CONFIG_PCI=y
++CONFIG_MTD=y
++CONFIG_MTD_UBI_FASTMAP=y
++# CONFIG_MTD_RAW_NAND is not set
++CONFIG_DM_PCI=y
++CONFIG_PCIE_MEDIATEK=y
++CONFIG_PINCTRL_MT7988=y
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_RAM=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_SPI=y
++CONFIG_DM_SPI=y
++CONFIG_MTK_SPI_NAND=y
++CONFIG_MTK_SPI_NAND_MTD=y
++CONFIG_SYSRESET_WATCHDOG=y
++CONFIG_WDT_MTK=y
++CONFIG_LZO=y
++CONFIG_ZSTD=y
++CONFIG_HEXDUMP=y
++CONFIG_RANDOM_UUID=y
++CONFIG_REGEX=y
++CONFIG_USB=y
++CONFIG_USB_HOST=y
++CONFIG_USB_XHCI_HCD=y
++CONFIG_USB_XHCI_MTK=y
++CONFIG_USB_STORAGE=y
++CONFIG_OF_EMBED=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_IS_IN_MMC=y
++CONFIG_ENV_OFFSET=0x400000
++CONFIG_ENV_OFFSET_REDUND=0x440000
++CONFIG_ENV_SIZE=0x40000
++CONFIG_ENV_SIZE_REDUND=0x40000
+ CONFIG_DOS_PARTITION=y
+ CONFIG_EFI_PARTITION=y
+ CONFIG_PARTITION_TYPE_GUID=y
+@@ -46,6 +167,9 @@ CONFIG_PROT_TCP=y
+ CONFIG_REGMAP=y
+ CONFIG_SYSCON=y
+ CONFIG_CLK=y
++CONFIG_MMC=y
++CONFIG_MMC_DEFAULT_DEV=1
++CONFIG_MMC_SUPPORTS_TUNING=y
+ CONFIG_MMC_HS200_SUPPORT=y
+ CONFIG_MMC_MTK=y
+ CONFIG_MTD=y
diff --git a/package/boot/uboot-mediatek/patches/106-configs-sync-mt7981-rfb-storage.patch b/package/boot/uboot-mediatek/patches/106-configs-sync-mt7981-rfb-storage.patch
new file mode 100644
index 00000000000..3a3f8d0e1ed
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/106-configs-sync-mt7981-rfb-storage.patch
@@ -0,0 +1,129 @@
+--- a/configs/mt7981_rfb_defconfig
++++ b/configs/mt7981_rfb_defconfig
+@@ -30,6 +30,9 @@ CONFIG_CMD_MTD=y
+ CONFIG_CMD_SF_TEST=y
+ CONFIG_CMD_PING=y
+ CONFIG_CMD_SMC=y
++CONFIG_CMD_UBI=y
++CONFIG_CMD_UBI_RENAME=y
++CONFIG_ENV_OVERWRITE=y
+ CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
+ CONFIG_NET_RANDOM_ETHADDR=y
+ CONFIG_REGMAP=y
+--- a/configs/mt7981_snfi_nand_rfb_defconfig
++++ b/configs/mt7981_snfi_nand_rfb_defconfig
+@@ -1,11 +1,12 @@
+ CONFIG_ARM=y
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
+ CONFIG_POSITION_INDEPENDENT=y
+ CONFIG_ARCH_MEDIATEK=y
+ CONFIG_TEXT_BASE=0x41e00000
+ CONFIG_SYS_MALLOC_F_LEN=0x4000
+ CONFIG_NR_DRAM_BANKS=1
+-CONFIG_ENV_SIZE=0x20000
+ CONFIG_DEFAULT_DEVICE_TREE="mt7981-snfi-nand-rfb"
++CONFIG_SYS_PROMPT="MT7981> "
+ CONFIG_TARGET_MT7981=y
+ CONFIG_DEBUG_UART_BASE=0x11002000
+ CONFIG_DEBUG_UART_CLOCK=40000000
+@@ -15,7 +16,6 @@ CONFIG_DEBUG_UART=y
+ CONFIG_DEFAULT_FDT_FILE="mt7981-snfi-nand-rfb"
+ CONFIG_LOGLEVEL=7
+ CONFIG_LOG=y
+-CONFIG_SYS_PROMPT="MT7981> "
+ CONFIG_SYS_CBSIZE=512
+ CONFIG_SYS_PBSIZE=1049
+ # CONFIG_BOOTM_NETBSD is not set
+@@ -29,8 +29,6 @@ CONFIG_CMD_GPIO=y
+ CONFIG_CMD_MTD=y
+ CONFIG_CMD_PING=y
+ CONFIG_CMD_SMC=y
+-CONFIG_MTDIDS_DEFAULT="spi-nand0=spi-nand0"
+-CONFIG_MTDPARTS_DEFAULT="spi-nand0:1024k(bl2),512k(u-boot-env),2048k(factory),2048k(fip),65536k(ubi)"
+ CONFIG_CMD_UBI=y
+ CONFIG_CMD_UBI_RENAME=y
+ CONFIG_ENV_OVERWRITE=y
+@@ -45,7 +43,6 @@ CONFIG_DM_MTD=y
+ CONFIG_MTK_SPI_NAND=y
+ CONFIG_MTK_SPI_NAND_MTD=y
+ CONFIG_PHY_FIXED=y
+-CONFIG_DM_ETH=y
+ CONFIG_MEDIATEK_ETH=y
+ CONFIG_PINCTRL=y
+ CONFIG_PINCONF=y
+@@ -55,3 +52,4 @@ CONFIG_MTK_POWER_DOMAIN=y
+ CONFIG_DM_SERIAL=y
+ CONFIG_MTK_SERIAL=y
+ CONFIG_HEXDUMP=y
++CONFIG_LMB_MAX_REGIONS=64
+--- /dev/null
++++ b/configs/mt7981_nor_rfb_defconfig
+@@ -0,0 +1,68 @@
++CONFIG_ARM=y
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_NR_DRAM_BANKS=1
++CONFIG_DEFAULT_DEVICE_TREE="mt7981-rfb"
++CONFIG_SYS_PROMPT="MT7981> "
++CONFIG_TARGET_MT7981=y
++CONFIG_DEBUG_UART_BASE=0x11002000
++CONFIG_DEBUG_UART_CLOCK=40000000
++CONFIG_SYS_LOAD_ADDR=0x46000000
++CONFIG_DEBUG_UART=y
++# CONFIG_AUTOBOOT is not set
++CONFIG_DEFAULT_FDT_FILE="mt7981-rfb"
++CONFIG_LOGLEVEL=7
++CONFIG_LOG=y
++CONFIG_SYS_CBSIZE=512
++CONFIG_SYS_PBSIZE=1049
++# CONFIG_BOOTM_NETBSD is not set
++# CONFIG_BOOTM_PLAN9 is not set
++# CONFIG_BOOTM_RTEMS is not set
++# CONFIG_BOOTM_VXWORKS is not set
++# CONFIG_CMD_ELF is not set
++# CONFIG_CMD_UNLZ4 is not set
++# CONFIG_CMD_UNZIP is not set
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_MTD=y
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_SMC=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++# CONFIG_MMC is not set
++CONFIG_MTD=y
++CONFIG_DM_MTD=y
++CONFIG_MTD_SPI_NAND=y
++CONFIG_DM_SPI_FLASH=y
++CONFIG_SPI_FLASH_SFDP_SUPPORT=y
++CONFIG_SPI_FLASH_EON=y
++CONFIG_SPI_FLASH_GIGADEVICE=y
++CONFIG_SPI_FLASH_ISSI=y
++CONFIG_SPI_FLASH_MACRONIX=y
++CONFIG_SPI_FLASH_SPANSION=y
++CONFIG_SPI_FLASH_STMICRO=y
++CONFIG_SPI_FLASH_WINBOND=y
++CONFIG_SPI_FLASH_XMC=y
++CONFIG_SPI_FLASH_XTX=y
++CONFIG_SPI_FLASH_MTD=y
++CONFIG_PHY_FIXED=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7981=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_SPI=y
++CONFIG_DM_SPI=y
++CONFIG_MTK_SPIM=y
++CONFIG_HEXDUMP=y
++CONFIG_LMB_MAX_REGIONS=64
diff --git a/package/boot/uboot-mediatek/patches/107-configs-add-useful-options-to-mt7981-rfb.patch b/package/boot/uboot-mediatek/patches/107-configs-add-useful-options-to-mt7981-rfb.patch
new file mode 100644
index 00000000000..bd4c6b55f03
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/107-configs-add-useful-options-to-mt7981-rfb.patch
@@ -0,0 +1,474 @@
+--- a/configs/mt7981_emmc_rfb_defconfig
++++ b/configs/mt7981_emmc_rfb_defconfig
+@@ -13,7 +13,22 @@ CONFIG_DEBUG_UART_BASE=0x11002000
+ CONFIG_DEBUG_UART_CLOCK=40000000
+ CONFIG_SYS_LOAD_ADDR=0x46000000
+ CONFIG_DEBUG_UART=y
+-# CONFIG_AUTOBOOT is not set
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_MMC_BOOT=y
++CONFIG_BOOTSTD_DEFAULTS=y
++CONFIG_BOOTSTD_FULL=y
+ CONFIG_DEFAULT_FDT_FILE="mt7981-emmc-rfb"
+ CONFIG_LOGLEVEL=7
+ CONFIG_LOG=y
+@@ -24,9 +39,23 @@ CONFIG_SYS_PBSIZE=1049
+ # CONFIG_BOOTM_PLAN9 is not set
+ # CONFIG_BOOTM_RTEMS is not set
+ # CONFIG_BOOTM_VXWORKS is not set
+-# CONFIG_CMD_ELF is not set
+ # CONFIG_CMD_UNLZ4 is not set
+ # CONFIG_CMD_UNZIP is not set
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_ELF=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_FDT=y
++CONFIG_CMD_FS_UUID=y
+ CONFIG_CMD_GPIO=y
+ CONFIG_CMD_GPT=y
+ CONFIG_CMD_GPT_RENAME=y
+@@ -36,13 +65,35 @@ CONFIG_CMD_PART=y
+ CONFIG_CMD_READ=y
+ CONFIG_CMD_PING=y
+ CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_UUID=y
+ CONFIG_CMD_FAT=y
+ CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF=y
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
+ CONFIG_PARTITION_TYPE_GUID=y
+ CONFIG_ENV_OVERWRITE=y
+ CONFIG_ENV_IS_IN_MMC=y
+ CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
+ CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGEX=y
+ CONFIG_REGMAP=y
+ CONFIG_SYSCON=y
+ CONFIG_CLK=y
+--- a/configs/mt7981_rfb_defconfig
++++ b/configs/mt7981_rfb_defconfig
+@@ -11,7 +11,23 @@ CONFIG_DEBUG_UART_BASE=0x11002000
+ CONFIG_DEBUG_UART_CLOCK=40000000
+ CONFIG_SYS_LOAD_ADDR=0x46000000
+ CONFIG_DEBUG_UART=y
+-# CONFIG_AUTOBOOT is not set
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_SPI_BOOT=y
++CONFIG_NAND_BOOT=y
++CONFIG_BOOTSTD_DEFAULTS=y
++CONFIG_BOOTSTD_FULL=y
+ CONFIG_DEFAULT_FDT_FILE="mt7981-rfb"
+ CONFIG_LOGLEVEL=7
+ CONFIG_LOG=y
+@@ -22,23 +38,74 @@ CONFIG_SYS_PBSIZE=1049
+ # CONFIG_BOOTM_PLAN9 is not set
+ # CONFIG_BOOTM_RTEMS is not set
+ # CONFIG_BOOTM_VXWORKS is not set
+-# CONFIG_CMD_ELF is not set
+ # CONFIG_CMD_UNLZ4 is not set
+ # CONFIG_CMD_UNZIP is not set
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_ELF=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_FDT=y
++CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_FS_UUID=y
+ CONFIG_CMD_GPIO=y
+ CONFIG_CMD_MTD=y
+-CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++CONFIG_CMD_MTD=y
++CONFIG_CMD_NAND=y
++# CONFIG_MTD_RAW_NAND is not set
++CONFIG_CMD_NAND_TRIMFFS=y
++CONFIG_CMD_PCI=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
+ CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
++CONFIG_CMD_SF=y
++CONFIG_CMD_SF_TEST=y
+ CONFIG_CMD_SMC=y
+ CONFIG_CMD_UBI=y
+ CONFIG_CMD_UBI_RENAME=y
++CONFIG_CMD_UBIFS=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_UUID=y
++CONFIG_ENV_IS_IN_UBI=y
++CONFIG_ENV_UBI_PART="ubi"
++CONFIG_ENV_SIZE=0x1f000
++CONFIG_ENV_SIZE_REDUND=0x1f000
++CONFIG_ENV_UBI_VOLUME="ubootenv"
++CONFIG_ENV_UBI_VOLUME_REDUND="ubootenv2"
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
+ CONFIG_ENV_OVERWRITE=y
+ CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
+ CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGEX=y
+ CONFIG_REGMAP=y
+ CONFIG_SYSCON=y
+ CONFIG_CLK=y
+ # CONFIG_MMC is not set
++CONFIG_HUSH_PARSER=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
+ CONFIG_MTD=y
+ CONFIG_DM_MTD=y
+ CONFIG_MTD_SPI_NAND=y
+--- a/configs/mt7981_sd_rfb_defconfig
++++ b/configs/mt7981_sd_rfb_defconfig
+@@ -13,7 +13,22 @@ CONFIG_DEBUG_UART_BASE=0x11002000
+ CONFIG_DEBUG_UART_CLOCK=40000000
+ CONFIG_SYS_LOAD_ADDR=0x46000000
+ CONFIG_DEBUG_UART=y
+-# CONFIG_AUTOBOOT is not set
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_MMC_BOOT=y
++CONFIG_BOOTSTD_DEFAULTS=y
++CONFIG_BOOTSTD_FULL=y
+ CONFIG_DEFAULT_FDT_FILE="mt7981-sd-rfb"
+ CONFIG_LOGLEVEL=7
+ CONFIG_LOG=y
+@@ -24,9 +39,23 @@ CONFIG_SYS_PBSIZE=1049
+ # CONFIG_BOOTM_PLAN9 is not set
+ # CONFIG_BOOTM_RTEMS is not set
+ # CONFIG_BOOTM_VXWORKS is not set
+-# CONFIG_CMD_ELF is not set
+ # CONFIG_CMD_UNLZ4 is not set
+ # CONFIG_CMD_UNZIP is not set
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_ELF=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_FDT=y
++CONFIG_CMD_FS_UUID=y
+ CONFIG_CMD_GPIO=y
+ CONFIG_CMD_GPT=y
+ CONFIG_CMD_GPT_RENAME=y
+@@ -36,13 +65,35 @@ CONFIG_CMD_PART=y
+ CONFIG_CMD_READ=y
+ CONFIG_CMD_PING=y
+ CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_UUID=y
+ CONFIG_CMD_FAT=y
+ CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF=y
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
+ CONFIG_PARTITION_TYPE_GUID=y
+ CONFIG_ENV_OVERWRITE=y
+ CONFIG_ENV_IS_IN_MMC=y
+ CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
+ CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGEX=y
+ CONFIG_REGMAP=y
+ CONFIG_SYSCON=y
+ CONFIG_CLK=y
+--- a/configs/mt7981_snfi_nand_rfb_defconfig
++++ b/configs/mt7981_snfi_nand_rfb_defconfig
+@@ -12,7 +12,23 @@ CONFIG_DEBUG_UART_BASE=0x11002000
+ CONFIG_DEBUG_UART_CLOCK=40000000
+ CONFIG_SYS_LOAD_ADDR=0x46000000
+ CONFIG_DEBUG_UART=y
+-# CONFIG_AUTOBOOT is not set
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_SPI_BOOT=y
++CONFIG_NAND_BOOT=y
++CONFIG_BOOTSTD_DEFAULTS=y
++CONFIG_BOOTSTD_FULL=y
+ CONFIG_DEFAULT_FDT_FILE="mt7981-snfi-nand-rfb"
+ CONFIG_LOGLEVEL=7
+ CONFIG_LOG=y
+@@ -22,22 +38,73 @@ CONFIG_SYS_PBSIZE=1049
+ # CONFIG_BOOTM_PLAN9 is not set
+ # CONFIG_BOOTM_RTEMS is not set
+ # CONFIG_BOOTM_VXWORKS is not set
+-# CONFIG_CMD_ELF is not set
+ # CONFIG_CMD_UNLZ4 is not set
+ # CONFIG_CMD_UNZIP is not set
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_ELF=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_FDT=y
++CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_FS_UUID=y
+ CONFIG_CMD_GPIO=y
+ CONFIG_CMD_MTD=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++CONFIG_CMD_MTD=y
++CONFIG_CMD_NAND=y
++# CONFIG_MTD_RAW_NAND is not set
++CONFIG_CMD_NAND_TRIMFFS=y
++CONFIG_CMD_PCI=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF=y
++CONFIG_CMD_SF_TEST=y
+ CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
+ CONFIG_CMD_SMC=y
+ CONFIG_CMD_UBI=y
+ CONFIG_CMD_UBI_RENAME=y
++CONFIG_CMD_UBIFS=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_UUID=y
+ CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_IS_IN_UBI=y
++CONFIG_ENV_UBI_PART="ubi"
++CONFIG_ENV_SIZE=0x1f000
++CONFIG_ENV_SIZE_REDUND=0x1f000
++CONFIG_ENV_UBI_VOLUME="ubootenv"
++CONFIG_ENV_UBI_VOLUME_REDUND="ubootenv2"
+ CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
+ CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGEX=y
+ CONFIG_REGMAP=y
+ CONFIG_SYSCON=y
+ CONFIG_CLK=y
+ # CONFIG_MMC is not set
++CONFIG_HUSH_PARSER=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
+ CONFIG_MTD=y
+ CONFIG_DM_MTD=y
+ CONFIG_MTK_SPI_NAND=y
+--- a/configs/mt7981_nor_rfb_defconfig
++++ b/configs/mt7981_nor_rfb_defconfig
+@@ -12,7 +12,22 @@ CONFIG_DEBUG_UART_BASE=0x11002000
+ CONFIG_DEBUG_UART_CLOCK=40000000
+ CONFIG_SYS_LOAD_ADDR=0x46000000
+ CONFIG_DEBUG_UART=y
+-# CONFIG_AUTOBOOT is not set
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_SPI_BOOT=y
++CONFIG_BOOTSTD_DEFAULTS=y
++CONFIG_BOOTSTD_FULL=y
+ CONFIG_DEFAULT_FDT_FILE="mt7981-rfb"
+ CONFIG_LOGLEVEL=7
+ CONFIG_LOG=y
+@@ -22,21 +37,66 @@ CONFIG_SYS_PBSIZE=1049
+ # CONFIG_BOOTM_PLAN9 is not set
+ # CONFIG_BOOTM_RTEMS is not set
+ # CONFIG_BOOTM_VXWORKS is not set
+-# CONFIG_CMD_ELF is not set
+ # CONFIG_CMD_UNLZ4 is not set
+ # CONFIG_CMD_UNZIP is not set
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_ELF=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_FDT=y
++CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_FS_UUID=y
+ CONFIG_CMD_GPIO=y
+ CONFIG_CMD_MTD=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++CONFIG_CMD_MTD=y
++CONFIG_CMD_PCI=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF=y
+ CONFIG_CMD_SF_TEST=y
+ CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
+ CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_UUID=y
++CONFIG_ENV_IS_IN_MTD=y
++CONFIG_ENV_MTD_NAME="u-boot-env"
++CONFIG_ENV_SIZE_REDUND=0x4000
++CONFIG_ENV_SIZE=0x4000
++CONFIG_ENV_OFFSET=0x0
+ CONFIG_ENV_OVERWRITE=y
+ CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
+ CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGEX=y
+ CONFIG_REGMAP=y
+ CONFIG_SYSCON=y
+ CONFIG_CLK=y
+ # CONFIG_MMC is not set
++CONFIG_HUSH_PARSER=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
+ CONFIG_MTD=y
+ CONFIG_DM_MTD=y
+ CONFIG_MTD_SPI_NAND=y
diff --git a/package/boot/uboot-mediatek/patches/108-dts-arm64-mt7981-rfb-add-mtd-partitions.patch b/package/boot/uboot-mediatek/patches/108-dts-arm64-mt7981-rfb-add-mtd-partitions.patch
new file mode 100644
index 00000000000..a58c81b6568
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/108-dts-arm64-mt7981-rfb-add-mtd-partitions.patch
@@ -0,0 +1,140 @@
+--- a/arch/arm/dts/mt7981-rfb.dts
++++ b/arch/arm/dts/mt7981-rfb.dts
+@@ -143,6 +143,37 @@
+ compatible = "spi-nand";
+ reg = <0>;
+ spi-max-frequency = <52000000>;
++
++ partitions {
++ compatible = "fixed-partitions";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ partition@0 {
++ label = "BL2";
++ reg = <0x00000 0x0100000>;
++ };
++
++ partition@100000 {
++ label = "u-boot-env";
++ reg = <0x0100000 0x0080000>;
++ };
++
++ factory: partition@180000 {
++ label = "Factory";
++ reg = <0x180000 0x0200000>;
++ };
++
++ partition@380000 {
++ label = "FIP";
++ reg = <0x380000 0x0200000>;
++ };
++
++ partition@580000 {
++ label = "ubi";
++ reg = <0x580000 0x4000000>;
++ };
++ };
+ };
+ };
+
+@@ -164,6 +195,37 @@
+ compatible = "jedec,spi-nor";
+ reg = <0>;
+ spi-max-frequency = <52000000>;
++
++ partitions {
++ compatible = "fixed-partitions";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ partition@00000 {
++ label = "BL2";
++ reg = <0x00000 0x0040000>;
++ };
++
++ partition@40000 {
++ label = "u-boot-env";
++ reg = <0x40000 0x0010000>;
++ };
++
++ partition@50000 {
++ label = "Factory";
++ reg = <0x50000 0x00B0000>;
++ };
++
++ partition@100000 {
++ label = "FIP";
++ reg = <0x100000 0x0080000>;
++ };
++
++ partition@180000 {
++ label = "firmware";
++ reg = <0x180000 0xE00000>;
++ };
++ };
+ };
+ };
+
+--- a/arch/arm/dts/mt7981-snfi-nand-rfb.dts
++++ b/arch/arm/dts/mt7981-snfi-nand-rfb.dts
+@@ -107,11 +107,11 @@
+ };
+
+ mmc0_pins_default: mmc0default {
+- mux {
+- function = "flash";
+- groups = "emmc_45";
+- };
+- };
++ mux {
++ function = "flash";
++ groups = "emmc_45";
++ };
++ };
+ };
+
+ &snand {
+@@ -119,6 +119,42 @@
+ pinctrl-0 = <&snfi_pins>;
+ status = "okay";
+ quad-spi;
++
++ spi_nand@0 {
++ compatible = "spi-nand";
++ reg = <0>;
++
++ partitions {
++ compatible = "fixed-partitions";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ partition@0 {
++ label = "BL2";
++ reg = <0x00000 0x0100000>;
++ };
++
++ partition@100000 {
++ label = "u-boot-env";
++ reg = <0x0100000 0x0080000>;
++ };
++
++ factory: partition@180000 {
++ label = "Factory";
++ reg = <0x180000 0x0200000>;
++ };
++
++ partition@380000 {
++ label = "FIP";
++ reg = <0x380000 0x0200000>;
++ };
++
++ partition@580000 {
++ label = "ubi";
++ reg = <0x580000 0x4000000>;
++ };
++ };
++ };
+ };
+
+ &pwm {
diff --git a/package/boot/uboot-mediatek/patches/110-no-kwbimage.patch b/package/boot/uboot-mediatek/patches/110-no-kwbimage.patch
new file mode 100644
index 00000000000..3bf033f8143
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/110-no-kwbimage.patch
@@ -0,0 +1,10 @@
+--- a/tools/Makefile
++++ b/tools/Makefile
+@@ -116,7 +116,6 @@ dumpimage-mkimage-objs := aisimage.o \
+ imximage.o \
+ imx8image.o \
+ imx8mimage.o \
+- kwbimage.o \
+ generated/lib/md5.o \
+ lpc32xximage.o \
+ mxsimage.o \
diff --git a/package/boot/uboot-mediatek/patches/120-use-xz-instead-of-lzma.patch b/package/boot/uboot-mediatek/patches/120-use-xz-instead-of-lzma.patch
index 4dfe5062678..9a9224963d4 100644
--- a/package/boot/uboot-mediatek/patches/120-use-xz-instead-of-lzma.patch
+++ b/package/boot/uboot-mediatek/patches/120-use-xz-instead-of-lzma.patch
@@ -1,6 +1,6 @@
--- a/Makefile
+++ b/Makefile
-@@ -1004,7 +1004,7 @@ quiet_cmd_pad_cat = CAT $@
+@@ -1083,7 +1083,7 @@ quiet_cmd_pad_cat = CAT $@
cmd_pad_cat = $(cmd_objcopy) && $(append) || { rm -f $@; false; }
quiet_cmd_lzma = LZMA $@
diff --git a/package/boot/uboot-mediatek/patches/130-fix-mkimage-host-build.patch b/package/boot/uboot-mediatek/patches/130-fix-mkimage-host-build.patch
new file mode 100644
index 00000000000..86a424e8b76
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/130-fix-mkimage-host-build.patch
@@ -0,0 +1,24 @@
+--- a/tools/image-host.c
++++ b/tools/image-host.c
+@@ -1137,6 +1137,7 @@ static int fit_config_add_verification_d
+ * 2) get public key (X509_get_pubkey)
+ * 3) provide der format (d2i_RSAPublicKey)
+ */
++#ifdef CONFIG_TOOLS_LIBCRYPTO
+ static int read_pub_key(const char *keydir, const void *name,
+ unsigned char **pubkey, int *pubkey_len)
+ {
+@@ -1190,6 +1191,13 @@ err_cert:
+ fclose(f);
+ return ret;
+ }
++#else
++static int read_pub_key(const char *keydir, const void *name,
++ unsigned char **pubkey, int *pubkey_len)
++{
++ return -ENOSYS;
++}
++#endif
+
+ int fit_pre_load_data(const char *keydir, void *keydest, void *fit)
+ {
diff --git a/package/boot/uboot-mediatek/patches/160-net-phy-add-support-for-Airoha-ethernet-PHY-driver.patch b/package/boot/uboot-mediatek/patches/160-net-phy-add-support-for-Airoha-ethernet-PHY-driver.patch
new file mode 100644
index 00000000000..f8e86599527
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/160-net-phy-add-support-for-Airoha-ethernet-PHY-driver.patch
@@ -0,0 +1,1929 @@
+From 70157a6148ad47734f1dc646b4157ca83cc5df9f Mon Sep 17 00:00:00 2001
+From: Weijie Gao <weijie.gao@mediatek.com>
+Date: Thu, 13 Jul 2023 16:34:48 +0800
+Subject: [PATCH] net: phy: add support for Airoha ethernet PHY driver
+
+This patch adds support for Airoha ethernet PHY driver.
+
+If GMAC2 of your board connects to Airoha EN8801S, please change the eth
+node as follow:
+
+&eth {
+ status = "okay";
+ mediatek,gmac-id = <1>;
+ mediatek,sgmiisys = <&sgmiisys1>;
+ phy-mode = "sgmii";
+ phy-handle = <&phy5>;
+
+ phy5: eth-phy@5 {
+ reg = <24>;
+ };
+};
+
+If GMAC2 of your board connects to Airoha EN8811H, please change the eth
+node as follow:
+
+&eth {
+ status = "okay";
+ mediatek,gmac-id = <1>;
+ mediatek,sgmiisys = <&sgmiisys1>;
+ phy-mode = "2500base-x";
+ phy-handle = <&phy5>;
+
+ fixed-link {
+ speed = <2500>;
+ full-duplex;
+ };
+
+ phy5: eth-phy@5 {
+ reg = <15>;
+ };
+};
+
+Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
+---
+ .../drivers/net/phy/Kconfig | 15 +
+ .../drivers/net/phy/Makefile | 2 +
+ .../drivers/net/phy/air_en8801s.c | 633 ++
+ .../drivers/net/phy/air_en8801s.h | 267 +
+ .../drivers/net/phy/air_en8811h.c | 649 ++
+ .../drivers/net/phy/air_en8811h.h | 160 +
+ .../drivers/net/phy/air_en8811h_fw.h | 9227 +++++++++++++++++
+ 7 files changed, 10953 insertions(+)
+ create mode 100644 drivers/net/phy/air_en8801s.c
+ create mode 100644 drivers/net/phy/air_en8801s.h
+ create mode 100644 drivers/net/phy/air_en8811h.c
+ create mode 100644 drivers/net/phy/air_en8811h.h
+ create mode 100644 drivers/net/phy/air_en8811h_fw.h
+
+--- a/drivers/net/phy/Kconfig
++++ b/drivers/net/phy/Kconfig
+@@ -77,6 +77,37 @@ config PHY_ADIN
+ help
+ Add support for configuring RGMII on Analog Devices ADIN PHYs.
+
++menuconfig PHY_AIROHA
++ bool "Airoha Ethernet PHYs support"
++
++config PHY_AIROHA_EN8801S
++ bool "Airoha Ethernet EN8801S support"
++ depends on PHY_AIROHA
++ help
++ AIROHA EN8801S supported.
++
++config PHY_AIROHA_EN8811H
++ bool "Airoha Ethernet EN8811H support"
++ depends on PHY_AIROHA
++ help
++ AIROHA EN8811H supported.
++
++choice
++ prompt "Location of the Airoha PHY firmware"
++ default PHY_AIROHA_FW_IN_UBI
++ depends on PHY_AIROHA_EN8811H
++
++config PHY_AIROHA_FW_IN_MMC
++ bool "Airoha firmware in MMC boot1 partition"
++
++config PHY_AIROHA_FW_IN_UBI
++ bool "Airoha firmware in UBI volume en8811h-fw on NAND flash"
++
++config PHY_AIROHA_FW_IN_MTD
++ bool "Airoha firmware in MTD partition on raw flash"
++
++endchoice
++
+ menuconfig PHY_AQUANTIA
+ bool "Aquantia Ethernet PHYs support"
+ select PHY_GIGE
+--- a/drivers/net/phy/Makefile
++++ b/drivers/net/phy/Makefile
+@@ -11,6 +11,8 @@ obj-$(CONFIG_MV88E6352_SWITCH) += mv88e6
+ obj-$(CONFIG_PHYLIB) += phy.o
+ obj-$(CONFIG_PHYLIB_10G) += generic_10g.o
+ obj-$(CONFIG_PHY_ADIN) += adin.o
++obj-$(CONFIG_PHY_AIROHA_EN8801S) += air_en8801s.o
++obj-$(CONFIG_PHY_AIROHA_EN8811H) += air_en8811h.o
+ obj-$(CONFIG_PHY_AQUANTIA) += aquantia.o
+ obj-$(CONFIG_PHY_ATHEROS) += atheros.o
+ obj-$(CONFIG_PHY_BROADCOM) += broadcom.o
+--- /dev/null
++++ b/drivers/net/phy/air_en8801s.c
+@@ -0,0 +1,633 @@
++// SPDX-License-Identifier: GPL-2.0
++/*************************************************
++ * FILE NAME: air_en8801s.c
++ * PURPOSE:
++ * EN8801S PHY Driver for Uboot
++ * NOTES:
++ *
++ * Copyright (C) 2023 Airoha Technology Corp.
++ *************************************************/
++
++/* INCLUDE FILE DECLARATIONS
++ */
++#include <common.h>
++#include <phy.h>
++#include <errno.h>
++#include <version.h>
++#include "air_en8801s.h"
++
++#if AIR_UBOOT_REVISION > 0x202004
++#include <linux/delay.h>
++#endif
++
++static struct phy_device *s_phydev = 0;
++/******************************************************
++ * The following led_cfg example is for reference only.
++ * LED5 1000M/LINK/ACT (GPIO5) <-> BASE_T_LED0,
++ * LED6 10/100M/LINK/ACT (GPIO9) <-> BASE_T_LED1,
++ * LED4 100M/LINK/ACT (GPIO8) <-> BASE_T_LED2,
++ ******************************************************/
++/* User-defined.B */
++#define AIR_LED_SUPPORT
++#ifdef AIR_LED_SUPPORT
++static const AIR_BASE_T_LED_CFG_T led_cfg[4] =
++{
++ /*
++ * LED Enable, GPIO, LED Polarity, LED ON, LED Blink
++ */
++ {LED_ENABLE, 5, AIR_ACTIVE_LOW, BASE_T_LED0_ON_CFG, BASE_T_LED0_BLK_CFG}, /* BASE-T LED0 */
++ {LED_ENABLE, 9, AIR_ACTIVE_LOW, BASE_T_LED1_ON_CFG, BASE_T_LED1_BLK_CFG}, /* BASE-T LED1 */
++ {LED_ENABLE, 8, AIR_ACTIVE_LOW, BASE_T_LED2_ON_CFG, BASE_T_LED2_BLK_CFG}, /* BASE-T LED2 */
++ {LED_DISABLE, 1, AIR_ACTIVE_LOW, BASE_T_LED3_ON_CFG, BASE_T_LED3_BLK_CFG} /* BASE-T LED3 */
++};
++static const u16 led_dur = UNIT_LED_BLINK_DURATION << AIR_LED_BLK_DUR_64M;
++#endif
++/* User-defined.E */
++/************************************************************************
++ * F U N C T I O N S
++ ************************************************************************/
++/* Airoha MII read function */
++static int airoha_cl22_read(struct mii_dev *bus, int phy_addr, int phy_register)
++{
++ int read_data = bus->read(bus, phy_addr, MDIO_DEVAD_NONE, phy_register);
++
++ if (read_data < 0)
++ return -EIO;
++ return read_data;
++}
++
++/* Airoha MII write function */
++static int airoha_cl22_write(struct mii_dev *bus, int phy_addr, int phy_register, int write_data)
++{
++ int ret = bus->write(bus, phy_addr, MDIO_DEVAD_NONE, phy_register, write_data);
++
++ return ret;
++}
++
++static int airoha_cl45_write(struct phy_device *phydev, int devad, int reg, int val)
++{
++ int ret = 0;
++
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, MII_MMD_ACC_CTL_REG, devad);
++ AIR_RTN_ERR(ret);
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, MII_MMD_ADDR_DATA_REG, reg);
++ AIR_RTN_ERR(ret);
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, MII_MMD_ACC_CTL_REG, MMD_OP_MODE_DATA | devad);
++ AIR_RTN_ERR(ret);
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, MII_MMD_ADDR_DATA_REG, val);
++ AIR_RTN_ERR(ret);
++ return ret;
++}
++
++static int airoha_cl45_read(struct phy_device *phydev, int devad, int reg)
++{
++ int read_data, ret;
++
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, MII_MMD_ACC_CTL_REG, devad);
++ AIR_RTN_ERR(ret);
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, MII_MMD_ADDR_DATA_REG, reg);
++ AIR_RTN_ERR(ret);
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, MII_MMD_ACC_CTL_REG, MMD_OP_MODE_DATA | devad);
++ AIR_RTN_ERR(ret);
++ read_data = phy_read(phydev, MDIO_DEVAD_NONE, MII_MMD_ADDR_DATA_REG);
++ if (read_data < 0)
++ return -EIO;
++ return read_data;
++}
++
++/* EN8801 PBUS write function */
++int airoha_pbus_write(struct mii_dev *bus, int pbus_addr, int pbus_reg, unsigned long pbus_data)
++{
++ int ret = 0;
++
++ ret = airoha_cl22_write(bus, pbus_addr, 0x1F, (pbus_reg >> 6));
++ AIR_RTN_ERR(ret);
++ ret = airoha_cl22_write(bus, pbus_addr, ((pbus_reg >> 2) & 0xf), (pbus_data & 0xFFFF));
++ AIR_RTN_ERR(ret);
++ ret = airoha_cl22_write(bus, pbus_addr, 0x10, (pbus_data >> 16));
++ AIR_RTN_ERR(ret);
++ return ret;
++}
++
++/* EN8801 PBUS read function */
++unsigned long airoha_pbus_read(struct mii_dev *bus, int pbus_addr, int pbus_reg)
++{
++ unsigned long pbus_data;
++ unsigned int pbus_data_low, pbus_data_high;
++
++ airoha_cl22_write(bus, pbus_addr, 0x1F, (pbus_reg >> 6));
++ pbus_data_low = airoha_cl22_read(bus, pbus_addr, ((pbus_reg >> 2) & 0xf));
++ pbus_data_high = airoha_cl22_read(bus, pbus_addr, 0x10);
++ pbus_data = (pbus_data_high << 16) + pbus_data_low;
++ return pbus_data;
++}
++
++/* Airoha Token Ring Write function */
++static int airoha_tr_reg_write(struct phy_device *phydev, unsigned long tr_address, unsigned long tr_data)
++{
++ int ret;
++
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x1F, 0x52b5); /* page select */
++ AIR_RTN_ERR(ret);
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x11, (int)(tr_data & 0xffff));
++ AIR_RTN_ERR(ret);
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x12, (int)(tr_data >> 16));
++ AIR_RTN_ERR(ret);
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x10, (int)(tr_address | TrReg_WR));
++ AIR_RTN_ERR(ret);
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x1F, 0x0); /* page resetore */
++ AIR_RTN_ERR(ret);
++ return ret;
++}
++
++int airoha_phy_process(void)
++{
++ int ret = 0, pbus_addr = EN8801S_PBUS_PHY_ID;
++ unsigned long pbus_data;
++ struct mii_dev *mbus;
++
++ mbus = s_phydev->bus;
++ pbus_data = airoha_pbus_read(mbus, pbus_addr, 0x19e0);
++ pbus_data |= BIT(0);
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x19e0, pbus_data);
++ if(ret)
++ printf("error: airoha_pbus_write fail ret: %d\n", ret);
++ pbus_data = airoha_pbus_read(mbus, pbus_addr, 0x19e0);
++ pbus_data &= ~BIT(0);
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x19e0, pbus_data);
++ if(ret)
++ printf("error: airoha_pbus_write fail ret: %d\n", ret);
++
++ if(ret)
++ printf("error: FCM regs reset fail, ret: %d\n", ret);
++ else
++ debug("FCM regs reset successful\n");
++ return ret;
++}
++
++#ifdef AIR_LED_SUPPORT
++static int airoha_led_set_usr_def(struct phy_device *phydev, u8 entity, int polar,
++ u16 on_evt, u16 blk_evt)
++{
++ int ret = 0;
++
++ if (AIR_ACTIVE_HIGH == polar) {
++ on_evt |= LED_ON_POL;
++ } else {
++ on_evt &= ~LED_ON_POL;
++ }
++ ret = airoha_cl45_write(phydev, 0x1f, LED_ON_CTRL(entity), on_evt | LED_ON_EN);
++ AIR_RTN_ERR(ret);
++ ret = airoha_cl45_write(phydev, 0x1f, LED_BLK_CTRL(entity), blk_evt);
++ AIR_RTN_ERR(ret);
++ return 0;
++}
++
++static int airoha_led_set_mode(struct phy_device *phydev, u8 mode)
++{
++ u16 cl45_data;
++ int err = 0;
++
++ cl45_data = airoha_cl45_read(phydev, 0x1f, LED_BCR);
++ switch (mode) {
++ case AIR_LED_MODE_DISABLE:
++ cl45_data &= ~LED_BCR_EXT_CTRL;
++ cl45_data &= ~LED_BCR_MODE_MASK;
++ cl45_data |= LED_BCR_MODE_DISABLE;
++ break;
++ case AIR_LED_MODE_USER_DEFINE:
++ cl45_data |= LED_BCR_EXT_CTRL;
++ cl45_data |= LED_BCR_CLK_EN;
++ break;
++ default:
++ printf("LED mode%d is not supported!\n", mode);
++ return -EINVAL;
++ }
++ err = airoha_cl45_write(phydev, 0x1f, LED_BCR, cl45_data);
++ AIR_RTN_ERR(err);
++ return 0;
++}
++
++static int airoha_led_set_state(struct phy_device *phydev, u8 entity, u8 state)
++{
++ u16 cl45_data;
++ int err;
++
++ cl45_data = airoha_cl45_read(phydev, 0x1f, LED_ON_CTRL(entity));
++ if (LED_ENABLE == state) {
++ cl45_data |= LED_ON_EN;
++ } else {
++ cl45_data &= ~LED_ON_EN;
++ }
++
++ err = airoha_cl45_write(phydev, 0x1f, LED_ON_CTRL(entity), cl45_data);
++ AIR_RTN_ERR(err);
++ return 0;
++}
++
++static int en8801s_led_init(struct phy_device *phydev)
++{
++
++ unsigned long led_gpio = 0, reg_value = 0;
++ int ret = 0, led_id;
++ struct mii_dev *mbus = phydev->bus;
++ int gpio_led_rg[3] = {0x1870, 0x1874, 0x1878};
++ u16 cl45_data = led_dur;
++
++ ret = airoha_cl45_write(phydev, 0x1f, LED_BLK_DUR, cl45_data);
++ AIR_RTN_ERR(ret);
++ cl45_data >>= 1;
++ ret = airoha_cl45_write(phydev, 0x1f, LED_ON_DUR, cl45_data);
++ AIR_RTN_ERR(ret);
++ ret = airoha_led_set_mode(phydev, AIR_LED_MODE_USER_DEFINE);
++ if (ret != 0) {
++ printf("LED fail to set mode, ret %d !\n", ret);
++ return ret;
++ }
++ for(led_id = 0; led_id < EN8801S_LED_COUNT; led_id++) {
++ reg_value = 0;
++ ret = airoha_led_set_state(phydev, led_id, led_cfg[led_id].en);
++ if (ret != 0) {
++ printf("LED fail to set state, ret %d !\n", ret);
++ return ret;
++ }
++ if (LED_ENABLE == led_cfg[led_id].en) {
++ if ( (led_cfg[led_id].gpio < 0) || led_cfg[led_id].gpio > 9) {
++ printf("GPIO%d is out of range!! GPIO number is 0~9.\n", led_cfg[led_id].gpio);
++ return -EIO;
++ }
++ led_gpio |= BIT(led_cfg[led_id].gpio);
++ reg_value = airoha_pbus_read(mbus, EN8801S_PBUS_PHY_ID, gpio_led_rg[led_cfg[led_id].gpio / 4]);
++ LED_SET_GPIO_SEL(led_cfg[led_id].gpio, led_id, reg_value);
++ debug("[Airoha] gpio%d, reg_value 0x%lx\n", led_cfg[led_id].gpio, reg_value);
++ ret = airoha_pbus_write(mbus, EN8801S_PBUS_PHY_ID, gpio_led_rg[led_cfg[led_id].gpio / 4], reg_value);
++ AIR_RTN_ERR(ret);
++ ret = airoha_led_set_usr_def(phydev, led_id, led_cfg[led_id].pol, led_cfg[led_id].on_cfg, led_cfg[led_id].blk_cfg);
++ if (ret != 0) {
++ printf("LED fail to set usr def, ret %d !\n", ret);
++ return ret;
++ }
++ }
++ }
++ reg_value = (airoha_pbus_read(mbus, EN8801S_PBUS_PHY_ID, 0x1880) & ~led_gpio);
++ ret = airoha_pbus_write(mbus, EN8801S_PBUS_PHY_ID, 0x1880, reg_value);
++ AIR_RTN_ERR(ret);
++ ret = airoha_pbus_write(mbus, EN8801S_PBUS_PHY_ID, 0x186c, led_gpio);
++ AIR_RTN_ERR(ret);
++
++ printf("LED initialize OK !\n");
++ return 0;
++}
++#endif /* AIR_LED_SUPPORT */
++
++static int en8801s_config(struct phy_device *phydev)
++{
++ int reg_value = 0, ret = 0;
++ struct mii_dev *mbus = phydev->bus;
++ int retry, pbus_addr = EN8801S_PBUS_DEFAULT_ID;
++ int phy_addr = EN8801S_MDIO_PHY_ID;
++ unsigned long pbus_data = 0;
++ gephy_all_REG_LpiReg1Ch GPHY_RG_LPI_1C;
++ gephy_all_REG_dev1Eh_reg324h GPHY_RG_1E_324;
++ gephy_all_REG_dev1Eh_reg012h GPHY_RG_1E_012;
++ gephy_all_REG_dev1Eh_reg017h GPHY_RG_1E_017;
++
++ s_phydev = phydev;
++ retry = MAX_OUI_CHECK;
++ while (1) {
++ /* PHY OUI */
++ pbus_data = airoha_pbus_read(mbus, pbus_addr, EN8801S_RG_ETHER_PHY_OUI);
++ if (EN8801S_PBUS_OUI == pbus_data) {
++ printf("PBUS addr 0x%x: Start initialized.\n", pbus_addr);
++ ret = airoha_pbus_write(mbus, pbus_addr, EN8801S_RG_BUCK_CTL, 0x03);
++ AIR_RTN_ERR(ret);
++ break;
++ } else
++ pbus_addr = EN8801S_PBUS_PHY_ID;
++
++ if (0 == --retry) {
++ printf("EN8801S Probe fail !\n");
++ return 0;
++ }
++ }
++
++ /* SMI ADDR */
++ pbus_data = airoha_pbus_read(mbus, pbus_addr, EN8801S_RG_SMI_ADDR);
++ pbus_data = (pbus_data & 0xffff0000) | (unsigned long)(pbus_addr << 8) | (unsigned long)(EN8801S_MDIO_DEFAULT_ID);
++ ret = airoha_pbus_write(mbus, pbus_addr, EN8801S_RG_SMI_ADDR, pbus_data);
++ AIR_RTN_ERR(ret);
++ mdelay(10);
++
++ pbus_data = (airoha_pbus_read(mbus, pbus_addr, EN8801S_RG_LTR_CTL) & (~0x3)) | BIT(2) ;
++ ret = airoha_pbus_write(mbus, pbus_addr, EN8801S_RG_LTR_CTL, pbus_data);
++ AIR_RTN_ERR(ret);
++ mdelay(500);
++ pbus_data = (pbus_data & ~BIT(2)) | EN8801S_RX_POLARITY_NORMAL | EN8801S_TX_POLARITY_NORMAL;
++ ret = airoha_pbus_write(mbus, pbus_addr, EN8801S_RG_LTR_CTL, pbus_data);
++ AIR_RTN_ERR(ret);
++ mdelay(500);
++ /* SMI ADDR */
++ pbus_data = airoha_pbus_read(mbus, pbus_addr, EN8801S_RG_SMI_ADDR);
++ pbus_data = (pbus_data & 0xffff0000) | (unsigned long)(EN8801S_PBUS_PHY_ID << 8) | (unsigned long)(EN8801S_MDIO_PHY_ID);
++ ret = airoha_pbus_write(mbus, pbus_addr, EN8801S_RG_SMI_ADDR, pbus_data);
++ pbus_addr = EN8801S_PBUS_PHY_ID;
++ AIR_RTN_ERR(ret);
++ mdelay(10);
++
++ /* Optimze 10M IoT */
++ pbus_data = airoha_pbus_read(mbus, pbus_addr, 0x1690);
++ pbus_data |= (1 << 31);
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x1690, pbus_data);
++ AIR_RTN_ERR(ret);
++ /* set SGMII Base Page */
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x0600, 0x0c000c00);
++ AIR_RTN_ERR(ret);
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x10, 0xD801);
++ AIR_RTN_ERR(ret);
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x0, 0x9140);
++ AIR_RTN_ERR(ret);
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x0A14, 0x0003);
++ AIR_RTN_ERR(ret);
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x0600, 0x0c000c00);
++ AIR_RTN_ERR(ret);
++ /* Set FCM control */
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x1404, 0x004b);
++ AIR_RTN_ERR(ret);
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x140c, 0x0007);
++ AIR_RTN_ERR(ret);
++
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x142c, 0x05050505);
++ AIR_RTN_ERR(ret);
++ pbus_data = airoha_pbus_read(mbus, pbus_addr, 0x1440);
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x1440, pbus_data & ~BIT(11));
++ AIR_RTN_ERR(ret);
++
++ pbus_data = airoha_pbus_read(mbus, pbus_addr, 0x1408);
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x1408, pbus_data | BIT(5));
++ AIR_RTN_ERR(ret);
++
++ /* Set GPHY Perfomance*/
++ /* Token Ring */
++ ret = airoha_tr_reg_write(phydev, RgAddr_R1000DEC_15h, 0x0055A0);
++ AIR_RTN_ERR(ret);
++ ret = airoha_tr_reg_write(phydev, RgAddr_R1000DEC_17h, 0x07FF3F);
++ AIR_RTN_ERR(ret);
++ ret = airoha_tr_reg_write(phydev, RgAddr_PMA_00h, 0x00001E);
++ AIR_RTN_ERR(ret);
++ ret = airoha_tr_reg_write(phydev, RgAddr_PMA_01h, 0x6FB90A);
++ AIR_RTN_ERR(ret);
++ ret = airoha_tr_reg_write(phydev, RgAddr_PMA_17h, 0x060671);
++ AIR_RTN_ERR(ret);
++ ret = airoha_tr_reg_write(phydev, RgAddr_PMA_18h, 0x0E2F00);
++ AIR_RTN_ERR(ret);
++ ret = airoha_tr_reg_write(phydev, RgAddr_TR_26h, 0x444444);
++ AIR_RTN_ERR(ret);
++ ret = airoha_tr_reg_write(phydev, RgAddr_DSPF_03h, 0x000000);
++ AIR_RTN_ERR(ret);
++ ret = airoha_tr_reg_write(phydev, RgAddr_DSPF_06h, 0x2EBAEF);
++ AIR_RTN_ERR(ret);
++ ret = airoha_tr_reg_write(phydev, RgAddr_DSPF_08h, 0x00000B);
++ AIR_RTN_ERR(ret);
++ ret = airoha_tr_reg_write(phydev, RgAddr_DSPF_0Ch, 0x00504D);
++ AIR_RTN_ERR(ret);
++ ret = airoha_tr_reg_write(phydev, RgAddr_DSPF_0Dh, 0x02314F);
++ AIR_RTN_ERR(ret);
++ ret = airoha_tr_reg_write(phydev, RgAddr_DSPF_0Fh, 0x003028);
++ AIR_RTN_ERR(ret);
++ ret = airoha_tr_reg_write(phydev, RgAddr_DSPF_10h, 0x005010);
++ AIR_RTN_ERR(ret);
++ ret = airoha_tr_reg_write(phydev, RgAddr_DSPF_11h, 0x040001);
++ AIR_RTN_ERR(ret);
++ ret = airoha_tr_reg_write(phydev, RgAddr_DSPF_13h, 0x018670);
++ AIR_RTN_ERR(ret);
++ ret = airoha_tr_reg_write(phydev, RgAddr_DSPF_14h, 0x00024A);
++ AIR_RTN_ERR(ret);
++ ret = airoha_tr_reg_write(phydev, RgAddr_DSPF_1Bh, 0x000072);
++ AIR_RTN_ERR(ret);
++ ret = airoha_tr_reg_write(phydev, RgAddr_DSPF_1Ch, 0x003210);
++ AIR_RTN_ERR(ret);
++ /* CL22 & CL45 */
++ ret = airoha_cl22_write(mbus, phy_addr, 0x1f, 0x03);
++ AIR_RTN_ERR(ret);
++ GPHY_RG_LPI_1C.DATA = airoha_cl22_read(mbus, phy_addr, RgAddr_LPI_1Ch);
++ if (GPHY_RG_LPI_1C.DATA < 0)
++ return -EIO;
++ GPHY_RG_LPI_1C.DataBitField.smi_deton_th = 0x0C;
++ ret = airoha_cl22_write(mbus, phy_addr, RgAddr_LPI_1Ch, GPHY_RG_LPI_1C.DATA);
++ AIR_RTN_ERR(ret);
++ ret = airoha_cl22_write(mbus, phy_addr, RgAddr_LPI_1Ch, 0xC92);
++ AIR_RTN_ERR(ret);
++ ret = airoha_cl22_write(mbus, phy_addr, RgAddr_AUXILIARY_1Dh, 0x1);
++ AIR_RTN_ERR(ret);
++ ret = airoha_cl22_write(mbus, phy_addr, 0x1f, 0x0);
++ AIR_RTN_ERR(ret);
++ ret = airoha_cl45_write(phydev, 0x1E, 0x120, 0x8014);
++ AIR_RTN_ERR(ret);
++ ret = airoha_cl45_write(phydev, 0x1E, 0x122, 0xffff);
++ AIR_RTN_ERR(ret);
++ ret = airoha_cl45_write(phydev, 0x1E, 0x123, 0xffff);
++ AIR_RTN_ERR(ret);
++ ret = airoha_cl45_write(phydev, 0x1E, 0x144, 0x0200);
++ AIR_RTN_ERR(ret);
++ ret = airoha_cl45_write(phydev, 0x1E, 0x14A, 0xEE20);
++ AIR_RTN_ERR(ret);
++ ret = airoha_cl45_write(phydev, 0x1E, 0x189, 0x0110);
++ AIR_RTN_ERR(ret);
++ ret = airoha_cl45_write(phydev, 0x1E, 0x19B, 0x0111);
++ AIR_RTN_ERR(ret);
++ ret = airoha_cl45_write(phydev, 0x1E, 0x234, 0x0181);
++ AIR_RTN_ERR(ret);
++ ret = airoha_cl45_write(phydev, 0x1E, 0x238, 0x0120);
++ AIR_RTN_ERR(ret);
++ ret = airoha_cl45_write(phydev, 0x1E, 0x239, 0x0117);
++ AIR_RTN_ERR(ret);
++ ret = airoha_cl45_write(phydev, 0x1E, 0x268, 0x07F4);
++ AIR_RTN_ERR(ret);
++ ret = airoha_cl45_write(phydev, 0x1E, 0x2D1, 0x0733);
++ AIR_RTN_ERR(ret);
++ ret = airoha_cl45_write(phydev, 0x1E, 0x323, 0x0011);
++ AIR_RTN_ERR(ret);
++ ret = airoha_cl45_write(phydev, 0x1E, 0x324, 0x013F);
++ AIR_RTN_ERR(ret);
++ ret = airoha_cl45_write(phydev, 0x1E, 0x326, 0x0037);
++ AIR_RTN_ERR(ret);
++
++ reg_value = airoha_cl45_read(phydev, 0x1E, 0x324);
++ if (reg_value < 0)
++ return -EIO;
++ GPHY_RG_1E_324.DATA = (int)reg_value;
++ GPHY_RG_1E_324.DataBitField.smi_det_deglitch_off = 0;
++ ret = airoha_cl45_write(phydev, 0x1E, 0x324, GPHY_RG_1E_324.DATA);
++ AIR_RTN_ERR(ret);
++ ret = airoha_cl45_write(phydev, 0x1E, 0x19E, 0xC2);
++ AIR_RTN_ERR(ret);
++ ret = airoha_cl45_write(phydev, 0x1E, 0x013, 0x0);
++ AIR_RTN_ERR(ret);
++
++ /* EFUSE */
++ airoha_pbus_write(mbus, pbus_addr, 0x1C08, 0x40000040);
++ retry = MAX_RETRY;
++ while (0 != retry) {
++ mdelay(1);
++ pbus_data = airoha_pbus_read(mbus, pbus_addr, 0x1C08);
++ if ((pbus_data & (1 << 30)) == 0) {
++ break;
++ }
++ retry--;
++ }
++ pbus_data = airoha_pbus_read(mbus, pbus_addr, 0x1C38); /* RAW#2 */
++ reg_value = airoha_cl45_read(phydev, 0x1E, 0x12);
++ if (reg_value < 0)
++ return -EIO;
++ GPHY_RG_1E_012.DATA = reg_value;
++ GPHY_RG_1E_012.DataBitField.da_tx_i2mpb_a_tbt = pbus_data & 0x03f;
++ ret = airoha_cl45_write(phydev, 0x1E, 0x12, GPHY_RG_1E_012.DATA);
++ AIR_RTN_ERR(ret);
++ reg_value = airoha_cl45_read(phydev, 0x1E, 0x17);
++ if (reg_value < 0)
++ return -EIO;
++ GPHY_RG_1E_017.DataBitField.da_tx_i2mpb_b_tbt = (reg_value >> 8) & 0x03f;
++ ret = airoha_cl45_write(phydev, 0x1E, 0x17, GPHY_RG_1E_017.DATA);
++ AIR_RTN_ERR(ret);
++
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x1C08, 0x40400040);
++ AIR_RTN_ERR(ret);
++ retry = MAX_RETRY;
++ while (0 != retry) {
++ mdelay(1);
++ reg_value = airoha_pbus_read(mbus, pbus_addr, 0x1C08);
++ if ((reg_value & (1 << 30)) == 0) {
++ break;
++ }
++ retry--;
++ }
++ pbus_data = airoha_pbus_read(mbus, pbus_addr, 0x1C30); /* RAW#16 */
++ GPHY_RG_1E_324.DataBitField.smi_det_deglitch_off = (pbus_data >> 12) & 0x01;
++ ret = airoha_cl45_write(phydev, 0x1E, 0x324, GPHY_RG_1E_324.DATA);
++ AIR_RTN_ERR(ret);
++#ifdef AIR_LED_SUPPORT
++ ret = en8801s_led_init(phydev);
++ if (ret != 0){
++ printf("en8801s_led_init fail (ret:%d) !\n", ret);
++ }
++#endif
++ printf("EN8801S initialize OK ! (%s)\n", EN8801S_DRIVER_VERSION);
++ return 0;
++}
++
++int en8801s_read_status(struct phy_device *phydev)
++{
++ int ret, pbus_addr = EN8801S_PBUS_PHY_ID;
++ struct mii_dev *mbus;
++ unsigned long pbus_data;
++
++ mbus = phydev->bus;
++ if (SPEED_10 == phydev->speed) {
++ /* set the bit for Optimze 10M IoT */
++ debug("[Airoha] SPEED_10 0x1694\n");
++ pbus_data = airoha_pbus_read(mbus, pbus_addr, 0x1694);
++ pbus_data |= (1 << 31);
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x1694, pbus_data);
++ AIR_RTN_ERR(ret);
++ } else {
++ debug("[Airoha] SPEED_1000/100 0x1694\n");
++ /* clear the bit for other speeds */
++ pbus_data = airoha_pbus_read(mbus, pbus_addr, 0x1694);
++ pbus_data &= ~(1 << 31);
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x1694, pbus_data);
++ AIR_RTN_ERR(ret);
++ }
++
++ airoha_pbus_write(mbus, pbus_addr, 0x0600, 0x0c000c00);
++ if(SPEED_1000 == phydev->speed) {
++ debug("[Airoha] SPEED_1000\n");
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x10, 0xD801);
++ AIR_RTN_ERR(ret);
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x0, 0x9140);
++ AIR_RTN_ERR(ret);
++
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x0A14, 0x0003);
++ AIR_RTN_ERR(ret);
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x0600, 0x0c000c00);
++ AIR_RTN_ERR(ret);
++ mdelay(2); /* delay 2 ms */
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x1404, 0x004b);
++ AIR_RTN_ERR(ret);
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x140c, 0x0007);
++ AIR_RTN_ERR(ret);
++ }
++ else if (SPEED_100 == phydev->speed) {
++ debug("[Airoha] SPEED_100\n");
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x10, 0xD401);
++ AIR_RTN_ERR(ret);
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x0, 0x9140);
++ AIR_RTN_ERR(ret);
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x0A14, 0x0007);
++ AIR_RTN_ERR(ret);
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x0600, 0x0c11);
++ AIR_RTN_ERR(ret);
++ mdelay(2); /* delay 2 ms */
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x1404, 0x0027);
++ AIR_RTN_ERR(ret);
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x140c, 0x0007);
++ AIR_RTN_ERR(ret);
++ }
++ else {
++ debug("[Airoha] SPEED_10\n");
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x10, 0xD001);
++ AIR_RTN_ERR(ret);
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x0, 0x9140);
++ AIR_RTN_ERR(ret);
++
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x0A14, 0x000b);
++ AIR_RTN_ERR(ret);
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x0600, 0x0c11);
++ AIR_RTN_ERR(ret);
++ mdelay(2); /* delay 2 ms */
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x1404, 0x0047);
++ AIR_RTN_ERR(ret);
++ ret = airoha_pbus_write(mbus, pbus_addr, 0x140c, 0x0007);
++ AIR_RTN_ERR(ret);
++ }
++ return 0;
++}
++
++static int en8801s_startup(struct phy_device *phydev)
++{
++ int ret;
++
++ ret = genphy_update_link(phydev);
++ if (ret)
++ return ret;
++ ret = genphy_parse_link(phydev);
++ if (ret)
++ return ret;
++ return en8801s_read_status(phydev);
++}
++#if AIR_UBOOT_REVISION > 0x202303
++U_BOOT_PHY_DRIVER(en8801s) = {
++ .name = "Airoha EN8801S",
++ .uid = EN8801S_PHY_ID,
++ .mask = 0x0ffffff0,
++ .features = PHY_GBIT_FEATURES,
++ .config = &en8801s_config,
++ .startup = &en8801s_startup,
++ .shutdown = &genphy_shutdown,
++};
++#else
++static struct phy_driver AIR_EN8801S_driver = {
++ .name = "Airoha EN8801S",
++ .uid = EN8801S_PHY_ID,
++ .mask = 0x0ffffff0,
++ .features = PHY_GBIT_FEATURES,
++ .config = &en8801s_config,
++ .startup = &en8801s_startup,
++ .shutdown = &genphy_shutdown,
++};
++
++int phy_air_en8801s_init(void)
++{
++ phy_register(&AIR_EN8801S_driver);
++ return 0;
++}
++#endif
+--- /dev/null
++++ b/drivers/net/phy/air_en8801s.h
+@@ -0,0 +1,267 @@
++/* SPDX-License-Identifier: GPL-2.0 */
++/*************************************************
++ * FILE NAME: air_en8801s.h
++ * PURPOSE:
++ * EN8801S PHY Driver for Uboot
++ * NOTES:
++ *
++ * Copyright (C) 2023 Airoha Technology Corp.
++ *************************************************/
++
++#ifndef __EN8801S_H
++#define __EN8801S_H
++
++/************************************************************************
++* D E F I N E S
++************************************************************************/
++#define AIR_UBOOT_REVISION ((((U_BOOT_VERSION_NUM / 1000) % 10) << 20) | \
++ (((U_BOOT_VERSION_NUM / 100) % 10) << 16) | \
++ (((U_BOOT_VERSION_NUM / 10) % 10) << 12) | \
++ ((U_BOOT_VERSION_NUM % 10) << 8) | \
++ (((U_BOOT_VERSION_NUM_PATCH / 10) % 10) << 4) | \
++ ((U_BOOT_VERSION_NUM_PATCH % 10) << 0))
++
++#define EN8801S_MDIO_DEFAULT_ID 0x1d
++#define EN8801S_PBUS_DEFAULT_ID (EN8801S_MDIO_DEFAULT_ID + 1)
++#define EN8801S_MDIO_PHY_ID 0x18 /* Range PHY_ADDRESS_RANGE .. 0x1e */
++#define EN8801S_PBUS_PHY_ID (EN8801S_MDIO_PHY_ID + 1)
++#define EN8801S_DRIVER_VERSION "v1.1.3"
++
++#define EN8801S_RG_ETHER_PHY_OUI 0x19a4
++#define EN8801S_RG_SMI_ADDR 0x19a8
++#define EN8801S_PBUS_OUI 0x17a5
++#define EN8801S_RG_BUCK_CTL 0x1a20
++#define EN8801S_RG_LTR_CTL 0x0cf8
++
++#define EN8801S_PHY_ID1 0x03a2
++#define EN8801S_PHY_ID2 0x9461
++#define EN8801S_PHY_ID (unsigned long)((EN8801S_PHY_ID1 << 16) | EN8801S_PHY_ID2)
++
++/*
++SFP Sample for verification
++Tx Reverse, Rx Reverse
++*/
++#define EN8801S_TX_POLARITY_NORMAL 0x0
++#define EN8801S_TX_POLARITY_REVERSE 0x1
++
++#define EN8801S_RX_POLARITY_NORMAL (0x1 << 1)
++#define EN8801S_RX_POLARITY_REVERSE (0x0 << 1)
++
++#ifndef BIT
++#define BIT(nr) (1UL << (nr))
++#endif
++
++#define MAX_RETRY 5
++#define MAX_OUI_CHECK 2
++
++/* CL45 MDIO control */
++#define MII_MMD_ACC_CTL_REG 0x0d
++#define MII_MMD_ADDR_DATA_REG 0x0e
++#define MMD_OP_MODE_DATA BIT(14)
++
++#define MAX_TRG_COUNTER 5
++
++/* TokenRing Reg Access */
++#define TrReg_PKT_XMT_STA 0x8000
++#define TrReg_WR 0x8000
++#define TrReg_RD 0xA000
++
++#define RgAddr_LPI_1Ch 0x1c
++#define RgAddr_AUXILIARY_1Dh 0x1d
++#define RgAddr_PMA_00h 0x0f80
++#define RgAddr_PMA_01h 0x0f82
++#define RgAddr_PMA_17h 0x0fae
++#define RgAddr_PMA_18h 0x0fb0
++#define RgAddr_DSPF_03h 0x1686
++#define RgAddr_DSPF_06h 0x168c
++#define RgAddr_DSPF_08h 0x1690
++#define RgAddr_DSPF_0Ch 0x1698
++#define RgAddr_DSPF_0Dh 0x169a
++#define RgAddr_DSPF_0Fh 0x169e
++#define RgAddr_DSPF_10h 0x16a0
++#define RgAddr_DSPF_11h 0x16a2
++#define RgAddr_DSPF_13h 0x16a6
++#define RgAddr_DSPF_14h 0x16a8
++#define RgAddr_DSPF_1Bh 0x16b6
++#define RgAddr_DSPF_1Ch 0x16b8
++#define RgAddr_TR_26h 0x0ecc
++#define RgAddr_R1000DEC_15h 0x03aa
++#define RgAddr_R1000DEC_17h 0x03ae
++
++/*
++The following led_cfg example is for reference only.
++LED5 1000M/LINK/ACT (GPIO5) <-> BASE_T_LED0,
++LED6 10/100M/LINK/ACT(GPIO9) <-> BASE_T_LED1,
++LED4 100M/LINK/ACT (GPIO8) <-> BASE_T_LED2,
++*/
++/* User-defined.B */
++#define BASE_T_LED0_ON_CFG (LED_ON_EVT_LINK_1000M)
++#define BASE_T_LED0_BLK_CFG (LED_BLK_EVT_1000M_TX_ACT | LED_BLK_EVT_1000M_RX_ACT)
++#define BASE_T_LED1_ON_CFG (LED_ON_EVT_LINK_100M | LED_ON_EVT_LINK_10M)
++#define BASE_T_LED1_BLK_CFG (LED_BLK_EVT_100M_TX_ACT | LED_BLK_EVT_100M_RX_ACT | \
++ LED_BLK_EVT_10M_TX_ACT | LED_BLK_EVT_10M_RX_ACT )
++#define BASE_T_LED2_ON_CFG (LED_ON_EVT_LINK_100M)
++#define BASE_T_LED2_BLK_CFG (LED_BLK_EVT_100M_TX_ACT | LED_BLK_EVT_100M_RX_ACT)
++#define BASE_T_LED3_ON_CFG (0x0)
++#define BASE_T_LED3_BLK_CFG (0x0)
++/* User-defined.E */
++
++#define EN8801S_LED_COUNT 4
++
++#define LED_BCR (0x021)
++#define LED_BCR_EXT_CTRL (1 << 15)
++#define LED_BCR_CLK_EN (1 << 3)
++#define LED_BCR_TIME_TEST (1 << 2)
++#define LED_BCR_MODE_MASK (3)
++#define LED_BCR_MODE_DISABLE (0)
++#define LED_ON_CTRL(i) (0x024 + ((i)*2))
++#define LED_ON_EN (1 << 15)
++#define LED_ON_POL (1 << 14)
++#define LED_ON_EVT_MASK (0x7f)
++/* LED ON Event Option.B */
++#define LED_ON_EVT_FORCE (1 << 6)
++#define LED_ON_EVT_LINK_DOWN (1 << 3)
++#define LED_ON_EVT_LINK_10M (1 << 2)
++#define LED_ON_EVT_LINK_100M (1 << 1)
++#define LED_ON_EVT_LINK_1000M (1 << 0)
++/* LED ON Event Option.E */
++#define LED_BLK_CTRL(i) (0x025 + ((i)*2))
++#define LED_BLK_EVT_MASK (0x3ff)
++/* LED Blinking Event Option.B*/
++#define LED_BLK_EVT_FORCE (1 << 9)
++#define LED_BLK_EVT_10M_RX_ACT (1 << 5)
++#define LED_BLK_EVT_10M_TX_ACT (1 << 4)
++#define LED_BLK_EVT_100M_RX_ACT (1 << 3)
++#define LED_BLK_EVT_100M_TX_ACT (1 << 2)
++#define LED_BLK_EVT_1000M_RX_ACT (1 << 1)
++#define LED_BLK_EVT_1000M_TX_ACT (1 << 0)
++/* LED Blinking Event Option.E*/
++#define LED_ON_DUR (0x022)
++#define LED_ON_DUR_MASK (0xffff)
++#define LED_BLK_DUR (0x023)
++#define LED_BLK_DUR_MASK (0xffff)
++
++#define LED_ENABLE 1
++#define LED_DISABLE 0
++
++#define UNIT_LED_BLINK_DURATION 1024
++
++#define AIR_RTN_ON_ERR(cond, err) \
++ do { if ((cond)) return (err); } while(0)
++
++#define AIR_RTN_ERR(err) AIR_RTN_ON_ERR(err < 0, err)
++
++#define LED_SET_EVT(reg, cod, result, bit) do \
++ { \
++ if(reg & cod) { \
++ result |= bit; \
++ } \
++ } while(0)
++
++#define LED_SET_GPIO_SEL(gpio, led, val) do \
++ { \
++ val |= (led << (8 * (gpio % 4))); \
++ } while(0)
++
++/* DATA TYPE DECLARATIONS
++ */
++typedef struct
++{
++ int DATA_Lo;
++ int DATA_Hi;
++}TR_DATA_T;
++
++typedef union
++{
++ struct
++ {
++ /* b[15:00] */
++ int smi_deton_wt : 3;
++ int smi_det_mdi_inv : 1;
++ int smi_detoff_wt : 3;
++ int smi_sigdet_debouncing_en : 1;
++ int smi_deton_th : 6;
++ int rsv_14 : 2;
++ } DataBitField;
++ int DATA;
++} gephy_all_REG_LpiReg1Ch, *Pgephy_all_REG_LpiReg1Ch;
++
++typedef union
++{
++ struct
++ {
++ /* b[15:00] */
++ int rg_smi_detcnt_max : 6;
++ int rsv_6 : 2;
++ int rg_smi_det_max_en : 1;
++ int smi_det_deglitch_off : 1;
++ int rsv_10 : 6;
++ } DataBitField;
++ int DATA;
++} gephy_all_REG_dev1Eh_reg324h, *Pgephy_all_REG_dev1Eh_reg324h;
++
++typedef union
++{
++ struct
++ {
++ /* b[15:00] */
++ int da_tx_i2mpb_a_tbt : 6;
++ int rsv_6 : 4;
++ int da_tx_i2mpb_a_gbe : 6;
++ } DataBitField;
++ int DATA;
++} gephy_all_REG_dev1Eh_reg012h, *Pgephy_all_REG_dev1Eh_reg012h;
++
++typedef union
++{
++ struct
++ {
++ /* b[15:00] */
++ int da_tx_i2mpb_b_tbt : 6;
++ int rsv_6 : 2;
++ int da_tx_i2mpb_b_gbe : 6;
++ int rsv_14 : 2;
++ } DataBitField;
++ int DATA;
++} gephy_all_REG_dev1Eh_reg017h, *Pgephy_all_REG_dev1Eh_reg017h;
++
++typedef struct AIR_BASE_T_LED_CFG_S
++{
++ u16 en;
++ u16 gpio;
++ u16 pol;
++ u16 on_cfg;
++ u16 blk_cfg;
++}AIR_BASE_T_LED_CFG_T;
++
++typedef enum
++{
++ AIR_LED_BLK_DUR_32M,
++ AIR_LED_BLK_DUR_64M,
++ AIR_LED_BLK_DUR_128M,
++ AIR_LED_BLK_DUR_256M,
++ AIR_LED_BLK_DUR_512M,
++ AIR_LED_BLK_DUR_1024M,
++ AIR_LED_BLK_DUR_LAST
++} AIR_LED_BLK_DUT_T;
++
++typedef enum
++{
++ AIR_ACTIVE_LOW,
++ AIR_ACTIVE_HIGH,
++} AIR_LED_POLARITY;
++typedef enum
++{
++ AIR_LED_MODE_DISABLE,
++ AIR_LED_MODE_USER_DEFINE,
++ AIR_LED_MODE_LAST
++} AIR_LED_MODE_T;
++
++/************************************************************************
++* F U N C T I O N P R O T O T Y P E S
++************************************************************************/
++
++unsigned long airoha_pbus_read(struct mii_dev *bus, int pbus_addr, int pbus_reg);
++int airoha_pbus_write(struct mii_dev *bus, int pbus_addr, int pbus_reg, unsigned long pbus_data);
++int airoha_phy_process(void);
++#endif /* __EN8801S_H */
+--- /dev/null
++++ b/drivers/net/phy/air_en8811h.c
+@@ -0,0 +1,725 @@
++// SPDX-License-Identifier: GPL-2.0
++/*************************************************
++ * FILE NAME: air_en8811h.c
++ * PURPOSE:
++ * EN8811H PHY Driver for Uboot
++ * NOTES:
++ *
++ * Copyright (C) 2023 Airoha Technology Corp.
++ *************************************************/
++
++/* INCLUDE FILE DECLARATIONS
++*/
++#include <common.h>
++#include <eth_phy.h>
++#include <phy.h>
++#include <errno.h>
++#include <malloc.h>
++#include <version.h>
++#include "air_en8811h.h"
++
++#ifdef CONFIG_PHY_AIROHA_FW_IN_UBI
++#include <ubi_uboot.h>
++#endif
++
++#ifdef CONFIG_PHY_AIROHA_FW_IN_MMC
++#include <mmc.h>
++#endif
++
++#ifdef CONFIG_PHY_AIROHA_FW_IN_MTD
++#include <mtd.h>
++#endif
++
++#if AIR_UBOOT_REVISION > 0x202004
++#include <linux/delay.h>
++#endif
++
++/**************************
++ * GPIO5 <-> BASE_T_LED0,
++ * GPIO4 <-> BASE_T_LED1,
++ * GPIO3 <-> BASE_T_LED2,
++ **************************/
++/* User-defined.B */
++#define AIR_LED_SUPPORT
++#ifdef AIR_LED_SUPPORT
++static const struct air_base_t_led_cfg_s led_cfg[3] = {
++/*********************************************************************
++ *Enable, GPIO, LED Polarity, LED ON, LED Blink
++**********************************************************************/
++ {1, AIR_LED0_GPIO5, AIR_ACTIVE_HIGH, AIR_LED0_ON, AIR_LED0_BLK},
++ {1, AIR_LED1_GPIO4, AIR_ACTIVE_HIGH, AIR_LED1_ON, AIR_LED1_BLK},
++ {1, AIR_LED2_GPIO3, AIR_ACTIVE_HIGH, AIR_LED2_ON, AIR_LED2_BLK},
++};
++static const u16 led_dur = UNIT_LED_BLINK_DURATION << AIR_LED_BLK_DUR_64M;
++#endif
++/* User-defined.E */
++/*************************************************************
++ * F U N C T I O N S
++ **************************************************************/
++/* Airoha MII read function */
++static int air_mii_cl22_read(struct mii_dev *bus, int phy_addr, int phy_register)
++{
++ int read_data = bus->read(bus, phy_addr, MDIO_DEVAD_NONE, phy_register);
++
++ if (read_data < 0)
++ return -EIO;
++ return read_data;
++}
++
++/* Airoha MII write function */
++static int air_mii_cl22_write(struct mii_dev *bus, int phy_addr, int phy_register, int write_data)
++{
++ int ret = 0;
++
++ ret = bus->write(bus, phy_addr, MDIO_DEVAD_NONE, phy_register, write_data);
++ if (ret < 0) {
++ printf("bus->write, ret: %d\n", ret);
++ return ret;
++ }
++ return ret;
++}
++
++static int air_mii_cl45_read(struct phy_device *phydev, int devad, u16 reg)
++{
++ int ret = 0;
++ int data;
++
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, MII_MMD_ACC_CTL_REG, devad);
++ if (ret < 0) {
++ printf("phy_write, ret: %d\n", ret);
++ return INVALID_DATA;
++ }
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, MII_MMD_ADDR_DATA_REG, reg);
++ if (ret < 0) {
++ printf("phy_write, ret: %d\n", ret);
++ return INVALID_DATA;
++ }
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, MII_MMD_ACC_CTL_REG, MMD_OP_MODE_DATA | devad);
++ if (ret < 0) {
++ printf("phy_write, ret: %d\n", ret);
++ return INVALID_DATA;
++ }
++ data = phy_read(phydev, MDIO_DEVAD_NONE, MII_MMD_ADDR_DATA_REG);
++ return data;
++}
++
++static int air_mii_cl45_write(struct phy_device *phydev, int devad, u16 reg, u16 write_data)
++{
++ int ret = 0;
++
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, MII_MMD_ACC_CTL_REG, devad);
++ if (ret < 0) {
++ printf("phy_write, ret: %d\n", ret);
++ return ret;
++ }
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, MII_MMD_ADDR_DATA_REG, reg);
++ if (ret < 0) {
++ printf("phy_write, ret: %d\n", ret);
++ return ret;
++ }
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, MII_MMD_ACC_CTL_REG, MMD_OP_MODE_DATA | devad);
++ if (ret < 0) {
++ printf("phy_write, ret: %d\n", ret);
++ return ret;
++ }
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, MII_MMD_ADDR_DATA_REG, write_data);
++ if (ret < 0) {
++ printf("phy_write, ret: %d\n", ret);
++ return ret;
++ }
++ return 0;
++}
++/* Use default PBUS_PHY_ID */
++/* EN8811H PBUS write function */
++static int air_pbus_reg_write(struct phy_device *phydev, unsigned long pbus_address, unsigned long pbus_data)
++{
++ int ret = 0;
++ struct mii_dev *mbus = phydev->bus;
++
++ ret = air_mii_cl22_write(mbus, ((phydev->addr) + 8), 0x1F, (unsigned int)(pbus_address >> 6));
++ if (ret < 0)
++ return ret;
++ ret = air_mii_cl22_write(mbus, ((phydev->addr) + 8), (unsigned int)((pbus_address >> 2) & 0xf), (unsigned int)(pbus_data & 0xFFFF));
++ if (ret < 0)
++ return ret;
++ ret = air_mii_cl22_write(mbus, ((phydev->addr) + 8), 0x10, (unsigned int)(pbus_data >> 16));
++ if (ret < 0)
++ return ret;
++ return 0;
++}
++
++/* EN8811H BUCK write function */
++static int air_buckpbus_reg_write(struct phy_device *phydev, unsigned long pbus_address, unsigned int pbus_data)
++{
++ int ret = 0;
++
++ /* page 4 */
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x1F, (unsigned int)4);
++ if (ret < 0) {
++ printf("phy_write, ret: %d\n", ret);
++ return ret;
++ }
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x10, (unsigned int)0);
++ if (ret < 0) {
++ printf("phy_write, ret: %d\n", ret);
++ return ret;
++ }
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x11, (unsigned int)((pbus_address >> 16) & 0xffff));
++ if (ret < 0) {
++ printf("phy_write, ret: %d\n", ret);
++ return ret;
++ }
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x12, (unsigned int)(pbus_address & 0xffff));
++ if (ret < 0) {
++ printf("phy_write, ret: %d\n", ret);
++ return ret;
++ }
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x13, (unsigned int)((pbus_data >> 16) & 0xffff));
++ if (ret < 0) {
++ printf("phy_write, ret: %d\n", ret);
++ return ret;
++ }
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x14, (unsigned int)(pbus_data & 0xffff));
++ if (ret < 0) {
++ printf("phy_write, ret: %d\n", ret);
++ return ret;
++ }
++ return 0;
++}
++
++/* EN8811H BUCK read function */
++static unsigned int air_buckpbus_reg_read(struct phy_device *phydev, unsigned long pbus_address)
++{
++ unsigned int pbus_data = 0, pbus_data_low, pbus_data_high;
++ int ret = 0;
++
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x1F, (unsigned int)4); /* page 4 */
++ if (ret < 0) {
++ printf("phy_write, ret: %d\n", ret);
++ return PBUS_INVALID_DATA;
++ }
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x10, (unsigned int)0);
++ if (ret < 0) {
++ printf("phy_write, ret: %d\n", ret);
++ return PBUS_INVALID_DATA;
++ }
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x15, (unsigned int)((pbus_address >> 16) & 0xffff));
++ if (ret < 0) {
++ printf("phy_write, ret: %d\n", ret);
++ return PBUS_INVALID_DATA;
++ }
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x16, (unsigned int)(pbus_address & 0xffff));
++ if (ret < 0) {
++ printf("phy_write, ret: %d\n", ret);
++ return PBUS_INVALID_DATA;
++ }
++
++ pbus_data_high = phy_read(phydev, MDIO_DEVAD_NONE, 0x17);
++ pbus_data_low = phy_read(phydev, MDIO_DEVAD_NONE, 0x18);
++ pbus_data = (pbus_data_high << 16) + pbus_data_low;
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x1F, (unsigned int)0);
++ if (ret < 0) {
++ printf("phy_write, ret: %d\n", ret);
++ return ret;
++ }
++ return pbus_data;
++}
++
++static int MDIOWriteBuf(struct phy_device *phydev, unsigned long address, unsigned long array_size, const unsigned char *buffer)
++{
++ unsigned int write_data, offset ;
++ int ret = 0;
++
++ /* page 4 */
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x1F, (unsigned int)4);
++ if (ret < 0) {
++ printf("phy_write, ret: %d\n", ret);
++ return ret;
++ }
++ /* address increment*/
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x10, (unsigned int)0x8000);
++ if (ret < 0) {
++ printf("phy_write, ret: %d\n", ret);
++ return ret;
++ }
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x11, (unsigned int)((address >> 16) & 0xffff));
++ if (ret < 0) {
++ printf("phy_write, ret: %d\n", ret);
++ return ret;
++ }
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x12, (unsigned int)(address & 0xffff));
++ if (ret < 0) {
++ printf("phy_write, ret: %d\n", ret);
++ return ret;
++ }
++
++ for (offset = 0; offset < array_size; offset += 4) {
++ write_data = (buffer[offset + 3] << 8) | buffer[offset + 2];
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x13, write_data);
++ if (ret < 0) {
++ printf("phy_write, ret: %d\n", ret);
++ return ret;
++ }
++ write_data = (buffer[offset + 1] << 8) | buffer[offset];
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x14, write_data);
++ if (ret < 0) {
++ printf("phy_write, ret: %d\n", ret);
++ return ret;
++ }
++ }
++ ret = phy_write(phydev, MDIO_DEVAD_NONE, 0x1F, (unsigned int)0);
++ if (ret < 0) {
++ printf("phy_write, ret: %d\n", ret);
++ return ret;
++ }
++ return 0;
++}
++
++#ifdef AIR_LED_SUPPORT
++static int airoha_led_set_usr_def(struct phy_device *phydev, u8 entity, int polar,
++ u16 on_evt, u16 blk_evt)
++{
++ int ret = 0;
++
++ if (AIR_ACTIVE_HIGH == polar)
++ on_evt |= LED_ON_POL;
++ else
++ on_evt &= ~LED_ON_POL;
++
++ ret = air_mii_cl45_write(phydev, 0x1f, LED_ON_CTRL(entity), on_evt | LED_ON_EN);
++ if (ret < 0)
++ return ret;
++ ret = air_mii_cl45_write(phydev, 0x1f, LED_BLK_CTRL(entity), blk_evt);
++ if (ret < 0)
++ return ret;
++ return 0;
++}
++
++static int airoha_led_set_mode(struct phy_device *phydev, u8 mode)
++{
++ u16 cl45_data;
++ int err = 0;
++
++ cl45_data = air_mii_cl45_read(phydev, 0x1f, LED_BCR);
++ switch (mode) {
++ case AIR_LED_MODE_DISABLE:
++ cl45_data &= ~LED_BCR_EXT_CTRL;
++ cl45_data &= ~LED_BCR_MODE_MASK;
++ cl45_data |= LED_BCR_MODE_DISABLE;
++ break;
++ case AIR_LED_MODE_USER_DEFINE:
++ cl45_data |= LED_BCR_EXT_CTRL;
++ cl45_data |= LED_BCR_CLK_EN;
++ break;
++ default:
++ printf("LED mode%d is not supported!\n", mode);
++ return -EINVAL;
++ }
++ err = air_mii_cl45_write(phydev, 0x1f, LED_BCR, cl45_data);
++ if (err < 0)
++ return err;
++ return 0;
++}
++
++static int airoha_led_set_state(struct phy_device *phydev, u8 entity, u8 state)
++{
++ u16 cl45_data;
++ int err;
++
++ cl45_data = air_mii_cl45_read(phydev, 0x1f, LED_ON_CTRL(entity));
++ if (LED_ENABLE == state)
++ cl45_data |= LED_ON_EN;
++ else
++ cl45_data &= ~LED_ON_EN;
++
++ err = air_mii_cl45_write(phydev, 0x1f, LED_ON_CTRL(entity), cl45_data);
++ if (err < 0)
++ return err;
++ return 0;
++}
++
++static int en8811h_led_init(struct phy_device *phydev)
++{
++ unsigned int led_gpio = 0, reg_value = 0;
++ u16 cl45_data = led_dur;
++ int ret, led_id;
++
++ cl45_data = UNIT_LED_BLINK_DURATION << AIR_LED_BLK_DUR_64M;
++ ret = air_mii_cl45_write(phydev, 0x1f, LED_BLK_DUR, cl45_data);
++ if (ret < 0)
++ return ret;
++ cl45_data >>= 1;
++ ret = air_mii_cl45_write(phydev, 0x1f, LED_ON_DUR, cl45_data);
++ if (ret < 0)
++ return ret;
++
++ ret = airoha_led_set_mode(phydev, AIR_LED_MODE_USER_DEFINE);
++ if (ret != 0) {
++ printf("LED fail to set mode, ret %d !\n", ret);
++ return ret;
++ }
++ for(led_id = 0; led_id < EN8811H_LED_COUNT; led_id++)
++ {
++ /* LED0 <-> GPIO5, LED1 <-> GPIO4, LED0 <-> GPIO3 */
++ if ( led_cfg[led_id].gpio != (led_id + (AIR_LED0_GPIO5 - (2 * led_id)))) {
++ printf("LED%d uses incorrect GPIO%d !\n", led_id, led_cfg[led_id].gpio);
++ return -EINVAL;
++ }
++ reg_value = 0;
++ if (led_cfg[led_id].en == LED_ENABLE)
++ {
++ led_gpio |= BIT(led_cfg[led_id].gpio);
++ ret = airoha_led_set_state(phydev, led_id, led_cfg[led_id].en);
++ if (ret != 0) {
++ printf("LED fail to set state, ret %d !\n", ret);
++ return ret;
++ }
++ ret = airoha_led_set_usr_def(phydev, led_id, led_cfg[led_id].pol, led_cfg[led_id].on_cfg, led_cfg[led_id].blk_cfg);
++ if (ret != 0) {
++ printf("LED fail to set default, ret %d !\n", ret);
++ return ret;
++ }
++ }
++ }
++ ret = air_buckpbus_reg_write(phydev, 0xcf8b8, led_gpio);
++ if (ret < 0)
++ return ret;
++ printf("LED initialize OK !\n");
++ return 0;
++}
++#endif /* AIR_LED_SUPPORT */
++
++static char *firmware_buf;
++static int en8811h_load_firmware(struct phy_device *phydev)
++{
++ u32 pbus_value;
++ int ret = 0;
++
++ if (!firmware_buf) {
++ firmware_buf = malloc(EN8811H_MD32_DM_SIZE + EN8811H_MD32_DSP_SIZE);
++ if (!firmware_buf) {
++ printf("[Airoha] cannot allocated buffer for firmware.\n");
++ return -ENOMEM;
++ }
++
++#ifdef CONFIG_PHY_AIROHA_FW_IN_UBI
++ ret = ubi_volume_read("en8811h-fw", firmware_buf, EN8811H_MD32_DM_SIZE + EN8811H_MD32_DSP_SIZE);
++ if (ret) {
++ printf("[Airoha] read firmware from UBI failed.\n");
++ free(firmware_buf);
++ firmware_buf = NULL;
++ return ret;
++ }
++#elif defined(CONFIG_PHY_AIROHA_FW_IN_MMC)
++ struct mmc *mmc = find_mmc_device(0);
++ if (!mmc) {
++ printf("[Airoha] opening MMC device failed.\n");
++ free(firmware_buf);
++ firmware_buf = NULL;
++ return -ENODEV;
++ }
++ if (mmc_init(mmc)) {
++ printf("[Airoha] initializing MMC device failed.\n");
++ free(firmware_buf);
++ firmware_buf = NULL;
++ return -ENODEV;
++ }
++ if (IS_SD(mmc)) {
++ printf("[Airoha] SD card is not supported.\n");
++ free(firmware_buf);
++ firmware_buf = NULL;
++ return -EINVAL;
++ }
++ ret = mmc_set_part_conf(mmc, 1, 2, 2);
++ if (ret) {
++ printf("[Airoha] cannot access eMMC boot1 hw partition.\n");
++ free(firmware_buf);
++ firmware_buf = NULL;
++ return ret;
++ }
++ ret = blk_dread(mmc_get_blk_desc(mmc), 0, 0x120, firmware_buf);
++ mmc_set_part_conf(mmc, 1, 1, 0);
++ if (ret != 0x120) {
++ printf("[Airoha] cannot read firmware from eMMC.\n");
++ free(firmware_buf);
++ firmware_buf = NULL;
++ return -EIO;
++ }
++#else
++#warning EN8811H firmware loading not implemented
++ free(firmware_buf);
++ firmware_buf = NULL;
++ return -EOPNOTSUPP;
++#endif
++ }
++
++ ret = air_buckpbus_reg_write(phydev, 0x0f0018, 0x0);
++ if (ret < 0)
++ return ret;
++ pbus_value = air_buckpbus_reg_read(phydev, 0x800000);
++ pbus_value |= BIT(11);
++ ret = air_buckpbus_reg_write(phydev, 0x800000, pbus_value);
++ if (ret < 0)
++ return ret;
++ /* Download DM */
++ ret = MDIOWriteBuf(phydev, 0x00000000, EN8811H_MD32_DM_SIZE, firmware_buf);
++ if (ret < 0) {
++ printf("[Airoha] MDIOWriteBuf 0x00000000 fail.\n");
++ return ret;
++ }
++ /* Download PM */
++ ret = MDIOWriteBuf(phydev, 0x00100000, EN8811H_MD32_DSP_SIZE, firmware_buf + EN8811H_MD32_DM_SIZE);
++ if (ret < 0) {
++ printf("[Airoha] MDIOWriteBuf 0x00100000 fail.\n");
++ return ret;
++ }
++ pbus_value = air_buckpbus_reg_read(phydev, 0x800000);
++ pbus_value &= ~BIT(11);
++ ret = air_buckpbus_reg_write(phydev, 0x800000, pbus_value);
++ if (ret < 0)
++ return ret;
++ ret = air_buckpbus_reg_write(phydev, 0x0f0018, 0x01);
++ if (ret < 0)
++ return ret;
++ return 0;
++}
++
++static int en8811h_config(struct phy_device *phydev)
++{
++ int ret = 0;
++ int pid1 = 0, pid2 = 0;
++
++ ret = air_pbus_reg_write(phydev, 0xcf928 , 0x0);
++ if (ret < 0)
++ return ret;
++
++ pid1 = phy_read(phydev, MDIO_DEVAD_NONE, MII_PHYSID1);
++ pid2 = phy_read(phydev, MDIO_DEVAD_NONE, MII_PHYSID2);
++ if ((EN8811H_PHY_ID1 != pid1) || (EN8811H_PHY_ID2 != pid2)) {
++ printf("EN8811H does not exist !\n");
++ return -ENODEV;
++ }
++
++ return 0;
++}
++
++static int en8811h_get_autonego(struct phy_device *phydev, int *an)
++{
++ int reg;
++ reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);
++ if (reg < 0)
++ return -EINVAL;
++ if (reg & BMCR_ANENABLE)
++ *an = AUTONEG_ENABLE;
++ else
++ *an = AUTONEG_DISABLE;
++ return 0;
++}
++
++static int en8811h_startup(struct phy_device *phydev)
++{
++ ofnode node = phy_get_ofnode(phydev);
++ int ret = 0, lpagb = 0, lpa = 0, common_adv_gb = 0, common_adv = 0, advgb = 0, adv = 0, reg = 0, an = AUTONEG_DISABLE, bmcr = 0, reg_value;
++ int old_link = phydev->link;
++ u32 pbus_value = 0, retry;
++
++ eth_phy_reset(phydev->dev, 1);
++ mdelay(10);
++ eth_phy_reset(phydev->dev, 0);
++ mdelay(1);
++
++ ret = en8811h_load_firmware(phydev);
++ if (ret) {
++ printf("EN8811H load firmware fail.\n");
++ return ret;
++ }
++ retry = MAX_RETRY;
++ do {
++ mdelay(300);
++ reg_value = air_mii_cl45_read(phydev, 0x1e, 0x8009);
++ if (EN8811H_PHY_READY == reg_value) {
++ printf("EN8811H PHY ready!\n");
++ break;
++ }
++ retry--;
++ } while (retry);
++ if (0 == retry) {
++ printf("EN8811H PHY is not ready. (MD32 FW Status reg: 0x%x)\n", reg_value);
++ pbus_value = air_buckpbus_reg_read(phydev, 0x3b3c);
++ printf("Check MD32 FW Version(0x3b3c) : %08x\n", pbus_value);
++ printf("EN8811H initialize fail!\n");
++ return 0;
++ }
++ /* Mode selection*/
++ printf("EN8811H Mode 1 !\n");
++ ret = air_mii_cl45_write(phydev, 0x1e, 0x800c, 0x0);
++ if (ret < 0)
++ return ret;
++ ret = air_mii_cl45_write(phydev, 0x1e, 0x800d, 0x0);
++ if (ret < 0)
++ return ret;
++ ret = air_mii_cl45_write(phydev, 0x1e, 0x800e, 0x1101);
++ if (ret < 0)
++ return ret;
++ ret = air_mii_cl45_write(phydev, 0x1e, 0x800f, 0x0002);
++ if (ret < 0)
++ return ret;
++
++ /* Serdes polarity */
++ pbus_value = air_buckpbus_reg_read(phydev, 0xca0f8);
++ pbus_value &= 0xfffffffc;
++ pbus_value |= ofnode_read_bool(node, "airoha,rx-pol-reverse") ?
++ EN8811H_RX_POLARITY_REVERSE : EN8811H_RX_POLARITY_NORMAL;
++ pbus_value |= ofnode_read_bool(node, "airoha,tx-pol-reverse") ?
++ EN8811H_TX_POLARITY_REVERSE : EN8811H_TX_POLARITY_NORMAL;
++ ret = air_buckpbus_reg_write(phydev, 0xca0f8, pbus_value);
++ if (ret < 0)
++ return ret;
++ pbus_value = air_buckpbus_reg_read(phydev, 0xca0f8);
++ printf("Tx, Rx Polarity(0xca0f8): %08x\n", pbus_value);
++ pbus_value = air_buckpbus_reg_read(phydev, 0x3b3c);
++ printf("MD32 FW Version(0x3b3c) : %08x\n", pbus_value);
++#if defined(AIR_LED_SUPPORT)
++ ret = en8811h_led_init(phydev);
++ if (ret < 0) {
++ printf("en8811h_led_init fail\n");
++ }
++#endif
++ printf("EN8811H initialize OK ! (%s)\n", EN8811H_DRIVER_VERSION);
++
++ ret = genphy_update_link(phydev);
++ if (ret)
++ {
++ printf("ret %d!\n", ret);
++ return ret;
++ }
++
++ ret = genphy_parse_link(phydev);
++ if (ret)
++ {
++ printf("ret %d!\n", ret);
++ return ret;
++ }
++
++ if (old_link && phydev->link)
++ return 0;
++
++ phydev->speed = SPEED_100;
++ phydev->duplex = DUPLEX_FULL;
++ phydev->pause = 0;
++ phydev->asym_pause = 0;
++
++ reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR);
++ if (reg < 0)
++ {
++ printf("MII_BMSR reg %d!\n", reg);
++ return reg;
++ }
++ reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR);
++ if (reg < 0)
++ {
++ printf("MII_BMSR reg %d!\n", reg);
++ return reg;
++ }
++ if(reg & BMSR_LSTATUS)
++ {
++ pbus_value = air_buckpbus_reg_read(phydev, 0x109D4);
++ if (0x10 & pbus_value) {
++ phydev->speed = SPEED_2500;
++ phydev->duplex = DUPLEX_FULL;
++ }
++ else
++ {
++ ret = en8811h_get_autonego(phydev, &an);
++ if ((AUTONEG_ENABLE == an) && (0 == ret))
++ {
++ printf("AN mode!\n");
++ printf("SPEED 1000/100!\n");
++ lpagb = phy_read(phydev, MDIO_DEVAD_NONE, MII_STAT1000);
++ if (lpagb < 0 )
++ return lpagb;
++ advgb = phy_read(phydev, MDIO_DEVAD_NONE, MII_CTRL1000);
++ if (adv < 0 )
++ return adv;
++ common_adv_gb = (lpagb & (advgb << 2));
++
++ lpa = phy_read(phydev, MDIO_DEVAD_NONE, MII_LPA);
++ if (lpa < 0 )
++ return lpa;
++ adv = phy_read(phydev, MDIO_DEVAD_NONE, MII_ADVERTISE);
++ if (adv < 0 )
++ return adv;
++ common_adv = (lpa & adv);
++
++ phydev->speed = SPEED_10;
++ phydev->duplex = DUPLEX_HALF;
++ if (common_adv_gb & (LPA_1000FULL | LPA_1000HALF))
++ {
++ phydev->speed = SPEED_1000;
++ if (common_adv_gb & LPA_1000FULL)
++
++ phydev->duplex = DUPLEX_FULL;
++ }
++ else if (common_adv & (LPA_100FULL | LPA_100HALF))
++ {
++ phydev->speed = SPEED_100;
++ if (common_adv & LPA_100FULL)
++ phydev->duplex = DUPLEX_FULL;
++ }
++ else
++ {
++ if (common_adv & LPA_10FULL)
++ phydev->duplex = DUPLEX_FULL;
++ }
++ }
++ else
++ {
++ printf("Force mode!\n");
++ bmcr = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);
++
++ if (bmcr < 0)
++ return bmcr;
++
++ if (bmcr & BMCR_FULLDPLX)
++ phydev->duplex = DUPLEX_FULL;
++ else
++ phydev->duplex = DUPLEX_HALF;
++
++ if (bmcr & BMCR_SPEED1000)
++ phydev->speed = SPEED_1000;
++ else if (bmcr & BMCR_SPEED100)
++ phydev->speed = SPEED_100;
++ else
++ phydev->speed = SPEED_100;
++ }
++ }
++ }
++
++ return ret;
++}
++
++#if AIR_UBOOT_REVISION > 0x202303
++U_BOOT_PHY_DRIVER(en8811h) = {
++ .name = "Airoha EN8811H",
++ .uid = EN8811H_PHY_ID,
++ .mask = 0x0ffffff0,
++ .config = &en8811h_config,
++ .startup = &en8811h_startup,
++ .shutdown = &genphy_shutdown,
++};
++#else
++static struct phy_driver AIR_EN8811H_driver = {
++ .name = "Airoha EN8811H",
++ .uid = EN8811H_PHY_ID,
++ .mask = 0x0ffffff0,
++ .config = &en8811h_config,
++ .startup = &en8811h_startup,
++ .shutdown = &genphy_shutdown,
++};
++
++int phy_air_en8811h_init(void)
++{
++ phy_register(&AIR_EN8811H_driver);
++ return 0;
++}
++#endif
+--- /dev/null
++++ b/drivers/net/phy/air_en8811h.h
+@@ -0,0 +1,163 @@
++/* SPDX-License-Identifier: GPL-2.0 */
++/*************************************************
++ * FILE NAME: air_en8811h.h
++ * PURPOSE:
++ * EN8811H PHY Driver for Uboot
++ * NOTES:
++ *
++ * Copyright (C) 2023 Airoha Technology Corp.
++ *************************************************/
++
++#ifndef __EN8811H_H
++#define __EN8811H_H
++
++#define AIR_UBOOT_REVISION ((((U_BOOT_VERSION_NUM / 1000) % 10) << 20) | \
++ (((U_BOOT_VERSION_NUM / 100) % 10) << 16) | \
++ (((U_BOOT_VERSION_NUM / 10) % 10) << 12) | \
++ ((U_BOOT_VERSION_NUM % 10) << 8) | \
++ (((U_BOOT_VERSION_NUM_PATCH / 10) % 10) << 4) | \
++ ((U_BOOT_VERSION_NUM_PATCH % 10) << 0))
++
++#define EN8811H_PHY_ID1 0x03a2
++#define EN8811H_PHY_ID2 0xa411
++#define EN8811H_PHY_ID ((EN8811H_PHY_ID1 << 16) | EN8811H_PHY_ID2)
++#define EN8811H_SPEED_2500 0x03
++#define EN8811H_PHY_READY 0x02
++#define MAX_RETRY 5
++
++#define EN8811H_MD32_DM_SIZE 0x4000
++#define EN8811H_MD32_DSP_SIZE 0x20000
++
++#define EN8811H_TX_POLARITY_NORMAL 0x1
++#define EN8811H_TX_POLARITY_REVERSE 0x0
++
++#define EN8811H_RX_POLARITY_NORMAL (0x0 << 1)
++#define EN8811H_RX_POLARITY_REVERSE (0x1 << 1)
++
++#ifndef BIT
++#define BIT(nr) (1UL << (nr))
++#endif
++
++/* CL45 MDIO control */
++#define MII_MMD_ACC_CTL_REG 0x0d
++#define MII_MMD_ADDR_DATA_REG 0x0e
++#define MMD_OP_MODE_DATA BIT(14)
++/* MultiGBASE-T AN register */
++#define MULTIG_ANAR_2500M (0x0080)
++#define MULTIG_LPAR_2500M (0x0020)
++
++#define EN8811H_DRIVER_VERSION "v1.0.4"
++
++/************************************************************
++ * For reference only
++ * LED0 Link 2500/Blink 2500 TxRx (GPIO5) <-> BASE_T_LED0,
++ * LED1 Link 1000/Blink 1000 TxRx (GPIO4) <-> BASE_T_LED1,
++ * LED2 Link 100/Blink 100 TxRx (GPIO3) <-> BASE_T_LED2,
++ ************************************************************/
++/* User-defined.B */
++#define AIR_LED0_ON (LED_ON_EVT_LINK_2500M)
++#define AIR_LED0_BLK (LED_BLK_EVT_2500M_TX_ACT | LED_BLK_EVT_2500M_RX_ACT)
++#define AIR_LED1_ON (LED_ON_EVT_LINK_1000M)
++#define AIR_LED1_BLK (LED_BLK_EVT_1000M_TX_ACT | LED_BLK_EVT_1000M_RX_ACT)
++#define AIR_LED2_ON (LED_ON_EVT_LINK_100M)
++#define AIR_LED2_BLK (LED_BLK_EVT_100M_TX_ACT | LED_BLK_EVT_100M_RX_ACT)
++/* User-defined.E */
++
++#define LED_ON_CTRL(i) (0x024 + ((i)*2))
++#define LED_ON_EN (1 << 15)
++#define LED_ON_POL (1 << 14)
++#define LED_ON_EVT_MASK (0x1ff)
++/* LED ON Event Option.B */
++#define LED_ON_EVT_LINK_2500M (1 << 8)
++#define LED_ON_EVT_FORCE (1 << 6)
++#define LED_ON_EVT_HDX (1 << 5)
++#define LED_ON_EVT_FDX (1 << 4)
++#define LED_ON_EVT_LINK_DOWN (1 << 3)
++#define LED_ON_EVT_LINK_100M (1 << 1)
++#define LED_ON_EVT_LINK_1000M (1 << 0)
++/* LED ON Event Option.E */
++
++#define LED_BLK_CTRL(i) (0x025 + ((i)*2))
++#define LED_BLK_EVT_MASK (0xfff)
++/* LED Blinking Event Option.B*/
++#define LED_BLK_EVT_2500M_RX_ACT (1 << 11)
++#define LED_BLK_EVT_2500M_TX_ACT (1 << 10)
++#define LED_BLK_EVT_FORCE (1 << 9)
++#define LED_BLK_EVT_100M_RX_ACT (1 << 3)
++#define LED_BLK_EVT_100M_TX_ACT (1 << 2)
++#define LED_BLK_EVT_1000M_RX_ACT (1 << 1)
++#define LED_BLK_EVT_1000M_TX_ACT (1 << 0)
++/* LED Blinking Event Option.E*/
++#define LED_ENABLE 1
++#define LED_DISABLE 0
++
++#define EN8811H_LED_COUNT 3
++
++#define LED_BCR (0x021)
++#define LED_BCR_EXT_CTRL (1 << 15)
++#define LED_BCR_CLK_EN (1 << 3)
++#define LED_BCR_TIME_TEST (1 << 2)
++#define LED_BCR_MODE_MASK (3)
++#define LED_BCR_MODE_DISABLE (0)
++#define LED_BCR_MODE_2LED (1)
++#define LED_BCR_MODE_3LED_1 (2)
++#define LED_BCR_MODE_3LED_2 (3)
++
++#define LED_ON_DUR (0x022)
++#define LED_ON_DUR_MASK (0xffff)
++
++#define LED_BLK_DUR (0x023)
++#define LED_BLK_DUR_MASK (0xffff)
++
++#define LED_GPIO_SEL_MASK 0x7FFFFFF
++
++#define UNIT_LED_BLINK_DURATION 1024
++
++#define INVALID_DATA 0xffff
++#define PBUS_INVALID_DATA 0xffffffff
++
++struct air_base_t_led_cfg_s {
++ u16 en;
++ u16 gpio;
++ u16 pol;
++ u16 on_cfg;
++ u16 blk_cfg;
++};
++
++enum {
++ AIR_LED2_GPIO3 = 3,
++ AIR_LED1_GPIO4,
++ AIR_LED0_GPIO5,
++ AIR_LED_LAST
++};
++
++enum {
++ AIR_BASE_T_LED0,
++ AIR_BASE_T_LED1,
++ AIR_BASE_T_LED2,
++ AIR_BASE_T_LED3
++};
++
++enum {
++ AIR_LED_BLK_DUR_32M,
++ AIR_LED_BLK_DUR_64M,
++ AIR_LED_BLK_DUR_128M,
++ AIR_LED_BLK_DUR_256M,
++ AIR_LED_BLK_DUR_512M,
++ AIR_LED_BLK_DUR_1024M,
++ AIR_LED_BLK_DUR_LAST
++};
++
++enum {
++ AIR_ACTIVE_LOW,
++ AIR_ACTIVE_HIGH,
++};
++
++enum {
++ AIR_LED_MODE_DISABLE,
++ AIR_LED_MODE_USER_DEFINE,
++ AIR_LED_MODE_LAST
++};
++
++#endif /* End of __EN8811H_MD32_H */
++
+--- a/drivers/net/eth-phy-uclass.c
++++ b/drivers/net/eth-phy-uclass.c
+@@ -155,7 +155,7 @@ static int eth_phy_of_to_plat(struct ude
+ return 0;
+ }
+
+-static void eth_phy_reset(struct udevice *dev, int value)
++void eth_phy_reset(struct udevice *dev, int value)
+ {
+ struct eth_phy_device_priv *uc_priv = dev_get_uclass_priv(dev);
+ u32 delay;
+--- a/include/eth_phy.h
++++ b/include/eth_phy.h
+@@ -14,5 +14,6 @@ int eth_phy_binds_nodes(struct udevice *
+ int eth_phy_set_mdio_bus(struct udevice *eth_dev, struct mii_dev *mdio_bus);
+ struct mii_dev *eth_phy_get_mdio_bus(struct udevice *eth_dev);
+ int eth_phy_get_addr(struct udevice *dev);
++void eth_phy_reset(struct udevice *dev, int value);
+
+ #endif
diff --git a/package/boot/uboot-mediatek/patches/200-cmd-add-imsz-and-imszb.patch b/package/boot/uboot-mediatek/patches/200-cmd-add-imsz-and-imszb.patch
index a96345e6fe6..28175e02e87 100644
--- a/package/boot/uboot-mediatek/patches/200-cmd-add-imsz-and-imszb.patch
+++ b/package/boot/uboot-mediatek/patches/200-cmd-add-imsz-and-imszb.patch
@@ -1,9 +1,10 @@
--- a/cmd/bootm.c
+++ b/cmd/bootm.c
-@@ -228,6 +228,65 @@ U_BOOT_CMD(
+@@ -245,6 +245,67 @@ U_BOOT_CMD(
/* iminfo - print header info for a requested image */
/*******************************************************************/
#if defined(CONFIG_CMD_IMI)
++#if defined(CONFIG_FIT)
+#define SECTOR_SHIFT 9
+static int image_totalsize(struct cmd_tbl *cmdtp, int flag, int argc,
+ char *const argv[], short int in_blocks)
@@ -63,12 +64,13 @@
+ "addr [maxhdrlen] [varname]\n"
+);
+
++#endif
static int do_iminfo(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
---- a/common/image-fit.c
-+++ b/common/image-fit.c
-@@ -1970,6 +1970,51 @@ static const char *fit_get_image_type_pr
+--- a/boot/image-fit.c
++++ b/boot/image-fit.c
+@@ -2051,6 +2051,47 @@ static const char *fit_get_image_type_pr
return "unknown";
}
@@ -87,16 +89,12 @@
+
+ hdrsize = fdt_totalsize(fit);
+
-+ /* simple FIT with internal images */
-+ if (hdrsize > 0x1000)
-+ return hdrsize;
++ /* take care of simple FIT with internal images */
++ max_size = hdrsize;
+
+ images_noffset = fdt_path_offset(fit, FIT_IMAGES_PATH);
-+ if (images_noffset < 0) {
-+ printf("Can't find images parent node '%s' (%s)\n",
-+ FIT_IMAGES_PATH, fdt_strerror(images_noffset));
-+ return 0;
-+ }
++ if (images_noffset < 0)
++ goto out;
+
+ for (ndepth = 0,
+ noffset = fdt_next_node(fit, images_noffset, &ndepth);
@@ -105,7 +103,7 @@
+ if (ndepth == 1) {
+ ret = fit_image_get_data_and_size(fit, noffset, &data, &data_size);
+ if (ret)
-+ return 0;
++ goto out;
+
+ img_total = data_size + (data - fit);
+
@@ -113,16 +111,16 @@
+ }
+ }
+
++out:
+ return max_size;
+}
+
-+
- int fit_image_load(bootm_headers_t *images, ulong addr,
+ int fit_image_load(struct bootm_headers *images, ulong addr,
const char **fit_unamep, const char **fit_uname_configp,
- int arch, int image_type, int bootstage_id,
+ int arch, int ph_type, int bootstage_id,
--- a/include/image.h
+++ b/include/image.h
-@@ -1041,6 +1041,7 @@ int fit_parse_subimage(const char *spec,
+@@ -1049,6 +1049,7 @@ int fit_parse_subimage(const char *spec,
ulong *addr, const char **image_name);
int fit_get_subimage_count(const void *fit, int images_noffset);
diff --git a/package/boot/uboot-mediatek/patches/210-cmd-bootmenu-add-ability-to-select-item-by-shortkey.patch b/package/boot/uboot-mediatek/patches/210-cmd-bootmenu-add-ability-to-select-item-by-shortkey.patch
deleted file mode 100644
index 82d97f756c3..00000000000
--- a/package/boot/uboot-mediatek/patches/210-cmd-bootmenu-add-ability-to-select-item-by-shortkey.patch
+++ /dev/null
@@ -1,192 +0,0 @@
-From 26d4e2e58bf0007db74b47c783785c3305ea1fa0 Mon Sep 17 00:00:00 2001
-From: Weijie Gao <weijie.gao@mediatek.com>
-Date: Tue, 19 Jan 2021 10:58:48 +0800
-Subject: [PATCH 17/23] cmd: bootmenu: add ability to select item by shortkey
-
-Add ability to use shortkey to select item for bootmenu command
-
-Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
----
- cmd/bootmenu.c | 77 +++++++++++++++++++++++++++++++++++++++++++++-----
- 1 file changed, 70 insertions(+), 7 deletions(-)
-
---- a/cmd/bootmenu.c
-+++ b/cmd/bootmenu.c
-@@ -11,6 +11,7 @@
- #include <menu.h>
- #include <watchdog.h>
- #include <malloc.h>
-+#include <linux/ctype.h>
- #include <linux/delay.h>
- #include <linux/string.h>
-
-@@ -38,6 +39,7 @@ struct bootmenu_data {
- int active; /* active menu entry */
- int count; /* total count of menu entries */
- struct bootmenu_entry *first; /* first menu entry */
-+ bool last_choiced;
- };
-
- enum bootmenu_key {
-@@ -46,8 +48,27 @@ enum bootmenu_key {
- KEY_DOWN,
- KEY_SELECT,
- KEY_QUIT,
-+ KEY_CHOICE,
- };
-
-+static const char choice_chars[] = {
-+ '1', '2', '3', '4', '5', '6', '7', '8', '9',
-+ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
-+ 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
-+ 'u', 'v', 'w', 'x', 'y', 'z'
-+};
-+
-+static int find_choice(char choice)
-+{
-+ int i;
-+
-+ for (i = 0; i < ARRAY_SIZE(choice_chars); i++)
-+ if (tolower(choice) == choice_chars[i])
-+ return i;
-+
-+ return -1;
-+}
-+
- static char *bootmenu_getoption(unsigned short int n)
- {
- char name[MAX_ENV_SIZE];
-@@ -82,7 +103,7 @@ static void bootmenu_print_entry(void *d
- }
-
- static void bootmenu_autoboot_loop(struct bootmenu_data *menu,
-- enum bootmenu_key *key, int *esc)
-+ enum bootmenu_key *key, int *esc, int *choice)
- {
- int i, c;
-
-@@ -115,6 +136,19 @@ static void bootmenu_autoboot_loop(struc
- break;
- default:
- *key = KEY_NONE;
-+ if (*esc)
-+ break;
-+
-+ *choice = find_choice(c);
-+ if ((*choice >= 0 &&
-+ *choice < menu->count - 1)) {
-+ *key = KEY_CHOICE;
-+ } else if (c == '0') {
-+ *choice = menu->count - 1;
-+ *key = KEY_CHOICE;
-+ } else {
-+ *key = KEY_NONE;
-+ }
- break;
- }
-
-@@ -136,10 +170,16 @@ static void bootmenu_autoboot_loop(struc
- }
-
- static void bootmenu_loop(struct bootmenu_data *menu,
-- enum bootmenu_key *key, int *esc)
-+ enum bootmenu_key *key, int *esc, int *choice)
- {
- int c;
-
-+ if (menu->last_choiced) {
-+ menu->last_choiced = false;
-+ *key = KEY_SELECT;
-+ return;
-+ }
-+
- if (*esc == 1) {
- if (tstc()) {
- c = getchar();
-@@ -165,6 +205,14 @@ static void bootmenu_loop(struct bootmen
- if (c == '\e') {
- *esc = 1;
- *key = KEY_NONE;
-+ } else {
-+ *choice = find_choice(c);
-+ if ((*choice >= 0 && *choice < menu->count - 1)) {
-+ *key = KEY_CHOICE;
-+ } else if (c == '0') {
-+ *choice = menu->count - 1;
-+ *key = KEY_CHOICE;
-+ }
- }
- break;
- case 1:
-@@ -216,16 +264,17 @@ static char *bootmenu_choice_entry(void
- struct bootmenu_data *menu = data;
- struct bootmenu_entry *iter;
- enum bootmenu_key key = KEY_NONE;
-+ int choice = -1;
- int esc = 0;
- int i;
-
- while (1) {
- if (menu->delay >= 0) {
- /* Autoboot was not stopped */
-- bootmenu_autoboot_loop(menu, &key, &esc);
-+ bootmenu_autoboot_loop(menu, &key, &esc, &choice);
- } else {
- /* Some key was pressed, so autoboot was stopped */
-- bootmenu_loop(menu, &key, &esc);
-+ bootmenu_loop(menu, &key, &esc, &choice);
- }
-
- switch (key) {
-@@ -239,6 +288,12 @@ static char *bootmenu_choice_entry(void
- ++menu->active;
- /* no menu key selected, regenerate menu */
- return NULL;
-+ case KEY_CHOICE:
-+ menu->active = choice;
-+ if (!menu->last_choiced) {
-+ menu->last_choiced = true;
-+ return NULL;
-+ }
- case KEY_SELECT:
- iter = menu->first;
- for (i = 0; i < menu->active; ++i)
-@@ -294,6 +349,7 @@ static struct bootmenu_data *bootmenu_cr
- menu->delay = delay;
- menu->active = 0;
- menu->first = NULL;
-+ menu->last_choiced = false;
-
- default_str = env_get("bootmenu_default");
- if (default_str)
-@@ -311,12 +367,19 @@ static struct bootmenu_data *bootmenu_cr
- goto cleanup;
-
- len = sep-option;
-- entry->title = malloc(len + 1);
-+ entry->title = malloc(len + 4);
- if (!entry->title) {
- free(entry);
- goto cleanup;
- }
-- memcpy(entry->title, option, len);
-+
-+ if (i < ARRAY_SIZE(choice_chars)) {
-+ len = sprintf(entry->title, "%c. %.*s", choice_chars[i],
-+ len, option);
-+ } else {
-+ len = sprintf(entry->title, " %.*s", len, option);
-+ }
-+
- entry->title[len] = 0;
-
- len = strlen(sep + 1);
-@@ -353,7 +416,7 @@ static struct bootmenu_data *bootmenu_cr
- if (!entry)
- goto cleanup;
-
-- entry->title = strdup("U-Boot console");
-+ entry->title = strdup("0. U-Boot console");
- if (!entry->title) {
- free(entry);
- goto cleanup;
diff --git a/package/boot/uboot-mediatek/patches/211-cmd-bootmenu-custom-title.patch b/package/boot/uboot-mediatek/patches/211-cmd-bootmenu-custom-title.patch
index 3f98f13c6e1..a99b77be083 100644
--- a/package/boot/uboot-mediatek/patches/211-cmd-bootmenu-custom-title.patch
+++ b/package/boot/uboot-mediatek/patches/211-cmd-bootmenu-custom-title.patch
@@ -1,19 +1,10 @@
--- a/cmd/bootmenu.c
+++ b/cmd/bootmenu.c
-@@ -39,6 +39,7 @@ struct bootmenu_data {
- int active; /* active menu entry */
- int count; /* total count of menu entries */
- struct bootmenu_entry *first; /* first menu entry */
-+ char *mtitle; /* custom menu title */
- bool last_choiced;
- };
-
-@@ -471,7 +472,12 @@ static void menu_display_statusline(stru
+@@ -452,7 +452,11 @@ static void menu_display_statusline(stru
printf(ANSI_CURSOR_POSITION, 1, 1);
puts(ANSI_CLEAR_LINE);
- printf(ANSI_CURSOR_POSITION, 2, 1);
-- puts(" *** U-Boot Boot Menu ***");
-+
+ printf(ANSI_CURSOR_POSITION, 2, 3);
+- puts("*** U-Boot Boot Menu ***");
+ if (menu->mtitle)
+ puts(menu->mtitle);
+ else
@@ -22,11 +13,21 @@
puts(ANSI_CLEAR_LINE_TO_END);
printf(ANSI_CURSOR_POSITION, 3, 1);
puts(ANSI_CLEAR_LINE);
-@@ -525,6 +531,7 @@ static void bootmenu_show(int delay)
- return;
+@@ -537,6 +541,7 @@ static enum bootmenu_ret bootmenu_show(i
+ return BOOTMENU_RET_FAIL;
}
+ bootmenu->mtitle = env_get("bootmenu_title");
for (iter = bootmenu->first; iter; iter = iter->next) {
- if (!menu_item_add(menu, iter->key, iter))
+ if (menu_item_add(menu, iter->key, iter) != 1)
goto cleanup;
+--- a/include/menu.h
++++ b/include/menu.h
+@@ -45,6 +45,7 @@ struct bootmenu_data {
+ int active; /* active menu entry */
+ int count; /* total count of menu entries */
+ struct bootmenu_entry *first; /* first menu entry */
++ char *mtitle; /* custom menu title */
+ bool last_choiced;
+ };
+
diff --git a/package/boot/uboot-mediatek/patches/220-cmd-env-readmem.patch b/package/boot/uboot-mediatek/patches/220-cmd-env-readmem.patch
index 00143ccaea6..7bf87ef7b5a 100644
--- a/package/boot/uboot-mediatek/patches/220-cmd-env-readmem.patch
+++ b/package/boot/uboot-mediatek/patches/220-cmd-env-readmem.patch
@@ -1,6 +1,6 @@
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
-@@ -472,6 +472,12 @@ config CMD_ENV_EXISTS
+@@ -622,6 +622,12 @@ config CMD_ENV_EXISTS
Check if a variable is defined in the environment for use in
shell scripting.
@@ -15,7 +15,7 @@
help
--- a/cmd/nvedit.c
+++ b/cmd/nvedit.c
-@@ -473,6 +473,60 @@ int do_env_ask(struct cmd_tbl *cmdtp, in
+@@ -385,6 +385,60 @@ int do_env_ask(struct cmd_tbl *cmdtp, in
}
#endif
@@ -76,7 +76,7 @@
#if defined(CONFIG_CMD_ENV_CALLBACK)
static int print_static_binding(const char *var_name, const char *callback_name,
void *priv)
-@@ -1377,6 +1431,9 @@ static struct cmd_tbl cmd_env_sub[] = {
+@@ -1201,6 +1255,9 @@ static struct cmd_tbl cmd_env_sub[] = {
U_BOOT_CMD_MKENT(load, 1, 0, do_env_load, "", ""),
#endif
U_BOOT_CMD_MKENT(print, CONFIG_SYS_MAXARGS, 1, do_env_print, "", ""),
@@ -86,7 +86,7 @@
#if defined(CONFIG_CMD_RUN)
U_BOOT_CMD_MKENT(run, CONFIG_SYS_MAXARGS, 1, do_run, "", ""),
#endif
-@@ -1465,6 +1522,9 @@ static char env_help_text[] =
+@@ -1284,6 +1341,9 @@ U_BOOT_LONGHELP(env,
#if defined(CONFIG_CMD_NVEDIT_EFI)
"env print -e [-guid guid] [-n] [name ...] - print UEFI environment\n"
#endif
@@ -96,7 +96,7 @@
#if defined(CONFIG_CMD_RUN)
"env run var [...] - run commands in an environment variable\n"
#endif
-@@ -1574,6 +1634,17 @@ U_BOOT_CMD(
+@@ -1392,6 +1452,17 @@ U_BOOT_CMD(
);
#endif
diff --git a/package/boot/uboot-mediatek/patches/230-cmd-add-pstore-check.patch b/package/boot/uboot-mediatek/patches/230-cmd-add-pstore-check.patch
index 587245d2ab0..48556937bd8 100644
--- a/package/boot/uboot-mediatek/patches/230-cmd-add-pstore-check.patch
+++ b/package/boot/uboot-mediatek/patches/230-cmd-add-pstore-check.patch
@@ -1,6 +1,6 @@
--- a/cmd/pstore.c
+++ b/cmd/pstore.c
-@@ -207,6 +207,58 @@ static int pstore_set(struct cmd_tbl *cm
+@@ -208,6 +208,58 @@ static int pstore_set(struct cmd_tbl *cm
}
/**
@@ -59,7 +59,7 @@
* pstore_print_buffer() - Print buffer
* @type: buffer type
* @buffer: buffer to print
-@@ -458,6 +510,7 @@ static int pstore_save(struct cmd_tbl *c
+@@ -459,6 +511,7 @@ static int pstore_save(struct cmd_tbl *c
static struct cmd_tbl cmd_pstore_sub[] = {
U_BOOT_CMD_MKENT(set, 8, 0, pstore_set, "", ""),
@@ -67,7 +67,7 @@
U_BOOT_CMD_MKENT(display, 3, 0, pstore_display, "", ""),
U_BOOT_CMD_MKENT(save, 4, 0, pstore_save, "", ""),
};
-@@ -531,6 +584,8 @@ U_BOOT_CMD(pstore, 10, 0, do_pstore,
+@@ -566,6 +619,8 @@ U_BOOT_CMD(pstore, 10, 0, do_pstore,
" 'pmsg-size' is the size of the user space logs record.\n"
" 'ecc-size' enables/disables ECC support and specifies ECC buffer size in\n"
" bytes (0 disables it, 1 is a special value, means 16 bytes ECC).\n"
diff --git a/package/boot/uboot-mediatek/patches/250-fix-mmc-erase-timeout.patch b/package/boot/uboot-mediatek/patches/250-fix-mmc-erase-timeout.patch
new file mode 100644
index 00000000000..fd5fdd814b8
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/250-fix-mmc-erase-timeout.patch
@@ -0,0 +1,11 @@
+--- a/drivers/mmc/mmc_write.c
++++ b/drivers/mmc/mmc_write.c
+@@ -80,7 +80,7 @@ ulong mmc_berase(struct blk_desc *block_
+ u32 start_rem, blkcnt_rem, erase_args = 0;
+ struct mmc *mmc = find_mmc_device(dev_num);
+ lbaint_t blk = 0, blk_r = 0;
+- int timeout_ms = 1000;
++ int timeout_ms = blkcnt;
+
+ if (!mmc)
+ return -1;
diff --git a/package/boot/uboot-mediatek/patches/260-add-missing-type-u64.patch b/package/boot/uboot-mediatek/patches/260-add-missing-type-u64.patch
deleted file mode 100644
index a6204c7b69e..00000000000
--- a/package/boot/uboot-mediatek/patches/260-add-missing-type-u64.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- a/include/linux/types.h
-+++ b/include/linux/types.h
-@@ -1,6 +1,7 @@
- #ifndef _LINUX_TYPES_H
- #define _LINUX_TYPES_H
-
-+typedef unsigned long long __u64;
- #include <linux/posix_types.h>
- #include <asm/types.h>
- #include <stdbool.h>
diff --git a/package/boot/uboot-mediatek/patches/280-image-fdt-save-name-of-FIT-configuration-in-chosen-node.patch b/package/boot/uboot-mediatek/patches/280-image-fdt-save-name-of-FIT-configuration-in-chosen-node.patch
new file mode 100644
index 00000000000..f087bec72a6
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/280-image-fdt-save-name-of-FIT-configuration-in-chosen-node.patch
@@ -0,0 +1,31 @@
+From 5f2d5915f8ea4785bc2b8a26955e176a7898c15b Mon Sep 17 00:00:00 2001
+From: Daniel Golle <daniel@makrotopia.org>
+Date: Tue, 12 Apr 2022 21:00:43 +0100
+Subject: [PATCH] image-fdt: save name of FIT configuration in '/chosen' node
+
+It can be useful for the OS (Linux) to know which configuration has
+been chosen by U-Boot when launching a FIT image.
+Store the name of the FIT configuration node used in a new string
+property called 'u-boot,bootconf' in the '/chosen' node in device tree.
+
+Signed-off-by: Daniel Golle <daniel@makrotopia.org>
+Reviewed-by: Tom Rini <trini@konsulko.com>
+---
+ boot/image-fdt.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+--- a/boot/image-fdt.c
++++ b/boot/image-fdt.c
+@@ -637,6 +637,12 @@ int image_setup_libfdt(struct bootm_head
+ images->fit_uname_cfg,
+ strlen(images->fit_uname_cfg) + 1, 1);
+
++ /* Store name of configuration node as u-boot,bootconf in /chosen node */
++ if (images->fit_uname_cfg)
++ fdt_find_and_setprop(blob, "/chosen", "u-boot,bootconf",
++ images->fit_uname_cfg,
++ strlen(images->fit_uname_cfg) + 1, 1);
++
+ /* Update ethernet nodes */
+ fdt_fixup_ethernet(blob);
+ #if IS_ENABLED(CONFIG_CMD_PSTORE)
diff --git a/package/boot/uboot-mediatek/patches/300-mt7622-generic-reset-button-ignore-env.patch b/package/boot/uboot-mediatek/patches/301-mt7622-generic-reset-button-ignore-env.patch
index f45462eeab4..65990156c22 100644
--- a/package/boot/uboot-mediatek/patches/300-mt7622-generic-reset-button-ignore-env.patch
+++ b/package/boot/uboot-mediatek/patches/301-mt7622-generic-reset-button-ignore-env.patch
@@ -15,20 +15,22 @@
+#define CONFIG_RESET_BUTTON_LABEL "reset"
+#endif
- DECLARE_GLOBAL_DATA_PTR;
-
-@@ -20,7 +27,20 @@ int board_init(void)
+ #include <mtd.h>
+ #include <linux/mtd/mtd.h>
+@@ -24,7 +31,22 @@ int board_init(void)
int board_late_init(void)
{
- gd->env_valid = 1; //to load environment variable from persistent store
+ struct udevice *dev;
-+ int ret;
+
+ if (!button_get_by_label(CONFIG_RESET_BUTTON_LABEL, &dev)) {
+ puts("reset button found\n");
+#ifdef CONFIG_RESET_BUTTON_SETTLE_DELAY
-+ mdelay(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");
@@ -39,14 +41,17 @@
env_relocate();
return 0;
}
---- a/board/mediatek/mt7622/Kconfig
-+++ b/board/mediatek/mt7622/Kconfig
-@@ -14,4 +14,8 @@ config MTK_BROM_HEADER_INFO
- string
- default "media=nor"
+--- a/arch/arm/mach-mediatek/Kconfig
++++ b/arch/arm/mach-mediatek/Kconfig
+@@ -151,4 +151,11 @@ config MTK_BROM_HEADER_INFO
+
+ source "board/mediatek/mt7629/Kconfig"
+config RESET_BUTTON_LABEL
+ string "Button to trigger factory reset"
+ default "reset"
+
++config RESET_BUTTON_SETTLE_DELAY
++ int "Delay to wait for button to settle"
++ default 0
endif
diff --git a/package/boot/uboot-mediatek/patches/302-mt7623-generic-reset-button-ignore-env.patch b/package/boot/uboot-mediatek/patches/302-mt7623-generic-reset-button-ignore-env.patch
new file mode 100644
index 00000000000..928dfe8428a
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/302-mt7623-generic-reset-button-ignore-env.patch
@@ -0,0 +1,46 @@
+--- a/board/mediatek/mt7623/mt7623_rfb.c
++++ b/board/mediatek/mt7623/mt7623_rfb.c
+@@ -4,8 +4,17 @@
+ */
+
+ #include <common.h>
++#include <dm.h>
++#include <button.h>
++#include <env.h>
++#include <init.h>
+ #include <mmc.h>
+ #include <asm/global_data.h>
++#include <linux/delay.h>
++
++#ifndef CONFIG_RESET_BUTTON_LABEL
++#define CONFIG_RESET_BUTTON_LABEL "reset"
++#endif
+
+ DECLARE_GLOBAL_DATA_PTR;
+
+@@ -41,3 +50,25 @@ int mmc_get_env_dev(void)
+ return mmc_get_boot_dev();
+ }
+ #endif
++
++int board_late_init(void)
++{
++ struct udevice *dev;
++
++ 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;
++}
diff --git a/package/boot/uboot-mediatek/patches/303-mt7986-generic-reset-button-ignore-env.patch b/package/boot/uboot-mediatek/patches/303-mt7986-generic-reset-button-ignore-env.patch
new file mode 100644
index 00000000000..45290149f3f
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/303-mt7986-generic-reset-button-ignore-env.patch
@@ -0,0 +1,43 @@
+--- a/board/mediatek/mt7986/mt7986_rfb.c
++++ b/board/mediatek/mt7986/mt7986_rfb.c
+@@ -6,9 +6,16 @@
+
+ #include <common.h>
+ #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
+
+ #include <mtd.h>
+ #include <linux/mtd/mtd.h>
+@@ -24,7 +31,22 @@ int board_init(void)
+
+ 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;
+ }
diff --git a/package/boot/uboot-mediatek/patches/304-mt7981-generic-reset-button-ignore-env.patch b/package/boot/uboot-mediatek/patches/304-mt7981-generic-reset-button-ignore-env.patch
new file mode 100644
index 00000000000..fc443349829
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/304-mt7981-generic-reset-button-ignore-env.patch
@@ -0,0 +1,43 @@
+--- a/board/mediatek/mt7981/mt7981_rfb.c
++++ b/board/mediatek/mt7981/mt7981_rfb.c
+@@ -6,9 +6,16 @@
+
+ #include <common.h>
+ #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
+
+ #include <mtd.h>
+ #include <linux/mtd/mtd.h>
+@@ -24,7 +31,22 @@ int board_init(void)
+
+ 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;
+ }
diff --git a/package/boot/uboot-mediatek/patches/305-mt7988-generic-reset-button-ignore-env.patch b/package/boot/uboot-mediatek/patches/305-mt7988-generic-reset-button-ignore-env.patch
new file mode 100644
index 00000000000..2bbc5c1005f
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/305-mt7988-generic-reset-button-ignore-env.patch
@@ -0,0 +1,46 @@
+--- a/board/mediatek/mt7988/mt7988_rfb.c
++++ b/board/mediatek/mt7988/mt7988_rfb.c
+@@ -4,7 +4,43 @@
+ * Author: Sam Shih <sam.shih@mediatek.com>
+ */
+
++#include <common.h>
++#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_init(void)
+ {
+ return 0;
+ }
++
++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;
++}
diff --git a/package/boot/uboot-mediatek/patches/310-mt7988-select-rootdisk.patch b/package/boot/uboot-mediatek/patches/310-mt7988-select-rootdisk.patch
new file mode 100644
index 00000000000..28d7e0a3f6e
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/310-mt7988-select-rootdisk.patch
@@ -0,0 +1,67 @@
+--- a/board/mediatek/mt7988/mt7988_rfb.c
++++ b/board/mediatek/mt7988/mt7988_rfb.c
+@@ -11,7 +11,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"
+@@ -44,3 +46,54 @@ int board_late_init(void)
+ env_relocate();
+ return 0;
+ }
++
++#define MT7988_BOOT_NOR 0
++#define MT7988_BOOT_SPIM_NAND 1
++#define MT7988_BOOT_EMMC 2
++#define MT7988_BOOT_SNFI_NAND 3
++
++int 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) & 0xc00) >> 10) {
++ case MT7988_BOOT_NOR:
++ media = "rootdisk-nor";
++ break
++ ;;
++ case MT7988_BOOT_SPIM_NAND:
++ media = "rootdisk-spim-nand";
++ break
++ ;;
++ case MT7988_BOOT_EMMC:
++ media = "rootdisk-emmc";
++ break
++ ;;
++ case MT7988_BOOT_SNFI_NAND:
++ media = "rootdisk-sd";
++ 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;
++}
diff --git a/package/boot/uboot-mediatek/patches/311-mt7986-select-roodisk.patch b/package/boot/uboot-mediatek/patches/311-mt7986-select-roodisk.patch
new file mode 100644
index 00000000000..33121627655
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/311-mt7986-select-roodisk.patch
@@ -0,0 +1,67 @@
+--- a/board/mediatek/mt7986/mt7986_rfb.c
++++ b/board/mediatek/mt7986/mt7986_rfb.c
+@@ -11,7 +11,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"
+@@ -83,3 +85,54 @@ int board_nmbm_init(void)
+
+ return 0;
+ }
++
++#define MT7986_BOOT_NOR 0
++#define MT7986_BOOT_SPIM_NAND 1
++#define MT7986_BOOT_EMMC 2
++#define MT7986_BOOT_SNFI_NAND 3
++
++int 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) & 0x300) >> 8) {
++ case MT7986_BOOT_NOR:
++ media = "rootdisk-nor";
++ break
++ ;;
++ case MT7986_BOOT_SPIM_NAND:
++ media = "rootdisk-spim-nand";
++ break
++ ;;
++ case MT7986_BOOT_EMMC:
++ media = "rootdisk-emmc";
++ break
++ ;;
++ case MT7986_BOOT_SNFI_NAND:
++ media = "rootdisk-sd";
++ 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;
++}
diff --git a/package/boot/uboot-mediatek/patches/312-mt7622-select-rootdisk.patch b/package/boot/uboot-mediatek/patches/312-mt7622-select-rootdisk.patch
new file mode 100644
index 00000000000..70cbf6b4630
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/312-mt7622-select-rootdisk.patch
@@ -0,0 +1,141 @@
+--- a/board/mediatek/mt7622/mt7622_rfb.c
++++ b/board/mediatek/mt7622/mt7622_rfb.c
+@@ -11,7 +11,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"
+@@ -22,10 +24,43 @@
+ #include <nmbm/nmbm.h>
+ #include <nmbm/nmbm-mtd.h>
+
++#define MT7622_TOPRGUSTRAP_PAR 0x10212060
++#define MT7622_BOOT_SEQ_MASK 0x18
++#define MT7622_BOOT_SEQ_SHIFT 3
++#define MT7622_BOOT_SEQ_NOR_EMMC_SDXC 0x0
++#define MT7622_BOOT_SEQ_SPI_NAND_EMMC_SDXC 0x1
++#define MT7622_BOOT_SEQ_NAND_EMMC_SDXC 0x2
++#define MT7622_BOOT_SEQ_SDXC_EMMC_NAND 0x3
++
++#define MT7622_GPIO_MODE0 0x10211300
++#define MT7622_GPIO_NAND_MODE_MASK 0x00f00000
++#define MT7622_GPIO_NAND_MODE_SHIFT 20
++#define MT7622_GPIO_NAND_MODE_EMMC 0x2
++#define MT7622_GPIO_RGMII_MODE_MASK 0x0000f000
++#define MT7622_GPIO_RGMII_MODE_SHIFT 12
++#define MT7622_GPIO_RGMII_MODE_SDCX 0x2
++#define MT7622_GPIO_SPI_MODE_MASK 0x00000f00
++#define MT7622_GPIO_SPI_MODE_SHIFT 8
++#define MT7622_GPIO_SPI_MODE_NAND 0x2
++
++#define MT7622_MSDC_INT 0x1124000C
++#define MT7622_MSDC_INT_BD_CS_ERR 0x200
++
+ DECLARE_GLOBAL_DATA_PTR;
+
++static int gpio_mode0;
++static int msdc_int;
++
+ int board_init(void)
+ {
++ /*
++ * Save content of GPIO_MODE0 as left behind by the BootROM.
++ * Also grab MSDC1 INT status to see if BootROM has been reading
++ * from SD card.
++ * Together this will allow to infer the device used for booting.
++ */
++ gpio_mode0 = readl(MT7622_GPIO_MODE0);
++ msdc_int = readl(MT7622_MSDC_INT);
+ return 0;
+ }
+
+@@ -83,3 +118,84 @@ int board_nmbm_init(void)
+
+ return 0;
+ }
++
++int ft_system_setup(void *blob, struct bd_info *bd)
++{
++ bool pinctrl_set_mmc = false;
++ bool pinctrl_set_snfi = false;
++ bool pinctrl_set_emmc = false;
++ bool msdc_bd_cs_err = false;
++
++ const u32 *media_handle_p;
++ int chosen, len, ret;
++ const char *media;
++ u32 media_handle, strap;
++
++ if ((gpio_mode0 & MT7622_GPIO_RGMII_MODE_MASK) >>
++ MT7622_GPIO_RGMII_MODE_SHIFT == MT7622_GPIO_RGMII_MODE_SDCX)
++ pinctrl_set_mmc = true;
++
++ if ((gpio_mode0 & MT7622_GPIO_SPI_MODE_MASK) >>
++ MT7622_GPIO_SPI_MODE_SHIFT == MT7622_GPIO_SPI_MODE_NAND)
++ pinctrl_set_snfi = true;
++
++ if ((gpio_mode0 & MT7622_GPIO_NAND_MODE_MASK) >>
++ MT7622_GPIO_NAND_MODE_SHIFT == MT7622_GPIO_NAND_MODE_EMMC)
++ pinctrl_set_emmc = true;
++
++ if (msdc_int & MT7622_MSDC_INT_BD_CS_ERR)
++ msdc_bd_cs_err = true;
++
++ strap = readl(MT7622_TOPRGUSTRAP_PAR);
++ strap &= MT7622_BOOT_SEQ_MASK;
++ strap >>= MT7622_BOOT_SEQ_SHIFT;
++ switch (strap) {
++ case MT7622_BOOT_SEQ_NOR_EMMC_SDXC:
++ if (!pinctrl_set_emmc)
++ media = "rootdisk-nor";
++ else if (pinctrl_set_mmc)
++ media = "rootdisk-emmc";
++ else
++ media = "rootdisk-sd";
++ break
++ ;;
++ case MT7622_BOOT_SEQ_SPI_NAND_EMMC_SDXC:
++ if (pinctrl_set_snfi)
++ media = "rootdisk-snfi";
++ else if (pinctrl_set_emmc)
++ media = "rootdisk-emmc";
++ else
++ media = "rootdisk-sd";
++ break
++ ;;
++ case MT7622_BOOT_SEQ_NAND_EMMC_SDXC:
++ case MT7622_BOOT_SEQ_SDXC_EMMC_NAND:
++ if (!pinctrl_set_emmc && pinctrl_set_mmc)
++ media = "rootdisk-nand";
++ else if (pinctrl_set_emmc)
++ media = "rootdisk-emmc";
++ else
++ media = "rootdisk-sd";
++ 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;
++}
diff --git a/package/boot/uboot-mediatek/patches/350-add-support-for-Winbond-W25Q512JV.patch b/package/boot/uboot-mediatek/patches/350-add-support-for-Winbond-W25Q512JV.patch
deleted file mode 100644
index 2a42a6f1c16..00000000000
--- a/package/boot/uboot-mediatek/patches/350-add-support-for-Winbond-W25Q512JV.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/drivers/mtd/spi/spi-nor-ids.c
-+++ b/drivers/mtd/spi/spi-nor-ids.c
-@@ -329,6 +329,8 @@ const struct flash_info spi_nor_ids[] =
- SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
- },
- { INFO("w25q256", 0xef4019, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
-+ { INFO("w25q512jv", 0xef4020, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_QUAD_READ | SPI_NOR_DUAL_READ |
-+ SPI_NOR_HAS_TB | SPI_NOR_HAS_LOCK) },
- { INFO("w25m512jw", 0xef6119, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
- { INFO("w25m512jv", 0xef7119, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
- #endif
diff --git a/package/boot/uboot-mediatek/patches/400-update-bpir2-defconfig.patch b/package/boot/uboot-mediatek/patches/400-update-bpir2-defconfig.patch
index c42a2c628bb..ca011aeca96 100644
--- a/package/boot/uboot-mediatek/patches/400-update-bpir2-defconfig.patch
+++ b/package/boot/uboot-mediatek/patches/400-update-bpir2-defconfig.patch
@@ -1,18 +1,17 @@
--- a/configs/mt7623n_bpir2_defconfig
+++ b/configs/mt7623n_bpir2_defconfig
-@@ -4,53 +4,137 @@ CONFIG_ARCH_MEDIATEK=y
- CONFIG_SYS_TEXT_BASE=0x81e00000
- CONFIG_SYS_MALLOC_F_LEN=0x4000
+@@ -7,34 +7,105 @@ CONFIG_SYS_MALLOC_F_LEN=0x4000
CONFIG_NR_DRAM_BANKS=1
+ CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
+ CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x81ffff10
-CONFIG_ENV_SIZE=0x1000
+CONFIG_ENV_SIZE=0x10000
CONFIG_ENV_OFFSET=0x100000
- CONFIG_TARGET_MT7623=y
CONFIG_DEFAULT_DEVICE_TREE="mt7623n-bananapi-bpi-r2"
-+CONFIG_USE_DEFAULT_ENV_FILE=y
- CONFIG_DISTRO_DEFAULTS=y
+ CONFIG_TARGET_MT7623=y
+ CONFIG_SYS_LOAD_ADDR=0x84000000
CONFIG_FIT=y
--CONFIG_FIT_VERBOSE=y
+ CONFIG_FIT_VERBOSE=y
+CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
+CONFIG_LED=y
+CONFIG_LED_BLINK=y
@@ -22,6 +21,9 @@
+CONFIG_AUTOBOOT_KEYED=y
+CONFIG_AUTOBOOT_MENU_SHOW=y
+CONFIG_BOARD_LATE_INIT=y
++# CONFIG_BOOTSTD is not set
++# CONFIG_BOOT_DEFAULTS is not set
+ CONFIG_DISTRO_DEFAULTS=y
CONFIG_BOOTDELAY=3
+CONFIG_BOOTP_SEND_HOSTNAME=y
CONFIG_DEFAULT_FDT_FILE="mt7623n-bananapi-bpi-r2.dtb"
@@ -34,7 +36,11 @@
+CONFIG_CMD_ENV_FLAGS=y
# CONFIG_DISPLAY_BOARDINFO is not set
-CONFIG_SYS_PROMPT="U-Boot> "
++CONFIG_USE_DEFAULT_ENV_FILE=y
+CONFIG_SYS_PROMPT="MT7623> "
+ CONFIG_SYS_MAXARGS=8
+ CONFIG_SYS_PBSIZE=1049
+ CONFIG_SYS_BOOTM_LEN=0x4000000
CONFIG_CMD_BOOTMENU=y
+CONFIG_CMD_BOOTP=y
+CONFIG_CMD_BUTTON=y
@@ -62,16 +68,11 @@
+CONFIG_CMD_LINK_LOCAL=y
+CONFIG_CMD_MBR=y
CONFIG_CMD_MMC=y
--CONFIG_CMD_READ=y
+ CONFIG_CMD_READ=y
-# CONFIG_CMD_SETEXPR is not set
-+CONFIG_CMD_MTD=y
- # CONFIG_CMD_NFS is not set
-+CONFIG_CMD_PCI=y
+CONFIG_CMD_SF_TEST=y
+CONFIG_CMD_PING=y
+CONFIG_CMD_PXE=y
-+CONFIG_CMD_PWM=y
-+CONFIG_CMD_SMC=y
+CONFIG_CMD_TFTPBOOT=y
+CONFIG_CMD_TFTPSRV=y
+CONFIG_CMD_ASKENV=y
@@ -85,81 +86,65 @@
+CONFIG_CMD_STRINGS=y
+CONFIG_CMD_USB=y
+CONFIG_CMD_UUID=y
-+CONFIG_CMD_MMC=y
-+CONFIG_CMD_READ=y
+CONFIG_CMD_SCSI=y
+CONFIG_DISPLAY_CPUINFO=y
+CONFIG_DM_ETH=y
+CONFIG_DM_GPIO=y
+CONFIG_DM_SCSI=y
+CONFIG_DM_MMC=y
-+CONFIG_DM_MTD=y
+CONFIG_DM_REGULATOR=y
+CONFIG_DM_REGULATOR_FIXED=y
-+CONFIG_DM_SERIAL=y
+CONFIG_DM_REGULATOR_GPIO=y
+CONFIG_DM_USB=y
+CONFIG_DM_PCI=y
-+CONFIG_DM_PWM=y
+CONFIG_AHCI=y
+CONFIG_AHCI_PCI=y
+CONFIG_SCSI_AHCI=y
+CONFIG_SCSI=y
-+CONFIG_PWM_MTK=y
+CONFIG_HUSH_PARSER=y
-+CONFIG_SYS_RELOC_GD_ENV_ADDR=y
CONFIG_ENV_OVERWRITE=y
CONFIG_ENV_IS_IN_MMC=y
CONFIG_SYS_RELOC_GD_ENV_ADDR=y
CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_NETCONSOLE=y
- CONFIG_REGMAP=y
- CONFIG_SYSCON=y
- CONFIG_CLK=y
--CONFIG_DM_MMC=y
-+CONFIG_LZMA=y
-+CONFIG_MEDIATEK_ETH=y
- # CONFIG_MMC_QUIRKS is not set
+ CONFIG_USE_IPADDR=y
+ CONFIG_IPADDR="192.168.1.1"
+ CONFIG_USE_SERVERIP=y
+@@ -46,6 +117,12 @@ CONFIG_CLK=y
CONFIG_SUPPORT_EMMC_BOOT=y
CONFIG_MMC_HS400_SUPPORT=y
CONFIG_MMC_MTK=y
-+CONFIG_MTK_AHCI=y
-+CONFIG_MTK_POWER_DOMAIN=y
-+CONFIG_MTK_SERIAL=y
-+CONFIG_MTK_TIMER=y
+CONFIG_OF_LIBFDT_OVERLAY=y
+CONFIG_PARTITION_UUIDS=y
+CONFIG_PCI=y
+CONFIG_PCIE_MEDIATEK=y
+CONFIG_PHY=y
++CONFIG_PINCONF=y
CONFIG_PHY_FIXED=y
--CONFIG_DM_ETH=y
--CONFIG_MEDIATEK_ETH=y
+ CONFIG_MEDIATEK_ETH=y
CONFIG_PINCTRL=y
- CONFIG_PINCONF=y
- CONFIG_PINCTRL_MT7623=y
- CONFIG_POWER_DOMAIN=y
--CONFIG_MTK_POWER_DOMAIN=y
--CONFIG_DM_SERIAL=y
--CONFIG_MTK_SERIAL=y
+@@ -55,10 +132,13 @@ CONFIG_POWER_DOMAIN=y
+ CONFIG_MTK_POWER_DOMAIN=y
+ CONFIG_DM_SERIAL=y
+ CONFIG_MTK_SERIAL=y
+CONFIG_RANDOM_UUID=y
+CONFIG_REGEX=y
CONFIG_SYSRESET=y
CONFIG_SYSRESET_WATCHDOG=y
CONFIG_TIMER=y
--CONFIG_MTK_TIMER=y
+ CONFIG_MTK_TIMER=y
+CONFIG_VERSION_VARIABLE=y
CONFIG_WDT_MTK=y
--CONFIG_LZMA=y
+ CONFIG_LZMA=y
# CONFIG_EFI_GRUB_ARM32_WORKAROUND is not set
--- /dev/null
+++ b/bananapi_bpi-r2_env
-@@ -0,0 +1,64 @@
+@@ -0,0 +1,70 @@
+ipaddr=192.168.1.1
+serverip=192.168.1.254
+loadaddr=0x88000000
+dtaddr=0x83f00000
-+console=earlycon=uart8250,mmio32,0x11004000 console=ttyS2,115200
++console=earlycon=uart8250,mmio32,0x11004000 console=ttyS2,115200 console=tty1
+initrd_high=0xafffffff
+part_default=3
+part_recovery=2
@@ -167,6 +152,8 @@
+bootdelay=0
+bootfile=openwrt-mediatek-mt7623-bananapi_bpi-r2-initramfs-recovery.itb
+bootfile_upg=openwrt-mediatek-mt7623-bananapi_bpi-r2-squashfs-sysupgrade.itb
++bootled_pwr=bpi-r2:pio:green
++bootled_rec=bpi-r2:pio:blue
+bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
+bootmenu_default=0
+bootmenu_delay=0
@@ -176,7 +163,7 @@
+bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
+boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
+boot_first=if button factory ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
-+boot_tftp_forever=led bpi-r64:pio:blue on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done
++boot_tftp_forever=led bpi-r2:pio:blue on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done
+boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run mmc_write_production ; if env exists noboot ; then else bootm $loadaddr ; fi
+boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run mmc_write_recovery ; if env exists noboot ; then else bootm $loadaddr ; fi
+boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr
@@ -193,7 +180,7 @@
+emmc_read_recovery=mmc dev 0 0 ; part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_read_vol
+mmc_write_production=if test "$bootedfrom" = "SD" ; then run sdmmc_write_production ; else run emmc_write_production ; fi
+mmc_write_recovery=if test "$bootedfrom" = "SD" ; run sdmmc_write_recovery ; else run emmc_write_recovery ; fi
-+mmc_write_vol=imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc erase 0x$part_addr 0x$part_size && mmc write $loadaddr 0x$part_addr 0x$image_size
++mmc_write_vol=imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc erase 0x$part_addr 0x$image_size && mmc write $loadaddr 0x$part_addr 0x$image_size
+mmc_read_vol=mmc read $loadaddr $part_addr 0x8 && imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc read $loadaddr 0x$part_addr 0x$image_size && setexpr filesize $image_size * 0x200
+reset_factory=eraseenv && reset
+sdmmc_read_emmc_hdr=mmc dev 1 && mmc read $loadaddr 0x1ff8 0x8
@@ -205,9 +192,13 @@
+sdmmc_write_recovery=iminfo $fileaddr && mmc dev 1 && part start mmc 1 $part_recovery part_addr && part size mmc 1 $part_recovery part_size && run mmc_write_vol
+_checkbootedfrom=setenv _checkbootedfrom ; if itest.l *81dffff0 == 434d4d65 ; then setenv bootedfrom eMMC ; else setenv bootedfrom SD ; fi
+_init_env=setenv _init_env ; setenv _create_env ; saveenv ; saveenv
-+_firstboot=setenv _firstboot ; led bpi-r64:pio:blue on ; run _checkbootedfrom _switch_to_menu _update_bootdev _update_bootcmd _update_bootcmd2 _init_env boot_first
-+_update_bootcmd=setenv _update_bootcmd ; if test "$bootedfrom" = "SD" ; then setenv boot_production "run sdmmc_read_production && bootm $loadaddr" ; else setenv boot_production "run emmc_read_production && bootm $loadaddr" ; fi
-+_update_bootcmd2=setenv _update_bootcmd2 ; if test "$bootedfrom" = "SD" ; then setenv boot_recovery "run sdmmc_read_recovery && bootm $loadaddr" ; else setenv boot_recovery "run emmc_read_recovery && bootm $loadaddr" ; fi
++_firstboot=setenv _firstboot ; led $bootled_pwr off ;led $bootled_rec on ; run _checkbootedfrom _switch_to_menu _update_bootdev _update_bootcmd _update_bootcmd2 _init_env boot_first
++_set_bootcmd_sdmmc=setenv boot_production "led $bootled_rec off ; led $bootled_pwr on ; run sdmmc_read_production && bootm $loadaddr ; led $bootled_pwr off"
++_set_bootcmd_emmc=setenv boot_production "led $bootled_rec off ; led $bootled_pwr on ; run emmc_read_production && bootm $loadaddr ; led $bootled_pwr off"
++_update_bootcmd=setenv _update_bootcmd ; if test "$bootedfrom" = "SD" ; then run _set_bootcmd_sdmmc ; else run _set_bootcmd_emmc ; fi ; setenv _set_bootcmd_sdmmc ; setenv _set_bootcmd_emmc
++_set_bootcmd2_sdmmc=setenv boot_recovery "led $bootled_pwr off ; led $bootled_rec on ; run sdmmc_read_recovery && bootm $loadaddr ; led $bootled_rec off"
++_set_bootcmd2_emmc=setenv boot_recovery "led $bootled_pwr off ; led $bootled_rec on ; run emmc_read_recovery && bootm $loadaddr ; led $bootled_rec off"
++_update_bootcmd2=setenv _update_bootcmd2 ; if test "$bootedfrom" = "SD" ; then run _set_bootcmd2_sdmmc ; else run _set_bootcmd2_emmc ; fi ; setenv _set_bootcmd2_sdmmc ; setenv _set_bootcmd2_emmc
+_update_bootdev=setenv _update_bootdev ; if test "$bootedfrom" = "SD" ; then setenv bootargs "$console root=/dev/mmcblk1p65" ; else setenv bootargs "$console root=/dev/mmcblk0p65" ; fi
+_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
+_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title [$bootedfrom] $ver" ; run _set_bm2
@@ -221,7 +212,15 @@
+_set_bmf=setenv _set_bmf ; setenv bootmenu_${_menu_next} "Reset all settings to factory defaults.=run reset_factory ; reset" ; setenv _menu_next
--- a/arch/arm/dts/mt7623n-bananapi-bpi-r2.dts
+++ b/arch/arm/dts/mt7623n-bananapi-bpi-r2.dts
-@@ -66,6 +66,15 @@
+@@ -6,6 +6,7 @@
+ */
+
+ /dts-v1/;
++#include <dt-bindings/input/linux-event-codes.h>
+ #include "mt7623.dtsi"
+ #include "mt7623-u-boot.dtsi"
+
+@@ -66,6 +67,16 @@
default-state = "off";
};
};
@@ -232,65 +231,9 @@
+ factory {
+ label = "factory";
+ gpios = <&gpio 256 GPIO_ACTIVE_LOW>;
++ linux,code = <KEY_RESTART>;
+ };
+ };
};
&eth {
---- a/board/mediatek/mt7623/mt7623_rfb.c
-+++ b/board/mediatek/mt7623/mt7623_rfb.c
-@@ -6,6 +6,17 @@
- #include <common.h>
- #include <mmc.h>
- #include <asm/global_data.h>
-+#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
-
- DECLARE_GLOBAL_DATA_PTR;
-
-@@ -17,6 +28,25 @@ int board_init(void)
- return 0;
- }
-
-+int board_late_init(void)
-+{
-+ struct udevice *dev;
-+
-+ if (!button_get_by_label(CONFIG_RESET_BUTTON_LABEL, &dev)) {
-+ puts("reset button found\n");
-+#ifdef CONFIG_RESET_BUTTON_SETTLE_DELAY
-+ 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;
-+}
-+
- #ifdef CONFIG_MMC
- int mmc_get_boot_dev(void)
- {
---- a/board/mediatek/mt7623/Kconfig
-+++ b/board/mediatek/mt7623/Kconfig
-@@ -10,4 +10,8 @@ config MTK_BROM_HEADER_INFO
- string
- default "lk=1"
-
-+config RESET_BUTTON_LABEL
-+ string "Button to trigger factory reset"
-+ default "reset"
-+
- endif
diff --git a/package/boot/uboot-mediatek/patches/401-update-u7623-defconfig.patch b/package/boot/uboot-mediatek/patches/401-update-u7623-defconfig.patch
index 37d1b6a6717..6528b165f52 100644
--- a/package/boot/uboot-mediatek/patches/401-update-u7623-defconfig.patch
+++ b/package/boot/uboot-mediatek/patches/401-update-u7623-defconfig.patch
@@ -1,15 +1,240 @@
--- a/configs/mt7623a_unielec_u7623_02_defconfig
+++ b/configs/mt7623a_unielec_u7623_02_defconfig
-@@ -52,3 +52,12 @@ CONFIG_TIMER=y
- CONFIG_MTK_TIMER=y
- CONFIG_WDT_MTK=y
- CONFIG_LZMA=y
+@@ -7,33 +7,109 @@ CONFIG_SYS_MALLOC_F_LEN=0x4000
+ CONFIG_NR_DRAM_BANKS=1
+ CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
+ CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x81ffff10
+-CONFIG_ENV_SIZE=0x1000
++CONFIG_ENV_SIZE=0x10000
+ CONFIG_ENV_OFFSET=0x100000
+ CONFIG_DEFAULT_DEVICE_TREE="mt7623a-unielec-u7623-02-emmc"
+ CONFIG_TARGET_MT7623=y
+ CONFIG_SYS_LOAD_ADDR=0x84000000
+ CONFIG_FIT=y
+ CONFIG_FIT_VERBOSE=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_LOGLEVEL=7
++CONFIG_LOG=y
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_BOARD_LATE_INIT=y
++# CONFIG_BOOTSTD is not set
++# CONFIG_BOOT_DEFAULTS is not set
+ CONFIG_DISTRO_DEFAULTS=y
+ CONFIG_BOOTDELAY=3
++CONFIG_BOOTP_SEND_HOSTNAME=y
+ CONFIG_DEFAULT_FDT_FILE="mt7623a-unielec-u7623-02-emmc.dtb"
+ CONFIG_SYS_CONSOLE_IS_IN_ENV=y
++CONFIG_DEFAULT_ENV_FILE="unielec_u7623-02_env"
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_RESET_BUTTON_LABEL="factory"
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_CMD_ENV_FLAGS=y
+ # CONFIG_DISPLAY_BOARDINFO is not set
+-CONFIG_SYS_PROMPT="U-Boot> "
++CONFIG_USE_DEFAULT_ENV_FILE=y
++CONFIG_SYS_PROMPT="MT7623> "
+ CONFIG_SYS_MAXARGS=8
+ CONFIG_SYS_PBSIZE=1049
+ CONFIG_SYS_BOOTM_LEN=0x4000000
+ CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
+CONFIG_CMD_BOOTZ=y
-+CONFIG_OF_LIBFDT_OVERLAY=y
-+#enables savenenv-command
-+CONFIG_ENV_IS_IN_FAT=y
-+CONFIG_ENV_FAT_INTERFACE="mmc"
-+CONFIG_ENV_FAT_DEVICE_AND_PART="0:2"
-+CONFIG_ENV_FAT_FILE="uboot.env"
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_EXT4=y
++CONFIG_CMD_FAT=y
++CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_FS_UUID=y
+ # CONFIG_CMD_ELF is not set
+ # CONFIG_CMD_XIMG is not set
+ CONFIG_CMD_GPIO=y
+-CONFIG_CMD_GPT=y
++# CONFIG_CMD_GPT is not set
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++CONFIG_CMD_MBR=y
+ CONFIG_CMD_MMC=y
+ CONFIG_CMD_READ=y
+-# CONFIG_CMD_SETEXPR is not set
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
+CONFIG_CMD_ASKENV=y
++CONFIG_CMD_PART=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SATA=y
+CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_USB=y
++CONFIG_CMD_UUID=y
++CONFIG_CMD_READ=y
++CONFIG_CMD_SCSI=y
++CONFIG_DISPLAY_CPUINFO=y
++CONFIG_DM_ETH=y
++CONFIG_DM_GPIO=y
++CONFIG_DM_SCSI=y
++CONFIG_DM_MMC=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_SERIAL=y
++CONFIG_DM_REGULATOR_GPIO=y
++CONFIG_DM_USB=y
++CONFIG_DM_PCI=y
++CONFIG_AHCI=y
++CONFIG_AHCI_PCI=y
++CONFIG_SCSI_AHCI=y
++CONFIG_SCSI=y
++CONFIG_HUSH_PARSER=y
+ CONFIG_ENV_IS_IN_MMC=y
+ CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_SYS_MMC_ENV_DEV=0
++CONFIG_ENV_OVERWRITE=y
+ CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_NETCONSOLE=y
+ CONFIG_USE_IPADDR=y
+ CONFIG_IPADDR="192.168.1.1"
+ CONFIG_USE_SERVERIP=y
+@@ -45,6 +121,11 @@ CONFIG_CLK=y
+ CONFIG_SUPPORT_EMMC_BOOT=y
+ CONFIG_MMC_HS400_SUPPORT=y
+ CONFIG_MMC_MTK=y
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_PARTITION_UUIDS=y
++CONFIG_PCI=y
++CONFIG_PCIE_MEDIATEK=y
++CONFIG_PHY=y
+ CONFIG_PHY_FIXED=y
+ CONFIG_MEDIATEK_ETH=y
+ CONFIG_PINCTRL=y
+@@ -54,9 +135,12 @@ CONFIG_POWER_DOMAIN=y
+ CONFIG_MTK_POWER_DOMAIN=y
+ CONFIG_DM_SERIAL=y
+ CONFIG_MTK_SERIAL=y
++CONFIG_RANDOM_UUID=y
++CONFIG_REGEX=y
+ CONFIG_SYSRESET=y
+ CONFIG_SYSRESET_WATCHDOG=y
+ CONFIG_TIMER=y
+ CONFIG_MTK_TIMER=y
++CONFIG_VERSION_VARIABLE=y
+ CONFIG_WDT_MTK=y
+ CONFIG_LZMA=y
+--- /dev/null
++++ b/unielec_u7623-02_env
+@@ -0,0 +1,47 @@
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x88000000
++dtaddr=0x83f00000
++console=earlycon=uart8250,mmio32,0x11004000 console=ttyS0,115200
++initrd_high=0xafffffff
++part_default=3
++part_recovery=2
++bootcmd=run boot_mmc
++bootdelay=0
++bootfile=openwrt-mediatek-mt7623-unielec_u7623-02-initramfs-recovery.itb
++bootfile_upg=openwrt-mediatek-mt7623-unielec_u7623-02-squashfs-sysupgrade.itb
++bootled_rec=u7623-01:green:led3
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_default=0
++bootmenu_delay=0
++bootmenu_title= ( ( ( OpenWrt ) ) )
++bootmenu_0=Initialize environment.=run _firstboot
++bootmenu_0d=Run default boot command.=run boot_default
++bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
++bootmenu_2=Boot production system from eMMC.=run boot_production ; run bootmenu_confirm_return
++bootmenu_3=Boot recovery system from eMMC.=run boot_recovery ; run bootmenu_confirm_return
++bootmenu_4=Load production system via TFTP then write to eMMC.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_5=Load recovery system via TFTP then write to eMMC.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_6=Reboot.=reset
++bootmenu_7=Reset all settings to factory defaults.=run reset_factory ; reset
++boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
++boot_first=if button factory ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
++boot_production=run emmc_read_production && bootm $loadaddr
++boot_recovery=run emmc_read_recovery && bootm $loadaddr
++boot_tftp_forever=led bpi-r64:pio:blue on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done
++boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run emmc_write_production ; if env exists noboot ; then else bootm $loadaddr ; fi
++boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run emmc_write_recovery ; if env exists noboot ; then else bootm $loadaddr ; fi
++boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr
++boot_mmc=run boot_production ; run boot_recovery
++emmc_write_production=mmc dev 0 0 ; iminfo $loadaddr && part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_write_vol
++emmc_write_recovery=mmc dev 0 0 ; iminfo $loadaddr && part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_write_vol
++emmc_read_production=mmc dev 0 0 ; part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_read_vol
++emmc_read_recovery=mmc dev 0 0 ; part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_read_vol
++mmc_write_vol=imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc erase 0x$part_addr 0x$image_size && mmc write $loadaddr 0x$part_addr 0x$image_size
++mmc_read_vol=mmc read $loadaddr $part_addr 0x8 && imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc read $loadaddr 0x$part_addr 0x$image_size && setexpr filesize $image_size * 0x200
++reset_factory=eraseenv && reset
++_init_env=setenv _init_env ; saveenv ; saveenv
++_firstboot=setenv _firstboot ; run _switch_to_menu _update_bootdev _init_env boot_first
++_update_bootdev=setenv _update_bootdev ; setenv bootargs "$console root=/dev/mmcblk0p65"
++_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
++_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
+--- a/arch/arm/dts/mt7623a-unielec-u7623-02-emmc.dts
++++ b/arch/arm/dts/mt7623a-unielec-u7623-02-emmc.dts
+@@ -6,6 +6,7 @@
+ */
+
+ /dts-v1/;
++#include <dt-bindings/input/linux-event-codes.h>
+ #include "mt7623.dtsi"
+ #include "mt7623-u-boot.dtsi"
+
+@@ -50,6 +51,18 @@
+ regulator-always-on;
+ };
+
++ gpio-keys {
++ compatible = "gpio-keys";
++ pinctrl-names = "default";
++ pinctrl-0 = <&key_pins_a>;
++
++ factory {
++ label = "factory";
++ gpios = <&gpio 256 GPIO_ACTIVE_LOW>;
++ linux,code = <KEY_RESTART>;
++ };
++ };
++
+ leds {
+ compatible = "gpio-leds";
+
+@@ -109,6 +122,19 @@
+ };
+ };
+
++ key_pins_a: keys-alt {
++ mux {
++ function = "gpio";
++ groups = "msdc3";
++ };
++
++ conf {
++ pins = "MSDC0E_DAT0", "MSDC0E_DAT1";
++ input-enable;
++ bias-pull-up;
++ };
++ };
++
+ mmc0_pins_default: mmc0default {
+ mux {
+ function = "msdc";
diff --git a/package/boot/uboot-mediatek/patches/402-update-bananapi-bpi-r64-device-tree.patch b/package/boot/uboot-mediatek/patches/402-update-bananapi-bpi-r64-device-tree.patch
index 781a6857219..c8066a7e2d4 100644
--- a/package/boot/uboot-mediatek/patches/402-update-bananapi-bpi-r64-device-tree.patch
+++ b/package/boot/uboot-mediatek/patches/402-update-bananapi-bpi-r64-device-tree.patch
@@ -1,6 +1,14 @@
--- a/arch/arm/dts/mt7622-bananapi-bpi-r64.dts
+++ b/arch/arm/dts/mt7622-bananapi-bpi-r64.dts
-@@ -20,6 +20,7 @@
+@@ -5,6 +5,7 @@
+ */
+
+ /dts-v1/;
++#include <dt-bindings/input/linux-event-codes.h>
+ #include "mt7622.dtsi"
+ #include "mt7622-u-boot.dtsi"
+
+@@ -20,6 +21,7 @@
aliases {
spi0 = &snfi;
@@ -8,7 +16,7 @@
};
memory@40000000 {
-@@ -27,6 +28,42 @@
+@@ -27,6 +29,44 @@
reg = <0x40000000 0x40000000>;
};
@@ -18,11 +26,13 @@
+ reset {
+ label = "reset";
+ gpios = <&gpio 0 GPIO_ACTIVE_LOW>;
++ linux,code = <KEY_RESTART>;
+ };
+
+ wps {
+ label = "wps";
+ gpios = <&gpio 102 GPIO_ACTIVE_LOW>;
++ linux,code = <KEY_WPS_BUTTON>;
+ };
+ };
+
@@ -51,7 +61,15 @@
reg_1p8v: regulator-1p8v {
compatible = "regulator-fixed";
regulator-name = "fixed-1.8V";
-@@ -199,7 +236,7 @@
+@@ -182,6 +222,7 @@
+ };
+
+ &uart0 {
++ mediatek,force-highspeed;
+ status = "okay";
+ };
+
+@@ -197,7 +238,7 @@
status = "okay";
bus-width = <8>;
max-frequency = <50000000>;
@@ -60,7 +78,7 @@
vmmc-supply = <&reg_3p3v>;
vqmmc-supply = <&reg_3p3v>;
non-removable;
-@@ -210,7 +247,7 @@
+@@ -208,7 +249,7 @@
pinctrl-0 = <&mmc1_pins_default>;
status = "okay";
bus-width = <4>;
diff --git a/package/boot/uboot-mediatek/patches/403-add-bananapi_bpi-r64-snand.patch b/package/boot/uboot-mediatek/patches/403-add-bananapi_bpi-r64-snand.patch
index 1dc2a84893a..2ec57708067 100644
--- a/package/boot/uboot-mediatek/patches/403-add-bananapi_bpi-r64-snand.patch
+++ b/package/boot/uboot-mediatek/patches/403-add-bananapi_bpi-r64-snand.patch
@@ -1,6 +1,6 @@
--- a/arch/arm/dts/mt7622-bananapi-bpi-r64.dts
+++ b/arch/arm/dts/mt7622-bananapi-bpi-r64.dts
-@@ -19,7 +19,7 @@
+@@ -20,7 +20,7 @@
};
aliases {
@@ -9,7 +9,7 @@
ethernet0 = &eth;
};
-@@ -205,17 +205,11 @@
+@@ -208,16 +208,27 @@
};
};
@@ -20,14 +20,28 @@
+&snand {
+ pinctrl-names = "default";
+ pinctrl-0 = <&snfi_pins>;
++ quad-spi;
status = "okay";
--
+
- spi-flash@0{
- compatible = "jedec,spi-nor";
- reg = <0>;
-- u-boot,dm-pre-reloc;
-- };
-+ quad-spi;
+- bootph-all;
++ partitions {
++ compatible = "fixed-partitions";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ partition@0 {
++ label = "bl2";
++ reg = <0x0 0x80000>;
++ };
++
++ partition@80000 {
++ label = "ubi";
++ reg = <0x80000 0x7f80000>;
++ compatible = "linux,ubi";
++ };
+ };
};
- &uart0 {
diff --git a/package/boot/uboot-mediatek/patches/404-add-bananapi_bpi-r64_defconfigs.patch b/package/boot/uboot-mediatek/patches/404-add-bananapi_bpi-r64_defconfigs.patch
index 9e694c9c8b0..1a9b859e7ad 100644
--- a/package/boot/uboot-mediatek/patches/404-add-bananapi_bpi-r64_defconfigs.patch
+++ b/package/boot/uboot-mediatek/patches/404-add-bananapi_bpi-r64_defconfigs.patch
@@ -1,12 +1,14 @@
--- /dev/null
+++ b/configs/mt7622_bananapi_bpi-r64-sdmmc_defconfig
-@@ -0,0 +1,158 @@
+@@ -0,0 +1,164 @@
+CONFIG_ARM=y
+CONFIG_POSITION_INDEPENDENT=y
+CONFIG_ARCH_MEDIATEK=y
+CONFIG_TARGET_MT7622=y
-+CONFIG_SYS_TEXT_BASE=0x41e00000
++CONFIG_TEXT_BASE=0x41e00000
+CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_SYS_LOAD_ADDR=0x40080000
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
+CONFIG_USE_DEFAULT_ENV_FILE=y
+CONFIG_BOARD_LATE_INIT=y
+CONFIG_BOOTP_SEND_HOSTNAME=y
@@ -15,6 +17,7 @@
+CONFIG_DEBUG_UART_CLOCK=25000000
+CONFIG_DEFAULT_DEVICE_TREE="mt7622-bananapi-bpi-r64"
+CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_OF_SYSTEM_SETUP=y
+CONFIG_DEBUG_UART=y
+CONFIG_DEFAULT_ENV_FILE="bananapi_bpi-r64-sdmmc_env"
+CONFIG_NET_RANDOM_ETHADDR=y
@@ -124,7 +127,6 @@
+CONFIG_PCI=y
+CONFIG_MTD=y
+CONFIG_MTD_UBI_FASTMAP=y
-+CONFIG_MTDPARTS_DEFAULT="mtdparts=spi-nand0:512k(bl2),2048k(fip),-(ubi)"
+CONFIG_DM_PCI=y
+CONFIG_PCIE_MEDIATEK=y
+CONFIG_PINCTRL=y
@@ -159,17 +161,21 @@
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_XHCI_MTK=y
+CONFIG_USB_STORAGE=y
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
--- /dev/null
+++ b/bananapi_bpi-r64-sdmmc_env
-@@ -0,0 +1,82 @@
+@@ -0,0 +1,81 @@
+ipaddr=192.168.1.1
+serverip=192.168.1.254
+loadaddr=0x48000000
-+bootargs=root=/dev/mmcblk1p65
++bootargs=root=/dev/fit0
+bootcmd=if pstore check ; then run boot_recovery ; else run boot_sdmmc ; fi
-+bootconf=config-mt7622-bananapi-bpi-r64-pcie1
-+bootconf_pcie=config-mt7622-bananapi-bpi-r64-pcie1
-+bootconf_sata=config-mt7622-bananapi-bpi-r64-sata
++bootconf=config-1#mt7622-bananapi-bpi-r64-pcie1
++bootconf_pcie=config-1#mt7622-bananapi-bpi-r64-pcie1
++bootconf_sata=config-1#mt7622-bananapi-bpi-r64-sata
+bootdelay=0
+bootfile=openwrt-mediatek-mt7622-bananapi_bpi-r64-initramfs-recovery.itb
+bootfile_emmcbl2=openwrt-mediatek-mt7622-bananapi_bpi-r64-emmc-preloader.bin
@@ -204,7 +210,6 @@
+boot_ubi=ubi part ubi && setenv bootargs && run boot_ubi_production ; run boot_ubi_recovery
+boot_ubi_production=led $bootled_pwr on ; run ubi_read_production && bootm $loadaddr ; led $bootled_pwr off
+boot_ubi_recovery=led $bootled_rec on ; run ubi_read_recovery ; bootm $loadaddr#$bootconf ; ubi remove recovery ; led $bootled_rec off
-+check_ubi=ubi part ubi || run ubi_format
+emmc_init=run emmc_init_bl && run emmc_init_openwrt ; env default bootcmd ; saveenv ; saveenv
+emmc_init_bl=run sdmmc_read_emmc_bl2 && run emmc_write_bl2 && run sdmmc_read_emmc_hdr && run emmc_write_hdr && run sdmmc_read_emmc_fip && run emmc_write_fip
+emmc_init_openwrt=run sdmmc_read_recovery && iminfo $loadaddr && run emmc_write_recovery ; run sdmmc_read_production && iminfo $loadaddr && run emmc_write_production
@@ -213,8 +218,8 @@
+emmc_write_hdr=mmc dev 0 0 && mmc erase 0x0 0x40 && mmc write $loadaddr 0x0 0x40
+emmc_write_production=mmc dev 0 && part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_write_vol
+emmc_write_recovery=mmc dev 0 && part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_write_vol
-+mmc_write_vol=imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc erase 0x$part_addr 0x$part_size && mmc write $loadaddr 0x$part_addr 0x$image_size
-+mmc_read_vol=mmc read $loadaddr $part_addr 0x8 && imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc read $loadaddr 0x$part_addr 0x$image_size && setexpr filesize $image_size * 0x200
++mmc_write_vol=imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc erase 0x$part_addr 0x$image_size && mmc write $loadaddr 0x$part_addr 0x$image_size
++mmc_read_vol=mmc read $loadaddr $part_addr 0x100 && imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc read $loadaddr 0x$part_addr 0x$image_size && setexpr filesize $image_size * 0x200
+part_default=production
+part_recovery=recovery
+reset_factory=eraseenv && reset
@@ -227,32 +232,34 @@
+sdmmc_read_snand_fip=mmc dev 1 && part start mmc 1 install part_addr && setexpr offset $part_addr + 0x2400 && mmc read $loadaddr $offset 0x1000
+sdmmc_write_production=mmc dev 1 && part start mmc 1 $part_default part_addr && part size mmc 1 $part_default part_size && run mmc_write_vol
+sdmmc_write_recovery=mmc dev 1 && part start mmc 1 $part_recovery part_addr && part size mmc 1 $part_recovery part_size && run mmc_write_vol
-+snand_write_fip=mtd erase fip && mtd write fip $loadaddr
-+snand_write_bl2=mtd erase bl2 && mtd write bl2 $loadaddr
-+ubi_create_env=ubi create ubootenv 0x100000 dynamic 0 ; ubi create ubootenv2 0x100000 dynamic 1 ; ubi create fit 0x100000 dynamic 2 ; ubi create recovery 0x100000 dynamic 3
-+ubi_format=ubi detach ; mtd erase ubi && ubi part ubi ; reset
-+ubi_init=run ubi_init_bl && ubi detach && mtd erase ubi && ubi part ubi && run ubi_create_env && run ubi_init_openwrt
++snand_write_bl2=mtd erase bl2 && mtd write bl2 $loadaddr 0x0 0x20000 && mtd write bl2 $loadaddr 0x20000 0x20000 && mtd write bl2 $loadaddr 0x40000 0x20000 && mtd write bl2 $loadaddr 0x60000 0x20000
++ubi_create_env=ubi create ubootenv 0x1f000 dynamic ; ubi create ubootenv2 0x1f000 dynamic
++ubi_format=ubi detach ; mtd erase ubi && ubi part ubi
++ubi_init=run ubi_format && run ubi_init_bl && run ubi_create_env && run ubi_init_openwrt
+ubi_init_openwrt=run sdmmc_read_recovery && iminfo $loadaddr && run ubi_write_recovery ; run sdmmc_read_production && iminfo $loadaddr && run ubi_write_production
-+ubi_init_bl=run sdmmc_read_snand_bl2 && run snand_write_bl2 && run sdmmc_read_snand_fip && run snand_write_fip
++ubi_init_bl=run sdmmc_read_snand_bl2 && run snand_write_bl2 && run sdmmc_read_snand_fip && run ubi_write_fip
+ubi_prepare_rootfs=if ubi check rootfs_data ; then else if env exists rootfs_data_max ; then ubi create rootfs_data $rootfs_data_max dynamic || ubi create rootfs_data - dynamic ; else ubi create rootfs_data - dynamic ; fi ; fi
+ubi_read_production=ubi read $loadaddr fit && iminfo $loadaddr && run ubi_prepare_rootfs
+ubi_read_recovery=ubi check recovery && ubi read $loadaddr recovery
+ubi_remove_rootfs=ubi check rootfs_data && ubi remove rootfs_data
-+ubi_write_production=ubi check fit && ubi remove fit ; run ubi_remove_rootfs ; ubi create fit $filesize dynamic 2 && ubi write $loadaddr fit $filesize
-+ubi_write_recovery=ubi check recovery && ubi remove recovery ; run ubi_remove_rootfs ; ubi create recovery $filesize dynamic 3 && ubi write $loadaddr recovery $filesize
++ubi_write_fip=ubi check fip && ubi remove fip ; ubi create fip 0x200000 static ; ubi write $loadaddr fip 0x200000
++ubi_write_production=ubi check fit && ubi remove fit ; run ubi_remove_rootfs ; ubi create fit $filesize dynamic && ubi write $loadaddr fit $filesize
++ubi_write_recovery=ubi check recovery && ubi remove recovery ; run ubi_remove_rootfs ; ubi create recovery $filesize dynamic && ubi write $loadaddr recovery $filesize
+_init_env=setenv _init_env ; setenv _create_env ; saveenv ; saveenv
+_firstboot=setenv _firstboot ; run _switch_to_menu ; run _init_env ; run boot_first
+_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
+_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
--- /dev/null
+++ b/configs/mt7622_bananapi_bpi-r64-emmc_defconfig
-@@ -0,0 +1,145 @@
+@@ -0,0 +1,152 @@
+CONFIG_ARM=y
+CONFIG_POSITION_INDEPENDENT=y
+CONFIG_ARCH_MEDIATEK=y
+CONFIG_TARGET_MT7622=y
-+CONFIG_SYS_TEXT_BASE=0x41e00000
++CONFIG_TEXT_BASE=0x41e00000
+CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_SYS_LOAD_ADDR=0x40080000
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
+CONFIG_USE_DEFAULT_ENV_FILE=y
+CONFIG_BOARD_LATE_INIT=y
+CONFIG_BOOTP_SEND_HOSTNAME=y
@@ -261,6 +268,7 @@
+CONFIG_DEBUG_UART_CLOCK=25000000
+CONFIG_DEFAULT_DEVICE_TREE="mt7622-bananapi-bpi-r64"
+CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_OF_SYSTEM_SETUP=y
+CONFIG_DEBUG_UART=y
+CONFIG_DEFAULT_ENV_FILE="bananapi_bpi-r64-emmc_env"
+CONFIG_NET_RANDOM_ETHADDR=y
@@ -392,6 +400,10 @@
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_XHCI_MTK=y
+CONFIG_USB_STORAGE=y
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
--- /dev/null
+++ b/bananapi_bpi-r64-emmc_env
@@ -0,0 +1,56 @@
@@ -399,10 +411,10 @@
+serverip=192.168.1.254
+loadaddr=0x48000000
+bootcmd=if pstore check ; then run boot_recovery ; else run boot_emmc ; fi
-+bootargs=root=/dev/mmcblk0p65
-+bootconf=config-mt7622-bananapi-bpi-r64-pcie1
-+bootconf_pcie=config-mt7622-bananapi-bpi-r64-pcie1
-+bootconf_sata=config-mt7622-bananapi-bpi-r64-sata
++bootargs=root=/dev/fit0
++bootconf=config-1#mt7622-bananapi-bpi-r64-pcie1
++bootconf_pcie=config-1#mt7622-bananapi-bpi-r64-pcie1
++bootconf_sata=config-1#mt7622-bananapi-bpi-r64-sata
+bootdelay=0
+bootfile=openwrt-mediatek-mt7622-bananapi_bpi-r64-initramfs-recovery.itb
+bootfile_upg=openwrt-mediatek-mt7622-bananapi_bpi-r64-squashfs-sysupgrade.itb
@@ -442,8 +454,8 @@
+emmc_write_fip=mmc dev 0 0 && mmc erase 0x1000 0x1000 && mmc write $loadaddr 0x1000 0x1000 && mmc erase 0x2000 0x800
+emmc_read_production=mmc dev 0 && part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_read_vol
+emmc_read_recovery=mmc dev 0 && part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_read_vol
-+mmc_write_vol=imszb $fileaddr image_size && test 0x$image_size -le 0x$part_size && mmc erase 0x$part_addr 0x$part_size && mmc write $fileaddr 0x$part_addr 0x$image_size
-+mmc_read_vol=mmc read $loadaddr $part_addr 0x8 && imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc read $loadaddr 0x$part_addr 0x$image_size
++mmc_write_vol=imszb $fileaddr image_size && test 0x$image_size -le 0x$part_size && mmc erase 0x$part_addr 0x$image_size && mmc write $fileaddr 0x$part_addr 0x$image_size
++mmc_read_vol=mmc read $loadaddr $part_addr 0x100 && imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc read $loadaddr 0x$part_addr 0x$image_size
+part_default=production
+part_recovery=recovery
+reset_factory=eraseenv && reset
@@ -453,12 +465,14 @@
+_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
--- /dev/null
+++ b/configs/mt7622_bananapi_bpi-r64-snand_defconfig
-@@ -0,0 +1,139 @@
+@@ -0,0 +1,145 @@
+CONFIG_ARM=y
+CONFIG_POSITION_INDEPENDENT=y
+CONFIG_ARCH_MEDIATEK=y
-+CONFIG_SYS_TEXT_BASE=0x41e00000
++CONFIG_TEXT_BASE=0x41e00000
+CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_SYS_LOAD_ADDR=0x40080000
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
+CONFIG_USE_DEFAULT_ENV_FILE=y
+CONFIG_BOARD_LATE_INIT=y
+CONFIG_BOOTP_SEND_HOSTNAME=y
@@ -467,6 +481,7 @@
+CONFIG_DEBUG_UART_CLOCK=25000000
+CONFIG_DEFAULT_DEVICE_TREE="mt7622-bananapi-bpi-r64"
+CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_OF_SYSTEM_SETUP=y
+CONFIG_DEBUG_UART=y
+CONFIG_DEFAULT_ENV_FILE="bananapi_bpi-r64-snand_env"
+CONFIG_DISTRO_DEFAULTS=y
@@ -560,7 +575,6 @@
+CONFIG_PCI=y
+CONFIG_MTD=y
+CONFIG_MTD_UBI_FASTMAP=y
-+CONFIG_MTDPARTS_DEFAULT="mtdparts=spi-nand0:512k(bl2),2048k(fip),-(ubi)"
+CONFIG_DM_PCI=y
+CONFIG_PCIE_MEDIATEK=y
+CONFIG_PINCTRL=y
@@ -593,17 +607,21 @@
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_XHCI_MTK=y
+CONFIG_USB_STORAGE=y
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.3"
--- /dev/null
+++ b/bananapi_bpi-r64-snand_env
-@@ -0,0 +1,57 @@
+@@ -0,0 +1,56 @@
+ipaddr=192.168.1.1
+serverip=192.168.1.254
+loadaddr=0x48000000
-+bootargs=root=/dev/ubiblock0_2p1
++bootargs=ubi.block=0,fit root=/dev/fit0
+bootcmd=if pstore check ; then run boot_recovery ; else run boot_ubi ; fi
-+bootconf=config-mt7622-bananapi-bpi-r64-pcie1
-+bootconf_pcie=config-mt7622-bananapi-bpi-r64-pcie1
-+bootconf_sata=config-mt7622-bananapi-bpi-r64-sata
++bootconf=config-1#mt7622-bananapi-bpi-r64-pcie1
++bootconf_pcie=config-1#mt7622-bananapi-bpi-r64-pcie1
++bootconf_sata=config-1#mt7622-bananapi-bpi-r64-sata
+bootdelay=0
+bootfile=openwrt-mediatek-mt7622-bananapi_bpi-r64-initramfs-recovery.itb
+bootfile_fip=openwrt-mediatek-mt7622-bananapi_bpi-r64-snand-bl31-uboot.fip
@@ -634,22 +652,21 @@
+boot_tftp_forever=led $bootled_rec on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done
+boot_tftp_production=tftpboot $loadaddr $bootfile_upg && iminfo $loadaddr && ubi part ubi && run ubi_write_production ubi_prepare_rootfs ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
+boot_tftp_recovery=tftpboot $loadaddr $bootfile && iminfo $loadaddr && ubi part ubi && run ubi_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
-+boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run boot_write_bl2
-+boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run boot_write_fip
++boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run snand_write_bl2
++boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run ubi_write_fip
+boot_ubi=ubi part ubi && run boot_production ; run boot_recovery
-+boot_write_bl2=mtd erase bl2 && mtd write spi-nand0 $loadaddr 0x0 0x20000 && mtd write spi-nand0 $loadaddr 0x20000 0x20000 && mtd write spi-nand0 $loadaddr 0x40000 0x20000 && mtd write spi-nand0 $loadaddr 0x60000 0x20000
-+boot_write_fip=mtd erase fip && mtd write fip $loadaddr
++snand_write_bl2=mtd erase bl2 && mtd write bl2 $loadaddr 0x0 0x20000 && mtd write bl2 $loadaddr 0x20000 0x20000 && mtd write bl2 $loadaddr 0x40000 0x20000 && mtd write bl2 $loadaddr 0x60000 0x20000
+check_ubi=ubi part ubi || run ubi_format
-+reset_factory=ubi part ubi ; ubi write 0x0 ubootenv 0x0 ; ubi write 0x0 ubootenv2 0x0 ; ubi remove rootfs_data
-+ubi_format=ubi detach ; mtd erase ubi && ubi part ubi ; reset
++reset_factory=mw $loadaddr 0x0 0x1f000 ; ubi part ubi ; ubi write $loadaddr ubootenv 0x1f000 ; ubi write $loadaddr ubootenv2 0x1f000 ; ubi remove rootfs_data
+ubi_prepare_rootfs=if ubi check rootfs_data ; then else if env exists rootfs_data_max ; then ubi create rootfs_data $rootfs_data_max dynamic || ubi create rootfs_data - dynamic ; else ubi create rootfs_data - dynamic ; fi ; fi
+ubi_read_production=ubi read $loadaddr fit && iminfo $loadaddr && run ubi_prepare_rootfs
+ubi_read_recovery=ubi check recovery && ubi read $loadaddr recovery
+ubi_remove_rootfs=ubi check rootfs_data && ubi remove rootfs_data
++ubi_write_fip=ubi check fip && ubi remove fip ; ubi create fip 0x200000 static ; ubi write $loadaddr fip 0x200000
+ubi_write_production=ubi check fit && env exists replacevol && ubi remove fit ; if ubi check fit ; then else run ubi_remove_rootfs ; ubi create fit $filesize dynamic 2 && ubi write $loadaddr fit $filesize ; fi
+ubi_write_recovery=ubi check recovery && env exists replacevol && ubi remove recovery ; if ubi check recovery ; then else run ubi_remove_rootfs ; ubi create recovery $filesize dynamic 3 && ubi write $loadaddr recovery $filesize ; fi
-+_create_env=ubi create ubootenv 0x100000 dynamic 0 ; ubi create ubootenv2 0x100000 dynamic 1 ; ubi create fit 0x100000 dynamic 2 ; ubi create recovery 0x100000 dynamic 3
-+_init_env=setenv _init_env ; if ubi check ubootenv && ubi check ubootenv2 ; then else run _create_env ; fi ; setenv _create_env ; saveenv || run ubi_format ; saveenv || run ubi_format
-+_firstboot=setenv _firstboot ; run _switch_to_menu ; run check_ubi ; run _init_env ; run boot_first
++_create_env=ubi create ubootenv 0x1f000 dynamic ; ubi create ubootenv2 0x1f000 dynamic
++_init_env=setenv _init_env ; if ubi check ubootenv && ubi check ubootenv2 ; then else run _create_env ; fi ; setenv _create_env ; saveenv ; saveenv
++_firstboot=setenv _firstboot ; run _switch_to_menu ; run _init_env ; run boot_first
+_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
+_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
diff --git a/package/boot/uboot-mediatek/patches/405-dts-mt7623n-bpi-r2-fix-leds.patch b/package/boot/uboot-mediatek/patches/405-dts-mt7623n-bpi-r2-fix-leds.patch
new file mode 100644
index 00000000000..2ebbba8a854
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/405-dts-mt7623n-bpi-r2-fix-leds.patch
@@ -0,0 +1,25 @@
+--- a/arch/arm/dts/mt7623n-bananapi-bpi-r2.dts
++++ b/arch/arm/dts/mt7623n-bananapi-bpi-r2.dts
+@@ -51,19 +51,19 @@
+
+ blue {
+ label = "bpi-r2:pio:blue";
+- gpios = <&gpio 241 GPIO_ACTIVE_HIGH>;
++ gpios = <&gpio 240 GPIO_ACTIVE_LOW>;
+ default-state = "off";
+ };
+
+ green {
+ label = "bpi-r2:pio:green";
+- gpios = <&gpio 240 GPIO_ACTIVE_HIGH>;
++ gpios = <&gpio 241 GPIO_ACTIVE_LOW>;
+ default-state = "off";
+ };
+
+ red {
+ label = "bpi-r2:pio:red";
+- gpios = <&gpio 239 GPIO_ACTIVE_HIGH>;
++ gpios = <&gpio 239 GPIO_ACTIVE_LOW>;
+ default-state = "off";
+ };
+ };
diff --git a/package/boot/uboot-mediatek/patches/406-dts-mt7623n-bpi-r2-uart0-force-highspeed.patch b/package/boot/uboot-mediatek/patches/406-dts-mt7623n-bpi-r2-uart0-force-highspeed.patch
new file mode 100644
index 00000000000..6710e3ea4ee
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/406-dts-mt7623n-bpi-r2-uart0-force-highspeed.patch
@@ -0,0 +1,10 @@
+--- a/arch/arm/dts/mt7623n-bananapi-bpi-r2.dts
++++ b/arch/arm/dts/mt7623n-bananapi-bpi-r2.dts
+@@ -245,6 +245,7 @@
+ &uart0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart0_pins_a>;
++ mediatek,force-highspeed;
+ status = "okay";
+ };
+
diff --git a/package/boot/uboot-mediatek/patches/410-add-linksys-e8450.patch b/package/boot/uboot-mediatek/patches/410-add-linksys-e8450.patch
index 5b52206e1c7..08aee125aa8 100644
--- a/package/boot/uboot-mediatek/patches/410-add-linksys-e8450.patch
+++ b/package/boot/uboot-mediatek/patches/410-add-linksys-e8450.patch
@@ -1,12 +1,13 @@
--- /dev/null
+++ b/configs/mt7622_linksys_e8450_defconfig
-@@ -0,0 +1,135 @@
+@@ -0,0 +1,140 @@
+CONFIG_ARM=y
+CONFIG_POSITION_INDEPENDENT=y
+CONFIG_ARCH_MEDIATEK=y
+CONFIG_TARGET_MT7622=y
-+CONFIG_SYS_TEXT_BASE=0x41e00000
++CONFIG_TEXT_BASE=0x41e00000
+CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_SYS_LOAD_ADDR=0x40080000
+CONFIG_USE_DEFAULT_ENV_FILE=y
+CONFIG_BOARD_LATE_INIT=y
+CONFIG_BOOTP_SEND_HOSTNAME=y
@@ -16,7 +17,6 @@
+CONFIG_DEBUG_UART_CLOCK=25000000
+CONFIG_DEFAULT_DEVICE_TREE="mt7622-linksys-e8450-ubi"
+CONFIG_DEBUG_UART=y
-+CONFIG_MTDPARTS_DEFAULT="mtdparts=spi-nand0:512k(bl2),1280k(fip),1024k(factory),256k(reserved),-(ubi)"
+CONFIG_SMBIOS_PRODUCT_NAME=""
+CONFIG_AUTOBOOT_KEYED=y
+CONFIG_BOOTDELAY=30
@@ -57,7 +57,7 @@
+CONFIG_CMD_LINK_LOCAL=y
+# CONFIG_CMD_MBR is not set
+CONFIG_CMD_MTD=y
-+CONFIG_CMD_MTDPART=y
++CONFIG_CMD_MTDPARTS=y
+CONFIG_CMD_PCI=y
+CONFIG_CMD_SF_TEST=y
+CONFIG_CMD_PING=y
@@ -125,12 +125,17 @@
+CONFIG_MTK_SPI_NAND=y
+CONFIG_MTK_SPI_NAND_MTD=y
+CONFIG_SYSRESET_WATCHDOG=y
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
+CONFIG_WDT_MTK=y
+CONFIG_LZO=y
+CONFIG_ZSTD=y
+CONFIG_HEXDUMP=y
+CONFIG_RANDOM_UUID=y
+CONFIG_REGEX=y
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
+CONFIG_USB=y
+CONFIG_USB_HOST=y
+CONFIG_USB_XHCI_HCD=y
@@ -138,7 +143,7 @@
+CONFIG_USB_STORAGE=y
--- /dev/null
+++ b/arch/arm/dts/mt7622-linksys-e8450-ubi.dts
-@@ -0,0 +1,195 @@
+@@ -0,0 +1,214 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2019 MediaTek Inc.
@@ -146,6 +151,7 @@
+ */
+
+/dts-v1/;
++#include <dt-bindings/input/linux-event-codes.h>
+#include "mt7622.dtsi"
+#include "mt7622-u-boot.dtsi"
+
@@ -169,11 +175,13 @@
+ factory {
+ label = "reset";
+ gpios = <&gpio 0 GPIO_ACTIVE_LOW>;
++ linux,code = <KEY_RESTART>;
+ };
+
+ wps {
+ label = "wps";
+ gpios = <&gpio 102 GPIO_ACTIVE_LOW>;
++ linux,code = <KEY_WPS_BUTTON>;
+ };
+ };
+
@@ -298,11 +306,27 @@
+ pinctrl-0 = <&snfi_pins>;
+ status = "okay";
+ quad-spi;
++
++ partitions {
++ compatible = "fixed-partitions";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ partition@0 {
++ label = "bl2";
++ reg = <0x0 0x80000>;
++ };
++
++ partition@80000 {
++ label = "ubi";
++ reg = <0x80000 0x7f80000>;
++ compatible = "linux,ubi";
++ };
++ };
+};
+
+&uart0 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&uart0_pins>;
++ mediatek,force-highspeed;
+ status = "okay";
+};
+
@@ -315,12 +339,12 @@
+&eth {
+ status = "okay";
+ mediatek,gmac-id = <0>;
-+ phy-mode = "sgmii";
++ phy-mode = "2500base-x";
+ mediatek,switch = "mt7531";
+ reset-gpios = <&gpio 54 GPIO_ACTIVE_HIGH>;
+
+ fixed-link {
-+ speed = <1000>;
++ speed = <2500>;
+ full-duplex;
+ };
+};
@@ -336,18 +360,18 @@
+};
--- a/arch/arm/dts/Makefile
+++ b/arch/arm/dts/Makefile
-@@ -1007,6 +1007,7 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += \
+@@ -1422,6 +1422,7 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += \
mt7622-rfb.dtb \
mt7623a-unielec-u7623-02-emmc.dtb \
mt7622-bananapi-bpi-r64.dtb \
+ mt7622-linksys-e8450-ubi.dtb \
mt7623n-bananapi-bpi-r2.dtb \
mt7629-rfb.dtb \
- mt8512-bm1-emmc.dtb \
+ mt7981-rfb.dtb \
--- /dev/null
+++ b/linksys_e8450_env
-@@ -0,0 +1,57 @@
-+ethaddr_factory=mtd read spi-nand0 0x40080000 0x220000 0x20000 && env readmem -b ethaddr 0x4009fff4 0x6 ; setenv ethaddr_factory
+@@ -0,0 +1,54 @@
++ethaddr_factory=ubi read 0x40080000 factory && env readmem -b ethaddr 0x400ffff4 0x6 ; setenv ethaddr_factory
+ipaddr=192.168.1.1
+serverip=192.168.1.254
+loadaddr=0x48000000
@@ -379,28 +403,26 @@
+boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
+boot_production=led $bootled_pwr on ; run ubi_read_production && bootm $loadaddr#$bootconf ; led $bootled_pwr off
+boot_recovery=led $bootled_rec on ; run ubi_read_recovery ; bootm $loadaddr#$bootconf ; ubi remove recovery ; led $bootled_rec off
-+boot_serial_write_bl2=loadx $loadaddr 115200 && run boot_write_bl2
-+boot_serial_write_fip=loadx $loadaddr 115200 && run boot_write_fip
++boot_serial_write_bl2=loadx $loadaddr 115200 && run snand_write_bl2
++boot_serial_write_fip=loadx $loadaddr 115200 && run ubi_write_fip
+boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr#$bootconf
+boot_tftp_forever=led $bootled_rec on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done
+boot_tftp_production=tftpboot $loadaddr $bootfile_upg && iminfo $loadaddr && ubi part ubi && run ubi_write_production ubi_prepare_rootfs ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
+boot_tftp_recovery=tftpboot $loadaddr $bootfile && iminfo $loadaddr && ubi part ubi && run ubi_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
-+boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run boot_write_bl2
-+boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run boot_write_fip
++boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run snand_write_bl2
++boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run ubi_write_fip
+boot_ubi=ubi part ubi && run boot_production ; run boot_recovery
-+boot_write_bl2=mtd erase bl2 && mtd write spi-nand0 $loadaddr 0x0 0x20000 && mtd write spi-nand0 $loadaddr 0x20000 0x20000 && mtd write spi-nand0 $loadaddr 0x40000 0x20000 && mtd write spi-nand0 $loadaddr 0x60000 0x20000
-+boot_write_fip=mtd erase fip && mtd write fip $loadaddr
-+check_ubi=ubi part ubi || run ubi_format
-+reset_factory=ubi part ubi ; ubi write 0x0 ubootenv 0x0 ; ubi write 0x0 ubootenv2 0x0 ; ubi remove rootfs_data
-+ubi_format=ubi detach ; mtd erase ubi && ubi part ubi ; reset
++snand_write_bl2=mtd erase bl2 && mtd write spi-nand0 $loadaddr 0x0 0x20000 && mtd write spi-nand0 $loadaddr 0x20000 0x20000 && mtd write spi-nand0 $loadaddr 0x40000 0x20000 && mtd write spi-nand0 $loadaddr 0x60000 0x20000
++reset_factory=mw $loadaddr 0xff 0x1f000 ; ubi part ubi ; ubi write $loadaddr ubootenv 0x1f000 ; ubi write $loadaddr ubootenv2 0x1f000 ; ubi remove rootfs_data
+ubi_prepare_rootfs=if ubi check rootfs_data ; then else if env exists rootfs_data_max ; then ubi create rootfs_data $rootfs_data_max dynamic || ubi create rootfs_data - dynamic ; else ubi create rootfs_data - dynamic ; fi ; fi
+ubi_read_production=ubi read $loadaddr fit && iminfo $loadaddr && run ubi_prepare_rootfs
+ubi_read_recovery=ubi check recovery && ubi read $loadaddr recovery
+ubi_remove_rootfs=ubi check rootfs_data && ubi remove rootfs_data
++ubi_write_fip=ubi check fip || ubi create fip 0x200000 static ; ubi write $loadaddr fip 0x200000
+ubi_write_production=ubi check fit && env exists replacevol && ubi remove fit ; if ubi check fit ; then else run ubi_remove_rootfs ; ubi create fit $filesize dynamic && ubi write $loadaddr fit $filesize ; fi
+ubi_write_recovery=ubi check recovery && env exists replacevol && ubi remove recovery ; if ubi check recovery ; then else run ubi_remove_rootfs ; ubi create recovery $filesize dynamic && ubi write $loadaddr recovery $filesize ; fi
-+_create_env=ubi create ubootenv 0x100000 dynamic ; ubi create ubootenv2 0x100000 dynamic
++_create_env=ubi create ubootenv 0x1f000 dynamic ; ubi create ubootenv2 0x1f000 dynamic
+_init_env=setenv _init_env ; if ubi check ubootenv && ubi check ubootenv2 ; then else run _create_env ; fi ; setenv _create_env ; saveenv || run ubi_format ; saveenv || run ubi_format
-+_firstboot=setenv _firstboot ; run _switch_to_menu ; run ethaddr_factory ; run check_ubi ; run _init_env ; run boot_first
++_firstboot=setenv _firstboot ; run _switch_to_menu ; run ethaddr_factory ; run _init_env ; run boot_first
+_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
+_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
diff --git a/package/boot/uboot-mediatek/patches/412-add-ubnt-unifi-6-lr.patch b/package/boot/uboot-mediatek/patches/412-add-ubnt-unifi-6-lr.patch
index bac4a86d050..bbd05fe41f9 100644
--- a/package/boot/uboot-mediatek/patches/412-add-ubnt-unifi-6-lr.patch
+++ b/package/boot/uboot-mediatek/patches/412-add-ubnt-unifi-6-lr.patch
@@ -1,12 +1,13 @@
--- /dev/null
-+++ b/configs/mt7622_ubnt_unifi-6-lr_defconfig
-@@ -0,0 +1,140 @@
++++ b/configs/mt7622_ubnt_unifi-6-lr-v1_defconfig
+@@ -0,0 +1,147 @@
+CONFIG_ARM=y
+CONFIG_POSITION_INDEPENDENT=y
+CONFIG_ARCH_MEDIATEK=y
+CONFIG_TARGET_MT7622=y
-+CONFIG_SYS_TEXT_BASE=0x41e00000
++CONFIG_TEXT_BASE=0x41e00000
+CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_SYS_LOAD_ADDR=0x40080000
+CONFIG_USE_DEFAULT_ENV_FILE=y
+CONFIG_MTDPARTS_DEFAULT="mtdparts=nor0:128k(bl2),640k(fip),64k(u-boot-env),256k(factory),64k(eeprom),15232k(recovery),-(firmware)"
+CONFIG_ENV_IS_IN_MTD=y
@@ -63,7 +64,7 @@
+CONFIG_CMD_LINK_LOCAL=y
+# CONFIG_CMD_MBR is not set
+CONFIG_CMD_MTD=y
-+CONFIG_CMD_MTDPART=y
++CONFIG_CMD_MTDPARTS=y
+# CONFIG_CMD_PCI is not set
+CONFIG_CMD_SF_TEST=y
+CONFIG_CMD_PING=y
@@ -141,9 +142,314 @@
+CONFIG_SPI_FLASH_SST=y
+CONFIG_SPI_FLASH_WINBOND=y
+CONFIG_SPI_FLASH_XMC=y
++CONFIG_SPI_FLASH_USE_4K_SECTORS=y
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
+--- /dev/null
++++ b/configs/mt7622_ubnt_unifi-6-lr-v2_defconfig
+@@ -0,0 +1,147 @@
++CONFIG_ARM=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TARGET_MT7622=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_SYS_LOAD_ADDR=0x40080000
++CONFIG_USE_DEFAULT_ENV_FILE=y
++CONFIG_MTDPARTS_DEFAULT="mtdparts=nor0:128k(bl2),640k(fip),64k(u-boot-env),256k(factory),64k(eeprom),15232k(recovery),-(firmware)"
++CONFIG_ENV_IS_IN_MTD=y
++CONFIG_ENV_MTD_NAME="nor0"
++CONFIG_ENV_SIZE_REDUND=0x4000
++CONFIG_ENV_SIZE=0x4000
++CONFIG_ENV_OFFSET=0xc0000
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_RESET_BUTTON_SETTLE_DELAY=400
++CONFIG_BOOTP_SEND_HOSTNAME=y
++CONFIG_DEFAULT_ENV_FILE="ubnt_unifi-6-lr-v2_env"
++CONFIG_DEBUG_UART_BASE=0x11002000
++CONFIG_DEBUG_UART_CLOCK=25000000
++CONFIG_DEFAULT_DEVICE_TREE="mt7622-ubnt-unifi-6-lr"
++CONFIG_DEBUG_UART=y
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_BOOTDELAY=30
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LOGLEVEL=7
++CONFIG_LOG=y
++CONFIG_DEFAULT_FDT_FILE="mt7622-ubnt-unifi-6-lr"
++CONFIG_SYS_PROMPT="MT7622> "
++# CONFIG_LEGACY_IMAGE_FORMAT is not set
++# CONFIG_BOOTM_PLAN9 is not set
++# CONFIG_BOOTM_RTEMS is not set
++# CONFIG_BOOTM_VXWORKS is not set
++# CONFIG_EFI is not set
++# CONFIG_EFI_LOADER is not set
++CONFIG_CMD_BOOTMENU=y
++# CONFIG_CMD_BOOTEFI is not set
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++# CONFIG_CMD_ELF is not set
++# CONFIG_CMD_BOOTEFI_BOOTMGR is not set
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LINK_LOCAL=y
++# CONFIG_CMD_MBR is not set
++CONFIG_CMD_MTD=y
++CONFIG_CMD_MTDPARTS=y
++# CONFIG_CMD_PCI is not set
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
++CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++# CONFIG_CMD_UNLZ4 is not set
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_UUID=y
++CONFIG_DISPLAY_CPUINFO=y
++CONFIG_DM_ETH=y
++CONFIG_DM_ETH_PHY=y
++CONFIG_DM_GPIO=y
++CONFIG_DM_MDIO=y
++CONFIG_DM_MTD=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++# CONFIG_DM_MMC is not set
++CONFIG_DM_SERIAL=y
++CONFIG_DM_SPI=y
++CONFIG_DM_SPI_FLASH=y
++CONFIG_HUSH_PARSER=y
++# CONFIG_PARTITION_UUIDS is not set
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++# CONFIG_LED is not set
++# CONFIG_LZ4 is not set
++CONFIG_VERSION_VARIABLE=y
++CONFIG_NETCONSOLE=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_PHY=y
++CONFIG_PHY_FIXED=y
++CONFIG_PHYLIB_10G=y
++CONFIG_PHY_AQUANTIA=y
++CONFIG_PHY_ADDR_ENABLE=y
++CONFIG_PHY_ADDR=8
++CONFIG_MEDIATEK_ETH=y
++CONFIG_MTD=y
++# CONFIG_MMC is not set
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7622=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_RAM=y
++CONFIG_MTK_SERIAL=y
++CONFIG_SPI=y
++CONFIG_MTK_SNFI_SPI=y
++CONFIG_MTK_SNOR=y
++CONFIG_SYSRESET_WATCHDOG=y
++CONFIG_WDT_MTK=y
++CONFIG_HEXDUMP=y
++CONFIG_RANDOM_UUID=y
++CONFIG_REGEX=y
++CONFIG_SPI_FLASH=y
++CONFIG_SPI_FLASH_BAR=y
++CONFIG_SPI_FLASH_MTD=y
++CONFIG_SPI_FLASH_UNLOCK_ALL=y
++CONFIG_SPI_FLASH_EON=y
++CONFIG_SPI_FLASH_GIGADEVICE=y
++CONFIG_SPI_FLASH_MACRONIX=y
++CONFIG_SPI_FLASH_SPANSION=y
++CONFIG_SPI_FLASH_STMICRO=y
++CONFIG_SPI_FLASH_SST=y
++CONFIG_SPI_FLASH_WINBOND=y
++CONFIG_SPI_FLASH_XMC=y
++CONFIG_SPI_FLASH_USE_4K_SECTORS=y
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
+--- /dev/null
++++ b/configs/mt7622_ubnt_unifi-6-lr-v3_defconfig
+@@ -0,0 +1,146 @@
++CONFIG_ARM=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TARGET_MT7622=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_SYS_LOAD_ADDR=0x40080000
++CONFIG_USE_DEFAULT_ENV_FILE=y
++CONFIG_MTDPARTS_DEFAULT="mtdparts=nor0:128k(bl2),640k(fip),64k(u-boot-env),256k(factory),64k(eeprom),15232k(recovery),-(firmware)"
++CONFIG_ENV_IS_IN_MTD=y
++CONFIG_ENV_MTD_NAME="nor0"
++CONFIG_ENV_SIZE_REDUND=0x4000
++CONFIG_ENV_SIZE=0x4000
++CONFIG_ENV_OFFSET=0xc0000
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_RESET_BUTTON_SETTLE_DELAY=400
++CONFIG_BOOTP_SEND_HOSTNAME=y
++CONFIG_DEFAULT_ENV_FILE="ubnt_unifi-6-lr_env"
++CONFIG_DEBUG_UART_BASE=0x11002000
++CONFIG_DEBUG_UART_CLOCK=25000000
++CONFIG_DEFAULT_DEVICE_TREE="mt7622-ubnt-unifi-6-lr-v3"
++CONFIG_DEBUG_UART=y
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_BOOTDELAY=30
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LOGLEVEL=7
++CONFIG_LOG=y
++CONFIG_DEFAULT_FDT_FILE="mt7622-ubnt-unifi-6-lr-v3"
++CONFIG_SYS_PROMPT="MT7622> "
++# CONFIG_LEGACY_IMAGE_FORMAT is not set
++# CONFIG_BOOTM_PLAN9 is not set
++# CONFIG_BOOTM_RTEMS is not set
++# CONFIG_BOOTM_VXWORKS is not set
++# CONFIG_EFI is not set
++# CONFIG_EFI_LOADER is not set
++CONFIG_CMD_BOOTMENU=y
++# CONFIG_CMD_BOOTEFI is not set
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++# CONFIG_CMD_ELF is not set
++# CONFIG_CMD_BOOTEFI_BOOTMGR is not set
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LINK_LOCAL=y
++# CONFIG_CMD_MBR is not set
++CONFIG_CMD_MTD=y
++CONFIG_CMD_MTDPARTS=y
++# CONFIG_CMD_PCI is not set
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
++CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++# CONFIG_CMD_UNLZ4 is not set
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_UUID=y
++CONFIG_DISPLAY_CPUINFO=y
++CONFIG_DM_ETH=y
++CONFIG_DM_ETH_PHY=y
++CONFIG_DM_GPIO=y
++CONFIG_DM_MDIO=y
++CONFIG_DM_MTD=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++# CONFIG_DM_MMC is not set
++CONFIG_DM_SERIAL=y
++CONFIG_DM_SPI=y
++CONFIG_DM_SPI_FLASH=y
++CONFIG_HUSH_PARSER=y
++# CONFIG_PARTITION_UUIDS is not set
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++# CONFIG_LED is not set
++# CONFIG_LZ4 is not set
++CONFIG_VERSION_VARIABLE=y
++CONFIG_NETCONSOLE=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_PHY=y
++CONFIG_PHY_FIXED=y
++CONFIG_PHY_REALTEK=y
++CONFIG_PHY_ADDR_ENABLE=y
++CONFIG_PHY_ADDR=0
++CONFIG_MEDIATEK_ETH=y
++CONFIG_MTD=y
++# CONFIG_MMC is not set
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7622=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_RAM=y
++CONFIG_MTK_SERIAL=y
++CONFIG_SPI=y
++CONFIG_MTK_SNFI_SPI=y
++CONFIG_MTK_SNOR=y
++CONFIG_SYSRESET_WATCHDOG=y
++CONFIG_WDT_MTK=y
++CONFIG_HEXDUMP=y
++CONFIG_RANDOM_UUID=y
++CONFIG_REGEX=y
++CONFIG_SPI_FLASH=y
++CONFIG_SPI_FLASH_BAR=y
++CONFIG_SPI_FLASH_MTD=y
++CONFIG_SPI_FLASH_UNLOCK_ALL=y
++CONFIG_SPI_FLASH_EON=y
++CONFIG_SPI_FLASH_GIGADEVICE=y
++CONFIG_SPI_FLASH_MACRONIX=y
++CONFIG_SPI_FLASH_SPANSION=y
++CONFIG_SPI_FLASH_STMICRO=y
++CONFIG_SPI_FLASH_SST=y
++CONFIG_SPI_FLASH_WINBOND=y
++CONFIG_SPI_FLASH_XMC=y
++CONFIG_SPI_FLASH_USE_4K_SECTORS=y
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
--- /dev/null
+++ b/arch/arm/dts/mt7622-ubnt-unifi-6-lr.dts
-@@ -0,0 +1,202 @@
+@@ -0,0 +1,193 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2019 MediaTek Inc.
@@ -151,6 +457,7 @@
+ */
+
+/dts-v1/;
++#include <dt-bindings/input/linux-event-codes.h>
+#include "mt7622.dtsi"
+#include "mt7622-u-boot.dtsi"
+
@@ -165,18 +472,22 @@
+ tick-timer = &timer0;
+ };
+
++ memory@40000000 {
++ device_type = "memory";
++ reg = <0x40000000 0x20000000>;
++ };
++
+ aliases {
+ spi0 = &snor;
+ };
+
+ gpio-keys {
+ compatible = "gpio-keys";
-+ u-boot,dm-pre-reloc;
+
+ reset {
+ label = "reset";
+ gpios = <&gpio 62 GPIO_ACTIVE_LOW>;
-+ u-boot,dm-pre-reloc;
++ linux,code = <KEY_RESTART>;
+ };
+ };
+
@@ -282,19 +593,202 @@
+ };
+};
+
-+&snfi {
-+ pinctrl-names = "default", "snfi";
++&snor {
++ pinctrl-names = "default";
+ pinctrl-0 = <&snor_pins>;
-+ pinctrl-1 = <&snfi_pins>;
+ status = "okay";
+
+ spi-flash@0 {
+ compatible = "jedec,spi-nor";
+ reg = <0>;
++ spi-tx-bus-width = <1>;
++ spi-rx-bus-width = <4>;
+ u-boot,dm-pre-reloc;
+ };
+};
+
++&uart0 {
++ mediatek,force-highspeed;
++ status = "okay";
++};
++
++&watchdog {
++ pinctrl-names = "default";
++ pinctrl-0 = <&watchdog_pins>;
++ status = "okay";
++};
++
++&eth {
++ status = "okay";
++ pinctrl-names = "default";
++ pinctrl-0 = <&eth_pins>;
++
++ mediatek,gmac-id = <0>;
++ phy-mode = "2500base-x";
++ phy-handle = <&gphy>;
++
++ fixed-link {
++ speed = <2500>;
++ full-duplex;
++ };
++
++ mdio-bus {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ gphy: ethernet-phy@8 {
++ /* Marvell AQRate AQR112W - no driver */
++ compatible = "ethernet-phy-ieee802.3-c45";
++ reg = <0x8>;
++ };
++ };
++};
+--- /dev/null
++++ b/arch/arm/dts/mt7622-ubnt-unifi-6-lr-v3.dts
+@@ -0,0 +1,193 @@
++// SPDX-License-Identifier: GPL-2.0
++/*
++ * Copyright (c) 2019 MediaTek Inc.
++ * Author: Sam Shih <sam.shih@mediatek.com>
++ */
++
++/dts-v1/;
++#include <dt-bindings/input/linux-event-codes.h>
++#include "mt7622.dtsi"
++#include "mt7622-u-boot.dtsi"
++
++/ {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ model = "mt7622-ubnt-unifi-6-lr-v3";
++ compatible = "mediatek,mt7622", "ubnt,unifi-6-lr-v3";
++
++ chosen {
++ stdout-path = &uart0;
++ tick-timer = &timer0;
++ };
++
++ memory@40000000 {
++ device_type = "memory";
++ reg = <0x40000000 0x20000000>;
++ };
++
++ aliases {
++ spi0 = &snor;
++ };
++
++ gpio-keys {
++ compatible = "gpio-keys";
++
++ reset {
++ label = "reset";
++ gpios = <&gpio 62 GPIO_ACTIVE_LOW>;
++ linux,code = <KEY_RESTART>;
++ };
++ };
++
++ memory@40000000 {
++ device_type = "memory";
++ reg = <0x40000000 0x20000000>;
++ };
++
++ reg_1p8v: regulator-1p8v {
++ compatible = "regulator-fixed";
++ regulator-name = "fixed-1.8V";
++ regulator-min-microvolt = <1800000>;
++ regulator-max-microvolt = <1800000>;
++ regulator-boot-on;
++ regulator-always-on;
++ };
++
++ reg_3p3v: regulator-3p3v {
++ compatible = "regulator-fixed";
++ regulator-name = "fixed-3.3V";
++ regulator-min-microvolt = <3300000>;
++ regulator-max-microvolt = <3300000>;
++ regulator-boot-on;
++ regulator-always-on;
++ };
++
++ reg_5v: regulator-5v {
++ compatible = "regulator-fixed";
++ regulator-name = "fixed-5V";
++ regulator-min-microvolt = <5000000>;
++ regulator-max-microvolt = <5000000>;
++ regulator-boot-on;
++ regulator-always-on;
++ };
++};
++
++&pcie {
++ pinctrl-names = "default";
++ pinctrl-0 = <&pcie0_pins>, <&pcie1_pins>;
++ status = "okay";
++
++ pcie@0,0 {
++ status = "okay";
++ };
++
++ pcie@1,0 {
++ status = "okay";
++ };
++};
++
++&pinctrl {
++ eth_pins: eth-pins {
++ mux {
++ function = "eth";
++ groups = "mdc_mdio", "rgmii_via_gmac2";
++ };
++ };
++
++ pcie0_pins: pcie0-pins {
++ mux {
++ function = "pcie";
++ groups = "pcie0_pad_perst",
++ "pcie0_1_waken",
++ "pcie0_1_clkreq";
++ };
++ };
++
++ pcie1_pins: pcie1-pins {
++ mux {
++ function = "pcie";
++ groups = "pcie1_pad_perst",
++ "pcie1_0_waken",
++ "pcie1_0_clkreq";
++ };
++ };
++
++ snfi_pins: snfi-pins {
++ mux {
++ function = "flash";
++ groups = "snfi";
++ };
++ };
++
++ snor_pins: snor-pins {
++ mux {
++ function = "flash";
++ groups = "spi_nor";
++ };
++ };
++
++ uart0_pins: uart0 {
++ mux {
++ function = "uart";
++ groups = "uart0_0_tx_rx" ;
++ };
++ };
++
++ watchdog_pins: watchdog-default {
++ mux {
++ function = "watchdog";
++ groups = "watchdog";
++ };
++ };
++};
++
+&snor {
+ pinctrl-names = "default";
+ pinctrl-0 = <&snor_pins>;
@@ -310,8 +804,7 @@
+};
+
+&uart0 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&uart0_pins>;
++ mediatek,force-highspeed;
+ status = "okay";
+};
+
@@ -331,7 +824,7 @@
+ phy-handle = <&gphy>;
+
+ fixed-link {
-+ speed = <1000>;
++ speed = <2500>;
+ full-duplex;
+ };
+
@@ -339,23 +832,24 @@
+ #address-cells = <1>;
+ #size-cells = <0>;
+
-+ gphy: ethernet-phy@8 {
-+ /* Marvell AQRate AQR112W - no driver */
-+ compatible = "ethernet-phy-ieee802.3-c45";
-+ reg = <0x8>;
++ gphy: ethernet-phy@0 {
++ /* RealTek RTL8211FS */
++ compatible = "ethernet-phy-ieee802.3-c22";
++ reg = <0x0>;
+ };
+ };
+};
--- a/arch/arm/dts/Makefile
+++ b/arch/arm/dts/Makefile
-@@ -1008,6 +1008,7 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += \
+@@ -1423,6 +1423,8 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += \
mt7623a-unielec-u7623-02-emmc.dtb \
mt7622-bananapi-bpi-r64.dtb \
mt7622-linksys-e8450-ubi.dtb \
+ mt7622-ubnt-unifi-6-lr.dtb \
++ mt7622-ubnt-unifi-6-lr-v3.dtb \
mt7623n-bananapi-bpi-r2.dtb \
mt7629-rfb.dtb \
- mt8512-bm1-emmc.dtb \
+ mt7981-rfb.dtb \
--- /dev/null
+++ b/ubnt_unifi-6-lr_env
@@ -0,0 +1,50 @@
@@ -365,10 +859,63 @@
+loadaddr=0x48000000
+bootcmd=if pstore check ; then run boot_recovery ; else run boot_nor ; fi
+bootdelay=0
-+bootfile=openwrt-mediatek-mt7622-ubnt_unifi-6-lr-ubootmod-initramfs-recovery.itb
-+bootfile_bl2=openwrt-mediatek-mt7622-ubnt_unifi-6-lr-ubootmod-preloader.bin
-+bootfile_fip=openwrt-mediatek-mt7622-ubnt_unifi-6-lr-ubootmod-bl31-uboot.fip
-+bootfile_upg=openwrt-mediatek-mt7622-ubnt_unifi-6-lr-ubootmod-squashfs-sysupgrade.itb
++bootfile=openwrt-mediatek-mt7622-ubnt_unifi-6-lr-v1-ubootmod-initramfs-recovery.itb
++bootfile_bl2=openwrt-mediatek-mt7622-ubnt_unifi-6-lr-v1-ubootmod-preloader.bin
++bootfile_fip=openwrt-mediatek-mt7622-ubnt_unifi-6-lr-v1-ubootmod-bl31-uboot.fip
++bootfile_upg=openwrt-mediatek-mt7622-ubnt_unifi-6-lr-v1-ubootmod-squashfs-sysupgrade.itb
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_default=0
++bootmenu_delay=0
++bootmenu_title= ( ( ( OpenWrt ) ) )
++bootmenu_0=Initialize environment.=run _firstboot
++bootmenu_0d=Run default boot command.=run boot_default
++bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
++bootmenu_2=Boot production system from flash.=run boot_production ; run bootmenu_confirm_return
++bootmenu_3=Boot recovery system from flash.=run boot_recovery ; run bootmenu_confirm_return
++bootmenu_4=Load production system via TFTP then write to flash.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_5=Load recovery system via TFTP then write to flash.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_6=Load BL31+U-Boot FIP via TFTP then write to flash.=run boot_tftp_write_fip ; run bootmenu_confirm_return
++bootmenu_7=Load BL2 preloader via TFTP then write to flash.=run boot_tftp_write_preloader ; run bootmenu_confirm_return
++bootmenu_8=Reboot.=reset
++bootmenu_9=Reset all settings to factory defaults.=run reset_factory ; reset
++boot_first=if button reset ; then run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
++boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
++boot_production=run nor_read_production && bootm $loadaddr
++boot_recovery=run nor_read_recovery ; bootm $loadaddr
++boot_serial_write_fip=loadx $loadaddr 115200 && run boot_write_fip
++boot_serial_write_preloader=loadx $loadaddr 115200 && run boot_write_preloader
++boot_tftp_forever=while true ; do run boot_tftp_recovery ; sleep 1 ; done
++boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run nor_write_production ; if env exists noboot ; then else bootm $loadaddr ; fi
++boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run nor_write_recovery ; if env exists noboot ; then else bootm $loadaddr ; fi
++boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr
++boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run boot_write_fip
++boot_tftp_write_preloader=tftpboot $loadaddr $bootfile_bl2 && run boot_write_preloader
++boot_nor=run boot_production ; run boot_recovery
++boot_write_fip=mtd erase nor0 0x20000 0x80000 && mtd write nor0 $loadaddr 0x20000 0x80000
++boot_write_preloader=mtd erase nor0 0x0 0x20000 && mtd write nor0 $loadaddr 0x0 0x20000
++reset_factory=mtd erase nor0 0xc0000 0x10000 && reset
++nor_read_production=mtd read nor0 $loadaddr 0x1000000 0x1000 && imsz $loadaddr image_size && mtd read nor0 $loadaddr 0x1000000 $image_size
++nor_read_recovery=mtd read nor0 $loadaddr 0x120000 0x1000 && imsz $loadaddr image_size && mtd read nor0 $loadaddr 0x120000 $image_size
++nor_pad_size=imsz $loadaddr image_size ; setexpr image_eb 0x$image_size / 0x1000 ; setexpr tmp1 0x$image_size % 0x1000 ; test 0x$tmp1 -gt 0 && setexpr image_eb 0x$image_eb + 1 ; setexpr image_eb 0x$image_eb * 0x1000
++nor_write_production=run nor_pad_size ; test 0x$image_eb -le 0x3000000 && mtd erase nor0 0x1000000 0x$image_eb && mtd write nor0 $loadaddr 0x1000000 $filesize
++nor_write_recovery=run nor_pad_size ; test 0x$image_eb -le 0xee0000 && mtd erase nor0 0x120000 0x$image_eb && mtd write nor0 $loadaddr 0x120000 $filesize
++_init_env=setenv _init_env ; saveenv
++_firstboot=setenv _firstboot ; run _switch_to_menu ; run ethaddr_factory ; run _init_env ; run boot_first
++_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
++_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
+--- /dev/null
++++ b/ubnt_unifi-6-lr-v2_env
+@@ -0,0 +1,50 @@
++ethaddr_factory=mtd read nor0 $loadaddr 0x110000 0x10000 && env readmem -b ethaddr $loadaddr 0x6 ; setenv ethaddr_factory
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x48000000
++bootcmd=if pstore check ; then run boot_recovery ; else run boot_nor ; fi
++bootdelay=0
++bootfile=openwrt-mediatek-mt7622-ubnt_unifi-6-lr-v2-ubootmod-initramfs-recovery.itb
++bootfile_bl2=openwrt-mediatek-mt7622-ubnt_unifi-6-lr-v2-ubootmod-preloader.bin
++bootfile_fip=openwrt-mediatek-mt7622-ubnt_unifi-6-lr-v2-ubootmod-bl31-uboot.fip
++bootfile_upg=openwrt-mediatek-mt7622-ubnt_unifi-6-lr-v2-ubootmod-squashfs-sysupgrade.itb
+bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
+bootmenu_default=0
+bootmenu_delay=0
@@ -402,7 +949,60 @@
+reset_factory=mtd erase nor0 0xc0000 0x10000 && reset
+nor_read_production=mtd read nor0 $loadaddr 0x1000000 0x1000 && imsz $loadaddr image_size && mtd read nor0 $loadaddr 0x1000000 $image_size
+nor_read_recovery=mtd read nor0 $loadaddr 0x120000 0x1000 && imsz $loadaddr image_size && mtd read nor0 $loadaddr 0x120000 $image_size
-+nor_pad_size=imsz $loadaddr image_size ; setexpr image_eb $image_size / 0x1000 ; setexpr tmp1 image_size % 0x1000 ; test 0x$tmp1 -gt 0 && setexpr image_eb $image_eb + 1 ; setexpr image_eb $image_eb * 0x1000
++nor_pad_size=imsz $loadaddr image_size ; setexpr image_eb 0x$image_size / 0x1000 ; setexpr tmp1 0x$image_size % 0x1000 ; test 0x$tmp1 -gt 0 && setexpr image_eb 0x$image_eb + 1 ; setexpr image_eb 0x$image_eb * 0x1000
++nor_write_production=run nor_pad_size ; test 0x$image_eb -le 0x3000000 && mtd erase nor0 0x1000000 0x$image_eb && mtd write nor0 $loadaddr 0x1000000 $filesize
++nor_write_recovery=run nor_pad_size ; test 0x$image_eb -le 0xee0000 && mtd erase nor0 0x120000 0x$image_eb && mtd write nor0 $loadaddr 0x120000 $filesize
++_init_env=setenv _init_env ; saveenv
++_firstboot=setenv _firstboot ; run _switch_to_menu ; run ethaddr_factory ; run _init_env ; run boot_first
++_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
++_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"--- /dev/null
+--- /dev/null
++++ b/ubnt_unifi-6-lr-v3_env
+@@ -0,0 +1,50 @@
++ethaddr_factory=mtd read nor0 $loadaddr 0x110000 0x10000 && env readmem -b ethaddr $loadaddr 0x6 ; setenv ethaddr_factory
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x48000000
++bootcmd=if pstore check ; then run boot_recovery ; else run boot_nor ; fi
++bootdelay=0
++bootfile=openwrt-mediatek-mt7622-ubnt_unifi-6-lr-v3-ubootmod-initramfs-recovery.itb
++bootfile_bl2=openwrt-mediatek-mt7622-ubnt_unifi-6-lr-v3-ubootmod-preloader.bin
++bootfile_fip=openwrt-mediatek-mt7622-ubnt_unifi-6-lr-v3-ubootmod-bl31-uboot.fip
++bootfile_upg=openwrt-mediatek-mt7622-ubnt_unifi-6-lr-v3-ubootmod-squashfs-sysupgrade.itb
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_default=0
++bootmenu_delay=0
++bootmenu_title= ( ( ( OpenWrt ) ) )
++bootmenu_0=Initialize environment.=run _firstboot
++bootmenu_0d=Run default boot command.=run boot_default
++bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
++bootmenu_2=Boot production system from flash.=run boot_production ; run bootmenu_confirm_return
++bootmenu_3=Boot recovery system from flash.=run boot_recovery ; run bootmenu_confirm_return
++bootmenu_4=Load production system via TFTP then write to flash.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_5=Load recovery system via TFTP then write to flash.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_6=Load BL31+U-Boot FIP via TFTP then write to flash.=run boot_tftp_write_fip ; run bootmenu_confirm_return
++bootmenu_7=Load BL2 preloader via TFTP then write to flash.=run boot_tftp_write_preloader ; run bootmenu_confirm_return
++bootmenu_8=Reboot.=reset
++bootmenu_9=Reset all settings to factory defaults.=run reset_factory ; reset
++boot_first=if button reset ; then run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
++boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
++boot_production=run nor_read_production && bootm $loadaddr
++boot_recovery=run nor_read_recovery ; bootm $loadaddr
++boot_serial_write_fip=loadx $loadaddr 115200 && run boot_write_fip
++boot_serial_write_preloader=loadx $loadaddr 115200 && run boot_write_preloader
++boot_tftp_forever=while true ; do run boot_tftp_recovery ; sleep 1 ; done
++boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run nor_write_production ; if env exists noboot ; then else bootm $loadaddr ; fi
++boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run nor_write_recovery ; if env exists noboot ; then else bootm $loadaddr ; fi
++boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr
++boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run boot_write_fip
++boot_tftp_write_preloader=tftpboot $loadaddr $bootfile_bl2 && run boot_write_preloader
++boot_nor=run boot_production ; run boot_recovery
++boot_write_fip=mtd erase nor0 0x20000 0x80000 && mtd write nor0 $loadaddr 0x20000 0x80000
++boot_write_preloader=mtd erase nor0 0x0 0x20000 && mtd write nor0 $loadaddr 0x0 0x20000
++reset_factory=mtd erase nor0 0xc0000 0x10000 && reset
++nor_read_production=mtd read nor0 $loadaddr 0x1000000 0x1000 && imsz $loadaddr image_size && mtd read nor0 $loadaddr 0x1000000 $image_size
++nor_read_recovery=mtd read nor0 $loadaddr 0x120000 0x1000 && imsz $loadaddr image_size && mtd read nor0 $loadaddr 0x120000 $image_size
++nor_pad_size=imsz $loadaddr image_size ; setexpr image_eb 0x$image_size / 0x1000 ; setexpr tmp1 0x$image_size % 0x1000 ; test 0x$tmp1 -gt 0 && setexpr image_eb 0x$image_eb + 1 ; setexpr image_eb 0x$image_eb * 0x1000
+nor_write_production=run nor_pad_size ; test 0x$image_eb -le 0x3000000 && mtd erase nor0 0x1000000 0x$image_eb && mtd write nor0 $loadaddr 0x1000000 $filesize
+nor_write_recovery=run nor_pad_size ; test 0x$image_eb -le 0xee0000 && mtd erase nor0 0x120000 0x$image_eb && mtd write nor0 $loadaddr 0x120000 $filesize
+_init_env=setenv _init_env ; saveenv
@@ -411,15 +1011,15 @@
+_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
--- a/common/board_r.c
+++ b/common/board_r.c
-@@ -77,6 +77,7 @@
- #ifdef CONFIG_EFI_SETUP_EARLY
+@@ -66,6 +66,7 @@
+ #include <asm-generic/gpio.h>
#include <efi_loader.h>
- #endif
+ #include <relocate.h>
+#include <spi_flash.h>
DECLARE_GLOBAL_DATA_PTR;
-@@ -410,6 +411,21 @@ static int initr_onenand(void)
+@@ -397,6 +398,20 @@ static int initr_onenand(void)
}
#endif
@@ -429,11 +1029,10 @@
+{
+ struct udevice *new;
+
-+ spi_flash_probe_bus_cs(CONFIG_SF_DEFAULT_BUS,
-+ CONFIG_SF_DEFAULT_CS,
-+ CONFIG_SF_DEFAULT_SPEED,
-+ CONFIG_SF_DEFAULT_MODE,
-+ &new);
++spi_flash_probe_bus_cs(CONFIG_SF_DEFAULT_BUS,
++ CONFIG_SF_DEFAULT_CS,
++ &new);
++
+ return 0;
+}
+#endif
@@ -441,9 +1040,9 @@
#ifdef CONFIG_MMC
static int initr_mmc(void)
{
-@@ -697,6 +713,9 @@ static init_fnc_t init_sequence_r[] = {
- #ifdef CONFIG_CMD_ONENAND
- initr_onenand,
+@@ -692,6 +707,9 @@ static init_fnc_t init_sequence_r[] = {
+ #ifdef CONFIG_NMBM_MTD
+ initr_nmbm,
#endif
+#ifdef CONFIG_SPI_FLASH
+ initr_spiflash,
diff --git a/package/boot/uboot-ramips/patches/0001-add-support-for-RAVPower-RP-WD009.patch b/package/boot/uboot-mediatek/patches/420-add-support-for-RAVPower-RP-WD009.patch
index 1833a627dce..4ee87ce3d22 100644
--- a/package/boot/uboot-ramips/patches/0001-add-support-for-RAVPower-RP-WD009.patch
+++ b/package/boot/uboot-mediatek/patches/420-add-support-for-RAVPower-RP-WD009.patch
@@ -20,23 +20,16 @@ Subject: [PATCH] add support for RAVPower RP-WD009
create mode 100644 configs/ravpower-rp-wd009-ram_defconfig
create mode 100644 include/configs/ravpower-rp-wd009.h
-diff --git a/arch/mips/dts/Makefile b/arch/mips/dts/Makefile
-index c9d75596f2..23868ae1d2 100644
--- a/arch/mips/dts/Makefile
+++ b/arch/mips/dts/Makefile
-@@ -2,7 +2,8 @@
-
- dtb-$(CONFIG_ARCH_MTMIPS) += \
- gardena-smart-gateway-mt7688.dtb \
-- linkit-smart-7688.dtb
-+ linkit-smart-7688.dtb \
-+ ravpower-rp-wd009.dtb
- dtb-$(CONFIG_TARGET_AP121) += ap121.dtb
- dtb-$(CONFIG_TARGET_AP143) += ap143.dtb
- dtb-$(CONFIG_TARGET_AP152) += ap152.dtb
-diff --git a/arch/mips/dts/ravpower-rp-wd009.dts b/arch/mips/dts/ravpower-rp-wd009.dts
-new file mode 100644
-index 0000000000..b271d5bfbc
+@@ -26,6 +26,7 @@ dtb-$(CONFIG_TARGET_OCTEON_EBB7304) += m
+ dtb-$(CONFIG_TARGET_OCTEON_NIC23) += mrvl,octeon-nic23.dtb
+ dtb-$(CONFIG_BOARD_NETGEAR_CG3100D) += netgear,cg3100d.dtb
+ dtb-$(CONFIG_BOARD_NETGEAR_DGND3700V2) += netgear,dgnd3700v2.dtb
++dtb-$(CONFIG_BOARD_RAVPOWER_RP_WD009) += ravpower-rp-wd009.dtb
+ dtb-$(CONFIG_BOARD_SAGEM_FAST1704) += sagem,f@st1704.dtb
+ dtb-$(CONFIG_BOARD_SFR_NB4_SER) += sfr,nb4-ser.dtb
+ dtb-$(CONFIG_BOARD_TPLINK_WDR4300) += tplink_wdr4300.dtb
--- /dev/null
+++ b/arch/mips/dts/ravpower-rp-wd009.dts
@@ -0,0 +1,50 @@
@@ -90,36 +83,6 @@ index 0000000000..b271d5bfbc
+ pinctrl-names = "default";
+ pinctrl-0 = <&ephy_router_mode>;
+};
-diff --git a/arch/mips/mach-mtmips/Kconfig b/arch/mips/mach-mtmips/Kconfig
-index c8dcf19c0d..85ac8878ab 100644
---- a/arch/mips/mach-mtmips/Kconfig
-+++ b/arch/mips/mach-mtmips/Kconfig
-@@ -32,6 +32,14 @@ config BOARD_GARDENA_SMART_GATEWAY_MT7688
- GARDENA smart Gateway boards have a MT7688 SoC with 128 MiB of RAM
- and 8 MiB of flash (SPI NOR) and additional SPI NAND storage.
-
-+config BOARD_RAVPOWER_RP_WD009
-+ bool "RAVPower RP-WD009"
-+ depends on SOC_MT7628
-+ select BOARD_LATE_INIT
-+ select SUPPORTS_BOOT_RAM
-+ help
-+ RAVPower RP-WD009
-+
- config BOARD_LINKIT_SMART_7688
- bool "LinkIt Smart 7688"
- depends on SOC_MT7628
-@@ -133,6 +141,7 @@ config SUPPORTS_BOOT_RAM
- bool
-
- source "board/gardena/smart-gateway-mt7688/Kconfig"
-+source "board/ravpower/rp-wd009/Kconfig"
- source "board/seeed/linkit-smart-7688/Kconfig"
-
- endmenu
-diff --git a/board/ravpower/rp-wd009/Kconfig b/board/ravpower/rp-wd009/Kconfig
-new file mode 100644
-index 0000000000..111f8e4478
--- /dev/null
+++ b/board/ravpower/rp-wd009/Kconfig
@@ -0,0 +1,12 @@
@@ -135,18 +98,12 @@ index 0000000000..111f8e4478
+ default "ravpower-rp-wd009"
+
+endif
-diff --git a/board/ravpower/rp-wd009/Makefile b/board/ravpower/rp-wd009/Makefile
-new file mode 100644
-index 0000000000..70cd7a8e56
--- /dev/null
+++ b/board/ravpower/rp-wd009/Makefile
@@ -0,0 +1,3 @@
+# SPDX-License-Identifier: GPL-2.0+
+
+obj-y += board.o
-diff --git a/board/ravpower/rp-wd009/board.c b/board/ravpower/rp-wd009/board.c
-new file mode 100644
-index 0000000000..eabcf85735
--- /dev/null
+++ b/board/ravpower/rp-wd009/board.c
@@ -0,0 +1,16 @@
@@ -166,16 +123,16 @@ index 0000000000..eabcf85735
+{
+ return 0;
+}
-diff --git a/configs/ravpower-rp-wd009-ram_defconfig b/configs/ravpower-rp-wd009-ram_defconfig
-new file mode 100644
-index 0000000000..08cbf40638
--- /dev/null
+++ b/configs/ravpower-rp-wd009-ram_defconfig
-@@ -0,0 +1,59 @@
+@@ -0,0 +1,71 @@
+CONFIG_MIPS=y
-+CONFIG_SYS_TEXT_BASE=0x80010000
++CONFIG_SYS_LOAD_ADDR=0x80010000
+CONFIG_NR_DRAM_BANKS=1
++CONFIG_SYS_MEMTEST_START=0x80100000
++CONFIG_SYS_MEMTEST_END=0x80400000
+CONFIG_ARCH_MTMIPS=y
++CONFIG_SOC_MT7628=y
+CONFIG_MIPS_BOOT_FDT=y
+CONFIG_LEGACY_IMAGE_FORMAT=y
+CONFIG_OF_STDOUT_VIA_ALIAS=y
@@ -185,7 +142,8 @@ index 0000000000..08cbf40638
+CONFIG_SYS_CONSOLE_INFO_QUIET=y
+CONFIG_VERSION_VARIABLE=y
+CONFIG_BOARD_RAVPOWER_RP_WD009=y
-+CONFIG_BOARD_EARLY_INIT_F=y
++CONFIG_SYS_MIPS_TIMER_FREQ=290000000
++CONFIG_SYS_BOOTPARAMS_LEN=0x20000
+CONFIG_HUSH_PARSER=y
+CONFIG_CMD_LICENSE=y
+# CONFIG_CMD_ELF is not set
@@ -203,6 +161,8 @@ index 0000000000..08cbf40638
+CONFIG_CMD_TIME=y
+CONFIG_CMD_UUID=y
+CONFIG_CMD_MTDPARTS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
+CONFIG_MTDIDS_DEFAULT="nor0=spi0.0"
+CONFIG_MTDPARTS_DEFAULT="spi0.0:192k(factory-uboot),64k(config),64k(factory),1536k(loader),64k(params),64k(user_backup),64k(user),14272k(firmware),64k(mode)"
+CONFIG_DEFAULT_DEVICE_TREE="ravpower-rp-wd009"
@@ -231,12 +191,15 @@ index 0000000000..08cbf40638
+CONFIG_WDT_MT7621=y
+CONFIG_LZMA=y
+CONFIG_BAUDRATE=57600
-diff --git a/include/configs/ravpower-rp-wd009.h b/include/configs/ravpower-rp-wd009.h
-new file mode 100644
-index 0000000000..bb4145197c
++CONFIG_SYS_MAXARGS=64
++CONFIG_SYS_CBSIZE=512
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
--- /dev/null
+++ b/include/configs/ravpower-rp-wd009.h
-@@ -0,0 +1,48 @@
+@@ -0,0 +1,17 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2018 Stefan Roese <sr@denx.de>
@@ -245,46 +208,37 @@ index 0000000000..bb4145197c
+#ifndef __CONFIG_RAVPOWER_RP_WD009_H
+#define __CONFIG_RAVPOWER_RP_WD009_H
+
-+/* CPU */
-+#define CONFIG_SYS_MIPS_TIMER_FREQ 290000000
-+
+/* RAM */
-+#define CONFIG_SYS_SDRAM_BASE 0x80000000
++#define CFG_SYS_SDRAM_BASE 0x80000000
+
-+#define CONFIG_SYS_LOAD_ADDR CONFIG_SYS_SDRAM_BASE + 0x100000
-+
-+#define CONFIG_SYS_INIT_SP_OFFSET 0x400000
-+
-+#ifdef CONFIG_BOOT_RAM
-+#define CONFIG_SKIP_LOWLEVEL_INIT
-+#endif
++#define CFG_SYS_INIT_SP_OFFSET 0x400000
+
+/* UART */
-+#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200, \
++#define CFG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200, \
+ 230400, 460800, 921600 }
-+
-+/* RAM */
-+#define CONFIG_SYS_MEMTEST_START 0x80100000
-+#define CONFIG_SYS_MEMTEST_END 0x80400000
-+
-+/* Memory usage */
-+#define CONFIG_SYS_MAXARGS 64
-+#define CONFIG_SYS_MALLOC_LEN (16 * 1024 * 1024)
-+#define CONFIG_SYS_BOOTPARAMS_LEN (128 * 1024)
-+#define CONFIG_SYS_CBSIZE 512
-+
-+/* U-Boot */
-+#define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_TEXT_BASE
-+
-+/* Environment settings */
-+
-+/*
-+ * Environment is right behind U-Boot in flash. Make sure U-Boot
-+ * doesn't grow into the environment area.
-+ */
-+#define CONFIG_BOARD_SIZE_LIMIT CONFIG_ENV_OFFSET
-+
+#endif /* __CONFIG_RAVPOWER_RP_WD009_H */
---
-2.27.0
-
+--- a/arch/mips/mach-mtmips/mt7628/Kconfig
++++ b/arch/mips/mach-mtmips/mt7628/Kconfig
+@@ -27,6 +27,14 @@ config BOARD_MT7628_RFB
+ SPI-NOR flash, 1 built-in switch with 5 ports, 1 UART, 1 USB host,
+ 1 SDXC, 1 PCIe socket and JTAG pins.
+
++config BOARD_RAVPOWER_RP_WD009
++ bool "RAVPower RP-WD009"
++ depends on SOC_MT7628
++ select BOARD_LATE_INIT
++ select SUPPORTS_BOOT_RAM
++ help
++ RAVPower RP-WD009
++
+ config BOARD_VOCORE2
+ bool "VoCore2"
+ select SPL_SERIAL
+@@ -53,6 +61,7 @@ config SYS_CONFIG_NAME
+ default "mt7628" if BOARD_MT7628_RFB
+
+ source "board/gardena/smart-gateway-mt7688/Kconfig"
++source "board/ravpower/rp-wd009/Kconfig"
+ source "board/seeed/linkit-smart-7688/Kconfig"
+ source "board/vocore/vocore2/Kconfig"
+
diff --git a/package/boot/uboot-mediatek/patches/421-zbtlink_zbt-wg3526-16m.patch b/package/boot/uboot-mediatek/patches/421-zbtlink_zbt-wg3526-16m.patch
new file mode 100644
index 00000000000..b9b241a51d4
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/421-zbtlink_zbt-wg3526-16m.patch
@@ -0,0 +1,314 @@
+--- /dev/null
++++ b/configs/mt7621_zbtlink_zbt-wg3526-16m_defconfig
+@@ -0,0 +1,138 @@
++CONFIG_MIPS=y
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_SYS_MALLOC_LEN=0x100000
++CONFIG_SPL_LIBCOMMON_SUPPORT=y
++CONFIG_SPL_LIBGENERIC_SUPPORT=y
++CONFIG_NR_DRAM_BANKS=1
++CONFIG_ENV_SIZE=0x1000
++CONFIG_ENV_IS_IN_MTD=y
++CONFIG_ENV_MTD_NAME="nor0"
++CONFIG_ENV_SIZE_REDUND=0x10000
++CONFIG_ENV_SIZE=0x10000
++CONFIG_ENV_OFFSET=0x30000
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_RESET_BUTTON_SETTLE_DELAY=400
++CONFIG_BOOTP_SEND_HOSTNAME=y
++# CONFIG_BOOTSTD is not set
++CONFIG_DEFAULT_ENV_FILE="zbtlink_zbt-wg3526-16m_env"
++CONFIG_DEFAULT_DEVICE_TREE="zbtlink,zbt-wg3526"
++CONFIG_SPL_BSS_MAX_SIZE=0x80000
++CONFIG_SPL_BSS_START_ADDR=0x80140000
++CONFIG_SPL_SERIAL=y
++CONFIG_SPL_SYS_MALLOC_F_LEN=0x40000
++CONFIG_SPL=y
++CONFIG_DEBUG_UART_BASE=0xbe000c00
++CONFIG_DEBUG_UART_CLOCK=50000000
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_SYS_LOAD_ADDR=0x83000000
++CONFIG_SYS_MIPS_TIMER_FREQ=440000000
++CONFIG_ARCH_MTMIPS=y
++CONFIG_SOC_MT7621=y
++# CONFIG_MIPS_CACHE_SETUP is not set
++# CONFIG_MIPS_CACHE_DISABLE is not set
++CONFIG_RESTORE_EXCEPTION_VECTOR_BASE=y
++CONFIG_MIPS_BOOT_FDT=y
++CONFIG_DEBUG_UART=y
++CONFIG_TPL_SYS_MALLOC_F_LEN=0x1000
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_BOOTDELAY=30
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++# CONFIG_FIT_ENABLE_SHA256_SUPPORT is not set
++CONFIG_HUSH_PARSER=y
++CONFIG_LOGLEVEL=6
++# CONFIG_LOG is not set
++# CONFIG_SYS_LONGHELP is not set
++# CONFIG_ARCH_FIXUP_FDT_MEMORY is not set
++CONFIG_SYS_CONSOLE_INFO_QUIET=y
++CONFIG_SPL_SYS_MALLOC_SIMPLE=y
++CONFIG_SPL_NOR_SUPPORT=y
++CONFIG_TPL=y
++# CONFIG_TPL_FRAMEWORK is not set
++CONFIG_LEGACY_IMAGE_FORMAT=y
++# CONFIG_BOOTM_NETBSD is not set
++# CONFIG_BOOTM_PLAN9 is not set
++# CONFIG_BOOTM_RTEMS is not set
++# CONFIG_BOOTM_VXWORKS is not set
++# CONFIG_EFI is not set
++# CONFIG_EFI_LOADER is not set
++CONFIG_CMD_BOOTMENU=y
++# CONFIG_CMD_BOOTEFI is not set
++# CONFIG_CMD_BOOTD is not set
++# CONFIG_CMD_BOOTP is not set
++CONFIG_CMD_BOOTM=y
++# CONFIG_CMD_BOOTDEV is not set
++# CONFIG_CMD_BOOTFLOW is not set
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_ECHO=y
++# CONFIG_CMD_ELF is not set
++# CONFIG_CMD_BOOTEFI_BOOTMGR is not set
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++# CONFIG_CMD_MBR is not set
++CONFIG_CMD_MMC=y
++CONFIG_CMD_MTD=y
++CONFIG_CMD_MTDPART=y
++# CONFIG_CMD_PCI is not set
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_TFTPBOOT=y
++# CONFIG_CMD_UNLZ4 is not set
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_DOS_PARTITION=y
++# CONFIG_SPL_DOS_PARTITION is not set
++# CONFIG_ISO_PARTITION is not set
++# CONFIG_EFI_PARTITION is not set
++# CONFIG_SPL_EFI_PARTITION is not set
++CONFIG_PARTITION_TYPE_GUID=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++# CONFIG_NET_RANDOM_ETHADDR is not set
++# CONFIG_I2C is not set
++# CONFIG_INPUT is not set
++CONFIG_MMC=y
++# CONFIG_MMC_QUIRKS is not set
++# CONFIG_MMC_HW_PARTITIONING is not set
++CONFIG_MMC_MTK=y
++CONFIG_MTD=y
++CONFIG_DM_MTD=y
++CONFIG_SF_DEFAULT_SPEED=20000000
++# CONFIG_SPI_FLASH_BAR is not set
++# CONFIG_SPI_FLASH_EON is not set
++# CONFIG_SPI_FLASH_GIGADEVICE is not set
++# CONFIG_SPI_FLASH_ISSI is not set
++# CONFIG_SPI_FLASH_MACRONIX is not set
++# CONFIG_SPI_FLASH_SPANSION is not set
++# CONFIG_SPI_FLASH_STMICRO is not set
++CONFIG_SPI_FLASH_WINBOND=y
++# CONFIG_SPI_FLASH_XMC is not set
++# CONFIG_SPI_FLASH_XTX is not set
++CONFIG_SPI_FLASH_MTD=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PHY=y
++CONFIG_PHY_MTK_TPHY=y
++CONFIG_DEBUG_UART_SHIFT=2
++CONFIG_SPI=y
++CONFIG_MT7621_SPI=y
++CONFIG_SYSRESET=y
++CONFIG_SYSRESET_RESETCTL=y
++# CONFIG_SYS_XTRACE is not set
++CONFIG_USE_DEFAULT_ENV_FILE=y
++CONFIG_VERSION_VARIABLE=y
++CONFIG_WDT=y
++CONFIG_WDT_MT7621=y
++# CONFIG_BINMAN_FDT is not set
++CONFIG_LZMA=y
++CONFIG_SPL_LZMA=y
++# CONFIG_GZIP is not set
+--- /dev/null
++++ b/zbtlink_zbt-wg3526-16m_env
+@@ -0,0 +1,36 @@
++ethaddr_factory=mtd read factory $loadaddr 0x0 0x10000 ; setexpr macoffs $loadaddr + 0xe000 ; env readmem -b ethaddr $macoffs 0x6 ; setenv ethaddr_factory
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x83000000
++bootcmd=run boot_nor
++bootdelay=0
++bootfile=openwrt-ramips-mt7621-zbtlink_zbt-wg3526-16m-initramfs-kernel.bin
++bootfile_uboot=u-boot-mt7621.bin
++bootfile_upg=openwrt-ramips-mt7621-zbtlink_zbt-wg3526-16m-squashfs-sysupgrade.bin
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_default=0
++bootmenu_delay=0
++bootmenu_title= ( ( ( OpenWrt ) ) )
++bootmenu_0=Initialize environment.=run _firstboot
++bootmenu_0d=Run default boot command.=run boot_default
++bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
++bootmenu_2=Boot system from flash.=run boot_nor ; run bootmenu_confirm_return
++bootmenu_3=Load system via TFTP then write to flash.=run boot_tftp_sysupgrade ; run bootmenu_confirm_return
++bootmenu_4=Load U-Boot via TFTP then write to flash.=run boot_tftp_write_uboot ; run bootmenu_confirm_return
++bootmenu_5=Reset all settings to factory defaults.=run reset_factory ; reset
++bootmenu_6=Reboot.=reset
++boot_first=if button reset ; then run boot_tftp ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
++boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_tftp_forever
++boot_nor=bootm 0x1fc50000
++boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr
++boot_tftp_forever=while true ; do run boot_tftp ; sleep 1 ; done
++boot_tftp_sysupgrade=tftpboot $loadaddr $bootfile_upg && iminfo $loadaddr && run nor_write_production
++boot_tftp_write_uboot=tftpboot $loadaddr $bootfile_uboot && run nor_write_uboot
++reset_factory=mtd erase u-boot-env 0x0 0x10000 && reset
++nor_pad_size=setexpr image_eb $filesize / 0x1000 ; setexpr tmp1 image_size % 0x1000 ; test 0x$tmp1 -gt 0 && setexpr image_eb $image_eb + 1 ; setexpr image_eb $image_eb * 0x1000
++nor_write_production=run nor_pad_size ; test 0x$image_eb -le 0xfb0000 && mtd erase firmware 0x0 0x$image_eb && mtd write firmware $loadaddr 0x0 $filesize
++nor_write_uboot=mtd erase u-boot 0x0 0x30000 && mtd write u-boot $loadaddr 0x0 0x30000
++_init_env=setenv _init_env ; saveenv
++_firstboot=setenv _firstboot ; run _switch_to_menu ; run ethaddr_factory ; run _init_env ; run boot_first
++_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
++_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
+--- /dev/null
++++ b/arch/mips/dts/zbtlink,zbt-wg3526.dts
+@@ -0,0 +1,131 @@
++// SPDX-License-Identifier: GPL-2.0
++/*
++ * Copyright (C) 2022 MediaTek Inc. All rights reserved.
++ *
++ * Author: Weijie Gao <weijie.gao@mediatek.com>
++ */
++
++/dts-v1/;
++
++#include "mt7621.dtsi"
++#include <dt-bindings/gpio/gpio.h>
++
++/ {
++ compatible = "zbtlink,zbt-wg3526", "mediatek,mt7621-rfb", "mediatek,mt7621-soc";
++ model = "Zbtlink WG3526";
++
++ aliases {
++ ethernet0 = &eth;
++ serial0 = &uart0;
++ spi0 = &spi;
++ };
++
++ chosen {
++ stdout-path = &uart0;
++ };
++
++ keys {
++ compatible = "gpio-keys";
++
++ reset {
++ label = "reset";
++ gpios = <&gpio 18 GPIO_ACTIVE_LOW>;
++ };
++ };
++
++ leds {
++ compatible = "gpio-leds";
++
++ led_status: status {
++ label = "green:status";
++ gpios = <&gpio 24 GPIO_ACTIVE_LOW>;
++ };
++ };
++};
++
++&pinctrl {
++ state_default: pin_state {
++ gpios {
++ groups = "i2c", "uart3", "pcie reset";
++ function = "gpio";
++ };
++
++ wdt {
++ groups = "wdt";
++ function = "wdt rst";
++ };
++
++ jtag {
++ groups = "jtag";
++ function = "jtag";
++ };
++ };
++};
++
++&uart0 {
++ status = "okay";
++};
++
++&gpio {
++ status = "okay";
++};
++
++&spi {
++ status = "okay";
++ num-cs = <2>;
++
++ spi-flash@0 {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ compatible = "jedec,spi-nor";
++ spi-max-frequency = <25000000>;
++ reg = <0>;
++
++
++ partitions {
++ compatible = "fixed-partitions";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ partition@0 {
++ label = "u-boot";
++ reg = <0x0 0x30000>;
++ };
++
++ partition@30000 {
++ label = "u-boot-env";
++ reg = <0x30000 0x10000>;
++ };
++
++ factory: partition@40000 {
++ label = "factory";
++ reg = <0x40000 0x10000>;
++ read-only;
++ };
++
++ firmware: partition@50000 {
++ compatible = "denx,uimage";
++ label = "firmware";
++ reg = <0x50000 0xfb0000>;
++ };
++ };
++ };
++};
++
++&eth {
++ status = "okay";
++};
++
++&mmc {
++ cap-sd-highspeed;
++
++ status = "okay";
++};
++
++&ssusb {
++ status = "okay";
++};
++
++&u3phy {
++ status = "okay";
++};
diff --git a/package/boot/uboot-mediatek/patches/430-add-bpi-r3.patch b/package/boot/uboot-mediatek/patches/430-add-bpi-r3.patch
new file mode 100644
index 00000000000..398621537a3
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/430-add-bpi-r3.patch
@@ -0,0 +1,1113 @@
+--- /dev/null
++++ b/configs/mt7986a_bpi-r3-emmc_defconfig
+@@ -0,0 +1,197 @@
++CONFIG_ARM=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TARGET_MT7986=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_NR_DRAM_BANKS=1
++CONFIG_DEFAULT_DEVICE_TREE="mt7986a-bpi-r3-emmc"
++CONFIG_DEFAULT_ENV_FILE="bananapi_bpi-r3_emmc_env"
++CONFIG_DEFAULT_FDT_FILE="mediatek/mt7986a-bpi-r3-emmc.dtb"
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_OF_SYSTEM_SETUP=y
++CONFIG_DEBUG_UART_BASE=0x11002000
++CONFIG_DEBUG_UART_CLOCK=40000000
++CONFIG_DEBUG_UART=y
++CONFIG_SYS_LOAD_ADDR=0x46000000
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_BOOTDELAY=30
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_LOGLEVEL=7
++CONFIG_LOG=y
++CONFIG_SYS_PROMPT="MT7986> "
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_EXT4=y
++CONFIG_CMD_FAT=y
++CONFIG_CMD_FDT=y
++CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_FS_UUID=y
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_GPT=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++# CONFIG_CMD_MBR is not set
++CONFIG_CMD_MMC=y
++CONFIG_CMD_MTD=y
++CONFIG_CMD_PCI=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
++CONFIG_CMD_PWM=y
++CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_UBI=y
++CONFIG_CMD_UBI_RENAME=y
++CONFIG_CMD_UBIFS=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_PART=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_USB=y
++CONFIG_CMD_UUID=y
++CONFIG_DISPLAY_CPUINFO=y
++CONFIG_DM_MMC=y
++CONFIG_DM_MTD=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++CONFIG_DM_USB=y
++CONFIG_DM_PWM=y
++CONFIG_PWM_MTK=y
++CONFIG_HUSH_PARSER=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_VERSION_VARIABLE=y
++CONFIG_PARTITION_UUIDS=y
++CONFIG_NETCONSOLE=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_DM_GPIO=y
++CONFIG_DM_SCSI=y
++CONFIG_AHCI=y
++CONFIG_AHCI_PCI=y
++CONFIG_SCSI_AHCI=y
++CONFIG_SCSI=y
++CONFIG_CMD_SCSI=y
++CONFIG_PHY=y
++CONFIG_PHY_MTK_TPHY=y
++CONFIG_PHY_FIXED=y
++CONFIG_MTK_AHCI=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PCI=y
++CONFIG_MTD=y
++CONFIG_MTD_UBI_FASTMAP=y
++CONFIG_DM_PCI=y
++CONFIG_PCIE_MEDIATEK=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7622=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_RAM=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_MMC=y
++CONFIG_MMC_DEFAULT_DEV=1
++CONFIG_MMC_HS200_SUPPORT=y
++CONFIG_MMC_MTK=y
++CONFIG_MMC_SUPPORTS_TUNING=y
++CONFIG_SUPPORT_EMMC_BOOT=y
++CONFIG_SPI=y
++CONFIG_DM_SPI=y
++CONFIG_MTK_SPI_NAND=y
++CONFIG_MTK_SPI_NAND_MTD=y
++CONFIG_SYSRESET_WATCHDOG=y
++CONFIG_WDT_MTK=y
++CONFIG_LZO=y
++CONFIG_ZSTD=y
++CONFIG_HEXDUMP=y
++CONFIG_RANDOM_UUID=y
++CONFIG_REGEX=y
++CONFIG_USB=y
++CONFIG_USB_HOST=y
++CONFIG_USB_XHCI_HCD=y
++CONFIG_USB_XHCI_MTK=y
++CONFIG_USB_STORAGE=y
++CONFIG_OF_EMBED=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_IS_IN_MMC=y
++CONFIG_ENV_OFFSET=0x400000
++CONFIG_ENV_OFFSET_REDUND=0x440000
++CONFIG_ENV_SIZE=0x40000
++CONFIG_ENV_SIZE_REDUND=0x40000
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_SUPPORT_EMMC_BOOT=y
++CONFIG_MMC_HS200_SUPPORT=y
++CONFIG_MMC_MTK=y
++CONFIG_PHY_FIXED=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7986=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_HEXDUMP=y
++CONFIG_USE_DEFAULT_ENV_FILE=y
++CONFIG_MTD_SPI_NAND=y
++CONFIG_MTK_SPIM=y
++#CONFIG_MTK_SNOR=y
++CONFIG_DM_SPI_FLASH=y
++CONFIG_SPI_FLASH_MTD=y
++CONFIG_SPI_FLASH_WINBOND=y
++# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set
++CONFIG_CMD_SF=y
++CONFIG_CMD_NAND=y
++CONFIG_CMD_NAND_TRIMFFS=y
++CONFIG_LMB_MAX_REGIONS=64
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
+--- /dev/null
++++ b/configs/mt7986a_bpi-r3-nor_defconfig
+@@ -0,0 +1,193 @@
++CONFIG_ARM=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TARGET_MT7986=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_NR_DRAM_BANKS=1
++CONFIG_DEFAULT_DEVICE_TREE="mt7986a-bpi-r3-emmc"
++CONFIG_DEFAULT_ENV_FILE="bananapi_bpi-r3_nor_env"
++CONFIG_DEFAULT_FDT_FILE="mediatek/mt7986a-bpi-r3-emmc.dtb"
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_OF_SYSTEM_SETUP=y
++CONFIG_DEBUG_UART_BASE=0x11002000
++CONFIG_DEBUG_UART_CLOCK=40000000
++CONFIG_DEBUG_UART=y
++CONFIG_SYS_LOAD_ADDR=0x46000000
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_BOOTDELAY=30
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_LOGLEVEL=7
++CONFIG_LOG=y
++CONFIG_SYS_PROMPT="MT7986> "
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_EXT4=y
++CONFIG_CMD_FAT=y
++CONFIG_CMD_FDT=y
++CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_FS_UUID=y
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_GPT=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++# CONFIG_CMD_MBR is not set
++CONFIG_CMD_MMC=y
++CONFIG_CMD_MTD=y
++CONFIG_CMD_PCI=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
++CONFIG_CMD_PWM=y
++CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_PART=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_USB=y
++CONFIG_CMD_UUID=y
++CONFIG_DISPLAY_CPUINFO=y
++CONFIG_DM_MMC=y
++CONFIG_DM_MTD=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++CONFIG_DM_USB=y
++CONFIG_DM_PWM=y
++CONFIG_PWM_MTK=y
++CONFIG_HUSH_PARSER=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_VERSION_VARIABLE=y
++CONFIG_PARTITION_UUIDS=y
++CONFIG_NETCONSOLE=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_DM_GPIO=y
++CONFIG_DM_SCSI=y
++CONFIG_AHCI=y
++CONFIG_AHCI_PCI=y
++CONFIG_SCSI_AHCI=y
++CONFIG_SCSI=y
++CONFIG_CMD_SCSI=y
++CONFIG_PHY=y
++CONFIG_PHY_MTK_TPHY=y
++CONFIG_PHY_FIXED=y
++CONFIG_MTK_AHCI=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PCI=y
++CONFIG_MTD=y
++CONFIG_MTD_UBI_FASTMAP=y
++CONFIG_DM_PCI=y
++CONFIG_PCIE_MEDIATEK=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7622=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_RAM=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_MMC=y
++CONFIG_MMC_DEFAULT_DEV=1
++CONFIG_MMC_HS200_SUPPORT=y
++CONFIG_MMC_MTK=y
++CONFIG_MMC_SUPPORTS_TUNING=y
++CONFIG_SUPPORT_EMMC_BOOT=y
++CONFIG_SPI=y
++CONFIG_DM_SPI=y
++CONFIG_MTK_SPI_NAND=y
++CONFIG_MTK_SPI_NAND_MTD=y
++CONFIG_SYSRESET_WATCHDOG=y
++CONFIG_WDT_MTK=y
++CONFIG_LZO=y
++CONFIG_ZSTD=y
++CONFIG_HEXDUMP=y
++CONFIG_RANDOM_UUID=y
++CONFIG_REGEX=y
++CONFIG_USB=y
++CONFIG_USB_HOST=y
++CONFIG_USB_XHCI_HCD=y
++CONFIG_USB_XHCI_MTK=y
++CONFIG_USB_STORAGE=y
++CONFIG_OF_EMBED=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_IS_IN_MTD=y
++CONFIG_ENV_MTD_NAME="u-boot-env"
++CONFIG_ENV_OFFSET=0x0
++CONFIG_ENV_OFFSET_REDUND=0x20000
++CONFIG_ENV_SIZE=0x20000
++CONFIG_ENV_SIZE_REDUND=0x20000
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_SUPPORT_EMMC_BOOT=y
++CONFIG_MMC_HS200_SUPPORT=y
++CONFIG_MMC_MTK=y
++CONFIG_PHY_FIXED=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7986=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_HEXDUMP=y
++CONFIG_USE_DEFAULT_ENV_FILE=y
++#CONFIG_MTD_SPI_NAND=y
++CONFIG_MTK_SPIM=y
++#CONFIG_MTK_SNOR=y
++CONFIG_DM_SPI_FLASH=y
++CONFIG_SPI_FLASH_MTD=y
++CONFIG_SPI_FLASH_WINBOND=y
++# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set
++CONFIG_CMD_SF=y
++CONFIG_LMB_MAX_REGIONS=64
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
+--- /dev/null
++++ b/configs/mt7986a_bpi-r3-sd_defconfig
+@@ -0,0 +1,197 @@
++CONFIG_ARM=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TARGET_MT7986=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_NR_DRAM_BANKS=1
++CONFIG_DEFAULT_DEVICE_TREE="mt7986a-bpi-r3-sd"
++CONFIG_DEFAULT_ENV_FILE="bananapi_bpi-r3_sdmmc_env"
++CONFIG_DEFAULT_FDT_FILE="mediatek/mt7986a-bpi-r3-sd.dtb"
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_OF_SYSTEM_SETUP=y
++CONFIG_DEBUG_UART_BASE=0x11002000
++CONFIG_DEBUG_UART_CLOCK=40000000
++CONFIG_DEBUG_UART=y
++CONFIG_SYS_LOAD_ADDR=0x46000000
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_BOOTDELAY=30
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_LOGLEVEL=7
++CONFIG_LOG=y
++CONFIG_SYS_PROMPT="MT7986> "
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_EXT4=y
++CONFIG_CMD_FAT=y
++CONFIG_CMD_FDT=y
++CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_FS_UUID=y
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_GPT=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++# CONFIG_CMD_MBR is not set
++CONFIG_CMD_MMC=y
++CONFIG_CMD_MTD=y
++CONFIG_CMD_PCI=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
++CONFIG_CMD_PWM=y
++CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_UBI=y
++CONFIG_CMD_UBI_RENAME=y
++CONFIG_CMD_UBIFS=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_PART=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_USB=y
++CONFIG_CMD_UUID=y
++CONFIG_DISPLAY_CPUINFO=y
++CONFIG_DM_MMC=y
++CONFIG_DM_MTD=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++CONFIG_DM_USB=y
++CONFIG_DM_PWM=y
++CONFIG_PWM_MTK=y
++CONFIG_HUSH_PARSER=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_VERSION_VARIABLE=y
++CONFIG_PARTITION_UUIDS=y
++CONFIG_NETCONSOLE=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_DM_GPIO=y
++CONFIG_DM_SCSI=y
++CONFIG_AHCI=y
++CONFIG_AHCI_PCI=y
++CONFIG_SCSI_AHCI=y
++CONFIG_SCSI=y
++CONFIG_CMD_SCSI=y
++CONFIG_PHY=y
++CONFIG_PHY_MTK_TPHY=y
++CONFIG_PHY_FIXED=y
++CONFIG_MTK_AHCI=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PCI=y
++CONFIG_MTD=y
++CONFIG_MTD_UBI_FASTMAP=y
++CONFIG_DM_PCI=y
++CONFIG_PCIE_MEDIATEK=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7622=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_RAM=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_MMC=y
++CONFIG_MMC_DEFAULT_DEV=1
++CONFIG_MMC_HS200_SUPPORT=y
++CONFIG_MMC_MTK=y
++CONFIG_MMC_SUPPORTS_TUNING=y
++CONFIG_SUPPORT_EMMC_BOOT=y
++CONFIG_SPI=y
++CONFIG_DM_SPI=y
++CONFIG_MTK_SPI_NAND=y
++CONFIG_MTK_SPI_NAND_MTD=y
++CONFIG_SYSRESET_WATCHDOG=y
++CONFIG_WDT_MTK=y
++CONFIG_LZO=y
++CONFIG_ZSTD=y
++CONFIG_HEXDUMP=y
++CONFIG_RANDOM_UUID=y
++CONFIG_REGEX=y
++CONFIG_USB=y
++CONFIG_USB_HOST=y
++CONFIG_USB_XHCI_HCD=y
++CONFIG_USB_XHCI_MTK=y
++CONFIG_USB_STORAGE=y
++CONFIG_OF_EMBED=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_IS_IN_MMC=y
++CONFIG_ENV_OFFSET=0x400000
++CONFIG_ENV_OFFSET_REDUND=0x440000
++CONFIG_ENV_SIZE=0x40000
++CONFIG_ENV_SIZE_REDUND=0x40000
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_SUPPORT_EMMC_BOOT=y
++CONFIG_MMC_HS200_SUPPORT=y
++CONFIG_MMC_MTK=y
++CONFIG_PHY_FIXED=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7986=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_HEXDUMP=y
++CONFIG_USE_DEFAULT_ENV_FILE=y
++CONFIG_MTD_SPI_NAND=y
++CONFIG_MTK_SPIM=y
++#CONFIG_MTK_SNOR=y
++CONFIG_DM_SPI_FLASH=y
++CONFIG_SPI_FLASH_MTD=y
++CONFIG_SPI_FLASH_WINBOND=y
++# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set
++CONFIG_CMD_SF=y
++CONFIG_CMD_NAND=y
++CONFIG_CMD_NAND_TRIMFFS=y
++CONFIG_LMB_MAX_REGIONS=64
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
+--- /dev/null
++++ b/configs/mt7986a_bpi-r3-snand_defconfig
+@@ -0,0 +1,198 @@
++CONFIG_ARM=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TARGET_MT7986=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_NR_DRAM_BANKS=1
++CONFIG_DEFAULT_DEVICE_TREE="mt7986a-bpi-r3-emmc"
++CONFIG_DEFAULT_ENV_FILE="bananapi_bpi-r3_snand_env"
++CONFIG_DEFAULT_FDT_FILE="mediatek/mt7986a-bpi-r3-emmc.dtb"
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_OF_SYSTEM_SETUP=y
++CONFIG_DEBUG_UART_BASE=0x11002000
++CONFIG_DEBUG_UART_CLOCK=40000000
++CONFIG_DEBUG_UART=y
++CONFIG_SYS_LOAD_ADDR=0x46000000
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_BOOTDELAY=30
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_LOGLEVEL=7
++CONFIG_LOG=y
++CONFIG_SYS_PROMPT="MT7986> "
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_EXT4=y
++CONFIG_CMD_FAT=y
++CONFIG_CMD_FDT=y
++CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_FS_UUID=y
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_GPT=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++# CONFIG_CMD_MBR is not set
++CONFIG_CMD_MMC=y
++CONFIG_CMD_MTD=y
++CONFIG_CMD_PCI=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
++CONFIG_CMD_PWM=y
++CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_UBI=y
++CONFIG_CMD_UBI_RENAME=y
++CONFIG_CMD_UBIFS=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_PART=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_USB=y
++CONFIG_CMD_UUID=y
++CONFIG_DISPLAY_CPUINFO=y
++CONFIG_DM_MMC=y
++CONFIG_DM_MTD=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++CONFIG_DM_USB=y
++CONFIG_DM_PWM=y
++CONFIG_PWM_MTK=y
++CONFIG_HUSH_PARSER=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_VERSION_VARIABLE=y
++CONFIG_PARTITION_UUIDS=y
++CONFIG_NETCONSOLE=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_DM_GPIO=y
++CONFIG_DM_SCSI=y
++CONFIG_AHCI=y
++CONFIG_AHCI_PCI=y
++CONFIG_SCSI_AHCI=y
++CONFIG_SCSI=y
++CONFIG_CMD_SCSI=y
++CONFIG_PHY=y
++CONFIG_PHY_MTK_TPHY=y
++CONFIG_PHY_FIXED=y
++CONFIG_MTK_AHCI=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PCI=y
++CONFIG_MTD=y
++CONFIG_MTD_UBI_FASTMAP=y
++CONFIG_DM_PCI=y
++CONFIG_PCIE_MEDIATEK=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7622=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_RAM=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_MMC=y
++CONFIG_MMC_DEFAULT_DEV=1
++CONFIG_MMC_HS200_SUPPORT=y
++CONFIG_MMC_MTK=y
++CONFIG_MMC_SUPPORTS_TUNING=y
++CONFIG_SUPPORT_EMMC_BOOT=y
++CONFIG_SPI=y
++CONFIG_DM_SPI=y
++CONFIG_MTK_SPI_NAND=y
++CONFIG_MTK_SPI_NAND_MTD=y
++CONFIG_SYSRESET_WATCHDOG=y
++CONFIG_WDT_MTK=y
++CONFIG_LZO=y
++CONFIG_ZSTD=y
++CONFIG_HEXDUMP=y
++CONFIG_RANDOM_UUID=y
++CONFIG_REGEX=y
++CONFIG_USB=y
++CONFIG_USB_HOST=y
++CONFIG_USB_XHCI_HCD=y
++CONFIG_USB_XHCI_MTK=y
++CONFIG_USB_STORAGE=y
++CONFIG_OF_EMBED=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_IS_IN_UBI=y
++CONFIG_ENV_UBI_PART="ubi"
++CONFIG_ENV_SIZE=0x1f000
++CONFIG_ENV_SIZE_REDUND=0x1f000
++CONFIG_ENV_UBI_VOLUME="ubootenv"
++CONFIG_ENV_UBI_VOLUME_REDUND="ubootenv2"
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_SUPPORT_EMMC_BOOT=y
++CONFIG_MMC_HS200_SUPPORT=y
++CONFIG_MMC_MTK=y
++CONFIG_PHY_FIXED=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7986=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_HEXDUMP=y
++CONFIG_USE_DEFAULT_ENV_FILE=y
++CONFIG_MTD_SPI_NAND=y
++CONFIG_MTK_SPIM=y
++#CONFIG_MTK_SNOR=y
++#CONFIG_DM_SPI_FLASH=y
++#CONFIG_SPI_FLASH_MTD=y
++#CONFIG_SPI_FLASH_WINBOND=y
++# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set
++#CONFIG_CMD_SF=y
++CONFIG_CMD_NAND=y
++CONFIG_CMD_NAND_TRIMFFS=y
++CONFIG_LMB_MAX_REGIONS=64
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
+--- /dev/null
++++ b/bananapi_bpi-r3_sdmmc_env
+@@ -0,0 +1,81 @@
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x46000000
++console=earlycon=uart8250,mmio32,0x11002000 console=ttyS0
++bootargs=root=/dev/fit0
++bootcmd=if pstore check ; then run boot_recovery ; else run boot_sdmmc ; fi
++bootconf=config-mt7986a-bananapi-bpi-r3
++bootconf_base=config-mt7986a-bananapi-bpi-r3
++bootconf_nor=mt7986a-bananapi-bpi-r3-nor
++bootconf_nand=mt7986a-bananapi-bpi-r3-nand
++bootconf_sd=mt7986a-bananapi-bpi-r3-sd
++bootconf_emmc=mt7986a-bananapi-bpi-r3-emmc
++bootdelay=0
++bootfile=openwrt-mediatek-filogic-bananapi_bpi-r3-initramfs-recovery.itb
++bootfile_upg=openwrt-mediatek-filogic-bananapi_bpi-r3-squashfs-sysupgrade.itb
++bootled_pwr=green:status
++bootled_rec=blue:status
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_default=0
++bootmenu_delay=0
++bootmenu_title= ( ( ( OpenWrt ) ) ) [SD card]
++bootmenu_0=Initialize environment.=run _firstboot
++bootmenu_0d=Run default boot command.=run boot_default
++bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
++bootmenu_2=Boot production system from SD card.=run boot_production ; run bootmenu_confirm_return
++bootmenu_3=Boot recovery system from SD card.=run boot_recovery ; run bootmenu_confirm_return
++bootmenu_4=Load production system via TFTP then write to SD card.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_5=Load recovery system via TFTP then write to SD card.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_6=Install bootloader, recovery and production to NOR.=if sf probe ; then run nor_init ; else echo "NOR not detected" ; fi ; run bootmenu_confirm_return
++bootmenu_7=Install bootloader, recovery and production to NAND.=if nand info ; then run ubi_init ; else echo "NAND not detected" ; fi ; run bootmenu_confirm_return
++bootmenu_8=Reboot.=reset
++bootmenu_9=Reset all settings to factory defaults.=run reset_factory ; reset
++boot_update_conf=if nand info ; then setenv bootconf $bootconf_base#$bootconf_sd#$bootconf_nand ; else if sf probe ; then setenv bootconf $bootconf_base#$bootconf_sd#$bootconf_nor ; else setenv bootconf $bootconf_base#$bootconf_sd ; fi ; fi
++boot_first=if button reset ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
++boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
++boot_production=led $bootled_pwr on ; run boot_update_conf ; run sdmmc_read_production && bootm $loadaddr#$bootconf ; led $bootled_pwr off
++boot_recovery=led $bootled_rec on ; run boot_update_conf ; run sdmmc_read_recovery && bootm $loadaddr#$bootconf ; led $bootled_rec off
++boot_sdmmc=run boot_production ; run boot_recovery
++boot_tftp_forever=led $bootled_rec on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done
++boot_tftp_production=run boot_update_conf ; tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run sdmmc_write_production ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp_recovery=run boot_update_conf ; tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run sdmmc_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp=run boot_update_conf ; tftpboot $loadaddr $bootfile && bootm $loadaddr#$bootconf
++mmc_write_vol=imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc erase 0x$part_addr 0x$image_size && mmc write $loadaddr 0x$part_addr 0x$image_size
++mmc_read_vol=mmc read $loadaddr $part_addr 0x100 && imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc read $loadaddr 0x$part_addr 0x$image_size && setexpr filesize $image_size * 0x200
++part_default=production
++part_recovery=recovery
++reset_factory=eraseenv && reset
++sdmmc_read_production=part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_read_vol
++sdmmc_read_recovery=part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_read_vol
++sdmmc_read_snand_bl2=part start mmc 0 install part_addr && mmc read $loadaddr $part_addr 0x400
++sdmmc_read_snand_fip=part start mmc 0 install part_addr && setexpr offset $part_addr + 0x800 && mmc read $loadaddr $offset 0x1000
++sdmmc_read_nor_bl2=part start mmc 0 install part_addr && setexpr offset $part_addr + 0x2800 && mmc read $loadaddr $offset 0x400
++sdmmc_read_nor_fip=part start mmc 0 install part_addr && setexpr offset $part_addr + 0x3000 && mmc read $loadaddr $offset 0x1000
++sdmmc_read_emmc_install=part start mmc 0 install part_addr && setexpr offset $part_addr + 0x3800 && mmc read $loadaddr $offset 0x4000
++sdmmc_write_production=part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_write_vol
++sdmmc_write_recovery=part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_write_vol
++snand_write_bl2=mtd erase bl2 0x0 0x100000 && mtd write bl2 $loadaddr 0x0 0x40000 && mtd write bl2 $loadaddr 0x40000 0x40000 && mtd write bl2 $loadaddr 0x80000 0x40000 && mtd write bl2 $loadaddr 0xc0000 0x40000
++nor_write_bl2=mtd erase bl2 && mtd write bl2 $loadaddr
++nor_write_fip=mtd erase fip && mtd write fip $loadaddr
++nor_pad_size=imsz $loadaddr image_size ; setexpr image_eb 0x$image_size / 0x10000 ; setexpr tmp1 0x$image_size % 0x10000 ; test 0x$tmp1 -gt 0 && setexpr image_eb 0x$image_eb + 1 ; setexpr image_eb $image_eb * 0x10000
++nor_erase_env=mtd erase u-boot-env
++nor_write_production=run nor_pad_size ; test 0x$image_eb -le 0x3000000 && mtd erase fit && mtd write fit $loadaddr 0x0 $image_eb
++nor_write_recovery=run nor_pad_size ; test 0x$image_eb -le 0x900000 && mtd erase recovery 0x0 0x$image_eb && mtd write recovery $loadaddr 0x0 $image_eb
++nor_init=run nor_init_bl && run nor_init_openwrt
++nor_init_bl=run sdmmc_read_nor_bl2 && run nor_write_bl2 && run sdmmc_read_nor_fip && run nor_write_fip && run nor_erase_env
++nor_init_openwrt=run sdmmc_read_recovery && iminfo $loadaddr && run nor_write_recovery ; run sdmmc_read_production && iminfo $loadaddr && run nor_write_production
++ubi_format=ubi detach ; mtd erase ubi && ubi part ubi
++ubi_init=run ubi_format && run ubi_init_bl && run ubi_init_openwrt && run ubi_init_emmc_install
++ubi_init_openwrt=run sdmmc_read_recovery && iminfo $loadaddr && run ubi_write_recovery ; run sdmmc_read_production && iminfo $loadaddr && run ubi_write_production
++ubi_init_bl=run sdmmc_read_snand_bl2 && run snand_write_bl2 && run sdmmc_read_snand_fip && run ubi_write_fip
++ubi_init_emmc_install=run sdmmc_read_emmc_install && run ubi_write_emmc_install
++ubi_prepare_rootfs=if ubi check rootfs_data ; then else if env exists rootfs_data_max ; then ubi create rootfs_data $rootfs_data_max dynamic || ubi create rootfs_data - dynamic ; else ubi create rootfs_data - dynamic ; fi ; fi
++ubi_remove_rootfs=ubi check rootfs_data && ubi remove rootfs_data
++ubi_write_fip=ubi check fip && ubi remove fip ; ubi create fip 0x200000 static ; ubi write $loadaddr fip 0x200000
++ubi_write_emmc_install=ubi check emmc_install && ubi remove emmc_install ; ubi create emmc_install 0x800000 dynamic ; ubi write $loadaddr emmc_install 0x800000
++ubi_write_production=ubi check fit && ubi remove fit ; run ubi_remove_rootfs ; ubi create fit $filesize dynamic && ubi write $loadaddr fit $filesize
++ubi_write_recovery=ubi check recovery && ubi remove recovery ; run ubi_remove_rootfs ; ubi create recovery $filesize dynamic && ubi write $loadaddr recovery $filesize
++_init_env=setenv _init_env ; setenv _create_env ; saveenv ; saveenv
++_firstboot=setenv _firstboot ; run _switch_to_menu ; run _init_env ; run boot_first
++_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
++_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
+--- /dev/null
++++ b/bananapi_bpi-r3_nor_env
+@@ -0,0 +1,60 @@
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x46000000
++console=earlycon=uart8250,mmio32,0x11002000 console=ttyS0
++bootargs=root=/dev/fit0
++bootcmd=if pstore check ; then run boot_recovery ; else run boot_nor ; fi
++bootconf=config-mt7986a-bananapi-bpi-r3
++bootconf_base=config-mt7986a-bananapi-bpi-r3
++bootconf_nor=mt7986a-bananapi-bpi-r3-nor
++bootconf_nand=mt7986a-bananapi-bpi-r3-nand
++bootconf_sd=mt7986a-bananapi-bpi-r3-sd
++bootconf_emmc=mt7986a-bananapi-bpi-r3-emmc
++bootdelay=0
++bootfile=openwrt-mediatek-filogic-bananapi_bpi-r3-initramfs-recovery.itb
++bootfile_bl2=openwrt-mediatek-filogic-bananapi_bpi-r3-nor-preloader.bin
++bootfile_fip=openwrt-mediatek-filogic-bananapi_bpi-r3-nor-bl31-uboot.fip
++bootfile_upg=openwrt-mediatek-filogic-bananapi_bpi-r3-squashfs-sysupgrade.itb
++bootled_pwr=green:status
++bootled_rec=blue:status
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_default=0
++bootmenu_delay=0
++bootmenu_title= ( ( ( OpenWrt ) ) ) [SPI-NOR]
++bootmenu_0=Initialize environment.=run _firstboot
++bootmenu_0d=Run default boot command.=run boot_default
++bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
++bootmenu_2=Boot production system from flash.=run boot_production ; run bootmenu_confirm_return
++bootmenu_3=Boot recovery system from flash.=run boot_recovery ; run bootmenu_confirm_return
++bootmenu_4=Load production system via TFTP then write to flash.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_5=Load recovery system via TFTP then write to flash.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_6=Load BL31+U-Boot FIP via TFTP then write to flash.=run boot_tftp_write_fip ; run bootmenu_confirm_return
++bootmenu_7=Load BL2 preloader via TFTP then write to flash.=run boot_tftp_write_bl2 ; run bootmenu_confirm_return
++bootmenu_8=Reboot.=reset
++bootmenu_9=Reset all settings to factory defaults.=run reset_factory ; reset
++boot_first=if button reset ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
++boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
++boot_production=run boot_update_conf ; led $bootled_pwr on ; run nor_read_production && bootm $loadaddr#$bootconf ; led $bootled_pwr off
++boot_recovery=run boot_update_conf ; led $bootled_rec on ; run nor_read_recovery ; bootm $loadaddr#$bootconf ; led $bootled_rec off
++boot_serial_write_fip=loadx $loadaddr 115200 && run boot_write_fip
++boot_serial_write_preloader=loadx $loadaddr 115200 && run boot_write_preloader
++boot_tftp_forever=led $bootled_rec on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done
++boot_tftp_production=run boot_update_conf ; tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run nor_write_production ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp_recovery=run boot_update_conf ; tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run nor_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp=run boot_update_conf ; tftpboot $loadaddr $bootfile && bootm $loadaddr#$bootconf
++boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run nor_write_fip
++boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run nor_write_bl2
++boot_update_conf=if mmc partconf 0 ; then setenv bootconf $bootconf_base#$bootconf_nor#$bootconf_emmc ; else setenv bootconf $bootconf_base#$bootconf_nor#$bootconf_sd ; fi
++boot_nor=run boot_production ; run boot_recovery
++reset_factory=mtd erase u-boot-env
++nor_write_fip=mtd erase fip && mtd write fip $loadaddr
++nor_write_bl2=mtd erase bl2 && mtd write bl2 $loadaddr
++nor_read_production=mtd read fit $loadaddr 0x0 0x20000 && imsz $loadaddr image_size && mtd read fit $loadaddr 0x0 $image_size
++nor_read_recovery=mtd read recovery $loadaddr 0x0 0x20000 && imsz $loadaddr image_size && mtd read recovery $loadaddr 0x0 $image_size
++nor_pad_size=imsz $loadaddr image_size ; setexpr image_eb 0x$image_size / 0x10000 ; setexpr tmp1 0x$image_size % 0x10000 ; test 0x$tmp1 -gt 0 && setexpr image_eb 0x$image_eb + 1 ; setexpr image_eb $image_eb * 0x10000
++nor_write_production=run nor_pad_size ; test 0x$image_eb -le 0x3000000 && mtd erase fit && mtd write fit $loadaddr 0x0 $image_eb
++nor_write_recovery=run nor_pad_size ; test 0x$image_eb -le 0x900000 && mtd erase recovery 0x0 0x$image_eb && mtd write recovery $loadaddr 0x0 $image_eb
++_init_env=setenv _init_env ; saveenv
++_firstboot=setenv _firstboot ; run _switch_to_menu ; run _init_env ; run boot_first
++_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
++_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
+--- /dev/null
++++ b/bananapi_bpi-r3_snand_env
+@@ -0,0 +1,73 @@
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x46000000
++console=earlycon=uart8250,mmio32,0x11002000 console=ttyS0
++bootargs=root=/dev/fit0
++bootconf=config-mt7986a-bananapi-bpi-r3
++bootconf_base=config-mt7986a-bananapi-bpi-r3
++bootconf_nor=mt7986a-bananapi-bpi-r3-nor
++bootconf_nand=mt7986a-bananapi-bpi-r3-nand
++bootconf_sd=mt7986a-bananapi-bpi-r3-sd
++bootconf_emmc=mt7986a-bananapi-bpi-r3-emmc
++bootcmd=if pstore check ; then run boot_recovery ; else run boot_ubi ; fi
++bootdelay=0
++bootfile=openwrt-mediatek-filogic-bananapi_bpi-r3-initramfs-recovery.itb
++bootfile_bl2=openwrt-mediatek-filogic-bananapi_bpi-r3-snand-preloader.bin
++bootfile_fip=openwrt-mediatek-filogic-bananapi_bpi-r3-snand-bl31-uboot.fip
++bootfile_upg=openwrt-mediatek-filogic-bananapi_bpi-r3-squashfs-sysupgrade.itb
++bootled_pwr=green:status
++bootled_rec=blue:status
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_default=0
++bootmenu_delay=0
++bootmenu_title= ( ( ( OpenWrt ) ) ) [SPI-NAND]
++bootmenu_0=Initialize environment.=run _firstboot
++bootmenu_0d=Run default boot command.=run boot_default
++bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
++bootmenu_2=Boot production system from NAND.=run boot_production ; run bootmenu_confirm_return
++bootmenu_3=Boot recovery system from NAND.=run boot_recovery ; run bootmenu_confirm_return
++bootmenu_4=Load production system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_5=Load recovery system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_6=Load BL31+U-Boot FIP via TFTP then write to NAND.=run boot_tftp_write_fip ; run bootmenu_confirm_return
++bootmenu_7=Load BL2 preloader via TFTP then write to NAND.=run boot_tftp_write_bl2 ; run bootmenu_confirm_return
++bootmenu_8=Install bootloader, recovery and production to eMMC.=if mmc partconf 0 ; then run emmc_init ; else echo "eMMC not detected" ; fi ; run bootmenu_confirm_return
++bootmenu_9=Reboot.=reset
++bootmenu_10=Reset all settings to factory defaults.=run reset_factory ; reset
++boot_first=if button reset ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
++boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
++boot_production=run boot_update_conf ; led $bootled_pwr on ; run ubi_read_production && bootm $loadaddr#$bootconf ; led $bootled_pwr off
++boot_recovery=run boot_update_conf ; led $bootled_rec on ; run ubi_read_recovery && bootm $loadaddr#$bootconf ; led $bootled_rec off
++boot_ubi=run boot_production ; run boot_recovery
++boot_tftp_forever=led $bootled_rec on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done
++boot_tftp_production=run boot_update_conf ; tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run ubi_write_production ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp_recovery=run boot_update_conf ; tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run ubi_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp=run boot_update_conf ; tftpboot $loadaddr $bootfile && bootm $loadaddr#$bootconf
++boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run ubi_write_fip && run reset_factory
++boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run snand_write_bl2
++boot_update_conf=if mmc partconf 0 ; then setenv bootconf $bootconf_base#$bootconf_nand#$bootconf_emmc ; else setenv bootconf $bootconf_base#$bootconf_nand#$bootconf_sd ; fi
++part_default=production
++part_recovery=recovery
++reset_factory=ubi part ubi ; mw $loadaddr 0xff 0x1f000 ; ubi write $loadaddr ubootenv 0x1f000 ; ubi write $loadaddr ubootenv2 0x1f000
++snand_write_bl2=mtd erase bl2 0x0 0x100000 && mtd write bl2 $loadaddr 0x0 0x40000 && mtd write bl2 $loadaddr 0x40000 0x40000 && mtd write bl2 $loadaddr 0x80000 0x40000 && mtd write bl2 $loadaddr 0xc0000 0x40000
++ubi_create_env=ubi check ubootenv || ubi create ubootenv 0x1f000 dynamic ; ubi check ubootenv2 || ubi create ubootenv2 0x1f000 dynamic
++ubi_prepare_rootfs=if ubi check rootfs_data ; then else if env exists rootfs_data_max ; then ubi create rootfs_data $rootfs_data_max dynamic || ubi create rootfs_data - dynamic ; else ubi create rootfs_data - dynamic ; fi ; fi
++ubi_read_production=ubi read $loadaddr fit && iminfo $loadaddr && run ubi_prepare_rootfs
++ubi_read_recovery=ubi check recovery && ubi read $loadaddr recovery
++ubi_read_emmc_install=ubi check emmc_install && ubi read $loadaddr emmc_install
++ubi_remove_rootfs=ubi check rootfs_data && ubi remove rootfs_data
++ubi_write_fip=ubi check fip && ubi remove fip ; ubi create fip 0x200000 static ; ubi write $loadaddr fip 0x200000
++ubi_write_production=ubi check fit && ubi remove fit ; run ubi_remove_rootfs ; ubi create fit $filesize dynamic && ubi write $loadaddr fit $filesize
++ubi_write_recovery=ubi check recovery && ubi remove recovery ; run ubi_remove_rootfs ; ubi create recovery $filesize dynamic && ubi write $loadaddr recovery $filesize
++mmc_write_vol=imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc erase 0x$part_addr 0x$image_size && mmc write $loadaddr 0x$part_addr 0x$image_size
++emmc_init=mmc dev 0 && mmc bootbus 0 0 0 0 && run emmc_init_bl && run emmc_init_openwrt ; env default bootcmd ; saveenv ; saveenv
++emmc_init_bl=run ubi_read_emmc_install && setenv fileaddr $loadaddr && run emmc_write_bl2 && setexpr fileaddr $loadaddr + 0x100000 && run emmc_write_fip && setexpr fileaddr $loadaddr + 0x500000 && run emmc_write_hdr
++emmc_init_openwrt=run ubi_read_recovery && iminfo $loadaddr && run emmc_write_recovery ; run ubi_read_production && iminfo $loadaddr && run emmc_write_production
++emmc_write_bl2=mmc partconf 0 1 1 1 && mmc erase 0x0 0x400 && mmc write $fileaddr 0x0 0x400 ; mmc partconf 0 1 1 0
++emmc_write_fip=mmc erase 0x3400 0x2000 && mmc write $fileaddr 0x3400 0x2000 && mmc erase 0x2000 0x800
++emmc_write_hdr=mmc erase 0x0 0x40 && mmc write $fileaddr 0x0 0x40
++emmc_write_production=part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_write_vol
++emmc_write_recovery=part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_write_vol
++_init_env=setenv _init_env ; run ubi_create_env ; saveenv ; saveenv
++_firstboot=setenv _firstboot ; run _switch_to_menu ; run _init_env ; run boot_first
++_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
++_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
+--- /dev/null
++++ b/bananapi_bpi-r3_emmc_env
+@@ -0,0 +1,61 @@
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x46000000
++console=earlycon=uart8250,mmio32,0x11002000 console=ttyS0
++bootargs=root=/dev/fit0
++bootcmd=if pstore check ; then run boot_recovery ; else run boot_emmc ; fi
++bootconf=config-mt7986a-bananapi-bpi-r3
++bootconf_base=config-mt7986a-bananapi-bpi-r3
++bootconf_nor=mt7986a-bananapi-bpi-r3-nor
++bootconf_nand=mt7986a-bananapi-bpi-r3-nand
++bootconf_sd=mt7986a-bananapi-bpi-r3-sd
++bootconf_emmc=mt7986a-bananapi-bpi-r3-emmc
++bootdelay=0
++bootfile=openwrt-mediatek-filogic-bananapi_bpi-r3-initramfs-recovery.itb
++bootfile_bl2=openwrt-mediatek-filogic-bananapi_bpi-r3-emmc-preloader.bin
++bootfile_fip=openwrt-mediatek-filogic-bananapi_bpi-r3-emmc-bl31-uboot.fip
++bootfile_upg=openwrt-mediatek-filogic-bananapi_bpi-r3-squashfs-sysupgrade.itb
++bootled_pwr=green:status
++bootled_rec=blue:status
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_default=0
++bootmenu_delay=0
++bootmenu_title= ( ( ( OpenWrt ) ) ) [eMMC]
++bootmenu_0=Initialize environment.=run _firstboot
++bootmenu_0d=Run default boot command.=run boot_default
++bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
++bootmenu_2=Boot production system from eMMC.=run boot_production ; run bootmenu_confirm_return
++bootmenu_3=Boot recovery system from eMMC.=run boot_recovery ; run bootmenu_confirm_return
++bootmenu_4=Load production system via TFTP then write to eMMC.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_5=Load recovery system via TFTP then write to eMMC.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_6=Load BL31+U-Boot FIP via TFTP then write to eMMC.=run boot_tftp_write_fip ; run bootmenu_confirm_return
++bootmenu_7=Load BL2 preloader via TFTP then write to eMMC.=run boot_tftp_write_bl2 ; run bootmenu_confirm_return
++bootmenu_8=Reboot.=reset
++bootmenu_9=Reset all settings to factory defaults.=run reset_factory ; reset
++boot_first=if button reset ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
++boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
++boot_production=run boot_update_conf ; led $bootled_pwr on ; run emmc_read_production && bootm $loadaddr#$bootconf ; led $bootled_pwr off
++boot_recovery=run boot_update_conf ; led $bootled_rec on ; run emmc_read_recovery && bootm $loadaddr#$bootconf ; led $bootled_rec off
++boot_emmc=run boot_production ; run boot_recovery
++boot_tftp_forever=led $bootled_rec on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done
++boot_tftp_production=run boot_update_conf ; tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run emmc_write_production ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp_recovery=run boot_update_conf ; tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run emmc_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run emmc_write_fip
++boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run emmc_write_bl2
++boot_tftp=run boot_update_conf ; tftpboot $loadaddr $bootfile && bootm $loadaddr#$bootconf
++boot_update_conf=if nand info ; then setenv bootconf $bootconf_base#$bootconf_emmc#$bootconf_nand ; else setenv bootconf $bootconf_base#$bootconf_emmc#$bootconf_nor ; fi
++mmc_write_vol=imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc erase 0x$part_addr 0x$image_size && mmc write $loadaddr 0x$part_addr 0x$image_size
++mmc_read_vol=mmc read $loadaddr $part_addr 0x100 && imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc read $loadaddr 0x$part_addr 0x$image_size && setexpr filesize $image_size * 0x200
++part_default=production
++part_recovery=recovery
++reset_factory=eraseenv && reset
++emmc_read_production=part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_read_vol
++emmc_read_recovery=part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_read_vol
++emmc_write_bl2=mmc partconf 0 1 1 1 && mmc erase 0x0 0x400 && mmc write $fileaddr 0x0 0x400 ; mmc partconf 0 1 1 0
++emmc_write_fip=mmc erase 0x3400 0x2000 && mmc write $fileaddr 0x3400 0x2000 && mmc erase 0x2000 0x800
++emmc_write_production=part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_write_vol
++emmc_write_recovery=part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_write_vol
++_init_env=setenv _init_env ; setenv _create_env ; saveenv ; saveenv
++_firstboot=setenv _firstboot ; run _switch_to_menu ; run _init_env ; run boot_first
++_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
++_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
+--- a/arch/arm/dts/mt7986a-bpi-r3-sd.dts
++++ b/arch/arm/dts/mt7986a-bpi-r3-sd.dts
+@@ -235,22 +235,13 @@
+
+ partition@0 {
+ label = "bl2";
+- reg = <0x0 0x80000>;
++ reg = <0x0 0x200000>;
+ };
+
+- partition@80000 {
+- label = "factory";
+- reg = <0x80000 0x300000>;
+- };
+-
+- partition@380000 {
+- label = "fip";
+- reg = <0x380000 0x200000>;
+- };
+-
+- partition@580000 {
++ partition@200000 {
+ label = "ubi";
+- reg = <0x580000 0x7a80000>;
++ reg = <0x200000 0x7e00000>;
++ compatible = "linux,ubi";
+ };
+ };
+ };
diff --git a/package/boot/uboot-mediatek/patches/431-add-xiaomi_redmi-ax6000.patch b/package/boot/uboot-mediatek/patches/431-add-xiaomi_redmi-ax6000.patch
new file mode 100644
index 00000000000..88b2c63632d
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/431-add-xiaomi_redmi-ax6000.patch
@@ -0,0 +1,404 @@
+--- /dev/null
++++ b/configs/mt7986_xiaomi_redmi-ax6000_defconfig
+@@ -0,0 +1,179 @@
++CONFIG_ARM=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TARGET_MT7986=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_NR_DRAM_BANKS=1
++CONFIG_DEFAULT_DEVICE_TREE="mt7986a-xiaomi_redmi-ax6000"
++CONFIG_DEFAULT_ENV_FILE="xiaomi_redmi-ax6000_env"
++CONFIG_DEFAULT_FDT_FILE="mediatek/mt7986a-xiaomi_redmi-ax6000.dtb"
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_DEBUG_UART_BASE=0x11002000
++CONFIG_DEBUG_UART_CLOCK=40000000
++CONFIG_DEBUG_UART=y
++CONFIG_SYS_LOAD_ADDR=0x46000000
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_BOOTDELAY=30
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++# CONFIG_LED is not set
++# CONFIG_LED_BLINK is not set
++# CONFIG_LED_GPIO is not set
++CONFIG_LOGLEVEL=7
++CONFIG_LOG=y
++CONFIG_SYS_PROMPT="MT7986> "
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++# CONFIG_CMD_EXT4 is not set
++# CONFIG_CMD_FAT is not set
++CONFIG_CMD_FDT=y
++# CONFIG_CMD_FS_GENERIC is not set
++# CONFIG_CMD_FS_UUID is not set
++CONFIG_CMD_GPIO=y
++# CONFIG_CMD_GPT is not set
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++# CONFIG_CMD_LED is not set
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++# CONFIG_CMD_MBR is not set
++CONFIG_CMD_MTD=y
++# CONFIG_CMD_PCI is not set
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
++# CONFIG_CMD_PWM is not set
++CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_UBI=y
++CONFIG_CMD_UBI_RENAME=y
++CONFIG_CMD_UBIFS=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_PART=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++# CONFIG_CMD_USB is not set
++# CONFIG_CMD_FLASH is not set
++CONFIG_CMD_UUID=y
++CONFIG_DISPLAY_CPUINFO=y
++CONFIG_DM_MTD=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++# CONFIG_DM_USB is not set
++# CONFIG_DM_PWM is not set
++# CONFIG_PWM_MTK is not set
++CONFIG_HUSH_PARSER=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_VERSION_VARIABLE=y
++CONFIG_PARTITION_UUIDS=y
++CONFIG_NETCONSOLE=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_DM_GPIO=y
++# CONFIG_DM_SCSI is not set
++# CONFIG_AHCI is not set
++CONFIG_PHY=y
++# CONFIG_PHY_MTK_TPHY is not set
++CONFIG_PHY_FIXED=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++# CONFIG_PCI is not set
++# CONFIG_MMC is not set
++# CONFIG_DM_MMC is not set
++CONFIG_MTD=y
++CONFIG_MTD_UBI_FASTMAP=y
++# CONFIG_DM_PCI is not set
++# CONFIG_PCIE_MEDIATEK is not set
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++# CONFIG_PINCTRL_MT7622 is not set
++CONFIG_POWER_DOMAIN=y
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_RAM=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_SPI=y
++# CONFIG_I2C is not set
++CONFIG_DM_SPI=y
++CONFIG_MTK_SPI_NAND=y
++CONFIG_MTK_SPI_NAND_MTD=y
++CONFIG_SYSRESET_WATCHDOG=y
++CONFIG_WDT_MTK=y
++CONFIG_LZO=y
++CONFIG_ZSTD=y
++CONFIG_HEXDUMP=y
++CONFIG_RANDOM_UUID=y
++CONFIG_REGEX=y
++# CONFIG_USB is not set
++# CONFIG_USB_HOST is not set
++# CONFIG_USB_XHCI_HCD is not set
++# CONFIG_USB_XHCI_MTK is not set
++# CONFIG_USB_STORAGE is not set
++CONFIG_OF_EMBED=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_IS_IN_UBI=y
++CONFIG_ENV_UBI_PART="ubi"
++CONFIG_ENV_SIZE=0x1f000
++CONFIG_ENV_SIZE_REDUND=0x1f000
++CONFIG_ENV_UBI_VOLUME="ubootenv"
++CONFIG_ENV_UBI_VOLUME_REDUND="ubootenv2"
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_PHY_FIXED=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7986=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_HEXDUMP=y
++CONFIG_USE_DEFAULT_ENV_FILE=y
++CONFIG_MTD_SPI_NAND=y
++CONFIG_MTK_SPIM=y
++CONFIG_CMD_NAND=y
++CONFIG_CMD_NAND_TRIMFFS=y
++CONFIG_LMB_MAX_REGIONS=64
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
+--- /dev/null
++++ b/arch/arm/dts/mt7986a-xiaomi_redmi-ax6000.dts
+@@ -0,0 +1,161 @@
++// SPDX-License-Identifier: GPL-2.0
++/*
++ * Copyright (c) 2021 MediaTek Inc.
++ * Author: Sam Shih <sam.shih@mediatek.com>
++ */
++
++/dts-v1/;
++#include <dt-bindings/input/linux-event-codes.h>
++#include "mt7986.dtsi"
++#include <dt-bindings/gpio/gpio.h>
++
++/ {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ model = "Xiaomi Redmi AX6000";
++ compatible = "mediatek,mt7986", "mediatek,mt7986-sd-rfb";
++
++ chosen {
++ stdout-path = &uart0;
++ tick-timer = &timer0;
++ };
++
++ memory@40000000 {
++ device_type = "memory";
++ reg = <0x40000000 0x20000000>;
++ };
++
++ keys {
++ compatible = "gpio-keys";
++ factory {
++ label = "reset";
++ gpios = <&gpio 9 GPIO_ACTIVE_LOW>;
++ linux,code = <KEY_RESTART>;
++ };
++ mesh {
++ label = "mesh";
++ gpios = <&gpio 10 GPIO_ACTIVE_LOW>;
++ linux,code = <KEY_WPS_BUTTON>;
++ };
++ };
++};
++
++&uart0 {
++ mediatek,force-highspeed;
++ status = "okay";
++};
++
++&uart1 {
++ pinctrl-names = "default";
++ pinctrl-0 = <&uart1_pins>;
++ status = "disabled";
++};
++
++&eth {
++ status = "okay";
++ mediatek,gmac-id = <0>;
++ phy-mode = "2500base-x";
++ mediatek,switch = "mt7531";
++ reset-gpios = <&gpio 5 GPIO_ACTIVE_HIGH>;
++
++ fixed-link {
++ speed = <2500>;
++ full-duplex;
++ };
++};
++
++&pinctrl {
++ spic_pins: spi1-pins-func-1 {
++ mux {
++ function = "spi";
++ groups = "spi1_2";
++ };
++ };
++
++ uart1_pins: spi1-pins-func-3 {
++ mux {
++ function = "uart";
++ groups = "uart1_2";
++ };
++ };
++
++ spi_flash_pins: spi0-pins-func-1 {
++ mux {
++ function = "flash";
++ groups = "spi0", "spi0_wp_hold";
++ };
++
++ conf-pu {
++ pins = "SPI2_CS", "SPI2_HOLD", "SPI2_WP";
++ drive-strength = <MTK_DRIVE_8mA>;
++ bias-pull-up = <MTK_PUPD_SET_R1R0_00>;
++ };
++
++ conf-pd {
++ pins = "SPI2_CLK", "SPI2_MOSI", "SPI2_MISO";
++ drive-strength = <MTK_DRIVE_8mA>;
++ bias-pull-down = <MTK_PUPD_SET_R1R0_00>;
++ };
++ };
++};
++
++&spi0 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ pinctrl-names = "default";
++ pinctrl-0 = <&spi_flash_pins>;
++ status = "okay";
++ must_tx;
++ enhance_timing;
++ dma_ext;
++ ipm_design;
++ support_quad;
++ tick_dly = <1>;
++ sample_sel = <0>;
++
++ spi_nand@0 {
++ compatible = "spi-nand";
++ reg = <0>;
++ spi-max-frequency = <52000000>;
++
++ partitions {
++ compatible = "fixed-partitions";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ partition@0 {
++ label = "bl2";
++ reg = <0x0 0x80000>;
++ };
++
++ partition@100000 {
++ label = "nvram";
++ reg = <0x100000 0x40000>;
++ };
++
++ partition@140000 {
++ label = "bdata";
++ reg = <0x140000 0x40000>;
++ };
++
++ partition@180000 {
++ label = "factory";
++ reg = <0x180000 0x200000>;
++ };
++
++ partition@380000 {
++ label = "fip";
++ reg = <0x380000 0x200000>;
++ };
++
++ partition@600000 {
++ label = "ubi";
++ reg = <0x580000 0x7a80000>;
++ };
++ };
++ };
++};
++
++&watchdog {
++ status = "disabled";
++};
+--- /dev/null
++++ b/xiaomi_redmi-ax6000_env
+@@ -0,0 +1,55 @@
++ethaddr_factory=mtd read factory 0x40080000 0x0 0x20000 && env readmem -b ethaddr 0x40080004 0x6 ; setenv ethaddr_factory
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x46000000
++console=earlycon=uart8250,mmio32,0x11002000 console=ttyS0
++bootargs=console=ttyS0,115200n8 console_msg_format=syslog
++bootcmd=if pstore check ; then run boot_recovery ; else run boot_ubi ; fi
++bootconf=config-1
++bootdelay=0
++bootfile=openwrt-mediatek-filogic-xiaomi_redmi-router-ax6000-ubootmod-initramfs-recovery.itb
++bootfile_bl2=openwrt-mediatek-filogic-xiaomi_redmi-router-ax6000-ubootmod-preloader.bin
++bootfile_fip=openwrt-mediatek-filogic-xiaomi_redmi-router-ax6000-ubootmod-bl31-uboot.fip
++bootfile_upg=openwrt-mediatek-filogic-xiaomi_redmi-router-ax6000-ubootmod-squashfs-sysupgrade.itb
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_default=0
++bootmenu_delay=0
++bootmenu_title= ( ( ( OpenWrt ) ) )
++bootmenu_0=Initialize environment.=run _firstboot
++bootmenu_0d=Run default boot command.=run boot_default
++bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
++bootmenu_2=Boot production system from NAND.=run boot_production ; run bootmenu_confirm_return
++bootmenu_3=Boot recovery system from NAND.=run boot_recovery ; run bootmenu_confirm_return
++bootmenu_4=Load production system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_5=Load recovery system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_6=Load BL31+U-Boot FIP via TFTP then write to NAND.=run boot_tftp_write_fip ; run bootmenu_confirm_return
++bootmenu_7=Load BL2 preloader via TFTP then write to NAND.=run boot_tftp_write_bl2 ; run bootmenu_confirm_return
++bootmenu_8=Reboot.=reset
++bootmenu_9=Reset all settings to factory defaults.=run reset_factory ; reset
++boot_first=if button reset ; then run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
++boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
++boot_production=run ubi_read_production && bootm $loadaddr#$bootconf
++boot_recovery=run ubi_read_recovery && bootm $loadaddr#$bootconf
++boot_ubi=run boot_production ; run boot_recovery ; run boot_tftp_forever
++boot_tftp_forever=while true ; do run boot_tftp_recovery ; sleep 1 ; done
++boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run ubi_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run ubi_write_production ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr#$bootconf
++boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run mtd_write_fip && run reset_factory
++boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run mtd_write_bl2
++part_fit=fit
++reset_factory=ubi part ubi ; mw $loadaddr 0x0 0x800 ; ubi write $loadaddr ubootenv 0x800 ; ubi write $loadaddr ubootenv2 0x800
++mtd_write_fip=mtd erase fip && mtd write fip $loadaddr
++mtd_write_bl2=mtd erase bl2 && mtd write bl2 $loadaddr
++ubi_create_env=ubi check ubootenv || ubi create ubootenv 0x100000 dynamic 0 ; ubi check ubootenv2 || ubi create ubootenv2 0x100000 dynamic 1
++ubi_format=ubi detach ; mtd erase ubi && ubi part ubi ; reset
++ubi_prepare_rootfs=if ubi check rootfs_data ; then else if env exists rootfs_data_max ; then ubi create rootfs_data $rootfs_data_max dynamic || ubi create rootfs_data - dynamic ; else ubi create rootfs_data - dynamic ; fi ; fi
++ubi_read_production=ubi read $loadaddr $part_fit && iminfo $loadaddr && run ubi_prepare_rootfs
++ubi_read_recovery=ubi check recovery && ubi read $loadaddr recovery
++ubi_remove_rootfs=ubi check rootfs_data && ubi remove rootfs_data
++ubi_write_production=ubi check fit && ubi remove fit ; run ubi_remove_rootfs ; ubi create fit $filesize dynamic && ubi write $loadaddr fit $filesize
++ubi_write_recovery=ubi check recovery && ubi remove recovery ; run ubi_remove_rootfs ; ubi create recovery $filesize dynamic && ubi write $loadaddr recovery $filesize
++_init_env=setenv _init_env ; run ubi_create_env ; saveenv ; saveenv
++_firstboot=setenv _firstboot ; run ethaddr_factory ; run _switch_to_menu ; run _init_env ; run boot_first
++_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
++_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
diff --git a/package/boot/uboot-mediatek/patches/432-add-tplink-xdr608x.patch b/package/boot/uboot-mediatek/patches/432-add-tplink-xdr608x.patch
new file mode 100644
index 00000000000..365f280947d
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/432-add-tplink-xdr608x.patch
@@ -0,0 +1,934 @@
+--- /dev/null
++++ b/configs/mt7986_tplink_tl-xdr4288_defconfig
+@@ -0,0 +1,182 @@
++CONFIG_ARM=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TARGET_MT7986=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_NR_DRAM_BANKS=1
++CONFIG_DEFAULT_DEVICE_TREE="mt7986a-tplink-tl-xdr608x"
++CONFIG_DEFAULT_ENV_FILE="tplink_tl-xdr4288_env"
++CONFIG_DEFAULT_FDT_FILE="mediatek/mt7986a-tplink-tl-xdr608x.dtb"
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_DEBUG_UART_BASE=0x11002000
++CONFIG_DEBUG_UART_CLOCK=40000000
++CONFIG_DEBUG_UART=y
++CONFIG_SYS_LOAD_ADDR=0x46000000
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_BOOTDELAY=30
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_LOGLEVEL=7
++CONFIG_LOG=y
++CONFIG_SYS_PROMPT="MT7986> "
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_EXT4=y
++CONFIG_CMD_FAT=y
++CONFIG_CMD_FDT=y
++CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_FS_UUID=y
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_GPT=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++# CONFIG_CMD_MBR is not set
++CONFIG_CMD_PCI=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
++CONFIG_CMD_PWM=y
++CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_UBI=y
++CONFIG_CMD_UBI_RENAME=y
++CONFIG_CMD_UBIFS=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_PART=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_USB=y
++CONFIG_CMD_UUID=y
++CONFIG_DISPLAY_CPUINFO=y
++CONFIG_DM_MTD=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++CONFIG_DM_USB=y
++CONFIG_DM_PWM=y
++CONFIG_PWM_MTK=y
++CONFIG_HUSH_PARSER=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_VERSION_VARIABLE=y
++CONFIG_PARTITION_UUIDS=y
++CONFIG_NETCONSOLE=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_DM_GPIO=y
++CONFIG_DM_SCSI=y
++CONFIG_AHCI=y
++CONFIG_AHCI_PCI=y
++CONFIG_SCSI_AHCI=y
++CONFIG_SCSI=y
++CONFIG_CMD_SCSI=y
++CONFIG_PHY=y
++CONFIG_PHY_MTK_TPHY=y
++CONFIG_PHY_FIXED=y
++CONFIG_MTK_AHCI=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PCI=y
++# CONFIG_MMC is not set
++# CONFIG_DM_MMC is not set
++CONFIG_MTD=y
++CONFIG_MTD_UBI_FASTMAP=y
++CONFIG_DM_PCI=y
++CONFIG_PCIE_MEDIATEK=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7622=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_RAM=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_SPI=y
++CONFIG_DM_SPI=y
++CONFIG_MTK_SPI_NAND=y
++CONFIG_MTK_SPI_NAND_MTD=y
++CONFIG_SYSRESET_WATCHDOG=y
++CONFIG_WDT_MTK=y
++CONFIG_LZO=y
++CONFIG_ZSTD=y
++CONFIG_HEXDUMP=y
++CONFIG_RANDOM_UUID=y
++CONFIG_REGEX=y
++CONFIG_USB=y
++CONFIG_USB_HOST=y
++CONFIG_USB_XHCI_HCD=y
++CONFIG_USB_XHCI_MTK=y
++CONFIG_USB_STORAGE=y
++CONFIG_OF_EMBED=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_IS_IN_UBI=y
++CONFIG_ENV_UBI_PART="ubi"
++CONFIG_ENV_SIZE=0x1f000
++CONFIG_ENV_SIZE_REDUND=0x1f000
++CONFIG_ENV_UBI_VOLUME="ubootenv"
++CONFIG_ENV_UBI_VOLUME_REDUND="ubootenv2"
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_PHY_FIXED=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7986=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_HEXDUMP=y
++CONFIG_USE_DEFAULT_ENV_FILE=y
++CONFIG_MTD_SPI_NAND=y
++CONFIG_MTK_SPIM=y
++CONFIG_CMD_MTD=y
++CONFIG_CMD_NAND=y
++CONFIG_CMD_NAND_TRIMFFS=y
++CONFIG_LMB_MAX_REGIONS=64
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
+--- /dev/null
++++ b/configs/mt7986_tplink_tl-xdr6086_defconfig
+@@ -0,0 +1,182 @@
++CONFIG_ARM=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TARGET_MT7986=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_NR_DRAM_BANKS=1
++CONFIG_DEFAULT_DEVICE_TREE="mt7986a-tplink-tl-xdr608x"
++CONFIG_DEFAULT_ENV_FILE="tplink_tl-xdr6086_env"
++CONFIG_DEFAULT_FDT_FILE="mediatek/mt7986a-tplink-tl-xdr608x.dtb"
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_DEBUG_UART_BASE=0x11002000
++CONFIG_DEBUG_UART_CLOCK=40000000
++CONFIG_DEBUG_UART=y
++CONFIG_SYS_LOAD_ADDR=0x46000000
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_BOOTDELAY=30
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_LOGLEVEL=7
++CONFIG_LOG=y
++CONFIG_SYS_PROMPT="MT7986> "
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_EXT4=y
++CONFIG_CMD_FAT=y
++CONFIG_CMD_FDT=y
++CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_FS_UUID=y
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_GPT=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++# CONFIG_CMD_MBR is not set
++CONFIG_CMD_PCI=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
++CONFIG_CMD_PWM=y
++CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_UBI=y
++CONFIG_CMD_UBI_RENAME=y
++CONFIG_CMD_UBIFS=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_PART=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_USB=y
++CONFIG_CMD_UUID=y
++CONFIG_DISPLAY_CPUINFO=y
++CONFIG_DM_MTD=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++CONFIG_DM_USB=y
++CONFIG_DM_PWM=y
++CONFIG_PWM_MTK=y
++CONFIG_HUSH_PARSER=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_VERSION_VARIABLE=y
++CONFIG_PARTITION_UUIDS=y
++CONFIG_NETCONSOLE=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_DM_GPIO=y
++CONFIG_DM_SCSI=y
++CONFIG_AHCI=y
++CONFIG_AHCI_PCI=y
++CONFIG_SCSI_AHCI=y
++CONFIG_SCSI=y
++CONFIG_CMD_SCSI=y
++CONFIG_PHY=y
++CONFIG_PHY_MTK_TPHY=y
++CONFIG_PHY_FIXED=y
++CONFIG_MTK_AHCI=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PCI=y
++# CONFIG_MMC is not set
++# CONFIG_DM_MMC is not set
++CONFIG_MTD=y
++CONFIG_MTD_UBI_FASTMAP=y
++CONFIG_DM_PCI=y
++CONFIG_PCIE_MEDIATEK=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7622=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_RAM=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_SPI=y
++CONFIG_DM_SPI=y
++CONFIG_MTK_SPI_NAND=y
++CONFIG_MTK_SPI_NAND_MTD=y
++CONFIG_SYSRESET_WATCHDOG=y
++CONFIG_WDT_MTK=y
++CONFIG_LZO=y
++CONFIG_ZSTD=y
++CONFIG_HEXDUMP=y
++CONFIG_RANDOM_UUID=y
++CONFIG_REGEX=y
++CONFIG_USB=y
++CONFIG_USB_HOST=y
++CONFIG_USB_XHCI_HCD=y
++CONFIG_USB_XHCI_MTK=y
++CONFIG_USB_STORAGE=y
++CONFIG_OF_EMBED=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_IS_IN_UBI=y
++CONFIG_ENV_UBI_PART="ubi"
++CONFIG_ENV_SIZE=0x1f000
++CONFIG_ENV_SIZE_REDUND=0x1f000
++CONFIG_ENV_UBI_VOLUME="ubootenv"
++CONFIG_ENV_UBI_VOLUME_REDUND="ubootenv2"
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_PHY_FIXED=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7986=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_HEXDUMP=y
++CONFIG_USE_DEFAULT_ENV_FILE=y
++CONFIG_MTD_SPI_NAND=y
++CONFIG_MTK_SPIM=y
++CONFIG_CMD_MTD=y
++CONFIG_CMD_NAND=y
++CONFIG_CMD_NAND_TRIMFFS=y
++CONFIG_LMB_MAX_REGIONS=64
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
+--- /dev/null
++++ b/configs/mt7986_tplink_tl-xdr6088_defconfig
+@@ -0,0 +1,182 @@
++CONFIG_ARM=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TARGET_MT7986=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_NR_DRAM_BANKS=1
++CONFIG_DEFAULT_DEVICE_TREE="mt7986a-tplink-tl-xdr608x"
++CONFIG_DEFAULT_ENV_FILE="tplink_tl-xdr6088_env"
++CONFIG_DEFAULT_FDT_FILE="mediatek/mt7986a-tplink-tl-xdr608x.dtb"
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_DEBUG_UART_BASE=0x11002000
++CONFIG_DEBUG_UART_CLOCK=40000000
++CONFIG_DEBUG_UART=y
++CONFIG_SYS_LOAD_ADDR=0x46000000
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_BOOTDELAY=30
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_LOGLEVEL=7
++CONFIG_LOG=y
++CONFIG_SYS_PROMPT="MT7986> "
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_EXT4=y
++CONFIG_CMD_FAT=y
++CONFIG_CMD_FDT=y
++CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_FS_UUID=y
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_GPT=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++# CONFIG_CMD_MBR is not set
++CONFIG_CMD_PCI=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
++CONFIG_CMD_PWM=y
++CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_UBI=y
++CONFIG_CMD_UBI_RENAME=y
++CONFIG_CMD_UBIFS=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_PART=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_USB=y
++CONFIG_CMD_UUID=y
++CONFIG_DISPLAY_CPUINFO=y
++CONFIG_DM_MTD=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++CONFIG_DM_USB=y
++CONFIG_DM_PWM=y
++CONFIG_PWM_MTK=y
++CONFIG_HUSH_PARSER=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_VERSION_VARIABLE=y
++CONFIG_PARTITION_UUIDS=y
++CONFIG_NETCONSOLE=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_DM_GPIO=y
++CONFIG_DM_SCSI=y
++CONFIG_AHCI=y
++CONFIG_AHCI_PCI=y
++CONFIG_SCSI_AHCI=y
++CONFIG_SCSI=y
++CONFIG_CMD_SCSI=y
++CONFIG_PHY=y
++CONFIG_PHY_MTK_TPHY=y
++CONFIG_PHY_FIXED=y
++CONFIG_MTK_AHCI=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PCI=y
++# CONFIG_MMC is not set
++# CONFIG_DM_MMC is not set
++CONFIG_MTD=y
++CONFIG_MTD_UBI_FASTMAP=y
++CONFIG_DM_PCI=y
++CONFIG_PCIE_MEDIATEK=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7622=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_RAM=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_SPI=y
++CONFIG_DM_SPI=y
++CONFIG_MTK_SPI_NAND=y
++CONFIG_MTK_SPI_NAND_MTD=y
++CONFIG_SYSRESET_WATCHDOG=y
++CONFIG_WDT_MTK=y
++CONFIG_LZO=y
++CONFIG_ZSTD=y
++CONFIG_HEXDUMP=y
++CONFIG_RANDOM_UUID=y
++CONFIG_REGEX=y
++CONFIG_USB=y
++CONFIG_USB_HOST=y
++CONFIG_USB_XHCI_HCD=y
++CONFIG_USB_XHCI_MTK=y
++CONFIG_USB_STORAGE=y
++CONFIG_OF_EMBED=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_IS_IN_UBI=y
++CONFIG_ENV_UBI_PART="ubi"
++CONFIG_ENV_SIZE=0x1f000
++CONFIG_ENV_SIZE_REDUND=0x1f000
++CONFIG_ENV_UBI_VOLUME="ubootenv"
++CONFIG_ENV_UBI_VOLUME_REDUND="ubootenv2"
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_PHY_FIXED=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7986=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_HEXDUMP=y
++CONFIG_USE_DEFAULT_ENV_FILE=y
++CONFIG_MTD_SPI_NAND=y
++CONFIG_MTK_SPIM=y
++CONFIG_CMD_MTD=y
++CONFIG_CMD_NAND=y
++CONFIG_CMD_NAND_TRIMFFS=y
++CONFIG_LMB_MAX_REGIONS=64
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
+--- /dev/null
++++ b/arch/arm/dts/mt7986a-tplink-tl-xdr608x.dts
+@@ -0,0 +1,196 @@
++// SPDX-License-Identifier: GPL-2.0
++/*
++ * Copyright (c) 2021 MediaTek Inc.
++ * Author: Sam Shih <sam.shih@mediatek.com>
++ */
++
++/dts-v1/;
++#include "mt7986.dtsi"
++#include <dt-bindings/gpio/gpio.h>
++#include <dt-bindings/input/linux-event-codes.h>
++
++/ {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ model = "TP-Link TL-XDR608x";
++ compatible = "mediatek,mt7986", "mediatek,mt7986-rfb";
++
++ chosen {
++ stdout-path = &uart0;
++ tick-timer = &timer0;
++ };
++
++ memory@40000000 {
++ device_type = "memory";
++ reg = <0x40000000 0x20000000>;
++ };
++
++ keys {
++ compatible = "gpio-keys";
++
++ factory {
++ label = "reset";
++ linux,code = <KEY_RESTART>;
++ gpios = <&gpio 9 GPIO_ACTIVE_LOW>;
++ };
++
++ wps {
++ label = "wps";
++ linux,code = <KEY_WPS_BUTTON>;
++ gpios = <&gpio 10 GPIO_ACTIVE_LOW>;
++ };
++
++ turbo {
++ label = "turbo";
++ linux,code = <BTN_1>;
++ gpios = <&gpio 11 GPIO_ACTIVE_LOW>;
++ };
++ };
++
++ leds {
++ compatible = "gpio-leds";
++
++ status_red {
++ label = "red:status";
++ gpios = <&gpio 7 GPIO_ACTIVE_HIGH>;
++ };
++
++ status_green {
++ label = "green:status";
++ gpios = <&gpio 8 GPIO_ACTIVE_HIGH>;
++ };
++
++ turbo {
++ label = "green:turbo";
++ gpios = <&gpio 12 GPIO_ACTIVE_HIGH>;
++ };
++ };
++};
++
++&uart0 {
++ mediatek,force-highspeed;
++ status = "okay";
++};
++
++&uart1 {
++ pinctrl-names = "default";
++ pinctrl-0 = <&uart1_pins>;
++ status = "disabled";
++};
++
++&eth {
++ status = "okay";
++ mediatek,gmac-id = <0>;
++ phy-mode = "2500base-x";
++ mediatek,switch = "mt7531";
++ reset-gpios = <&gpio 5 GPIO_ACTIVE_HIGH>;
++
++ fixed-link {
++ speed = <2500>;
++ full-duplex;
++ };
++};
++
++&pinctrl {
++ spi_flash_pins: spi0-pins-func-1 {
++ mux {
++ function = "flash";
++ groups = "spi0", "spi0_wp_hold";
++ };
++
++ conf-pu {
++ pins = "SPI2_CS", "SPI2_HOLD", "SPI2_WP";
++ drive-strength = <MTK_DRIVE_8mA>;
++ bias-pull-up = <MTK_PUPD_SET_R1R0_00>;
++ };
++
++ conf-pd {
++ pins = "SPI2_CLK", "SPI2_MOSI", "SPI2_MISO";
++ drive-strength = <MTK_DRIVE_8mA>;
++ bias-pull-down = <MTK_PUPD_SET_R1R0_00>;
++ };
++ };
++
++ spic_pins: spi1-pins-func-1 {
++ mux {
++ function = "spi";
++ groups = "spi1_2";
++ };
++ };
++
++ uart1_pins: spi1-pins-func-3 {
++ mux {
++ function = "uart";
++ groups = "uart1_2";
++ };
++ };
++
++ pwm_pins: pwm0-pins-func-1 {
++ mux {
++ function = "pwm";
++ groups = "pwm0";
++ };
++ };
++};
++
++&pwm {
++ pinctrl-names = "default";
++ pinctrl-0 = <&pwm_pins>;
++ status = "okay";
++};
++
++&spi0 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ pinctrl-names = "default";
++ pinctrl-0 = <&spi_flash_pins>;
++ status = "okay";
++ must_tx;
++ enhance_timing;
++ dma_ext;
++ ipm_design;
++ support_quad;
++ tick_dly = <1>;
++ sample_sel = <0>;
++
++ spi_nand@1 {
++ compatible = "spi-nand";
++ reg = <1>;
++ spi-max-frequency = <52000000>;
++
++ partitions {
++ compatible = "fixed-partitions";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ partition@0 {
++ label = "bl2";
++ reg = <0x0 0x80000>;
++ };
++
++ partition@100000 {
++ label = "config";
++ reg = <0x100000 0x60000>;
++ };
++
++ partition@160000 {
++ label = "factory";
++ reg = <0x160000 0x60000>;
++ };
++
++ partition@380000 {
++ label = "fip";
++ reg = <0x380000 0x200000>;
++ };
++
++ partition@580000 {
++ label = "ubi";
++ reg = <0x580000 0x7800000>;
++ };
++ };
++ };
++};
++
++&watchdog {
++ status = "disabled";
++};
+--- /dev/null
++++ b/tplink_tl-xdr4288_env
+@@ -0,0 +1,57 @@
++ethaddr_factory=mtd read config 0x40080000 0x0 0x20000 && env readmem -b ethaddr 0x4008001c 0x6 ; setenv ethaddr_factory
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x46000000
++console=earlycon=uart8250,mmio32,0x11002000 console=ttyS0
++bootcmd=if pstore check ; then run boot_recovery ; else run boot_ubi ; fi
++bootconf=config-1
++bootdelay=0
++bootfile=openwrt-mediatek-filogic-tplink_tl-xdr4288-initramfs-recovery.itb
++bootfile_bl2=openwrt-mediatek-filogic-tplink_tl-xdr4288-preloader.bin
++bootfile_fip=openwrt-mediatek-filogic-tplink_tl-xdr4288-bl31-uboot.fip
++bootfile_upg=openwrt-mediatek-filogic-tplink_tl-xdr4288-squashfs-sysupgrade.itb
++bootled_pwr=green:status
++bootled_rec=red:status
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_default=0
++bootmenu_delay=0
++bootmenu_title= ( ( ( OpenWrt ) ) )
++bootmenu_0=Initialize environment.=run _firstboot
++bootmenu_0d=Run default boot command.=run boot_default
++bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
++bootmenu_2=Boot production system from NAND.=run boot_production ; run bootmenu_confirm_return
++bootmenu_3=Boot recovery system from NAND.=run boot_recovery ; run bootmenu_confirm_return
++bootmenu_4=Load production system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_5=Load recovery system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_6=Load BL31+U-Boot FIP via TFTP then write to NAND.=run boot_tftp_write_fip ; run bootmenu_confirm_return
++bootmenu_7=Load BL2 preloader via TFTP then write to NAND.=run boot_tftp_write_bl2 ; run bootmenu_confirm_return
++bootmenu_8=Reboot.=reset
++bootmenu_9=Reset all settings to factory defaults.=run reset_factory ; reset
++boot_first=if button reset ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
++boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
++boot_production=led $bootled_pwr on ; run ubi_read_production && bootm $loadaddr#$bootconf ; led $bootled_pwr off
++boot_recovery=led $bootled_rec on ; run ubi_read_recovery && bootm $loadaddr#$bootconf ; led $bootled_rec off
++boot_ubi=run boot_production ; run boot_recovery ; run boot_tftp_forever
++boot_tftp_forever=led $bootled_rec on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done
++boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run ubi_write_production ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run ubi_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr#$bootconf
++boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run mtd_write_fip && run reset_factory
++boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run mtd_write_bl2
++part_default=production
++part_recovery=recovery
++reset_factory=ubi part ubi ; mw $loadaddr 0x0 0x800 ; ubi write $loadaddr ubootenv 0x800 ; ubi write $loadaddr ubootenv2 0x800
++mtd_write_fip=mtd erase fip && mtd write fip $loadaddr
++mtd_write_bl2=mtd erase bl2 && mtd write bl2 $loadaddr
++ubi_create_env=ubi check ubootenv || ubi create ubootenv 0x100000 dynamic 0 || run ubi_format ; ubi check ubootenv2 || ubi create ubootenv2 0x100000 dynamic 1 || run ubi_format
++ubi_format=ubi detach ; mtd erase ubi && ubi part ubi ; reset
++ubi_prepare_rootfs=if ubi check rootfs_data ; then else if env exists rootfs_data_max ; then ubi create rootfs_data $rootfs_data_max dynamic || ubi create rootfs_data - dynamic ; else ubi create rootfs_data - dynamic ; fi ; fi
++ubi_read_production=ubi read $loadaddr fit && iminfo $loadaddr && run ubi_prepare_rootfs
++ubi_read_recovery=ubi check recovery && ubi read $loadaddr recovery
++ubi_remove_rootfs=ubi check rootfs_data && ubi remove rootfs_data
++ubi_write_production=ubi check fit && ubi remove fit ; run ubi_remove_rootfs ; ubi create fit $filesize dynamic 2 && ubi write $loadaddr fit $filesize
++ubi_write_recovery=ubi check recovery && ubi remove recovery ; run ubi_remove_rootfs ; ubi create recovery $filesize dynamic 3 && ubi write $loadaddr recovery $filesize
++_init_env=setenv _init_env ; run ubi_create_env ; saveenv ; saveenv
++_firstboot=setenv _firstboot ; run ethaddr_factory ; run _switch_to_menu ; run _init_env ; run boot_first
++_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
++_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
+--- /dev/null
++++ b/tplink_tl-xdr6086_env
+@@ -0,0 +1,57 @@
++ethaddr_factory=mtd read config 0x40080000 0x0 0x20000 && env readmem -b ethaddr 0x4008001c 0x6 ; setenv ethaddr_factory
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x46000000
++console=earlycon=uart8250,mmio32,0x11002000 console=ttyS0
++bootcmd=if pstore check ; then run boot_recovery ; else run boot_ubi ; fi
++bootconf=config-1
++bootdelay=0
++bootfile=openwrt-mediatek-filogic-tplink_tl-xdr6086-initramfs-recovery.itb
++bootfile_bl2=openwrt-mediatek-filogic-tplink_tl-xdr6086-preloader.bin
++bootfile_fip=openwrt-mediatek-filogic-tplink_tl-xdr6086-bl31-uboot.fip
++bootfile_upg=openwrt-mediatek-filogic-tplink_tl-xdr6086-squashfs-sysupgrade.itb
++bootled_pwr=green:status
++bootled_rec=red:status
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_default=0
++bootmenu_delay=0
++bootmenu_title= ( ( ( OpenWrt ) ) )
++bootmenu_0=Initialize environment.=run _firstboot
++bootmenu_0d=Run default boot command.=run boot_default
++bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
++bootmenu_2=Boot production system from NAND.=run boot_production ; run bootmenu_confirm_return
++bootmenu_3=Boot recovery system from NAND.=run boot_recovery ; run bootmenu_confirm_return
++bootmenu_4=Load production system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_5=Load recovery system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_6=Load BL31+U-Boot FIP via TFTP then write to NAND.=run boot_tftp_write_fip ; run bootmenu_confirm_return
++bootmenu_7=Load BL2 preloader via TFTP then write to NAND.=run boot_tftp_write_bl2 ; run bootmenu_confirm_return
++bootmenu_8=Reboot.=reset
++bootmenu_9=Reset all settings to factory defaults.=run reset_factory ; reset
++boot_first=if button reset ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
++boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
++boot_production=led $bootled_pwr on ; run ubi_read_production && bootm $loadaddr#$bootconf ; led $bootled_pwr off
++boot_recovery=led $bootled_rec on ; run ubi_read_recovery && bootm $loadaddr#$bootconf ; led $bootled_rec off
++boot_ubi=run boot_production ; run boot_recovery ; run boot_tftp_forever
++boot_tftp_forever=led $bootled_rec on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done
++boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run ubi_write_production ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run ubi_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr#$bootconf
++boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run mtd_write_fip && run reset_factory
++boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run mtd_write_bl2
++part_default=production
++part_recovery=recovery
++reset_factory=ubi part ubi ; mw $loadaddr 0x0 0x800 ; ubi write $loadaddr ubootenv 0x800 ; ubi write $loadaddr ubootenv2 0x800
++mtd_write_fip=mtd erase fip && mtd write fip $loadaddr
++mtd_write_bl2=mtd erase bl2 && mtd write bl2 $loadaddr
++ubi_create_env=ubi check ubootenv || ubi create ubootenv 0x100000 dynamic 0 || run ubi_format ; ubi check ubootenv2 || ubi create ubootenv2 0x100000 dynamic 1 || run ubi_format
++ubi_format=ubi detach ; mtd erase ubi && ubi part ubi ; reset
++ubi_prepare_rootfs=if ubi check rootfs_data ; then else if env exists rootfs_data_max ; then ubi create rootfs_data $rootfs_data_max dynamic || ubi create rootfs_data - dynamic ; else ubi create rootfs_data - dynamic ; fi ; fi
++ubi_read_production=ubi read $loadaddr fit && iminfo $loadaddr && run ubi_prepare_rootfs
++ubi_read_recovery=ubi check recovery && ubi read $loadaddr recovery
++ubi_remove_rootfs=ubi check rootfs_data && ubi remove rootfs_data
++ubi_write_production=ubi check fit && ubi remove fit ; run ubi_remove_rootfs ; ubi create fit $filesize dynamic 2 && ubi write $loadaddr fit $filesize
++ubi_write_recovery=ubi check recovery && ubi remove recovery ; run ubi_remove_rootfs ; ubi create recovery $filesize dynamic 3 && ubi write $loadaddr recovery $filesize
++_init_env=setenv _init_env ; run ubi_create_env ; saveenv ; saveenv
++_firstboot=setenv _firstboot ; run ethaddr_factory ; run _switch_to_menu ; run _init_env ; run boot_first
++_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
++_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
+--- /dev/null
++++ b/tplink_tl-xdr6088_env
+@@ -0,0 +1,57 @@
++ethaddr_factory=mtd read config 0x40080000 0x0 0x20000 && env readmem -b ethaddr 0x4008001c 0x6 ; setenv ethaddr_factory
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x46000000
++console=earlycon=uart8250,mmio32,0x11002000 console=ttyS0
++bootcmd=if pstore check ; then run boot_recovery ; else run boot_ubi ; fi
++bootconf=config-1
++bootdelay=0
++bootfile=openwrt-mediatek-filogic-tplink_tl-xdr6088-initramfs-recovery.itb
++bootfile_bl2=openwrt-mediatek-filogic-tplink_tl-xdr6088-preloader.bin
++bootfile_fip=openwrt-mediatek-filogic-tplink_tl-xdr6088-bl31-uboot.fip
++bootfile_upg=openwrt-mediatek-filogic-tplink_tl-xdr6088-squashfs-sysupgrade.itb
++bootled_pwr=green:status
++bootled_rec=red:status
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_default=0
++bootmenu_delay=0
++bootmenu_title= ( ( ( OpenWrt ) ) )
++bootmenu_0=Initialize environment.=run _firstboot
++bootmenu_0d=Run default boot command.=run boot_default
++bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
++bootmenu_2=Boot production system from NAND.=run boot_production ; run bootmenu_confirm_return
++bootmenu_3=Boot recovery system from NAND.=run boot_recovery ; run bootmenu_confirm_return
++bootmenu_4=Load production system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_5=Load recovery system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_6=Load BL31+U-Boot FIP via TFTP then write to NAND.=run boot_tftp_write_fip ; run bootmenu_confirm_return
++bootmenu_7=Load BL2 preloader via TFTP then write to NAND.=run boot_tftp_write_bl2 ; run bootmenu_confirm_return
++bootmenu_8=Reboot.=reset
++bootmenu_9=Reset all settings to factory defaults.=run reset_factory ; reset
++boot_first=if button reset ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
++boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
++boot_production=led $bootled_pwr on ; run ubi_read_production && bootm $loadaddr#$bootconf ; led $bootled_pwr off
++boot_recovery=led $bootled_rec on ; run ubi_read_recovery && bootm $loadaddr#$bootconf ; led $bootled_rec off
++boot_ubi=run boot_production ; run boot_recovery ; run boot_tftp_forever
++boot_tftp_forever=led $bootled_rec on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done
++boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run ubi_write_production ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run ubi_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr#$bootconf
++boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run mtd_write_fip && run reset_factory
++boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run mtd_write_bl2
++part_default=production
++part_recovery=recovery
++reset_factory=ubi part ubi ; mw $loadaddr 0x0 0x800 ; ubi write $loadaddr ubootenv 0x800 ; ubi write $loadaddr ubootenv2 0x800
++mtd_write_fip=mtd erase fip && mtd write fip $loadaddr
++mtd_write_bl2=mtd erase bl2 && mtd write bl2 $loadaddr
++ubi_create_env=ubi check ubootenv || ubi create ubootenv 0x100000 dynamic 0 || run ubi_format ; ubi check ubootenv2 || ubi create ubootenv2 0x100000 dynamic 1 || run ubi_format
++ubi_format=ubi detach ; mtd erase ubi && ubi part ubi ; reset
++ubi_prepare_rootfs=if ubi check rootfs_data ; then else if env exists rootfs_data_max ; then ubi create rootfs_data $rootfs_data_max dynamic || ubi create rootfs_data - dynamic ; else ubi create rootfs_data - dynamic ; fi ; fi
++ubi_read_production=ubi read $loadaddr fit && iminfo $loadaddr && run ubi_prepare_rootfs
++ubi_read_recovery=ubi check recovery && ubi read $loadaddr recovery
++ubi_remove_rootfs=ubi check rootfs_data && ubi remove rootfs_data
++ubi_write_production=ubi check fit && ubi remove fit ; run ubi_remove_rootfs ; ubi create fit $filesize dynamic 2 && ubi write $loadaddr fit $filesize
++ubi_write_recovery=ubi check recovery && ubi remove recovery ; run ubi_remove_rootfs ; ubi create recovery $filesize dynamic 3 && ubi write $loadaddr recovery $filesize
++_init_env=setenv _init_env ; run ubi_create_env ; saveenv ; saveenv
++_firstboot=setenv _firstboot ; run ethaddr_factory ; run _switch_to_menu ; run _init_env ; run boot_first
++_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
++_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
diff --git a/package/boot/uboot-mediatek/patches/433-add-qihoo_360t7.patch b/package/boot/uboot-mediatek/patches/433-add-qihoo_360t7.patch
new file mode 100644
index 00000000000..4f98c95893b
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/433-add-qihoo_360t7.patch
@@ -0,0 +1,425 @@
+--- /dev/null
++++ b/configs/mt7981_qihoo-360t7_defconfig
+@@ -0,0 +1,175 @@
++CONFIG_ARM=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TARGET_MT7981=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_NR_DRAM_BANKS=1
++CONFIG_DEFAULT_DEVICE_TREE="mt7981_qihoo-360t7"
++CONFIG_DEFAULT_ENV_FILE="qihoo-360t7_env"
++CONFIG_DEFAULT_FDT_FILE="mediatek/mt7981_qihoo-360t7.dtb"
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_DEBUG_UART_BASE=0x11002000
++CONFIG_DEBUG_UART_CLOCK=40000000
++CONFIG_DEBUG_UART=y
++CONFIG_SYS_LOAD_ADDR=0x46000000
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_BOOTDELAY=30
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_LOGLEVEL=7
++CONFIG_LOG=y
++CONFIG_SYS_PROMPT="MT7981> "
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_EXT4=y
++CONFIG_CMD_FAT=y
++CONFIG_CMD_FDT=y
++CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_FS_UUID=y
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_GPT=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++# CONFIG_CMD_MBR is not set
++CONFIG_CMD_PCI=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
++CONFIG_CMD_PWM=y
++CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_UBI=y
++CONFIG_CMD_UBI_RENAME=y
++CONFIG_CMD_UBIFS=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_PART=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_UUID=y
++CONFIG_DISPLAY_CPUINFO=y
++CONFIG_DM_MTD=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++CONFIG_DM_PWM=y
++CONFIG_PWM_MTK=y
++CONFIG_HUSH_PARSER=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_VERSION_VARIABLE=y
++CONFIG_PARTITION_UUIDS=y
++CONFIG_NETCONSOLE=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_DM_GPIO=y
++CONFIG_DM_SCSI=y
++CONFIG_AHCI=y
++CONFIG_AHCI_PCI=y
++CONFIG_SCSI_AHCI=y
++CONFIG_SCSI=y
++CONFIG_CMD_SCSI=y
++CONFIG_PHY=y
++CONFIG_PHY_MTK_TPHY=y
++CONFIG_PHY_FIXED=y
++CONFIG_MTK_AHCI=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PCI=y
++# CONFIG_MMC is not set
++# CONFIG_DM_MMC is not set
++CONFIG_MTD=y
++CONFIG_MTD_UBI_FASTMAP=y
++CONFIG_DM_PCI=y
++CONFIG_PCIE_MEDIATEK=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7622=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_RAM=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_SPI=y
++CONFIG_DM_SPI=y
++CONFIG_MTK_SPI_NAND=y
++CONFIG_MTK_SPI_NAND_MTD=y
++CONFIG_SYSRESET_WATCHDOG=y
++CONFIG_WDT_MTK=y
++CONFIG_LZO=y
++CONFIG_ZSTD=y
++CONFIG_HEXDUMP=y
++CONFIG_RANDOM_UUID=y
++CONFIG_REGEX=y
++CONFIG_OF_EMBED=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_IS_IN_UBI=y
++CONFIG_ENV_UBI_PART="ubi"
++CONFIG_ENV_SIZE=0x1f000
++CONFIG_ENV_SIZE_REDUND=0x1f000
++CONFIG_ENV_UBI_VOLUME="ubootenv"
++CONFIG_ENV_UBI_VOLUME_REDUND="ubootenv2"
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_PHY_FIXED=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7981=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_HEXDUMP=y
++CONFIG_USE_DEFAULT_ENV_FILE=y
++CONFIG_MTD_SPI_NAND=y
++CONFIG_MTK_SPIM=y
++CONFIG_CMD_MTD=y
++CONFIG_CMD_NAND=y
++CONFIG_CMD_NAND_TRIMFFS=y
++CONFIG_LMB_MAX_REGIONS=64
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
+--- /dev/null
++++ b/arch/arm/dts/mt7981_qihoo-360t7.dts
+@@ -0,0 +1,185 @@
++// SPDX-License-Identifier: GPL-2.0
++/*
++ * Copyright (c) 2022 MediaTek Inc.
++ * Author: Sam Shih <sam.shih@mediatek.com>
++ */
++
++/dts-v1/;
++#include "mt7981.dtsi"
++#include <dt-bindings/gpio/gpio.h>
++#include <dt-bindings/input/linux-event-codes.h>
++
++/ {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ model = "Qihoo 360T7";
++ compatible = "mediatek,mt7981", "mediatek,mt7981-rfb";
++
++ chosen {
++ stdout-path = &uart0;
++ tick-timer = &timer0;
++ };
++
++ memory@40000000 {
++ device_type = "memory";
++ reg = <0x40000000 0x10000000>;
++ };
++
++ keys {
++ compatible = "gpio-keys";
++
++ factory {
++ label = "reset";
++ linux,code = <KEY_RESTART>;
++ gpios = <&gpio 1 GPIO_ACTIVE_LOW>;
++ };
++
++ wps {
++ label = "wps";
++ linux,code = <KEY_WPS_BUTTON>;
++ gpios = <&gpio 0 GPIO_ACTIVE_LOW>;
++ };
++ };
++
++ leds {
++ compatible = "gpio-leds";
++
++ status_red {
++ label = "red:status";
++ gpios = <&gpio 3 GPIO_ACTIVE_LOW>;
++ };
++
++ status_green {
++ label = "green:status";
++ gpios = <&gpio 7 GPIO_ACTIVE_LOW>;
++ };
++ };
++};
++
++&uart0 {
++ mediatek,force-highspeed;
++ status = "okay";
++};
++
++&uart1 {
++ pinctrl-names = "default";
++ pinctrl-0 = <&uart1_pins>;
++ status = "disabled";
++};
++
++&eth {
++ status = "okay";
++ mediatek,gmac-id = <0>;
++ phy-mode = "2500base-x";
++ mediatek,switch = "mt7531";
++ reset-gpios = <&gpio 39 GPIO_ACTIVE_HIGH>;
++
++ fixed-link {
++ speed = <2500>;
++ full-duplex;
++ };
++};
++
++&pinctrl {
++ spi_flash_pins: spi0-pins-func-1 {
++ mux {
++ function = "flash";
++ groups = "spi0", "spi0_wp_hold";
++ };
++
++ conf-pu {
++ pins = "SPI0_CS", "SPI0_HOLD", "SPI0_WP";
++ drive-strength = <MTK_DRIVE_8mA>;
++ bias-pull-up = <MTK_PUPD_SET_R1R0_00>;
++ };
++
++ conf-pd {
++ pins = "SPI0_CLK", "SPI0_MOSI", "SPI0_MISO";
++ drive-strength = <MTK_DRIVE_8mA>;
++ bias-pull-down = <MTK_PUPD_SET_R1R0_00>;
++ };
++ };
++
++ spic_pins: spi1-pins-func-1 {
++ mux {
++ function = "spi";
++ groups = "spi1_1";
++ };
++ };
++
++ uart1_pins: spi1-pins-func-3 {
++ mux {
++ function = "uart";
++ groups = "uart1_2";
++ };
++ };
++
++ pwm_pins: pwm0-pins-func-1 {
++ mux {
++ function = "pwm";
++ groups = "pwm0_1", "pwm1_0";
++ };
++ };
++};
++
++&pwm {
++ pinctrl-names = "default";
++ pinctrl-0 = <&pwm_pins>;
++ status = "okay";
++};
++
++&spi0 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ pinctrl-names = "default";
++ pinctrl-0 = <&spi_flash_pins>;
++ status = "okay";
++ must_tx;
++ enhance_timing;
++ dma_ext;
++ ipm_design;
++ support_quad;
++ tick_dly = <2>;
++ sample_sel = <0>;
++
++ spi_nand@0 {
++ compatible = "spi-nand";
++ reg = <0>;
++ spi-max-frequency = <52000000>;
++
++ partitions {
++ compatible = "fixed-partitions";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ partition@0 {
++ label = "bl2";
++ reg = <0x0 0x100000>;
++ };
++
++ partition@100000 {
++ label = "orig-env";
++ reg = <0x100000 0x80000>;
++ };
++
++ partition@160000 {
++ label = "factory";
++ reg = <0x180000 0x200000>;
++ };
++
++ partition@380000 {
++ label = "fip";
++ reg = <0x380000 0x200000>;
++ };
++
++ partition@580000 {
++ label = "ubi";
++ reg = <0x580000 0x6c00000>;
++ };
++ };
++ };
++};
++
++&watchdog {
++ status = "disabled";
++};
+--- /dev/null
++++ b/qihoo-360t7_env
+@@ -0,0 +1,56 @@
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x46000000
++console=earlycon=uart8250,mmio32,0x11002000 console=ttyS0
++bootcmd=if pstore check ; then run boot_recovery ; else run boot_ubi ; fi
++bootconf=config-1
++bootdelay=0
++bootfile=openwrt-mediatek-filogic-qihoo_360t7-initramfs-recovery.itb
++bootfile_bl2=openwrt-mediatek-filogic-qihoo_360t7-preloader.bin
++bootfile_fip=openwrt-mediatek-filogic-qihoo_360t7-bl31-uboot.fip
++bootfile_upg=openwrt-mediatek-filogic-qihoo_360t7-squashfs-sysupgrade.itb
++bootled_pwr=green:status
++bootled_rec=red:status
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_default=0
++bootmenu_delay=0
++bootmenu_title= ( ( ( OpenWrt ) ) )
++bootmenu_0=Initialize environment.=run _firstboot
++bootmenu_0d=Run default boot command.=run boot_default
++bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
++bootmenu_2=Boot production system from NAND.=run boot_production ; run bootmenu_confirm_return
++bootmenu_3=Boot recovery system from NAND.=run boot_recovery ; run bootmenu_confirm_return
++bootmenu_4=Load production system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_5=Load recovery system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_6=Load BL31+U-Boot FIP via TFTP then write to NAND.=run boot_tftp_write_fip ; run bootmenu_confirm_return
++bootmenu_7=Load BL2 preloader via TFTP then write to NAND.=run boot_tftp_write_bl2 ; run bootmenu_confirm_return
++bootmenu_8=Reboot.=reset
++bootmenu_9=Reset all settings to factory defaults.=run reset_factory ; reset
++boot_first=if button reset ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
++boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
++boot_production=led $bootled_pwr on ; run ubi_read_production && bootm $loadaddr#$bootconf ; led $bootled_pwr off
++boot_recovery=led $bootled_rec on ; run ubi_read_recovery && bootm $loadaddr#$bootconf ; led $bootled_rec off
++boot_ubi=run boot_production ; run boot_recovery ; run boot_tftp_forever
++boot_tftp_forever=led $bootled_rec on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done
++boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run ubi_write_production ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run ubi_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr#$bootconf
++boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run mtd_write_fip && run reset_factory
++boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run mtd_write_bl2
++part_default=production
++part_recovery=recovery
++reset_factory=ubi part ubi ; mw $loadaddr 0x0 0x800 ; ubi write $loadaddr ubootenv 0x800 ; ubi write $loadaddr ubootenv2 0x800
++mtd_write_fip=mtd erase fip && mtd write fip $loadaddr
++mtd_write_bl2=mtd erase bl2 && mtd write bl2 $loadaddr
++ubi_create_env=ubi check ubootenv || ubi create ubootenv 0x100000 dynamic 0 || run ubi_format ; ubi check ubootenv2 || ubi create ubootenv2 0x100000 dynamic 1 || run ubi_format
++ubi_format=ubi detach ; mtd erase ubi && ubi part ubi ; reset
++ubi_prepare_rootfs=if ubi check rootfs_data ; then else if env exists rootfs_data_max ; then ubi create rootfs_data $rootfs_data_max dynamic || ubi create rootfs_data - dynamic ; else ubi create rootfs_data - dynamic ; fi ; fi
++ubi_read_production=ubi read $loadaddr fit && iminfo $loadaddr && run ubi_prepare_rootfs
++ubi_read_recovery=ubi check recovery && ubi read $loadaddr recovery
++ubi_remove_rootfs=ubi check rootfs_data && ubi remove rootfs_data
++ubi_write_production=ubi check fit && ubi remove fit ; run ubi_remove_rootfs ; ubi create fit $filesize dynamic 2 && ubi write $loadaddr fit $filesize
++ubi_write_recovery=ubi check recovery && ubi remove recovery ; run ubi_remove_rootfs ; ubi create recovery $filesize dynamic 3 && ubi write $loadaddr recovery $filesize
++_init_env=setenv _init_env ; run ubi_create_env ; saveenv ; saveenv
++_firstboot=setenv _firstboot ; run _switch_to_menu ; run _init_env ; run boot_first
++_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
++_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
diff --git a/package/boot/uboot-mediatek/patches/434-add-xiaomi_mi-router-wr30u.patch b/package/boot/uboot-mediatek/patches/434-add-xiaomi_mi-router-wr30u.patch
new file mode 100644
index 00000000000..2bd1afe7a8f
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/434-add-xiaomi_mi-router-wr30u.patch
@@ -0,0 +1,461 @@
+--- /dev/null
++++ b/configs/mt7981_xiaomi_mi-router-wr30u_defconfig
+@@ -0,0 +1,175 @@
++CONFIG_ARM=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TARGET_MT7981=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_NR_DRAM_BANKS=1
++CONFIG_DEFAULT_DEVICE_TREE="mt7981_xiaomi_mi-router-wr30u"
++CONFIG_DEFAULT_ENV_FILE="xiaomi_mi-router-wr30u_env"
++CONFIG_DEFAULT_FDT_FILE="mediatek/mt7981_xiaomi_mi-router-wr30u.dtb"
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_DEBUG_UART_BASE=0x11002000
++CONFIG_DEBUG_UART_CLOCK=40000000
++CONFIG_DEBUG_UART=y
++CONFIG_SYS_LOAD_ADDR=0x46000000
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_BOOTDELAY=30
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_LOGLEVEL=7
++CONFIG_LOG=y
++CONFIG_SYS_PROMPT="MT7981> "
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_EXT4=y
++CONFIG_CMD_FAT=y
++CONFIG_CMD_FDT=y
++CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_FS_UUID=y
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_GPT=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++# CONFIG_CMD_MBR is not set
++CONFIG_CMD_PCI=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
++CONFIG_CMD_PWM=y
++CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_UBI=y
++CONFIG_CMD_UBI_RENAME=y
++CONFIG_CMD_UBIFS=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_PART=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_UUID=y
++CONFIG_DISPLAY_CPUINFO=y
++CONFIG_DM_MTD=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++CONFIG_DM_PWM=y
++CONFIG_PWM_MTK=y
++CONFIG_HUSH_PARSER=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_VERSION_VARIABLE=y
++CONFIG_PARTITION_UUIDS=y
++CONFIG_NETCONSOLE=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_DM_GPIO=y
++CONFIG_DM_SCSI=y
++CONFIG_AHCI=y
++CONFIG_AHCI_PCI=y
++CONFIG_SCSI_AHCI=y
++CONFIG_SCSI=y
++CONFIG_CMD_SCSI=y
++CONFIG_PHY=y
++CONFIG_PHY_MTK_TPHY=y
++CONFIG_PHY_FIXED=y
++CONFIG_MTK_AHCI=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PCI=y
++# CONFIG_MMC is not set
++# CONFIG_DM_MMC is not set
++CONFIG_MTD=y
++CONFIG_MTD_UBI_FASTMAP=y
++CONFIG_DM_PCI=y
++CONFIG_PCIE_MEDIATEK=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7622=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_RAM=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_SPI=y
++CONFIG_DM_SPI=y
++CONFIG_MTK_SPI_NAND=y
++CONFIG_MTK_SPI_NAND_MTD=y
++CONFIG_SYSRESET_WATCHDOG=y
++CONFIG_WDT_MTK=y
++CONFIG_LZO=y
++CONFIG_ZSTD=y
++CONFIG_HEXDUMP=y
++CONFIG_RANDOM_UUID=y
++CONFIG_REGEX=y
++CONFIG_OF_EMBED=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_IS_IN_UBI=y
++CONFIG_ENV_UBI_PART="ubi"
++CONFIG_ENV_SIZE=0x1f000
++CONFIG_ENV_SIZE_REDUND=0x1f000
++CONFIG_ENV_UBI_VOLUME="ubootenv"
++CONFIG_ENV_UBI_VOLUME_REDUND="ubootenv2"
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_PHY_FIXED=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7981=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_HEXDUMP=y
++CONFIG_USE_DEFAULT_ENV_FILE=y
++CONFIG_MTD_SPI_NAND=y
++CONFIG_MTK_SPIM=y
++CONFIG_CMD_MTD=y
++CONFIG_CMD_NAND=y
++CONFIG_CMD_NAND_TRIMFFS=y
++CONFIG_LMB_MAX_REGIONS=64
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
+--- /dev/null
++++ b/arch/arm/dts/mt7981_xiaomi_mi-router-wr30u.dts
+@@ -0,0 +1,221 @@
++// SPDX-License-Identifier: GPL-2.0
++/*
++ * Copyright (c) 2022 MediaTek Inc.
++ * Author: Sam Shih <sam.shih@mediatek.com>
++ */
++
++/dts-v1/;
++#include "mt7981.dtsi"
++#include <dt-bindings/gpio/gpio.h>
++#include <dt-bindings/input/linux-event-codes.h>
++
++/ {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ model = "Xiaomi Router WR30U";
++ compatible = "mediatek,mt7981", "mediatek,mt7981-rfb";
++
++ chosen {
++ stdout-path = &uart0;
++ tick-timer = &timer0;
++ };
++
++ config {
++ blink_led = "yellow:network";
++ system_led = "yellow:system";
++ };
++
++ memory@40000000 {
++ device_type = "memory";
++ reg = <0x40000000 0x10000000>;
++ };
++
++ gpio-keys {
++ compatible = "gpio-keys";
++
++ reset {
++ label = "reset";
++ gpios = <&gpio 1 GPIO_ACTIVE_LOW>;
++ linux,code = <KEY_RESTART>;
++ };
++
++ mesh {
++ label = "mesh";
++ gpios = <&gpio 0 GPIO_ACTIVE_LOW>;
++ linux,code = <BTN_9>;
++ linux,input-type = <EV_SW>;
++ };
++ };
++
++ leds {
++ compatible = "gpio-leds";
++
++ led_system_blue {
++ label = "blue:system";
++ gpios = <&gpio 9 GPIO_ACTIVE_LOW>;
++ };
++
++ led_system_yellow {
++ label = "yellow:system";
++ gpios = <&gpio 10 GPIO_ACTIVE_LOW>;
++ };
++
++ led_network_blue {
++ label = "blue:network";
++ gpios = <&gpio 11 GPIO_ACTIVE_LOW>;
++ };
++
++ led_network_yellow {
++ label = "yellow:network";
++ gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
++ };
++ };
++};
++
++&uart0 {
++ mediatek,force-highspeed;
++ status = "okay";
++};
++
++&uart1 {
++ pinctrl-names = "default";
++ pinctrl-0 = <&uart1_pins>;
++ status = "disabled";
++};
++
++&eth {
++ status = "okay";
++ mediatek,gmac-id = <0>;
++ phy-mode = "sgmii";
++ mediatek,switch = "mt7531";
++ reset-gpios = <&gpio 39 GPIO_ACTIVE_HIGH>;
++
++ fixed-link {
++ speed = <1000>;
++ full-duplex;
++ };
++};
++
++&pinctrl {
++ spi_flash_pins: spi0-pins-func-1 {
++ mux {
++ function = "flash";
++ groups = "spi0", "spi0_wp_hold";
++ };
++
++ conf-pu {
++ pins = "SPI0_CS", "SPI0_HOLD", "SPI0_WP";
++ drive-strength = <MTK_DRIVE_8mA>;
++ bias-pull-up = <MTK_PUPD_SET_R1R0_11>;
++ };
++
++ conf-pd {
++ pins = "SPI0_CLK", "SPI0_MOSI", "SPI0_MISO";
++ drive-strength = <MTK_DRIVE_8mA>;
++ bias-pull-down = <MTK_PUPD_SET_R1R0_11>;
++ };
++ };
++
++ spic_pins: spi1-pins-func-1 {
++ mux {
++ function = "spi";
++ groups = "spi1_1";
++ };
++ };
++
++ uart1_pins: spi1-pins-func-3 {
++ mux {
++ function = "uart";
++ groups = "uart1_2";
++ };
++ };
++
++ pwm_pins: pwm0-pins-func-1 {
++ mux {
++ function = "pwm";
++ groups = "pwm0_1", "pwm1_0";
++ };
++ };
++};
++
++&pwm {
++ pinctrl-names = "default";
++ pinctrl-0 = <&pwm_pins>;
++ status = "okay";
++};
++
++&spi0 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ pinctrl-names = "default";
++ pinctrl-0 = <&spi_flash_pins>;
++ status = "okay";
++ must_tx;
++ enhance_timing;
++ dma_ext;
++ ipm_design;
++ support_quad;
++ tick_dly = <2>;
++ sample_sel = <0>;
++
++ spi_nand@0 {
++ compatible = "spi-nand";
++ reg = <0>;
++ spi-max-frequency = <52000000>;
++
++ partitions {
++ compatible = "fixed-partitions";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ partition@0 {
++ label = "bl2";
++ reg = <0x00 0x100000>;
++ };
++
++ partition@100000 {
++ label = "Nvram";
++ reg = <0x100000 0x40000>;
++ };
++
++ partition@140000 {
++ label = "Bdata";
++ reg = <0x140000 0x40000>;
++ };
++
++ partition@180000 {
++ label = "factory";
++ reg = <0x180000 0x200000>;
++ };
++
++ partition@380000 {
++ label = "fip";
++ reg = <0x380000 0x200000>;
++ };
++
++ partition@580000 {
++ label = "crash";
++ reg = <0x580000 0x40000>;
++ };
++
++ partition@5c0000 {
++ label = "crash_log";
++ reg = <0x5c0000 0x40000>;
++ };
++
++ partition@600000 {
++ label = "ubi";
++ reg = <0x600000 0x7000000>;
++ };
++
++ partition@7600000 {
++ label = "KF";
++ reg = <0x7600000 0x40000>;
++ };
++ };
++ };
++};
++
++&watchdog {
++ status = "disabled";
++};
+--- /dev/null
++++ b/xiaomi_mi-router-wr30u_env
+@@ -0,0 +1,56 @@
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x46000000
++console=earlycon=uart8250,mmio32,0x11002000 console=ttyS0
++bootcmd=if pstore check ; then run boot_recovery ; else run boot_ubi ; fi
++bootconf=config-1
++bootdelay=0
++bootfile=openwrt-mediatek-filogic-xiaomi_mi-router-wr30u-ubootmod-initramfs-recovery.itb
++bootfile_bl2=openwrt-mediatek-filogic-xiaomi_mi-router-wr30u-ubootmod-preloader.bin
++bootfile_fip=openwrt-mediatek-filogic-xiaomi_mi-router-wr30u-ubootmod-bl31-uboot.fip
++bootfile_upg=openwrt-mediatek-filogic-xiaomi_mi-router-wr30u-ubootmod-squashfs-sysupgrade.itb
++bootled_pwr=yellow:system
++bootled_rec=yellow:network
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_default=0
++bootmenu_delay=0
++bootmenu_title= ( ( ( OpenWrt ) ) )
++bootmenu_0=Initialize environment.=run _firstboot
++bootmenu_0d=Run default boot command.=run boot_default
++bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
++bootmenu_2=Boot production system from NAND.=run boot_production ; run bootmenu_confirm_return
++bootmenu_3=Boot recovery system from NAND.=run boot_recovery ; run bootmenu_confirm_return
++bootmenu_4=Load production system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_5=Load recovery system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_6=Load BL31+U-Boot FIP via TFTP then write to NAND.=run boot_tftp_write_fip ; run bootmenu_confirm_return
++bootmenu_7=Load BL2 preloader via TFTP then write to NAND.=run boot_tftp_write_bl2 ; run bootmenu_confirm_return
++bootmenu_8=Reboot.=reset
++bootmenu_9=Reset all settings to factory defaults.=run reset_factory ; reset
++boot_first=if button reset ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
++boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
++boot_production=led $bootled_pwr on ; run ubi_read_production && bootm $loadaddr#$bootconf ; led $bootled_pwr off
++boot_recovery=led $bootled_rec on ; run ubi_read_recovery && bootm $loadaddr#$bootconf ; led $bootled_rec off
++boot_ubi=run boot_production ; run boot_recovery ; run boot_tftp_forever
++boot_tftp_forever=led $bootled_rec on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done
++boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run ubi_write_production ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run ubi_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr#$bootconf
++boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run mtd_write_fip && run reset_factory
++boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run mtd_write_bl2
++part_default=production
++part_recovery=recovery
++reset_factory=ubi part ubi ; mw $loadaddr 0x0 0x800 ; ubi write $loadaddr ubootenv 0x800 ; ubi write $loadaddr ubootenv2 0x800
++mtd_write_fip=mtd erase fip && mtd write fip $loadaddr
++mtd_write_bl2=mtd erase bl2 && mtd write bl2 $loadaddr
++ubi_create_env=ubi check ubootenv || ubi create ubootenv 0x100000 dynamic 0 || run ubi_format ; ubi check ubootenv2 || ubi create ubootenv2 0x100000 dynamic 1 || run ubi_format
++ubi_format=ubi detach ; mtd erase ubi && ubi part ubi ; reset
++ubi_prepare_rootfs=if ubi check rootfs_data ; then else if env exists rootfs_data_max ; then ubi create rootfs_data $rootfs_data_max dynamic || ubi create rootfs_data - dynamic ; else ubi create rootfs_data - dynamic ; fi ; fi
++ubi_read_production=ubi read $loadaddr fit && iminfo $loadaddr && run ubi_prepare_rootfs
++ubi_read_recovery=ubi check recovery && ubi read $loadaddr recovery
++ubi_remove_rootfs=ubi check rootfs_data && ubi remove rootfs_data
++ubi_write_production=ubi check fit && ubi remove fit ; run ubi_remove_rootfs ; ubi create fit $filesize dynamic 2 && ubi write $loadaddr fit $filesize
++ubi_write_recovery=ubi check recovery && ubi remove recovery ; run ubi_remove_rootfs ; ubi create recovery $filesize dynamic 3 && ubi write $loadaddr recovery $filesize
++_init_env=setenv _init_env ; run ubi_create_env ; saveenv ; saveenv
++_firstboot=setenv _firstboot ; run _switch_to_menu ; run _init_env ; run boot_first
++_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
++_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
diff --git a/package/boot/uboot-mediatek/patches/435-add-h3c_magic-nx30-pro.patch b/package/boot/uboot-mediatek/patches/435-add-h3c_magic-nx30-pro.patch
new file mode 100644
index 00000000000..d5a149b903b
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/435-add-h3c_magic-nx30-pro.patch
@@ -0,0 +1,445 @@
+--- /dev/null
++++ b/configs/mt7981_h3c_magic-nx30-pro_defconfig
+@@ -0,0 +1,175 @@
++CONFIG_ARM=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TARGET_MT7981=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_NR_DRAM_BANKS=1
++CONFIG_DEFAULT_DEVICE_TREE="mt7981_h3c_magic-nx30-pro"
++CONFIG_DEFAULT_ENV_FILE="h3c_magic-nx30-pro_env"
++CONFIG_DEFAULT_FDT_FILE="mediatek/mt7981_h3c_magic-nx30-pro.dtb"
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_DEBUG_UART_BASE=0x11002000
++CONFIG_DEBUG_UART_CLOCK=40000000
++CONFIG_DEBUG_UART=y
++CONFIG_SYS_LOAD_ADDR=0x46000000
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_BOOTDELAY=30
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_LOGLEVEL=7
++CONFIG_LOG=y
++CONFIG_SYS_PROMPT="MT7981> "
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_EXT4=y
++CONFIG_CMD_FAT=y
++CONFIG_CMD_FDT=y
++CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_FS_UUID=y
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_GPT=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++# CONFIG_CMD_MBR is not set
++CONFIG_CMD_PCI=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
++CONFIG_CMD_PWM=y
++CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_UBI=y
++CONFIG_CMD_UBI_RENAME=y
++CONFIG_CMD_UBIFS=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_PART=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_UUID=y
++CONFIG_DISPLAY_CPUINFO=y
++CONFIG_DM_MTD=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++CONFIG_DM_PWM=y
++CONFIG_PWM_MTK=y
++CONFIG_HUSH_PARSER=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_VERSION_VARIABLE=y
++CONFIG_PARTITION_UUIDS=y
++CONFIG_NETCONSOLE=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_DM_GPIO=y
++CONFIG_DM_SCSI=y
++CONFIG_AHCI=y
++CONFIG_AHCI_PCI=y
++CONFIG_SCSI_AHCI=y
++CONFIG_SCSI=y
++CONFIG_CMD_SCSI=y
++CONFIG_PHY=y
++CONFIG_PHY_MTK_TPHY=y
++CONFIG_PHY_FIXED=y
++CONFIG_MTK_AHCI=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PCI=y
++# CONFIG_MMC is not set
++# CONFIG_DM_MMC is not set
++CONFIG_MTD=y
++CONFIG_MTD_UBI_FASTMAP=y
++CONFIG_DM_PCI=y
++CONFIG_PCIE_MEDIATEK=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7622=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_RAM=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_SPI=y
++CONFIG_DM_SPI=y
++CONFIG_MTK_SPI_NAND=y
++CONFIG_MTK_SPI_NAND_MTD=y
++CONFIG_SYSRESET_WATCHDOG=y
++CONFIG_WDT_MTK=y
++CONFIG_LZO=y
++CONFIG_ZSTD=y
++CONFIG_HEXDUMP=y
++CONFIG_RANDOM_UUID=y
++CONFIG_REGEX=y
++CONFIG_OF_EMBED=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_IS_IN_UBI=y
++CONFIG_ENV_UBI_PART="ubi"
++CONFIG_ENV_SIZE=0x1f000
++CONFIG_ENV_SIZE_REDUND=0x1f000
++CONFIG_ENV_UBI_VOLUME="ubootenv"
++CONFIG_ENV_UBI_VOLUME_REDUND="ubootenv2"
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_PHY_FIXED=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7981=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_HEXDUMP=y
++CONFIG_USE_DEFAULT_ENV_FILE=y
++CONFIG_MTD_SPI_NAND=y
++CONFIG_MTK_SPIM=y
++CONFIG_CMD_MTD=y
++CONFIG_CMD_NAND=y
++CONFIG_CMD_NAND_TRIMFFS=y
++CONFIG_LMB_MAX_REGIONS=64
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
+--- /dev/null
++++ b/arch/arm/dts/mt7981_h3c_magic-nx30-pro.dts
+@@ -0,0 +1,205 @@
++// SPDX-License-Identifier: GPL-2.0
++/*
++ * Copyright (c) 2022 MediaTek Inc.
++ * Author: Sam Shih <sam.shih@mediatek.com>
++ */
++
++/dts-v1/;
++#include "mt7981.dtsi"
++#include <dt-bindings/gpio/gpio.h>
++#include <dt-bindings/input/linux-event-codes.h>
++
++/ {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ model = "H3C Magic NX30 Pro";
++ compatible = "mediatek,mt7981", "mediatek,mt7981-rfb";
++
++ chosen {
++ stdout-path = &uart0;
++ tick-timer = &timer0;
++ };
++
++ memory@40000000 {
++ device_type = "memory";
++ reg = <0x40000000 0x10000000>;
++ };
++
++ keys {
++ compatible = "gpio-keys";
++
++ factory {
++ label = "reset";
++ linux,code = <KEY_RESTART>;
++ gpios = <&gpio 1 GPIO_ACTIVE_LOW>;
++ };
++
++ wps {
++ label = "wps";
++ linux,code = <KEY_WPS_BUTTON>;
++ gpios = <&gpio 0 GPIO_ACTIVE_LOW>;
++ };
++ };
++
++ leds {
++ compatible = "gpio-leds";
++
++ status_red {
++ label = "red:status";
++ gpios = <&gpio 4 GPIO_ACTIVE_LOW>;
++ };
++
++ status_green {
++ label = "green:status";
++ gpios = <&gpio 5 GPIO_ACTIVE_LOW>;
++ };
++ };
++};
++
++&uart0 {
++ mediatek,force-highspeed;
++ status = "okay";
++};
++
++&uart1 {
++ pinctrl-names = "default";
++ pinctrl-0 = <&uart1_pins>;
++ status = "disabled";
++};
++
++&eth {
++ status = "okay";
++ mediatek,gmac-id = <0>;
++ phy-mode = "2500base-x";
++ mediatek,switch = "mt7531";
++ reset-gpios = <&gpio 39 GPIO_ACTIVE_HIGH>;
++
++ fixed-link {
++ speed = <2500>;
++ full-duplex;
++ };
++};
++
++&pinctrl {
++ spi_flash_pins: spi0-pins-func-1 {
++ mux {
++ function = "flash";
++ groups = "spi0", "spi0_wp_hold";
++ };
++
++ conf-pu {
++ pins = "SPI0_CS", "SPI0_HOLD", "SPI0_WP";
++ drive-strength = <MTK_DRIVE_8mA>;
++ bias-pull-up = <MTK_PUPD_SET_R1R0_00>;
++ };
++
++ conf-pd {
++ pins = "SPI0_CLK", "SPI0_MOSI", "SPI0_MISO";
++ drive-strength = <MTK_DRIVE_8mA>;
++ bias-pull-down = <MTK_PUPD_SET_R1R0_00>;
++ };
++ };
++
++ spic_pins: spi1-pins-func-1 {
++ mux {
++ function = "spi";
++ groups = "spi1_1";
++ };
++ };
++
++ uart1_pins: spi1-pins-func-3 {
++ mux {
++ function = "uart";
++ groups = "uart1_2";
++ };
++ };
++
++ pwm_pins: pwm0-pins-func-1 {
++ mux {
++ function = "pwm";
++ groups = "pwm0_1", "pwm1_0";
++ };
++ };
++};
++
++&pwm {
++ pinctrl-names = "default";
++ pinctrl-0 = <&pwm_pins>;
++ status = "okay";
++};
++
++&spi0 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ pinctrl-names = "default";
++ pinctrl-0 = <&spi_flash_pins>;
++ status = "okay";
++ must_tx;
++ enhance_timing;
++ dma_ext;
++ ipm_design;
++ support_quad;
++ tick_dly = <2>;
++ sample_sel = <0>;
++
++ spi_nand@0 {
++ compatible = "spi-nand";
++ reg = <0>;
++ spi-max-frequency = <52000000>;
++
++ partitions {
++ compatible = "fixed-partitions";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ partition@0 {
++ label = "bl2";
++ reg = <0x0000000 0x0100000>;
++ };
++
++ partition@100000 {
++ label = "orig-env";
++ reg = <0x0100000 0x0080000>;
++ };
++
++ partition@180000 {
++ label = "factory";
++ reg = <0x0180000 0x0200000>;
++ };
++
++ partition@380000 {
++ label = "fip";
++ reg = <0x0380000 0x0200000>;
++ };
++
++ partition@580000 {
++ label = "ubi";
++ reg = <0x0580000 0x4000000>;
++ };
++
++ partition@4580000 {
++ label = "pdt_data";
++ reg = <0x4580000 0x0600000>;
++ };
++
++ partition@4b80000 {
++ label = "pdt_data_1";
++ reg = <0x4b80000 0x0600000>;
++ };
++
++ partition@5180000 {
++ label = "exp";
++ reg = <0x5180000 0x0100000>;
++ };
++
++ partition@5280000 {
++ label = "plugin";
++ reg = <0x5280000 0x2580000>;
++ };
++ };
++ };
++};
++
++&watchdog {
++ status = "disabled";
++};
+--- /dev/null
++++ b/h3c_magic-nx30-pro_env
+@@ -0,0 +1,56 @@
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x46000000
++console=earlycon=uart8250,mmio32,0x11002000 console=ttyS0
++bootcmd=if pstore check ; then run boot_recovery ; else run boot_ubi ; fi
++bootconf=config-1
++bootdelay=0
++bootfile=openwrt-mediatek-filogic-h3c_magic-nx30-pro-initramfs-recovery.itb
++bootfile_bl2=openwrt-mediatek-filogic-h3c_magic-nx30-pro-preloader.bin
++bootfile_fip=openwrt-mediatek-filogic-h3c_magic-nx30-pro-bl31-uboot.fip
++bootfile_upg=openwrt-mediatek-filogic-h3c_magic-nx30-pro-squashfs-sysupgrade.itb
++bootled_pwr=green:status
++bootled_rec=red:status
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_default=0
++bootmenu_delay=0
++bootmenu_title= ( ( ( OpenWrt ) ) )
++bootmenu_0=Initialize environment.=run _firstboot
++bootmenu_0d=Run default boot command.=run boot_default
++bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
++bootmenu_2=Boot production system from NAND.=run boot_production ; run bootmenu_confirm_return
++bootmenu_3=Boot recovery system from NAND.=run boot_recovery ; run bootmenu_confirm_return
++bootmenu_4=Load production system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_5=Load recovery system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_6=Load BL31+U-Boot FIP via TFTP then write to NAND.=run boot_tftp_write_fip ; run bootmenu_confirm_return
++bootmenu_7=Load BL2 preloader via TFTP then write to NAND.=run boot_tftp_write_bl2 ; run bootmenu_confirm_return
++bootmenu_8=Reboot.=reset
++bootmenu_9=Reset all settings to factory defaults.=run reset_factory ; reset
++boot_first=if button reset ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
++boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
++boot_production=led $bootled_pwr on ; run ubi_read_production && bootm $loadaddr#$bootconf ; led $bootled_pwr off
++boot_recovery=led $bootled_rec on ; run ubi_read_recovery && bootm $loadaddr#$bootconf ; led $bootled_rec off
++boot_ubi=run boot_production ; run boot_recovery ; run boot_tftp_forever
++boot_tftp_forever=led $bootled_rec on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done
++boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run ubi_write_production ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run ubi_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr#$bootconf
++boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run mtd_write_fip && run reset_factory
++boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run mtd_write_bl2
++part_default=production
++part_recovery=recovery
++reset_factory=ubi part ubi ; mw $loadaddr 0x0 0x800 ; ubi write $loadaddr ubootenv 0x800 ; ubi write $loadaddr ubootenv2 0x800
++mtd_write_fip=mtd erase fip && mtd write fip $loadaddr
++mtd_write_bl2=mtd erase bl2 && mtd write bl2 $loadaddr
++ubi_create_env=ubi check ubootenv || ubi create ubootenv 0x100000 dynamic 0 || run ubi_format ; ubi check ubootenv2 || ubi create ubootenv2 0x100000 dynamic 1 || run ubi_format
++ubi_format=ubi detach ; mtd erase ubi && ubi part ubi ; reset
++ubi_prepare_rootfs=if ubi check rootfs_data ; then else if env exists rootfs_data_max ; then ubi create rootfs_data $rootfs_data_max dynamic || ubi create rootfs_data - dynamic ; else ubi create rootfs_data - dynamic ; fi ; fi
++ubi_read_production=ubi read $loadaddr fit && iminfo $loadaddr && run ubi_prepare_rootfs
++ubi_read_recovery=ubi check recovery && ubi read $loadaddr recovery
++ubi_remove_rootfs=ubi check rootfs_data && ubi remove rootfs_data
++ubi_write_production=ubi check fit && ubi remove fit ; run ubi_remove_rootfs ; ubi create fit $filesize dynamic 2 && ubi write $loadaddr fit $filesize
++ubi_write_recovery=ubi check recovery && ubi remove recovery ; run ubi_remove_rootfs ; ubi create recovery $filesize dynamic 3 && ubi write $loadaddr recovery $filesize
++_init_env=setenv _init_env ; run ubi_create_env ; saveenv ; saveenv
++_firstboot=setenv _firstboot ; run _switch_to_menu ; run _init_env ; run boot_first
++_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
++_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
diff --git a/package/boot/uboot-mediatek/patches/436-add-glinet-mt6000.patch b/package/boot/uboot-mediatek/patches/436-add-glinet-mt6000.patch
new file mode 100644
index 00000000000..e0a059eb7bd
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/436-add-glinet-mt6000.patch
@@ -0,0 +1,274 @@
+--- /dev/null
++++ b/arch/arm/dts/mt7986a-glinet-gl-mt6000.dts
+@@ -0,0 +1,135 @@
++// SPDX-License-Identifier: GPL-2.0
++
++/dts-v1/;
++#include <dt-bindings/input/linux-event-codes.h>
++#include <dt-bindings/gpio/gpio.h>
++
++#include "mt7986.dtsi"
++
++/ {
++ model = "GL.iNet GL-MT6000";
++ compatible = "glinet,gl-mt6000", "mediatek,mt7986-emmc-rfb", "mediatek,mt7986";
++
++ chosen {
++ stdout-path = &uart0;
++ tick-timer = &timer0;
++ };
++
++ memory@40000000 {
++ device_type = "memory";
++ reg = <0x40000000 0x40000000>;
++ };
++
++ reg_1p8v: regulator-1p8v {
++ compatible = "regulator-fixed";
++ regulator-name = "fixed-1.8V";
++ regulator-min-microvolt = <1800000>;
++ regulator-max-microvolt = <1800000>;
++ regulator-boot-on;
++ regulator-always-on;
++ };
++
++ reg_3p3v: regulator-3p3v {
++ compatible = "regulator-fixed";
++ regulator-name = "fixed-3.3V";
++ regulator-min-microvolt = <3300000>;
++ regulator-max-microvolt = <3300000>;
++ regulator-boot-on;
++ regulator-always-on;
++ };
++
++ keys {
++ compatible = "gpio-keys";
++
++ wps {
++ label = "reset";
++ gpios = <&gpio 9 GPIO_ACTIVE_LOW>;
++ linux,code = <KEY_RESTART>;
++ };
++ };
++
++ leds {
++ compatible = "gpio-leds";
++
++ led_status_blue: green {
++ label = "blue:status";
++ gpios = <&gpio 28 GPIO_ACTIVE_LOW>;
++ };
++
++ led_status_white: blue {
++ label = "white:status";
++ gpios = <&gpio 27 GPIO_ACTIVE_LOW>;
++ };
++ };
++
++};
++
++&uart0 {
++ mediatek,force-highspeed;
++ status = "okay";
++};
++
++&eth {
++ status = "okay";
++ mediatek,gmac-id = <0>;
++ phy-mode = "2500base-x";
++ mediatek,switch = "mt7531";
++ reset-gpios = <&gpio 18 GPIO_ACTIVE_HIGH>;
++
++ fixed-link {
++ speed = <2500>;
++ full-duplex;
++ };
++};
++
++&pinctrl {
++ mmc0_pins_default: mmc0default {
++ mux {
++ function = "flash";
++ groups = "emmc_51";
++ };
++
++ conf-cmd-dat {
++ pins = "EMMC_DATA_0", "EMMC_DATA_1", "EMMC_DATA_2",
++ "EMMC_DATA_3", "EMMC_DATA_4", "EMMC_DATA_5",
++ "EMMC_DATA_6", "EMMC_DATA_7", "EMMC_CMD";
++ input-enable;
++ drive-strength = <MTK_DRIVE_4mA>;
++ bias-pull-up = <MTK_PUPD_SET_R1R0_01>;
++ };
++
++ conf-clk {
++ pins = "EMMC_CK";
++ drive-strength = <MTK_DRIVE_6mA>;
++ bias-pull-down = <MTK_PUPD_SET_R1R0_10>;
++ };
++
++ conf-dsl {
++ pins = "EMMC_DSL";
++ bias-pull-down = <MTK_PUPD_SET_R1R0_10>;
++ };
++
++ conf-rst {
++ pins = "EMMC_RSTB";
++ drive-strength = <MTK_DRIVE_4mA>;
++ bias-pull-up = <MTK_PUPD_SET_R1R0_01>;
++ };
++ };
++};
++
++&mmc0 {
++ pinctrl-names = "default";
++ pinctrl-0 = <&mmc0_pins_default>;
++ bus-width = <8>;
++ max-frequency = <200000000>;
++ cap-mmc-highspeed;
++ cap-mmc-hw-reset;
++ vmmc-supply = <&reg_3p3v>;
++ vqmmc-supply = <&reg_1p8v>;
++ non-removable;
++ status = "okay";
++};
++
++&wmcpu_emi {
++ status = "disabled";
++};
+--- /dev/null
++++ b/configs/mt7986a_glinet_gl-mt6000_defconfig
+@@ -0,0 +1,105 @@
++CONFIG_ARM=y
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_NR_DRAM_BANKS=1
++CONFIG_ENV_SIZE=0x80000
++CONFIG_ENV_OFFSET=0x400000
++CONFIG_DEFAULT_DEVICE_TREE="mt7986a-glinet-gl-mt6000"
++CONFIG_SYS_PROMPT="MT7986> "
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_TARGET_MT7986=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_DEBUG_UART_BASE=0x11002000
++CONFIG_DEBUG_UART_CLOCK=40000000
++CONFIG_SYS_LOAD_ADDR=0x46000000
++CONFIG_DEBUG_UART=y
++CONFIG_AHCI=y
++CONFIG_FIT=y
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_DEFAULT_FDT_FILE="mediatek/mt7986a-glinet-gl-mt6000.dtb"
++CONFIG_LOGLEVEL=7
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_LOG=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_HUSH_PARSER=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_PWM=y
++CONFIG_CMD_GPT=y
++CONFIG_CMD_MMC=y
++CONFIG_CMD_PART=y
++CONFIG_CMD_USB=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_LINK_LOCAL=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_UUID=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_SMC=y
++CONFIG_OF_EMBED=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_IS_IN_MMC=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_USE_DEFAULT_ENV_FILE=y
++CONFIG_DEFAULT_ENV_FILE="glinet_gl-mt6000_env"
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_VERSION_VARIABLE=y
++CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_NETCONSOLE=y
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_CLK=y
++CONFIG_GPIO_HOG=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_SUPPORT_EMMC_BOOT=y
++CONFIG_MMC_HS200_SUPPORT=y
++CONFIG_MMC_MTK=y
++CONFIG_PHY_FIXED=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PHY=y
++CONFIG_PHY_MTK_TPHY=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7986=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++CONFIG_DM_PWM=y
++CONFIG_PWM_MTK=y
++CONFIG_RAM=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_USB=y
++CONFIG_USB_XHCI_HCD=y
++CONFIG_USB_XHCI_MTK=y
++CONFIG_USB_STORAGE=y
++CONFIG_HEXDUMP=y
++CONFIG_LMB_MAX_REGIONS=64
+--- /dev/null
++++ b/glinet_gl-mt6000_env
+@@ -0,0 +1,25 @@
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x46000000
++bootdelay=3
++bootfile_bl2=openwrt-mediatek-filogic-glinet_gl-mt6000-preloader.bin
++bootfile_fip=openwrt-mediatek-filogic-glinet_gl-mt6000-bl31-uboot.fip
++bootfile_firmware=openwrt-mediatek-filogic-glinet_gl-mt6000-squashfs-factory.bin
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_title= *** U-Boot Boot Menu for GL-iNet GL-MT6000 ***
++bootmenu_0=Startup system (Default).=run boot_system
++bootmenu_1=Load Firmware via TFTP then write to eMMC.=run boot_tftp_firmware ; run bootmenu_confirm_return
++bootmenu_2=Load BL31+U-Boot FIP via TFTP then write to eMMC.=run boot_tftp_write_fip ; run bootmenu_confirm_return
++bootmenu_3=Load BL2 preloader via TFTP then write to eMMC.=run boot_tftp_write_bl2 ; run bootmenu_confirm_return
++bootmenu_4=Reboot.=reset
++bootmenu_5=Reset all settings to factory defaults.=run reset_factory ; reset
++filesize_to_blk=setexpr cnt $filesize + 0x1ff && setexpr cnt $cnt / 0x200
++mmc_read_kernel=mmc read $loadaddr $part_addr 0x100 && imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc read $loadaddr $part_addr $image_size
++boot_system=part start mmc 0 kernel part_addr && part size mmc 0 kernel part_size && run mmc_read_kernel && bootm
++boot_tftp_firmware=tftpboot $loadaddr $bootfile_firmware && run emmc_write_firmware
++boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run emmc_write_fip
++boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run emmc_write_bl2
++emmc_write_firmware=part start mmc 0 kernel part_addr && run filesize_to_blk && mmc write $loadaddr $part_addr $cnt
++emmc_write_bl2=run filesize_to_blk && test 0x$cnt -le 0x800 && mmc partconf 0 1 1 1 && && mmc write $loadaddr 0x0 0x800 ; mmc partconf 0 1 1 0
++emmc_write_fip=part start mmc 0 fip part_addr && part size mmc 0 fip part_size && run filesize_to_blk && test 0x$cnt -le 0x$part_size && mmc write $loadaddr $part_addr $cnt
++reset_factory=eraseenv && reset
diff --git a/package/boot/uboot-mediatek/patches/437-add-cmcc_rax3000m.patch b/package/boot/uboot-mediatek/patches/437-add-cmcc_rax3000m.patch
new file mode 100644
index 00000000000..26e0e30a996
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/437-add-cmcc_rax3000m.patch
@@ -0,0 +1,697 @@
+--- /dev/null
++++ b/configs/mt7981_cmcc_rax3000m-emmc_defconfig
+@@ -0,0 +1,175 @@
++CONFIG_ARM=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TARGET_MT7981=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_NR_DRAM_BANKS=1
++CONFIG_DEFAULT_DEVICE_TREE="mt7981-cmcc-rax3000m-emmc"
++CONFIG_DEFAULT_ENV_FILE="cmcc_rax3000m-emmc_env"
++CONFIG_DEFAULT_FDT_FILE="mediatek/mt7981-cmcc-rax3000m-emmc.dtb"
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_DEBUG_UART_BASE=0x11002000
++CONFIG_DEBUG_UART_CLOCK=40000000
++CONFIG_DEBUG_UART=y
++CONFIG_SYS_LOAD_ADDR=0x46000000
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_BOOTDELAY=30
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_LOGLEVEL=7
++CONFIG_LOG=y
++CONFIG_SYS_PROMPT="MT7981> "
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_EXT4=y
++CONFIG_CMD_FAT=y
++CONFIG_CMD_FDT=y
++CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_FS_UUID=y
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_GPT=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++# CONFIG_CMD_MBR is not set
++CONFIG_CMD_MMC=y
++CONFIG_CMD_PCI=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
++CONFIG_CMD_PWM=y
++CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_PART=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_USB=y
++CONFIG_CMD_UUID=y
++CONFIG_DISPLAY_CPUINFO=y
++CONFIG_DM_MMC=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++CONFIG_DM_USB=y
++CONFIG_DM_PWM=y
++CONFIG_PWM_MTK=y
++CONFIG_HUSH_PARSER=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_VERSION_VARIABLE=y
++CONFIG_PARTITION_UUIDS=y
++CONFIG_NETCONSOLE=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_DM_GPIO=y
++CONFIG_DM_SCSI=y
++CONFIG_AHCI=y
++CONFIG_AHCI_PCI=y
++CONFIG_SCSI_AHCI=y
++CONFIG_SCSI=y
++CONFIG_CMD_SCSI=y
++CONFIG_PHY=y
++CONFIG_PHY_MTK_TPHY=y
++CONFIG_PHY_FIXED=y
++CONFIG_MTK_AHCI=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PCI=y
++CONFIG_DM_PCI=y
++CONFIG_PCIE_MEDIATEK=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7622=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_RAM=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_MMC=y
++CONFIG_MMC_DEFAULT_DEV=1
++CONFIG_MMC_HS200_SUPPORT=y
++CONFIG_MMC_MTK=y
++CONFIG_MMC_SUPPORTS_TUNING=y
++CONFIG_SUPPORT_EMMC_BOOT=y
++CONFIG_SPI=y
++CONFIG_SYSRESET_WATCHDOG=y
++CONFIG_WDT_MTK=y
++CONFIG_LZO=y
++CONFIG_ZSTD=y
++CONFIG_HEXDUMP=y
++CONFIG_RANDOM_UUID=y
++CONFIG_REGEX=y
++CONFIG_USB=y
++CONFIG_USB_HOST=y
++CONFIG_USB_XHCI_HCD=y
++CONFIG_USB_XHCI_MTK=y
++CONFIG_USB_STORAGE=y
++CONFIG_OF_EMBED=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_IS_IN_MMC=y
++CONFIG_ENV_OFFSET=0x400000
++CONFIG_ENV_OFFSET_REDUND=0x440000
++CONFIG_ENV_SIZE=0x40000
++CONFIG_ENV_SIZE_REDUND=0x40000
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_SUPPORT_EMMC_BOOT=y
++CONFIG_PHY_FIXED=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7981=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_HEXDUMP=y
++CONFIG_USE_DEFAULT_ENV_FILE=y
++CONFIG_CMD_SF=y
++CONFIG_LMB_MAX_REGIONS=64
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
+--- /dev/null
++++ b/configs/mt7981_cmcc_rax3000m-nand_defconfig
+@@ -0,0 +1,175 @@
++CONFIG_ARM=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TARGET_MT7981=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_NR_DRAM_BANKS=1
++CONFIG_DEFAULT_DEVICE_TREE="mt7981-cmcc-rax3000m-nand"
++CONFIG_DEFAULT_ENV_FILE="cmcc_rax3000m-nand_env"
++CONFIG_DEFAULT_FDT_FILE="mediatek/mt7981-cmcc-rax3000m-nand.dtb"
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_DEBUG_UART_BASE=0x11002000
++CONFIG_DEBUG_UART_CLOCK=40000000
++CONFIG_DEBUG_UART=y
++CONFIG_SYS_LOAD_ADDR=0x46000000
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_BOOTDELAY=30
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_LOGLEVEL=7
++CONFIG_LOG=y
++CONFIG_SYS_PROMPT="MT7981> "
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_EXT4=y
++CONFIG_CMD_FAT=y
++CONFIG_CMD_FDT=y
++CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_FS_UUID=y
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_GPT=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++# CONFIG_CMD_MBR is not set
++CONFIG_CMD_PCI=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
++CONFIG_CMD_PWM=y
++CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_UBI=y
++CONFIG_CMD_UBI_RENAME=y
++CONFIG_CMD_UBIFS=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_PART=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_UUID=y
++CONFIG_DISPLAY_CPUINFO=y
++CONFIG_DM_MTD=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++CONFIG_DM_PWM=y
++CONFIG_PWM_MTK=y
++CONFIG_HUSH_PARSER=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_VERSION_VARIABLE=y
++CONFIG_PARTITION_UUIDS=y
++CONFIG_NETCONSOLE=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_DM_GPIO=y
++CONFIG_DM_SCSI=y
++CONFIG_AHCI=y
++CONFIG_AHCI_PCI=y
++CONFIG_SCSI_AHCI=y
++CONFIG_SCSI=y
++CONFIG_CMD_SCSI=y
++CONFIG_PHY=y
++CONFIG_PHY_MTK_TPHY=y
++CONFIG_PHY_FIXED=y
++CONFIG_MTK_AHCI=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PCI=y
++# CONFIG_MMC is not set
++# CONFIG_DM_MMC is not set
++CONFIG_MTD=y
++CONFIG_MTD_UBI_FASTMAP=y
++CONFIG_DM_PCI=y
++CONFIG_PCIE_MEDIATEK=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7622=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_RAM=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_SPI=y
++CONFIG_DM_SPI=y
++CONFIG_MTK_SPI_NAND=y
++CONFIG_MTK_SPI_NAND_MTD=y
++CONFIG_SYSRESET_WATCHDOG=y
++CONFIG_WDT_MTK=y
++CONFIG_LZO=y
++CONFIG_ZSTD=y
++CONFIG_HEXDUMP=y
++CONFIG_RANDOM_UUID=y
++CONFIG_REGEX=y
++CONFIG_OF_EMBED=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_IS_IN_UBI=y
++CONFIG_ENV_UBI_PART="ubi"
++CONFIG_ENV_SIZE=0x1f000
++CONFIG_ENV_SIZE_REDUND=0x1f000
++CONFIG_ENV_UBI_VOLUME="ubootenv"
++CONFIG_ENV_UBI_VOLUME_REDUND="ubootenv2"
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_PHY_FIXED=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7981=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_HEXDUMP=y
++CONFIG_USE_DEFAULT_ENV_FILE=y
++CONFIG_MTD_SPI_NAND=y
++CONFIG_MTK_SPIM=y
++CONFIG_CMD_MTD=y
++CONFIG_CMD_NAND=y
++CONFIG_CMD_NAND_TRIMFFS=y
++CONFIG_LMB_MAX_REGIONS=64
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
+--- /dev/null
++++ b/arch/arm/dts/mt7981-cmcc-rax3000m.dtsi
+@@ -0,0 +1,85 @@
++// SPDX-License-Identifier: GPL-2.0-only
++/*
++ * Copyright (c) 2022 MediaTek Inc.
++ * Author: Sam Shih <sam.shih@mediatek.com>
++ */
++
++/dts-v1/;
++#include "mt7981.dtsi"
++#include <dt-bindings/gpio/gpio.h>
++#include <dt-bindings/input/linux-event-codes.h>
++
++/ {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ model = "CMCC RAX3000M";
++ compatible = "mediatek,mt7981", "mediatek,mt7981-rfb";
++
++ chosen {
++ stdout-path = &uart0;
++ tick-timer = &timer0;
++ };
++
++ memory@40000000 {
++ device_type = "memory";
++ reg = <0x40000000 0x20000000>;
++ };
++
++ keys {
++ compatible = "gpio-keys";
++
++ button-reset {
++ label = "reset";
++ linux,code = <KEY_RESTART>;
++ gpios = <&gpio 1 GPIO_ACTIVE_LOW>;
++ };
++
++ button-mesh {
++ label = "mesh";
++ linux,code = <BTN_9>;
++ linux,input-type = <EV_SW>;
++ gpios = <&gpio 0 GPIO_ACTIVE_LOW>;
++ };
++ };
++
++ leds {
++ compatible = "gpio-leds";
++
++ led-0 {
++ label = "green:status";
++ gpios = <&gpio 9 GPIO_ACTIVE_LOW>;
++ };
++
++ led-1 {
++ label = "blue:status";
++ gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
++ };
++
++ led-2 {
++ label = "red:status";
++ gpios = <&gpio 35 GPIO_ACTIVE_LOW>;
++ };
++ };
++};
++
++&eth {
++ status = "okay";
++ mediatek,gmac-id = <0>;
++ phy-mode = "2500base-x";
++ mediatek,switch = "mt7531";
++ reset-gpios = <&gpio 39 GPIO_ACTIVE_HIGH>;
++
++ fixed-link {
++ speed = <2500>;
++ full-duplex;
++ };
++};
++
++&uart0 {
++ mediatek,force-highspeed;
++ status = "okay";
++};
++
++&watchdog {
++ status = "disabled";
++};
+--- /dev/null
++++ b/arch/arm/dts/mt7981-cmcc-rax3000m-emmc.dts
+@@ -0,0 +1,53 @@
++// SPDX-License-Identifier: GPL-2.0-only
++
++/dts-v1/;
++#include "mt7981-cmcc-rax3000m.dtsi"
++
++/ {
++ reg_3p3v: regulator-3p3v {
++ compatible = "regulator-fixed";
++ regulator-name = "fixed-3.3V";
++ regulator-min-microvolt = <3300000>;
++ regulator-max-microvolt = <3300000>;
++ regulator-boot-on;
++ regulator-always-on;
++ };
++};
++
++&mmc0 {
++ pinctrl-names = "default";
++ pinctrl-0 = <&mmc0_pins_default>;
++ max-frequency = <26000000>;
++ bus-width = <8>;
++ cap-mmc-hw-reset;
++ vmmc-supply = <&reg_3p3v>;
++ non-removable;
++ status = "okay";
++};
++
++&pinctrl {
++ mmc0_pins_default: mmc0default {
++ mux {
++ function = "flash";
++ groups = "emmc_45";
++ };
++ conf-cmd-dat {
++ pins = "SPI0_CLK", "SPI0_MOSI", "SPI0_MISO",
++ "SPI0_CS", "SPI0_HOLD", "SPI0_WP",
++ "SPI1_CLK", "SPI1_MOSI", "SPI1_MISO";
++ input-enable;
++ drive-strength = <MTK_DRIVE_4mA>;
++ bias-pull-up = <MTK_PUPD_SET_R1R0_01>;
++ };
++ conf-clk {
++ pins = "SPI1_CS";
++ drive-strength = <MTK_DRIVE_6mA>;
++ bias-pull-down = <MTK_PUPD_SET_R1R0_10>;
++ };
++ conf-rst {
++ pins = "PWM0";
++ drive-strength = <MTK_DRIVE_4mA>;
++ bias-pull-up = <MTK_PUPD_SET_R1R0_01>;
++ };
++ };
++};
+--- /dev/null
++++ b/arch/arm/dts/mt7981-cmcc-rax3000m-nand.dts
+@@ -0,0 +1,77 @@
++// SPDX-License-Identifier: GPL-2.0-only
++
++/dts-v1/;
++#include "mt7981-cmcc-rax3000m.dtsi"
++
++&pinctrl {
++ spi_flash_pins: spi0-pins-func-1 {
++ mux {
++ function = "flash";
++ groups = "spi0", "spi0_wp_hold";
++ };
++
++ conf-pu {
++ pins = "SPI0_CS", "SPI0_HOLD", "SPI0_WP";
++ drive-strength = <MTK_DRIVE_8mA>;
++ bias-pull-up = <MTK_PUPD_SET_R1R0_00>;
++ };
++
++ conf-pd {
++ pins = "SPI0_CLK", "SPI0_MOSI", "SPI0_MISO";
++ drive-strength = <MTK_DRIVE_8mA>;
++ bias-pull-down = <MTK_PUPD_SET_R1R0_00>;
++ };
++ };
++};
++
++&spi0 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ pinctrl-names = "default";
++ pinctrl-0 = <&spi_flash_pins>;
++ status = "okay";
++ must_tx;
++ enhance_timing;
++ dma_ext;
++ ipm_design;
++ support_quad;
++ tick_dly = <2>;
++ sample_sel = <0>;
++
++ spi_nand@0 {
++ compatible = "spi-nand";
++ reg = <0>;
++ spi-max-frequency = <52000000>;
++
++ partitions {
++ compatible = "fixed-partitions";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ partition@0 {
++ label = "bl2";
++ reg = <0x0 0x100000>;
++ };
++
++ partition@100000 {
++ label = "orig-env";
++ reg = <0x100000 0x80000>;
++ };
++
++ partition@160000 {
++ label = "factory";
++ reg = <0x180000 0x200000>;
++ };
++
++ partition@380000 {
++ label = "fip";
++ reg = <0x380000 0x200000>;
++ };
++
++ partition@580000 {
++ label = "ubi";
++ reg = <0x580000 0x7200000>;
++ };
++ };
++ };
++};
+--- /dev/null
++++ b/cmcc_rax3000m-emmc_env
+@@ -0,0 +1,55 @@
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x46000000
++console=earlycon=uart8250,mmio32,0x11002000 console=ttyS0
++bootargs=root=/dev/mmcblk0p65
++bootcmd=if pstore check ; then run boot_recovery ; else run boot_emmc ; fi
++bootconf=config-1#mt7981b-cmcc-rax3000m-emmc
++bootdelay=0
++bootfile=openwrt-mediatek-filogic-cmcc_rax3000m-initramfs-recovery.itb
++bootfile_bl2=openwrt-mediatek-filogic-cmcc_rax3000m-emmc-preloader.bin
++bootfile_fip=openwrt-mediatek-filogic-cmcc_rax3000m-emmc-bl31-uboot.fip
++bootfile_upg=openwrt-mediatek-filogic-cmcc_rax3000m-squashfs-sysupgrade.itb
++bootled_pwr=red:status
++bootled_rec=blue:status
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_default=0
++bootmenu_delay=0
++bootmenu_title= ( ( ( OpenWrt ) ) ) [eMMC]
++bootmenu_0=Initialize environment.=run _firstboot
++bootmenu_0d=Run default boot command.=run boot_default
++bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
++bootmenu_2=Boot production system from eMMC.=run boot_production ; run bootmenu_confirm_return
++bootmenu_3=Boot recovery system from eMMC.=run boot_recovery ; run bootmenu_confirm_return
++bootmenu_4=Load production system via TFTP then write to eMMC.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_5=Load recovery system via TFTP then write to eMMC.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_6=Load BL31+U-Boot FIP via TFTP then write to eMMC.=run boot_tftp_write_fip ; run bootmenu_confirm_return
++bootmenu_7=Load BL2 preloader via TFTP then write to eMMC.=run boot_tftp_write_bl2 ; run bootmenu_confirm_return
++bootmenu_8=Reboot.=reset
++bootmenu_9=Reset all settings to factory defaults.=run reset_factory ; reset
++boot_first=if button reset ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
++boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
++boot_production=led $bootled_pwr on ; run emmc_read_production && bootm $loadaddr#$bootconf ; led $bootled_pwr off
++boot_recovery=led $bootled_rec on ; run emmc_read_recovery && bootm $loadaddr#$bootconf ; led $bootled_rec off
++boot_emmc=run boot_production ; run boot_recovery
++boot_tftp_forever=led $bootled_rec on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done
++boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run emmc_write_production ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run emmc_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run emmc_write_fip
++boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run emmc_write_bl2
++boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr#$bootconf
++mmc_write_vol=imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc erase 0x$part_addr 0x$image_size && mmc write $loadaddr 0x$part_addr 0x$image_size
++mmc_read_vol=mmc read $loadaddr $part_addr 0x100 && imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc read $loadaddr 0x$part_addr 0x$image_size && setexpr filesize $image_size * 0x200
++part_default=production
++part_recovery=recovery
++reset_factory=eraseenv && reset
++emmc_read_production=part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_read_vol
++emmc_read_recovery=part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_read_vol
++emmc_write_bl2=mmc partconf 0 1 1 1 && mmc erase 0x0 0x400 && mmc write $fileaddr 0x0 0x400 ; mmc partconf 0 1 1 0
++emmc_write_fip=mmc erase 0x3400 0x2000 && mmc write $fileaddr 0x3400 0x2000 && mmc erase 0x2000 0x800
++emmc_write_production=part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_write_vol
++emmc_write_recovery=part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_write_vol
++_init_env=setenv _init_env ; setenv _create_env ; saveenv ; saveenv
++_firstboot=setenv _firstboot ; run _switch_to_menu ; run _init_env ; run boot_first
++_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
++_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
+--- /dev/null
++++ b/cmcc_rax3000m-nand_env
+@@ -0,0 +1,56 @@
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x46000000
++console=earlycon=uart8250,mmio32,0x11002000 console=ttyS0
++bootconf=config-1#mt7981b-cmcc-rax3000m-nand
++bootcmd=if pstore check ; then run boot_recovery ; else run boot_ubi ; fi
++bootdelay=0
++bootfile=openwrt-mediatek-filogic-cmcc_rax3000m-initramfs-recovery.itb
++bootfile_bl2=openwrt-mediatek-filogic-cmcc_rax3000m-nand-preloader.bin
++bootfile_fip=openwrt-mediatek-filogic-cmcc_rax3000m-nand-bl31-uboot.fip
++bootfile_upg=openwrt-mediatek-filogic-cmcc_rax3000m-squashfs-sysupgrade.itb
++bootled_pwr=red:status
++bootled_rec=blue:status
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_default=0
++bootmenu_delay=0
++bootmenu_title= ( ( ( OpenWrt ) ) ) [SPI-NAND]
++bootmenu_0=Initialize environment.=run _firstboot
++bootmenu_0d=Run default boot command.=run boot_default
++bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
++bootmenu_2=Boot production system from NAND.=run boot_production ; run bootmenu_confirm_return
++bootmenu_3=Boot recovery system from NAND.=run boot_recovery ; run bootmenu_confirm_return
++bootmenu_4=Load production system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_5=Load recovery system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_6=Load BL31+U-Boot FIP via TFTP then write to NAND.=run boot_tftp_write_fip ; run bootmenu_confirm_return
++bootmenu_7=Load BL2 preloader via TFTP then write to NAND.=run boot_tftp_write_bl2 ; run bootmenu_confirm_return
++bootmenu_8=Reboot.=reset
++bootmenu_9=Reset all settings to factory defaults.=run reset_factory ; reset
++boot_first=if button reset ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
++boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
++boot_production=led $bootled_pwr on ; run ubi_read_production && bootm $loadaddr#$bootconf ; led $bootled_pwr off
++boot_recovery=led $bootled_rec on ; run ubi_read_recovery && bootm $loadaddr#$bootconf ; led $bootled_rec off
++boot_ubi=run boot_production ; run boot_recovery ; run boot_tftp_forever
++boot_tftp_forever=led $bootled_rec on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done
++boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run ubi_write_production ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run ubi_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr#$bootconf
++boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run mtd_write_fip && run reset_factory
++boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run mtd_write_bl2
++part_default=production
++part_recovery=recovery
++reset_factory=ubi part ubi ; mw $loadaddr 0x0 0x800 ; ubi write $loadaddr ubootenv 0x800 ; ubi write $loadaddr ubootenv2 0x800
++mtd_write_fip=mtd erase fip && mtd write fip $loadaddr
++mtd_write_bl2=mtd erase bl2 && mtd write bl2 $loadaddr
++ubi_create_env=ubi check ubootenv || ubi create ubootenv 0x100000 dynamic 0 || run ubi_format ; ubi check ubootenv2 || ubi create ubootenv2 0x100000 dynamic 1 || run ubi_format
++ubi_format=ubi detach ; mtd erase ubi && ubi part ubi ; reset
++ubi_prepare_rootfs=if ubi check rootfs_data ; then else if env exists rootfs_data_max ; then ubi create rootfs_data $rootfs_data_max dynamic || ubi create rootfs_data - dynamic ; else ubi create rootfs_data - dynamic ; fi ; fi
++ubi_read_production=ubi read $loadaddr fit && iminfo $loadaddr && run ubi_prepare_rootfs
++ubi_read_recovery=ubi check recovery && ubi read $loadaddr recovery
++ubi_remove_rootfs=ubi check rootfs_data && ubi remove rootfs_data
++ubi_write_production=ubi check fit && ubi remove fit ; run ubi_remove_rootfs ; ubi create fit $filesize dynamic 2 && ubi write $loadaddr fit $filesize
++ubi_write_recovery=ubi check recovery && ubi remove recovery ; run ubi_remove_rootfs ; ubi create recovery $filesize dynamic 3 && ubi write $loadaddr recovery $filesize
++_init_env=setenv _init_env ; run ubi_create_env ; saveenv ; saveenv
++_firstboot=setenv _firstboot ; run _switch_to_menu ; run _init_env ; run boot_first
++_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
++_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
diff --git a/package/boot/uboot-mediatek/patches/438-add-jcg_q30-pro.patch b/package/boot/uboot-mediatek/patches/438-add-jcg_q30-pro.patch
new file mode 100644
index 00000000000..639cae174e7
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/438-add-jcg_q30-pro.patch
@@ -0,0 +1,420 @@
+--- /dev/null
++++ b/configs/mt7981_jcg_q30-pro_defconfig
+@@ -0,0 +1,175 @@
++CONFIG_ARM=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TARGET_MT7981=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_NR_DRAM_BANKS=1
++CONFIG_DEFAULT_DEVICE_TREE="mt7981_jcg_q30-pro"
++CONFIG_DEFAULT_ENV_FILE="jcg_q30-pro_env"
++CONFIG_DEFAULT_FDT_FILE="mediatek/mt7981_jcg_q30-pro.dtb"
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_DEBUG_UART_BASE=0x11002000
++CONFIG_DEBUG_UART_CLOCK=40000000
++CONFIG_DEBUG_UART=y
++CONFIG_SYS_LOAD_ADDR=0x46000000
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_BOOTDELAY=30
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_LOGLEVEL=7
++CONFIG_LOG=y
++CONFIG_SYS_PROMPT="MT7981> "
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_EXT4=y
++CONFIG_CMD_FAT=y
++CONFIG_CMD_FDT=y
++CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_FS_UUID=y
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_GPT=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++# CONFIG_CMD_MBR is not set
++CONFIG_CMD_PCI=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
++CONFIG_CMD_PWM=y
++CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_UBI=y
++CONFIG_CMD_UBI_RENAME=y
++CONFIG_CMD_UBIFS=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_PART=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_UUID=y
++CONFIG_DISPLAY_CPUINFO=y
++CONFIG_DM_MTD=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++CONFIG_DM_PWM=y
++CONFIG_PWM_MTK=y
++CONFIG_HUSH_PARSER=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_VERSION_VARIABLE=y
++CONFIG_PARTITION_UUIDS=y
++CONFIG_NETCONSOLE=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_DM_GPIO=y
++CONFIG_DM_SCSI=y
++CONFIG_AHCI=y
++CONFIG_AHCI_PCI=y
++CONFIG_SCSI_AHCI=y
++CONFIG_SCSI=y
++CONFIG_CMD_SCSI=y
++CONFIG_PHY=y
++CONFIG_PHY_MTK_TPHY=y
++CONFIG_PHY_FIXED=y
++CONFIG_MTK_AHCI=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PCI=y
++# CONFIG_MMC is not set
++# CONFIG_DM_MMC is not set
++CONFIG_MTD=y
++CONFIG_MTD_UBI_FASTMAP=y
++CONFIG_DM_PCI=y
++CONFIG_PCIE_MEDIATEK=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7622=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_RAM=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_SPI=y
++CONFIG_DM_SPI=y
++CONFIG_MTK_SPI_NAND=y
++CONFIG_MTK_SPI_NAND_MTD=y
++CONFIG_SYSRESET_WATCHDOG=y
++CONFIG_WDT_MTK=y
++CONFIG_LZO=y
++CONFIG_ZSTD=y
++CONFIG_HEXDUMP=y
++CONFIG_RANDOM_UUID=y
++CONFIG_REGEX=y
++CONFIG_OF_EMBED=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_IS_IN_UBI=y
++CONFIG_ENV_UBI_PART="ubi"
++CONFIG_ENV_SIZE=0x1f000
++CONFIG_ENV_SIZE_REDUND=0x1f000
++CONFIG_ENV_UBI_VOLUME="ubootenv"
++CONFIG_ENV_UBI_VOLUME_REDUND="ubootenv2"
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_PHY_FIXED=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7981=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_HEXDUMP=y
++CONFIG_USE_DEFAULT_ENV_FILE=y
++CONFIG_MTD_SPI_NAND=y
++CONFIG_MTK_SPIM=y
++CONFIG_CMD_MTD=y
++CONFIG_CMD_NAND=y
++CONFIG_CMD_NAND_TRIMFFS=y
++CONFIG_LMB_MAX_REGIONS=64
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
+--- /dev/null
++++ b/arch/arm/dts/mt7981_jcg_q30-pro.dts
+@@ -0,0 +1,179 @@
++// SPDX-License-Identifier: GPL-2.0
++/*
++ * Copyright (c) 2022 MediaTek Inc.
++ * Author: Sam Shih <sam.shih@mediatek.com>
++ */
++
++/dts-v1/;
++#include "mt7981.dtsi"
++#include <dt-bindings/gpio/gpio.h>
++#include <dt-bindings/input/linux-event-codes.h>
++
++/ {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ model = "JCG Q30 PRO";
++ compatible = "mediatek,mt7981", "mediatek,mt7981-rfb";
++
++ chosen {
++ stdout-path = &uart0;
++ tick-timer = &timer0;
++ };
++
++ memory@40000000 {
++ device_type = "memory";
++ reg = <0x40000000 0x10000000>;
++ };
++
++ keys {
++ compatible = "gpio-keys";
++
++ factory {
++ label = "reset";
++ linux,code = <KEY_RESTART>;
++ gpios = <&gpio 1 GPIO_ACTIVE_LOW>;
++ };
++ };
++
++ leds {
++ compatible = "gpio-leds";
++
++ status_red {
++ label = "red:status";
++ gpios = <&gpio 8 GPIO_ACTIVE_HIGH>;
++ };
++
++ status_blue {
++ label = "blue:status";
++ gpios = <&gpio 13 GPIO_ACTIVE_LOW>;
++ };
++ };
++};
++
++&uart0 {
++ mediatek,force-highspeed;
++ status = "okay";
++};
++
++&uart1 {
++ pinctrl-names = "default";
++ pinctrl-0 = <&uart1_pins>;
++ status = "disabled";
++};
++
++&eth {
++ status = "okay";
++ mediatek,gmac-id = <0>;
++ phy-mode = "2500base-x";
++ mediatek,switch = "mt7531";
++ reset-gpios = <&gpio 39 GPIO_ACTIVE_HIGH>;
++
++ fixed-link {
++ speed = <2500>;
++ full-duplex;
++ };
++};
++
++&pinctrl {
++ spi_flash_pins: spi0-pins-func-1 {
++ mux {
++ function = "flash";
++ groups = "spi0", "spi0_wp_hold";
++ };
++
++ conf-pu {
++ pins = "SPI0_CS", "SPI0_HOLD", "SPI0_WP";
++ drive-strength = <MTK_DRIVE_8mA>;
++ bias-pull-up = <MTK_PUPD_SET_R1R0_00>;
++ };
++
++ conf-pd {
++ pins = "SPI0_CLK", "SPI0_MOSI", "SPI0_MISO";
++ drive-strength = <MTK_DRIVE_8mA>;
++ bias-pull-down = <MTK_PUPD_SET_R1R0_00>;
++ };
++ };
++
++ spic_pins: spi1-pins-func-1 {
++ mux {
++ function = "spi";
++ groups = "spi1_1";
++ };
++ };
++
++ uart1_pins: spi1-pins-func-3 {
++ mux {
++ function = "uart";
++ groups = "uart1_2";
++ };
++ };
++
++ pwm_pins: pwm0-pins-func-1 {
++ mux {
++ function = "pwm";
++ groups = "pwm0_1", "pwm1_0";
++ };
++ };
++};
++
++&pwm {
++ pinctrl-names = "default";
++ pinctrl-0 = <&pwm_pins>;
++ status = "okay";
++};
++
++&spi0 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ pinctrl-names = "default";
++ pinctrl-0 = <&spi_flash_pins>;
++ status = "okay";
++ must_tx;
++ enhance_timing;
++ dma_ext;
++ ipm_design;
++ support_quad;
++ tick_dly = <2>;
++ sample_sel = <0>;
++
++ spi_nand@0 {
++ compatible = "spi-nand";
++ reg = <0>;
++ spi-max-frequency = <52000000>;
++
++ partitions {
++ compatible = "fixed-partitions";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ partition@0 {
++ label = "bl2";
++ reg = <0x0 0x100000>;
++ };
++
++ partition@100000 {
++ label = "orig-env";
++ reg = <0x100000 0x80000>;
++ };
++
++ partition@160000 {
++ label = "factory";
++ reg = <0x180000 0x200000>;
++ };
++
++ partition@380000 {
++ label = "fip";
++ reg = <0x380000 0x200000>;
++ };
++
++ partition@580000 {
++ label = "ubi";
++ reg = <0x580000 0x7000000>;
++ };
++ };
++ };
++};
++
++&watchdog {
++ status = "disabled";
++};
+--- /dev/null
++++ b/jcg_q30-pro_env
+@@ -0,0 +1,57 @@
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x46000000
++console=earlycon=uart8250,mmio32,0x11002000 console=ttyS0
++bootcmd=if pstore check ; then run boot_recovery ; else run boot_ubi ; fi
++bootconf=config-1
++bootdelay=0
++bootfile=openwrt-mediatek-filogic-jcg_q30-pro-initramfs-recovery.itb
++bootfile_bl2=openwrt-mediatek-filogic-jcg_q30-pro-preloader.bin
++bootfile_fip=openwrt-mediatek-filogic-jcg_q30-pro-bl31-uboot.fip
++bootfile_upg=openwrt-mediatek-filogic-jcg_q30-pro-squashfs-sysupgrade.itb
++bootled_pwr=blue:status
++bootled_rec=red:status
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_default=0
++bootmenu_delay=0
++bootmenu_title= ( ( ( OpenWrt ) ) )
++bootmenu_0=Initialize environment.=run _firstboot
++bootmenu_0d=Run default boot command.=run boot_default
++bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
++bootmenu_2=Boot production system from NAND.=run boot_production ; run bootmenu_confirm_return
++bootmenu_3=Boot recovery system from NAND.=run boot_recovery ; run bootmenu_confirm_return
++bootmenu_4=Load production system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_5=Load recovery system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_6=Load BL31+U-Boot FIP via TFTP then write to NAND.=run boot_tftp_write_fip ; run bootmenu_confirm_return
++bootmenu_7=Load BL2 preloader via TFTP then write to NAND.=run boot_tftp_write_bl2 ; run bootmenu_confirm_return
++bootmenu_8=Reboot.=reset
++bootmenu_9=Reset all settings to factory defaults.=run reset_factory ; reset
++boot_first=if button reset ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
++boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
++boot_production=led $bootled_pwr on ; run ubi_read_production && bootm $loadaddr#$bootconf ; led $bootled_pwr off
++boot_recovery=led $bootled_rec on ; run ubi_read_recovery && bootm $loadaddr#$bootconf ; led $bootled_rec off
++boot_ubi=run boot_production ; run boot_recovery ; run boot_tftp_forever
++boot_tftp_forever=led $bootled_rec on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done
++boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run ubi_write_production ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run ubi_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr#$bootconf
++boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run mtd_write_fip && run reset_factory
++boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run mtd_write_bl2
++part_default=production
++part_recovery=recovery
++reset_factory=ubi part ubi ; mw $loadaddr 0x0 0x800 ; ubi write $loadaddr ubootenv 0x800 ; ubi write $loadaddr ubootenv2 0x800
++mtd_write_fip=mtd erase fip && mtd write fip $loadaddr
++mtd_write_bl2=mtd erase bl2 && mtd write bl2 $loadaddr
++ubi_create_env=ubi check ubootenv || ubi create ubootenv 0x100000 dynamic 0 || run ubi_format ; ubi check ubootenv2 || ubi create ubootenv2 0x100000 dynamic 1 || run ubi_format
++ubi_format=ubi detach ; mtd erase ubi && ubi part ubi ; reset
++ubi_prepare_rootfs=if ubi check rootfs_data ; then else if env exists rootfs_data_max ; then ubi create rootfs_data $rootfs_data_max dynamic || ubi create rootfs_data - dynamic ; else ubi create rootfs_data - dynamic ; fi ; fi
++ubi_read_production=ubi read $loadaddr fit && iminfo $loadaddr && run ubi_prepare_rootfs
++ubi_read_recovery=ubi check recovery && ubi read $loadaddr recovery
++ubi_remove_rootfs=ubi check rootfs_data && ubi remove rootfs_data
++ubi_write_production=ubi check fit && ubi remove fit ; run ubi_remove_rootfs ; ubi create fit $filesize dynamic 2 && ubi write $loadaddr fit $filesize
++ubi_write_recovery=ubi check recovery && ubi remove recovery ; run ubi_remove_rootfs ; ubi create recovery $filesize dynamic 3 && ubi write $loadaddr recovery $filesize
++ethaddr_factory=mtd read factory 0x40080000 0xa0000 0x800 && env readmem -b ethaddr 0x4008002a 0x6 ; setenv ethaddr_factory
++_init_env=setenv _init_env ; run ubi_create_env ; saveenv ; saveenv
++_firstboot=setenv _firstboot ; run ethaddr_factory ; run _switch_to_menu ; run _init_env ; run boot_first
++_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
++_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
diff --git a/package/boot/uboot-mediatek/patches/439-add-zyxel_ex5601-t0.patch b/package/boot/uboot-mediatek/patches/439-add-zyxel_ex5601-t0.patch
new file mode 100644
index 00000000000..7f0564fd497
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/439-add-zyxel_ex5601-t0.patch
@@ -0,0 +1,431 @@
+--- /dev/null
++++ b/configs/mt7986_zyxel_ex5601-t0_defconfig
+@@ -0,0 +1,186 @@
++CONFIG_ARM=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TARGET_MT7986=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_NR_DRAM_BANKS=1
++CONFIG_DEFAULT_DEVICE_TREE="mt7986a-zyxel_ex5601-t0"
++CONFIG_DEFAULT_ENV_FILE="zyxel_ex5601-t0_env"
++CONFIG_DEFAULT_FDT_FILE="mediatek/mt7986a-zyxel_ex5601-t0.dtb"
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_DEBUG_UART_BASE=0x11002000
++CONFIG_DEBUG_UART_CLOCK=40000000
++CONFIG_DEBUG_UART=y
++CONFIG_SYS_LOAD_ADDR=0x46000000
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_BOOTDELAY=30
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_LOGLEVEL=7
++CONFIG_LOG=y
++CONFIG_SYS_PROMPT="EX5601> "
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_EXT4=y
++CONFIG_CMD_FAT=y
++CONFIG_CMD_FDT=y
++CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_FS_UUID=y
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_GPT=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++# CONFIG_CMD_MBR is not set
++CONFIG_CMD_MTD=y
++CONFIG_CMD_PCI=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
++CONFIG_CMD_PWM=y
++CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_UBI=y
++CONFIG_CMD_UBI_RENAME=y
++CONFIG_CMD_UBIFS=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_PART=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_USB=y
++# CONFIG_CMD_FLASH is not set
++CONFIG_CMD_UUID=y
++CONFIG_DISPLAY_CPUINFO=y
++CONFIG_DM_MTD=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++CONFIG_DM_USB=y
++CONFIG_DM_PWM=y
++CONFIG_PWM_MTK=y
++CONFIG_HUSH_PARSER=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_VERSION_VARIABLE=y
++CONFIG_PARTITION_UUIDS=y
++CONFIG_NETCONSOLE=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_DM_GPIO=y
++CONFIG_DM_SCSI=y
++CONFIG_AHCI=y
++CONFIG_AHCI_PCI=y
++CONFIG_SCSI_AHCI=y
++CONFIG_SCSI=y
++CONFIG_CMD_SCSI=y
++CONFIG_PHY=y
++CONFIG_PHY_MTK_TPHY=y
++CONFIG_PHY_FIXED=y
++CONFIG_MTK_AHCI=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PCI=y
++CONFIG_DM_PCI=y
++CONFIG_PCIE_MEDIATEK=y
++# CONFIG_MMC is not set
++# CONFIG_DM_MMC is not set
++CONFIG_MTD=y
++CONFIG_MTD_UBI_FASTMAP=y
++# CONFIG_DM_PCI is not set
++# CONFIG_PCIE_MEDIATEK is not set
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7622=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_RAM=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_SPI=y
++# CONFIG_I2C is not set
++CONFIG_DM_SPI=y
++CONFIG_MTK_SPI_NAND=y
++CONFIG_MTK_SPI_NAND_MTD=y
++CONFIG_SYSRESET_WATCHDOG=y
++CONFIG_WDT_MTK=y
++CONFIG_LZO=y
++CONFIG_ZSTD=y
++CONFIG_HEXDUMP=y
++CONFIG_RANDOM_UUID=y
++CONFIG_REGEX=y
++CONFIG_USB=y
++CONFIG_USB_HOST=y
++CONFIG_USB_XHCI_HCD=y
++CONFIG_USB_XHCI_MTK=y
++CONFIG_USB_STORAGE=y
++CONFIG_OF_EMBED=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_IS_IN_UBI=y
++CONFIG_ENV_UBI_PART="ubi"
++CONFIG_ENV_SIZE=0x1f000
++CONFIG_ENV_SIZE_REDUND=0x1f000
++CONFIG_ENV_UBI_VOLUME="ubootenv"
++CONFIG_ENV_UBI_VOLUME_REDUND="ubootenv2"
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_PHY_FIXED=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7986=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_HEXDUMP=y
++CONFIG_USE_DEFAULT_ENV_FILE=y
++CONFIG_MTD_SPI_NAND=y
++CONFIG_MTK_SPIM=y
++CONFIG_CMD_NAND=y
++CONFIG_CMD_NAND_TRIMFFS=y
++CONFIG_LMB_MAX_REGIONS=64
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
+--- /dev/null
++++ b/arch/arm/dts/mt7986a-zyxel_ex5601-t0.dts
+@@ -0,0 +1,181 @@
++// SPDX-License-Identifier: GPL-2.0
++/*
++ * Author: Valerio 'ftp21' Mancini <ftp21@ftp21.eu>
++ * Author: Nicolò Veronese <nicveronese@gmail.com>
++ */
++
++/dts-v1/;
++#include <dt-bindings/input/linux-event-codes.h>
++#include "mt7986.dtsi"
++#include <dt-bindings/gpio/gpio.h>
++
++/ {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ model = "Zyxel EX5601-T0 ubootmod";
++ compatible = "mediatek,mt7986", "mediatek,mt7986-sd-rfb";
++
++ chosen {
++ stdout-path = &uart0;
++ tick-timer = &timer0;
++ };
++
++ memory@40000000 {
++ device_type = "memory";
++ reg = <0x40000000 0x20000000>;
++ };
++
++ keys {
++ compatible = "gpio-keys";
++ factory {
++ label = "reset";
++ gpios = <&gpio 21 GPIO_ACTIVE_LOW>;
++ linux,code = <KEY_RESTART>;
++ };
++
++ wps {
++ label = "wps";
++ gpios = <&gpio 56 GPIO_ACTIVE_LOW>;
++ linux,code = <KEY_WPS_BUTTON>;
++ };
++ };
++
++ leds {
++ compatible = "gpio-leds";
++
++ led_status_green: pwr {
++ label = "green:status";
++ gpios = <&gpio 13 GPIO_ACTIVE_HIGH>;
++ default-state = "off";
++ };
++
++ led_sfp_green: sfp {
++ label = "green:sfp";
++ gpios = <&gpio 24 GPIO_ACTIVE_HIGH>;
++ default-state = "off";
++ };
++ };
++};
++
++&uart0 {
++ mediatek,force-highspeed;
++ status = "okay";
++};
++
++&uart1 {
++ pinctrl-names = "default";
++ pinctrl-0 = <&uart1_pins>;
++ status = "disabled";
++};
++
++&eth {
++ status = "okay";
++ mediatek,gmac-id = <0>;
++ phy-mode = "2500base-x";
++ mediatek,switch = "mt7531";
++ reset-gpios = <&gpio 5 GPIO_ACTIVE_HIGH>;
++
++ fixed-link {
++ speed = <2500>;
++ full-duplex;
++ };
++};
++
++&pinctrl {
++ spic_pins: spi1-pins-func-1 {
++ mux {
++ function = "spi";
++ groups = "spi1_2";
++ };
++ };
++
++ uart1_pins: spi1-pins-func-3 {
++ mux {
++ function = "uart";
++ groups = "uart1_2";
++ };
++ };
++
++ spi_flash_pins: spi0-pins-func-1 {
++ mux {
++ function = "flash";
++ groups = "spi0", "spi0_wp_hold";
++ };
++
++ conf-pu {
++ pins = "SPI2_CS", "SPI2_HOLD", "SPI2_WP";
++ drive-strength = <MTK_DRIVE_8mA>;
++ bias-pull-up = <MTK_PUPD_SET_R1R0_00>;
++ };
++
++ conf-pd {
++ pins = "SPI2_CLK", "SPI2_MOSI", "SPI2_MISO";
++ drive-strength = <MTK_DRIVE_8mA>;
++ bias-pull-down = <MTK_PUPD_SET_R1R0_00>;
++ };
++ };
++};
++
++&spi0 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ pinctrl-names = "default";
++ pinctrl-0 = <&spi_flash_pins>;
++ status = "okay";
++ must_tx;
++ enhance_timing;
++ dma_ext;
++ ipm_design;
++ support_quad;
++ tick_dly = <1>;
++ sample_sel = <0>;
++
++ spi_nand@0 {
++ compatible = "spi-nand";
++ reg = <0>;
++ spi-max-frequency = <20000000>;
++ spi-tx-buswidth = <4>;
++ spi-rx-buswidth = <4>;
++
++ partitions {
++ compatible = "fixed-partitions";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ partition@0 {
++ label = "bl2";
++ reg = <0x0 0x100000>;
++ };
++
++ partition@100000 {
++ label = "u-boot-env";
++ reg = <0x0100000 0x0080000>;
++ };
++
++ partition@180000 {
++ label = "Factory";
++ reg = <0x180000 0x0200000>;
++ };
++
++ partition@380000 {
++ label = "fip";
++ reg = <0x380000 0x0200000>;
++ };
++
++ partition@540000 {
++ label = "zloader";
++ reg = <0x540000 0x0040000>;
++ read-only;
++ };
++ partition@580000 {
++ label = "ubi";
++ reg = <0x580000 0x1da80000>;
++ };
++ };
++ };
++};
++
++&watchdog {
++ status = "disabled";
++};
++
+--- /dev/null
++++ b/zyxel_ex5601-t0_env
+@@ -0,0 +1,55 @@
++ethaddr_factory=mtd read Factory 0x40080000 0x0 0x20000 && env readmem -b ethaddr 0x4008002A 0x6 ; setenv ethaddr_factory
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x46000000
++console=earlycon=uart8250,mmio32,0x11002000 console=ttyS0
++bootargs=console=ttyS0,115200n8 console_msg_format=syslog
++bootcmd=if pstore check ; then run boot_recovery ; else run boot_ubi ; fi
++bootconf=config-1
++bootdelay=0
++bootfile=openwrt-mediatek-filogic-zyxel_ex5601-t0-ubootmod-initramfs-recovery.itb
++bootfile_bl2=openwrt-mediatek-filogic-zyxel_ex5601-t0-ubootmod-preloader.bin
++bootfile_fip=openwrt-mediatek-filogic-zyxel_ex5601-t0-ubootmod-bl31-uboot.fip
++bootfile_upg=openwrt-mediatek-filogic-zyxel_ex5601-t0-ubootmod-squashfs-sysupgrade.itb
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_default=0
++bootmenu_delay=0
++bootmenu_title= ( ( ( OpenWrt ) ) )
++bootmenu_0=Initialize environment.=run _firstboot
++bootmenu_0d=Run default boot command.=run boot_default
++bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
++bootmenu_2=Boot production system from NAND.=run boot_production ; run bootmenu_confirm_return
++bootmenu_3=Boot recovery system from NAND.=run boot_recovery ; run bootmenu_confirm_return
++bootmenu_4=Load production system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_5=Load recovery system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_6=Load BL31+U-Boot FIP via TFTP then write to NAND.=run boot_tftp_write_fip ; run bootmenu_confirm_return
++bootmenu_7=Load BL2 preloader via TFTP then write to NAND.=run boot_tftp_write_bl2 ; run bootmenu_confirm_return
++bootmenu_8=Reboot.=reset
++bootmenu_9=Reset all settings to factory defaults.=run reset_factory ; reset
++boot_first=if button reset ; then run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
++boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
++boot_production=run ubi_read_production && bootm $loadaddr#$bootconf
++boot_recovery=run ubi_read_recovery && bootm $loadaddr#$bootconf
++boot_ubi=run boot_production ; run boot_recovery ; run boot_tftp_forever
++boot_tftp_forever=while true ; do run boot_tftp_recovery ; sleep 1 ; done
++boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run ubi_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run ubi_write_production ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr#$bootconf
++boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run mtd_write_fip && run reset_factory
++boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run mtd_write_bl2
++part_fit=fit
++reset_factory=ubi part ubi ; mw $loadaddr 0x0 0x800 ; ubi write $loadaddr ubootenv 0x800 ; ubi write $loadaddr ubootenv2 0x800
++mtd_write_fip=mtd erase fip && mtd write fip $loadaddr
++mtd_write_bl2=mtd erase bl2 && mtd write bl2 $loadaddr
++ubi_create_env=ubi check ubootenv || ubi create ubootenv 0x100000 dynamic 0 ; ubi check ubootenv2 || ubi create ubootenv2 0x100000 dynamic 1
++ubi_format=ubi detach ; mtd erase ubi && ubi part ubi ; reset
++ubi_prepare_rootfs=if ubi check rootfs_data ; then else if env exists rootfs_data_max ; then ubi create rootfs_data $rootfs_data_max dynamic || ubi create rootfs_data - dynamic ; else ubi create rootfs_data - dynamic ; fi ; fi
++ubi_read_production=ubi read $loadaddr $part_fit && iminfo $loadaddr && run ubi_prepare_rootfs
++ubi_read_recovery=ubi check recovery && ubi read $loadaddr recovery
++ubi_remove_rootfs=ubi check rootfs_data && ubi remove rootfs_data
++ubi_write_production=ubi check fit && ubi remove fit ; run ubi_remove_rootfs ; ubi create fit $filesize dynamic && ubi write $loadaddr fit $filesize
++ubi_write_recovery=ubi check recovery && ubi remove recovery ; run ubi_remove_rootfs ; ubi create recovery $filesize dynamic && ubi write $loadaddr recovery $filesize
++_init_env=setenv _init_env ; run ubi_create_env ; saveenv ; saveenv
++_firstboot=setenv _firstboot ; run ethaddr_factory ; run _switch_to_menu ; run _init_env ; run boot_first
++_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
++_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
diff --git a/package/boot/uboot-mediatek/patches/440-add-jdcloud_re-cp-03.patch b/package/boot/uboot-mediatek/patches/440-add-jdcloud_re-cp-03.patch
new file mode 100644
index 00000000000..e0f3a6e2354
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/440-add-jdcloud_re-cp-03.patch
@@ -0,0 +1,324 @@
+--- /dev/null
++++ b/configs/mt7986a_jdcloud_re-cp-03_defconfig
+@@ -0,0 +1,112 @@
++CONFIG_ARM=y
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_NR_DRAM_BANKS=1
++CONFIG_ENV_SIZE=0x40000
++CONFIG_ENV_OFFSET=0x400000
++CONFIG_DEFAULT_DEVICE_TREE="mt7986a-jdcloud_re-cp-03"
++CONFIG_SYS_PROMPT="MT7986> "
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_TARGET_MT7986=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_DEBUG_UART_BASE=0x11002000
++CONFIG_DEBUG_UART_CLOCK=40000000
++CONFIG_ENV_OFFSET_REDUND=0x440000
++CONFIG_SYS_LOAD_ADDR=0x46000000
++CONFIG_DEBUG_UART=y
++CONFIG_FIT=y
++CONFIG_BOOTDELAY=30
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_DEFAULT_FDT_FILE="mediatek/mt7986a-jdcloud_re-cp-03.dtb"
++CONFIG_LOGLEVEL=7
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_LOG=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_HUSH_PARSER=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_PWM=y
++CONFIG_CMD_GPT=y
++CONFIG_CMD_MMC=y
++CONFIG_CMD_PART=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_LINK_LOCAL=y
++CONFIG_CMD_PXE=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_UUID=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_SMC=y
++CONFIG_CMD_EXT4=y
++CONFIG_CMD_FAT=y
++CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_FS_UUID=y
++CONFIG_OF_EMBED=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_IS_IN_MMC=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_USE_DEFAULT_ENV_FILE=y
++CONFIG_DEFAULT_ENV_FILE="jdcloud_re-cp-03_env"
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_VERSION_VARIABLE=y
++CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_NETCONSOLE=y
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_CLK=y
++CONFIG_GPIO_HOG=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_SUPPORT_EMMC_BOOT=y
++CONFIG_MMC_HS200_SUPPORT=y
++CONFIG_MMC_MTK=y
++CONFIG_PHY_FIXED=y
++CONFIG_DM_MDIO=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PHY=y
++CONFIG_PHY_MTK_TPHY=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7622=y
++CONFIG_PINCTRL_MT7986=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++CONFIG_DM_PWM=y
++CONFIG_PWM_MTK=y
++CONFIG_RAM=y
++CONFIG_SCSI=y
++CONFIG_DM_SCSI=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_ZSTD=y
++CONFIG_HEXDUMP=y
++CONFIG_LMB_MAX_REGIONS=64
+--- /dev/null
++++ b/arch/arm/dts/mt7986a-jdcloud_re-cp-03.dts
+@@ -0,0 +1,148 @@
++// SPDX-License-Identifier: GPL-2.0-or-later
++
++/dts-v1/;
++#include <dt-bindings/input/linux-event-codes.h>
++#include "mt7986.dtsi"
++#include <dt-bindings/gpio/gpio.h>
++
++/ {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ model = "JDCloud RE-CP-03";
++ compatible = "mediatek,mt7986", "mediatek,mt7986-rfb";
++
++ chosen {
++ stdout-path = &uart0;
++ tick-timer = &timer0;
++ };
++
++ memory@40000000 {
++ device_type = "memory";
++ reg = <0x40000000 0x40000000>;
++ };
++
++ gpio-keys {
++ compatible = "gpio-keys";
++
++ button-joylink {
++ label = "joylink";
++ linux,code = <BTN_0>;
++ gpios = <&gpio 10 GPIO_ACTIVE_LOW>;
++ };
++
++ button-reset {
++ label = "reset";
++ linux,code = <KEY_RESTART>;
++ gpios = <&gpio 9 GPIO_ACTIVE_LOW>;
++ };
++ };
++
++ gpio-leds {
++ compatible = "gpio-leds";
++
++ led-0 {
++ label = "blue:status";
++ gpios = <&gpio 7 GPIO_ACTIVE_HIGH>;
++ default-state = "off";
++ };
++
++ led-1 {
++ label = "red:status";
++ gpios = <&gpio 11 GPIO_ACTIVE_HIGH>;
++ default-state = "on";
++ };
++
++ led-2 {
++ label = "green:status";
++ gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
++ default-state = "off";
++ };
++ };
++
++ reg_1p8v: regulator-1p8v {
++ compatible = "regulator-fixed";
++ regulator-name = "fixed-1.8V";
++ regulator-min-microvolt = <1800000>;
++ regulator-max-microvolt = <1800000>;
++ regulator-boot-on;
++ regulator-always-on;
++ };
++
++ reg_3p3v: regulator-3p3v {
++ compatible = "regulator-fixed";
++ regulator-name = "fixed-3.3V";
++ regulator-min-microvolt = <3300000>;
++ regulator-max-microvolt = <3300000>;
++ regulator-boot-on;
++ regulator-always-on;
++ };
++};
++
++&eth {
++ status = "okay";
++ mediatek,gmac-id = <0>;
++ phy-mode = "2500base-x";
++ mediatek,switch = "mt7531";
++ reset-gpios = <&gpio 5 GPIO_ACTIVE_HIGH>;
++
++ fixed-link {
++ speed = <2500>;
++ full-duplex;
++ };
++};
++
++&mmc0 {
++ bus-width = <8>;
++ cap-mmc-highspeed;
++ cap-mmc-hw-reset;
++ max-frequency = <200000000>;
++ non-removable;
++ pinctrl-names = "default";
++ pinctrl-0 = <&mmc0_pins_default>;
++ vmmc-supply = <&reg_3p3v>;
++ vqmmc-supply = <&reg_1p8v>;
++ status = "okay";
++};
++
++&pinctrl {
++ mmc0_pins_default: mmc0default {
++ mux {
++ function = "flash";
++ groups = "emmc_51";
++ };
++
++ conf-cmd-dat {
++ pins = "EMMC_DATA_0", "EMMC_DATA_1", "EMMC_DATA_2",
++ "EMMC_DATA_3", "EMMC_DATA_4", "EMMC_DATA_5",
++ "EMMC_DATA_6", "EMMC_DATA_7", "EMMC_CMD";
++ input-enable;
++ drive-strength = <MTK_DRIVE_4mA>;
++ bias-pull-up = <MTK_PUPD_SET_R1R0_01>;
++ };
++
++ conf-clk {
++ pins = "EMMC_CK";
++ drive-strength = <MTK_DRIVE_6mA>;
++ bias-pull-down = <MTK_PUPD_SET_R1R0_10>;
++ };
++
++ conf-dsl {
++ pins = "EMMC_DSL";
++ bias-pull-down = <MTK_PUPD_SET_R1R0_10>;
++ };
++
++ conf-rst {
++ pins = "EMMC_RSTB";
++ drive-strength = <MTK_DRIVE_4mA>;
++ bias-pull-up = <MTK_PUPD_SET_R1R0_01>;
++ };
++ };
++};
++
++&uart0 {
++ status = "okay";
++};
++
++&watchdog {
++ status = "disabled";
++};
+--- /dev/null
++++ b/jdcloud_re-cp-03_env
+@@ -0,0 +1,55 @@
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x46000000
++console=earlycon=uart8250,mmio32,0x11002000 console=ttyS0
++bootargs=root=/dev/mmcblk0p65
++bootcmd=if pstore check ; then run boot_recovery ; else run boot_emmc ; fi
++bootconf=config-1
++bootdelay=0
++bootfile=openwrt-mediatek-filogic-jdcloud_re-cp-03-initramfs-recovery.itb
++bootfile_bl2=openwrt-mediatek-filogic-jdcloud_re-cp-03-preloader.bin
++bootfile_fip=openwrt-mediatek-filogic-jdcloud_re-cp-03-bl31-uboot.fip
++bootfile_upg=openwrt-mediatek-filogic-jdcloud_re-cp-03-squashfs-sysupgrade.itb
++bootled_pwr=red:status
++bootled_rec=blue:status
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_default=0
++bootmenu_delay=0
++bootmenu_title= ( ( ( OpenWrt ) ) )
++bootmenu_0=Initialize environment.=run _firstboot
++bootmenu_0d=Run default boot command.=run boot_default
++bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
++bootmenu_2=Boot production system from eMMC.=run boot_production ; run bootmenu_confirm_return
++bootmenu_3=Boot recovery system from eMMC.=run boot_recovery ; run bootmenu_confirm_return
++bootmenu_4=Load production system via TFTP then write to eMMC.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_5=Load recovery system via TFTP then write to eMMC.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_6=Load BL31+U-Boot FIP via TFTP then write to eMMC.=run boot_tftp_write_fip ; run bootmenu_confirm_return
++bootmenu_7=Load BL2 preloader via TFTP then write to eMMC.=run boot_tftp_write_bl2 ; run bootmenu_confirm_return
++bootmenu_8=Reboot.=reset
++bootmenu_9=Reset all settings to factory defaults.=run reset_factory ; reset
++boot_first=if button reset ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
++boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
++boot_production=led $bootled_pwr on ; run emmc_read_production && bootm $loadaddr#$bootconf ; led $bootled_pwr off
++boot_recovery=led $bootled_rec on ; run emmc_read_recovery && bootm $loadaddr#$bootconf ; led $bootled_rec off
++boot_emmc=run boot_production ; run boot_recovery
++boot_tftp_forever=led $bootled_rec on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done
++boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run emmc_write_production ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run emmc_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run emmc_write_fip
++boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run emmc_write_bl2
++boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr#$bootconf
++mmc_write_vol=imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc erase 0x$part_addr 0x$image_size && mmc write $loadaddr 0x$part_addr 0x$image_size
++mmc_read_vol=mmc read $loadaddr $part_addr 0x100 && imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc read $loadaddr 0x$part_addr 0x$image_size && setexpr filesize $image_size * 0x200
++part_default=production
++part_recovery=recovery
++reset_factory=eraseenv && reset
++emmc_read_production=part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_read_vol
++emmc_read_recovery=part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_read_vol
++emmc_write_bl2=mmc partconf 0 1 1 1 && mmc erase 0x0 0x400 && mmc write $fileaddr 0x0 0x400 ; mmc partconf 0 1 1 0
++emmc_write_fip=mmc erase 0x3400 0x2000 && mmc write $fileaddr 0x3400 0x2000 && mmc erase 0x2000 0x800
++emmc_write_production=part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_write_vol
++emmc_write_recovery=part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_write_vol
++_init_env=setenv _init_env ; setenv _create_env ; saveenv ; saveenv
++_firstboot=setenv _firstboot ; run _switch_to_menu ; run _init_env ; run boot_first
++_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
++_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
diff --git a/package/boot/uboot-mediatek/patches/440-add-xiaomi_mi-router-ax3000t.patch b/package/boot/uboot-mediatek/patches/440-add-xiaomi_mi-router-ax3000t.patch
new file mode 100644
index 00000000000..9b50166a941
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/440-add-xiaomi_mi-router-ax3000t.patch
@@ -0,0 +1,414 @@
+--- /dev/null
++++ b/configs/mt7981_xiaomi_mi-router-ax3000t_defconfig
+@@ -0,0 +1,163 @@
++CONFIG_ARM=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TARGET_MT7981=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_NR_DRAM_BANKS=1
++CONFIG_DEFAULT_DEVICE_TREE="mt7981_xiaomi_mi-router-ax3000t"
++CONFIG_DEFAULT_ENV_FILE="xiaomi_mi-router-ax3000t_env"
++CONFIG_DEFAULT_FDT_FILE="mediatek/mt7981_xiaomi_mi-router-ax3000t.dtb"
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_DEBUG_UART_BASE=0x11002000
++CONFIG_DEBUG_UART_CLOCK=40000000
++CONFIG_DEBUG_UART=y
++CONFIG_SYS_LOAD_ADDR=0x46000000
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_BOOTDELAY=30
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_LOGLEVEL=7
++CONFIG_LOG=y
++CONFIG_SYS_PROMPT="MT7981> "
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++# CONFIG_CMD_EXT4 is not set
++# CONFIG_CMD_FAT is not set
++CONFIG_CMD_FDT=y
++# CONFIG_CMD_FS_GENERIC is not set
++# CONFIG_CMD_FS_UUID is not set
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_GPT=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++# CONFIG_CMD_MBR is not set
++CONFIG_CMD_MTD=y
++# CONFIG_CMD_PCI is not set
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
++# CONFIG_CMD_PWM is not set
++CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_UBI=y
++CONFIG_CMD_UBI_RENAME=y
++CONFIG_CMD_UBIFS=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_PART=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++# CONFIG_CMD_USB is not set
++# CONFIG_CMD_FLASH is not set
++CONFIG_CMD_UUID=y
++CONFIG_DISPLAY_CPUINFO=y
++CONFIG_DM_MTD=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++# CONFIG_DM_USB is not set
++# CONFIG_DM_PWM is not set
++# CONFIG_PWM_MTK is not set
++CONFIG_HUSH_PARSER=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_VERSION_VARIABLE=y
++CONFIG_PARTITION_UUIDS=y
++CONFIG_NETCONSOLE=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_DM_GPIO=y
++# CONFIG_DM_SCSI is not set
++# CONFIG_AHCI is not set
++CONFIG_PHY=y
++# CONFIG_PHY_MTK_TPHY is not set
++CONFIG_PHY_FIXED=y
++CONFIG_MTK_AHCI=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++# CONFIG_PCI is not set
++# CONFIG_MMC is not set
++# CONFIG_DM_MMC is not set
++CONFIG_MTD=y
++CONFIG_MTD_UBI_FASTMAP=y
++# CONFIG_DM_PCI is not set
++# CONFIG_PCIE_MEDIATEK is not set
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7981=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_RAM=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_SPI=y
++CONFIG_DM_SPI=y
++CONFIG_MTK_SPI_NAND=y
++CONFIG_MTK_SPI_NAND_MTD=y
++CONFIG_SYSRESET_WATCHDOG=y
++CONFIG_WDT_MTK=y
++CONFIG_LZO=y
++CONFIG_ZSTD=y
++CONFIG_HEXDUMP=y
++CONFIG_RANDOM_UUID=y
++CONFIG_REGEX=y
++# CONFIG_USB is not set
++# CONFIG_USB_HOST is not set
++# CONFIG_USB_XHCI_HCD is not set
++# CONFIG_USB_XHCI_MTK is not set
++# CONFIG_USB_STORAGE is not set
++CONFIG_OF_EMBED=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_IS_IN_UBI=y
++CONFIG_ENV_UBI_PART="ubi"
++CONFIG_ENV_SIZE=0x1f000
++CONFIG_ENV_SIZE_REDUND=0x1f000
++CONFIG_ENV_UBI_VOLUME="ubootenv"
++CONFIG_ENV_UBI_VOLUME_REDUND="ubootenv2"
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_USE_DEFAULT_ENV_FILE=y
++CONFIG_MTD_SPI_NAND=y
++CONFIG_MTK_SPIM=y
++CONFIG_CMD_NAND=y
++CONFIG_CMD_NAND_TRIMFFS=y
++CONFIG_LMB_MAX_REGIONS=64
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
+--- /dev/null
++++ b/arch/arm/dts/mt7981_xiaomi_mi-router-ax3000t.dts
+@@ -0,0 +1,187 @@
++// SPDX-License-Identifier: GPL-2.0
++/*
++ * Copyright (c) 2022 MediaTek Inc.
++ * Author: Sam Shih <sam.shih@mediatek.com>
++ */
++
++/dts-v1/;
++#include "mt7981.dtsi"
++#include <dt-bindings/gpio/gpio.h>
++#include <dt-bindings/input/linux-event-codes.h>
++
++/ {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ model = "Xiaomi Router AX3000T";
++ compatible = "mediatek,mt7981", "mediatek,mt7981-rfb";
++
++ chosen {
++ stdout-path = &uart0;
++ tick-timer = &timer0;
++ };
++
++ memory@40000000 {
++ device_type = "memory";
++ reg = <0x40000000 0x10000000>;
++ };
++
++ gpio-keys {
++ compatible = "gpio-keys";
++
++ reset {
++ label = "reset";
++ gpios = <&gpio 1 GPIO_ACTIVE_LOW>;
++ linux,code = <KEY_RESTART>;
++ };
++
++ mesh {
++ label = "mesh";
++ gpios = <&gpio 0 GPIO_ACTIVE_LOW>;
++ linux,code = <BTN_9>;
++ linux,input-type = <EV_SW>;
++ };
++ };
++
++ leds {
++ compatible = "gpio-leds";
++
++ led_status_blue {
++ label = "blue:status";
++ gpios = <&gpio 9 GPIO_ACTIVE_LOW>;
++ };
++
++ led_status_yellow {
++ label = "yellow:status";
++ gpios = <&gpio 10 GPIO_ACTIVE_LOW>;
++ };
++ };
++};
++
++&uart0 {
++ mediatek,force-highspeed;
++ status = "okay";
++};
++
++&eth {
++ status = "okay";
++ mediatek,gmac-id = <0>;
++ phy-mode = "2500base-x";
++ mediatek,switch = "mt7531";
++ reset-gpios = <&gpio 39 GPIO_ACTIVE_HIGH>;
++
++ fixed-link {
++ speed = <2500>;
++ full-duplex;
++ };
++};
++
++&pinctrl {
++ spic_pins: spi1-pins-func-1 {
++ mux {
++ function = "spi";
++ groups = "spi1_1";
++ };
++ };
++
++ uart1_pins: spi1-pins-func-3 {
++ mux {
++ function = "uart";
++ groups = "uart1_2";
++ };
++ };
++
++ spi_flash_pins: spi0-pins-func-1 {
++ mux {
++ function = "flash";
++ groups = "spi0", "spi0_wp_hold";
++ };
++
++ conf-pu {
++ pins = "SPI0_CS", "SPI0_HOLD", "SPI0_WP";
++ drive-strength = <MTK_DRIVE_8mA>;
++ bias-pull-up = <MTK_PUPD_SET_R1R0_11>;
++ };
++
++ conf-pd {
++ pins = "SPI0_CLK", "SPI0_MOSI", "SPI0_MISO";
++ drive-strength = <MTK_DRIVE_8mA>;
++ bias-pull-down = <MTK_PUPD_SET_R1R0_11>;
++ };
++ };
++};
++
++&spi0 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ pinctrl-names = "default";
++ pinctrl-0 = <&spi_flash_pins>;
++ status = "okay";
++ must_tx;
++ enhance_timing;
++ dma_ext;
++ ipm_design;
++ support_quad;
++ tick_dly = <2>;
++ sample_sel = <0>;
++
++ spi_nand@0 {
++ compatible = "spi-nand";
++ reg = <0>;
++ spi-max-frequency = <52000000>;
++
++ partitions {
++ compatible = "fixed-partitions";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ partition@0 {
++ label = "bl2";
++ reg = <0x00 0x100000>;
++ };
++
++ partition@100000 {
++ label = "Nvram";
++ reg = <0x100000 0x40000>;
++ };
++
++ partition@140000 {
++ label = "Bdata";
++ reg = <0x140000 0x40000>;
++ };
++
++ partition@180000 {
++ label = "factory";
++ reg = <0x180000 0x200000>;
++ };
++
++ partition@380000 {
++ label = "fip";
++ reg = <0x380000 0x200000>;
++ };
++
++ partition@580000 {
++ label = "crash";
++ reg = <0x580000 0x40000>;
++ };
++
++ partition@5c0000 {
++ label = "crash_log";
++ reg = <0x5c0000 0x40000>;
++ };
++
++ partition@600000 {
++ label = "ubi";
++ reg = <0x600000 0x7000000>;
++ };
++
++ partition@7600000 {
++ label = "KF";
++ reg = <0x7600000 0x40000>;
++ };
++ };
++ };
++};
++
++&watchdog {
++ status = "disabled";
++};
+--- /dev/null
++++ b/xiaomi_mi-router-ax3000t_env
+@@ -0,0 +1,55 @@
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x46000000
++console=earlycon=uart8250,mmio32,0x11002000 console=ttyS0
++bootargs=console=ttyS0,115200n8 console_msg_format=syslog
++bootcmd=if pstore check ; then run boot_recovery ; else run boot_ubi ; fi
++bootconf=config-1
++bootdelay=0
++bootfile=openwrt-mediatek-filogic-xiaomi_mi-router-ax3000t-ubootmod-initramfs-recovery.itb
++bootfile_bl2=openwrt-mediatek-filogic-xiaomi_mi-router-ax3000t-ubootmod-preloader.bin
++bootfile_fip=openwrt-mediatek-filogic-xiaomi_mi-router-ax3000t-ubootmod-bl31-uboot.fip
++bootfile_upg=openwrt-mediatek-filogic-xiaomi_mi-router-ax3000t-ubootmod-squashfs-sysupgrade.itb
++bootled_pwr=yellow:status
++bootled_rec=blue:status
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_default=0
++bootmenu_delay=0
++bootmenu_title= ( ( ( OpenWrt ) ) )
++bootmenu_0=Initialize environment.=run _firstboot
++bootmenu_0d=Run default boot command.=run boot_default
++bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
++bootmenu_2=Boot production system from NAND.=run boot_production ; run bootmenu_confirm_return
++bootmenu_3=Boot recovery system from NAND.=run boot_recovery ; run bootmenu_confirm_return
++bootmenu_4=Load production system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_5=Load recovery system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_6=Load BL31+U-Boot FIP via TFTP then write to NAND.=run boot_tftp_write_fip ; run bootmenu_confirm_return
++bootmenu_7=Load BL2 preloader via TFTP then write to NAND.=run boot_tftp_write_bl2 ; run bootmenu_confirm_return
++bootmenu_8=Reboot.=reset
++bootmenu_9=Reset all settings to factory defaults.=run reset_factory ; reset
++boot_first=if button reset ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
++boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
++boot_production=led $bootled_pwr on ; run ubi_read_production && bootm $loadaddr#$bootconf ; led $bootled_pwr off
++boot_recovery=led $bootled_rec on ; run ubi_read_recovery && bootm $loadaddr#$bootconf ; led $bootled_rec off
++boot_ubi=run boot_production ; run boot_recovery ; run boot_tftp_forever
++boot_tftp_forever=led $bootled_rec on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done
++boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run ubi_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run ubi_write_production ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr#$bootconf
++boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run mtd_write_fip && run reset_factory
++boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run mtd_write_bl2
++reset_factory=ubi part ubi ; mw $loadaddr 0x0 0x800 ; ubi write $loadaddr ubootenv 0x800 ; ubi write $loadaddr ubootenv2 0x800
++mtd_write_fip=mtd erase fip && mtd write fip $loadaddr
++mtd_write_bl2=mtd erase bl2 && mtd write bl2 $loadaddr
++ubi_create_env=ubi check ubootenv || ubi create ubootenv 0x100000 dynamic 0 || run ubi_format ; ubi check ubootenv2 || ubi create ubootenv2 0x100000 dynamic 1 || run ubi_format
++ubi_format=ubi detach ; mtd erase ubi && ubi part ubi ; reset
++ubi_prepare_rootfs=if ubi check rootfs_data ; then else if env exists rootfs_data_max ; then ubi create rootfs_data $rootfs_data_max dynamic || ubi create rootfs_data - dynamic ; else ubi create rootfs_data - dynamic ; fi ; fi
++ubi_read_production=ubi read $loadaddr fit && iminfo $loadaddr && run ubi_prepare_rootfs
++ubi_read_recovery=ubi check recovery && ubi read $loadaddr recovery
++ubi_remove_rootfs=ubi check rootfs_data && ubi remove rootfs_data
++ubi_write_production=ubi check fit && ubi remove fit ; run ubi_remove_rootfs ; ubi create fit $filesize dynamic 2 && ubi write $loadaddr fit $filesize
++ubi_write_recovery=ubi check recovery && ubi remove recovery ; run ubi_remove_rootfs ; ubi create recovery $filesize dynamic 3 && ubi write $loadaddr recovery $filesize
++_init_env=setenv _init_env ; run ubi_create_env ; saveenv ; saveenv
++_firstboot=setenv _firstboot ; run _switch_to_menu ; run _init_env ; run boot_first
++_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
++_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
diff --git a/package/boot/uboot-mediatek/patches/442-add-bpi-r3-mini.patch b/package/boot/uboot-mediatek/patches/442-add-bpi-r3-mini.patch
new file mode 100644
index 00000000000..e54220878c2
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/442-add-bpi-r3-mini.patch
@@ -0,0 +1,779 @@
+--- /dev/null
++++ b/configs/mt7986a_bpi-r3-mini-emmc_defconfig
+@@ -0,0 +1,203 @@
++CONFIG_ARM=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TARGET_MT7986=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_NR_DRAM_BANKS=1
++CONFIG_DEFAULT_DEVICE_TREE="mt7986a-bpi-r3-mini"
++CONFIG_DEFAULT_ENV_FILE="bananapi_bpi-r3-mini_emmc_env"
++CONFIG_DEFAULT_FDT_FILE="mediatek/mt7986a-bpi-r3-mini.dtb"
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_OF_SYSTEM_SETUP=y
++CONFIG_DEBUG_UART_BASE=0x11002000
++CONFIG_DEBUG_UART_CLOCK=40000000
++CONFIG_DEBUG_UART=y
++CONFIG_SYS_LOAD_ADDR=0x46000000
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_BOOTDELAY=30
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_LOGLEVEL=7
++CONFIG_LOG=y
++CONFIG_SYS_PROMPT="MT7986> "
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_EXT4=y
++CONFIG_CMD_FAT=y
++CONFIG_CMD_FDT=y
++CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_FS_UUID=y
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_GPT=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++# CONFIG_CMD_MBR is not set
++CONFIG_CMD_MDIO=y
++CONFIG_CMD_MII=y
++CONFIG_CMD_MMC=y
++CONFIG_CMD_MTD=y
++CONFIG_CMD_PCI=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
++CONFIG_CMD_PWM=y
++CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_UBI=y
++CONFIG_CMD_UBI_RENAME=y
++CONFIG_CMD_UBIFS=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_PART=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_USB=y
++CONFIG_CMD_UUID=y
++CONFIG_DISPLAY_CPUINFO=y
++CONFIG_DM_MDIO=y
++CONFIG_DM_MMC=y
++CONFIG_DM_MTD=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++CONFIG_DM_USB=y
++CONFIG_DM_PWM=y
++CONFIG_PWM_MTK=y
++CONFIG_HUSH_PARSER=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_VERSION_VARIABLE=y
++CONFIG_PARTITION_UUIDS=y
++CONFIG_NETCONSOLE=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_DM_GPIO=y
++CONFIG_DM_SCSI=y
++CONFIG_AHCI=y
++CONFIG_AHCI_PCI=y
++CONFIG_SCSI_AHCI=y
++CONFIG_SCSI=y
++CONFIG_CMD_SCSI=y
++CONFIG_PHY=y
++CONFIG_PHY_MTK_TPHY=y
++CONFIG_PHY_ETHERNET_ID=y
++CONFIG_PHY_FIXED=y
++CONFIG_MTK_AHCI=y
++CONFIG_DM_ETH=y
++CONFIG_DM_ETH_PHY=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PHY_AIROHA=y
++CONFIG_PHY_AIROHA_EN8811H=y
++CONFIG_PHY_AIROHA_FW_IN_MMC=y
++CONFIG_PCI=y
++CONFIG_MTD=y
++CONFIG_MTD_UBI_FASTMAP=y
++CONFIG_DM_PCI=y
++CONFIG_PCIE_MEDIATEK=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7622=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_RAM=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_MMC=y
++CONFIG_MMC_DEFAULT_DEV=1
++CONFIG_MMC_HS200_SUPPORT=y
++CONFIG_MMC_MTK=y
++CONFIG_MMC_SUPPORTS_TUNING=y
++CONFIG_SUPPORT_EMMC_BOOT=y
++CONFIG_SPI=y
++CONFIG_DM_SPI=y
++CONFIG_MTK_SPI_NAND=y
++CONFIG_MTK_SPI_NAND_MTD=y
++CONFIG_SYSRESET_WATCHDOG=y
++CONFIG_WDT_MTK=y
++CONFIG_LZO=y
++CONFIG_ZSTD=y
++CONFIG_HEXDUMP=y
++CONFIG_RANDOM_UUID=y
++CONFIG_REGEX=y
++CONFIG_USB=y
++CONFIG_USB_HOST=y
++CONFIG_USB_XHCI_HCD=y
++CONFIG_USB_XHCI_MTK=y
++CONFIG_USB_STORAGE=y
++CONFIG_OF_EMBED=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_IS_IN_MMC=y
++CONFIG_ENV_OFFSET=0x400000
++CONFIG_ENV_OFFSET_REDUND=0x440000
++CONFIG_ENV_SIZE=0x40000
++CONFIG_ENV_SIZE_REDUND=0x40000
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_SUPPORT_EMMC_BOOT=y
++CONFIG_MMC_HS200_SUPPORT=y
++CONFIG_MMC_MTK=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7986=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_HEXDUMP=y
++CONFIG_USE_DEFAULT_ENV_FILE=y
++CONFIG_MTD_SPI_NAND=y
++CONFIG_MTK_SPIM=y
++#CONFIG_MTK_SNOR=y
++CONFIG_DM_SPI_FLASH=y
++CONFIG_SPI_FLASH_MTD=y
++CONFIG_SPI_FLASH_WINBOND=y
++# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set
++CONFIG_CMD_SF=y
++CONFIG_CMD_NAND=y
++CONFIG_CMD_NAND_TRIMFFS=y
++CONFIG_LMB_MAX_REGIONS=64
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
+--- /dev/null
++++ b/configs/mt7986a_bpi-r3-mini-snand_defconfig
+@@ -0,0 +1,203 @@
++CONFIG_ARM=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TARGET_MT7986=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_NR_DRAM_BANKS=1
++CONFIG_DEFAULT_DEVICE_TREE="mt7986a-bpi-r3-mini"
++CONFIG_DEFAULT_ENV_FILE="bananapi_bpi-r3-mini_snand_env"
++CONFIG_DEFAULT_FDT_FILE="mediatek/mt7986a-bpi-r3-mini.dtb"
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_OF_SYSTEM_SETUP=y
++CONFIG_DEBUG_UART_BASE=0x11002000
++CONFIG_DEBUG_UART_CLOCK=40000000
++CONFIG_DEBUG_UART=y
++CONFIG_SYS_LOAD_ADDR=0x46000000
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_BOOTDELAY=30
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_LOGLEVEL=7
++CONFIG_LOG=y
++CONFIG_SYS_PROMPT="MT7986> "
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_EXT4=y
++CONFIG_CMD_FAT=y
++CONFIG_CMD_FDT=y
++CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_FS_UUID=y
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_GPT=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++# CONFIG_CMD_MBR is not set
++CONFIG_CMD_MDIO=y
++CONFIG_CMD_MII=y
++CONFIG_CMD_MMC=y
++CONFIG_CMD_MTD=y
++CONFIG_CMD_PCI=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
++CONFIG_CMD_PWM=y
++CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_UBI=y
++CONFIG_CMD_UBI_RENAME=y
++CONFIG_CMD_UBIFS=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_PART=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_USB=y
++CONFIG_CMD_UUID=y
++CONFIG_DISPLAY_CPUINFO=y
++CONFIG_DM_MMC=y
++CONFIG_DM_MTD=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++CONFIG_DM_USB=y
++CONFIG_DM_PWM=y
++CONFIG_PWM_MTK=y
++CONFIG_HUSH_PARSER=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_VERSION_VARIABLE=y
++CONFIG_PARTITION_UUIDS=y
++CONFIG_NETCONSOLE=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_DM_GPIO=y
++CONFIG_DM_SCSI=y
++CONFIG_AHCI=y
++CONFIG_AHCI_PCI=y
++CONFIG_SCSI_AHCI=y
++CONFIG_SCSI=y
++CONFIG_CMD_SCSI=y
++CONFIG_DM_MDIO=y
++CONFIG_PHY=y
++CONFIG_PHY_MTK_TPHY=y
++CONFIG_PHY_ETHERNET_ID=y
++CONFIG_PHY_FIXED=y
++CONFIG_MTK_AHCI=y
++CONFIG_DM_ETH=y
++CONFIG_DM_ETH_PHY=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PCI=y
++CONFIG_MTD=y
++CONFIG_MTD_UBI_FASTMAP=y
++CONFIG_DM_PCI=y
++CONFIG_PCIE_MEDIATEK=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7622=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_RAM=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_MMC=y
++CONFIG_MMC_DEFAULT_DEV=1
++CONFIG_MMC_HS200_SUPPORT=y
++CONFIG_MMC_MTK=y
++CONFIG_MMC_SUPPORTS_TUNING=y
++CONFIG_SUPPORT_EMMC_BOOT=y
++CONFIG_SPI=y
++CONFIG_DM_SPI=y
++CONFIG_MTK_SPI_NAND=y
++CONFIG_MTK_SPI_NAND_MTD=y
++CONFIG_SYSRESET_WATCHDOG=y
++CONFIG_WDT_MTK=y
++CONFIG_LZO=y
++CONFIG_ZSTD=y
++CONFIG_HEXDUMP=y
++CONFIG_RANDOM_UUID=y
++CONFIG_REGEX=y
++CONFIG_USB=y
++CONFIG_USB_HOST=y
++CONFIG_USB_XHCI_HCD=y
++CONFIG_USB_XHCI_MTK=y
++CONFIG_USB_STORAGE=y
++CONFIG_OF_EMBED=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_IS_IN_UBI=y
++CONFIG_ENV_UBI_PART="ubi"
++CONFIG_ENV_SIZE=0x1f000
++CONFIG_ENV_SIZE_REDUND=0x1f000
++CONFIG_ENV_UBI_VOLUME="ubootenv"
++CONFIG_ENV_UBI_VOLUME_REDUND="ubootenv2"
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_SUPPORT_EMMC_BOOT=y
++CONFIG_MMC_HS200_SUPPORT=y
++CONFIG_MMC_MTK=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PHY_AIROHA=y
++CONFIG_PHY_AIROHA_EN8811H=y
++CONFIG_PHY_AIROHA_FW_IN_UBI=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7986=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_HEXDUMP=y
++CONFIG_USE_DEFAULT_ENV_FILE=y
++CONFIG_MTD_SPI_NAND=y
++CONFIG_MTK_SPIM=y
++#CONFIG_MTK_SNOR=y
++#CONFIG_DM_SPI_FLASH=y
++#CONFIG_SPI_FLASH_MTD=y
++#CONFIG_SPI_FLASH_WINBOND=y
++# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set
++#CONFIG_CMD_SF=y
++CONFIG_CMD_NAND=y
++CONFIG_CMD_NAND_TRIMFFS=y
++CONFIG_LMB_MAX_REGIONS=64
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
+--- /dev/null
++++ b/bananapi_bpi-r3-mini_snand_env
+@@ -0,0 +1,61 @@
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x46000000
++console=earlycon=uart8250,mmio32,0x11002000 console=ttyS0
++bootargs=root=ubi.block=0,fit root=/dev/fit0
++bootcmd=if pstore check ; then run boot_recovery ; else run boot_ubi ; fi
++bootconf=config-mt7986a-bananapi-bpi-r3-mini
++bootdelay=0
++bootfile=openwrt-mediatek-filogic-bananapi_bpi-r3-mini-initramfs-recovery.itb
++bootfile_bl2=openwrt-mediatek-filogic-bananapi_bpi-r3-mini-snand-preloader.bin
++bootfile_fip=openwrt-mediatek-filogic-bananapi_bpi-r3-mini-snand-bl31-uboot.fip
++bootfile_upg=openwrt-mediatek-filogic-bananapi_bpi-r3-mini-squashfs-sysupgrade.itb
++bootfile_en8811h_fw=EthMD32.bin
++bootled_pwr=green:status
++bootled_rec=blue:status
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_default=0
++bootmenu_delay=0
++bootmenu_title= ( ( ( OpenWrt ) ) ) [SPI-NAND]
++bootmenu_0=Initialize environment.=run _firstboot
++bootmenu_0d=Run default boot command.=run boot_default
++bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
++bootmenu_2=Boot production system from NAND.=run boot_production ; run bootmenu_confirm_return
++bootmenu_3=Boot recovery system from NAND.=run boot_recovery ; run bootmenu_confirm_return
++bootmenu_4=Load production system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_5=Load recovery system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_6=Load Airoha EN8811H firmware via TFTP then write to NAND.=run boot_tftp_write_en8811h_fw ; run bootmenu_confirm_return
++bootmenu_7=Load BL31+U-Boot FIP via TFTP then write to NAND.=run boot_tftp_write_fip ; run bootmenu_confirm_return
++bootmenu_8=Load BL2 preloader via TFTP then write to NAND.=run boot_tftp_write_bl2 ; run bootmenu_confirm_return
++bootmenu_9=Reboot.=reset
++bootmenu_10=Reset all settings to factory defaults.=run reset_factory ; reset
++boot_first=if button reset ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
++boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
++boot_production=led $bootled_pwr on ; run ubi_read_production && bootm $loadaddr#$bootconf ; led $bootled_pwr off
++boot_recovery=led $bootled_rec on ; run ubi_read_recovery && bootm $loadaddr#$bootconf ; led $bootled_rec off
++boot_ubi=run boot_production ; run boot_recovery
++boot_tftp_forever=led $bootled_rec on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done
++boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run ubi_write_production ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run ubi_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr#$bootconf
++boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run ubi_write_fip && run reset_factory
++boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run snand_write_bl2
++boot_tftp_write_en8811h_fw=tftpboot $loadaddr $bootfile_en8811h_fw && run ubi_write_en8811h_fw
++part_default=production
++part_recovery=recovery
++reset_factory=mw $loadaddr 0xff 0x1f000 ; ubi write $loadaddr ubootenv 0x1f000 ; ubi write $loadaddr ubootenv2 0x1f000 ; ubi remove rootfs_data
++snand_write_bl2=mtd erase bl2 && mtd write bl2 $loadaddr 0x0 0x40000 && mtd write bl2 $loadaddr 0x40000 0x40000 && mtd write bl2 $loadaddr 0x80000 0x40000 && mtd write bl2 $loadaddr 0xc0000 0x40000
++ubi_create_env=ubi check ubootenv || ubi create ubootenv 0x1f000 dynamic ; ubi check ubootenv2 || ubi create ubootenv2 0x1f000 dynamic
++ubi_prepare_rootfs=if ubi check rootfs_data ; then else if env exists rootfs_data_max ; then ubi create rootfs_data $rootfs_data_max dynamic || ubi create rootfs_data - dynamic ; else ubi create rootfs_data - dynamic ; fi ; fi
++ubi_read_production=ubi read $loadaddr fit && iminfo $loadaddr && run ubi_prepare_rootfs
++ubi_read_recovery=ubi check recovery && ubi read $loadaddr recovery
++ubi_read_emmc_install=ubi check emmc_install && ubi read $loadaddr emmc_install
++ubi_remove_rootfs=ubi check rootfs_data && ubi remove rootfs_data
++ubi_write_fip=ubi check fip && ubi remove fip ; ubi create fip 0x200000 static ; ubi write $loadaddr fip 0x200000
++ubi_write_en8811h_fw=ubi check en8811h-fw && ubi remove en8811h-fw ; ubi create en8811h-fw 0x24000 static ; ubi write $loadaddr en8811h-fw 0x24000
++ubi_write_production=ubi check fit && ubi remove fit ; run ubi_remove_rootfs ; ubi create fit $filesize dynamic && ubi write $loadaddr fit $filesize
++ubi_write_recovery=ubi check recovery && ubi remove recovery ; run ubi_remove_rootfs ; ubi create recovery $filesize dynamic && ubi write $loadaddr recovery $filesize
++_init_env=setenv _init_env ; run ubi_create_env ; saveenv ; saveenv
++_firstboot=setenv _firstboot ; run _switch_to_menu ; run _init_env ; run boot_first
++_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
++_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
+--- /dev/null
++++ b/bananapi_bpi-r3-mini_emmc_env
+@@ -0,0 +1,59 @@
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x46000000
++console=earlycon=uart8250,mmio32,0x11002000 console=ttyS0
++bootargs=root=/dev/fit0
++bootcmd=if pstore check ; then run boot_recovery ; else run boot_emmc ; fi
++bootconf=config-mt7986a-bananapi-bpi-r3-mini
++bootdelay=0
++bootfile=openwrt-mediatek-filogic-bananapi_bpi-r3-mini-initramfs-recovery.itb
++bootfile_bl2=openwrt-mediatek-filogic-bananapi_bpi-r3-mini-emmc-preloader.bin
++bootfile_fip=openwrt-mediatek-filogic-bananapi_bpi-r3-mini-emmc-bl31-uboot.fip
++bootfile_upg=openwrt-mediatek-filogic-bananapi_bpi-r3-mini-squashfs-sysupgrade.itb
++bootfile_en8811h_fw=EthMD32.bin
++bootled_pwr=green:status
++bootled_rec=blue:status
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_default=0
++bootmenu_delay=0
++bootmenu_title= ( ( ( OpenWrt ) ) ) [eMMC]
++bootmenu_0=Initialize environment.=run _firstboot
++bootmenu_0d=Run default boot command.=run boot_default
++bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
++bootmenu_2=Boot production system from eMMC.=run boot_production ; run bootmenu_confirm_return
++bootmenu_3=Boot recovery system from eMMC.=run boot_recovery ; run bootmenu_confirm_return
++bootmenu_4=Load production system via TFTP then write to eMMC.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_5=Load recovery system via TFTP then write to eMMC.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_6=Load Airoha EN8811H firmware via TFTP then write to eMMC.=run boot_tftp_write_en8811h_fw ; run bootmenu_confirm_return
++bootmenu_7=Load BL31+U-Boot FIP via TFTP then write to eMMC.=run boot_tftp_write_fip ; run bootmenu_confirm_return
++bootmenu_8=Load BL2 preloader via TFTP then write to eMMC.=run boot_tftp_write_bl2 ; run bootmenu_confirm_return
++bootmenu_9=Reboot.=reset
++bootmenu_10=Reset all settings to factory defaults.=run reset_factory ; reset
++boot_first=if button reset ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
++boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
++boot_production=led $bootled_pwr on ; run emmc_read_production && bootm $loadaddr#$bootconf ; led $bootled_pwr off
++boot_recovery=led $bootled_rec on ; run emmc_read_recovery && bootm $loadaddr#$bootconf ; led $bootled_rec off
++boot_emmc=run boot_production ; run boot_recovery
++boot_tftp_forever=led $bootled_rec on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done
++boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run emmc_write_production ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run emmc_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run emmc_write_fip
++boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run emmc_write_bl2
++boot_tftp_write_en8811h_fw=tftpboot $loadaddr $bootfile_en8811h_fw && run emmc_write_en8811h_fw
++boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr#$bootconf
++mmc_write_vol=imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc erase 0x$part_addr 0x$image_size && mmc write $loadaddr 0x$part_addr 0x$image_size
++mmc_read_vol=mmc read $loadaddr $part_addr 0x100 && imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc read $loadaddr 0x$part_addr 0x$image_size && setexpr filesize $image_size * 0x200
++part_default=production
++part_recovery=recovery
++reset_factory=eraseenv && reset
++emmc_read_production=part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_read_vol
++emmc_read_recovery=part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_read_vol
++emmc_write_en8811h_fw=mmc partconf 0 1 2 2 && mmc erase 0x0 0x120 && mmc write $fileaddr 0x0 0x120 ; mmc partconf 0 1 1 0
++emmc_write_bl2=mmc partconf 0 1 1 1 && mmc erase 0x0 0x400 && mmc write $fileaddr 0x0 0x400 ; mmc partconf 0 1 1 0
++emmc_write_fip=mmc erase 0x3400 0x2000 && mmc write $fileaddr 0x3400 0x2000 && mmc erase 0x2000 0x800
++emmc_write_production=part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_write_vol
++emmc_write_recovery=part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_write_vol
++_init_env=setenv _init_env ; setenv _create_env ; saveenv ; saveenv
++_firstboot=setenv _firstboot ; run _switch_to_menu ; run _init_env ; run boot_first
++_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
++_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
+--- /dev/null
++++ b/arch/arm/dts/mt7986a-bpi-r3-mini.dts
+@@ -0,0 +1,238 @@
++// SPDX-License-Identifier: GPL-2.0-or-later
++
++/dts-v1/;
++#include "mt7986.dtsi"
++#include <dt-bindings/gpio/gpio.h>
++#include <dt-bindings/input/linux-event-codes.h>
++
++/ {
++ #address-cells = <1>;
++ #size-cells = <1>;
++ model = "Bananapi BPi-R3 Mini";
++ compatible = "mediatek,mt7986", "mediatek,mt7986-rfb";
++
++ chosen {
++ stdout-path = &uart0;
++ tick-timer = &timer0;
++ };
++
++ memory@40000000 {
++ device_type = "memory";
++ reg = <0x40000000 0x80000000>;
++ };
++
++ gpio-keys {
++ compatible = "gpio-keys";
++
++ button-reset {
++ label = "reset";
++ linux,code = <KEY_RESTART>;
++ gpios = <&gpio 7 GPIO_ACTIVE_LOW>;
++ };
++ };
++
++ leds {
++ compatible = "gpio-leds";
++
++ status_led: led-0 {
++ label = "green:status";
++ gpios = <&gpio 19 GPIO_ACTIVE_HIGH>;
++ };
++
++ led-1 {
++ label = "blue:wlan2g";
++ gpios = <&gpio 1 GPIO_ACTIVE_HIGH>;
++ };
++
++ led-2 {
++ label = "blue:wlan5g";
++ gpios = <&gpio 2 GPIO_ACTIVE_HIGH>;
++ };
++ };
++
++ reg_1p8v: regulator-1p8v {
++ compatible = "regulator-fixed";
++ regulator-name = "fixed-1.8V";
++ regulator-min-microvolt = <1800000>;
++ regulator-max-microvolt = <1800000>;
++ regulator-boot-on;
++ regulator-always-on;
++ };
++
++ reg_3p3v: regulator-3p3v {
++ compatible = "regulator-fixed";
++ regulator-name = "fixed-3.3V";
++ regulator-min-microvolt = <3300000>;
++ regulator-max-microvolt = <3300000>;
++ regulator-boot-on;
++ regulator-always-on;
++ };
++};
++
++&eth {
++ status = "okay";
++ pinctrl-names = "default";
++ pinctrl-0 = <&mdio_pins>;
++
++ mediatek,gmac-id = <0>;
++ phy-mode = "2500base-x";
++ phy-handle = <&phy14>;
++
++ phy14: eth-phy@e {
++ compatible = "ethernet-phy-id03a2.a411";
++ reg = <14>;
++
++ airoha,rx-pol-reverse;
++
++ reset-gpios = <&gpio 49 GPIO_ACTIVE_LOW>;
++ reset-assert-us = <10000>;
++ reset-deassert-us = <20000>;
++ };
++};
++
++&mmc0 {
++ pinctrl-names = "default";
++ pinctrl-0 = <&mmc0_pins_default>;
++ bus-width = <8>;
++ max-frequency = <200000000>;
++ cap-mmc-highspeed;
++ cap-mmc-hw-reset;
++ vmmc-supply = <&reg_3p3v>;
++ vqmmc-supply = <&reg_1p8v>;
++ non-removable;
++ status = "okay";
++};
++
++&pinctrl {
++ mdio_pins: mdio-pins {
++ mux {
++ function = "eth";
++ groups = "mdc_mdio";
++ };
++
++ conf-en8811-pwr-a {
++ pins = "GPIO_11";
++ drive-strength = <MTK_DRIVE_8mA>;
++ bias-pull-down = <MTK_PUPD_SET_R1R0_11>;
++ output-low;
++ };
++
++ conf-en8811-pwr-b {
++ pins = "GPIO_12";
++ drive-strength = <MTK_DRIVE_8mA>;
++ bias-pull-down = <MTK_PUPD_SET_R1R0_11>;
++ output-low;
++ };
++ };
++
++ mmc0_pins_default: mmc0default {
++ mux {
++ function = "flash";
++ groups = "emmc_51";
++ };
++
++ conf-cmd-dat {
++ pins = "EMMC_DATA_0", "EMMC_DATA_1", "EMMC_DATA_2",
++ "EMMC_DATA_3", "EMMC_DATA_4", "EMMC_DATA_5",
++ "EMMC_DATA_6", "EMMC_DATA_7", "EMMC_CMD";
++ input-enable;
++ drive-strength = <MTK_DRIVE_4mA>;
++ bias-pull-up = <MTK_PUPD_SET_R1R0_01>;
++ };
++
++ conf-clk {
++ pins = "EMMC_CK";
++ drive-strength = <MTK_DRIVE_6mA>;
++ bias-pull-down = <MTK_PUPD_SET_R1R0_10>;
++ };
++
++ conf-dsl {
++ pins = "EMMC_DSL";
++ bias-pull-down = <MTK_PUPD_SET_R1R0_10>;
++ };
++
++ conf-rst {
++ pins = "EMMC_RSTB";
++ drive-strength = <MTK_DRIVE_4mA>;
++ bias-pull-up = <MTK_PUPD_SET_R1R0_01>;
++ };
++ };
++
++ spi_flash_pins: spi0-pins-func-1 {
++ mux {
++ function = "flash";
++ groups = "spi0", "spi0_wp_hold";
++ };
++
++ conf-pu {
++ pins = "SPI2_CS", "SPI2_HOLD", "SPI2_WP";
++ drive-strength = <MTK_DRIVE_8mA>;
++ bias-pull-up = <MTK_PUPD_SET_R1R0_11>;
++ };
++
++ conf-pd {
++ pins = "SPI2_CLK", "SPI2_MOSI", "SPI2_MISO";
++ drive-strength = <MTK_DRIVE_8mA>;
++ bias-pull-down = <MTK_PUPD_SET_R1R0_11>;
++ };
++ };
++
++ pwm_pins: pwm0-pins-func-1 {
++ mux {
++ function = "pwm";
++ groups = "pwm0";
++ };
++ };
++};
++
++&pwm {
++ pinctrl-names = "default";
++ pinctrl-0 = <&pwm_pins>;
++ status = "okay";
++};
++
++&spi0 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ pinctrl-names = "default";
++ pinctrl-0 = <&spi_flash_pins>;
++ status = "okay";
++ must_tx;
++ enhance_timing;
++ dma_ext;
++ ipm_design;
++ support_quad;
++ tick_dly = <1>;
++ sample_sel = <0>;
++
++ spi_nand@0 {
++ compatible = "spi-nand";
++ reg = <0>;
++ spi-max-frequency = <20000000>;
++
++ partitions {
++ compatible = "fixed-partitions";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ partition@0 {
++ label = "bl2";
++ reg = <0x0 0x200000>;
++ };
++
++ partition@200000 {
++ label = "ubi";
++ reg = <0x200000 0x7e00000>;
++ };
++ };
++ };
++
++};
++
++&uart0 {
++ status = "okay";
++};
++
++&watchdog {
++ status = "disabled";
++};
diff --git a/package/boot/uboot-mediatek/patches/450-add-bpi-r4.patch b/package/boot/uboot-mediatek/patches/450-add-bpi-r4.patch
new file mode 100644
index 00000000000..0f08c032946
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/450-add-bpi-r4.patch
@@ -0,0 +1,998 @@
+--- /dev/null
++++ b/configs/mt7988a_bananapi_bpi-r4-emmc_defconfig
+@@ -0,0 +1,180 @@
++CONFIG_ARM=y
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_NR_DRAM_BANKS=1
++CONFIG_SYS_PROMPT="MT7988> "
++CONFIG_TARGET_MT7988=y
++CONFIG_DEBUG_UART_BASE=0x11000000
++CONFIG_DEBUG_UART_CLOCK=40000000
++CONFIG_SYS_LOAD_ADDR=0x50000000
++CONFIG_DEBUG_UART=y
++CONFIG_SYS_CBSIZE=512
++CONFIG_SYS_PBSIZE=1049
++CONFIG_DEFAULT_DEVICE_TREE="mt7988a-bananapi-bpi-r4-emmc"
++CONFIG_DEFAULT_ENV_FILE="bananapi_bpi-r4_emmc_env"
++CONFIG_DEFAULT_FDT_FILE="mediatek/mt7988a-bpi-r4-emmc.dtb"
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_OF_SYSTEM_SETUP=y
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_BOOTDELAY=30
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_LOGLEVEL=7
++CONFIG_LOG=y
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_EXT4=y
++CONFIG_CMD_FAT=y
++CONFIG_CMD_FDT=y
++CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_FS_UUID=y
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_GPT=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++# CONFIG_CMD_MBR is not set
++CONFIG_CMD_MMC=y
++CONFIG_CMD_MTD=y
++CONFIG_CMD_PCI=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
++CONFIG_CMD_PWM=y
++CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_UBI=y
++CONFIG_CMD_UBI_RENAME=y
++CONFIG_CMD_UBIFS=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_PART=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_USB=y
++CONFIG_CMD_UUID=y
++CONFIG_DISPLAY_CPUINFO=y
++CONFIG_DM_MMC=y
++CONFIG_DM_MTD=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++CONFIG_DM_USB=y
++CONFIG_DM_PWM=y
++CONFIG_PWM_MTK=y
++CONFIG_HUSH_PARSER=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_VERSION_VARIABLE=y
++CONFIG_PARTITION_UUIDS=y
++CONFIG_NETCONSOLE=y
++CONFIG_DM_GPIO=y
++CONFIG_DM_SCSI=y
++CONFIG_AHCI=y
++CONFIG_AHCI_PCI=y
++CONFIG_SCSI_AHCI=y
++CONFIG_SCSI=y
++CONFIG_CMD_SCSI=y
++CONFIG_PHY=y
++CONFIG_PHY_MTK_TPHY=y
++CONFIG_MTK_AHCI=y
++CONFIG_PCI=y
++CONFIG_MTD=y
++CONFIG_MTD_UBI_FASTMAP=y
++CONFIG_DM_PCI=y
++CONFIG_PCIE_MEDIATEK=y
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_RAM=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_MMC=y
++CONFIG_MMC_DEFAULT_DEV=1
++CONFIG_MMC_SUPPORTS_TUNING=y
++CONFIG_SPI=y
++CONFIG_DM_SPI=y
++CONFIG_MTK_SPI_NAND=y
++CONFIG_MTK_SPI_NAND_MTD=y
++CONFIG_SYSRESET_WATCHDOG=y
++CONFIG_WDT_MTK=y
++CONFIG_LZO=y
++CONFIG_ZSTD=y
++CONFIG_HEXDUMP=y
++CONFIG_RANDOM_UUID=y
++CONFIG_REGEX=y
++CONFIG_USB=y
++CONFIG_USB_HOST=y
++CONFIG_USB_XHCI_HCD=y
++CONFIG_USB_XHCI_MTK=y
++CONFIG_USB_STORAGE=y
++CONFIG_OF_EMBED=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_IS_IN_MMC=y
++CONFIG_ENV_OFFSET=0x400000
++CONFIG_ENV_OFFSET_REDUND=0x440000
++CONFIG_ENV_SIZE=0x40000
++CONFIG_ENV_SIZE_REDUND=0x40000
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_SUPPORT_EMMC_BOOT=y
++CONFIG_MMC_HS200_SUPPORT=y
++CONFIG_MMC_MTK=y
++CONFIG_PHY_FIXED=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7988=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_USE_DEFAULT_ENV_FILE=y
++CONFIG_MTD_SPI_NAND=y
++CONFIG_MTK_SPIM=y
++#CONFIG_MTK_SNOR=y
++CONFIG_DM_SPI_FLASH=y
++CONFIG_SPI_FLASH_MTD=y
++CONFIG_SPI_FLASH_WINBOND=y
++# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set
++CONFIG_CMD_SF=y
++CONFIG_CMD_NAND=y
++CONFIG_CMD_NAND_TRIMFFS=y
++CONFIG_LMB_MAX_REGIONS=64
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
+--- /dev/null
++++ b/configs/mt7988a_bananapi_bpi-r4-sdmmc_defconfig
+@@ -0,0 +1,180 @@
++CONFIG_ARM=y
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_NR_DRAM_BANKS=1
++CONFIG_SYS_PROMPT="MT7988> "
++CONFIG_TARGET_MT7988=y
++CONFIG_DEBUG_UART_BASE=0x11000000
++CONFIG_DEBUG_UART_CLOCK=40000000
++CONFIG_SYS_LOAD_ADDR=0x50000000
++CONFIG_DEBUG_UART=y
++CONFIG_SYS_CBSIZE=512
++CONFIG_SYS_PBSIZE=1049
++CONFIG_DEFAULT_DEVICE_TREE="mt7988a-bananapi-bpi-r4-sd"
++CONFIG_DEFAULT_ENV_FILE="bananapi_bpi-r4_sdmmc_env"
++CONFIG_DEFAULT_FDT_FILE="mediatek/mt7988a-bpi-r4-sd.dtb"
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_OF_SYSTEM_SETUP=y
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_BOOTDELAY=30
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_LOGLEVEL=7
++CONFIG_LOG=y
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_EXT4=y
++CONFIG_CMD_FAT=y
++CONFIG_CMD_FDT=y
++CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_FS_UUID=y
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_GPT=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++# CONFIG_CMD_MBR is not set
++CONFIG_CMD_MMC=y
++CONFIG_CMD_MTD=y
++CONFIG_CMD_PCI=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
++CONFIG_CMD_PWM=y
++CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_UBI=y
++CONFIG_CMD_UBI_RENAME=y
++CONFIG_CMD_UBIFS=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_PART=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_USB=y
++CONFIG_CMD_UUID=y
++CONFIG_DISPLAY_CPUINFO=y
++CONFIG_DM_MMC=y
++CONFIG_DM_MTD=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++CONFIG_DM_USB=y
++CONFIG_DM_PWM=y
++CONFIG_PWM_MTK=y
++CONFIG_HUSH_PARSER=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_VERSION_VARIABLE=y
++CONFIG_PARTITION_UUIDS=y
++CONFIG_NETCONSOLE=y
++CONFIG_DM_GPIO=y
++CONFIG_DM_SCSI=y
++CONFIG_AHCI=y
++CONFIG_AHCI_PCI=y
++CONFIG_SCSI_AHCI=y
++CONFIG_SCSI=y
++CONFIG_CMD_SCSI=y
++CONFIG_PHY=y
++CONFIG_PHY_MTK_TPHY=y
++CONFIG_MTK_AHCI=y
++CONFIG_PCI=y
++CONFIG_MTD=y
++CONFIG_MTD_UBI_FASTMAP=y
++CONFIG_DM_PCI=y
++CONFIG_PCIE_MEDIATEK=y
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_RAM=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_MMC=y
++CONFIG_MMC_DEFAULT_DEV=1
++CONFIG_MMC_SUPPORTS_TUNING=y
++CONFIG_SPI=y
++CONFIG_DM_SPI=y
++CONFIG_MTK_SPI_NAND=y
++CONFIG_MTK_SPI_NAND_MTD=y
++CONFIG_SYSRESET_WATCHDOG=y
++CONFIG_WDT_MTK=y
++CONFIG_LZO=y
++CONFIG_ZSTD=y
++CONFIG_HEXDUMP=y
++CONFIG_RANDOM_UUID=y
++CONFIG_REGEX=y
++CONFIG_USB=y
++CONFIG_USB_HOST=y
++CONFIG_USB_XHCI_HCD=y
++CONFIG_USB_XHCI_MTK=y
++CONFIG_USB_STORAGE=y
++CONFIG_OF_EMBED=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_IS_IN_MMC=y
++CONFIG_ENV_OFFSET=0x400000
++CONFIG_ENV_OFFSET_REDUND=0x440000
++CONFIG_ENV_SIZE=0x40000
++CONFIG_ENV_SIZE_REDUND=0x40000
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_SUPPORT_EMMC_BOOT=y
++CONFIG_MMC_HS200_SUPPORT=y
++CONFIG_MMC_MTK=y
++CONFIG_PHY_FIXED=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7988=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_USE_DEFAULT_ENV_FILE=y
++CONFIG_MTD_SPI_NAND=y
++CONFIG_MTK_SPIM=y
++#CONFIG_MTK_SNOR=y
++CONFIG_DM_SPI_FLASH=y
++CONFIG_SPI_FLASH_MTD=y
++CONFIG_SPI_FLASH_WINBOND=y
++# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set
++CONFIG_CMD_SF=y
++CONFIG_CMD_NAND=y
++CONFIG_CMD_NAND_TRIMFFS=y
++CONFIG_LMB_MAX_REGIONS=64
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
+--- /dev/null
++++ b/configs/mt7988a_bananapi_bpi-r4-snand_defconfig
+@@ -0,0 +1,182 @@
++CONFIG_ARM=y
++CONFIG_SYS_HAS_NONCACHED_MEMORY=y
++CONFIG_POSITION_INDEPENDENT=y
++CONFIG_ARCH_MEDIATEK=y
++CONFIG_TEXT_BASE=0x41e00000
++CONFIG_SYS_MALLOC_F_LEN=0x4000
++CONFIG_NR_DRAM_BANKS=1
++CONFIG_SYS_PROMPT="MT7988> "
++CONFIG_TARGET_MT7988=y
++CONFIG_DEBUG_UART_BASE=0x11000000
++CONFIG_DEBUG_UART_CLOCK=40000000
++CONFIG_SYS_LOAD_ADDR=0x50000000
++CONFIG_DEBUG_UART=y
++CONFIG_SYS_CBSIZE=512
++CONFIG_SYS_PBSIZE=1049
++CONFIG_DEFAULT_DEVICE_TREE="mt7988a-bananapi-bpi-r4-emmc"
++CONFIG_DEFAULT_ENV_FILE="bananapi_bpi-r4_snand_env"
++CONFIG_DEFAULT_FDT_FILE="mediatek/mt7988a-bpi-r4-emmc.dtb"
++CONFIG_OF_LIBFDT_OVERLAY=y
++CONFIG_OF_SYSTEM_SETUP=y
++CONFIG_SMBIOS_PRODUCT_NAME=""
++CONFIG_AUTOBOOT_KEYED=y
++CONFIG_BOOTDELAY=30
++CONFIG_AUTOBOOT_MENU_SHOW=y
++CONFIG_CFB_CONSOLE_ANSI=y
++CONFIG_BOARD_LATE_INIT=y
++CONFIG_BUTTON=y
++CONFIG_BUTTON_GPIO=y
++CONFIG_GPIO_HOG=y
++CONFIG_CMD_ENV_FLAGS=y
++CONFIG_FIT=y
++CONFIG_FIT_ENABLE_SHA256_SUPPORT=y
++CONFIG_LED=y
++CONFIG_LED_BLINK=y
++CONFIG_LED_GPIO=y
++CONFIG_LOGLEVEL=7
++CONFIG_LOG=y
++CONFIG_CMD_BOOTMENU=y
++CONFIG_CMD_BOOTP=y
++CONFIG_CMD_BUTTON=y
++CONFIG_CMD_CACHE=y
++CONFIG_CMD_CDP=y
++CONFIG_CMD_CPU=y
++CONFIG_CMD_DHCP=y
++CONFIG_CMD_DM=y
++CONFIG_CMD_DNS=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ENV_READMEM=y
++CONFIG_CMD_ERASEENV=y
++CONFIG_CMD_EXT4=y
++CONFIG_CMD_FAT=y
++CONFIG_CMD_FDT=y
++CONFIG_CMD_FS_GENERIC=y
++CONFIG_CMD_FS_UUID=y
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_GPT=y
++CONFIG_CMD_HASH=y
++CONFIG_CMD_ITEST=y
++CONFIG_CMD_LED=y
++CONFIG_CMD_LICENSE=y
++CONFIG_CMD_LINK_LOCAL=y
++# CONFIG_CMD_MBR is not set
++CONFIG_CMD_MMC=y
++CONFIG_CMD_MTD=y
++CONFIG_CMD_PCI=y
++CONFIG_CMD_PSTORE=y
++CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000
++CONFIG_CMD_SF_TEST=y
++CONFIG_CMD_PING=y
++CONFIG_CMD_PXE=y
++CONFIG_CMD_PWM=y
++CONFIG_CMD_SMC=y
++CONFIG_CMD_TFTPBOOT=y
++CONFIG_CMD_TFTPSRV=y
++CONFIG_CMD_UBI=y
++CONFIG_CMD_UBI_RENAME=y
++CONFIG_CMD_UBIFS=y
++CONFIG_CMD_ASKENV=y
++CONFIG_CMD_PART=y
++CONFIG_CMD_RARP=y
++CONFIG_CMD_SETEXPR=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SNTP=y
++CONFIG_CMD_SOURCE=y
++CONFIG_CMD_STRINGS=y
++CONFIG_CMD_USB=y
++CONFIG_CMD_UUID=y
++CONFIG_DISPLAY_CPUINFO=y
++CONFIG_DM_MMC=y
++CONFIG_DM_MTD=y
++CONFIG_DM_REGULATOR=y
++CONFIG_DM_REGULATOR_FIXED=y
++CONFIG_DM_REGULATOR_GPIO=y
++CONFIG_DM_USB=y
++CONFIG_DM_PWM=y
++CONFIG_PWM_MTK=y
++CONFIG_HUSH_PARSER=y
++CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
++CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_VERSION_VARIABLE=y
++CONFIG_PARTITION_UUIDS=y
++CONFIG_NETCONSOLE=y
++CONFIG_DM_GPIO=y
++CONFIG_DM_SCSI=y
++CONFIG_AHCI=y
++CONFIG_AHCI_PCI=y
++CONFIG_SCSI_AHCI=y
++CONFIG_SCSI=y
++CONFIG_CMD_SCSI=y
++CONFIG_PHY=y
++CONFIG_PHY_MTK_TPHY=y
++CONFIG_MTK_AHCI=y
++CONFIG_PCI=y
++CONFIG_MTD=y
++CONFIG_MTD_UBI_FASTMAP=y
++CONFIG_DM_PCI=y
++CONFIG_PCIE_MEDIATEK=y
++CONFIG_PINCTRL_MT7988=y
++CONFIG_PRE_CONSOLE_BUFFER=y
++CONFIG_PRE_CON_BUF_ADDR=0x4007EF00
++CONFIG_RAM=y
++CONFIG_DM_SERIAL=y
++CONFIG_MTK_SERIAL=y
++CONFIG_MMC=y
++CONFIG_MMC_DEFAULT_DEV=1
++CONFIG_MMC_SUPPORTS_TUNING=y
++CONFIG_SPI=y
++CONFIG_DM_SPI=y
++CONFIG_MTK_SPI_NAND=y
++CONFIG_MTK_SPI_NAND_MTD=y
++CONFIG_SYSRESET_WATCHDOG=y
++CONFIG_WDT_MTK=y
++CONFIG_LZO=y
++CONFIG_ZSTD=y
++CONFIG_HEXDUMP=y
++CONFIG_RANDOM_UUID=y
++CONFIG_REGEX=y
++CONFIG_USB=y
++CONFIG_USB_HOST=y
++CONFIG_USB_XHCI_HCD=y
++CONFIG_USB_XHCI_MTK=y
++CONFIG_USB_STORAGE=y
++CONFIG_OF_EMBED=y
++CONFIG_ENV_OVERWRITE=y
++CONFIG_ENV_IS_IN_UBI=y
++CONFIG_ENV_UBI_PART="ubi"
++CONFIG_ENV_SIZE=0x1f000
++CONFIG_ENV_SIZE_REDUND=0x1f000
++CONFIG_ENV_UBI_VOLUME="ubootenv"
++CONFIG_ENV_UBI_VOLUME_REDUND="ubootenv2"
++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
++CONFIG_NET_RANDOM_ETHADDR=y
++CONFIG_REGMAP=y
++CONFIG_SYSCON=y
++CONFIG_CLK=y
++CONFIG_SUPPORT_EMMC_BOOT=y
++CONFIG_MMC_HS200_SUPPORT=y
++CONFIG_MMC_MTK=y
++CONFIG_PHY_FIXED=y
++CONFIG_DM_ETH=y
++CONFIG_MEDIATEK_ETH=y
++CONFIG_PINCTRL=y
++CONFIG_PINCONF=y
++CONFIG_PINCTRL_MT7988=y
++CONFIG_POWER_DOMAIN=y
++CONFIG_MTK_POWER_DOMAIN=y
++CONFIG_USE_DEFAULT_ENV_FILE=y
++CONFIG_MTD_SPI_NAND=y
++CONFIG_MTK_SPIM=y
++#CONFIG_MTK_SNOR=y
++CONFIG_DM_SPI_FLASH=y
++CONFIG_SPI_FLASH_MTD=y
++CONFIG_SPI_FLASH_WINBOND=y
++# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set
++CONFIG_CMD_SF=y
++CONFIG_CMD_NAND=y
++CONFIG_CMD_NAND_TRIMFFS=y
++CONFIG_LMB_MAX_REGIONS=64
++CONFIG_USE_IPADDR=y
++CONFIG_IPADDR="192.168.1.1"
++CONFIG_USE_SERVERIP=y
++CONFIG_SERVERIP="192.168.1.254"
+--- /dev/null
++++ b/bananapi_bpi-r4_sdmmc_env
+@@ -0,0 +1,66 @@
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x50000000
++bootargs=console=ttyS0,115200n1 pci=pcie_bus_perf root=/dev/fit0
++bootcmd=if pstore check ; then run boot_recovery ; else run boot_sdmmc ; fi
++bootconf=config-mt7988a-bananapi-bpi-r4
++bootconf_sd=mt7988a-bananapi-bpi-r4-sd
++bootconf_emmc=mt7988a-bananapi-bpi-r4-emmc
++bootconf_extra=
++bootdelay=0
++bootfile=openwrt-mediatek-filogic-bananapi_bpi-r4-initramfs-recovery.itb
++bootfile_upg=openwrt-mediatek-filogic-bananapi_bpi-r4-squashfs-sysupgrade.itb
++bootled_pwr=green:status
++bootled_rec=blue:status
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_default=0
++bootmenu_delay=0
++bootmenu_title= ( ( ( OpenWrt ) ) ) [SD card]
++bootmenu_0=Initialize environment.=run _firstboot
++bootmenu_0d=Run default boot command.=run boot_default
++bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
++bootmenu_2=Boot production system from SD card.=run boot_production ; run bootmenu_confirm_return
++bootmenu_3=Boot recovery system from SD card.=run boot_recovery ; run bootmenu_confirm_return
++bootmenu_4=Load production system via TFTP then write to SD card.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_5=Load recovery system via TFTP then write to SD card.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_6=Install bootloader, recovery and production to NAND.=if nand info ; then run ubi_init ; else echo "NAND not detected" ; fi ; run bootmenu_confirm_return
++bootmenu_7=Reboot.=reset
++bootmenu_8=Reset all settings to factory defaults.=run reset_factory ; reset
++boot_first=if button reset ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
++boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
++boot_production=led $bootled_pwr on ; run sdmmc_read_production && bootm $loadaddr#$bootconf#$bootconf_sd#$bootconf_extra ; led $bootled_pwr off
++boot_recovery=led $bootled_rec on ; run sdmmc_read_recovery && bootm $loadaddr#$bootconf#$bootconf_emmc ; led $bootled_rec off
++boot_sdmmc=run boot_production ; run boot_recovery
++boot_tftp_forever=led $bootled_rec on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done
++boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run sdmmc_write_production ; if env exists noboot ; then else bootm $loadaddr#$bootconf#$bootconf_sd#$bootconf_extra ; fi
++boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run sdmmc_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf#$bootconf_sd ; fi
++boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr#$bootconf#$bootconf_sd
++mmc_write_vol=imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc erase 0x$part_addr 0x$image_size && mmc write $loadaddr 0x$part_addr 0x$image_size
++mmc_read_vol=mmc read $loadaddr $part_addr 0x100 && imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc read $loadaddr 0x$part_addr 0x$image_size && setexpr filesize $image_size * 0x200
++part_default=production
++part_recovery=recovery
++reset_factory=eraseenv && reset
++sdmmc_read_production=part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_read_vol
++sdmmc_read_recovery=part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_read_vol
++sdmmc_read_snand_bl2=part start mmc 0 install part_addr && mmc read $loadaddr $part_addr 0x400
++sdmmc_read_snand_fip=part start mmc 0 install part_addr && setexpr offset $part_addr + 0x800 && mmc read $loadaddr $offset 0x1000
++sdmmc_read_emmc_install=part start mmc 0 install part_addr && setexpr offset $part_addr + 0x3800 && mmc read $loadaddr $offset 0x4000
++sdmmc_write_production=part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_write_vol
++sdmmc_write_recovery=part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_write_vol
++snand_write_bl2=mtd erase bl2 && mtd write bl2 $loadaddr 0x0 0x80000 && mtd write bl2 $loadaddr 0x80000 0x80000 && mtd write bl2 $loadaddr 0x100000 0x80000 && mtd write bl2 $loadaddr 0x180000 0x80000
++ubi_create_env=ubi create ubootenv 0x100000 dynamic 1 ; ubi create ubootenv2 0x100000 dynamic 2
++ubi_format=ubi detach ; mtd erase ubi && ubi part ubi
++ubi_init=run ubi_format && run ubi_init_bl && run ubi_create_env && run ubi_init_openwrt && run ubi_init_emmc_install
++ubi_init_openwrt=run sdmmc_read_recovery && iminfo $loadaddr && run ubi_write_recovery ; run sdmmc_read_production && iminfo $loadaddr && run ubi_write_production
++ubi_init_bl=run sdmmc_read_snand_bl2 && run snand_write_bl2 && run sdmmc_read_snand_fip && run ubi_write_fip
++ubi_init_emmc_install=run sdmmc_read_emmc_install && run ubi_write_emmc_install
++ubi_prepare_rootfs=if ubi check rootfs_data ; then else if env exists rootfs_data_max ; then ubi create rootfs_data $rootfs_data_max dynamic || ubi create rootfs_data - dynamic ; else ubi create rootfs_data - dynamic ; fi ; fi
++ubi_remove_rootfs=ubi check rootfs_data && ubi remove rootfs_data
++ubi_write_fip=ubi check fip && ubi remove fip ; ubi create fip 0x200000 static ; ubi write $loadaddr fip 0x200000
++ubi_write_emmc_install=ubi check emmc_install && ubi remove emmc_install ; ubi create emmc_install 0x800000 dynamic ; ubi write $loadaddr emmc_install 0x800000
++ubi_write_production=ubi check fit && ubi remove fit ; run ubi_remove_rootfs ; ubi create fit $filesize dynamic && ubi write $loadaddr fit $filesize
++ubi_write_recovery=ubi check recovery && ubi remove recovery ; run ubi_remove_rootfs ; ubi create recovery $filesize dynamic && ubi write $loadaddr recovery $filesize
++_init_env=setenv _init_env ; setenv _create_env ; saveenv ; saveenv
++_firstboot=setenv _firstboot ; run _switch_to_menu ; run _init_env ; run boot_first
++_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
++_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
+--- /dev/null
++++ b/bananapi_bpi-r4_snand_env
+@@ -0,0 +1,67 @@
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x50000000
++bootargs=console=ttyS0,115200n1 pci=pcie_bus_perf root=/dev/fit0 ubi.block=0,fit
++bootconf=config-mt7988a-bananapi-bpi-r4
++bootconf_extra=mt7988a-bananapi-bpi-r4-emmc
++bootcmd=if pstore check ; then run boot_recovery ; else run boot_ubi ; fi
++bootdelay=0
++bootfile=openwrt-mediatek-filogic-bananapi_bpi-r4-initramfs-recovery.itb
++bootfile_bl2=openwrt-mediatek-filogic-bananapi_bpi-r4-snand-preloader.bin
++bootfile_fip=openwrt-mediatek-filogic-bananapi_bpi-r4-snand-bl31-uboot.fip
++bootfile_upg=openwrt-mediatek-filogic-bananapi_bpi-r4-squashfs-sysupgrade.itb
++bootled_pwr=green:status
++bootled_rec=blue:status
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_default=0
++bootmenu_delay=0
++bootmenu_title= ( ( ( OpenWrt ) ) ) [SPI-NAND]
++bootmenu_0=Initialize environment.=run _firstboot
++bootmenu_0d=Run default boot command.=run boot_default
++bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
++bootmenu_2=Boot production system from NAND.=run boot_production ; run bootmenu_confirm_return
++bootmenu_3=Boot recovery system from NAND.=run boot_recovery ; run bootmenu_confirm_return
++bootmenu_4=Load production system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_5=Load recovery system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_6=Load BL31+U-Boot FIP via TFTP then write to NAND.=run boot_tftp_write_fip ; run bootmenu_confirm_return
++bootmenu_7=Load BL2 preloader via TFTP then write to NAND.=run boot_tftp_write_bl2 ; run bootmenu_confirm_return
++bootmenu_8=Install bootloader, recovery and production to eMMC.=if mmc partconf 0 ; then run emmc_init ; else echo "eMMC not detected" ; fi ; run bootmenu_confirm_return
++bootmenu_9=Reboot.=reset
++bootmenu_10=Reset all settings to factory defaults.=run reset_factory ; reset
++boot_first=if button reset ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
++boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
++boot_production=led $bootled_pwr on ; run ubi_read_production && bootm $loadaddr#$bootconf#$bootconf_extra ; led $bootled_pwr off
++boot_recovery=led $bootled_rec on ; run ubi_read_recovery && bootm $loadaddr#$bootconf ; led $bootled_rec off
++boot_ubi=run boot_production ; run boot_recovery
++boot_tftp_forever=led $bootled_rec on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done
++boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run ubi_write_production ; if env exists noboot ; then else bootm $loadaddr#$bootconf#$bootconf_extra ; fi
++boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run ubi_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi
++boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr#$bootconf
++boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run ubi_write_fip && run reset_factory
++boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run snand_write_bl2
++part_default=production
++part_recovery=recovery
++reset_factory=ubi part ubi ; mw $loadaddr 0x0 0x800 ; ubi write $loadaddr ubootenv 0x800 ; ubi write $loadaddr ubootenv2 0x800
++snand_write_bl2=mtd erase bl2 && mtd write bl2 $loadaddr 0x0 0x80000 && mtd write bl2 $loadaddr 0x80000 0x80000 && mtd write bl2 $loadaddr 0x100000 0x80000 && mtd write bl2 $loadaddr 0x180000 0x80000
++ubi_create_env=ubi check ubootenv || ubi create ubootenv 0x100000 dynamic 1 ; ubi check ubootenv2 || ubi create ubootenv2 0x100000 dynamic 2
++ubi_prepare_rootfs=if ubi check rootfs_data ; then else if env exists rootfs_data_max ; then ubi create rootfs_data $rootfs_data_max dynamic || ubi create rootfs_data - dynamic ; else ubi create rootfs_data - dynamic ; fi ; fi
++ubi_read_production=ubi read $loadaddr fit && iminfo $loadaddr && run ubi_prepare_rootfs
++ubi_read_recovery=ubi check recovery && ubi read $loadaddr recovery
++ubi_read_emmc_install=ubi check emmc_install && ubi read $loadaddr emmc_install
++ubi_remove_rootfs=ubi check rootfs_data && ubi remove rootfs_data
++ubi_write_fip=ubi check fip && ubi remove fip ; ubi create fip 0x200000 static ; ubi write $loadaddr fip 0x200000
++ubi_write_production=ubi check fit && ubi remove fit ; run ubi_remove_rootfs ; ubi create fit $filesize dynamic && ubi write $loadaddr fit $filesize
++ubi_write_recovery=ubi check recovery && ubi remove recovery ; run ubi_remove_rootfs ; ubi create recovery $filesize dynamic && ubi write $loadaddr recovery $filesize
++mmc_write_vol=imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc erase 0x$part_addr 0x$image_size && mmc write $loadaddr 0x$part_addr 0x$image_size
++emmc_init=mmc dev 0 && mmc bootbus 0 0 0 0 && run emmc_init_bl && run emmc_init_openwrt ; env default bootcmd ; saveenv ; saveenv
++emmc_init_bl=run ubi_read_emmc_install && setenv fileaddr $loadaddr && run emmc_write_bl2 && setexpr fileaddr $loadaddr + 0x100000 && run emmc_write_fip && setexpr fileaddr $loadaddr + 0x500000 && run emmc_write_hdr
++emmc_init_openwrt=run ubi_read_recovery && iminfo $loadaddr && run emmc_write_recovery ; run ubi_read_production && iminfo $loadaddr && run emmc_write_production
++emmc_write_bl2=mmc partconf 0 1 1 1 && mmc erase 0x0 0x400 && mmc write $fileaddr 0x0 0x400 ; mmc partconf 0 1 1 0
++emmc_write_fip=mmc erase 0x3400 0x2000 && mmc write $fileaddr 0x3400 0x2000 && mmc erase 0x2000 0x800
++emmc_write_hdr=mmc erase 0x0 0x40 && mmc write $fileaddr 0x0 0x40
++emmc_write_production=part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_write_vol
++emmc_write_recovery=part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_write_vol
++_init_env=setenv _init_env ; run ubi_create_env ; saveenv ; saveenv
++_firstboot=setenv _firstboot ; run _switch_to_menu ; run _init_env ; run boot_first
++_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
++_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
+--- /dev/null
++++ b/bananapi_bpi-r4_emmc_env
+@@ -0,0 +1,57 @@
++ipaddr=192.168.1.1
++serverip=192.168.1.254
++loadaddr=0x50000000
++bootargs=console=ttyS0,115200n1 pci=pcie_bus_perf root=/dev/fit0
++bootcmd=if pstore check ; then run boot_recovery ; else run boot_emmc ; fi
++bootconf=config-mt7988a-bananapi-bpi-r4
++bootconf_base=config-mt7988a-bananapi-bpi-r4
++bootconf_emmc=mt7988a-bananapi-bpi-r4-emmc
++bootconf_extra=
++bootdelay=0
++bootfile=openwrt-mediatek-filogic-bananapi_bpi-r4-initramfs-recovery.itb
++bootfile_bl2=openwrt-mediatek-filogic-bananapi_bpi-r4-emmc-preloader.bin
++bootfile_fip=openwrt-mediatek-filogic-bananapi_bpi-r4-emmc-bl31-uboot.fip
++bootfile_upg=openwrt-mediatek-filogic-bananapi_bpi-r4-squashfs-sysupgrade.itb
++bootled_pwr=green:status
++bootled_rec=blue:status
++bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60
++bootmenu_default=0
++bootmenu_delay=0
++bootmenu_title= ( ( ( OpenWrt ) ) ) [eMMC]
++bootmenu_0=Initialize environment.=run _firstboot
++bootmenu_0d=Run default boot command.=run boot_default
++bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return
++bootmenu_2=Boot production system from eMMC.=run boot_production ; run bootmenu_confirm_return
++bootmenu_3=Boot recovery system from eMMC.=run boot_recovery ; run bootmenu_confirm_return
++bootmenu_4=Load production system via TFTP then write to eMMC.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_5=Load recovery system via TFTP then write to eMMC.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return
++bootmenu_6=Load BL31+U-Boot FIP via TFTP then write to eMMC.=run boot_tftp_write_fip ; run bootmenu_confirm_return
++bootmenu_7=Load BL2 preloader via TFTP then write to eMMC.=run boot_tftp_write_bl2 ; run bootmenu_confirm_return
++bootmenu_8=Reboot.=reset
++bootmenu_9=Reset all settings to factory defaults.=run reset_factory ; reset
++boot_first=if button reset ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu
++boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever
++boot_production=led $bootled_pwr on ; run emmc_read_production && bootm $loadaddr#$bootconf#$bootconf_emmc#$bootconf_extra ; led $bootled_pwr off
++boot_recovery=led $bootled_rec on ; run emmc_read_recovery && bootm $loadaddr#$bootconf#$bootconf_emmc#$bootconf_extra ; led $bootled_rec off
++boot_emmc=run boot_production ; run boot_recovery
++boot_tftp_forever=led $bootled_rec on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done
++boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run emmc_write_production ; if env exists noboot ; then else bootm $loadaddr#$bootconf#$bootconf_emmc#$bootconf_extra ; fi
++boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run emmc_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf#$bootconf_emmc ; fi
++boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run emmc_write_fip
++boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run emmc_write_bl2
++boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr#$bootconf
++mmc_write_vol=imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc erase 0x$part_addr 0x$image_size && mmc write $loadaddr 0x$part_addr 0x$image_size
++mmc_read_vol=mmc read $loadaddr $part_addr 0x100 && imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc read $loadaddr 0x$part_addr 0x$image_size && setexpr filesize $image_size * 0x200
++part_default=production
++part_recovery=recovery
++reset_factory=eraseenv && reset
++emmc_read_production=part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_read_vol
++emmc_read_recovery=part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_read_vol
++emmc_write_bl2=mmc partconf 0 1 1 1 && mmc erase 0x0 0x400 && mmc write $fileaddr 0x0 0x400 ; mmc partconf 0 1 1 0
++emmc_write_fip=mmc erase 0x3400 0x2000 && mmc write $fileaddr 0x3400 0x2000 && mmc erase 0x2000 0x800
++emmc_write_production=part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_write_vol
++emmc_write_recovery=part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_write_vol
++_init_env=setenv _init_env ; setenv _create_env ; saveenv ; saveenv
++_firstboot=setenv _firstboot ; run _switch_to_menu ; run _init_env ; run boot_first
++_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title
++_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver"
+--- /dev/null
++++ b/arch/arm/dts/mt7988a-bananapi-bpi-r4.dtsi
+@@ -0,0 +1,199 @@
++// SPDX-License-Identifier: GPL-2.0
++/*
++ * Copyright (c) 2022 MediaTek Inc.
++ * Author: Sam Shih <sam.shih@mediatek.com>
++ */
++
++/dts-v1/;
++#include "mt7988.dtsi"
++#include <dt-bindings/gpio/gpio.h>
++#include <dt-bindings/input/linux-event-codes.h>
++
++/ {
++ model = "Bananapi BPI-R4";
++ compatible = "bananapi,bpi-r4", "mediatek,mt7988";
++
++ chosen {
++ stdout-path = &uart0;
++ };
++
++ memory@40000000 {
++ device_type = "memory";
++ reg = <0 0x40000000 0 0x10000000>;
++ };
++
++ reg_3p3v: regulator-3p3v {
++ compatible = "regulator-fixed";
++ regulator-name = "fixed-3.3V";
++ regulator-min-microvolt = <3300000>;
++ regulator-max-microvolt = <3300000>;
++ regulator-boot-on;
++ regulator-always-on;
++ };
++
++ reg_1p8v: regulator-1p8v {
++ compatible = "regulator-fixed";
++ regulator-name = "fixed-1.8V";
++ regulator-min-microvolt = <1800000>;
++ regulator-max-microvolt = <1800000>;
++ regulator-boot-on;
++ regulator-always-on;
++ };
++
++ keys {
++ compatible = "gpio-keys";
++
++ wps {
++ label = "reset";
++ linux,code = <KEY_RESTART>;
++ gpios = <&gpio 14 GPIO_ACTIVE_LOW>;
++ };
++ };
++
++ leds {
++ compatible = "gpio-leds";
++
++ led_status_green: led-green {
++ label = "green:status";
++ gpios = <&gpio 79 GPIO_ACTIVE_HIGH>;
++ };
++
++ led_status_blue: led-blue {
++ label = "blue:status";
++ gpios = <&gpio 63 GPIO_ACTIVE_HIGH>;
++ };
++ };
++};
++
++&uart0 {
++ status = "okay";
++};
++
++&i2c1 {
++ pinctrl-names = "default";
++ pinctrl-0 = <&i2c1_pins>;
++ status = "okay";
++};
++
++&eth {
++ status = "okay";
++ mediatek,gmac-id = <0>;
++ phy-mode = "usxgmii";
++ mediatek,switch = "mt7988";
++
++ fixed-link {
++ speed = <1000>;
++ full-duplex;
++ pause;
++ };
++};
++
++&pinctrl {
++ i2c1_pins: i2c1-pins {
++ mux {
++ function = "i2c";
++ groups = "i2c1_0";
++ };
++ };
++
++ pwm_pins: pwm-pins {
++ mux {
++ function = "pwm";
++ groups = "pwm0", "pwm1", "pwm2", "pwm3", "pwm4",
++ "pwm5", "pwm6", "pwm7";
++ };
++ };
++
++ spi0_pins: spi0-pins {
++ mux {
++ function = "spi";
++ groups = "spi0", "spi0_wp_hold";
++ };
++ };
++
++ mmc0_pins_default: mmc0default {
++ mux {
++ function = "flash";
++ groups = "emmc_51";
++ };
++
++ conf-cmd-dat {
++ pins = "EMMC_DATA_0", "EMMC_DATA_1", "EMMC_DATA_2",
++ "EMMC_DATA_3", "EMMC_DATA_4", "EMMC_DATA_5",
++ "EMMC_DATA_6", "EMMC_DATA_7", "EMMC_CMD";
++ input-enable;
++ };
++
++ conf-clk {
++ pins = "EMMC_CK";
++ };
++
++ conf-dsl {
++ pins = "EMMC_DSL";
++ };
++
++ conf-rst {
++ pins = "EMMC_RSTB";
++ };
++ };
++
++ mmc1_pins_default: mmc1default {
++ mux {
++ function = "flash";
++ groups = "emmc_45";
++ };
++
++ conf-cmd-dat {
++ pins = "SPI2_CSB", "SPI2_MISO", "SPI2_MOSI",
++ "SPI2_CLK", "SPI2_HOLD";
++ input-enable;
++ };
++
++ conf-clk {
++ pins = "SPI2_WP";
++ };
++ };
++};
++
++&pwm {
++ pinctrl-names = "default";
++ pinctrl-0 = <&pwm_pins>;
++ status = "okay";
++};
++
++&spi0 {
++ pinctrl-names = "default";
++ pinctrl-0 = <&spi0_pins>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++ status = "okay";
++ must_tx;
++ enhance_timing;
++ dma_ext;
++ ipm_design;
++ support_quad;
++ tick_dly = <2>;
++ sample_sel = <0>;
++
++ spi_nand@0 {
++ compatible = "spi-nand";
++ reg = <0>;
++ spi-max-frequency = <52000000>;
++ partitions {
++ compatible = "fixed-partitions";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ partition@0 {
++ label = "bl2";
++ reg = <0x0 0x200000>;
++ };
++
++ partition@200000 {
++ label = "ubi";
++ reg = <0x200000 0x7e00000>;
++ compatible = "linux,ubi";
++ };
++ };
++ };
++};
+--- /dev/null
++++ b/arch/arm/dts/mt7988a-bananapi-bpi-r4-sd.dts
+@@ -0,0 +1,19 @@
++// SPDX-License-Identifier: GPL-2.0
++/*
++ * Copyright (c) 2022 MediaTek Inc.
++ * Author: Sam Shih <sam.shih@mediatek.com>
++ */
++
++/dts-v1/;
++#include "mt7988a-bananapi-bpi-r4.dtsi"
++
++&mmc0 {
++ pinctrl-names = "default";
++ pinctrl-0 = <&mmc1_pins_default>;
++ max-frequency = <52000000>;
++ bus-width = <4>;
++ cap-sd-highspeed;
++ vmmc-supply = <&reg_3p3v>;
++ vqmmc-supply = <&reg_3p3v>;
++ status = "okay";
++};
+--- /dev/null
++++ b/arch/arm/dts/mt7988a-bananapi-bpi-r4-emmc.dts
+@@ -0,0 +1,21 @@
++// SPDX-License-Identifier: GPL-2.0
++/*
++ * Copyright (c) 2022 MediaTek Inc.
++ * Author: Sam Shih <sam.shih@mediatek.com>
++ */
++
++/dts-v1/;
++#include "mt7988a-bananapi-bpi-r4.dtsi"
++
++&mmc0 {
++ pinctrl-names = "default";
++ pinctrl-0 = <&mmc0_pins_default>;
++ max-frequency = <52000000>;
++ bus-width = <8>;
++ cap-mmc-highspeed;
++ cap-mmc-hw-reset;
++ vmmc-supply = <&reg_3p3v>;
++ vqmmc-supply = <&reg_1p8v>;
++ non-removable;
++ status = "okay";
++};
diff --git a/package/boot/uboot-mediatek/patches/500-board-mt7623-fix-mmc-detect.patch b/package/boot/uboot-mediatek/patches/500-board-mt7623-fix-mmc-detect.patch
new file mode 100644
index 00000000000..2f0ed85e53f
--- /dev/null
+++ b/package/boot/uboot-mediatek/patches/500-board-mt7623-fix-mmc-detect.patch
@@ -0,0 +1,21 @@
+--- a/board/mediatek/mt7623/mt7623_rfb.c
++++ b/board/mediatek/mt7623/mt7623_rfb.c
+@@ -9,6 +9,7 @@
+ #include <env.h>
+ #include <init.h>
+ #include <mmc.h>
++#include <part.h>
+ #include <asm/global_data.h>
+ #include <linux/delay.h>
+
+@@ -31,8 +32,9 @@ int mmc_get_boot_dev(void)
+ {
+ int g_mmc_devid = -1;
+ char *uflag = (char *)0x81DFFFF0;
++ struct blk_desc *desc;
+
+- if (!find_mmc_device(1))
++ if (blk_get_device_by_str("mmc", "1", &desc) < 0)
+ return 0;
+
+ if (strncmp(uflag,"eMMC",4)==0) {
diff --git a/package/boot/uboot-mvebu/Makefile b/package/boot/uboot-mvebu/Makefile
index 37e93d1f515..e6120959f64 100644
--- a/package/boot/uboot-mvebu/Makefile
+++ b/package/boot/uboot-mvebu/Makefile
@@ -8,10 +8,10 @@
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
-PKG_VERSION:=2021.01
+PKG_VERSION:=2023.07.02
PKG_RELEASE:=1
-PKG_HASH:=b407e1510a74e863b8b5cb42a24625344f0e0c2fc7582d8c866bd899367d0454
+PKG_HASH:=6b6a48581c14abb0f95bd87c1af4d740922406d7b801002a9f94727fdde021d5
include $(INCLUDE_DIR)/u-boot.mk
include $(INCLUDE_DIR)/package.mk
@@ -26,14 +26,22 @@ define U-Boot/clearfog
NAME:=SolidRun ClearFog A1
BUILD_DEVICES:=solidrun_clearfog-base-a1 solidrun_clearfog-pro-a1
BUILD_SUBTARGET:=cortexa9
- UBOOT_IMAGE:=u-boot-spl.kwb
+ UBOOT_IMAGE:=u-boot-with-spl.kwb
endef
define U-Boot/helios4
NAME:=Kobol Helios 4
BUILD_DEVICES:=kobol_helios4
BUILD_SUBTARGET:=cortexa9
- UBOOT_IMAGE:=u-boot-spl.kwb
+ UBOOT_IMAGE:=u-boot-with-spl.kwb
+endef
+
+define U-Boot/omnia
+ NAME:=Turris Omnia
+ BUILD_DEVICES:=cznic_turris-omnia
+ BUILD_SUBTARGET:=cortexa9
+ UBOOT_CONFIG:=turris_omnia
+ UBOOT_IMAGE:=u-boot-with-spl.kwb
endef
define U-Boot/espressobin
@@ -47,20 +55,18 @@ define U-Boot/uDPU
BUILD_SUBTARGET:=cortexa53
endef
+define U-Boot/eDPU
+ NAME:=Methode eDPU
+ BUILD_SUBTARGET:=cortexa53
+endef
+
UBOOT_TARGETS:= \
clearfog \
helios4 \
+ omnia \
espressobin \
- uDPU
-
-Build/Exports:=$(Host/Exports)
-
-define Build/Configure
- # enable additional options beyond <device>_defconfig
- echo CONFIG_CMD_SETEXPR=y >> $(PKG_BUILD_DIR)/configs/$(UBOOT_CONFIG)_defconfig
-
- $(call Build/Configure/U-Boot)
-endef
+ uDPU \
+ eDPU
define Package/u-boot/install
$(if $(findstring cortexa53,$(BUILD_SUBTARGET)),,$(Package/u-boot/install/default))
diff --git a/package/boot/uboot-mvebu/patches/0001-arm-mvebu-Espressobin-move-FDT-fixup-into-a-separate.patch b/package/boot/uboot-mvebu/patches/0001-arm-mvebu-Espressobin-move-FDT-fixup-into-a-separate.patch
new file mode 100644
index 00000000000..59bdc38adda
--- /dev/null
+++ b/package/boot/uboot-mvebu/patches/0001-arm-mvebu-Espressobin-move-FDT-fixup-into-a-separate.patch
@@ -0,0 +1,54 @@
+From 8621f6d22a9589651c6f25742294dd19a26db430 Mon Sep 17 00:00:00 2001
+From: Robert Marko <robert.marko@sartura.hr>
+Date: Thu, 3 Aug 2023 13:34:13 +0200
+Subject: [PATCH 1/3] arm: mvebu: Espressobin: move FDT fixup into a separate
+ function
+
+Currently, Esspresobin FDT is being fixed up directly in ft_board_setup()
+which makes it hard to add support for any other board to be fixed up.
+
+So, lets just move the FDT fixup code to a separate function and call it
+if compatible matches, there should be no functional change.
+
+Signed-off-by: Robert Marko <robert.marko@sartura.hr>
+---
+ board/Marvell/mvebu_armada-37xx/board.c | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+--- a/board/Marvell/mvebu_armada-37xx/board.c
++++ b/board/Marvell/mvebu_armada-37xx/board.c
+@@ -359,18 +359,14 @@ int last_stage_init(void)
+ #endif
+
+ #ifdef CONFIG_OF_BOARD_SETUP
+-int ft_board_setup(void *blob, struct bd_info *bd)
++static int espressobin_fdt_setup(void *blob)
+ {
+-#ifdef CONFIG_ENV_IS_IN_SPI_FLASH
+ int ret;
+ int spi_off;
+ int parts_off;
+ int part_off;
+
+ /* Fill SPI MTD partitions for Linux kernel on Espressobin */
+- if (!of_machine_is_compatible("globalscale,espressobin"))
+- return 0;
+-
+ spi_off = fdt_node_offset_by_compatible(blob, -1, "jedec,spi-nor");
+ if (spi_off < 0)
+ return 0;
+@@ -455,6 +451,14 @@ int ft_board_setup(void *blob, struct bd
+ return 0;
+ }
+
++ return 0;
++}
++
++int ft_board_setup(void *blob, struct bd_info *bd)
++{
++#ifdef CONFIG_ENV_IS_IN_SPI_FLASH
++ if (of_machine_is_compatible("globalscale,espressobin"))
++ return espressobin_fdt_setup(blob);
+ #endif
+ return 0;
+ }
diff --git a/package/boot/uboot-mvebu/patches/0002-arm-mvebu-Espressobin-move-network-setup-into-a-sepa.patch b/package/boot/uboot-mvebu/patches/0002-arm-mvebu-Espressobin-move-network-setup-into-a-sepa.patch
new file mode 100644
index 00000000000..175deb397f5
--- /dev/null
+++ b/package/boot/uboot-mvebu/patches/0002-arm-mvebu-Espressobin-move-network-setup-into-a-sepa.patch
@@ -0,0 +1,53 @@
+From 3f8c18894a50fd45b81a807f217893f289500bc6 Mon Sep 17 00:00:00 2001
+From: Robert Marko <robert.marko@sartura.hr>
+Date: Thu, 3 Aug 2023 14:24:31 +0200
+Subject: [PATCH 2/3] arm: mvebu: Espressobin: move network setup into a
+ separate function
+
+Currently, Esspresobin switch is being setup directly in last_stage_init()
+which makes it hard to add support for any other board to be setup.
+
+So, lets just move the switch setup code to a separate function and call it
+if compatible matches, there should be no functional change.
+
+Signed-off-by: Robert Marko <robert.marko@sartura.hr>
+---
+ board/Marvell/mvebu_armada-37xx/board.c | 16 +++++++++++-----
+ 1 file changed, 11 insertions(+), 5 deletions(-)
+
+--- a/board/Marvell/mvebu_armada-37xx/board.c
++++ b/board/Marvell/mvebu_armada-37xx/board.c
+@@ -300,15 +300,11 @@ static int mii_multi_chip_mode_write(str
+ return 0;
+ }
+
+-/* Bring-up board-specific network stuff */
+-int last_stage_init(void)
++static int espressobin_last_stage_init(void)
+ {
+ struct udevice *bus;
+ ofnode node;
+
+- if (!of_machine_is_compatible("globalscale,espressobin"))
+- return 0;
+-
+ node = ofnode_by_compatible(ofnode_null(), "marvell,orion-mdio");
+ if (!ofnode_valid(node) ||
+ uclass_get_device_by_ofnode(UCLASS_MDIO, node, &bus) ||
+@@ -356,6 +352,16 @@ int last_stage_init(void)
+
+ return 0;
+ }
++
++/* Bring-up board-specific network stuff */
++int last_stage_init(void)
++{
++
++ if (of_machine_is_compatible("globalscale,espressobin"))
++ return espressobin_last_stage_init();
++
++ return 0;
++}
+ #endif
+
+ #ifdef CONFIG_OF_BOARD_SETUP
diff --git a/package/boot/uboot-mvebu/patches/0003-arm-mvebu-eDPU-support-new-board-revision.patch b/package/boot/uboot-mvebu/patches/0003-arm-mvebu-eDPU-support-new-board-revision.patch
new file mode 100644
index 00000000000..c27549e4d4d
--- /dev/null
+++ b/package/boot/uboot-mvebu/patches/0003-arm-mvebu-eDPU-support-new-board-revision.patch
@@ -0,0 +1,297 @@
+From 83c00ee665b8dde813458b2b07cf97ce8409248d Mon Sep 17 00:00:00 2001
+From: Robert Marko <robert.marko@sartura.hr>
+Date: Fri, 4 Aug 2023 22:39:06 +0200
+Subject: [PATCH 3/3] arm: mvebu: eDPU: support new board revision
+
+There is a new eDPU revision that uses Marvell 88E6361 switch onboard.
+We can rely on detecting the switch to enable and fixup the Linux DTS
+so a single DTS can be used.
+
+There is currently no support for the 88E6361 switch and thus no working
+networking in U-Boot, so we disable both ports.
+
+Signed-off-by: Robert Marko <robert.marko@sartura.hr>
+---
+ arch/arm/dts/armada-3720-eDPU-u-boot.dtsi | 13 ++-
+ arch/arm/dts/armada-3720-eDPU.dts | 47 ++++++++
+ board/Marvell/mvebu_armada-37xx/board.c | 125 ++++++++++++++++++++++
+ configs/eDPU_defconfig | 2 +
+ 4 files changed, 182 insertions(+), 5 deletions(-)
+
+--- a/arch/arm/dts/armada-3720-eDPU-u-boot.dtsi
++++ b/arch/arm/dts/armada-3720-eDPU-u-boot.dtsi
+@@ -32,14 +32,17 @@
+ bootph-all;
+ };
+
+-&eth0 {
+- /* G.hn does not work without additional configuration */
+- status = "disabled";
+-};
+-
+ &eth1 {
+ fixed-link {
+ speed = <1000>;
+ full-duplex;
+ };
+ };
++
++/*
++ * eDPU v2 has a MV88E6361 switch on the MDIO bus and U-boot is used
++ * to patch the Linux DTS if its found so enable MDIO by default.
++ */
++&mdio {
++ status = "okay";
++};
+--- a/arch/arm/dts/armada-3720-eDPU.dts
++++ b/arch/arm/dts/armada-3720-eDPU.dts
+@@ -12,3 +12,50 @@
+ &eth0 {
+ phy-mode = "2500base-x";
+ };
++
++/*
++ * External MV88E6361 switch is only available on v2 of the board.
++ * U-Boot will enable the MDIO bus and switch nodes.
++ */
++&mdio {
++ status = "disabled";
++ pinctrl-names = "default";
++ pinctrl-0 = <&smi_pins>;
++
++ /* Actual device is MV88E6361 */
++ switch: switch@0 {
++ compatible = "marvell,mv88e6190";
++ #address-cells = <1>;
++ #size-cells = <0>;
++ reg = <0>;
++ status = "disabled";
++
++ ports {
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ port@0 {
++ reg = <0>;
++ label = "cpu";
++ phy-mode = "2500base-x";
++ managed = "in-band-status";
++ ethernet = <&eth0>;
++ };
++
++ port@9 {
++ reg = <9>;
++ label = "downlink";
++ phy-mode = "2500base-x";
++ managed = "in-band-status";
++ };
++
++ port@a {
++ reg = <10>;
++ label = "uplink";
++ phy-mode = "2500base-x";
++ managed = "in-band-status";
++ sfp = <&sfp_eth1>;
++ };
++ };
++ };
++};
+--- a/board/Marvell/mvebu_armada-37xx/board.c
++++ b/board/Marvell/mvebu_armada-37xx/board.c
+@@ -13,6 +13,7 @@
+ #include <mmc.h>
+ #include <miiphy.h>
+ #include <phy.h>
++#include <fdt_support.h>
+ #include <asm/global_data.h>
+ #include <asm/io.h>
+ #include <asm/arch/cpu.h>
+@@ -49,6 +50,7 @@ DECLARE_GLOBAL_DATA_PTR;
+ /* Single-chip mode */
+ /* Switch Port Registers */
+ #define MVEBU_SW_LINK_CTRL_REG (1)
++#define MVEBU_SW_PORT_SWITCH_ID (3)
+ #define MVEBU_SW_PORT_CTRL_REG (4)
+ #define MVEBU_SW_PORT_BASE_VLAN (6)
+
+@@ -56,6 +58,8 @@ DECLARE_GLOBAL_DATA_PTR;
+ #define MVEBU_G2_SMI_PHY_CMD_REG (24)
+ #define MVEBU_G2_SMI_PHY_DATA_REG (25)
+
++#define SWITCH_88E6361_PRODUCT_NUMBER 0x2610
++
+ /*
+ * Memory Controller Registers
+ *
+@@ -72,6 +76,27 @@ DECLARE_GLOBAL_DATA_PTR;
+ #define A3700_MC_CTRL2_SDRAM_TYPE_DDR3 2
+ #define A3700_MC_CTRL2_SDRAM_TYPE_DDR4 3
+
++static bool is_edpu_plus(void)
++{
++ struct udevice *bus;
++ ofnode node;
++ int val;
++
++ node = ofnode_by_compatible(ofnode_null(), "marvell,orion-mdio");
++ if (!ofnode_valid(node) ||
++ uclass_get_device_by_ofnode(UCLASS_MDIO, node, &bus) ||
++ device_probe(bus)) {
++ printf("Cannot find MDIO bus\n");
++ return -ENODEV;
++ }
++
++ val = dm_mdio_read(bus, 0x0, MDIO_DEVAD_NONE, MVEBU_SW_PORT_SWITCH_ID);
++ if (val == SWITCH_88E6361_PRODUCT_NUMBER)
++ return true;
++ else
++ return false;
++}
++
+ int board_early_init_f(void)
+ {
+ return 0;
+@@ -353,6 +378,41 @@ static int espressobin_last_stage_init(v
+ return 0;
+ }
+
++static int edpu_plus_last_stage_init(void)
++{
++ struct udevice *dev;
++ int ret;
++
++ if (is_edpu_plus()) {
++ ret = uclass_get_device_by_name(UCLASS_ETH,
++ "ethernet@40000",
++ &dev);
++ if (!ret) {
++ device_remove(dev, DM_REMOVE_NORMAL);
++ device_unbind(dev);
++ }
++
++ /* Currently no networking support on the eDPU+ board */
++ ret = uclass_get_device_by_name(UCLASS_ETH,
++ "ethernet@30000",
++ &dev);
++ if (!ret) {
++ device_remove(dev, DM_REMOVE_NORMAL);
++ device_unbind(dev);
++ }
++ } else {
++ ret = uclass_get_device_by_name(UCLASS_ETH,
++ "ethernet@30000",
++ &dev);
++ if (!ret) {
++ device_remove(dev, DM_REMOVE_NORMAL);
++ device_unbind(dev);
++ }
++ }
++
++ return 0;
++}
++
+ /* Bring-up board-specific network stuff */
+ int last_stage_init(void)
+ {
+@@ -360,6 +420,9 @@ int last_stage_init(void)
+ if (of_machine_is_compatible("globalscale,espressobin"))
+ return espressobin_last_stage_init();
+
++ if (of_machine_is_compatible("methode,edpu"))
++ return edpu_plus_last_stage_init();
++
+ return 0;
+ }
+ #endif
+@@ -460,12 +523,74 @@ static int espressobin_fdt_setup(void *b
+ return 0;
+ }
+
++static int edpu_plus_fdt_setup(void *blob)
++{
++ const char *ports[] = { "downlink", "uplink" };
++ uint8_t mac[ETH_ALEN];
++ const char *path;
++ int i, ret;
++
++ if (is_edpu_plus()) {
++ ret = fdt_set_status_by_compatible(blob,
++ "marvell,orion-mdio",
++ FDT_STATUS_OKAY);
++ if (ret)
++ printf("Failed to enable MDIO!\n");
++
++ ret = fdt_set_status_by_alias(blob,
++ "ethernet1",
++ FDT_STATUS_DISABLED);
++ if (ret)
++ printf("Failed to disable ethernet1!\n");
++
++ path = fdt_get_alias(blob, "ethernet0");
++ if (path)
++ do_fixup_by_path_string(blob, path, "phy-mode", "2500base-x");
++ else
++ printf("Failed to update ethernet0 phy-mode to 2500base-x!\n");
++
++ ret = fdt_set_status_by_compatible(blob,
++ "marvell,mv88e6190",
++ FDT_STATUS_OKAY);
++ if (ret)
++ printf("Failed to enable MV88E6361!\n");
++
++ /*
++ * MAC-s for Uplink and Downlink ports are stored under
++ * non standard variable names, so lets manually fixup the
++ * switch port nodes to have the desired MAC-s.
++ */
++ for (i = 0; i < 2; i++) {
++ if (eth_env_get_enetaddr(ports[i], mac)) {
++ do_fixup_by_prop(blob,
++ "label",
++ ports[i],
++ strlen(ports[i]) + 1,
++ "mac-address",
++ mac, ARP_HLEN, 1);
++
++ do_fixup_by_prop(blob,
++ "label",
++ ports[i],
++ strlen(ports[i]) + 1,
++ "local-mac-address",
++ mac, ARP_HLEN, 1);
++ }
++ }
++ }
++
++ return 0;
++}
++
+ int ft_board_setup(void *blob, struct bd_info *bd)
+ {
+ #ifdef CONFIG_ENV_IS_IN_SPI_FLASH
+ if (of_machine_is_compatible("globalscale,espressobin"))
+ return espressobin_fdt_setup(blob);
+ #endif
++ if (of_machine_is_compatible("methode,edpu"))
++ return edpu_plus_fdt_setup(blob);
++
+ return 0;
+ }
+ #endif
+--- a/configs/eDPU_defconfig
++++ b/configs/eDPU_defconfig
+@@ -17,12 +17,14 @@ CONFIG_DEBUG_UART=y
+ # CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
+ CONFIG_FIT=y
+ CONFIG_FIT_VERBOSE=y
++CONFIG_OF_BOARD_SETUP=y
+ CONFIG_DISTRO_DEFAULTS=y
+ CONFIG_USE_PREBOOT=y
+ # CONFIG_DISPLAY_CPUINFO is not set
+ # CONFIG_DISPLAY_BOARDINFO is not set
+ CONFIG_DISPLAY_BOARDINFO_LATE=y
+ CONFIG_BOARD_EARLY_INIT_F=y
++CONFIG_LAST_STAGE_INIT=y
+ CONFIG_SYS_MAXARGS=32
+ CONFIG_SYS_PBSIZE=1048
+ # CONFIG_CMD_ELF is not set
diff --git a/package/boot/uboot-mvebu/patches/0004-arm-mvebu-clearfog-read-number-of-ddr-channels-from-.patch b/package/boot/uboot-mvebu/patches/0004-arm-mvebu-clearfog-read-number-of-ddr-channels-from-.patch
new file mode 100644
index 00000000000..f4db7026399
--- /dev/null
+++ b/package/boot/uboot-mvebu/patches/0004-arm-mvebu-clearfog-read-number-of-ddr-channels-from-.patch
@@ -0,0 +1,85 @@
+From 1dbc6d3739869af38e6157cd8b9bc4314ca3c9fe Mon Sep 17 00:00:00 2001
+From: Josua Mayer <josua@solid-run.com>
+Date: Mon, 18 Jul 2022 20:04:54 +0300
+Subject: [PATCH 1/2] arm: mvebu: clearfog: read number of ddr channels from
+ tlv data
+
+Extend the existing tlv vendor extension used for ram size by one byte to
+also store the number of ddr channels.
+The length of the tlv entry can indicate whether the new information is
+present. If not default to single channel.
+
+Signed-off-by: Josua Mayer <josua@solid-run.com>
+---
+ board/solidrun/clearfog/clearfog.c | 14 +++++++++++++-
+ board/solidrun/common/tlv_data.c | 7 ++++++-
+ board/solidrun/common/tlv_data.h | 1 +
+ 3 files changed, 20 insertions(+), 2 deletions(-)
+
+diff --git a/board/solidrun/clearfog/clearfog.c b/board/solidrun/clearfog/clearfog.c
+index 6edb4221551..4f4532b537e 100644
+--- a/board/solidrun/clearfog/clearfog.c
++++ b/board/solidrun/clearfog/clearfog.c
+@@ -36,7 +36,7 @@ DECLARE_GLOBAL_DATA_PTR;
+ #define BOARD_GPP_POL_LOW 0x0
+ #define BOARD_GPP_POL_MID 0x0
+
+-static struct tlv_data cf_tlv_data;
++static struct tlv_data cf_tlv_data = { 0 };
+
+ static void cf_read_tlv_data(void)
+ {
+@@ -168,6 +168,18 @@ struct mv_ddr_topology_map *mv_ddr_topology_map_get(void)
+ break;
+ }
+
++ switch (cf_tlv_data.ram_channels) {
++ default:
++ case 1:
++ for (uint8_t i = 0; i < 5; i++)
++ ifp->as_bus_params[i].cs_bitmask = 0x1;
++ break;
++ case 2:
++ for (uint8_t i = 0; i < 5; i++)
++ ifp->as_bus_params[i].cs_bitmask = 0x3;
++ break;
++ }
++
+ /* Return the board topology as defined in the board code */
+ return &board_topology_map;
+ }
+diff --git a/board/solidrun/common/tlv_data.c b/board/solidrun/common/tlv_data.c
+index 11d6e4a1380..cf5824886c3 100644
+--- a/board/solidrun/common/tlv_data.c
++++ b/board/solidrun/common/tlv_data.c
+@@ -45,9 +45,14 @@ static void parse_tlv_vendor_ext(struct tlvinfo_tlv *tlv_entry,
+
+ if (val[4] != SR_TLV_CODE_RAM_SIZE)
+ return;
+- if (tlv_entry->length != 6)
++ if (tlv_entry->length < 6)
+ return;
+ td->ram_size = val[5];
++
++ /* extension with additional data field for number of ddr channels */
++ if (tlv_entry->length >= 7) {
++ td->ram_channels = val[6];
++ }
+ }
+
+ static void parse_tlv_data(u8 *eeprom, struct tlvinfo_header *hdr,
+diff --git a/board/solidrun/common/tlv_data.h b/board/solidrun/common/tlv_data.h
+index a1432e4b8e1..be3f782ac4a 100644
+--- a/board/solidrun/common/tlv_data.h
++++ b/board/solidrun/common/tlv_data.h
+@@ -10,6 +10,7 @@ struct tlv_data {
+ /* Store product name of both SOM and carrier */
+ char tlv_product_name[2][32];
+ unsigned int ram_size;
++ uint8_t ram_channels;
+ };
+
+ void read_tlv_data(struct tlv_data *td);
+--
+2.35.3
+
diff --git a/package/boot/uboot-mvebu/patches/0005-arm-mvebu-clearfog-support-512MB-memory-size-from-tl.patch b/package/boot/uboot-mvebu/patches/0005-arm-mvebu-clearfog-support-512MB-memory-size-from-tl.patch
new file mode 100644
index 00000000000..05fb8fdbf1b
--- /dev/null
+++ b/package/boot/uboot-mvebu/patches/0005-arm-mvebu-clearfog-support-512MB-memory-size-from-tl.patch
@@ -0,0 +1,31 @@
+From b1b4941c2e3e16a21dc15604220725cf7f2de7c5 Mon Sep 17 00:00:00 2001
+From: Josua Mayer <josua@solid-run.com>
+Date: Wed, 20 Jul 2022 19:10:56 +0300
+Subject: [PATCH 2/2] arm: mvebu: clearfog: support 512MB memory size from tlv
+ eeprom
+
+Handle 2GBit memory size value "2" from tlv eeprom on ddr
+initialisation, to support SoMs with 512MB ddr memory.
+
+Signed-off-by: Josua Mayer <josua@solid-run.com>
+---
+ board/solidrun/clearfog/clearfog.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/board/solidrun/clearfog/clearfog.c b/board/solidrun/clearfog/clearfog.c
+index 4f4532b537e..6fa2fe5fe3e 100644
+--- a/board/solidrun/clearfog/clearfog.c
++++ b/board/solidrun/clearfog/clearfog.c
+@@ -159,6 +159,9 @@ struct mv_ddr_topology_map *mv_ddr_topology_map_get(void)
+ cf_read_tlv_data();
+
+ switch (cf_tlv_data.ram_size) {
++ case 2:
++ ifp->memory_size = MV_DDR_DIE_CAP_2GBIT;
++ break;
+ case 4:
+ default:
+ ifp->memory_size = MV_DDR_DIE_CAP_4GBIT;
+--
+2.35.3
+
diff --git a/package/boot/uboot-mvebu/patches/210-link-libcrypto-static.patch b/package/boot/uboot-mvebu/patches/210-link-libcrypto-static.patch
deleted file mode 100644
index eb0b05e4c63..00000000000
--- a/package/boot/uboot-mvebu/patches/210-link-libcrypto-static.patch
+++ /dev/null
@@ -1,14 +0,0 @@
-OpenWrt links the libressl statically against mkimage, make sure all the
-needed dependencies are added too.
-
---- a/tools/Makefile
-+++ b/tools/Makefile
-@@ -158,7 +158,7 @@ ifneq ($(CONFIG_MX23)$(CONFIG_MX28)$(CON
- HOSTCFLAGS_kwbimage.o += \
- $(shell pkg-config --cflags libssl libcrypto 2> /dev/null || echo "")
- HOSTLDLIBS_mkimage += \
-- $(shell pkg-config --libs libssl libcrypto 2> /dev/null || echo "-lssl -lcrypto")
-+ $(shell pkg-config --libs --static libssl libcrypto 2> /dev/null || echo "-lssl -lpthread -lcrypto")
-
- # OS X deprecate openssl in favour of CommonCrypto, supress deprecation
- # warnings on those systems
diff --git a/package/boot/uboot-mxs/Makefile b/package/boot/uboot-mxs/Makefile
index 2a202dca8f6..afd73e191b1 100644
--- a/package/boot/uboot-mxs/Makefile
+++ b/package/boot/uboot-mxs/Makefile
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
PKG_VERSION:=2020.04
-PKG_RELEASE:=1
+PKG_RELEASE:=6
PKG_HASH:=fe732aaf037d9cc3c0909bad8362af366ae964bbdac6913a34081ff4ad565372
@@ -19,6 +19,7 @@ include $(INCLUDE_DIR)/host-build.mk
define U-Boot/Default
BUILD_TARGET:=mxs
+ BUILD_SUBTARGET:=generic
UBOOT_IMAGE:=u-boot.sb
DEFAULT:=y
HIDDEN:=1
@@ -26,10 +27,12 @@ endef
define U-Boot/mx23_olinuxino
NAME:=Olinuxino i.MX233
+ BUILD_DEVICES:=olinuxino_maxi olinuxino_micro
endef
define U-Boot/duckbill
NAME:=I2SE Duckbill
+ BUILD_DEVICES:=i2se_duckbill
endef
UBOOT_TARGETS := \
@@ -38,11 +41,13 @@ UBOOT_TARGETS := \
UBOOT_MAKE_FLAGS += $(UBOOT_IMAGE)
-Build/Exports:=$(Host/Exports)
-
define Build/InstallDev
- $(INSTALL_DIR) $(STAGING_DIR_IMAGE)
- $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(UBOOT_IMAGE) $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-$(UBOOT_IMAGE)
+ $(foreach device,$(BUILD_DEVICES), \
+ $(INSTALL_DIR) $(STAGING_DIR_IMAGE)/$(device)
+ )
+ $(foreach device,$(BUILD_DEVICES), \
+ $(CP) $(patsubst %,$(PKG_BUILD_DIR)/%,$(UBOOT_IMAGE)) $(STAGING_DIR_IMAGE)/$(device)/
+ )
endef
$(eval $(call BuildPackage/U-Boot))
diff --git a/package/boot/uboot-mxs/patches/210-link-libcrypto-static.patch b/package/boot/uboot-mxs/patches/210-link-libcrypto-static.patch
deleted file mode 100644
index 022e798f194..00000000000
--- a/package/boot/uboot-mxs/patches/210-link-libcrypto-static.patch
+++ /dev/null
@@ -1,14 +0,0 @@
-OpenWrt links the libressl statically against mkimage, make sure all the
-needed dependencies are added too.
-
---- a/tools/Makefile
-+++ b/tools/Makefile
-@@ -147,7 +147,7 @@ endif
- # MXSImage needs LibSSL
- ifneq ($(CONFIG_MX23)$(CONFIG_MX28)$(CONFIG_ARMADA_38X)$(CONFIG_ARMADA_39X)$(CONFIG_FIT_SIGNATURE),)
- HOSTLOADLIBES_mkimage += \
-- $(shell pkg-config --libs libssl libcrypto 2> /dev/null || echo "-lssl -lcrypto")
-+ $(shell pkg-config --libs --static libssl libcrypto 2> /dev/null || echo "-lssl -lpthread -lcrypto")
-
- # OS X deprecate openssl in favour of CommonCrypto, supress deprecation
- # warnings on those systems
diff --git a/package/boot/uboot-omap/Makefile b/package/boot/uboot-omap/Makefile
index f66b8d5331f..af2327893f0 100644
--- a/package/boot/uboot-omap/Makefile
+++ b/package/boot/uboot-omap/Makefile
@@ -8,16 +8,17 @@
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
-PKG_VERSION:=2020.04
-PKG_RELEASE:=1
+PKG_VERSION:=2021.07
+PKG_RELEASE:=21
-PKG_HASH:=fe732aaf037d9cc3c0909bad8362af366ae964bbdac6913a34081ff4ad565372
+PKG_HASH:=312b7eeae44581d1362c3a3f02c28d806647756c82ba8c72241c7cdbe68ba77e
include $(INCLUDE_DIR)/u-boot.mk
include $(INCLUDE_DIR)/package.mk
define U-Boot/Default
BUILD_TARGET:=omap
+ BUILD_SUBTARGET:=generic
UBOOT_IMAGE:=u-boot.img MLO
endef
@@ -31,16 +32,12 @@ define U-Boot/am335x_evm
BUILD_DEVICES:=ti_am335x-evm ti_am335x-bone-black
endef
-define U-Boot/omap3_overo
- NAME:=Gumstix Overo
-endef
-
define U-Boot/omap3_beagle
NAME:=BeagleBoard
BUILD_DEVICES:=ti_omap3-beagle
endef
-UBOOT_TARGETS:=omap4_panda am335x_evm omap3_overo omap3_beagle
+UBOOT_TARGETS:=omap4_panda am335x_evm omap3_beagle
define Build/InstallDev
$(foreach device,$(BUILD_DEVICES), \
diff --git a/package/boot/uboot-oxnas/Makefile b/package/boot/uboot-oxnas/Makefile
index daa266ea8cd..fc06f01dcbe 100644
--- a/package/boot/uboot-oxnas/Makefile
+++ b/package/boot/uboot-oxnas/Makefile
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
PKG_VERSION:=2014.10
-PKG_RELEASE:=1
+PKG_RELEASE:=16
PKG_HASH:=d3b132a7a9b3f3182b7aad71c2dfbd4fc15bea83e12c76134eb3ffefc07d1c71
diff --git a/package/boot/uboot-ramips/Makefile b/package/boot/uboot-ramips/Makefile
deleted file mode 100644
index 5229f5cd3cc..00000000000
--- a/package/boot/uboot-ramips/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-
-include $(TOPDIR)/rules.mk
-include $(INCLUDE_DIR)/kernel.mk
-
-PKG_VERSION:=2020.04
-PKG_RELEASE:=1
-
-PKG_HASH:=fe732aaf037d9cc3c0909bad8362af366ae964bbdac6913a34081ff4ad565372
-
-include $(INCLUDE_DIR)/u-boot.mk
-include $(INCLUDE_DIR)/package.mk
-
-define U-Boot/Default
- BUILD_TARGET:=ramips
- UBOOT_IMAGE:=u-boot.bin
-endef
-
-define U-Boot/ravpower_rp-wd009
- BUILD_DEVICES:=ravpower_rp-wd009
- BUILD_SUBTARGET:=mt76x8
- NAME:=RAVPower RP-WD009
- UBOOT_CONFIG:=ravpower-rp-wd009-ram
-endef
-
-UBOOT_TARGETS := \
- ravpower_rp-wd009
-
-define Build/InstallDev
- $(INSTALL_DIR) $(STAGING_DIR_IMAGE)
- $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(UBOOT_IMAGE) $(STAGING_DIR_IMAGE)/$(VARIANT)-$(UBOOT_IMAGE)
-endef
-
-$(eval $(call BuildPackage/U-Boot))
diff --git a/package/boot/uboot-rockchip/Makefile b/package/boot/uboot-rockchip/Makefile
index 75825ce6900..71eac09d98b 100644
--- a/package/boot/uboot-rockchip/Makefile
+++ b/package/boot/uboot-rockchip/Makefile
@@ -5,13 +5,15 @@
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
-PKG_VERSION:=2021.04
+PKG_VERSION:=2024.01
PKG_RELEASE:=1
-
-PKG_HASH:=0d438b1bb5cceb57a18ea2de4a0d51f7be5b05b98717df05938636e0aadfe11a
+PKG_HASH:=b99611f1ed237bf3541bdc8434b68c96a6e05967061f992443cb30aabebef5b3
PKG_MAINTAINER:=Tobias Maedel <openwrt@tbspace.de>
+UBOOT_USE_BINMAN:=1
+UBOOT_USE_INTREE_DTC:=1
+
include $(INCLUDE_DIR)/u-boot.mk
include $(INCLUDE_DIR)/package.mk
@@ -24,75 +26,147 @@ endef
# RK3328 boards
-define U-Boot/nanopi-r2s-rk3328
+define U-Boot/rk3328/Default
BUILD_SUBTARGET:=armv8
+ DEPENDS:=+PACKAGE_u-boot-$(1):trusted-firmware-a-rk3328
+ ATF:=rk3328_bl31.elf
+endef
+
+define U-Boot/nanopi-r2c-rk3328
+ $(U-Boot/rk3328/Default)
+ NAME:=NanoPi R2C
+ BUILD_DEVICES:= \
+ friendlyarm_nanopi-r2c
+endef
+
+define U-Boot/nanopi-r2s-rk3328
+ $(U-Boot/rk3328/Default)
NAME:=NanoPi R2S
BUILD_DEVICES:= \
friendlyarm_nanopi-r2s
- DEPENDS:=+PACKAGE_u-boot-nanopi-r2s-rk3328:arm-trusted-firmware-rockchip
- PKG_BUILD_DEPENDS:=arm-trusted-firmware-rockchip
- ATF:=rk3328_bl31.elf
- OF_PLATDATA:=$(1)
endef
+define U-Boot/orangepi-r1-plus-rk3328
+ $(U-Boot/rk3328/Default)
+ NAME:=Orange Pi R1 Plus
+ BUILD_DEVICES:= \
+ xunlong_orangepi-r1-plus
+endef
+
+define U-Boot/orangepi-r1-plus-lts-rk3328
+ $(U-Boot/rk3328/Default)
+ NAME:=Orange Pi R1 Plus LTS
+ BUILD_DEVICES:= \
+ xunlong_orangepi-r1-plus-lts
+endef
+
+define U-Boot/roc-cc-rk3328
+ $(U-Boot/rk3328/Default)
+ NAME:=ROC-RK3328-CC
+ BUILD_DEVICES:= \
+ firefly_roc-rk3328-cc
+endef
+
+define U-Boot/rock64-rk3328
+ $(U-Boot/rk3328/Default)
+ NAME:=Rock64
+ BUILD_DEVICES:= \
+ pine64_rock64
+endef
+
+define U-Boot/rock-pi-e-rk3328
+ $(U-Boot/rk3328/Default)
+ NAME:=ROCK Pi E
+ BUILD_DEVICES:= \
+ radxa_rock-pi-e
+endef
# RK3399 boards
-define U-Boot/nanopi-r4s-rk3399
+define U-Boot/rk3399/Default
BUILD_SUBTARGET:=armv8
+ DEPENDS:=+PACKAGE_u-boot-$(1):trusted-firmware-a-rk3399
+ ATF:=rk3399_bl31.elf
+endef
+
+define U-Boot/nanopc-t4-rk3399
+ $(U-Boot/rk3399/Default)
+ NAME:=NanoPC T4
+ BUILD_DEVICES:= \
+ friendlyarm_nanopc-t4
+endef
+
+define U-Boot/nanopi-r4s-rk3399
+ $(U-Boot/rk3399/Default)
NAME:=NanoPi R4S
BUILD_DEVICES:= \
friendlyarm_nanopi-r4s
- DEPENDS:=+PACKAGE_u-boot-nanopi-r4s-rk3399:arm-trusted-firmware-rockchip
- PKG_BUILD_DEPENDS:=arm-trusted-firmware-rockchip
- ATF:=rk3399_bl31.elf
endef
define U-Boot/rock-pi-4-rk3399
- BUILD_SUBTARGET:=armv8
+ $(U-Boot/rk3399/Default)
NAME:=Rock Pi 4
BUILD_DEVICES:= \
- radxa_rock-pi-4
- DEPENDS:=+PACKAGE_u-boot-rock-pi-4-rk3399:arm-trusted-firmware-rockchip
- PKG_BUILD_DEPENDS:=arm-trusted-firmware-rockchip
- ATF:=rk3399_bl31.elf
+ radxa_rock-pi-4a
endef
define U-Boot/rockpro64-rk3399
- BUILD_SUBTARGET:=armv8
+ $(U-Boot/rk3399/Default)
NAME:=RockPro64
BUILD_DEVICES:= \
pine64_rockpro64
- DEPENDS:=+PACKAGE_u-boot-rockpro64-rk3399:arm-trusted-firmware-rockchip
- PKG_BUILD_DEPENDS:=arm-trusted-firmware-rockchip
- ATF:=rk3399_bl31.elf
+endef
+
+
+# RK3568 boards
+
+define U-Boot/rk3568/Default
+ BUILD_SUBTARGET:=armv8
+ DEPENDS:=+PACKAGE_u-boot-$(1):trusted-firmware-a-rk3568
+ ATF:=rk3568_bl31_v1.43.elf
+ TPL:=rk3568_ddr_1560MHz_v1.18.bin
+endef
+
+define U-Boot/nanopi-r5c-rk3568
+ $(U-Boot/rk3568/Default)
+ NAME:=NanoPi R5C
+ BUILD_DEVICES:= \
+ friendlyarm_nanopi-r5c
+endef
+
+define U-Boot/nanopi-r5s-rk3568
+ $(U-Boot/rk3568/Default)
+ NAME:=NanoPi R5S
+ BUILD_DEVICES:= \
+ friendlyarm_nanopi-r5s
endef
UBOOT_TARGETS := \
+ nanopc-t4-rk3399 \
nanopi-r4s-rk3399 \
rock-pi-4-rk3399 \
rockpro64-rk3399 \
- nanopi-r2s-rk3328
+ nanopi-r2c-rk3328 \
+ nanopi-r2s-rk3328 \
+ orangepi-r1-plus-rk3328 \
+ orangepi-r1-plus-lts-rk3328 \
+ roc-cc-rk3328 \
+ rock64-rk3328 \
+ rock-pi-e-rk3328 \
+ nanopi-r5c-rk3568 \
+ nanopi-r5s-rk3568
UBOOT_CONFIGURE_VARS += USE_PRIVATE_LIBGCC=yes
-UBOOT_MAKE_FLAGS += \
- BL31=$(STAGING_DIR_IMAGE)/$(ATF)
-
-define Build/Configure
- $(call Build/Configure/U-Boot)
-
-ifneq ($(OF_PLATDATA),)
- mkdir -p $(PKG_BUILD_DIR)/tpl/dts
- mkdir -p $(PKG_BUILD_DIR)/include/generated
+UBOOT_CUSTOMIZE_CONFIG := \
+ --disable SPL_FIT_SIGNATURE \
+ --disable TOOLS_MKEFICAPSULE \
+ --set-str MKIMAGE_DTC_PATH $(PKG_BUILD_DIR)/scripts/dtc/dtc
- $(CP) $(PKG_BUILD_DIR)/of-platdata/$(OF_PLATDATA)/dt-plat.c $(PKG_BUILD_DIR)/tpl/dts/dt-plat.c
- $(CP) $(PKG_BUILD_DIR)/of-platdata/$(OF_PLATDATA)/dt-structs-gen.h $(PKG_BUILD_DIR)/include/generated/dt-structs-gen.h
-endif
-
- $(SED) 's#CONFIG_MKIMAGE_DTC_PATH=.*#CONFIG_MKIMAGE_DTC_PATH="$(PKG_BUILD_DIR)/scripts/dtc/dtc"#g' $(PKG_BUILD_DIR)/.config
- echo 'CONFIG_IDENT_STRING=" OpenWrt"' >> $(PKG_BUILD_DIR)/.config
-endef
+UBOOT_MAKE_FLAGS += \
+ PATH=$(STAGING_DIR_HOST)/bin:$(PATH) \
+ BL31=$(STAGING_DIR_IMAGE)/$(ATF) \
+ $(if $(TPL),ROCKCHIP_TPL=$(STAGING_DIR_IMAGE)/$(TPL))
define Build/InstallDev
$(INSTALL_DIR) $(STAGING_DIR_IMAGE)
diff --git a/package/boot/uboot-rockchip/patches/001-scripts-remove-dependency-on-swig.patch b/package/boot/uboot-rockchip/patches/001-scripts-remove-dependency-on-swig.patch
deleted file mode 100644
index 05055893854..00000000000
--- a/package/boot/uboot-rockchip/patches/001-scripts-remove-dependency-on-swig.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From b137ca16b54c67d76714ea5a0138741959b0dc29 Mon Sep 17 00:00:00 2001
-From: David Bauer <mail@david-bauer.net>
-Date: Mon, 13 Jul 2020 23:37:37 +0200
-Subject: [PATCH] scripts: remove dependency on swig
-
-Don't build the libfdt tool, as it has a dependency on swig (which
-OpenWrt does not ship).
-
-This requires more hacks, as of-platdata generation does not work
-without it.
-
-Signed-off-by: David Bauer <mail@david-bauer.net>
----
- scripts/dtc/Makefile | 2 --
- 1 file changed, 2 deletions(-)
-
---- a/scripts/dtc/Makefile
-+++ b/scripts/dtc/Makefile
-@@ -18,5 +18,3 @@ HOSTCFLAGS_dtc-parser.tab.o := -I$(src)
- # dependencies on generated files need to be listed explicitly
- $(obj)/dtc-lexer.lex.o: $(obj)/dtc-parser.tab.h
-
--# Added for U-Boot
--subdir-$(CONFIG_PYLIBFDT) += pylibfdt
diff --git a/package/boot/uboot-rockchip/patches/002-spl-remove-dtoc-of-pdata-generation.patch b/package/boot/uboot-rockchip/patches/002-spl-remove-dtoc-of-pdata-generation.patch
deleted file mode 100644
index 61a56c2afce..00000000000
--- a/package/boot/uboot-rockchip/patches/002-spl-remove-dtoc-of-pdata-generation.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From 55273cf6079ddd3b006da69f0113c2c66c03f17e Mon Sep 17 00:00:00 2001
-From: David Bauer <mail@david-bauer.net>
-Date: Tue, 14 Jul 2020 22:44:22 +0200
-Subject: [PATCH] spl: remove dtoc of-pdata generation
-
-Remove the dtoc of-pdata generation. This generation is dependant on
-libpython-dev. As OpenWrt does not ship with this dependency, use
-pre-generated pdata files and remove the generation from the
-build-process.
-
-This only affects RK3328 boards.
-
-Signed-off-by: David Bauer <mail@david-bauer.net>
----
- scripts/Makefile.spl | 6 ------
- 1 file changed, 6 deletions(-)
-
---- a/scripts/Makefile.spl
-+++ b/scripts/Makefile.spl
-@@ -329,10 +329,6 @@ PHONY += dts_dir
- dts_dir:
- $(shell [ -d $(obj)/dts ] || mkdir -p $(obj)/dts)
-
--include/generated/dt-structs-gen.h $(u-boot-spl-platdata_c) &: \
-- $(obj)/$(SPL_BIN).dtb dts_dir FORCE
-- $(call if_changed,dtoc)
--
- ifdef CONFIG_SAMSUNG
- ifdef CONFIG_VAR_SIZE_SPL
- VAR_SIZE_PARAM = --vs
diff --git a/package/boot/uboot-rockchip/patches/101-rock64pro-disable-CONFIG_USE_PREBOOT.patch b/package/boot/uboot-rockchip/patches/101-rock64pro-disable-CONFIG_USE_PREBOOT.patch
deleted file mode 100644
index f630818358d..00000000000
--- a/package/boot/uboot-rockchip/patches/101-rock64pro-disable-CONFIG_USE_PREBOOT.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 2114d68b3c755ec8043ae9e43ac8e9753e0cec84 Mon Sep 17 00:00:00 2001
-From: Marty Jones <mj8263788@gmail.com>
-Date: Sun, 17 Jan 2021 15:26:09 -0500
-Subject: [PATCH] rockpro64: disable CONFIG_USE_PREBOOT
-
-On commit https://github.com/u-boot/u-boot/commit/f81f9f0ebac596bae7f27db095f4f0272b606cc3
-CONFIG_USE_PREBOOT was enabled on the RockPro64.
-
-When the board is booting, U-Boot hangs as soon as it disables the USB
-controller. This is a workaround until a final solution is deployed
-upstream.
-
-Signed-off-by: Marty Jones <mj8263788@gmail.com>
----
- configs/rockpro64-rk3399_defconfig | 1 -
- 1 file changed, 1 deletion(-)
-
---- a/configs/rockpro64-rk3399_defconfig
-+++ b/configs/rockpro64-rk3399_defconfig
-@@ -12,7 +12,6 @@ CONFIG_SPL_SPI_FLASH_SUPPORT=y
- CONFIG_SPL_SPI_SUPPORT=y
- CONFIG_DEFAULT_DEVICE_TREE="rk3399-rockpro64"
- CONFIG_DEBUG_UART=y
--CONFIG_USE_PREBOOT=y
- CONFIG_DEFAULT_FDT_FILE="rockchip/rk3399-rockpro64.dtb"
- CONFIG_DISPLAY_BOARDINFO_LATE=y
- CONFIG_MISC_INIT_R=y
diff --git a/package/boot/uboot-rockchip/patches/102-arm64-rk3399-Add-support-NanoPi-R4s.patch b/package/boot/uboot-rockchip/patches/102-arm64-rk3399-Add-support-NanoPi-R4s.patch
deleted file mode 100644
index f926f52efe2..00000000000
--- a/package/boot/uboot-rockchip/patches/102-arm64-rk3399-Add-support-NanoPi-R4s.patch
+++ /dev/null
@@ -1,290 +0,0 @@
-From b69b9f3f54732c303939eb748aad97cd4cf60168 Mon Sep 17 00:00:00 2001
-From: Xiaobo Tian <peterwillcn@gmail.com>
-Date: Sat, 27 Feb 2021 22:39:11 +0800
-Subject: [PATCH] arm64: rk3399: Add support NanoPi R4s
-
-NanoPi R4s is SBC base on Rockchip RK3399 hexa-core processor with
-dual-Core Cortex-A72 and Mali-T864 GPU with 4GiB(LPDDR4) of RAM, SD card support,
-including 2 gigabit ethernet(RTL8211E 1Gbps - RTL8111H 1Gbps) and 2 USB 3.0 port.
-port.It also has two GPIO headers which allows further peripherals to be used.
-
-The devicetree file is taken of the rk3399 nanopi4 Linux kernel [1].
-
-[1] https://github.com/torvalds/linux/commit/e7a095908227fb3ccc86d001d9e13c9ae2bef8e6
-
-Signed-off-by: xiaobo <peterwillcn@gmail.com>
-Reviewed-by: Kever Yang <kever.yang@rock-chips.com>
----
- arch/arm/dts/Makefile | 1 +
- arch/arm/dts/rk3399-nanopi-r4s-u-boot.dtsi | 16 +++
- arch/arm/dts/rk3399-nanopi-r4s.dts | 138 +++++++++++++++++++++
- board/rockchip/evb_rk3399/MAINTAINERS | 6 +
- configs/nanopi-r4s-rk3399_defconfig | 62 +++++++++
- 5 files changed, 223 insertions(+)
- create mode 100644 arch/arm/dts/rk3399-nanopi-r4s-u-boot.dtsi
- create mode 100644 arch/arm/dts/rk3399-nanopi-r4s.dts
- create mode 100644 configs/nanopi-r4s-rk3399_defconfig
-
-diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
-index dd4d4efed31..0a139473811 100644
---- a/arch/arm/dts/Makefile
-+++ b/arch/arm/dts/Makefile
-@@ -132,6 +132,7 @@ dtb-$(CONFIG_ROCKCHIP_RK3399) += \
- rk3399-nanopi-m4.dtb \
- rk3399-nanopi-m4-2gb.dtb \
- rk3399-nanopi-neo4.dtb \
-+ rk3399-nanopi-r4s.dtb \
- rk3399-orangepi.dtb \
- rk3399-pinebook-pro.dtb \
- rk3399-puma-haikou.dtb \
-diff --git a/arch/arm/dts/rk3399-nanopi-r4s-u-boot.dtsi b/arch/arm/dts/rk3399-nanopi-r4s-u-boot.dtsi
-new file mode 100644
-index 00000000000..cd1642527ba
---- /dev/null
-+++ b/arch/arm/dts/rk3399-nanopi-r4s-u-boot.dtsi
-@@ -0,0 +1,16 @@
-+// SPDX-License-Identifier: GPL-2.0+
-+/*
-+ * RK3399-based FriendlyElec boards device tree source
-+ *
-+ * Copyright (c) 2016 Fuzhou Rockchip Electronics Co., Ltd
-+ *
-+ * Copyright (c) 2018 FriendlyElec Computer Tech. Co., Ltd.
-+ * (http://www.friendlyarm.com)
-+ *
-+ * Copyright (c) 2018 Collabora Ltd.
-+ * Copyright (c) 2019 Arm Ltd.
-+ * Copyright (C) 2020 Xiaobo <peterwillcn@gmail.com>
-+ */
-+
-+#include "rk3399-nanopi4-u-boot.dtsi"
-+#include "rk3399-sdram-lpddr4-100.dtsi"
-diff --git a/arch/arm/dts/rk3399-nanopi-r4s.dts b/arch/arm/dts/rk3399-nanopi-r4s.dts
-new file mode 100644
-index 00000000000..6f2cf17bf1b
---- /dev/null
-+++ b/arch/arm/dts/rk3399-nanopi-r4s.dts
-@@ -0,0 +1,138 @@
-+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
-+/*
-+ * Copyright (c) 2016 Fuzhou Rockchip Electronics Co., Ltd
-+ *
-+ * Copyright (c) 2018 FriendlyElec Computer Tech. Co., Ltd.
-+ * (http://www.friendlyarm.com)
-+ *
-+ * Copyright (c) 2018 Collabora Ltd.
-+ * Copyright (c) 2019 Arm Ltd.
-+ * Copyright (C) 2020 Xiaobo <peterwillcn@gmail.com>
-+ */
-+
-+/dts-v1/;
-+#include "rk3399-nanopi4.dtsi"
-+
-+/ {
-+ model = "FriendlyElec NanoPi R4S";
-+ compatible = "friendlyarm,nanopi-r4s", "rockchip,rk3399";
-+
-+ aliases {
-+ ethernet1 = &r8169;
-+ };
-+
-+ vdd_5v: vdd-5v {
-+ compatible = "regulator-fixed";
-+ regulator-name = "vdd_5v";
-+ regulator-always-on;
-+ regulator-boot-on;
-+ };
-+
-+ fan: pwm-fan {
-+ compatible = "pwm-fan";
-+ cooling-levels = <0 12 18 255>;
-+ #cooling-cells = <2>;
-+ fan-supply = <&vdd_5v>;
-+ pwms = <&pwm1 0 50000 0>;
-+ };
-+};
-+
-+&cpu_thermal {
-+ trips {
-+ cpu_warm: cpu_warm {
-+ temperature = <55000>;
-+ hysteresis = <2000>;
-+ type = "active";
-+ };
-+
-+ cpu_hot: cpu_hot {
-+ temperature = <65000>;
-+ hysteresis = <2000>;
-+ type = "active";
-+ };
-+ };
-+
-+ cooling-maps {
-+ map2 {
-+ trip = <&cpu_warm>;
-+ cooling-device = <&fan THERMAL_NO_LIMIT 1>;
-+ };
-+
-+ map3 {
-+ trip = <&cpu_hot>;
-+ cooling-device = <&fan 2 THERMAL_NO_LIMIT>;
-+ };
-+ };
-+};
-+
-+&emmc_phy {
-+ status = "disabled";
-+};
-+
-+&fusb0 {
-+ status = "disabled";
-+};
-+
-+&leds {
-+ lan_led: led-1 {
-+ gpios = <&gpio1 RK_PA1 GPIO_ACTIVE_HIGH>;
-+ label = "nanopi-r4s:green:lan";
-+ };
-+
-+ wan_led: led-2 {
-+ gpios = <&gpio1 RK_PA0 GPIO_ACTIVE_HIGH>;
-+ label = "nanopi-r4s:green:wan";
-+ };
-+};
-+
-+&leds_gpio {
-+ rockchip,pins =
-+ <0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>,
-+ <1 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>,
-+ <1 RK_PA1 RK_FUNC_GPIO &pcfg_pull_none>;
-+};
-+
-+&pcie0 {
-+ max-link-speed = <1>;
-+ num-lanes = <1>;
-+ vpcie3v3-supply = <&vcc3v3_sys>;
-+
-+ pcie@0 {
-+ reg = <0x00000000 0 0 0 0>;
-+ #address-cells = <3>;
-+ #size-cells = <2>;
-+
-+ r8169: pcie@0,0 {
-+ reg = <0x000000 0 0 0 0>;
-+ local-mac-address = [ 00 00 00 00 00 00 ];
-+ };
-+ };
-+};
-+
-+&sdhci {
-+ status = "disabled";
-+};
-+
-+&sdio0 {
-+ status = "disabled";
-+};
-+
-+&sdmmc {
-+ host-index-min = <1>;
-+};
-+
-+&u2phy0_host {
-+ phy-supply = <&vdd_5v>;
-+};
-+
-+&u2phy1_host {
-+ status = "disabled";
-+};
-+
-+&usbdrd_dwc3_0 {
-+ dr_mode = "host";
-+};
-+
-+&vcc3v3_sys {
-+ vin-supply = <&vcc5v0_sys>;
-+};
-diff --git a/board/rockchip/evb_rk3399/MAINTAINERS b/board/rockchip/evb_rk3399/MAINTAINERS
-index 4c889e06a63..3b9d60eccd4 100644
---- a/board/rockchip/evb_rk3399/MAINTAINERS
-+++ b/board/rockchip/evb_rk3399/MAINTAINERS
-@@ -55,6 +55,12 @@ S: Maintained
- F: configs/nanopi-neo4-rk3399_defconfig
- F: arch/arm/dts/rk3399-nanopi-neo4-u-boot.dtsi
-
-+NANOPI-R4S
-+M: Xiaobo Tian <peterwillcn@gmail.com>
-+S: Maintained
-+F: configs/nanopi-r4s-rk3399_defconfig
-+F: arch/arm/dts/rk3399-nanopi-r4s-u-boot.dtsi
-+
- ORANGEPI-RK3399
- M: Jagan Teki <jagan@amarulasolutions.com>
- S: Maintained
-diff --git a/configs/nanopi-r4s-rk3399_defconfig b/configs/nanopi-r4s-rk3399_defconfig
-new file mode 100644
-index 00000000000..0a3c28b0126
---- /dev/null
-+++ b/configs/nanopi-r4s-rk3399_defconfig
-@@ -0,0 +1,62 @@
-+CONFIG_ARM=y
-+CONFIG_ARCH_ROCKCHIP=y
-+CONFIG_SYS_TEXT_BASE=0x00200000
-+CONFIG_ENV_OFFSET=0x3F8000
-+CONFIG_ROCKCHIP_RK3399=y
-+CONFIG_TARGET_EVB_RK3399=y
-+CONFIG_NR_DRAM_BANKS=1
-+CONFIG_DEBUG_UART_BASE=0xFF1A0000
-+CONFIG_DEBUG_UART_CLOCK=24000000
-+CONFIG_DEBUG_UART=y
-+CONFIG_DEFAULT_FDT_FILE="rockchip/rk3399-nanopi-r4s.dtb"
-+CONFIG_DISPLAY_BOARDINFO_LATE=y
-+# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
-+CONFIG_SPL_STACK_R=y
-+CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x10000
-+CONFIG_TPL=y
-+CONFIG_CMD_BOOTZ=y
-+CONFIG_CMD_GPT=y
-+CONFIG_CMD_MMC=y
-+CONFIG_CMD_USB=y
-+# CONFIG_CMD_SETEXPR is not set
-+CONFIG_CMD_TIME=y
-+CONFIG_SPL_OF_CONTROL=y
-+CONFIG_DEFAULT_DEVICE_TREE="rk3399-nanopi-r4s"
-+CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
-+CONFIG_ENV_IS_IN_MMC=y
-+CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-+CONFIG_ROCKCHIP_GPIO=y
-+CONFIG_SYS_I2C_ROCKCHIP=y
-+CONFIG_MMC_DW=y
-+CONFIG_MMC_DW_ROCKCHIP=y
-+CONFIG_MMC_SDHCI=y
-+CONFIG_MMC_SDHCI_ROCKCHIP=y
-+CONFIG_DM_ETH=y
-+CONFIG_ETH_DESIGNWARE=y
-+CONFIG_GMAC_ROCKCHIP=y
-+CONFIG_PMIC_RK8XX=y
-+CONFIG_REGULATOR_PWM=y
-+CONFIG_REGULATOR_RK8XX=y
-+CONFIG_PWM_ROCKCHIP=y
-+CONFIG_RAM_RK3399_LPDDR4=y
-+CONFIG_BAUDRATE=1500000
-+CONFIG_DEBUG_UART_SHIFT=2
-+CONFIG_SYSRESET=y
-+CONFIG_USB=y
-+CONFIG_USB_XHCI_HCD=y
-+CONFIG_USB_XHCI_DWC3=y
-+CONFIG_USB_EHCI_HCD=y
-+CONFIG_USB_EHCI_GENERIC=y
-+CONFIG_USB_KEYBOARD=y
-+CONFIG_USB_HOST_ETHER=y
-+CONFIG_USB_ETHER_ASIX=y
-+CONFIG_USB_ETHER_ASIX88179=y
-+CONFIG_USB_ETHER_MCS7830=y
-+CONFIG_USB_ETHER_RTL8152=y
-+CONFIG_USB_ETHER_SMSC95XX=y
-+CONFIG_DM_VIDEO=y
-+CONFIG_DISPLAY=y
-+CONFIG_VIDEO_ROCKCHIP=y
-+CONFIG_DISPLAY_ROCKCHIP_HDMI=y
-+CONFIG_SPL_TINY_MEMSET=y
-+CONFIG_ERRNO_STR=y
diff --git a/package/boot/uboot-rockchip/patches/105-nanopc-t4-fix-memory-unstability.patch b/package/boot/uboot-rockchip/patches/105-nanopc-t4-fix-memory-unstability.patch
new file mode 100644
index 00000000000..b467f48f72b
--- /dev/null
+++ b/package/boot/uboot-rockchip/patches/105-nanopc-t4-fix-memory-unstability.patch
@@ -0,0 +1,22 @@
+From 445502bc21ecf1b5120faee785cea578b810c759 Mon Sep 17 00:00:00 2001
+From: Lu jicong <jiconglu58@gmail.com>
+Date: Wed, 5 Jul 2023 17:13:55 +0800
+Subject: [PATCH] rockchip: rk3399: nanopc-t4: use 1600MHz sdram config
+
+Current 1866MHz sdram config is too high for NanoPC-T4.
+On this frequency, its lpddr3 sdram becomes unstable,
+causing memtest failures and random kernel crashes.
+
+Signed-off-by: Lu jicong <jiconglu58@gmail.com>
+---
+ arch/arm/dts/rk3399-nanopc-t4-u-boot.dtsi | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/arch/arm/dts/rk3399-nanopc-t4-u-boot.dtsi
++++ b/arch/arm/dts/rk3399-nanopc-t4-u-boot.dtsi
+@@ -4,4 +4,4 @@
+ */
+
+ #include "rk3399-nanopi4-u-boot.dtsi"
+-#include "rk3399-sdram-lpddr3-samsung-4GB-1866.dtsi"
++#include "rk3399-sdram-lpddr3-4GB-1600.dtsi"
diff --git a/package/boot/uboot-rockchip/src/of-platdata/nanopi-r2s-rk3328/dt-plat.c b/package/boot/uboot-rockchip/src/of-platdata/nanopi-r2s-rk3328/dt-plat.c
deleted file mode 100644
index 1818461ec8e..00000000000
--- a/package/boot/uboot-rockchip/src/of-platdata/nanopi-r2s-rk3328/dt-plat.c
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * DO NOT MODIFY
- *
- * Declares the U_BOOT_DRIVER() records and platform data.
- * This was generated by dtoc from a .dtb (device tree binary) file.
- */
-
-/* Allow use of U_BOOT_DRVINFO() in this file */
-#define DT_PLAT_C
-
-#include <common.h>
-#include <dm.h>
-#include <dt-structs.h>
-
-/* Node /clock-controller@ff440000 index 0 */
-static struct dtd_rockchip_rk3328_cru dtv_clock_controller_at_ff440000 = {
- .reg = {0xff440000, 0x1000},
- .rockchip_grf = 0x3a,
-};
-U_BOOT_DRVINFO(clock_controller_at_ff440000) = {
- .name = "rockchip_rk3328_cru",
- .plat = &dtv_clock_controller_at_ff440000,
- .plat_size = sizeof(dtv_clock_controller_at_ff440000),
- .parent_idx = -1,
-};
-
-/* Node /dmc index 1 */
-static struct dtd_rockchip_rk3328_dmc dtv_dmc = {
- .reg = {0xff400000, 0x1000, 0xff780000, 0x3000, 0xff100000, 0x1000, 0xff440000, 0x1000,
- 0xff720000, 0x1000, 0xff798000, 0x1000},
- .rockchip_sdram_params = {0x1, 0xa, 0x2, 0x1, 0x0, 0x0, 0x11, 0x0,
- 0x11, 0x0, 0x0, 0x94291288, 0x0, 0x27, 0x462, 0x15,
- 0x242, 0xff, 0x14d, 0x0, 0x1, 0x0, 0x0, 0x0,
- 0x43049010, 0x64, 0x28003b, 0xd0, 0x20053, 0xd4, 0x220000, 0xd8,
- 0x100, 0xdc, 0x40000, 0xe0, 0x0, 0xe4, 0x110000, 0xe8,
- 0x420, 0xec, 0x400, 0xf4, 0xf011f, 0x100, 0x9060b06, 0x104,
- 0x20209, 0x108, 0x505040a, 0x10c, 0x40400c, 0x110, 0x5030206, 0x114,
- 0x3030202, 0x120, 0x3030b03, 0x124, 0x20208, 0x180, 0x1000040, 0x184,
- 0x0, 0x190, 0x7030003, 0x198, 0x5001100, 0x1a0, 0xc0400003, 0x240,
- 0x6000604, 0x244, 0x201, 0x250, 0xf00, 0x490, 0x1, 0xffffffff,
- 0xffffffff, 0xffffffff, 0xffffffff, 0x4, 0xc, 0x28, 0xa, 0x2c,
- 0x0, 0x30, 0x9, 0xffffffff, 0xffffffff, 0x77, 0x88, 0x79,
- 0x79, 0x87, 0x97, 0x87, 0x78, 0x77, 0x78, 0x87,
- 0x88, 0x87, 0x87, 0x77, 0x78, 0x78, 0x78, 0x78,
- 0x78, 0x78, 0x78, 0x78, 0x78, 0x69, 0x9, 0x77,
- 0x78, 0x77, 0x78, 0x77, 0x78, 0x77, 0x78, 0x77,
- 0x79, 0x9, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
- 0x78, 0x78, 0x78, 0x69, 0x9, 0x77, 0x78, 0x77,
- 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x79, 0x9,
- 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
- 0x78, 0x69, 0x9, 0x77, 0x78, 0x77, 0x78, 0x77,
- 0x78, 0x77, 0x78, 0x77, 0x79, 0x9, 0x78, 0x78,
- 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x69,
- 0x9, 0x77, 0x78, 0x77, 0x77, 0x77, 0x77, 0x77,
- 0x77, 0x77, 0x79, 0x9},
-};
-U_BOOT_DRVINFO(dmc) = {
- .name = "rockchip_rk3328_dmc",
- .plat = &dtv_dmc,
- .plat_size = sizeof(dtv_dmc),
- .parent_idx = -1,
-};
-
-/* Node /mmc@ff500000 index 2 */
-static struct dtd_rockchip_rk3288_dw_mshc dtv_mmc_at_ff500000 = {
- .bus_width = 0x4,
- .cap_sd_highspeed = true,
- .clocks = {
- {0, {317}},
- {0, {33}},
- {0, {74}},
- {0, {78}},},
- .disable_wp = true,
- .fifo_depth = 0x100,
- .interrupts = {0x0, 0xc, 0x4},
- .max_frequency = 0x8f0d180,
- .pinctrl_0 = {0x47, 0x48, 0x49, 0x4a},
- .pinctrl_names = "default",
- .reg = {0xff500000, 0x4000},
- .sd_uhs_sdr104 = true,
- .sd_uhs_sdr12 = true,
- .sd_uhs_sdr25 = true,
- .sd_uhs_sdr50 = true,
- .u_boot_spl_fifo_mode = true,
- .vmmc_supply = 0x4b,
- .vqmmc_supply = 0x1e,
-};
-U_BOOT_DRVINFO(mmc_at_ff500000) = {
- .name = "rockchip_rk3288_dw_mshc",
- .plat = &dtv_mmc_at_ff500000,
- .plat_size = sizeof(dtv_mmc_at_ff500000),
- .parent_idx = -1,
-};
-
-/* Node /serial@ff130000 index 3 */
-static struct dtd_ns16550_serial dtv_serial_at_ff130000 = {
- .clock_frequency = 0x16e3600,
- .clocks = {
- {0, {40}},
- {0, {212}},},
- .dma_names = {"tx", "rx"},
- .dmas = {0x10, 0x6, 0x10, 0x7},
- .interrupts = {0x0, 0x39, 0x4},
- .pinctrl_0 = 0x26,
- .pinctrl_names = "default",
- .reg = {0xff130000, 0x100},
- .reg_io_width = 0x4,
- .reg_shift = 0x2,
-};
-U_BOOT_DRVINFO(serial_at_ff130000) = {
- .name = "ns16550_serial",
- .plat = &dtv_serial_at_ff130000,
- .plat_size = sizeof(dtv_serial_at_ff130000),
- .parent_idx = -1,
-};
-
-/* Node /syscon@ff100000 index 4 */
-static struct dtd_rockchip_rk3328_grf dtv_syscon_at_ff100000 = {
- .reg = {0xff100000, 0x1000},
-};
-U_BOOT_DRVINFO(syscon_at_ff100000) = {
- .name = "rockchip_rk3328_grf",
- .plat = &dtv_syscon_at_ff100000,
- .plat_size = sizeof(dtv_syscon_at_ff100000),
- .parent_idx = -1,
-};
-
diff --git a/package/boot/uboot-rockchip/src/of-platdata/nanopi-r2s-rk3328/dt-structs-gen.h b/package/boot/uboot-rockchip/src/of-platdata/nanopi-r2s-rk3328/dt-structs-gen.h
deleted file mode 100644
index b1ff08a9278..00000000000
--- a/package/boot/uboot-rockchip/src/of-platdata/nanopi-r2s-rk3328/dt-structs-gen.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * DO NOT MODIFY
- *
- * Defines the structs used to hold devicetree data.
- * This was generated by dtoc from a .dtb (device tree binary) file.
- */
-
-#include <stdbool.h>
-#include <linux/libfdt.h>
-struct dtd_ns16550_serial {
- fdt32_t clock_frequency;
- struct phandle_1_arg clocks[2];
- const char * dma_names[2];
- fdt32_t dmas[4];
- fdt32_t interrupts[3];
- fdt32_t pinctrl_0;
- const char * pinctrl_names;
- fdt64_t reg[2];
- fdt32_t reg_io_width;
- fdt32_t reg_shift;
-};
-struct dtd_rockchip_rk3288_dw_mshc {
- fdt32_t bus_width;
- bool cap_sd_highspeed;
- struct phandle_1_arg clocks[4];
- bool disable_wp;
- fdt32_t fifo_depth;
- fdt32_t interrupts[3];
- fdt32_t max_frequency;
- fdt32_t pinctrl_0[4];
- const char * pinctrl_names;
- fdt64_t reg[2];
- bool sd_uhs_sdr104;
- bool sd_uhs_sdr12;
- bool sd_uhs_sdr25;
- bool sd_uhs_sdr50;
- bool u_boot_spl_fifo_mode;
- fdt32_t vmmc_supply;
- fdt32_t vqmmc_supply;
-};
-struct dtd_rockchip_rk3328_cru {
- fdt64_t reg[2];
- fdt32_t rockchip_grf;
-};
-struct dtd_rockchip_rk3328_dmc {
- fdt64_t reg[12];
- fdt32_t rockchip_sdram_params[196];
-};
-struct dtd_rockchip_rk3328_grf {
- fdt64_t reg[2];
-};
diff --git a/package/boot/uboot-sifiveu/Makefile b/package/boot/uboot-sifiveu/Makefile
new file mode 100644
index 00000000000..4cbfe344af8
--- /dev/null
+++ b/package/boot/uboot-sifiveu/Makefile
@@ -0,0 +1,65 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# Copyright (C) 2022 OpenWrt.org
+#
+
+include $(TOPDIR)/rules.mk
+include $(INCLUDE_DIR)/kernel.mk
+
+PKG_RELEASE:=1
+PKG_VERSION:=2022.10
+PKG_HASH:=50b4482a505bc281ba8470c399a3c26e145e29b23500bc35c50debd7fa46bdf8
+
+UBOOT_USE_INTREE_DTC:=1
+
+include $(INCLUDE_DIR)/u-boot.mk
+include $(INCLUDE_DIR)/package.mk
+
+define U-Boot/Default
+ BUILD_TARGET:=sifiveu
+ BUILD_DEVICES=$(1)
+ UBOOT_IMAGE:=u-boot.itb
+ DTS_DIR:=arch/riscv/dts
+ UENV:=default
+ DEFAULT:=y
+endef
+
+define U-Boot/sifive_unleashed
+ NAME:=SiFive Unleashed
+ OPENSBI:=generic
+ DEPENDS:=+opensbi_generic
+ UBOOT_DTS:=hifive-unleashed-a00.dtb
+ BUILD_DEVICES:=sifive_unleashed
+endef
+
+define U-Boot/sifive_unmatched
+ NAME:=SiFive Unmatched
+ OPENSBI:=generic
+ DEPENDS:=+opensbi_generic
+ UBOOT_DTS:=hifive-unmatched-a00.dtb
+ BUILD_DEVICES:=sifive_unmatched
+endef
+
+UBOOT_TARGETS := \
+ sifive_unleashed \
+ sifive_unmatched
+
+UBOOT_MAKE_FLAGS += \
+ OPENSBI=$(STAGING_DIR_IMAGE)/fw_dynamic-${OPENSBI}.bin
+
+define Build/Configure
+ $(call Build/Configure/U-Boot)
+ sed -i 's/CONFIG_TOOLS_LIBCRYPTO=y/# CONFIG_TOOLS_LIBCRYPTO is not set/' $(PKG_BUILD_DIR)/.config
+endef
+
+define Build/InstallDev
+ $(INSTALL_DIR) $(STAGING_DIR_IMAGE)
+ $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(UBOOT_IMAGE) $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-$(UBOOT_IMAGE)
+ $(INSTALL_BIN) $(PKG_BUILD_DIR)/spl/u-boot-spl.bin $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-$(UBOOT_IMAGE)-spl
+ $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(DTS_DIR)/$(UBOOT_DTS) $(STAGING_DIR_IMAGE)/$(UBOOT_DTS)
+
+ mkimage -C none -A arm -T script -d uEnv-$(UENV).txt \
+ $(STAGING_DIR_IMAGE)/$(BUILD_DEVICES)-boot.scr
+endef
+
+$(eval $(call BuildPackage/U-Boot))
diff --git a/package/boot/uboot-sifiveu/patches/0002-board-sifive-spl-Initialized-the-PWM-setting-in-the-.patch b/package/boot/uboot-sifiveu/patches/0002-board-sifive-spl-Initialized-the-PWM-setting-in-the-.patch
new file mode 100644
index 00000000000..27cda75326f
--- /dev/null
+++ b/package/boot/uboot-sifiveu/patches/0002-board-sifive-spl-Initialized-the-PWM-setting-in-the-.patch
@@ -0,0 +1,104 @@
+From 725595e667cc4423347c255da8ca4c5b3aa0980a Mon Sep 17 00:00:00 2001
+From: Vincent Chen <vincent.chen@sifive.com>
+Date: Mon, 15 Nov 2021 03:31:04 -0800
+Subject: [PATCH 2/8] board: sifive: spl: Initialized the PWM setting in the
+ SPL stage
+
+LEDs and multiple fans can be controlled by SPL. This patch ensures
+that all fans have been enabled in the SPL stage. In addition, the
+LED's color will be set to yellow.
+---
+ board/sifive/unmatched/Makefile | 1 +
+ board/sifive/unmatched/pwm.c | 57 +++++++++++++++++++++++++++++++++
+ board/sifive/unmatched/spl.c | 2 ++
+ 3 files changed, 60 insertions(+)
+ create mode 100644 board/sifive/unmatched/pwm.c
+
+diff --git a/board/sifive/unmatched/Makefile b/board/sifive/unmatched/Makefile
+index 1345330089..5df01982e9 100644
+--- a/board/sifive/unmatched/Makefile
++++ b/board/sifive/unmatched/Makefile
+@@ -9,3 +9,4 @@ obj-y += spl.o
+ else
+ obj-y += unmatched.o
+ endif
++obj-y += pwm.o
+diff --git a/board/sifive/unmatched/pwm.c b/board/sifive/unmatched/pwm.c
+new file mode 100644
+index 0000000000..e1cc02310a
+--- /dev/null
++++ b/board/sifive/unmatched/pwm.c
+@@ -0,0 +1,57 @@
++// SPDX-License-Identifier: GPL-2.0+
++/*
++ * Copyright (c) 2021, SiFive Inc
++ *
++ * Authors:
++ * Vincent Chen <vincent.chen@sifive.com>
++ * David Abdurachmanov <david.abdurachmanov@sifive.com>
++ */
++
++#include <linux/io.h>
++#include <asm/arch/eeprom.h>
++
++struct pwm_sifive_regs {
++ unsigned int cfg; /* PWM configuration register */
++ unsigned int pad0; /* Reserved */
++ unsigned int cnt; /* PWM count register */
++ unsigned int pad1; /* Reserved */
++ unsigned int pwms; /* Scaled PWM count register */
++ unsigned int pad2; /* Reserved */
++ unsigned int pad3; /* Reserved */
++ unsigned int pad4; /* Reserved */
++ unsigned int cmp0; /* PWM 0 compare register */
++ unsigned int cmp1; /* PWM 1 compare register */
++ unsigned int cmp2; /* PWM 2 compare register */
++ unsigned int cmp3; /* PWM 3 compare register */
++};
++
++#define PWM0_BASE 0x10020000
++#define PWM1_BASE 0x10021000
++#define PWM_CFG_INIT 0x1000
++#define PWM_CMP_ENABLE_VAL 0x0
++#define PWM_CMP_DISABLE_VAL 0xffff
++
++void pwm_device_init(void)
++{
++ struct pwm_sifive_regs *pwm0, *pwm1;
++ pwm0 = (struct pwm_sifive_regs *)PWM0_BASE;
++ pwm1 = (struct pwm_sifive_regs *)PWM1_BASE;
++ writel(PWM_CMP_DISABLE_VAL, (void *)&pwm0->cmp0);
++ /* Set the 3-color PWM LEDs to yellow in SPL */
++ writel(PWM_CMP_ENABLE_VAL, (void *)&pwm0->cmp1);
++ writel(PWM_CMP_ENABLE_VAL, (void *)&pwm0->cmp2);
++ writel(PWM_CMP_DISABLE_VAL, (void *)&pwm0->cmp3);
++ writel(PWM_CFG_INIT, (void *)&pwm0->cfg);
++
++ writel(PWM_CMP_DISABLE_VAL, (void *)&pwm0->cmp3);
++ /* Turn on all the fans, (J21), (J23) and (J24), on the unmatched board */
++ /* The SoC fan(J21) on the rev3 board cannot be controled by PWM_COMP0,
++ so here sets the initial value of PWM_COMP0 as DISABLE */
++ if (get_pcb_revision_from_eeprom() == PCB_REVISION_REV3)
++ writel(PWM_CMP_DISABLE_VAL, (void *)&pwm1->cmp1);
++ else
++ writel(PWM_CMP_ENABLE_VAL, (void *)&pwm1->cmp1);
++ writel(PWM_CMP_ENABLE_VAL, (void *)&pwm1->cmp2);
++ writel(PWM_CMP_ENABLE_VAL, (void *)&pwm1->cmp3);
++ writel(PWM_CFG_INIT, (void *)&pwm1->cfg);
++}
+diff --git a/board/sifive/unmatched/spl.c b/board/sifive/unmatched/spl.c
+index 7c0beedc08..f3a661a81e 100644
+--- a/board/sifive/unmatched/spl.c
++++ b/board/sifive/unmatched/spl.c
+@@ -90,6 +90,8 @@ int spl_board_init_f(void)
+ goto end;
+ }
+
++ pwm_device_init();
++
+ ret = spl_gemgxl_init();
+ if (ret) {
+ debug("Gigabit ethernet PHY (VSC8541) init failed: %d\n", ret);
+--
+2.27.0
+
diff --git a/package/boot/uboot-sifiveu/patches/0003-board-sifive-Set-LED-s-color-to-purple-in-the-U-boot.patch b/package/boot/uboot-sifiveu/patches/0003-board-sifive-Set-LED-s-color-to-purple-in-the-U-boot.patch
new file mode 100644
index 00000000000..9820d2e2f9d
--- /dev/null
+++ b/package/boot/uboot-sifiveu/patches/0003-board-sifive-Set-LED-s-color-to-purple-in-the-U-boot.patch
@@ -0,0 +1,68 @@
+From 7ead6d662a2f9d8498af6650ea38418c64b52048 Mon Sep 17 00:00:00 2001
+From: Vincent Chen <vincent.chen@sifive.com>
+Date: Mon, 24 Jan 2022 02:42:02 -0800
+Subject: [PATCH 3/8] board: sifive: Set LED's color to purple in the U-boot
+ stage
+
+Set LED's color to purple in the U-boot stage. Because there are still
+some functions to be executed before board_early_init_f(), it means
+the LED's is not changed to purple instantly when entering the U-boot
+stage.
+---
+ board/sifive/unmatched/pwm.c | 7 +++++++
+ board/sifive/unmatched/unmatched.c | 6 ++++++
+ configs/sifive_unmatched_defconfig | 1 +
+ 3 files changed, 14 insertions(+)
+
+diff --git a/board/sifive/unmatched/pwm.c b/board/sifive/unmatched/pwm.c
+index e1cc02310a..bd67672c22 100644
+--- a/board/sifive/unmatched/pwm.c
++++ b/board/sifive/unmatched/pwm.c
+@@ -36,6 +36,7 @@ void pwm_device_init(void)
+ struct pwm_sifive_regs *pwm0, *pwm1;
+ pwm0 = (struct pwm_sifive_regs *)PWM0_BASE;
+ pwm1 = (struct pwm_sifive_regs *)PWM1_BASE;
++#ifdef CONFIG_SPL_BUILD
+ writel(PWM_CMP_DISABLE_VAL, (void *)&pwm0->cmp0);
+ /* Set the 3-color PWM LEDs to yellow in SPL */
+ writel(PWM_CMP_ENABLE_VAL, (void *)&pwm0->cmp1);
+@@ -54,4 +55,10 @@ void pwm_device_init(void)
+ writel(PWM_CMP_ENABLE_VAL, (void *)&pwm1->cmp2);
+ writel(PWM_CMP_ENABLE_VAL, (void *)&pwm1->cmp3);
+ writel(PWM_CFG_INIT, (void *)&pwm1->cfg);
++#else
++ /* Set the 3-color PWM LEDs to purple in U-boot */
++ writel(PWM_CMP_DISABLE_VAL, (void *)&pwm0->cmp1);
++ writel(PWM_CMP_ENABLE_VAL, (void *)&pwm0->cmp2);
++ writel(PWM_CMP_ENABLE_VAL, (void *)&pwm0->cmp3);
++#endif
+ }
+diff --git a/board/sifive/unmatched/unmatched.c b/board/sifive/unmatched/unmatched.c
+index 6295deeae2..30c082d001 100644
+--- a/board/sifive/unmatched/unmatched.c
++++ b/board/sifive/unmatched/unmatched.c
+@@ -22,6 +22,12 @@ void *board_fdt_blob_setup(int *err)
+ return (ulong *)&_end;
+ }
+
++int board_early_init_f(void)
++{
++ pwm_device_init();
++ return 0;
++}
++
+ int board_init(void)
+ {
+ /* enable all cache ways */
+diff --git a/configs/sifive_unmatched_defconfig b/configs/sifive_unmatched_defconfig
+index d400ed0b23..0758f8e90f 100644
+--- a/configs/sifive_unmatched_defconfig
++++ b/configs/sifive_unmatched_defconfig
+@@ -51,3 +51,4 @@ CONFIG_DM_SCSI=y
+ CONFIG_USB=y
+ CONFIG_USB_XHCI_HCD=y
+ CONFIG_USB_XHCI_PCI=y
++CONFIG_BOARD_EARLY_INIT_F=y
+--
+2.27.0
+
diff --git a/package/boot/uboot-sifiveu/patches/0004-board-sifive-Set-LED-s-color-to-blue-before-jumping-.patch b/package/boot/uboot-sifiveu/patches/0004-board-sifive-Set-LED-s-color-to-blue-before-jumping-.patch
new file mode 100644
index 00000000000..b5bffd22bd6
--- /dev/null
+++ b/package/boot/uboot-sifiveu/patches/0004-board-sifive-Set-LED-s-color-to-blue-before-jumping-.patch
@@ -0,0 +1,30 @@
+From 6ef7023c0dcfde320015ab19e0e0d423921be77d Mon Sep 17 00:00:00 2001
+From: Vincent Chen <vincent.chen@sifive.com>
+Date: Mon, 15 Nov 2021 03:39:07 -0800
+Subject: [PATCH 1/2] board: sifive: Set LED's color to blue before jumping to
+ Linux
+
+The LED's color wil be changed from purple to blue before executing
+the sysboot command. Because the sysboot command includes the image loading
+from the boot partition, It means the LED's color is blue when executing
+"Retrieving file: /Image.gz".
+---
+ include/configs/sifive-unmatched.h | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+--- a/include/configs/sifive-unmatched.h
++++ b/include/configs/sifive-unmatched.h
+@@ -49,7 +49,12 @@
+ "type_guid_gpt_system=" TYPE_GUID_SYSTEM "\0" \
+ "partitions=" PARTS_DEFAULT "\0" \
+ "fdtfile=" CONFIG_DEFAULT_FDT_FILE "\0" \
+- BOOTENV
++ "setled_blue=mw.l 0x10020024 0x0000ffff; mw.l 0x10020028 0x0000ffff; mw.l 0x1002002c 0x0\0" \
++ BOOTENV \
++ "boot_extlinux=" \
++ "run setled_blue; " \
++ "sysboot ${devtype} ${devnum}:${distro_bootpart} any " \
++ "${scriptaddr} ${prefix}${boot_syslinux_conf};\0"
+
+ #define CONFIG_SYS_EEPROM_BUS_NUM 0
+
diff --git a/package/boot/uboot-sifiveu/patches/0005-board-sifive-spl-Set-remote-thermal-of-TMP451-to-85-.patch b/package/boot/uboot-sifiveu/patches/0005-board-sifive-spl-Set-remote-thermal-of-TMP451-to-85-.patch
new file mode 100644
index 00000000000..dc0d04151fa
--- /dev/null
+++ b/package/boot/uboot-sifiveu/patches/0005-board-sifive-spl-Set-remote-thermal-of-TMP451-to-85-.patch
@@ -0,0 +1,111 @@
+From 07f84ed283b913cbdf87181ae2ed65467d923df5 Mon Sep 17 00:00:00 2001
+From: Vincent Chen <vincent.chen@sifive.com>
+Date: Mon, 24 Jan 2022 02:57:40 -0800
+Subject: [PATCH 2/2] board: sifive: spl: Set remote thermal of TMP451 to 85
+ deg C for the unmatched board
+
+For TMP451 on the unmatched board, the default value of the remote
+thermal threshold is 108 deg C. This commit initilizes it to 85 deg C at SPL.
+---
+ board/sifive/unmatched/spl.c | 29 +++++++++++++++++++++++++++++
+ drivers/misc/Kconfig | 10 ++++++++++
+ include/configs/sifive-unmatched.h | 4 ++++
+ scripts/config_whitelist.txt | 1 +
+ 4 files changed, 44 insertions(+)
+
+--- a/board/sifive/unmatched/spl.c
++++ b/board/sifive/unmatched/spl.c
+@@ -10,6 +10,8 @@
+ #include <spl.h>
+ #include <misc.h>
+ #include <log.h>
++#include <config.h>
++#include <i2c.h>
+ #include <linux/delay.h>
+ #include <linux/io.h>
+ #include <asm/gpio.h>
+@@ -26,6 +28,27 @@
+ #define MODE_SELECT_SD 0xb
+ #define MODE_SELECT_MASK GENMASK(3, 0)
+
++#define TMP451_REMOTE_THERM_LIMIT_REG_OFFSET 0x19
++#define TMP451_REMOTE_THERM_LIMIT_INIT_VALUE 0x55
++
++static inline int init_tmp451_remote_therm_limit(void)
++{
++ struct udevice *dev;
++ unsigned char r_therm_limit = TMP451_REMOTE_THERM_LIMIT_INIT_VALUE;
++ int ret;
++
++ ret = i2c_get_chip_for_busnum(CONFIG_SYS_TMP451_BUS_NUM,
++ CONFIG_SYS_I2C_TMP451_ADDR,
++ CONFIG_SYS_I2C_TMP451_ADDR_LEN,
++ &dev);
++
++ if (!ret)
++ ret = dm_i2c_write(dev, TMP451_REMOTE_THERM_LIMIT_REG_OFFSET,
++ &r_therm_limit,
++ sizeof(unsigned char));
++ return ret;
++}
++
+ static inline int spl_reset_device_by_gpio(const char *label, int pin, int low_width)
+ {
+ int ret;
+@@ -92,6 +115,12 @@ int spl_board_init_f(void)
+
+ pwm_device_init();
+
++ ret = init_tmp451_remote_therm_limit();
++ if (ret) {
++ debug("TMP451 remote THERM limit init failed: %d\n", ret);
++ goto end;
++ }
++
+ ret = spl_gemgxl_init();
+ if (ret) {
+ debug("Gigabit ethernet PHY (VSC8541) init failed: %d\n", ret);
+--- a/drivers/misc/Kconfig
++++ b/drivers/misc/Kconfig
+@@ -536,8 +536,18 @@ config SYS_I2C_EEPROM_ADDR
+ depends on ID_EEPROM || I2C_EEPROM || SPL_I2C_EEPROM || CMD_EEPROM || ENV_IS_IN_EEPROM
+ default 0
+
++config SYS_I2C_TMP451_ADDR
++ hex "Chip address of the TMP451 device"
++ default 0
++
+ if I2C_EEPROM
+
++config SYS_I2C_TMP451_ADDR_LEN
++ int "Length in bytes of the TMP451 memory array address"
++ default 1
++ help
++ Note: This is NOT the chip address length!
++
+ config SYS_I2C_EEPROM_ADDR_OVERFLOW
+ hex "EEPROM Address Overflow"
+ default 0x0
+--- a/include/configs/sifive-unmatched.h
++++ b/include/configs/sifive-unmatched.h
+@@ -15,6 +15,10 @@
+
+ #define CONFIG_STANDALONE_LOAD_ADDR 0x80200000
+
++#define CONFIG_SYS_TMP451_BUS_NUM 0
++#define CONFIG_SYS_I2C_TMP451_ADDR 0x4c
++#define CONFIG_SYS_I2C_TMP451_ADDR_LEN 0x1
++
+ /* Environment options */
+
+ #define BOOT_TARGET_DEVICES(func) \
+--- a/scripts/config_whitelist.txt
++++ b/scripts/config_whitelist.txt
+@@ -1268,6 +1268,7 @@ CONFIG_SYS_TIMER_BASE
+ CONFIG_SYS_TIMER_COUNTER
+ CONFIG_SYS_TIMER_COUNTS_DOWN
+ CONFIG_SYS_TIMER_RATE
++CONFIG_SYS_TMP451_BUS_NUM
+ CONFIG_SYS_TMPVIRT
+ CONFIG_SYS_TSEC1_OFFSET
+ CONFIG_SYS_TX_ETH_BUFFER
diff --git a/package/boot/uboot-sifiveu/patches/0008-riscv-dts-Add-few-PMU-events.patch b/package/boot/uboot-sifiveu/patches/0008-riscv-dts-Add-few-PMU-events.patch
new file mode 100644
index 00000000000..3f3feb9da70
--- /dev/null
+++ b/package/boot/uboot-sifiveu/patches/0008-riscv-dts-Add-few-PMU-events.patch
@@ -0,0 +1,36 @@
+From c29e4d84cfa17ab96eff2a9044f486ba3c8b5c43 Mon Sep 17 00:00:00 2001
+From: Atish Patra <atish.patra@wdc.com>
+Date: Mon, 25 Oct 2021 11:35:41 -0700
+Subject: [PATCH] riscv: dts: Add few PMU events
+
+fu740 has 2 HPM counters and many HPM events defined in the fu740 manual[1].
+This patch adds some of these events and their mapping as per the
+OpenSBI PMU DT binding for now.
+
+[1]https://sifive.cdn.prismic.io/sifive/de1491e5-077c-461d-9605-e8a0ce57337d_fu740-c000-manual-v1p3.pdf
+
+Signed-off-by: Atish Patra <atish.patra@wdc.com>
+---
+ arch/riscv/dts/fu740-c000.dtsi | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+--- a/arch/riscv/dts/fu740-c000.dtsi
++++ b/arch/riscv/dts/fu740-c000.dtsi
+@@ -140,6 +140,17 @@
+ #size-cells = <2>;
+ compatible = "simple-bus";
+ ranges;
++ pmu {
++ compatible = "riscv,pmu";
++ riscv,raw-event-to-mhpmcounters = <0x00000000 0x200 0x18
++ 0x00000000 0x400 0x18
++ 0x00000000 0x800 0x18>;
++ riscv,event-to-mhpmcounters = <0x05 0x06 0x18
++ 0x10009 0x10009 0x18>;
++ riscv,event-to-mhpmevent = <0x05 0x00000000 0x4000
++ 0x06 0x00000000 0x4001
++ 0x10008 0x00000000 0x102>;
++ };
+ plic0: interrupt-controller@c000000 {
+ #interrupt-cells = <1>;
+ #address-cells = <0>;
diff --git a/package/boot/uboot-sifiveu/patches/0009-riscv-Fix-build-against-binutils.patch b/package/boot/uboot-sifiveu/patches/0009-riscv-Fix-build-against-binutils.patch
new file mode 100644
index 00000000000..87dbf984ec5
--- /dev/null
+++ b/package/boot/uboot-sifiveu/patches/0009-riscv-Fix-build-against-binutils.patch
@@ -0,0 +1,50 @@
+commit 1dde977518f13824b847e23275001191139bc384
+Author: Alexandre Ghiti <alexandre.ghiti@canonical.com>
+Date: Mon Oct 3 18:07:54 2022 +0200
+
+ riscv: Fix build against binutils 2.38
+
+ The following description is copied from the equivalent patch for the
+ Linux Kernel proposed by Aurelien Jarno:
+
+ >From version 2.38, binutils default to ISA spec version 20191213. This
+ means that the csr read/write (csrr*/csrw*) instructions and fence.i
+ instruction has separated from the `I` extension, become two standalone
+ extensions: Zicsr and Zifencei. As the kernel uses those instruction,
+ this causes the following build failure:
+
+ arch/riscv/cpu/mtrap.S: Assembler messages:
+ arch/riscv/cpu/mtrap.S:65: Error: unrecognized opcode `csrr a0,scause'
+ arch/riscv/cpu/mtrap.S:66: Error: unrecognized opcode `csrr a1,sepc'
+ arch/riscv/cpu/mtrap.S:67: Error: unrecognized opcode `csrr a2,stval'
+ arch/riscv/cpu/mtrap.S:70: Error: unrecognized opcode `csrw sepc,a0'
+
+ Signed-off-by: Alexandre Ghiti <alexandre.ghiti@canonical.com>
+ Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
+ Tested-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
+ Tested-by: Heiko Stuebner <heiko@sntech.de>
+ Tested-by: Christian Stewart <christian@paral.in>
+ Reviewed-by: Rick Chen <rick@andestech.com>
+
+diff --git a/arch/riscv/Makefile b/arch/riscv/Makefile
+index 0b80eb8d86..53d1194ffb 100644
+--- a/arch/riscv/Makefile
++++ b/arch/riscv/Makefile
+@@ -24,7 +24,16 @@ ifeq ($(CONFIG_CMODEL_MEDANY),y)
+ CMODEL = medany
+ endif
+
+-ARCH_FLAGS = -march=$(ARCH_BASE)$(ARCH_A)$(ARCH_C) -mabi=$(ABI) \
++RISCV_MARCH = $(ARCH_BASE)$(ARCH_A)$(ARCH_C)
++
++# Newer binutils versions default to ISA spec version 20191213 which moves some
++# instructions from the I extension to the Zicsr and Zifencei extensions.
++toolchain-need-zicsr-zifencei := $(call cc-option-yn, -mabi=$(ABI) -march=$(RISCV_MARCH)_zicsr_zifencei)
++ifeq ($(toolchain-need-zicsr-zifencei),y)
++ RISCV_MARCH := $(RISCV_MARCH)_zicsr_zifencei
++endif
++
++ARCH_FLAGS = -march=$(RISCV_MARCH) -mabi=$(ABI) \
+ -mcmodel=$(CMODEL)
+
+ PLATFORM_CPPFLAGS += $(ARCH_FLAGS)
diff --git a/package/boot/uboot-sifiveu/patches/100-mkimage-check-environment-for-dtc-binary-location.patch b/package/boot/uboot-sifiveu/patches/100-mkimage-check-environment-for-dtc-binary-location.patch
new file mode 100644
index 00000000000..482aa1a3693
--- /dev/null
+++ b/package/boot/uboot-sifiveu/patches/100-mkimage-check-environment-for-dtc-binary-location.patch
@@ -0,0 +1,35 @@
+From 637800493945ffed2f454756300437a4ec86e3b1 Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke@hauke-m.de>
+Date: Wed, 19 Jul 2017 22:23:15 +0200
+Subject: mkimage: check environment for dtc binary location
+
+Currently mkimage assumes the dtc binary is in the path and fails
+otherwise. This patch makes it check the DTC environment variable first
+for the dtc binary and then fall back to the default path. This makes
+it possible to call the u-boot build with make DTC=... and build a fit
+image with the dtc binary not being the the default path.
+
+Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+Cc: Simon Glass <sjg@chromium.org>
+---
+ tools/fit_image.c | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+--- a/tools/fit_image.c
++++ b/tools/fit_image.c
+@@ -726,9 +726,14 @@ static int fit_handle_file(struct image_
+ }
+ *cmd = '\0';
+ } else if (params->datafile) {
++ const char* dtc = getenv("DTC");
++
++ if (!dtc)
++ dtc = MKIMAGE_DTC;
++
+ /* dtc -I dts -O dtb -p 500 -o tmpfile datafile */
+ snprintf(cmd, sizeof(cmd), "%s %s -o \"%s\" \"%s\"",
+- MKIMAGE_DTC, params->dtc, tmpfile, params->datafile);
++ dtc, params->dtc, tmpfile, params->datafile);
+ debug("Trying to execute \"%s\"\n", cmd);
+ } else {
+ snprintf(cmd, sizeof(cmd), "cp \"%s\" \"%s\"",
diff --git a/package/boot/uboot-sifiveu/patches/110-no-kwbimage.patch b/package/boot/uboot-sifiveu/patches/110-no-kwbimage.patch
new file mode 100644
index 00000000000..65d14f5bece
--- /dev/null
+++ b/package/boot/uboot-sifiveu/patches/110-no-kwbimage.patch
@@ -0,0 +1,10 @@
+--- a/tools/Makefile
++++ b/tools/Makefile
+@@ -119,7 +119,6 @@ dumpimage-mkimage-objs := aisimage.o \
+ imximage.o \
+ imx8image.o \
+ imx8mimage.o \
+- kwbimage.o \
+ lib/md5.o \
+ lpc32xximage.o \
+ mxsimage.o \
diff --git a/package/boot/uboot-sifiveu/patches/130-fix-mkimage-host-build.patch b/package/boot/uboot-sifiveu/patches/130-fix-mkimage-host-build.patch
new file mode 100644
index 00000000000..cd65c1321fc
--- /dev/null
+++ b/package/boot/uboot-sifiveu/patches/130-fix-mkimage-host-build.patch
@@ -0,0 +1,24 @@
+--- a/tools/image-host.c
++++ b/tools/image-host.c
+@@ -1125,6 +1125,7 @@ static int fit_config_add_verification_d
+ * 2) get public key (X509_get_pubkey)
+ * 3) provide der format (d2i_RSAPublicKey)
+ */
++#ifdef CONFIG_TOOLS_LIBCRYPTO
+ static int read_pub_key(const char *keydir, const void *name,
+ unsigned char **pubkey, int *pubkey_len)
+ {
+@@ -1178,6 +1179,13 @@ err_cert:
+ fclose(f);
+ return ret;
+ }
++#else
++static int read_pub_key(const char *keydir, const void *name,
++ unsigned char **pubkey, int *pubkey_len)
++{
++ return -ENOSYS;
++}
++#endif
+
+ int fit_pre_load_data(const char *keydir, void *keydest, void *fit)
+ {
diff --git a/package/boot/uboot-sifiveu/uEnv-default.txt b/package/boot/uboot-sifiveu/uEnv-default.txt
new file mode 100644
index 00000000000..8468a3cace0
--- /dev/null
+++ b/package/boot/uboot-sifiveu/uEnv-default.txt
@@ -0,0 +1,5 @@
+setenv loadkernel fatload mmc 0:3 \$kernel_addr_r Image
+setenv loaddtb fatload mmc 0:3 \$fdt_addr_r dtb
+setenv bootargs console=ttySIF0,115200 earlycon=sbi root=/dev/mmcblk0p4 rootwait
+setenv uenvcmd run loadkernel \&\& run loaddtb \&\& booti \$kernel_addr_r - \$fdt_addr_r
+run uenvcmd
diff --git a/package/boot/uboot-sunxi/Makefile b/package/boot/uboot-sunxi/Makefile
index 9dce3e448a1..7f50992e695 100644
--- a/package/boot/uboot-sunxi/Makefile
+++ b/package/boot/uboot-sunxi/Makefile
@@ -9,12 +9,14 @@
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
-PKG_VERSION:=2020.04
+PKG_VERSION:=2023.04
-PKG_HASH:=fe732aaf037d9cc3c0909bad8362af366ae964bbdac6913a34081ff4ad565372
+PKG_HASH:=e31cac91545ff41b71cec5d8c22afd695645cd6e2a442ccdacacd60534069341
PKG_MAINTAINER:=Zoltan HERPAI <wigyori@uid0.hu>
+UBOOT_USE_INTREE_DTC:=1
+
include $(INCLUDE_DIR)/u-boot.mk
include $(INCLUDE_DIR)/package.mk
@@ -29,7 +31,7 @@ define U-Boot/a64-olinuxino
BUILD_SUBTARGET:=cortexa53
NAME:=Olimex A64-OLinuXino
BUILD_DEVICES:=olimex_a64-olinuxino
- DEPENDS:=+PACKAGE_u-boot-olimex_a64-olinuxino:arm-trusted-firmware-sunxi-a64
+ DEPENDS:=+PACKAGE_u-boot-olimex_a64-olinuxino:trusted-firmware-a-sunxi-a64
UENV:=a64
ATF:=a64
endef
@@ -38,7 +40,7 @@ define U-Boot/a64-olinuxino-emmc
BUILD_SUBTARGET:=cortexa53
NAME:=Olimex A64-OLinuXino eMMC
BUILD_DEVICES:=olimex_a64-olinuxino-emmc
- DEPENDS:=+PACKAGE_u-boot-olimex_a64-olinuxino-emmc:arm-trusted-firmware-sunxi-a64
+ DEPENDS:=+PACKAGE_u-boot-olimex_a64-olinuxino-emmc:trusted-firmware-a-sunxi-a64
UENV:=a64
ATF:=a64
endef
@@ -116,8 +118,8 @@ endef
define U-Boot/Marsboard_A10
BUILD_SUBTARGET:=cortexa8
- NAME:=Marsboard
- BUILD_DEVICES:=marsboard_a10-marsboard
+ NAME:=HAOYU Marsboard A10
+ BUILD_DEVICES:=haoyu_a10-marsboard
endef
define U-Boot/Mele_M9
@@ -207,7 +209,7 @@ endef
define U-Boot/orangepi_one_plus
BUILD_SUBTARGET:=cortexa53
NAME:=Orange Pi One Plus (H6)
- DEPENDS:=+PACKAGE_u-boot-orangepi_one_plus:arm-trusted-firmware-sunxi-h6
+ DEPENDS:=+PACKAGE_u-boot-orangepi_one_plus:trusted-firmware-a-sunxi-h6
BUILD_DEVICES:=xunlong_orangepi-one-plus
UENV:=h6
ATF:=h6
@@ -247,7 +249,7 @@ define U-Boot/libretech_all_h3_cc_h5
BUILD_SUBTARGET:=cortexa53
NAME:=Libre Computer ALL-H3-CC H5
BUILD_DEVICES:=libretech_all-h3-cc-h5
- DEPENDS:=+PACKAGE_u-boot-libretech_all_h3_cc_h5:arm-trusted-firmware-sunxi-a64
+ DEPENDS:=+PACKAGE_u-boot-libretech_all_h3_cc_h5:trusted-firmware-a-sunxi-a64
UENV:=a64
ATF:=a64
endef
@@ -256,7 +258,7 @@ define U-Boot/nanopi_neo_plus2
BUILD_SUBTARGET:=cortexa53
NAME:=NanoPi NEO Plus2 (H5)
BUILD_DEVICES:=friendlyarm_nanopi-neo-plus2
- DEPENDS:=+PACKAGE_u-boot-nanopi_neo_plus2:arm-trusted-firmware-sunxi-a64
+ DEPENDS:=+PACKAGE_u-boot-nanopi_neo_plus2:trusted-firmware-a-sunxi-a64
UENV:=a64
ATF:=a64
endef
@@ -265,7 +267,16 @@ define U-Boot/nanopi_neo2
BUILD_SUBTARGET:=cortexa53
NAME:=NanoPi NEO2 (H5)
BUILD_DEVICES:=friendlyarm_nanopi-neo2
- DEPENDS:=+PACKAGE_u-boot-nanopi_neo2:arm-trusted-firmware-sunxi-a64
+ DEPENDS:=+PACKAGE_u-boot-nanopi_neo2:trusted-firmware-a-sunxi-a64
+ UENV:=a64
+ ATF:=a64
+endef
+
+define U-Boot/nanopi_r1s_h5
+ BUILD_SUBTARGET:=cortexa53
+ NAME:=NanoPi R1S (H5)
+ BUILD_DEVICES:=friendlyarm_nanopi-r1s-h5
+ DEPENDS:=+PACKAGE_u-boot-nanopi_r1s_h5:trusted-firmware-a-sunxi-a64
UENV:=a64
ATF:=a64
endef
@@ -274,7 +285,7 @@ define U-Boot/pine64_plus
BUILD_SUBTARGET:=cortexa53
NAME:=Pine64 Plus A64
BUILD_DEVICES:=pine64_pine64-plus
- DEPENDS:=+PACKAGE_u-boot-pine64_plus:arm-trusted-firmware-sunxi-a64
+ DEPENDS:=+PACKAGE_u-boot-pine64_plus:trusted-firmware-a-sunxi-a64
UENV:=a64
ATF:=a64
endef
@@ -285,11 +296,17 @@ define U-Boot/bananapi_m2_plus_h3
BUILD_DEVICES:=sinovoip_bananapi-m2-plus
endef
+define U-Boot/Sinovoip_BPI_M3
+ BUILD_SUBTARGET:=cortexa7
+ NAME:=Bananapi M3
+ BUILD_DEVICES:=sinovoip_bananapi-m3
+endef
+
define U-Boot/sopine_baseboard
BUILD_SUBTARGET:=cortexa53
NAME:=Sopine Baseboard
BUILD_DEVICES:=pine64_sopine-baseboard
- DEPENDS:=+PACKAGE_u-boot-sopine_baseboard:arm-trusted-firmware-sunxi-a64
+ DEPENDS:=+PACKAGE_u-boot-sopine_baseboard:trusted-firmware-a-sunxi-a64
UENV:=a64
ATF:=a64
endef
@@ -299,7 +316,7 @@ define U-Boot/orangepi_zero_plus
BUILD_SUBTARGET:=cortexa53
NAME:=Xunlong Orange Pi Zero Plus
BUILD_DEVICES:=xunlong_orangepi-zero-plus
- DEPENDS:=+PACKAGE_u-boot-orangepi_zero_plus:arm-trusted-firmware-sunxi-a64
+ DEPENDS:=+PACKAGE_u-boot-orangepi_zero_plus:trusted-firmware-a-sunxi-a64
UENV:=a64
ATF:=a64
endef
@@ -308,11 +325,20 @@ define U-Boot/orangepi_pc2
BUILD_SUBTARGET:=cortexa53
NAME:=Xunlong Orange Pi PC2
BUILD_DEVICES:=xunlong_orangepi-pc2
- DEPENDS:=+PACKAGE_u-boot-orangepi_pc2:arm-trusted-firmware-sunxi-a64
+ DEPENDS:=+PACKAGE_u-boot-orangepi_pc2:trusted-firmware-a-sunxi-a64
UENV:=a64
ATF:=a64
endef
+define U-Boot/orangepi_zero2
+ BUILD_SUBTARGET:=cortexa53
+ NAME:=Xunlong Orange Pi Zero2
+ BUILD_DEVICES:=xunlong_orangepi-zero2
+ DEPENDS:=+PACKAGE_u-boot-orangepi_zero2:trusted-firmware-a-sunxi-h616
+ UENV:=h616
+ ATF:=h616
+endef
+
define U-Boot/Bananapi_M2_Ultra
BUILD_SUBTARGET:=cortexa7
NAME:=Bananapi M2 Ultra
@@ -325,6 +351,13 @@ define U-Boot/bananapi_m2_berry
BUILD_DEVICES:=sinovoip_bananapi-m2-berry
endef
+define U-Boot/bananapi_p2_zero
+ BUILD_SUBTARGET:=cortexa7
+ NAME:=Bananapi P2 Zero
+ BUILD_DEVICES:=sinovoip_bananapi-p2-zero
+endef
+
+
UBOOT_TARGETS := \
a64-olinuxino \
a64-olinuxino-emmc \
@@ -337,6 +370,7 @@ UBOOT_TARGETS := \
bananapi_m2_plus_h3 \
Bananapi \
bananapi_m2_berry \
+ bananapi_p2_zero \
Bananapi_M2_Ultra \
Bananapro \
Cubieboard \
@@ -357,6 +391,7 @@ UBOOT_TARGETS := \
nanopi_neo_plus2 \
nanopi_neo2 \
nanopi_r1 \
+ nanopi_r1s_h5 \
orangepi_zero \
orangepi_r1 \
orangepi_one \
@@ -366,8 +401,10 @@ UBOOT_TARGETS := \
orangepi_plus \
orangepi_2 \
orangepi_pc2 \
+ orangepi_zero2 \
pangolin \
pine64_plus \
+ Sinovoip_BPI_M3 \
sopine_baseboard \
orangepi_zero_plus \
libretech_all_h3_cc_h5
@@ -375,7 +412,7 @@ UBOOT_TARGETS := \
UBOOT_CONFIGURE_VARS += USE_PRIVATE_LIBGCC=yes
UBOOT_MAKE_FLAGS += \
- BL31=$(STAGING_DIR_IMAGE)/bl31_sun50i_$(ATF).bin
+ BL31=$(STAGING_DIR_IMAGE)/bl31_sunxi-$(ATF).bin SCP=/dev/null
define Build/InstallDev
$(INSTALL_DIR) $(STAGING_DIR_IMAGE)
diff --git a/package/boot/uboot-sunxi/patches/003-add-theobroma-a31-pangolin.patch b/package/boot/uboot-sunxi/patches/003-add-theobroma-a31-pangolin.patch
deleted file mode 100644
index 29969a71abe..00000000000
--- a/package/boot/uboot-sunxi/patches/003-add-theobroma-a31-pangolin.patch
+++ /dev/null
@@ -1,375 +0,0 @@
---- a/arch/arm/dts/Makefile
-+++ b/arch/arm/dts/Makefile
-@@ -455,6 +455,7 @@ dtb-$(CONFIG_MACH_SUN6I) += \
- sun6i-a31-m9.dtb \
- sun6i-a31-mele-a1000g-quad.dtb \
- sun6i-a31-mixtile-loftq.dtb \
-+ sun6i-a31-pangolin.dtb \
- sun6i-a31s-colorfly-e708-q1.dtb \
- sun6i-a31s-cs908.dtb \
- sun6i-a31s-inet-q972.dtb \
---- a/arch/arm/dts/sun6i-a31.dtsi
-+++ b/arch/arm/dts/sun6i-a31.dtsi
-@@ -641,6 +641,11 @@
- function = "lcd0";
- };
-
-+ i2c3_pins_a: i2c3@0 {
-+ allwinner,pins = "PB5", "PB6";
-+ allwinner,function = "i2c3";
-+ };
-+
- mmc0_pins_a: mmc0@0 {
- pins = "PF0", "PF1", "PF2",
- "PF3", "PF4", "PF5";
---- /dev/null
-+++ b/arch/arm/dts/sun6i-a31-pangolin.dts
-@@ -0,0 +1,292 @@
-+/*
-+ * Copyright 2015, Theobroma Systems Design und Consulting GmbH
-+ *
-+ * This file is dual-licensed: you can use it either under the terms
-+ * of the GPL or the X11 license, at your option. Note that this dual
-+ * licensing only applies to this file, and not this project as a
-+ * whole.
-+ *
-+ * a) This file is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This file is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * Or, alternatively,
-+ *
-+ * b) Permission is hereby granted, free of charge, to any person
-+ * obtaining a copy of this software and associated documentation
-+ * files (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use,
-+ * copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the
-+ * Software is furnished to do so, subject to the following
-+ * conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be
-+ * included in all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-+ * OTHER DEALINGS IN THE SOFTWARE.
-+ */
-+
-+/dts-v1/;
-+#include "sun6i-a31.dtsi"
-+#include "sunxi-common-regulators.dtsi"
-+
-+#include <dt-bindings/gpio/gpio.h>
-+#include <dt-bindings/pinctrl/sun4i-a10.h>
-+
-+/ {
-+ model = "Theobroma Systems A31 Pangolin";
-+ compatible = "tsd,a31-pangolin", "allwinner,sun6i-a31";
-+
-+ aliases {
-+ serial0 = &uart0;
-+ serial2 = &uart2;
-+ spi0 = &spi0;
-+ spi1 = &spi1;
-+ spi2 = &spi2;
-+ spi3 = &spi3;
-+ };
-+
-+ chosen {
-+ stdout-path = "serial2:115200n8";
-+ };
-+};
-+
-+&ehci0 {
-+ status = "okay";
-+};
-+
-+&ohci0 {
-+ status = "okay";
-+};
-+
-+&ehci1 {
-+ status = "okay";
-+};
-+
-+&ohci1 {
-+ status = "okay";
-+};
-+
-+&ohci2 {
-+ status = "okay";
-+};
-+
-+&gmac {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&gmac_pins_rgmii_a>;
-+ phy = <&phy1>;
-+ phy-mode = "rgmii";
-+ snps,reset-gpio = <&pio 0 7 GPIO_ACTIVE_LOW>;
-+ snps,reset-active-low;
-+ snps,reset-delays-us = <0 10000 30000>;
-+ status = "okay";
-+
-+ phy1: ethernet-phy@4 {
-+ reg = <4>;
-+ };
-+};
-+
-+&i2c0 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&i2c0_pins_a>;
-+ status = "okay";
-+};
-+
-+&i2c1 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&i2c1_pins_a>;
-+ status = "okay";
-+};
-+
-+&i2c2 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&i2c2_pins_a>;
-+ status = "okay";
-+};
-+
-+&i2c3 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&i2c3_pins_a>;
-+ status = "okay";
-+
-+ rtc_twi: rtc@6f {
-+ compatible = "isil,isl1208";
-+ reg = <0x6f>;
-+ };
-+ fan: fan@18 {
-+ compatible = "ti,amc6821";
-+ reg = <0x18>;
-+ cooling-min-state = <0>;
-+ cooling-max-state = <9>;
-+ #cooling-cells = <2>;
-+ };
-+};
-+
-+&spi0 {
-+ status = "okay";
-+
-+ flash: flash@0 {
-+ compatible = "spansion,m25p40";
-+ spi-max-frequency = <16000000>;
-+ spi-cpol;
-+ spi-cpha;
-+ };
-+};
-+
-+&spi1 {
-+ status = "okay";
-+};
-+
-+&ir {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&ir_pins_a>;
-+ status = "okay";
-+};
-+
-+&mmc0 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_pangolin>;
-+ vmmc-supply = <&reg_vcc3v0>;
-+ bus-width = <4>;
-+ cd-gpios = <&pio 2 19 GPIO_ACTIVE_LOW>; /* PC19 */
-+ status = "okay";
-+};
-+
-+&mmc0_pins_a {
-+ /* external pull-ups missing for some pins */
-+ allwinner,pull = <SUN4I_PINCTRL_PULL_UP>;
-+};
-+
-+&mmc2 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&mmc2_pins_a>;
-+ vmmc-supply = <&reg_vcc3v0>;
-+ bus-width = <8>;
-+ non-removable;
-+ status = "okay";
-+};
-+
-+&pio {
-+ mmc0_cd_pin_pangolin: mmc0_cd_pin@0 {
-+ allwinner,pins = "PC19";
-+ allwinner,function = "gpio_in";
-+ allwinner,drive = <SUN4I_PINCTRL_10_MA>;
-+ allwinner,pull = <SUN4I_PINCTRL_PULL_UP>;
-+ };
-+
-+ leds_pins_pangolin: led_pins@0 {
-+ allwinner,pins = "PH7", "PC16";
-+ allwinner,function = "gpio_out";
-+ allwinner,drive = <SUN4I_PINCTRL_20_MA>;
-+ allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
-+ };
-+
-+ mmc2_pins_a: mmc2@0 {
-+ allwinner,pins = "PC6","PC7","PC8","PC9","PC10","PC11",
-+ "PC12","PC13","PC14","PC15";
-+ allwinner,function = "mmc2";
-+ allwinner,drive = <SUN4I_PINCTRL_30_MA>;
-+ allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
-+ };
-+};
-+
-+&p2wi {
-+ status = "okay";
-+
-+ axp221: pmic@68 {
-+ compatible = "x-powers,axp221";
-+ reg = <0x68>;
-+ interrupt-parent = <&nmi_intc>;
-+ interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
-+ interrupt-controller;
-+ #interrupt-cells = <1>;
-+ dcdc1-supply = <&vcc_3v0>;
-+ dcdc5-supply = <&vcc_dram>;
-+
-+ regulators {
-+ x-powers,dcdc-freq = <3000>;
-+
-+ vcc_3v0: dcdc1 {
-+ regulator-always-on;
-+ regulator-min-microvolt = <3000000>;
-+ regulator-max-microvolt = <3000000>;
-+ regulator-name = "vcc-3v0";
-+ };
-+
-+ vdd_cpu: dcdc2 {
-+ regulator-always-on;
-+ regulator-min-microvolt = <700000>;
-+ regulator-max-microvolt = <1320000>;
-+ regulator-name = "vdd-cpu";
-+ };
-+
-+ vdd_gpu: dcdc3 {
-+ regulator-always-on;
-+ regulator-min-microvolt = <700000>;
-+ regulator-max-microvolt = <1320000>;
-+ regulator-name = "vdd-gpu";
-+ };
-+
-+ vdd_sys_dll: dcdc4 {
-+ regulator-always-on;
-+ regulator-min-microvolt = <1100000>;
-+ regulator-max-microvolt = <1100000>;
-+ regulator-name = "vdd-sys-dll";
-+ };
-+
-+ vcc_dram: dcdc5 {
-+ regulator-always-on;
-+ regulator-min-microvolt = <1500000>;
-+ regulator-max-microvolt = <1500000>;
-+ regulator-name = "vcc-dram";
-+ };
-+
-+ vcc_wifi: aldo1 {
-+ regulator-min-microvolt = <3300000>;
-+ regulator-max-microvolt = <3300000>;
-+ regulator-name = "vcc_wifi";
-+ };
-+
-+ avcc: aldo3 {
-+ regulator-always-on;
-+ regulator-min-microvolt = <3000000>;
-+ regulator-max-microvolt = <3000000>;
-+ regulator-name = "avcc";
-+ };
-+ };
-+ };
-+};
-+
-+&uart0 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&uart0_pins_a>;
-+ status = "okay";
-+};
-+
-+&usb1_vbus_pin_a {
-+ allwinner,pins = "PD23";
-+};
-+
-+&reg_usb1_vbus {
-+ gpio = <&pio 3 23 GPIO_ACTIVE_HIGH>; /* PD 23 */
-+ status = "okay";
-+};
-+
-+&usbphy {
-+ status = "okay";
-+ usb1_vbus-supply = <&reg_usb1_vbus>;
-+};
---- /dev/null
-+++ b/configs/pangolin_defconfig
-@@ -0,0 +1,36 @@
-+CONFIG_SUNXI_PANGOLIN=y
-+CONFIG_SPL=y
-+CONFIG_SYS_EXTRA_OPTIONS="USB_EHCI,SUNXI_GMAC,RGMII"
-+CONFIG_DEFAULT_DEVICE_TREE="sun6i-a31-pangolin"
-+CONFIG_VIDEO_VGA_VIA_LCD=y
-+CONFIG_VIDEO_VGA_EXTERNAL_DAC_EN="PH25"
-+CONFIG_ARM=y
-+CONFIG_ARCH_SUNXI=y
-+CONFIG_MACH_SUN6I=y
-+CONFIG_DRAM_CHANNELS=1
-+CONFIG_DRAM_CLK=360
-+CONFIG_DRAM_ZQ=70
-+CONFIG_AXP_DCDC1_VOLT=3300
-+CONFIG_AXP_ALDO1_VOLT=0
-+CONFIG_AXP_ALDO2_VOLT=1800
-+CONFIG_AXP_ALDO3_VOLT=3000
-+CONFIG_AXP_DLDO4_VOLT=3300
-+CONFIG_AXP_ELDO1_VOLT=1200
-+CONFIG_AXP_ELDO2_VOLT=2500
-+CONFIG_AXP_ELDO3_VOLT=3300
-+CONFIG_MMC_SUNXI_SLOT_EXTRA=2
-+CONFIG_CONS_INDEX=3
-+# Vbus gpio for usb1
-+CONFIG_USB1_VBUS_PIN=""
-+# No Vbus gpio for usb2
-+CONFIG_USB2_VBUS_PIN=""
-+CONFIG_USB=y
-+CONFIG_DM_USB=y
-+CONFIG_USB_EHCI=y
-+CONFIG_USB_KEYBOARD=y
-+CONFIG_DM_ETH=y
-+CONFIG_CMD_IMLS=n
-+CONFIG_ETH_DESIGNWARE=y
-+CONFIG_DM_SPI=y
-+CONFIG_DM_SPI_FLASH=y
-+CONFIG_SUNXI_SPI=y
---- a/arch/arm/mach-sunxi/Kconfig
-+++ b/arch/arm/mach-sunxi/Kconfig
-@@ -896,6 +896,14 @@ config VIDEO_LCD_PANEL_I2C_SCL
- Set the SCL pin for the LCD i2c interface. This takes a string in the
- format understood by sunxi_name_to_gpio, e.g. PH1 for pin 1 of port H.
-
-+choice
-+ prompt "Sunxi Board Variant"
-+ optional
-+
-+config SUNXI_PANGOLIN
-+ bool "Theobroma A31 uQ7 Board"
-+
-+endchoice
-
- # Note only one of these may be selected at a time! But hidden choices are
- # not supported by Kconfig
diff --git a/package/boot/uboot-sunxi/patches/062-A20-improve-gmac-upload.patch b/package/boot/uboot-sunxi/patches/062-A20-improve-gmac-upload.patch
index b805bbd1693..13a703f307d 100644
--- a/package/boot/uboot-sunxi/patches/062-A20-improve-gmac-upload.patch
+++ b/package/boot/uboot-sunxi/patches/062-A20-improve-gmac-upload.patch
@@ -2,7 +2,7 @@
--- a/configs/A20-OLinuXino-Lime2_defconfig
+++ b/configs/A20-OLinuXino-Lime2_defconfig
-@@ -22,6 +22,7 @@ CONFIG_ETH_DESIGNWARE=y
+@@ -26,6 +26,7 @@ CONFIG_ETH_DESIGNWARE=y
CONFIG_RGMII=y
CONFIG_MII=y
CONFIG_SUN7I_GMAC=y
diff --git a/package/boot/uboot-sunxi/patches/063-fix-lime2-revK-add-micrel-PHY.patch b/package/boot/uboot-sunxi/patches/063-fix-lime2-revK-add-micrel-PHY.patch
deleted file mode 100644
index e1ed58ee0d2..00000000000
--- a/package/boot/uboot-sunxi/patches/063-fix-lime2-revK-add-micrel-PHY.patch
+++ /dev/null
@@ -1,44 +0,0 @@
---- a/configs/A20-OLinuXino-Lime2-eMMC_defconfig
-+++ b/configs/A20-OLinuXino-Lime2-eMMC_defconfig
-@@ -8,6 +8,8 @@ CONFIG_MMC_SUNXI_SLOT_EXTRA=2
- CONFIG_USB0_VBUS_PIN="PC17"
- CONFIG_USB0_VBUS_DET="PH5"
- CONFIG_I2C1_ENABLE=y
-+CONFIG_PHY_MICREL=y
-+CONFIG_PHY_MICREL_KSZ90X1=y
- CONFIG_SATAPWR="PC3"
- CONFIG_SPL_SPI_SUNXI=y
- CONFIG_AHCI=y
---- a/configs/A20-OLinuXino-Lime2_defconfig
-+++ b/configs/A20-OLinuXino-Lime2_defconfig
-@@ -7,6 +7,8 @@ CONFIG_MMC0_CD_PIN="PH1"
- CONFIG_USB0_VBUS_PIN="PC17"
- CONFIG_USB0_VBUS_DET="PH5"
- CONFIG_I2C1_ENABLE=y
-+CONFIG_PHY_MICREL=y
-+CONFIG_PHY_MICREL_KSZ90X1=y
- CONFIG_SATAPWR="PC3"
- CONFIG_AHCI=y
- # CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
---- a/drivers/net/phy/micrel_ksz90x1.c
-+++ b/drivers/net/phy/micrel_ksz90x1.c
-@@ -14,6 +14,8 @@
- #include <errno.h>
- #include <micrel.h>
- #include <phy.h>
-+#include <asm/io.h>
-+#include <asm/arch/clock.h>
-
- /*
- * KSZ9021 - KSZ9031 common
-@@ -344,6 +346,10 @@ static int ksz9031_phy_extwrite(struct p
- static int ksz9031_config(struct phy_device *phydev)
- {
- int ret;
-+ struct sunxi_ccm_reg *const ccm =
-+ (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
-+
-+ setbits_le32(&ccm->gmac_clk_cfg, CCM_GMAC_CTRL_TX_CLK_DELAY(4));
-
- ret = ksz9031_of_config(phydev);
- if (ret)
diff --git a/package/boot/uboot-sunxi/patches/091-sun6i-sync-PLL1-multdiv-with-Boot1.patch b/package/boot/uboot-sunxi/patches/091-sun6i-sync-PLL1-multdiv-with-Boot1.patch
index f2a2b5e48fc..8605436b1ae 100644
--- a/package/boot/uboot-sunxi/patches/091-sun6i-sync-PLL1-multdiv-with-Boot1.patch
+++ b/package/boot/uboot-sunxi/patches/091-sun6i-sync-PLL1-multdiv-with-Boot1.patch
@@ -14,7 +14,7 @@ More specifically, the following settings are now used:
--- a/arch/arm/mach-sunxi/clock_sun6i.c
+++ b/arch/arm/mach-sunxi/clock_sun6i.c
-@@ -112,11 +112,12 @@ void clock_set_pll1(unsigned int clk)
+@@ -131,11 +131,12 @@ void clock_set_pll1(unsigned int clk)
struct sunxi_ccm_reg * const ccm =
(struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
const int p = 0;
diff --git a/package/boot/uboot-sunxi/patches/093-sun6i-fix-PLL-LDO-voltselect.patch b/package/boot/uboot-sunxi/patches/093-sun6i-fix-PLL-LDO-voltselect.patch
index b62209e1dcb..b5fa2a14157 100644
--- a/package/boot/uboot-sunxi/patches/093-sun6i-fix-PLL-LDO-voltselect.patch
+++ b/package/boot/uboot-sunxi/patches/093-sun6i-fix-PLL-LDO-voltselect.patch
@@ -18,7 +18,7 @@ required setting for the PLL LDO is 1.37v as per the A31 manual.
--- a/arch/arm/mach-sunxi/clock_sun6i.c
+++ b/arch/arm/mach-sunxi/clock_sun6i.c
-@@ -25,13 +25,26 @@ void clock_init_safe(void)
+@@ -28,13 +28,26 @@ void clock_init_safe(void)
struct sunxi_prcm_reg * const prcm =
(struct sunxi_prcm_reg *)SUNXI_PRCM_BASE;
@@ -47,8 +47,8 @@ required setting for the PLL LDO is 1.37v as per the A31 manual.
#endif
#if defined(CONFIG_MACH_SUN8I_R40) || defined(CONFIG_MACH_SUN50I)
---- a/arch/arm/include/asm/arch-sunxi/prcm.h
-+++ b/arch/arm/include/asm/arch-sunxi/prcm.h
+--- a/arch/arm/include/asm/arch-sunxi/prcm_sun6i.h
++++ b/arch/arm/include/asm/arch-sunxi/prcm_sun6i.h
@@ -110,13 +110,13 @@
#define PRCM_PLL_CTRL_LDO_OUT_MASK \
__PRCM_PLL_CTRL_LDO_OUT(0x7)
diff --git a/package/boot/uboot-sunxi/patches/100-sun6i-alternate-on-UART2.patch b/package/boot/uboot-sunxi/patches/100-sun6i-alternate-on-UART2.patch
deleted file mode 100644
index a7afa513041..00000000000
--- a/package/boot/uboot-sunxi/patches/100-sun6i-alternate-on-UART2.patch
+++ /dev/null
@@ -1,16 +0,0 @@
-From d7311b6e7cdd1fc0e92665188e650934718cb2b1 Mon Sep 17 00:00:00 2001
-From: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
-Date: Tue, 16 Jun 2015 10:52:01 +0200
-Subject: sun6i: define alternate-function for UART2 on GPG
-
-
---- a/arch/arm/include/asm/arch-sunxi/gpio.h
-+++ b/arch/arm/include/asm/arch-sunxi/gpio.h
-@@ -190,6 +190,7 @@ enum sunxi_gpio_number {
- #define SUN6I_GPG_SDC1 2
- #define SUN8I_GPG_SDC1 2
- #define SUN6I_GPG_TWI3 2
-+#define SUN6I_GPG_UART2 2
- #define SUN5I_GPG_UART1 4
-
- #define SUN6I_GPH_PWM 2
diff --git a/package/boot/uboot-sunxi/patches/101-sun6i-support-console-on-UART2.patch b/package/boot/uboot-sunxi/patches/101-sun6i-support-console-on-UART2.patch
deleted file mode 100644
index 823c1568090..00000000000
--- a/package/boot/uboot-sunxi/patches/101-sun6i-support-console-on-UART2.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From c058dfb69136d62f88ae8b121104bdb7ce2df03f Mon Sep 17 00:00:00 2001
-From: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
-Date: Tue, 16 Jun 2015 10:53:11 +0200
-Subject: ARM: sun6i: Support console on UART2 (GPG6/GPG7)
-
-
---- a/arch/arm/mach-sunxi/board.c
-+++ b/arch/arm/mach-sunxi/board.c
-@@ -129,6 +129,10 @@ static int gpio_init(void)
- sunxi_gpio_set_cfgpin(SUNXI_GPG(3), SUN5I_GPG_UART1);
- sunxi_gpio_set_cfgpin(SUNXI_GPG(4), SUN5I_GPG_UART1);
- sunxi_gpio_set_pull(SUNXI_GPG(4), SUNXI_GPIO_PULL_UP);
-+#elif CONFIG_CONS_INDEX == 3 && defined(CONFIG_MACH_SUN6I)
-+ sunxi_gpio_set_cfgpin(SUNXI_GPG(6), SUN6I_GPG_UART2);
-+ sunxi_gpio_set_cfgpin(SUNXI_GPG(7), SUN6I_GPG_UART2);
-+ sunxi_gpio_set_pull(SUNXI_GPG(7), SUNXI_GPIO_PULL_UP);
- #elif CONFIG_CONS_INDEX == 3 && defined(CONFIG_MACH_SUN8I)
- sunxi_gpio_set_cfgpin(SUNXI_GPB(0), SUN8I_GPB_UART2);
- sunxi_gpio_set_cfgpin(SUNXI_GPB(1), SUN8I_GPB_UART2);
---- a/include/configs/sunxi-common.h
-+++ b/include/configs/sunxi-common.h
-@@ -244,6 +244,8 @@ extern int soft_i2c_gpio_scl;
- #endif
- #elif CONFIG_CONS_INDEX == 2 && defined(CONFIG_MACH_SUN5I)
- #define OF_STDOUT_PATH "/soc@01c00000/serial@01c28400:115200"
-+#elif CONFIG_CONS_INDEX == 3 && defined(CONFIG_MACH_SUN6I)
-+#define OF_STDOUT_PATH "/soc@01c00000/serial@01c28800:115200"
- #elif CONFIG_CONS_INDEX == 3 && defined(CONFIG_MACH_SUN8I)
- #define OF_STDOUT_PATH "/soc@01c00000/serial@01c28800:115200"
- #elif CONFIG_CONS_INDEX == 5 && defined(CONFIG_MACH_SUN8I)
diff --git a/package/boot/uboot-sunxi/patches/102-sunxi-make_CONS_INDEX-configurable.patch b/package/boot/uboot-sunxi/patches/102-sunxi-make_CONS_INDEX-configurable.patch
deleted file mode 100644
index b85e2af9fce..00000000000
--- a/package/boot/uboot-sunxi/patches/102-sunxi-make_CONS_INDEX-configurable.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-From 78d5fab8e345b1273ec8c22d06f1a1d27670b518 Mon Sep 17 00:00:00 2001
-From: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
-Date: Tue, 16 Jun 2015 10:59:38 +0200
-Subject: ARM: sunxi: Make CONS_INDEX configurable
-
-
---- a/arch/arm/mach-sunxi/Kconfig
-+++ b/arch/arm/mach-sunxi/Kconfig
-@@ -559,6 +559,14 @@ config SYS_BOARD
- config SYS_SOC
- default "sunxi"
-
-+config CONS_INDEX
-+ int "UART used for console"
-+ range 1 5
-+ default 1
-+ ---help---
-+ Defines the UART port used for serial output. It starts at 1 so UART0 is 1,
-+ UART1 is 2 and so on.
-+
- config UART0_PORT_F
- bool "UART0 on MicroSD breakout board"
- default n
diff --git a/package/boot/uboot-sunxi/patches/200-mkimage-check-environment-for-dtc-binary-location.patch b/package/boot/uboot-sunxi/patches/200-mkimage-check-environment-for-dtc-binary-location.patch
index 482aa1a3693..fcc30ce35cd 100644
--- a/package/boot/uboot-sunxi/patches/200-mkimage-check-environment-for-dtc-binary-location.patch
+++ b/package/boot/uboot-sunxi/patches/200-mkimage-check-environment-for-dtc-binary-location.patch
@@ -17,7 +17,7 @@ Cc: Simon Glass <sjg@chromium.org>
--- a/tools/fit_image.c
+++ b/tools/fit_image.c
-@@ -726,9 +726,14 @@ static int fit_handle_file(struct image_
+@@ -754,9 +754,14 @@ static int fit_handle_file(struct image_
}
*cmd = '\0';
} else if (params->datafile) {
diff --git a/package/boot/uboot-sunxi/patches/210-sunxi-deactivate-binman.patch b/package/boot/uboot-sunxi/patches/210-sunxi-deactivate-binman.patch
deleted file mode 100644
index 5efebbd056b..00000000000
--- a/package/boot/uboot-sunxi/patches/210-sunxi-deactivate-binman.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From def280c4792262a368c8861312dc6b376181021f Mon Sep 17 00:00:00 2001
-From: Hauke Mehrtens <hauke@hauke-m.de>
-Date: Mon, 1 Jan 2018 23:10:56 +0100
-Subject: sunxi: deactivate binman
-
-Use the old way to generate the images instead of binman.
-binman needs python with swig to avoid this host tool dependency use the
-old way of generating images.
----
- Makefile | 7 ++++---
- 1 file changed, 4 insertions(+), 3 deletions(-)
-
---- a/Makefile
-+++ b/Makefile
-@@ -1555,8 +1555,10 @@ endif
-
- ifneq ($(CONFIG_ARCH_SUNXI),)
- ifeq ($(CONFIG_ARM64),)
--u-boot-sunxi-with-spl.bin: spl/sunxi-spl.bin u-boot.img u-boot.dtb FORCE
-- $(call if_changed,binman)
-+OBJCOPYFLAGS_u-boot-sunxi-with-spl.bin = -I binary -O binary \
-+ --pad-to=$(CONFIG_SPL_PAD_TO) --gap-fill=0xff
-+u-boot-sunxi-with-spl.bin: spl/sunxi-spl.bin u-boot.img FORCE
-+ $(call if_changed,pad_cat)
- else
- u-boot-sunxi-with-spl.bin: spl/sunxi-spl.bin u-boot.itb FORCE
- $(call if_changed,cat)
---- a/arch/arm/Kconfig
-+++ b/arch/arm/Kconfig
-@@ -962,7 +962,6 @@ config ARCH_SOCFPGA
-
- config ARCH_SUNXI
- bool "Support sunxi (Allwinner) SoCs"
-- select BINMAN
- select CMD_GPIO
- select CMD_MMC if MMC
- select CMD_USB if DISTRO_DEFAULTS
diff --git a/package/boot/uboot-sunxi/patches/230-disable-axp209-on-a13-olinuxino.diff b/package/boot/uboot-sunxi/patches/230-disable-axp209-on-a13-olinuxino.diff
deleted file mode 100644
index b846cbf506d..00000000000
--- a/package/boot/uboot-sunxi/patches/230-disable-axp209-on-a13-olinuxino.diff
+++ /dev/null
@@ -1,19 +0,0 @@
---- a/configs/A13-OLinuXino_defconfig
-+++ b/configs/A13-OLinuXino_defconfig
-@@ -7,7 +7,6 @@ CONFIG_DRAM_EMR1=0
- CONFIG_MMC0_CD_PIN="PG0"
- CONFIG_USB0_VBUS_DET="PG1"
- CONFIG_USB1_VBUS_PIN="PG11"
--CONFIG_AXP_GPIO=y
- # CONFIG_VIDEO_HDMI is not set
- CONFIG_VIDEO_VGA_VIA_LCD=y
- CONFIG_VIDEO_VGA_VIA_LCD_FORCE_SYNC_ACTIVE_HIGH=y
-@@ -21,7 +20,7 @@ CONFIG_CMD_USB_MASS_STORAGE=y
- CONFIG_DEFAULT_DEVICE_TREE="sun5i-a13-olinuxino"
- CONFIG_DFU_RAM=y
- CONFIG_FASTBOOT_CMD_OEM_FORMAT=y
--CONFIG_AXP_ALDO3_VOLT=3300
-+CONFIG_SUNXI_NO_PMIC=y
- CONFIG_CONS_INDEX=2
- CONFIG_USB_EHCI_HCD=y
- CONFIG_USB_OHCI_HCD=y
diff --git a/package/boot/uboot-sunxi/patches/250-sun8i-h3-zeropi-add-device-tree.patch b/package/boot/uboot-sunxi/patches/250-sun8i-h3-zeropi-add-device-tree.patch
deleted file mode 100644
index 4250e4e9dbb..00000000000
--- a/package/boot/uboot-sunxi/patches/250-sun8i-h3-zeropi-add-device-tree.patch
+++ /dev/null
@@ -1,81 +0,0 @@
---- a/arch/arm/dts/Makefile
-+++ b/arch/arm/dts/Makefile
-@@ -539,7 +539,8 @@ dtb-$(CONFIG_MACH_SUN8I_H3) += \
- sun8i-h3-orangepi-plus.dtb \
- sun8i-h3-orangepi-plus2e.dtb \
- sun8i-h3-orangepi-zero-plus2.dtb \
-- sun8i-h3-rervision-dvk.dtb
-+ sun8i-h3-rervision-dvk.dtb \
-+ sun8i-h3-zeropi.dtb
- dtb-$(CONFIG_MACH_SUN8I_R40) += \
- sun8i-r40-bananapi-m2-ultra.dtb \
- sun8i-v40-bananapi-m2-berry.dtb
---- /dev/null
-+++ b/arch/arm/dts/sun8i-h3-zeropi.dts
-@@ -0,0 +1,66 @@
-+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
-+
-+#include "sun8i-h3-nanopi.dtsi"
-+
-+/ {
-+ model = "FriendlyElec ZeroPi";
-+ compatible = "friendlyarm,zeropi", "allwinner,sun8i-h3";
-+
-+ aliases {
-+ ethernet0 = &emac;
-+ };
-+
-+ reg_gmac_3v3: gmac-3v3 {
-+ compatible = "regulator-fixed";
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&gmac_power_pin_nanopi>;
-+ regulator-name = "gmac-3v3";
-+ regulator-min-microvolt = <3300000>;
-+ regulator-max-microvolt = <3300000>;
-+ startup-delay-us = <100000>;
-+ enable-active-high;
-+ gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>;
-+ };
-+};
-+
-+&ehci0 {
-+ status = "okay";
-+};
-+
-+&ohci0 {
-+ status = "okay";
-+};
-+
-+&pio {
-+ gmac_power_pin_nanopi: gmac_power_pin@0 {
-+ pins = "PD6";
-+ function = "gpio_out";
-+ };
-+};
-+
-+&external_mdio {
-+ ext_rgmii_phy: ethernet-phy@1 {
-+ compatible = "ethernet-phy-ieee802.3-c22";
-+ reg = <7>;
-+ };
-+};
-+
-+&emac {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&emac_rgmii_pins>;
-+ phy-supply = <&reg_gmac_3v3>;
-+ phy-handle = <&ext_rgmii_phy>;
-+ phy-mode = "rgmii";
-+
-+ allwinner,leds-active-low;
-+ status = "okay";
-+};
-+
-+&usb_otg {
-+ status = "okay";
-+ dr_mode = "peripheral";
-+};
-+
-+&usbphy {
-+ usb0_id_det-gpios = <&pio 6 12 GPIO_ACTIVE_HIGH>; /* PG12 */
-+};
diff --git a/package/boot/uboot-sunxi/patches/251-sun8i-h3-zeropi-add-defconfig.patch b/package/boot/uboot-sunxi/patches/251-sun8i-h3-zeropi-add-defconfig.patch
deleted file mode 100644
index 76e333298ef..00000000000
--- a/package/boot/uboot-sunxi/patches/251-sun8i-h3-zeropi-add-defconfig.patch
+++ /dev/null
@@ -1,24 +0,0 @@
---- /dev/null
-+++ b/configs/zeropi_defconfig
-@@ -0,0 +1,21 @@
-+CONFIG_ARM=y
-+CONFIG_ARCH_SUNXI=y
-+CONFIG_MACH_SUN8I_H3=y
-+CONFIG_DRAM_CLK=408
-+CONFIG_DRAM_ZQ=3881979
-+CONFIG_DRAM_ODT_EN=y
-+CONFIG_MACPWR="PD6"
-+# CONFIG_VIDEO_DE2 is not set
-+CONFIG_NR_DRAM_BANKS=1
-+CONFIG_DEFAULT_DEVICE_TREE="sun8i-h3-zeropi"
-+# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
-+CONFIG_CONSOLE_MUX=y
-+CONFIG_SPL=y
-+CONFIG_SYS_CLK_FREQ=480000000
-+# CONFIG_CMD_IMLS is not set
-+# CONFIG_CMD_FLASH is not set
-+# CONFIG_CMD_FPGA is not set
-+CONFIG_SUN8I_EMAC=y
-+CONFIG_USB_EHCI_HCD=y
-+CONFIG_USB_EHCI_HCD=y
-+CONFIG_SYS_USB_EVENT_POLL_VIA_INT_QUEUE=y
diff --git a/package/boot/uboot-sunxi/patches/252-sunxi-h3-add-support-for-nanopi-r1.patch b/package/boot/uboot-sunxi/patches/252-sunxi-h3-add-support-for-nanopi-r1.patch
index 0db7be5421c..51b4d7d045b 100644
--- a/package/boot/uboot-sunxi/patches/252-sunxi-h3-add-support-for-nanopi-r1.patch
+++ b/package/boot/uboot-sunxi/patches/252-sunxi-h3-add-support-for-nanopi-r1.patch
@@ -12,168 +12,9 @@ Signed-off-by: Jayantajit Gogoi <jayanta.gogoi525@gmail.com>
create mode 100644 arch/arm/dts/sun8i-h3-nanopi-r1.dts
create mode 100644 configs/nanopi_r1_defconfig
---- a/arch/arm/dts/Makefile
-+++ b/arch/arm/dts/Makefile
-@@ -531,6 +531,7 @@ dtb-$(CONFIG_MACH_SUN8I_H3) += \
- sun8i-h3-nanopi-m1-plus.dtb \
- sun8i-h3-nanopi-neo.dtb \
- sun8i-h3-nanopi-neo-air.dtb \
-+ sun8i-h3-nanopi-r1.dtb \
- sun8i-h3-orangepi-2.dtb \
- sun8i-h3-orangepi-lite.dtb \
- sun8i-h3-orangepi-one.dtb \
---- /dev/null
-+++ b/arch/arm/dts/sun8i-h3-nanopi-r1.dts
-@@ -0,0 +1,146 @@
-+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
-+/*
-+ * Copyright (C) 2019 Igor Pecovnik <igor@armbian.com>
-+ * Copyright (C) 2020 Jayantajit Gogoi <jayanta.gogoi525@gmail.com>
-+ */
-+
-+/* NanoPi R1 is based on the NanoPi-H3 design from FriendlyARM */
-+#include "sun8i-h3-nanopi.dtsi"
-+
-+/ {
-+ model = "FriendlyARM NanoPi R1";
-+ compatible = "friendlyarm,nanopi-r1", "allwinner,sun8i-h3";
-+
-+ reg_gmac_3v3: gmac-3v3 {
-+ compatible = "regulator-fixed";
-+ regulator-name = "gmac-3v3";
-+ regulator-min-microvolt = <3300000>;
-+ regulator-max-microvolt = <3300000>;
-+ startup-delay-us = <100000>;
-+ enable-active-high;
-+ gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>;
-+ };
-+
-+ vdd_cpux: gpio-regulator {
-+ compatible = "regulator-gpio";
-+ pinctrl-names = "default";
-+ regulator-name = "vdd-cpux";
-+ regulator-type = "voltage";
-+ regulator-boot-on;
-+ regulator-always-on;
-+ regulator-min-microvolt = <1100000>;
-+ regulator-max-microvolt = <1300000>;
-+ regulator-ramp-delay = <50>;
-+ gpios = <&r_pio 0 6 GPIO_ACTIVE_HIGH>;
-+ gpios-states = <0x1>;
-+ states = <1100000 0x0
-+ 1300000 0x1>;
-+ };
-+
-+ wifi_pwrseq: wifi_pwrseq {
-+ compatible = "mmc-pwrseq-simple";
-+ pinctrl-names = "default";
-+ reset-gpios = <&r_pio 0 7 GPIO_ACTIVE_LOW>;
-+ };
-+
-+ leds {
-+ /delete-node/ pwr;
-+ status {
-+ label = "nanopi:red:status";
-+ gpios = <&pio 0 10 GPIO_ACTIVE_HIGH>;
-+ linux,default-trigger = "heartbeat";
-+ };
-+
-+ wan {
-+ label = "nanopi:green:wan";
-+ gpios = <&pio 6 11 GPIO_ACTIVE_HIGH>;
-+ };
-+
-+ lan {
-+ label = "nanopi:green:lan";
-+ gpios = <&pio 0 9 GPIO_ACTIVE_HIGH>;
-+ };
-+ };
-+
-+ r_gpio_keys {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&sw_r_npi>;
-+
-+ /delete-node/ k1;
-+ reset {
-+ label = "reset";
-+ linux,code = <KEY_RESTART>;
-+ gpios = <&r_pio 0 3 GPIO_ACTIVE_LOW>;
-+ };
-+ };
-+};
-+
-+&cpu0 {
-+ cpu-supply = <&vdd_cpux>;
-+};
-+
-+&ehci1 {
-+ status = "okay";
-+};
-+
-+&ehci2 {
-+ status = "okay";
-+};
-+
-+&emac {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&emac_rgmii_pins>;
-+ phy-supply = <&reg_gmac_3v3>;
-+ phy-handle = <&ext_rgmii_phy>;
-+ phy-mode = "rgmii";
-+ status = "okay";
-+};
-+
-+&external_mdio {
-+ ext_rgmii_phy: ethernet-phy@1 {
-+ compatible = "ethernet-phy-ieee802.3-c22";
-+ reg = <7>;
-+ };
-+};
-+
-+&mmc1 {
-+ vmmc-supply = <&reg_vcc3v3>;
-+ vqmmc-supply = <&reg_vcc3v3>;
-+ mmc-pwrseq = <&wifi_pwrseq>;
-+ bus-width = <4>;
-+ non-removable;
-+ status = "okay";
-+
-+ sdio_wifi: sdio_wifi@1 {
-+ reg = <1>;
-+ compatible = "brcm,bcm4329-fmac";
-+ interrupt-parent = <&pio>;
-+ interrupts = <6 10 IRQ_TYPE_LEVEL_LOW>;
-+ interrupt-names = "host-wake";
-+ };
-+};
-+
-+&mmc2 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&mmc2_8bit_pins>;
-+ vmmc-supply = <&reg_vcc3v3>;
-+ vqmmc-supply = <&reg_vcc3v3>;
-+ bus-width = <8>;
-+ non-removable;
-+ status = "okay";
-+};
-+
-+&ohci1 {
-+ status = "okay";
-+};
-+
-+&ohci2 {
-+ status = "okay";
-+};
-+
-+&r_pio {
-+ sw_r_npi: key_pins {
-+ pins = "PL3";
-+ function = "gpio_in";
-+ };
-+};
--- /dev/null
+++ b/configs/nanopi_r1_defconfig
-@@ -0,0 +1,22 @@
+@@ -0,0 +1,21 @@
+CONFIG_ARM=y
+CONFIG_ARCH_SUNXI=y
+CONFIG_SPL=y
@@ -186,7 +27,6 @@ Signed-off-by: Jayantajit Gogoi <jayanta.gogoi525@gmail.com>
+CONFIG_NR_DRAM_BANKS=1
+# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
+CONFIG_CONSOLE_MUX=y
-+CONFIG_SYS_CLK_FREQ=480000000
+# CONFIG_CMD_FLASH is not set
+# CONFIG_SPL_DOS_PARTITION is not set
+# CONFIG_SPL_EFI_PARTITION is not set
diff --git a/package/boot/uboot-sunxi/patches/254-sunxi-h2-add-bpi-p2-zero.patch b/package/boot/uboot-sunxi/patches/254-sunxi-h2-add-bpi-p2-zero.patch
new file mode 100644
index 00000000000..9bf1a36b21f
--- /dev/null
+++ b/package/boot/uboot-sunxi/patches/254-sunxi-h2-add-bpi-p2-zero.patch
@@ -0,0 +1,307 @@
+--- /dev/null
++++ b/arch/arm/dts/sun8i-h2-plus-bananapi-p2-zero.dts
+@@ -0,0 +1,291 @@
++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
++/*
++ * Copyright (C) 2023 Zoltan HERPAI <wigyori@uid0.hu>
++ *
++ * Based on sun8i-h2-plus-bananapi-m2-zero.dts, which is:
++ * Copyright (C) 2017 Icenowy Zheng <icenowy@aosc.io>
++ */
++
++/dts-v1/;
++#include "sun8i-h3.dtsi"
++#include "sunxi-common-regulators.dtsi"
++
++#include <dt-bindings/gpio/gpio.h>
++#include <dt-bindings/input/input.h>
++
++/ {
++ model = "Banana Pi BPI-P2-Zero";
++ compatible = "sinovoip,bpi-p2-zero", "allwinner,sun8i-h2-plus";
++
++ aliases {
++ serial0 = &uart0;
++ serial1 = &uart1;
++ ethernet0 = &emac;
++ };
++
++ chosen {
++ stdout-path = "serial0:115200n8";
++ };
++
++ connector {
++ compatible = "hdmi-connector";
++ type = "c";
++
++ port {
++ hdmi_con_in: endpoint {
++ remote-endpoint = <&hdmi_out_con>;
++ };
++ };
++ };
++
++ leds {
++ compatible = "gpio-leds";
++
++ pwr_led {
++ label = "bananapi-p2-zero:red:pwr";
++ gpios = <&r_pio 0 10 GPIO_ACTIVE_LOW>; /* PL10 */
++ default-state = "on";
++ };
++ };
++
++ gpio-keys {
++ compatible = "gpio-keys";
++
++ switch-4 {
++ label = "power";
++ linux,code = <KEY_POWER>;
++ gpios = <&r_pio 0 3 GPIO_ACTIVE_LOW>;
++ wakeup-source;
++ };
++ };
++
++ reg_vdd_cpux: vdd-cpux-regulator {
++ compatible = "regulator-gpio";
++ regulator-name = "vdd-cpux";
++ regulator-type = "voltage";
++ regulator-boot-on;
++ regulator-always-on;
++ regulator-min-microvolt = <1100000>;
++ regulator-max-microvolt = <1300000>;
++ regulator-ramp-delay = <50>; /* 4ms */
++
++ gpios = <&r_pio 0 1 GPIO_ACTIVE_HIGH>; /* PL1 */
++ enable-active-high;
++ gpios-states = <0x1>;
++ states = <1100000 0>, <1300000 1>;
++ };
++
++ reg_vcc_dram: vcc-dram {
++ compatible = "regulator-fixed";
++ regulator-name = "vcc-dram";
++ regulator-min-microvolt = <1500000>;
++ regulator-max-microvolt = <1500000>;
++ regulator-always-on;
++ regulator-boot-on;
++ enable-active-high;
++ gpio = <&r_pio 0 9 GPIO_ACTIVE_HIGH>; /* PL9 */
++ vin-supply = <&reg_vcc5v0>;
++ };
++
++ reg_vcc1v2: vcc1v2 {
++ compatible = "regulator-fixed";
++ regulator-name = "vcc1v2";
++ regulator-min-microvolt = <1200000>;
++ regulator-max-microvolt = <1200000>;
++ regulator-always-on;
++ regulator-boot-on;
++ enable-active-high;
++ gpio = <&r_pio 0 8 GPIO_ACTIVE_HIGH>; /* PL8 */
++ vin-supply = <&reg_vcc5v0>;
++ };
++
++ poweroff {
++ compatible = "regulator-poweroff";
++ cpu-supply = <&reg_vcc1v2>;
++ };
++
++ wifi_pwrseq: wifi_pwrseq {
++ compatible = "mmc-pwrseq-simple";
++ reset-gpios = <&r_pio 0 7 GPIO_ACTIVE_LOW>; /* PL7 */
++ clocks = <&rtc CLK_OSC32K_FANOUT>;
++ clock-names = "ext_clock";
++ };
++};
++
++&cpu0 {
++ cpu-supply = <&reg_vdd_cpux>;
++};
++
++&de {
++ status = "okay";
++};
++
++&ehci0 {
++ status = "okay";
++};
++
++&emac {
++ phy-handle = <&int_mii_phy>;
++ phy-mode = "mii";
++ allwinner,leds-active-low;
++ status = "okay";
++};
++
++&hdmi {
++ status = "okay";
++};
++
++&hdmi_out {
++ hdmi_out_con: endpoint {
++ remote-endpoint = <&hdmi_con_in>;
++ };
++};
++
++&mmc0 {
++ vmmc-supply = <&reg_vcc3v3>;
++ bus-width = <4>;
++ /*
++ * On the production batch of this board the card detect GPIO is
++ * high active (card inserted), although on the early samples it's
++ * low active.
++ */
++ cd-gpios = <&pio 5 6 GPIO_ACTIVE_HIGH>; /* PF6 */
++ status = "okay";
++};
++
++&mmc1 {
++ vmmc-supply = <&reg_vcc3v3>;
++ vqmmc-supply = <&reg_vcc3v3>;
++ mmc-pwrseq = <&wifi_pwrseq>;
++ bus-width = <4>;
++ non-removable;
++ status = "okay";
++
++ brcmf: wifi@1 {
++ reg = <1>;
++ compatible = "brcm,bcm4329-fmac";
++ interrupt-parent = <&pio>;
++ interrupts = <6 10 IRQ_TYPE_LEVEL_LOW>; /* PG10 / EINT10 */
++ interrupt-names = "host-wake";
++ };
++};
++
++&mmc2 {
++ pinctrl-names = "default";
++ pinctrl-0 = <&mmc2_8bit_pins>;
++ vmmc-supply = <&reg_vcc3v3>;
++ vqmmc-supply = <&reg_vcc3v3>;
++ bus-width = <8>;
++ non-removable;
++ status = "okay";
++};
++
++&ohci0 {
++ status = "okay";
++};
++
++&uart0 {
++ pinctrl-names = "default";
++ pinctrl-0 = <&uart0_pa_pins>;
++ status = "okay";
++};
++
++&uart1 {
++ pinctrl-names = "default";
++ pinctrl-0 = <&uart1_pins>, <&uart1_rts_cts_pins>;
++ uart-has-rtscts;
++ status = "okay";
++
++ bluetooth {
++ compatible = "brcm,bcm43438-bt";
++ max-speed = <1500000>;
++ clocks = <&rtc CLK_OSC32K_FANOUT>;
++ clock-names = "lpo";
++ vbat-supply = <&reg_vcc3v3>;
++ vddio-supply = <&reg_vcc3v3>;
++ device-wakeup-gpios = <&pio 6 13 GPIO_ACTIVE_HIGH>; /* PG13 */
++ host-wakeup-gpios = <&pio 6 11 GPIO_ACTIVE_HIGH>; /* PG11 */
++ shutdown-gpios = <&pio 6 12 GPIO_ACTIVE_HIGH>; /* PG12 */
++ };
++
++};
++
++&pio {
++ gpio-line-names =
++ /* PA */
++ "CON2-P13", "CON2-P11", "CON2-P22", "CON2-P15",
++ "CON3-P03", "CON3-P02", "CON2-P07", "CON2-P29",
++ "CON2-P31", "CON2-P33", "CON2-P35", "CON2-P05",
++ "CON2-P03", "CON2-P08", "CON2-P10", "CON2-P16",
++ "CON2-P12", "CON2-P37", "CON2-P28", "CON2-P27",
++ "CON2-P40", "CON2-P38", "", "",
++ "", "", "", "", "", "", "", "",
++
++ /* PB */
++ "", "", "", "", "", "", "", "",
++ "", "", "", "", "", "", "", "",
++ "", "", "", "", "", "", "", "",
++ "", "", "", "", "", "", "", "",
++
++ /* PC */
++ "CON2-P19", "CON2-P21", "CON2-P23", "CON2-P24",
++ "CON2-P18", "", "", "CON2-P26",
++ "", "", "", "", "", "", "", "",
++ "", "", "", "", "", "", "", "",
++ "", "", "", "", "", "", "", "",
++
++ /* PD */
++ "", "", "", "", "", "", "", "",
++ "", "", "", "", "", "", "CSI-PWR-EN", "",
++ "", "", "", "", "", "", "", "",
++ "", "", "", "", "", "", "", "",
++
++ /* PE */
++ "CN3-P17", "CN3-P13", "CN3-P09", "CN3-P07",
++ "CN3-P19", "CN3-P21", "CN3-P22", "CN3-P20",
++ "CN3-P18", "CN3-P16", "CN3-P14", "CN3-P12",
++ "CN3-P05", "CN3-P03", "CN3-P06", "CN3-P08",
++ "", "", "", "", "", "", "", "",
++ "", "", "", "", "", "", "", "",
++
++ /* PF */
++ "SDC0-D1", "SDC0-D0", "SDC0-CLK", "SDC0-CMD", "SDC0-D3",
++ "SDC0-D2", "SDC0-DET", "",
++ "", "", "", "", "", "", "", "",
++ "", "", "", "", "", "", "", "",
++ "", "", "", "", "", "", "", "",
++
++ /* PG */
++ "WL-SDIO-CLK", "WL-SDIO-CMD", "WL-SDIO-D0", "WL-SDIO-D1",
++ "WL-SDIO-D2", "WL-SDIO-D3", "BT-UART-TX", "BT-UART-RX",
++ "BT-UART-RTS", "BT-UART-CTS", "WL-WAKE-AP", "BT-WAKE-AP",
++ "BT-RST-N", "AP-WAKE-BT", "", "",
++ "", "", "", "", "", "", "", "",
++ "", "", "", "", "", "", "", "";
++};
++
++&r_pio {
++ gpio-line-names =
++ /* PL */
++ "", "CPUX-SET", "CON2-P32", "POWER-KEY", "CON2-P36",
++ "VCC-IO-EN", "USB0-ID", "WL-PWR-EN",
++ "PWR-STB", "PWR-DRAM", "PWR-LED", "IR-RX", "", "", "", "",
++ "", "", "", "", "", "", "", "",
++ "", "", "", "", "", "", "", "";
++};
++
++&usb_otg {
++ dr_mode = "otg";
++ status = "okay";
++};
++
++&usbphy {
++ usb0_id_det-gpios = <&r_pio 0 6 GPIO_ACTIVE_HIGH>; /* PL6 */
++ /*
++ * There're two micro-USB connectors, one is power-only and another is
++ * OTG. The Vbus of these two connectors are connected together, so
++ * the external USB device will be powered just by the power input
++ * from the power-only USB port.
++ */
++ status = "okay";
++};
+--- /dev/null
++++ b/configs/bananapi_p2_zero_defconfig
+@@ -0,0 +1,10 @@
++CONFIG_ARM=y
++CONFIG_ARCH_SUNXI=y
++CONFIG_DEFAULT_DEVICE_TREE="sun8i-h2-plus-bananapi-p2-zero"
++CONFIG_SPL=y
++CONFIG_MACH_SUN8I_H3=y
++CONFIG_DRAM_CLK=408
++# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
++CONFIG_MMC_SUNXI_SLOT_EXTRA=2
++CONFIG_SUN8I_EMAC=y
++CONFIG_USB_EHCI_HCD=y
diff --git a/package/boot/uboot-sunxi/patches/260-add-missing-type-u64.patch b/package/boot/uboot-sunxi/patches/260-add-missing-type-u64.patch
deleted file mode 100644
index a6204c7b69e..00000000000
--- a/package/boot/uboot-sunxi/patches/260-add-missing-type-u64.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- a/include/linux/types.h
-+++ b/include/linux/types.h
-@@ -1,6 +1,7 @@
- #ifndef _LINUX_TYPES_H
- #define _LINUX_TYPES_H
-
-+typedef unsigned long long __u64;
- #include <linux/posix_types.h>
- #include <asm/types.h>
- #include <stdbool.h>
diff --git a/package/boot/uboot-sunxi/uEnv-default.txt b/package/boot/uboot-sunxi/uEnv-default.txt
index e024954516c..36e41c59b12 100644
--- a/package/boot/uboot-sunxi/uEnv-default.txt
+++ b/package/boot/uboot-sunxi/uEnv-default.txt
@@ -1,6 +1,8 @@
setenv fdt_high ffffffff
-setenv loadkernel fatload mmc 0 \$kernel_addr_r uImage
-setenv loaddtb fatload mmc 0 \$fdt_addr_r dtb
-setenv bootargs console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rootwait
+setenv mmc_rootpart 2
+part uuid mmc ${mmc_bootdev}:${mmc_rootpart} uuid
+setenv loadkernel fatload mmc \$mmc_bootdev \$kernel_addr_r uImage
+setenv loaddtb fatload mmc \$mmc_bootdev \$fdt_addr_r dtb
+setenv bootargs console=ttyS0,115200 earlyprintk root=PARTUUID=${uuid} rootwait
setenv uenvcmd run loadkernel \&\& run loaddtb \&\& bootm \$kernel_addr_r - \$fdt_addr_r
run uenvcmd
diff --git a/package/boot/uboot-sunxi/uEnv-h616.txt b/package/boot/uboot-sunxi/uEnv-h616.txt
new file mode 100644
index 00000000000..78810ff223c
--- /dev/null
+++ b/package/boot/uboot-sunxi/uEnv-h616.txt
@@ -0,0 +1,7 @@
+setenv mmc_rootpart 2
+part uuid mmc ${mmc_bootdev}:${mmc_rootpart} uuid
+setenv loadkernel fatload mmc \$mmc_bootdev \$kernel_addr_r uImage
+setenv loaddtb fatload mmc \$mmc_bootdev \$fdt_addr_r dtb
+setenv bootargs console=ttyS0,115200 earlyprintk root=PARTUUID=${uuid} rootwait
+setenv uenvcmd run loadkernel \&\& run loaddtb \&\& booti \$kernel_addr_r - \$fdt_addr_r
+run uenvcmd
diff --git a/package/boot/uboot-tegra/Makefile b/package/boot/uboot-tegra/Makefile
index a3d66900db7..d47ef6f6f01 100644
--- a/package/boot/uboot-tegra/Makefile
+++ b/package/boot/uboot-tegra/Makefile
@@ -7,7 +7,7 @@
include $(TOPDIR)/rules.mk
PKG_VERSION := 2020.04
-PKG_RELEASE := 1
+PKG_RELEASE:=3
PKG_HASH := fe732aaf037d9cc3c0909bad8362af366ae964bbdac6913a34081ff4ad565372
@@ -18,6 +18,7 @@ include $(INCLUDE_DIR)/package.mk
define U-Boot/Default
BUILD_TARGET := tegra
+ BUILD_SUBTARGET := generic
HIDDEN := y
endef
diff --git a/package/boot/uboot-zynq/Makefile b/package/boot/uboot-zynq/Makefile
index b6b1dc8b85f..0f93c4f4535 100644
--- a/package/boot/uboot-zynq/Makefile
+++ b/package/boot/uboot-zynq/Makefile
@@ -18,6 +18,7 @@ include $(INCLUDE_DIR)/host-build.mk
define U-Boot/Default
BUILD_TARGET:=zynq
+ BUILD_SUBTARGET:=generic
UBOOT_IMAGE:=spl/boot.bin u-boot.img
UBOOT_CONFIG:=zynq_$(1)
UENV:=default
@@ -60,6 +61,4 @@ endef
define Package/u-boot/install/default
endef
-Build/Exports:=$(Host/Exports)
-
$(eval $(call BuildPackage/U-Boot))
diff --git a/package/boot/uboot-zynq/patches/210-link-libcrypto-static.patch b/package/boot/uboot-zynq/patches/210-link-libcrypto-static.patch
deleted file mode 100644
index d2e7bf168dd..00000000000
--- a/package/boot/uboot-zynq/patches/210-link-libcrypto-static.patch
+++ /dev/null
@@ -1,14 +0,0 @@
-OpenWrt links the libressl statically against mkimage, make sure all the
-needed dependencies are added too.
-
---- a/tools/Makefile
-+++ b/tools/Makefile
-@@ -151,7 +151,7 @@ ifneq ($(CONFIG_MX23)$(CONFIG_MX28)$(CON
- HOSTCFLAGS_kwbimage.o += \
- $(shell pkg-config --cflags libssl libcrypto 2> /dev/null || echo "")
- HOSTLOADLIBES_mkimage += \
-- $(shell pkg-config --libs libssl libcrypto 2> /dev/null || echo "-lssl -lcrypto")
-+ $(shell pkg-config --libs --static libssl libcrypto 2> /dev/null || echo "-lssl -lpthread -lcrypto")
-
- # OS X deprecate openssl in favour of CommonCrypto, supress deprecation
- # warnings on those systems