mirror of
https://github.com/revyos/th1520-vendor-uboot.git
synced 2026-09-10 11:25:17 +02:00
249 lines
6.6 KiB
C
249 lines
6.6 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/*
|
|
* (C) Copyright 2000-2009
|
|
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
|
*/
|
|
|
|
#include <common.h>
|
|
#include <bootm.h>
|
|
#include <command.h>
|
|
#include <image.h>
|
|
#include <irq_func.h>
|
|
#include <lmb.h>
|
|
#include <mapmem.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/sizes.h>
|
|
|
|
/*
|
|
* Image booting support
|
|
*/
|
|
static int booti_start(cmd_tbl_t *cmdtp, int flag, int argc,
|
|
char * const argv[], bootm_headers_t *images)
|
|
{
|
|
int ret;
|
|
ulong ld;
|
|
ulong relocated_addr;
|
|
ulong image_size;
|
|
|
|
ret = do_bootm_states(cmdtp, flag, argc, argv, BOOTM_STATE_START,
|
|
images, 1);
|
|
|
|
/* Setup Linux kernel Image entry point */
|
|
if (!argc) {
|
|
ld = load_addr;
|
|
debug("* kernel: default image load address = 0x%08lx\n",
|
|
load_addr);
|
|
} else {
|
|
ld = simple_strtoul(argv[0], NULL, 16);
|
|
debug("* kernel: cmdline image address = 0x%08lx\n", ld);
|
|
}
|
|
|
|
ret = booti_setup(ld, &relocated_addr, &image_size, false);
|
|
if (ret != 0)
|
|
return 1;
|
|
|
|
/* Handle BOOTM_STATE_LOADOS */
|
|
if (relocated_addr != ld) {
|
|
debug("Moving Image from 0x%lx to 0x%lx\n", ld, relocated_addr);
|
|
memmove((void *)relocated_addr, (void *)ld, image_size);
|
|
}
|
|
|
|
images->ep = relocated_addr;
|
|
images->os.start = relocated_addr;
|
|
images->os.end = relocated_addr + image_size;
|
|
|
|
lmb_reserve(&images->lmb, images->ep, le32_to_cpu(image_size));
|
|
|
|
/*
|
|
* Handle the BOOTM_STATE_FINDOTHER state ourselves as we do not
|
|
* have a header that provide this informaiton.
|
|
*/
|
|
if (bootm_find_images(flag, argc, argv))
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int do_booti(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
{
|
|
int ret;
|
|
/* Consume 'booti' */
|
|
argc--; argv++;
|
|
|
|
if (booti_start(cmdtp, flag, argc, argv, &images))
|
|
return 1;
|
|
|
|
/*
|
|
* We are doing the BOOTM_STATE_LOADOS state ourselves, so must
|
|
* disable interrupts ourselves
|
|
*/
|
|
bootm_disable_interrupts();
|
|
|
|
images.os.os = IH_OS_LINUX;
|
|
#ifdef CONFIG_RISCV_SMODE
|
|
images.os.arch = IH_ARCH_RISCV;
|
|
#elif CONFIG_ARM64
|
|
images.os.arch = IH_ARCH_ARM64;
|
|
#endif
|
|
ret = do_bootm_states(cmdtp, flag, argc, argv,
|
|
#ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH
|
|
BOOTM_STATE_RAMDISK |
|
|
#endif
|
|
BOOTM_STATE_OS_PREP | BOOTM_STATE_OS_FAKE_GO |
|
|
BOOTM_STATE_OS_GO,
|
|
&images, 1);
|
|
|
|
return ret;
|
|
}
|
|
|
|
/*******************************************************************/
|
|
/* sboot - boot security image */
|
|
/*******************************************************************/
|
|
#ifdef CONFIG_TARGET_LIGHT_C910
|
|
|
|
#if CONFIG_IS_ENABLED(LIGHT_SEC_UPGRADE)
|
|
extern int light_vimage(int argc, char *const argv[]);
|
|
int do_vimage(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
{
|
|
if (light_vimage(argc, argv) != 0)
|
|
return 1;
|
|
return 0;
|
|
}
|
|
|
|
U_BOOT_CMD(
|
|
vimage, CONFIG_SYS_MAXARGS, 1, do_vimage,
|
|
"verify image file with known pubkey which reside in father image or itself!",
|
|
"vimage addr imgname[[tee/tf] - verify specifed image resides in addr\n"
|
|
);
|
|
|
|
#endif
|
|
|
|
#if CONFIG_IS_ENABLED(LIGHT_SEC_BOOT_WITH_VERIFY_VAL_A) || CONFIG_IS_ENABLED(LIGHT_SEC_BOOT_WITH_VERIFY_VAL_B) || CONFIG_IS_ENABLED(LIGHT_SEC_BOOT_WITH_VERIFY_ANT_REF) || CONFIG_IS_ENABLED(LIGHT_SEC_BOOT_WITH_VERIFY_LPI4A) || CONFIG_IS_ENABLED(LIGHT_SEC_BOOT_WITH_VERIFY_RVBOOK)
|
|
#if CONFIG_IS_ENABLED(LIGHT_SEC_UPGRADE)
|
|
extern int light_secboot(int argc, char * const argv[]);
|
|
#endif
|
|
int do_secboot(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
{
|
|
#if CONFIG_IS_ENABLED(LIGHT_SEC_UPGRADE)
|
|
if (light_secboot(argc, argv) != 0) {
|
|
return -1;
|
|
}
|
|
#endif
|
|
return 0;
|
|
}
|
|
U_BOOT_CMD(
|
|
secboot, CONFIG_SYS_MAXARGS, 1, do_secboot,
|
|
"verify image file with known pubkey which reside in father image or itself!",
|
|
"vimage addr imgname[[tee/tf] - verify specifed image resides in addr\n"
|
|
);
|
|
|
|
/* check whether partition numbers are consistent with the slot suffix */
|
|
static int do_light_bootab(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) {
|
|
char *slot_suffix = env_get("slot_suffix");
|
|
int teepart = env_get_hex("mmcteepart", 3);
|
|
|
|
struct disk_partition part_info;
|
|
struct blk_desc *dev_desc;
|
|
int part = 0;
|
|
|
|
dev_desc = blk_get_dev("mmc", CONFIG_FASTBOOT_FLASH_MMC_DEV);
|
|
if (dev_desc == NULL) {
|
|
printf("Failed to find MMC device\n");
|
|
return 1;
|
|
}
|
|
|
|
if ((strcmp(slot_suffix, "a") == 0) && (teepart != 3)) {
|
|
part = part_get_info_by_name(dev_desc, "boot_a", &part_info);
|
|
if (part < 0) {
|
|
printf("Failed to find MMC device\n");
|
|
return 1;
|
|
}
|
|
env_set_hex("mmcbootpart", part);
|
|
|
|
part = part_get_info_by_name(dev_desc, "tee_a", &part_info);
|
|
if (part < 0) {
|
|
printf("Failed to find MMC device\n");
|
|
return 1;
|
|
}
|
|
env_set_hex("mmcteepart", part);
|
|
|
|
part = part_get_info_by_name(dev_desc, "sbmeta_a", &part_info);
|
|
if (part < 0) {
|
|
printf("Failed to find MMC device\n");
|
|
return 1;
|
|
}
|
|
env_set_hex("mmcsbmetapart", part);
|
|
|
|
part = part_get_info_by_name(dev_desc, "root_a", &part_info);
|
|
if (part < 0) {
|
|
printf("root AB partition is not enabled\n");
|
|
} else {
|
|
env_set_hex("mmcpart", part);
|
|
}
|
|
|
|
run_command("env save", 0);
|
|
} else if ((strcmp(slot_suffix, "b") == 0) && (teepart != 10)) {
|
|
part = part_get_info_by_name(dev_desc, "boot_b", &part_info);
|
|
if (part < 0) {
|
|
printf("Failed to find MMC device\n");
|
|
return 1;
|
|
}
|
|
env_set_hex("mmcbootpart", part);
|
|
|
|
part = part_get_info_by_name(dev_desc, "tee_b", &part_info);
|
|
if (part < 0) {
|
|
printf("Failed to find MMC device\n");
|
|
return 1;
|
|
}
|
|
env_set_hex("mmcteepart", part);
|
|
|
|
part = part_get_info_by_name(dev_desc, "sbmeta_b", &part_info);
|
|
if (part < 0) {
|
|
printf("Failed to find MMC device\n");
|
|
return 1;
|
|
}
|
|
env_set_hex("mmcsbmetapart", part);
|
|
|
|
part = part_get_info_by_name(dev_desc, "root_b", &part_info);
|
|
if (part < 0) {
|
|
printf("root AB partition is not enabled\n");
|
|
} else {
|
|
env_set_hex("mmcpart", part);
|
|
}
|
|
run_command("env save", 0);
|
|
}
|
|
printf("current active slot is:%s\n", slot_suffix);
|
|
return CMD_RET_SUCCESS;
|
|
}
|
|
|
|
U_BOOT_CMD(
|
|
light_bootab, CONFIG_SYS_MAXARGS, 1, do_light_bootab,
|
|
"Light A/B updates",
|
|
NULL
|
|
);
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
#ifdef CONFIG_SYS_LONGHELP
|
|
static char booti_help_text[] =
|
|
"[addr [initrd[:size]] [fdt]]\n"
|
|
" - boot Linux 'Image' stored at 'addr'\n"
|
|
"\tThe argument 'initrd' is optional and specifies the address\n"
|
|
"\tof an initrd in memory. The optional parameter ':size' allows\n"
|
|
"\tspecifying the size of a RAW initrd.\n"
|
|
#if defined(CONFIG_OF_LIBFDT)
|
|
"\tSince booting a Linux kernel requires a flat device-tree, a\n"
|
|
"\tthird argument providing the address of the device-tree blob\n"
|
|
"\tis required. To boot a kernel with a device-tree blob but\n"
|
|
"\twithout an initrd image, use a '-' for the initrd argument.\n"
|
|
#endif
|
|
"";
|
|
#endif
|
|
|
|
U_BOOT_CMD(
|
|
booti, CONFIG_SYS_MAXARGS, 1, do_booti,
|
|
"boot Linux kernel 'Image' format from memory", booti_help_text
|
|
);
|