Skip to content

Commit 68913c9

Browse files
1715173329hanwckf
authored andcommitted
uboot: support mainline FIT image
Signed-off-by: Tianling Shen <[email protected]>
1 parent 1dbebb4 commit 68913c9

File tree

10 files changed

+199
-9
lines changed

10 files changed

+199
-9
lines changed

uboot-mtk-20220606/board/mediatek/common/boot_helper.c

+15-2
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,12 @@
2525
int boot_from_mem(ulong data_load_addr)
2626
{
2727
char cmd[64];
28+
const char *bootconf = env_get("bootconf");
2829

29-
snprintf(cmd, sizeof(cmd), "bootm 0x%lx", data_load_addr);
30+
if (bootconf && strlen(bootconf) > 0)
31+
snprintf(cmd, sizeof(cmd), "bootm 0x%lx#%s", data_load_addr, bootconf);
32+
else
33+
snprintf(cmd, sizeof(cmd), "bootm 0x%lx", data_load_addr);
3034

3135
return run_command(cmd, 0);
3236
}
@@ -57,7 +61,16 @@ static int _boot_from_mmc(u32 dev, struct mmc *mmc, u64 offset)
5761
#endif
5862
#if defined(CONFIG_FIT)
5963
case IMAGE_FORMAT_FIT:
60-
size = fit_get_size((const void *)data_load_addr);
64+
size = fit_get_totalsize((const void *)data_load_addr);
65+
if (size <= 0x2000) {
66+
/* Load FDT header into memory */
67+
ret = _mmc_read(mmc, offset, (void *)data_load_addr, size);
68+
if (ret)
69+
return ret;
70+
71+
/* Read whole FIT image */
72+
size = fit_get_totalsize((const void *)data_load_addr);
73+
}
6174
break;
6275
#endif
6376
default:

uboot-mtk-20220606/board/mediatek/common/ubi_helper.c

+49
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,50 @@ static int write_ubi2_tar_image(const void *data, size_t size,
511511
return ret;
512512
}
513513

514+
static int write_ubi_fit_image(const void *data, size_t size,
515+
struct mtd_info *mtd)
516+
{
517+
int ret;
518+
519+
ret = mount_ubi(mtd);
520+
if (ret)
521+
return ret;
522+
523+
if (!find_ubi_volume("fit")) {
524+
/* ubi is dirty, erase ubi and recreate volumes */
525+
umount_ubi();
526+
ret = mtd_erase_generic(mtd, 0, mtd->size);
527+
if (ret)
528+
return ret;
529+
530+
ret = mount_ubi(mtd);
531+
if (ret)
532+
return ret;
533+
534+
ret = create_ubi_volume("ubootenv", 0x100000, -1, false);
535+
if (ret)
536+
goto out;
537+
538+
ret = create_ubi_volume("ubootenv2", 0x100000, -1, false);
539+
if (ret)
540+
goto out;
541+
}
542+
543+
/* Remove this volume first in case of no enough PEBs */
544+
remove_ubi_volume("rootfs_data");
545+
546+
ret = update_ubi_volume("fit", -1, data, size);
547+
if (ret)
548+
goto out;
549+
550+
ret = create_ubi_volume("rootfs_data", 0, -1, true);
551+
552+
out:
553+
umount_ubi();
554+
555+
return ret;
556+
}
557+
514558
static int boot_from_ubi(struct mtd_info *mtd)
515559
{
516560
ulong data_load_addr;
@@ -528,6 +572,8 @@ static int boot_from_ubi(struct mtd_info *mtd)
528572
return ret;
529573

530574
ret = read_ubi_volume("kernel", (void *)data_load_addr, 0);
575+
if (ret == -ENODEV)
576+
ret = read_ubi_volume("fit", (void *)data_load_addr, 0);
531577
if (ret)
532578
return ret;
533579

@@ -577,6 +623,9 @@ int ubi_upgrade_image(const void *data, size_t size)
577623
} else {
578624
ret = parse_image_ram(data, size, mtd->erasesize, &ii);
579625

626+
if (ii.header_type == HEADER_FIT)
627+
return write_ubi_fit_image(data, size, mtd);
628+
580629
if (!ret && ii.type == IMAGE_UBI2)
581630
return mtd_update_generic(mtd, data, size);
582631

uboot-mtk-20220606/board/mediatek/mt7981/bootmenu_emmc.c

+23-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <asm/global_data.h>
88
#include <command.h>
99
#include <fdtdec.h>
10+
#include <image.h>
1011
#include <linux/sizes.h>
1112
#include <errno.h>
1213
#include <dm/ofnode.h>
@@ -37,6 +38,7 @@ DECLARE_GLOBAL_DATA_PTR;
3738
#define GPT_MAX_SIZE (34 * 512)
3839

3940
#define PART_FIP_NAME "fip"
41+
#define PART_PRODUCTION_NAME "production"
4042
#define PART_KERNEL_NAME "kernel"
4143
#define PART_ROOTFS_NAME "rootfs"
4244

@@ -145,6 +147,20 @@ int write_firmware(void *priv, const struct data_part_entry *dpe,
145147
u32 slot;
146148
#endif /* CONFIG_MTK_DUAL_BOOT */
147149

150+
/* FIT image logic */
151+
if (genimg_get_format(data) == IMAGE_FORMAT_FIT) {
152+
ret = write_part(PART_PRODUCTION_NAME, data, size, true);
153+
if (ret)
154+
return ret;
155+
156+
/* Mark rootfs_data unavailable */
157+
rootfs_data_offs = (size + ROOTDEV_OVERLAY_ALIGN - 1) &
158+
(~(ROOTDEV_OVERLAY_ALIGN - 1));
159+
erase_part(PART_PRODUCTION_NAME, rootfs_data_offs, SZ_512K);
160+
161+
return ret;
162+
}
163+
148164
ret = parse_tar_image(data, size, &kernel_data, &kernel_size,
149165
&rootfs_data, &rootfs_size);
150166
if (ret)
@@ -273,7 +289,13 @@ int board_boot_default(void)
273289

274290
return dual_boot_mmc(&mbd);
275291
#else
276-
return boot_from_mmc_partition(EMMC_DEV_INDEX, 0, PART_KERNEL_NAME);
292+
int ret;
293+
294+
ret = boot_from_mmc_partition(EMMC_DEV_INDEX, 0, PART_KERNEL_NAME);
295+
if (ret == -ENODEV)
296+
return boot_from_mmc_partition(EMMC_DEV_INDEX, 0, PART_PRODUCTION_NAME);
297+
298+
return ret;
277299
#endif /* CONFIG_MTK_DUAL_BOOT */
278300
}
279301

uboot-mtk-20220606/board/mediatek/mt7981/bootmenu_ubi.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ static int write_flash_image(void *priv, const struct data_part_entry *dpe,
9191
static int erase_env(void *priv, const struct data_part_entry *dpe,
9292
const void *data, size_t size)
9393
{
94-
#if !defined(CONFIG_MTK_SECURE_BOOT) && !defined(CONFIG_ENV_IS_NOWHERE)
94+
#if !defined(CONFIG_MTK_SECURE_BOOT) && defined(CONFIG_ENV_IS_IN_MTD)
9595
struct mtd_info *mtd;
9696

9797
ubi_probe_mtd_devices();

uboot-mtk-20220606/board/mediatek/mt7986/bootmenu_emmc.c

+23-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <asm/global_data.h>
88
#include <command.h>
99
#include <fdtdec.h>
10+
#include <image.h>
1011
#include <linux/sizes.h>
1112
#include <errno.h>
1213
#include <dm/ofnode.h>
@@ -37,6 +38,7 @@ DECLARE_GLOBAL_DATA_PTR;
3738
#define GPT_MAX_SIZE (34 * 512)
3839

3940
#define PART_FIP_NAME "fip"
41+
#define PART_PRODUCTION_NAME "production"
4042
#define PART_KERNEL_NAME "kernel"
4143
#define PART_ROOTFS_NAME "rootfs"
4244

@@ -145,6 +147,20 @@ int write_firmware(void *priv, const struct data_part_entry *dpe,
145147
u32 slot;
146148
#endif /* CONFIG_MTK_DUAL_BOOT */
147149

150+
/* FIT image logic */
151+
if (genimg_get_format(data) == IMAGE_FORMAT_FIT) {
152+
ret = write_part(PART_PRODUCTION_NAME, data, size, true);
153+
if (ret)
154+
return ret;
155+
156+
/* Mark rootfs_data unavailable */
157+
rootfs_data_offs = (size + ROOTDEV_OVERLAY_ALIGN - 1) &
158+
(~(ROOTDEV_OVERLAY_ALIGN - 1));
159+
erase_part(PART_PRODUCTION_NAME, rootfs_data_offs, SZ_512K);
160+
161+
return ret;
162+
}
163+
148164
ret = parse_tar_image(data, size, &kernel_data, &kernel_size,
149165
&rootfs_data, &rootfs_size);
150166
if (ret)
@@ -273,7 +289,13 @@ int board_boot_default(void)
273289

274290
return dual_boot_mmc(&mbd);
275291
#else
276-
return boot_from_mmc_partition(EMMC_DEV_INDEX, 0, PART_KERNEL_NAME);
292+
int ret;
293+
294+
ret = boot_from_mmc_partition(EMMC_DEV_INDEX, 0, PART_KERNEL_NAME);
295+
if (ret == -ENODEV)
296+
return boot_from_mmc_partition(EMMC_DEV_INDEX, 0, PART_PRODUCTION_NAME);
297+
298+
return ret;
277299
#endif /* CONFIG_MTK_DUAL_BOOT */
278300
}
279301

uboot-mtk-20220606/board/mediatek/mt7986/bootmenu_ubi.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ static int write_flash_image(void *priv, const struct data_part_entry *dpe,
9191
static int erase_env(void *priv, const struct data_part_entry *dpe,
9292
const void *data, size_t size)
9393
{
94-
#if !defined(CONFIG_MTK_SECURE_BOOT) && !defined(CONFIG_ENV_IS_NOWHERE)
94+
#if !defined(CONFIG_MTK_SECURE_BOOT) && defined(CONFIG_ENV_IS_IN_MTD)
9595
struct mtd_info *mtd;
9696

9797
ubi_probe_mtd_devices();

uboot-mtk-20230718-09eda825/board/mediatek/common/boot_helper.c

+5-1
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,12 @@
2222
int boot_from_mem(ulong data_load_addr)
2323
{
2424
char cmd[64];
25+
const char *bootconf = env_get("bootconf");
2526

26-
snprintf(cmd, sizeof(cmd), "bootm 0x%lx", data_load_addr);
27+
if (bootconf && strlen(bootconf) > 0)
28+
snprintf(cmd, sizeof(cmd), "bootm 0x%lx#%s", data_load_addr, bootconf);
29+
else
30+
snprintf(cmd, sizeof(cmd), "bootm 0x%lx", data_load_addr);
2731

2832
return run_command(cmd, 0);
2933
}

uboot-mtk-20230718-09eda825/board/mediatek/common/bootmenu_mtd.c

+1
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,7 @@ static int erase_env(void *priv, const struct data_part_entry *dpe,
331331
return -EIO;
332332

333333
ubi_remove_vol(CONFIG_ENV_UBI_VOLUME);
334+
create_ubi_volume(CONFIG_ENV_UBI_VOLUME, CONFIG_ENV_SIZE, UBI_VID_OFFSET, false);
334335
ubi_exit();
335336
#else
336337
struct mtd_info *mtd;

uboot-mtk-20230718-09eda825/board/mediatek/common/mmc_helper.c

+33-2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
*/
3737
#define ROOTDEV_OVERLAY_ALIGN (64ULL * 1024ULL)
3838

39+
#define PART_PRODUCTION_NAME "production"
3940
#define PART_KERNEL_NAME "kernel"
4041
#define PART_ROOTFS_NAME "rootfs"
4142

@@ -691,7 +692,16 @@ static int _boot_from_mmc(struct mmc *mmc, u64 offset)
691692
#endif
692693
#if defined(CONFIG_FIT)
693694
case IMAGE_FORMAT_FIT:
694-
size = fit_get_size((const void *)data_load_addr);
695+
size = fit_get_totalsize((const void *)data_load_addr);
696+
if (size <= 0x2000) {
697+
/* Load FDT header into memory */
698+
ret = _mmc_read(mmc, offset, (void *)data_load_addr, size);
699+
if (ret)
700+
return ret;
701+
702+
/* Read whole FIT image */
703+
size = fit_get_totalsize((const void *)data_load_addr);
704+
}
695705
break;
696706
#endif
697707
default:
@@ -965,10 +975,17 @@ static int mmc_dual_boot(u32 dev)
965975

966976
int mmc_boot_image(u32 dev)
967977
{
978+
int ret;
979+
968980
if (IS_ENABLED(CONFIG_MTK_DUAL_BOOT))
969981
return mmc_dual_boot(dev);
970982

971-
return boot_from_mmc_partition(dev, 0, PART_KERNEL_NAME);
983+
ret = boot_from_mmc_partition(dev, 0, PART_KERNEL_NAME);
984+
if (ret == -ENOENT) {
985+
return boot_from_mmc_partition(dev, 0, PART_PRODUCTION_NAME);
986+
}
987+
988+
return ret;
972989
}
973990

974991
int mmc_upgrade_image(u32 dev, const void *data, size_t size)
@@ -980,6 +997,20 @@ int mmc_upgrade_image(u32 dev, const void *data, size_t size)
980997
u32 slot;
981998
int ret;
982999

1000+
/* FIT image logic */
1001+
if (genimg_get_format(data) == IMAGE_FORMAT_FIT) {
1002+
ret = mmc_write_part(dev, 0, PART_PRODUCTION_NAME, data, size, true);
1003+
if (ret)
1004+
return ret;
1005+
1006+
/* Mark rootfs_data unavailable */
1007+
rootfs_data_offs = (size + ROOTDEV_OVERLAY_ALIGN - 1) &
1008+
(~(ROOTDEV_OVERLAY_ALIGN - 1));
1009+
mmc_erase_part(dev, 0, PART_PRODUCTION_NAME, rootfs_data_offs, SZ_512K);
1010+
1011+
return ret;
1012+
}
1013+
9831014
if (IS_ENABLED(CONFIG_MTK_DUAL_BOOT)) {
9841015
slot = dual_boot_get_next_slot();
9851016
printf("Upgrading image slot %u ...\n", slot);

uboot-mtk-20230718-09eda825/board/mediatek/common/mtd_helper.c

+48
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
#define PART_UBI_NAME "ubi"
3131
#define PART_FIRMWARE_NAME "firmware"
32+
#define PART_FIT_NAME "fit"
3233
#define PART_KERNEL_NAME "kernel"
3334
#define PART_ROOTFS_NAME "rootfs"
3435
#define PART_ROOTFS_DATA_NAME "rootfs_data"
@@ -634,6 +635,48 @@ static int read_ubi_volume(const char *volume, void *buff, size_t size)
634635
return ubi_volume_read((char *)volume, buff, size);
635636
}
636637

638+
static int write_ubi_fit_image(const void *data, size_t size,
639+
struct mtd_info *mtd)
640+
{
641+
int ret;
642+
643+
ret = mount_ubi(mtd, true);
644+
if (ret)
645+
return ret;
646+
647+
if (!ubi_find_volume(PART_FIT_NAME)) {
648+
/* ubi is dirty, erase ubi and recreate volumes */
649+
ubi_exit();
650+
ret = mtd_erase_skip_bad(mtd, 0, size, mtd->size, NULL, NULL, true);
651+
if (ret)
652+
return ret;
653+
654+
ret = mount_ubi(mtd, true);
655+
if (ret)
656+
return ret;
657+
658+
ret = create_ubi_volume("ubootenv", 0x100000, -1, false);
659+
if (ret)
660+
goto out;
661+
662+
ret = create_ubi_volume("ubootenv2", 0x100000, -1, false);
663+
if (ret)
664+
goto out;
665+
}
666+
667+
/* Remove this volume first in case of no enough PEBs */
668+
remove_ubi_volume(PART_ROOTFS_DATA_NAME);
669+
670+
ret = update_ubi_volume(PART_FIT_NAME, -1, data, size);
671+
if (ret)
672+
goto out;
673+
674+
ret = create_ubi_volume(PART_ROOTFS_DATA_NAME, 0, -1, true);
675+
676+
out:
677+
return ret;
678+
}
679+
637680
#ifdef CONFIG_MEDIATEK_MULTI_MTD_LAYOUT
638681
static int write_ubi2_tar_image_separate(const void *data, size_t size,
639682
struct mtd_info *mtd_kernel, struct mtd_info *mtd_rootfs)
@@ -988,6 +1031,8 @@ static int boot_from_ubi(struct mtd_info *mtd)
9881031
return ret;
9891032

9901033
ret = read_ubi_volume(PART_KERNEL_NAME, (void *)data_load_addr, 0);
1034+
if (ret == ENODEV)
1035+
ret = read_ubi_volume(PART_FIT_NAME, (void *)data_load_addr, 0);
9911036
if (ret)
9921037
return ret;
9931038

@@ -1067,6 +1112,9 @@ int mtd_upgrade_image(const void *data, size_t size)
10671112
} else {
10681113
ret = parse_image_ram(data, size, mtd->erasesize, &ii);
10691114

1115+
if (ii.header_type == HEADER_FIT)
1116+
return write_ubi_fit_image(data, size, mtd);
1117+
10701118
if (!ret && ii.type == IMAGE_UBI2 &&
10711119
!IS_ENABLED(CONFIG_MTK_DUAL_BOOT))
10721120
return mtd_update_generic(mtd, data, size, true);

0 commit comments

Comments
 (0)