From 1dbebb42426a8913b8ab6177f736b260b1f0c95c Mon Sep 17 00:00:00 2001 From: Tianling Shen Date: Mon, 9 Sep 2024 16:30:31 +0800 Subject: [PATCH] uboot: board: add rootdisk support from openwrt Signed-off-by: Tianling Shen --- .../board/mediatek/mt7981/mt7981_rfb.c | 53 ++++++++++++++++++ .../board/mediatek/mt7986/mt7986_rfb.c | 53 ++++++++++++++++++ .../board/mediatek/mt7988/mt7988_rfb.c | 53 ++++++++++++++++++ .../board/mediatek/mt7981/mt7981_rfb.c | 54 +++++++++++++++++++ .../board/mediatek/mt7986/mt7986_rfb.c | 54 +++++++++++++++++++ .../board/mediatek/mt7988/mt7988_rfb.c | 54 +++++++++++++++++++ 6 files changed, 321 insertions(+) diff --git a/uboot-mtk-20220606/board/mediatek/mt7981/mt7981_rfb.c b/uboot-mtk-20220606/board/mediatek/mt7981/mt7981_rfb.c index 038f6e9c6..c4b98436b 100644 --- a/uboot-mtk-20220606/board/mediatek/mt7981/mt7981_rfb.c +++ b/uboot-mtk-20220606/board/mediatek/mt7981/mt7981_rfb.c @@ -9,6 +9,8 @@ #include #include #include +#include +#include #include #include @@ -60,3 +62,54 @@ int board_nmbm_init(void) return 0; } + +#define MT7981_BOOT_NOR 0 +#define MT7981_BOOT_SPIM_NAND 1 /* ToDo: fallback to SD */ +#define MT7981_BOOT_EMMC 2 +#define MT7981_BOOT_SNFI_NAND 3 /* ToDo (treated as SD) */ + +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(0x11d006f0) & 0xc0) >> 6) { + case MT7981_BOOT_NOR: + media = "rootdisk-nor"; + break + ;; + case MT7981_BOOT_SPIM_NAND: + media = "rootdisk-spim-nand"; + break + ;; + case MT7981_BOOT_EMMC: + media = "rootdisk-emmc"; + break + ;; + case MT7981_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/uboot-mtk-20220606/board/mediatek/mt7986/mt7986_rfb.c b/uboot-mtk-20220606/board/mediatek/mt7986/mt7986_rfb.c index 7247dc98d..bd39bdc70 100644 --- a/uboot-mtk-20220606/board/mediatek/mt7986/mt7986_rfb.c +++ b/uboot-mtk-20220606/board/mediatek/mt7986/mt7986_rfb.c @@ -9,6 +9,8 @@ #include #include #include +#include +#include #include #include @@ -62,3 +64,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/uboot-mtk-20220606/board/mediatek/mt7988/mt7988_rfb.c b/uboot-mtk-20220606/board/mediatek/mt7988/mt7988_rfb.c index 038f6e9c6..7b4aff1a7 100644 --- a/uboot-mtk-20220606/board/mediatek/mt7988/mt7988_rfb.c +++ b/uboot-mtk-20220606/board/mediatek/mt7988/mt7988_rfb.c @@ -9,6 +9,8 @@ #include #include #include +#include +#include #include #include @@ -60,3 +62,54 @@ int board_nmbm_init(void) 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/uboot-mtk-20230718-09eda825/board/mediatek/mt7981/mt7981_rfb.c b/uboot-mtk-20230718-09eda825/board/mediatek/mt7981/mt7981_rfb.c index 846c715ca..ce5eacf6a 100644 --- a/uboot-mtk-20230718-09eda825/board/mediatek/mt7981/mt7981_rfb.c +++ b/uboot-mtk-20230718-09eda825/board/mediatek/mt7981/mt7981_rfb.c @@ -4,7 +4,61 @@ * Author: Sam Shih */ +#include +#include + int board_init(void) { return 0; } + +#define MT7981_BOOT_NOR 0 +#define MT7981_BOOT_SPIM_NAND 1 /* ToDo: fallback to SD */ +#define MT7981_BOOT_EMMC 2 +#define MT7981_BOOT_SNFI_NAND 3 /* ToDo (treated as SD) */ + +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(0x11d006f0) & 0xc0) >> 6) { + case MT7981_BOOT_NOR: + media = "rootdisk-nor"; + break + ;; + case MT7981_BOOT_SPIM_NAND: + media = "rootdisk-spim-nand"; + break + ;; + case MT7981_BOOT_EMMC: + media = "rootdisk-emmc"; + break + ;; + case MT7981_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/uboot-mtk-20230718-09eda825/board/mediatek/mt7986/mt7986_rfb.c b/uboot-mtk-20230718-09eda825/board/mediatek/mt7986/mt7986_rfb.c index 846c715ca..6c47b355e 100644 --- a/uboot-mtk-20230718-09eda825/board/mediatek/mt7986/mt7986_rfb.c +++ b/uboot-mtk-20230718-09eda825/board/mediatek/mt7986/mt7986_rfb.c @@ -4,7 +4,61 @@ * Author: Sam Shih */ +#include +#include + int board_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/uboot-mtk-20230718-09eda825/board/mediatek/mt7988/mt7988_rfb.c b/uboot-mtk-20230718-09eda825/board/mediatek/mt7988/mt7988_rfb.c index 846c715ca..97980f4fc 100644 --- a/uboot-mtk-20230718-09eda825/board/mediatek/mt7988/mt7988_rfb.c +++ b/uboot-mtk-20230718-09eda825/board/mediatek/mt7988/mt7988_rfb.c @@ -4,7 +4,61 @@ * Author: Sam Shih */ +#include +#include + int board_init(void) { 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; +}